| /********************************************************************** |
| * 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 |
| |
| |
| |
| |
| |