~ubuntu-branches/ubuntu/karmic/lcms/karmic

« back to all changes in this revision

Viewing changes to src/cmscgats.c

  • Committer: Bazaar Package Importer
  • Author(s): Oleksandr Moskalenko
  • Date: 2008-07-24 14:29:36 UTC
  • mfrom: (1.1.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20080724142936-9fgs00bge01jgdl5
Tags: 1.17.dfsg-1
Removed Adobe sRGB profiles from the testdbed and python/testbed
directories (Closes: #491995).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
//
2
2
//  Little cms
3
 
//  Copyright (C) 1998-2006 Marti Maria
 
3
//  Copyright (C) 1998-2007 Marti Maria
4
4
//
5
5
// Permission is hereby granted, free of charge, to any person obtaining 
6
6
// a copy of this software and associated documentation files (the "Software"), 
36
36
// Persistence
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);
40
40
 
41
41
// Properties
42
42
LCMSAPI const char*     LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8);
43
 
LCMSAPI BOOL            LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
44
 
 
45
 
LCMSAPI BOOL            LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
46
 
 
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);
 
44
 
 
45
LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
 
46
 
 
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);
51
51
 
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);
62
62
 
63
 
LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, 
 
63
LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, 
64
64
                                                const char* Val);
65
65
 
66
 
LCMSAPI BOOL            LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, 
 
66
LCMSAPI LCMSBOOL        LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, 
67
67
                                                double Val);
68
68
 
69
69
LCMSAPI const char*     LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
71
71
 
72
72
LCMSAPI double          LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE IT8, const char* cPatch, const char* cSample);                                                
73
73
 
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,
76
76
                                                const char *Val);
77
77
 
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,
80
80
                                                double Val);
81
81
 
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);
84
84
 
85
85
LCMSAPI void            LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE IT8, const char* Formatter);
381
381
 
382
382
// Checks if c is a separator
383
383
static
384
 
BOOL isseparator(int c)
 
384
LCMSBOOL isseparator(int c)
385
385
{
386
386
        return (c == ' ') || (c == '\t') || (c == '\r');
387
387
}
388
388
 
389
389
// Checks whatever if c is a valid identifier char
390
390
static 
391
 
BOOL ismiddle(int c)
 
391
LCMSBOOL ismiddle(int c)
392
392
{
393
393
   return (!isseparator(c) && (c != '#') && (c !='\"') && (c != '\'') && (c > 32) && (c < 127));
394
394
}
395
395
 
396
396
// Checks whatsever if c is a valid identifier middle char.
397
397
static
398
 
BOOL isidchar(int c)
 
398
LCMSBOOL isidchar(int c)
399
399
{
400
400
   return isalnum(c) || ismiddle(c);
401
401
}
402
402
 
403
403
// Checks whatsever if c is a valid identifier first char.
404
404
static
405
 
BOOL isfirstidchar(int c)
 
405
LCMSBOOL isfirstidchar(int c)
406
406
{
407
407
     return !isdigit(c) && ismiddle(c);
408
408
}
410
410
// checks whether the supplied path looks like an absolute path
411
411
// NOTE: this function doesn't checks if the path exists or even if it's legal
412
412
static
413
 
BOOL isabsolutepath(const char *path)
 
413
LCMSBOOL isabsolutepath(const char *path)
414
414
{
415
415
        if(path == NULL)
416
416
                return FALSE;
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
432
432
static 
433
 
BOOL _cmsMakePath(const char *relPath, const char *basePath, char *buffer)
 
433
LCMSBOOL _cmsMakePath(const char *relPath, const char *basePath, char *buffer)
434
434
{
435
 
        if(!isabsolutepath(relPath))
436
 
        {
 
435
        if (!isabsolutepath(relPath)) {
 
436
 
437
437
                char *tail;
438
 
                strcpy(buffer, basePath);
 
438
                
 
439
        strncpy(buffer, basePath, MAX_PATH-1);
439
440
                tail = strrchr(buffer, DIR_CHAR);
440
 
                if (tail != NULL)
441
 
                {
 
441
                if (tail != NULL) {
 
442
 
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!
445
446
                        return TRUE;
446
447
                }
447
448
        }
448
 
        strcpy(buffer, relPath);
 
449
        strncpy(buffer, relPath, MAX_PATH - 1);
449
450
        return TRUE;
450
451
}
451
452
 
 
453
 
 
454
// Make sure no exploit is being even tried
 
455
 
 
456
static
 
457
const char* NoMeta(const char* str)
 
458
{
 
459
    if (strchr(str, '%') != NULL) 
 
460
        return "**** CORRUPTED FORMAT STRING ***";
 
461
 
 
462
    return str;
 
463
}
 
464
 
 
465
 
452
466
// Syntax error
453
467
static
454
 
BOOL SynError(LPIT8 it8, const char *Txt, ...)
 
468
LCMSBOOL SynError(LPIT8 it8, const char *Txt, ...)
455
469
{
456
470
        char Buffer[256], ErrMsg[1024];
457
471
        va_list args;
458
472
 
459
473
        va_start(args, Txt);
460
 
        vsprintf(Buffer, Txt, args);
 
474
        vsnprintf(Buffer, 255, Txt, args);
 
475
        Buffer[255] = 0;
461
476
        va_end(args);
462
477
 
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);
 
479
        ErrMsg[1023] = 0;
464
480
        it8->sy = SSYNERROR;
465
 
        cmsSignalError(LCMS_ERRC_ABORTED, ErrMsg);
 
481
        cmsSignalError(LCMS_ERRC_ABORTED, "%s", ErrMsg);
466
482
        return FALSE;
467
483
}
468
484
 
469
485
// Check if current symbol is same as specified. issue an error else.
470
486
static
471
 
BOOL Check(LPIT8 it8, SYMBOL sy, const char* Err)
 
487
LCMSBOOL Check(LPIT8 it8, SYMBOL sy, const char* Err)
472
488
{
473
489
        if (it8 -> sy != sy)
474
 
                return SynError(it8, Err);
 
490
                return SynError(it8, NoMeta(Err));
475
491
        return TRUE;
476
492
}
477
493
 
863
879
 
864
880
// Checks end of line separator
865
881
static
866
 
BOOL CheckEOLN(LPIT8 it8)
 
882
LCMSBOOL CheckEOLN(LPIT8 it8)
867
883
{
868
884
        if (!Check(it8, SEOLN, "Expected separator")) return FALSE;
869
885
        while (it8 -> sy == SEOLN)
894
910
 
895
911
// Returns a string holding current value
896
912
static
897
 
BOOL GetVal(LPIT8 it8, char* Buffer, const char* ErrorTitle)
 
913
LCMSBOOL GetVal(LPIT8 it8, char* Buffer, size_t max, const char* ErrorTitle)
898
914
{
899
915
    switch (it8->sy) {
900
916
 
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;
905
921
 
906
922
 
907
923
    default:
908
 
         return SynError(it8, ErrorTitle);
 
924
         return SynError(it8, "%s", ErrorTitle);
909
925
    }
910
926
 
911
 
     return TRUE;
 
927
    Buffer[max] = 0;
 
928
    return TRUE;
912
929
}
913
930
 
914
931
// ---------------------------------------------------------- Table
915
932
 
916
933
static
917
934
LPTABLE GetTable(LPIT8 it8)
918
 
{    
919
 
    return it8 ->Tab + it8 ->nTable;
 
935
{        
 
936
   if ((it8 -> nTable >= it8 ->TablesCount) || (it8 -> nTable < 0)) {
 
937
 
 
938
           SynError(it8, "Table %d out of sequence", it8 -> nTable);
 
939
           return it8 -> Tab;
 
940
   }            
 
941
 
 
942
   return it8 ->Tab + it8 ->nTable;
920
943
}
921
944
 
922
945
// ---------------------------------------------------------- Memory management
940
963
        for (p = it8->MemorySink; p != NULL; p = n) {
941
964
 
942
965
            n = p->Next;
943
 
            if (p->Ptr) free(p->Ptr);
944
 
            free(p);
 
966
            if (p->Ptr) _cmsFree(p->Ptr);
 
967
            _cmsFree(p);
945
968
        }
946
969
    }
947
970
 
948
971
    if (it8->MemoryBlock)
949
 
        free(it8->MemoryBlock);    
 
972
        _cmsFree(it8->MemoryBlock);    
950
973
 
951
 
    free(it8);
 
974
     _cmsFree(it8);
952
975
}
953
976
 
954
977
 
957
980
void* AllocBigBlock(LPIT8 it8, size_t size)
958
981
{
959
982
   LPOWNEDMEM ptr1;
960
 
   void* ptr = malloc(size);
 
983
   void* ptr = _cmsMalloc(size);
961
984
 
962
985
        if (ptr) {
963
986
 
964
987
                ZeroMemory(ptr, size);
965
 
                ptr1 = (LPOWNEDMEM) malloc(sizeof(OWNEDMEM));
 
988
                ptr1 = (LPOWNEDMEM) _cmsMalloc(sizeof(OWNEDMEM));
966
989
 
967
990
                if (ptr1 == NULL) {
968
991
 
969
 
                    free(ptr);
 
992
                     _cmsFree(ptr);
970
993
                    return NULL;
971
994
                }
972
995
 
1030
1053
// Searches through linked list
1031
1054
 
1032
1055
static
1033
 
BOOL IsAvailableOnList(LPKEYVALUE p, const char* Key, LPKEYVALUE* LastPtr)
 
1056
LCMSBOOL IsAvailableOnList(LPKEYVALUE p, const char* Key, LPKEYVALUE* LastPtr)
1034
1057
{
1035
1058
 
1036
1059
    for (;  p != NULL; p = p->Next) {
1051
1074
 
1052
1075
// Add a property into a linked list
1053
1076
static
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)
1055
1078
{
1056
1079
    LPKEYVALUE p;
1057
1080
    LPKEYVALUE last;
1065
1088
 
1066
1089
                         last->Value   = AllocString(it8, xValue);
1067
1090
                         last->WriteAs = WriteAs;
1068
 
                         return TRUE;
1069
 
 
1070
 
             // return SynError(it8, "duplicate key <%s>", Key);                                        
 
1091
                         return TRUE;                                               
1071
1092
    }
1072
1093
 
1073
 
        // Allocate the container
 
1094
    // Allocate the container
1074
1095
    p = (LPKEYVALUE) AllocChunk(it8, sizeof(KEYVALUE));
1075
1096
    if (p == NULL)
1076
1097
    {
1101
1122
}
1102
1123
 
1103
1124
static
1104
 
BOOL AddAvailableProperty(LPIT8 it8, const char* Key)
 
1125
LCMSBOOL AddAvailableProperty(LPIT8 it8, const char* Key)
1105
1126
{
1106
1127
        return AddToList(it8, &it8->ValidKeywords, Key, NULL, WRITE_UNCOOKED);
1107
1128
}
1108
1129
 
1109
1130
 
1110
1131
static
1111
 
BOOL AddAvailableSampleID(LPIT8 it8, const char* Key)
 
1132
LCMSBOOL AddAvailableSampleID(LPIT8 it8, const char* Key)
1112
1133
{
1113
1134
        return AddToList(it8, &it8->ValidSampleID, Key, NULL, WRITE_UNCOOKED);
1114
1135
}
1158
1179
    LPIT8 it8;
1159
1180
    int i;
1160
1181
 
1161
 
    it8 = (LPIT8) malloc(sizeof(IT8));
 
1182
    it8 = (LPIT8) _cmsMalloc(sizeof(IT8));
1162
1183
    if (it8 == NULL) return NULL;
1163
1184
 
1164
1185
    ZeroMemory(it8, sizeof(IT8));
1211
1232
 
1212
1233
}
1213
1234
 
1214
 
BOOL  LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type)
 
1235
LCMSBOOL  LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type)
1215
1236
{
1216
1237
        LPIT8 it8 = (LPIT8) hIT8;
1217
1238
 
1219
1240
        return TRUE;
1220
1241
}
1221
1242
 
1222
 
BOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* Val)
 
1243
LCMSBOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* Val)
1223
1244
{
1224
1245
    LPIT8 it8 = (LPIT8) hIT8;
1225
1246
 
1232
1253
 
1233
1254
 
1234
1255
// Sets a property
1235
 
BOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* Key, const char *Val)
 
