=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mansearch.c,v retrieving revision 1.39 retrieving revision 1.40 diff -c -r1.39 -r1.40 *** src/usr.bin/mandoc/mansearch.c 2014/12/06 01:22:28 1.39 --- src/usr.bin/mandoc/mansearch.c 2015/01/20 18:19:39 1.40 *************** *** 1,7 **** ! /* $OpenBSD: mansearch.c,v 1.39 2014/12/06 01:22:28 schwarze Exp $ */ /* * Copyright (c) 2012 Kristaps Dzonsons ! * Copyright (c) 2013, 2014 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above --- 1,7 ---- ! /* $OpenBSD: mansearch.c,v 1.40 2015/01/20 18:19:39 schwarze Exp $ */ /* * Copyright (c) 2012 Kristaps Dzonsons ! * Copyright (c) 2013, 2014, 2015 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above *************** *** 77,83 **** int form; /* bit field: formatted, zipped? */ }; ! static void buildnames(struct manpage *, sqlite3 *, sqlite3_stmt *, uint64_t, const char *, int form); static char *buildoutput(sqlite3 *, sqlite3_stmt *, --- 77,84 ---- int form; /* bit field: formatted, zipped? */ }; ! static void buildnames(const struct mansearch *, ! struct manpage *, sqlite3 *, sqlite3_stmt *, uint64_t, const char *, int form); static char *buildoutput(sqlite3 *, sqlite3_stmt *, *************** *** 88,95 **** static struct expr *exprcomp(const struct mansearch *, int, char *[]); static void exprfree(struct expr *); - static struct expr *exprspec(struct expr *, uint64_t, - const char *, const char *); static struct expr *exprterm(const struct mansearch *, char *, int); static int manpage_compare(const void *, const void *); static void sql_append(char **sql, size_t *sz, --- 89,94 ---- *************** *** 335,348 **** mpage->bits = mp->bits; mpage->sec = 10; mpage->form = mp->form; ! buildnames(mpage, db, s, mp->pageid, paths->paths[i], mp->form); ! mpage->output = TYPE_Nd & outbit ? ! mp->desc : outbit ? ! buildoutput(db, s2, mp->pageid, outbit) : NULL; ! free(mp); - cur++; } sqlite3_finalize(s); --- 334,349 ---- mpage->bits = mp->bits; mpage->sec = 10; mpage->form = mp->form; ! buildnames(search, mpage, db, s, mp->pageid, paths->paths[i], mp->form); ! if (mpage->names != NULL) { ! mpage->output = TYPE_Nd & outbit ? ! mp->desc : outbit ? ! buildoutput(db, s2, mp->pageid, outbit) : ! NULL; ! cur++; ! } free(mp); } sqlite3_finalize(s); *************** *** 399,405 **** } static void ! buildnames(struct manpage *mpage, sqlite3 *db, sqlite3_stmt *s, uint64_t pageid, const char *path, int form) { char *newnames, *prevsec, *prevarch; --- 400,407 ---- } static void ! buildnames(const struct mansearch *search, struct manpage *mpage, ! sqlite3 *db, sqlite3_stmt *s, uint64_t pageid, const char *path, int form) { char *newnames, *prevsec, *prevarch; *************** *** 424,433 **** sep1 = ", "; } ! /* Fetch the next name. */ sec = (const char *)sqlite3_column_text(s, 0); arch = (const char *)sqlite3_column_text(s, 1); name = (const char *)sqlite3_column_text(s, 2); /* Remember the first section found. */ --- 426,440 ---- sep1 = ", "; } ! /* Fetch the next name, rejecting sec/arch mismatches. */ sec = (const char *)sqlite3_column_text(s, 0); + if (search->sec != NULL && strcasecmp(sec, search->sec)) + continue; arch = (const char *)sqlite3_column_text(s, 1); + if (search->arch != NULL && *arch != '\0' && + strcasecmp(arch, search->arch)) + continue; name = (const char *)sqlite3_column_text(s, 2); /* Remember the first section found. */ *************** *** 637,644 **** struct expr *first, *prev, *cur, *next; first = cur = NULL; ! logic = igncase = toclose = 0; ! toopen = NULL != search->sec || NULL != search->arch; for (i = 0; i < argc; i++) { if (0 == strcmp("(", argv[i])) { --- 644,650 ---- struct expr *first, *prev, *cur, *next; first = cur = NULL; ! logic = igncase = toopen = toclose = 0; for (i = 0; i < argc; i++) { if (0 == strcmp("(", argv[i])) { *************** *** 704,748 **** toopen = logic = igncase = 0; } ! if (toopen || logic || igncase || toclose) ! goto fail; - if (NULL != search->sec || NULL != search->arch) - cur->close++; - if (NULL != search->arch) - cur = exprspec(cur, TYPE_arch, search->arch, "^(%s|any)$"); - if (NULL != search->sec) - exprspec(cur, TYPE_sec, search->sec, "^%s$"); - - return(first); - fail: if (NULL != first) exprfree(first); return(NULL); - } - - static struct expr * - exprspec(struct expr *cur, uint64_t key, const char *value, - const char *format) - { - char errbuf[BUFSIZ]; - char *cp; - int irc; - - mandoc_asprintf(&cp, format, value); - cur->next = mandoc_calloc(1, sizeof(struct expr)); - cur = cur->next; - cur->and = 1; - cur->bits = key; - if (0 != (irc = regcomp(&cur->regexp, cp, - REG_EXTENDED | REG_NOSUB | REG_ICASE))) { - regerror(irc, &cur->regexp, errbuf, sizeof(errbuf)); - fprintf(stderr, "regcomp: %s\n", errbuf); - cur->substr = value; - } - free(cp); - return(cur); } static struct expr * --- 710,722 ---- toopen = logic = igncase = 0; } ! if ( ! (toopen || logic || igncase || toclose)) ! return(first); fail: if (NULL != first) exprfree(first); return(NULL); } static struct expr *