]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandocdb.c
Make sure manuals in architecture-independent directories are treated
[mandoc.git] / mandocdb.c
index 9bea830c13e092faf6a9906b5dbd21f492c3d5ef..00773a580d5e9a80c809f07d7df58fae740dee45 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mandocdb.c,v 1.221 2016/07/19 21:31:55 schwarze Exp $ */
+/*     $Id: mandocdb.c,v 1.226 2016/08/05 17:22:45 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011-2016 Ingo Schwarze <schwarze@openbsd.org>
@@ -122,6 +122,7 @@ static      void     mlink_add(struct mlink *, const struct stat *);
 static void     mlink_check(struct mpage *, struct mlink *);
 static void     mlink_free(struct mlink *);
 static void     mlinks_undupe(struct mpage *);
+int             mpages_compare(const void *, const void *);
 static void     mpages_free(void);
 static void     mpages_merge(struct dba *, struct mparse *);
 static void     parse_cat(struct mpage *, int);
@@ -426,7 +427,8 @@ mandocdb(int argc, char *argv[])
                if (OP_TEST != op && 0 == set_basedir(path_arg, 1))
                        goto out;
 
-               if ((dba = dba_read(MANDOC_DB)) != NULL) {
+               dba = nodb ? dba_new(128) : dba_read(MANDOC_DB);
+               if (dba != NULL) {
                        /*
                         * The existing database is usable.  Process
                         * all files specified on the command-line.
@@ -443,7 +445,7 @@ mandocdb(int argc, char *argv[])
                        use_all = 1;
                        for (i = 0; i < argc; i++)
                                filescan(argv[i]);
-                       if (OP_TEST != op)
+                       if (nodb == 0)
                                dbprune(dba);
                } else {
                        /*
@@ -464,8 +466,7 @@ mandocdb(int argc, char *argv[])
        } else {
                /*
                 * If we have arguments, use them as our manpaths.
-                * If we don't, grok from manpath(1) or however else
-                * manconf_parse() wants to do it.
+                * If we don't, use man.conf(5).
                 */
                if (argc > 0) {
                        conf.manpath.paths = mandoc_reallocarray(NULL,
@@ -1085,23 +1086,30 @@ mlink_check(struct mpage *mpage, struct mlink *mlink)
 static void
 mpages_merge(struct dba *dba, struct mparse *mp)
 {
-       char                     any[] = "any";
-       struct mpage            *mpage, *mpage_dest;
+       struct mpage            **mplist, *mpage, *mpage_dest;
        struct mlink            *mlink, *mlink_dest;
        struct roff_man         *man;
        char                    *sodest;
        char                    *cp;
        int                      fd;
-       unsigned int             pslot;
+       unsigned int             ip, npages, pslot;
 
+       npages = ohash_entries(&mpages);
+       mplist = mandoc_reallocarray(NULL, npages, sizeof(*mplist));
+       ip = 0;
        mpage = ohash_first(&mpages, &pslot);
        while (mpage != NULL) {
                mlinks_undupe(mpage);
-               if ((mlink = mpage->mlinks) == NULL) {
-                       mpage = ohash_next(&mpages, &pslot);
-                       continue;
-               }
+               if (mpage->mlinks != NULL)
+                       mplist[ip++] = mpage;
+               mpage = ohash_next(&mpages, &pslot);
+       }
+       npages = ip;
+       qsort(mplist, npages, sizeof(*mplist), mpages_compare);
 
+       for (ip = 0; ip < npages; ip++) {
+               mpage = mplist[ip];
+               mlink = mpage->mlinks;
                name_mask = NAME_MASK;
                mandoc_ohash_init(&names, 4, offsetof(struct str, key));
                mandoc_ohash_init(&strings, 6, offsetof(struct str, key));
@@ -1187,19 +1195,6 @@ mpages_merge(struct dba *dba, struct mparse *mp)
                        mpage->arch = mandoc_strdup(mlink->arch);
                        mpage->title = mandoc_strdup(mlink->name);
                }
-               putkey(mpage, mpage->sec, TYPE_sec);
-               if (*mpage->arch != '\0')
-                       putkey(mpage, mpage->arch, TYPE_arch);
-
-               for ( ; mlink != NULL; mlink = mlink->next) {
-                       if ('\0' != *mlink->dsec)
-                               putkey(mpage, mlink->dsec, TYPE_sec);
-                       if ('\0' != *mlink->fsec)
-                               putkey(mpage, mlink->fsec, TYPE_sec);
-                       putkey(mpage, '\0' == *mlink->arch ?
-                           any : mlink->arch, TYPE_arch);
-                       putkey(mpage, mlink->name, NAME_FILE);
-               }
 
                assert(mpage->desc == NULL);
                if (man != NULL && man->macroset == MACROSET_MDOC)
@@ -1222,8 +1217,18 @@ mpages_merge(struct dba *dba, struct mparse *mp)
 nextpage:
                ohash_delete(&strings);
                ohash_delete(&names);
-               mpage = ohash_next(&mpages, &pslot);
        }
+       free(mplist);
+}
+
+int
+mpages_compare(const void *vp1, const void *vp2)
+{
+       const struct mpage      *mp1, *mp2;
+
+       mp1 = *(const struct mpage **)vp1;
+       mp2 = *(const struct mpage **)vp2;
+       return strcmp(mp1->mlinks->file, mp2->mlinks->file);
 }
 
 static void
@@ -1348,13 +1353,6 @@ parse_cat(struct mpage *mpage, int fd)
 static void
 putkey(const struct mpage *mpage, char *value, uint64_t type)
 {
-       char     *cp;
-
-       assert(NULL != value);
-       if (TYPE_arch == type)
-               for (cp = value; *cp; cp++)
-                       if (isupper((unsigned char)*cp))
-                               *cp = _tolower((unsigned char)*cp);
        putkeys(mpage, value, strlen(value), type);
 }
 
@@ -1695,7 +1693,7 @@ parse_mdoc_Nm(struct mpage *mpage, const struct roff_meta *meta,
        if ( ! (mpage->name_head_done ||
            n->child == NULL || n->child->string == NULL ||
            strcasecmp(n->child->string, meta->title))) {
-               putkey(mpage, n->child->string, ROFFT_HEAD);
+               putkey(mpage, n->child->string, NAME_HEAD);
                mpage->name_head_done = 1;
        }
        return 0;
@@ -1955,6 +1953,7 @@ dbadd_mlink(const struct mlink *mlink)
 {
        dba_page_alias(mlink->mpage->dba, mlink->name, NAME_FILE);
        dba_page_add(mlink->mpage->dba, DBP_SECT, mlink->dsec);
+       dba_page_add(mlink->mpage->dba, DBP_SECT, mlink->fsec);
        dba_page_add(mlink->mpage->dba, DBP_ARCH, mlink->arch);
        dba_page_add(mlink->mpage->dba, DBP_FILE, mlink->file);
 }
@@ -2014,13 +2013,16 @@ dbadd(struct dba *dba, struct mpage *mpage)
        cp = mpage->desc;
        i = strlen(cp);
        mustfree = render_string(&cp, &i);
-       mpage->dba = dba_page_new(dba->pages, mlink->name,
-           mlink->dsec, mlink->arch, cp, mlink->file, mpage->form);
+       mpage->dba = dba_page_new(dba->pages, mlink->name, mpage->sec,
+           *mpage->arch == '\0' ? mlink->arch : mpage->arch,
+           cp, mlink->file, mpage->form);
        if (mustfree)
                free(cp);
 
-       while ((mlink = mlink->next) != NULL)
+       while (mlink != NULL) {
                dbadd_mlink(mlink);
+               mlink = mlink->next;
+       }
 
        for (key = ohash_first(&names, &slot); NULL != key;
             key = ohash_next(&names, &slot)) {