libbb/procps.c: make fast_strtoul_10() stop on '\n' too
[oweals/busybox.git] / libbb / getopt32.c
index b5f83c1273aa2df8d06f0c93ed1cb2fa23fbac50..d0e83d88ee4d31090527a7f2f632907e9ebe0312 100644 (file)
@@ -4,10 +4,12 @@
  *
  * Copyright (C) 2003-2005  Vladimir Oleynik  <dzo@simtreas.ru>
  *
- * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  */
 
-#include <getopt.h>
+#if ENABLE_LONG_OPTS || ENABLE_FEATURE_GETOPT_LONG
+# include <getopt.h>
+#endif
 #include "libbb.h"
 
 /*      Documentation
@@ -80,9 +82,9 @@ const char *applet_long_options
         This struct allows you to define long options:
 
         static const char applet_longopts[] ALIGN1 =
-               //"name\0" has_arg val
-               "verbose\0" No_argument "v"
-               ;
+                //"name\0" has_arg val
+                "verbose\0" No_argument "v"
+                ;
         applet_long_options = applet_longopts;
 
         The last member of struct option (val) typically is set to
@@ -115,7 +117,7 @@ const char *opt_complementary
         found.
 
  "ww"   Adjacent double options have a counter associated which indicates
-        the number of occurences of the option.
+        the number of occurrences of the option.
         For example the ps applet needs:
         if w is given once, GNU ps sets the width to 132,
         if w is given more than once, it is "unlimited"
@@ -226,14 +228,14 @@ Special characters:
         if specified together.  In this case you must set
         opt_complementary = "b--cf:c--bf:f--bc".  If two of the
         mutually exclusive options are found, getopt32 will call
-       bb_show_usage() and die.
+        bb_show_usage() and die.
 
  "x--x" Variation of the above, it means that -x option should occur
         at most once.
 
  "a+"   A plus after a char in opt_complementary means that the parameter
         for this option is a nonnegative integer. It will be processed
-        with xatoi_u() - allowed range is 0..INT_MAX.
+        with xatoi_positive() - allowed range is 0..INT_MAX.
 
         int param;  // "unsigned param;" will also work
         opt_complementary = "p+";
@@ -465,13 +467,17 @@ getopt32(char **argv, const char *applet_opts, ...)
                }
                for (on_off = complementary; on_off->opt_char; on_off++)
                        if (on_off->opt_char == *s)
-                               break;
+                               goto found_opt;
+               /* Without this, diagnostic of such bugs is not easy */
+               bb_error_msg_and_die("NO OPT %c!", *s);
+ found_opt:
                if (c == ':' && s[2] == ':') {
                        on_off->param_type = PARAM_LIST;
                        continue;
                }
                if (c == '+' && (s[2] == ':' || s[2] == '\0')) {
                        on_off->param_type = PARAM_INT;
+                       s++;
                        continue;
                }
                if (c == ':' || c == '\0') {
@@ -531,7 +537,7 @@ getopt32(char **argv, const char *applet_opts, ...)
 
        /* In case getopt32 was already called:
         * reset the libc getopt() function, which keeps internal state.
-        * run_nofork_applet_prime() does this, but we might end up here
+        * run_nofork_applet() does this, but we might end up here
         * also via gunzip_main() -> gzip_main(). Play safe.
         */
 #ifdef __GLIBC__
@@ -542,8 +548,6 @@ getopt32(char **argv, const char *applet_opts, ...)
 #endif
        /* optarg = NULL; opterr = 0; optopt = 0; - do we need this?? */
 
-       pargv = NULL;
-
        /* Note: just "getopt() <= 0" will not work well for
         * "fake" short options, like this one:
         * wget $'-\203' "Test: test" http://kernel.org/
@@ -574,19 +578,16 @@ getopt32(char **argv, const char *applet_opts, ...)
                flags ^= trigger;
                if (on_off->counter)
                        (*(on_off->counter))++;
-               if (on_off->param_type == PARAM_LIST) {
-                       if (optarg)
+               if (optarg) {
+                       if (on_off->param_type == PARAM_LIST) {
                                llist_add_to_end((llist_t **)(on_off->optarg), optarg);
-               } else if (on_off->param_type == PARAM_INT) {
-                       if (optarg)
-//TODO: xatoi_u indirectly pulls in printf machinery
-                               *(unsigned*)(on_off->optarg) = xatoi_u(optarg);
-               } else if (on_off->optarg) {
-                       if (optarg)
+                       } else if (on_off->param_type == PARAM_INT) {
+//TODO: xatoi_positive indirectly pulls in printf machinery
+                               *(unsigned*)(on_off->optarg) = xatoi_positive(optarg);
+                       } else if (on_off->optarg) {
                                *(char **)(on_off->optarg) = optarg;
+                       }
                }
-               if (pargv != NULL)
-                       break;
        }
 
        /* check depending requires for given options */