Module Name: src Committed By: christos Date: Mon Jan 14 21:26:25 UTC 2013
Modified Files: src/usr.sbin/makemandb: apropos-utils.c apropos-utils.h apropos.c Log Message: - move the terminal handling in apropos-utils.c since htmp and pager are also handled there. - underline the name, section, and description so that it is prettier. - change to bold terminal the terminal highlighting to match with less To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/usr.sbin/makemandb/apropos-utils.c cvs rdiff -u -r1.4 -r1.5 src/usr.sbin/makemandb/apropos-utils.h cvs rdiff -u -r1.9 -r1.10 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.8 src/usr.sbin/makemandb/apropos-utils.c:1.9 --- src/usr.sbin/makemandb/apropos-utils.c:1.8 Mon Jan 14 13:01:59 2013 +++ src/usr.sbin/makemandb/apropos-utils.c Mon Jan 14 16:26:25 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: apropos-utils.c,v 1.8 2013/01/14 18:01:59 christos Exp $ */ +/* $NetBSD: apropos-utils.c,v 1.9 2013/01/14 21:26:25 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.8 2013/01/14 18:01:59 christos Exp $"); +__RCSID("$NetBSD: apropos-utils.c,v 1.9 2013/01/14 21:26:25 christos Exp $"); #include <sys/queue.h> #include <sys/stat.h> @@ -45,6 +45,8 @@ __RCSID("$NetBSD: apropos-utils.c,v 1.8 #include <string.h> #include <util.h> #include <zlib.h> +#include <term.h> +#undef tab // XXX: manconf.h #include "apropos-utils.h" #include "manconf.h" @@ -712,6 +714,28 @@ run_query_html(sqlite3 *db, query_args * } /* + * underline a string, pager style. + */ +static char * +ul_pager(const char *s) +{ + size_t len; + char *dst, *d; + + // a -> _\ba + len = strlen(s) * 3 + 1; + + d = dst = emalloc(len); + while (*s) { + *d++ = '_'; + *d++ = '\b'; + *d++ = *s++; + } + *d = '\0'; + return dst; +} + +/* * callback_pager -- * A callback similar to callback_html. It overstrikes the matching text in * the snippet so that it appears emboldened when viewed using a pager like @@ -771,12 +795,60 @@ callback_pager(void *data, const char *s } psnippet[i] = 0; - (orig_data->callback)(orig_data->data, section, name, name_desc, psnippet, - psnippet_length); + char *ul_section = ul_pager(section); + char *ul_name = ul_pager(name); + char *ul_name_desc = ul_pager(name_desc); + (orig_data->callback)(orig_data->data, ul_section, ul_name, + ul_name_desc, psnippet, psnippet_length); + free(ul_section); + free(ul_name); + free(ul_name_desc); free(psnippet); return 0; } +struct term_args { + struct orig_callback_data *orig_data; + const char *smul; + const char *rmul; +}; + +/* + * underline a string, pager style. + */ +static char * +ul_term(const char *s, const struct term_args *ta) +{ + char *dst; + + easprintf(&dst, "%s%s%s", ta->smul, s, ta->rmul); + return dst; +} + +/* + * callback_term -- + * A callback similar to callback_html. It overstrikes the matching text in + * the snippet so that it appears emboldened when viewed using a pager like + * more or less. + */ +static int +callback_term(void *data, const char *section, const char *name, + const char *name_desc, const char *snippet, size_t snippet_length) +{ + struct term_args *ta = data; + struct orig_callback_data *orig_data = ta->orig_data; + + char *ul_section = ul_term(section, ta); + char *ul_name = ul_term(name, ta); + char *ul_name_desc = ul_term(name_desc, ta); + (orig_data->callback)(orig_data->data, ul_section, ul_name, + ul_name_desc, snippet, snippet_length); + free(ul_section); + free(ul_name); + free(ul_name_desc); + return 0; +} + /* * run_query_pager -- * Utility function similar to run_query_html. This function tries to @@ -795,3 +867,66 @@ run_query_pager(sqlite3 *db, query_args args->callback_data = (void *) &orig_data; return run_query(db, snippet_args, args); } + +static void +term_init(int fd, const char *sa[5]) +{ + TERMINAL *ti; + int error; + const char *bold, *sgr0, *smso, *rmso, *smul, *rmul; + + if (ti_setupterm(&ti, NULL, fd, &error) == -1) { + bold = sgr0 = NULL; + smso = rmso = smul = rmul = ""; + ti = NULL; + } else { + bold = ti_getstr(ti, "bold"); + sgr0 = ti_getstr(ti, "sgr0"); + if (bold == NULL || sgr0 == NULL) { + smso = ti_getstr(ti, "smso"); + + if (smso == NULL || + (rmso = ti_getstr(ti, "rmso")) == NULL) + smso = rmso = ""; + bold = sgr0 = NULL; + } else + smso = rmso = ""; + + smul = ti_getstr(ti, "smul"); + if (smul == NULL || (rmul = ti_getstr(ti, "rmul")) == NULL) + smul = rmul = ""; + } + + sa[0] = estrdup(bold ? bold : smso); + sa[1] = estrdup(sgr0 ? sgr0 : rmso); + sa[2] = estrdup("..."); + sa[3] = estrdup(smul); + sa[4] = estrdup(rmul); + if (ti) + del_curterm(ti); +} + +/* + * run_query_term -- + * Utility function similar to run_query_html. This function tries to + * pre-process the result assuming it will be displayed on a terminal + * For this purpose it first calls it's own callback function callback_pager + * which then delegates the call to the user supplied callback. + */ +int +run_query_term(sqlite3 *db, query_args *args) +{ + struct orig_callback_data orig_data; + struct term_args ta; + orig_data.callback = args->callback; + orig_data.data = args->callback_data; + const char *snippet_args[5]; + term_init(STDOUT_FILENO, snippet_args); + ta.smul = snippet_args[3]; + ta.rmul = snippet_args[4]; + ta.orig_data = (void *) &orig_data; + + args->callback = &callback_term; + args->callback_data = &ta; + 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.4 src/usr.sbin/makemandb/apropos-utils.h:1.5 --- src/usr.sbin/makemandb/apropos-utils.h:1.4 Sat Oct 6 11:33:59 2012 +++ src/usr.sbin/makemandb/apropos-utils.h Mon Jan 14 16:26:25 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: apropos-utils.h,v 1.4 2012/10/06 15:33:59 wiz Exp $ */ +/* $NetBSD: apropos-utils.h,v 1.5 2013/01/14 21:26:25 christos Exp $ */ /*- * Copyright (c) 2011 Abhinav Upadhyay <er.abhinav.upadh...@gmail.com> * All rights reserved. @@ -90,4 +90,5 @@ char *get_dbpath(const char *); int run_query(sqlite3 *, const char *[3], query_args *); int run_query_html(sqlite3 *, query_args *); int run_query_pager(sqlite3 *, query_args *); +int run_query_term(sqlite3 *, query_args *); #endif Index: src/usr.sbin/makemandb/apropos.c diff -u src/usr.sbin/makemandb/apropos.c:1.9 src/usr.sbin/makemandb/apropos.c:1.10 --- src/usr.sbin/makemandb/apropos.c:1.9 Mon Jan 14 13:04:58 2013 +++ src/usr.sbin/makemandb/apropos.c Mon Jan 14 16:26:25 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: apropos.c,v 1.9 2013/01/14 18:04:58 christos Exp $ */ +/* $NetBSD: apropos.c,v 1.10 2013/01/14 21:26:25 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.9 2013/01/14 18:04:58 christos Exp $"); +__RCSID("$NetBSD: apropos.c,v 1.10 2013/01/14 21:26:25 christos Exp $"); #include <err.h> #include <search.h> @@ -40,7 +40,6 @@ __RCSID("$NetBSD: apropos.c,v 1.9 2013/0 #include <string.h> #include <unistd.h> #include <util.h> -#include <term.h> #include "apropos-utils.h" #include "sqlite3.h" @@ -66,40 +65,9 @@ __dead static void usage(void); #define _PATH_PAGER "/usr/bin/more -s" -static int -term_init(int fd, const char *sa[3]) -{ - if (!isatty(fd)) - return 0; - - TERMINAL *ti; - int error; - if (ti_setupterm(&ti, NULL, fd, &error) == -1) - return 0; - - const char *rmso = ti_getstr(ti, "rmso"); - if (rmso == NULL) - goto out; - - const char *smso = ti_getstr(ti, "smso"); - if (smso == NULL) - goto out; - - sa[0] = estrdup(smso); - sa[1] = estrdup(rmso); - sa[2] = estrdup("..."); - del_curterm(ti); - return 1; -out: - del_curterm(ti); - return 0; - -} - int main(int argc, char *argv[]) { - const char *snippet_args[3]; query_args args; char *query = NULL; // the user query char *errmsg = NULL; @@ -205,8 +173,8 @@ main(int argc, char *argv[]) args.errmsg = &errmsg; - if (term_init(STDOUT_FILENO, snippet_args)) - rc = run_query(db, snippet_args, &args); + if (isatty(STDOUT_FILENO)) + rc = run_query_term(db, &args); else rc = run_query_pager(db, &args);