X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/73c04bcfe1096173b00431f0cdc742894b15eef0..a01113dcd0f39d5da295ef82785beff9ed86fe38:/icuSources/common/ucnv_bld.h diff --git a/icuSources/common/ucnv_bld.h b/icuSources/common/ucnv_bld.h index 75aa4d18..18b3795e 100644 --- a/icuSources/common/ucnv_bld.h +++ b/icuSources/common/ucnv_bld.h @@ -1,6 +1,8 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** -* Copyright (C) 1999-2006, International Business Machines +* Copyright (C) 1999-2015 International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -23,6 +25,7 @@ #include "unicode/ucnv.h" #include "unicode/ucnv_err.h" +#include "unicode/utf16.h" #include "ucnv_cnv.h" #include "ucnvmbcs.h" #include "ucnv_ext.h" @@ -41,6 +44,7 @@ #define UCNV_OPTION_VERSION 0xf #define UCNV_OPTION_SWAP_LFNL 0x10 +#define UCNV_GET_VERSION(cnv) ((cnv)->options&UCNV_OPTION_VERSION) U_CDECL_BEGIN /* We must declare the following as 'extern "C"' so that if ucnv itself is compiled under C++, the linkage of the funcptrs will @@ -91,15 +95,15 @@ typedef struct UConverterStaticData { /* +offset: size */ */ struct UConverterSharedData { uint32_t structSize; /* Size of this structure */ - uint32_t referenceCounter; /* used to count number of clients, 0xffffffff for static SharedData */ + uint32_t referenceCounter; /* used to count number of clients, unused for static/immutable SharedData */ const void *dataMemory; /* from udata_openChoice() - for cleanup */ - void *table; /* Unused. This used to be a UConverterTable - Pointer to conversion data - see mbcs below */ const UConverterStaticData *staticData; /* pointer to the static (non changing) data. */ UBool sharedDataCached; /* TRUE: shared data is in cache, don't destroy on ucnv_close() if 0 ref. FALSE: shared data isn't in the cache, do attempt to clean it up if the ref is 0 */ - /*UBool staticDataOwned; TRUE if static data owned by shared data & should be freed with it, NEVER true for udata() loaded statics. This ignored variable was removed to make space for sharedDataCached. */ + /** If FALSE, then referenceCounter is not used. Must not change after initialization. */ + UBool isReferenceCounted; const UConverterImpl *impl; /* vtable-style struct of mostly function pointers */ @@ -113,16 +117,21 @@ struct UConverterSharedData { * which always has a UConverterMBCSTable * * To eliminate one allocation, I am making the UConverterMBCSTable - * a member of the shared data. It is the last member so that static - * definitions of UConverterSharedData work as before. - * The table field above also remains to avoid updating all static - * definitions, but is now unused. + * a member of the shared data. * * markus 2003-nov-07 */ UConverterMBCSTable mbcs; }; +/** UConverterSharedData initializer for static, non-reference-counted converters. */ +#define UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(pStaticData, pImpl) \ + { \ + sizeof(UConverterSharedData), ~((uint32_t)0), \ + NULL, pStaticData, FALSE, FALSE, pImpl, \ + 0, UCNV_MBCS_TABLE_INITIALIZER \ + } + /* Defines a UConverter, the lightweight mutable part the user sees */ struct UConverter { @@ -226,6 +235,9 @@ struct UConverter { char preToU[UCNV_EXT_MAX_BYTES]; int8_t preFromULength, preToULength; /* negative: replay */ int8_t preToUFirstLength; /* length of first character */ + + /* new fields for ICU 4.0 */ + UConverterCallbackReason toUCallbackReason; /* (*fromCharErrorBehaviour) reason, set when error is detected */ }; U_CDECL_END /* end of UConverter */ @@ -256,15 +268,15 @@ ucnv_bld_getAvailableConverter(uint16_t n, UErrorCode *pErrorCode); * Load a non-algorithmic converter. * If pkg==NULL, then this function must be called inside umtx_lock(&cnvCacheMutex). */ -UConverterSharedData * +U_CAPI UConverterSharedData * ucnv_load(UConverterLoadArgs *pArgs, UErrorCode *err); /** * Unload a non-algorithmic converter. - * It must be sharedData->referenceCounter != ~0 + * It must be sharedData->isReferenceCounted * and this function must be called inside umtx_lock(&cnvCacheMutex). */ -void +U_CAPI void ucnv_unload(UConverterSharedData *sharedData); /** @@ -276,6 +288,9 @@ ucnv_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outData, UErrorCode *pErrorCode); +U_CAPI void U_EXPORT2 +ucnv_enableCleanup(); + #endif #endif /* _UCNV_BLD */