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