xref: /netbsd-src/lib/libc/gdtoa/strtold_subr.c (revision e0ac190e1e4142d8158f3a99bc575fef0a0a0a5c)
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