File: string_shims.c

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (236 lines) | stat: -rw-r--r-- 10,799 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2022 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
//
//===----------------------------------------------------------------------===//

#include "include/_CShimsTargetConditionals.h"
#include "include/string_shims.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <float.h>
#include <assert.h>

#if defined(TARGET_OS_EXCLAVEKIT) && TARGET_OS_EXCLAVEKIT
#include <strings.h>
#endif

int _stringshims_strncasecmp_l(const char * _Nullable s1,
                      const char * _Nullable s2,
                      size_t n,
                      locale_t _Nullable loc)
{
#if TARGET_OS_WINDOWS
  static _locale_t storage;
  static _locale_t *cloc = NULL;
  if (cloc == NULL) {
    storage = _create_locale(LC_ALL, "C");
    cloc = &storage;
  }
  return _strnicmp_l(s1, s2, n, loc ? loc : *cloc);
#else
    if (loc != NULL) {
#if (defined(TARGET_OS_EXCLAVEKIT) && TARGET_OS_EXCLAVEKIT) || \
      (defined(TARGET_OS_ANDROID) && TARGET_OS_ANDROID && __ANDROID_API__ < 23)
        abort();
#else
        return strncasecmp_l(s1, s2, n, loc);
#endif
    }
    // On Darwin, NULL loc means unlocalized compare.
    // Uses the standard C locale for Linux in this case
#if (defined(TARGET_OS_EXCLAVEKIT) && TARGET_OS_EXCLAVEKIT) || \
      (defined(TARGET_OS_ANDROID) && TARGET_OS_ANDROID && __ANDROID_API__ < 23)
    return strncasecmp(s1, s2, n);
#elif TARGET_OS_MAC
    return strncasecmp_l(s1, s2, n, NULL);
#else
    locale_t clocale = newlocale(LC_ALL_MASK, "C", (locale_t)0);
    return strncasecmp_l(s1, s2, n, clocale);
#endif // TARGET_OS_MAC
#endif // TARGET_OS_WINDOWS
}

double _stringshims_strtod_l(const char * _Nullable restrict nptr,
                 char * _Nullable * _Nullable restrict endptr,
                 locale_t _Nullable loc)
{
#if defined(TARGET_OS_EXCLAVEKIT) && TARGET_OS_EXCLAVEKIT
    assert(loc == NULL);
    return strtod_l(nptr, endptr, NULL);
#elif TARGET_OS_MAC
    return strtod_l(nptr, endptr, loc);
#elif TARGET_OS_WINDOWS
    return _strtod_l(nptr, endptr, loc);
#else
    // Use the C locale
    locale_t clocale = newlocale(LC_ALL_MASK, "C", (locale_t)0);
    locale_t oldLocale = uselocale(clocale);
    double result = strtod(nptr, endptr);
    // Restore locale
    uselocale(oldLocale);
    return result;
#endif
}

float _stringshims_strtof_l(const char * _Nullable restrict nptr,
                 char * _Nullable * _Nullable restrict endptr,
                 locale_t _Nullable loc)
{
#if defined(TARGET_OS_EXCLAVEKIT) && TARGET_OS_EXCLAVEKIT
    assert(loc == NULL);
    return strtof_l(nptr, endptr, NULL);
#elif TARGET_OS_MAC
    return strtof_l(nptr, endptr, loc);
#elif TARGET_OS_WINDOWS
    return _strtof_l(nptr, endptr, loc);
#else
    // Use the C locale
    locale_t clocale = newlocale(LC_ALL_MASK, "C", (locale_t)0);
    locale_t oldLocale = uselocale(clocale);
    float result = strtof(nptr, endptr);
    // Restore locale
    uselocale(oldLocale);
    return result;
#endif
}

