// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * * Copyright (C) 2003-2016, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** * file name: ucnv_ext.cpp * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * * created on: 2003jun13 * created by: Markus W. Scherer * * Conversion extensions */ #include "unicode/utypes.h" #if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION #include "unicode/uset.h" #include "unicode/ustring.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" #include "ucnv_ext.h" #include "cmemory.h" #include "uassert.h" /* to Unicode --------------------------------------------------------------- */ /* * @return lookup value for the byte, if found; else 0 */ static inline uint32_t ucnv_extFindToU(const uint32_t *toUSection, int32_t length, uint8_t byte) { … } /* * true if not an SI/SO stateful converter, * or if the match length fits with the current converter state */ #define UCNV_EXT_TO_U_VERIFY_SISO_MATCH(sisoState, match) … /* * this works like ucnv_extMatchFromU() except * - the first character is in pre * - no trie is used * - the returned matchLength is not offset by 2 */ static int32_t ucnv_extMatchToU(const int32_t *cx, int8_t sisoState, const char *pre, int32_t preLength, const char *src, int32_t srcLength, uint32_t *pMatchValue, UBool /*useFallback*/, UBool flush) { … } static inline void ucnv_extWriteToU(UConverter *cnv, const int32_t *cx, uint32_t value, char16_t **target, const char16_t *targetLimit, int32_t **offsets, int32_t srcIndex, UErrorCode *pErrorCode) { … } /* * get the SI/SO toU state (state 0 is for SBCS, 1 for DBCS), * or 1 for DBCS-only, * or -1 if the converter is not SI/SO stateful * * Note: For SI/SO stateful converters getting here, * cnv->mode==0 is equivalent to firstLength==1. */ #define UCNV_SISO_STATE(cnv) … /* * target<targetLimit; set error code for overflow */ U_CFUNC UBool ucnv_extInitialMatchToU(UConverter *cnv, const int32_t *cx, int32_t firstLength, const char **src, const char *srcLimit, char16_t **target, const char16_t *targetLimit, int32_t **offsets, int32_t srcIndex, UBool flush, UErrorCode *pErrorCode) { … } U_CFUNC UChar32 ucnv_extSimpleMatchToU(const int32_t *cx, const char *source, int32_t length, UBool useFallback) { … } /* * continue partial match with new input * never called for simple, single-character conversion */ U_CFUNC void ucnv_extContinueMatchToU(UConverter *cnv, UConverterToUnicodeArgs *pArgs, int32_t srcIndex, UErrorCode *pErrorCode) { … } /* from Unicode ------------------------------------------------------------- */ // Use roundtrips, "good one-way" mappings, and some normal fallbacks. static inline UBool extFromUUseMapping(UBool useFallback, uint32_t value, UChar32 firstCP) { … } /* * @return index of the char16_t, if found; else <0 */ static inline int32_t ucnv_extFindFromU(const char16_t *fromUSection, int32_t length, char16_t u) { … } /* * @param cx pointer to extension data; if nullptr, returns 0 * @param firstCP the first code point before all the other UChars * @param pre UChars that must match; !initialMatch: partial match with them * @param preLength length of pre, >=0 * @param src UChars that can be used to complete a match * @param srcLength length of src, >=0 * @param pMatchValue [out] output result value for the match from the data structure * @param useFallback "use fallback" flag, usually from cnv->useFallback * @param flush true if the end of the input stream is reached * @return >1: matched, return value=total match length (number of input units matched) * 1: matched, no mapping but request for <subchar1> * (only for the first code point) * 0: no match * <0: partial match, return value=negative total match length * (partial matches are never returned for flush==true) * (partial matches are never returned as being longer than UCNV_EXT_MAX_UCHARS) * the matchLength is 2 if only firstCP matched, and >2 if firstCP and * further code units matched */ static int32_t ucnv_extMatchFromU(const int32_t *cx, UChar32 firstCP, const char16_t *pre, int32_t preLength, const char16_t *src, int32_t srcLength, uint32_t *pMatchValue, UBool useFallback, UBool flush) { … } /* * @param value fromUnicode mapping table value; ignores roundtrip and reserved bits */ static inline void ucnv_extWriteFromU(UConverter *cnv, const int32_t *cx, uint32_t value, char **target, const char *targetLimit, int32_t **offsets, int32_t srcIndex, UErrorCode *pErrorCode) { … } /* * target<targetLimit; set error code for overflow */ U_CFUNC UBool ucnv_extInitialMatchFromU(UConverter *cnv, const int32_t *cx, UChar32 cp, const char16_t **src, const char16_t *srcLimit, char **target, const char *targetLimit, int32_t **offsets, int32_t srcIndex, UBool flush, UErrorCode *pErrorCode) { … } /* * Used by ISO 2022 implementation. * @return number of bytes in *pValue; negative number if fallback; 0 for no mapping */ U_CFUNC int32_t ucnv_extSimpleMatchFromU(const int32_t *cx, UChar32 cp, uint32_t *pValue, UBool useFallback) { … } /* * continue partial match with new input, requires cnv->preFromUFirstCP>=0 * never called for simple, single-character conversion */ U_CFUNC void ucnv_extContinueMatchFromU(UConverter *cnv, UConverterFromUnicodeArgs *pArgs, int32_t srcIndex, UErrorCode *pErrorCode) { … } static UBool extSetUseMapping(UConverterUnicodeSet which, int32_t minLength, uint32_t value) { … } static void ucnv_extGetUnicodeSetString(const UConverterSharedData *sharedData, const int32_t *cx, const USetAdder *sa, UConverterUnicodeSet which, int32_t minLength, UChar32 firstCP, char16_t s[UCNV_EXT_MAX_UCHARS], int32_t length, int32_t sectionIndex, UErrorCode *pErrorCode) { … } U_CFUNC void ucnv_extGetUnicodeSet(const UConverterSharedData *sharedData, const USetAdder *sa, UConverterUnicodeSet which, UConverterSetFilter filter, UErrorCode *pErrorCode) { … } #endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */