Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.sbin/makemandb - move the terminal handling in apropos-u...
details: https://anonhg.NetBSD.org/src/rev/c6db172db767
branches: trunk
changeset: 784013:c6db172db767
user: christos <christos%NetBSD.org@localhost>
date: Mon Jan 14 21:26:25 2013 +0000
description:
- 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
diffstat:
usr.sbin/makemandb/apropos-utils.c | 143 +++++++++++++++++++++++++++++++++++-
usr.sbin/makemandb/apropos-utils.h | 3 +-
usr.sbin/makemandb/apropos.c | 40 +---------
3 files changed, 145 insertions(+), 41 deletions(-)
diffs (279 lines):
diff -r 22452184ff95 -r c6db172db767 usr.sbin/makemandb/apropos-utils.c
--- a/usr.sbin/makemandb/apropos-utils.c Mon Jan 14 21:04:15 2013 +0000
+++ b/usr.sbin/makemandb/apropos-utils.c Mon Jan 14 21:26:25 2013 +0000
@@ -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.upadhyay%gmail.com@localhost>
* 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 @@
#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 @@
}
/*
+ * 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 @@
}
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 @@
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);
+}
diff -r 22452184ff95 -r c6db172db767 usr.sbin/makemandb/apropos-utils.h
--- a/usr.sbin/makemandb/apropos-utils.h Mon Jan 14 21:04:15 2013 +0000
+++ b/usr.sbin/makemandb/apropos-utils.h Mon Jan 14 21:26:25 2013 +0000
@@ -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.upadhyay%gmail.com@localhost>
* All rights reserved.
@@ -90,4 +90,5 @@
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
diff -r 22452184ff95 -r c6db172db767 usr.sbin/makemandb/apropos.c
--- a/usr.sbin/makemandb/apropos.c Mon Jan 14 21:04:15 2013 +0000
+++ b/usr.sbin/makemandb/apropos.c Mon Jan 14 21:26:25 2013 +0000
@@ -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.upadhyay%gmail.com@localhost>
* 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 @@
#include <string.h>
#include <unistd.h>
#include <util.h>
-#include <term.h>
#include "apropos-utils.h"
#include "sqlite3.h"
@@ -66,40 +65,9 @@
#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 @@
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);
Home |
Main Index |
Thread Index |
Old Index