man-db-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Man-db-devel] [PATCH 1/3] man(1): add page. and term.. searches


From: Mihail Konev
Subject: [Man-db-devel] [PATCH 1/3] man(1): add page. and term.. searches
Date: Wed, 7 Dec 2016 04:13:33 +0500

"man [option]... page. " is "man [option]... -f page"
"man [option]... term.." is "man [option]... -k term"

Look only at first non-option for this.
Add tests also.
---
 man/man1/man.man1     | 12 +++++++++++
 src/man.c             | 55 +++++++++++++++++++++++++++++++++++++++++++++++++--
 src/tests/Makefile.am |  2 +-
 src/tests/man-12      | 39 ++++++++++++++++++++++++++++++++++++
 4 files changed, 105 insertions(+), 3 deletions(-)
 create mode 100644 src/tests/man-12

diff --git a/man/man1/man.man1 b/man/man1/man.man1
index 4df2823f1cd7..0c86ede8267a 100644
--- a/man/man1/man.man1
+++ b/man/man1/man.man1
@@ -66,6 +66,9 @@
 .\" The apropos command line
 .br
 .B %man%
+[\|\fIapropos options\fR\|] \fItitle_or_description_term..
+.br
+.B %man%
 .B \-k
 .RI [\| apropos
 .IR options \|]
@@ -85,6 +88,9 @@
 .\" The whatis command line
 .br
 .B %man%
+[\|\fIwhatis options\fR\|] \fIpage.
+.br
+.B %man%
 .B \-f
 .RI [\| whatis
 .IR options \|]
@@ -290,6 +296,12 @@ Display the manual page for macro package
 .I man
 from section \fI7\fR.
 .TP
+\fB%man% \fIprintf\fR.
+Display what manual pages are named \fIprintf\fR.
+.TP
+\fB%man% \fIpthread\fR..
+Display what manual pages have \fIpthread\fR in either their title or 
description.
+.TP
 .BI %man%\ \-a \ intro
 Display, in succession, all of the available
 .I intro
diff --git a/src/man.c b/src/man.c
index 110d18b51c96..85b07f3399e8 100644
--- a/src/man.c
+++ b/src/man.c
@@ -345,10 +345,10 @@ static struct argp_option options[] = {
        { 0 }
 };
 
+static int apropos, whatis; /* retain values between calls to parse_opt */
+
 static error_t parse_opt (int key, char *arg, struct argp_state *state)
 {
-       static int apropos, whatis; /* retain values between calls */
-
        /* Please keep these keys in the same order as in options above. */
        switch (key) {
                case 'C':
@@ -3947,6 +3947,55 @@ static const char **get_section_list (void)
        }
 }
 
+char *str_regesc(char *re) {
+       char *s;
+       int si, c;
+
+       s = xmalloc(strlen(re) * 3 + 1);
+       si = 0;
+       while ((c = *re++)) {
+               switch (c) {
+                       case '[':
+                       case ']':
+                       case '\\':
+                               s[si++] = '\\';
+                               s[si++] = c;
+                       default:
+                               s[si++] = '[';
+                               s[si++] = c;
+                               s[si++] = ']';
+               }
+       }
+       s[si] = 0;
+       return s;
+}
+
+/* See if first non-option argument has one or two dots at the end.
+ * If two, regexp-quote it, and act as if -k is given.
+ * If one, act as if -f is given.
+ * */
+void parse_dots_in_argv1(int argc, int arg1_idx, char *argv[]) {
+       char *arg1;
+       int len;
+
+       if (first_arg > argc-1)
+               return;
+       arg1 = argv[arg1_idx];
+       len = strlen(arg1);
+       if (len >= 1 && arg1[len-1] == '.') {
+               if (len >= 2 && arg1[len-2] == '.') {
+                       external = APROPOS;
+                       apropos = 1;
+                       arg1[len-2] = 0;
+                       argv[1] = str_regesc(arg1);
+               } else {
+                       external = WHATIS;
+                       apropos = 1;
+                       arg1[len-1] = 0;
+               }
+       }
+}
+
 int main (int argc, char *argv[])
 {
        int argc_env, exit_status = OK;
@@ -4001,6 +4050,8 @@ int main (int argc, char *argv[])
        /* parse the actual program args */
        if (argp_parse (&argp, argc, argv, ARGP_NO_ARGS, &first_arg, 0))
                exit (FAIL);
+       /* assumes ARGP_NO_ARGS and no ARGP_IN_ORDER flags to argp_parse 
earlier */
+       parse_dots_in_argv1(argc, first_arg, argv);
 
 #ifdef SECURE_MAN_UID
        /* record who we are and drop effective privs for later use */
diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
index 27a261626c33..df84310d756e 100644
--- a/src/tests/Makefile.am
+++ b/src/tests/Makefile.am
@@ -28,7 +28,7 @@ TESTS_ENVIRONMENT = PATH=$(abs_builddir)/..:$$PATH; export 
PATH; \
 AM_LOG_FLAGS = $(SHELL)
 ALL_TESTS = \
        lexgrog-1 \
-       man-1 man-2 man-3 man-4 man-5 man-6 man-7 man-8 man-9 man-10 man-11 \
+       man-1 man-2 man-3 man-4 man-5 man-6 man-7 man-8 man-9 man-10 man-11 
man-12 \
        manconv-1 manconv-2 manconv-3 \
        mandb-1 mandb-2 mandb-3 mandb-4 mandb-5 mandb-6 mandb-7 \
        whatis-1 \
diff --git a/src/tests/man-12 b/src/tests/man-12
new file mode 100644
index 000000000000..0d0445ae4319
--- /dev/null
+++ b/src/tests/man-12
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+# Test for:
+#   man chmod. => man -f chmod
+#   man chmod.. => man -k chmod
+
+: ${srcdir=.}
+. "$srcdir/testlib.sh"
+
+: ${MAN=man}
+
+init
+fake_config /usr/share/man
+MANPATH="$tmpdir/usr/share/man"
+export MANPATH
+
+page_name="chmod"
+
+write_page "$page_name" 1 "$tmpdir/usr/share/man/man1/${page_name}.1.gz" \
+        UTF-8 gz '' "$page_name \- coreutils $page_name manual page"
+write_page "$page_name" 2 "$tmpdir/usr/share/man/man2/${page_name}.2.gz" \
+        UTF-8 gz '' "$page_name \- $page_name() syscall manual page"
+
+cat >"$tmpdir/1.exp" <<EOF
+chmod (1)
+chmod (2)
+EOF
+
+run $MAN -C "$tmpdir/manpath.config" -aw "$page_name". -w >"$tmpdir/1.out"
+expect_pass '"man ... name. ..." is the same as "man ... -f name ..."' \
+        'diff -u "$tmpdir/1.exp" "$tmpdir/1.out"'
+
+cat >"$tmpdir/2.exp" <<EOF
+chmod (2)
+EOF
+
+run $MAN -C "$tmpdir/manpath.config" -aw syscall.. -w >"$tmpdir/2.out"
+expect_pass '"man ... name.. ..." is the same as "man ... -k name ..."' \
+        'diff -u "$tmpdir/2.exp" "$tmpdir/2.out"'
-- 
2.9.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]