diff options
Diffstat (limited to 'gn.c')
-rw-r--r-- | gn.c | 78 |
1 files changed, 52 insertions, 26 deletions
@@ -4,43 +4,29 @@ #include <string.h> #include <stdlib.h> +#include "tokens.h" +#include "output.h" +#include "util.h" + typedef enum mode { NONE, LIST, + CHECK, + OUTPUT, } mode; -typedef enum types { - HEADING, - DATE, - TODO, - BULLET, -} types; +typedef enum outputformats { + GOATNOTE, + HTML, + GROFF, +} outputformats; -typedef struct token { - char data[256]; - types type; -} token; +outputformats outputformat; 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++; @@ -50,6 +36,24 @@ char *stripwhitespace(char *expr) { return expr; } +void formatcheck() { + types prev = NIL; + for (int i = 0; i < tokcount; i++) { + switch (prev) { + case NIL: + if (tokens[i].type != HEADING) eprint("Expected heading!"); + break; + case HEADING: + if (tokens[i].type != DATE) eprint("Expected date"); + break; + case DATE: + if (tokens[i].type != TODO) eprint("Expected todo|done marker"); + break; + } + prev = tokens[i].type; + } +} + int readuntil(char *file, int off, char end, types t) { int j = 0; char tok[256]; @@ -74,6 +78,15 @@ int readuntil(char *file, int off, char end, types t) { int main(int argc, char **argv) { for (int i = 0; i < argc && argc != 1; i++) { if (strcmp(argv[i], "-l") == 0) m = LIST; + else if (strcmp(argv[i], "-c") == 0) m = CHECK; + else if (strcmp(argv[i], "-o") == 0) { + i++; + if (strcmp(argv[i], "goatnote") == 0) outputformat = GOATNOTE; + else if (strcmp(argv[i], "html") == 0) outputformat = HTML; + else if (strcmp(argv[i], "groff") == 0) outputformat = GROFF; + + m = OUTPUT; + } } char file[INT16_MAX]; @@ -99,6 +112,19 @@ int main(int argc, char **argv) { for (int i = 0; i < tokcount; i++) if (tokens[i].type == HEADING) printf("%s\n", tokens[i].data); break; + case CHECK: + formatcheck(); + break; + case OUTPUT: + formatcheck(); + for (int i = 0; i < tokcount; i++){ + switch (outputformat) { + case HTML: printashtml(tokens[i]); break; + case GOATNOTE: printasgn(tokens[i]); break; + case GROFF: printasgroff(tokens[i]); break; + } + } + case NONE: return 0; } return 0; |