update bb_getopt_ulflags special for 'ps' applet, usaging '-' as first group char...
author"Vladimir N. Oleynik" <dzo@simtreas.ru>
Wed, 5 Oct 2005 10:52:47 +0000 (10:52 -0000)
committer"Vladimir N. Oleynik" <dzo@simtreas.ru>
Wed, 5 Oct 2005 10:52:47 +0000 (10:52 -0000)
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)

libbb/getopt_ulflags.c
procps/ps.c

index 8c03214a92c7fd785d653a60f48cfd97aad7fd3c..410f4d57dc0da6b5b76f11830761fbeb04b1df52 100644 (file)
@@ -110,7 +110,7 @@ const char *bb_opt_complementally
        bb_getopt_ulflags's return value will be as if "-a -b -c" were
        found.
 
- "ww"   Option have int counter usaging. For example ps applet:
+ "ww"   Double option have int counter usaging. For example ps applet:
        if w is given once, GNU ps sets the width to 132,
        if w is given more than once, it is "unlimited"
 
@@ -175,6 +175,9 @@ Special characters:
  "!"    If previous point set BB_GETOPT_ERROR, don`t return and call
        previous example internally
 
+ "-"    A minus as one char in bb_opt_complementally group means that
+       convert the arguments as option, specail for "ps" applet.
+
  "*"    A star after a char in bb_opt_complementally means that the
        option can occur multiple times:
 
@@ -227,6 +230,9 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
        va_list p;
        const struct option *l_o;
        char flg_show_usage_if_error = 0;
+       char flg_argv_is_opts = 0;
+       unsigned long trigger;
+       char **pargv = NULL;
 
        va_start (p, applet_opts);
 
@@ -294,6 +300,10 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
                        flg_show_usage_if_error = '!';
                        continue;
                }
+               if(*s == '-') {
+                       flg_argv_is_opts = '-';
+                       continue;
+               }
                for (on_off = complementally; on_off->opt; on_off++)
                        if (on_off->opt == *s)
                                break;
@@ -304,17 +314,17 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
                        } else if(*s == '*') {
                                pair->list_flg++;
                        } else {
-                               unsigned long *pair_switch = &(pair->switch_on);
-                               if(c)
-                                       pair_switch = c == '-' ? &(pair->switch_off) : &(pair->incongruously);
-                               for (on_off = complementally; on_off->opt; on_off++)
-                                       if (on_off->opt == *s) {
-                                               if(pair_switch == &(on_off->switch_on))
-                                                 on_off->counter = va_arg (p, int *);
-                                               else
-                                                 *pair_switch |= on_off->switch_on;
-                                               break;
-                                       }
+                           unsigned long *pair_switch = &(pair->switch_on);
+                           if(c)
+                               pair_switch = c == '-' ? &(pair->switch_off) : &(pair->incongruously);
+                           for (on_off = complementally; on_off->opt; on_off++)
+                               if (on_off->opt == *s) {
+                                   if(pair_switch == &(on_off->switch_on))
+                                       on_off->counter = va_arg (p, int *);
+                                   else
+                                       *pair_switch |= on_off->switch_on;
+                                   break;
+                               }
                        }
                }
                s--;
@@ -322,8 +332,8 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
 
        while ((c = getopt_long (argc, argv, applet_opts,
                                 bb_applet_long_options, NULL)) > 0) {
-               unsigned long trigger;
 
+loop_arg_is_opt:
                for (on_off = complementally; on_off->opt != c; on_off++) {
                        if(!on_off->opt)
                                bb_show_usage ();
@@ -341,10 +351,28 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
                        (*(on_off->counter))++;
                if(on_off->list_flg) {
                        *(llist_t **)(on_off->optarg) =
-                               llist_add_to(*(llist_t **)(on_off->optarg), optarg);
+                         llist_add_to(*(llist_t **)(on_off->optarg), optarg);
                } else if (on_off->optarg) {
                        *(char **)(on_off->optarg) = optarg;
                }
+               if(flg_argv_is_opts == 'p')
+                       break;
+       }
+       if(flg_argv_is_opts) {
+               /* process argv is option, for example "ps" applet */
+               if(flg_argv_is_opts == '-') {
+                       flg_argv_is_opts = 'p';
+                       pargv = argv + optind;
+               }
+               while(*pargv) {
+                       c = **pargv;
+                       if(c == '\0') {
+                               pargv++;
+                       } else {
+                               (*pargv)++;
+                               goto loop_arg_is_opt;
+                       }
+               }
        }
 
        return flags;
index 6b5a4a908641d792f363010cbb913dc570c481f6..b423b06ceb3bf591f7556e97ef205902c3d5c69b 100644 (file)
@@ -26,16 +26,19 @@ extern int ps_main(int argc, char **argv)
 {
        procps_status_t * p;
        int i, len;
+
 #if ENABLE_SELINUX
        int use_selinux = 0;
        security_context_t sid=NULL;
 #endif
+
 #if ENABLE_FEATURE_PS_WIDE
        int terminal_width;
        int w_count = 0;
-       bb_opt_complementally="ww";
+
+       bb_opt_complementally="-:ww";
 #else
-# define terminal_width 80
+# define terminal_width 79
 #endif
 
 #if ENABLE_FEATURE_PS_WIDE || ENABLE_SELINUX
@@ -43,7 +46,7 @@ extern int ps_main(int argc, char **argv)
 #if ENABLE_FEATURE_PS_WIDE && ENABLE_SELINUX
        i = bb_getopt_ulflags(argc, argv, "wc", &w_count);
 #elif ENABLE_FEATURE_PS_WIDE && !ENABLE_SELINUX
-       i = bb_getopt_ulflags(argc, argv, "w", &w_count);
+       bb_getopt_ulflags(argc, argv, "w", &w_count);
 #else /* !ENABLE_FEATURE_PS_WIDE && ENABLE_SELINUX */
        i = bb_getopt_ulflags(argc, argv, "c");
 #endif
@@ -51,10 +54,10 @@ extern int ps_main(int argc, char **argv)
        /* if w is given once, GNU ps sets the width to 132,
         * if w is given more than once, it is "unlimited"
         */
-       if((i & 1)) {
+       if(w_count) {
                terminal_width = (w_count==1) ? 132 : INT_MAX;
        } else {
-               get_terminal_width_height(0, &terminal_width, NULL);
+               get_terminal_width_height(1, &terminal_width, NULL);
                /* Go one less... */
                terminal_width--;
        }