timeout,top,watch,ping: parse NN.N fractional duration in locales with other separators
No binary (build failed)
—
(log yok)
| @@ -122,6 +122,7 @@ static void FAST_FUNC conv_strtod(const char *arg, void *result) | |
| char *end; | |
| /* Well, this one allows leading whitespace... so what? */ | |
| /* What I like much less is that "-" accepted too! :( */ | |
| + | //TODO: needs setlocale(LC_NUMERIC, "C")? |
| *(double*)result = strtod(arg, &end); | |
| if (end[0]) { | |
| errno = ERANGE; | |
| @@ -74,10 +74,6 @@ int sleep_main(int argc UNUSED_PARAM, char **argv) | |
| sleep(INT_MAX); | |
| #if ENABLE_FEATURE_FANCY_SLEEP | |
| - | # if ENABLE_FLOAT_DURATION |
| - | /* undo busybox.c setlocale */ |
| - | setlocale(LC_NUMERIC, "C"); |
| - | # endif |
| duration = 0; | |
| do { | |
| duration += parse_duration_str(*argv); | |
| @@ -295,6 +295,7 @@ static int compare_keys(const void *xarg, const void *yarg) | |
| #if ENABLE_FEATURE_SORT_BIG | |
| case FLAG_g: { | |
| char *xx, *yy; | |
| + | //TODO: needs setlocale(LC_NUMERIC, "C")? |
| double dx = strtod(x, &xx); | |
| double dy = strtod(y, &yy); | |
| /* not numbers < NaN < -infinity < numbers < +infinity) */ | |
| @@ -37,8 +37,18 @@ duration_t FAST_FUNC parse_duration_str(char *str) | |
| if (strchr(str, '.')) { | |
| double d; | |
| char *pp; | |
| - | int len = strspn(str, "0123456789."); |
| - | char sv = str[len]; |
| + | int len; |
| + | char sv; |
| + | |
| + | # if ENABLE_LOCALE_SUPPORT |
| + | /* Undo busybox.c: on input, we want to use dot |
| + | * as fractional separator in strtod(), |
| + | * regardless of current locale |
| + | */ |
| + | setlocale(LC_NUMERIC, "C"); |
| + | # endif |
| + | len = strspn(str, "0123456789."); |
| + | sv = str[len]; |
| str[len] = '\0'; | |
| errno = 0; | |
| d = strtod(str, &pp); | |
| @@ -229,6 +229,7 @@ static void stack_machine(const char *argument) | |
| const struct op *o; | |
| next: | |
| + | //TODO: needs setlocale(LC_NUMERIC, "C")? |
| number = strtod(argument, &end); | |
| if (end != argument) { | |
| argument = end; | |
| @@ -89,6 +89,7 @@ static unsigned str_to_jiffies(const char *time_str) | |
| { | |
| double dd; | |
| char *endptr; | |
| + | //TODO: needs setlocale(LC_NUMERIC, "C")? |
| dd = /*bb_*/strtod(time_str, &endptr); | |
| if (endptr == time_str || dd < 0) | |
| bb_error_msg_and_die(bb_msg_invalid_arg_to, time_str, "timespec"); | |