const uint8_t _stringshims_macroman_mapping[_STRINGSHIMS_MACROMAN_MAP_SIZE][3] = {
    { 0xC2, 0xA0, 0x00 }, /* NO-BREAK SPACE */
    { 0xC2, 0xA1, 0x00 }, /* INVERTED EXCLAMATION MARK */
    { 0xC2, 0xA2, 0x00 }, /* CENT SIGN */
    { 0xC2, 0xA3, 0x00 }, /* POUND SIGN */
    { 0xC2, 0xA5, 0x00 }, /* YEN SIGN */
    { 0xC2, 0xA7, 0x00 }, /* SECTION SIGN */
    { 0xC2, 0xA8, 0x00 }, /* DIAERESIS */
    { 0xC2, 0xA9, 0x00 }, /* COPYRIGHT SIGN */
    { 0xC2, 0xAA, 0x00 }, /* FEMININE ORDINAL INDICATOR */
    { 0xC2, 0xAB, 0x00 }, /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */
    { 0xC2, 0xAC, 0x00 }, /* NOT SIGN */
    { 0xC2, 0xAE, 0x00 }, /* REGISTERED SIGN */
    { 0xC2, 0xAF, 0x00 }, /* MACRON */
    { 0xC2, 0xB0, 0x00 }, /* DEGREE SIGN */
    { 0xC2, 0xB1, 0x00 }, /* PLUS-MINUS SIGN */
    { 0xC2, 0xB4, 0x00 }, /* ACUTE ACCENT */
    { 0xC2, 0xB5, 0x00 }, /* MICRO SIGN */
    { 0xC2, 0xB6, 0x00 }, /* PILCROW SIGN */
    { 0xC2, 0xB7, 0x00 }, /* MIDDLE DOT */
    { 0xC2, 0xB8, 0x00 }, /* CEDILLA */
    { 0xC2, 0xBA, 0x00 }, /* MASCULINE ORDINAL INDICATOR */
    { 0xC2, 0xBB, 0x00 }, /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */
    { 0xC2, 0xBF, 0x00 }, /* INVERTED QUESTION MARK */
    { 0xC3, 0x80, 0x00 }, /* LATIN CAPITAL LETTER A WITH GRAVE */
    { 0xC3, 0x81, 0x00 }, /* LATIN CAPITAL LETTER A WITH ACUTE */
    { 0xC3, 0x82, 0x00 }, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
    { 0xC3, 0x83, 0x00 }, /* LATIN CAPITAL LETTER A WITH TILDE */
    { 0xC3, 0x84, 0x00 }, /* LATIN CAPITAL LETTER A WITH DIAERESIS */
    { 0xC3, 0x85, 0x00 }, /* LATIN CAPITAL LETTER A WITH RING ABOVE */
    { 0xC3, 0x86, 0x00 }, /* LATIN CAPITAL LIGATURE AE */
    { 0xC3, 0x87, 0x00 }, /* LATIN CAPITAL LETTER C WITH CEDILLA */
    { 0xC3, 0x88, 0x00 }, /* LATIN CAPITAL LETTER E WITH GRAVE */
    { 0xC3, 0x89, 0x00 }, /* LATIN CAPITAL LETTER E WITH ACUTE */
    { 0xC3, 0x8A, 0x00 }, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
    { 0xC3, 0x8B, 0x00 }, /* LATIN CAPITAL LETTER E WITH DIAERESIS */
    { 0xC3, 0x8C, 0x00 }, /* LATIN CAPITAL LETTER I WITH GRAVE */
    { 0xC3, 0x8D, 0x00 }, /* LATIN CAPITAL LETTER I WITH ACUTE */
    { 0xC3, 0x8E, 0x00 }, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
    { 0xC3, 0x8F, 0x00 }, /* LATIN CAPITAL LETTER I WITH DIAERESIS */
    { 0xC3, 0x91, 0x00 }, /* LATIN CAPITAL LETTER N WITH TILDE */
    { 0xC3, 0x92, 0x00 }, /* LATIN CAPITAL LETTER O WITH GRAVE */
    { 0xC3, 0x93, 0x00 }, /* LATIN CAPITAL LETTER O WITH ACUTE */
    { 0xC3, 0x94, 0x00 }, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
    { 0xC3, 0x95, 0x00 }, /* LATIN CAPITAL LETTER O WITH TILDE */
    { 0xC3, 0x96, 0x00 }, /* LATIN CAPITAL LETTER O WITH DIAERESIS */
    { 0xC3, 0x98, 0x00 }, /* LATIN CAPITAL LETTER O WITH STROKE */
    { 0xC3, 0x99, 0x00 }, /* LATIN CAPITAL LETTER U WITH GRAVE */
    { 0xC3, 0x9A, 0x00 }, /* LATIN CAPITAL LETTER U WITH ACUTE */
    { 0xC3, 0x9B, 0x00 }, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
    { 0xC3, 0x9C, 0x00 }, /* LATIN CAPITAL LETTER U WITH DIAERESIS */
    { 0xC3, 0x9F, 0x00 }, /* LATIN SMALL LETTER SHARP S */
    { 0xC3, 0xA0, 0x00 }, /* LATIN SMALL LETTER A WITH GRAVE */
    { 0xC3, 0xA1, 0x00 }, /* LATIN SMALL LETTER A WITH ACUTE */
    { 0xC3, 0xA2, 0x00 }, /* LATIN SMALL LETTER A WITH CIRCUMFLEX */
    { 0xC3, 0xA3, 0x00 }, /* LATIN SMALL LETTER A WITH TILDE */
    { 0xC3, 0xA4, 0x00 }, /* LATIN SMALL LETTER A WITH DIAERESIS */
    { 0xC3, 0xA5, 0x00 }, /* LATIN SMALL LETTER A WITH RING ABOVE */
    { 0xC3, 0xA6, 0x00 }, /* LATIN SMALL LIGATURE AE */
    { 0xC3, 0xA7, 0x00 }, /* LATIN SMALL LETTER C WITH CEDILLA */
    { 0xC3, 0xA8, 0x00 }, /* LATIN SMALL LETTER E WITH GRAVE */
    { 0xC3, 0xA9, 0x00 }, /* LATIN SMALL LETTER E WITH ACUTE */
    { 0xC3, 0xAA, 0x00 }, /* LATIN SMALL LETTER E WITH CIRCUMFLEX */
    { 0xC3, 0xAB, 0x00 }, /* LATIN SMALL LETTER E WITH DIAERESIS */
    { 0xC3, 0xAC, 0x00 }, /* LATIN SMALL LETTER I WITH GRAVE */
    { 0xC3, 0xAD, 0x00 }, /* LATIN SMALL LETTER I WITH ACUTE */
    { 0xC3, 0xAE, 0x00 }, /* LATIN SMALL LETTER I WITH CIRCUMFLEX */
    { 0xC3, 0xAF, 0x00 }, /* LATIN SMALL LETTER I WITH DIAERESIS */
    { 0xC3, 0xB1, 0x00 }, /* LATIN SMALL LETTER N WITH TILDE */
    { 0xC3, 0xB2, 0x00 }, /* LATIN SMALL LETTER O WITH GRAVE */
    { 0xC3, 0xB3, 0x00 }, /* LATIN SMALL LETTER O WITH ACUTE */
    { 0xC3, 0xB4, 0x00 }, /* LATIN SMALL LETTER O WITH CIRCUMFLEX */
    { 0xC3, 0xB5, 0x00 }, /* LATIN SMALL LETTER O WITH TILDE */
    { 0xC3, 0xB6, 0x00 }, /* LATIN SMALL LETTER O WITH DIAERESIS */
    { 0xC3, 0xB7, 0x00 }, /* DIVISION SIGN */
    { 0xC3, 0xB8, 0x00 }, /* LATIN SMALL LETTER O WITH STROKE */
    { 0xC3, 0xB9, 0x00 }, /* LATIN SMALL LETTER U WITH GRAVE */
    { 0xC3, 0xBA, 0x00 }, /* LATIN SMALL LETTER U WITH ACUTE */
    { 0xC3, 0xBB, 0x00 }, /* LATIN SMALL LETTER U WITH CIRCUMFLEX */
    { 0xC3, 0xBC, 0x00 }, /* LATIN SMALL LETTER U WITH DIAERESIS */
    { 0xC3, 0xBF, 0x00 }, /* LATIN SMALL LETTER Y WITH DIAERESIS */
    { 0xC4, 0xB1, 0x00 }, /* LATIN SMALL LETTER DOTLESS I */
    { 0xC5, 0x92, 0x00 }, /* LATIN CAPITAL LIGATURE OE */
    { 0xC5, 0x93, 0x00 }, /* LATIN SMALL LIGATURE OE */
    { 0xC5, 0xB8, 0x00 }, /* LATIN CAPITAL LETTER Y WITH DIAERESIS */
    { 0xC6, 0x92, 0x00 }, /* LATIN SMALL LETTER F WITH HOOK */
    { 0xCB, 0x86, 0x00 }, /* MODIFIER LETTER CIRCUMFLEX ACCENT */
    { 0xCB, 0x87, 0x00 }, /* CARON */
    { 0xCB, 0x98, 0x00 }, /* BREVE */
    { 0xCB, 0x99, 0x00 }, /* DOT ABOVE */
    { 0xCB, 0x9A, 0x00 }, /* RING ABOVE */
    { 0xCB, 0x9B, 0x00 }, /* OGONEK */
    { 0xCB, 0x9C, 0x00 }, /* SMALL TILDE */
    { 0xCB, 0x9D, 0x00 }, /* DOUBLE ACUTE ACCENT */
    { 0xCE, 0xA9, 0x00 }, /* OHM SIGN (Canonical ?) */
    { 0xCF, 0x80, 0x00 }, /* GREEK SMALL LETTER PI */
    { 0xE2, 0x80, 0x93 }, /* EN DASH */
    { 0xE2, 0x80, 0x94 }, /* EM DASH */
    { 0xE2, 0x80, 0x98 }, /* LEFT SINGLE QUOTATION MARK */
    { 0xE2, 0x80, 0x99 }, /* RIGHT SINGLE QUOTATION MARK */
    { 0xE2, 0x80, 0x9A }, /* SINGLE LOW-9 QUOTATION MARK */
    { 0xE2, 0x80, 0x9C }, /* LEFT DOUBLE QUOTATION MARK */
    { 0xE2, 0x80, 0x9D }, /* RIGHT DOUBLE QUOTATION MARK */
    { 0xE2, 0x80, 0x9E }, /* DOUBLE LOW-9 QUOTATION MARK */
    { 0xE2, 0x80, 0xA0 }, /* DAGGER */
    { 0xE2, 0x80, 0xA1 }, /* DOUBLE DAGGER */
    { 0xE2, 0x80, 0xA2 }, /* BULLET */
    { 0xE2, 0x80, 0xA6 }, /* HORIZONTAL ELLIPSIS */
    { 0xE2, 0x80, 0xB0 }, /* PER MILLE SIGN */
    { 0xE2, 0x80, 0xB9 }, /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */
    { 0xE2, 0x80, 0xBA }, /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */
    { 0xE2, 0x81, 0x84 }, /* FRACTION SLASH */
    { 0xE2, 0x82, 0xAC }, /* EURO SIGN */
    { 0xE2, 0x84, 0xA2 }, /* TRADE MARK SIGN */
    { 0xE2, 0x84, 0xA6 }, /* OHM SIGN */
    { 0xE2, 0x88, 0x82 }, /* PARTIAL DIFFERENTIAL */
    { 0xE2, 0x88, 0x86 }, /* INCREMENT */
    { 0xE2, 0x88, 0x8F }, /* N-ARY PRODUCT */
    { 0xE2, 0x88, 0x91 }, /* N-ARY SUMMATION */
    { 0xE2, 0x88, 0x9A }, /* SQUARE ROOT */
    { 0xE2, 0x88, 0x9E }, /* INFINITY */
    { 0xE2, 0x88, 0xAB }, /* INTEGRAL */
    { 0xE2, 0x89, 0x88 }, /* ALMOST EQUAL TO */
    { 0xE2, 0x89, 0xA0 }, /* NOT EQUAL TO */
    { 0xE2, 0x89, 0xA4 }, /* LESS-THAN OR EQUAL TO */
    { 0xE2, 0x89, 0xA5 }, /* GREATER-THAN OR EQUAL TO */
    { 0xE2, 0x97, 0x8A }, /* LOZENGE */
    { 0xEF, 0xA3, 0xBF }, /* Apple logo */
    { 0xEF, 0xAC, 0x81 }, /* LATIN SMALL LIGATURE FI */
    { 0xEF, 0xAC, 0x82 }, /* LATIN SMALL LIGATURE FL */
};