/* Improve code coverage of UPropsVectors */ static void TestUPropsVector() { UErrorCode errorCode = U_ILLEGAL_ARGUMENT_ERROR; UPropsVectors *pv = upvec_open(100, &errorCode); if (pv != NULL) { log_err("Should have returned NULL if UErrorCode is an error."); return; } errorCode = U_ZERO_ERROR; pv = upvec_open(-1, &errorCode); if (pv != NULL || U_SUCCESS(errorCode)) { log_err("Should have returned NULL if column is less than 0.\n"); return; } errorCode = U_ZERO_ERROR; pv = upvec_open(100, &errorCode); if (pv == NULL || U_FAILURE(errorCode)) { log_err("Unable to open UPropsVectors.\n"); return; } if (upvec_getValue(pv, 0, 1) != 0) { log_err("upvec_getValue should return 0.\n"); } if (upvec_getRow(pv, 0, NULL, NULL) == NULL) { log_err("upvec_getRow should not return NULL.\n"); } if (upvec_getArray(pv, NULL, NULL) != NULL) { log_err("upvec_getArray should return NULL.\n"); } upvec_close(pv); }
U_CFUNC void initAdditionalProperties() { UErrorCode errorCode=U_ZERO_ERROR; pv=upvec_open(UPROPS_VECTOR_WORDS, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "error: upvec_open() failed - %s\n", u_errorName(errorCode)); exit(errorCode); } }
/* open a selector. If converterListSize is 0, build for all converters. If excludedCodePoints is NULL, don't exclude any codepoints */ U_CAPI UConverterSelector* U_EXPORT2 ucnvsel_open(const char* const* converterList, int32_t converterListSize, const USet* excludedCodePoints, const UConverterUnicodeSet whichSet, UErrorCode* status) { // check if already failed if (U_FAILURE(*status)) { return NULL; } // ensure args make sense! if (converterListSize < 0 || (converterList == NULL && converterListSize != 0)) { *status = U_ILLEGAL_ARGUMENT_ERROR; return NULL; } // allocate a new converter LocalUConverterSelectorPointer newSelector( (UConverterSelector*)uprv_malloc(sizeof(UConverterSelector))); if (newSelector.isNull()) { *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } uprv_memset(newSelector.getAlias(), 0, sizeof(UConverterSelector)); if (converterListSize == 0) { converterList = NULL; converterListSize = ucnv_countAvailable(); } newSelector->encodings = (char**)uprv_malloc(converterListSize * sizeof(char*)); if (!newSelector->encodings) { *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } newSelector->encodings[0] = NULL; // now we can call ucnvsel_close() // make a backup copy of the list of converters int32_t totalSize = 0; int32_t i; for (i = 0; i < converterListSize; i++) { totalSize += (int32_t)uprv_strlen(converterList != NULL ? converterList[i] : ucnv_getAvailableName(i)) + 1; } // 4-align the totalSize to 4-align the size of the serialized form int32_t encodingStrPadding = totalSize & 3; if (encodingStrPadding != 0) { encodingStrPadding = 4 - encodingStrPadding; } newSelector->encodingStrLength = totalSize += encodingStrPadding; char* allStrings = (char*) uprv_malloc(totalSize); if (!allStrings) { *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } for (i = 0; i < converterListSize; i++) { newSelector->encodings[i] = allStrings; uprv_strcpy(newSelector->encodings[i], converterList != NULL ? converterList[i] : ucnv_getAvailableName(i)); allStrings += uprv_strlen(newSelector->encodings[i]) + 1; } while (encodingStrPadding > 0) { *allStrings++ = 0; --encodingStrPadding; } newSelector->ownEncodingStrings = TRUE; newSelector->encodingsCount = converterListSize; UPropsVectors *upvec = upvec_open((converterListSize+31)/32, status); generateSelectorData(newSelector.getAlias(), upvec, excludedCodePoints, whichSet, status); upvec_close(upvec); if (U_FAILURE(*status)) { return NULL; } return newSelector.orphan(); }
extern int main(int argc, char* argv[]) { char filename[300]; const char *srcDir=NULL, *destDir=NULL, *suffix=NULL; char *basename=NULL; UErrorCode errorCode=U_ZERO_ERROR; U_MAIN_INIT_ARGS(argc, argv); /* preset then read command line options */ options[DESTDIR].value=u_getDataDirectory(); options[SOURCEDIR].value=""; options[UNICODE_VERSION].value=""; options[ICUDATADIR].value=u_getDataDirectory(); argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); /* error handling, printing usage message */ if(argc<0) { fprintf(stderr, "error in command line argument \"%s\"\n", argv[-argc]); } if(argc<0 || options[HELP_H].doesOccur || options[HELP_QUESTION_MARK].doesOccur) { /* * Broken into chucks because the C89 standard says the minimum * required supported string length is 509 bytes. */ fprintf(stderr, "Usage: %s [-options] [suffix]\n" "\n" "read the UnicodeData.txt file and other Unicode properties files and\n" "create a binary file " UBIDI_DATA_NAME "." UBIDI_DATA_TYPE " with the bidi/shaping properties\n" "\n", argv[0]); fprintf(stderr, "Options:\n" "\t-h or -? or --help this usage text\n" "\t-v or --verbose verbose output\n" "\t-c or --copyright include a copyright notice\n" "\t-u or --unicode Unicode version, followed by the version like 3.0.0\n" "\t-C or --csource generate a .c source file rather than the .icu binary\n"); fprintf(stderr, "\t-d or --destdir destination directory, followed by the path\n" "\t-s or --sourcedir source directory, followed by the path\n" "\t-i or --icudatadir directory for locating any needed intermediate data files,\n" "\t followed by path, defaults to %s\n" "\tsuffix suffix that is to be appended with a '-'\n" "\t to the source file basenames before opening;\n" "\t 'genbidi new' will read UnicodeData-new.txt etc.\n", u_getDataDirectory()); return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; } /* get the options values */ beVerbose=options[VERBOSE].doesOccur; haveCopyright=options[COPYRIGHT].doesOccur; srcDir=options[SOURCEDIR].value; destDir=options[DESTDIR].value; if(argc>=2) { suffix=argv[1]; } else { suffix=NULL; } if(options[UNICODE_VERSION].doesOccur) { setUnicodeVersion(options[UNICODE_VERSION].value); } /* else use the default dataVersion in store.c */ if (options[ICUDATADIR].doesOccur) { u_setDataDirectory(options[ICUDATADIR].value); } /* prepare the filename beginning with the source dir */ uprv_strcpy(filename, srcDir); basename=filename+uprv_strlen(filename); if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) { *basename++=U_FILE_SEP_CHAR; } /* initialize */ pv=upvec_open(2, &errorCode); /* process BidiMirroring.txt */ writeUCDFilename(basename, "BidiMirroring", suffix); parseBidiMirroring(filename, &errorCode); /* process additional properties files */ *basename=0; parseBinariesFile(filename, basename, suffix, &propListBinaries, &errorCode); parseSingleEnumFile(filename, basename, suffix, &jtSingleEnum, &errorCode); parseSingleEnumFile(filename, basename, suffix, &jgSingleEnum, &errorCode); /* process UnicodeData.txt */ writeUCDFilename(basename, "UnicodeData", suffix); parseDB(filename, &errorCode); /* set proper bidi class for unassigned code points (Cn) */ parseTwoFieldFile(filename, basename, "DerivedBidiClass", suffix, bidiClassLineFn, &errorCode); /* process parsed data */ if(U_SUCCESS(errorCode)) { /* write the properties data file */ generateData(destDir, options[CSOURCE].doesOccur); } u_cleanup(); return errorCode; }