]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandocdb.c
Explain how to transform markup for the terminal when not using a
[mandoc.git] / mandocdb.c
index 10023d08d7bbfb410d7481d73ede89cb6c4aa54a..26117cf827816add40b1d125b85d62e12d066ecc 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mandocdb.c,v 1.246 2017/04/24 23:06:18 schwarze Exp $ */
+/*     $Id: mandocdb.c,v 1.253 2017/07/28 14:48:25 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011-2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -302,11 +302,8 @@ static     const struct mdoc_handler __mdocs[MDOC_MAX - MDOC_Dd] = {
        { NULL, 0, 0 },  /* En */
        { NULL, TYPE_Dx, NODE_NOSRC },  /* Dx */
        { NULL, 0, 0 },  /* %Q */
-       { NULL, 0, 0 },  /* br */
-       { NULL, 0, 0 },  /* sp */
        { NULL, 0, 0 },  /* %U */
        { NULL, 0, 0 },  /* Ta */
-       { NULL, 0, 0 },  /* ll */
 };
 static const struct mdoc_handler *const mdocs = __mdocs - MDOC_Dd;
 
@@ -423,7 +420,8 @@ mandocdb(int argc, char *argv[])
 
        exitcode = (int)MANDOCLEVEL_OK;
        mchars_alloc();
-       mp = mparse_alloc(mparse_options, MANDOCLEVEL_BADARG, NULL, NULL);
+       mp = mparse_alloc(mparse_options, MANDOCERR_MAX, NULL,
+           MANDOC_OS_OTHER, NULL);
        mandoc_ohash_init(&mpages, 6, offsetof(struct mpage, inodev));
        mandoc_ohash_init(&mlinks, 6, offsetof(struct mlink, file));
 
@@ -1547,8 +1545,11 @@ parse_mdoc(struct mpage *mpage, const struct roff_meta *meta,
 {
 
        for (n = n->child; n != NULL; n = n->next) {
-               if (n->tok == TOKEN_NONE || n->flags & mdocs[n->tok].taboo)
+               if (n->tok == TOKEN_NONE ||
+                   n->tok < ROFF_MAX ||
+                   n->flags & mdocs[n->tok].taboo)
                        continue;
+               assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX);
                switch (n->type) {
                case ROFFT_ELEM:
                case ROFFT_BLOCK:
@@ -2122,6 +2123,23 @@ dbwrite(struct dba *dba)
        int              status;
        pid_t            child;
 
+       /*
+        * Do not write empty databases, and delete existing ones
+        * when makewhatis -u causes them to become empty.
+        */
+
+       dba_array_start(dba->pages);
+       if (dba_array_next(dba->pages) == NULL) {
+               if (unlink(MANDOC_DB) == -1 && errno != ENOENT)
+                       say(MANDOC_DB, "&unlink");
+               return;
+       }
+
+       /*
+        * Build the database in a temporary file,
+        * then atomically move it into place.
+        */
+
        if (dba_write(MANDOC_DB "~", dba) != -1) {
                if (rename(MANDOC_DB "~", MANDOC_DB) == -1) {
                        exitcode = (int)MANDOCLEVEL_SYSERR;
@@ -2131,6 +2149,11 @@ dbwrite(struct dba *dba)
                return;
        }
 
+       /*
+        * We lack write permission and cannot replace the database
+        * file, but let's at least check whether the data changed.
+        */
+
        (void)strlcpy(tfn, "/tmp/mandocdb.XXXXXXXX", sizeof(tfn));
        if (mkdtemp(tfn) == NULL) {
                exitcode = (int)MANDOCLEVEL_SYSERR;