From 343d4b3e58710cb80e0a8c60894c3e7c8072cf8f Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Wed, 15 Dec 1999 05:14:03 +0000 Subject: [PATCH] ICU-157 UDATA updates for Machines with Alignment Problems, and to align cnv/ucmp data. X-SVN-Rev: 416 --- icu4c/source/common/ucmp16.c | 4 + icu4c/source/common/ucmp8.c | 22 ++-- icu4c/source/common/ucnv_bld.c | 20 +++- icu4c/source/common/udata.c | 5 +- icu4c/source/tools/genccode/genccode.c | 12 +- icu4c/source/tools/makeconv/makeconv.c | 154 +++++-------------------- icu4c/source/tools/toolutil/ucmpwrit.c | 43 ++++++- icu4c/source/tools/toolutil/ucmpwrit.h | 15 ++- 8 files changed, 123 insertions(+), 152 deletions(-) diff --git a/icu4c/source/common/ucmp16.c b/icu4c/source/common/ucmp16.c index 8318a4642ca..8d5b5cc909c 100644 --- a/icu4c/source/common/ucmp16.c +++ b/icu4c/source/common/ucmp16.c @@ -465,6 +465,10 @@ U_CAPI CompactShortArray * U_EXPORT2 ucmp16_cloneFromData(const uint8_t **sourc array->fAlias = TRUE; + /* eat up padding */ + while((*source-((uint8_t*)oldArray))%4) + (*source)++; + return array; } diff --git a/icu4c/source/common/ucmp8.c b/icu4c/source/common/ucmp8.c index 1133bc7e28e..0ac65d4489b 100644 --- a/icu4c/source/common/ucmp8.c +++ b/icu4c/source/common/ucmp8.c @@ -416,17 +416,19 @@ U_CAPI CompactByteArray * U_EXPORT2 ucmp8_cloneFromData(const uint8_t **source, array->fArray = (const int8_t*)*source; *source += (sizeof(int8_t)*array->fCount); + if(((*source)-((const uint8_t*)oldArray)) & 1 ) + { + (*source)++; + } + array->fIndex = (const uint16_t*)*source; *source += (sizeof(uint16_t)*UCMP8_kIndexCount); - + + + /* eat up padding */ + while((*source-((uint8_t*)oldArray))%4) + (*source)++; + + return array; } - - - - - - - - - diff --git a/icu4c/source/common/ucnv_bld.c b/icu4c/source/common/ucnv_bld.c index 8ecd5b3a187..d367cdaaf82 100644 --- a/icu4c/source/common/ucnv_bld.c +++ b/icu4c/source/common/ucnv_bld.c @@ -280,7 +280,7 @@ isCnvAcceptable(void *context, pInfo->dataFormat[1]==0x6e && pInfo->dataFormat[2]==0x76 && pInfo->dataFormat[3]==0x74 && - pInfo->formatVersion[0]==1; + pInfo->formatVersion[0]==2; } #define DATA_TYPE "cnv" @@ -960,7 +960,7 @@ UConverter * UConverterSharedData* ucnv_data_unFlattenClone(const UConverterSharedData *source, UErrorCode *status) { - const uint8_t *raw; + const uint8_t *raw, *oldraw; UConverterSharedData *data = NULL; if(U_FAILURE(*status)) @@ -994,8 +994,14 @@ UConverterSharedData* ucnv_data_unFlattenClone(const UConverterSharedData *sourc case UCNV_EBCDIC_STATEFUL: case UCNV_DBCS: data->table = icu_malloc(sizeof(UConverterDBCSTable)); - data->table->dbcs. -toUnicode=ucmp16_cloneFromData(&raw, status); + + oldraw = raw; + + data->table->dbcs.toUnicode=ucmp16_cloneFromData(&raw, status); + + while((raw-oldraw)%4) /* pad to 4 */ + raw++; + data->table->dbcs.fromUnicode =ucmp16_cloneFromData(&raw, status); break; @@ -1006,7 +1012,13 @@ toUnicode=ucmp16_cloneFromData(&raw, status); data->table->mbcs.starters = (bool_t*)raw; raw += sizeof(bool_t)*256; + oldraw = raw; + data->table->mbcs.toUnicode = ucmp16_cloneFromData(&raw, status); + + while((raw-oldraw)%4) /* pad to 4 */ + raw++; + data->table->mbcs.fromUnicode = ucmp16_cloneFromData(&raw, status); break; diff --git a/icu4c/source/common/udata.c b/icu4c/source/common/udata.c index 9a5c61d906e..85a50ee53c3 100644 --- a/icu4c/source/common/udata.c +++ b/icu4c/source/common/udata.c @@ -111,7 +111,8 @@ getChoice(Library lib, const char *entry, #define LIB_SUFFIX ".dll" -#define GET_ENTRY(lib, entryName) (MappedData *)GetProcAddress(lib, entryName) +/* skip the bogus double */ +#define GET_ENTRY(lib, entryName) (MappedData *)(((double*)GetProcAddress(lib, entryName))+1) #define NO_LIBRARY NULL #define IS_LIBRARY(lib) ((lib)!=NULL) @@ -259,7 +260,7 @@ getChoice(Library lib, const char *entry, UDataMemoryIsAcceptable *isAcceptable, void *context, UErrorCode *pErrorCode); -#define GET_ENTRY(lib, entryName) (MappedData *)dlsym(lib, entryName) +#define GET_ENTRY(lib, entryName) (MappedData *)(((double*)dlsym(lib, entryName))+1) #define NO_LIBRARY NULL #define IS_LIBRARY(lib) ((lib)!=NULL) diff --git a/icu4c/source/tools/genccode/genccode.c b/icu4c/source/tools/genccode/genccode.c index 6cf6eb9cdbf..c1b61bb91ac 100644 --- a/icu4c/source/tools/genccode/genccode.c +++ b/icu4c/source/tools/genccode/genccode.c @@ -80,8 +80,12 @@ writeCCode(const char *filename) { exit(U_FILE_ACCESS_ERROR); } - T_FileStream_writeLine(out, "#include \"utypes.h\"\nU_CAPI const uint8_t U_EXPORT2 "); + T_FileStream_writeLine(out, "#include \"utypes.h\"\nU_CAPI const struct U_EXPORT2 {\n double bogus;\n uint8_t bytes "); + T_FileStream_writeLine(out, "["); + sprintf(buffer, "%d", T_FileStream_size(in) ); + T_FileStream_writeLine(out, buffer); + T_FileStream_writeLine(out, "]; \n} "); for(i=0;ikBlockShift; - - /*streams out the length of the arrays to come*/ - myValuesCount = myArray->fCount; - T_FileStream_write(outfile, &myValuesCount, sizeof(int32_t)); - T_FileStream_write(outfile, &myIndexCount, sizeof(int32_t)); - T_FileStream_write(outfile, &myBlockShift, sizeof(int32_t)); - - /*Gets pointers to the internal arrays*/ - myShortArray = myArray->fArray; - myIndexArray = myArray->fIndex; - - /*streams out the 2 arrays*/ - T_FileStream_write(outfile, myShortArray, myValuesCount*sizeof(int16_t)); - T_FileStream_write(outfile, myIndexArray, myIndexCount*sizeof(uint16_t)); - - - return ; -} - -void writeCompactByteArrayToFile(FileStream* outfile, const CompactByteArray* myArray) -{ - int32_t i = 0; - const int8_t* myByteArray = NULL; - const uint16_t* myIndexArray = NULL; - int32_t myValuesCount = 0; - int32_t myIndexCount = ucmp8_getkUnicodeCount() / ucmp8_getkBlockCount(); - - /*streams out the length of the arrays to come*/ - myValuesCount = ucmp8_getCount(myArray); - T_FileStream_write(outfile, &myValuesCount, sizeof(int32_t)); - T_FileStream_write(outfile, &myIndexCount, sizeof(int32_t)); - - /*Gets pointers to the internal arrays*/ - myByteArray = myArray->fArray; - myIndexArray = myArray->fIndex; - - /*streams out the 2 arrays*/ - T_FileStream_write(outfile, myByteArray, myValuesCount*sizeof(int8_t)); - T_FileStream_write(outfile, myIndexArray, myIndexCount*sizeof(uint16_t)); - - return ; -} - -void writeUConverterSharedDataToFile(const char* filename, - UConverterSharedData* mySharedData, - UErrorCode* err) -{ - int32_t i = 0; - const int8_t* myByteArray = NULL; - const uint16_t* myIndexArray = NULL; - int32_t myValuesCount = 0; - int32_t myIndexCount = 0; - int32_t myCheck = UCNV_FILE_CHECK_MARKER; - FileStream* outfile = NULL; - UConverterTable* myTableAlias = NULL; - - if (U_FAILURE(*err)) return; - - outfile = T_FileStream_open(filename, "wb"); - if (outfile == NULL) - { - *err = U_FILE_ACCESS_ERROR; - return; - } - - /*Writes a Sentinel value*/ - T_FileStream_write(outfile, &myCheck, sizeof(int32_t)); - T_FileStream_write(outfile, U_COPYRIGHT_STRING, U_COPYRIGHT_STRING_LENGTH); - - /*Writes NULL in places where there is a pointer in order - *to enable bitwise equivalence of binary files - */ - myTableAlias = mySharedData->table; - mySharedData->table = NULL; - T_FileStream_write(outfile, mySharedData, sizeof(UConverterSharedData)); - mySharedData->table = myTableAlias; - - switch (mySharedData->conversionType) - { - case UCNV_SBCS : - { - T_FileStream_write(outfile, mySharedData->table->sbcs.toUnicode, 256*sizeof(UChar)); - writeCompactByteArrayToFile(outfile, mySharedData->table->sbcs.fromUnicode); - }break; - case UCNV_DBCS : case UCNV_EBCDIC_STATEFUL: - { - writeCompactShortArrayToFile(outfile, mySharedData->table->dbcs.toUnicode); - writeCompactShortArrayToFile(outfile, mySharedData->table->dbcs.fromUnicode); - }break; - case UCNV_MBCS : - { - T_FileStream_write(outfile, mySharedData->table->mbcs.starters, 256*sizeof(bool_t)); - writeCompactShortArrayToFile(outfile, mySharedData->table->mbcs.toUnicode); - writeCompactShortArrayToFile(outfile, mySharedData->table->mbcs.fromUnicode); - }break; - - }; - - if (T_FileStream_error(outfile)) - { - *err = U_FILE_ACCESS_ERROR; - } - T_FileStream_close(outfile); -} - - void copyPlatformString(char* platformString, UConverterPlatform pltfrm) { switch (pltfrm) @@ -892,30 +777,47 @@ UConverterSharedData* createConverterFromTableFile(const char* converterName, UE static void WriteConverterSharedData(UNewDataMemory *pData, const UConverterSharedData* data) { - udata_writeBlock(pData, data, sizeof(UConverterSharedData)); + uint32_t size = 0; + + udata_writeBlock(pData, data, sizeof(UConverterSharedData)); - switch (data->conversionType) + size += sizeof(UConverterSharedData); /* Is 4-aligned- it ends with a pointer */ + + switch (data->conversionType) { case UCNV_SBCS: - { + { udata_writeBlock(pData, (void*)data->table->sbcs.toUnicode, sizeof(UChar)*256); - udata_write_ucmp8(pData, data->table->sbcs.fromUnicode); + size += udata_write_ucmp8(pData, data->table->sbcs.fromUnicode); + size += sizeof(UChar)*256; + /* don't care aboutalignment */ } - break; - + break; + case UCNV_DBCS: case UCNV_EBCDIC_STATEFUL: { - udata_write_ucmp16(pData,data->table->dbcs.toUnicode); - udata_write_ucmp16(pData,data->table->dbcs.fromUnicode); + size += udata_write_ucmp16(pData,data->table->dbcs.toUnicode); + if(size%4) + { + udata_writePadding(pData, 4-(size%4) ); + size+= 4-(size%4); + } + size += udata_write_ucmp16(pData,data->table->dbcs.fromUnicode); } break; case UCNV_MBCS: { udata_writeBlock(pData, data->table->mbcs.starters, 256*sizeof(bool_t)); - udata_write_ucmp16(pData,data->table->mbcs.toUnicode); - udata_write_ucmp16(pData,data->table->mbcs.fromUnicode); + size += 256*sizeof(bool_t); + size += udata_write_ucmp16(pData,data->table->mbcs.toUnicode); + if(size%4) + { + udata_writePadding(pData, 4-(size%4) ); + size+= 4-(size%4); + } + size += udata_write_ucmp16(pData,data->table->mbcs.fromUnicode); } break; diff --git a/icu4c/source/tools/toolutil/ucmpwrit.c b/icu4c/source/tools/toolutil/ucmpwrit.c index 5a2fd9688de..91f0a59c4d5 100644 --- a/icu4c/source/tools/toolutil/ucmpwrit.c +++ b/icu4c/source/tools/toolutil/ucmpwrit.c @@ -1,11 +1,31 @@ #include "ucmpwrit.h" #include -U_CAPI void U_EXPORT2 udata_write_ucmp8 (UNewDataMemory *pData, const CompactByteArray* array) +U_CAPI uint32_t U_EXPORT2 udata_write_ucmp8 (UNewDataMemory *pData, const CompactByteArray* array) { + uint32_t size = sizeof(*array); + udata_writeBlock(pData, array, sizeof(*array)); udata_writeBlock(pData, array->fArray, sizeof(array->fArray[0])*array->fCount); + size += sizeof(array->fArray[0])*array->fCount; + + if((sizeof(*array)+(sizeof(array->fArray[0])*array->fCount))&1) + { + udata_writePadding(pData, 1); /* Pad total so far to even size */ + size += 1; + } + udata_writeBlock(pData, array->fIndex, sizeof(array->fIndex[0])*UCMP8_kIndexCount); + size += sizeof(array->fIndex[0])*UCMP8_kIndexCount; + + + while(size%4) /* end padding */ + { + udata_writePadding(pData, 1); /* Pad total so far to even size */ + size += 1; + } + + return size; } /* internal constants*/ @@ -29,11 +49,30 @@ const int32_t UCMP16_kIndexCount = UCMP16_kIndexCount_int; const uint32_t UCMP16_kBlockMask = UCMP16_kBlockMask_int; -U_CAPI void U_EXPORT2 udata_write_ucmp16 (UNewDataMemory *pData, const CompactShortArray* array) +U_CAPI uint32_t U_EXPORT2 udata_write_ucmp16 (UNewDataMemory *pData, const CompactShortArray* array) { + uint32_t size = sizeof(*array); + udata_writeBlock(pData, array, sizeof(*array)); + + if(sizeof(*array)&1) + { + udata_writePadding(pData, 1); /* Pad to even size */ + size++; + } + udata_writeBlock(pData, array->fArray, sizeof(array->fArray[0])*array->fCount); + size += sizeof(array->fArray[0])*array->fCount; udata_writeBlock(pData, array->fIndex, sizeof(array->fIndex[0])*UCMP16_kIndexCount); + size += sizeof(array->fIndex[0])*UCMP16_kIndexCount; + + while(size%4) /* end padding */ + { + udata_writePadding(pData, 1); /* Pad total so far to even size */ + size += 1; + } + + return size; } diff --git a/icu4c/source/tools/toolutil/ucmpwrit.h b/icu4c/source/tools/toolutil/ucmpwrit.h index 60f4492d15c..2c48a4bc542 100644 --- a/icu4c/source/tools/toolutil/ucmpwrit.h +++ b/icu4c/source/tools/toolutil/ucmpwrit.h @@ -6,7 +6,8 @@ *********************************************************************/ /** - API's for writing UCMPs + API's for writing UCMPs. + Return nbytes written. */ #ifndef _UCMPWRIT @@ -19,12 +20,18 @@ #include "ucmp16.h" #include "ucmp32.h" -U_CAPI void U_EXPORT2 udata_write_ucmp8 (UNewDataMemory *pData, const CompactByteArray* array); +U_CAPI uint32_t U_EXPORT2 udata_write_ucmp8 (UNewDataMemory *pData, const CompactByteArray* array); -U_CAPI void U_EXPORT2 udata_write_ucmp16(UNewDataMemory *pData, const CompactShortArray* array); +U_CAPI uint32_t U_EXPORT2 udata_write_ucmp16(UNewDataMemory *pData, const CompactShortArray* array); /*Not implemented. [yet] */ -/*U_CAPI void U_EXPORT2 udata_write_ucmp32(UNewDataMemory *pData, const CompactIntArray* array);*/ +/*U_CAPI uint32_t U_EXPORT2 udata_write_ucmp32(UNewDataMemory *pData, const CompactIntArray* array);*/ #endif + + + + + +