int main (void) { if (!getAlgorithmicTypeFromName ("utf8")) abort (); return 0; }
/*Logic determines if the converter is Algorithmic AND/OR cached *depending on that: * -we either go to get data from disk and cache it (Data=TRUE, Cached=False) * -Get it from a Hashtable (Data=X, Cached=TRUE) * -Call dataConverter initializer (Data=TRUE, Cached=TRUE) * -Call AlgorithmicConverter initializer (Data=FALSE, Cached=TRUE) */ UConverterSharedData * ucnv_loadSharedData(const char *converterName, UConverterLookupData *lookup, UErrorCode * err) { UConverterLookupData stackLookup; UConverterSharedData *mySharedConverterData = NULL; UErrorCode internalErrorCode = U_ZERO_ERROR; if (U_FAILURE (*err)) { return NULL; } if(lookup == NULL) { lookup = &stackLookup; } lookup->locale[0] = 0; lookup->options = 0; /* In case "name" is NULL we want to open the default converter. */ if (converterName == NULL) { lookup->realName = ucnv_io_getDefaultConverterName(); if (lookup->realName == NULL) { *err = U_MISSING_RESOURCE_ERROR; return NULL; } /* the default converter name is already canonical */ } else { /* separate the converter name from the options */ parseConverterOptions(converterName, lookup->cnvName, lookup->locale, &lookup->options, err); if (U_FAILURE(*err)) { /* Very bad name used. */ return NULL; } /* get the canonical converter name */ lookup->realName = ucnv_io_getConverterName(lookup->cnvName, &internalErrorCode); if (U_FAILURE(internalErrorCode) || lookup->realName == NULL) { /* * set the input name in case the converter was added * without updating the alias table, or when there is no alias table */ lookup->realName = lookup->cnvName; } } /* separate the converter name from the options */ if(lookup->realName != lookup->cnvName) { parseConverterOptions(lookup->realName, lookup->cnvName, lookup->locale, &lookup->options, err); lookup->realName = lookup->cnvName; } /* get the shared data for an algorithmic converter, if it is one */ mySharedConverterData = (UConverterSharedData *)getAlgorithmicTypeFromName(lookup->realName); if (mySharedConverterData == NULL) { /* it is a data-based converter, get its shared data. */ /* Hold the cnvCacheMutex through the whole process of checking the */ /* converter data cache, and adding new entries to the cache */ /* to prevent other threads from modifying the cache during the */ /* process. */ UConverterLoadArgs args={ 0 }; args.size=sizeof(UConverterLoadArgs); args.nestedLoads=1; args.options=lookup->options; args.pkg=NULL; args.name=lookup->realName; umtx_lock(&cnvCacheMutex); mySharedConverterData = ucnv_load(&args, err); umtx_unlock(&cnvCacheMutex); if (U_FAILURE (*err) || (mySharedConverterData == NULL)) { return NULL; } } return mySharedConverterData; }