1256
LCMSBOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* Key, const char *Val)
1236
1257
{
1237
1258
    LPIT8 it8 = (LPIT8) hIT8;
1238
1259
 
1243
1264
}
1244
1265
 
1245
1266
 
1246
 
BOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val)
 
1267
LCMSBOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val)
1247
1268
{
1248
1269
    LPIT8 it8 = (LPIT8) hIT8;
1249
1270
    char Buffer[1024];
1253
1274
    return AddToList(it8, &GetTable(it8)->HeaderList, cProp, Buffer, WRITE_UNCOOKED);    
1254
1275
}
1255
1276
 
1256
 
BOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val)
 
1277
LCMSBOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val)
1257
1278
{
1258
1279
    LPIT8 it8 = (LPIT8) hIT8;
1259
1280
    char Buffer[1024];
1263
1284
    return AddToList(it8, &GetTable(it8)->HeaderList, cProp, Buffer, WRITE_HEXADECIMAL);    
1264
1285
}
1265
1286
 
1266
 
BOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer)
 
1287
LCMSBOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer)
1267
1288
{
1268
1289
    LPIT8 it8 = (LPIT8) hIT8;    
1269
1290
    
1331
1352
}
1332
1353
 
1333
1354
static
1334
 
BOOL SetDataFormat(LPIT8 it8, int n, const char *label)
 
