/*-*-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);