timeout,top,watch,ping: parse NN.N fractional duration in locales with other separators
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		| @@ -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"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user