X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/374ca955a76ecab1204ca8bfa63ff9238d998416..08b89b0a244153b9f5bbb2f49c55ab0f7298122e:/icuSources/tools/gensprep/store.c diff --git a/icuSources/tools/gensprep/store.c b/icuSources/tools/gensprep/store.c index 6a70d615..30bd9fc5 100644 --- a/icuSources/tools/gensprep/store.c +++ b/icuSources/tools/gensprep/store.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2004, International Business Machines +* Copyright (C) 1999-2012, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -22,16 +22,13 @@ #include "cstring.h" #include "filestrm.h" #include "unicode/udata.h" +#include "unicode/utf16.h" #include "utrie.h" #include "unewdata.h" #include "gensprep.h" #include "uhash.h" -#ifdef WIN32 -# pragma warning(disable: 4100) -#endif - #define DO_DEBUG_OUT 0 @@ -200,8 +197,7 @@ static UNewTrie *sprepTrie; extern void init() { - sprepTrie = (UNewTrie *)uprv_malloc(sizeof(UNewTrie)); - uprv_memset(sprepTrie, 0, sizeof(UNewTrie)); + sprepTrie = (UNewTrie *)uprv_calloc(1, sizeof(UNewTrie)); /* initialize the two tries */ if(NULL==utrie_open(sprepTrie, NULL, MAX_DATA_LENGTH, 0, 0, FALSE)) { @@ -244,17 +240,20 @@ storeMappingData(){ const UHashElement* element = NULL; ValueStruct* value = NULL; int32_t codepoint = 0; - int32_t elementCount = uhash_count(hashTable); + int32_t elementCount = 0; int32_t writtenElementCount = 0; int32_t mappingLength = 1; /* minimum mapping length */ int32_t oldMappingLength = 0; uint16_t trieWord =0; int32_t limitIndex = 0; - /*initialize the mapping data */ - mappingData = (uint16_t*) uprv_malloc(U_SIZEOF_UCHAR * (mappingDataCapacity)); + if (hashTable == NULL) { + return; + } + elementCount = uhash_count(hashTable); - uprv_memset(mappingData,0,U_SIZEOF_UCHAR * mappingDataCapacity); + /*initialize the mapping data */ + mappingData = (uint16_t*) uprv_calloc(mappingDataCapacity, U_SIZEOF_UCHAR); while(writtenElementCount < elementCount){ @@ -315,42 +314,25 @@ storeMappingData(){ /* sanity check are we exceeding the max number allowed */ if(currentIndex+value->length+1 > _SPREP_MAX_INDEX_VALUE){ - fprintf(stderr, "Too many entries in the mapping table %i. Maximum allowed is %i\n", currentIndex+value->length, _SPREP_MAX_INDEX_VALUE); + fprintf(stderr, "Too many entries in the mapping table %i. Maximum allowed is %i\n", + currentIndex+value->length, _SPREP_MAX_INDEX_VALUE); exit(U_INDEX_OUTOFBOUNDS_ERROR); } /* copy the mapping data */ - if(currentIndex+value->length+1 <= mappingDataCapacity){ - /* write the length */ - if(mappingLength > _SPREP_MAX_INDEX_TOP_LENGTH ){ - /* the cast here is safe since we donot expect the length to be > 65535 */ - mappingData[currentIndex++] = (uint16_t) mappingLength; - } - /* copy the contents to mappindData array */ - uprv_memmove(mappingData+currentIndex, value->mapping, value->length*U_SIZEOF_UCHAR); - currentIndex += value->length; - - }else{ - /* realloc */ - UChar* newMappingData = (uint16_t*) uprv_malloc(U_SIZEOF_UCHAR * mappingDataCapacity*2); - if(newMappingData == NULL){ - fprintf(stderr, "Could not realloc the mapping data!\n"); - exit(U_MEMORY_ALLOCATION_ERROR); - } - uprv_memmove(newMappingData, mappingData, U_SIZEOF_UCHAR * mappingDataCapacity); - mappingDataCapacity *= 2; - uprv_free(mappingData); - mappingData = newMappingData; - /* write the length */ - if(mappingLength > _SPREP_MAX_INDEX_TOP_LENGTH ){ - /* the cast here is safe since we donot expect the length to be > 65535 */ - mappingData[currentIndex++] = (uint16_t) mappingLength; - } - /* continue copying */ - uprv_memmove(mappingData+currentIndex, value->mapping, value->length*U_SIZEOF_UCHAR); - currentIndex += value->length; + /* write the length */ + if(mappingLength > _SPREP_MAX_INDEX_TOP_LENGTH ){ + /* the cast here is safe since we donot expect the length to be > 65535 */ + mappingData[currentIndex++] = (uint16_t) mappingLength; + } + /* copy the contents to mappindData array */ + uprv_memmove(mappingData+currentIndex, value->mapping, value->length*U_SIZEOF_UCHAR); + currentIndex += value->length; + if (currentIndex > mappingDataCapacity) { + /* If this happens there is a bug in the computation of the mapping data size in storeMapping() */ + fprintf(stderr, "gensprep, fatal error at %s, %d. Aborting.\n", __FILE__, __LINE__); + exit(U_INTERNAL_PROGRAM_ERROR); } - } } mappingLength++; @@ -374,14 +356,14 @@ storeMapping(uint32_t codepoint, uint32_t* mapping,int32_t length, UChar* map = NULL; - int16_t adjustedLen=0, i; + int16_t adjustedLen=0, i, j; uint16_t trieWord = 0; ValueStruct *value = NULL; uint32_t savedTrieWord = 0; /* initialize the hashtable */ if(hashTable==NULL){ - hashTable = uhash_open(hashEntry, compareEntries, status); + hashTable = uhash_open(hashEntry, compareEntries, NULL, status); uhash_setValueDeleter(hashTable, valueDeleter); } @@ -403,11 +385,7 @@ storeMapping(uint32_t codepoint, uint32_t* mapping,int32_t length, /* figure out the real length */ for(i=0; i 0xFFFF){ - adjustedLen +=2; - }else{ - adjustedLen++; - } + adjustedLen += U16_LENGTH(mapping[i]); } if(adjustedLen == 0){ @@ -457,24 +435,15 @@ storeMapping(uint32_t codepoint, uint32_t* mapping,int32_t length, */ } - map = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * (adjustedLen+1)); - uprv_memset(map,0,U_SIZEOF_UCHAR * (adjustedLen+1)); - - i=0; + map = (UChar*) uprv_calloc(adjustedLen + 1, U_SIZEOF_UCHAR); - while(imapping = map; - value->type = type; + value->type = type; value->length = adjustedLen; if(value->length > _SPREP_MAX_INDEX_TOP_LENGTH){ mappingDataCapacity++; @@ -496,11 +465,11 @@ extern void storeRange(uint32_t start, uint32_t end, UStringPrepType type,UErrorCode* status){ uint16_t trieWord = 0; - trieWord += (_SPREP_TYPE_THRESHOLD + type); /* the top 4 bits contain the value */ - if(trieWord > 0xFFFF){ + if((int)(_SPREP_TYPE_THRESHOLD + type) > 0xFFFF){ fprintf(stderr,"trieWord cannot contain value greater than 0xFFFF.\n"); exit(U_ILLEGAL_CHAR_FOUND); } + trieWord = (_SPREP_TYPE_THRESHOLD + type); /* the top 4 bits contain the value */ if(start == end){ uint32_t savedTrieWord = utrie_get32(sprepTrie, start, NULL); if(savedTrieWord>0){ @@ -554,12 +523,10 @@ storeRange(uint32_t start, uint32_t end, UStringPrepType type,UErrorCode* status /* folding value: just store the offset (16 bits) if there is any non-0 entry */ static uint32_t U_CALLCONV getFoldedValue(UNewTrie *trie, UChar32 start, int32_t offset) { - uint32_t foldedValue, value; + uint32_t value; UChar32 limit=0; UBool inBlockZero; - foldedValue=0; - limit=start+0x400; while(start