]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandocdb.c
Autodetect a suitable locale for -Tutf8 mode,
[mandoc.git] / mandocdb.c
index c9eda485879c89e20bc241d001ee28a84aee31b4..9a9bd828d618c95d7ff935efda410ae8036f51d9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mandocdb.c,v 1.222 2016/07/19 22:40:33 schwarze Exp $ */
+/*     $Id: mandocdb.c,v 1.224 2016/07/29 15:26:37 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);
@@ -1084,23 +1085,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));
@@ -1186,19 +1194,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)
@@ -1221,8 +1216,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
@@ -1347,13 +1352,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);
 }
 
@@ -1954,6 +1952,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);
 }
@@ -2013,13 +2012,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)) {