=================================================================== RCS file: /cvs/mandoc/dba.c,v retrieving revision 1.2 retrieving revision 1.7 diff -u -p -r1.2 -r1.7 --- mandoc/dba.c 2016/07/29 15:23:57 1.2 +++ mandoc/dba.c 2016/08/17 18:59:37 1.7 @@ -1,4 +1,4 @@ -/* $Id: dba.c,v 1.2 2016/07/29 15:23:57 schwarze Exp $ */ +/* $Id: dba.c,v 1.7 2016/08/17 18:59:37 schwarze Exp $ */ /* * Copyright (c) 2016 Ingo Schwarze * @@ -17,7 +17,16 @@ * Allocation-based version of the mandoc database, for read-write access. * The interface is defined in "dba.h". */ +#include "config.h" + #include +#if HAVE_ENDIAN +#include +#elif HAVE_SYS_ENDIAN +#include +#elif HAVE_NTOHL +#include +#endif #include #include #include @@ -33,6 +42,7 @@ static void *prepend(const char *, char); static void dba_pages_write(struct dba_array *); static int compare_names(const void *, const void *); +static int compare_strings(const void *, const void *); static void dba_macros_write(struct dba_array *); static void dba_macro_write(struct dba_array *); @@ -133,7 +143,8 @@ dba_page_new(struct dba_array *pages, const char *name page = dba_array_new(DBP_MAX, 0); entry = dba_array_new(1, DBA_STR | DBA_GROW); - dba_array_add(entry, prepend(name, NAME_FILE & NAME_MASK)); + if (name != NULL) + dba_array_add(entry, prepend(name, NAME_FILE & NAME_MASK)); dba_array_add(page, entry); entry = dba_array_new(1, DBA_STR | DBA_GROW); dba_array_add(entry, (void *)sect); @@ -167,7 +178,7 @@ dba_page_add(struct dba_array *page, int32_t ie, const if (ie == DBP_ARCH) { if (entries == NULL) return; - if (str == NULL) { + if (str == NULL || *str == '\0') { dba_array_free(entries); dba_array_set(page, DBP_ARCH, NULL); return; @@ -243,24 +254,26 @@ prepend(const char *instr, char inbyte) static void dba_pages_write(struct dba_array *pages) { - struct dba_array *page, *names; - void *entry; + struct dba_array *page, *entry; int32_t pos_pages, pos_end; pos_pages = dba_array_writelen(pages, 5); dba_array_FOREACH(pages, page) { dba_array_setpos(page, DBP_NAME, dba_tell()); - names = dba_array_get(page, DBP_NAME); - dba_array_sort(names, compare_names); - dba_array_writelst(names); + entry = dba_array_get(page, DBP_NAME); + dba_array_sort(entry, compare_names); + dba_array_writelst(entry); } dba_array_FOREACH(pages, page) { dba_array_setpos(page, DBP_SECT, dba_tell()); - dba_array_writelst(dba_array_get(page, DBP_SECT)); + entry = dba_array_get(page, DBP_SECT); + dba_array_sort(entry, compare_strings); + dba_array_writelst(entry); } dba_array_FOREACH(pages, page) { if ((entry = dba_array_get(page, DBP_ARCH)) != NULL) { dba_array_setpos(page, DBP_ARCH, dba_tell()); + dba_array_sort(entry, compare_strings); dba_array_writelst(entry); } else dba_array_setpos(page, DBP_ARCH, 0); @@ -292,6 +305,15 @@ compare_names(const void *vp1, const void *vp2) strcasecmp(cp1 + 1, cp2 + 1); } +static int +compare_strings(const void *vp1, const void *vp2) +{ + const char *cp1, *cp2; + + cp1 = *(char **)vp1; + cp2 = *(char **)vp2; + return strcmp(cp1, cp2); +} /*** functions for handling macros ************************************/