diff options
Diffstat (limited to 'gn.c')
-rw-r--r-- | gn.c | 84 |
1 files changed, 58 insertions, 26 deletions
@@ -9,10 +9,11 @@ #include "util.h" typedef enum mode { - NONE, - LIST, - CHECK, - OUTPUT, + NONE = 0, + LIST = 1, + CHECK = 2, + OUTPUT = 4, + PRETTY = 8, } mode; typedef enum outputformats { @@ -28,6 +29,8 @@ mode m = NONE; token tokens[1024]; int tokcount = 0; +char *header = NULL, *footer = NULL; + char *stripwhitespace(char *expr) { while (isblank(expr[0])) expr++; @@ -77,18 +80,32 @@ 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) { + if (strcmp(argv[i], "-l") == 0) m |= LIST; + if (strcmp(argv[i], "-c") == 0) m |= CHECK; + if (strcmp(argv[i], "-o") == 0) { i++; + if (!(i < argc)) eprint("expecet additional argument after -o!") ; 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; + m |= OUTPUT; + } + if (strcmp(argv[i], "-p") == 0) m |= PRETTY; + if (strcmp(argv[i], "-h") == 0) { + i++; + if (!(i < argc)) eprint("expecet additional argument after -h!"); + header = argv[i]; } + + if (strcmp(argv[i], "-f") == 0) { + i++; + if (!(i < argc)) eprint("expecet additional argument after -f!"); + footer = argv[i]; + } } + char file[INT16_MAX]; int i; char c; @@ -104,28 +121,43 @@ int main(int argc, char **argv) { case '[': i = readuntil(file, i, ']', DATE); break; case '{': i = readuntil(file, i, '}', TODO); break; case '-': i = readuntil(file, i, '\n', BULLET); break; + case ' ': + case '\n': + case '\t': + break; + default: + eprint("unknown char found!"); } } - switch (m) { - case LIST: - 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; - } + if (header != NULL) printf("%s\n", header); + + if ((m & LIST) == LIST) { + formatcheck(); + for (int i = 0; i < tokcount; i++) { + if (tokens[i].type == HEADING) { + if ((m & PRETTY) == PRETTY) + printf("\e[1m%s\e[0m \e[4m%s\e[0m \e[2m%s\e[0m\n", tokens[i].data, tokens[i+1].data, tokens[i+2].data); + else + printf("%s %s %s\n", tokens[i].data, tokens[i+1].data, tokens[i+2].data); + i += 2; } - - case NONE: return 0; + } + } + if ((m & CHECK) == CHECK) { + formatcheck(); + } + if ((m & OUTPUT) == 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; + } + } } + + if (footer != NULL) printf("%s\n", footer); return 0; } |