]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandocdb.c
Make HTML tags lower case for better stylistic agreement with what
[mandoc.git] / mandocdb.c
index ff4df09add461470101e47950f8dced1b24bf02d..b8966fc8c228968bf0295272cda26d20e61e8764 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: mandocdb.c,v 1.203 2015/10/13 22:59:54 schwarze Exp $ */
+/*     $Id: mandocdb.c,v 1.216 2016/03/17 21:26:26 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2011-2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011-2016 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -23,7 +23,9 @@
 
 #include <assert.h>
 #include <ctype.h>
+#if HAVE_ERR
 #include <err.h>
+#endif
 #include <errno.h>
 #include <fcntl.h>
 #if HAVE_FTS
@@ -154,8 +156,6 @@ static      void     parse_man(struct mpage *, const struct roff_meta *,
                        const struct roff_node *);
 static void     parse_mdoc(struct mpage *, const struct roff_meta *,
                        const struct roff_node *);
-static int      parse_mdoc_body(struct mpage *, const struct roff_meta *,
-                       const struct roff_node *);
 static int      parse_mdoc_head(struct mpage *, const struct roff_meta *,
                        const struct roff_node *);
 static int      parse_mdoc_Fd(struct mpage *, const struct roff_meta *,
@@ -171,6 +171,8 @@ static      int      parse_mdoc_Nm(struct mpage *, const struct roff_meta *,
                        const struct roff_node *);
 static int      parse_mdoc_Sh(struct mpage *, const struct roff_meta *,
                        const struct roff_node *);
+static int      parse_mdoc_Va(struct mpage *, const struct roff_meta *,
+                       const struct roff_node *);
 static int      parse_mdoc_Xr(struct mpage *, const struct roff_meta *,
                        const struct roff_node *);
 static void     putkey(const struct mpage *, char *, uint64_t);
@@ -183,8 +185,6 @@ static      int      set_basedir(const char *, int);
 static int      treescan(void);
 static size_t   utf8(unsigned int, char [7]);
 
-extern char            *__progname;
-
 static char             tempfilename[32];
 static int              nodb; /* no database changes */
 static int              mparse_options; /* abort the parse early */
