summaryrefslogtreecommitdiff
path: root/ed.c
diff options
context:
space:
mode:
authorthing1 <thing1@seacrossedlovers.xyz>2025-02-13 06:47:32 +0000
committerthing1 <thing1@seacrossedlovers.xyz>2025-02-13 06:47:32 +0000
commitf1e773356078ccb1d994bb4a7f0b690715397c31 (patch)
treee870af7aff758de69ce8118c30bd68b11642454b /ed.c
added default branch
Diffstat (limited to 'ed.c')
-rw-r--r--ed.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/ed.c b/ed.c
new file mode 100644
index 0000000..3035c60
--- /dev/null
+++ b/ed.c
@@ -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();
+ }
+}
+