version 1.2, 2009/02/22 22:58:39 |
version 1.5, 2009/03/06 14:13:47 |
|
|
#include <assert.h> |
#include <assert.h> |
#include <err.h> |
#include <err.h> |
#include <getopt.h> |
#include <getopt.h> |
|
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
|
|
#include "mmain.h" |
#include "mmain.h" |
|
|
extern void treeprint(const struct mdoc_node *, |
#define xprintf (void)printf |
const struct mdoc_meta *); |
|
|
|
|
static void doprint(const struct mdoc_node *, int); |
|
|
int |
int |
main(int argc, char *argv[]) |
main(int argc, char *argv[]) |
{ |
{ |
struct mmain *p; |
struct mmain *p; |
|
int c; |
const struct mdoc *mdoc; |
const struct mdoc *mdoc; |
int c; |
|
|
|
extern int optreset; |
|
extern int optind; |
|
|
|
p = mmain_alloc(); |
p = mmain_alloc(); |
|
|
if ( ! mmain_getopt(p, argc, argv, NULL)) |
c = mmain_getopt(p, argc, argv, NULL, NULL, NULL, NULL); |
mmain_exit(p, 1); |
if (1 != c) |
|
mmain_exit(p, -1 == c ? 1 : 0); |
|
|
optreset = optind = 1; |
|
printf("here\n"); |
|
|
|
while (-1 != (c = getopt(argc, argv, "f:"))) |
|
switch (c) { |
|
case ('f'): |
|
printf("%s\n", optarg); |
|
break; |
|
case ('?'): |
|
if (mmain_isopt(optopt)) { |
|
printf("ok: %d\n", optopt); |
|
break; |
|
} |
|
printf("bad: %d\n", optopt); |
|
/* FALLTHROUGH */ |
|
default: |
|
mmain_usage(NULL); |
|
mmain_exit(p, 1); |
|
/* NOTREACHED */ |
|
} |
|
|
|
if (NULL == (mdoc = mmain_mdoc(p))) |
if (NULL == (mdoc = mmain_mdoc(p))) |
mmain_exit(p, 1); |
mmain_exit(p, 1); |
|
|
treeprint(mdoc_node(mdoc), mdoc_meta(mdoc)); |
doprint(mdoc_node(mdoc), 0); |
mmain_exit(p, 0); |
mmain_exit(p, 0); |
/* NOTREACHED */ |
/* NOTREACHED */ |
} |
} |
|
|
|
|
|
static void |
|
doprint(const struct mdoc_node *n, int indent) |
|
{ |
|
const char *p, *t; |
|
int i, j; |
|
size_t argc, sz; |
|
char **params; |
|
struct mdoc_arg *argv; |
|
|
|
argv = NULL; |
|
argc = sz = 0; |
|
params = NULL; |
|
|
|
switch (n->type) { |
|
case (MDOC_ROOT): |
|
t = "root"; |
|
break; |
|
case (MDOC_BLOCK): |
|
t = "block"; |
|
break; |
|
case (MDOC_HEAD): |
|
t = "block-head"; |
|
break; |
|
case (MDOC_BODY): |
|
t = "block-body"; |
|
break; |
|
case (MDOC_TAIL): |
|
t = "block-tail"; |
|
break; |
|
case (MDOC_ELEM): |
|
t = "elem"; |
|
break; |
|
case (MDOC_TEXT): |
|
t = "text"; |
|
break; |
|
default: |
|
abort(); |
|
/* NOTREACHED */ |
|
} |
|
|
|
switch (n->type) { |
|
case (MDOC_TEXT): |
|
p = n->data.text.string; |
|
break; |
|
case (MDOC_BODY): |
|
p = mdoc_macronames[n->tok]; |
|
break; |
|
case (MDOC_HEAD): |
|
p = mdoc_macronames[n->tok]; |
|
break; |
|
case (MDOC_TAIL): |
|
p = mdoc_macronames[n->tok]; |
|
break; |
|
case (MDOC_ELEM): |
|
p = mdoc_macronames[n->tok]; |
|
argv = n->data.elem.argv; |
|
argc = n->data.elem.argc; |
|
break; |
|
case (MDOC_BLOCK): |
|
p = mdoc_macronames[n->tok]; |
|
argv = n->data.block.argv; |
|
argc = n->data.block.argc; |
|
break; |
|
case (MDOC_ROOT): |
|
p = "root"; |
|
break; |
|
default: |
|
abort(); |
|
/* NOTREACHED */ |
|
} |
|
|
|
for (i = 0; i < indent; i++) |
|
xprintf(" "); |
|
xprintf("%s (%s)", p, t); |
|
|
|
for (i = 0; i < (int)argc; i++) { |
|
xprintf(" -%s", mdoc_argnames[argv[i].arg]); |
|
if (argv[i].sz > 0) |
|
xprintf(" ["); |
|
for (j = 0; j < (int)argv[i].sz; j++) |
|
xprintf(" [%s]", argv[i].value[j]); |
|
if (argv[i].sz > 0) |
|
xprintf(" ]"); |
|
} |
|
|
|
for (i = 0; i < (int)sz; i++) |
|
xprintf(" [%s]", params[i]); |
|
|
|
xprintf(" %d:%d\n", n->line, n->pos); |
|
|
|
if (n->child) |
|
doprint(n->child, indent + 1); |
|
if (n->next) |
|
doprint(n->next, indent); |
|
} |