mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-28 15:28:30 +00:00
Make improvements
- wcsstr() is now linearly complex - strstr16() is now linearly complex - strstr() is now vectorized on aarch64 (10x) - strstr() now uses KMP on pathological cases - memmem() is now vectorized on aarch64 (10x) - memmem() now uses KMP on pathological cases - Disable shared_ptr::owner_before until fixed - Make iswlower(), iswupper() consistent with glibc - Remove figure space from iswspace() implementation - Include line and paragraph separator in iswcntrl() - Use Musl wcwidth(), iswalpha(), iswpunct(), towlower(), towupper()
This commit is contained in:
parent
e1528a71e2
commit
7c83f4abc8
67 changed files with 5602 additions and 5165 deletions
|
@ -40,7 +40,7 @@ LIBC_FMT_A_DIRECTDEPS = \
|
|||
LIBC_STR \
|
||||
LIBC_SYSV \
|
||||
LIBC_TINYMATH \
|
||||
THIRD_PARTY_COMPILER_RT
|
||||
THIRD_PARTY_COMPILER_RT \
|
||||
|
||||
LIBC_FMT_A_DEPS := \
|
||||
$(call uniq,$(foreach x,$(LIBC_FMT_A_DIRECTDEPS),$($(x))))
|
||||
|
|
|
@ -16,15 +16,23 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/thread/thread.h"
|
||||
#ifdef _MSC_VER
|
||||
#include <intrin.h>
|
||||
#else
|
||||
#include <xmmintrin.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Yields hyperthread.
|
||||
*/
|
||||
void pthread_pause_np(void) {
|
||||
#if defined(__GNUC__) && defined(__aarch64__)
|
||||
__asm__ volatile("yield");
|
||||
#elif defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
|
||||
__asm__ volatile("pause");
|
||||
__asm__("yield");
|
||||
#elif defined(__x86_64__) || defined(__i386__)
|
||||
_mm_pause();
|
||||
#elif defined(__GNUC__) && (defined(__PPC__) || defined(__PPC64__))
|
||||
__asm__("or 27,27,27");
|
||||
#else
|
||||
// do nothing
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -4,9 +4,6 @@ COSMOPOLITAN_C_START_
|
|||
|
||||
void *bsearch(const void *, const void *, size_t, size_t,
|
||||
int (*)(const void *, const void *)) paramsnonnull() nosideeffect;
|
||||
void *bsearch_r(const void *, const void *, size_t, size_t,
|
||||
int (*)(const void *, const void *, void *), void *)
|
||||
paramsnonnull((1, 2, 5)) nosideeffect;
|
||||
void qsort3(void *, size_t, size_t, int (*)(const void *, const void *))
|
||||
paramsnonnull();
|
||||
void qsort(void *, size_t, size_t, int (*)(const void *, const void *))
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_ALG_BISECT_H_
|
||||
#define COSMOPOLITAN_LIBC_ALG_BISECT_H_
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
forceinline void *bisect(const void *k, const void *data, size_t n, size_t size,
|
||||
int cmp(const void *a, const void *b, void *arg),
|
||||
void *arg) {
|
||||
int c;
|
||||
const char *p;
|
||||
ssize_t m, l, r;
|
||||
if (n) {
|
||||
l = 0;
|
||||
r = n - 1;
|
||||
p = data;
|
||||
while (l <= r) {
|
||||
m = (l & r) + ((l ^ r) >> 1);
|
||||
c = cmp(k, p + m * size, arg);
|
||||
if (c > 0) {
|
||||
l = m + 1;
|
||||
} else if (c < 0) {
|
||||
r = m - 1;
|
||||
} else {
|
||||
return (char *)p + m * size;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* COSMOPOLITAN_LIBC_ALG_BISECT_H_ */
|
|
@ -1,29 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/mem/alg.h"
|
||||
#include "libc/mem/bisect.internal.h"
|
||||
|
||||
/**
|
||||
* Searches sorted array for exact item in logarithmic time.
|
||||
* @see bsearch_r()
|
||||
*/
|
||||
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size,
|
||||
int cmp(const void *a, const void *b)) {
|
||||
return bisect(key, base, nmemb, size, (void *)cmp, NULL);
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/mem/alg.h"
|
||||
#include "libc/mem/bisect.internal.h"
|
||||
|
||||
/**
|
||||
* Searches sorted array for exact item in logarithmic time.
|
||||
* @see bsearch()
|
||||
*/
|
||||
void *bsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
|
||||
int cmp(const void *a, const void *b, void *arg), void *arg) {
|
||||
return bisect(key, base, nmemb, size, cmp, arg);
|
||||
}
|
|
@ -71,8 +71,6 @@ o/$(MODE)/libc/nexgen32e/ksha512.o: libc/nexgen32e/ksha512.S
|
|||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||
o/$(MODE)/libc/nexgen32e/kcp437.o: libc/nexgen32e/kcp437.S
|
||||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||
o/$(MODE)/libc/nexgen32e/kreversebits.o: libc/nexgen32e/kreversebits.S
|
||||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||
o/$(MODE)/libc/nexgen32e/ktensindex.o: libc/nexgen32e/ktensindex.S
|
||||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||
o/$(MODE)/libc/nexgen32e/longjmp.o: libc/nexgen32e/longjmp.S
|
||||
|
|
|
@ -65,7 +65,6 @@ struct X86ProcessorModel {
|
|||
unsigned char grade;
|
||||
};
|
||||
|
||||
extern const size_t kX86ProcessorModelCount;
|
||||
extern const struct X86ProcessorModel kX86ProcessorModels[];
|
||||
|
||||
const struct X86ProcessorModel *getx86processormodel(short) nosideeffect;
|
||||
|
|
|
@ -33,24 +33,22 @@ privileged int __get_symbol(struct SymbolTable *t, intptr_t a) {
|
|||
// we don't want function tracing because:
|
||||
// function tracing depends on this function via kprintf
|
||||
unsigned l, m, r, n, k;
|
||||
if (!t && __symtab) {
|
||||
if (!t && __symtab)
|
||||
t = __symtab;
|
||||
}
|
||||
if (t) {
|
||||
l = 0;
|
||||
r = n = t->count;
|
||||
k = a - t->addr_base;
|
||||
while (l < r) {
|
||||
m = (l & r) + ((l ^ r) >> 1); // floor((a+b)/2)
|
||||
if (t->symbols[m].y < k) {
|
||||
if (k < t->symbols[m].x) {
|
||||
r = m;
|
||||
} else if (k > t->symbols[m].y) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
r = m;
|
||||
return m;
|
||||
}
|
||||
}
|
||||
if (l < n && t->symbols[l].x <= k && k <= t->symbols[l].y) {
|
||||
return l;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -12,16 +12,19 @@ LIBC_STR_A_INCS = $(filter %.inc,$(LIBC_STR_A_FILES))
|
|||
LIBC_STR_A_SRCS_A = $(filter %.s,$(LIBC_STR_A_FILES))
|
||||
LIBC_STR_A_SRCS_S = $(filter %.S,$(LIBC_STR_A_FILES))
|
||||
LIBC_STR_A_SRCS_C = $(filter %.c,$(LIBC_STR_A_FILES))
|
||||
LIBC_STR_A_SRCS_CC = $(filter %.cc,$(LIBC_STR_A_FILES))
|
||||
|
||||
LIBC_STR_A_SRCS = \
|
||||
$(LIBC_STR_A_SRCS_A) \
|
||||
$(LIBC_STR_A_SRCS_S) \
|
||||
$(LIBC_STR_A_SRCS_C)
|
||||
$(LIBC_STR_A_SRCS_C) \
|
||||
$(LIBC_STR_A_SRCS_CC)
|
||||
|
||||
LIBC_STR_A_OBJS = \
|
||||
$(LIBC_STR_A_SRCS_A:%.s=o/$(MODE)/%.o) \
|
||||
$(LIBC_STR_A_SRCS_S:%.S=o/$(MODE)/%.o) \
|
||||
$(LIBC_STR_A_SRCS_C:%.c=o/$(MODE)/%.o)
|
||||
$(LIBC_STR_A_SRCS_C:%.c=o/$(MODE)/%.o) \
|
||||
$(LIBC_STR_A_SRCS_CC:%.cc=o/$(MODE)/%.o)
|
||||
|
||||
LIBC_STR_A_CHECKS = \
|
||||
$(LIBC_STR_A).pkg \
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -16,7 +16,6 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/mem/bisect.internal.h"
|
||||
#include "libc/nexgen32e/x86info.h"
|
||||
|
||||
static int CmpX86ProcModelKey(const struct X86ProcessorModel *a,
|
||||
|
@ -32,7 +31,8 @@ static int CmpX86ProcModelKey(const struct X86ProcessorModel *a,
|
|||
* @see https://a4lg.com/tech/x86/database/x86-families-and-models.en.html
|
||||
*/
|
||||
const struct X86ProcessorModel *getx86processormodel(short key) {
|
||||
return bisect(&(struct X86ProcessorModel){key}, kX86ProcessorModels,
|
||||
kX86ProcessorModelCount, sizeof(struct X86ProcessorModel),
|
||||
(void *)CmpX86ProcModelKey, NULL);
|
||||
for (int i = 0; kX86ProcessorModels[i].key; ++i)
|
||||
if (kX86ProcessorModels[i].key == key)
|
||||
return &kX86ProcessorModels[i];
|
||||
return 0;
|
||||
}
|
||||
|
|
24
libc/str/has_char.h
Normal file
24
libc/str/has_char.h
Normal file
|
@ -0,0 +1,24 @@
|
|||
// -*- c++ -*-
|
||||
#ifndef COSMOPOLITAN_LIBC_STR_HAS_CHAR_H_
|
||||
#define COSMOPOLITAN_LIBC_STR_HAS_CHAR_H_
|
||||
#ifdef __cplusplus
|
||||
|
||||
template <typename T>
|
||||
static bool has_char(const T (*ranges)[2], size_t n, T c) {
|
||||
unsigned l = 0;
|
||||
unsigned r = n;
|
||||
while (l < r) {
|
||||
unsigned m = (l & r) + ((l ^ r) >> 1); // floor((a+b)/2)
|
||||
if (c < ranges[m][0]) {
|
||||
r = m;
|
||||
} else if (c > ranges[m][1]) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif /* __cplusplus */
|
||||
#endif /* COSMOPOLITAN_LIBC_STR_HAS_CHAR_H_ */
|
|
@ -1,28 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/wctype.h"
|
||||
|
||||
/**
|
||||
* Returns nonzero if c is lower, alpha, or digit.
|
||||
*/
|
||||
int iswalnum(wint_t c) {
|
||||
return iswdigit(c) || iswalpha(c);
|
||||
}
|
||||
|
||||
__weak_reference(iswalnum, iswalnum_l);
|
|
@ -19,10 +19,15 @@
|
|||
#include "libc/wctype.h"
|
||||
|
||||
/**
|
||||
* Returns nonzero if c is C0 or C1 control code.
|
||||
* Returns nonzero if `c` is control code.
|
||||
*
|
||||
* This includes C0 or C1 control codes, in addition to the "LINE
|
||||
* SEPARATOR" and "PARAGRAPH SEPARATOR" characters.
|
||||
*/
|
||||
int iswcntrl(wint_t c) {
|
||||
return (0x00 <= c && c <= 0x1F) || (0x7F <= c && c <= 0x9F);
|
||||
return (0x0000 <= c && c <= 0x001F) || //
|
||||
(0x007F <= c && c <= 0x009F) || //
|
||||
(0x2028 <= c && c <= 0x2029);
|
||||
}
|
||||
|
||||
__weak_reference(iswcntrl, iswcntrl_l);
|
||||
|
|
|
@ -1,520 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/wctype.h"
|
||||
|
||||
/**
|
||||
* Returns nonzero if c is lowercase letter.
|
||||
*/
|
||||
int iswlower(wint_t c) {
|
||||
if (c < 0200) {
|
||||
return 'a' <= c && c <= 'z';
|
||||
} else {
|
||||
if (towupper(c) != c)
|
||||
return 1;
|
||||
switch (c) {
|
||||
case 0x00df: /* ß Watin */
|
||||
case 0x0138: /* ĸ Watin-A */
|
||||
case 0x0149: /* ʼn Watin-A */
|
||||
case 0x018d: /* ƍ Watin-B */
|
||||
case 0x019b: /* ƛ Watin-B */
|
||||
case 0x01aa: /* ƪ Watin-B */
|
||||
case 0x01ab: /* ƫ Watin-B */
|
||||
case 0x01ba: /* ƺ Watin-B */
|
||||
case 0x01be: /* ƾ Watin-B */
|
||||
case 0x01f0: /* ǰ Watin-B */
|
||||
case 0x0221: /* ȡ Watin-B */
|
||||
case 0x0234: /* ȴ Watin-B */
|
||||
case 0x0235: /* ȵ Watin-B */
|
||||
case 0x0236: /* ȶ Watin-B */
|
||||
case 0x0237: /* ȷ Watin-B */
|
||||
case 0x0238: /* ȸ Watin-B */
|
||||
case 0x0239: /* ȹ Watin-B */
|
||||
case 0x0255: /* ɕ IPA */
|
||||
case 0x0258: /* ɘ IPA */
|
||||
case 0x025a: /* ɚ IPA */
|
||||
case 0x025d: /* ɝ IPA */
|
||||
case 0x025e: /* ɞ IPA */
|
||||
case 0x025f: /* ɟ IPA */
|
||||
case 0x0262: /* ɢ IPA */
|
||||
case 0x0264: /* ɤ IPA */
|
||||
case 0x0267: /* ɧ IPA */
|
||||
case 0x026d: /* ɭ IPA */
|
||||
case 0x026e: /* ɮ IPA */
|
||||
case 0x0270: /* ɰ IPA */
|
||||
case 0x0273: /* ɳ IPA */
|
||||
case 0x0274: /* ɴ IPA */
|
||||
case 0x0276: /* ɶ IPA */
|
||||
case 0x0277: /* ɷ IPA */
|
||||
case 0x0278: /* ɸ IPA */
|
||||
case 0x0279: /* ɹ IPA */
|
||||
case 0x027a: /* ɺ IPA */
|
||||
case 0x027b: /* ɻ IPA */
|
||||
case 0x027c: /* ɼ IPA */
|
||||
case 0x027e: /* ɾ IPA */
|
||||
case 0x027f: /* ɿ IPA */
|
||||
case 0x0281: /* ʁ IPA */
|
||||
case 0x0284: /* ʄ IPA */
|
||||
case 0x0285: /* ʅ IPA */
|
||||
case 0x0286: /* ʆ IPA */
|
||||
case 0x028d: /* ʍ IPA */
|
||||
case 0x028e: /* ʎ IPA */
|
||||
case 0x028f: /* ʏ IPA */
|
||||
case 0x0290: /* ʐ IPA */
|
||||
case 0x0291: /* ʑ IPA */
|
||||
case 0x0293: /* ʓ IPA */
|
||||
case 0x0295: /* ʕ IPA */
|
||||
case 0x0296: /* ʖ IPA */
|
||||
case 0x0297: /* ʗ IPA */
|
||||
case 0x0298: /* ʘ IPA */
|
||||
case 0x0299: /* ʙ IPA */
|
||||
case 0x029a: /* ʚ IPA */
|
||||
case 0x029b: /* ʛ IPA */
|
||||
case 0x029c: /* ʜ IPA */
|
||||
case 0x029f: /* ʟ IPA */
|
||||
case 0x02a0: /* ʠ IPA */
|
||||
case 0x02a1: /* ʡ IPA */
|
||||
case 0x02a2: /* ʢ IPA */
|
||||
case 0x02a3: /* ʣ IPA */
|
||||
case 0x02a4: /* ʤ IPA */
|
||||
case 0x02a5: /* ʥ IPA */
|
||||
case 0x02a6: /* ʦ IPA */
|
||||
case 0x02a7: /* ʧ IPA */
|
||||
case 0x02a8: /* ʨ IPA */
|
||||
case 0x02a9: /* ʩ IPA */
|
||||
case 0x02aa: /* ʪ IPA */
|
||||
case 0x02ab: /* ʫ IPA */
|
||||
case 0x02ac: /* ʬ IPA */
|
||||
case 0x02ad: /* ʭ IPA */
|
||||
case 0x02ae: /* ʮ IPA */
|
||||
case 0x02af: /* ʯ IPA */
|
||||
case 0x0390: /* ΐ Greek */
|
||||
case 0x03b0: /* ΰ Greek */
|
||||
case 0x03fc: /* ϼ Greek */
|
||||
case 0x0560: /* ՠ Armenian */
|
||||
case 0x0587: /* և Armenian */
|
||||
case 0x0588: /* ֈ Armenian */
|
||||
case 0x1d00: /* ᴀ Phonetic Extensions */
|
||||
case 0x1d01: /* ᴁ Phonetic Extensions */
|
||||
case 0x1d02: /* ᴂ Phonetic Extensions */
|
||||
case 0x1d03: /* ᴃ Phonetic Extensions */
|
||||
case 0x1d04: /* ᴄ Phonetic Extensions */
|
||||
case 0x1d05: /* ᴅ Phonetic Extensions */
|
||||
case 0x1d06: /* ᴆ Phonetic Extensions */
|
||||
case 0x1d07: /* ᴇ Phonetic Extensions */
|
||||
case 0x1d08: /* ᴈ Phonetic Extensions */
|
||||
case 0x1d09: /* ᴉ Phonetic Extensions */
|
||||
case 0x1d0a: /* ᴊ Phonetic Extensions */
|
||||
case 0x1d0b: /* ᴋ Phonetic Extensions */
|
||||
case 0x1d0c: /* ᴌ Phonetic Extensions */
|
||||
case 0x1d0d: /* ᴍ Phonetic Extensions */
|
||||
case 0x1d0e: /* ᴎ Phonetic Extensions */
|
||||
case 0x1d0f: /* ᴏ Phonetic Extensions */
|
||||
case 0x1d10: /* ᴐ Phonetic Extensions */
|
||||
case 0x1d11: /* ᴑ Phonetic Extensions */
|
||||
case 0x1d12: /* ᴒ Phonetic Extensions */
|
||||
case 0x1d13: /* ᴓ Phonetic Extensions */
|
||||
case 0x1d14: /* ᴔ Phonetic Extensions */
|
||||
case 0x1d15: /* ᴕ Phonetic Extensions */
|
||||
case 0x1d16: /* ᴖ Phonetic Extensions */
|
||||
case 0x1d17: /* ᴗ Phonetic Extensions */
|
||||
case 0x1d18: /* ᴘ Phonetic Extensions */
|
||||
case 0x1d19: /* ᴙ Phonetic Extensions */
|
||||
case 0x1d1a: /* ᴚ Phonetic Extensions */
|
||||
case 0x1d1b: /* ᴛ Phonetic Extensions */
|
||||
case 0x1d1c: /* ᴜ Phonetic Extensions */
|
||||
case 0x1d1d: /* ᴝ Phonetic Extensions */
|
||||
case 0x1d1e: /* ᴞ Phonetic Extensions */
|
||||
case 0x1d1f: /* ᴟ Phonetic Extensions */
|
||||
case 0x1d20: /* ᴠ Phonetic Extensions */
|
||||
case 0x1d21: /* ᴡ Phonetic Extensions */
|
||||
case 0x1d22: /* ᴢ Phonetic Extensions */
|
||||
case 0x1d23: /* ᴣ Phonetic Extensions */
|
||||
case 0x1d24: /* ᴤ Phonetic Extensions */
|
||||
case 0x1d25: /* ᴥ Phonetic Extensions */
|
||||
case 0x1d26: /* ᴦ Phonetic Extensions */
|
||||
case 0x1d27: /* ᴧ Phonetic Extensions */
|
||||
case 0x1d28: /* ᴨ Phonetic Extensions */
|
||||
case 0x1d29: /* ᴩ Phonetic Extensions */
|
||||
case 0x1d2a: /* ᴪ Phonetic Extensions */
|
||||
case 0x1d2b: /* ᴫ Phonetic Extensions */
|
||||
case 0x1d6b: /* ᵫ Phonetic Extensions */
|
||||
case 0x1d6c: /* ᵬ Phonetic Extensions */
|
||||
case 0x1d6d: /* ᵭ Phonetic Extensions */
|
||||
case 0x1d6e: /* ᵮ Phonetic Extensions */
|
||||
case 0x1d6f: /* ᵯ Phonetic Extensions */
|
||||
case 0x1d70: /* ᵰ Phonetic Extensions */
|
||||
case 0x1d71: /* ᵱ Phonetic Extensions */
|
||||
case 0x1d72: /* ᵲ Phonetic Extensions */
|
||||
case 0x1d73: /* ᵳ Phonetic Extensions */
|
||||
case 0x1d74: /* ᵴ Phonetic Extensions */
|
||||
case 0x1d75: /* ᵵ Phonetic Extensions */
|
||||
case 0x1d76: /* ᵶ Phonetic Extensions */
|
||||
case 0x1d77: /* ᵷ Phonetic Extensions */
|
||||
case 0x1d7a: /* ᵺ Phonetic Extensions */
|
||||
case 0x1d7b: /* ᵻ Phonetic Extensions */
|
||||
case 0x1d7c: /* ᵼ Phonetic Extensions */
|
||||
case 0x1d7e: /* ᵾ Phonetic Extensions */
|
||||
case 0x1d7f: /* ᵿ Phonetic Extensions */
|
||||
case 0x1d80: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d81: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d82: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d83: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d84: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d85: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d86: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d87: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d88: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d89: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d8a: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d8b: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d8c: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d8d: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d8f: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d90: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d91: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d92: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d93: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d94: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d95: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d96: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d97: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d98: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d99: /* . Phonetic Extensions Supplement */
|
||||
case 0x1d9a: /* . Phonetic Extensions Supplement */
|
||||
case 0x1e96: /* ẖ Watin-C */
|
||||
case 0x1e97: /* ẗ Watin-C */
|
||||
case 0x1e98: /* ẘ Watin-C */
|
||||
case 0x1e99: /* ẙ Watin-C */
|
||||
case 0x1e9a: /* ẚ Watin-C */
|
||||
case 0x1e9c: /* ẜ Watin-C */
|
||||
case 0x1e9d: /* ẝ Watin-C */
|
||||
case 0x1e9f: /* ẟ Watin-C */
|
||||
case 0x1f50: /* ὐ Greek2 */
|
||||
case 0x1f52: /* ὒ Greek2 */
|
||||
case 0x1f54: /* ὔ Greek2 */
|
||||
case 0x1f56: /* ὖ Greek2 */
|
||||
case 0x1fb2: /* ᾲ Greek2 */
|
||||
case 0x1fb4: /* ᾴ Greek2 */
|
||||
case 0x1fb6: /* ᾶ Greek2 */
|
||||
case 0x1fb7: /* ᾷ Greek2 */
|
||||
case 0x1fc2: /* ῂ Greek2 */
|
||||
case 0x1fc4: /* ῄ Greek2 */
|
||||
case 0x1fc6: /* ῆ Greek2 */
|
||||
case 0x1fc7: /* ῇ Greek2 */
|
||||
case 0x1fd2: /* ῒ Greek2 */
|
||||
case 0x1fd3: /* ΐ Greek2 */
|
||||
case 0x1fd6: /* ῖ Greek2 */
|
||||
case 0x1fd7: /* ῗ Greek2 */
|
||||
case 0x1fe2: /* ῢ Greek2 */
|
||||
case 0x1fe3: /* ΰ Greek2 */
|
||||
case 0x1fe4: /* ῤ Greek2 */
|
||||
case 0x1fe6: /* ῦ Greek2 */
|
||||
case 0x1fe7: /* ῧ Greek2 */
|
||||
case 0x1ff2: /* ῲ Greek2 */
|
||||
case 0x1ff4: /* ῴ Greek2 */
|
||||
case 0x1ff6: /* ῶ Greek2 */
|
||||
case 0x1ff7: /* ῷ Greek2 */
|
||||
case 0x210a: /* ℊ Letterlike */
|
||||
case 0x210e: /* ℎ Letterlike */
|
||||
case 0x210f: /* ℏ Letterlike */
|
||||
case 0x2113: /* ℓ Letterlike */
|
||||
case 0x212f: /* ℯ Letterlike */
|
||||
case 0x2134: /* ℴ Letterlike */
|
||||
case 0x2139: /* ℹ Letterlike */
|
||||
case 0x213c: /* ℼ Letterlike */
|
||||
case 0x213d: /* ℽ Letterlike */
|
||||
case 0x2146: /* ⅆ Letterlike */
|
||||
case 0x2147: /* ⅇ Letterlike */
|
||||
case 0x2148: /* ⅈ Letterlike */
|
||||
case 0x2149: /* ⅉ Letterlike */
|
||||
case 0x2c71: /* . Watin-D */
|
||||
case 0x2c74: /* . Watin-D */
|
||||
case 0x2c77: /* . Watin-D */
|
||||
case 0x2c78: /* . Watin-D */
|
||||
case 0x2c79: /* . Watin-D */
|
||||
case 0x2c7a: /* . Watin-D */
|
||||
case 0x2c7b: /* . Watin-D */
|
||||
case 0x2ce4: /* . Coptic */
|
||||
case 0xa730: /* . Latin Extended-D */
|
||||
case 0xa731: /* . Latin Extended-D */
|
||||
case 0xa771: /* . Latin Extended-D */
|
||||
case 0xa772: /* . Latin Extended-D */
|
||||
case 0xa773: /* . Latin Extended-D */
|
||||
case 0xa774: /* . Latin Extended-D */
|
||||
case 0xa775: /* . Latin Extended-D */
|
||||
case 0xa776: /* . Latin Extended-D */
|
||||
case 0xa777: /* . Latin Extended-D */
|
||||
case 0xa778: /* . Latin Extended-D */
|
||||
case 0xa78e: /* . Latin Extended-D */
|
||||
case 0xa795: /* . Latin Extended-D */
|
||||
case 0xa7af: /* . Latin Extended-D */
|
||||
case 0xa7fa: /* . Latin Extended-D */
|
||||
case 0xab30: /* . Latin Extended-E */
|
||||
case 0xab31: /* . Latin Extended-E */
|
||||
case 0xab32: /* . Latin Extended-E */
|
||||
case 0xab33: /* . Latin Extended-E */
|
||||
case 0xab34: /* . Latin Extended-E */
|
||||
case 0xab35: /* . Latin Extended-E */
|
||||
case 0xab36: /* . Latin Extended-E */
|
||||
case 0xab37: /* . Latin Extended-E */
|
||||
case 0xab38: /* . Latin Extended-E */
|
||||
case 0xab39: /* . Latin Extended-E */
|
||||
case 0xab3a: /* . Latin Extended-E */
|
||||
case 0xab3b: /* . Latin Extended-E */
|
||||
case 0xab3c: /* . Latin Extended-E */
|
||||
case 0xab3d: /* . Latin Extended-E */
|
||||
case 0xab3e: /* . Latin Extended-E */
|
||||
case 0xab3f: /* . Latin Extended-E */
|
||||
case 0xab40: /* . Latin Extended-E */
|
||||
case 0xab41: /* . Latin Extended-E */
|
||||
case 0xab42: /* . Latin Extended-E */
|
||||
case 0xab43: /* . Latin Extended-E */
|
||||
case 0xab44: /* . Latin Extended-E */
|
||||
case 0xab45: /* . Latin Extended-E */
|
||||
case 0xab46: /* . Latin Extended-E */
|
||||
case 0xab47: /* . Latin Extended-E */
|
||||
case 0xab48: /* . Latin Extended-E */
|
||||
case 0xab49: /* . Latin Extended-E */
|
||||
case 0xab4a: /* . Latin Extended-E */
|
||||
case 0xab4b: /* . Latin Extended-E */
|
||||
case 0xab4c: /* . Latin Extended-E */
|
||||
case 0xab4d: /* . Latin Extended-E */
|
||||
case 0xab4e: /* . Latin Extended-E */
|
||||
case 0xab4f: /* . Latin Extended-E */
|
||||
case 0xab50: /* . Latin Extended-E */
|
||||
case 0xab51: /* . Latin Extended-E */
|
||||
case 0xab52: /* . Latin Extended-E */
|
||||
case 0xab54: /* . Latin Extended-E */
|
||||
case 0xab55: /* . Latin Extended-E */
|
||||
case 0xab56: /* . Latin Extended-E */
|
||||
case 0xab57: /* . Latin Extended-E */
|
||||
case 0xab58: /* . Latin Extended-E */
|
||||
case 0xab59: /* . Latin Extended-E */
|
||||
case 0xab5a: /* . Latin Extended-E */
|
||||
case 0xab60: /* . Latin Extended-E */
|
||||
case 0xab61: /* . Latin Extended-E */
|
||||
case 0xab62: /* . Latin Extended-E */
|
||||
case 0xab63: /* . Latin Extended-E */
|
||||
case 0xab64: /* . Latin Extended-E */
|
||||
case 0xab65: /* . Latin Extended-E */
|
||||
case 0xab66: /* . Latin Extended-E */
|
||||
case 0xab67: /* . Latin Extended-E */
|
||||
case 0xfb00: /* . Alphabetic Presentation Forms */
|
||||
case 0xfb01: /* . Alphabetic Presentation Forms */
|
||||
case 0xfb02: /* . Alphabetic Presentation Forms */
|
||||
case 0xfb03: /* . Alphabetic Presentation Forms */
|
||||
case 0xfb04: /* . Alphabetic Presentation Forms */
|
||||
case 0xfb05: /* . Alphabetic Presentation Forms */
|
||||
case 0xfb06: /* . Alphabetic Presentation Forms */
|
||||
case 0xfb13: /* . Alphabetic Presentation Forms */
|
||||
case 0xfb14: /* . Alphabetic Presentation Forms */
|
||||
case 0xfb15: /* . Alphabetic Presentation Forms */
|
||||
case 0xfb16: /* . Alphabetic Presentation Forms */
|
||||
case 0xfb17: /* . Alphabetic Presentation Forms */
|
||||
case 0x1d44e: /* 𝑎 Math */
|
||||
case 0x1d44f: /* 𝑏 Math */
|
||||
case 0x1d450: /* 𝑐 Math */
|
||||
case 0x1d451: /* 𝑑 Math */
|
||||
case 0x1d452: /* 𝑒 Math */
|
||||
case 0x1d453: /* 𝑓 Math */
|
||||
case 0x1d454: /* 𝑔 Math */
|
||||
case 0x1d45e: /* 𝑞 Math */
|
||||
case 0x1d45f: /* 𝑟 Math */
|
||||
case 0x1d460: /* 𝑠 Math */
|
||||
case 0x1d461: /* 𝑡 Math */
|
||||
case 0x1d462: /* 𝑢 Math */
|
||||
case 0x1d463: /* 𝑣 Math */
|
||||
case 0x1d464: /* 𝑤 Math */
|
||||
case 0x1d465: /* 𝑥 Math */
|
||||
case 0x1d466: /* 𝑦 Math */
|
||||
case 0x1d467: /* 𝑧 Math */
|
||||
case 0x1d4b6: /* 𝒶 Math */
|
||||
case 0x1d4b7: /* 𝒷 Math */
|
||||
case 0x1d4b8: /* 𝒸 Math */
|
||||
case 0x1d4b9: /* 𝒹 Math */
|
||||
case 0x1d4bb: /* 𝒻 Math */
|
||||
case 0x1d4bd: /* 𝒽 Math */
|
||||
case 0x1d4be: /* 𝒾 Math */
|
||||
case 0x1d4bf: /* 𝒿 Math */
|
||||
case 0x1d4c0: /* 𝓀 Math */
|
||||
case 0x1d4c1: /* 𝓁 Math */
|
||||
case 0x1d4c2: /* 𝓂 Math */
|
||||
case 0x1d4c3: /* 𝓃 Math */
|
||||
case 0x1d4c5: /* 𝓅 Math */
|
||||
case 0x1d4c6: /* 𝓆 Math */
|
||||
case 0x1d4c7: /* 𝓇 Math */
|
||||
case 0x1d51e: /* 𝔞 Math */
|
||||
case 0x1d51f: /* 𝔟 Math */
|
||||
case 0x1d520: /* 𝔠 Math */
|
||||
case 0x1d521: /* 𝔡 Math */
|
||||
case 0x1d522: /* 𝔢 Math */
|
||||
case 0x1d523: /* 𝔣 Math */
|
||||
case 0x1d524: /* 𝔤 Math */
|
||||
case 0x1d525: /* 𝔥 Math */
|
||||
case 0x1d526: /* 𝔦 Math */
|
||||
case 0x1d52f: /* 𝔯 Math */
|
||||
case 0x1d530: /* 𝔰 Math */
|
||||
case 0x1d531: /* 𝔱 Math */
|
||||
case 0x1d532: /* 𝔲 Math */
|
||||
case 0x1d533: /* 𝔳 Math */
|
||||
case 0x1d534: /* 𝔴 Math */
|
||||
case 0x1d535: /* 𝔵 Math */
|
||||
case 0x1d536: /* 𝔶 Math */
|
||||
case 0x1d537: /* 𝔷 Math */
|
||||
case 0x1d552: /* 𝕒 Math */
|
||||
case 0x1d553: /* 𝕓 Math */
|
||||
case 0x1d554: /* 𝕔 Math */
|
||||
case 0x1d555: /* 𝕕 Math */
|
||||
case 0x1d556: /* 𝕖 Math */
|
||||
case 0x1d557: /* 𝕗 Math */
|
||||
case 0x1d558: /* 𝕘 Math */
|
||||
case 0x1d559: /* 𝕙 Math */
|
||||
case 0x1d55a: /* 𝕚 Math */
|
||||
case 0x1d55b: /* 𝕛 Math */
|
||||
case 0x1d55c: /* 𝕜 Math */
|
||||
case 0x1d55d: /* 𝕝 Math */
|
||||
case 0x1d55e: /* 𝕞 Math */
|
||||
case 0x1d55f: /* 𝕟 Math */
|
||||
case 0x1d560: /* 𝕠 Math */
|
||||
case 0x1d561: /* 𝕡 Math */
|
||||
case 0x1d562: /* 𝕢 Math */
|
||||
case 0x1d563: /* 𝕣 Math */
|
||||
case 0x1d564: /* 𝕤 Math */
|
||||
case 0x1d565: /* 𝕥 Math */
|
||||
case 0x1d566: /* 𝕦 Math */
|
||||
case 0x1d567: /* 𝕧 Math */
|
||||
case 0x1d568: /* 𝕨 Math */
|
||||
case 0x1d569: /* 𝕩 Math */
|
||||
case 0x1d56a: /* 𝕪 Math */
|
||||
case 0x1d56b: /* 𝕫 Math */
|
||||
case 0x1d656: /* 𝙖 Math */
|
||||
case 0x1d657: /* 𝙗 Math */
|
||||
case 0x1d658: /* 𝙘 Math */
|
||||
case 0x1d659: /* 𝙙 Math */
|
||||
case 0x1d65a: /* 𝙚 Math */
|
||||
case 0x1d65b: /* 𝙛 Math */
|
||||
case 0x1d65c: /* 𝙜 Math */
|
||||
case 0x1d65d: /* 𝙝 Math */
|
||||
case 0x1d65e: /* 𝙞 Math */
|
||||
case 0x1d65f: /* 𝙟 Math */
|
||||
case 0x1d660: /* 𝙠 Math */
|
||||
case 0x1d661: /* 𝙡 Math */
|
||||
case 0x1d662: /* 𝙢 Math */
|
||||
case 0x1d663: /* 𝙣 Math */
|
||||
case 0x1d664: /* 𝙤 Math */
|
||||
case 0x1d665: /* 𝙥 Math */
|
||||
case 0x1d666: /* 𝙦 Math */
|
||||
case 0x1d667: /* 𝙧 Math */
|
||||
case 0x1d668: /* 𝙨 Math */
|
||||
case 0x1d669: /* 𝙩 Math */
|
||||
case 0x1d66a: /* 𝙪 Math */
|
||||
case 0x1d66b: /* 𝙫 Math */
|
||||
case 0x1d66c: /* 𝙬 Math */
|
||||
case 0x1d66d: /* 𝙭 Math */
|
||||
case 0x1d66e: /* 𝙮 Math */
|
||||
case 0x1d66f: /* 𝙯 Math */
|
||||
case 0x1d6da: /* 𝛚 Math */
|
||||
case 0x1d6dc: /* 𝛜 Math */
|
||||
case 0x1d6dd: /* 𝛝 Math */
|
||||
case 0x1d6de: /* 𝛞 Math */
|
||||
case 0x1d6df: /* 𝛟 Math */
|
||||
case 0x1d6e0: /* 𝛠 Math */
|
||||
case 0x1d6e1: /* 𝛡 Math */
|
||||
case 0x1d70d: /* 𝜍 Math */
|
||||
case 0x1d70e: /* 𝜎 Math */
|
||||
case 0x1d70f: /* 𝜏 Math */
|
||||
case 0x1d710: /* 𝜐 Math */
|
||||
case 0x1d711: /* 𝜑 Math */
|
||||
case 0x1d712: /* 𝜒 Math */
|
||||
case 0x1d713: /* 𝜓 Math */
|
||||
case 0x1d714: /* 𝜔 Math */
|
||||
case 0x1d716: /* 𝜖 Math */
|
||||
case 0x1d717: /* 𝜗 Math */
|
||||
case 0x1d718: /* 𝜘 Math */
|
||||
case 0x1d719: /* 𝜙 Math */
|
||||
case 0x1d71a: /* 𝜚 Math */
|
||||
case 0x1d71b: /* 𝜛 Math */
|
||||
case 0x1d747: /* 𝝇 Math */
|
||||
case 0x1d748: /* 𝝈 Math */
|
||||
case 0x1d749: /* 𝝉 Math */
|
||||
case 0x1d74a: /* 𝝊 Math */
|
||||
case 0x1d74b: /* 𝝋 Math */
|
||||
case 0x1d74c: /* 𝝌 Math */
|
||||
case 0x1d74d: /* 𝝍 Math */
|
||||
case 0x1d74e: /* 𝝎 Math */
|
||||
case 0x1d750: /* 𝝐 Math */
|
||||
case 0x1d751: /* 𝝑 Math */
|
||||
case 0x1d752: /* 𝝒 Math */
|
||||
case 0x1d753: /* 𝝓 Math */
|
||||
case 0x1d754: /* 𝝔 Math */
|
||||
case 0x1d755: /* 𝝕 Math */
|
||||
case 0x1d781: /* 𝞁 Math */
|
||||
case 0x1d782: /* 𝞂 Math */
|
||||
case 0x1d783: /* 𝞃 Math */
|
||||
case 0x1d784: /* 𝞄 Math */
|
||||
case 0x1d785: /* 𝞅 Math */
|
||||
case 0x1d786: /* 𝞆 Math */
|
||||
case 0x1d787: /* 𝞇 Math */
|
||||
case 0x1d788: /* 𝞈 Math */
|
||||
case 0x1d78a: /* 𝞊 Math */
|
||||
case 0x1d78b: /* 𝞋 Math */
|
||||
case 0x1d78c: /* 𝞌 Math */
|
||||
case 0x1d78d: /* 𝞍 Math */
|
||||
case 0x1d78e: /* 𝞎 Math */
|
||||
case 0x1d78f: /* 𝞏 Math */
|
||||
case 0x1d7aa: /* 𝞪 Math */
|
||||
case 0x1d7ab: /* 𝞫 Math */
|
||||
case 0x1d7ac: /* 𝞬 Math */
|
||||
case 0x1d7ad: /* 𝞭 Math */
|
||||
case 0x1d7ae: /* 𝞮 Math */
|
||||
case 0x1d7af: /* 𝞯 Math */
|
||||
case 0x1d7b0: /* 𝞰 Math */
|
||||
case 0x1d7b1: /* 𝞱 Math */
|
||||
case 0x1d7b2: /* 𝞲 Math */
|
||||
case 0x1d7b3: /* 𝞳 Math */
|
||||
case 0x1d7b4: /* 𝞴 Math */
|
||||
case 0x1d7b5: /* 𝞵 Math */
|
||||
case 0x1d7b6: /* 𝞶 Math */
|
||||
case 0x1d7b7: /* 𝞷 Math */
|
||||
case 0x1d7b8: /* 𝞸 Math */
|
||||
case 0x1d7b9: /* 𝞹 Math */
|
||||
case 0x1d7ba: /* 𝞺 Math */
|
||||
case 0x1d7bb: /* 𝞻 Math */
|
||||
case 0x1d7bc: /* 𝞼 Math */
|
||||
case 0x1d7bd: /* 𝞽 Math */
|
||||
case 0x1d7be: /* 𝞾 Math */
|
||||
case 0x1d7bf: /* 𝞿 Math */
|
||||
case 0x1d7c0: /* 𝟀 Math */
|
||||
case 0x1d7c1: /* 𝟁 Math */
|
||||
case 0x1d7c2: /* 𝟂 Math */
|
||||
case 0x1d7c4: /* 𝟄 Math */
|
||||
case 0x1d7c5: /* 𝟅 Math */
|
||||
case 0x1d7c6: /* 𝟆 Math */
|
||||
case 0x1d7c7: /* 𝟇 Math */
|
||||
case 0x1d7c8: /* 𝟈 Math */
|
||||
case 0x1d7c9: /* 𝟉 Math */
|
||||
case 0x1d7cb: /* 𝟋 Math */
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__weak_reference(iswlower, iswlower_l);
|
712
libc/str/iswlower.cc
Normal file
712
libc/str/iswlower.cc
Normal file
|
@ -0,0 +1,712 @@
|
|||
/*-*-mode:c++;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8-*-│
|
||||
│ vi: set et ft=c++ ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2024 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/dce.h"
|
||||
#include "libc/macros.h"
|
||||
#include "libc/str/has_char.h"
|
||||
#include "libc/wctype.h"
|
||||
|
||||
static const unsigned short kLower[][2] = {
|
||||
{0x61, 0x7a}, //
|
||||
{0xaa, 0xaa}, //
|
||||
{0xb5, 0xb5}, //
|
||||
{0xba, 0xba}, //
|
||||
{0xdf, 0xf6}, //
|
||||
{0xf8, 0xff}, //
|
||||
{0x101, 0x101}, //
|
||||
{0x103, 0x103}, //
|
||||
{0x105, 0x105}, //
|
||||
{0x107, 0x107}, //
|
||||
{0x109, 0x109}, //
|
||||
{0x10b, 0x10b}, //
|
||||
{0x10d, 0x10d}, //
|
||||
{0x10f, 0x10f}, //
|
||||
{0x111, 0x111}, //
|
||||
{0x113, 0x113}, //
|
||||
{0x115, 0x115}, //
|
||||
{0x117, 0x117}, //
|
||||
{0x119, 0x119}, //
|
||||
{0x11b, 0x11b}, //
|
||||
{0x11d, 0x11d}, //
|
||||
{0x11f, 0x11f}, //
|
||||
{0x121, 0x121}, //
|
||||
{0x123, 0x123}, //
|
||||
{0x125, 0x125}, //
|
||||
{0x127, 0x127}, //
|
||||
{0x129, 0x129}, //
|
||||
{0x12b, 0x12b}, //
|
||||
{0x12d, 0x12d}, //
|
||||
{0x12f, 0x12f}, //
|
||||
{0x131, 0x131}, //
|
||||
{0x133, 0x133}, //
|
||||
{0x135, 0x135}, //
|
||||
{0x137, 0x138}, //
|
||||
{0x13a, 0x13a}, //
|
||||
{0x13c, 0x13c}, //
|
||||
{0x13e, 0x13e}, //
|
||||
{0x140, 0x140}, //
|
||||
{0x142, 0x142}, //
|
||||
{0x144, 0x144}, //
|
||||
{0x146, 0x146}, //
|
||||
{0x148, 0x149}, //
|
||||
{0x14b, 0x14b}, //
|
||||
{0x14d, 0x14d}, //
|
||||
{0x14f, 0x14f}, //
|
||||
{0x151, 0x151}, //
|
||||
{0x153, 0x153}, //
|
||||
{0x155, 0x155}, //
|
||||
{0x157, 0x157}, //
|
||||
{0x159, 0x159}, //
|
||||
{0x15b, 0x15b}, //
|
||||
{0x15d, 0x15d}, //
|
||||
{0x15f, 0x15f}, //
|
||||
{0x161, 0x161}, //
|
||||
{0x163, 0x163}, //
|
||||
{0x165, 0x165}, //
|
||||
{0x167, 0x167}, //
|
||||
{0x169, 0x169}, //
|
||||
{0x16b, 0x16b}, //
|
||||
{0x16d, 0x16d}, //
|
||||
{0x16f, 0x16f}, //
|
||||
{0x171, 0x171}, //
|
||||
{0x173, 0x173}, //
|
||||
{0x175, 0x175}, //
|
||||
{0x177, 0x177}, //
|
||||
{0x17a, 0x17a}, //
|
||||
{0x17c, 0x17c}, //
|
||||
{0x17e, 0x180}, //
|
||||
{0x183, 0x183}, //
|
||||
{0x185, 0x185}, //
|
||||
{0x188, 0x188}, //
|
||||
{0x18c, 0x18d}, //
|
||||
{0x192, 0x192}, //
|
||||
{0x195, 0x195}, //
|
||||
{0x199, 0x19b}, //
|
||||
{0x19e, 0x19e}, //
|
||||
{0x1a1, 0x1a1}, //
|
||||
{0x1a3, 0x1a3}, //
|
||||
{0x1a5, 0x1a5}, //
|
||||
{0x1a8, 0x1a8}, //
|
||||
{0x1aa, 0x1ab}, //
|
||||
{0x1ad, 0x1ad}, //
|
||||
{0x1b0, 0x1b0}, //
|
||||
{0x1b4, 0x1b4}, //
|
||||
{0x1b6, 0x1b6}, //
|
||||
{0x1b9, 0x1ba}, //
|
||||
{0x1bd, 0x1bf}, //
|
||||
{0x1c5, 0x1c6}, //
|
||||
{0x1c8, 0x1c9}, //
|
||||
{0x1cb, 0x1cc}, //
|
||||
{0x1ce, 0x1ce}, //
|
||||
{0x1d0, 0x1d0}, //
|
||||
{0x1d2, 0x1d2}, //
|
||||
{0x1d4, 0x1d4}, //
|
||||
{0x1d6, 0x1d6}, //
|
||||
{0x1d8, 0x1d8}, //
|
||||
{0x1da, 0x1da}, //
|
||||
{0x1dc, 0x1dd}, //
|
||||
{0x1df, 0x1df}, //
|
||||
{0x1e1, 0x1e1}, //
|
||||
{0x1e3, 0x1e3}, //
|
||||
{0x1e5, 0x1e5}, //
|
||||
{0x1e7, 0x1e7}, //
|
||||
{0x1e9, 0x1e9}, //
|
||||
{0x1eb, 0x1eb}, //
|
||||
{0x1ed, 0x1ed}, //
|
||||
{0x1ef, 0x1f0}, //
|
||||
{0x1f2, 0x1f3}, //
|
||||
{0x1f5, 0x1f5}, //
|
||||
{0x1f9, 0x1f9}, //
|
||||
{0x1fb, 0x1fb}, //
|
||||
{0x1fd, 0x1fd}, //
|
||||
{0x1ff, 0x1ff}, //
|
||||
{0x201, 0x201}, //
|
||||
{0x203, 0x203}, //
|
||||
{0x205, 0x205}, //
|
||||
{0x207, 0x207}, //
|
||||
{0x209, 0x209}, //
|
||||
{0x20b, 0x20b}, //
|
||||
{0x20d, 0x20d}, //
|
||||
{0x20f, 0x20f}, //
|
||||
{0x211, 0x211}, //
|
||||
{0x213, 0x213}, //
|
||||
{0x215, 0x215}, //
|
||||
{0x217, 0x217}, //
|
||||
{0x219, 0x219}, //
|
||||
{0x21b, 0x21b}, //
|
||||
{0x21d, 0x21d}, //
|
||||
{0x21f, 0x21f}, //
|
||||
{0x221, 0x221}, //
|
||||
{0x223, 0x223}, //
|
||||
{0x225, 0x225}, //
|
||||
{0x227, 0x227}, //
|
||||
{0x229, 0x229}, //
|
||||
{0x22b, 0x22b}, //
|
||||
{0x22d, 0x22d}, //
|
||||
{0x22f, 0x22f}, //
|
||||
{0x231, 0x231}, //
|
||||
{0x233, 0x239}, //
|
||||
{0x23c, 0x23c}, //
|
||||
{0x23f, 0x240}, //
|
||||
{0x242, 0x242}, //
|
||||
{0x247, 0x247}, //
|
||||
{0x249, 0x249}, //
|
||||
{0x24b, 0x24b}, //
|
||||
{0x24d, 0x24d}, //
|
||||
{0x24f, 0x293}, //
|
||||
{0x295, 0x2b8}, //
|
||||
{0x2c0, 0x2c1}, //
|
||||
{0x2e0, 0x2e4}, //
|
||||
{0x345, 0x345}, //
|
||||
{0x371, 0x371}, //
|
||||
{0x373, 0x373}, //
|
||||
{0x377, 0x377}, //
|
||||
{0x37a, 0x37d}, //
|
||||
{0x390, 0x390}, //
|
||||
{0x3ac, 0x3ce}, //
|
||||
{0x3d0, 0x3d1}, //
|
||||
{0x3d5, 0x3d7}, //
|
||||
{0x3d9, 0x3d9}, //
|
||||
{0x3db, 0x3db}, //
|
||||
{0x3dd, 0x3dd}, //
|
||||
{0x3df, 0x3df}, //
|
||||
{0x3e1, 0x3e1}, //
|
||||
{0x3e3, 0x3e3}, //
|
||||
{0x3e5, 0x3e5}, //
|
||||
{0x3e7, 0x3e7}, //
|
||||
{0x3e9, 0x3e9}, //
|
||||
{0x3eb, 0x3eb}, //
|
||||
{0x3ed, 0x3ed}, //
|
||||
{0x3ef, 0x3f3}, //
|
||||
{0x3f5, 0x3f5}, //
|
||||
{0x3f8, 0x3f8}, //
|
||||
{0x3fb, 0x3fc}, //
|
||||
{0x430, 0x45f}, //
|
||||
{0x461, 0x461}, //
|
||||
{0x463, 0x463}, //
|
||||
{0x465, 0x465}, //
|
||||
{0x467, 0x467}, //
|
||||
{0x469, 0x469}, //
|
||||
{0x46b, 0x46b}, //
|
||||
{0x46d, 0x46d}, //
|
||||
{0x46f, 0x46f}, //
|
||||
{0x471, 0x471}, //
|
||||
{0x473, 0x473}, //
|
||||
{0x475, 0x475}, //
|
||||
{0x477, 0x477}, //
|
||||
{0x479, 0x479}, //
|
||||
{0x47b, 0x47b}, //
|
||||
{0x47d, 0x47d}, //
|
||||
{0x47f, 0x47f}, //
|
||||
{0x481, 0x481}, //
|
||||
{0x48b, 0x48b}, //
|
||||
{0x48d, 0x48d}, //
|
||||
{0x48f, 0x48f}, //
|
||||
{0x491, 0x491}, //
|
||||
{0x493, 0x493}, //
|
||||
{0x495, 0x495}, //
|
||||
{0x497, 0x497}, //
|
||||
{0x499, 0x499}, //
|
||||
{0x49b, 0x49b}, //
|
||||
{0x49d, 0x49d}, //
|
||||
{0x49f, 0x49f}, //
|
||||
{0x4a1, 0x4a1}, //
|
||||
{0x4a3, 0x4a3}, //
|
||||
{0x4a5, 0x4a5}, //
|
||||
{0x4a7, 0x4a7}, //
|
||||
{0x4a9, 0x4a9}, //
|
||||
{0x4ab, 0x4ab}, //
|
||||
{0x4ad, 0x4ad}, //
|
||||
{0x4af, 0x4af}, //
|
||||
{0x4b1, 0x4b1}, //
|
||||
{0x4b3, 0x4b3}, //
|
||||
{0x4b5, 0x4b5}, //
|
||||
{0x4b7, 0x4b7}, //
|
||||
{0x4b9, 0x4b9}, //
|
||||
{0x4bb, 0x4bb}, //
|
||||
{0x4bd, 0x4bd}, //
|
||||
{0x4bf, 0x4bf}, //
|
||||
{0x4c2, 0x4c2}, //
|
||||
{0x4c4, 0x4c4}, //
|
||||
{0x4c6, 0x4c6}, //
|
||||
{0x4c8, 0x4c8}, //
|
||||
{0x4ca, 0x4ca}, //
|
||||
{0x4cc, 0x4cc}, //
|
||||
{0x4ce, 0x4cf}, //
|
||||
{0x4d1, 0x4d1}, //
|
||||
{0x4d3, 0x4d3}, //
|
||||
{0x4d5, 0x4d5}, //
|
||||
{0x4d7, 0x4d7}, //
|
||||
{0x4d9, 0x4d9}, //
|
||||
{0x4db, 0x4db}, //
|
||||
{0x4dd, 0x4dd}, //
|
||||
{0x4df, 0x4df}, //
|
||||
{0x4e1, 0x4e1}, //
|
||||
{0x4e3, 0x4e3}, //
|
||||
{0x4e5, 0x4e5}, //
|
||||
{0x4e7, 0x4e7}, //
|
||||
{0x4e9, 0x4e9}, //
|
||||
{0x4eb, 0x4eb}, //
|
||||
{0x4ed, 0x4ed}, //
|
||||
{0x4ef, 0x4ef}, //
|
||||
{0x4f1, 0x4f1}, //
|
||||
{0x4f3, 0x4f3}, //
|
||||
{0x4f5, 0x4f5}, //
|
||||
{0x4f7, 0x4f7}, //
|
||||
{0x4f9, 0x4f9}, //
|
||||
{0x4fb, 0x4fb}, //
|
||||
{0x4fd, 0x4fd}, //
|
||||
{0x4ff, 0x4ff}, //
|
||||
{0x501, 0x501}, //
|
||||
{0x503, 0x503}, //
|
||||
{0x505, 0x505}, //
|
||||
{0x507, 0x507}, //
|
||||
{0x509, 0x509}, //
|
||||
{0x50b, 0x50b}, //
|
||||
{0x50d, 0x50d}, //
|
||||
{0x50f, 0x50f}, //
|
||||
{0x511, 0x511}, //
|
||||
{0x513, 0x513}, //
|
||||
{0x515, 0x515}, //
|
||||
{0x517, 0x517}, //
|
||||
{0x519, 0x519}, //
|
||||
{0x51b, 0x51b}, //
|
||||
{0x51d, 0x51d}, //
|
||||
{0x51f, 0x51f}, //
|
||||
{0x521, 0x521}, //
|
||||
{0x523, 0x523}, //
|
||||
{0x525, 0x525}, //
|
||||
{0x527, 0x527}, //
|
||||
{0x529, 0x529}, //
|
||||
{0x52b, 0x52b}, //
|
||||
{0x52d, 0x52d}, //
|
||||
{0x52f, 0x52f}, //
|
||||
{0x560, 0x588}, //
|
||||
{0x10d0, 0x10fa}, //
|
||||
{0x10fc, 0x10ff}, //
|
||||
{0x13f8, 0x13fd}, //
|
||||
{0x1c80, 0x1c88}, //
|
||||
{0x1d00, 0x1dbf}, //
|
||||
{0x1e01, 0x1e01}, //
|
||||
{0x1e03, 0x1e03}, //
|
||||
{0x1e05, 0x1e05}, //
|
||||
{0x1e07, 0x1e07}, //
|
||||
{0x1e09, 0x1e09}, //
|
||||
{0x1e0b, 0x1e0b}, //
|
||||
{0x1e0d, 0x1e0d}, //
|
||||
{0x1e0f, 0x1e0f}, //
|
||||
{0x1e11, 0x1e11}, //
|
||||
{0x1e13, 0x1e13}, //
|
||||
{0x1e15, 0x1e15}, //
|
||||
{0x1e17, 0x1e17}, //
|
||||
{0x1e19, 0x1e19}, //
|
||||
{0x1e1b, 0x1e1b}, //
|
||||
{0x1e1d, 0x1e1d}, //
|
||||
{0x1e1f, 0x1e1f}, //
|
||||
{0x1e21, 0x1e21}, //
|
||||
{0x1e23, 0x1e23}, //
|
||||
{0x1e25, 0x1e25}, //
|
||||
{0x1e27, 0x1e27}, //
|
||||
{0x1e29, 0x1e29}, //
|
||||
{0x1e2b, 0x1e2b}, //
|
||||
{0x1e2d, 0x1e2d}, //
|
||||
{0x1e2f, 0x1e2f}, //
|
||||
{0x1e31, 0x1e31}, //
|
||||
{0x1e33, 0x1e33}, //
|
||||
{0x1e35, 0x1e35}, //
|
||||
{0x1e37, 0x1e37}, //
|
||||
{0x1e39, 0x1e39}, //
|
||||
{0x1e3b, 0x1e3b}, //
|
||||
{0x1e3d, 0x1e3d}, //
|
||||
{0x1e3f, 0x1e3f}, //
|
||||
{0x1e41, 0x1e41}, //
|
||||
{0x1e43, 0x1e43}, //
|
||||
{0x1e45, 0x1e45}, //
|
||||
{0x1e47, 0x1e47}, //
|
||||
{0x1e49, 0x1e49}, //
|
||||
{0x1e4b, 0x1e4b}, //
|
||||
{0x1e4d, 0x1e4d}, //
|
||||
{0x1e4f, 0x1e4f}, //
|
||||
{0x1e51, 0x1e51}, //
|
||||
{0x1e53, 0x1e53}, //
|
||||
{0x1e55, 0x1e55}, //
|
||||
{0x1e57, 0x1e57}, //
|
||||
{0x1e59, 0x1e59}, //
|
||||
{0x1e5b, 0x1e5b}, //
|
||||
{0x1e5d, 0x1e5d}, //
|
||||
{0x1e5f, 0x1e5f}, //
|
||||
{0x1e61, 0x1e61}, //
|
||||
{0x1e63, 0x1e63}, //
|
||||
{0x1e65, 0x1e65}, //
|
||||
{0x1e67, 0x1e67}, //
|
||||
{0x1e69, 0x1e69}, //
|
||||
{0x1e6b, 0x1e6b}, //
|
||||
{0x1e6d, 0x1e6d}, //
|
||||
{0x1e6f, 0x1e6f}, //
|
||||
{0x1e71, 0x1e71}, //
|
||||
{0x1e73, 0x1e73}, //
|
||||
{0x1e75, 0x1e75}, //
|
||||
{0x1e77, 0x1e77}, //
|
||||
{0x1e79, 0x1e79}, //
|
||||
{0x1e7b, 0x1e7b}, //
|
||||
{0x1e7d, 0x1e7d}, //
|
||||
{0x1e7f, 0x1e7f}, //
|
||||
{0x1e81, 0x1e81}, //
|
||||
{0x1e83, 0x1e83}, //
|
||||
{0x1e85, 0x1e85}, //
|
||||
{0x1e87, 0x1e87}, //
|
||||
{0x1e89, 0x1e89}, //
|
||||
{0x1e8b, 0x1e8b}, //
|
||||
{0x1e8d, 0x1e8d}, //
|
||||
{0x1e8f, 0x1e8f}, //
|
||||
{0x1e91, 0x1e91}, //
|
||||
{0x1e93, 0x1e93}, //
|
||||
{0x1e95, 0x1e9d}, //
|
||||
{0x1e9f, 0x1e9f}, //
|
||||
{0x1ea1, 0x1ea1}, //
|
||||
{0x1ea3, 0x1ea3}, //
|
||||
{0x1ea5, 0x1ea5}, //
|
||||
{0x1ea7, 0x1ea7}, //
|
||||
{0x1ea9, 0x1ea9}, //
|
||||
{0x1eab, 0x1eab}, //
|
||||
{0x1ead, 0x1ead}, //
|
||||
{0x1eaf, 0x1eaf}, //
|
||||
{0x1eb1, 0x1eb1}, //
|
||||
{0x1eb3, 0x1eb3}, //
|
||||
{0x1eb5, 0x1eb5}, //
|
||||
{0x1eb7, 0x1eb7}, //
|
||||
{0x1eb9, 0x1eb9}, //
|
||||
{0x1ebb, 0x1ebb}, //
|
||||
{0x1ebd, 0x1ebd}, //
|
||||
{0x1ebf, 0x1ebf}, //
|
||||
{0x1ec1, 0x1ec1}, //
|
||||
{0x1ec3, 0x1ec3}, //
|
||||
{0x1ec5, 0x1ec5}, //
|
||||
{0x1ec7, 0x1ec7}, //
|
||||
{0x1ec9, 0x1ec9}, //
|
||||
{0x1ecb, 0x1ecb}, //
|
||||
{0x1ecd, 0x1ecd}, //
|
||||
{0x1ecf, 0x1ecf}, //
|
||||
{0x1ed1, 0x1ed1}, //
|
||||
{0x1ed3, 0x1ed3}, //
|
||||
{0x1ed5, 0x1ed5}, //
|
||||
{0x1ed7, 0x1ed7}, //
|
||||
{0x1ed9, 0x1ed9}, //
|
||||
{0x1edb, 0x1edb}, //
|
||||
{0x1edd, 0x1edd}, //
|
||||
{0x1edf, 0x1edf}, //
|
||||
{0x1ee1, 0x1ee1}, //
|
||||
{0x1ee3, 0x1ee3}, //
|
||||
{0x1ee5, 0x1ee5}, //
|
||||
{0x1ee7, 0x1ee7}, //
|
||||
{0x1ee9, 0x1ee9}, //
|
||||
{0x1eeb, 0x1eeb}, //
|
||||
{0x1eed, 0x1eed}, //
|
||||
{0x1eef, 0x1eef}, //
|
||||
{0x1ef1, 0x1ef1}, //
|
||||
{0x1ef3, 0x1ef3}, //
|
||||
{0x1ef5, 0x1ef5}, //
|
||||
{0x1ef7, 0x1ef7}, //
|
||||
{0x1ef9, 0x1ef9}, //
|
||||
{0x1efb, 0x1efb}, //
|
||||
{0x1efd, 0x1efd}, //
|
||||
{0x1eff, 0x1f07}, //
|
||||
{0x1f10, 0x1f15}, //
|
||||
{0x1f20, 0x1f27}, //
|
||||
{0x1f30, 0x1f37}, //
|
||||
{0x1f40, 0x1f45}, //
|
||||
{0x1f50, 0x1f57}, //
|
||||
{0x1f60, 0x1f67}, //
|
||||
{0x1f70, 0x1f7d}, //
|
||||
{0x1f80, 0x1f87}, //
|
||||
{0x1f90, 0x1f97}, //
|
||||
{0x1fa0, 0x1fa7}, //
|
||||
{0x1fb0, 0x1fb4}, //
|
||||
{0x1fb6, 0x1fb7}, //
|
||||
{0x1fbe, 0x1fbe}, //
|
||||
{0x1fc2, 0x1fc4}, //
|
||||
{0x1fc6, 0x1fc7}, //
|
||||
{0x1fd0, 0x1fd3}, //
|
||||
{0x1fd6, 0x1fd7}, //
|
||||
{0x1fe0, 0x1fe7}, //
|
||||
{0x1ff2, 0x1ff4}, //
|
||||
{0x1ff6, 0x1ff7}, //
|
||||
{0x2071, 0x2071}, //
|
||||
{0x207f, 0x207f}, //
|
||||
{0x2090, 0x209c}, //
|
||||
{0x210a, 0x210a}, //
|
||||
{0x210e, 0x210f}, //
|
||||
{0x2113, 0x2113}, //
|
||||
{0x212f, 0x212f}, //
|
||||
{0x2134, 0x2134}, //
|
||||
{0x2139, 0x2139}, //
|
||||
{0x213c, 0x213d}, //
|
||||
{0x2146, 0x2149}, //
|
||||
{0x214e, 0x214e}, //
|
||||
{0x2170, 0x217f}, //
|
||||
{0x2184, 0x2184}, //
|
||||
{0x24d0, 0x24e9}, //
|
||||
{0x2c30, 0x2c5f}, //
|
||||
{0x2c61, 0x2c61}, //
|
||||
{0x2c65, 0x2c66}, //
|
||||
{0x2c68, 0x2c68}, //
|
||||
{0x2c6a, 0x2c6a}, //
|
||||
{0x2c6c, 0x2c6c}, //
|
||||
{0x2c71, 0x2c71}, //
|
||||
{0x2c73, 0x2c74}, //
|
||||
{0x2c76, 0x2c7d}, //
|
||||
{0x2c81, 0x2c81}, //
|
||||
{0x2c83, 0x2c83}, //
|
||||
{0x2c85, 0x2c85}, //
|
||||
{0x2c87, 0x2c87}, //
|
||||
{0x2c89, 0x2c89}, //
|
||||
{0x2c8b, 0x2c8b}, //
|
||||
{0x2c8d, 0x2c8d}, //
|
||||
{0x2c8f, 0x2c8f}, //
|
||||
{0x2c91, 0x2c91}, //
|
||||
{0x2c93, 0x2c93}, //
|
||||
{0x2c95, 0x2c95}, //
|
||||
{0x2c97, 0x2c97}, //
|
||||
{0x2c99, 0x2c99}, //
|
||||
{0x2c9b, 0x2c9b}, //
|
||||
{0x2c9d, 0x2c9d}, //
|
||||
{0x2c9f, 0x2c9f}, //
|
||||
{0x2ca1, 0x2ca1}, //
|
||||
{0x2ca3, 0x2ca3}, //
|
||||
{0x2ca5, 0x2ca5}, //
|
||||
{0x2ca7, 0x2ca7}, //
|
||||
{0x2ca9, 0x2ca9}, //
|
||||
{0x2cab, 0x2cab}, //
|
||||
{0x2cad, 0x2cad}, //
|
||||
{0x2caf, 0x2caf}, //
|
||||
{0x2cb1, 0x2cb1}, //
|
||||
{0x2cb3, 0x2cb3}, //
|
||||
{0x2cb5, 0x2cb5}, //
|
||||
{0x2cb7, 0x2cb7}, //
|
||||
{0x2cb9, 0x2cb9}, //
|
||||
{0x2cbb, 0x2cbb}, //
|
||||
{0x2cbd, 0x2cbd}, //
|
||||
{0x2cbf, 0x2cbf}, //
|
||||
{0x2cc1, 0x2cc1}, //
|
||||
{0x2cc3, 0x2cc3}, //
|
||||
{0x2cc5, 0x2cc5}, //
|
||||
{0x2cc7, 0x2cc7}, //
|
||||
{0x2cc9, 0x2cc9}, //
|
||||
{0x2ccb, 0x2ccb}, //
|
||||
{0x2ccd, 0x2ccd}, //
|
||||
{0x2ccf, 0x2ccf}, //
|
||||
{0x2cd1, 0x2cd1}, //
|
||||
{0x2cd3, 0x2cd3}, //
|
||||
{0x2cd5, 0x2cd5}, //
|
||||
{0x2cd7, 0x2cd7}, //
|
||||
{0x2cd9, 0x2cd9}, //
|
||||
{0x2cdb, 0x2cdb}, //
|
||||
{0x2cdd, 0x2cdd}, //
|
||||
{0x2cdf, 0x2cdf}, //
|
||||
{0x2ce1, 0x2ce1}, //
|
||||
{0x2ce3, 0x2ce4}, //
|
||||
{0x2cec, 0x2cec}, //
|
||||
{0x2cee, 0x2cee}, //
|
||||
{0x2cf3, 0x2cf3}, //
|
||||
{0x2d00, 0x2d25}, //
|
||||
{0x2d27, 0x2d27}, //
|
||||
{0x2d2d, 0x2d2d}, //
|
||||
{0xa641, 0xa641}, //
|
||||
{0xa643, 0xa643}, //
|
||||
{0xa645, 0xa645}, //
|
||||
{0xa647, 0xa647}, //
|
||||
{0xa649, 0xa649}, //
|
||||
{0xa64b, 0xa64b}, //
|
||||
{0xa64d, 0xa64d}, //
|
||||
{0xa64f, 0xa64f}, //
|
||||
{0xa651, 0xa651}, //
|
||||
{0xa653, 0xa653}, //
|
||||
{0xa655, 0xa655}, //
|
||||
{0xa657, 0xa657}, //
|
||||
{0xa659, 0xa659}, //
|
||||
{0xa65b, 0xa65b}, //
|
||||
{0xa65d, 0xa65d}, //
|
||||
{0xa65f, 0xa65f}, //
|
||||
{0xa661, 0xa661}, //
|
||||
{0xa663, 0xa663}, //
|
||||
{0xa665, 0xa665}, //
|
||||
{0xa667, 0xa667}, //
|
||||
{0xa669, 0xa669}, //
|
||||
{0xa66b, 0xa66b}, //
|
||||
{0xa66d, 0xa66d}, //
|
||||
{0xa681, 0xa681}, //
|
||||
{0xa683, 0xa683}, //
|
||||
{0xa685, 0xa685}, //
|
||||
{0xa687, 0xa687}, //
|
||||
{0xa689, 0xa689}, //
|
||||
{0xa68b, 0xa68b}, //
|
||||
{0xa68d, 0xa68d}, //
|
||||
{0xa68f, 0xa68f}, //
|
||||
{0xa691, 0xa691}, //
|
||||
{0xa693, 0xa693}, //
|
||||
{0xa695, 0xa695}, //
|
||||
{0xa697, 0xa697}, //
|
||||
{0xa699, 0xa699}, //
|
||||
{0xa69b, 0xa69d}, //
|
||||
{0xa723, 0xa723}, //
|
||||
{0xa725, 0xa725}, //
|
||||
{0xa727, 0xa727}, //
|
||||
{0xa729, 0xa729}, //
|
||||
{0xa72b, 0xa72b}, //
|
||||
{0xa72d, 0xa72d}, //
|
||||
{0xa72f, 0xa731}, //
|
||||
{0xa733, 0xa733}, //
|
||||
{0xa735, 0xa735}, //
|
||||
{0xa737, 0xa737}, //
|
||||
{0xa739, 0xa739}, //
|
||||
{0xa73b, 0xa73b}, //
|
||||
{0xa73d, 0xa73d}, //
|
||||
{0xa73f, 0xa73f}, //
|
||||
{0xa741, 0xa741}, //
|
||||
{0xa743, 0xa743}, //
|
||||
{0xa745, 0xa745}, //
|
||||
{0xa747, 0xa747}, //
|
||||
{0xa749, 0xa749}, //
|
||||
{0xa74b, 0xa74b}, //
|
||||
{0xa74d, 0xa74d}, //
|
||||
{0xa74f, 0xa74f}, //
|
||||
{0xa751, 0xa751}, //
|
||||
{0xa753, 0xa753}, //
|
||||
{0xa755, 0xa755}, //
|
||||
{0xa757, 0xa757}, //
|
||||
{0xa759, 0xa759}, //
|
||||
{0xa75b, 0xa75b}, //
|
||||
{0xa75d, 0xa75d}, //
|
||||
{0xa75f, 0xa75f}, //
|
||||
{0xa761, 0xa761}, //
|
||||
{0xa763, 0xa763}, //
|
||||
{0xa765, 0xa765}, //
|
||||
{0xa767, 0xa767}, //
|
||||
{0xa769, 0xa769}, //
|
||||
{0xa76b, 0xa76b}, //
|
||||
{0xa76d, 0xa76d}, //
|
||||
{0xa76f, 0xa778}, //
|
||||
{0xa77a, 0xa77a}, //
|
||||
{0xa77c, 0xa77c}, //
|
||||
{0xa77f, 0xa77f}, //
|
||||
{0xa781, 0xa781}, //
|
||||
{0xa783, 0xa783}, //
|
||||
{0xa785, 0xa785}, //
|
||||
{0xa787, 0xa787}, //
|
||||
{0xa78c, 0xa78c}, //
|
||||
{0xa78e, 0xa78e}, //
|
||||
{0xa791, 0xa791}, //
|
||||
{0xa793, 0xa795}, //
|
||||
{0xa797, 0xa797}, //
|
||||
{0xa799, 0xa799}, //
|
||||
{0xa79b, 0xa79b}, //
|
||||
{0xa79d, 0xa79d}, //
|
||||
{0xa79f, 0xa79f}, //
|
||||
{0xa7a1, 0xa7a1}, //
|
||||
{0xa7a3, 0xa7a3}, //
|
||||
{0xa7a5, 0xa7a5}, //
|
||||
{0xa7a7, 0xa7a7}, //
|
||||
{0xa7a9, 0xa7a9}, //
|
||||
{0xa7af, 0xa7af}, //
|
||||
{0xa7b5, 0xa7b5}, //
|
||||
{0xa7b7, 0xa7b7}, //
|
||||
{0xa7b9, 0xa7b9}, //
|
||||
{0xa7bb, 0xa7bb}, //
|
||||
{0xa7bd, 0xa7bd}, //
|
||||
{0xa7bf, 0xa7bf}, //
|
||||
{0xa7c1, 0xa7c1}, //
|
||||
{0xa7c3, 0xa7c3}, //
|
||||
{0xa7c8, 0xa7c8}, //
|
||||
{0xa7ca, 0xa7ca}, //
|
||||
{0xa7d1, 0xa7d1}, //
|
||||
{0xa7d3, 0xa7d3}, //
|
||||
{0xa7d5, 0xa7d5}, //
|
||||
{0xa7d7, 0xa7d7}, //
|
||||
{0xa7d9, 0xa7d9}, //
|
||||
{0xa7f2, 0xa7f4}, //
|
||||
{0xa7f6, 0xa7f6}, //
|
||||
{0xa7f8, 0xa7fa}, //
|
||||
{0xab30, 0xab5a}, //
|
||||
{0xab5c, 0xab69}, //
|
||||
{0xab70, 0xabbf}, //
|
||||
{0xfb00, 0xfb06}, //
|
||||
{0xfb13, 0xfb17}, //
|
||||
{0xff41, 0xff5a}, //
|
||||
};
|
||||
|
||||
static const unsigned kLowerAstral[][2] = {
|
||||
{0x10428, 0x1044f}, //
|
||||
{0x104d8, 0x104fb}, //
|
||||
{0x10597, 0x105a1}, //
|
||||
{0x105a3, 0x105b1}, //
|
||||
{0x105b3, 0x105b9}, //
|
||||
{0x105bb, 0x105bc}, //
|
||||
{0x10780, 0x10780}, //
|
||||
{0x10783, 0x10785}, //
|
||||
{0x10787, 0x107b0}, //
|
||||
{0x107b2, 0x107ba}, //
|
||||
{0x10cc0, 0x10cf2}, //
|
||||
{0x118c0, 0x118df}, //
|
||||
{0x16e60, 0x16e7f}, //
|
||||
{0x1d41a, 0x1d433}, //
|
||||
{0x1d44e, 0x1d454}, //
|
||||
{0x1d456, 0x1d467}, //
|
||||
{0x1d482, 0x1d49b}, //
|
||||
{0x1d4b6, 0x1d4b9}, //
|
||||
{0x1d4bb, 0x1d4bb}, //
|
||||
{0x1d4bd, 0x1d4c3}, //
|
||||
{0x1d4c5, 0x1d4cf}, //
|
||||
{0x1d4ea, 0x1d503}, //
|
||||
{0x1d51e, 0x1d537}, //
|
||||
{0x1d552, 0x1d56b}, //
|
||||
{0x1d586, 0x1d59f}, //
|
||||
{0x1d5ba, 0x1d5d3}, //
|
||||
{0x1d5ee, 0x1d607}, //
|
||||
{0x1d622, 0x1d63b}, //
|
||||
{0x1d656, 0x1d66f}, //
|
||||
{0x1d68a, 0x1d6a5}, //
|
||||
{0x1d6c2, 0x1d6da}, //
|
||||
{0x1d6dc, 0x1d6e1}, //
|
||||
{0x1d6fc, 0x1d714}, //
|
||||
{0x1d716, 0x1d71b}, //
|
||||
{0x1d736, 0x1d74e}, //
|
||||
{0x1d750, 0x1d755}, //
|
||||
{0x1d770, 0x1d788}, //
|
||||
{0x1d78a, 0x1d78f}, //
|
||||
{0x1d7aa, 0x1d7c2}, //
|
||||
{0x1d7c4, 0x1d7c9}, //
|
||||
{0x1d7cb, 0x1d7cb}, //
|
||||
{0x1df00, 0x1df09}, //
|
||||
{0x1df0b, 0x1df1e}, //
|
||||
{0x1df25, 0x1df2a}, //
|
||||
{0x1e030, 0x1e06d}, //
|
||||
{0x1e922, 0x1e943}, //
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns nonzero if c is lowercase letter.
|
||||
*/
|
||||
int iswlower(wint_t c) {
|
||||
if (!IsTiny() && c < 128)
|
||||
return 'a' <= c && c <= 'z';
|
||||
if (c < 65536)
|
||||
return has_char(kLower, ARRAYLEN(kLower), (unsigned short)c);
|
||||
return has_char(kLowerAstral, ARRAYLEN(kLowerAstral), (unsigned)c);
|
||||
}
|
||||
|
||||
__weak_reference(iswlower, iswlower_l);
|
|
@ -22,8 +22,11 @@
|
|||
* Returns nonzero if c is printable.
|
||||
*/
|
||||
int iswprint(wint_t c) {
|
||||
return !((0x00 <= c && c <= 0x1F) || (0x7F <= c && c <= 0x9F) ||
|
||||
(0xFFF9 <= c && c <= 0xFFFB) || c == 0x2028 || c == 0x2029);
|
||||
return (0 <= c && c <= 0x10FFFD) && // legal unicode
|
||||
!(0x0000 <= c && c <= 0x001F) && // c0 control codes
|
||||
!(0x007F <= c && c <= 0x009F) && // c1 control codes
|
||||
!(0x2028 <= c && c <= 0x2029) && // line / paragraph separator
|
||||
!(0xFFF9 <= c && c <= 0xFFFB); // interlinear annotation controls
|
||||
}
|
||||
|
||||
__weak_reference(iswprint, iswprint_l);
|
||||
|
|
|
@ -1,543 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/wctype.h"
|
||||
|
||||
/**
|
||||
* Returns nonzero if c is punctuation mark.
|
||||
*/
|
||||
int iswpunct(wint_t c) {
|
||||
if (c < 0xa0) {
|
||||
switch (c) {
|
||||
case '!':
|
||||
case '"':
|
||||
case '#':
|
||||
case '$':
|
||||
case '%':
|
||||
case '&':
|
||||
case '\'':
|
||||
case '(':
|
||||
case ')':
|
||||
case '*':
|
||||
case '+':
|
||||
case ',':
|
||||
case '-':
|
||||
case '.':
|
||||
case '/':
|
||||
case ':':
|
||||
case ';':
|
||||
case '<':
|
||||
case '=':
|
||||
case '>':
|
||||
case '?':
|
||||
case '@':
|
||||
case '[':
|
||||
case '\\':
|
||||
case ']':
|
||||
case '^':
|
||||
case '_':
|
||||
case '`':
|
||||
case '{':
|
||||
case '|':
|
||||
case '}':
|
||||
case '~':
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
switch (c) {
|
||||
case u'¡': // INVERTED EXCLAMATION MARK (0x00a1 Po)
|
||||
case u'§': // SECTION SIGN (0x00a7 Po)
|
||||
case u'«': // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (0x00ab Pi)
|
||||
case u'¶': // PILCROW SIGN (0x00b6 Po)
|
||||
case u'·': // MIDDLE DOT (0x00b7 Po)
|
||||
case u'»': // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (0x00bb Pf)
|
||||
case u'¿': // INVERTED QUESTION MARK (0x00bf Po)
|
||||
case u';': // GREEK QUESTION MARK (0x037e Po)
|
||||
case u'·': // GREEK ANO TELEIA (0x0387 Po)
|
||||
case u'՚': // ARMENIAN APOSTROPHE (0x055a Po)
|
||||
case u'՛': // ARMENIAN EMPHASIS MARK (0x055b Po)
|
||||
case u'՜': // ARMENIAN EXCLAMATION MARK (0x055c Po)
|
||||
case u'՝': // ARMENIAN COMMA (0x055d Po)
|
||||
case u'՞': // ARMENIAN QUESTION MARK (0x055e Po)
|
||||
case u'՟': // ARMENIAN ABBREVIATION MARK (0x055f Po)
|
||||
case u'։': // ARMENIAN FULL STOP (0x0589 Po)
|
||||
case u'֊': // ARMENIAN HYPHEN (0x058a Pd)
|
||||
case 0x05be: // HEBREW PUNCTUATION MAQAF (0x05be Pd)
|
||||
case 0x05c0: // HEBREW PUNCTUATION PASEQ (0x05c0 Po)
|
||||
case 0x05c3: // HEBREW PUNCTUATION SOF PASUQ (0x05c3 Po)
|
||||
case 0x05c6: // HEBREW PUNCTUATION NUN HAFUKHA (0x05c6 Po)
|
||||
case 0x05f3: // HEBREW PUNCTUATION GERESH (0x05f3 Po)
|
||||
case 0x05f4: // HEBREW PUNCTUATION GERSHAYIM (0x05f4 Po)
|
||||
case 0x0609: // ARABIC-INDIC PER MILLE SIGN (0x0609 Po)
|
||||
case 0x060a: // ARABIC-INDIC PER TEN THOUSAND SIGN (0x060a Po)
|
||||
case 0x060c: // ARABIC COMMA (0x060c Po)
|
||||
case 0x060d: // ARABIC DATE SEPARATOR (0x060d Po)
|
||||
case 0x061b: // ARABIC SEMICOLON (0x061b Po)
|
||||
case u'؞': // ARABIC TRIPLE DOT PUNCTUATION MARK (0x061e Po)
|
||||
case u'؟': // ARABIC QUESTION MARK (0x061f Po)
|
||||
case u'٪': // ARABIC PERCENT SIGN (0x066a Po)
|
||||
case u'٫': // ARABIC DECIMAL SEPARATOR (0x066b Po)
|
||||
case u'٬': // ARABIC THOUSANDS SEPARATOR (0x066c Po)
|
||||
case u'٭': // ARABIC FIVE POINTED STAR (0x066d Po)
|
||||
case u'۔': // ARABIC FULL STOP (0x06d4 Po)
|
||||
case u'߷': // NKO SYMBOL GBAKURUNEN (0x07f7 Po)
|
||||
case u'߸': // NKO COMMA (0x07f8 Po)
|
||||
case u'߹': // NKO EXCLAMATION MARK (0x07f9 Po)
|
||||
case u'।': // DEVANAGARI DANDA (0x0964 Po)
|
||||
case u'॥': // DEVANAGARI DOUBLE DANDA (0x0965 Po)
|
||||
case u'॰': // DEVANAGARI ABBREVIATION SIGN (0x0970 Po)
|
||||
case 0x09fd: // BENGALI ABBREVIATION SIGN (0x09fd Po)
|
||||
case 0x0a76: // GURMUKHI ABBREVIATION SIGN (0x0a76 Po)
|
||||
case 0x0af0: // GUJARATI ABBREVIATION SIGN (0x0af0 Po)
|
||||
case 0x0c77: // TELUGU SIGN SIDDHAM (0x0c77 Po)
|
||||
case 0x0c84: // KANNADA SIGN SIDDHAM (0x0c84 Po)
|
||||
case u'෴': // SINHALA PUNCTUATION KUNDDALIYA (0x0df4 Po)
|
||||
case u'๏': // THAI CHARACTER FONGMAN (0x0e4f Po)
|
||||
case u'๚': // THAI CHARACTER ANGKHANKHU (0x0e5a Po)
|
||||
case u'๛': // THAI CHARACTER KHOMUT (0x0e5b Po)
|
||||
case u'༄': // TIBETAN MARK INITIAL YIG MGO MDUN MA (0x0f04 Po)
|
||||
case u'༅': // TIBETAN MARK CLOSING YIG MGO SGAB MA (0x0f05 Po)
|
||||
case u'༆': // TIBETAN MARK CARET YIG MGO PHUR SHAD MA (0x0f06 Po)
|
||||
case u'༇': // TIBETAN MARK YIG MGO TSHEG SHAD MA (0x0f07 Po)
|
||||
case u'༈': // TIBETAN MARK SBRUL SHAD (0x0f08 Po)
|
||||
case u'༉': // TIBETAN MARK BSKUR YIG MGO (0x0f09 Po)
|
||||
case u'༊': // TIBETAN MARK BKA- SHOG YIG MGO (0x0f0a Po)
|
||||
case u'་': // TIBETAN MARK INTERSYLLABIC TSHEG (0x0f0b Po)
|
||||
case u'༌': // TIBETAN MARK DELIMITER TSHEG BSTAR (0x0f0c Po)
|
||||
case u'།': // TIBETAN MARK SHAD (0x0f0d Po)
|
||||
case u'༎': // TIBETAN MARK NYIS SHAD (0x0f0e Po)
|
||||
case u'༏': // TIBETAN MARK TSHEG SHAD (0x0f0f Po)
|
||||
case u'༐': // TIBETAN MARK NYIS TSHEG SHAD (0x0f10 Po)
|
||||
case u'༑': // TIBETAN MARK RIN CHEN SPUNGS SHAD (0x0f11 Po)
|
||||
case u'༒': // TIBETAN MARK RGYA GRAM SHAD (0x0f12 Po)
|
||||
case u'༔': // TIBETAN MARK GTER TSHEG (0x0f14 Po)
|
||||
case u'༺': // TIBETAN MARK GUG RTAGS GYON (0x0f3a Ps)
|
||||
case u'༻': // TIBETAN MARK GUG RTAGS GYAS (0x0f3b Pe)
|
||||
case u'༼': // TIBETAN MARK ANG KHANG GYON (0x0f3c Ps)
|
||||
case u'༽': // TIBETAN MARK ANG KHANG GYAS (0x0f3d Pe)
|
||||
case u'྅': // TIBETAN MARK PALUTA (0x0f85 Po)
|
||||
case u'࿐': // TIBETAN MARK BSKA- SHOG GI MGO RGYAN (0x0fd0 Po)
|
||||
case u'࿑': // TIBETAN MARK MNYAM YIG GI MGO RGYAN (0x0fd1 Po)
|
||||
case u'࿒': // TIBETAN MARK NYIS TSHEG (0x0fd2 Po)
|
||||
case u'࿓': // TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA (0x0fd3 Po)
|
||||
case u'࿔': // TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA (0x0fd4 Po)
|
||||
case u'࿙': // TIBETAN MARK LEADING MCHAN RTAGS (0x0fd9 Po)
|
||||
case u'࿚': // TIBETAN MARK TRAILING MCHAN RTAGS (0x0fda Po)
|
||||
case u'၊': // MYANMAR SIGN LITTLE SECTION (0x104a Po)
|
||||
case u'။': // MYANMAR SIGN SECTION (0x104b Po)
|
||||
case u'၌': // MYANMAR SYMBOL LOCATIVE (0x104c Po)
|
||||
case u'၍': // MYANMAR SYMBOL COMPLETED (0x104d Po)
|
||||
case u'၎': // MYANMAR SYMBOL AFOREMENTIONED (0x104e Po)
|
||||
case u'၏': // MYANMAR SYMBOL GENITIVE (0x104f Po)
|
||||
case u'჻': // GEORGIAN PARAGRAPH SEPARATOR (0x10fb Po)
|
||||
case u'፠': // ETHIOPIC SECTION MARK (0x1360 Po)
|
||||
case u'፡': // ETHIOPIC WORDSPACE (0x1361 Po)
|
||||
case u'።': // ETHIOPIC FULL STOP (0x1362 Po)
|
||||
case u'፣': // ETHIOPIC COMMA (0x1363 Po)
|
||||
case u'፤': // ETHIOPIC SEMICOLON (0x1364 Po)
|
||||
case u'፥': // ETHIOPIC COLON (0x1365 Po)
|
||||
case u'፦': // ETHIOPIC PREFACE COLON (0x1366 Po)
|
||||
case u'፧': // ETHIOPIC QUESTION MARK (0x1367 Po)
|
||||
case u'፨': // ETHIOPIC PARAGRAPH SEPARATOR (0x1368 Po)
|
||||
case u'᐀': // CANADIAN SYLLABICS HYPHEN (0x1400 Pd)
|
||||
case u'᙮': // CANADIAN SYLLABICS FULL STOP (0x166e Po)
|
||||
case u'᚛': // OGHAM FEATHER MARK (0x169b Ps)
|
||||
case u'᚜': // OGHAM REVERSED FEATHER MARK (0x169c Pe)
|
||||
case u'᛫': // RUNIC SINGLE PUNCTUATION (0x16eb Po)
|
||||
case u'᛬': // RUNIC MULTIPLE PUNCTUATION (0x16ec Po)
|
||||
case u'᛭': // RUNIC CROSS PUNCTUATION (0x16ed Po)
|
||||
case u'᜵': // PHILIPPINE SINGLE PUNCTUATION (0x1735 Po)
|
||||
case u'᜶': // PHILIPPINE DOUBLE PUNCTUATION (0x1736 Po)
|
||||
case u'។': // KHMER SIGN KHAN (0x17d4 Po)
|
||||
case u'៕': // KHMER SIGN BARIYOOSAN (0x17d5 Po)
|
||||
case u'៖': // KHMER SIGN CAMNUC PII KUUH (0x17d6 Po)
|
||||
case u'៘': // KHMER SIGN BEYYAL (0x17d8 Po)
|
||||
case u'៙': // KHMER SIGN PHNAEK MUAN (0x17d9 Po)
|
||||
case u'៚': // KHMER SIGN KOOMUUT (0x17da Po)
|
||||
case u'᠀': // MONGOLIAN BIRGA (0x1800 Po)
|
||||
case u'᠁': // MONGOLIAN ELLIPSIS (0x1801 Po)
|
||||
case u'᠂': // MONGOLIAN COMMA (0x1802 Po)
|
||||
case u'᠃': // MONGOLIAN FULL STOP (0x1803 Po)
|
||||
case u'᠄': // MONGOLIAN COLON (0x1804 Po)
|
||||
case u'᠅': // MONGOLIAN FOUR DOTS (0x1805 Po)
|
||||
case u'᠆': // MONGOLIAN TODO SOFT HYPHEN (0x1806 Pd)
|
||||
case u'᠇': // MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER (0x1807 Po)
|
||||
case u'᠈': // MONGOLIAN MANCHU COMMA (0x1808 Po)
|
||||
case u'᠉': // MONGOLIAN MANCHU FULL STOP (0x1809 Po)
|
||||
case u'᠊': // MONGOLIAN NIRUGU (0x180a Po)
|
||||
case u'᥄': // LIMBU EXCLAMATION MARK (0x1944 Po)
|
||||
case u'᥅': // LIMBU QUESTION MARK (0x1945 Po)
|
||||
case u'᨞': // BUGINESE PALLAWA (0x1a1e Po)
|
||||
case u'᨟': // BUGINESE END OF SECTION (0x1a1f Po)
|
||||
case u'᱾': // OL CHIKI PUNCTUATION MUCAAD (0x1c7e Po)
|
||||
case u'᱿': // OL CHIKI PUNCTUATION DOUBLE MUCAAD (0x1c7f Po)
|
||||
case u'‐': // HYPHEN (0x2010 Pd)
|
||||
case u'‑': // NON-BREAKING HYPHEN (0x2011 Pd)
|
||||
case u'‒': // FIGURE DASH (0x2012 Pd)
|
||||
case u'–': // EN DASH (0x2013 Pd)
|
||||
case u'—': // EM DASH (0x2014 Pd)
|
||||
case u'―': // HORIZONTAL BAR (0x2015 Pd)
|
||||
case u'‖': // DOUBLE VERTICAL LINE (0x2016 Po)
|
||||
case u'‗': // DOUBLE LOW LINE (0x2017 Po)
|
||||
case u'‘': // LEFT SINGLE QUOTATION MARK (0x2018 Pi)
|
||||
case u'’': // RIGHT SINGLE QUOTATION MARK (0x2019 Pf)
|
||||
case u'‚': // SINGLE LOW-9 QUOTATION MARK (0x201a Ps)
|
||||
case u'‛': // SINGLE HIGH-REVERSED-9 QUOTATION MARK (0x201b Pi)
|
||||
case u'“': // LEFT DOUBLE QUOTATION MARK (0x201c Pi)
|
||||
case u'”': // RIGHT DOUBLE QUOTATION MARK (0x201d Pf)
|
||||
case u'„': // DOUBLE LOW-9 QUOTATION MARK (0x201e Ps)
|
||||
case u'‟': // DOUBLE HIGH-REVERSED-9 QUOTATION MARK (0x201f Pi)
|
||||
case u'†': // DAGGER (0x2020 Po)
|
||||
case u'‡': // DOUBLE DAGGER (0x2021 Po)
|
||||
case u'•': // BULLET (0x2022 Po)
|
||||
case u'‣': // TRIANGULAR BULLET (0x2023 Po)
|
||||
case u'․': // ONE DOT LEADER (0x2024 Po)
|
||||
case u'‥': // TWO DOT LEADER (0x2025 Po)
|
||||
case u'…': // HORIZONTAL ELLIPSIS (0x2026 Po)
|
||||
case u'‧': // HYPHENATION POINT (0x2027 Po)
|
||||
case u'‰': // PER MILLE SIGN (0x2030 Po)
|
||||
case u'‱': // PER TEN THOUSAND SIGN (0x2031 Po)
|
||||
case u'′': // PRIME (0x2032 Po)
|
||||
case u'″': // DOUBLE PRIME (0x2033 Po)
|
||||
case u'‴': // TRIPLE PRIME (0x2034 Po)
|
||||
case u'‵': // REVERSED PRIME (0x2035 Po)
|
||||
case u'‶': // REVERSED DOUBLE PRIME (0x2036 Po)
|
||||
case u'‷': // REVERSED TRIPLE PRIME (0x2037 Po)
|
||||
case u'‸': // CARET (0x2038 Po)
|
||||
case u'‹': // SINGLE LEFT-POINTING ANGLE QUOTATION MARK (0x2039 Pi)
|
||||
case u'›': // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (0x203a Pf)
|
||||
case u'※': // REFERENCE MARK (0x203b Po)
|
||||
case u'‼': // DOUBLE EXCLAMATION MARK (0x203c Po)
|
||||
case u'‽': // INTERROBANG (0x203d Po)
|
||||
case u'‾': // OVERLINE (0x203e Po)
|
||||
case u'‿': // UNDERTIE (0x203f Pc)
|
||||
case u'⁀': // CHARACTER TIE (0x2040 Pc)
|
||||
case u'⁁': // CARET INSERTION POINT (0x2041 Po)
|
||||
case u'⁂': // ASTERISM (0x2042 Po)
|
||||
case u'⁃': // HYPHEN BULLET (0x2043 Po)
|
||||
case u'⁅': // LEFT SQUARE BRACKET WITH QUILL (0x2045 Ps)
|
||||
case u'⁆': // RIGHT SQUARE BRACKET WITH QUILL (0x2046 Pe)
|
||||
case u'⁇': // DOUBLE QUESTION MARK (0x2047 Po)
|
||||
case u'⁈': // QUESTION EXCLAMATION MARK (0x2048 Po)
|
||||
case u'⁉': // EXCLAMATION QUESTION MARK (0x2049 Po)
|
||||
case u'⁊': // TIRONIAN SIGN ET (0x204a Po)
|
||||
case u'⁋': // REVERSED PILCROW SIGN (0x204b Po)
|
||||
case u'⁌': // BLACK LEFTWARDS BULLET (0x204c Po)
|
||||
case u'⁍': // BLACK RIGHTWARDS BULLET (0x204d Po)
|
||||
case u'⁎': // LOW ASTERISK (0x204e Po)
|
||||
case u'⁏': // REVERSED SEMICOLON (0x204f Po)
|
||||
case u'⁐': // CLOSE UP (0x2050 Po)
|
||||
case u'⁑': // TWO ASTERISKS ALIGNED VERTICALLY (0x2051 Po)
|
||||
case u'⁓': // SWUNG DASH (0x2053 Po)
|
||||
case u'⁔': // INVERTED UNDERTIE (0x2054 Pc)
|
||||
case u'⁕': // FLOWER PUNCTUATION MARK (0x2055 Po)
|
||||
case u'⁖': // THREE DOT PUNCTUATION (0x2056 Po)
|
||||
case u'⁗': // QUADRUPLE PRIME (0x2057 Po)
|
||||
case u'⁘': // FOUR DOT PUNCTUATION (0x2058 Po)
|
||||
case u'⁙': // FIVE DOT PUNCTUATION (0x2059 Po)
|
||||
case u'⁚': // TWO DOT PUNCTUATION (0x205a Po)
|
||||
case u'⁛': // FOUR DOT MARK (0x205b Po)
|
||||
case u'⁜': // DOTTED CROSS (0x205c Po)
|
||||
case u'⁝': // TRICOLON (0x205d Po)
|
||||
case u'⁞': // VERTICAL FOUR DOTS (0x205e Po)
|
||||
case u'⁽': // SUPERSCRIPT LEFT PARENTHESIS (0x207d Ps)
|
||||
case u'⁾': // SUPERSCRIPT RIGHT PARENTHESIS (0x207e Pe)
|
||||
case u'₍': // SUBSCRIPT LEFT PARENTHESIS (0x208d Ps)
|
||||
case u'₎': // SUBSCRIPT RIGHT PARENTHESIS (0x208e Pe)
|
||||
case u'⌈': // LEFT CEILING (0x2308 Ps)
|
||||
case u'⌉': // RIGHT CEILING (0x2309 Pe)
|
||||
case u'⌊': // LEFT FLOOR (0x230a Ps)
|
||||
case u'⌋': // RIGHT FLOOR (0x230b Pe)
|
||||
case u'〈': // LEFT-POINTING ANGLE BRACKET (0x2329 Ps)
|
||||
case u'〉': // RIGHT-POINTING ANGLE BRACKET (0x232a Pe)
|
||||
case u'❨': // MEDIUM LEFT PARENTHESIS ORNAMENT (0x2768 Ps)
|
||||
case u'❩': // MEDIUM RIGHT PARENTHESIS ORNAMENT (0x2769 Pe)
|
||||
case u'❪': // MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT (0x276a Ps)
|
||||
case u'❫': // MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT (0x276b Pe)
|
||||
case u'❬': // MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT (0x276c Ps)
|
||||
case u'❭': // MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT (0x276d Pe)
|
||||
case u'❮': // HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT (0x276e Ps)
|
||||
case u'❯': // HEAVY RIGHT-POINTING ANGLE QUOT MARK ORNAMENT (0x276f Pe)
|
||||
case u'❰': // HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT (0x2770 Ps)
|
||||
case u'❱': // HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT (0x2771 Pe)
|
||||
case u'❲': // LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT (0x2772 Ps)
|
||||
case u'❳': // LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT (0x2773 Pe)
|
||||
case u'❴': // MEDIUM LEFT CURLY BRACKET ORNAMENT (0x2774 Ps)
|
||||
case u'❵': // MEDIUM RIGHT CURLY BRACKET ORNAMENT (0x2775 Pe)
|
||||
case u'⟅': // LEFT S-SHAPED BAG DELIMITER (0x27c5 Ps)
|
||||
case u'⟆': // RIGHT S-SHAPED BAG DELIMITER (0x27c6 Pe)
|
||||
case u'⟦': // MATHEMATICAL LEFT WHITE SQUARE BRACKET (0x27e6 Ps)
|
||||
case u'⟧': // MATHEMATICAL RIGHT WHITE SQUARE BRACKET (0x27e7 Pe)
|
||||
case u'⟨': // MATHEMATICAL LEFT ANGLE BRACKET (0x27e8 Ps)
|
||||
case u'⟩': // MATHEMATICAL RIGHT ANGLE BRACKET (0x27e9 Pe)
|
||||
case u'⟪': // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET (0x27ea Ps)
|
||||
case u'⟫': // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET (0x27eb Pe)
|
||||
case u'⟬': // MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET (0x27ec Ps)
|
||||
case u'⟭': // MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET (0x27ed Pe)
|
||||
case u'⟮': // MATHEMATICAL LEFT FLATTENED PARENTHESIS (0x27ee Ps)
|
||||
case u'⟯': // MATHEMATICAL RIGHT FLATTENED PARENTHESIS (0x27ef Pe)
|
||||
case u'⦃': // LEFT WHITE CURLY BRACKET (0x2983 Ps)
|
||||
case u'⦄': // RIGHT WHITE CURLY BRACKET (0x2984 Pe)
|
||||
case u'⦅': // LEFT WHITE PARENTHESIS (0x2985 Ps)
|
||||
case u'⦆': // RIGHT WHITE PARENTHESIS (0x2986 Pe)
|
||||
case u'⦇': // Z NOTATION LEFT IMAGE BRACKET (0x2987 Ps)
|
||||
case u'⦈': // Z NOTATION RIGHT IMAGE BRACKET (0x2988 Pe)
|
||||
case u'⦉': // Z NOTATION LEFT BINDING BRACKET (0x2989 Ps)
|
||||
case u'⦊': // Z NOTATION RIGHT BINDING BRACKET (0x298a Pe)
|
||||
case u'⦋': // LEFT SQUARE BRACKET WITH UNDERBAR (0x298b Ps)
|
||||
case u'⦌': // RIGHT SQUARE BRACKET WITH UNDERBAR (0x298c Pe)
|
||||
case u'⦍': // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER (0x298d Ps)
|
||||
case u'⦎': // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER (0x298e Pe)
|
||||
case u'⦏': // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER (0x298f Ps)
|
||||
case u'⦐': // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER (0x2990 Pe)
|
||||
case u'⦑': // LEFT ANGLE BRACKET WITH DOT (0x2991 Ps)
|
||||
case u'⦒': // RIGHT ANGLE BRACKET WITH DOT (0x2992 Pe)
|
||||
case u'⦓': // LEFT ARC LESS-THAN BRACKET (0x2993 Ps)
|
||||
case u'⦔': // RIGHT ARC GREATER-THAN BRACKET (0x2994 Pe)
|
||||
case u'⦗': // LEFT BLACK TORTOISE SHELL BRACKET (0x2997 Ps)
|
||||
case u'⦘': // RIGHT BLACK TORTOISE SHELL BRACKET (0x2998 Pe)
|
||||
case u'⧘': // LEFT WIGGLY FENCE (0x29d8 Ps)
|
||||
case u'⧙': // RIGHT WIGGLY FENCE (0x29d9 Pe)
|
||||
case u'⧚': // LEFT DOUBLE WIGGLY FENCE (0x29da Ps)
|
||||
case u'⧛': // RIGHT DOUBLE WIGGLY FENCE (0x29db Pe)
|
||||
case u'⧼': // LEFT-POINTING CURVED ANGLE BRACKET (0x29fc Ps)
|
||||
case u'⧽': // RIGHT-POINTING CURVED ANGLE BRACKET (0x29fd Pe)
|
||||
case u'⵰': // TIFINAGH SEPARATOR MARK (0x2d70 Po)
|
||||
case u'⸎': // EDITORIAL CORONIS (0x2e0e Po)
|
||||
case u'⸏': // PARAGRAPHOS (0x2e0f Po)
|
||||
case u'⸐': // FORKED PARAGRAPHOS (0x2e10 Po)
|
||||
case u'⸑': // REVERSED FORKED PARAGRAPHOS (0x2e11 Po)
|
||||
case u'⸒': // HYPODIASTOLE (0x2e12 Po)
|
||||
case u'⸓': // DOTTED OBELOS (0x2e13 Po)
|
||||
case u'⸔': // DOWNWARDS ANCORA (0x2e14 Po)
|
||||
case u'⸕': // UPWARDS ANCORA (0x2e15 Po)
|
||||
case u'⸖': // DOTTED RIGHT-POINTING ANGLE (0x2e16 Po)
|
||||
case u'⸗': // DOUBLE OBLIQUE HYPHEN (0x2e17 Pd)
|
||||
case u'⸙': // PALM BRANCH (0x2e19 Po)
|
||||
case u'⸚': // HYPHEN WITH DIAERESIS (0x2e1a Pd)
|
||||
case u'⸛': // TILDE WITH RING ABOVE (0x2e1b Po)
|
||||
case u'⸞': // TILDE WITH DOT ABOVE (0x2e1e Po)
|
||||
case u'⸟': // TILDE WITH DOT BELOW (0x2e1f Po)
|
||||
case u'⸪': // TWO DOTS OVER ONE DOT PUNCTUATION (0x2e2a Po)
|
||||
case u'⸫': // ONE DOT OVER TWO DOTS PUNCTUATION (0x2e2b Po)
|
||||
case u'⸬': // SQUARED FOUR DOT PUNCTUATION (0x2e2c Po)
|
||||
case u'⸭': // FIVE DOT MARK (0x2e2d Po)
|
||||
case u'⸮': // REVERSED QUESTION MARK (0x2e2e Po)
|
||||
case u'⸰': // RING POINT (0x2e30 Po)
|
||||
case u'⸱': // WORD SEPARATOR MIDDLE DOT (0x2e31 Po)
|
||||
case u'⸲': // TURNED COMMA (0x2e32 Po)
|
||||
case u'⸳': // RAISED DOT (0x2e33 Po)
|
||||
case u'⸴': // RAISED COMMA (0x2e34 Po)
|
||||
case u'⸵': // TURNED SEMICOLON (0x2e35 Po)
|
||||
case u'⸶': // DAGGER WITH LEFT GUARD (0x2e36 Po)
|
||||
case u'⸷': // DAGGER WITH RIGHT GUARD (0x2e37 Po)
|
||||
case u'⸸': // TURNED DAGGER (0x2e38 Po)
|
||||
case u'⸹': // TOP HALF SECTION SIGN (0x2e39 Po)
|
||||
case u'⸺': // TWO-EM DASH (0x2e3a Pd)
|
||||
case u'⸻': // THREE-EM DASH (0x2e3b Pd)
|
||||
case u'⸼': // STENOGRAPHIC FULL STOP (0x2e3c Po)
|
||||
case u'⸽': // VERTICAL SIX DOTS (0x2e3d Po)
|
||||
case u'⸾': // WIGGLY VERTICAL LINE (0x2e3e Po)
|
||||
case u'⸿': // CAPITULUM (0x2e3f Po)
|
||||
case u'⹀': // DOUBLE HYPHEN (0x2e40 Pd)
|
||||
case u'⹁': // REVERSED COMMA (0x2e41 Po)
|
||||
case u'⹂': // DOUBLE LOW-REVERSED-9 QUOTATION MARK (0x2e42 Ps)
|
||||
case u'⹃': // DASH WITH LEFT UPTURN (0x2e43 Po)
|
||||
case u'⹄': // DOUBLE SUSPENSION MARK (0x2e44 Po)
|
||||
case u'⹅': // INVERTED LOW KAVYKA (0x2e45 Po)
|
||||
case u'⹆': // INVERTED LOW KAVYKA WITH KAVYKA ABOVE (0x2e46 Po)
|
||||
case u'⹇': // LOW KAVYKA (0x2e47 Po)
|
||||
case u'⹈': // LOW KAVYKA WITH DOT (0x2e48 Po)
|
||||
case u'⹉': // DOUBLE STACKED COMMA (0x2e49 Po)
|
||||
case u'⹊': // DOTTED SOLIDUS (0x2e4a Po)
|
||||
case u'⹋': // TRIPLE DAGGER (0x2e4b Po)
|
||||
case u'⹌': // MEDIEVAL COMMA (0x2e4c Po)
|
||||
case u'⹍': // PARAGRAPHUS MARK (0x2e4d Po)
|
||||
case u'⹎': // PUNCTUS ELEVATUS MARK (0x2e4e Po)
|
||||
case u'⹏': // CORNISH VERSE DIVIDER (0x2e4f Po)
|
||||
case u'、': // IDEOGRAPHIC COMMA (0x3001 Po)
|
||||
case u'。': // IDEOGRAPHIC FULL STOP (0x3002 Po)
|
||||
case u'〃': // DITTO MARK (0x3003 Po)
|
||||
case u'〈': // LEFT ANGLE BRACKET (0x3008 Ps)
|
||||
case u'〉': // RIGHT ANGLE BRACKET (0x3009 Pe)
|
||||
case u'《': // LEFT DOUBLE ANGLE BRACKET (0x300a Ps)
|
||||
case u'》': // RIGHT DOUBLE ANGLE BRACKET (0x300b Pe)
|
||||
case u'「': // LEFT CORNER BRACKET (0x300c Ps)
|
||||
case u'」': // RIGHT CORNER BRACKET (0x300d Pe)
|
||||
case u'『': // LEFT WHITE CORNER BRACKET (0x300e Ps)
|
||||
case u'』': // RIGHT WHITE CORNER BRACKET (0x300f Pe)
|
||||
case u'【': // LEFT BLACK LENTICULAR BRACKET (0x3010 Ps)
|
||||
case u'】': // RIGHT BLACK LENTICULAR BRACKET (0x3011 Pe)
|
||||
case u'〔': // LEFT TORTOISE SHELL BRACKET (0x3014 Ps)
|
||||
case u'〕': // RIGHT TORTOISE SHELL BRACKET (0x3015 Pe)
|
||||
case u'〖': // LEFT WHITE LENTICULAR BRACKET (0x3016 Ps)
|
||||
case u'〗': // RIGHT WHITE LENTICULAR BRACKET (0x3017 Pe)
|
||||
case u'〘': // LEFT WHITE TORTOISE SHELL BRACKET (0x3018 Ps)
|
||||
case u'〙': // RIGHT WHITE TORTOISE SHELL BRACKET (0x3019 Pe)
|
||||
case u'〚': // LEFT WHITE SQUARE BRACKET (0x301a Ps)
|
||||
case u'〛': // RIGHT WHITE SQUARE BRACKET (0x301b Pe)
|
||||
case u'〜': // WAVE DASH (0x301c Pd)
|
||||
case u'〝': // REVERSED DOUBLE PRIME QUOTATION MARK (0x301d Ps)
|
||||
case u'〞': // DOUBLE PRIME QUOTATION MARK (0x301e Pe)
|
||||
case u'〟': // LOW DOUBLE PRIME QUOTATION MARK (0x301f Pe)
|
||||
case u'〰': // WAVY DASH (0x3030 Pd)
|
||||
case u'〽': // PART ALTERNATION MARK (0x303d Po)
|
||||
case u'゠': // KATAKANA-HIRAGANA DOUBLE HYPHEN (0x30a0 Pd)
|
||||
case u'・': // KATAKANA MIDDLE DOT (0x30fb Po)
|
||||
case u'꓾': // LISU PUNCTUATION COMMA (0xa4fe Po)
|
||||
case u'꓿': // LISU PUNCTUATION FULL STOP (0xa4ff Po)
|
||||
case u'꘍': // VAI COMMA (0xa60d Po)
|
||||
case u'꘎': // VAI FULL STOP (0xa60e Po)
|
||||
case u'꘏': // VAI QUESTION MARK (0xa60f Po)
|
||||
case u'꙾': // CYRILLIC KAVYKA (0xa67e Po)
|
||||
case u'꡴': // PHAGS-PA SINGLE HEAD MARK (0xa874 Po)
|
||||
case u'꡵': // PHAGS-PA DOUBLE HEAD MARK (0xa875 Po)
|
||||
case u'꡶': // PHAGS-PA MARK SHAD (0xa876 Po)
|
||||
case u'꡷': // PHAGS-PA MARK DOUBLE SHAD (0xa877 Po)
|
||||
case u'꣎': // SAURASHTRA DANDA (0xa8ce Po)
|
||||
case u'꣏': // SAURASHTRA DOUBLE DANDA (0xa8cf Po)
|
||||
case u'꣸': // DEVANAGARI SIGN PUSHPIKA (0xa8f8 Po)
|
||||
case u'꣹': // DEVANAGARI GAP FILLER (0xa8f9 Po)
|
||||
case u'꣺': // DEVANAGARI CARET (0xa8fa Po)
|
||||
case u'꣼': // DEVANAGARI SIGN SIDDHAM (0xa8fc Po)
|
||||
case u'꧁': // JAVANESE LEFT RERENGGAN (0xa9c1 Po)
|
||||
case u'꧂': // JAVANESE RIGHT RERENGGAN (0xa9c2 Po)
|
||||
case u'꧃': // JAVANESE PADA ANDAP (0xa9c3 Po)
|
||||
case u'꧄': // JAVANESE PADA MADYA (0xa9c4 Po)
|
||||
case u'꧅': // JAVANESE PADA LUHUR (0xa9c5 Po)
|
||||
case u'꧆': // JAVANESE PADA WINDU (0xa9c6 Po)
|
||||
case u'꧇': // JAVANESE PADA PANGKAT (0xa9c7 Po)
|
||||
case u'꧈': // JAVANESE PADA LINGSA (0xa9c8 Po)
|
||||
case u'꧉': // JAVANESE PADA LUNGSI (0xa9c9 Po)
|
||||
case u'꧊': // JAVANESE PADA ADEG (0xa9ca Po)
|
||||
case u'꧋': // JAVANESE PADA ADEG ADEG (0xa9cb Po)
|
||||
case u'꧌': // JAVANESE PADA PISELEH (0xa9cc Po)
|
||||
case u'꧍': // JAVANESE TURNED PADA PISELEH (0xa9cd Po)
|
||||
case u'꧞': // JAVANESE PADA TIRTA TUMETES (0xa9de Po)
|
||||
case u'꧟': // JAVANESE PADA ISEN-ISEN (0xa9df Po)
|
||||
case u'꩜': // CHAM PUNCTUATION SPIRAL (0xaa5c Po)
|
||||
case u'꩝': // CHAM PUNCTUATION DANDA (0xaa5d Po)
|
||||
case u'꩞': // CHAM PUNCTUATION DOUBLE DANDA (0xaa5e Po)
|
||||
case u'꩟': // CHAM PUNCTUATION TRIPLE DANDA (0xaa5f Po)
|
||||
case u'꫞': // TAI VIET SYMBOL HO HOI (0xaade Po)
|
||||
case u'꫟': // TAI VIET SYMBOL KOI KOI (0xaadf Po)
|
||||
case u'꫰': // MEETEI MAYEK CHEIKHAN (0xaaf0 Po)
|
||||
case u'꫱': // MEETEI MAYEK AHANG KHUDAM (0xaaf1 Po)
|
||||
case u'꯫': // MEETEI MAYEK CHEIKHEI (0xabeb Po)
|
||||
case u'︐': // PRESENTATION FORM FOR VERTICAL COMMA (0xfe10 Po)
|
||||
case u'︑': // PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA (0xfe11 Po)
|
||||
case u'︒': // PRESENTATION FORM FOR VERTICAL IDEO FULL STOP (0xfe12 Po)
|
||||
case u'︓': // PRESENTATION FORM FOR VERTICAL COLON (0xfe13 Po)
|
||||
case u'︔': // PRESENTATION FORM FOR VERTICAL SEMICOLON (0xfe14 Po)
|
||||
case u'︕': // PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK (0xfe15 Po)
|
||||
case u'︖': // PRESENTATION FORM FOR VERTICAL QUESTION MARK (0xfe16 Po)
|
||||
case u'︗': // PRESENTATION ... LEFT WHITE LENTICULAR BRACKET (0xfe17 Ps)
|
||||
case u'︘': // PRESENTATION ... RIGHT WHITE LENTICULAR BRAKCET (0xfe18 Pe)
|
||||
case u'︙': // PRESENTATION ... VERTICAL HORIZONTAL ELLIPSIS (0xfe19 Po)
|
||||
case u'︰': // PRESENTATION FORM FOR VERTICAL TWO DOT LEADER (0xfe30 Po)
|
||||
case u'︱': // PRESENTATION FORM FOR VERTICAL EM DASH (0xfe31 Pd)
|
||||
case u'︲': // PRESENTATION FORM FOR VERTICAL EN DASH (0xfe32 Pd)
|
||||
case u'︳': // PRESENTATION FORM FOR VERTICAL LOW LINE (0xfe33 Pc)
|
||||
case u'︴': // PRESENTATION FORM FOR VERTICAL WAVY LOW LINE (0xfe34 Pc)
|
||||
case u'︵': // PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS (0xfe35 Ps)
|
||||
case u'︶': // PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS (0xfe36 Pe)
|
||||
case u'︷': // PRESENTATION ... VERTICAL LEFT CURLY BRACKET (0xfe37 Ps)
|
||||
case u'︸': // PRESENTATION ... VERTICAL RIGHT CURLY BRACKET (0xfe38 Pe)
|
||||
case u'︹': // PRESENTATION ... LEFT TORTOISE SHELL BRACKET (0xfe39 Ps)
|
||||
case u'︺': // PRESENTATION ... RIGHT TORTOISE SHELL BRACKET (0xfe3a Pe)
|
||||
case u'︻': // PRESENTATION ... LEFT BLACK LENTICULAR BRACKET (0xfe3b Ps)
|
||||
case u'︼': // PRESENTATION ... RIGHT BLACK LENTICULAR BRACKET (0xfe3c Pe)
|
||||
case u'︽': // PRESENTATION ... LEFT DOUBLE ANGLE BRACKET (0xfe3d Ps)
|
||||
case u'︾': // PRESENTATION ... RIGHT DOUBLE ANGLE BRACKET (0xfe3e Pe)
|
||||
case u'︿': // PRESENTATION ... LEFT ANGLE BRACKET (0xfe3f Ps)
|
||||
case u'﹀': // PRESENTATION ... RIGHT ANGLE BRACKET (0xfe40 Pe)
|
||||
case u'﹁': // PRESENTATION ... LEFT CORNER BRACKET (0xfe41 Ps)
|
||||
case u'﹂': // PRESENTATION ... RIGHT CORNER BRACKET (0xfe42 Pe)
|
||||
case u'﹃': // PRESENTATION ... LEFT WHITE CORNER BRACKET (0xfe43 Ps)
|
||||
case u'﹄': // PRESENTATION ... RIGHT WHITE CORNER BRACKET Pe)
|
||||
case u'﹅': // SESAME DOT (0xfe45 Po)
|
||||
case u'﹆': // WHITE SESAME DOT (0xfe46 Po)
|
||||
case u'﹇': // PRESENTATION ... VERTICAL LEFT SQUARE BRACKET (0xfe47 Ps)
|
||||
case u'﹈': // PRESENTATION ... VERTICAL RIGHT SQUARE BRACKET (0xfe48 Pe)
|
||||
case u'﹉': // DASHED OVERLINE (0xfe49 Po)
|
||||
case u'﹊': // CENTRELINE OVERLINE (0xfe4a Po)
|
||||
case u'﹋': // WAVY OVERLINE (0xfe4b Po)
|
||||
case u'﹌': // DOUBLE WAVY OVERLINE (0xfe4c Po)
|
||||
case u'﹍': // DASHED LOW LINE (0xfe4d Pc)
|
||||
case u'﹎': // CENTRELINE LOW LINE (0xfe4e Pc)
|
||||
case u'﹏': // WAVY LOW LINE (0xfe4f Pc)
|
||||
case u'﹐': // SMALL COMMA (0xfe50 Po)
|
||||
case u'﹑': // SMALL IDEOGRAPHIC COMMA (0xfe51 Po)
|
||||
case u'﹒': // SMALL FULL STOP (0xfe52 Po)
|
||||
case u'﹔': // SMALL SEMICOLON (0xfe54 Po)
|
||||
case u'﹕': // SMALL COLON (0xfe55 Po)
|
||||
case u'﹖': // SMALL QUESTION MARK (0xfe56 Po)
|
||||
case u'﹗': // SMALL EXCLAMATION MARK (0xfe57 Po)
|
||||
case u'﹘': // SMALL EM DASH (0xfe58 Pd)
|
||||
case u'﹙': // SMALL LEFT PARENTHESIS (0xfe59 Ps)
|
||||
case u'﹚': // SMALL RIGHT PARENTHESIS (0xfe5a Pe)
|
||||
case u'﹛': // SMALL LEFT CURLY BRACKET (0xfe5b Ps)
|
||||
case u'﹜': // SMALL RIGHT CURLY BRACKET (0xfe5c Pe)
|
||||
case u'﹝': // SMALL LEFT TORTOISE SHELL BRACKET (0xfe5d Ps)
|
||||
case u'﹞': // SMALL RIGHT TORTOISE SHELL BRACKET (0xfe5e Pe)
|
||||
case u'﹟': // SMALL NUMBER SIGN (0xfe5f Po)
|
||||
case u'﹠': // SMALL AMPERSAND (0xfe60 Po)
|
||||
case u'﹡': // SMALL ASTERISK (0xfe61 Po)
|
||||
case u'﹣': // SMALL HYPHEN-MINUS (0xfe63 Pd)
|
||||
case u'﹨': // SMALL REVERSE SOLIDUS (0xfe68 Po)
|
||||
case u'﹪': // SMALL PERCENT SIGN (0xfe6a Po)
|
||||
case u'﹫': // SMALL COMMERCIAL AT (0xfe6b Po)
|
||||
case u'!': // FULLWIDTH EXCLAMATION MARK (0xff01 Po)
|
||||
case u'"': // FULLWIDTH QUOTATION MARK (0xff02 Po)
|
||||
case u'#': // FULLWIDTH NUMBER SIGN (0xff03 Po)
|
||||
case u'%': // FULLWIDTH PERCENT SIGN (0xff05 Po)
|
||||
case u'&': // FULLWIDTH AMPERSAND (0xff06 Po)
|
||||
case u''': // FULLWIDTH APOSTROPHE (0xff07 Po)
|
||||
case u'(': // FULLWIDTH LEFT PARENTHESIS (0xff08 Ps)
|
||||
case u')': // FULLWIDTH RIGHT PARENTHESIS (0xff09 Pe)
|
||||
case u'*': // FULLWIDTH ASTERISK (0xff0a Po)
|
||||
case u',': // FULLWIDTH COMMA (0xff0c Po)
|
||||
case u'-': // FULLWIDTH HYPHEN-MINUS (0xff0d Pd)
|
||||
case u'.': // FULLWIDTH FULL STOP (0xff0e Po)
|
||||
case u'/': // FULLWIDTH SOLIDUS (0xff0f Po)
|
||||
case u':': // FULLWIDTH COLON (0xff1a Po)
|
||||
case u';': // FULLWIDTH SEMICOLON (0xff1b Po)
|
||||
case u'?': // FULLWIDTH QUESTION MARK (0xff1f Po)
|
||||
case u'@': // FULLWIDTH COMMERCIAL AT (0xff20 Po)
|
||||
case u'[': // FULLWIDTH LEFT SQUARE BRACKET (0xff3b Ps)
|
||||
case u'\': // FULLWIDTH REVERSE SOLIDUS (0xff3c Po)
|
||||
case u']': // FULLWIDTH RIGHT SQUARE BRACKET (0xff3d Pe)
|
||||
case u'_': // FULLWIDTH LOW LINE (0xff3f Pc)
|
||||
case u'{': // FULLWIDTH LEFT CURLY BRACKET (0xff5b Ps)
|
||||
case u'}': // FULLWIDTH RIGHT CURLY BRACKET (0xff5d Pe)
|
||||
case u'⦅': // FULLWIDTH LEFT WHITE PARENTHESIS (0xff5f Ps)
|
||||
case u'⦆': // FULLWIDTH RIGHT WHITE PARENTHESIS (0xff60 Pe)
|
||||
case u'。': // HALFWIDTH IDEOGRAPHIC FULL STOP (0xff61 Po)
|
||||
case u'「': // HALFWIDTH LEFT CORNER BRACKET (0xff62 Ps)
|
||||
case u'」': // HALFWIDTH RIGHT CORNER BRACKET (0xff63 Pe)
|
||||
case u'、': // HALFWIDTH IDEOGRAPHIC COMMA (0xff64 Po)
|
||||
case u'・': // HALFWIDTH KATAKANA MIDDLE DOT (0xff65 Po)
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
__weak_reference(iswpunct, iswpunct_l);
|
|
@ -1,7 +1,7 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
/*-*-mode:c++;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8-*-│
|
||||
│ vi: set et ft=c++ ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ Copyright 2024 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
|
@ -16,9 +16,11 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/macros.h"
|
||||
#include "libc/str/has_char.h"
|
||||
#include "libc/wctype.h"
|
||||
|
||||
static const unsigned short kCodes[][2] = {
|
||||
static const unsigned short kSeparators[][2] = {
|
||||
{0x00aa, 0x00aa}, /* 1x English */
|
||||
{0x00b2, 0x00b3}, /* 2x English Arabic */
|
||||
{0x00b5, 0x00b5}, /* 1x Greek */
|
||||
|
@ -172,7 +174,7 @@ static const unsigned short kCodes[][2] = {
|
|||
{0xffda, 0xffdc}, /* 3x Dubs */
|
||||
};
|
||||
|
||||
static const unsigned kAstralCodes[][2] = {
|
||||
static const unsigned kAstralSeparators[][2] = {
|
||||
{0x10107, 0x10133}, /* 45x Aegean */
|
||||
{0x10140, 0x10178}, /* 57x Ancient Greek Numbers */
|
||||
{0x1018a, 0x1018b}, /* 2x Ancient Greek Numbers */
|
||||
|
@ -390,34 +392,11 @@ static const unsigned kAstralCodes[][2] = {
|
|||
* other things like blocks and emoji (So).
|
||||
*/
|
||||
int iswseparator(wint_t c) {
|
||||
int m, l, r, n;
|
||||
if (c < 0200) {
|
||||
return !(('0' <= c && c <= '9') || ('A' <= c && c <= 'Z') ||
|
||||
if (c < 128)
|
||||
return !(('0' <= c && c <= '9') || //
|
||||
('A' <= c && c <= 'Z') || //
|
||||
('a' <= c && c <= 'z'));
|
||||
}
|
||||
if (c <= 0xffff) {
|
||||
l = 0;
|
||||
r = n = sizeof(kCodes) / sizeof(kCodes[0]);
|
||||
while (l < r) {
|
||||
m = (l & r) + ((l ^ r) >> 1); // floor((a+b)/2)
|
||||
if (kCodes[m][1] < c) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
r = m;
|
||||
}
|
||||
}
|
||||
return !(l < n && kCodes[l][0] <= c && c <= kCodes[l][1]);
|
||||
} else {
|
||||
l = 0;
|
||||
r = n = sizeof(kAstralCodes) / sizeof(kAstralCodes[0]);
|
||||
while (l < r) {
|
||||
m = (l & r) + ((l ^ r) >> 1); // floor((a+b)/2)
|
||||
if (kAstralCodes[m][1] < c) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
r = m;
|
||||
}
|
||||
}
|
||||
return !(l < n && kAstralCodes[l][0] <= c && c <= kAstralCodes[l][1]);
|
||||
}
|
||||
if (c < 65536)
|
||||
return has_char(kSeparators, ARRAYLEN(kSeparators), (unsigned short)c);
|
||||
return has_char(kAstralSeparators, ARRAYLEN(kAstralSeparators), (unsigned)c);
|
||||
}
|
|
@ -41,7 +41,6 @@ int iswspace(wint_t c) {
|
|||
case 0x2004: // THREE-PER-EM SPACE (Zs)
|
||||
case 0x2005: // FOUR-PER-EM SPACE (Zs)
|
||||
case 0x2006: // SIX-PER-EM SPACE (Zs)
|
||||
case 0x2007: // FIGURE SPACE (Zs)
|
||||
case 0x2008: // PUNCTUATION SPACE (Zs)
|
||||
case 0x2009: // THIN SPACE (Zs)
|
||||
case 0x200a: // HAIR SPACE (Zs)
|
||||
|
|
|
@ -1,164 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/wctype.h"
|
||||
|
||||
/**
|
||||
* Returns nonzero if c is uppercase letter.
|
||||
*/
|
||||
int iswupper(wint_t c) {
|
||||
if (c < 0200) {
|
||||
return 'A' <= c && c <= 'Z';
|
||||
} else {
|
||||
if (towlower(c) != c)
|
||||
return 1;
|
||||
switch (c) {
|
||||
case 0x03d2: /* ϒ Greek */
|
||||
case 0x03d3: /* ϓ Greek */
|
||||
case 0x03d4: /* ϔ Greek */
|
||||
case 0x2102: /* ℂ Letterlike */
|
||||
case 0x2107: /* ℇ Letterlike */
|
||||
case 0x210b: /* ℋ Letterlike */
|
||||
case 0x210c: /* ℌ Letterlike */
|
||||
case 0x210d: /* ℍ Letterlike */
|
||||
case 0x2110: /* ℐ Letterlike */
|
||||
case 0x2111: /* ℑ Letterlike */
|
||||
case 0x2112: /* ℒ Letterlike */
|
||||
case 0x2115: /* ℕ Letterlike */
|
||||
case 0x2119: /* ℙ Letterlike */
|
||||
case 0x211a: /* ℚ Letterlike */
|
||||
case 0x211b: /* ℛ Letterlike */
|
||||
case 0x211c: /* ℜ Letterlike */
|
||||
case 0x211d: /* ℝ Letterlike */
|
||||
case 0x2124: /* ℤ Letterlike */
|
||||
case 0x2128: /* ℨ Letterlike */
|
||||
case 0x212c: /* ℬ Letterlike */
|
||||
case 0x212d: /* ℭ Letterlike */
|
||||
case 0x2130: /* ℰ Letterlike */
|
||||
case 0x2131: /* ℱ Letterlike */
|
||||
case 0x2133: /* ℳ Letterlike */
|
||||
case 0x213e: /* ℾ Letterlike */
|
||||
case 0x213f: /* ℿ Letterlike */
|
||||
case 0x2145: /* ⅅ Letterlike */
|
||||
case 0x1d434: /* 𝐴 Math */
|
||||
case 0x1d435: /* 𝐵 Math */
|
||||
case 0x1d436: /* 𝐶 Math */
|
||||
case 0x1d437: /* 𝐷 Math */
|
||||
case 0x1d438: /* 𝐸 Math */
|
||||
case 0x1d439: /* 𝐹 Math */
|
||||
case 0x1d43a: /* 𝐺 Math */
|
||||
case 0x1d43b: /* 𝐻 Math */
|
||||
case 0x1d49c: /* 𝒜 Math */
|
||||
case 0x1d49e: /* 𝒞 Math */
|
||||
case 0x1d49f: /* 𝒟 Math */
|
||||
case 0x1d4a2: /* 𝒢 Math */
|
||||
case 0x1d4a5: /* 𝒥 Math */
|
||||
case 0x1d4a6: /* 𝒦 Math */
|
||||
case 0x1d4a9: /* 𝒩 Math */
|
||||
case 0x1d4aa: /* 𝒪 Math */
|
||||
case 0x1d4ab: /* 𝒫 Math */
|
||||
case 0x1d4ac: /* 𝒬 Math */
|
||||
case 0x1d504: /* 𝔄 Math */
|
||||
case 0x1d505: /* 𝔅 Math */
|
||||
case 0x1d507: /* 𝔇 Math */
|
||||
case 0x1d508: /* 𝔈 Math */
|
||||
case 0x1d509: /* 𝔉 Math */
|
||||
case 0x1d50a: /* 𝔊 Math */
|
||||
case 0x1d516: /* 𝔖 Math */
|
||||
case 0x1d517: /* 𝔗 Math */
|
||||
case 0x1d518: /* 𝔘 Math */
|
||||
case 0x1d519: /* 𝔙 Math */
|
||||
case 0x1d51a: /* 𝔚 Math */
|
||||
case 0x1d51b: /* 𝔛 Math */
|
||||
case 0x1d51c: /* 𝔜 Math */
|
||||
case 0x1d538: /* 𝔸 Math */
|
||||
case 0x1d539: /* 𝔹 Math */
|
||||
case 0x1d53b: /* 𝔻 Math */
|
||||
case 0x1d53c: /* 𝔼 Math */
|
||||
case 0x1d53d: /* 𝔽 Math */
|
||||
case 0x1d53e: /* 𝔾 Math */
|
||||
case 0x1d540: /* 𝕀 Math */
|
||||
case 0x1d541: /* 𝕁 Math */
|
||||
case 0x1d542: /* 𝕂 Math */
|
||||
case 0x1d543: /* 𝕃 Math */
|
||||
case 0x1d544: /* 𝕄 Math */
|
||||
case 0x1d546: /* 𝕆 Math */
|
||||
case 0x1d54a: /* 𝕊 Math */
|
||||
case 0x1d54b: /* 𝕋 Math */
|
||||
case 0x1d54c: /* 𝕌 Math */
|
||||
case 0x1d54d: /* 𝕍 Math */
|
||||
case 0x1d54e: /* 𝕎 Math */
|
||||
case 0x1d54f: /* 𝕏 Math */
|
||||
case 0x1d550: /* 𝕐 Math */
|
||||
case 0x1d6e3: /* 𝛣 Math */
|
||||
case 0x1d6e4: /* 𝛤 Math */
|
||||
case 0x1d6e5: /* 𝛥 Math */
|
||||
case 0x1d6e6: /* 𝛦 Math */
|
||||
case 0x1d6e7: /* 𝛧 Math */
|
||||
case 0x1d6e8: /* 𝛨 Math */
|
||||
case 0x1d6e9: /* 𝛩 Math */
|
||||
case 0x1d6ea: /* 𝛪 Math */
|
||||
case 0x1d6eb: /* 𝛫 Math */
|
||||
case 0x1d6ec: /* 𝛬 Math */
|
||||
case 0x1d6ed: /* 𝛭 Math */
|
||||
case 0x1d6ee: /* 𝛮 Math */
|
||||
case 0x1d6ef: /* 𝛯 Math */
|
||||
case 0x1d6f0: /* 𝛰 Math */
|
||||
case 0x1d6f1: /* 𝛱 Math */
|
||||
case 0x1d6f2: /* 𝛲 Math */
|
||||
case 0x1d6f3: /* 𝛳 Math */
|
||||
case 0x1d6f4: /* 𝛴 Math */
|
||||
case 0x1d6f5: /* 𝛵 Math */
|
||||
case 0x1d6f6: /* 𝛶 Math */
|
||||
case 0x1d6f7: /* 𝛷 Math */
|
||||
case 0x1d6f8: /* 𝛸 Math */
|
||||
case 0x1d6f9: /* 𝛹 Math */
|
||||
case 0x1d6fa: /* 𝛺 Math */
|
||||
case 0x1d72d: /* 𝜭 Math */
|
||||
case 0x1d72e: /* 𝜮 Math */
|
||||
case 0x1d72f: /* 𝜯 Math */
|
||||
case 0x1d730: /* 𝜰 Math */
|
||||
case 0x1d731: /* 𝜱 Math */
|
||||
case 0x1d732: /* 𝜲 Math */
|
||||
case 0x1d733: /* 𝜳 Math */
|
||||
case 0x1d734: /* 𝜴 Math */
|
||||
case 0x1d767: /* 𝝧 Math */
|
||||
case 0x1d768: /* 𝝨 Math */
|
||||
case 0x1d769: /* 𝝩 Math */
|
||||
case 0x1d76a: /* 𝝪 Math */
|
||||
case 0x1d76b: /* 𝝫 Math */
|
||||
case 0x1d76c: /* 𝝬 Math */
|
||||
case 0x1d76d: /* 𝝭 Math */
|
||||
case 0x1d76e: /* 𝝮 Math */
|
||||
case 0x1d7a1: /* 𝞡 Math */
|
||||
case 0x1d7a2: /* 𝞢 Math */
|
||||
case 0x1d7a3: /* 𝞣 Math */
|
||||
case 0x1d7a4: /* 𝞤 Math */
|
||||
case 0x1d7a5: /* 𝞥 Math */
|
||||
case 0x1d7a6: /* 𝞦 Math */
|
||||
case 0x1d7a7: /* 𝞧 Math */
|
||||
case 0x1d7a8: /* 𝞨 Math */
|
||||
case 0x1d7ca: /* 𝟊 Math */
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__weak_reference(iswupper, iswupper_l);
|
695
libc/str/iswupper.cc
Normal file
695
libc/str/iswupper.cc
Normal file
|
@ -0,0 +1,695 @@
|
|||
/*-*-mode:c++;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8-*-│
|
||||
│ vi: set et ft=c++ ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2024 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/dce.h"
|
||||
#include "libc/macros.h"
|
||||
#include "libc/str/has_char.h"
|
||||
#include "libc/wctype.h"
|
||||
|
||||
static const unsigned short kUpper[][2] = {
|
||||
{0x41, 0x5a}, //
|
||||
{0xc0, 0xd6}, //
|
||||
{0xd8, 0xde}, //
|
||||
{0x100, 0x100}, //
|
||||
{0x102, 0x102}, //
|
||||
{0x104, 0x104}, //
|
||||
{0x106, 0x106}, //
|
||||
{0x108, 0x108}, //
|
||||
{0x10a, 0x10a}, //
|
||||
{0x10c, 0x10c}, //
|
||||
{0x10e, 0x10e}, //
|
||||
{0x110, 0x110}, //
|
||||
{0x112, 0x112}, //
|
||||
{0x114, 0x114}, //
|
||||
{0x116, 0x116}, //
|
||||
{0x118, 0x118}, //
|
||||
{0x11a, 0x11a}, //
|
||||
{0x11c, 0x11c}, //
|
||||
{0x11e, 0x11e}, //
|
||||
{0x120, 0x120}, //
|
||||
{0x122, 0x122}, //
|
||||
{0x124, 0x124}, //
|
||||
{0x126, 0x126}, //
|
||||
{0x128, 0x128}, //
|
||||
{0x12a, 0x12a}, //
|
||||
{0x12c, 0x12c}, //
|
||||
{0x12e, 0x12e}, //
|
||||
{0x130, 0x130}, //
|
||||
{0x132, 0x132}, //
|
||||
{0x134, 0x134}, //
|
||||
{0x136, 0x136}, //
|
||||
{0x139, 0x139}, //
|
||||
{0x13b, 0x13b}, //
|
||||
{0x13d, 0x13d}, //
|
||||
{0x13f, 0x13f}, //
|
||||
{0x141, 0x141}, //
|
||||
{0x143, 0x143}, //
|
||||
{0x145, 0x145}, //
|
||||
{0x147, 0x147}, //
|
||||
{0x14a, 0x14a}, //
|
||||
{0x14c, 0x14c}, //
|
||||
{0x14e, 0x14e}, //
|
||||
{0x150, 0x150}, //
|
||||
{0x152, 0x152}, //
|
||||
{0x154, 0x154}, //
|
||||
{0x156, 0x156}, //
|
||||
{0x158, 0x158}, //
|
||||
{0x15a, 0x15a}, //
|
||||
{0x15c, 0x15c}, //
|
||||
{0x15e, 0x15e}, //
|
||||
{0x160, 0x160}, //
|
||||
{0x162, 0x162}, //
|
||||
{0x164, 0x164}, //
|
||||
{0x166, 0x166}, //
|
||||
{0x168, 0x168}, //
|
||||
{0x16a, 0x16a}, //
|
||||
{0x16c, 0x16c}, //
|
||||
{0x16e, 0x16e}, //
|
||||
{0x170, 0x170}, //
|
||||
{0x172, 0x172}, //
|
||||
{0x174, 0x174}, //
|
||||
{0x176, 0x176}, //
|
||||
{0x178, 0x179}, //
|
||||
{0x17b, 0x17b}, //
|
||||
{0x17d, 0x17d}, //
|
||||
{0x181, 0x182}, //
|
||||
{0x184, 0x184}, //
|
||||
{0x186, 0x187}, //
|
||||
{0x189, 0x18b}, //
|
||||
{0x18e, 0x191}, //
|
||||
{0x193, 0x194}, //
|
||||
{0x196, 0x198}, //
|
||||
{0x19c, 0x19d}, //
|
||||
{0x19f, 0x1a0}, //
|
||||
{0x1a2, 0x1a2}, //
|
||||
{0x1a4, 0x1a4}, //
|
||||
{0x1a6, 0x1a7}, //
|
||||
{0x1a9, 0x1a9}, //
|
||||
{0x1ac, 0x1ac}, //
|
||||
{0x1ae, 0x1af}, //
|
||||
{0x1b1, 0x1b3}, //
|
||||
{0x1b5, 0x1b5}, //
|
||||
{0x1b7, 0x1b8}, //
|
||||
{0x1bc, 0x1bc}, //
|
||||
{0x1c4, 0x1c5}, //
|
||||
{0x1c7, 0x1c8}, //
|
||||
{0x1ca, 0x1cb}, //
|
||||
{0x1cd, 0x1cd}, //
|
||||
{0x1cf, 0x1cf}, //
|
||||
{0x1d1, 0x1d1}, //
|
||||
{0x1d3, 0x1d3}, //
|
||||
{0x1d5, 0x1d5}, //
|
||||
{0x1d7, 0x1d7}, //
|
||||
{0x1d9, 0x1d9}, //
|
||||
{0x1db, 0x1db}, //
|
||||
{0x1de, 0x1de}, //
|
||||
{0x1e0, 0x1e0}, //
|
||||
{0x1e2, 0x1e2}, //
|
||||
{0x1e4, 0x1e4}, //
|
||||
{0x1e6, 0x1e6}, //
|
||||
{0x1e8, 0x1e8}, //
|
||||
{0x1ea, 0x1ea}, //
|
||||
{0x1ec, 0x1ec}, //
|
||||
{0x1ee, 0x1ee}, //
|
||||
{0x1f1, 0x1f2}, //
|
||||
{0x1f4, 0x1f4}, //
|
||||
{0x1f6, 0x1f8}, //
|
||||
{0x1fa, 0x1fa}, //
|
||||
{0x1fc, 0x1fc}, //
|
||||
{0x1fe, 0x1fe}, //
|
||||
{0x200, 0x200}, //
|
||||
{0x202, 0x202}, //
|
||||
{0x204, 0x204}, //
|
||||
{0x206, 0x206}, //
|
||||
{0x208, 0x208}, //
|
||||
{0x20a, 0x20a}, //
|
||||
{0x20c, 0x20c}, //
|
||||
{0x20e, 0x20e}, //
|
||||
{0x210, 0x210}, //
|
||||
{0x212, 0x212}, //
|
||||
{0x214, 0x214}, //
|
||||
{0x216, 0x216}, //
|
||||
{0x218, 0x218}, //
|
||||
{0x21a, 0x21a}, //
|
||||
{0x21c, 0x21c}, //
|
||||
{0x21e, 0x21e}, //
|
||||
{0x220, 0x220}, //
|
||||
{0x222, 0x222}, //
|
||||
{0x224, 0x224}, //
|
||||
{0x226, 0x226}, //
|
||||
{0x228, 0x228}, //
|
||||
{0x22a, 0x22a}, //
|
||||
{0x22c, 0x22c}, //
|
||||
{0x22e, 0x22e}, //
|
||||
{0x230, 0x230}, //
|
||||
{0x232, 0x232}, //
|
||||
{0x23a, 0x23b}, //
|
||||
{0x23d, 0x23e}, //
|
||||
{0x241, 0x241}, //
|
||||
{0x243, 0x246}, //
|
||||
{0x248, 0x248}, //
|
||||
{0x24a, 0x24a}, //
|
||||
{0x24c, 0x24c}, //
|
||||
{0x24e, 0x24e}, //
|
||||
{0x370, 0x370}, //
|
||||
{0x372, 0x372}, //
|
||||
{0x376, 0x376}, //
|
||||
{0x37f, 0x37f}, //
|
||||
{0x386, 0x386}, //
|
||||
{0x388, 0x38a}, //
|
||||
{0x38c, 0x38c}, //
|
||||
{0x38e, 0x38f}, //
|
||||
{0x391, 0x3a1}, //
|
||||
{0x3a3, 0x3ab}, //
|
||||
{0x3cf, 0x3cf}, //
|
||||
{0x3d2, 0x3d4}, //
|
||||
{0x3d8, 0x3d8}, //
|
||||
{0x3da, 0x3da}, //
|
||||
{0x3dc, 0x3dc}, //
|
||||
{0x3de, 0x3de}, //
|
||||
{0x3e0, 0x3e0}, //
|
||||
{0x3e2, 0x3e2}, //
|
||||
{0x3e4, 0x3e4}, //
|
||||
{0x3e6, 0x3e6}, //
|
||||
{0x3e8, 0x3e8}, //
|
||||
{0x3ea, 0x3ea}, //
|
||||
{0x3ec, 0x3ec}, //
|
||||
{0x3ee, 0x3ee}, //
|
||||
{0x3f4, 0x3f4}, //
|
||||
{0x3f7, 0x3f7}, //
|
||||
{0x3f9, 0x3fa}, //
|
||||
{0x3fd, 0x42f}, //
|
||||
{0x460, 0x460}, //
|
||||
{0x462, 0x462}, //
|
||||
{0x464, 0x464}, //
|
||||
{0x466, 0x466}, //
|
||||
{0x468, 0x468}, //
|
||||
{0x46a, 0x46a}, //
|
||||
{0x46c, 0x46c}, //
|
||||
{0x46e, 0x46e}, //
|
||||
{0x470, 0x470}, //
|
||||
{0x472, 0x472}, //
|
||||
{0x474, 0x474}, //
|
||||
{0x476, 0x476}, //
|
||||
{0x478, 0x478}, //
|
||||
{0x47a, 0x47a}, //
|
||||
{0x47c, 0x47c}, //
|
||||
{0x47e, 0x47e}, //
|
||||
{0x480, 0x480}, //
|
||||
{0x48a, 0x48a}, //
|
||||
{0x48c, 0x48c}, //
|
||||
{0x48e, 0x48e}, //
|
||||
{0x490, 0x490}, //
|
||||
{0x492, 0x492}, //
|
||||
{0x494, 0x494}, //
|
||||
{0x496, 0x496}, //
|
||||
{0x498, 0x498}, //
|
||||
{0x49a, 0x49a}, //
|
||||
{0x49c, 0x49c}, //
|
||||
{0x49e, 0x49e}, //
|
||||
{0x4a0, 0x4a0}, //
|
||||
{0x4a2, 0x4a2}, //
|
||||
{0x4a4, 0x4a4}, //
|
||||
{0x4a6, 0x4a6}, //
|
||||
{0x4a8, 0x4a8}, //
|
||||
{0x4aa, 0x4aa}, //
|
||||
{0x4ac, 0x4ac}, //
|
||||
{0x4ae, 0x4ae}, //
|
||||
{0x4b0, 0x4b0}, //
|
||||
{0x4b2, 0x4b2}, //
|
||||
{0x4b4, 0x4b4}, //
|
||||
{0x4b6, 0x4b6}, //
|
||||
{0x4b8, 0x4b8}, //
|
||||
{0x4ba, 0x4ba}, //
|
||||
{0x4bc, 0x4bc}, //
|
||||
{0x4be, 0x4be}, //
|
||||
{0x4c0, 0x4c1}, //
|
||||
{0x4c3, 0x4c3}, //
|
||||
{0x4c5, 0x4c5}, //
|
||||
{0x4c7, 0x4c7}, //
|
||||
{0x4c9, 0x4c9}, //
|
||||
{0x4cb, 0x4cb}, //
|
||||
{0x4cd, 0x4cd}, //
|
||||
{0x4d0, 0x4d0}, //
|
||||
{0x4d2, 0x4d2}, //
|
||||
{0x4d4, 0x4d4}, //
|
||||
{0x4d6, 0x4d6}, //
|
||||
{0x4d8, 0x4d8}, //
|
||||
{0x4da, 0x4da}, //
|
||||
{0x4dc, 0x4dc}, //
|
||||
{0x4de, 0x4de}, //
|
||||
{0x4e0, 0x4e0}, //
|
||||
{0x4e2, 0x4e2}, //
|
||||
{0x4e4, 0x4e4}, //
|
||||
{0x4e6, 0x4e6}, //
|
||||
{0x4e8, 0x4e8}, //
|
||||
{0x4ea, 0x4ea}, //
|
||||
{0x4ec, 0x4ec}, //
|
||||
{0x4ee, 0x4ee}, //
|
||||
{0x4f0, 0x4f0}, //
|
||||
{0x4f2, 0x4f2}, //
|
||||
{0x4f4, 0x4f4}, //
|
||||
{0x4f6, 0x4f6}, //
|
||||
{0x4f8, 0x4f8}, //
|
||||
{0x4fa, 0x4fa}, //
|
||||
{0x4fc, 0x4fc}, //
|
||||
{0x4fe, 0x4fe}, //
|
||||
{0x500, 0x500}, //
|
||||
{0x502, 0x502}, //
|
||||
{0x504, 0x504}, //
|
||||
{0x506, 0x506}, //
|
||||
{0x508, 0x508}, //
|
||||
{0x50a, 0x50a}, //
|
||||
{0x50c, 0x50c}, //
|
||||
{0x50e, 0x50e}, //
|
||||
{0x510, 0x510}, //
|
||||
{0x512, 0x512}, //
|
||||
{0x514, 0x514}, //
|
||||
{0x516, 0x516}, //
|
||||
{0x518, 0x518}, //
|
||||
{0x51a, 0x51a}, //
|
||||
{0x51c, 0x51c}, //
|
||||
{0x51e, 0x51e}, //
|
||||
{0x520, 0x520}, //
|
||||
{0x522, 0x522}, //
|
||||
{0x524, 0x524}, //
|
||||
{0x526, 0x526}, //
|
||||
{0x528, 0x528}, //
|
||||
{0x52a, 0x52a}, //
|
||||
{0x52c, 0x52c}, //
|
||||
{0x52e, 0x52e}, //
|
||||
{0x531, 0x556}, //
|
||||
{0x10a0, 0x10c5}, //
|
||||
{0x10c7, 0x10c7}, //
|
||||
{0x10cd, 0x10cd}, //
|
||||
{0x13a0, 0x13f5}, //
|
||||
{0x1c90, 0x1cba}, //
|
||||
{0x1cbd, 0x1cbf}, //
|
||||
{0x1e00, 0x1e00}, //
|
||||
{0x1e02, 0x1e02}, //
|
||||
{0x1e04, 0x1e04}, //
|
||||
{0x1e06, 0x1e06}, //
|
||||
{0x1e08, 0x1e08}, //
|
||||
{0x1e0a, 0x1e0a}, //
|
||||
{0x1e0c, 0x1e0c}, //
|
||||
{0x1e0e, 0x1e0e}, //
|
||||
{0x1e10, 0x1e10}, //
|
||||
{0x1e12, 0x1e12}, //
|
||||
{0x1e14, 0x1e14}, //
|
||||
{0x1e16, 0x1e16}, //
|
||||
{0x1e18, 0x1e18}, //
|
||||
{0x1e1a, 0x1e1a}, //
|
||||
{0x1e1c, 0x1e1c}, //
|
||||
{0x1e1e, 0x1e1e}, //
|
||||
{0x1e20, 0x1e20}, //
|
||||
{0x1e22, 0x1e22}, //
|
||||
{0x1e24, 0x1e24}, //
|
||||
{0x1e26, 0x1e26}, //
|
||||
{0x1e28, 0x1e28}, //
|
||||
{0x1e2a, 0x1e2a}, //
|
||||
{0x1e2c, 0x1e2c}, //
|
||||
{0x1e2e, 0x1e2e}, //
|
||||
{0x1e30, 0x1e30}, //
|
||||
{0x1e32, 0x1e32}, //
|
||||
{0x1e34, 0x1e34}, //
|
||||
{0x1e36, 0x1e36}, //
|
||||
{0x1e38, 0x1e38}, //
|
||||
{0x1e3a, 0x1e3a}, //
|
||||
{0x1e3c, 0x1e3c}, //
|
||||
{0x1e3e, 0x1e3e}, //
|
||||
{0x1e40, 0x1e40}, //
|
||||
{0x1e42, 0x1e42}, //
|
||||
{0x1e44, 0x1e44}, //
|
||||
{0x1e46, 0x1e46}, //
|
||||
{0x1e48, 0x1e48}, //
|
||||
{0x1e4a, 0x1e4a}, //
|
||||
{0x1e4c, 0x1e4c}, //
|
||||
{0x1e4e, 0x1e4e}, //
|
||||
{0x1e50, 0x1e50}, //
|
||||
{0x1e52, 0x1e52}, //
|
||||
{0x1e54, 0x1e54}, //
|
||||
{0x1e56, 0x1e56}, //
|
||||
{0x1e58, 0x1e58}, //
|
||||
{0x1e5a, 0x1e5a}, //
|
||||
{0x1e5c, 0x1e5c}, //
|
||||
{0x1e5e, 0x1e5e}, //
|
||||
{0x1e60, 0x1e60}, //
|
||||
{0x1e62, 0x1e62}, //
|
||||
{0x1e64, 0x1e64}, //
|
||||
{0x1e66, 0x1e66}, //
|
||||
{0x1e68, 0x1e68}, //
|
||||
{0x1e6a, 0x1e6a}, //
|
||||
{0x1e6c, 0x1e6c}, //
|
||||
{0x1e6e, 0x1e6e}, //
|
||||
{0x1e70, 0x1e70}, //
|
||||
{0x1e72, 0x1e72}, //
|
||||
{0x1e74, 0x1e74}, //
|
||||
{0x1e76, 0x1e76}, //
|
||||
{0x1e78, 0x1e78}, //
|
||||
{0x1e7a, 0x1e7a}, //
|
||||
{0x1e7c, 0x1e7c}, //
|
||||
{0x1e7e, 0x1e7e}, //
|
||||
{0x1e80, 0x1e80}, //
|
||||
{0x1e82, 0x1e82}, //
|
||||
{0x1e84, 0x1e84}, //
|
||||
{0x1e86, 0x1e86}, //
|
||||
{0x1e88, 0x1e88}, //
|
||||
{0x1e8a, 0x1e8a}, //
|
||||
{0x1e8c, 0x1e8c}, //
|
||||
{0x1e8e, 0x1e8e}, //
|
||||
{0x1e90, 0x1e90}, //
|
||||
{0x1e92, 0x1e92}, //
|
||||
{0x1e94, 0x1e94}, //
|
||||
{0x1e9e, 0x1e9e}, //
|
||||
{0x1ea0, 0x1ea0}, //
|
||||
{0x1ea2, 0x1ea2}, //
|
||||
{0x1ea4, 0x1ea4}, //
|
||||
{0x1ea6, 0x1ea6}, //
|
||||
{0x1ea8, 0x1ea8}, //
|
||||
{0x1eaa, 0x1eaa}, //
|
||||
{0x1eac, 0x1eac}, //
|
||||
{0x1eae, 0x1eae}, //
|
||||
{0x1eb0, 0x1eb0}, //
|
||||
{0x1eb2, 0x1eb2}, //
|
||||
{0x1eb4, 0x1eb4}, //
|
||||
{0x1eb6, 0x1eb6}, //
|
||||
{0x1eb8, 0x1eb8}, //
|
||||
{0x1eba, 0x1eba}, //
|
||||
{0x1ebc, 0x1ebc}, //
|
||||
{0x1ebe, 0x1ebe}, //
|
||||
{0x1ec0, 0x1ec0}, //
|
||||
{0x1ec2, 0x1ec2}, //
|
||||
{0x1ec4, 0x1ec4}, //
|
||||
{0x1ec6, 0x1ec6}, //
|
||||
{0x1ec8, 0x1ec8}, //
|
||||
{0x1eca, 0x1eca}, //
|
||||
{0x1ecc, 0x1ecc}, //
|
||||
{0x1ece, 0x1ece}, //
|
||||
{0x1ed0, 0x1ed0}, //
|
||||
{0x1ed2, 0x1ed2}, //
|
||||
{0x1ed4, 0x1ed4}, //
|
||||
{0x1ed6, 0x1ed6}, //
|
||||
{0x1ed8, 0x1ed8}, //
|
||||
{0x1eda, 0x1eda}, //
|
||||
{0x1edc, 0x1edc}, //
|
||||
{0x1ede, 0x1ede}, //
|
||||
{0x1ee0, 0x1ee0}, //
|
||||
{0x1ee2, 0x1ee2}, //
|
||||
{0x1ee4, 0x1ee4}, //
|
||||
{0x1ee6, 0x1ee6}, //
|
||||
{0x1ee8, 0x1ee8}, //
|
||||
{0x1eea, 0x1eea}, //
|
||||
{0x1eec, 0x1eec}, //
|
||||
{0x1eee, 0x1eee}, //
|
||||
{0x1ef0, 0x1ef0}, //
|
||||
{0x1ef2, 0x1ef2}, //
|
||||
{0x1ef4, 0x1ef4}, //
|
||||
{0x1ef6, 0x1ef6}, //
|
||||
{0x1ef8, 0x1ef8}, //
|
||||
{0x1efa, 0x1efa}, //
|
||||
{0x1efc, 0x1efc}, //
|
||||
{0x1efe, 0x1efe}, //
|
||||
{0x1f08, 0x1f0f}, //
|
||||
{0x1f18, 0x1f1d}, //
|
||||
{0x1f28, 0x1f2f}, //
|
||||
{0x1f38, 0x1f3f}, //
|
||||
{0x1f48, 0x1f4d}, //
|
||||
{0x1f59, 0x1f59}, //
|
||||
{0x1f5b, 0x1f5b}, //
|
||||
{0x1f5d, 0x1f5d}, //
|
||||
{0x1f5f, 0x1f5f}, //
|
||||
{0x1f68, 0x1f6f}, //
|
||||
{0x1f88, 0x1f8f}, //
|
||||
{0x1f98, 0x1f9f}, //
|
||||
{0x1fa8, 0x1faf}, //
|
||||
{0x1fb8, 0x1fbc}, //
|
||||
{0x1fc8, 0x1fcc}, //
|
||||
{0x1fd8, 0x1fdb}, //
|
||||
{0x1fe8, 0x1fec}, //
|
||||
{0x1ff8, 0x1ffc}, //
|
||||
{0x2102, 0x2102}, //
|
||||
{0x2107, 0x2107}, //
|
||||
{0x210b, 0x210d}, //
|
||||
{0x2110, 0x2112}, //
|
||||
{0x2115, 0x2115}, //
|
||||
{0x2119, 0x211d}, //
|
||||
{0x2124, 0x2124}, //
|
||||
{0x2126, 0x2126}, //
|
||||
{0x2128, 0x2128}, //
|
||||
{0x212a, 0x212d}, //
|
||||
{0x2130, 0x2133}, //
|
||||
{0x213e, 0x213f}, //
|
||||
{0x2145, 0x2145}, //
|
||||
{0x2160, 0x216f}, //
|
||||
{0x2183, 0x2183}, //
|
||||
{0x24b6, 0x24cf}, //
|
||||
{0x2c00, 0x2c2f}, //
|
||||
{0x2c60, 0x2c60}, //
|
||||
{0x2c62, 0x2c64}, //
|
||||
{0x2c67, 0x2c67}, //
|
||||
{0x2c69, 0x2c69}, //
|
||||
{0x2c6b, 0x2c6b}, //
|
||||
{0x2c6d, 0x2c70}, //
|
||||
{0x2c72, 0x2c72}, //
|
||||
{0x2c75, 0x2c75}, //
|
||||
{0x2c7e, 0x2c80}, //
|
||||
{0x2c82, 0x2c82}, //
|
||||
{0x2c84, 0x2c84}, //
|
||||
{0x2c86, 0x2c86}, //
|
||||
{0x2c88, 0x2c88}, //
|
||||
{0x2c8a, 0x2c8a}, //
|
||||
{0x2c8c, 0x2c8c}, //
|
||||
{0x2c8e, 0x2c8e}, //
|
||||
{0x2c90, 0x2c90}, //
|
||||
{0x2c92, 0x2c92}, //
|
||||
{0x2c94, 0x2c94}, //
|
||||
{0x2c96, 0x2c96}, //
|
||||
{0x2c98, 0x2c98}, //
|
||||
{0x2c9a, 0x2c9a}, //
|
||||
{0x2c9c, 0x2c9c}, //
|
||||
{0x2c9e, 0x2c9e}, //
|
||||
{0x2ca0, 0x2ca0}, //
|
||||
{0x2ca2, 0x2ca2}, //
|
||||
{0x2ca4, 0x2ca4}, //
|
||||
{0x2ca6, 0x2ca6}, //
|
||||
{0x2ca8, 0x2ca8}, //
|
||||
{0x2caa, 0x2caa}, //
|
||||
{0x2cac, 0x2cac}, //
|
||||
{0x2cae, 0x2cae}, //
|
||||
{0x2cb0, 0x2cb0}, //
|
||||
{0x2cb2, 0x2cb2}, //
|
||||
{0x2cb4, 0x2cb4}, //
|
||||
{0x2cb6, 0x2cb6}, //
|
||||
{0x2cb8, 0x2cb8}, //
|
||||
{0x2cba, 0x2cba}, //
|
||||
{0x2cbc, 0x2cbc}, //
|
||||
{0x2cbe, 0x2cbe}, //
|
||||
{0x2cc0, 0x2cc0}, //
|
||||
{0x2cc2, 0x2cc2}, //
|
||||
{0x2cc4, 0x2cc4}, //
|
||||
{0x2cc6, 0x2cc6}, //
|
||||
{0x2cc8, 0x2cc8}, //
|
||||
{0x2cca, 0x2cca}, //
|
||||
{0x2ccc, 0x2ccc}, //
|
||||
{0x2cce, 0x2cce}, //
|
||||
{0x2cd0, 0x2cd0}, //
|
||||
{0x2cd2, 0x2cd2}, //
|
||||
{0x2cd4, 0x2cd4}, //
|
||||
{0x2cd6, 0x2cd6}, //
|
||||
{0x2cd8, 0x2cd8}, //
|
||||
{0x2cda, 0x2cda}, //
|
||||
{0x2cdc, 0x2cdc}, //
|
||||
{0x2cde, 0x2cde}, //
|
||||
{0x2ce0, 0x2ce0}, //
|
||||
{0x2ce2, 0x2ce2}, //
|
||||
{0x2ceb, 0x2ceb}, //
|
||||
{0x2ced, 0x2ced}, //
|
||||
{0x2cf2, 0x2cf2}, //
|
||||
{0xa640, 0xa640}, //
|
||||
{0xa642, 0xa642}, //
|
||||
{0xa644, 0xa644}, //
|
||||
{0xa646, 0xa646}, //
|
||||
{0xa648, 0xa648}, //
|
||||
{0xa64a, 0xa64a}, //
|
||||
{0xa64c, 0xa64c}, //
|
||||
{0xa64e, 0xa64e}, //
|
||||
{0xa650, 0xa650}, //
|
||||
{0xa652, 0xa652}, //
|
||||
{0xa654, 0xa654}, //
|
||||
{0xa656, 0xa656}, //
|
||||
{0xa658, 0xa658}, //
|
||||
{0xa65a, 0xa65a}, //
|
||||
{0xa65c, 0xa65c}, //
|
||||
{0xa65e, 0xa65e}, //
|
||||
{0xa660, 0xa660}, //
|
||||
{0xa662, 0xa662}, //
|
||||
{0xa664, 0xa664}, //
|
||||
{0xa666, 0xa666}, //
|
||||
{0xa668, 0xa668}, //
|
||||
{0xa66a, 0xa66a}, //
|
||||
{0xa66c, 0xa66c}, //
|
||||
{0xa680, 0xa680}, //
|
||||
{0xa682, 0xa682}, //
|
||||
{0xa684, 0xa684}, //
|
||||
{0xa686, 0xa686}, //
|
||||
{0xa688, 0xa688}, //
|
||||
{0xa68a, 0xa68a}, //
|
||||
{0xa68c, 0xa68c}, //
|
||||
{0xa68e, 0xa68e}, //
|
||||
{0xa690, 0xa690}, //
|
||||
{0xa692, 0xa692}, //
|
||||
{0xa694, 0xa694}, //
|
||||
{0xa696, 0xa696}, //
|
||||
{0xa698, 0xa698}, //
|
||||
{0xa69a, 0xa69a}, //
|
||||
{0xa722, 0xa722}, //
|
||||
{0xa724, 0xa724}, //
|
||||
{0xa726, 0xa726}, //
|
||||
{0xa728, 0xa728}, //
|
||||
{0xa72a, 0xa72a}, //
|
||||
{0xa72c, 0xa72c}, //
|
||||
{0xa72e, 0xa72e}, //
|
||||
{0xa732, 0xa732}, //
|
||||
{0xa734, 0xa734}, //
|
||||
{0xa736, 0xa736}, //
|
||||
{0xa738, 0xa738}, //
|
||||
{0xa73a, 0xa73a}, //
|
||||
{0xa73c, 0xa73c}, //
|
||||
{0xa73e, 0xa73e}, //
|
||||
{0xa740, 0xa740}, //
|
||||
{0xa742, 0xa742}, //
|
||||
{0xa744, 0xa744}, //
|
||||
{0xa746, 0xa746}, //
|
||||
{0xa748, 0xa748}, //
|
||||
{0xa74a, 0xa74a}, //
|
||||
{0xa74c, 0xa74c}, //
|
||||
{0xa74e, 0xa74e}, //
|
||||
{0xa750, 0xa750}, //
|
||||
{0xa752, 0xa752}, //
|
||||
{0xa754, 0xa754}, //
|
||||
{0xa756, 0xa756}, //
|
||||
{0xa758, 0xa758}, //
|
||||
{0xa75a, 0xa75a}, //
|
||||
{0xa75c, 0xa75c}, //
|
||||
{0xa75e, 0xa75e}, //
|
||||
{0xa760, 0xa760}, //
|
||||
{0xa762, 0xa762}, //
|
||||
{0xa764, 0xa764}, //
|
||||
{0xa766, 0xa766}, //
|
||||
{0xa768, 0xa768}, //
|
||||
{0xa76a, 0xa76a}, //
|
||||
{0xa76c, 0xa76c}, //
|
||||
{0xa76e, 0xa76e}, //
|
||||
{0xa779, 0xa779}, //
|
||||
{0xa77b, 0xa77b}, //
|
||||
{0xa77d, 0xa77e}, //
|
||||
{0xa780, 0xa780}, //
|
||||
{0xa782, 0xa782}, //
|
||||
{0xa784, 0xa784}, //
|
||||
{0xa786, 0xa786}, //
|
||||
{0xa78b, 0xa78b}, //
|
||||
{0xa78d, 0xa78d}, //
|
||||
{0xa790, 0xa790}, //
|
||||
{0xa792, 0xa792}, //
|
||||
{0xa796, 0xa796}, //
|
||||
{0xa798, 0xa798}, //
|
||||
{0xa79a, 0xa79a}, //
|
||||
{0xa79c, 0xa79c}, //
|
||||
{0xa79e, 0xa79e}, //
|
||||
{0xa7a0, 0xa7a0}, //
|
||||
{0xa7a2, 0xa7a2}, //
|
||||
{0xa7a4, 0xa7a4}, //
|
||||
{0xa7a6, 0xa7a6}, //
|
||||
{0xa7a8, 0xa7a8}, //
|
||||
{0xa7aa, 0xa7ae}, //
|
||||
{0xa7b0, 0xa7b4}, //
|
||||
{0xa7b6, 0xa7b6}, //
|
||||
{0xa7b8, 0xa7b8}, //
|
||||
{0xa7ba, 0xa7ba}, //
|
||||
{0xa7bc, 0xa7bc}, //
|
||||
{0xa7be, 0xa7be}, //
|
||||
{0xa7c0, 0xa7c0}, //
|
||||
{0xa7c2, 0xa7c2}, //
|
||||
{0xa7c4, 0xa7c7}, //
|
||||
{0xa7c9, 0xa7c9}, //
|
||||
{0xa7d0, 0xa7d0}, //
|
||||
{0xa7d6, 0xa7d6}, //
|
||||
{0xa7d8, 0xa7d8}, //
|
||||
{0xa7f5, 0xa7f5}, //
|
||||
{0xff21, 0xff3a}, //
|
||||
};
|
||||
|
||||
static const unsigned kUpperAstral[][2] = {
|
||||
{0x10400, 0x10427}, //
|
||||
{0x104b0, 0x104d3}, //
|
||||
{0x10570, 0x1057a}, //
|
||||
{0x1057c, 0x1058a}, //
|
||||
{0x1058c, 0x10592}, //
|
||||
{0x10594, 0x10595}, //
|
||||
{0x10c80, 0x10cb2}, //
|
||||
{0x118a0, 0x118bf}, //
|
||||
{0x16e40, 0x16e5f}, //
|
||||
{0x1d400, 0x1d419}, //
|
||||
{0x1d434, 0x1d44d}, //
|
||||
{0x1d468, 0x1d481}, //
|
||||
{0x1d49c, 0x1d49c}, //
|
||||
{0x1d49e, 0x1d49f}, //
|
||||
{0x1d4a2, 0x1d4a2}, //
|
||||
{0x1d4a5, 0x1d4a6}, //
|
||||
{0x1d4a9, 0x1d4ac}, //
|
||||
{0x1d4ae, 0x1d4b5}, //
|
||||
{0x1d4d0, 0x1d4e9}, //
|
||||
{0x1d504, 0x1d505}, //
|
||||
{0x1d507, 0x1d50a}, //
|
||||
{0x1d50d, 0x1d514}, //
|
||||
{0x1d516, 0x1d51c}, //
|
||||
{0x1d538, 0x1d539}, //
|
||||
{0x1d53b, 0x1d53e}, //
|
||||
{0x1d540, 0x1d544}, //
|
||||
{0x1d546, 0x1d546}, //
|
||||
{0x1d54a, 0x1d550}, //
|
||||
{0x1d56c, 0x1d585}, //
|
||||
{0x1d5a0, 0x1d5b9}, //
|
||||
{0x1d5d4, 0x1d5ed}, //
|
||||
{0x1d608, 0x1d621}, //
|
||||
{0x1d63c, 0x1d655}, //
|
||||
{0x1d670, 0x1d689}, //
|
||||
{0x1d6a8, 0x1d6c0}, //
|
||||
{0x1d6e2, 0x1d6fa}, //
|
||||
{0x1d71c, 0x1d734}, //
|
||||
{0x1d756, 0x1d76e}, //
|
||||
{0x1d790, 0x1d7a8}, //
|
||||
{0x1d7ca, 0x1d7ca}, //
|
||||
{0x1e900, 0x1e921}, //
|
||||
{0x1f130, 0x1f149}, //
|
||||
{0x1f150, 0x1f169}, //
|
||||
{0x1f170, 0x1f189}, //
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns nonzero if c is uppercase letter.
|
||||
*/
|
||||
int iswupper(wint_t c) {
|
||||
if (!IsTiny() && c < 128)
|
||||
return 'A' <= c && c <= 'Z';
|
||||
if (c < 65536)
|
||||
return has_char(kUpper, ARRAYLEN(kUpper), (unsigned short)c);
|
||||
return has_char(kUpperAstral, ARRAYLEN(kUpperAstral), (unsigned)c);
|
||||
}
|
||||
|
||||
__weak_reference(iswupper, iswupper_l);
|
|
@ -22,7 +22,8 @@
|
|||
* Returns nonzero if c is ascii hex digit.
|
||||
*/
|
||||
int iswxdigit(wint_t c) {
|
||||
return ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') ||
|
||||
return ('0' <= c && c <= '9') || //
|
||||
('A' <= c && c <= 'F') || //
|
||||
('a' <= c && c <= 'f');
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,8 @@
|
|||
* Returns true if c is hexadecimal digit.
|
||||
*/
|
||||
int isxdigit(int c) {
|
||||
return ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') ||
|
||||
return ('0' <= c && c <= '9') || //
|
||||
('A' <= c && c <= 'F') || //
|
||||
('a' <= c && c <= 'f');
|
||||
}
|
||||
|
||||
|
|
|
@ -24,32 +24,23 @@
|
|||
*/
|
||||
int IsZipEocd32(const uint8_t *p, size_t n, size_t i) {
|
||||
size_t offset;
|
||||
if (i > n || n - i < kZipCdirHdrMinSize) {
|
||||
if (i > n || n - i < kZipCdirHdrMinSize)
|
||||
return kZipErrorEocdOffsetOverflow;
|
||||
}
|
||||
if (ZIP_READ32(p + i) != kZipCdirHdrMagic) {
|
||||
if (ZIP_READ32(p + i) != kZipCdirHdrMagic)
|
||||
return kZipErrorEocdMagicNotFound;
|
||||
}
|
||||
if (i + ZIP_CDIR_HDRSIZE(p + i) > n) {
|
||||
if (i + ZIP_CDIR_HDRSIZE(p + i) > n)
|
||||
return kZipErrorEocdSizeOverflow;
|
||||
}
|
||||
if (ZIP_CDIR_DISK(p + i) != ZIP_CDIR_STARTINGDISK(p + i)) {
|
||||
if (ZIP_CDIR_DISK(p + i) != ZIP_CDIR_STARTINGDISK(p + i))
|
||||
return kZipErrorEocdDiskMismatch;
|
||||
}
|
||||
if (ZIP_CDIR_RECORDSONDISK(p + i) != ZIP_CDIR_RECORDS(p + i)) {
|
||||
if (ZIP_CDIR_RECORDSONDISK(p + i) != ZIP_CDIR_RECORDS(p + i))
|
||||
return kZipErrorEocdRecordsMismatch;
|
||||
}
|
||||
if (ZIP_CDIR_RECORDS(p + i) * kZipCfileHdrMinSize > ZIP_CDIR_SIZE(p + i)) {
|
||||
if (ZIP_CDIR_RECORDS(p + i) * kZipCfileHdrMinSize > ZIP_CDIR_SIZE(p + i))
|
||||
return kZipErrorEocdRecordsOverflow;
|
||||
}
|
||||
if (ZIP_CDIR_OFFSET(p + i) == 0xFFFFFFFFu) {
|
||||
if (ZIP_CDIR_OFFSET(p + i) == 0xFFFFFFFFu)
|
||||
return kZipErrorEocdRecordsOverflow;
|
||||
}
|
||||
if (ckd_add(&offset, ZIP_CDIR_OFFSET(p + i), ZIP_CDIR_SIZE(p + i))) {
|
||||
if (ckd_add(&offset, ZIP_CDIR_OFFSET(p + i), ZIP_CDIR_SIZE(p + i)))
|
||||
return kZipErrorEocdOffsetSizeOverflow;
|
||||
}
|
||||
if (offset > i) {
|
||||
if (offset > i)
|
||||
return kZipErrorCdirOffsetPastEocd;
|
||||
}
|
||||
return kZipOk;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ Copyright 2024 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
|
@ -16,35 +16,59 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/macros.h"
|
||||
#include "libc/wctype.h"
|
||||
#include "libc/str/kmp.h"
|
||||
#include "libc/mem/alloca.h"
|
||||
#include "libc/runtime/stack.h"
|
||||
|
||||
typedef int (*isw_f)(wint_t);
|
||||
|
||||
static const isw_f kWcTypeFuncs[] = {
|
||||
iswalnum, //
|
||||
iswalpha, //
|
||||
iswblank, //
|
||||
iswcntrl, //
|
||||
iswdigit, //
|
||||
iswgraph, //
|
||||
iswlower, //
|
||||
iswprint, //
|
||||
iswpunct, //
|
||||
iswspace, //
|
||||
iswupper, //
|
||||
iswxdigit, //
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns nonzero if c has property.
|
||||
*
|
||||
* @param t is number returned by wctype
|
||||
*/
|
||||
int iswctype(wint_t c, wctype_t t) {
|
||||
if (1 <= t && t <= ARRAYLEN(kWcTypeFuncs)) {
|
||||
return kWcTypeFuncs[t - 1](c);
|
||||
} else {
|
||||
return 0;
|
||||
static void computeLPS(const char *pattern, long M, long *lps) {
|
||||
long len = 0;
|
||||
lps[0] = 0;
|
||||
long i = 1;
|
||||
while (i < M) {
|
||||
if (pattern[i] == pattern[len]) {
|
||||
len++;
|
||||
lps[i] = len;
|
||||
i++;
|
||||
} else {
|
||||
if (len != 0) {
|
||||
len = lps[len - 1];
|
||||
} else {
|
||||
lps[i] = 0;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
char *__memmem_kmp(const char *s, size_t n, const char *ss, size_t m) {
|
||||
if (!m)
|
||||
return (char *)s;
|
||||
if (n < m)
|
||||
return NULL;
|
||||
#pragma GCC push_options
|
||||
#pragma GCC diagnostic ignored "-Walloca-larger-than="
|
||||
#pragma GCC diagnostic ignored "-Wanalyzer-out-of-bounds"
|
||||
long need = sizeof(long) * m;
|
||||
long *lps = (long *)alloca(need);
|
||||
CheckLargeStackAllocation(lps, need);
|
||||
#pragma GCC pop_options
|
||||
computeLPS(ss, m, lps);
|
||||
long i = 0;
|
||||
long j = 0;
|
||||
while (i < n) {
|
||||
if (ss[j] == s[i]) {
|
||||
i++;
|
||||
j++;
|
||||
}
|
||||
if (j == m) {
|
||||
return (char *)(s + i - j);
|
||||
} else if (i < n && ss[j] != s[i]) {
|
||||
if (j != 0) {
|
||||
j = lps[j - 1];
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
10
libc/str/kmp.h
Normal file
10
libc/str/kmp.h
Normal file
|
@ -0,0 +1,10 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_STR_KMP_H_
|
||||
#define COSMOPOLITAN_LIBC_STR_KMP_H_
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
char *__memmem_kmp(const char *, size_t, const char *, size_t);
|
||||
char16_t *__memmem_kmp16(const char16_t *, size_t, const char16_t *, size_t);
|
||||
wchar_t *__memmem_kmp32(const wchar_t *, size_t, const wchar_t *, size_t);
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* COSMOPOLITAN_LIBC_STR_KMP_H_ */
|
|
@ -1,7 +1,7 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ Copyright 2024 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
|
@ -16,13 +16,60 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/wctype.h"
|
||||
#include "libc/mem/alloca.h"
|
||||
#include "libc/runtime/stack.h"
|
||||
#include "libc/str/kmp.h"
|
||||
|
||||
/**
|
||||
* Returns nonzero if c is alphabetical.
|
||||
*/
|
||||
int iswalpha(wint_t c) {
|
||||
return iswupper(c) || iswlower(c);
|
||||
static void computeLPS(const char16_t *pattern, long M, long *lps) {
|
||||
long len = 0;
|
||||
lps[0] = 0;
|
||||
long i = 1;
|
||||
while (i < M) {
|
||||
if (pattern[i] == pattern[len]) {
|
||||
len++;
|
||||
lps[i] = len;
|
||||
i++;
|
||||
} else {
|
||||
if (len != 0) {
|
||||
len = lps[len - 1];
|
||||
} else {
|
||||
lps[i] = 0;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__weak_reference(iswalpha, iswalpha_l);
|
||||
char16_t *__memmem_kmp16(const char16_t *s, size_t n, const char16_t *ss,
|
||||
size_t m) {
|
||||
if (!m)
|
||||
return (char16_t *)s;
|
||||
if (n < m)
|
||||
return NULL;
|
||||
#pragma GCC push_options
|
||||
#pragma GCC diagnostic ignored "-Walloca-larger-than="
|
||||
#pragma GCC diagnostic ignored "-Wanalyzer-out-of-bounds"
|
||||
long need = sizeof(long) * m;
|
||||
long *lps = (long *)alloca(need);
|
||||
CheckLargeStackAllocation(lps, need);
|
||||
#pragma GCC pop_options
|
||||
computeLPS(ss, m, lps);
|
||||
long i = 0;
|
||||
long j = 0;
|
||||
while (i < n) {
|
||||
if (ss[j] == s[i]) {
|
||||
i++;
|
||||
j++;
|
||||
}
|
||||
if (j == m) {
|
||||
return (char16_t *)(s + i - j);
|
||||
} else if (i < n && ss[j] != s[i]) {
|
||||
if (j != 0) {
|
||||
j = lps[j - 1];
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ Copyright 2024 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
|
@ -16,23 +16,60 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/wctype.h"
|
||||
#include "libc/mem/alloca.h"
|
||||
#include "libc/runtime/stack.h"
|
||||
#include "libc/str/kmp.h"
|
||||
|
||||
/**
|
||||
* Compares NUL-terminated UCS-2 strings case-insensitively w/ limit.
|
||||
*
|
||||
* @param a is first non-null NUL-terminated char16 string pointer
|
||||
* @param b is second non-null NUL-terminated char16 string pointer
|
||||
* @return is <0, 0, or >0 based on uint8_t comparison
|
||||
* @asyncsignalsafe
|
||||
*/
|
||||
int strncasecmp16(const char16_t *a, const char16_t *b, size_t n) {
|
||||
int x, y;
|
||||
size_t i = 0;
|
||||
if (!n-- || a == b)
|
||||
return 0;
|
||||
while ((x = towlower(a[i])) == (y = towlower(b[i])) && b[i] && i < n)
|
||||
++i;
|
||||
return x - y;
|
||||
static void computeLPS(const wchar_t *pattern, long M, long *lps) {
|
||||
long len = 0;
|
||||
lps[0] = 0;
|
||||
long i = 1;
|
||||
while (i < M) {
|
||||
if (pattern[i] == pattern[len]) {
|
||||
len++;
|
||||
lps[i] = len;
|
||||
i++;
|
||||
} else {
|
||||
if (len != 0) {
|
||||
len = lps[len - 1];
|
||||
} else {
|
||||
lps[i] = 0;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wchar_t *__memmem_kmp32(const wchar_t *s, size_t n, const wchar_t *ss,
|
||||
size_t m) {
|
||||
if (!m)
|
||||
return (wchar_t *)s;
|
||||
if (n < m)
|
||||
return NULL;
|
||||
#pragma GCC push_options
|
||||
#pragma GCC diagnostic ignored "-Walloca-larger-than="
|
||||
#pragma GCC diagnostic ignored "-Wanalyzer-out-of-bounds"
|
||||
long need = sizeof(long) * m;
|
||||
long *lps = (long *)alloca(need);
|
||||
CheckLargeStackAllocation(lps, need);
|
||||
#pragma GCC pop_options
|
||||
computeLPS(ss, m, lps);
|
||||
long i = 0;
|
||||
long j = 0;
|
||||
while (i < n) {
|
||||
if (ss[j] == s[i]) {
|
||||
i++;
|
||||
j++;
|
||||
}
|
||||
if (j == m) {
|
||||
return (wchar_t *)(s + i - j);
|
||||
} else if (i < n && ss[j] != s[i]) {
|
||||
if (j != 0) {
|
||||
j = lps[j - 1];
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
|
@ -20,7 +20,6 @@
|
|||
#include "libc/nexgen32e/x86info.h"
|
||||
|
||||
const struct X86ProcessorModel kX86ProcessorModels[] = {
|
||||
/* <SORTED> */
|
||||
{0x060F, X86_MARCH_CORE2, X86_GRADE_CLIENT},
|
||||
{0x0616, X86_MARCH_CORE2, X86_GRADE_MOBILE},
|
||||
{0x0617, X86_MARCH_CORE2, X86_GRADE_SERVER},
|
||||
|
@ -85,7 +84,5 @@ const struct X86ProcessorModel kX86ProcessorModels[] = {
|
|||
{0x06A7, X86_MARCH_ROCKETLAKE, X86_GRADE_CLIENT},
|
||||
{0x06B7, X86_MARCH_RAPTORLAKE, X86_GRADE_CLIENT},
|
||||
{0x06BA, X86_MARCH_RAPTORLAKE, X86_GRADE_CLIENT},
|
||||
/* </SORTED> */
|
||||
{0},
|
||||
};
|
||||
|
||||
const size_t kX86ProcessorModelCount = ARRAYLEN(kX86ProcessorModels);
|
||||
|
|
|
@ -16,49 +16,60 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/dce.h"
|
||||
#include "libc/intrin/likely.h"
|
||||
#include "libc/str/kmp.h"
|
||||
#include "libc/str/str.h"
|
||||
|
||||
typedef char xmm_t __attribute__((__vector_size__(16), __aligned__(16)));
|
||||
#include "third_party/aarch64/arm_neon.internal.h"
|
||||
#include "third_party/intel/emmintrin.internal.h"
|
||||
|
||||
/**
|
||||
* Searches for fixed-length substring in memory region.
|
||||
*
|
||||
* This function offers assurances against pathological cases, using KMP
|
||||
* if no progress is being made on the O(nm) vectorized fast path. It is
|
||||
* important to note that, if `needle` is untrusted, that it not be long
|
||||
* enough to overflow the stack. That's because KMP needs to allocate an
|
||||
* array of longs the same length as `needle` and it needs to do it with
|
||||
* stack memory because this function is safe to call in signal handlers
|
||||
*
|
||||
* @param haystack is the region of memory to be searched
|
||||
* @param haystacklen is its character count
|
||||
* @param needle contains the memory for which we're searching
|
||||
* @param needlelen is its character count
|
||||
* @return pointer to first result or NULL if not found
|
||||
* @asyncsignalsafe
|
||||
*/
|
||||
__vex void *memmem(const void *haystack, size_t haystacklen, const void *needle,
|
||||
size_t needlelen) {
|
||||
#if defined(__x86_64__) && !defined(__chibicc__)
|
||||
char c;
|
||||
xmm_t n;
|
||||
const xmm_t *v;
|
||||
__m128i n;
|
||||
const __m128i *v;
|
||||
unsigned i, k, m;
|
||||
long progress = 0;
|
||||
const char *p, *q, *e;
|
||||
long scare = -(needlelen * 10);
|
||||
if (!needlelen)
|
||||
return (void *)haystack;
|
||||
if (UNLIKELY(needlelen > haystacklen))
|
||||
return 0;
|
||||
q = needle;
|
||||
c = *q;
|
||||
n = (xmm_t){c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c};
|
||||
n = _mm_set1_epi8(c);
|
||||
p = haystack;
|
||||
e = p + haystacklen;
|
||||
k = (uintptr_t)p & 15;
|
||||
v = (const xmm_t *)((uintptr_t)p & -16);
|
||||
m = __builtin_ia32_pmovmskb128(*v == n);
|
||||
v = (const __m128i *)((uintptr_t)p & -16);
|
||||
m = _mm_movemask_epi8(_mm_cmpeq_epi8(_mm_load_si128(v), n));
|
||||
m >>= k;
|
||||
m <<= k;
|
||||
for (;;) {
|
||||
while (!m) {
|
||||
++v;
|
||||
progress += 16;
|
||||
if ((const char *)v >= e)
|
||||
return 0;
|
||||
m = __builtin_ia32_pmovmskb128(*v == n);
|
||||
m = _mm_movemask_epi8(_mm_cmpeq_epi8(_mm_load_si128(v), n));
|
||||
}
|
||||
do {
|
||||
k = __builtin_ctzl(m);
|
||||
|
@ -66,6 +77,8 @@ __vex void *memmem(const void *haystack, size_t haystacklen, const void *needle,
|
|||
if (UNLIKELY(p + needlelen > e))
|
||||
return 0;
|
||||
for (i = 1;; ++i) {
|
||||
if (--progress <= scare)
|
||||
goto OfferPathologicalAssurances;
|
||||
if (i == needlelen)
|
||||
return (/*unconst*/ char *)p;
|
||||
if (p[i] != q[i])
|
||||
|
@ -74,22 +87,59 @@ __vex void *memmem(const void *haystack, size_t haystacklen, const void *needle,
|
|||
m &= ~(1 << k);
|
||||
} while (m);
|
||||
}
|
||||
#else
|
||||
size_t i, j;
|
||||
OfferPathologicalAssurances:
|
||||
#elif defined(__aarch64__) && defined(__ARM_NEON)
|
||||
char c;
|
||||
uint8x16_t n;
|
||||
const uint8x16_t *v;
|
||||
size_t i, k;
|
||||
uint64_t m;
|
||||
long progress = 0;
|
||||
const char *p, *q, *e;
|
||||
long scare = -(needlelen * 10);
|
||||
if (!needlelen)
|
||||
return (void *)haystack;
|
||||
if (needlelen > haystacklen)
|
||||
if (UNLIKELY(needlelen > haystacklen))
|
||||
return 0;
|
||||
for (i = 0; i < haystacklen; ++i) {
|
||||
for (j = 0;; ++j) {
|
||||
if (j == needlelen)
|
||||
return (/*unconst*/ char *)haystack + i;
|
||||
if (i + j == haystacklen)
|
||||
break;
|
||||
if (((char *)haystack)[i + j] != ((char *)needle)[j])
|
||||
break;
|
||||
q = needle;
|
||||
c = *q;
|
||||
n = vdupq_n_u8(c);
|
||||
p = haystack;
|
||||
e = p + haystacklen;
|
||||
k = (uintptr_t)p & 15;
|
||||
v = (const uint8x16_t *)((uintptr_t)p & -16);
|
||||
uint8x16_t cmp = vceqq_u8(vld1q_u8((const uint8_t *)v), n);
|
||||
uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(cmp), 4);
|
||||
vst1_u8((uint8_t *)&m, mask);
|
||||
m >>= k * 4;
|
||||
m <<= k * 4;
|
||||
for (;;) {
|
||||
while (!m) {
|
||||
++v;
|
||||
progress += 16;
|
||||
if ((const char *)v >= e)
|
||||
return 0;
|
||||
cmp = vceqq_u8(vld1q_u8((const uint8_t *)v), n);
|
||||
mask = vshrn_n_u16(vreinterpretq_u16_u8(cmp), 4);
|
||||
vst1_u8((uint8_t *)&m, mask);
|
||||
}
|
||||
do {
|
||||
k = __builtin_ctzll(m) >> 2;
|
||||
p = (const char *)v + k;
|
||||
if (UNLIKELY(p + needlelen > e))
|
||||
return 0;
|
||||
for (i = 1;; ++i) {
|
||||
if (--progress <= scare)
|
||||
goto OfferPathologicalAssurances;
|
||||
if (i == needlelen)
|
||||
return (/*unconst*/ char *)p;
|
||||
if (p[i] != q[i])
|
||||
break;
|
||||
}
|
||||
m &= ~(0xFULL << (k * 4));
|
||||
} while (m);
|
||||
}
|
||||
return 0;
|
||||
OfferPathologicalAssurances:
|
||||
#endif
|
||||
return __memmem_kmp(haystack, haystacklen, needle, needlelen);
|
||||
}
|
||||
|
|
91
libc/str/nonspacing.inc
Normal file
91
libc/str/nonspacing.inc
Normal file
|
@ -0,0 +1,91 @@
|
|||
16,16,16,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,16,33,16,16,16,34,35,36,
|
||||
37,38,39,40,16,16,41,16,16,16,16,16,16,16,16,16,16,16,42,43,16,16,44,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,45,16,46,47,48,49,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,50,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,51,16,16,52,
|
||||
53,16,54,55,56,16,16,16,16,16,16,57,16,16,58,16,59,60,61,62,63,64,65,66,67,68,
|
||||
69,70,16,71,72,73,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,74,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,75,76,16,16,16,77,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,78,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,79,80,16,16,16,16,16,16,16,81,16,16,16,16,16,82,83,84,16,16,16,16,16,85,
|
||||
86,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,248,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,254,255,255,255,255,191,182,0,0,0,0,0,0,0,63,0,255,23,0,0,0,0,0,248,255,
|
||||
255,0,0,1,0,0,0,0,0,0,0,0,0,0,0,192,191,159,61,0,0,0,128,2,0,0,0,255,255,255,
|
||||
7,0,0,0,0,0,0,0,0,0,0,192,255,1,0,0,0,0,0,0,248,15,32,0,0,192,251,239,62,0,0,
|
||||
0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,255,255,255,255,
|
||||
255,7,0,0,0,0,0,0,20,254,33,254,0,12,0,0,0,2,0,0,0,0,0,0,16,30,32,0,0,12,0,0,
|
||||
64,6,0,0,0,0,0,0,16,134,57,2,0,0,0,35,0,6,0,0,0,0,0,0,16,190,33,0,0,12,0,0,
|
||||
252,2,0,0,0,0,0,0,144,30,32,64,0,12,0,0,0,4,0,0,0,0,0,0,0,1,32,0,0,0,0,0,0,17,
|
||||
0,0,0,0,0,0,192,193,61,96,0,12,0,0,0,2,0,0,0,0,0,0,144,64,48,0,0,12,0,0,0,3,0,
|
||||
0,0,0,0,0,24,30,32,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,4,92,0,0,0,0,0,0,0,0,0,0,0,
|
||||
242,7,128,127,0,0,0,0,0,0,0,0,0,0,0,0,242,31,0,63,0,0,0,0,0,0,0,0,0,3,0,0,160,
|
||||
2,0,0,0,0,0,0,254,127,223,224,255,254,255,255,255,31,64,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,224,253,102,0,0,0,195,1,0,30,0,100,32,0,32,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,28,0,0,0,28,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,176,63,64,254,
|
||||
15,32,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,2,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,135,1,4,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
128,9,0,0,0,0,0,0,64,127,229,31,248,159,0,0,0,0,0,0,255,127,0,0,0,0,0,0,0,0,
|
||||
15,0,0,0,0,0,208,23,4,0,0,0,0,248,15,0,3,0,0,0,60,59,0,0,0,0,0,0,64,163,3,0,0,
|
||||
0,0,0,0,240,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,255,253,33,16,
|
||||
3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,
|
||||
251,0,248,0,0,0,124,0,0,0,0,0,0,223,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,
|
||||
255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,
|
||||
0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,128,247,63,0,0,0,192,0,0,0,0,0,0,0,0,0,0,3,0,68,8,0,0,96,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,255,255,3,128,0,0,0,0,192,63,0,0,128,255,3,0,
|
||||
0,0,0,0,7,0,0,0,0,0,200,51,0,0,0,0,32,0,0,
|
||||
0,0,0,0,0,0,126,102,0,8,16,0,0,0,0,0,16,0,0,0,0,0,0,157,193,2,0,0,0,0,48,64,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,33,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,0,0,0,
|
||||
64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,
|
||||
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,1,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,240,0,
|
||||
0,0,0,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,0,0,0,240,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,255,1,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,255,127,0,0,0,0,0,0,128,
|
||||
3,0,0,0,0,0,120,38,0,32,0,0,0,0,0,0,7,0,0,0,128,239,31,0,0,0,0,0,0,0,8,0,3,0,
|
||||
0,0,0,0,192,127,0,30,0,0,0,0,0,0,0,0,0,0,0,128,211,64,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,128,248,7,0,0,3,0,0,0,0,0,0,24,1,0,0,0,192,31,31,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,255,92,0,0,64,0,0,0,0,0,0,0,0,0,0,248,133,13,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,176,1,0,0,48,0,0,0,0,0,0,0,0,0,0,
|
||||
248,167,1,0,0,0,0,0,0,0,0,0,0,0,0,40,191,0,0,0,0,0,0,0,0,0,0,0,0,224,188,15,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,6,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,240,12,1,0,0,0,254,7,0,0,0,0,248,121,128,0,126,14,0,0,0,0,0,252,
|
||||
127,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,191,0,0,0,0,0,0,0,0,0,0,252,255,
|
||||
255,252,109,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,126,180,191,0,0,0,0,0,0,0,0,0,163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,255,
|
||||
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,7,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,15,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,248,255,231,15,0,0,0,60,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
|
||||
255,255,255,255,127,248,255,255,255,255,255,31,32,0,16,0,0,248,254,255,0,0,0,
|
||||
0,0,0,0,0,0,0,127,255,255,249,219,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,240,7,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
@ -1,36 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/wctype.h"
|
||||
|
||||
/**
|
||||
* Compares NUL-terminated UCS-2 strings case-insensitively.
|
||||
*
|
||||
* @param a is first non-null NUL-terminated char16 string pointer
|
||||
* @param b is second non-null NUL-terminated char16 string pointer
|
||||
* @return is <0, 0, or >0 based on uint16_t comparison
|
||||
* @asyncsignalsafe
|
||||
*/
|
||||
int strcasecmp16(const char16_t *l, const char16_t *r) {
|
||||
int x, y;
|
||||
size_t i = 0;
|
||||
while ((x = towlower(l[i])) == (y = towlower(r[i])) && r[i])
|
||||
++i;
|
||||
return x - y;
|
||||
}
|
|
@ -17,74 +17,113 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/dce.h"
|
||||
|
||||
typedef char xmm_t __attribute__((__vector_size__(16), __aligned__(16)));
|
||||
#include "libc/str/kmp.h"
|
||||
#include "third_party/aarch64/arm_neon.internal.h"
|
||||
#include "third_party/intel/immintrin.internal.h"
|
||||
|
||||
/**
|
||||
* Searches for substring.
|
||||
*
|
||||
* This function offers assurances against pathological cases, using KMP
|
||||
* if no progress is being made on the O(nm) vectorized fast path. It is
|
||||
* important to note that, if `needle` is untrusted, that it not be long
|
||||
* enough to overflow the stack. That's because KMP needs to allocate an
|
||||
* array of longs the same length as `needle` and it needs to do it with
|
||||
* stack memory since POSIX requires this function to be safe to call in
|
||||
* signal handlers.
|
||||
*
|
||||
* @param haystack is the search area, as a NUL-terminated string
|
||||
* @param needle is the desired substring, also NUL-terminated
|
||||
* @return pointer to first substring within haystack, or NULL
|
||||
* @note this implementation goes fast in practice but isn't hardened
|
||||
* against pathological cases, and therefore shouldn't be used on
|
||||
* untrustworthy data
|
||||
* @asyncsignalsafe
|
||||
* @see strcasestr()
|
||||
* @see memmem()
|
||||
*/
|
||||
__vex char *strstr(const char *haystack, const char *needle) {
|
||||
if (haystack == needle || !*needle)
|
||||
return (char *)haystack;
|
||||
#if defined(__x86_64__) && !defined(__chibicc__)
|
||||
size_t i;
|
||||
unsigned k, m;
|
||||
const xmm_t *p;
|
||||
xmm_t v, n, z = {0};
|
||||
if (haystack == needle || !*needle)
|
||||
return (char *)haystack;
|
||||
n = (xmm_t){*needle, *needle, *needle, *needle, *needle, *needle,
|
||||
*needle, *needle, *needle, *needle, *needle, *needle,
|
||||
*needle, *needle, *needle, *needle};
|
||||
const __m128i *p;
|
||||
long progress = 0;
|
||||
__m128i v, n, z = _mm_setzero_si128();
|
||||
const char *hay = haystack;
|
||||
n = _mm_set1_epi8(*needle);
|
||||
for (;;) {
|
||||
k = (uintptr_t)haystack & 15;
|
||||
p = (const xmm_t *)((uintptr_t)haystack & -16);
|
||||
v = *p;
|
||||
m = __builtin_ia32_pmovmskb128((v == z) | (v == n));
|
||||
k = (uintptr_t)hay & 15;
|
||||
p = (const __m128i *)((uintptr_t)hay & -16);
|
||||
v = _mm_load_si128(p);
|
||||
m = _mm_movemask_epi8(
|
||||
_mm_or_si128(_mm_cmpeq_epi8(v, z), _mm_cmpeq_epi8(v, n)));
|
||||
m >>= k;
|
||||
m <<= k;
|
||||
while (!m) {
|
||||
v = *++p;
|
||||
m = __builtin_ia32_pmovmskb128((v == z) | (v == n));
|
||||
progress += 16;
|
||||
v = _mm_load_si128(++p);
|
||||
m = _mm_movemask_epi8(
|
||||
_mm_or_si128(_mm_cmpeq_epi8(v, z), _mm_cmpeq_epi8(v, n)));
|
||||
}
|
||||
haystack = (const char *)p + __builtin_ctzl(m);
|
||||
int offset = __builtin_ctzl(m);
|
||||
progress += offset;
|
||||
hay = (const char *)p + offset;
|
||||
for (i = 0;; ++i) {
|
||||
if (--progress <= -512)
|
||||
goto OfferPathologicalAssurances;
|
||||
if (!needle[i])
|
||||
return (/*unconst*/ char *)haystack;
|
||||
if (!haystack[i])
|
||||
return (/*unconst*/ char *)hay;
|
||||
if (!hay[i])
|
||||
break;
|
||||
if (needle[i] != haystack[i])
|
||||
if (needle[i] != hay[i])
|
||||
break;
|
||||
}
|
||||
if (!*haystack++)
|
||||
if (!*hay++)
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
#else
|
||||
OfferPathologicalAssurances:
|
||||
#elif defined(__aarch64__) && defined(__ARM_NEON)
|
||||
size_t i;
|
||||
if (haystack == needle || !*needle)
|
||||
return (void *)haystack;
|
||||
const char *hay = haystack;
|
||||
uint8x16_t n = vdupq_n_u8(*needle);
|
||||
uint8x16_t z = vdupq_n_u8(0);
|
||||
long progress = 0;
|
||||
for (;;) {
|
||||
int k = (uintptr_t)hay & 15;
|
||||
hay = (const char *)((uintptr_t)hay & -16);
|
||||
uint8x16_t v = vld1q_u8((const uint8_t *)hay);
|
||||
uint8x16_t cmp = vorrq_u8(vceqq_u8(v, z), vceqq_u8(v, n));
|
||||
uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(cmp), 4);
|
||||
uint64_t m;
|
||||
vst1_u8((uint8_t *)&m, mask);
|
||||
m >>= k * 4;
|
||||
m <<= k * 4;
|
||||
while (!m) {
|
||||
hay += 16;
|
||||
progress += 16;
|
||||
v = vld1q_u8((const uint8_t *)hay);
|
||||
cmp = vorrq_u8(vceqq_u8(v, z), vceqq_u8(v, n));
|
||||
mask = vshrn_n_u16(vreinterpretq_u16_u8(cmp), 4);
|
||||
vst1_u8((uint8_t *)&m, mask);
|
||||
}
|
||||
int offset = __builtin_ctzll(m) >> 2;
|
||||
progress += offset;
|
||||
hay += offset;
|
||||
for (i = 0;; ++i) {
|
||||
if (--progress <= -512)
|
||||
goto OfferPathologicalAssurances;
|
||||
if (!needle[i])
|
||||
return (/*unconst*/ char *)haystack;
|
||||
if (!haystack[i])
|
||||
return (/*unconst*/ char *)hay;
|
||||
if (!hay[i])
|
||||
break;
|
||||
if (needle[i] != haystack[i])
|
||||
if (needle[i] != hay[i])
|
||||
break;
|
||||
}
|
||||
if (!*haystack++)
|
||||
if (!*hay++)
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
OfferPathologicalAssurances:
|
||||
#endif
|
||||
return __memmem_kmp(haystack, strlen(haystack), needle, strlen(needle));
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/str/kmp.h"
|
||||
#include "libc/str/str.h"
|
||||
|
||||
/**
|
||||
|
@ -28,19 +29,5 @@
|
|||
* @see memmem()
|
||||
*/
|
||||
char16_t *strstr16(const char16_t *haystack, const char16_t *needle) {
|
||||
size_t i;
|
||||
for (;;) {
|
||||
for (i = 0;;) {
|
||||
if (!needle[i])
|
||||
return (/*unconst*/ char16_t *)haystack;
|
||||
if (!haystack[i])
|
||||
break;
|
||||
if (needle[i] != haystack[i])
|
||||
break;
|
||||
++i;
|
||||
}
|
||||
if (!*haystack++)
|
||||
break;
|
||||
}
|
||||
return NULL;
|
||||
return __memmem_kmp16(haystack, strlen16(haystack), needle, strlen16(needle));
|
||||
}
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2022 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/wctype.h"
|
||||
|
||||
wint_t towctrans(wint_t c, wctrans_t t) {
|
||||
if (t == (wctrans_t)1)
|
||||
return towupper(c);
|
||||
if (t == (wctrans_t)2)
|
||||
return towlower(c);
|
||||
return c;
|
||||
}
|
|
@ -1,236 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/dce.h"
|
||||
#include "libc/macros.h"
|
||||
#include "libc/str/str.h"
|
||||
/* clang-format off */
|
||||
|
||||
static const struct {
|
||||
unsigned short x;
|
||||
unsigned short y;
|
||||
short d;
|
||||
} kLower[] = {
|
||||
{0x00c0, 0x00d6, +32}, /* 23x À ..Ö → à ..ö Watin */
|
||||
{0x00d8, 0x00de, +32}, /* 7x Ø ..Þ → ø ..þ Watin */
|
||||
{0x0178, 0x0178, -121}, /* 1x Ÿ ..Ÿ → ÿ ..ÿ Watin-A */
|
||||
{0x0179, 0x0179, +1}, /* 1x Ź ..Ź → ź ..ź Watin-A */
|
||||
{0x017b, 0x017b, +1}, /* 1x Ż ..Ż → ż ..ż Watin-A */
|
||||
{0x017d, 0x017d, +1}, /* 1x Ž ..Ž → ž ..ž Watin-A */
|
||||
{0x0181, 0x0181, +210}, /* 1x Ɓ ..Ɓ → ɓ ..ɓ Watin-B */
|
||||
{0x0182, 0x0182, +1}, /* 1x Ƃ ..Ƃ → ƃ ..ƃ Watin-B */
|
||||
{0x0184, 0x0184, +1}, /* 1x Ƅ ..Ƅ → ƅ ..ƅ Watin-B */
|
||||
{0x0186, 0x0186, +206}, /* 1x Ɔ ..Ɔ → ɔ ..ɔ Watin-B */
|
||||
{0x0187, 0x0187, +1}, /* 1x Ƈ ..Ƈ → ƈ ..ƈ Watin-B */
|
||||
{0x0189, 0x018a, +205}, /* 2x Ɖ ..Ɗ → ɖ ..ɗ Watin-B */
|
||||
{0x018b, 0x018b, +1}, /* 1x Ƌ ..Ƌ → ƌ ..ƌ Watin-B */
|
||||
{0x018e, 0x018e, +79}, /* 1x Ǝ ..Ǝ → ǝ ..ǝ Watin-B */
|
||||
{0x018f, 0x018f, +202}, /* 1x Ə ..Ə → ə ..ə Watin-B */
|
||||
{0x0190, 0x0190, +203}, /* 1x Ɛ ..Ɛ → ɛ ..ɛ Watin-B */
|
||||
{0x0191, 0x0191, +1}, /* 1x Ƒ ..Ƒ → ƒ ..ƒ Watin-B */
|
||||
{0x0193, 0x0193, +205}, /* 1x Ɠ ..Ɠ → ɠ ..ɠ Watin-B */
|
||||
{0x0194, 0x0194, +207}, /* 1x Ɣ ..Ɣ → ɣ ..ɣ Watin-B */
|
||||
{0x0196, 0x0196, +211}, /* 1x Ɩ ..Ɩ → ɩ ..ɩ Watin-B */
|
||||
{0x0197, 0x0197, +209}, /* 1x Ɨ ..Ɨ → ɨ ..ɨ Watin-B */
|
||||
{0x0198, 0x0198, +1}, /* 1x Ƙ ..Ƙ → ƙ ..ƙ Watin-B */
|
||||
{0x019c, 0x019c, +211}, /* 1x Ɯ ..Ɯ → ɯ ..ɯ Watin-B */
|
||||
{0x019d, 0x019d, +213}, /* 1x Ɲ ..Ɲ → ɲ ..ɲ Watin-B */
|
||||
{0x019f, 0x019f, +214}, /* 1x Ɵ ..Ɵ → ɵ ..ɵ Watin-B */
|
||||
{0x01a0, 0x01a0, +1}, /* 1x Ơ ..Ơ → ơ ..ơ Watin-B */
|
||||
{0x01a2, 0x01a2, +1}, /* 1x Ƣ ..Ƣ → ƣ ..ƣ Watin-B */
|
||||
{0x01a4, 0x01a4, +1}, /* 1x Ƥ ..Ƥ → ƥ ..ƥ Watin-B */
|
||||
{0x01a6, 0x01a6, +218}, /* 1x Ʀ ..Ʀ → ʀ ..ʀ Watin-B */
|
||||
{0x01a7, 0x01a7, +1}, /* 1x Ƨ ..Ƨ → ƨ ..ƨ Watin-B */
|
||||
{0x01a9, 0x01a9, +218}, /* 1x Ʃ ..Ʃ → ʃ ..ʃ Watin-B */
|
||||
{0x01ac, 0x01ac, +1}, /* 1x Ƭ ..Ƭ → ƭ ..ƭ Watin-B */
|
||||
{0x01ae, 0x01ae, +218}, /* 1x Ʈ ..Ʈ → ʈ ..ʈ Watin-B */
|
||||
{0x01af, 0x01af, +1}, /* 1x Ư ..Ư → ư ..ư Watin-B */
|
||||
{0x01b1, 0x01b2, +217}, /* 2x Ʊ ..Ʋ → ʊ ..ʋ Watin-B */
|
||||
{0x01b3, 0x01b3, +1}, /* 1x Ƴ ..Ƴ → ƴ ..ƴ Watin-B */
|
||||
{0x01b5, 0x01b5, +1}, /* 1x Ƶ ..Ƶ → ƶ ..ƶ Watin-B */
|
||||
{0x01b7, 0x01b7, +219}, /* 1x Ʒ ..Ʒ → ʒ ..ʒ Watin-B */
|
||||
{0x01b8, 0x01b8, +1}, /* 1x Ƹ ..Ƹ → ƹ ..ƹ Watin-B */
|
||||
{0x01bc, 0x01bc, +1}, /* 1x Ƽ ..Ƽ → ƽ ..ƽ Watin-B */
|
||||
{0x01c4, 0x01c4, +2}, /* 1x DŽ ..DŽ → dž ..dž Watin-B */
|
||||
{0x01c5, 0x01c5, +1}, /* 1x Dž ..Dž → dž ..dž Watin-B */
|
||||
{0x01c7, 0x01c7, +2}, /* 1x LJ ..LJ → lj ..lj Watin-B */
|
||||
{0x01c8, 0x01c8, +1}, /* 1x Lj ..Lj → lj ..lj Watin-B */
|
||||
{0x01ca, 0x01ca, +2}, /* 1x NJ ..NJ → nj ..nj Watin-B */
|
||||
{0x01cb, 0x01cb, +1}, /* 1x Nj ..Nj → nj ..nj Watin-B */
|
||||
{0x01cd, 0x01cd, +1}, /* 1x Ǎ ..Ǎ → ǎ ..ǎ Watin-B */
|
||||
{0x01f1, 0x01f1, +2}, /* 1x DZ ..DZ → dz ..dz Watin-B */
|
||||
{0x01f2, 0x01f2, +1}, /* 1x Dz ..Dz → dz ..dz Watin-B */
|
||||
{0x01f4, 0x01f4, +1}, /* 1x Ǵ ..Ǵ → ǵ ..ǵ Watin-B */
|
||||
{0x01f6, 0x01f6, -97}, /* 1x Ƕ ..Ƕ → ƕ ..ƕ Watin-B */
|
||||
{0x01f7, 0x01f7, -56}, /* 1x Ƿ ..Ƿ → ƿ ..ƿ Watin-B */
|
||||
{0x0220, 0x0220, -130}, /* 1x Ƞ ..Ƞ → ƞ ..ƞ Watin-B */
|
||||
{0x023b, 0x023b, +1}, /* 1x Ȼ ..Ȼ → ȼ ..ȼ Watin-B */
|
||||
{0x023d, 0x023d, -163}, /* 1x Ƚ ..Ƚ → ƚ ..ƚ Watin-B */
|
||||
{0x0241, 0x0241, +1}, /* 1x Ɂ ..Ɂ → ɂ ..ɂ Watin-B */
|
||||
{0x0243, 0x0243, -195}, /* 1x Ƀ ..Ƀ → ƀ ..ƀ Watin-B */
|
||||
{0x0244, 0x0244, +69}, /* 1x Ʉ ..Ʉ → ʉ ..ʉ Watin-B */
|
||||
{0x0245, 0x0245, +71}, /* 1x Ʌ ..Ʌ → ʌ ..ʌ Watin-B */
|
||||
{0x0246, 0x0246, +1}, /* 1x Ɇ ..Ɇ → ɇ ..ɇ Watin-B */
|
||||
{0x0248, 0x0248, +1}, /* 1x Ɉ ..Ɉ → ɉ ..ɉ Watin-B */
|
||||
{0x024a, 0x024a, +1}, /* 1x Ɋ ..Ɋ → ɋ ..ɋ Watin-B */
|
||||
{0x024c, 0x024c, +1}, /* 1x Ɍ ..Ɍ → ɍ ..ɍ Watin-B */
|
||||
{0x024e, 0x024e, +1}, /* 1x Ɏ ..Ɏ → ɏ ..ɏ Watin-B */
|
||||
{0x0386, 0x0386, +38}, /* 1x Ά ..Ά → ά ..ά Greek */
|
||||
{0x0388, 0x038a, +37}, /* 3x Έ ..Ί → έ ..ί Greek */
|
||||
{0x038c, 0x038c, +64}, /* 1x Ό ..Ό → ό ..ό Greek */
|
||||
{0x038e, 0x038f, +63}, /* 2x Ύ ..Ώ → ύ ..ώ Greek */
|
||||
{0x0391, 0x03a1, +32}, /* 17x Α ..Ρ → α ..ρ Greek */
|
||||
{0x03a3, 0x03ab, +32}, /* 9x Σ ..Ϋ → σ ..ϋ Greek */
|
||||
{0x03dc, 0x03dc, +1}, /* 1x Ϝ ..Ϝ → ϝ ..ϝ Greek */
|
||||
{0x03f4, 0x03f4, -60}, /* 1x ϴ ..ϴ → θ ..θ Greek */
|
||||
{0x0400, 0x040f, +80}, /* 16x Ѐ ..Џ → ѐ ..џ Cyrillic */
|
||||
{0x0410, 0x042f, +32}, /* 32x А ..Я → а ..я Cyrillic */
|
||||
{0x0460, 0x0460, +1}, /* 1x Ѡ ..Ѡ → ѡ ..ѡ Cyrillic */
|
||||
{0x0462, 0x0462, +1}, /* 1x Ѣ ..Ѣ → ѣ ..ѣ Cyrillic */
|
||||
{0x0464, 0x0464, +1}, /* 1x Ѥ ..Ѥ → ѥ ..ѥ Cyrillic */
|
||||
{0x0472, 0x0472, +1}, /* 1x Ѳ ..Ѳ → ѳ ..ѳ Cyrillic */
|
||||
{0x0490, 0x0490, +1}, /* 1x Ґ ..Ґ → ґ ..ґ Cyrillic */
|
||||
{0x0498, 0x0498, +1}, /* 1x Ҙ ..Ҙ → ҙ ..ҙ Cyrillic */
|
||||
{0x049a, 0x049a, +1}, /* 1x Қ ..Қ → қ ..қ Cyrillic */
|
||||
{0x0531, 0x0556, +48}, /* 38x Ա ..Ֆ → ա ..ֆ Armenian */
|
||||
{0x10a0, 0x10c5, +7264}, /* 38x Ⴀ ..Ⴥ → ⴀ ..ⴥ Georgian */
|
||||
{0x10c7, 0x10c7, +7264}, /* 1x Ⴧ ..Ⴧ → ⴧ ..ⴧ Georgian */
|
||||
{0x10cd, 0x10cd, +7264}, /* 1x Ⴭ ..Ⴭ → ⴭ ..ⴭ Georgian */
|
||||
{0x13f0, 0x13f5, +8}, /* 6x Ᏸ ..Ᏽ → ᏸ ..ᏽ Cherokee */
|
||||
{0x1c90, 0x1cba, -3008}, /* 43x Ა ..Ჺ → ა ..ჺ Georgian2 */
|
||||
{0x1cbd, 0x1cbf, -3008}, /* 3x Ჽ ..Ჿ → ჽ ..ჿ Georgian2 */
|
||||
{0x1f08, 0x1f0f, -8}, /* 8x Ἀ ..Ἇ → ἀ ..ἇ Greek2 */
|
||||
{0x1f18, 0x1f1d, -8}, /* 6x Ἐ ..Ἕ → ἐ ..ἕ Greek2 */
|
||||
{0x1f28, 0x1f2f, -8}, /* 8x Ἠ ..Ἧ → ἠ ..ἧ Greek2 */
|
||||
{0x1f38, 0x1f3f, -8}, /* 8x Ἰ ..Ἷ → ἰ ..ἷ Greek2 */
|
||||
{0x1f48, 0x1f4d, -8}, /* 6x Ὀ ..Ὅ → ὀ ..ὅ Greek2 */
|
||||
{0x1f59, 0x1f59, -8}, /* 1x Ὑ ..Ὑ → ὑ ..ὑ Greek2 */
|
||||
{0x1f5b, 0x1f5b, -8}, /* 1x Ὓ ..Ὓ → ὓ ..ὓ Greek2 */
|
||||
{0x1f5d, 0x1f5d, -8}, /* 1x Ὕ ..Ὕ → ὕ ..ὕ Greek2 */
|
||||
{0x1f5f, 0x1f5f, -8}, /* 1x Ὗ ..Ὗ → ὗ ..ὗ Greek2 */
|
||||
{0x1f68, 0x1f6f, -8}, /* 8x Ὠ ..Ὧ → ὠ ..ὧ Greek2 */
|
||||
{0x1f88, 0x1f8f, -8}, /* 8x ᾈ ..ᾏ → ᾀ ..ᾇ Greek2 */
|
||||
{0x1f98, 0x1f9f, -8}, /* 8x ᾘ ..ᾟ → ᾐ ..ᾗ Greek2 */
|
||||
{0x1fa8, 0x1faf, -8}, /* 8x ᾨ ..ᾯ → ᾠ ..ᾧ Greek2 */
|
||||
{0x1fb8, 0x1fb9, -8}, /* 2x Ᾰ ..Ᾱ → ᾰ ..ᾱ Greek2 */
|
||||
{0x1fba, 0x1fbb, -74}, /* 2x Ὰ ..Ά → ὰ ..ά Greek2 */
|
||||
{0x1fbc, 0x1fbc, -9}, /* 1x ᾼ ..ᾼ → ᾳ ..ᾳ Greek2 */
|
||||
{0x1fc8, 0x1fcb, -86}, /* 4x Ὲ ..Ή → ὲ ..ή Greek2 */
|
||||
{0x1fcc, 0x1fcc, -9}, /* 1x ῌ ..ῌ → ῃ ..ῃ Greek2 */
|
||||
{0x1fd8, 0x1fd9, -8}, /* 2x Ῐ ..Ῑ → ῐ ..ῑ Greek2 */
|
||||
{0x1fda, 0x1fdb, -100}, /* 2x Ὶ ..Ί → ὶ ..ί Greek2 */
|
||||
{0x1fe8, 0x1fe9, -8}, /* 2x Ῠ ..Ῡ → ῠ ..ῡ Greek2 */
|
||||
{0x1fea, 0x1feb, -112}, /* 2x Ὺ ..Ύ → ὺ ..ύ Greek2 */
|
||||
{0x1fec, 0x1fec, -7}, /* 1x Ῥ ..Ῥ → ῥ ..ῥ Greek2 */
|
||||
{0x1ff8, 0x1ff9, -128}, /* 2x Ὸ ..Ό → ὸ ..ό Greek2 */
|
||||
{0x1ffa, 0x1ffb, -126}, /* 2x Ὼ ..Ώ → ὼ ..ώ Greek2 */
|
||||
{0x1ffc, 0x1ffc, -9}, /* 1x ῼ ..ῼ → ῳ ..ῳ Greek2 */
|
||||
{0x2126, 0x2126, -7517}, /* 1x Ω ..Ω → ω ..ω Letterlike */
|
||||
{0x212a, 0x212a, -8383}, /* 1x K ..K → k ..k Letterlike */
|
||||
{0x212b, 0x212b, -8262}, /* 1x Å ..Å → å ..å Letterlike */
|
||||
{0x2132, 0x2132, +28}, /* 1x Ⅎ ..Ⅎ → ⅎ ..ⅎ Letterlike */
|
||||
{0x2160, 0x216f, +16}, /* 16x Ⅰ ..Ⅿ → ⅰ ..ⅿ Numbery */
|
||||
{0x2183, 0x2183, +1}, /* 1x Ↄ ..Ↄ → ↄ ..ↄ Numbery */
|
||||
{0x24b6, 0x24cf, +26}, /* 26x Ⓐ ..Ⓩ → ⓐ ..ⓩ Enclosed */
|
||||
{0x2c00, 0x2c2e, +48}, /* 47x Ⰰ ..Ⱞ → ⰰ ..ⱞ Glagolitic */
|
||||
{0xff21, 0xff3a, +32}, /* 26x A..Z → a..z Dubs */
|
||||
};
|
||||
|
||||
static const int kAstralLower[][3] = {
|
||||
{0x10400, 0x10427, +40}, /* 40x 𐐀 ..𐐧 → 𐐨 ..𐑏 Deseret */
|
||||
{0x104b0, 0x104d3, +40}, /* 36x 𐒰 ..𐓓 → 𐓘 ..𐓻 Osage */
|
||||
{0x1d400, 0x1d419, +26}, /* 26x 𝐀 ..𝐙 → 𝐚 ..𝐳 Math */
|
||||
{0x1d43c, 0x1d44d, +26}, /* 18x 𝐼 ..𝑍 → 𝑖 ..𝑧 Math */
|
||||
{0x1d468, 0x1d481, +26}, /* 26x 𝑨 ..𝒁 → 𝒂 ..𝒛 Math */
|
||||
{0x1d4ae, 0x1d4b5, +26}, /* 8x 𝒮 ..𝒵 → 𝓈 ..𝓏 Math */
|
||||
{0x1d4d0, 0x1d4e9, +26}, /* 26x 𝓐 ..𝓩 → 𝓪 ..𝔃 Math */
|
||||
{0x1d50d, 0x1d514, +26}, /* 8x 𝔍 ..𝔔 → 𝔧 ..𝔮 Math */
|
||||
{0x1d56c, 0x1d585, +26}, /* 26x 𝕬 ..𝖅 → 𝖆 ..𝖟 Math */
|
||||
{0x1d5a0, 0x1d5b9, +26}, /* 26x 𝖠 ..𝖹 → 𝖺 ..𝗓 Math */
|
||||
{0x1d5d4, 0x1d5ed, +26}, /* 26x 𝗔 ..𝗭 → 𝗮 ..𝘇 Math */
|
||||
{0x1d608, 0x1d621, +26}, /* 26x 𝘈 ..𝘡 → 𝘢 ..𝘻 Math */
|
||||
{0x1d63c, 0x1d655, -442}, /* 26x 𝘼 ..𝙕 → 𝒂 ..𝒛 Math */
|
||||
{0x1d670, 0x1d689, +26}, /* 26x 𝙰 ..𝚉 → 𝚊 ..𝚣 Math */
|
||||
{0x1d6a8, 0x1d6b8, +26}, /* 17x 𝚨 ..𝚸 → 𝛂 ..𝛒 Math */
|
||||
{0x1d6e2, 0x1d6f2, +26}, /* 17x 𝛢 ..𝛲 → 𝛼 ..𝜌 Math */
|
||||
{0x1d71c, 0x1d72c, +26}, /* 17x 𝜜 ..𝜬 → 𝜶 ..𝝆 Math */
|
||||
{0x1d756, 0x1d766, +26}, /* 17x 𝝖 ..𝝦 → 𝝰 ..𝞀 Math */
|
||||
{0x1d790, 0x1d7a0, -90}, /* 17x 𝞐 ..𝞠 → 𝜶 ..𝝆 Math */
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts wide character to lower case.
|
||||
*/
|
||||
wint_t towlower(wint_t c) {
|
||||
int m, l, r, n;
|
||||
if (c < 0200) {
|
||||
if ('A' <= c && c <= 'Z') {
|
||||
return c + 32;
|
||||
} else {
|
||||
return c;
|
||||
}
|
||||
} else if (c <= 0xffff) {
|
||||
if ((0x0100 <= c && c <= 0x0176) || /* 60x Ā..ā → ā..ŵ Watin-A */
|
||||
(0x01de <= c && c <= 0x01ee) || /* 9x Ǟ..Ǯ → ǟ..ǯ Watin-B */
|
||||
(0x01f8 <= c && c <= 0x021e) || /* 20x Ǹ..Ȟ → ǹ..ȟ Watin-B */
|
||||
(0x0222 <= c && c <= 0x0232) || /* 9x Ȣ..Ȳ → ȣ..ȳ Watin-B */
|
||||
(0x1e00 <= c && c <= 0x1eff)) { /*256x Ḁ..Ỿ → ḁ..ỿ Watin-C */
|
||||
if (c == 0x0130) return c - 199;
|
||||
if (c == 0x1e9e) return c;
|
||||
return c + (~c & 1);
|
||||
} else if (0x01cf <= c && c <= 0x01db) {
|
||||
return c + (c & 1); /* 7x Ǐ..Ǜ → ǐ..ǜ Watin-B */
|
||||
} else if (0x13a0 <= c && c <= 0x13ef) {
|
||||
return c + 38864; /* 80x Ꭰ ..Ꮿ → ꭰ ..ꮿ Cherokee */
|
||||
} else {
|
||||
l = 0;
|
||||
r = n = sizeof(kLower) / sizeof(kLower[0]);
|
||||
while (l < r) {
|
||||
m = (l & r) + ((l ^ r) >> 1); // floor((a+b)/2)
|
||||
if (kLower[m].y < c) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
r = m;
|
||||
}
|
||||
}
|
||||
if (l < n && kLower[l].x <= c && c <= kLower[l].y) {
|
||||
return c + kLower[l].d;
|
||||
} else {
|
||||
return c;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
l = 0;
|
||||
r = n = sizeof(kAstralLower) / sizeof(kAstralLower[0]);
|
||||
while (l < r) {
|
||||
m = (l & r) + ((l ^ r) >> 1); // floor((a+b)/2)
|
||||
if (kAstralLower[m][1] < c) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
r = m;
|
||||
}
|
||||
}
|
||||
if (l < n && kAstralLower[l][0] <= c && c <= kAstralLower[l][1]) {
|
||||
return c + kAstralLower[l][2];
|
||||
} else {
|
||||
return c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__weak_reference(towlower, towlower_l);
|
|
@ -1,199 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/dce.h"
|
||||
#include "libc/macros.h"
|
||||
#include "libc/str/str.h"
|
||||
// clang-format off
|
||||
|
||||
static const struct {
|
||||
unsigned short x;
|
||||
unsigned short y;
|
||||
short d;
|
||||
} kUpper[] = {
|
||||
{0x00b5, 0x00b5, +743}, /* 1x µ ..µ → Μ ..Μ Watin */
|
||||
{0x00e0, 0x00f6, -32}, /* 23x à ..ö → À ..Ö Watin */
|
||||
{0x00f8, 0x00fe, -32}, /* 7x ø ..þ → Ø ..Þ Watin */
|
||||
{0x00ff, 0x00ff, +121}, /* 1x ÿ ..ÿ → Ÿ ..Ÿ Watin */
|
||||
{0x017a, 0x017a, -1}, /* 1x ź ..ź → Ź ..Ź Watin-A */
|
||||
{0x017c, 0x017c, -1}, /* 1x ż ..ż → Ż ..Ż Watin-A */
|
||||
{0x017e, 0x017e, -1}, /* 1x ž ..ž → Ž ..Ž Watin-A */
|
||||
{0x017f, 0x017f, -300}, /* 1x ſ ..ſ → S ..S Watin-A */
|
||||
{0x0180, 0x0180, +195}, /* 1x ƀ ..ƀ → Ƀ ..Ƀ Watin-B */
|
||||
{0x0183, 0x0183, -1}, /* 1x ƃ ..ƃ → Ƃ ..Ƃ Watin-B */
|
||||
{0x0185, 0x0185, -1}, /* 1x ƅ ..ƅ → Ƅ ..Ƅ Watin-B */
|
||||
{0x0188, 0x0188, -1}, /* 1x ƈ ..ƈ → Ƈ ..Ƈ Watin-B */
|
||||
{0x018c, 0x018c, -1}, /* 1x ƌ ..ƌ → Ƌ ..Ƌ Watin-B */
|
||||
{0x0192, 0x0192, -1}, /* 1x ƒ ..ƒ → Ƒ ..Ƒ Watin-B */
|
||||
{0x0195, 0x0195, +97}, /* 1x ƕ ..ƕ → Ƕ ..Ƕ Watin-B */
|
||||
{0x0199, 0x0199, -1}, /* 1x ƙ ..ƙ → Ƙ ..Ƙ Watin-B */
|
||||
{0x019a, 0x019a, +163}, /* 1x ƚ ..ƚ → Ƚ ..Ƚ Watin-B */
|
||||
{0x019e, 0x019e, +130}, /* 1x ƞ ..ƞ → Ƞ ..Ƞ Watin-B */
|
||||
{0x01a1, 0x01a1, -1}, /* 1x ơ ..ơ → Ơ ..Ơ Watin-B */
|
||||
{0x01a3, 0x01a3, -1}, /* 1x ƣ ..ƣ → Ƣ ..Ƣ Watin-B */
|
||||
{0x01a5, 0x01a5, -1}, /* 1x ƥ ..ƥ → Ƥ ..Ƥ Watin-B */
|
||||
{0x01a8, 0x01a8, -1}, /* 1x ƨ ..ƨ → Ƨ ..Ƨ Watin-B */
|
||||
{0x01ad, 0x01ad, -1}, /* 1x ƭ ..ƭ → Ƭ ..Ƭ Watin-B */
|
||||
{0x01b0, 0x01b0, -1}, /* 1x ư ..ư → Ư ..Ư Watin-B */
|
||||
{0x01b4, 0x01b4, -1}, /* 1x ƴ ..ƴ → Ƴ ..Ƴ Watin-B */
|
||||
{0x01b6, 0x01b6, -1}, /* 1x ƶ ..ƶ → Ƶ ..Ƶ Watin-B */
|
||||
{0x01b9, 0x01b9, -1}, /* 1x ƹ ..ƹ → Ƹ ..Ƹ Watin-B */
|
||||
{0x01bd, 0x01bd, -1}, /* 1x ƽ ..ƽ → Ƽ ..Ƽ Watin-B */
|
||||
{0x01bf, 0x01bf, +56}, /* 1x ƿ ..ƿ → Ƿ ..Ƿ Watin-B */
|
||||
{0x01c5, 0x01c5, -1}, /* 1x Dž ..Dž → DŽ ..DŽ Watin-B */
|
||||
{0x01c6, 0x01c6, -2}, /* 1x dž ..dž → DŽ ..DŽ Watin-B */
|
||||
{0x01c8, 0x01c8, -1}, /* 1x Lj ..Lj → LJ ..LJ Watin-B */
|
||||
{0x01c9, 0x01c9, -2}, /* 1x lj ..lj → LJ ..LJ Watin-B */
|
||||
{0x01cb, 0x01cb, -1}, /* 1x Nj ..Nj → NJ ..NJ Watin-B */
|
||||
{0x01cc, 0x01cc, -2}, /* 1x nj ..nj → NJ ..NJ Watin-B */
|
||||
{0x01ce, 0x01ce, -1}, /* 1x ǎ ..ǎ → Ǎ ..Ǎ Watin-B */
|
||||
{0x01dd, 0x01dd, -79}, /* 1x ǝ ..ǝ → Ǝ ..Ǝ Watin-B */
|
||||
{0x01f2, 0x01f2, -1}, /* 1x Dz ..Dz → DZ ..DZ Watin-B */
|
||||
{0x01f3, 0x01f3, -2}, /* 1x dz ..dz → DZ ..DZ Watin-B */
|
||||
{0x01f5, 0x01f5, -1}, /* 1x ǵ ..ǵ → Ǵ ..Ǵ Watin-B */
|
||||
{0x023c, 0x023c, -1}, /* 1x ȼ ..ȼ → Ȼ ..Ȼ Watin-B */
|
||||
{0x023f, 0x0240, +10815}, /* 2x ȿ ..ɀ → Ȿ ..Ɀ Watin-B */
|
||||
{0x0242, 0x0242, -1}, /* 1x ɂ ..ɂ → Ɂ ..Ɂ Watin-B */
|
||||
{0x0247, 0x0247, -1}, /* 1x ɇ ..ɇ → Ɇ ..Ɇ Watin-B */
|
||||
{0x0249, 0x0249, -1}, /* 1x ɉ ..ɉ → Ɉ ..Ɉ Watin-B */
|
||||
{0x024b, 0x024b, -1}, /* 1x ɋ ..ɋ → Ɋ ..Ɋ Watin-B */
|
||||
{0x024d, 0x024d, -1}, /* 1x ɍ ..ɍ → Ɍ ..Ɍ Watin-B */
|
||||
{0x024f, 0x024f, -1}, /* 1x ɏ ..ɏ → Ɏ ..Ɏ Watin-B */
|
||||
{0x037b, 0x037d, +130}, /* 3x ͻ ..ͽ → Ͻ ..Ͽ Greek */
|
||||
{0x03ac, 0x03ac, -38}, /* 1x ά ..ά → Ά ..Ά Greek */
|
||||
{0x03ad, 0x03af, -37}, /* 3x έ ..ί → Έ ..Ί Greek */
|
||||
{0x03b1, 0x03c1, -32}, /* 17x α ..ρ → Α ..Ρ Greek */
|
||||
{0x03c2, 0x03c2, -31}, /* 1x ς ..ς → Σ ..Σ Greek */
|
||||
{0x03c3, 0x03cb, -32}, /* 9x σ ..ϋ → Σ ..Ϋ Greek */
|
||||
{0x03cc, 0x03cc, -64}, /* 1x ό ..ό → Ό ..Ό Greek */
|
||||
{0x03cd, 0x03ce, -63}, /* 2x ύ ..ώ → Ύ ..Ώ Greek */
|
||||
{0x03d0, 0x03d0, -62}, /* 1x ϐ ..ϐ → Β ..Β Greek */
|
||||
{0x03d1, 0x03d1, -57}, /* 1x ϑ ..ϑ → Θ ..Θ Greek */
|
||||
{0x03d5, 0x03d5, -47}, /* 1x ϕ ..ϕ → Φ ..Φ Greek */
|
||||
{0x03d6, 0x03d6, -54}, /* 1x ϖ ..ϖ → Π ..Π Greek */
|
||||
{0x03dd, 0x03dd, -1}, /* 1x ϝ ..ϝ → Ϝ ..Ϝ Greek */
|
||||
{0x03f0, 0x03f0, -86}, /* 1x ϰ ..ϰ → Κ ..Κ Greek */
|
||||
{0x03f1, 0x03f1, -80}, /* 1x ϱ ..ϱ → Ρ ..Ρ Greek */
|
||||
{0x03f5, 0x03f5, -96}, /* 1x ϵ ..ϵ → Ε ..Ε Greek */
|
||||
{0x0430, 0x044f, -32}, /* 32x а ..я → А ..Я Cyrillic */
|
||||
{0x0450, 0x045f, -80}, /* 16x ѐ ..џ → Ѐ ..Џ Cyrillic */
|
||||
{0x0461, 0x0461, -1}, /* 1x ѡ ..ѡ → Ѡ ..Ѡ Cyrillic */
|
||||
{0x0463, 0x0463, -1}, /* 1x ѣ ..ѣ → Ѣ ..Ѣ Cyrillic */
|
||||
{0x0465, 0x0465, -1}, /* 1x ѥ ..ѥ → Ѥ ..Ѥ Cyrillic */
|
||||
{0x0473, 0x0473, -1}, /* 1x ѳ ..ѳ → Ѳ ..Ѳ Cyrillic */
|
||||
{0x0491, 0x0491, -1}, /* 1x ґ ..ґ → Ґ ..Ґ Cyrillic */
|
||||
{0x0499, 0x0499, -1}, /* 1x ҙ ..ҙ → Ҙ ..Ҙ Cyrillic */
|
||||
{0x049b, 0x049b, -1}, /* 1x қ ..қ → Қ ..Қ Cyrillic */
|
||||
{0x0561, 0x0586, -48}, /* 38x ա ..ֆ → Ա ..Ֆ Armenian */
|
||||
{0x10d0, 0x10fa, +3008}, /* 43x ა ..ჺ → Ა ..Ჺ Georgian */
|
||||
{0x10fd, 0x10ff, +3008}, /* 3x ჽ ..ჿ → Ჽ ..Ჿ Georgian */
|
||||
{0x13f8, 0x13fd, -8}, /* 6x ᏸ ..ᏽ → Ᏸ ..Ᏽ Cherokee */
|
||||
{0x214e, 0x214e, -28}, /* 1x ⅎ ..ⅎ → Ⅎ ..Ⅎ Letterlike */
|
||||
{0x2170, 0x217f, -16}, /* 16x ⅰ ..ⅿ → Ⅰ ..Ⅿ Numbery */
|
||||
{0x2184, 0x2184, -1}, /* 1x ↄ ..ↄ → Ↄ ..Ↄ Numbery */
|
||||
{0x24d0, 0x24e9, -26}, /* 26x ⓐ ..ⓩ → Ⓐ ..Ⓩ Enclosed */
|
||||
{0x2c30, 0x2c5e, -48}, /* 47x ⰰ ..ⱞ → Ⰰ ..Ⱞ Glagolitic */
|
||||
{0x2d00, 0x2d25, -7264}, /* 38x ⴀ ..ⴥ → Ⴀ ..Ⴥ Georgian2 */
|
||||
{0x2d27, 0x2d27, -7264}, /* 1x ⴧ ..ⴧ → Ⴧ ..Ⴧ Georgian2 */
|
||||
{0x2d2d, 0x2d2d, -7264}, /* 1x ⴭ ..ⴭ → Ⴭ ..Ⴭ Georgian2 */
|
||||
{0xff41, 0xff5a, -32}, /* 26x a..z → A..Z Dubs */
|
||||
};
|
||||
|
||||
static const int kAstralUpper[][3] = {
|
||||
{0x10428, 0x1044f, -40}, /* 40x 𐐨..𐑏 → 𐐀..𐐧 Deseret */
|
||||
{0x104d8, 0x104fb, -40}, /* 36x 𐓘..𐓻 → 𐒰..𐓓 Osage */
|
||||
{0x1d41a, 0x1d433, -26}, /* 26x 𝐚..𝐳 → 𝐀..𝐙 Math */
|
||||
{0x1d456, 0x1d467, -26}, /* 18x 𝑖..𝑧 → 𝐼..𝑍 Math */
|
||||
{0x1d482, 0x1d49b, -26}, /* 26x 𝒂..𝒛 → 𝑨..𝒁 Math */
|
||||
{0x1d4c8, 0x1d4cf, -26}, /* 8x 𝓈..𝓏 → 𝒮..𝒵 Math */
|
||||
{0x1d4ea, 0x1d503, -26}, /* 26x 𝓪..𝔃 → 𝓐..𝓩 Math */
|
||||
{0x1d527, 0x1d52e, -26}, /* 8x 𝔧..𝔮 → 𝔍..𝔔 Math */
|
||||
{0x1d586, 0x1d59f, -26}, /* 26x 𝖆..𝖟 → 𝕬..𝖅 Math */
|
||||
{0x1d5ba, 0x1d5d3, -26}, /* 26x 𝖺..𝗓 → 𝖠..𝖹 Math */
|
||||
{0x1d5ee, 0x1d607, -26}, /* 26x 𝗮..𝘇 → 𝗔..𝗭 Math */
|
||||
{0x1d622, 0x1d63b, -26}, /* 26x 𝘢..𝘻 → 𝘈..𝘡 Math */
|
||||
{0x1d68a, 0x1d6a3, +442}, /* 26x 𝒂..𝒛 → 𝘼..𝙕 Math */
|
||||
{0x1d6c2, 0x1d6d2, -26}, /* 26x 𝚊..𝚣 → 𝙰..𝚉 Math */
|
||||
{0x1d6fc, 0x1d70c, -26}, /* 17x 𝛂..𝛒 → 𝚨..𝚸 Math */
|
||||
{0x1d736, 0x1d746, -26}, /* 17x 𝛼..𝜌 → 𝛢..𝛲 Math */
|
||||
{0x1d770, 0x1d780, -26}, /* 17x 𝜶..𝝆 → 𝜜..𝜬 Math */
|
||||
{0x1d770, 0x1d756, -26}, /* 17x 𝝰..𝞀 → 𝝖..𝝦 Math */
|
||||
{0x1d736, 0x1d790, -90}, /* 17x 𝜶..𝝆 → 𝞐..𝞠 Math */
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts wide character to upper case.
|
||||
*/
|
||||
wint_t towupper(wint_t c) {
|
||||
int m, l, r, n;
|
||||
if (c < 0200) {
|
||||
if ('a' <= c && c <= 'z') {
|
||||
return c - 32;
|
||||
} else {
|
||||
return c;
|
||||
}
|
||||
} else if (c <= 0xffff) {
|
||||
if ((0x0101 <= c && c <= 0x0177) || /* 60x ā..ŵ → Ā..ā Watin-A */
|
||||
(0x01df <= c && c <= 0x01ef) || /* 9x ǟ..ǯ → Ǟ..Ǯ Watin-B */
|
||||
(0x01f8 <= c && c <= 0x021e) || /* 20x ǹ..ȟ → Ǹ..Ȟ Watin-B */
|
||||
(0x0222 <= c && c <= 0x0232) || /* 9x ȣ..ȳ → Ȣ..Ȳ Watin-B */
|
||||
(0x1e01 <= c && c <= 0x1eff)) { /*256x ḁ..ỿ → Ḁ..Ỿ Watin-C */
|
||||
if (c == 0x0131) return c + 232;
|
||||
if (c == 0x1e9e) return c;
|
||||
return c - (c & 1);
|
||||
} else if (0x01d0 <= c && c <= 0x01dc) {
|
||||
return c - (~c & 1); /* 7x ǐ..ǜ → Ǐ..Ǜ Watin-B */
|
||||
} else if (0xab70 <= c && c <= 0xabbf) {
|
||||
return c - 38864; /* 80x ꭰ ..ꮿ → Ꭰ ..Ꮿ Cherokee Supplement */
|
||||
} else {
|
||||
l = 0;
|
||||
r = n = sizeof(kUpper) / sizeof(kUpper[0]);
|
||||
while (l < r) {
|
||||
m = (l & r) + ((l ^ r) >> 1); // floor((a+b)/2)
|
||||
if (kUpper[m].y < c) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
r = m;
|
||||
}
|
||||
}
|
||||
if (l < n && kUpper[l].x <= c && c <= kUpper[l].y) {
|
||||
return c + kUpper[l].d;
|
||||
} else {
|
||||
return c;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
l = 0;
|
||||
r = n = sizeof(kAstralUpper) / sizeof(kAstralUpper[0]);
|
||||
while (l < r) {
|
||||
m = (l & r) + ((l ^ r) >> 1); // floor((a+b)/2)
|
||||
if (kAstralUpper[m][1] < c) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
r = m;
|
||||
}
|
||||
}
|
||||
if (l < n && kAstralUpper[l][0] <= c && c <= kAstralUpper[l][1]) {
|
||||
return c + kAstralUpper[l][2];
|
||||
} else {
|
||||
return c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__weak_reference(towupper, towupper_l);
|
|
@ -1,38 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/wctype.h"
|
||||
|
||||
/**
|
||||
* Compares NUL-terminated wide strings case-insensitively.
|
||||
*
|
||||
* @param a is first non-null NUL-terminated string pointer
|
||||
* @param b is second non-null NUL-terminated string pointer
|
||||
* @return is <0, 0, or >0 based on uint8_t comparison
|
||||
* @asyncsignalsafe
|
||||
*/
|
||||
int wcscasecmp(const wchar_t *a, const wchar_t *b) {
|
||||
size_t i = 0;
|
||||
unsigned x, y;
|
||||
if (a == b)
|
||||
return 0;
|
||||
while ((x = towlower(a[i])) == (y = towlower(b[i])) && b[i])
|
||||
++i;
|
||||
return x - y;
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/wctype.h"
|
||||
|
||||
/**
|
||||
* Compares NUL-terminated wide strings case-insensitively w/ limit.
|
||||
*
|
||||
* @param a is first non-null NUL-terminated string pointer
|
||||
* @param b is second non-null NUL-terminated string pointer
|
||||
* @return is <0, 0, or >0 based on uint8_t comparison
|
||||
* @asyncsignalsafe
|
||||
*/
|
||||
int wcsncasecmp(const wchar_t *a, const wchar_t *b, size_t n) {
|
||||
size_t i = 0;
|
||||
unsigned x, y;
|
||||
if (!n-- || a == b)
|
||||
return 0;
|
||||
while ((x = towlower(a[i])) == (y = towlower(b[i])) && b[i] && i < n)
|
||||
++i;
|
||||
return x - y;
|
||||
}
|
|
@ -16,6 +16,7 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/str/kmp.h"
|
||||
#include "libc/str/str.h"
|
||||
|
||||
/**
|
||||
|
@ -28,19 +29,5 @@
|
|||
* @see memmem()
|
||||
*/
|
||||
wchar_t *wcsstr(const wchar_t *haystack, const wchar_t *needle) {
|
||||
size_t i;
|
||||
for (;;) {
|
||||
for (i = 0;;) {
|
||||
if (!needle[i])
|
||||
return (/*unconst*/ wchar_t *)haystack;
|
||||
if (!haystack[i])
|
||||
break;
|
||||
if (needle[i] != haystack[i])
|
||||
break;
|
||||
++i;
|
||||
}
|
||||
if (!*haystack++)
|
||||
break;
|
||||
}
|
||||
return NULL;
|
||||
return __memmem_kmp32(haystack, wcslen(haystack), needle, wcslen(needle));
|
||||
}
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2022 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/wctype.h"
|
||||
|
||||
wctrans_t wctrans(const char *s) {
|
||||
if (!strcmp(s, "toupper"))
|
||||
return (wctrans_t)1;
|
||||
if (!strcmp(s, "tolower"))
|
||||
return (wctrans_t)2;
|
||||
return 0;
|
||||
}
|
|
@ -1,44 +1,61 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│
|
||||
│ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │
|
||||
╚──────────────────────────────────────────────────────────────────────────────╝
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ Musl Libc │
|
||||
│ Copyright © 2005-2014 Rich Felker, et al. │
|
||||
│ │
|
||||
│ Permission is hereby granted, free of charge, to any person obtaining │
|
||||
│ a copy of this software and associated documentation files (the │
|
||||
│ "Software"), to deal in the Software without restriction, including │
|
||||
│ without limitation the rights to use, copy, modify, merge, publish, │
|
||||
│ distribute, sublicense, and/or sell copies of the Software, and to │
|
||||
│ permit persons to whom the Software is furnished to do so, subject to │
|
||||
│ the following conditions: │
|
||||
│ │
|
||||
│ The above copyright notice and this permission notice shall be │
|
||||
│ included in all copies or substantial portions of the Software. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │
|
||||
│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │
|
||||
│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │
|
||||
│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │
|
||||
│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │
|
||||
│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │
|
||||
│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/intrin/likely.h"
|
||||
#include "libc/str/unicode.h"
|
||||
#include "libc/str/wcwidth_osx.internal.h"
|
||||
#include "libc/wctype.h"
|
||||
__static_yoink("musl_libc_notice");
|
||||
// clang-format off
|
||||
|
||||
/**
|
||||
* Returns cell width of monospace character.
|
||||
*/
|
||||
int wcwidth(wchar_t c) {
|
||||
int res;
|
||||
if (LIKELY(32 <= c && c < 127))
|
||||
return 1;
|
||||
if (VERY_UNLIKELY((uint32_t)c >= 0x100000)) {
|
||||
if ((uint32_t)c <= 0x10FFFD)
|
||||
return 1;
|
||||
return -1;
|
||||
}
|
||||
res = _wcwidth_osx(c);
|
||||
if (VERY_UNLIKELY(!res)) {
|
||||
if (!c)
|
||||
return 0;
|
||||
if (iswcntrl(c))
|
||||
return -1;
|
||||
}
|
||||
return res;
|
||||
static const unsigned char table[] = {
|
||||
#include "nonspacing.inc"
|
||||
};
|
||||
|
||||
static const unsigned char wtable[] = {
|
||||
#include "wide.inc"
|
||||
};
|
||||
|
||||
int wcwidth(wchar_t wc)
|
||||
{
|
||||
if (wc < 0xff) {
|
||||
if (wc >= 0)
|
||||
return ((wc+1) & 0x7f) >= 0x21 ? 1 : wc ? -1 : 0;
|
||||
return -1;
|
||||
}
|
||||
if ((wc & 0xfffeffffU) < 0xfffe) {
|
||||
if ((table[table[wc>>8]*32+((wc&255)>>3)]>>(wc&7))&1)
|
||||
return 0;
|
||||
if ((wtable[wtable[wc>>8]*32+((wc&255)>>3)]>>(wc&7))&1)
|
||||
return 2;
|
||||
return 1;
|
||||
}
|
||||
if ((wc & 0xfffe) == 0xfffe)
|
||||
return -1;
|
||||
if (wc-0x20000U < 0x20000)
|
||||
return 2;
|
||||
if (wc == 0xe0001 || wc-0xe0020U < 0x5f || wc-0xe0100U < 0xef)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -1,238 +0,0 @@
|
|||
// Copyright (c) 2012 Byron Lai
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include "libc/macros.h"
|
||||
#include "libc/str/wcwidth_osx.internal.h"
|
||||
|
||||
const uint8_t kWcwidthOsxIndex1[] = {
|
||||
0, 16, 26, 33, 34, 50, 56, 72, 88, 104, 107, 107, 107, 107,
|
||||
115, 127, 143, 143, 143, 143, 143, 156, 160, 164, 178, 178, 178, 178,
|
||||
178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
|
||||
178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
|
||||
178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
|
||||
178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
|
||||
178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
|
||||
178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
|
||||
178, 178, 178, 178, 178, 178, 178, 178, 194, 194, 194, 194, 194, 194,
|
||||
194, 195, 211, 211, 211, 211, 211, 211, 211, 212,
|
||||
};
|
||||
|
||||
const uint16_t kWcwidthOsxIndex2[] = {
|
||||
0, 8, 22, 38, 54, 70, 86, 102, 118, 134, 150, 163, 179, 195, 211,
|
||||
227, 243, 256, 272, 284, 299, 305, 321, 336, 352, 368, 376, 376, 376, 376,
|
||||
376, 376, 379, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393,
|
||||
393, 393, 393, 393, 396, 412, 412, 424, 439, 455, 471, 487, 487, 487, 487,
|
||||
487, 487, 487, 487, 487, 487, 487, 490, 504, 504, 504, 504, 520, 520, 520,
|
||||
520, 520, 520, 520, 520, 520, 520, 520, 520, 529, 544, 559, 575, 591, 607,
|
||||
623, 629, 645, 661, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 680,
|
||||
685, 701, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705,
|
||||
705, 705, 705, 721, 737, 753, 764, 780, 780, 780, 780, 780, 780, 780, 780,
|
||||
796, 801, 801, 801, 801, 801, 801, 801, 817, 817, 817, 817, 817, 817, 817,
|
||||
817, 817, 817, 817, 817, 817, 817, 817, 817, 827, 834, 834, 834, 834, 834,
|
||||
834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 850, 866, 867, 867,
|
||||
867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 883,
|
||||
883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883,
|
||||
884, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900,
|
||||
900, 900, 901,
|
||||
};
|
||||
|
||||
const uint32_t kWcwidthOsxIndex3[] = {
|
||||
0, 32, 32, 33, 64, 96, 96, 96, 96, 96, 96, 96,
|
||||
96, 96, 96, 96, 128, 128, 128, 144, 175, 205, 208, 208,
|
||||
208, 208, 237, 247, 247, 247, 247, 275, 292, 316, 340, 351,
|
||||
381, 402, 428, 457, 478, 510, 527, 527, 537, 564, 582, 600,
|
||||
619, 632, 632, 658, 690, 711, 738, 738, 738, 738, 738, 738,
|
||||
738, 738, 767, 773, 804, 834, 866, 889, 920, 951, 980, 1003,
|
||||
1034, 1065, 1094, 1117, 1148, 1180, 1210, 1233, 1263, 1294, 1323, 1355,
|
||||
1384, 1410, 1441, 1464, 1495, 1527, 1559, 1582, 1611, 1643, 1673, 1696,
|
||||
1727, 1759, 1791, 1817, 1849, 1881, 1912, 1927, 1958, 1986, 2017, 2049,
|
||||
2081, 2111, 2143, 2169, 2195, 2214, 2240, 2252, 2282, 2303, 2335, 2354,
|
||||
2380, 2406, 2412, 2442, 2468, 2484, 2516, 2516, 2522, 2554, 2554, 2554,
|
||||
2554, 2554, 2586, 2586, 2609, 2641, 2664, 2680, 2710, 2734, 2749, 2773,
|
||||
2778, 2810, 2813, 2845, 2845, 2856, 2887, 2888, 2888, 2888, 2888, 2888,
|
||||
2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2897, 2929,
|
||||
2961, 2961, 2976, 3008, 3040, 3072, 3104, 3136, 3148, 3178, 3210, 3242,
|
||||
3274, 3274, 3282, 3314, 3337, 3348, 3348, 3380, 3409, 3441, 3459, 3491,
|
||||
3513, 3535, 3565, 3574, 3606, 3606, 3606, 3606, 3606, 3606, 3606, 3634,
|
||||
3646, 3676, 3697, 3729, 3750, 3776, 3776, 3808, 3816, 3830, 3843, 3875,
|
||||
3875, 3875, 3875, 3907, 3907, 3907, 3907, 3907, 3907, 3939, 3964, 3996,
|
||||
3996, 3996, 3996, 3996, 3996, 3996, 3996, 4006, 4038, 4064, 4095, 4127,
|
||||
4138, 4154, 4183, 4215, 4239, 4254, 4286, 4306, 4338, 4360, 4376, 4408,
|
||||
4408, 4424, 4443, 4466, 4482, 4482, 4482, 4482, 4482, 4482, 4482, 4482,
|
||||
4482, 4505, 4516, 4516, 4516, 4516, 4516, 4540, 4572, 4597, 4629, 4661,
|
||||
4661, 4661, 4661, 4661, 4661, 4661, 4661, 4661, 4661, 4661, 4661, 4661,
|
||||
4663, 4695, 4723, 4727, 4758, 4782, 4802, 4833, 4844, 4868, 4888, 4904,
|
||||
4904, 4904, 4904, 4904, 4904, 4904, 4904, 4904, 4904, 4904, 4904, 4904,
|
||||
4904, 4904, 4904, 4923, 4944, 4944, 4944, 4944, 4944, 4976, 4993, 5009,
|
||||
5024, 5056, 5056, 5056, 5077, 5102, 5128, 5144, 5170, 5202, 5234, 5234,
|
||||
5266, 5281, 5298, 5298, 5330, 5357, 5357, 5369, 5401, 5401, 5401, 5401,
|
||||
5401, 5401, 5411, 5433, 5465, 5487, 5519, 5520, 5529, 5556, 5556, 5556,
|
||||
5588, 5606, 5623, 5623, 5640, 5656, 5664, 5680, 5696, 5728, 5756, 5772,
|
||||
5772, 5772, 5772, 5773, 5805, 5805, 5805, 5805, 5805, 5805, 5805, 5805,
|
||||
5805, 5805, 5805, 5805, 5805, 5805, 5805, 5805, 5815, 5847, 5847, 5847,
|
||||
5847, 5847, 5847, 5847, 5847, 5847, 5847, 5847, 5847, 5847, 5847, 5847,
|
||||
5847, 5851, 5879, 5879, 5911, 5911, 5911, 5911, 5911, 5911, 5911, 5911,
|
||||
5911, 5911, 5911, 5911, 5911, 5911, 5911, 5911, 5930, 5946, 5971, 5978,
|
||||
6010, 6010, 6010, 6010, 6010, 6010, 6010, 6010, 6030, 6062, 6094, 6122,
|
||||
6146, 6146, 6146, 6178, 6178, 6178, 6178, 6197, 6210, 6210, 6215, 6245,
|
||||
6272, 6304, 6312, 6344, 6344, 6371, 6397, 6429, 6429, 6441, 6473, 6473,
|
||||
6473, 6473, 6473, 6505, 6514, 6546, 6578, 6578, 6578, 6578, 6578, 6578,
|
||||
6578, 6578, 6578, 6578, 6578, 6578, 6578, 6610, 6610, 6610, 6610, 6610,
|
||||
6610, 6610, 6610, 6610, 6610, 6610, 6610, 6610, 6610, 6610, 6610, 6638,
|
||||
6642, 6642, 6642, 6642, 6642, 6642, 6642, 6642, 6642, 6642, 6642, 6642,
|
||||
6642, 6642, 6642, 6642, 6674, 6674, 6674, 6674, 6674, 6674, 6674, 6674,
|
||||
6674, 6674, 6674, 6674, 6674, 6674, 6674, 6674, 6690, 6722, 6722, 6722,
|
||||
6722, 6722, 6722, 6722, 6722, 6740, 6756, 6777, 6793, 6793, 6799, 6825,
|
||||
6857, 6888, 6920, 6926, 6926, 6940, 6958, 6977, 6977, 6977, 6977, 6977,
|
||||
6977, 6977, 6977, 6977, 6977, 7009, 7025, 7041, 7059, 7083, 7099, 7129,
|
||||
7157, 7173, 7198, 7220, 7220, 7220, 7223, 7254, 7255, 7255, 7286, 7287,
|
||||
7288, 7319, 7351, 7383, 7388, 7419, 7449, 7481, 7481, 7481, 7486, 7518,
|
||||
7530, 7553, 7553, 7574, 7602, 7618, 7634, 7664, 7664, 7664, 7664, 7696,
|
||||
7728, 7743, 7760, 7792, 7819, 7840, 7851, 7883, 7914, 7942, 7964, 7996,
|
||||
7996, 7996, 7996, 7998, 8018, 8028, 8028, 8028, 8028, 8028, 8028, 8028,
|
||||
8028, 8028, 8028, 8028, 8028, 8028, 8028, 8028, 8028, 8060, 8070, 8102,
|
||||
8102, 8102, 8102, 8102, 8102, 8134, 8166, 8166, 8166, 8166, 8166, 8166,
|
||||
8166, 8198, 8223, 8255, 8280, 8280, 8280, 8280, 8280, 8280, 8280, 8280,
|
||||
8280, 8280, 8280, 8280, 8280, 8280, 8280, 8280, 8312, 8312, 8312, 8312,
|
||||
8312, 8312, 8312, 8312, 8312, 8312, 8312, 8312, 8312, 8312, 8312, 8312,
|
||||
8329, 8344, 8344, 8344, 8344, 8376, 8376, 8376, 8405, 8425, 8425, 8425,
|
||||
8425, 8425, 8425, 8425, 8425, 8425, 8425, 8425, 8425, 8425, 8425, 8425,
|
||||
8425, 8457, 8457, 8457, 8457, 8457, 8457, 8457, 8467, 8499, 8524, 8533,
|
||||
8558, 8587, 8609, 8623, 8653, 8685, 8685, 8715, 8721, 8721, 8721, 8721,
|
||||
8721, 8753, 8753, 8762, 8767, 8785, 8785, 8785, 8785, 8817, 8817, 8828,
|
||||
8850, 8853, 8885, 8914, 8919, 8945, 8975, 9007, 9025, 9025, 9025, 9025,
|
||||
9025, 9051, 9059, 9059, 9059, 9059, 9059, 9059, 9059, 9059, 9079, 9093,
|
||||
9125, 9125, 9125, 9125, 9125, 9125, 9125, 9125, 9125, 9125, 9125, 9125,
|
||||
9125, 9125, 9125, 9125, 9157, 9177, 9193, 9193, 9205, 9225, 9225, 9225,
|
||||
9225, 9225, 9225, 9225, 9225, 9225, 9225, 9225, 9225, 9225, 9225, 9225,
|
||||
9225, 9257, 9257, 9257, 9257, 9257, 9257, 9257, 9257, 9257, 9257, 9257,
|
||||
9257, 9257, 9257, 9257, 9257, 9266, 9289, 9289, 9289, 9289, 9289, 9289,
|
||||
9289, 9289, 9289, 9289, 9289, 9289, 9289, 9289, 9289, 9289, 9321, 9321,
|
||||
9321, 9321, 9321, 9321, 9321, 9321, 9321, 9321, 9321, 9321, 9321, 9321,
|
||||
9321, 9321, 9323, 9353, 9353, 9353, 9353, 9353, 9353, 9353, 9353, 9353,
|
||||
9353, 9353, 9353, 9353, 9353, 9353, 9353, 9385, 9385, 9385, 9385, 9385,
|
||||
9385, 9385, 9385, 9385, 9385, 9385, 9385, 9385, 9385, 9385, 9385, 9387,
|
||||
9419, 9419, 9419, 9419, 9419, 9419, 9419, 9419, 9419, 9419, 9419, 9419,
|
||||
9419, 9419, 9419, 9419, 9421,
|
||||
};
|
||||
|
||||
const uint32_t kWcwidthOsx[] = {
|
||||
0x00000000, 0x00000000, 0x55555555, 0x55555555, 0x00000000, 0x00000000,
|
||||
0x55555555, 0x55555555, 0x00000000, 0x00000000, 0x15505555, 0x54455540,
|
||||
0x15555555, 0x55555555, 0x55555555, 0x55554000, 0x55555555, 0x00001555,
|
||||
0x55555500, 0x54155555, 0x55555555, 0x14555555, 0x00000000, 0x04000000,
|
||||
0x54000041, 0x01555555, 0x00001550, 0x00555550, 0x55505550, 0x55555555,
|
||||
0x00015555, 0x50000000, 0x45555555, 0x55555555, 0x15555555, 0x04140000,
|
||||
0x55555550, 0x55551055, 0x00005555, 0x55550000, 0x55555555, 0x00005555,
|
||||
0x00000040, 0x55555550, 0x55555555, 0x55400005, 0x00000005, 0x00000000,
|
||||
0x55555550, 0x15555555, 0x54000150, 0x55000101, 0x55555055, 0x54000155,
|
||||
0x15554505, 0x55555414, 0x40455545, 0x40015015, 0x40001141, 0x54014500,
|
||||
0x55555555, 0x15544005, 0x55554140, 0x14555455, 0x00140145, 0x00400000,
|
||||
0x40011540, 0x15415555, 0x55440000, 0x55545455, 0x45554555, 0x01501551,
|
||||
0x01014400, 0x05000000, 0x04555550, 0x45000000, 0x54141555, 0x55455555,
|
||||
0x50155145, 0x00505040, 0x51401000, 0x55555505, 0x10000000, 0x54540555,
|
||||
0x50144501, 0x55540540, 0x50140155, 0x40010151, 0x55550000, 0x01555555,
|
||||
0x45555150, 0x55555545, 0x54555551, 0x00550405, 0x40000000, 0x54154001,
|
||||
0x40001555, 0x55141555, 0x55545455, 0x55551555, 0x55405545, 0x00001454,
|
||||
0x01440005, 0x05155554, 0x51400000, 0x55454555, 0x55515555, 0x54055555,
|
||||
0x00545440, 0x40001000, 0x55555415, 0x15550155, 0x55555514, 0x55540555,
|
||||
0x55155555, 0x55541155, 0x00150000, 0x00015554, 0x05400000, 0x55540000,
|
||||
0x55555555, 0x00145555, 0x01555000, 0x55555400, 0x00000005, 0x00000000,
|
||||
0x10450450, 0x55515400, 0x51411151, 0x10000145, 0x00004554, 0x14155554,
|
||||
0x00000000, 0x40000000, 0x55555555, 0x55541555, 0x45555555, 0x55155544,
|
||||
0x55555555, 0x00000015, 0x00550400, 0x00000000, 0x55500000, 0x15551554,
|
||||
0x00000000, 0x40000000, 0x55555555, 0x15555555, 0x55105440, 0x55555555,
|
||||
0x55555055, 0x55555555, 0x55500555, 0x55555555, 0x00055555, 0x55555500,
|
||||
0x55555555, 0xaaaaaa01, 0xaaaaaaaa, 0x000800aa, 0x00000000, 0x55500000,
|
||||
0x55555555, 0x15455555, 0x15445554, 0x55555554, 0x55555555, 0x55550551,
|
||||
0x05515555, 0x50551555, 0x51555555, 0x55555555, 0x45555555, 0x55555415,
|
||||
0x55555555, 0x55500155, 0x55555555, 0x54001555, 0x55555555, 0x01555555,
|
||||
0x55550000, 0x55555555, 0x00005555, 0x55555554, 0x05555555, 0x55555554,
|
||||
0x55555555, 0x00000001, 0x51555555, 0x00000005, 0x55555555, 0x00001405,
|
||||
0x55555555, 0x00000005, 0x51555555, 0x00000001, 0x55555555, 0x55555555,
|
||||
0x55500010, 0x50000014, 0x55501555, 0x55500055, 0x55500055, 0x55510155,
|
||||
0x55500055, 0x55555555, 0x00055555, 0x55555550, 0x55555555, 0x00000045,
|
||||
0x00000000, 0x55555500, 0x55555555, 0x00005501, 0x00055514, 0x55555404,
|
||||
0x55555555, 0x00005541, 0x55555540, 0x55555555, 0x55540015, 0x40015555,
|
||||
0x54015555, 0x55555555, 0x41555555, 0x00000505, 0x00000000, 0x55555000,
|
||||
0x55555555, 0x45440045, 0x55005555, 0x00555555, 0x05555400, 0x55555554,
|
||||
0x55555555, 0x55555501, 0x00000000, 0x00000000, 0x55555555, 0x55555555,
|
||||
0x55555540, 0x55555555, 0x00000015, 0x00000000, 0x55555540, 0x55555555,
|
||||
0x50000015, 0x55555555, 0x00000015, 0x55000000, 0x55555555, 0x50555555,
|
||||
0x55555055, 0x55555555, 0x05550555, 0x44445555, 0x55555555, 0x41555555,
|
||||
0x55555555, 0x15555555, 0x05555555, 0x55554555, 0x54541555, 0x55554555,
|
||||
0x55554005, 0x50001555, 0x55555555, 0x05555555, 0x50000010, 0x55555550,
|
||||
0x00001551, 0x55555550, 0x00005555, 0x00000000, 0x00010000, 0x55550000,
|
||||
0x55555555, 0x55405555, 0x55555555, 0x00155555, 0x55555550, 0x55555555,
|
||||
0x555555a5, 0x55555555, 0x00000055, 0x55000000, 0x55555555, 0x00555555,
|
||||
0x00000000, 0x55555400, 0x00000000, 0x55555400, 0x55555555, 0x55554155,
|
||||
0x55555555, 0x00001555, 0x00000000, 0x55154000, 0x55555550, 0x55554555,
|
||||
0x45555555, 0x55510154, 0x55555551, 0x55555555, 0x55555501, 0x55555455,
|
||||
0x55550115, 0x55555555, 0x55405555, 0x00000000, 0x00000000, 0x55555555,
|
||||
0x55555555, 0x55555554, 0x55555555, 0x05555554, 0x55555555, 0x55555555,
|
||||
0x50000000, 0x55555555, 0x05555555, 0x55550000, 0x55555555, 0x00005555,
|
||||
0x00000004, 0x55555550, 0x00015555, 0x55515550, 0x55515551, 0x55555551,
|
||||
0x55555555, 0x00000005, 0x00000000, 0xaaaaaaa0, 0xa8aaaaaa, 0xaaaaaaaa,
|
||||
0x02aaaaaa, 0xaaa80000, 0xaaaaaaaa, 0x0002aaaa, 0xaaa80000, 0xaaa802aa,
|
||||
0xaaaaaaaa, 0x8002aaaa, 0x1aaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaa00,
|
||||
0xaaaaaaaa, 0xaaa800aa, 0xaaaaaaaa, 0xaaaa80aa, 0xaaaaaaaa, 0xaaaa2aaa,
|
||||
0xaaaaaaaa, 0x00000000, 0xaaaaaaaa, 0x2aaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa,
|
||||
0xaa000000, 0xaaaaaaaa, 0xa8aaaaaa, 0xaaaaaaaa, 0x02aaaaaa, 0xaaaa8000,
|
||||
0xaaaaaaaa, 0x00002aaa, 0x00000000, 0xaaaa8000, 0xaaaaaaaa, 0xaaa02aaa,
|
||||
0xaaaaaaaa, 0x000aaaaa, 0x00000000, 0x55500000, 0x55555555, 0x00055555,
|
||||
0x50000000, 0x55555555, 0x05555555, 0x55555555, 0x55500005, 0x55555555,
|
||||
0x00000005, 0x00000000, 0x55555550, 0x55555555, 0x00000005, 0x00000000,
|
||||
0x55151550, 0x55555554, 0x00554155, 0x00000000, 0x55555555, 0x55555555,
|
||||
0x55550000, 0x55555555, 0x00005555, 0x01555554, 0x00000000, 0x54000000,
|
||||
0x55555555, 0x01555555, 0x00010000, 0x00000000, 0x55540000, 0x55555555,
|
||||
0x00015555, 0x55555550, 0x50555550, 0x00000005, 0x00000000, 0xaaaaaaa0,
|
||||
0xaaaaaaaa, 0x0000000a, 0x00000000, 0x55555550, 0x55555555, 0x00000005,
|
||||
0xaaaaaaa0, 0xaaaaaaaa, 0xaaaaaa0a, 0xaaaaaaaa, 0xaaa800aa, 0xaaaaaaaa,
|
||||
0x0002aaaa, 0x00000000, 0x55540000, 0x55000000, 0x55551001, 0x15555555,
|
||||
0x51451155, 0x55555555, 0x05555555, 0x00000000, 0x55555554, 0x55555555,
|
||||
0x00000001, 0x55555554, 0x55555555, 0x55555541, 0x55555555, 0x00000015,
|
||||
0x55400000, 0x00015555, 0xaaa80000, 0x0054002a, 0xaaaaa800, 0xaaa8aaaa,
|
||||
0x500aa2aa, 0x55555515, 0x55555555, 0xaaaa8055, 0xaaaaaaaa, 0x55556aaa,
|
||||
0x55555555, 0x15541555, 0x15541554, 0x4aaa8054, 0x00000555, 0x55554140,
|
||||
0x55555515, 0x55451555, 0x55415555, 0x00015555, 0x00000000, 0x55540000,
|
||||
0x55555555, 0x50015555, 0x55555401, 0x05555555, 0x55555554, 0x55555555,
|
||||
0x55555001, 0x00000005, 0x00000000, 0x55555550, 0x55555555, 0x00000000,
|
||||
0x00000000, 0x55555555, 0x01555555, 0x55555555, 0x55555555, 0x00000000,
|
||||
0x00000000, 0x55555555, 0x15555555, 0x55400000, 0x00155555, 0x00000000,
|
||||
0x55400000, 0x55555555, 0x55515555, 0x55555555, 0x50055555, 0x00555555,
|
||||
0x00000000, 0x55000000, 0x55555555, 0x00555555, 0x00000000, 0x55000000,
|
||||
0x55555105, 0x14555555, 0x00000410, 0x00000000, 0x55555000, 0x55555555,
|
||||
0x00000400, 0x00000000, 0x00001000, 0x45455000, 0x55555555, 0x40000015,
|
||||
0x40001555, 0x00005555, 0x00000000, 0x55550000, 0x55555555, 0x00005555,
|
||||
0x00000000, 0x55550000, 0x55555555, 0x00005555, 0x00015400, 0x00000000,
|
||||
0x55540000, 0x55555555, 0x00015555, 0x55555540, 0x55555555, 0x55555415,
|
||||
0x55555555, 0x55550155, 0x50000001, 0x55554000, 0x40155555, 0x55555555,
|
||||
0x01555555, 0x00000000, 0x54000000, 0x55555555, 0x01555555, 0x00000001,
|
||||
0x00000000, 0x55555554, 0x55555555, 0x00000001, 0x00000000, 0x55555554,
|
||||
0x55555555, 0x55555551, 0x55555555, 0x50504145, 0x15555545, 0x55554551,
|
||||
0x55555555, 0x50551555, 0x45554555, 0x55555555, 0x45515555, 0x55540455,
|
||||
0x55555554, 0x55555555, 0x55555541, 0x55555555, 0x55555415, 0x55555555,
|
||||
0x00000155, 0x00000000, 0x55555400, 0x55555555, 0x55540155, 0x55555555,
|
||||
0x00015555, 0x00000000, 0xaaa80000, 0xaaaaaaaa, 0x0002aaaa, 0x00000000,
|
||||
0xaaa80000, 0xaaaaaaaa, 0x0002aaaa, 0x00000000, 0x55540000, 0x55555555,
|
||||
0x55415555, 0x55555555, 0x00155555,
|
||||
};
|
|
@ -1,20 +0,0 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_STR_WCWIDTH_OSX_H_
|
||||
#define COSMOPOLITAN_LIBC_STR_WCWIDTH_OSX_H_
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
extern const uint32_t kWcwidthOsx[591];
|
||||
extern const uint8_t kWcwidthOsxIndex1[136];
|
||||
extern const uint16_t kWcwidthOsxIndex2[228];
|
||||
extern const uint32_t kWcwidthOsxIndex3[917];
|
||||
|
||||
static inline int _wcwidth_osx(uint32_t codePoint) {
|
||||
uint32_t a, b, c, d;
|
||||
a = kWcwidthOsxIndex1[codePoint >> 13];
|
||||
b = kWcwidthOsxIndex2[a + ((codePoint >> 9) & 0xf)];
|
||||
c = kWcwidthOsxIndex3[b + ((codePoint >> 5) & 0xf)];
|
||||
d = c + (codePoint & 0x1f);
|
||||
return (kWcwidthOsx[d >> 4] >> ((d & 0xf) << 1)) & 3;
|
||||
}
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* COSMOPOLITAN_LIBC_STR_WCWIDTH_OSX_H_ */
|
65
libc/str/wide.inc
Normal file
65
libc/str/wide.inc
Normal file
|
@ -0,0 +1,65 @@
|
|||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,18,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,19,16,20,21,22,16,16,16,23,16,16,24,25,26,27,28,17,
|
||||
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,29,
|
||||
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
||||
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
||||
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
||||
17,17,17,17,17,17,17,17,30,16,16,16,16,31,16,16,17,17,17,17,17,17,17,17,17,17,
|
||||
17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
||||
17,17,17,17,17,17,17,32,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,16,16,16,33,
|
||||
34,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,35,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
|
||||
17,17,17,17,17,17,36,17,17,37,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,38,39,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
|
||||
16,16,16,16,16,16,16,40,41,42,43,44,45,46,47,16,48,49,16,16,16,16,
|
||||
16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,6,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,48,0,0,0,0,0,0,255,15,0,0,0,0,128,0,0,8,
|
||||
0,2,12,0,96,48,64,16,0,0,4,44,36,32,12,0,0,0,1,0,0,0,80,184,0,0,0,0,0,0,0,224,
|
||||
0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,251,255,255,255,255,255,255,255,
|
||||
255,255,255,15,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,255,15,255,255,255,255,
|
||||
255,255,255,127,254,255,255,255,255,255,255,255,255,255,127,254,255,255,255,
|
||||
255,255,255,255,255,255,255,255,255,224,255,255,255,255,255,254,255,255,255,
|
||||
255,255,255,255,255,255,255,127,255,255,255,255,255,7,255,255,255,255,15,0,
|
||||
255,255,255,255,255,127,255,255,255,255,255,0,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,
|
||||
0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,31,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
|
||||
255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,255,3,0,0,255,255,255,255,247,255,127,15,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,255,255,255,255,255,255,
|
||||
255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,7,0,255,255,255,127,0,0,0,0,0,
|
||||
0,7,0,240,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,64,254,7,0,0,0,0,0,0,0,0,0,0,0,0,7,0,255,255,255,
|
||||
255,255,15,255,1,3,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,
|
||||
1,224,191,255,255,255,255,255,255,255,255,223,255,255,15,0,255,255,255,255,
|
||||
255,135,15,0,255,255,17,255,255,255,255,255,255,255,255,127,253,255,255,255,
|
||||
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||
159,255,255,255,255,255,255,255,63,0,120,255,255,255,0,0,4,0,0,96,0,16,0,0,0,
|
||||
0,0,0,0,0,0,0,248,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,255,255,
|
||||
255,255,255,255,255,255,63,16,39,0,0,24,240,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,255,15,0,
|
||||
0,0,224,255,255,255,255,255,255,255,255,255,255,255,255,123,252,255,255,255,
|
||||
255,231,199,255,255,255,231,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,15,7,7,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
@ -112,8 +112,9 @@ LIBC_TESTLIB_A_DIRECTDEPS = \
|
|||
THIRD_PARTY_COMPILER_RT \
|
||||
THIRD_PARTY_DLMALLOC \
|
||||
THIRD_PARTY_GDTOA \
|
||||
THIRD_PARTY_MUSL \
|
||||
THIRD_PARTY_TZ \
|
||||
THIRD_PARTY_XED \
|
||||
THIRD_PARTY_TZ
|
||||
|
||||
LIBC_TESTLIB_A_DEPS := \
|
||||
$(call uniq,$(foreach x,$(LIBC_TESTLIB_A_DIRECTDEPS),$($(x))))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue