]> git.cameronkatri.com Git - mandoc.git/blobdiff - mansearch.c
Only sort the result array if it contains more than one element,
[mandoc.git] / mansearch.c
index 784c17bee714759682bb4092a9100d8c665f2c1f..1fa652b913b2d8ebce6e1485dc4e1787baad0a5b 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: mansearch.c,v 1.77 2017/08/22 17:50:11 schwarze Exp $ */
+/* $Id: mansearch.c,v 1.83 2022/01/13 04:06:16 schwarze Exp $ */
 /*
  * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2013-2017 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2013-2018 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -36,7 +36,6 @@
 #include <string.h>
 #include <unistd.h>
 
-#include "mandoc.h"
 #include "mandoc_aux.h"
 #include "mandoc_ohash.h"
 #include "manconf.h"
@@ -192,7 +191,7 @@ mansearch(const struct mansearch *search,
                            mpage->file, R_OK) == -1) {
                                warn("%s", mpage->file);
                                warnx("outdated mandoc.db contains "
-                                   "bogus %s entry, run makewhatis %s", 
+                                   "bogus %s entry, run makewhatis %s",
                                    page->file + 1, paths->paths[i]);
                                free(mpage->file);
                                free(rp);
@@ -200,8 +199,8 @@ mansearch(const struct mansearch *search,
                        }
                        mpage->names = buildnames(page);
                        mpage->output = buildoutput(outkey, page);
+                       mpage->bits = search->firstmatch ? rp->bits : 0;
                        mpage->ipath = i;
-                       mpage->bits = rp->bits;
                        mpage->sec = *page->sect - '0';
                        if (mpage->sec < 0 || mpage->sec > 9)
                                mpage->sec = 10;
@@ -221,7 +220,7 @@ mansearch(const struct mansearch *search,
                if (cur && search->firstmatch)
                        break;
        }
-       if (res != NULL)
+       if (res != NULL && cur > 1)
                qsort(*res, cur, sizeof(struct manpage), manpage_compare);
        if (chdir_status && getcwd_status && chdir(buf) == -1)
                warn("%s", buf);
@@ -774,8 +773,9 @@ exprterm(const struct mansearch *search, int argc, char *argv[], int *argi)
                cs = 0;
        } else if ((val = strpbrk(argv[*argi], "=~")) == NULL) {
                e->bits = TYPE_Nm | TYPE_Nd;
-               e->match.type = DBM_SUB;
-               e->match.str = argv[*argi];
+               e->match.type = DBM_REGEX;
+               val = argv[*argi];
+               cs = 0;
        } else {
                if (val == argv[*argi])
                        e->bits = TYPE_Nm | TYPE_Nd;