From 4437dcc83c90f775d2ddb600de3f020b7a6b363d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Thu, 9 Feb 2012 09:59:09 +0100 Subject: Split out float parsing to separate function --- src/cmscgats.c | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/cmscgats.c b/src/cmscgats.c index e4ccfbf..378392c 100644 --- a/src/cmscgats.c +++ b/src/cmscgats.c @@ -405,6 +405,18 @@ cmsBool isabsolutepath(const char *path) return FALSE; } +// Parses float number +static +cmsFloat64Number ParseFloatNumber(const char *Buffer) +{ + if (Buffer) { + return atof(Buffer); + } else { + return 0.0; + } +} + + // Makes a file path based on a given reference path // NOTE: this function doesn't check if the path exists or even if it's legal static @@ -1320,8 +1332,7 @@ cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cPro { const char *v = cmsIT8GetProperty(hIT8, cProp); - if (v) return atof(v); - else return 0.0; + return ParseFloatNumber(v); } const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey) @@ -2461,13 +2472,7 @@ cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int c Buffer = cmsIT8GetDataRowCol(hIT8, row, col); - if (Buffer) { - - return atof(Buffer); - - } else - return 0; - + return ParseFloatNumber(Buffer); } @@ -2522,14 +2527,7 @@ cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE it8, const char* cPatch, Buffer = cmsIT8GetData(it8, cPatch, cSample); - if (Buffer) { - - return atof(Buffer); - - } else { - - return 0; - } + return ParseFloatNumber(Buffer); } -- cgit v1.2.1 From 69c9181547946cc8618c8c399c1c2253bf640b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Thu, 9 Feb 2012 10:12:54 +0100 Subject: Make float parsing work in different locales Directly using atof is wrong as it is locale dependent and in some languyages decimals separator is not . as is used in CCMX. This leads to failure (or rather to trimming decimal part of the numbers). This change uses printf to figure out what current locale use, localeconv might sound as better to use, but it's definitely not thread safe so it sounds like potential source of troubles. --- src/cmscgats.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/cmscgats.c b/src/cmscgats.c index 378392c..433c39e 100644 --- a/src/cmscgats.c +++ b/src/cmscgats.c @@ -43,6 +43,7 @@ #else # define DIR_CHAR '/' #endif +#include // Symbols typedef enum { @@ -406,11 +407,29 @@ cmsBool isabsolutepath(const char *path) } // Parses float number +// This can not call directly atof because it uses locale dependant +// parsing, while CCMX files always use . as decimal separator static cmsFloat64Number ParseFloatNumber(const char *Buffer) { + char *tmp, *pos, number[10]; + cmsFloat64Number ret; + if (Buffer) { - return atof(Buffer); + // Try to detect which decimal separator current locale uses + sprintf(number, "%f", 0.5); + // Is locale specific comma different? + if (number[1] == '.') { + return atof(Buffer); + } else { + tmp = strdup(Buffer); + while ((pos = strchr(tmp, '.')) != NULL) { + *pos = number[1]; + } + ret = atof(tmp); + free(tmp); + return ret; + } } else { return 0.0; } -- cgit v1.2.1