summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthing1 <thing1@seacrossedlovers.xyz>2025-02-09 22:07:55 +0000
committerthing1 <thing1@seacrossedlovers.xyz>2025-02-09 22:07:55 +0000
commiteb734603dd22d202a06c4ea68497d4b7103cf5e0 (patch)
tree181afbcd725989ef7db0cec3627bb3528548be95
init commit
-rw-r--r--Makefile8
-rw-r--r--TODO.gn5
-rwxr-xr-xgnbin0 -> 20576 bytes
-rw-r--r--gn.c103
-rw-r--r--test.gn10
5 files changed, 126 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..56da911
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,8 @@
+CFLAGS=-ggdb
+
+all: gn
+
+gn: gn.c
+ cc gn.c -o gn ${CFLAGS}
+clean:
+ rm gn
diff --git a/TODO.gn b/TODO.gn
new file mode 100644
index 0000000..3292ba5
--- /dev/null
+++ b/TODO.gn
@@ -0,0 +1,5 @@
+* Syntax checking * {2025.02.10} {todo}
+- loop through tokens and find if they are in the right order
+* More output formats * {2025.02.10} {todo}
+- Latex?
+- Groff?
diff --git a/gn b/gn
new file mode 100755
index 0000000..4a83bcb
--- /dev/null
+++ b/gn
Binary files differ
diff --git a/gn.c b/gn.c
new file mode 100644
index 0000000..f3286b9
--- /dev/null
+++ b/gn.c
@@ -0,0 +1,103 @@
+#include <ctype.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+typedef enum mode {
+ NONE,
+ LIST,
+} mode;
+
+typedef enum types {
+ HEADING,
+ DATE,
+ TODO,
+ BULLET,
+} types;
+
+typedef struct token {
+ char data[256];
+ types type;
+} token;
+
+mode m = NONE;
+
+token tokens[1024];
+int tokcount = 0;
+
+void eprint(char *msg) {
+ fprintf(stderr, "error: %s\n", msg);
+ exit(1);
+}
+
+void printashtml(token t) {
+ char *start, *end;
+ switch (t.type) {
+ case HEADING: start = "<h1>"; end = "</h1>"; break;
+ case DATE: start = "<h2>"; end = "</h2>"; break;
+ case TODO: start = "<h3>"; end = "</h3>"; break;
+ case BULLET: start = "<p>"; end = "</p>"; break;
+ }
+ printf("%s%s%s\n", start, t.data, end);
+}
+
+char *stripwhitespace(char *expr) {
+ while (isblank(expr[0])) expr++;
+ return expr;
+}
+
+int readuntil(char *file, int off, char end, types t) {
+ int j = 0;
+ char tok[256];
+
+ off++;
+ while (file[off] != end) {
+ if (file[off] == 0) eprint("Never closed expression!") ;
+ tok[j] = file[off];
+ off++;
+ j++;
+ }
+
+ tok[j] = 0;
+
+ memcpy(tokens[tokcount].data, stripwhitespace(tok), 256);
+ tokens[tokcount].type = t;
+ tokcount++;
+
+ return off;
+}
+
+int main(int argc, char **argv) {
+ for (int i = 0; i < argc && argc != 1; i++) {
+ if (strcmp(argv[i], "-l") == 0) m = LIST;
+ }
+
+ char file[INT16_MAX];
+ int i;
+ char c;
+ while ((c = getchar()) != EOF) {
+ file[i] = c;
+ i++;
+ }
+ file[i] = 0;
+
+ for (i = 0; i < strlen(file); i++) {
+ switch (file[i]) {
+ case '*': i = readuntil(file, i, '*', HEADING); break;
+ case '[': i = readuntil(file, i, ']', DATE); break;
+ case '{': i = readuntil(file, i, '}', TODO); break;
+ case '-': i = readuntil(file, i, '\n', BULLET); break;
+ }
+
+ }
+
+ switch (m) {
+ case LIST:
+ for (int i = 0; i < tokcount; i++)
+ if (tokens[i].type == HEADING) printf("%s\n", tokens[i].data);
+ break;
+ case NONE: return 0;
+ }
+ return 0;
+}
diff --git a/test.gn b/test.gn
new file mode 100644
index 0000000..054d660
--- /dev/null
+++ b/test.gn
@@ -0,0 +1,10 @@
+* my awsome note * [2025.02.09] {done}
+- sub point
+- sub point two
+* my awsome note * [2025.02.09] {done}
+* my awsome note * [2025.02.09] {done}
+* my awsome note * [2025.02.09] {done}
+* my awsome note * [2025.02.09] {done}
+* my awsome note * [2025.02.09] {done}
+* my awsome note * [2025.02.09] {done}
+* my awsome note * [2025.02.09] {done}