diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..40a63bc --- /dev/null +++ b/src/main.c @@ -0,0 +1,102 @@ +#include <stdlib.h> +#include <stdio.h> +#include "bstrlib.h" +#include "stmd.h" +#include "debug.h" + +void print_usage() +{ + printf("Usage: stmd [FILE*]\n"); + printf("Options: --help, -h Print usage information\n"); + printf(" --ast Print AST instead of HTML\n"); + printf(" --version Print version\n"); +} + +int main(int argc, char *argv[]) { + int i; + bool ast = false; + int g = 0; + int numfps = 0; + int files[argc]; + + for (i=1; i < argc; i++) { + if (strcmp(argv[i], "--version") == 0) { + printf("stmd %s", VERSION); + printf(" - standard markdown converter (c) 2014 John MacFarlane\n"); + exit(0); + } else if ((strcmp(argv[i], "--help") == 0) || + (strcmp(argv[i], "-h") == 0)) { + print_usage(); + exit(0); + } else if (strcmp(argv[i], "--ast") == 0) { + ast = true; + } else if (*argv[i] == '-') { + print_usage(); + exit(1); + } else { // treat as file argument + files[g] = i; + g++; + } + } + + numfps = g; + bstring s = NULL; + bstring html; + g = 0; + block * cur = make_document(); + int linenum = 1; + extern int errno; + FILE * fp = NULL; + + if (numfps == 0) { + // read from stdin + while ((s = bgets((bNgetc) fgetc, stdin, '\n'))) { + check(incorporate_line(s, linenum, &cur) == 0, + "error incorporating line %d", linenum); + bdestroy(s); + linenum++; + } + } else { + // iterate over input file pointers + for (g=0; g < numfps; g++) { + + fp = fopen(argv[files[g]], "r"); + if (fp == NULL) { + fprintf(stderr, "Error opening file %s: %s\n", + argv[files[g]], strerror(errno)); + exit(1); + } + + struct bStream *stream = bsopen((bNread)fread, fp); + if (stream == NULL) { + printf("Error opening stream\n"); + } + while (bsreadln(s, stream, '\n') != BSTR_ERR) { + check(incorporate_line(s, linenum, &cur) == 0, + "error incorporating line %d of %s", linenum, argv[files[g]]); + linenum++; + } + bsclose(stream); + } + } + + while (cur != cur->top) { + finalize(cur, linenum); + cur = cur->parent; + } + check(cur == cur->top, "problems finalizing open containers"); + finalize(cur, linenum); + process_inlines(cur, cur->attributes.refmap); + if (ast) { + print_blocks(cur, 0); + } else { + check(blocks_to_html(cur, &html, false) == 0, "could not format as HTML"); + printf("%s", html->data); + bdestroy(html); + } + free_blocks(cur); + return 0; +error: + return -1; +} + |