sleep: fix fractional arguments in non-POSIX locale
authorDenys Vlasenko <dvlasenk@redhat.com>
Fri, 24 Sep 2010 10:39:45 +0000 (12:39 +0200)
committerDenys Vlasenko <dvlasenk@redhat.com>
Fri, 24 Sep 2010 10:39:45 +0000 (12:39 +0200)
function                                             old     new   delta
sleep_main                                           390     379     -11

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
coreutils/sleep.c

index 12798d9..9acb2d1 100644 (file)
@@ -49,6 +49,9 @@ int sleep_main(int argc UNUSED_PARAM, char **argv)
 
 #if ENABLE_FEATURE_FLOAT_SLEEP
 
+# if ENABLE_LOCALE_SUPPORT
+       setlocale (LC_NUMERIC, "C");
+# endif
        duration = 0;
        do {
                char *arg = *argv;
@@ -62,14 +65,15 @@ int sleep_main(int argc UNUSED_PARAM, char **argv)
                        d = strtod(arg, &pp);
                        if (errno || *pp)
                                bb_show_usage();
-                       arg[len] = sv;
-                       len--;
-                       sv = arg[len];
-                       arg[len] = '1';
-                       duration += d * xatoul_sfx(&arg[len], sfx);
-                       arg[len] = sv;
-               } else
+                       arg += len;
+                       *arg-- = sv;
+                       sv = *arg;
+                       *arg = '1';
+                       duration += d * xatoul_sfx(arg, sfx);
+                       *arg = sv;
+               } else {
                        duration += xatoul_sfx(arg, sfx);
+               }
        } while (*++argv);
 
        ts.tv_sec = MAXINT(typeof(ts.tv_sec));