CharList *pkg_appendUniqueDirToList(CharList *l, CharList** end, const char *strAlias) { char aBuf[1024]; char *rPtr; rPtr = uprv_strrchr(strAlias, U_FILE_SEP_CHAR); #if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) { char *aPtr = uprv_strrchr(strAlias, U_FILE_ALT_SEP_CHAR); if(!rPtr || /* regular char wasn't found or.. */ (aPtr && (aPtr > rPtr))) { /* alt ptr exists and is to the right of r ptr */ rPtr = aPtr; /* may copy NULL which is OK */ } } #endif if(!rPtr) { return l; /* no dir path */ } if((rPtr-strAlias) >= (sizeof(aBuf)/sizeof(aBuf[0]))) { fprintf(stderr, "## ERR: Path too long [%d chars]: %s\n", (int)sizeof(aBuf), strAlias); return l; } strncpy(aBuf, strAlias,(rPtr-strAlias)); aBuf[rPtr-strAlias]=0; /* no trailing slash */ convertToNativePathSeparators(aBuf); if(!pkg_listContains(l, aBuf)) { return pkg_appendToList(l, end, uprv_strdup(aBuf)); } else { return l; /* already found */ } }
void RuleBasedCollator::setLocales(const Locale& requestedLocale, const Locale& validLocale, const Locale& actualLocale) { checkOwned(); char* rloc = uprv_strdup(requestedLocale.getName()); if (rloc) { char* vloc = uprv_strdup(validLocale.getName()); if (vloc) { char* aloc = uprv_strdup(actualLocale.getName()); if (aloc) { ucol_setReqValidLocales(ucollator, rloc, vloc, aloc); return; } uprv_free(vloc); } uprv_free(rloc); } }
SpoofImpl::SpoofImpl() { fMagic = USPOOF_MAGIC; fSpoofData = NULL; fChecks = USPOOF_ALL_CHECKS; UnicodeSet *allowedCharsSet = new UnicodeSet(0, 0x10ffff); allowedCharsSet->freeze(); fAllowedCharsSet = allowedCharsSet; fAllowedLocales = uprv_strdup(""); }
SpoofImpl::SpoofImpl() : fMagic(USPOOF_MAGIC), fChecks(USPOOF_ALL_CHECKS), fSpoofData(NULL), fAllowedCharsSet(NULL) , fAllowedLocales(NULL), fCachedIdentifierInfo(NULL) { UnicodeSet *allowedCharsSet = new UnicodeSet(0, 0x10ffff); allowedCharsSet->freeze(); fAllowedCharsSet = allowedCharsSet; fAllowedLocales = uprv_strdup(""); fRestrictionLevel = USPOOF_HIGHLY_RESTRICTIVE; }
U_CAPI char* U_EXPORT2 uprv_strndup(const char *src, int32_t n) { char *dup; if(n < 0) { dup = uprv_strdup(src); } else { dup = (char*)uprv_malloc(n+1); if (dup) { uprv_memcpy(dup, src, n); dup[n] = 0; } } return dup; }
SpoofImpl::SpoofImpl(SpoofData *data, UErrorCode &status) : fMagic(0), fSpoofData(NULL), fAllowedCharsSet(NULL) , fAllowedLocales(uprv_strdup("")) { if (U_FAILURE(status)) { return; } fMagic = USPOOF_MAGIC; fSpoofData = data; fChecks = USPOOF_ALL_CHECKS; UnicodeSet *allowedCharsSet = new UnicodeSet(0, 0x10ffff); if (allowedCharsSet == NULL || fAllowedLocales == NULL) { status = U_MEMORY_ALLOCATION_ERROR; return; } allowedCharsSet->freeze(); fAllowedCharsSet = allowedCharsSet; }
// Copy Constructor, used by the user level clone() function. SpoofImpl::SpoofImpl(const SpoofImpl &src, UErrorCode &status) : fMagic(0), fSpoofData(NULL), fAllowedCharsSet(NULL) { if (U_FAILURE(status)) { return; } fMagic = src.fMagic; fChecks = src.fChecks; if (src.fSpoofData != NULL) { fSpoofData = src.fSpoofData->addReference(); } fAllowedCharsSet = static_cast<const UnicodeSet *>(src.fAllowedCharsSet->clone()); if (fAllowedCharsSet == NULL) { status = U_MEMORY_ALLOCATION_ERROR; } fAllowedLocales = uprv_strdup(src.fAllowedLocales); }
// Copy Constructor, used by the user level clone() function. SpoofImpl::SpoofImpl(const SpoofImpl &src, UErrorCode &status) : fChecks(USPOOF_ALL_CHECKS), fSpoofData(NULL), fAllowedCharsSet(NULL) , fAllowedLocales(NULL) { if (U_FAILURE(status)) { return; } fChecks = src.fChecks; if (src.fSpoofData != NULL) { fSpoofData = src.fSpoofData->addReference(); } fAllowedCharsSet = static_cast<const UnicodeSet *>(src.fAllowedCharsSet->clone()); fAllowedLocales = uprv_strdup(src.fAllowedLocales); if (fAllowedCharsSet == NULL || fAllowedLocales == NULL) { status = U_MEMORY_ALLOCATION_ERROR; } fRestrictionLevel = src.fRestrictionLevel; }
void SpoofImpl::construct(UErrorCode& status) { fChecks = USPOOF_ALL_CHECKS; fSpoofData = NULL; fAllowedCharsSet = NULL; fAllowedLocales = NULL; fRestrictionLevel = USPOOF_HIGHLY_RESTRICTIVE; if (U_FAILURE(status)) { return; } UnicodeSet *allowedCharsSet = new UnicodeSet(0, 0x10ffff); fAllowedCharsSet = allowedCharsSet; fAllowedLocales = uprv_strdup(""); if (fAllowedCharsSet == NULL || fAllowedLocales == NULL) { status = U_MEMORY_ALLOCATION_ERROR; return; } allowedCharsSet->freeze(); }
SpoofImpl::SpoofImpl(SpoofData *data, UErrorCode &status) : fMagic(0), fChecks(USPOOF_ALL_CHECKS), fSpoofData(data), fAllowedCharsSet(NULL) , fAllowedLocales(NULL), fCachedIdentifierInfo(NULL) { if (U_FAILURE(status)) { return; } fRestrictionLevel = USPOOF_HIGHLY_RESTRICTIVE; UnicodeSet *allowedCharsSet = new UnicodeSet(0, 0x10ffff); allowedCharsSet->freeze(); fAllowedCharsSet = allowedCharsSet; fAllowedLocales = uprv_strdup(""); if (fAllowedCharsSet == NULL || fAllowedLocales == NULL) { status = U_MEMORY_ALLOCATION_ERROR; return; } fMagic = USPOOF_MAGIC; }
// getCDFLocaleStyleData returns pointer to formatting data for given locale and // style within the global cache. On cache miss, getCDFLocaleStyleData loads // the data from CLDR into the global cache before returning the pointer. If a // UNUM_LONG data is requested for a locale, and that locale does not have // UNUM_LONG data, getCDFLocaleStyleData will fall back to UNUM_SHORT data for // that locale. static const CDFLocaleStyleData* getCDFLocaleStyleData(const Locale& inLocale, UNumberCompactStyle style, UErrorCode& status) { if (U_FAILURE(status)) { return NULL; } CDFLocaleData* result = NULL; const char* key = inLocale.getName(); { Mutex lock(&gCompactDecimalMetaLock); if (gCompactDecimalData == NULL) { gCompactDecimalData = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &status); if (U_FAILURE(status)) { return NULL; } uhash_setKeyDeleter(gCompactDecimalData, uprv_free); uhash_setValueDeleter(gCompactDecimalData, deleteCDFLocaleData); ucln_i18n_registerCleanup(UCLN_I18N_CDFINFO, cdf_cleanup); } else { result = (CDFLocaleData*) uhash_get(gCompactDecimalData, key); } } if (result != NULL) { return extractDataByStyleEnum(*result, style, status); } result = loadCDFLocaleData(inLocale, status); if (U_FAILURE(status)) { return NULL; } { Mutex lock(&gCompactDecimalMetaLock); CDFLocaleData* temp = (CDFLocaleData*) uhash_get(gCompactDecimalData, key); if (temp != NULL) { delete result; result = temp; } else { uhash_put(gCompactDecimalData, uprv_strdup(key), (void*) result, &status); if (U_FAILURE(status)) { return NULL; } } } return extractDataByStyleEnum(*result, style, status); }
// createCDFUnit returns a pointer to the prefix-suffix pair for a given // variant and log10 value within table. If no such prefix-suffix pair is // stored in table, one is created within table before returning pointer. static CDFUnit* createCDFUnit(const char* variant, int32_t log10Value, UHashtable* table, UErrorCode& status) { if (U_FAILURE(status)) { return NULL; } CDFUnit *cdfUnit = (CDFUnit*) uhash_get(table, variant); if (cdfUnit == NULL) { cdfUnit = new CDFUnit[MAX_DIGITS]; if (cdfUnit == NULL) { status = U_MEMORY_ALLOCATION_ERROR; return NULL; } uhash_put(table, uprv_strdup(variant), cdfUnit, &status); if (U_FAILURE(status)) { return NULL; } } CDFUnit* result = &cdfUnit[log10Value]; return result; }
const GenderInfo* GenderInfo::getInstance(const Locale& locale, UErrorCode& status) { // Make sure our cache exists. umtx_initOnce(gGenderInitOnce, &GenderInfo_initCache, status); if (U_FAILURE(status)) { return NULL; } const GenderInfo* result = NULL; const char* key = locale.getName(); { Mutex lock(&gGenderMetaLock); result = (const GenderInfo*) uhash_get(gGenderInfoCache, key); } if (result) { return result; } // On cache miss, try to create GenderInfo from CLDR data result = loadInstance(locale, status); if (U_FAILURE(status)) { return NULL; } // Try to put our GenderInfo object in cache. If there is a race condition, // favor the GenderInfo object that is already in the cache. { Mutex lock(&gGenderMetaLock); GenderInfo* temp = (GenderInfo*) uhash_get(gGenderInfoCache, key); if (temp) { result = temp; } else { uhash_put(gGenderInfoCache, uprv_strdup(key), (void*) result, &status); if (U_FAILURE(status)) { return NULL; } } } return result; }
UCTMultiThreadItem(const char *x) : value(NULL) { value = uprv_strdup(x); }
void pkg_mode_common(UPKGOptions *o, FileStream *makefile, UErrorCode *status) { char tmp[1024]; CharList *tail = NULL; uprv_strcpy(tmp, UDATA_CMN_PREFIX); uprv_strcat(tmp, o->shortName); uprv_strcat(tmp, UDATA_CMN_SUFFIX); if(!uprv_strcmp(o->mode, "common")) { /* If we're not the main mode.. don't change the output file list */ /* We should be the only item. So we don't care about the order. */ o->outFiles = pkg_appendToList(o->outFiles, &tail, uprv_strdup(tmp)); if(o->nooutput || o->verbose) { fprintf(stdout, "# Output file: %s%s%s\n", o->targetDir, U_FILE_SEP_STRING, tmp); } if(o->nooutput) { *status = U_ZERO_ERROR; return; } sprintf(tmp, "# File to make:\nTARGET=%s%s%s\n\nTARGETNAME=%s\n", o->targetDir, U_FILE_SEP_STRING, o->outFiles->str, o->outFiles->str); T_FileStream_writeLine(makefile, tmp); } else { /* We're in another mode. but, set the target so they can find us.. */ T_FileStream_writeLine(makefile, "TARGET="); T_FileStream_writeLine(makefile, tmp); T_FileStream_writeLine(makefile, "\n\n"); } /* end [check to make sure we are in mode 'common' ] */ sprintf(tmp, "# List file for gencmn:\n" "CMNLIST=%s%s%s_common.lst\n\n", o->tmpDir, U_FILE_SEP_STRING, o->shortName); T_FileStream_writeLine(makefile, tmp); sprintf(tmp, "all: $(TARGET)\n\n"); T_FileStream_writeLine(makefile, tmp); T_FileStream_writeLine(makefile, "$(TARGET): $(CMNLIST) $(DATAFILEPATHS)\n" "\t$(INVOKE) $(GENCMN) -n $(CNAME) -c -s $(SRCDIR) -d $(TARGETDIR) 0 $(CMNLIST)\n\n"); if(o->hadStdin == FALSE) { /* shortcut */ T_FileStream_writeLine(makefile, "$(CMNLIST): $(LISTFILES)\n" "\tcat $(LISTFILES) > $(CMNLIST)\n\n"); } else { T_FileStream_writeLine(makefile, "$(CMNLIST): \n" "\t@echo \"generating $@ (list of data files)\"\n" "\t@-$(RMV) $@\n" "\t@for file in $(DATAFILEPATHS); do \\\n" "\t echo $$file >> $@; \\\n" "\tdone;\n\n"); } if(!uprv_strcmp(o->mode, "common")) { /* only install/clean in our own mode */ T_FileStream_writeLine(makefile, "CLEANFILES= $(CMNLIST) $(TARGET)\n\nclean:\n\t-$(RMV) $(CLEANFILES) $(MAKEFILE)"); T_FileStream_writeLine(makefile, "\n\n"); sprintf(tmp, "install: $(TARGET)\n" "\t$(INSTALL_DATA) $(TARGET) $(INSTALLTO)%s$(TARGETNAME)\n\n", U_FILE_SEP_STRING); T_FileStream_writeLine(makefile, tmp); } }
int main(int argc, char* argv[]) { int result = 0; /* FileStream *out; */ UPKGOptions o; CharList *tail; UBool needsHelp = FALSE; UErrorCode status = U_ZERO_ERROR; /* char tmp[1024]; */ uint32_t i; int32_t n; U_MAIN_INIT_ARGS(argc, argv); progname = argv[0]; options[MODE].value = "common"; /* read command line options */ argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); /* error handling, printing usage message */ /* I've decided to simply print an error and quit. This tool has too many options to just display them all of the time. */ if(options[HELP].doesOccur || options[HELP_QUESTION_MARK].doesOccur) { needsHelp = TRUE; } else { if(!needsHelp && argc<0) { fprintf(stderr, "%s: error in command line argument \"%s\"\n", progname, argv[-argc]); fprintf(stderr, "Run '%s --help' for help.\n", progname); return 1; } #ifndef WINDOWS_WITH_MSVC if(!options[BLDOPT].doesOccur) { if (pkg_getOptionsFromICUConfig(&options[BLDOPT]) != 0) { fprintf(stderr, " required parameter is missing: -O is required \n"); fprintf(stderr, "Run '%s --help' for help.\n", progname); return 1; } } #else if(options[BLDOPT].doesOccur) { fprintf(stdout, "Warning: You are using the -O option which is not needed for MSVC build on Windows.\n"); } #endif if(!options[NAME].doesOccur) /* -O we already have - don't report it. */ { fprintf(stderr, " required parameter -p is missing \n"); fprintf(stderr, "Run '%s --help' for help.\n", progname); return 1; } if(argc == 1) { fprintf(stderr, "No input files specified.\n" "Run '%s --help' for help.\n", progname); return 1; } } /* end !needsHelp */ if(argc<0 || needsHelp ) { fprintf(stderr, "usage: %s [-options] [-] [packageFile] \n" "\tProduce packaged ICU data from the given list(s) of files.\n" "\t'-' by itself means to read from stdin.\n" "\tpackageFile is a text file containing the list of files to package.\n", progname); fprintf(stderr, "\n options:\n"); for(i=0;i<(sizeof(options)/sizeof(options[0]));i++) { fprintf(stderr, "%-5s -%c %s%-10s %s\n", (i<1?"[REQ]":""), options[i].shortName, options[i].longName ? "or --" : " ", options[i].longName ? options[i].longName : "", options_help[i]); } fprintf(stderr, "modes: (-m option)\n"); for(i=0;i<(sizeof(modes)/sizeof(modes[0]));i++) { fprintf(stderr, " %-9s ", modes[i].name); if (modes[i].alt_name) { fprintf(stderr, "/ %-9s", modes[i].alt_name); } else { fprintf(stderr, " "); } fprintf(stderr, " %s\n", modes[i].desc); } return 1; } /* OK, fill in the options struct */ uprv_memset(&o, 0, sizeof(o)); o.mode = options[MODE].value; o.version = options[REVISION].doesOccur ? options[REVISION].value : 0; o.shortName = options[NAME].value; { int32_t len = (int32_t)uprv_strlen(o.shortName); char *csname, *cp; const char *sp; cp = csname = (char *) uprv_malloc((len + 1 + 1) * sizeof(*o.cShortName)); if (*(sp = o.shortName)) { *cp++ = isalpha(*sp) ? * sp : '_'; for (++sp; *sp; ++sp) { *cp++ = isalnum(*sp) ? *sp : '_'; } } *cp = 0; o.cShortName = csname; } if(options[LIBNAME].doesOccur) { /* get libname from shortname, or explicit -L parameter */ o.libName = options[LIBNAME].value; } else { o.libName = o.shortName; } if(options[QUIET].doesOccur) { o.quiet = TRUE; } else { o.quiet = FALSE; } o.verbose = options[VERBOSE].doesOccur; #ifndef WINDOWS_WITH_MSVC /* on UNIX, we'll just include the file... */ o.options = options[BLDOPT].value; #endif if(options[COPYRIGHT].doesOccur) { o.comment = U_COPYRIGHT_STRING; } else if (options[COMMENT].doesOccur) { o.comment = options[COMMENT].value; } if( options[DESTDIR].doesOccur ) { o.targetDir = options[DESTDIR].value; } else { o.targetDir = "."; /* cwd */ } o.rebuild = options[REBUILD].doesOccur; if( options[TEMPDIR].doesOccur ) { o.tmpDir = options[TEMPDIR].value; } else { o.tmpDir = o.targetDir; } if( options[INSTALL].doesOccur ) { o.install = options[INSTALL].value; } else { o.install = NULL; } if( options[SOURCEDIR].doesOccur ) { o.srcDir = options[SOURCEDIR].value; } else { o.srcDir = "."; } if( options[ENTRYPOINT].doesOccur ) { o.entryName = options[ENTRYPOINT].value; } else { o.entryName = o.cShortName; } /* OK options are set up. Now the file lists. */ tail = NULL; for( n=1; n<argc; n++) { o.fileListFiles = pkg_appendToList(o.fileListFiles, &tail, uprv_strdup(argv[n])); } /* load the files */ loadLists(&o, &status); if( U_FAILURE(status) ) { fprintf(stderr, "error loading input file lists: %s\n", u_errorName(status)); return 2; } result = pkg_executeOptions(&o); if (pkgDataFlags != NULL) { for (n = 0; n < PKGDATA_FLAGS_SIZE; n++) { if (pkgDataFlags[n] != NULL) { uprv_free(pkgDataFlags[n]); } } uprv_free(pkgDataFlags); } if (o.cShortName != NULL) { uprv_free((char *)o.cShortName); } if (o.fileListFiles != NULL) { pkg_deleteList(o.fileListFiles); } if (o.filePaths != NULL) { pkg_deleteList(o.filePaths); } if (o.files != NULL) { pkg_deleteList(o.files); } return result; }
static void TestAPI(void) { int32_t intValue=0; char src[30]="HELLO THERE", dest[30]; static const char *const abc="abcdefghijklmnopqrstuvwxyz", *const ABC="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const char *temp; int32_t i; log_verbose("Testing uprv_tolower() and uprv_toupper()\n"); for(i=0; i<=26; ++i) { dest[i]=uprv_tolower(abc[i]); } if(0!=strcmp(abc, dest)) { log_err("uprv_tolower(abc) failed\n"); } for(i=0; i<=26; ++i) { dest[i]=uprv_tolower(ABC[i]); } if(0!=strcmp(abc, dest)) { log_err("uprv_tolower(ABC) failed\n"); } for(i=0; i<=26; ++i) { dest[i]=uprv_toupper(abc[i]); } if(0!=strcmp(ABC, dest)) { log_err("uprv_toupper(abc) failed\n"); } for(i=0; i<=26; ++i) { dest[i]=uprv_toupper(ABC[i]); } if(0!=strcmp(ABC, dest)) { log_err("uprv_toupper(ABC) failed\n"); } log_verbose("Testing the API in cstring\n"); T_CString_toLowerCase(src); if(uprv_strcmp(src, "hello there") != 0){ log_err("FAIL: *** T_CString_toLowerCase() failed. Expected: \"hello there\", Got: \"%s\"\n", src); } T_CString_toUpperCase(src); if(uprv_strcmp(src, "HELLO THERE") != 0){ log_err("FAIL: *** T_CString_toUpperCase() failed. Expected: \"HELLO THERE\", Got: \"%s\"\n", src); } intValue=T_CString_stringToInteger("34556", 10); if(intValue != 34556){ log_err("FAIL: ****T_CString_stringToInteger(\"34556\", 10) failed. Expected: 34556, Got: %d\n", intValue); } intValue=T_CString_stringToInteger("100", 16); if(intValue != 256){ log_err("FAIL: ****T_CString_stringToInteger(\"100\", 16) failed. Expected: 256, Got: %d\n", intValue); } i = T_CString_integerToString(src, 34556, 10); if(uprv_strcmp(src, "34556") != 0 || i != 5){ log_err("FAIL: ****integerToString(src, 34566, 10); failed. Expected: \"34556\", Got: %s\n", src); } i = T_CString_integerToString(src, 431, 16); if(uprv_stricmp(src, "1AF") != 0 || i != 3){ log_err("FAIL: ****integerToString(src, 431, 16); failed. Expected: \"1AF\", Got: %s\n", src); } i = T_CString_int64ToString(src, U_INT64_MAX, 10); if(uprv_strcmp(src, "9223372036854775807") != 0 || i != 19){ log_err("FAIL: ****integerToString(src, 9223372036854775807, 10); failed. Got: %s\n", src); } i = T_CString_int64ToString(src, U_INT64_MAX, 16); if(uprv_stricmp(src, "7FFFFFFFFFFFFFFF") != 0 || i != 16){ log_err("FAIL: ****integerToString(src, 7FFFFFFFFFFFFFFF, 16); failed. Got: %s\n", src); } uprv_strcpy(src, "this is lower case"); if(T_CString_stricmp(src, "THIS is lower CASE") != 0){ log_err("FAIL: *****T_CString_stricmp() failed."); } if((intValue=T_CString_stricmp(NULL, "first string is null") )!= -1){ log_err("FAIL: T_CString_stricmp() where the first string is null failed. Expected: -1, returned %d\n", intValue); } if((intValue=T_CString_stricmp("second string is null", NULL)) != 1){ log_err("FAIL: T_CString_stricmp() where the second string is null failed. Expected: 1, returned %d\n", intValue); } if((intValue=T_CString_stricmp(NULL, NULL)) != 0){ log_err("FAIL: T_CString_stricmp(NULL, NULL) failed. Expected: 0, returned %d\n", intValue); } if((intValue=T_CString_stricmp("", "")) != 0){ log_err("FAIL: T_CString_stricmp(\"\", \"\") failed. Expected: 0, returned %d\n", intValue); } if((intValue=T_CString_stricmp("", "abc")) != -1){ log_err("FAIL: T_CString_stricmp(\"\", \"abc\") failed. Expected: -1, returned %d\n", intValue); } if((intValue=T_CString_stricmp("abc", "")) != 1){ log_err("FAIL: T_CString_stricmp(\"abc\", \"\") failed. Expected: 1, returned %d\n", intValue); } temp=uprv_strdup("strdup"); if(uprv_strcmp(temp, "strdup") !=0 ){ log_err("FAIL: uprv_strdup() failed. Expected: \"strdup\", Got: %s\n", temp); } uprv_free((char *)temp); uprv_strcpy(src, "this is lower case"); if(T_CString_strnicmp(src, "THIS", 4 ) != 0){ log_err("FAIL: *****T_CString_strnicmp() failed."); } if((intValue=T_CString_strnicmp(NULL, "first string is null", 10) )!= -1){ log_err("FAIL: T_CString_strnicmp() where the first string is null failed. Expected: -1, returned %d\n", intValue); } if((intValue=T_CString_strnicmp("second string is null", NULL, 10)) != 1){ log_err("FAIL: T_CString_strnicmp() where the second string is null failed. Expected: 1, returned %d\n", intValue); } if((intValue=T_CString_strnicmp(NULL, NULL, 10)) != 0){ log_err("FAIL: T_CString_strnicmp(NULL, NULL, 10) failed. Expected: 0, returned %d\n", intValue); } if((intValue=T_CString_strnicmp("", "", 10)) != 0){ log_err("FAIL: T_CString_strnicmp(\"\", \"\") failed. Expected: 0, returned %d\n", intValue); } if((intValue=T_CString_strnicmp("", "abc", 10)) != -1){ log_err("FAIL: T_CString_stricmp(\"\", \"abc\", 10) failed. Expected: -1, returned %d\n", intValue); } if((intValue=T_CString_strnicmp("abc", "", 10)) != 1){ log_err("FAIL: T_CString_strnicmp(\"abc\", \"\", 10) failed. Expected: 1, returned %d\n", intValue); } }
U_CFUNC UCollator* ucol_open_internal(const char *loc, UErrorCode *status) { UErrorCode intStatus = U_ZERO_ERROR; const UCollator* UCA = ucol_initUCA(status); /* New version */ if(U_FAILURE(*status)) return 0; UCollator *result = NULL; UResourceBundle *b = ures_open(U_ICUDATA_COLL, loc, status); /* we try to find stuff from keyword */ UResourceBundle *collations = ures_getByKey(b, "collations", NULL, status); UResourceBundle *collElem = NULL; char keyBuffer[256]; // if there is a keyword, we pick it up and try to get elements if(!uloc_getKeywordValue(loc, "collation", keyBuffer, 256, status) || !uprv_strcmp(keyBuffer,"default")) { /* Treat 'zz@collation=default' as 'zz'. */ // no keyword. we try to find the default setting, which will give us the keyword value intStatus = U_ZERO_ERROR; // finding default value does not affect collation fallback status UResourceBundle *defaultColl = ures_getByKeyWithFallback(collations, "default", NULL, &intStatus); if(U_SUCCESS(intStatus)) { int32_t defaultKeyLen = 0; const UChar *defaultKey = ures_getString(defaultColl, &defaultKeyLen, &intStatus); u_UCharsToChars(defaultKey, keyBuffer, defaultKeyLen); keyBuffer[defaultKeyLen] = 0; } else { *status = U_INTERNAL_PROGRAM_ERROR; return NULL; } ures_close(defaultColl); } collElem = ures_getByKeyWithFallback(collations, keyBuffer, collations, status); collations = NULL; // We just reused the collations object as collElem. UResourceBundle *binary = NULL; if(*status == U_MISSING_RESOURCE_ERROR) { /* We didn't find the tailoring data, we fallback to the UCA */ *status = U_USING_DEFAULT_WARNING; result = ucol_initCollator(UCA->image, result, UCA, status); if (U_FAILURE(*status)) { goto clean; } // if we use UCA, real locale is root ures_close(b); b = ures_open(U_ICUDATA_COLL, "", status); ures_close(collElem); collElem = ures_open(U_ICUDATA_COLL, "", status); if(U_FAILURE(*status)) { goto clean; } result->hasRealData = FALSE; } else if(U_SUCCESS(*status)) { intStatus = U_ZERO_ERROR; binary = ures_getByKey(collElem, "%%CollationBin", NULL, &intStatus); if(intStatus == U_MISSING_RESOURCE_ERROR) { /* we didn't find the binary image, we should use the rules */ binary = NULL; result = tryOpeningFromRules(collElem, status); if(U_FAILURE(*status)) { goto clean; } } else if(U_SUCCESS(intStatus)) { /* otherwise, we'll pick a collation data that exists */ int32_t len = 0; const uint8_t *inData = ures_getBinary(binary, &len, status); if(U_FAILURE(*status)) { goto clean; } UCATableHeader *colData = (UCATableHeader *)inData; if(uprv_memcmp(colData->UCAVersion, UCA->image->UCAVersion, sizeof(UVersionInfo)) != 0 || uprv_memcmp(colData->UCDVersion, UCA->image->UCDVersion, sizeof(UVersionInfo)) != 0 || colData->version[0] != UCOL_BUILDER_VERSION) { *status = U_DIFFERENT_UCA_VERSION; result = tryOpeningFromRules(collElem, status); } else { if(U_FAILURE(*status)){ goto clean; } if((uint32_t)len > (paddedsize(sizeof(UCATableHeader)) + paddedsize(sizeof(UColOptionSet)))) { result = ucol_initCollator((const UCATableHeader *)inData, result, UCA, status); if(U_FAILURE(*status)){ goto clean; } result->hasRealData = TRUE; } else { result = ucol_initCollator(UCA->image, result, UCA, status); ucol_setOptionsFromHeader(result, (UColOptionSet *)(inData+((const UCATableHeader *)inData)->options), status); if(U_FAILURE(*status)){ goto clean; } result->hasRealData = FALSE; } result->freeImageOnClose = FALSE; } } else { // !U_SUCCESS(binaryStatus) if(U_SUCCESS(*status)) { *status = intStatus; // propagate underlying error } goto clean; } intStatus = U_ZERO_ERROR; result->rules = ures_getStringByKey(collElem, "Sequence", &result->rulesLength, &intStatus); result->freeRulesOnClose = FALSE; } else { /* There is another error, and we're just gonna clean up */ goto clean; } intStatus = U_ZERO_ERROR; result->ucaRules = ures_getStringByKey(b,"UCARules",NULL,&intStatus); if(loc == NULL) { loc = ures_getLocaleByType(b, ULOC_ACTUAL_LOCALE, status); } result->requestedLocale = uprv_strdup(loc); /* test for NULL */ if (result->requestedLocale == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; goto clean; } loc = ures_getLocaleByType(collElem, ULOC_ACTUAL_LOCALE, status); result->actualLocale = uprv_strdup(loc); /* test for NULL */ if (result->actualLocale == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; goto clean; } loc = ures_getLocaleByType(b, ULOC_ACTUAL_LOCALE, status); result->validLocale = uprv_strdup(loc); /* test for NULL */ if (result->validLocale == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; goto clean; } ures_close(b); ures_close(collElem); ures_close(binary); return result; clean: ures_close(b); ures_close(collElem); ures_close(binary); ucol_close(result); return NULL; }
void SpoofImpl::setAllowedLocales(const char *localesList, UErrorCode &status) { UnicodeSet allowedChars; UnicodeSet *tmpSet = NULL; const char *locStart = localesList; const char *locEnd = NULL; const char *localesListEnd = localesList + uprv_strlen(localesList); int32_t localeListCount = 0; // Number of locales provided by caller. // Loop runs once per locale from the localesList, a comma separated list of locales. do { locEnd = uprv_strchr(locStart, ','); if (locEnd == NULL) { locEnd = localesListEnd; } while (*locStart == ' ') { locStart++; } const char *trimmedEnd = locEnd-1; while (trimmedEnd > locStart && *trimmedEnd == ' ') { trimmedEnd--; } if (trimmedEnd <= locStart) { break; } const char *locale = uprv_strndup(locStart, (int32_t)(trimmedEnd + 1 - locStart)); localeListCount++; // We have one locale from the locales list. // Add the script chars for this locale to the accumulating set of allowed chars. // If the locale is no good, we will be notified back via status. addScriptChars(locale, &allowedChars, status); uprv_free((void *)locale); if (U_FAILURE(status)) { break; } locStart = locEnd + 1; } while (locStart < localesListEnd); // If our caller provided an empty list of locales, we disable the allowed characters checking if (localeListCount == 0) { uprv_free((void *)fAllowedLocales); fAllowedLocales = uprv_strdup(""); tmpSet = new UnicodeSet(0, 0x10ffff); if (fAllowedLocales == NULL || tmpSet == NULL) { status = U_MEMORY_ALLOCATION_ERROR; return; } tmpSet->freeze(); delete fAllowedCharsSet; fAllowedCharsSet = tmpSet; fChecks &= ~USPOOF_CHAR_LIMIT; return; } // Add all common and inherited characters to the set of allowed chars. UnicodeSet tempSet; tempSet.applyIntPropertyValue(UCHAR_SCRIPT, USCRIPT_COMMON, status); allowedChars.addAll(tempSet); tempSet.applyIntPropertyValue(UCHAR_SCRIPT, USCRIPT_INHERITED, status); allowedChars.addAll(tempSet); // If anything went wrong, we bail out without changing // the state of the spoof checker. if (U_FAILURE(status)) { return; } // Store the updated spoof checker state. tmpSet = static_cast<UnicodeSet *>(allowedChars.clone()); const char *tmpLocalesList = uprv_strdup(localesList); if (tmpSet == NULL || tmpLocalesList == NULL) { status = U_MEMORY_ALLOCATION_ERROR; return; } uprv_free((void *)fAllowedLocales); fAllowedLocales = tmpLocalesList; tmpSet->freeze(); delete fAllowedCharsSet; fAllowedCharsSet = tmpSet; fChecks |= USPOOF_CHAR_LIMIT; }
void pkg_mode_static(UPKGOptions *o, FileStream *makefile, UErrorCode *status) { char tmp[1024]; CharList *tail = NULL; CharList *objects = NULL; if(U_FAILURE(*status)) { return; } uprv_strcpy(tmp, LIB_STATIC_PREFIX); uprv_strcat(tmp, o->libName); uprv_strcat(tmp, UDATA_LIB_SUFFIX); o->outFiles = pkg_appendToList(o->outFiles, &tail, uprv_strdup(tmp)); if (!o->quiet) { pkg_sttc_writeReadme(o, tmp, status); } if(U_FAILURE(*status)) { return; } if(o->nooutput || o->verbose) { fprintf(stdout, "# Output file: %s%s%s\n", o->targetDir, U_FILE_SEP_STRING, tmp); } if(o->nooutput) { *status = U_ZERO_ERROR; return; } /* begin writing makefile ========================= */ T_FileStream_writeLine(makefile, "# Version numbers:\nVERSIONED="); if (o->version) { sprintf(tmp, ".%s", o->version); if (!uprv_strchr(o->version, '.')) { uprv_strcat(tmp, ".0"); } T_FileStream_writeLine(makefile, tmp); T_FileStream_writeLine(makefile, "\nDLL_LDFLAGS=$(LD_SONAME) $(RPATH_LDFLAGS)\n"); } else { T_FileStream_writeLine(makefile, "\nDLL_LDFLAGS=$(BIR_LDFLAGS)\n"); } T_FileStream_writeLine(makefile, "\n"); sprintf(tmp, "# File to make:\nTARGET=%s\n\n", o->outFiles->str); T_FileStream_writeLine(makefile, tmp); T_FileStream_writeLine(makefile, "LIB_TARGET=$(TARGET)\n"); uprv_strcpy(tmp, "all: $(TARG_PATH)$(LIB_TARGET)"); uprv_strcat(tmp, "\n\n"); T_FileStream_writeLine(makefile, tmp); #ifdef OS400 /* New for iSeries: All packaged data in one .c */ sprintf(tmp, "# Create a file which contains all .c data files/structures\n" "$(TEMP_DIR)/$(NAME)all.c: $(CMNLIST)\n\n"); T_FileStream_writeLine(makefile, tmp); #endif /* Write compile rules */ pkg_mak_writeObjRules(o, makefile, &objects, ".$(STATIC_O)"); /* use special .o suffix */ sprintf(tmp, "# List file for gencmn:\n" "CMNLIST=%s%s$(NAME)_static.lst\n\n", o->tmpDir, U_FILE_SEP_STRING); T_FileStream_writeLine(makefile, tmp); if(o->hadStdin == FALSE) { /* shortcut */ T_FileStream_writeLine(makefile, "$(CMNLIST): $(LISTFILES)\n" "\tcat $(LISTFILES) > $(CMNLIST)\n\n"); } else { T_FileStream_writeLine(makefile, "$(CMNLIST): \n" "\t@echo \"generating $@ (list of data files)\"\n" "\t@-$(RMV) $@\n" "\t@for file in $(DATAFILEPATHS); do \\\n" "\t echo $$file >> $@; \\\n" "\tdone;\n\n"); } pkg_mak_writeAssemblyHeader(makefile, o); sprintf(tmp,"$(TEMP_PATH)$(NAME)_dat.$(STATIC_O) : $(TEMP_PATH)$(NAME)_dat.c\n" "\t$(COMPILE.c) -o $@ $<\n\n"); T_FileStream_writeLine(makefile, tmp); T_FileStream_writeLine(makefile, "# 'TOCOBJ' contains C Table of Contents objects [if any]\n"); if(!o->embed) { sprintf(tmp, "$(TEMP_PATH)$(NAME)_dat.c: $(CMNLIST)\n" "\t$(INVOKE) $(GENCMN) -e $(ENTRYPOINT) -n $(NAME) -S -s $(SRCDIR) -d $(TEMP_DIR) 0 $(CMNLIST)\n\n"); } else { sprintf(tmp, "$(TEMP_PATH)$(NAME)_dat.c: $(CMNLIST)\n" "\t$(INVOKE) $(GENCMN) -e $(ENTRYPOINT) -n $(NAME) -S -E -d $(TEMP_DIR) 0 $(CMNLIST)\n\n"); } T_FileStream_writeLine(makefile, tmp); sprintf(tmp, "TOCOBJ= $(NAME)_dat%s \n\n", OBJ_SUFFIX); T_FileStream_writeLine(makefile, tmp); #ifdef OS400 /* New for iSeries: All packaged data in one .c */ sprintf(tmp,"$(TEMP_PATH)$(NAME)all.$(STATIC_O) : $(TEMP_PATH)$(NAME)all.c\n" "\t$(COMPILE.c) -o $@ $<\n\n"); T_FileStream_writeLine(makefile, tmp); T_FileStream_writeLine(makefile, "# 'ALLDATAOBJ' contains all .c data structures\n"); sprintf(tmp, "ALLDATAOBJ= $(NAME)all%s \n\n", OBJ_SUFFIX); T_FileStream_writeLine(makefile, tmp); #endif sprintf(tmp, "TOCSYM= $(ENTRYPOINT)_dat \n\n"); /* entrypoint not always shortname! */ T_FileStream_writeLine(makefile, tmp); T_FileStream_writeLine(makefile, "BASE_OBJECTS= $(TOCOBJ) "); #ifdef OS400 T_FileStream_writeLine(makefile, "$(ALLDATAOBJ) "); #else pkg_writeCharListWrap(makefile, objects, " ", " \\\n",0); #endif pkg_mak_writeAssemblyFooter(makefile, o); T_FileStream_writeLine(makefile, "\n\n"); T_FileStream_writeLine(makefile, "OBJECTS=$(BASE_OBJECTS:%=$(TEMP_PATH)%)\n\n"); T_FileStream_writeLine(makefile,"$(TEMP_PATH)%.$(STATIC_O): $(TEMP_PATH)%.c\n\t $(COMPILE.c) -o $@ $<\n\n"); #if NO_IMPLICIT_AR T_FileStream_writeLine(makefile, "$(TARG_PATH)$(LIB_TARGET):$(TARG_PATH)$(LIB_TARGET) $(OBJECTS) $(LISTFILES)\n" "\t$(AR) $(ARFLAGS) $(TARG_PATH)$(LIB_TARGET) $(OBJECTS)\n" "\t$(RANLIB) $@\n\n"); #else T_FileStream_writeLine(makefile, "$(TARG_PATH)$(LIB_TARGET):$(TARG_PATH)$(LIB_TARGET)($(OBJECTS)) $(LISTFILES)\n" "\t$(RANLIB) $@\n\n"); #endif T_FileStream_writeLine(makefile, "CLEANFILES= $(CMNLIST) $(OBJECTS) $(TARG_PATH)$(LIB_TARGET) $(TARG_PATH)$(MIDDLE_STATIC_LIB_TARGET) $(TARG_PATH)$(TARGET)\n\nclean:\n\t-$(RMV) $(CLEANFILES) $(MAKEFILE)"); T_FileStream_writeLine(makefile, "\n\n"); T_FileStream_writeLine(makefile, "# static mode shouldn't need to be installed, but we will install the header and static library for them.\n"); T_FileStream_writeLine(makefile, "install: $(TARG_PATH)$(LIB_TARGET)\n" "\t$(INSTALL-L) $(TARG_PATH)$(LIB_TARGET) $(INSTALLTO)/$(LIB_TARGET)\n"); T_FileStream_writeLine(makefile, "\t$(RANLIB) $(INSTALLTO)/$(LIB_TARGET)\n"); if (o->version) { T_FileStream_writeLine(makefile, "\tcd $(INSTALLTO) && $(RM) $(MIDDLE_STATIC_LIB_TARGET) && ln -s $(LIB_TARGET) $(MIDDLE_STATIC_LIB_TARGET)\n\tcd $(INSTALLTO) && $(RM) $(STATIC_LIB_TARGET) && ln -s $(LIB_TARGET) $(STATIC_LIB_TARGET)\n"); T_FileStream_writeLine(makefile, "\t$(RANLIB) $(INSTALLTO)/$(STATIC_LIB_TARGET)\n\n"); } *status = U_ZERO_ERROR; }