summaryrefslogtreecommitdiff
path: root/gn.c
diff options
context:
space:
mode:
Diffstat (limited to 'gn.c')
-rw-r--r--gn.c103
1 files changed, 103 insertions, 0 deletions
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;
+}