added getopts argument parsing + usage + debug mode

This commit is contained in:
Michael Göhler 2014-08-17 14:56:21 +02:00
parent c8c3b3d8b2
commit c29cfeaa5c
2 changed files with 72 additions and 33 deletions

View File

@ -1 +1 @@
set args sample.md
set args -d sample.md

103
tmp.c
View File

@ -1,22 +1,55 @@
#include <errno.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#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, " -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[]) {
FILE *input;
document_t *doc;
// define command-line options
struct option longopts[] = {
{ "debug", no_argument, 0, 'd' },
{ "help", no_argument, 0, 'h' },
{ 0, 0, 0, 0 }
};
if (argc > 1) {
if(!strcmp(argv[1], "-")) {
// 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;
if (optind < argc) {
do {
file = argv[optind];
} while(++optind < argc);
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,35 +57,41 @@ int main(int argc, char *argv[]) {
input = stdin;
}
// load document object from input
document_t *doc;
doc = markdown_load(input);
// test line/page load
int offset;
line_t *header;
if(doc->header) {
header = doc->header;
while(header &&
header->text->size > 0 &&
header->text->text[0] == '%') {
if(debug) {
// 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;
printf("header: %s\n", &header->text->text[offset]);
header = header->next;
offset = next_blank(header->text, 0) + 1;
printf("header: %s\n", &header->text->text[offset]);
header = header->next;
}
}
}
int cp = 0, cl = 0;
page_t *page = doc->page;
line_t *line;
while(page) {
cp++;
line = page->line;
cl = 0;
while(line) {
cl++;
line = line->next;
// print page/line count to STDERR
int cp = 0, cl = 0;
page_t *page = doc->page;
line_t *line;
while(page) {
cp++;
line = page->line;
cl = 0;
while(line) {
cl++;
line = line->next;
}
printf("page %i: %i lines\n", cp, cl);
page = page->next;
}
printf("page %i: %i lines\n", cp, cl);
page = page->next;
}
}