X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;ds=inline;f=tmp.c;h=bcb624e6c42c327c7da36241fdf8a442e1f06602;hb=9f1e6a612e7e9ebb4bc703b8e75a723ed7c8779c;hp=bcdfeedf015b0348857b100a8a051cc48f6317ef;hpb=66fa8273ac6f360864e8a594da3310f42379ae1e;p=smdp.git diff --git a/tmp.c b/tmp.c index bcdfeed..bcb624e 100644 --- a/tmp.c +++ b/tmp.c @@ -1,22 +1,56 @@ +#include +#include #include #include -#include +#include #include "include/markdown.h" +void usage() { + fprintf(stderr, "Usage: tmp [OPTION]... [FILE]\n"); + fprintf(stderr, "A command-line based markdown presentation tool.\n\n"); + fprintf(stderr, " -d, --debug enable debug messages on STDERR\n"); + fprintf(stderr, " add it multiple times to increases debug level\n\n"); + fprintf(stderr, " -h, --help display this help and exit\n"); + fprintf(stderr, "\nWith no FILE, or when FILE is -, read standard input.\n\n"); + exit(EXIT_FAILURE); +} + int main(int argc, char *argv[]) { + // define command-line options + struct option longopts[] = { + { "debug", no_argument, 0, 'd' }, + { "help", no_argument, 0, 'h' }, + { 0, 0, 0, 0 } + }; + + // parse command-line options + int opt, debug = 0; + while ((opt = getopt_long(argc, argv, ":dh", longopts, NULL)) != -1) { + switch(opt) { + case 'd': debug += 1; break; + case 'h': usage(); break; + case ':': fprintf(stderr, "%s: '%c' requires an argument\n", argv[0], optopt); usage(); break; + case '?': + default : fprintf(stderr, "%s: option '%c' is invalid\n", argv[0], optopt); usage(); break; + } + } + + // open file or set input to STDIN + char *file; FILE *input; - document_t *doc; + if (optind < argc) { + do { + file = argv[optind]; + } while(++optind < argc); - if (argc > 1) { - if(!strcmp(argv[1], "-")) { + if(!strcmp(file, "-")) { input = stdin; } else { - input = fopen(argv[1],"r"); + input = fopen(file,"r"); if(!input) { - fprintf(stderr, "Unable to open '%s': %s\n", - argv[1], strerror(errno)); + fprintf(stderr, "%s: %s: %s\n", argv[0], file, strerror(errno)); exit(EXIT_FAILURE); } } @@ -24,6 +58,49 @@ int main(int argc, char *argv[]) { input = stdin; } + // load document object from input + document_t *doc; doc = markdown_load(input); + + if(debug > 0) { + // print header to STDERR + int offset; + line_t *header; + if(doc->header) { + header = doc->header; + while(header && + header->text->size > 0 && + header->text->text[0] == '%') { + + offset = next_blank(header->text, 0) + 1; + fprintf(stderr, "header: %s\n", &header->text->text[offset]); + header = header->next; + } + } + + // print page/line count to STDERR + int cp = 0, cl = 0; + page_t *page = doc->page; + line_t *line; + while(page) { + cp++; + if(debug > 1) { + fprintf(stderr, "page %i:\n", cp); + } + line = page->line; + cl = 0; + while(line) { + cl++; + if(debug > 1) { + fprintf(stderr, " line %i: bits = %i, length = %i\n", cl, line->bits, line->text->size); + } + line = line->next; + } + if(debug == 1) { + fprintf(stderr, "page %i: %i lines\n", cp, cl); + } + page = page->next; + } + } }