#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define LINE_SIZE 256
#define CMD_SIZE 100
 
void temporary_save(void); 
void execmd(char *txtname, char *temp_cmd);
void display_all(void);
void make_undofile(char *txtname, char *temp_cmd);
void save_end(void);
void not_save(char *txtname);
void un_do(char *txtname);
void word_search1(char *txtname);
void word_search2(char *txtname);
void help(void);
 
FILE *txtfile, *temp, *undo;
int coe = 1;                                    //終了条件(Condition Of End)
char temp_text[L_tmpnam],undo_text[L_tmpnam];	//一時的ファイルのファイル名(編集前とundo用のデータ保存用)
 
int main(int argc, char *argv[]){
 
	int start = 0;
	char cmd[CMD_SIZE];     //コマンド
	tmpnam(temp_text);	    //一時的ファイルのファイル名の決定
	tmpnam(undo_text);		//undo用ファイル名の決定
 
 
	//ファイルの引数を調べる。
	if(argc != 2){
		printf("引数にはファイルのパスを指定してください\n");
		exit(1);
	}
 
 
	//終了するまで無限ループ
	while(coe){
 
		//ファイルが開けるかどうかを調べる。
		if((txtfile = fopen(argv[1], "r")) == NULL){
			printf("ファイルを開くことが出来ません");
			exit(1);
		}
 
		//*を表示する
		if(start) printf("*");
		else{
			//変更せずに終了するときに使用する変更前のファイルの保存
			temp = fopen(temp_text, "w");
			temporary_save();
			temp = freopen(temp_text,"r",temp);             //w→rに切り替える
			txtfile = fopen(argv[1], "r");                  //もう一回txtfileと読み込んだファイルを結びつける。
			printf("ファイルを終わりまで読み込みました\n*");
			start++;
		}
 
		//コマンドを入力
		fgets(cmd, CMD_SIZE, stdin);
 
		//コマンドの実行
		execmd(argv[1], cmd);
 
		//ファイルを閉じる
		fclose(txtfile);
	}
	fclose(temp);
	remove(temp_text);		//一時的ファイルを削除する
	remove(undo_text);		//undo用ファイルを削除する
	return 0;
}
 
//一時的ファイルの保存
void temporary_save(void){
 
	int c;            /* 文字を読み込む */
 
	/* ファイルから EOFが現れるまで1字読み込む */
	while ((c = getc(txtfile)) != EOF) {
 
		fputc(c,temp);
 
	}
	/* この時点でtxtfileに結びつけられたファイルは最後まで読み込まれてしまったので閉じる */
	fclose(txtfile);
 
}
 
//機能はここに追加
void execmd(char *txtname, char *temp_cmd){
 
	if(strcmp(temp_cmd, "l\n") == 0 || strcmp(temp_cmd, "L\n") == 0) {display_all(); return;}                     //すべて表示
	if(atoi(temp_cmd) != 0) {make_undofile(txtname, temp_cmd); return;}                                           //一行編集に入る前にundo用ファイルに記録
	if(strcmp(temp_cmd, "e\n") == 0 || strcmp(temp_cmd, "E\n") == 0) {save_end(); return;}                        //保存して終了
	if(strcmp(temp_cmd, "n\n") == 0 || strcmp(temp_cmd, "N\n") == 0) {not_save(txtname); return;}                 //保存しないで終了
	if(strcmp(temp_cmd, "u\n") == 0 || strcmp(temp_cmd, "U\n") == 0) {un_do(txtname); return;}	              //前回の編集前の状態に戻す(undo)
	if(strcmp(temp_cmd, "s1\n") == 0 || strcmp(temp_cmd, "S1\n") == 0) {word_search1(txtname); return;}           //単語検索(少しでも含まれてればヒット)
	if(strcmp(temp_cmd, "s2\n") == 0 || strcmp(temp_cmd, "S2\n") == 0) {word_search2(txtname); return;}           //単語検索(トークンごとにヒット)
	if(strcmp(temp_cmd, "r1\n") == 0 || strcmp(temp_cmd, "R1\n") == 0) {make_undofile(txtname, temp_cmd); return;}//置換1に入る前にundo用ファイルに記録
	if(strcmp(temp_cmd, "r2\n") == 0 || strcmp(temp_cmd, "R2\n") == 0) {make_undofile(txtname, temp_cmd); return;}//置換2に入る前にundo用ファイルに記録
	if(strcmp(temp_cmd, "d\n") == 0 || strcmp(temp_cmd, "D\n") == 0) {make_undofile(txtname, temp_cmd); return;}  //行削除に入る前にundo用ファイルに記録
	if(strcmp(temp_cmd, "i\n") == 0 || strcmp(temp_cmd, "I\n") == 0) {make_undofile(txtname, temp_cmd); return;}  //行挿入に入る前にundo用ファイルに記録
	if(strcmp(temp_cmd, "h\n") == 0 || strcmp(temp_cmd, "H\n") == 0) {help(); return;}  //ヘルプ
 
	printf("このコマンドは無効です。\n");
	return;
}
最終更新:2007年08月02日 23:54