--- include/manconfig.h.in +++ include/manconfig.h.in 2008-04-21 13:32:56.000000000 +0200 @@ -375,8 +375,10 @@ extern char *program_name; /* the basena #define NOT_FOUND 16 /* No action was taken */ /* System or user catpaths? Allow bitwise disjunctions of these. */ -#define SYSTEM_CAT 1 -#define USER_CAT 2 +#define SYSTEM_CATP 1 +#define USER_CATP 2 +#define FILE_CATP 4 +#define WHATIS_CATP 8 /* string macros */ #define STREQ(a,b) (strcmp(a,b) == 0) --- src/catman.c +++ src/catman.c 2008-01-30 12:02:21.000000000 +0100 @@ -450,7 +450,7 @@ int main (int argc, char *argv[]) char *catpath; size_t len; - catpath = get_catpath (*mp, SYSTEM_CAT | USER_CAT); + catpath = get_catpath (*mp, SYSTEM_CATP|USER_CATP); if (catpath) { if (is_directory (catpath) != 1) { --- src/man.c +++ src/man.c 2008-04-21 17:53:02.000000000 +0200 @@ -1249,8 +1304,7 @@ static pipeline *make_roff_command (cons #ifdef ALT_EXT_FORMAT /* Check both external formatter locations */ if (dir && !recode) { - char *catpath = get_catpath - (dir, global_manpath ? SYSTEM_CAT : USER_CAT); + char *catpath = get_catpath (dir, global_manpath ? SYSTEM_CATP : USER_CATP); /* If we have an alternate catpath */ if (catpath) { @@ -2366,8 +2450,7 @@ static char *find_cat_file (const char * */ if (!STREQ (man_file, original)) { global_manpath = is_global_mandir (man_file); - cat_path = get_catpath - (man_file, global_manpath ? SYSTEM_CAT : USER_CAT); + cat_path = get_catpath (man_file, (global_manpath ? SYSTEM_CATP : USER_CATP)|FILE_CATP); if (cat_path) { cat_file = convert_name (cat_path, 0); @@ -2394,8 +2477,7 @@ static char *find_cat_file (const char * } global_manpath = is_global_mandir (original); - cat_path = get_catpath - (original, global_manpath ? SYSTEM_CAT : USER_CAT); + cat_path = get_catpath (original, (global_manpath ? SYSTEM_CATP : USER_CATP)|FILE_CATP); if (cat_path) { cat_file = convert_name (cat_path, 0); @@ -2884,9 +2966,7 @@ static int display_database (struct cand if (access (file, R_OK) != 0) { char *catpath; - catpath = get_catpath (candp->path, - global_manpath ? SYSTEM_CAT - : USER_CAT); + catpath = get_catpath (candp->path, global_manpath ? SYSTEM_CATP : USER_CATP); if (catpath && strcmp (catpath, candp->path) != 0) { file = make_filename (catpath, name, @@ -3001,7 +3081,7 @@ static int try_db (const char *manpath, /* find out where our db for this manpath should be */ - catpath = get_catpath (manpath, global_manpath ? SYSTEM_CAT : USER_CAT); + catpath = get_catpath (manpath, (global_manpath ? SYSTEM_CATP : USER_CATP)|FILE_CATP); if (catpath) { database = mkdbname (catpath); free (catpath); --- src/mandb.c +++ src/mandb.c 2008-01-30 12:01:40.000000000 +0100 @@ -484,10 +486,13 @@ static short process_manpath (const char short amount = 0; if (global_manpath) { /* system db */ - catpath = get_catpath (manpath, SYSTEM_CAT); - assert (catpath); + catpath = get_catpath (manpath, SYSTEM_CATP); + if (!catpath) { + error (0, 0, _("warning: no system cat path for man path %s"), manpath); + return amount; + } } else { /* user db */ - catpath = get_catpath (manpath, USER_CAT); + catpath = get_catpath (manpath, USER_CATP); if (!catpath) catpath = xstrdup (manpath); } --- src/manp.c +++ src/manp.c 2008-01-30 12:01:03.000000000 +0100 @@ -1134,8 +1145,8 @@ char *get_catpath (const char *name, int struct list *list; for (list = namestore; list; list = list->next) - if (((cattype & SYSTEM_CAT) && list->flag == MANDB_MAP) || - ((cattype & USER_CAT) && list->flag == MANDB_MAP_USER)) { + if (((cattype & SYSTEM_CATP) && list->flag == MANDB_MAP) || + ((cattype & USER_CATP) && list->flag == MANDB_MAP_USER)) { size_t manlen = strlen (list->key); if (STRNEQ (name, list->key, manlen)) { const char *suffix = name + manlen; @@ -1143,16 +1154,30 @@ char *get_catpath (const char *name, int if (*suffix == '/') { ++suffix; - catpath = appendstr (catpath, "/", - NULL); + catpath = appendstr (catpath, "/", NULL); } if (STRNEQ (suffix, "man", 3)) { suffix += 3; - catpath = appendstr (catpath, "cat", - NULL); + catpath = appendstr (catpath, "cat", NULL); } catpath = appendstr (catpath, suffix, NULL); - return catpath; + if (cattype & FILE_CATP) + return catpath; + if (is_directory (catpath) == 1) + return catpath; + if ((cattype & WHATIS_CATP) == 0) { + const char locale_delims[] = "_@,."; + const char *delim; + for (delim = locale_delims; *delim != '\0'; ++delim) { + char * tmp = strrchr (catpath, *delim); + if (!tmp) + continue; + *tmp = '\0'; + if (is_directory (catpath) == 1) + return catpath; + } + } + free (catpath); } } --- src/whatis.c +++ src/whatis.c 2008-04-21 13:21:57.000000000 +0200 @@ -651,7 +651,7 @@ static int search (char *page) debug ("lower(%s) = \"%s\"\n", page, lowpage); for (mp = manpathlist; *mp; mp++) { - catpath = get_catpath (*mp, SYSTEM_CAT | USER_CAT); + catpath = get_catpath (*mp, SYSTEM_CATP|USER_CATP|WHATIS_CATP); if (catpath) { database = mkdbname (catpath); --- src/straycats.c +++ src/straycats.c 2008-04-21 15:47:04.000000000 +0200 @@ -338,7 +343,7 @@ int straycats (const char *manpath) return 0; } - catpath = get_catpath (manpath, SYSTEM_CAT | USER_CAT); + catpath = get_catpath (manpath, SYSTEM_CATP|USER_CATP); /* look in the usual catpath location */ mandir = xstrdup (manpath);