1355
LCMSBOOL SetDataFormat(LPIT8 it8, int n, const char *label)
1335
1356
{
1336
1357
    LPTABLE t = GetTable(it8);
1337
1358
 
1352
1373
}
1353
1374
 
1354
1375
 
1355
 
BOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE h, int n, const char *Sample)
 
1376
LCMSBOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE h, int n, const char *Sample)
1356
1377
{
1357
1378
        LPIT8 it8 = (LPIT8) h;
1358
1379
        return SetDataFormat(it8, n, Sample);
1392
1413
}
1393
1414
 
1394
1415
static
1395
 
BOOL SetData(LPIT8 it8, int nSet, int nField, const char *Val)
 
1416
LCMSBOOL SetData(LPIT8 it8, int nSet, int nField, const char *Val)
1396
1417
{
1397
1418
    LPTABLE t = GetTable(it8);
1398
1419
 
1462
1483
}
1463
1484
 
1464
1485
 
1465
 
// 
 
1486
// Write formatted
 
1487
 
1466
1488
static
1467
1489
void Writef(LPSAVESTREAM f, const char* frm, ...)
1468
1490
{
1470
1492
    va_list args;
1471
1493
 
1472
1494
    va_start(args, frm);
1473
 
    vsprintf(Buffer, frm, args);
 
1495
    vsnprintf(Buffer, 4095, frm, args);
 
1496
    Buffer[4095] = 0;
1474
1497
    WriteStr(f, Buffer);
1475
1498
    va_end(args);
1476
1499
 
1617
1640
 
1618
1641
 
1619
1642
// Saves whole file
1620
 
BOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE hIT8, const char* cFileName)
 
1643
LCMSBOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE hIT8, const char* cFileName)
1621
1644
{
1622
1645
    SAVESTREAM sd;      
1623
1646
    int i;
1645
1668
 
1646
1669
 
1647
1670
// Saves to memory
1648
 
BOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded)
 
