From 7caa51ee5a0c6624eb97d1d6bf06b84bdbd7f034 Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Mon, 23 Feb 2009 07:09:13 +0000 Subject: termact.c -> term.c term.c -> mdocterm.c tree.c -> mdoctree.c Fixed/finished mmain.h. --- mmain.c | 72 ++++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 40 insertions(+), 32 deletions(-) (limited to 'mmain.c') diff --git a/mmain.c b/mmain.c index 5e41683a..370d23f8 100644 --- a/mmain.c +++ b/mmain.c @@ -1,4 +1,4 @@ - /* $Id: mmain.c,v 1.1 2009/02/22 22:58:39 kristaps Exp $ */ + /* $Id: mmain.c,v 1.2 2009/02/23 07:09:13 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -42,7 +42,7 @@ struct mmain { struct mdoc *mdoc; /* Active parser. */ char *buf; /* Input buffer. */ u_long bufsz; /* Input buffer size. */ - char in[MAXPATHLEN]; /* Input file name. */ + char *in; /* Input file name. */ int fdin; /* Input file desc. */ }; @@ -60,6 +60,9 @@ extern int getsubopt(char **, char *const *, char **); #endif +/* + * Print our and our caller's usage message. + */ void mmain_usage(const char *help) { @@ -69,6 +72,9 @@ mmain_usage(const char *help) } +/* + * Allocate the convenience library and initialise some values. + */ struct mmain * mmain_alloc(void) { @@ -77,36 +83,41 @@ mmain_alloc(void) if (NULL == (p = calloc(1, sizeof(struct mmain)))) err(1, "malloc"); - (void)strlcpy(p->in, "-", MAXPATHLEN); + p->in = "-"; p->fdin = STDIN_FILENO; return(p); } +/* + * Parse command-line options. Accepts a small (<28 char) opstring "u" + * parameter (e.g. "ho:") or NULL, a corresponding "help" string (e.g. + * "[-h] [-o output]" or NULL, a callback function for parsed arguments + * and an opaque pointer argument for that function. + */ int -mmain_isopt(int c) +mmain_getopt(struct mmain *p, int argc, char *argv[], + const char *help, const char *u, void *arg, + int (*getopt_cb)(void *, int, const char *)) { - - switch (c) { - case ('v'): - /* FALLTHROUGH */ - case ('W'): - return(1); - default: - break; - } - return(0); -} + int c; + char opts[32]; /* XXX */ + size_t sz; + extern int optind; + extern int optreset; -int -mmain_getopt(struct mmain *p, int argc, - char *argv[], const char *help) -{ - int c; + sz = strlcpy(opts, "vW:", 32); + assert(sz < 32); + + if (u) { + sz = strlcat(opts, u, 32); + assert(sz < 32); + } - while (-1 != (c = getopt(argc, argv, ":vW:"))) + /* LINTED */ + while (-1 != (c = getopt(argc, argv, opts))) switch (c) { case ('v'): p->dbg++; @@ -116,23 +127,20 @@ mmain_getopt(struct mmain *p, int argc, return(0); break; case ('?'): - break; - default: mmain_usage(help); return(0); + default: + assert(getopt_cb); + if ((*getopt_cb)(arg, c, optarg)) + break; + return(0); } argv += optind; - argc -= optind; + if ((argc -= optind) > 0) + p->in = *argv++; - if (0 == argc) - return(1); - - if (strlcpy(p->in, *argv++, MAXPATHLEN) < MAXPATHLEN) - return(1); - - warnx("filename too long"); - return(0); + return(1); } -- cgit v1.2.3-56-ge451