| /** | |
| * This file has no copyright assigned and is placed in the Public Domain. | |
| * This file is part of the w64 mingw-runtime package. | |
| * No warranty is given; refer to the file DISCLAIMER within this package. | |
| */ | |
| /* Wide char wrapper for strtold | |
| * Revision history: | |
| * 6 Nov 2002 Initial version. | |
| * | |
| * Contributor: Danny Smith <dannysmith@users.sourceforege.net> | |
| */ | |
| /* This routine has been placed in the public domain.*/ | |
| #define WIN32_LEAN_AND_MEAN | |
| #include <windows.h> | |
| #include <locale.h> | |
| #include <wchar.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| extern int __asctoe64(const char * __restrict__ ss, | |
| short unsigned int * __restrict__ y); | |
| static __inline__ unsigned int get_codepage (void) | |
| { | |
| char* cp; | |
| /* | |
| locale :: "lang[_country[.code_page]]" | |
| | ".code_page" | |
| */ | |
| if ((cp = strchr(setlocale(LC_CTYPE, NULL), '.'))) | |
| return atoi( cp + 1); | |
| else | |
| return 0; | |
| } | |
| long double wcstold (const wchar_t * __restrict__ wcs, wchar_t ** __restrict__ wcse) | |
| { | |
| char * cs; | |
| int i; | |
| int lenldstr; | |
| union | |
| { | |
| unsigned short int us[6]; | |
| long double ld; | |
| } xx; | |
| unsigned int cp = get_codepage (); | |
| /* Allocate enough room for (possibly) mb chars */ | |
| cs = (char *) malloc ((wcslen(wcs)+1) * MB_CUR_MAX); | |
| if (cp == 0) /* C locale */ | |
| { | |
| for (i = 0; (wcs[i] != 0) && wcs[i] <= 255; i++) | |
| cs[i] = (char) wcs[i]; | |
| cs[i] = '\0'; | |
| } | |
| else | |
| { | |
| int nbytes = -1; | |
| int mb_len = 0; | |
| /* loop through till we hit null or invalid character */ | |
| for (i = 0; (wcs[i] != 0) && (nbytes != 0); i++) | |
| { | |
| nbytes = WideCharToMultiByte(cp, WC_COMPOSITECHECK | WC_SEPCHARS, | |
| wcs + i, 1, cs + mb_len, MB_CUR_MAX, | |
| NULL, NULL); | |
| mb_len += nbytes; | |
| } | |
| cs[mb_len] = '\0'; | |
| } | |
| lenldstr = __asctoe64( cs, xx.us); | |
| free (cs); | |
| if (wcse) | |
| *wcse = (wchar_t*) wcs + lenldstr; | |
| return xx.ld; | |
| } |