1671
LCMSBOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded)
1649
1672
{
1650
1673
    SAVESTREAM sd;      
1651
1674
    int i;
1688
1711
// -------------------------------------------------------------- Higer level parsing
1689
1712
 
1690
1713
static
1691
 
BOOL DataFormatSection(LPIT8 it8)
 
1714
LCMSBOOL DataFormatSection(LPIT8 it8)
1692
1715
{
1693
1716
    int iField = 0;    
1694
1717
    LPTABLE t = GetTable(it8);
1729
1752
 
1730
1753
 
1731
1754
static
1732
 
BOOL DataSection (LPIT8 it8)
 
1755
LCMSBOOL DataSection (LPIT8 it8)
1733
1756
{
1734
1757
    int  iField = 0;
1735
1758
    int  iSet   = 0;
1739
1762
    InSymbol(it8);   // Eats "BEGIN_DATA"
1740
1763
    CheckEOLN(it8);
1741
1764
 
 
1765
    if (!t->Data)
 
1766
        AllocateDataSet(it8);
 
1767
 
1742
1768
    while (it8->sy != SEND_DATA && it8->sy != SEOF)
1743
1769
    {
1744
1770
        if (iField >= t -> nSamples) {
1749
1775
 
1750
1776
        if (it8->sy != SEND_DATA && it8->sy != SEOF) {
1751
1777
 
1752
 
            if (!GetVal(it8, Buffer, "Sample data expected"))
 
1778
            if (!GetVal(it8, Buffer, 255, "Sample data expected"))
1753
1779
                return FALSE;
1754
1780
 
1755
1781
            if (!SetData(it8, iSet, iField, Buffer))
1778
1804
 
1779
1805
 
1780
1806
static
1781
 
BOOL HeaderSection(LPIT8 it8)
 
1807
LCMSBOOL HeaderSection(LPIT8 it8)
1782
1808
{
1783
1809
    char VarName[MAXID];
1784
1810
    char Buffer[MAXSTR];
1793
1819
 
1794
1820
        case SKEYWORD:
1795
1821
                InSymbol(it8);
1796
 
                if (!GetVal(it8, Buffer, "Keyword expected")) return FALSE;                
 
1822
                if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE;                
1797
1823
                if (!AddAvailableProperty(it8, Buffer)) return FALSE;
1798
1824
                InSymbol(it8);
1799
1825
                break;
1812
1838
                }
1813
1839
 
1814
1840
                InSymbol(it8);
1815
 
                if (!GetVal(it8, Buffer, "Property data expected")) return FALSE;
 
1841
                if (!GetVal(it8, Buffer, MAXSTR-1, "Property data expected")) return FALSE;
1816
1842
 
1817
1843
                                
1818
1844
                AddToList(it8, &GetTable(it8)->HeaderList, VarName, Buffer, 
1837
1863
 
1838
1864
 
1839
1865
static
1840
 
BOOL ParseIT8(LPIT8 it8)
 
1866
LCMSBOOL ParseIT8(LPIT8 it8)
1841
1867
{
1842
1868
    char* SheetTypePtr;
1843
1869
 
1913
1939
 
1914
1940
    for (idField = 0; idField < t -> nSamples; idField++)
1915
1941
    {
 
1942
        if (t ->DataFormat == NULL) {
 
1943
             SynError(it8, "Undefined DATA_FORMAT");
 
1944
             return;
 
1945
 
 
1946
        }
 
1947
 
1916
1948
        Fld = t->DataFormat[idField];
1917
1949
        if (!Fld) continue;
1918
1950
 
1968
2000
                                        char *Type  = p ->Value;
1969
2001
                                        int  nTable = k;                                        
1970
2002
 
1971
 
                                        sprintf(Buffer, "%s %d %s", Label, nTable, Type );
 
2003
                                        snprintf(Buffer, 255, "%s %d %s", Label, nTable, Type );
1972
2004
                                                                                
1973
2005
                                        SetData(it8, i, idField, Buffer);
1974
2006
                                    }
1992
2024
// that should be something like some printable characters plus a \n
1993
2025
 
1994
2026
static
1995
 
BOOL IsMyBlock(LPBYTE Buffer, size_t n)
 
2027
LCMSBOOL IsMyBlock(LPBYTE Buffer, size_t n)
1996
2028
{
1997
2029
    size_t i;
1998
2030
 
2014
2046
 
2015
2047
 
2016
2048
static
2017
 
BOOL IsMyFile(const char* FileName)
 
2049
LCMSBOOL IsMyFile(const char* FileName)
2018
2050
{
2019
2051
   FILE *fp;
2020
2052
   size_t Size;
2048
2080
    if (!hIT8) return NULL;
2049
2081
 
2050
2082
    it8 = (LPIT8) hIT8;
2051
 
    it8 ->MemoryBlock = (char*) malloc(len + 1);
 
2083
    it8 ->MemoryBlock = (char*) _cmsMalloc(len + 1);
2052
2084
 
2053
2085
    strncpy(it8 ->MemoryBlock, (const char*) Ptr, len);
2054
2086
    it8 ->MemoryBlock[len] = 0;
2065
2097
    CookPointers(it8);
2066
2098
    it8 ->nTable = 0;
2067
2099
 
2068
 
    free(it8->MemoryBlock);
 
2100
     _cmsFree(it8->MemoryBlock);
2069
2101
    it8 -> MemoryBlock = NULL;
2070
2102
 
2071
2103
    return hIT8;
2245
2277
}
2246
2278
 
2247
2279
 
2248
 
BOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, const char* Val)
 
2280
LCMSBOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, const char* Val)
2249
2281
{
2250
2282
    LPIT8 it8 = (LPIT8) hIT8;
2251
2283
    
2253
2285
}
2254
2286
 
2255
2287
 
2256
 
BOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, double Val)
 
2288
LCMSBOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, double Val)
2257
2289
{
2258
2290
    LPIT8 it8 = (LPIT8) hIT8;
2259
2291
    char Buff[256];
2304
2336
 
2305
2337
 
2306
2338
 
2307
 
BOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE hIT8, const char* cPatch,
 
2339
LCMSBOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE hIT8, const char* cPatch,
2308
2340
                        const char* cSample,
2309
2341
                        const char *Val)
2310
2342
{
2349
2381
}
2350
2382
 
2351
2383
 
2352
 
BOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
 
2384
LCMSBOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
2353
2385
                        const char* cSample,
2354
2386
                        double Val)
2355
2387
{
2356
2388
    LPIT8 it8 = (LPIT8) hIT8;
2357
2389
    char Buff[256];
2358
2390
 
2359
 
        sprintf(Buff, it8->DoubleFormatter, Val);
 
2391
        snprintf(Buff, 255, it8->DoubleFormatter, Val);
2360
2392
        return cmsIT8SetData(hIT8, cPatch, cSample, Buff);
2361
2393
 
2362
2394
}
2363
2395
 
 
2396
// Buffer should get MAXSTR at least
2364
2397
 
2365
2398
const char* LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer)
2366
2399
{
2371
2404
        if (!Data) return NULL;
2372
2405
        if (!buffer) return Data;
2373
2406
 
2374
 
        strcpy(buffer, Data);
 
2407
        strncpy(buffer, Data, MAXSTR-1);        
2375
2408
        return buffer;
2376
2409
}
2377
2410
 
2400
2433
    cLabelFld = cmsIT8GetData(hIT8, cSet, cField); 
2401
2434
    if (!cLabelFld) return -1;
2402
2435
    
2403
 
    if (sscanf(cLabelFld, "%s %d %s", Label, &nTable, Type) != 3)
 
2436
    if (sscanf(cLabelFld, "%255s %d %255s", Label, &nTable, Type) != 3)
2404
2437
            return -1;
2405
2438
    
2406
2439
    if (ExpectedType != NULL && *ExpectedType == 0)