|  | /********************************************************************** | 
|  | * Copyright (C) 1998-2000, International Business Machines Corporation | 
|  | * and others.  All Rights Reserved. | 
|  | **********************************************************************/ | 
|  | #include "ucmpwrit.h" | 
|  | #include <stdio.h> | 
|  |  | 
|  | /* | 
|  | UCMP8 format: | 
|  |  | 
|  | offset   size                    what | 
|  | --------------------------------------------- | 
|  | 0        4                       ICU_UCMP8_VERSION | 
|  | 4        4                       count | 
|  | 8        512*2 = 1024            fIndex [uint16's] (UCMP8_kIndexCount*2) | 
|  | 1032     1*fCount                fArray [int8_t's] | 
|  | +        padding (to extend fCount to the nearest multiple of 4) | 
|  | */ | 
|  |  | 
|  | /* Sanity check. */ | 
|  | #if (UCMP8_kIndexCount != 512) | 
|  | # error UCMP8_kIndexCount - changed size. Check to see if different pading needed. | 
|  | #endif | 
|  |  | 
|  | U_CAPI  uint32_t U_EXPORT2 udata_write_ucmp8 (UNewDataMemory *pData, const CompactByteArray* array) | 
|  | { | 
|  | int32_t size = 0; | 
|  |  | 
|  | udata_write32(pData, ICU_UCMP8_VERSION); | 
|  | size += 4; | 
|  |  | 
|  | udata_write32(pData, array->fCount); | 
|  | size += 4; | 
|  |  | 
|  | udata_writeBlock(pData, array->fIndex, sizeof(array->fIndex[0])*UCMP8_kIndexCount); | 
|  | size += sizeof(array->fIndex[0])*UCMP8_kIndexCount; | 
|  |  | 
|  | udata_writeBlock(pData, array->fArray, sizeof(array->fArray[0])*array->fCount); | 
|  | size += sizeof(array->fArray[0])*array->fCount; | 
|  |  | 
|  | while(size%4) /* end padding */ | 
|  | { | 
|  | udata_writePadding(pData, 1); /* Pad total so far to even size */ | 
|  | size += 1; | 
|  | } | 
|  |  | 
|  | return size; | 
|  | } | 
|  |  | 
|  | /* internal constants*/ | 
|  | #if 0 | 
|  |  | 
|  | static const int32_t UCMP16_kMaxUnicode = UCMP16_kMaxUnicode_int; | 
|  | static const int32_t UCMP16_kUnicodeCount = UCMP16_kUnicodeCount_int; | 
|  | static const int32_t UCMP16_kBlockShift = UCMP16_kBlockShift_int; | 
|  | static const int32_t UCMP16_kBlockCount = UCMP16_kBlockCount_int; | 
|  | static const int32_t UCMP16_kBlockBytes = UCMP16_kBlockBytes_int; | 
|  | static const int32_t UCMP16_kIndexShift = UCMP16_kIndexShift_int; | 
|  | static const int32_t UCMP16_kIndexCount = UCMP16_kIndexCount_int; | 
|  | static const uint32_t UCMP16_kBlockMask = UCMP16_kBlockMask_int; | 
|  |  | 
|  | /* | 
|  | UCMP16 format: | 
|  |  | 
|  | offset   size                    what | 
|  | --------------------------------------------- | 
|  | 0        4                       ICU_UCMP16_VERSION | 
|  | 4        4                       count | 
|  | 8        4                       blockShift | 
|  | 12       4                       blockMask | 
|  | 16       512*2 = 1024            fIndex [uint16's] (UCMP16_kIndexCount*2) | 
|  | 1032     1*fCount                fArray [int16's] | 
|  | +        padding (to extend fCount to the nearest multiple of 4) | 
|  |  | 
|  | */ | 
|  |  | 
|  | #if (UCMP16_kIndexCount_int != 512) | 
|  | # error UCMP16_kIndexCount - changed size. Check to see if different pading needed. | 
|  | #endif | 
|  |  | 
|  | U_CAPI  uint32_t U_EXPORT2 udata_write_ucmp16 (UNewDataMemory *pData, const CompactShortArray* array) | 
|  | { | 
|  | int32_t size = 0; | 
|  |  | 
|  | udata_write32(pData, ICU_UCMP16_VERSION); | 
|  | size += 4; | 
|  |  | 
|  | udata_write32(pData, array->fCount); | 
|  | size += 4; | 
|  |  | 
|  | udata_write32(pData, array->kBlockShift); | 
|  | size += 4; | 
|  |  | 
|  | udata_write32(pData, array->kBlockMask); | 
|  | size += 4; | 
|  |  | 
|  | udata_writeBlock(pData, array->fIndex, sizeof(array->fIndex[0])*UCMP16_kIndexCount); | 
|  | size += sizeof(array->fIndex[0])*UCMP16_kIndexCount; | 
|  |  | 
|  | udata_writeBlock(pData, array->fArray, sizeof(array->fArray[0])*array->fCount); | 
|  | size += sizeof(array->fArray[0])*array->fCount; | 
|  |  | 
|  | while(size%4) /* end padding */ | 
|  | { | 
|  | udata_writePadding(pData, 1); /* Pad total so far to even size */ | 
|  | size += 1; | 
|  | } | 
|  |  | 
|  | return size; | 
|  | } | 
|  |  | 
|  | /* | 
|  | UCMP32 format: | 
|  |  | 
|  |  | 
|  | Add format here | 
|  |  | 
|  |  | 
|  | offset   size                    what | 
|  | --------------------------------------------- | 
|  | 0        4                       ICU_UCMP32_VERSION | 
|  | 4        4                       count | 
|  | 16       512*2 = 1024            fIndex [uint16's] (UCMP16_kIndexCount*2) | 
|  | 1032     1*fCount                fArray [int32's] | 
|  | Padding is not needed for ucmp32, since the array consists of int32's | 
|  | +        padding (to extend fCount to the nearest multiple of 4) | 
|  |  | 
|  | */ | 
|  |  | 
|  | #if (UCMP32_kIndexCount != 512) | 
|  | # error UCMP32_kIndexCount - changed size. Check to see if different pading needed. | 
|  | #endif | 
|  |  | 
|  | U_CAPI  uint32_t U_EXPORT2 udata_write_ucmp32 (UNewDataMemory *pData, const CompactIntArray* array) | 
|  | { | 
|  | int32_t size = 0; | 
|  |  | 
|  | udata_write32(pData, ICU_UCMP32_VERSION); | 
|  | size += 4; | 
|  |  | 
|  | udata_write32(pData, array->fCount); | 
|  | size += 4; | 
|  |  | 
|  | udata_writeBlock(pData, array->fIndex, sizeof(array->fIndex[0])*UCMP32_kIndexCount); | 
|  | size += sizeof(array->fIndex[0])*UCMP32_kIndexCount; | 
|  |  | 
|  | udata_writeBlock(pData, array->fArray, sizeof(array->fArray[0])*array->fCount); | 
|  | size += sizeof(array->fArray[0])*array->fCount; | 
|  |  | 
|  | while(size%4) /* end padding */ | 
|  | { | 
|  | udata_writePadding(pData, 1); /* Pad total so far to even size */ | 
|  | size += 1; | 
|  | } | 
|  |  | 
|  | return size; | 
|  | } | 
|  |  | 
|  | #endif | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  |