#include #include #include #include #include #include #include #define BUF_SIZE 256 typedef enum { Fileopen = 'o', Fileclose = 'c', Filesave = 's', Readtxt = 'r', Writetxt = 'w', Overwrite = 'v', Copy = 'y', Search = 'f', Erase = 'e', NoL = 'n', Cursor = 'u', Quit = 'q', Help = 'h'} Menu; void filesave(FILE **fp, FILE **tp, char filename[], int *savecheck) { char fn[BUF_SIZE] = ""; char a[BUF_SIZE]; int i = 0; fgets(fn, BUF_SIZE, stdin); fn[strlen(fn) - 1] = '\0'; rewind(*tp); if (fn[0] != ' ') { fclose(*fp); if ((*fp = fopen(fn, "r")) != NULL) { fclose(*fp); printf("%s is existed. Do you want to overwrite? [y/else] : ", fn); fgets(a, BUF_SIZE, stdin); fflush(stdin); if (a[0] == 'y') *fp = fopen(fn, "w"); } else { *fp = fopen(fn, "w"); } } else { *fp = fopen(filename, "w"); } if(*fp != NULL) { while ((i = fgetc(*tp)) != EOF) fputc(i, *fp); rewind(*tp); fclose(*fp); *savecheck = 0; } } void fileclose(FILE **fp, FILE **tp, char fn[], int *savecheck) { char a[BUF_SIZE]; if (*savecheck) { printf("current file was not saved, want to save?[y/c/n] : "); fflush(stdin); fgets(a, BUF_SIZE, stdin); if (a[0] == 'y') filesave(fp, tp, fn, savecheck); } if (*savecheck || a[0] == 'n') fclose(*tp); } void fileopen(FILE **fp, FILE **tp, char fn[], int *savecheck) { int i = 0; char x[BUF_SIZE]; x[0] = '0'; if (*fp != NULL) { fileclose(fp, tp, fn, savecheck); } fgets(fn, BUF_SIZE, stdin); fn[strlen(fn) - 1] = '\0'; if (fn[0] != '\0') { if ((*fp = fopen(fn, "r+")) == NULL) { do { printf("No such file, create file?[y/n]"); fgets(x, BUF_SIZE, stdin); if (x[0] == 'y') { *fp = fopen(fn, "w+"); } } while (x[0] != 'y' && x[0] != 'n'); } if (*fp != NULL) { *tp = fopen("temp.dat", "w+"); } if (x[0] != 'y' && x[0] != 'n') { while ((i = fgetc(*fp)) != EOF) fputc(i, *tp); rewind(*tp); fclose(*fp); } } } void readtxt(FILE **tp) { char buffer[BUF_SIZE]; char re[BUF_SIZE]; char *token_ptr; int i, j, k; rewind(*tp); fgets(re, BUF_SIZE, stdin); re[strlen(re) - 1] = '\0'; token_ptr = strtok(re, "-"); i = atoi(token_ptr); if (i != 0) { token_ptr = strtok(NULL, "-"); j = atoi(token_ptr); if (j == 0 || j < i) j = i; fgets(buffer, BUF_SIZE, *tp); for (k = 1; k <= j; k++) { if (k >= i) printf("l%4d: %s", k, buffer); if (fgets(buffer, BUF_SIZE, *tp) == NULL) break; } } putchar('\n'); } void writetxt(FILE **tp, int cur) { char buffer[BUF_SIZE]; char wr[BUF_SIZE]; char *temp; int i, l; int j = 0; int o = 0; fpos_t fpos, tpos; rewind(*tp); fgets(wr, BUF_SIZE, stdin); wr[strlen(wr) - 1] = '\0'; l = atoi(wr); for (i = 1; i < l; i++) fgets(buffer, BUF_SIZE, *tp); if (wr[strlen(wr) -1] == '/') { for ( ; i < l + 1; i++) fgets(buffer, BUF_SIZE, *tp); if(buffer[strlen(buffer) - 1] != '\n') { fputc('\n', *tp); fgetpos(*tp, &tpos); fflush(*tp); fsetpos(*tp, &tpos); } o = 1; } else if (wr[strlen(wr) -1] == '*') { for (j = 0; j < cur; j++) { fgetc(*tp); fgetpos(*tp, &tpos); fflush(*tp); fsetpos(*tp, &tpos); } } fgets(wr, BUF_SIZE, stdin); wr[strlen(wr) - 1] = '\0'; if (o == 1) wr[strlen(wr)] = '\n'; l = 0; temp = calloc(strlen(wr), sizeof(char)); while(1) { fflush(*tp); fsetpos(*tp, &fpos); for(i = 0; i < strlen(wr); i++) { if((temp[i] = fgetc(*tp)) == EOF) break; fgetpos(*tp, &tpos); fflush(*tp); fsetpos(*tp, &tpos); putchar('*'); } fsetpos(*tp, &fpos); if(temp[i] == EOF) break; temp[i] = '\0'; fputs(wr, *tp); strcpy(wr, temp); l++; } temp[i] = '\0'; fgetpos(*tp, &tpos); fflush(*tp); fsetpos(*tp, &tpos); fputs(wr, *tp); fgetpos(*tp, &tpos); fflush(*tp); fsetpos(*tp, &tpos); fputs(temp, *tp); free(temp); } void search(FILE **tp) { char buffer[BUF_SIZE]; char se[BUF_SIZE]; int i, j; int l = 1; int len; rewind(*tp); fgets(se, BUF_SIZE, stdin); se[strlen(se) - 1] = '\0'; len = strlen(se); while ( (fgets(buffer, BUF_SIZE, *tp)) != NULL ) { for (i = 0; buffer[i] != '\n'; i++) { if (strncmp(se, buffer + i, len) == 0) { printf("l%4d :%s", l, buffer); if(buffer[strlen(buffer) - 1] != '\n') putchar('\n'); printf("%3d ", i + 1); for (j = 0; j <= i; j++) putchar('*'); putchar('\n'); } } l++; } } void erase(FILE **tp, int cur) { char buffer[BUF_SIZE]; char er[BUF_SIZE]; char *token_ptr; int i, j, k; int a = 1; struct stat st; fpos_t fpos, tmppos; off_t x = 0; int fd; rewind(*tp); fgets(er, BUF_SIZE, stdin); er[strlen(er) - 1] = '\0'; for(i = 0; er[i] != '-' && er[i] != '*' && er[i] != '\0'; i++) ; if(er[i] == '-' || er[i] == '\0') { token_ptr = strtok(er, "-"); i = atoi(token_ptr); if (i != 0) { //行消去 token_ptr = strtok(NULL, "-"); j = atoi(token_ptr); if (j == 0 || j < i) j = i; fgetpos(*tp, &fpos); fgets(buffer, BUF_SIZE, *tp); for (k = 1; k < j; k++) { if (k == i - 1) { fgetpos(*tp, &fpos); } else if (k <= i) { x += strlen(buffer) + 1; } if (fgets(buffer, BUF_SIZE, *tp) == NULL) break; } x += strlen(buffer) + 1; } } else { //文字消去 token_ptr = strtok(er, "*"); i = atoi(token_ptr); token_ptr = strtok(NULL, "*"); j = atoi(token_ptr); for (k = 1; k < i; k++) fgets(buffer, BUF_SIZE, *tp); fgetpos(*tp, &fpos); fgets(buffer, BUF_SIZE, *tp); if (strlen(buffer) - 1 < cur) a = 0; else { fsetpos(*tp, &fpos); fseek(*tp, (long)(cur - 1), SEEK_CUR); fgetpos(*tp, &fpos); x = j; } } if (a != 0) { while (fgets(buffer, BUF_SIZE, *tp) != NULL) { fgetpos(*tp, &tmppos); fsetpos(*tp, &fpos); fputs(buffer, *tp); fgetpos(*tp, &fpos); fsetpos(*tp, &tmppos); } fclose(*tp); stat("temp.dat", &st); fd = open( "temp.dat", O_RDWR); ftruncate(fd, st.st_size - x); close(fd); *tp = fopen("temp.dat", "r+"); } } void copy(FILE **tp, int cur, char clipboard[]) { char co[BUF_SIZE]; char buffer[BUF_SIZE]; char *token_ptr; int i, j, k; fpos_t fpos; fgets(co, BUF_SIZE, stdin); co[strlen(co) - 1] = '\0'; rewind(*tp); for(i = 0; co[i] != '-' && co[i] != '*' && co[i] != '\0'; i++) ; if(co[i] == '-' || co[i] == '\0') { token_ptr = strtok(co, "-"); i = atoi(token_ptr); if (i != 0) { token_ptr = strtok(NULL, "-"); j = atoi(token_ptr); if (j == 0 || j < i) j = i; fgets(buffer, BUF_SIZE, *tp); for (k = 1; k <= j; k++) { if (k >= i) { strncat(clipboard, buffer, 254 - strlen(buffer) - strlen(clipboard)); } if (fgets(buffer, BUF_SIZE, *tp) == NULL) break; } } } else { token_ptr = strtok(co, "*"); i = atoi(token_ptr); token_ptr = strtok(NULL, "*"); j = atoi(token_ptr); for (k = 1; k < i; k++) fgets(buffer, BUF_SIZE, *tp); for (k = 1; k < cur; k++) fgetc(*tp); fgetpos(*tp, &fpos); fflush(*tp); fsetpos(*tp, &fpos); for (k = 0; k < j; k++) { *(clipboard + k) = fgetc(*tp); fgetpos(*tp, &fpos); fflush(*tp); fsetpos(*tp, &fpos); } *(clipboard + k) = fgetc(*tp); } } void quit(FILE **fp, FILE **tp, char fn[], int *savecheck) { fileclose(fp, tp, fn, savecheck); fclose(*tp); if (remove("temp.dat") != 0) puts("cannot delete temp.dat"); } void cursor(int *cur) { int i; char cu[BUF_SIZE]; printf(" "); for (i = 0; i < *cur; i++) putchar(' '); printf("*\n"); fgets(cu, BUF_SIZE, stdin); cu[strlen(cu) - 1] = '\0'; if(cu[0] == '+') *cur += atoi(cu + 1); else if(cu[0] == '-') *cur -= atoi(cu + 1); else if(atoi(cu) != 0) *cur = atoi(cu); } Menu selectmenu(void) { char ch[BUF_SIZE]; fgets(ch, BUF_SIZE, stdin); return (Menu)ch[0]; } int main(void) { Menu menu; FILE *fp = NULL; FILE *tp = NULL; char filename[BUF_SIZE]; char clipboard[BUF_SIZE] = ""; int cur = 1; int savecheck = 1; do { putchar('*'); menu = selectmenu(); switch (menu) { case Fileopen : fileopen(&fp, &tp, filename, &savecheck); break; case Fileclose : fileclose(&fp, &tp, filename, &savecheck); break; case Filesave : filesave(&fp, &tp, filename, &savecheck); break; case Readtxt : readtxt(&tp); break; case Writetxt : writetxt(&tp, cur); break; case Copy : copy(&tp, cur, clipboard); printf("%s\n", clipboard); break; case Search : search(&tp); break; case Erase : erase(&tp, cur); break; case NoL : break; case Cursor : cursor(&cur); break; case Quit : quit(&fp, &tp, filename, &savecheck); break; case Help : break; default : printf("no such command\n"); break; } } while (menu != Quit); return 0; }