Module Name:    src
Committed By:   christos
Date:           Fri Mar 29 20:07:32 UTC 2013

Modified Files:
        src/usr.sbin/makemandb: apropos-utils.c apropos-utils.h apropos.1
            apropos.c

Log Message:
- If the stdout is not a tty, prevent formatting unless forced with -i
- Don't ever page unless asked for with -p
- Introduce "legacy mode" (-l)
  1. searches only name and name_desc, prints name(section) - name_description
  2. turns off escape formatting (can be forced on with -i)
  3. turns off context printing (can be forced on with -c)
- Parse the environment $APROPOS variable as an argument vector.

With these changes one can simply 'export APROPOS=-l' and get the old apropos
behavior.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/usr.sbin/makemandb/apropos-utils.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/makemandb/apropos-utils.h \
    src/usr.sbin/makemandb/apropos.1
cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/makemandb/apropos.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/makemandb/apropos-utils.c
diff -u src/usr.sbin/makemandb/apropos-utils.c:1.11 src/usr.sbin/makemandb/apropos-utils.c:1.12
--- src/usr.sbin/makemandb/apropos-utils.c:1.11	Sun Feb 10 18:58:27 2013
+++ src/usr.sbin/makemandb/apropos-utils.c	Fri Mar 29 16:07:31 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: apropos-utils.c,v 1.11 2013/02/10 23:58:27 christos Exp $	*/
+/*	$NetBSD: apropos-utils.c,v 1.12 2013/03/29 20:07:31 christos Exp $	*/
 /*-
  * Copyright (c) 2011 Abhinav Upadhyay <er.abhinav.upadh...@gmail.com>
  * All rights reserved.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: apropos-utils.c,v 1.11 2013/02/10 23:58:27 christos Exp $");
+__RCSID("$NetBSD: apropos-utils.c,v 1.12 2013/03/29 20:07:31 christos Exp $");
 
 #include <sys/queue.h>
 #include <sys/stat.h>
@@ -549,18 +549,42 @@ run_query(sqlite3 *db, const char *snipp
 		default_snippet_args[2] = "...";
 		snippet_args = default_snippet_args;
 	}
-	query = sqlite3_mprintf("SELECT section, name, name_desc, machine,"
-	    " snippet(mandb, %Q, %Q, %Q, -1, 40 ),"
-	    " rank_func(matchinfo(mandb, \"pclxn\")) AS rank"
-	    " FROM mandb"
-	    " WHERE mandb MATCH %Q %s "
-	    "%s"
-	    " ORDER BY rank DESC"
-	    "%s",
-	    snippet_args[0], snippet_args[1], snippet_args[2], args->search_str,
-	    machine_clause ? machine_clause : "",
-	    section_clause ? section_clause : "",
-	    limit_clause ? limit_clause : "");
+	if (args->legacy) {
+	    query = sqlite3_mprintf("SELECT section, name, name_desc, machine,"
+		" snippet(mandb, %Q, %Q, %Q, -1, 40 ),"
+		" rank_func(matchinfo(mandb, \"pclxn\")) AS rank"
+		" FROM mandb"
+		" WHERE name MATCH %Q "
+		"%s"
+		" UNION SELECT section, name, name_desc, machine,"
+		" snippet(mandb, %Q, %Q, %Q, -1, 40 ),"
+		" rank_func(matchinfo(mandb, \"pclxn\")) AS rank"
+		" FROM mandb"
+		" WHERE name_desc MATCH %Q "
+		"%s"
+		" ORDER BY rank DESC"
+		"%s",
+		snippet_args[0], snippet_args[1], snippet_args[2],
+		args->search_str,
+		section_clause ? section_clause : "",
+		snippet_args[0], snippet_args[1], snippet_args[2],
+		args->search_str,
+		section_clause ? section_clause : "",
+		limit_clause ? limit_clause : "");
+	} else {
+	    query = sqlite3_mprintf("SELECT section, name, name_desc, machine,"
+		" snippet(mandb, %Q, %Q, %Q, -1, 40 ),"
+		" rank_func(matchinfo(mandb, \"pclxn\")) AS rank"
+		" FROM mandb"
+		" WHERE mandb MATCH %Q %s "
+		"%s"
+		" ORDER BY rank DESC"
+		"%s",
+		snippet_args[0], snippet_args[1], snippet_args[2],
+		args->search_str, machine_clause ? machine_clause : "",
+		section_clause ? section_clause : "",
+		limit_clause ? limit_clause : "");
+	}
 
 	free(machine_clause);
 	free(section_clause);
@@ -862,7 +886,15 @@ run_query_pager(sqlite3 *db, query_args 
 	struct orig_callback_data orig_data;
 	orig_data.callback = args->callback;
 	orig_data.data = args->callback_data;
-	const char *snippet_args[] = {"\002", "\003", "..."};
+	const char *snippet_args[3];
+
+	if (args->flags & APROPOS_NOFORMAT) {
+		snippet_args[0] = snippet_args[1] = "";
+	} else {
+		snippet_args[0] = "\002";
+		snippet_args[1] = "\003";
+	}
+	snippet_args[2] = "...";
 	args->callback = &callback_pager;
 	args->callback_data = (void *) &orig_data;
 	return run_query(db, snippet_args, args);

Index: src/usr.sbin/makemandb/apropos-utils.h
diff -u src/usr.sbin/makemandb/apropos-utils.h:1.7 src/usr.sbin/makemandb/apropos-utils.h:1.8
--- src/usr.sbin/makemandb/apropos-utils.h:1.7	Sun Feb 10 18:58:27 2013
+++ src/usr.sbin/makemandb/apropos-utils.h	Fri Mar 29 16:07:31 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: apropos-utils.h,v 1.7 2013/02/10 23:58:27 christos Exp $	*/
+/*	$NetBSD: apropos-utils.h,v 1.8 2013/03/29 20:07:31 christos Exp $	*/
 /*-
  * Copyright (c) 2011 Abhinav Upadhyay <er.abhinav.upadh...@gmail.com>
  * All rights reserved.
@@ -74,6 +74,7 @@ typedef struct query_args {
 	int *sec_nums;		// Section in which to do the search
 	int nrec;			// number of records to fetch
 	int offset;		//From which position to start processing the records
+	int legacy;
 	const char *machine;
 	int (*callback) (void *, const char *, const char *, const char *,
 		const char *, size_t);	// The callback function
Index: src/usr.sbin/makemandb/apropos.1
diff -u src/usr.sbin/makemandb/apropos.1:1.7 src/usr.sbin/makemandb/apropos.1:1.8
--- src/usr.sbin/makemandb/apropos.1:1.7	Sun Feb 10 18:58:28 2013
+++ src/usr.sbin/makemandb/apropos.1	Fri Mar 29 16:07:31 2013
@@ -1,4 +1,4 @@
-.\" $NetBSD: apropos.1,v 1.7 2013/02/10 23:58:28 christos Exp $
+.\" $NetBSD: apropos.1,v 1.8 2013/03/29 20:07:31 christos Exp $
 .\"
 .\" Copyright (c) 2011 Abhinav Upadhyay <er.abhinav.upadh...@gmail.com>
 .\" All rights reserved.
@@ -29,7 +29,7 @@
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd February 10, 2013
+.Dd March 29, 2013
 .Dt APROPOS 1
 .Os
 .Sh NAME
@@ -37,7 +37,7 @@
 .Nd search the complete content of all man pages
 .Sh SYNOPSIS
 .Nm
-.Op Fl 123456789Ccpr
+.Op Fl 123456789Ccilpr
 .Op Fl n Ar Number of results
 .Op Fl S Ar machine
 .Op Fl s Ar section
@@ -88,11 +88,16 @@ Search only within section 9 manual page
 Do not show the context of the match.
 .It Fl c
 Do show the context of the match (default).
+.It Fl i
+Turn on escape code formatting.
+.It Fl l
+Legacy mode: Only searches name and name description.
+Does not print context, or escape format the text.
 .It Fl n
 Output up to the specified number of search results.
-The default limit is 10.
+The default limit is infinity.
 .It Fl p
-Display all matching results and pipe them through a pager (defaulting to
+Pipe the results through a pager (defaulting to
 .Xr more 1 ) .
 .It Fl r
 On tty output don't issue any formatting escape codes.
@@ -114,6 +119,12 @@ The location of the Sqlite FTS database 
 .Cd _mandb
 tag.
 .El
+.Sh ENVIRONMENT VARIABLES
+The
+.Dv APROPOS
+environment variables is white-space tokenized as an argument vector
+and the options in it are parsed and set.
+Command line options override the environment options.
 .Sh SEE ALSO
 .Xr man 1 ,
 .Xr whatis 1 ,

Index: src/usr.sbin/makemandb/apropos.c
diff -u src/usr.sbin/makemandb/apropos.c:1.12 src/usr.sbin/makemandb/apropos.c:1.13
--- src/usr.sbin/makemandb/apropos.c:1.12	Sun Feb 10 18:58:28 2013
+++ src/usr.sbin/makemandb/apropos.c	Fri Mar 29 16:07:31 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: apropos.c,v 1.12 2013/02/10 23:58:28 christos Exp $	*/
+/*	$NetBSD: apropos.c,v 1.13 2013/03/29 20:07:31 christos Exp $	*/
 /*-
  * Copyright (c) 2011 Abhinav Upadhyay <er.abhinav.upadh...@gmail.com>
  * All rights reserved.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: apropos.c,v 1.12 2013/02/10 23:58:28 christos Exp $");
+__RCSID("$NetBSD: apropos.c,v 1.13 2013/03/29 20:07:31 christos Exp $");
 
 #include <err.h>
 #include <search.h>
@@ -50,6 +50,7 @@ typedef struct apropos_flags {
 	int pager;
 	int no_context;
 	int no_format;
+	int legacy;
 	const char *machine;
 } apropos_flags;
 
@@ -66,32 +67,11 @@ __dead static void usage(void);
 
 #define _PATH_PAGER	"/usr/bin/more -s"
 
-int
-main(int argc, char *argv[])
+static void
+parseargs(int argc, char **argv, struct apropos_flags *aflags)
 {
-	query_args args;
-	char *query = NULL;	// the user query
-	char *errmsg = NULL;
-	char *str;
-	int ch, rc = 0;
-	int s;
-	callback_data cbdata;
-	cbdata.out = stdout;		// the default output stream
-	cbdata.count = 0;
-	apropos_flags aflags;
-	cbdata.aflags = &aflags;
-	sqlite3 *db;
-	setprogname(argv[0]);
-	if (argc < 2)
-		usage();
-
-	memset(&aflags, 0, sizeof(aflags));
-
-	/*If the user specifies a section number as an option, the corresponding
-	 * index element in sec_nums is set to the string representing that
-	 * section number.
-	 */
-	while ((ch = getopt(argc, argv, "123456789Ccn:prS:s:")) != -1) {
+	int ch;
+	while ((ch = getopt(argc, argv, "123456789Cciln:prS:s:")) != -1) {
 		switch (ch) {
 		case '1':
 		case '2':
@@ -102,38 +82,92 @@ main(int argc, char *argv[])
 		case '7':
 		case '8':
 		case '9':
-			aflags.sec_nums[ch - '1'] = 1;
+			aflags->sec_nums[ch - '1'] = 1;
 			break;
 		case 'C':
-			aflags.no_context = 1;
+			aflags->no_context = 1;
 			break;
 		case 'c':
-			aflags.no_context = 0;
+			aflags->no_context = 0;
+			break;
+		case 'i':
+			aflags->no_format = 0;
+			break;
+		case 'l':
+			aflags->legacy = 1;
+			aflags->no_context = 1;
+			aflags->no_format = 1;
 			break;
 		case 'n':
-			aflags.nresults = atoi(optarg);
+			aflags->nresults = atoi(optarg);
 			break;
-		case 'p':	//user wants to view more than 10 results and page them
-			aflags.pager = 1;
-			aflags.nresults = -1;	// Fetch all records
+		case 'p':	// user wants a pager
+			aflags->pager = 1;
 			break;
 		case 'r':
-			aflags.no_format = 1;
+			aflags->no_format = 1;
 			break;
 		case 'S':
-			aflags.machine = optarg;
+			aflags->machine = optarg;
 			break;
 		case 's':
-			s = atoi(optarg);
-			if (s < 1 || s > 9)
+			ch = atoi(optarg);
+			if (ch < 1 || ch > 9)
 				errx(EXIT_FAILURE, "Invalid section");
-			aflags.sec_nums[s - 1] = 1;
+			aflags->sec_nums[ch - 1] = 1;
 			break;
 		case '?':
 		default:
 			usage();
 		}
 	}
+}
+
+int
+main(int argc, char *argv[])
+{
+	query_args args;
+	char *query = NULL;	// the user query
+	char *errmsg = NULL;
+	char *str;
+	int rc = 0;
+	int s;
+	callback_data cbdata;
+	cbdata.out = stdout;		// the default output stream
+	cbdata.count = 0;
+	apropos_flags aflags;
+	cbdata.aflags = &aflags;
+	sqlite3 *db;
+	setprogname(argv[0]);
+	if (argc < 2)
+		usage();
+
+	memset(&aflags, 0, sizeof(aflags));
+
+	if (!isatty(STDOUT_FILENO))
+		aflags.no_format = 1;
+
+	if ((str = getenv("APROPOS")) != NULL) {
+		char **ptr = emalloc((strlen(str) + 2) * sizeof(*ptr));
+#define WS "\t\n\r "
+		ptr[0] = __UNCONST(getprogname());
+		for (s = 1, str = strtok(str, WS); str;
+		    str = strtok(NULL, WS), s++)
+			ptr[s] = str;
+		ptr[s] = NULL;
+		parseargs(s, ptr, &aflags);
+		free(ptr);
+		optreset = 1;
+		optind = 1;
+	}
+
+	parseargs(argc, argv, &aflags);
+
+	/*
+	 * If the user specifies a section number as an option, the
+	 * corresponding index element in sec_nums is set to the string
+	 * representing that section number.
+	 */
 
 	argc -= optind;
 	argv += optind;
@@ -169,6 +203,7 @@ main(int argc, char *argv[])
 
 	args.search_str = query;
 	args.sec_nums = aflags.sec_nums;
+	args.legacy = aflags.legacy;
 	args.nrec = aflags.nresults ? aflags.nresults : 10;
 	args.offset = 0;
 	args.machine = aflags.machine;
@@ -177,10 +212,10 @@ main(int argc, char *argv[])
 	args.errmsg = &errmsg;
 	args.flags = aflags.no_format ? APROPOS_NOFORMAT : 0;
 
-	if (isatty(STDOUT_FILENO))
-		rc = run_query_term(db, &args);
-	else
+	if (aflags.pager)
 		rc = run_query_pager(db, &args);
+	else
+		rc = run_query_term(db, &args);
 
 	free(query);
 	close_db(db);
@@ -197,8 +232,8 @@ main(int argc, char *argv[])
 
 	if (cbdata.count == 0) {
 		warnx("No relevant results obtained.\n"
-			  "Please make sure that you spelled all the terms correctly "
-			  "or try using better keywords.");
+		    "Please make sure that you spelled all the terms correctly "
+		    "or try using better keywords.");
 	}
 	return 0;
 }
@@ -217,7 +252,8 @@ query_callback(void *data, const char *s
 	callback_data *cbdata = (callback_data *) data;
 	FILE *out = cbdata->out;
 	cbdata->count++;
-	fprintf(out, "%s (%s)\t%s\n", name, section, name_desc);
+	fprintf(out, cbdata->aflags->legacy ? "%s(%s)\t- %s\n" :
+	    "%s (%s)\t%s\n", name, section, name_desc);
 
 	if (cbdata->aflags->no_context == 0)
 		fprintf(out, "%s\n\n", snippet);
@@ -277,8 +313,8 @@ remove_stopwords(const char *query)
 static void
 usage(void)
 {
-	fprintf(stderr,
-		"Usage: %s [-n Number of records] [-123456789Ccp] [-S machine] query\n",
-		getprogname());
+	fprintf(stderr, "Usage: %s [-123456789Ccilpr] [-n <results>] "
+	    "[-s <section>] [-S <machine>] <query>\n",
+	    getprogname());
 	exit(1);
 }

Reply via email to