]> git.cameronkatri.com Git - mandoc.git/blobdiff - mmain.c
Strings abstracted into dynamically-created C files.
[mandoc.git] / mmain.c
diff --git a/mmain.c b/mmain.c
index 5e41683a0dfbefe9388e9cc3f77f81437146fc9a..0660f2843dd8b96e1ca17f3c530815d59370bd07 100644 (file)
--- 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.5 2009/03/06 14:13:47 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -42,7 +42,7 @@ struct        mmain {
        struct mdoc      *mdoc;         /* Active parser. */
        char             *buf;          /* Input buffer. */
        u_long            bufsz;        /* Input buffer size. */
        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. */
 };
 
        int               fdin;         /* Input file desc. */
 };
 
@@ -57,9 +57,14 @@ static       int               msg_warn(void *, int, int,
 
 #ifdef __linux__
 extern int               getsubopt(char **, char *const *, char **);
 
 #ifdef __linux__
 extern int               getsubopt(char **, char *const *, char **);
+extern size_t            strlcpy(char *, const char *, size_t);
+extern size_t            strlcat(char *, const char *, size_t);
 #endif
 
 
 #endif
 
 
+/*
+ * Print our and our caller's usage message.
+ */
 void
 mmain_usage(const char *help)
 {
 void
 mmain_usage(const char *help)
 {
@@ -69,6 +74,9 @@ mmain_usage(const char *help)
 }
 
 
 }
 
 
+/*
+ * Allocate the convenience library and initialise some values.
+ */ 
 struct mmain *
 mmain_alloc(void)
 {
 struct mmain *
 mmain_alloc(void)
 {
@@ -77,67 +85,73 @@ mmain_alloc(void)
        if (NULL == (p = calloc(1, sizeof(struct mmain))))
                err(1, "malloc");
 
        if (NULL == (p = calloc(1, sizeof(struct mmain))))
                err(1, "malloc");
 
-       (void)strlcpy(p->in, "-", MAXPATHLEN);
+       p->in = "-";
        p->fdin = STDIN_FILENO;
 
        return(p);
 }
 
 
        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
 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;
 
 
-int
-mmain_getopt(struct mmain *p, int argc,
-               char *argv[], const char *help)
-{
-       int              c;
+       sz = strlcpy(opts, "VvW:", 32);
+       assert(sz < 32);
 
 
-       while (-1 != (c = getopt(argc, argv, ":vW:")))
+       if (u) {
+               sz = strlcat(opts, u, 32);
+               assert(sz < 32);
+       }
+
+       optind = 1;
+
+       /* LINTED */
+       while (-1 != (c = getopt(argc, argv, opts)))
                switch (c) {
                case ('v'):
                        p->dbg++;
                        break;
                switch (c) {
                case ('v'):
                        p->dbg++;
                        break;
+               case ('V'):
+                       (void)printf("%s %s\n", __progname, VERSION);
+                       return(0);
                case ('W'):
                        if ( ! getsopts(p, optarg))
                case ('W'):
                        if ( ! getsopts(p, optarg))
-                               return(0);
+                               return(-1);
                        break;
                case ('?'):
                        break;
                case ('?'):
-                       break;
-               default:
                        mmain_usage(help);
                        mmain_usage(help);
-                       return(0);
+                       return(-1);
+               default:
+                       assert(getopt_cb);
+                       if ((*getopt_cb)(arg, c, optarg))
+                               break;
+                       return(-1);
                }
 
        argv += optind;
                }
 
        argv += optind;
-       argc -= optind;
-
-       if (0 == argc)
-               return(1);
+       if ((argc -= optind) > 0)
+               p->in = *argv++;
 
 
-       if (strlcpy(p->in, *argv++, MAXPATHLEN) < MAXPATHLEN)
-               return(1);
-
-       warnx("filename too long");
-       return(0);
+       return(1);
 }
 
 
 }
 
 
-__dead void
-mmain_exit(struct mmain *p, int code)
+dead_pre void
+mmain_exit(struct mmain *p, int code) 
 {
 
        if (p->mdoc)
 {
 
        if (p->mdoc)