diff --git a/include/time.h b/include/time.h index bd0651c821..3c118faa83 100644 --- a/include/time.h +++ b/include/time.h @@ -217,7 +217,7 @@ time_t time(FAR time_t *timep); #ifdef CONFIG_HAVE_DOUBLE double difftime(time_t time1, time_t time0); -#else +#elif defined(CONFIG_HAVE_FLOAT) float difftime(time_t time1, time_t time0); #endif diff --git a/include/wchar.h b/include/wchar.h index 38a439f166..4a95bb60f4 100644 --- a/include/wchar.h +++ b/include/wchar.h @@ -202,7 +202,9 @@ FAR wchar_t *wcsstr(FAR const wchar_t *, FAR const wchar_t *); #ifdef CONFIG_HAVE_DOUBLE double wcstod(FAR const wchar_t *, FAR wchar_t **); #endif +#ifdef CONFIG_HAVE_FLOAT float wcstof(FAR const wchar_t *, FAR wchar_t **); +#endif FAR wchar_t *wcstok(FAR wchar_t *, FAR const wchar_t *, FAR wchar_t **); long int wcstol(FAR const wchar_t *, FAR wchar_t **, int); #ifdef CONFIG_HAVE_LONG_DOUBLE diff --git a/libs/libc/stdio/lib_libvscanf.c b/libs/libc/stdio/lib_libvscanf.c index 6b41ae20c0..c00abd6c56 100644 --- a/libs/libc/stdio/lib_libvscanf.c +++ b/libs/libc/stdio/lib_libvscanf.c @@ -174,7 +174,10 @@ doswitch: } doexit: - if (v) /* Default => accept */ + + /* Default => accept */ + + if (v) { for (i = 0; i < 32; i++) /* Invert all */ { @@ -950,7 +953,10 @@ int lib_vscanf(FAR struct lib_instream_s *stream, FAR int *lastc, #ifdef CONFIG_HAVE_DOUBLE FAR double *pd = NULL; #endif + +#ifdef CONFIG_HAVE_FLOAT FAR float *pf = NULL; +#endif linfo("Performing floating point conversion\n"); @@ -973,10 +979,12 @@ int lib_vscanf(FAR struct lib_instream_s *stream, FAR int *lastc, } else #endif +#ifdef CONFIG_HAVE_FLOAT { pf = va_arg(ap, FAR float *); *pf = 0.0; } +#endif } #ifdef CONFIG_LIBC_FLOATINGPOINT @@ -994,7 +1002,9 @@ int lib_vscanf(FAR struct lib_instream_s *stream, FAR int *lastc, if (c > 0) { +# if defined(CONFIG_HAVE_DOUBLE) || defined(CONFIG_HAVE_FLOAT) FAR char *endptr; +# endif bool expnt; bool dot; bool sign; @@ -1003,8 +1013,9 @@ int lib_vscanf(FAR struct lib_instream_s *stream, FAR int *lastc, # ifdef CONFIG_HAVE_DOUBLE double dvalue; # endif +# ifdef CONFIG_HAVE_FLOAT float fvalue; - +# endif /* Was a fieldwidth specified? */ if (!width || width > sizeof(tmp) - 1) @@ -1093,17 +1104,21 @@ int lib_vscanf(FAR struct lib_instream_s *stream, FAR int *lastc, } else # endif +# ifdef CONFIG_HAVE_FLOAT { fvalue = strtof(tmp, &endptr); } +# endif /* Check if the number was successfully converted */ +# if defined(CONFIG_HAVE_DOUBLE) || defined(CONFIG_HAVE_FLOAT) if (tmp == endptr || get_errno() == ERANGE) { *lastc = c; return assigncount; } +#endif set_errno(errsave); @@ -1126,8 +1141,10 @@ int lib_vscanf(FAR struct lib_instream_s *stream, FAR int *lastc, { /* Return the float value */ +# ifdef CONFIG_HAVE_FLOAT linfo("Return %f to %p\n", (double)fvalue, pf); *pf = fvalue; +# endif } assigncount++; diff --git a/libs/libc/stdio/lib_libvsprintf.c b/libs/libc/stdio/lib_libvsprintf.c index b559284985..878b92217d 100644 --- a/libs/libc/stdio/lib_libvsprintf.c +++ b/libs/libc/stdio/lib_libvsprintf.c @@ -131,7 +131,9 @@ struct arg_s #ifdef CONFIG_HAVE_LONG_LONG unsigned long long ull; #endif +#ifdef CONFIG_HAVE_DOUBLE double d; +#endif FAR char *cp; } value; }; @@ -1350,9 +1352,11 @@ int lib_vsprintf(FAR struct lib_outstream_s *stream, arglist[i].value.u = va_arg(ap, unsigned int); break; +#ifdef CONFIG_HAVE_DOUBLE case TYPE_DOUBLE: arglist[i].value.d = va_arg(ap, double); break; +#endif case TYPE_CHAR_POINTER: arglist[i].value.cp = va_arg(ap, FAR char *); diff --git a/libs/libc/stdlib/Kconfig b/libs/libc/stdlib/Kconfig index a8afbae1de..f98b397444 100644 --- a/libs/libc/stdlib/Kconfig +++ b/libs/libc/stdlib/Kconfig @@ -8,10 +8,11 @@ menu "stdlib Options" config LIBC_RAND_ORDER int "Order of the random number generate" default 1 - range 1 3 + range 0 3 ---help--- - The order of the random number generator. 1=fast but very bad random + The order of the random number generator. 0=fast but very bad random numbers, 3=slow but very good random numbers. + 0 just use integer generation, 1-3 use floating point generation config LIBC_HOMEDIR string "Home directory" diff --git a/libs/libc/stdlib/lib_srand.c b/libs/libc/stdlib/lib_srand.c index 4e0d157d8b..ac20b9583a 100644 --- a/libs/libc/stdlib/lib_srand.c +++ b/libs/libc/stdlib/lib_srand.c @@ -218,6 +218,7 @@ static float_t frand3(void) static unsigned long nrand_r(unsigned long limit, FAR unsigned long *seed) { +#if CONFIG_LIBC_RAND_ORDER > 0 unsigned long result; float_t ratio; @@ -227,11 +228,11 @@ static unsigned long nrand_r(unsigned long limit, { /* Get a random integer in the range 0.0 - 1.0 */ -#if (CONFIG_LIBC_RAND_ORDER == 1) +# if (CONFIG_LIBC_RAND_ORDER == 1) ratio = frand1(seed); -#elif (CONFIG_LIBC_RAND_ORDER == 2) +# elif (CONFIG_LIBC_RAND_ORDER == 2) ratio = frand2(); -#else /* if (CONFIG_LIBC_RAND_ORDER > 2) */ +# elif (CONFIG_LIBC_RAND_ORDER > 2) ratio = frand3(); #endif @@ -246,6 +247,9 @@ static unsigned long nrand_r(unsigned long limit, while (result >= limit); return result; +#else + return fgenerate1(seed) % limit; +#endif } /**************************************************************************** diff --git a/libs/libc/stdlib/lib_strtold.c b/libs/libc/stdlib/lib_strtold.c index ed9058c484..d994ddfc45 100644 --- a/libs/libc/stdlib/lib_strtold.c +++ b/libs/libc/stdlib/lib_strtold.c @@ -94,6 +94,8 @@ * Private Functions ****************************************************************************/ +#ifdef CONFIG_HAVE_LONG_DOUBLE + /**************************************************************************** * Name: scanexp * @@ -769,15 +771,11 @@ float strtof(FAR const char *str, FAR char **endptr) * ****************************************************************************/ -#ifdef CONFIG_HAVE_DOUBLE - double strtod(FAR const char *str, FAR char **endptr) { return strtox(str, endptr, 2); } -#endif /* CONFIG_HAVE_DOUBLE */ - /**************************************************************************** * Name: strtold * @@ -793,11 +791,8 @@ double strtod(FAR const char *str, FAR char **endptr) * ****************************************************************************/ -#ifdef CONFIG_HAVE_LONG_DOUBLE - long double strtold(FAR const char *str, FAR char **endptr) { return strtox(str, endptr, 3); } - -#endif /* CONFIG_HAVE_LONG_DOUBLE */ \ No newline at end of file +#endif /* CONFIG_HAVE_LONG_DOUBLE */ diff --git a/libs/libc/time/lib_difftime.c b/libs/libc/time/lib_difftime.c index 88d847feba..88efd4d86e 100644 --- a/libs/libc/time/lib_difftime.c +++ b/libs/libc/time/lib_difftime.c @@ -48,7 +48,7 @@ double difftime(time_t time1, time_t time0) { return (double)time1 - (double)time0; } -#else +#elif defined(CONFIG_HAVE_FLOAT) float difftime(time_t time1, time_t time0) { if (time1 >= time0) diff --git a/libs/libc/wchar/lib_wcstod.c b/libs/libc/wchar/lib_wcstod.c index 31de685427..55ae599dfa 100644 --- a/libs/libc/wchar/lib_wcstod.c +++ b/libs/libc/wchar/lib_wcstod.c @@ -48,7 +48,9 @@ * ****************************************************************************/ +#ifdef CONFIG_HAVE_DOUBLE double wcstod(FAR const wchar_t *nptr, FAR wchar_t **endptr) { return strtod((FAR const char *)nptr, (FAR char **)endptr); } +#endif diff --git a/libs/libc/wchar/lib_wcstof.c b/libs/libc/wchar/lib_wcstof.c index 98036b995c..1109d8d866 100644 --- a/libs/libc/wchar/lib_wcstof.c +++ b/libs/libc/wchar/lib_wcstof.c @@ -48,7 +48,9 @@ * ****************************************************************************/ +#ifdef CONFIG_HAVE_FLOAT float wcstof(FAR const wchar_t *nptr, FAR wchar_t **endptr) { return strtof((FAR const char *)nptr, (FAR char **)endptr); } +#endif diff --git a/libs/libc/wchar/lib_wcstold.c b/libs/libc/wchar/lib_wcstold.c index 81a4d30dde..27ddc4df4c 100644 --- a/libs/libc/wchar/lib_wcstold.c +++ b/libs/libc/wchar/lib_wcstold.c @@ -48,7 +48,9 @@ * ****************************************************************************/ +#ifdef CONFIG_HAVE_LONG_DOUBLE long double wcstold(FAR const wchar_t *nptr, FAR wchar_t **endptr) { return strtold((FAR const char *)nptr, (FAR char **)endptr); } +#endif