version 1.44, 2009/01/15 17:38:57 |
version 1.47, 2009/01/16 15:58:50 |
|
|
|
|
#define MD_LINE_SZ (256) /* Max input line size. */ |
#define MD_LINE_SZ (256) /* Max input line size. */ |
|
|
|
|
struct md_parse { |
struct md_parse { |
int warn; /* Warning flags. */ |
int warn; /* Warning flags. */ |
#define MD_WARN_SYNTAX (1 << 0) /* Show syntax warnings. */ |
#define MD_WARN_SYNTAX (1 << 0) /* Show syntax warnings. */ |
#define MD_WARN_COMPAT (1 << 1) /* Show compat warnings. */ |
#define MD_WARN_COMPAT (1 << 1) /* Show compat warnings. */ |
#define MD_WARN_ALL (0x03) /* Show all warnings. */ |
#define MD_WARN_ALL (0x03) /* Show all warnings. */ |
#define MD_WARN_ERR (1 << 2) /* Make warnings->errors. */ |
#define MD_WARN_ERR (1 << 2) /* Make warnings->errors. */ |
int dbg; /* Debug level. */ |
int dbg; /* Debug level. */ |
struct mdoc *mdoc; /* Active parser. */ |
struct mdoc *mdoc; /* Active parser. */ |
char *buf; /* Input buffer. */ |
char *buf; /* Input buffer. */ |
u_long bufsz; /* Input buffer size. */ |
u_long bufsz; /* Input buffer size. */ |
char *name; /* Input file name. */ |
char *name; /* Input file name. */ |
int fd; /* Input file desc. */ |
int fd; /* Input file desc. */ |
|
int (*fp)(const struct mdoc_node *, const char *); |
}; |
}; |
|
|
extern char *__progname; |
extern char *__progname; |
|
|
static void usage(void); |
extern int |
|
|
static int parse_begin(struct md_parse *); |
static void usage(void); |
static int parse_leave(struct md_parse *, int); |
|
static int io_begin(struct md_parse *); |
|
static int io_leave(struct md_parse *, int); |
|
static int buf_begin(struct md_parse *); |
|
static int buf_leave(struct md_parse *, int); |
|
|
|
static void msg_msg(void *, int, int, const char *); |
static int parse_begin(struct md_parse *); |
static int msg_err(void *, int, int, const char *); |
static int parse_leave(struct md_parse *, int); |
static int msg_warn(void *, int, int, |
static int io_begin(struct md_parse *); |
|
static int io_leave(struct md_parse *, int); |
|
static int buf_begin(struct md_parse *); |
|
static int buf_leave(struct md_parse *, int); |
|
|
|
static void msg_msg(void *, int, int, const char *); |
|
static int msg_err(void *, int, int, const char *); |
|
static int msg_warn(void *, int, int, |
enum mdoc_warn, const char *); |
enum mdoc_warn, const char *); |
|
|
#ifdef __linux__ |
#ifdef __linux__ |
extern int getsubopt(char **, char *const *, char **); |
extern int getsubopt(char **, char *const *, char **); |
#endif |
#endif |
|
|
int |
int |
Line 75 main(int argc, char *argv[]) |
|
Line 79 main(int argc, char *argv[]) |
|
{ |
{ |
int c; |
int c; |
struct md_parse parser; |
struct md_parse parser; |
char *opts, *v; |
char *opts, *v, *filter, *output; |
#define ALL 0 |
#define ALL 0 |
#define COMPAT 1 |
#define COMPAT 1 |
#define SYNTAX 2 |
#define SYNTAX 2 |
Line 86 main(int argc, char *argv[]) |
|
Line 90 main(int argc, char *argv[]) |
|
extern char *optarg; |
extern char *optarg; |
extern int optind; |
extern int optind; |
|
|
|
output = filter = NULL; |
|
|
(void)memset(&parser, 0, sizeof(struct md_parse)); |
(void)memset(&parser, 0, sizeof(struct md_parse)); |
|
|
while (-1 != (c = getopt(argc, argv, "vW:"))) |
while (-1 != (c = getopt(argc, argv, "f:vW:o:"))) |
switch (c) { |
switch (c) { |
|
case ('f'): |
|
filter = optarg; |
|
break; |
|
case ('o'): |
|
output = optarg; |
|
break; |
case ('v'): |
case ('v'): |
parser.dbg++; |
parser.dbg++; |
break; |
break; |
Line 194 buf_begin(struct md_parse *p) |
|
Line 206 buf_begin(struct md_parse *p) |
|
} |
} |
|
|
|
|
static void |
|
print_node(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; |
|
|
|
t = mdoc_type2a(n->type); |
|
|
|
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) |
|
print_node(n->child, indent + 1); |
|
if (n->next) |
|
print_node(n->next, indent); |
|
} |
|
|
|
|
|
static int |
static int |
parse_leave(struct md_parse *p, int code) |
parse_leave(struct md_parse *p, int code) |
{ |
{ |
Line 276 parse_leave(struct md_parse *p, int code) |
|
Line 216 parse_leave(struct md_parse *p, int code) |
|
|
|
if ( ! mdoc_endparse(p->mdoc)) |
if ( ! mdoc_endparse(p->mdoc)) |
code = 0; |
code = 0; |
if ((n = mdoc_result(p->mdoc))) |
if (p->fp && (n = mdoc_result(p->mdoc))) |
print_node(n, 0); |
(*p->fp)(n, NULL); |
|
|
mdoc_free(p->mdoc); |
mdoc_free(p->mdoc); |
|
|
Line 339 msg_err(void *arg, int line, int col, const char *msg) |
|
Line 279 msg_err(void *arg, int line, int col, const char *msg) |
|
|
|
p = (struct md_parse *)arg; |
p = (struct md_parse *)arg; |
|
|
xfprintf(stderr, "%s:%d: error: %s (column %d)", |
xfprintf(stderr, "%s:%d: error: %s (column %d)\n", |
p->name, line, msg, col); |
p->name, line, msg, col); |
return(0); |
return(0); |
} |
} |
Line 355 msg_msg(void *arg, int line, int col, const char *msg) |
|
Line 295 msg_msg(void *arg, int line, int col, const char *msg) |
|
if (0 == p->dbg) |
if (0 == p->dbg) |
return; |
return; |
|
|
xfprintf(stderr, "%s:%d: debug: %s (column %d)", |
xfprintf(stderr, "%s:%d: debug: %s (column %d)\n", |
p->name, line, msg, col); |
p->name, line, msg, col); |
} |
} |
|
|
|
|
usage(void) |
usage(void) |
{ |
{ |
|
|
xfprintf(stderr, "usage: %s [-v] [-Wwarn...] [infile]\n", |
xfprintf(stderr, "usage: %s [-v] [-Wwarn...] [-ffilter] " |
__progname); |
"[-o outfile] [infile]\n", __progname); |
} |
} |
|
|