#include #include #include #include #include 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 = "

"; end = "

"; break; case DATE: start = "

"; end = "

"; break; case TODO: start = "

"; end = "

"; break; case BULLET: start = "

"; end = "

"; break; } printf("%s%s%s\n", start, t.data, end); } char *stripwhitespace(char *expr) { while (isblank(expr[0])) expr++; while (isblank(expr[strlen(expr) - 1])) expr[strlen(expr) - 1] = 0; 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; }