aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-07-04 21:58:00 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-07-04 21:58:00 +0000
commit4cbffc0f349557e13565753df6f1cd240dd2973c (patch)
tree1032407fedcb1416436c352c15862d00780282bf
parent9835d47acc5ed1cdfe2be0932004c83bc7d94a81 (diff)
downloadbusybox-w32-4cbffc0f349557e13565753df6f1cd240dd2973c.tar.gz
busybox-w32-4cbffc0f349557e13565753df6f1cd240dd2973c.tar.bz2
busybox-w32-4cbffc0f349557e13565753df6f1cd240dd2973c.zip
man: support cat pages too (by Jason Curl <jcurlnews AT arcor.de>)
function old new delta show_manpage - 112 +112 run_pipe 89 102 +13 man_main 721 725 +4
-rw-r--r--miscutils/man.c45
1 files changed, 31 insertions, 14 deletions
diff --git a/miscutils/man.c b/miscutils/man.c
index 8c55ae9b9..20172f6b2 100644
--- a/miscutils/man.c
+++ b/miscutils/man.c
@@ -23,7 +23,7 @@ echo ".pl \n(nlu+10"
23 23
24*/ 24*/
25 25
26static int run_pipe(const char *unpacker, const char *pager, char *man_filename) 26static int run_pipe(const char *unpacker, const char *pager, char *man_filename, int cat)
27{ 27{
28 char *cmd; 28 char *cmd;
29 29
@@ -35,9 +35,10 @@ static int run_pipe(const char *unpacker, const char *pager, char *man_filename)
35 return 1; 35 return 1;
36 } 36 }
37 37
38 /* "2>&1" added so that nroff errors are shown in pager too. 38 /* "2>&1" is added so that nroff errors are shown in pager too.
39 * Otherwise it may show just empty screen */ 39 * Otherwise it may show just empty screen */
40 cmd = xasprintf("%s '%s' | gtbl | nroff -Tlatin1 -mandoc 2>&1 | %s", 40 cmd = xasprintf(cat ? "%s '%s' | %s"
41 : "%s '%s' | gtbl | nroff -Tlatin1 -mandoc 2>&1 | %s",
41 unpacker, man_filename, pager); 42 unpacker, man_filename, pager);
42 system(cmd); 43 system(cmd);
43 free(cmd); 44 free(cmd);
@@ -45,22 +46,22 @@ static int run_pipe(const char *unpacker, const char *pager, char *man_filename)
45} 46}
46 47
47/* man_filename is of the form "/dir/dir/dir/name.s.bz2" */ 48/* man_filename is of the form "/dir/dir/dir/name.s.bz2" */
48static int show_manpage(const char *pager, char *man_filename) 49static int show_manpage(const char *pager, char *man_filename, int cat)
49{ 50{
50 int len; 51 int len;
51 52
52 if (run_pipe("bunzip2 -c", pager, man_filename)) 53 if (run_pipe("bunzip2 -c", pager, man_filename, cat))
53 return 1; 54 return 1;
54 55
55 len = strlen(man_filename) - 1; 56 len = strlen(man_filename) - 1;
56 57
57 man_filename[len] = '\0'; /* ".bz2" -> ".gz" */ 58 man_filename[len] = '\0'; /* ".bz2" -> ".gz" */
58 man_filename[len - 2] = 'g'; 59 man_filename[len - 2] = 'g';
59 if (run_pipe("gunzip -c", pager, man_filename)) 60 if (run_pipe("gunzip -c", pager, man_filename, cat))
60 return 1; 61 return 1;
61 62
62 man_filename[len - 3] = '\0'; /* ".gz" -> "" */ 63 man_filename[len - 3] = '\0'; /* ".gz" -> "" */
63 if (run_pipe("cat", pager, man_filename)) 64 if (run_pipe("cat", pager, man_filename, cat))
64 return 1; 65 return 1;
65 66
66 return 0; 67 return 0;
@@ -145,14 +146,30 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
145 do { /* for each section */ 146 do { /* for each section */
146 char *next_sect = strchrnul(cur_sect, ':'); 147 char *next_sect = strchrnul(cur_sect, ':');
147 int sect_len = next_sect - cur_sect; 148 int sect_len = next_sect - cur_sect;
148 149 char *man_filename;
149 char *man_filename = xasprintf("%.*s/man%.*s/%s.%.*s" ".bz2", 150 int found_here;
150 path_len, cur_path, 151
151 sect_len, cur_sect, 152 /* Search for cat page first */
152 *argv, 153 man_filename = xasprintf("%.*s/%s%.*s/%s.%.*s" ".bz2",
153 sect_len, cur_sect); 154 path_len, cur_path,
154 found |= show_manpage(pager, man_filename); 155 "cat",
156 sect_len, cur_sect,
157 *argv,
158 sect_len, cur_sect);
159 found_here = show_manpage(pager, man_filename, 1);
155 free(man_filename); 160 free(man_filename);
161 if (!found_here) {
162 man_filename = xasprintf("%.*s/%s%.*s/%s.%.*s" ".bz2",
163 path_len, cur_path,
164 "man",
165 sect_len, cur_sect,
166 *argv,
167 sect_len, cur_sect);
168 found_here = show_manpage(pager, man_filename, 0);
169 free(man_filename);
170 }
171 found |= found_here;
172
156 if (found && !(opt & OPT_a)) 173 if (found && !(opt & OPT_a))
157 goto next_arg; 174 goto next_arg;
158 cur_sect = next_sect; 175 cur_sect = next_sect;