diff options
author | "Vladimir N. Oleynik" <dzo@simtreas.ru> | 2005-10-05 10:52:47 +0000 |
---|---|---|
committer | "Vladimir N. Oleynik" <dzo@simtreas.ru> | 2005-10-05 10:52:47 +0000 |
commit | 35939d93783230998439848b2798865c598723e2 (patch) | |
tree | 188f195a595c4f494fdc1d8d27da67a2e5b42b5d | |
parent | 7abe7098676aeb0654ef0159f589484b4cf520e8 (diff) | |
download | busybox-w32-35939d93783230998439848b2798865c598723e2.tar.gz busybox-w32-35939d93783230998439848b2798865c598723e2.tar.bz2 busybox-w32-35939d93783230998439848b2798865c598723e2.zip |
update bb_getopt_ulflags special for 'ps' applet, usaging '-' as first group char from bb_opt_complementally is new feature: set argv is options;
use new bb_getopt_ulflags for ps
# define terminal_width 80->79 for unwide
use stdout file descriptor for get_terminal_width_height. (its must)
-rw-r--r-- | libbb/getopt_ulflags.c | 56 | ||||
-rw-r--r-- | procps/ps.c | 13 |
2 files changed, 50 insertions, 19 deletions
diff --git a/libbb/getopt_ulflags.c b/libbb/getopt_ulflags.c index 8c03214a9..410f4d57d 100644 --- a/libbb/getopt_ulflags.c +++ b/libbb/getopt_ulflags.c | |||
@@ -110,7 +110,7 @@ const char *bb_opt_complementally | |||
110 | bb_getopt_ulflags's return value will be as if "-a -b -c" were | 110 | bb_getopt_ulflags's return value will be as if "-a -b -c" were |
111 | found. | 111 | found. |
112 | 112 | ||
113 | "ww" Option have int counter usaging. For example ps applet: | 113 | "ww" Double option have int counter usaging. For example ps applet: |
114 | if w is given once, GNU ps sets the width to 132, | 114 | if w is given once, GNU ps sets the width to 132, |
115 | if w is given more than once, it is "unlimited" | 115 | if w is given more than once, it is "unlimited" |
116 | 116 | ||
@@ -175,6 +175,9 @@ Special characters: | |||
175 | "!" If previous point set BB_GETOPT_ERROR, don`t return and call | 175 | "!" If previous point set BB_GETOPT_ERROR, don`t return and call |
176 | previous example internally | 176 | previous example internally |
177 | 177 | ||
178 | "-" A minus as one char in bb_opt_complementally group means that | ||
179 | convert the arguments as option, specail for "ps" applet. | ||
180 | |||
178 | "*" A star after a char in bb_opt_complementally means that the | 181 | "*" A star after a char in bb_opt_complementally means that the |
179 | option can occur multiple times: | 182 | option can occur multiple times: |
180 | 183 | ||
@@ -227,6 +230,9 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) | |||
227 | va_list p; | 230 | va_list p; |
228 | const struct option *l_o; | 231 | const struct option *l_o; |
229 | char flg_show_usage_if_error = 0; | 232 | char flg_show_usage_if_error = 0; |
233 | char flg_argv_is_opts = 0; | ||
234 | unsigned long trigger; | ||
235 | char **pargv = NULL; | ||
230 | 236 | ||
231 | va_start (p, applet_opts); | 237 | va_start (p, applet_opts); |
232 | 238 | ||
@@ -294,6 +300,10 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) | |||
294 | flg_show_usage_if_error = '!'; | 300 | flg_show_usage_if_error = '!'; |
295 | continue; | 301 | continue; |
296 | } | 302 | } |
303 | if(*s == '-') { | ||
304 | flg_argv_is_opts = '-'; | ||
305 | continue; | ||
306 | } | ||
297 | for (on_off = complementally; on_off->opt; on_off++) | 307 | for (on_off = complementally; on_off->opt; on_off++) |
298 | if (on_off->opt == *s) | 308 | if (on_off->opt == *s) |
299 | break; | 309 | break; |
@@ -304,17 +314,17 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) | |||
304 | } else if(*s == '*') { | 314 | } else if(*s == '*') { |
305 | pair->list_flg++; | 315 | pair->list_flg++; |
306 | } else { | 316 | } else { |
307 | unsigned long *pair_switch = &(pair->switch_on); | 317 | unsigned long *pair_switch = &(pair->switch_on); |
308 | if(c) | 318 | if(c) |
309 | pair_switch = c == '-' ? &(pair->switch_off) : &(pair->incongruously); | 319 | pair_switch = c == '-' ? &(pair->switch_off) : &(pair->incongruously); |
310 | for (on_off = complementally; on_off->opt; on_off++) | 320 | for (on_off = complementally; on_off->opt; on_off++) |
311 | if (on_off->opt == *s) { | 321 | if (on_off->opt == *s) { |
312 | if(pair_switch == &(on_off->switch_on)) | 322 | if(pair_switch == &(on_off->switch_on)) |
313 | on_off->counter = va_arg (p, int *); | 323 | on_off->counter = va_arg (p, int *); |
314 | else | 324 | else |
315 | *pair_switch |= on_off->switch_on; | 325 | *pair_switch |= on_off->switch_on; |
316 | break; | 326 | break; |
317 | } | 327 | } |
318 | } | 328 | } |
319 | } | 329 | } |
320 | s--; | 330 | s--; |
@@ -322,8 +332,8 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) | |||
322 | 332 | ||
323 | while ((c = getopt_long (argc, argv, applet_opts, | 333 | while ((c = getopt_long (argc, argv, applet_opts, |
324 | bb_applet_long_options, NULL)) > 0) { | 334 | bb_applet_long_options, NULL)) > 0) { |
325 | unsigned long trigger; | ||
326 | 335 | ||
336 | loop_arg_is_opt: | ||
327 | for (on_off = complementally; on_off->opt != c; on_off++) { | 337 | for (on_off = complementally; on_off->opt != c; on_off++) { |
328 | if(!on_off->opt) | 338 | if(!on_off->opt) |
329 | bb_show_usage (); | 339 | bb_show_usage (); |
@@ -341,10 +351,28 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) | |||
341 | (*(on_off->counter))++; | 351 | (*(on_off->counter))++; |
342 | if(on_off->list_flg) { | 352 | if(on_off->list_flg) { |
343 | *(llist_t **)(on_off->optarg) = | 353 | *(llist_t **)(on_off->optarg) = |
344 | llist_add_to(*(llist_t **)(on_off->optarg), optarg); | 354 | llist_add_to(*(llist_t **)(on_off->optarg), optarg); |
345 | } else if (on_off->optarg) { | 355 | } else if (on_off->optarg) { |
346 | *(char **)(on_off->optarg) = optarg; | 356 | *(char **)(on_off->optarg) = optarg; |
347 | } | 357 | } |
358 | if(flg_argv_is_opts == 'p') | ||
359 | break; | ||
360 | } | ||
361 | if(flg_argv_is_opts) { | ||
362 | /* process argv is option, for example "ps" applet */ | ||
363 | if(flg_argv_is_opts == '-') { | ||
364 | flg_argv_is_opts = 'p'; | ||
365 | pargv = argv + optind; | ||
366 | } | ||
367 | while(*pargv) { | ||
368 | c = **pargv; | ||
369 | if(c == '\0') { | ||
370 | pargv++; | ||
371 | } else { | ||
372 | (*pargv)++; | ||
373 | goto loop_arg_is_opt; | ||
374 | } | ||
375 | } | ||
348 | } | 376 | } |
349 | 377 | ||
350 | return flags; | 378 | return flags; |
diff --git a/procps/ps.c b/procps/ps.c index 6b5a4a908..b423b06ce 100644 --- a/procps/ps.c +++ b/procps/ps.c | |||
@@ -26,16 +26,19 @@ extern int ps_main(int argc, char **argv) | |||
26 | { | 26 | { |
27 | procps_status_t * p; | 27 | procps_status_t * p; |
28 | int i, len; | 28 | int i, len; |
29 | |||
29 | #if ENABLE_SELINUX | 30 | #if ENABLE_SELINUX |
30 | int use_selinux = 0; | 31 | int use_selinux = 0; |
31 | security_context_t sid=NULL; | 32 | security_context_t sid=NULL; |
32 | #endif | 33 | #endif |
34 | |||
33 | #if ENABLE_FEATURE_PS_WIDE | 35 | #if ENABLE_FEATURE_PS_WIDE |
34 | int terminal_width; | 36 | int terminal_width; |
35 | int w_count = 0; | 37 | int w_count = 0; |
36 | bb_opt_complementally="ww"; | 38 | |
39 | bb_opt_complementally="-:ww"; | ||
37 | #else | 40 | #else |
38 | # define terminal_width 80 | 41 | # define terminal_width 79 |
39 | #endif | 42 | #endif |
40 | 43 | ||
41 | #if ENABLE_FEATURE_PS_WIDE || ENABLE_SELINUX | 44 | #if ENABLE_FEATURE_PS_WIDE || ENABLE_SELINUX |
@@ -43,7 +46,7 @@ extern int ps_main(int argc, char **argv) | |||
43 | #if ENABLE_FEATURE_PS_WIDE && ENABLE_SELINUX | 46 | #if ENABLE_FEATURE_PS_WIDE && ENABLE_SELINUX |
44 | i = bb_getopt_ulflags(argc, argv, "wc", &w_count); | 47 | i = bb_getopt_ulflags(argc, argv, "wc", &w_count); |
45 | #elif ENABLE_FEATURE_PS_WIDE && !ENABLE_SELINUX | 48 | #elif ENABLE_FEATURE_PS_WIDE && !ENABLE_SELINUX |
46 | i = bb_getopt_ulflags(argc, argv, "w", &w_count); | 49 | bb_getopt_ulflags(argc, argv, "w", &w_count); |
47 | #else /* !ENABLE_FEATURE_PS_WIDE && ENABLE_SELINUX */ | 50 | #else /* !ENABLE_FEATURE_PS_WIDE && ENABLE_SELINUX */ |
48 | i = bb_getopt_ulflags(argc, argv, "c"); | 51 | i = bb_getopt_ulflags(argc, argv, "c"); |
49 | #endif | 52 | #endif |
@@ -51,10 +54,10 @@ extern int ps_main(int argc, char **argv) | |||
51 | /* if w is given once, GNU ps sets the width to 132, | 54 | /* if w is given once, GNU ps sets the width to 132, |
52 | * if w is given more than once, it is "unlimited" | 55 | * if w is given more than once, it is "unlimited" |
53 | */ | 56 | */ |
54 | if((i & 1)) { | 57 | if(w_count) { |
55 | terminal_width = (w_count==1) ? 132 : INT_MAX; | 58 | terminal_width = (w_count==1) ? 132 : INT_MAX; |
56 | } else { | 59 | } else { |
57 | get_terminal_width_height(0, &terminal_width, NULL); | 60 | get_terminal_width_height(1, &terminal_width, NULL); |
58 | /* Go one less... */ | 61 | /* Go one less... */ |
59 | terminal_width--; | 62 | terminal_width--; |
60 | } | 63 | } |