/*
 * inputstr.c
 *
 * ファイルの特定文字列の後を改行まで削除して引数または標準入力からの文字列を代入する
 * 
 */


#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<string.h>


/*
 * 引数 : 代入ファイル名 代入前文字列 代入する文字列 
 */
int main(int argc,char *argv[])
{
	enum{STRLEN=128};	/* 代入文字列用バッファの長さ */

	char *buf,*pi,*str;
	char in_str[STRLEN];
	int fd;
	int i,size;
	struct stat stat;


	if(argc<3){printf("引数が足りません\n");exit(0);}

	/* 代入するファイルをバッファに読み込む */
	if((fd=open(argv[1],O_RDONLY))==-1){printf("ファイル %s が開けません\n",argv[1]);exit(0);}
	fstat(fd,&stat);
	if((buf=(char*)malloc(stat.st_size+1))==NULL){printf("メモリー確保に失敗しました\n");exit(0);}
	read(fd,buf,stat.st_size);
	close(fd);
	buf[stat.st_size]='\0';

	/* 文字列を検索 */
	str=argv[2];
	pi=buf;
	for(;;++pi)
	{
		if(*pi=='\0'){printf("文字列が見つかりませんでした\n");goto END;}
		if(*pi==str[0])
			for(i=1;;++i)
			{
				/* 文字列と一致 */
				if(str[i]=='\0')
				{
					pi+=i;
					goto EXIT;
				}
				if(pi[i]!=str[i])break;
			}
	}
EXIT:

	/* 文字列をファイルの検索文字列の後に書き込む */
	if((fd=open(argv[1],O_RDWR|O_TRUNC))==-1){printf("ファイル %s が開けません\n",argv[1]);goto END;}
	write(fd,buf,pi-buf);
	if(argc==3)
		for(;(size=read(0,in_str,STRLEN))!=0;)write(fd,in_str,size);	/* 標準入力から代入 */
	else write(fd,argv[3],strlen(argv[3]));								/* 引数から代入 */
	
	/* 検索文字列以降をファイルに書き込む */
	for(;*pi!='\n';++pi)if(*pi=='\0')goto END;
	write(fd,pi,stat.st_size-(pi-buf));

END:
	free(buf);
	exit(0);
}
