From e47bbcb41fff93a3737e0b41914541d0af815173 Mon Sep 17 00:00:00 2001 From: Marti Maria Date: Mon, 20 Feb 2012 11:46:23 +0100 Subject: Cleanup on CGATS parser to avoid deprecated functions --- AUTHORS | 2 ++ src/cmscgats.c | 103 ++++++++++++++++++++++++++++++++++++----------------- testbed/testcms2.c | 23 +++++++++++- 3 files changed, 94 insertions(+), 34 deletions(-) diff --git a/AUTHORS b/AUTHORS index 0da6a84..1f4c01c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -22,6 +22,8 @@ Florian H Aurelien Jarno Claudiu Cebuc Michael Vhrel (Artifex) +Robin Watts (Artifex) +Michal Cihar Special Thanks -------------- diff --git a/src/cmscgats.c b/src/cmscgats.c index 433c39e..487c2c3 100644 --- a/src/cmscgats.c +++ b/src/cmscgats.c @@ -43,7 +43,7 @@ #else # define DIR_CHAR '/' #endif -#include + // Symbols typedef enum { @@ -406,34 +406,6 @@ cmsBool isabsolutepath(const char *path) return FALSE; } -// 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) { - // 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; - } -} // Makes a file path based on a given reference path @@ -577,7 +549,7 @@ void ReadReal(cmsIT8* it8, int inum) if (it8->ch == '.') { // Decimal point cmsFloat64Number frac = 0.0; // fraction - int prec = 0; // precision + int prec = 0; // precision NextCh(it8); // Eats dec. point @@ -624,6 +596,74 @@ void ReadReal(cmsIT8* it8, int inum) } } +// Parses a 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) +{ + cmsFloat64Number dnum = 0.0; + + while (*Buffer && isdigit(*Buffer)) { + + dnum = dnum * 10.0 + (*Buffer - '0'); + if (*Buffer) Buffer++; + } + + if (*Buffer == '.') { + + cmsFloat64Number frac = 0.0; // fraction + int prec = 0; // precission + + if (*Buffer) Buffer++; + + while (*Buffer && isdigit(*Buffer)) { + + frac = frac * 10.0 + (*Buffer - '0'); + prec++; + if (*Buffer) Buffer++; + } + + dnum = dnum + (frac / xpow10(prec)); + } + + // Exponent, example 34.00E+20 + if (*Buffer && toupper(*Buffer) == 'E') { + + int e; + int sgn; + + if (*Buffer) Buffer++; + sgn = 1; + + if (*Buffer == '-') { + + sgn = -1; + if (*Buffer) Buffer++; + } + else + if (*Buffer == '+') { + + sgn = +1; + if (*Buffer) Buffer++; + } + + e = 0; + while (*Buffer && isdigit(*Buffer)) { + + if ((cmsFloat64Number) e * 10L < INT_MAX) + e = e * 10 + (*Buffer - '0'); + + if (*Buffer) Buffer++; + } + + e = sgn*e; + dnum = dnum * xpow10(e); + } + + + return dnum; +} // Reads next symbol @@ -1285,8 +1325,6 @@ cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* Val) return AddToList(it8, &GetTable(it8)->HeaderList, "# ", NULL, Val, WRITE_UNCOOKED) != NULL; } - - // Sets a property cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* Key, const char *Val) { @@ -1298,7 +1336,6 @@ cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* Key, const ch return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Val, WRITE_STRINGIFY) != NULL; } - cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val) { cmsIT8* it8 = (cmsIT8*) hIT8; diff --git a/testbed/testcms2.c b/testbed/testcms2.c index f070b09..d928aee 100644 --- a/testbed/testcms2.c +++ b/testbed/testcms2.c @@ -6500,6 +6500,20 @@ cmsInt32Number CheckCGATS(void) return 0; } + + cmsIT8SetPropertyDbl(it8, "DBL_PROP", 123E+12); + if ((cmsIT8GetPropertyDbl(it8, "DBL_PROP") - 123E+12) > 1 ) { + + return 0; + } + + cmsIT8SetPropertyDbl(it8, "DBL_PROP_NEG", 123E-45); + if ((cmsIT8GetPropertyDbl(it8, "DBL_PROP_NEG") - 123E-45) > 1E-45 ) { + + return 0; + } + + cmsIT8Free(it8); remove("TEST.IT8"); @@ -7568,6 +7582,8 @@ int main(int argc, char* argv[]) { cmsInt32Number Exhaustive = 0; cmsInt32Number DoSpeedTests = 1; + cmsInt32Number DoCheckTests = 1; + #ifdef _MSC_VER @@ -7597,9 +7613,13 @@ int main(int argc, char* argv[]) PrintSupportedIntents(); + + // Create utility profiles - Check("Creation of test profiles", CreateTestProfiles); + Check("Creation of test profiles", CreateTestProfiles); + if (DoCheckTests) + { Check("Base types", CheckBaseTypes); Check("endianess", CheckEndianess); Check("quick floor", CheckQuickFloor); @@ -7769,6 +7789,7 @@ int main(int argc, char* argv[]) Check("PostScript generator", CheckPostScript); Check("Segment maxima GBD", CheckGBD); Check("MD5 digest", CheckMD5); + } if (DoSpeedTests) -- cgit v1.2.1