summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarti Maria <info@littlecms.com>2012-02-20 11:46:23 +0100
committerMarti Maria <info@littlecms.com>2012-02-20 11:46:23 +0100
commite47bbcb41fff93a3737e0b41914541d0af815173 (patch)
treeb3d442cc48eaf2793e93e0ef86f25ef17402ca32
parentc00a6900f86ea8610a5a16a5118ac7fc7f68c2c9 (diff)
downloadlcms2-e47bbcb41fff93a3737e0b41914541d0af815173.tar.gz
Cleanup on CGATS parser to avoid deprecated functions
-rw-r--r--AUTHORS2
-rw-r--r--src/cmscgats.c103
-rw-r--r--testbed/testcms2.c23
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öch
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 <stdio.h>
+
// 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)