diff options
author | thing1 <thing1@seacrossedlovers.xyz> | 2025-02-13 06:47:32 +0000 |
---|---|---|
committer | thing1 <thing1@seacrossedlovers.xyz> | 2025-02-13 06:47:32 +0000 |
commit | f1e773356078ccb1d994bb4a7f0b690715397c31 (patch) | |
tree | e870af7aff758de69ce8118c30bd68b11642454b |
added default branch
-rw-r--r-- | Makefile | 5 | ||||
-rwxr-xr-x | ed | bin | 0 -> 21320 bytes | |||
-rw-r--r-- | ed.c | 141 | ||||
-rw-r--r-- | tmp | 3 |
4 files changed, 149 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5df624d --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +ed: ed.c + cc ed.c -o ed -ggdb +clean: + rm ed + Binary files differ@@ -0,0 +1,141 @@ +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> + +#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() { + 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"); + lineno = n; + return; + } + + switch (command[0]) { + 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); + } +} + +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(); + } +} + @@ -0,0 +1,3 @@ +hello +world +line3 |