summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2014-07-21 22:29:16 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2014-08-13 22:56:32 -0700
commit870e63be7360b5a0097a27656048e853bc720464 (patch)
treee8f19ee2d62e529115cb71dcda5f3298cca7d389 /src/main.c
parent650ad87f35f4405a2ca8270d2b2835daa442e5f1 (diff)
Initial commit
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c102
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;
+}
+