File man-db-2.5.2-catp.dif of Package man

--- 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);
openSUSE Build Service is sponsored by