|  | /** | 
|  | * 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; | 
|  | } |