summaryrefslogtreecommitdiffstats
path: root/private/crt32/misc/initnum.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/misc/initnum.c')
-rw-r--r--private/crt32/misc/initnum.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/private/crt32/misc/initnum.c b/private/crt32/misc/initnum.c
new file mode 100644
index 000000000..dea832aad
--- /dev/null
+++ b/private/crt32/misc/initnum.c
@@ -0,0 +1,129 @@
+/***
+*initnum.c - contains _init_numeric
+*
+* Copyright (c) 1991-1993, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Contains the locale-category initialization function: _init_numeric().
+*
+* Each initialization function sets up locale-specific information
+* for their category, for use by functions which are affected by
+* their locale category.
+*
+* *** For internal use by setlocale() only ***
+*
+*Revision History:
+* 12-08-91 ETC Created.
+* 12-20-91 ETC Updated to use new NLSAPI GetLocaleInfo.
+* 12-18-92 CFW Ported to Cuda tree, changed _CALLTYPE4 to _CRTAPI3.
+* 12-29-92 CFW Updated to use new _getlocaleinfo wrapper function.
+* 01-25-93 KRS Change interface to _getlocaleinfo again.
+* 02-08-93 CFW Added _lconv_static_*.
+* 02-17-93 CFW Removed debugging print statement.
+* 03-17-93 CFW C locale thousands sep is "", not ",".
+* 05-20-93 GJF Include windows.h, not individual win*.h files
+* 06-11-93 CFW Now inithelp takes void *.
+*
+*******************************************************************************/
+
+#ifdef _INTL
+
+#include <stdlib.h>
+#include <string.h>
+#include <windows.h>
+#include <locale.h>
+#include <setlocal.h>
+#include <malloc.h>
+#include <assert.h>
+#include <nlsint.h>
+
+/* Pointer to current lconv */
+extern struct lconv *_lconv;
+
+/***
+*int _init_numeric() - initialization for LC_NUMERIC locale category.
+*
+*Purpose:
+*
+*Entry:
+* None.
+*
+*Exit:
+* 0 success
+* 1 fail
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+int _CRTAPI3 _init_numeric (
+ void
+ )
+{
+ static char *decimal_point = NULL;
+ static char *thousands_sep = NULL;
+ static char *grouping = NULL;
+ int ret = 0;
+
+ /* Numeric data is country--not language--dependent. NT work-around. */
+ LCID ctryid = MAKELCID(_lc_id[LC_NUMERIC].wCountry, SORT_DEFAULT);
+
+ if (_lc_handle[LC_NUMERIC] != _CLOCALEHANDLE)
+ {
+ ret |= _getlocaleinfo(LC_STR_TYPE, ctryid, LOCALE_SDECIMAL, (void *)&decimal_point);
+ ret |= _getlocaleinfo(LC_STR_TYPE, ctryid, LOCALE_STHOUSAND, (void *)&thousands_sep);
+ ret |= _getlocaleinfo(LC_STR_TYPE, ctryid, LOCALE_SGROUPING, (void *)&grouping);
+
+ if (ret == -1)
+ {
+ free (decimal_point);
+ free (thousands_sep);
+ free (grouping);
+ decimal_point = NULL;
+ thousands_sep = NULL;
+ grouping = NULL;
+ return -1;
+ }
+
+ if (_lconv->decimal_point != _lconv_static_decimal)
+ {
+ free(_lconv->decimal_point);
+ free(_lconv->thousands_sep);
+ free(_lconv->grouping);
+ }
+
+ _lconv->decimal_point = decimal_point;
+ _lconv->thousands_sep = thousands_sep;
+ _lconv->grouping = grouping;
+
+
+#ifdef _DEBUG
+ assert (strlen(_lconv->decimal_point) == 1);
+#endif
+ /* set global decimal point character */
+ *_decimal_point = *_lconv->decimal_point;
+ _decimal_point_length = 1;
+
+ return 0;
+
+ } else {
+ free (decimal_point);
+ free (thousands_sep);
+ free (grouping);
+ decimal_point = NULL;
+ thousands_sep = NULL;
+ grouping = NULL;
+
+ // strdup them so we can free them
+ _lconv->decimal_point = _strdup(".");
+ _lconv->thousands_sep = _strdup("");
+ _lconv->grouping = strdup("");
+
+ /* set global decimal point character */
+ *_decimal_point = *_lconv->decimal_point;
+ _decimal_point_length = 1;
+
+ return 0;
+ }
+}
+#endif /* _INTL */