diff options
Diffstat (limited to 'gn.c')
-rw-r--r-- | gn.c | 103 |
1 files changed, 103 insertions, 0 deletions
@@ -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; +} |