diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-04 21:58:00 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-04 21:58:00 +0000 |
commit | 4cbffc0f349557e13565753df6f1cd240dd2973c (patch) | |
tree | 1032407fedcb1416436c352c15862d00780282bf | |
parent | 9835d47acc5ed1cdfe2be0932004c83bc7d94a81 (diff) | |
download | busybox-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.c | 45 |
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 | ||
26 | static int run_pipe(const char *unpacker, const char *pager, char *man_filename) | 26 | static 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" */ |
48 | static int show_manpage(const char *pager, char *man_filename) | 49 | static 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; |