Files
swift-mirror/stdlib/public/SwiftShims/UnicodeShims.h
Michael Ilseman 5eb5e34897 [stdlib] Shims for UBreakIterator and thread local storage.
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.
2017-05-16 20:28:31 -07:00

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