source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Implement classic man(1) output mode showing only one manual
@ 2014-08-21  0:32 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2014-08-21  0:32 UTC (permalink / raw)
  To: source

Log Message:
-----------
Implement classic man(1) output mode showing only one manual even 
if there is more than one match, using traditional section priorities,
and implement man(1) -a (show all) output mode, not just for man(1),
but also for apropos(1) and whatis(1).

Modified Files:
--------------
    mdocml:
        main.c

Revision Data
-------------
Index: main.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/main.c,v
retrieving revision 1.181
retrieving revision 1.182
diff -Lmain.c -Lmain.c -u -p -r1.181 -r1.182
--- main.c
+++ main.c
@@ -89,6 +89,7 @@ static	void		  usage(enum argmode) __att
 static	void		  version(void) __attribute__((noreturn));
 static	int		  woptions(struct curparse *, char *);
 
+static	const int sec_prios[] = {1, 4, 5, 8, 6, 3, 7, 2, 9};
 static	const char	 *progname;
 
 
@@ -102,7 +103,10 @@ main(int argc, char *argv[])
 	char		*defos;
 #if HAVE_SQLITE3
 	struct manpage	*res;
-	size_t		 i, sz;
+	char		**auxargv;
+	size_t		 isec, i, sz;
+	int		 prio, best_prio;
+	char		 sec;
 #endif
 	enum mandoclevel rc;
 	enum outmode	 outmode;
@@ -231,6 +235,11 @@ main(int argc, char *argv[])
 
 	argc -= optind;
 	argv += optind;
+#if HAVE_SQLITE3
+	auxargv = NULL;
+#endif
+
+	rc = MANDOCLEVEL_OK;
 
 	/* man(1), whatis(1), apropos(1) */
 
@@ -238,22 +247,66 @@ main(int argc, char *argv[])
 #if HAVE_SQLITE3
 		if (argc == 0)
 			usage(search.argmode);
+
+		/* Access the mandoc database. */
+
 		manpath_parse(&paths, conf_file, defpaths, auxpaths);
 		mansearch_setup(1);
 		if( ! mansearch(&search, &paths, argc, argv, &res, &sz))
 			usage(search.argmode);
 		manpath_free(&paths);
+
+		/*
+		 * For standard man(1) and -a output mode,
+		 * prepare for copying filename pointers
+		 * into the program parameter array.
+		 */
+
+		if (outmode == OUTMODE_ONE) {
+			argc = 1;
+			argv[0] = res[0].file;
+			argv[1] = NULL;
+			best_prio = 10;
+		} else if (outmode == OUTMODE_ALL) {
+			argc = (int)sz;
+			argv = auxargv = mandoc_reallocarray(
+			    NULL, sz + 1, sizeof(char *));
+			argv[argc] = NULL;
+		}
+
+		/* Iterate all matching manuals. */
+
 		for (i = 0; i < sz; i++) {
 			if (outmode == OUTMODE_FLN)
 				puts(res[i].file);
-			else
+			else if (outmode == OUTMODE_LST)
 				printf("%s - %s\n", res[i].names,
 				    res[i].output == NULL ? "" :
 				    res[i].output);
+			else if (outmode == OUTMODE_ALL)
+				argv[i] = res[i].file;
+			else {
+				/* Search for the best section. */
+				isec = strcspn(res[i].file, "123456789");
+				sec = res[i].file[isec];
+				if ('\0' == sec)
+					continue;
+				prio = sec_prios[sec - '1'];
+				if (prio >= best_prio)
+					continue;
+				best_prio = prio;
+				argv[0] = res[i].file;
+			}
 		}
-		mansearch_free(res, sz);
-		mansearch_setup(0);
-		return((int)MANDOCLEVEL_OK);
+
+		/*
+		 * For man(1), -a and -i output mode, fall through
+		 * to the main mandoc(1) code iterating files
+		 * and running the parsers on each of them.
+		 */
+
+		if (outmode == OUTMODE_FLN || outmode == OUTMODE_LST)
+			goto out;
 #else
 		fputs("mandoc: database support not compiled in\n",
 		    stderr);
@@ -274,8 +327,6 @@ main(int argc, char *argv[])
 	if (OUTT_MAN == curp.outtype)
 		mparse_keep(curp.mp);
 
-	rc = MANDOCLEVEL_OK;
-
 	if (NULL == *argv)
 		parse(&curp, STDIN_FILENO, "<stdin>", &rc);
 
@@ -290,6 +341,16 @@ main(int argc, char *argv[])
 		(*curp.outfree)(curp.outdata);
 	if (curp.mp)
 		mparse_free(curp.mp);
+
+#if HAVE_SQLITE3
+out:
+	if (search.argmode != ARG_FILE) {
+		mansearch_free(res, sz);
+		mansearch_setup(0);
+		free(auxargv);
+	}
+#endif
+
 	free(defos);
 
 	return((int)rc);
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2014-08-21  0:32 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-21  0:32 mdocml: Implement classic man(1) output mode showing only one manual schwarze

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).