1*e0ac190eSjoerg /* $NetBSD: strtold_subr.c,v 1.3 2013/05/17 12:55:57 joerg Exp $ */
2bc89c06cSkleink
3bc89c06cSkleink /*
4bc89c06cSkleink * Written by Klaus Klein <kleink@NetBSD.org>, November 16, 2005.
5bc89c06cSkleink * Public domain.
6bc89c06cSkleink */
7bc89c06cSkleink
8bc89c06cSkleink /*
9bc89c06cSkleink * NOTICE: This is not a standalone file. To use it, #include it in
10bc89c06cSkleink * the format-specific strtold_*.c, like so:
11bc89c06cSkleink *
12bc89c06cSkleink * #define GDTOA_LD_FMT <gdtoa extended-precision format code>
13bc89c06cSkleink * #include "strtold_subr.c"
14bc89c06cSkleink */
15bc89c06cSkleink
16bc89c06cSkleink #include <sys/cdefs.h>
17bc89c06cSkleink #if defined(LIBC_SCCS) && !defined(lint)
18*e0ac190eSjoerg __RCSID("$NetBSD: strtold_subr.c,v 1.3 2013/05/17 12:55:57 joerg Exp $");
19bc89c06cSkleink #endif /* LIBC_SCCS and not lint */
20bc89c06cSkleink
21bc89c06cSkleink #include "namespace.h"
22bc89c06cSkleink #include <math.h>
23bc89c06cSkleink #include <stdlib.h>
24bc89c06cSkleink #include "gdtoa.h"
25bc89c06cSkleink
26c99aac45Sjoerg #include <locale.h>
27c99aac45Sjoerg #include "setlocale_local.h"
28c99aac45Sjoerg
29bc89c06cSkleink #ifdef __weak_alias
__weak_alias(strtold,_strtold)30bc89c06cSkleink __weak_alias(strtold, _strtold)
31c99aac45Sjoerg __weak_alias(strtold_l, _strtold_l)
32bc89c06cSkleink #endif
33bc89c06cSkleink
34bc89c06cSkleink #ifndef __HAVE_LONG_DOUBLE
35bc89c06cSkleink #error no extended-precision long double type
36bc89c06cSkleink #endif
37bc89c06cSkleink
38bc89c06cSkleink #ifndef GDTOA_LD_FMT
39bc89c06cSkleink #error GDTOA_LD_FMT must be defined by format-specific source file
40bc89c06cSkleink #endif
41bc89c06cSkleink
42bc89c06cSkleink #define STRTOP(x) __CONCAT(strtop, x)
43bc89c06cSkleink
44c99aac45Sjoerg static long double
45c99aac45Sjoerg _int_strtold_l(const char *nptr, char **endptr, locale_t loc)
46bc89c06cSkleink {
47bc89c06cSkleink long double ld;
48bc89c06cSkleink
49c99aac45Sjoerg (void)STRTOP(GDTOA_LD_FMT)(nptr, endptr, &ld, loc);
50bc89c06cSkleink return ld;
51bc89c06cSkleink }
52c99aac45Sjoerg
53c99aac45Sjoerg long double
strtold(CONST char * s,char ** sp)54c99aac45Sjoerg strtold(CONST char *s, char **sp)
55c99aac45Sjoerg {
56*e0ac190eSjoerg return _int_strtold_l(s, sp, _current_locale());
57c99aac45Sjoerg }
58c99aac45Sjoerg
59c99aac45Sjoerg long double
strtold_l(CONST char * s,char ** sp,locale_t loc)60c99aac45Sjoerg strtold_l(CONST char *s, char **sp, locale_t loc)
61c99aac45Sjoerg {
62c99aac45Sjoerg return _int_strtold_l(s, sp, loc);
63c99aac45Sjoerg }
64