static void U_CALLCONV bidiClassLineFn(void *context, char *fields[][2], int32_t fieldCount, UErrorCode *pErrorCode) { char *s; uint32_t start, end, value; /* get the code point range */ u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genbidi: syntax error in DerivedBidiClass.txt field 0 at %s\n", fields[0][0]); exit(*pErrorCode); } /* parse bidi class */ s=trimTerminateField(fields[1][0], fields[1][1]); value=u_getPropertyValueEnum(UCHAR_BIDI_CLASS, s); if((int32_t)value<0) { fprintf(stderr, "genbidi error: unknown bidi class in DerivedBidiClass.txt field 1 at %s\n", s); exit(U_PARSE_ERROR); } upvec_setValue(pv, start, end, 0, value, UBIDI_CLASS_MASK, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genbidi error: unable to set derived bidi class for U+%04x..U+%04x - %s\n", (int)start, (int)end, u_errorName(*pErrorCode)); exit(*pErrorCode); } }
static void U_CALLCONV unicodeDataLineFn(void *context, char *fields[][2], int32_t fieldCount, UErrorCode *pErrorCode) { char *end; UErrorCode errorCode; UChar32 c; errorCode=U_ZERO_ERROR; /* get the character code, field 0 */ c=(UChar32)uprv_strtoul(fields[0][0], &end, 16); if(end<=fields[0][0] || end!=fields[0][1]) { fprintf(stderr, "genbidi: syntax error in field 0 at %s\n", fields[0][0]); *pErrorCode=U_PARSE_ERROR; exit(U_PARSE_ERROR); } /* get Mirrored flag, field 9 */ if(*fields[9][0]=='Y') { upvec_setValue(pv, c, c, 0, U_MASK(UBIDI_IS_MIRRORED_SHIFT), U_MASK(UBIDI_IS_MIRRORED_SHIFT), &errorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genbidi error: unable to set 'is mirrored' for U+%04lx, code: %s\n", (long)c, u_errorName(errorCode)); exit(errorCode); } } else if(fields[9][1]-fields[9][0]!=1 || *fields[9][0]!='N') { fprintf(stderr, "genbidi: syntax error in field 9 at U+%04lx\n", (long)c); *pErrorCode=U_PARSE_ERROR; exit(U_PARSE_ERROR); } }
extern void addCaseSensitive(UChar32 first, UChar32 last) { UErrorCode errorCode=U_ZERO_ERROR; upvec_setValue(pv, first, last, 0, UCASE_SENSITIVE, UCASE_SENSITIVE, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "gencase error: unable to set UCASE_SENSITIVE, code: %s\n", u_errorName(errorCode)); exit(errorCode); } }
static void parseDB(const char *filename, UErrorCode *pErrorCode) { /* default Bidi classes for unassigned code points */ static const UChar32 defaultBidi[][3]={ /* { start, end, class } */ /* R: U+0590..U+05FF, U+07C0..U+08FF, U+FB1D..U+FB4F, U+10800..U+10FFF */ { 0x0590, 0x05FF, U_RIGHT_TO_LEFT }, { 0x07C0, 0x08FF, U_RIGHT_TO_LEFT }, { 0xFB1D, 0xFB4F, U_RIGHT_TO_LEFT }, { 0x10800, 0x10FFF, U_RIGHT_TO_LEFT }, /* AL: U+0600..U+07BF, U+FB50..U+FDCF, U+FDF0..U+FDFF, U+FE70..U+FEFE */ { 0x0600, 0x07BF, U_RIGHT_TO_LEFT_ARABIC }, { 0xFB50, 0xFDCF, U_RIGHT_TO_LEFT_ARABIC }, { 0xFDF0, 0xFDFF, U_RIGHT_TO_LEFT_ARABIC }, { 0xFE70, 0xFEFE, U_RIGHT_TO_LEFT_ARABIC } /* L otherwise */ }; char *fields[15][2]; UChar32 start, end; int32_t i; if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { return; } /* * Set default Bidi classes for unassigned code points. * See the documentation for Bidi_Class in UCD.html in the Unicode data. * http://www.unicode.org/Public/ * * Starting with Unicode 5.0, DerivedBidiClass.txt should (re)set * the Bidi_Class values for all code points including unassigned ones * and including L values for these. * This code becomes unnecesary but harmless. Leave it for now in case * someone uses genbidi on pre-Unicode 5.0 data. */ for(i=0; i<LENGTHOF(defaultBidi); ++i) { start=defaultBidi[i][0]; end=defaultBidi[i][1]; upvec_setValue(pv, start, end, 0, (uint32_t)defaultBidi[i][2], UBIDI_CLASS_MASK, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genbidi error: unable to set default bidi class for U+%04lx..U+%04lx, code: %s\n", (long)start, (long)end, u_errorName(*pErrorCode)); exit(*pErrorCode); } } u_parseDelimitedFile(filename, ';', fields, 15, unicodeDataLineFn, NULL, pErrorCode); if(U_FAILURE(*pErrorCode)) { return; } }
static void U_CALLCONV singleEnumLineFn(void *context, char *fields[][2], int32_t fieldCount, UErrorCode *pErrorCode) { const SingleEnum *sen; char *s; uint32_t start, end, uv; int32_t value; sen=(const SingleEnum *)context; u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genprops: syntax error in %s.txt field 0 at %s\n", sen->ucdFile, fields[0][0]); exit(*pErrorCode); } /* parse property alias */ s=trimTerminateField(fields[1][0], fields[1][1]); value=u_getPropertyValueEnum(sen->prop, s); if(value<0) { if(sen->prop==UCHAR_BLOCK) { if(isToken("Greek", s)) { value=UBLOCK_GREEK; /* Unicode 3.2 renames this to "Greek and Coptic" */ } else if(isToken("Combining Marks for Symbols", s)) { value=UBLOCK_COMBINING_MARKS_FOR_SYMBOLS; /* Unicode 3.2 renames this to "Combining Diacritical Marks for Symbols" */ } else if(isToken("Private Use", s)) { value=UBLOCK_PRIVATE_USE; /* Unicode 3.2 renames this to "Private Use Area" */ } } } if(value<0) { fprintf(stderr, "genprops error: unknown %s name in %s.txt field 1 at %s\n", sen->propName, sen->ucdFile, s); exit(U_PARSE_ERROR); } uv=(uint32_t)(value<<sen->vecShift); if((uv&sen->vecMask)!=uv) { fprintf(stderr, "genprops error: %s value overflow (0x%x) at %s\n", sen->propName, (int)uv, s); exit(U_INTERNAL_PROGRAM_ERROR); } if(start==0 && end==0x10ffff) { /* Also set bits for initialValue and errorValue. */ end=UPVEC_MAX_CP; } upvec_setValue(pv, start, end, sen->vecWord, uv, sen->vecMask, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genprops error: unable to set %s code: %s\n", sen->propName, u_errorName(*pErrorCode)); exit(*pErrorCode); } }
static void U_CALLCONV ageLineFn(void *context, char *fields[][2], int32_t fieldCount, UErrorCode *pErrorCode) { char *s, *numberLimit; uint32_t value, start, end, version; u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genprops: syntax error in DerivedAge.txt field 0 at %s\n", fields[0][0]); exit(*pErrorCode); } /* ignore "unassigned" (the default is already set to 0.0) */ s=(char *)u_skipWhitespace(fields[1][0]); if(0==uprv_strncmp(s, "unassigned", 10)) { return; } /* parse version number */ value=(uint32_t)uprv_strtoul(s, &numberLimit, 10); if(s==numberLimit || value==0 || value>15 || (*numberLimit!='.' && *numberLimit!=' ' && *numberLimit!='\t' && *numberLimit!=0)) { fprintf(stderr, "genprops: syntax error in DerivedAge.txt field 1 at %s\n", fields[1][0]); *pErrorCode=U_PARSE_ERROR; exit(U_PARSE_ERROR); } version=value<<4; /* parse minor version number */ if(*numberLimit=='.') { s=(char *)u_skipWhitespace(numberLimit+1); value=(uint32_t)uprv_strtoul(s, &numberLimit, 10); if(s==numberLimit || value>15 || (*numberLimit!=' ' && *numberLimit!='\t' && *numberLimit!=0)) { fprintf(stderr, "genprops: syntax error in DerivedAge.txt field 1 at %s\n", fields[1][0]); *pErrorCode=U_PARSE_ERROR; exit(U_PARSE_ERROR); } version|=value; } if(start==0 && end==0x10ffff) { /* Also set bits for initialValue and errorValue. */ end=UPVEC_MAX_CP; } upvec_setValue(pv, start, end, 0, version<<UPROPS_AGE_SHIFT, UPROPS_AGE_MASK, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genprops error: unable to set character age: %s\n", u_errorName(*pErrorCode)); exit(*pErrorCode); } }
static void U_CALLCONV binariesLineFn(void *context, char *fields[][2], int32_t fieldCount, UErrorCode *pErrorCode) { const Binaries *bin; char *s; uint32_t start, end, uv; int32_t i; bin=(const Binaries *)context; u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genprops: syntax error in %s.txt field 0 at %s\n", bin->ucdFile, fields[0][0]); exit(*pErrorCode); } /* parse binary property name */ s=(char *)u_skipWhitespace(fields[1][0]); for(i=0;; ++i) { if(i==bin->binariesCount) { /* ignore unrecognized properties */ if(beVerbose) { addIgnoredProp(s, fields[1][1]); } return; } if(isToken(bin->binaries[i].propName, s)) { break; } } if(bin->binaries[i].vecShift>=32) { fprintf(stderr, "genprops error: shift value %d>=32 for %s %s\n", (int)bin->binaries[i].vecShift, bin->ucdFile, bin->binaries[i].propName); exit(U_INTERNAL_PROGRAM_ERROR); } uv=U_MASK(bin->binaries[i].vecShift); if(start==0 && end==0x10ffff) { /* Also set bits for initialValue and errorValue. */ end=UPVEC_MAX_CP; } upvec_setValue(pv, start, end, bin->binaries[i].vecWord, uv, uv, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genprops error: unable to set %s code: %s\n", bin->binaries[i].propName, u_errorName(*pErrorCode)); exit(*pErrorCode); } }
static void U_CALLCONV binariesLineFn(void *context, char *fields[][2], int32_t fieldCount, UErrorCode *pErrorCode) { const Binaries *bin; char *s; uint32_t start, end; int32_t i; bin=(const Binaries *)context; u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genbidi: syntax error in %s.txt field 0 at %s\n", bin->ucdFile, fields[0][0]); exit(*pErrorCode); } /* parse binary property name */ s=(char *)u_skipWhitespace(fields[1][0]); for(i=0;; ++i) { if(i==bin->binariesCount) { /* ignore unrecognized properties */ return; } if(isToken(bin->binaries[i].propName, s)) { break; } } if(bin->binaries[i].vecMask==0) { fprintf(stderr, "genbidi error: mask value %d==0 for %s %s\n", (int)bin->binaries[i].vecMask, bin->ucdFile, bin->binaries[i].propName); exit(U_INTERNAL_PROGRAM_ERROR); } upvec_setValue(pv, start, end, bin->binaries[i].vecWord, bin->binaries[i].vecValue, bin->binaries[i].vecMask, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genbidi error: unable to set %s, code: %s\n", bin->binaries[i].propName, u_errorName(*pErrorCode)); exit(*pErrorCode); } }
extern void addMirror(UChar32 src, UChar32 mirror) { UErrorCode errorCode; int32_t delta; delta=mirror-src; if(delta==0) { return; /* mapping to self=no mapping */ } if(delta<UBIDI_MIN_MIRROR_DELTA || UBIDI_MAX_MIRROR_DELTA<delta) { /* delta does not fit into the trie properties value, store in the mirrors[] table */ if(mirrorTop==LENGTHOF(mirrors)) { fprintf(stderr, "genbidi error: too many long-distance mirroring mappings\n"); exit(U_BUFFER_OVERFLOW_ERROR); } /* possible: search the table so far and see if src is already listed */ mirrors[mirrorTop][0]=(uint32_t)src; mirrors[mirrorTop][1]=(uint32_t)mirror; ++mirrorTop; /* set an escape marker in src's properties */ delta=UBIDI_ESC_MIRROR_DELTA; } errorCode=U_ZERO_ERROR; upvec_setValue( pv, src, src, 0, (uint32_t)delta<<UBIDI_MIRROR_DELTA_SHIFT, (uint32_t)(-1)<<UBIDI_MIRROR_DELTA_SHIFT, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "genbidi error: unable to set mirroring delta, code: %s\n", u_errorName(errorCode)); exit(errorCode); } }
static void generateSelectorData(UConverterSelector* result, UPropsVectors *upvec, const USet* excludedCodePoints, const UConverterUnicodeSet whichSet, UErrorCode* status) { if (U_FAILURE(*status)) { return; } int32_t columns = (result->encodingsCount+31)/32; // set errorValue to all-ones for (int32_t col = 0; col < columns; col++) { upvec_setValue(upvec, UPVEC_ERROR_VALUE_CP, UPVEC_ERROR_VALUE_CP, col, static_cast<uint32_t>(~0), static_cast<uint32_t>(~0), status); } for (int32_t i = 0; i < result->encodingsCount; ++i) { uint32_t mask; uint32_t column; int32_t item_count; int32_t j; UConverter* test_converter = ucnv_open(result->encodings[i], status); if (U_FAILURE(*status)) { return; } USet* unicode_point_set; unicode_point_set = uset_open(1, 0); // empty set ucnv_getUnicodeSet(test_converter, unicode_point_set, whichSet, status); if (U_FAILURE(*status)) { ucnv_close(test_converter); return; } column = i / 32; mask = 1 << (i%32); // now iterate over intervals on set i! item_count = uset_getItemCount(unicode_point_set); for (j = 0; j < item_count; ++j) { UChar32 start_char; UChar32 end_char; UErrorCode smallStatus = U_ZERO_ERROR; uset_getItem(unicode_point_set, j, &start_char, &end_char, NULL, 0, &smallStatus); if (U_FAILURE(smallStatus)) { // this will be reached for the converters that fill the set with // strings. Those should be ignored by our system } else { upvec_setValue(upvec, start_char, end_char, column, static_cast<uint32_t>(~0), mask, status); } } ucnv_close(test_converter); uset_close(unicode_point_set); if (U_FAILURE(*status)) { return; } } // handle excluded encodings! Simply set their values to all 1's in the upvec if (excludedCodePoints) { int32_t item_count = uset_getItemCount(excludedCodePoints); for (int32_t j = 0; j < item_count; ++j) { UChar32 start_char; UChar32 end_char; uset_getItem(excludedCodePoints, j, &start_char, &end_char, NULL, 0, status); for (int32_t col = 0; col < columns; col++) { upvec_setValue(upvec, start_char, end_char, col, static_cast<uint32_t>(~0), static_cast<uint32_t>(~0), status); } } } // alright. Now, let's put things in the same exact form you'd get when you // unserialize things. result->trie = upvec_compactToUTrie2WithRowIndexes(upvec, status); result->pv = upvec_cloneArray(upvec, &result->pvCount, NULL, status); result->pvCount *= columns; // number of uint32_t = rows * columns result->ownPv = TRUE; }
extern void setProps(Props *p) { UErrorCode errorCode; uint32_t value, oldValue; int32_t delta; UBool isCaseIgnorable; /* get the non-UnicodeData.txt properties */ value=oldValue=upvec_getValue(pv, p->code, 0); /* default: map to self */ delta=0; if(p->gc==U_TITLECASE_LETTER) { /* the Titlecase property is read late, from UnicodeData.txt */ value|=UCASE_TITLE; } if(p->upperCase!=0) { /* uppercase mapping as delta if the character is lowercase */ if((value&UCASE_TYPE_MASK)==UCASE_LOWER) { delta=p->upperCase-p->code; } else { value|=UCASE_EXCEPTION; } } if(p->lowerCase!=0) { /* lowercase mapping as delta if the character is uppercase or titlecase */ if((value&UCASE_TYPE_MASK)>=UCASE_UPPER) { delta=p->lowerCase-p->code; } else { value|=UCASE_EXCEPTION; } } if(p->upperCase!=p->titleCase) { value|=UCASE_EXCEPTION; } if(p->closure[0]!=0) { value|=UCASE_EXCEPTION; } if(p->specialCasing!=NULL) { value|=UCASE_EXCEPTION; } if(p->caseFolding!=NULL) { value|=UCASE_EXCEPTION; } if(delta<UCASE_MIN_DELTA || UCASE_MAX_DELTA<delta) { value|=UCASE_EXCEPTION; } if(p->cc!=0) { if(value&UCASE_DOT_MASK) { fprintf(stderr, "gencase: a soft-dotted character has cc!=0\n"); exit(U_INTERNAL_PROGRAM_ERROR); } if(p->cc==230) { value|=UCASE_ABOVE; } else { value|=UCASE_OTHER_ACCENT; } } /* encode case-ignorable as delta==1 on uncased characters */ isCaseIgnorable=FALSE; if((value&UCASE_TYPE_MASK)==UCASE_NONE) { if(ucdVersion>=UNI_4_1) { /* * Unicode 4.1 and up: (D47a) Word_Break=MidLetter or Mn, Me, Cf, Lm, Sk * Unicode 5.1 and up: Word_Break=(MidLetter or MidNumLet) or Mn, Me, Cf, Lm, Sk * The UGENCASE_IS_MID_LETTER_SHIFT bit is set for both WB=MidLetter and WB=MidNumLet. */ if( (U_MASK(p->gc)&(U_GC_MN_MASK|U_GC_ME_MASK|U_GC_CF_MASK|U_GC_LM_MASK|U_GC_SK_MASK))!=0 || (upvec_getValue(pv, p->code, 1)&U_MASK(UGENCASE_IS_MID_LETTER_SHIFT))!=0 ) { isCaseIgnorable=TRUE; } } else { /* before Unicode 4.1: Mn, Me, Cf, Lm, Sk or 0027 or 00AD or 2019 */ if( (U_MASK(p->gc)&(U_GC_MN_MASK|U_GC_ME_MASK|U_GC_CF_MASK|U_GC_LM_MASK|U_GC_SK_MASK))!=0 || p->code==0x27 || p->code==0xad || p->code==0x2019 ) { isCaseIgnorable=TRUE; } } } if(isCaseIgnorable && p->code!=0x307) { /* * We use one of the delta/exception bits, which works because we only * store the case-ignorable flag for uncased characters. * There is no delta for uncased characters (see checks above). * If there is an exception for an uncased, case-ignorable character * (although there should not be any case mappings if it's uncased) * then we have a problem. * There is one character which is case-ignorable but has an exception: * U+0307 is uncased, Mn, has conditional special casing and * is therefore handled in code instead. */ if(value&UCASE_EXCEPTION) { fprintf(stderr, "gencase error: unable to encode case-ignorable for U+%04lx with exceptions\n", (unsigned long)p->code); exit(U_INTERNAL_PROGRAM_ERROR); } delta=1; } /* handle exceptions */ if(value&UCASE_EXCEPTION) { /* simply store exceptions for later processing and encoding */ value|=(uint32_t)exceptionsCount<<UGENCASE_EXC_SHIFT; uprv_memcpy(excProps+exceptionsCount, p, sizeof(*p)); if(++exceptionsCount==MAX_EXC_COUNT) { fprintf(stderr, "gencase: too many exceptions\n"); exit(U_INDEX_OUTOFBOUNDS_ERROR); } } else { /* store the simple case mapping delta */ value|=((uint32_t)delta<<UCASE_DELTA_SHIFT)&UCASE_DELTA_MASK; } errorCode=U_ZERO_ERROR; if(value!=oldValue) { upvec_setValue(pv, p->code, p->code, 0, value, 0xffffffff, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "gencase error: unable to set case mapping values, code: %s\n", u_errorName(errorCode)); exit(errorCode); } } /* add the multi-character case folding to the "unfold" data */ if(p->caseFolding!=NULL) { int32_t length=p->caseFolding->full[0]; if(length>1 && u_strHasMoreChar32Than(p->caseFolding->full+1, length, 1)) { addUnfolding(p->code, p->caseFolding->full+1, length); } } }
U_CFUNC void generateAdditionalProperties(char *filename, const char *suffix, UErrorCode *pErrorCode) { char *basename; basename=filename+uprv_strlen(filename); /* process various UCD .txt files */ /* add Han numeric types & values */ parseMultiFieldFile(filename, basename, "DerivedNumericValues", suffix, 2, numericLineFn, pErrorCode); parseTwoFieldFile(filename, basename, "DerivedAge", suffix, ageLineFn, pErrorCode); /* * UTR 24 says: * Section 2: * "Common - For characters that may be used * within multiple scripts, * or any unassigned code points." * * Section 4: * "The value COMMON is the default value, * given to all code points that are not * explicitly mentioned in the data file." * * COMMON==USCRIPT_COMMON==0 - nothing to do */ parseSingleEnumFile(filename, basename, suffix, &scriptSingleEnum, pErrorCode); parseSingleEnumFile(filename, basename, suffix, &blockSingleEnum, pErrorCode); parseBinariesFile(filename, basename, suffix, &propListBinaries, pErrorCode); parseBinariesFile(filename, basename, suffix, &derCorePropsBinaries, pErrorCode); parseSingleEnumFile(filename, basename, suffix, &graphemeClusterBreakSingleEnum, pErrorCode); parseSingleEnumFile(filename, basename, suffix, &wordBreakSingleEnum, pErrorCode); parseSingleEnumFile(filename, basename, suffix, &sentenceBreakSingleEnum, pErrorCode); /* * LineBreak-4.0.0.txt: * - All code points, assigned and unassigned, that are not listed * explicitly are given the value "XX". * * XX==U_LB_UNKNOWN==0 - nothing to do */ parseSingleEnumFile(filename, basename, suffix, &lineBreakSingleEnum, pErrorCode); /* * Preset East Asian Width defaults: * * http://www.unicode.org/reports/tr11/#Unassigned * 7.1 Unassigned and Private Use characters * * All unassigned characters are by default classified as non-East Asian neutral, * except for the range U+20000 to U+2FFFD, * since all code positions from U+20000 to U+2FFFD are intended for CJK ideographs (W). * All Private use characters are by default classified as ambiguous, * since their definition depends on context. * * N for all ==0 - nothing to do * A for Private Use * W for plane 2 */ *pErrorCode=U_ZERO_ERROR; upvec_setValue(pv, 0xe000, 0xf8ff, 0, (uint32_t)(U_EA_AMBIGUOUS<<UPROPS_EA_SHIFT), UPROPS_EA_MASK, pErrorCode); upvec_setValue(pv, 0xf0000, 0xffffd, 0, (uint32_t)(U_EA_AMBIGUOUS<<UPROPS_EA_SHIFT), UPROPS_EA_MASK, pErrorCode); upvec_setValue(pv, 0x100000, 0x10fffd, 0, (uint32_t)(U_EA_AMBIGUOUS<<UPROPS_EA_SHIFT), UPROPS_EA_MASK, pErrorCode); upvec_setValue(pv, 0x20000, 0x2fffd, 0, (uint32_t)(U_EA_WIDE<<UPROPS_EA_SHIFT), UPROPS_EA_MASK, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genprops: unable to set default East Asian Widths: %s\n", u_errorName(*pErrorCode)); exit(*pErrorCode); } /* parse EastAsianWidth.txt */ parseSingleEnumFile(filename, basename, suffix, &eawSingleEnum, pErrorCode); { UPVecToUTrieContext toUTrie={ NULL, 50000 /* capacity */, 0, TRUE /* latin1Linear */ }; upvec_compact(pv, upvec_compactToUTrieHandler, &toUTrie, pErrorCode); if(U_FAILURE(*pErrorCode)) { fprintf(stderr, "genprops error: unable to build trie for additional properties: %s\n", u_errorName(*pErrorCode)); exit(*pErrorCode); } newTrie=toUTrie.newTrie; } }