// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * * Copyright (C) 2000-2015, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** * file name: ubidiwrt.c * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * * created on: 1999aug06 * created by: Markus W. Scherer, updated by Matitiahu Allouche * * This file contains implementations for BiDi functions that use * the core algorithm and core API to write reordered text. */ #include "unicode/utypes.h" #include "unicode/ustring.h" #include "unicode/uchar.h" #include "unicode/ubidi.h" #include "unicode/utf16.h" #include "cmemory.h" #include "ustr_imp.h" #include "ubidiimp.h" /* * The function implementations in this file are designed * for UTF-16 and UTF-32, not for UTF-8. * * Assumptions that are not true for UTF-8: * - Any code point always needs the same number of code units * ("minimum-length-problem" of UTF-8) * - The BiDi control characters need only one code unit each * * Further assumptions for all UTFs: * - u_charMirror(c) needs the same number of code units as c */ #if defined(UTF_SIZE) && UTF_SIZE==8 # error reimplement ubidi_writeReordered() for UTF-8, see comment above #endif #define IS_COMBINING(type) … /* * When we have UBIDI_OUTPUT_REVERSE set on ubidi_writeReordered(), then we * semantically write RTL runs in reverse and later reverse them again. * Instead, we actually write them in forward order to begin with. * However, if the RTL run was to be mirrored, we need to mirror here now * since the implicit second reversal must not do it. * It looks strange to do mirroring in LTR output, but it is only because * we are writing RTL output in reverse. */ static int32_t doWriteForward(const char16_t *src, int32_t srcLength, char16_t *dest, int32_t destSize, uint16_t options, UErrorCode *pErrorCode) { … } static int32_t doWriteReverse(const char16_t *src, int32_t srcLength, char16_t *dest, int32_t destSize, uint16_t options, UErrorCode *pErrorCode) { … } U_CAPI int32_t U_EXPORT2 ubidi_writeReverse(const char16_t *src, int32_t srcLength, char16_t *dest, int32_t destSize, uint16_t options, UErrorCode *pErrorCode) { … } // Ticket 20907 - The optimizer in MSVC/Visual Studio versions below 16.4 has trouble with this // function on Windows ARM64. As a work-around, we disable optimizations for this function. // This work-around could/should be removed once the following versions of Visual Studio are no // longer supported: All versions of VS2017, and versions of VS2019 below 16.4. #if (defined(_MSC_VER) && (defined(_M_ARM64)) && (_MSC_VER < 1924)) #pragma optimize( "", off ) #endif U_CAPI int32_t U_EXPORT2 ubidi_writeReordered(UBiDi *pBiDi, char16_t *dest, int32_t destSize, uint16_t options, UErrorCode *pErrorCode) { … } #if (defined(_MSC_VER) && (defined(_M_ARM64)) && (_MSC_VER < 1924)) #pragma optimize( "", on ) #endif