mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Introduce shims for using UBreakIterators from ICU. Also introduce shims for using thread local storage via pthreads. We will be relying on ICU and UBreakIterators for grapheme breaking. But, UBreakIterators are very expensive to create, especially for the way we do grapheme breaking, which is relatively stateless. Thus, we will stash one or more into thread local storage and reset it as needed. Note: Currently, pthread_key_t is hard coded for a single platform (Darwin), but I have a static_assert alongside directions on how to adapt it to any future platforms who differ in key type.
333 lines
13 KiB
C++
333 lines
13 KiB
C++
//===--- UnicodeShims.h - Access to Unicode data for the core stdlib ------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Data structures required for Unicode support in Swift that are
|
|
// statically initialized in its runtime's C++ source.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef SWIFT_STDLIB_SHIMS_UNICODESHIMS_H_
|
|
#define SWIFT_STDLIB_SHIMS_UNICODESHIMS_H_
|
|
|
|
#include "SwiftStdint.h"
|
|
#include "SwiftStdbool.h"
|
|
#include "Visibility.h"
|
|
|
|
#if __has_feature(nullability)
|
|
#pragma clang assume_nonnull begin
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
namespace swift { extern "C" {
|
|
#endif
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
const __swift_uint8_t *_swift_stdlib_GraphemeClusterBreakPropertyTrie;
|
|
|
|
struct _swift_stdlib_GraphemeClusterBreakPropertyTrieMetadataTy {
|
|
unsigned BMPFirstLevelIndexBits;
|
|
unsigned BMPDataOffsetBits;
|
|
unsigned SuppFirstLevelIndexBits;
|
|
unsigned SuppSecondLevelIndexBits;
|
|
unsigned SuppDataOffsetBits;
|
|
|
|
unsigned BMPLookupBytesPerEntry;
|
|
unsigned BMPDataBytesPerEntry;
|
|
unsigned SuppLookup1BytesPerEntry;
|
|
unsigned SuppLookup2BytesPerEntry;
|
|
unsigned SuppDataBytesPerEntry;
|
|
|
|
unsigned TrieSize;
|
|
|
|
unsigned BMPLookupBytesOffset;
|
|
unsigned BMPDataBytesOffset;
|
|
unsigned SuppLookup1BytesOffset;
|
|
unsigned SuppLookup2BytesOffset;
|
|
unsigned SuppDataBytesOffset;
|
|
};
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
const struct _swift_stdlib_GraphemeClusterBreakPropertyTrieMetadataTy
|
|
_swift_stdlib_GraphemeClusterBreakPropertyTrieMetadata;
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
const __swift_uint16_t *
|
|
_swift_stdlib_ExtendedGraphemeClusterNoBoundaryRulesMatrix;
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
SWIFT_READONLY __swift_int32_t
|
|
_swift_stdlib_unicode_compare_utf16_utf16(const __swift_uint16_t *Left,
|
|
__swift_int32_t LeftLength,
|
|
const __swift_uint16_t *Right,
|
|
__swift_int32_t RightLength);
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
SWIFT_READONLY __swift_int32_t
|
|
_swift_stdlib_unicode_compare_utf8_utf16(const unsigned char *Left,
|
|
__swift_int32_t LeftLength,
|
|
const __swift_uint16_t *Right,
|
|
__swift_int32_t RightLength);
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
SWIFT_READONLY __swift_int32_t
|
|
_swift_stdlib_unicode_compare_utf8_utf8(const unsigned char *Left,
|
|
__swift_int32_t LeftLength,
|
|
const unsigned char *Right,
|
|
__swift_int32_t RightLength);
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
void *_swift_stdlib_unicodeCollationIterator_create(
|
|
const __swift_uint16_t *Str,
|
|
__swift_uint32_t Length);
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
__swift_int32_t _swift_stdlib_unicodeCollationIterator_next(
|
|
void *CollationIterator, __swift_bool *HitEnd);
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
void _swift_stdlib_unicodeCollationIterator_delete(
|
|
void *CollationIterator);
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
const __swift_int32_t *_swift_stdlib_unicode_getASCIICollationTable();
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
__swift_int32_t _swift_stdlib_unicode_strToUpper(
|
|
__swift_uint16_t *Destination, __swift_int32_t DestinationCapacity,
|
|
const __swift_uint16_t *Source, __swift_int32_t SourceLength);
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
__swift_int32_t _swift_stdlib_unicode_strToLower(
|
|
__swift_uint16_t *Destination, __swift_int32_t DestinationCapacity,
|
|
const __swift_uint16_t *Source, __swift_int32_t SourceLength);
|
|
|
|
typedef enum __swift_stdlib_UErrorCode {
|
|
__swift_stdlib_U_USING_FALLBACK_WARNING = -128,
|
|
__swift_stdlib_U_ERROR_WARNING_START = -128,
|
|
__swift_stdlib_U_USING_DEFAULT_WARNING = -127,
|
|
__swift_stdlib_U_SAFECLONE_ALLOCATED_WARNING = -126,
|
|
__swift_stdlib_U_STATE_OLD_WARNING = -125,
|
|
__swift_stdlib_U_STRING_NOT_TERMINATED_WARNING = -124,
|
|
__swift_stdlib_U_SORT_KEY_TOO_SHORT_WARNING = -123,
|
|
__swift_stdlib_U_AMBIGUOUS_ALIAS_WARNING = -122,
|
|
__swift_stdlib_U_DIFFERENT_UCA_VERSION = -121,
|
|
__swift_stdlib_U_PLUGIN_CHANGED_LEVEL_WARNING = -120,
|
|
__swift_stdlib_U_ERROR_WARNING_LIMIT,
|
|
__swift_stdlib_U_ZERO_ERROR = 0,
|
|
__swift_stdlib_U_ILLEGAL_ARGUMENT_ERROR = 1,
|
|
__swift_stdlib_U_MISSING_RESOURCE_ERROR = 2,
|
|
__swift_stdlib_U_INVALID_FORMAT_ERROR = 3,
|
|
__swift_stdlib_U_FILE_ACCESS_ERROR = 4,
|
|
__swift_stdlib_U_INTERNAL_PROGRAM_ERROR = 5,
|
|
__swift_stdlib_U_MESSAGE_PARSE_ERROR = 6,
|
|
__swift_stdlib_U_MEMORY_ALLOCATION_ERROR = 7,
|
|
__swift_stdlib_U_INDEX_OUTOFBOUNDS_ERROR = 8,
|
|
__swift_stdlib_U_PARSE_ERROR = 9,
|
|
__swift_stdlib_U_INVALID_CHAR_FOUND = 10,
|
|
__swift_stdlib_U_TRUNCATED_CHAR_FOUND = 11,
|
|
__swift_stdlib_U_ILLEGAL_CHAR_FOUND = 12,
|
|
__swift_stdlib_U_INVALID_TABLE_FORMAT = 13,
|
|
__swift_stdlib_U_INVALID_TABLE_FILE = 14,
|
|
__swift_stdlib_U_BUFFER_OVERFLOW_ERROR = 15,
|
|
__swift_stdlib_U_UNSUPPORTED_ERROR = 16,
|
|
__swift_stdlib_U_RESOURCE_TYPE_MISMATCH = 17,
|
|
__swift_stdlib_U_ILLEGAL_ESCAPE_SEQUENCE = 18,
|
|
__swift_stdlib_U_UNSUPPORTED_ESCAPE_SEQUENCE = 19,
|
|
__swift_stdlib_U_NO_SPACE_AVAILABLE = 20,
|
|
__swift_stdlib_U_CE_NOT_FOUND_ERROR = 21,
|
|
__swift_stdlib_U_PRIMARY_TOO_LONG_ERROR = 22,
|
|
__swift_stdlib_U_STATE_TOO_OLD_ERROR = 23,
|
|
__swift_stdlib_U_TOO_MANY_ALIASES_ERROR = 24,
|
|
__swift_stdlib_U_ENUM_OUT_OF_SYNC_ERROR = 25,
|
|
__swift_stdlib_U_INVARIANT_CONVERSION_ERROR = 26,
|
|
__swift_stdlib_U_INVALID_STATE_ERROR = 27,
|
|
__swift_stdlib_U_COLLATOR_VERSION_MISMATCH = 28,
|
|
__swift_stdlib_U_USELESS_COLLATOR_ERROR = 29,
|
|
__swift_stdlib_U_NO_WRITE_PERMISSION = 30,
|
|
__swift_stdlib_U_STANDARD_ERROR_LIMIT,
|
|
__swift_stdlib_U_BAD_VARIABLE_DEFINITION = 0x10000,
|
|
__swift_stdlib_U_PARSE_ERROR_START = 0x10000,
|
|
__swift_stdlib_U_MALFORMED_RULE,
|
|
__swift_stdlib_U_MALFORMED_SET,
|
|
__swift_stdlib_U_MALFORMED_SYMBOL_REFERENCE,
|
|
__swift_stdlib_U_MALFORMED_UNICODE_ESCAPE,
|
|
__swift_stdlib_U_MALFORMED_VARIABLE_DEFINITION,
|
|
__swift_stdlib_U_MALFORMED_VARIABLE_REFERENCE,
|
|
__swift_stdlib_U_MISMATCHED_SEGMENT_DELIMITERS,
|
|
__swift_stdlib_U_MISPLACED_ANCHOR_START,
|
|
__swift_stdlib_U_MISPLACED_CURSOR_OFFSET,
|
|
__swift_stdlib_U_MISPLACED_QUANTIFIER,
|
|
__swift_stdlib_U_MISSING_OPERATOR,
|
|
__swift_stdlib_U_MISSING_SEGMENT_CLOSE,
|
|
__swift_stdlib_U_MULTIPLE_ANTE_CONTEXTS,
|
|
__swift_stdlib_U_MULTIPLE_CURSORS,
|
|
__swift_stdlib_U_MULTIPLE_POST_CONTEXTS,
|
|
__swift_stdlib_U_TRAILING_BACKSLASH,
|
|
__swift_stdlib_U_UNDEFINED_SEGMENT_REFERENCE,
|
|
__swift_stdlib_U_UNDEFINED_VARIABLE,
|
|
__swift_stdlib_U_UNQUOTED_SPECIAL,
|
|
__swift_stdlib_U_UNTERMINATED_QUOTE,
|
|
__swift_stdlib_U_RULE_MASK_ERROR,
|
|
__swift_stdlib_U_MISPLACED_COMPOUND_FILTER,
|
|
__swift_stdlib_U_MULTIPLE_COMPOUND_FILTERS,
|
|
__swift_stdlib_U_INVALID_RBT_SYNTAX,
|
|
__swift_stdlib_U_INVALID_PROPERTY_PATTERN,
|
|
__swift_stdlib_U_MALFORMED_PRAGMA,
|
|
__swift_stdlib_U_UNCLOSED_SEGMENT,
|
|
__swift_stdlib_U_ILLEGAL_CHAR_IN_SEGMENT,
|
|
__swift_stdlib_U_VARIABLE_RANGE_EXHAUSTED,
|
|
__swift_stdlib_U_VARIABLE_RANGE_OVERLAP,
|
|
__swift_stdlib_U_ILLEGAL_CHARACTER,
|
|
__swift_stdlib_U_INTERNAL_TRANSLITERATOR_ERROR,
|
|
__swift_stdlib_U_INVALID_ID,
|
|
__swift_stdlib_U_INVALID_FUNCTION,
|
|
__swift_stdlib_U_PARSE_ERROR_LIMIT,
|
|
__swift_stdlib_U_UNEXPECTED_TOKEN = 0x10100,
|
|
__swift_stdlib_U_FMT_PARSE_ERROR_START = 0x10100,
|
|
__swift_stdlib_U_MULTIPLE_DECIMAL_SEPARATORS,
|
|
__swift_stdlib_U_MULTIPLE_DECIMAL_SEPERATORS =
|
|
__swift_stdlib_U_MULTIPLE_DECIMAL_SEPARATORS,
|
|
__swift_stdlib_U_MULTIPLE_EXPONENTIAL_SYMBOLS,
|
|
__swift_stdlib_U_MALFORMED_EXPONENTIAL_PATTERN,
|
|
__swift_stdlib_U_MULTIPLE_PERCENT_SYMBOLS,
|
|
__swift_stdlib_U_MULTIPLE_PERMILL_SYMBOLS,
|
|
__swift_stdlib_U_MULTIPLE_PAD_SPECIFIERS,
|
|
__swift_stdlib_U_PATTERN_SYNTAX_ERROR,
|
|
__swift_stdlib_U_ILLEGAL_PAD_POSITION,
|
|
__swift_stdlib_U_UNMATCHED_BRACES,
|
|
__swift_stdlib_U_UNSUPPORTED_PROPERTY,
|
|
__swift_stdlib_U_UNSUPPORTED_ATTRIBUTE,
|
|
__swift_stdlib_U_ARGUMENT_TYPE_MISMATCH,
|
|
__swift_stdlib_U_DUPLICATE_KEYWORD,
|
|
__swift_stdlib_U_UNDEFINED_KEYWORD,
|
|
__swift_stdlib_U_DEFAULT_KEYWORD_MISSING,
|
|
__swift_stdlib_U_DECIMAL_NUMBER_SYNTAX_ERROR,
|
|
__swift_stdlib_U_FORMAT_INEXACT_ERROR,
|
|
__swift_stdlib_U_FMT_PARSE_ERROR_LIMIT,
|
|
__swift_stdlib_U_BRK_INTERNAL_ERROR = 0x10200,
|
|
__swift_stdlib_U_BRK_ERROR_START = 0x10200,
|
|
__swift_stdlib_U_BRK_HEX_DIGITS_EXPECTED,
|
|
__swift_stdlib_U_BRK_SEMICOLON_EXPECTED,
|
|
__swift_stdlib_U_BRK_RULE_SYNTAX,
|
|
__swift_stdlib_U_BRK_UNCLOSED_SET,
|
|
__swift_stdlib_U_BRK_ASSIGN_ERROR,
|
|
__swift_stdlib_U_BRK_VARIABLE_REDFINITION,
|
|
__swift_stdlib_U_BRK_MISMATCHED_PAREN,
|
|
__swift_stdlib_U_BRK_NEW_LINE_IN_QUOTED_STRING,
|
|
__swift_stdlib_U_BRK_UNDEFINED_VARIABLE,
|
|
__swift_stdlib_U_BRK_INIT_ERROR,
|
|
__swift_stdlib_U_BRK_RULE_EMPTY_SET,
|
|
__swift_stdlib_U_BRK_UNRECOGNIZED_OPTION,
|
|
__swift_stdlib_U_BRK_MALFORMED_RULE_TAG,
|
|
__swift_stdlib_U_BRK_ERROR_LIMIT,
|
|
__swift_stdlib_U_REGEX_INTERNAL_ERROR = 0x10300,
|
|
__swift_stdlib_U_REGEX_ERROR_START = 0x10300,
|
|
__swift_stdlib_U_REGEX_RULE_SYNTAX,
|
|
__swift_stdlib_U_REGEX_INVALID_STATE,
|
|
__swift_stdlib_U_REGEX_BAD_ESCAPE_SEQUENCE,
|
|
__swift_stdlib_U_REGEX_PROPERTY_SYNTAX,
|
|
__swift_stdlib_U_REGEX_UNIMPLEMENTED,
|
|
__swift_stdlib_U_REGEX_MISMATCHED_PAREN,
|
|
__swift_stdlib_U_REGEX_NUMBER_TOO_BIG,
|
|
__swift_stdlib_U_REGEX_BAD_INTERVAL,
|
|
__swift_stdlib_U_REGEX_MAX_LT_MIN,
|
|
__swift_stdlib_U_REGEX_INVALID_BACK_REF,
|
|
__swift_stdlib_U_REGEX_INVALID_FLAG,
|
|
__swift_stdlib_U_REGEX_LOOK_BEHIND_LIMIT,
|
|
__swift_stdlib_U_REGEX_SET_CONTAINS_STRING,
|
|
#ifndef __swift_stdlib_U_HIDE_DEPRECATED_API
|
|
__swift_stdlib_U_REGEX_OCTAL_TOO_BIG,
|
|
#endif
|
|
__swift_stdlib_U_REGEX_MISSING_CLOSE_BRACKET =
|
|
__swift_stdlib_U_REGEX_SET_CONTAINS_STRING + 2,
|
|
__swift_stdlib_U_REGEX_INVALID_RANGE,
|
|
__swift_stdlib_U_REGEX_STACK_OVERFLOW,
|
|
__swift_stdlib_U_REGEX_TIME_OUT,
|
|
__swift_stdlib_U_REGEX_STOPPED_BY_CALLER,
|
|
#ifndef __swift_stdlib_U_HIDE_DRAFT_API
|
|
__swift_stdlib_U_REGEX_PATTERN_TOO_BIG,
|
|
__swift_stdlib_U_REGEX_INVALID_CAPTURE_GROUP_NAME,
|
|
#endif
|
|
__swift_stdlib_U_REGEX_ERROR_LIMIT =
|
|
__swift_stdlib_U_REGEX_STOPPED_BY_CALLER + 3,
|
|
__swift_stdlib_U_IDNA_PROHIBITED_ERROR = 0x10400,
|
|
__swift_stdlib_U_IDNA_ERROR_START = 0x10400,
|
|
__swift_stdlib_U_IDNA_UNASSIGNED_ERROR,
|
|
__swift_stdlib_U_IDNA_CHECK_BIDI_ERROR,
|
|
__swift_stdlib_U_IDNA_STD3_ASCII_RULES_ERROR,
|
|
__swift_stdlib_U_IDNA_ACE_PREFIX_ERROR,
|
|
__swift_stdlib_U_IDNA_VERIFICATION_ERROR,
|
|
__swift_stdlib_U_IDNA_LABEL_TOO_LONG_ERROR,
|
|
__swift_stdlib_U_IDNA_ZERO_LENGTH_LABEL_ERROR,
|
|
__swift_stdlib_U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR,
|
|
__swift_stdlib_U_IDNA_ERROR_LIMIT,
|
|
__swift_stdlib_U_STRINGPREP_PROHIBITED_ERROR =
|
|
__swift_stdlib_U_IDNA_PROHIBITED_ERROR,
|
|
__swift_stdlib_U_STRINGPREP_UNASSIGNED_ERROR =
|
|
__swift_stdlib_U_IDNA_UNASSIGNED_ERROR,
|
|
__swift_stdlib_U_STRINGPREP_CHECK_BIDI_ERROR =
|
|
__swift_stdlib_U_IDNA_CHECK_BIDI_ERROR,
|
|
__swift_stdlib_U_PLUGIN_ERROR_START = 0x10500,
|
|
__swift_stdlib_U_PLUGIN_TOO_HIGH = 0x10500,
|
|
__swift_stdlib_U_PLUGIN_DIDNT_SET_LEVEL,
|
|
__swift_stdlib_U_PLUGIN_ERROR_LIMIT,
|
|
__swift_stdlib_U_ERROR_LIMIT = __swift_stdlib_U_PLUGIN_ERROR_LIMIT
|
|
} __swift_stdlib_UErrorCode;
|
|
|
|
typedef enum __swift_stdlib_UBreakIteratorType {
|
|
__swift_stdlib_UBRK_CHARACTER = 0,
|
|
__swift_stdlib_UBRK_WORD = 1,
|
|
__swift_stdlib_UBRK_LINE = 2,
|
|
__swift_stdlib_UBRK_SENTENCE = 3,
|
|
#ifndef U_HIDE_DEPRECATED_API
|
|
__swift_stdlib_UBRK_TITLE = 4,
|
|
#endif
|
|
__swift_stdlib_UBRK_COUNT = 5
|
|
} __swift_stdlib_UBreakIteratorType;
|
|
|
|
typedef struct __swift_stdlib_UBreakIterator __swift_stdlib_UBreakIterator;
|
|
typedef __swift_uint16_t __swift_stdlib_UChar;
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
void __swift_stdlib_ubrk_close(__swift_stdlib_UBreakIterator *bi);
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
__swift_stdlib_UBreakIterator *
|
|
__swift_stdlib_ubrk_open(__swift_stdlib_UBreakIteratorType type,
|
|
const char *_Null_unspecified locale,
|
|
const __swift_stdlib_UChar *_Null_unspecified text,
|
|
__swift_int32_t textLength,
|
|
__swift_stdlib_UErrorCode *status);
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
void __swift_stdlib_ubrk_setText(__swift_stdlib_UBreakIterator *bi,
|
|
const __swift_stdlib_UChar *text,
|
|
__swift_int32_t textLength,
|
|
__swift_stdlib_UErrorCode *status);
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
__swift_int32_t __swift_stdlib_ubrk_preceding(__swift_stdlib_UBreakIterator *bi,
|
|
__swift_int32_t offset);
|
|
|
|
SWIFT_RUNTIME_STDLIB_INTERFACE
|
|
__swift_int32_t __swift_stdlib_ubrk_following(__swift_stdlib_UBreakIterator *bi,
|
|
__swift_int32_t offset);
|
|
|
|
#ifdef __cplusplus
|
|
}} // extern "C", namespace swift
|
|
#endif
|
|
|
|
#if __has_feature(nullability)
|
|
#pragma clang assume_nonnull end
|
|
#endif
|
|
|
|
#endif
|