[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
- [Man-db-devel] [PATCH 1/3] man(1): add page. and term.. searches,
Mihail Konev <=