Index: patches/nan.patch |
=================================================================== |
--- patches/nan.patch (revision 0) |
+++ patches/nan.patch (revision 0) |
@@ -0,0 +1,65 @@ |
+Index: source/i18n/digitlst.cpp |
+=================================================================== |
+--- source/i18n/digitlst.cpp (revision 88316) |
++++ source/i18n/digitlst.cpp (working copy) |
+@@ -60,6 +60,18 @@ |
+ |
+ U_NAMESPACE_BEGIN |
+ |
++static void |
++loadDecimalChar() { |
++ if (gDecimal == 0) { |
++ char rep[MAX_DIGITS]; |
++ // For machines that decide to change the decimal on you, |
++ // and try to be too smart with localization. |
++ // This normally should be just a '.'. |
++ sprintf(rep, "%+1.1f", 1.0); |
++ gDecimal = rep[2]; |
++ } |
++} |
++ |
+ // ------------------------------------- |
+ // default constructor |
+ |
+@@ -398,15 +410,6 @@ |
+ } |
+ DigitList *nonConstThis = const_cast<DigitList *>(this); |
+ |
+- if (gDecimal == 0) { |
+- char rep[MAX_DIGITS]; |
+- // For machines that decide to change the decimal on you, |
+- // and try to be too smart with localization. |
+- // This normally should be just a '.'. |
+- sprintf(rep, "%+1.1f", 1.0); |
+- gDecimal = rep[2]; |
+- } |
+- |
+ if (isZero()) { |
+ nonConstThis->fDouble = 0.0; |
+ if (decNumberIsNegative(fDecNumber)) { |
+@@ -441,6 +444,7 @@ |
+ } |
+ U_ASSERT(uprv_strlen(&s[0]) < MAX_DBL_DIGITS+18); |
+ |
++ loadDecimalChar(); |
+ if (gDecimal != '.') { |
+ char *decimalPt = strchr(s, '.'); |
+ if (decimalPt != NULL) { |
+@@ -727,6 +731,17 @@ |
+ sprintf(rep, "%+1.*e", MAX_DBL_DIGITS - 1, source); |
+ U_ASSERT(uprv_strlen(rep) < sizeof(rep)); |
+ |
++ // uprv_decNumberFromString() will parse the string expecting '.' as a |
++ // decimal separator, however sprintf() can use ',' in certain locales. |
++ // Overwrite a different decimal separator with '.' here before proceeding. |
++ loadDecimalChar(); |
++ if (gDecimal != '.') { |
++ char *decimalPt = strchr(rep, gDecimal); |
++ if (decimalPt != NULL) { |
++ *decimalPt = '.'; |
++ } |
++ } |
++ |
+ // Create a decNumber from the string. |
+ uprv_decNumberFromString(fDecNumber, rep, &fContext); |
+ uprv_decNumberTrim(fDecNumber); |