@@ -242,8 +242,8 @@ static      const struct mdoc_handler mdocs[MDOC_MAX] = {
        { NULL, TYPE_Pa },  /* Pa */
        { NULL, 0 },  /* Rv */
        { NULL, TYPE_St },  /* St */
-       { NULL, TYPE_Va },  /* Va */
-       { parse_mdoc_body, TYPE_Va },  /* Vt */
+       { parse_mdoc_Va, TYPE_Va },  /* Va */
+       { parse_mdoc_Va, TYPE_Vt },  /* Vt */
        { parse_mdoc_Xr, 0 },  /* Xr */
        { NULL, 0 },  /* %A */
        { NULL, 0 },  /* %B */
@@ -335,10 +335,17 @@ mandocdb(int argc, char *argv[])
 {
        struct manconf    conf;
        struct mparse    *mp;
-       const char       *path_arg;
+       const char       *path_arg, *progname;
        size_t            j, sz;
        int               ch, i;
 
+#if HAVE_PLEDGE
+       if (pledge("stdio rpath wpath cpath fattr flock proc exec", NULL) == -1) {
+               warn("pledge");
+               return (int)MANDOCLEVEL_SYSERR;
+       }
+#endif
+
        memset(&conf, 0, sizeof(conf));
        memset(stmts, 0, STMT__MAX * sizeof(sqlite3_stmt *));
 
@@ -412,6 +419,15 @@ mandocdb(int argc, char *argv[])
        argc -= optind;
        argv += optind;
 
+#if HAVE_PLEDGE
+       if (nodb) {
+               if (pledge("stdio rpath", NULL) == -1) {
+                       warn("pledge");
+                       return (int)MANDOCLEVEL_SYSERR;
+               }
+       }
+#endif
+
        if (OP_CONFFILE == op && argc > 0) {
                warnx("-C: Too many arguments");
                goto usage;
@@ -437,6 +453,15 @@ mandocdb(int argc, char *argv[])
                         * The existing database is usable.  Process
                         * all files specified on the command-line.
                         */
+#if HAVE_PLEDGE
+                       if (!nodb) {
+                               if (pledge("stdio rpath wpath cpath fattr flock", NULL) == -1) {
+                                       warn("pledge");
+                                       exitcode = (int)MANDOCLEVEL_SYSERR;
+                                       goto out;
+                               }
+                       }
+#endif
                        use_all = 1;
                        for (i = 0; i < argc; i++)
                                filescan(argv[i]);
@@ -526,13 +551,13 @@ out:
        ohash_delete(&mlinks);
        return exitcode;
 usage:
+       progname = getprogname();
        fprintf(stderr, "usage: %s [-aDnpQ] [-C file] [-Tutf8]\n"
                        "       %s [-aDnpQ] [-Tutf8] dir ...\n"
                        "       %s [-DnpQ] [-Tutf8] -d dir [file ...]\n"
                        "       %s [-Dnp] -u dir [file ...]\n"
                        "       %s [-Q] -t file ...\n",
-                      __progname, __progname, __progname,
-                      __progname, __progname);
+                       progname, progname, progname, progname, progname);
 
        return (int)MANDOCLEVEL_BADARG;
 }
@@ -549,7 +574,7 @@ usage:
  *   or
  *   [./]cat<section>[/<arch>]/<name>.0
  *
- * TODO: accomodate for multi-language directories.
+ * TODO: accommodate for multi-language directories.
  */
 static int
 treescan(void)
@@ -1109,8 +1134,7 @@ mpages_merge(struct mparse *mp)
                man = NULL;
                sodest = NULL;
 
-               mparse_open(mp, &fd, mlink->file);
-               if (fd == -1) {
+               if ((fd = mparse_open(mp, mlink->file)) == -1) {
                        say(mlink->file, "&open");
                        goto nextpage;
                }
@@ -1121,6 +1145,7 @@ mpages_merge(struct mparse *mp)
                 */
                if (mlink->dform != FORM_CAT || mlink->fform != FORM_CAT) {
                        mparse_readfd(mp, fd, mlink->file);
+                       close(fd);
                        mparse_result(mp, &man, &sodest);
                }
 
@@ -1166,6 +1191,7 @@ mpages_merge(struct mparse *mp)
                        }
                        goto nextpage;
                } else if (man != NULL && man->macroset == MACROSET_MDOC) {
+                       mdoc_validate(man);
                        mpage->form = FORM_SRC;
                        mpage->sec = man->meta.msec;
                        mpage->sec = mandoc_strdup(
@@ -1175,6 +1201,7 @@ mpages_merge(struct mparse *mp)
                            mpage->arch == NULL ? "" : mpage->arch);
                        mpage->title = mandoc_strdup(man->meta.title);
                } else if (man != NULL && man->macroset == MACROSET_MAN) {
+                       man_validate(man);
                        mpage->form = FORM_SRC;
                        mpage->sec = mandoc_strdup(man->meta.msec);
                        mpage->arch = mandoc_strdup(mlink->arch);
@@ -1267,7 +1294,9 @@ parse_cat(struct mpage *mpage, int fd)
 {
        FILE            *stream;
        char            *line, *p, *title;
-       size_t           len, plen, titlesz;
+       size_t           linesz, plen, titlesz;
+       ssize_t          len;
+       int              offs;
 
        stream = (-1 == fd) ?
            fopen(mpage->mlinks->file, "r") :
@@ -1280,10 +1309,13 @@ parse_cat(struct mpage *mpage, int fd)
                return;
        }
 
+       line = NULL;
+       linesz = 0;
+
        /* Skip to first blank line. */
 
-       while (NULL != (line = fgetln(stream, &len)))
-               if ('\n' == *line)
+       while (getline(&line, &linesz, stream) != -1)
+               if (*line == '\n')
                        break;
 
        /*
@@ -1291,8 +1323,8 @@ parse_cat(struct mpage *mpage, int fd)
         * is the first section header.  Skip to it.
         */
 
-       while (NULL != (line = fgetln(stream, &len)))
-               if ('\n' != *line && ' ' != *line)
+       while (getline(&line, &linesz, stream) != -1)
+               if (*line != '\n' && *line != ' ')
                        break;
 
        /*
@@ -1305,20 +1337,20 @@ parse_cat(struct mpage *mpage, int fd)
        titlesz = 0;
        title = NULL;
 
-       while (NULL != (line = fgetln(stream, &len))) {
-               if (' ' != *line || '\n' != line[len - 1])
+       while ((len = getline(&line, &linesz, stream)) != -1) {
+               if (*line != ' ')
                        break;
-               while (len > 0 && isspace((unsigned char)*line)) {
-                       line++;
-                       len--;
-               }
-               if (1 == len)
+               offs = 0;
+               while (isspace((unsigned char)line[offs]))
+                       offs++;
+               if (line[offs] == '\0')
                        continue;
-               title = mandoc_realloc(title, titlesz + len);
-               memcpy(title + titlesz, line, len);
-               titlesz += len;
+               title = mandoc_realloc(title, titlesz + len - offs);
+               memcpy(title + titlesz, line + offs, len - offs);
+               titlesz += len - offs;
                title[titlesz - 1] = ' ';
        }
+       free(line);
 
        /*
         * If no page content can be found, or the input line
@@ -1336,8 +1368,7 @@ parse_cat(struct mpage *mpage, int fd)
                return;
        }
 
-       title = mandoc_realloc(title, titlesz + 1);
-       title[titlesz] = '\0';
+       title[titlesz - 1] = '\0';
 
        /*
         * Skip to the first dash.
@@ -1415,7 +1446,7 @@ parse_man(struct mpage *mpage, const struct roff_meta *meta,
        char             byte;
        size_t           sz;
 
-       if (NULL == n)
+       if (n == NULL)
                return;
 
        /*
@@ -1427,13 +1458,12 @@ parse_man(struct mpage *mpage, const struct roff_meta *meta,
 
        if (n->type == ROFFT_BODY && n->tok == MAN_SH) {
                body = n;
-               assert(body->parent);
-               if (NULL != (head = body->parent->head) &&
-                   1 == head->nchild &&
-                   NULL != (head = (head->child)) &&
+               if ((head = body->parent->head) != NULL &&
+                   (head = head->child) != NULL &&
+                   head->next == NULL &&
                    head->type == ROFFT_TEXT &&
-                   0 == strcmp(head->string, "NAME") &&
-                   NULL != body->child) {
+                   strcmp(head->string, "NAME") == 0 &&
+                   body->child != NULL) {
 
                        /*
                         * Suck the entire NAME section into memory.
@@ -1657,6 +1687,31 @@ parse_mdoc_Fo(struct mpage *mpage, const struct roff_meta *meta,
        return 0;
 }
 
+static int
+parse_mdoc_Va(struct mpage *mpage, const struct roff_meta *meta,
+       const struct roff_node *n)
+{
+       char *cp;
+
+       if (n->type != ROFFT_ELEM && n->type != ROFFT_BODY)
+               return 0;
+
+       if (n->child != NULL &&
+           n->child->next == NULL &&
+           n->child->type == ROFFT_TEXT)
+               return 1;
+
+       cp = NULL;
+       deroff(&cp, n);
+       if (cp != NULL) {
+               putkey(mpage, cp, TYPE_Vt | (n->tok == MDOC_Va ||
+                   n->type == ROFFT_BODY ? TYPE_Va : 0));
+               free(cp);
+       }
+
+       return 0;
+}
+
 static int
 parse_mdoc_Xr(struct mpage *mpage, const struct roff_meta *meta,
        const struct roff_node *n)
@@ -1725,14 +1780,6 @@ parse_mdoc_head(struct mpage *mpage, const struct roff_meta *meta,
        return n->type == ROFFT_HEAD;
 }
 
-static int
-parse_mdoc_body(struct mpage *mpage, const struct roff_meta *meta,
-       const struct roff_node *n)
-{
-
-       return n->type == ROFFT_BODY;
-}
-
 /*
  * Add a string to the hash table for the current manual.
  * Each string has a bitmask telling which macros it belongs to.