| OLD | NEW |
| 1 /* | 1 /* |
| 2 ******************************************************************************* | 2 ******************************************************************************* |
| 3 * | 3 * |
| 4 * Copyright (C) 2003-2013, International Business Machines | 4 * Copyright (C) 2003-2014, International Business Machines |
| 5 * Corporation and others. All Rights Reserved. | 5 * Corporation and others. All Rights Reserved. |
| 6 * | 6 * |
| 7 ******************************************************************************* | 7 ******************************************************************************* |
| 8 * file name: gencnvex.c | 8 * file name: gencnvex.c |
| 9 * encoding: US-ASCII | 9 * encoding: US-ASCII |
| 10 * tab size: 8 (not used) | 10 * tab size: 8 (not used) |
| 11 * indentation:4 | 11 * indentation:4 |
| 12 * | 12 * |
| 13 * created on: 2003oct12 | 13 * created on: 2003oct12 |
| 14 * created by: Markus W. Scherer | 14 * created by: Markus W. Scherer |
| 15 */ | 15 */ |
| 16 | 16 |
| 17 #include <stdio.h> | 17 #include <stdio.h> |
| 18 #include "unicode/utypes.h" | 18 #include "unicode/utypes.h" |
| 19 #include "unicode/ustring.h" | 19 #include "unicode/ustring.h" |
| 20 #include "cstring.h" | 20 #include "cstring.h" |
| 21 #include "cmemory.h" | 21 #include "cmemory.h" |
| 22 #include "ucnv_cnv.h" | 22 #include "ucnv_cnv.h" |
| 23 #include "ucnvmbcs.h" | 23 #include "ucnvmbcs.h" |
| 24 #include "toolutil.h" | 24 #include "toolutil.h" |
| 25 #include "unewdata.h" | 25 #include "unewdata.h" |
| 26 #include "ucm.h" | 26 #include "ucm.h" |
| 27 #include "makeconv.h" | 27 #include "makeconv.h" |
| 28 #include "genmbcs.h" | 28 #include "genmbcs.h" |
| 29 | 29 |
| 30 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) | |
| 31 | |
| 32 | |
| 33 static void | 30 static void |
| 34 CnvExtClose(NewConverter *cnvData); | 31 CnvExtClose(NewConverter *cnvData); |
| 35 | 32 |
| 36 static UBool | 33 static UBool |
| 37 CnvExtIsValid(NewConverter *cnvData, | 34 CnvExtIsValid(NewConverter *cnvData, |
| 38 const uint8_t *bytes, int32_t length); | 35 const uint8_t *bytes, int32_t length); |
| 39 | 36 |
| 40 static UBool | 37 static UBool |
| 41 CnvExtAddTable(NewConverter *cnvData, UCMTable *table, UConverterStaticData *sta
ticData); | 38 CnvExtAddTable(NewConverter *cnvData, UCMTable *table, UConverterStaticData *sta
ticData); |
| 42 | 39 |
| (...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 842 if(extData->stage1[i1]==0) { | 839 if(extData->stage1[i1]==0) { |
| 843 /* allocate another block in stage 2; overlap with the previous block */ | 840 /* allocate another block in stage 2; overlap with the previous block */ |
| 844 newBlock=extData->stage2Top; | 841 newBlock=extData->stage2Top; |
| 845 min=newBlock-nextOffset; /* minimum block start with overlap */ | 842 min=newBlock-nextOffset; /* minimum block start with overlap */ |
| 846 while(min<newBlock && extData->stage2[newBlock-1]==0) { | 843 while(min<newBlock && extData->stage2[newBlock-1]==0) { |
| 847 --newBlock; | 844 --newBlock; |
| 848 } | 845 } |
| 849 | 846 |
| 850 extData->stage1[i1]=(uint16_t)newBlock; | 847 extData->stage1[i1]=(uint16_t)newBlock; |
| 851 extData->stage2Top=newBlock+MBCS_STAGE_2_BLOCK_SIZE; | 848 extData->stage2Top=newBlock+MBCS_STAGE_2_BLOCK_SIZE; |
| 852 if(extData->stage2Top>LENGTHOF(extData->stage2)) { | 849 if(extData->stage2Top>UPRV_LENGTHOF(extData->stage2)) { |
| 853 fprintf(stderr, "error: too many stage 2 entries at U+%04x\n", (int)
c); | 850 fprintf(stderr, "error: too many stage 2 entries at U+%04x\n", (int)
c); |
| 854 exit(U_MEMORY_ALLOCATION_ERROR); | 851 exit(U_MEMORY_ALLOCATION_ERROR); |
| 855 } | 852 } |
| 856 } | 853 } |
| 857 | 854 |
| 858 i2=extData->stage1[i1]+nextOffset; | 855 i2=extData->stage1[i1]+nextOffset; |
| 859 nextOffset=c&0xf; | 856 nextOffset=c&0xf; |
| 860 | 857 |
| 861 if(extData->stage2[i2]==0) { | 858 if(extData->stage2[i2]==0) { |
| 862 /* allocate another block in stage 3; overlap with the previous block */ | 859 /* allocate another block in stage 3; overlap with the previous block */ |
| 863 newBlock=extData->stage3Top; | 860 newBlock=extData->stage3Top; |
| 864 min=newBlock-nextOffset; /* minimum block start with overlap */ | 861 min=newBlock-nextOffset; /* minimum block start with overlap */ |
| 865 while(min<newBlock && extData->stage3[newBlock-1]==0) { | 862 while(min<newBlock && extData->stage3[newBlock-1]==0) { |
| 866 --newBlock; | 863 --newBlock; |
| 867 } | 864 } |
| 868 | 865 |
| 869 /* round up to a multiple of stage 3 granularity >1 (similar to utrie.c)
*/ | 866 /* round up to a multiple of stage 3 granularity >1 (similar to utrie.c)
*/ |
| 870 newBlock=(newBlock+(UCNV_EXT_STAGE_3_GRANULARITY-1))&~(UCNV_EXT_STAGE_3_
GRANULARITY-1); | 867 newBlock=(newBlock+(UCNV_EXT_STAGE_3_GRANULARITY-1))&~(UCNV_EXT_STAGE_3_
GRANULARITY-1); |
| 871 extData->stage2[i2]=(uint16_t)(newBlock>>UCNV_EXT_STAGE_2_LEFT_SHIFT); | 868 extData->stage2[i2]=(uint16_t)(newBlock>>UCNV_EXT_STAGE_2_LEFT_SHIFT); |
| 872 | 869 |
| 873 extData->stage3Top=newBlock+MBCS_STAGE_3_BLOCK_SIZE; | 870 extData->stage3Top=newBlock+MBCS_STAGE_3_BLOCK_SIZE; |
| 874 if(extData->stage3Top>LENGTHOF(extData->stage3)) { | 871 if(extData->stage3Top>UPRV_LENGTHOF(extData->stage3)) { |
| 875 fprintf(stderr, "error: too many stage 3 entries at U+%04x\n", (int)
c); | 872 fprintf(stderr, "error: too many stage 3 entries at U+%04x\n", (int)
c); |
| 876 exit(U_MEMORY_ALLOCATION_ERROR); | 873 exit(U_MEMORY_ALLOCATION_ERROR); |
| 877 } | 874 } |
| 878 } | 875 } |
| 879 | 876 |
| 880 i3=((int32_t)extData->stage2[i2]<<UCNV_EXT_STAGE_2_LEFT_SHIFT)+nextOffset; | 877 i3=((int32_t)extData->stage2[i2]<<UCNV_EXT_STAGE_2_LEFT_SHIFT)+nextOffset; |
| 881 /* | 878 /* |
| 882 * assume extData->stage3[i3]==0 because we get | 879 * assume extData->stage3[i3]==0 because we get |
| 883 * code points in strictly ascending order | 880 * code points in strictly ascending order |
| 884 */ | 881 */ |
| (...skipping 23 matching lines...) Expand all Loading... |
| 908 extData->stage2[i2]=extData->stage3Sub1Block; | 905 extData->stage2[i2]=extData->stage3Sub1Block; |
| 909 extData->stage3Top-=MBCS_STAGE_3_BLOCK_SIZE; | 906 extData->stage3Top-=MBCS_STAGE_3_BLOCK_SIZE; |
| 910 uprv_memset(extData->stage3+extData->stage3Top, 0, MBCS_STAG
E_3_BLOCK_SIZE*2); | 907 uprv_memset(extData->stage3+extData->stage3Top, 0, MBCS_STAG
E_3_BLOCK_SIZE*2); |
| 911 } else { | 908 } else { |
| 912 /* remember this block's stage2 entry */ | 909 /* remember this block's stage2 entry */ |
| 913 extData->stage3Sub1Block=extData->stage2[i2]; | 910 extData->stage3Sub1Block=extData->stage2[i2]; |
| 914 } | 911 } |
| 915 } | 912 } |
| 916 } | 913 } |
| 917 } else { | 914 } else { |
| 918 if((i3b=extData->stage3bTop++)>=LENGTHOF(extData->stage3b)) { | 915 if((i3b=extData->stage3bTop++)>=UPRV_LENGTHOF(extData->stage3b)) { |
| 919 fprintf(stderr, "error: too many stage 3b entries at U+%04x\n", (int
)c); | 916 fprintf(stderr, "error: too many stage 3b entries at U+%04x\n", (int
)c); |
| 920 exit(U_MEMORY_ALLOCATION_ERROR); | 917 exit(U_MEMORY_ALLOCATION_ERROR); |
| 921 } | 918 } |
| 922 | 919 |
| 923 /* roundtrip or fallback mapping */ | 920 /* roundtrip or fallback mapping */ |
| 924 extData->stage3[i3]=(uint16_t)i3b; | 921 extData->stage3[i3]=(uint16_t)i3b; |
| 925 extData->stage3b[i3b]=value; | 922 extData->stage3b[i3b]=value; |
| 926 } | 923 } |
| 927 } | 924 } |
| 928 | 925 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1070 * assume that the table is sorted | 1067 * assume that the table is sorted |
| 1071 * | 1068 * |
| 1072 * call the functions in this order because | 1069 * call the functions in this order because |
| 1073 * makeToUTable() modifies the original reverseMap, | 1070 * makeToUTable() modifies the original reverseMap, |
| 1074 * makeFromUTable() writes a whole new mapping into reverseMap | 1071 * makeFromUTable() writes a whole new mapping into reverseMap |
| 1075 */ | 1072 */ |
| 1076 return | 1073 return |
| 1077 makeToUTable(extData, table) && | 1074 makeToUTable(extData, table) && |
| 1078 makeFromUTable(extData, table); | 1075 makeFromUTable(extData, table); |
| 1079 } | 1076 } |
| OLD | NEW |