37
37
LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName);
38
38
LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len);
39
LCMSAPI BOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName);
39
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName);
42
42
LCMSAPI const char* LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8);
43
LCMSAPI BOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
45
LCMSAPI BOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
47
LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str);
48
LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val);
49
LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val);
50
LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer);
43
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
45
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
47
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str);
48
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val);
49
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val);
50
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer);
52
52
LCMSAPI const char* LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* cProp);
53
53
LCMSAPI double LCMSEXPORT cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp);
60
60
LCMSAPI const char* LCMSEXPORT cmsIT8GetDataRowCol(LCMSHANDLE IT8, int row, int col);
61
61
LCMSAPI double LCMSEXPORT cmsIT8GetDataRowColDbl(LCMSHANDLE IT8, int col, int row);
63
LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col,
63
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col,
66
LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col,
66
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col,
69
69
LCMSAPI const char* LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
72
72
LCMSAPI double LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
74
LCMSAPI BOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch,
74
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch,
75
75
const char* cSample,
78
LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
78
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
79
79
const char* cSample,
82
LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample);
82
LCMSAPI LCMSBOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample);
83
83
LCMSAPI int LCMSEXPORT cmsIT8EnumDataFormat(LCMSHANDLE IT8, char ***SampleNames);
85
85
LCMSAPI void LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE IT8, const char* Formatter);
382
382
// Checks if c is a separator
384
BOOL isseparator(int c)
384
LCMSBOOL isseparator(int c)
386
386
return (c == ' ') || (c == '\t') || (c == '\r');
389
389
// Checks whatever if c is a valid identifier char
391
LCMSBOOL ismiddle(int c)
393
393
return (!isseparator(c) && (c != '#') && (c !='\"') && (c != '\'') && (c > 32) && (c < 127));
396
396
// Checks whatsever if c is a valid identifier middle char.
398
LCMSBOOL isidchar(int c)
400
400
return isalnum(c) || ismiddle(c);
403
403
// Checks whatsever if c is a valid identifier first char.
405
BOOL isfirstidchar(int c)
405
LCMSBOOL isfirstidchar(int c)
407
407
return !isdigit(c) && ismiddle(c);
430
430
// NOTE: both relPath and basePath are assumed to be no more than MAX_PATH characters long (including the null terminator!)
431
431
// NOTE: this function doesn't check if the path exists or even if it's legal
433
BOOL _cmsMakePath(const char *relPath, const char *basePath, char *buffer)
433
LCMSBOOL _cmsMakePath(const char *relPath, const char *basePath, char *buffer)
435
if(!isabsolutepath(relPath))
435
if (!isabsolutepath(relPath)) {
438
strcpy(buffer, basePath);
439
strncpy(buffer, basePath, MAX_PATH-1);
439
440
tail = strrchr(buffer, DIR_CHAR);
442
443
size_t len = tail - buffer;
443
444
strncpy(tail + 1, relPath, MAX_PATH - len -1);
444
445
// TODO: if combined path is longer than MAX_PATH, this should return FALSE!
448
strcpy(buffer, relPath);
449
strncpy(buffer, relPath, MAX_PATH - 1);
454
// Make sure no exploit is being even tried
457
const char* NoMeta(const char* str)
459
if (strchr(str, '%') != NULL)
460
return "**** CORRUPTED FORMAT STRING ***";
454
BOOL SynError(LPIT8 it8, const char *Txt, ...)
468
LCMSBOOL SynError(LPIT8 it8, const char *Txt, ...)
456
470
char Buffer[256], ErrMsg[1024];
459
473
va_start(args, Txt);
460
vsprintf(Buffer, Txt, args);
474
vsnprintf(Buffer, 255, Txt, args);
463
sprintf(ErrMsg, "%s: Line %d, %s", it8->FileStack[it8 ->IncludeSP]->FileName, it8->lineno, Buffer);
478
snprintf(ErrMsg, 1023, "%s: Line %d, %s", it8->FileStack[it8 ->IncludeSP]->FileName, it8->lineno, Buffer);
464
480
it8->sy = SSYNERROR;
465
cmsSignalError(LCMS_ERRC_ABORTED, ErrMsg);
481
cmsSignalError(LCMS_ERRC_ABORTED, "%s", ErrMsg);
469
485
// Check if current symbol is same as specified. issue an error else.
471
BOOL Check(LPIT8 it8, SYMBOL sy, const char* Err)
487
LCMSBOOL Check(LPIT8 it8, SYMBOL sy, const char* Err)
473
489
if (it8 -> sy != sy)
474
return SynError(it8, Err);
490
return SynError(it8, NoMeta(Err));
895
911
// Returns a string holding current value
897
BOOL GetVal(LPIT8 it8, char* Buffer, const char* ErrorTitle)
913
LCMSBOOL GetVal(LPIT8 it8, char* Buffer, size_t max, const char* ErrorTitle)
899
915
switch (it8->sy) {
901
case SIDENT: strncpy(Buffer, it8->id, MAXID-1); break;
902
case SINUM: sprintf(Buffer, "%d", it8 -> inum); break;
903
case SDNUM: sprintf(Buffer, it8->DoubleFormatter, it8 -> dnum); break;
904
case SSTRING: strncpy(Buffer, it8->str, MAXSTR-1); break;
917
case SIDENT: strncpy(Buffer, it8->id, max); break;
918
case SINUM: snprintf(Buffer, max, "%d", it8 -> inum); break;
919
case SDNUM: snprintf(Buffer, max, it8->DoubleFormatter, it8 -> dnum); break;
920
case SSTRING: strncpy(Buffer, it8->str, max); break;
908
return SynError(it8, ErrorTitle);
924
return SynError(it8, "%s", ErrorTitle);
914
931
// ---------------------------------------------------------- Table
917
934
LPTABLE GetTable(LPIT8 it8)
919
return it8 ->Tab + it8 ->nTable;
936
if ((it8 -> nTable >= it8 ->TablesCount) || (it8 -> nTable < 0)) {
938
SynError(it8, "Table %d out of sequence", it8 -> nTable);
942
return it8 ->Tab + it8 ->nTable;
922
945
// ---------------------------------------------------------- Memory management
1052
1075
// Add a property into a linked list
1054
BOOL AddToList(LPIT8 it8, LPKEYVALUE* Head, const char *Key, const char* xValue, WRITEMODE WriteAs)
1077
LCMSBOOL AddToList(LPIT8 it8, LPKEYVALUE* Head, const char *Key, const char* xValue, WRITEMODE WriteAs)
1057
1080
LPKEYVALUE last;
1104
BOOL AddAvailableProperty(LPIT8 it8, const char* Key)
1125
LCMSBOOL AddAvailableProperty(LPIT8 it8, const char* Key)
1106
1127
return AddToList(it8, &it8->ValidKeywords, Key, NULL, WRITE_UNCOOKED);
1111
BOOL AddAvailableSampleID(LPIT8 it8, const char* Key)
1132
LCMSBOOL AddAvailableSampleID(LPIT8 it8, const char* Key)
1113
1134
return AddToList(it8, &it8->ValidSampleID, Key, NULL, WRITE_UNCOOKED);
1253
1274
return AddToList(it8, &GetTable(it8)->HeaderList, cProp, Buffer, WRITE_UNCOOKED);
1256
BOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val)
1277
LCMSBOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val)
1258
1279
LPIT8 it8 = (LPIT8) hIT8;
1259
1280
char Buffer[1024];
1263
1284
return AddToList(it8, &GetTable(it8)->HeaderList, cProp, Buffer, WRITE_HEXADECIMAL);
1266
BOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer)
1287
LCMSBOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer)
1268
1289
LPIT8 it8 = (LPIT8) hIT8;
1750
1776
if (it8->sy != SEND_DATA && it8->sy != SEOF) {
1752
if (!GetVal(it8, Buffer, "Sample data expected"))
1778
if (!GetVal(it8, Buffer, 255, "Sample data expected"))
1755
1781
if (!SetData(it8, iSet, iField, Buffer))
1815
if (!GetVal(it8, Buffer, "Property data expected")) return FALSE;
1841
if (!GetVal(it8, Buffer, MAXSTR-1, "Property data expected")) return FALSE;
1818
1844
AddToList(it8, &GetTable(it8)->HeaderList, VarName, Buffer,
1968
2000
char *Type = p ->Value;
1969
2001
int nTable = k;
1971
sprintf(Buffer, "%s %d %s", Label, nTable, Type );
2003
snprintf(Buffer, 255, "%s %d %s", Label, nTable, Type );
1973
2005
SetData(it8, i, idField, Buffer);
2352
BOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
2384
LCMSBOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
2353
2385
const char* cSample,
2356
2388
LPIT8 it8 = (LPIT8) hIT8;
2357
2389
char Buff[256];
2359
sprintf(Buff, it8->DoubleFormatter, Val);
2391
snprintf(Buff, 255, it8->DoubleFormatter, Val);
2360
2392
return cmsIT8SetData(hIT8, cPatch, cSample, Buff);
2396
// Buffer should get MAXSTR at least
2365
2398
const char* LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer)
2400
2433
cLabelFld = cmsIT8GetData(hIT8, cSet, cField);
2401
2434
if (!cLabelFld) return -1;
2403
if (sscanf(cLabelFld, "%s %d %s", Label, &nTable, Type) != 3)
2436
if (sscanf(cLabelFld, "%255s %d %255s", Label, &nTable, Type) != 3)
2406
2439
if (ExpectedType != NULL && *ExpectedType == 0)