diff options
-rw-r--r-- | mansearch.c | 17 | ||||
-rw-r--r-- | mansearch.h | 9 |
2 files changed, 16 insertions, 10 deletions
diff --git a/mansearch.c b/mansearch.c index 521f78de..4ab6c079 100644 --- a/mansearch.c +++ b/mansearch.c @@ -79,6 +79,7 @@ struct expr { struct match { uint64_t pageid; /* identifier in database */ + uint64_t bits; /* name type mask */ char *desc; /* manual page description */ int form; /* bit field: formatted, zipped? */ }; @@ -301,6 +302,7 @@ mansearch(const struct mansearch *search, mp = mandoc_calloc(1, sizeof(struct match)); mp->pageid = pageid; mp->form = sqlite3_column_int(s, 1); + mp->bits = sqlite3_column_int64(s, 3); if (TYPE_Nd == outbit) mp->desc = mandoc_strdup((const char *) sqlite3_column_text(s, 0)); @@ -336,6 +338,7 @@ mansearch(const struct mansearch *search, } mpage = *res + cur; mpage->ipath = i; + mpage->bits = mp->bits; mpage->sec = 10; mpage->form = mp->form; buildnames(mpage, db, s, mp->pageid, @@ -396,8 +399,9 @@ manpage_compare(const void *vp1, const void *vp2) mp1 = vp1; mp2 = vp2; - diff = mp1->sec - mp2->sec; - return(diff ? diff : strcasecmp(mp1->names, mp2->names)); + return( (diff = mp2->bits - mp1->bits) ? diff : + (diff = mp1->sec - mp2->sec) ? diff : + strcasecmp(mp1->names, mp2->names)); } static void @@ -592,8 +596,10 @@ sql_statement(const struct expr *e) size_t sz; int needop; - sql = mandoc_strdup( - "SELECT desc, form, pageid FROM mpages WHERE "); + sql = mandoc_strdup(e->equal ? + "SELECT desc, form, pageid, bits " + "FROM mpages NATURAL JOIN names WHERE " : + "SELECT desc, form, pageid, 0 FROM mpages WHERE "); sz = strlen(sql); for (needop = 0; NULL != e; e = e->next) { @@ -613,8 +619,7 @@ sql_statement(const struct expr *e) ? "pageid IN (SELECT pageid FROM names " "WHERE name REGEXP ?)" : e->equal - ? "pageid IN (SELECT pageid FROM names " - "WHERE name = ?)" + ? "name = ? " : "pageid IN (SELECT pageid FROM names " "WHERE name MATCH ?)") : (NULL == e->substr diff --git a/mansearch.h b/mansearch.h index 44b6858a..2c308a91 100644 --- a/mansearch.h +++ b/mansearch.h @@ -62,10 +62,10 @@ #define TYPE_Nd 0x0000008000000000ULL #define NAME_SYN 0x0000004000000001ULL -#define NAME_FILE 0x0000004000000002ULL -#define NAME_TITLE 0x000000400000000cULL -#define NAME_FIRST 0x0000004000000008ULL -#define NAME_HEAD 0x0000004000000010ULL +#define NAME_FIRST 0x0000004000000004ULL +#define NAME_TITLE 0x0000004000000006ULL +#define NAME_HEAD 0x0000004000000008ULL +#define NAME_FILE 0x0000004000000010ULL #define NAME_MASK 0x000000000000001fULL #define FORM_CAT 0 /* manual page is preformatted */ @@ -85,6 +85,7 @@ struct manpage { char *names; /* a list of names with sections */ char *output; /* user-defined additional output */ size_t ipath; /* number of the manpath */ + uint64_t bits; /* name type mask */ int sec; /* section number, 10 means invalid */ int form; /* 0 == catpage */ }; |