76 lines
2.2 KiB
Diff
76 lines
2.2 KiB
Diff
Log Message:
|
|
-----------
|
|
In man(1) mode with a specific section requested,
|
|
try harder to find the best match.
|
|
|
|
Use this order of preference:
|
|
1. The section in both the directory name and the file name matches exactly.
|
|
2. The section in the file name matches exactly.
|
|
3. The section in the directory name matches exactly.
|
|
4. Neither of them matches exactly.
|
|
The latter can happen when mansearch() finds substring matches
|
|
or when the second .Dt argument mismatches the dir and file names.
|
|
|
|
Lorenzo Beretta <loreb at github> reported that this caused real
|
|
problems on Void Linux, like "man 3 readline" showing readline(3m).
|
|
See https://github.com/void-linux/void-packages/issues/9868 for details.
|
|
|
|
Modified Files:
|
|
--------------
|
|
mandoc:
|
|
main.c
|
|
|
|
Revision Data
|
|
-------------
|
|
Index: main.c
|
|
===================================================================
|
|
RCS file: /home/cvs/mandoc/mandoc/main.c,v
|
|
retrieving revision 1.324
|
|
retrieving revision 1.325
|
|
diff -Lmain.c -Lmain.c -u -p -r1.324 -r1.325
|
|
--- main.c
|
|
+++ main.c
|
|
@@ -125,7 +125,7 @@ main(int argc, char *argv[])
|
|
char *conf_file, *defpaths, *auxpaths;
|
|
char *oarg, *tagarg;
|
|
unsigned char *uc;
|
|
- size_t i, sz;
|
|
+ size_t i, sz, ssz;
|
|
int prio, best_prio;
|
|
enum outmode outmode;
|
|
int fd, startdir;
|
|
@@ -434,7 +434,7 @@ main(int argc, char *argv[])
|
|
|
|
if (outmode == OUTMODE_ONE) {
|
|
argc = 1;
|
|
- best_prio = 20;
|
|
+ best_prio = 40;
|
|
} else if (outmode == OUTMODE_ALL)
|
|
argc = (int)sz;
|
|
|
|
@@ -453,10 +453,21 @@ main(int argc, char *argv[])
|
|
sec = res[i].file;
|
|
sec += strcspn(sec, "123456789");
|
|
if (sec[0] == '\0')
|
|
- continue;
|
|
+ continue; /* No section at all. */
|
|
prio = sec_prios[sec[0] - '1'];
|
|
- if (sec[1] != '/')
|
|
- prio += 10;
|
|
+ if (search.sec != NULL) {
|
|
+ ssz = strlen(search.sec);
|
|
+ if (strncmp(sec, search.sec, ssz) == 0)
|
|
+ sec += ssz;
|
|
+ } else
|
|
+ sec++; /* Prefer without suffix. */
|
|
+ if (*sec != '/')
|
|
+ prio += 10; /* Wrong dir name. */
|
|
+ if (search.sec != NULL &&
|
|
+ (strlen(sec) <= ssz + 3 ||
|
|
+ strcmp(sec + strlen(sec) - ssz,
|
|
+ search.sec) != 0))
|
|
+ prio += 20; /* Wrong file ext. */
|
|
if (prio >= best_prio)
|
|
continue;
|
|
best_prio = prio;
|