#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', Paste = 'p', Cut = 'x', Search = 'f', Erase = 'e', NoL = 'n', Cursor = 'u', Quit = 'q', Help = 'h'} Menu; // NoL = show the number of lines void filesave(FILE **fp, FILE **tp, char filename[], int *savecheck) { char fn[BUF_SIZE] = ""; int a = 0; int i = 0; scanf("%s", fn); fflush(stdin); 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); a = getchar(); fflush(stdin); if (a == '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) { int a = 0; if (*savecheck) { printf("current file was not saved, want to save?[y/c/n] : "); fflush(stdin); a = getchar(); if (a == 'y') filesave(fp, tp, fn, savecheck); } if (*savecheck || a == 'n') fclose(*tp); } void fileopen(FILE **fp, FILE **tp, char fn[], int *savecheck) { int i = 0; if (*fp != NULL) { fileclose(fp, tp, fn, savecheck); } scanf("%s", fn); fflush(stdin); if (fn[0] != '\0') { if ((*fp = fopen(fn, "r+")) == NULL) { do { printf("No such file, create file?[y/n]"); i = getchar(); fflush(stdin); if (i == 'y') { *fp = fopen(fn, "w+"); } } while (i != 'y' && i != 'n'); } if (*fp != NULL) { *tp = fopen("temp.dat", "w+"); } if (i == 0) { 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); scanf("%s", re); fflush(stdin); 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); scanf("%s", wr); 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); } } scanf("%s", wr); fflush(stdin); if (o == 1) wr[strlen(wr)] = '\n'; printf("%d", strlen(wr)); l = 0; temp = calloc(strlen(wr), sizeof(char)); while(1) { printf("%d\n", fgetpos(*tp, &fpos)); fflush(*tp); fsetpos(*tp, &fpos); for(i = 0; i < strlen(wr); i++) { printf("{%ld}", ftell(*tp)); 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'; printf("%s\n", temp); printf("[%ld]", ftell(*tp)); fputs(wr, *tp); printf("[%ld]", ftell(*tp)); strcpy(wr, temp); printf("%s::\n", wr); 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); scanf("%s", se); len = strlen(se); fflush(stdin); 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); scanf("%s", er); fflush(stdin); for(i = 0; er[i] != '-' && er[i] != '*' && er[i] != '\0'; i++) ; if(er[i] == '-' || er[i] == '\0') { putchar('*'); 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); for (k = 0; k < j; k++) if (fgetc(*tp) == '\n') j++; 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; scanf("%s", co); rewind(*tp); fflush(stdin); 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"); scanf("%s", cu); fflush(stdin); 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) { int ch; ch = getchar(); fflush(stdin); return (Menu)ch; } 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; }