#include #include #include #include #include #define MAXCMD 256 #define MAXLINE 2048 #define MAXLINELEN 256 char file[MAXLINE][MAXLINELEN]; int linecount = 0; char command[MAXCMD]; int cmdlen; int lineno = 0; void eprint(char *str) { fprintf(stderr, "%s\n", str); exit(1); } void readcmd() { printf("%d > ", lineno); char c; while ((c = getchar()) != '\n' && cmdlen <= MAXCMD) { command[cmdlen] = c; cmdlen++; } command[cmdlen] = 0; } void emptystr(char *s) { for (int i = 0; i < strlen(s); i++) s[i] = 0; } void emptycmd() { emptystr(command); cmdlen = 0; } void readfile(FILE *f) { int i = 0; char c; while ((c = fgetc(f)) != EOF) { if (c == '\n') { file[linecount][i] = 0; linecount++; i = 0; } else { file[linecount][i] = c; i++; } } } void printfile(FILE *out, bool numbers) { for (int i = 0; i < linecount; i++) { if (!numbers) fprintf(out, "%s\n", file[i]); else fprintf(out, "%d: %s\n", i, file[i]); } } int readnum() { if (isdigit(command[0])) { char num[MAXCMD] = {0}; int i; for (i = 0; i < cmdlen && isdigit(command[i]); i++) { num[i] = command[i]; } num[i] = 0; return atoi(num); } return -1; } void deleteline(int n) { char nfile[MAXLINE][MAXLINELEN]; int nlinecount = 0; for (int i = 0; i < linecount; i++) { if (i != n) { strcpy(nfile[nlinecount], file[i]); nlinecount++; } } for (int i = 0; i < nlinecount; i++) { emptystr(file[i]); strcpy(file[i], nfile[i]); } linecount--; } void runcmd(char *outpath) { FILE *f; int n; if ((n = readnum()) != -1) { if (n > linecount) { printf("?\n"); goto repeat; } lineno = n; } int i = 0; repeat: switch (command[i]) { case 0: return; case 'd': deleteline(lineno); break; case 'P': printfile(stdout, false); break; case 'N': printfile(stdout, true); break; case 'w': f = fopen(outpath, "w"); printfile(f, false); fclose(f); break; case 'q': exit(1); } i++; goto repeat; } int main(int argc, char **argv) { FILE *f; if (argc > 1) { FILE *f = fopen(argv[1], "r+"); if (f == NULL) eprint("failed to open file"); readfile(f); fclose(f); } else eprint("no file given"); for (;;) { readcmd(); runcmd(argv[1]); emptycmd(); } }