※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void one_row_edit(int row, char *txtname);
void  word_replace1(char *txtname);
void  word_replace2(char *txtname);
void line_delete(char *txtname);
void line_insert(char *txtname);
 
extern FILE *txtfile, *undo;
extern char undo_text[L_tmpnam];
 
//undo用ファイルの保存
void make_undofile(char *txtname, char *temp_cmd){
 
	char c;		//txt→undoファイル用
 
	undo = fopen(undo_text,"w");
 
	while( (c = fgetc(txtfile)) != EOF )	//編集直前の状態を保存する
	{
		fputc(c,undo);
	}
 
	txtfile = freopen(txtname,"r",txtfile);		//もう一度txtをオープンしておく
	fclose(undo);				                //undoは閉じておく。
 
	if(atoi(temp_cmd) != 0) one_row_edit(atoi(temp_cmd), txtname);	                            //一行編集
	if(strcmp(temp_cmd, "r1\n") == 0 || strcmp(temp_cmd, "R1\n") == 0) word_replace1(txtname);  //置換(少しでも含まれてればヒット)
	if(strcmp(temp_cmd, "r2\n") == 0 || strcmp(temp_cmd, "R2\n") == 0) word_replace2(txtname);  //置換(トークンごとにヒット)
	if(strcmp(temp_cmd, "d\n") == 0 || strcmp(temp_cmd, "D\n") == 0) line_delete(txtname);	    //行削除
	if(strcmp(temp_cmd, "i\n") == 0 || strcmp(temp_cmd, "I\n") == 0) line_insert(txtname);	    //行挿入
 
	return;
}
 
//一つ前の状態に戻す(undo)
void un_do(char *txtname){
 
	char c;		// 文字を読み込む
 
	if((undo = fopen(undo_text,"r"))==NULL)
	{
		printf("まだ編集は行われておりません\n");
		return;
	}
	txtfile = freopen(txtname,"w",txtfile);		//読み込みから書き込みへ
 
	/* ファイルから EOFが現れるまで1字読み込む */
	while((c = fgetc(undo)) != EOF){	//一つ前の状態の内容を読み込み
 
		fputc(c,txtfile);			//ファイルに入れて戻す
 
	}
	fclose(undo);
	freopen(txtname,"r",txtfile);
 
	return;
}