/* wcwidth - Unicode 17.0.0 * Copyright (C) 2025 Avi Halachmi * License: MIT * * Generated by mkwcwidth on 2025-12-25 using the Unicode files * UnicodeData.txt and EastAsianWidth.txt (2025-07-24, 00:12:54 GMT) */ int FAST_FUNC wcwidth(unsigned ucs) { /* sorted ranges, "first" is clipped to 16 bit, and its high bits * (plane) are deduced from the "planes" array below. */ static const struct range { /* bitfield order empirically fast */ unsigned short first: 16; unsigned short iswide: 1; unsigned short delta: 15; } ranges[] = { #define R(first, last, width) {first & 0xffff, width/2, last-first} R(0x000300, 0x00036f, 0), R(0x000483, 0x000489, 0), R(0x000591, 0x0005bd, 0), R(0x0005bf, 0x0005bf, 0), R(0x0005c1, 0x0005c2, 0), R(0x0005c4, 0x0005c5, 0), R(0x0005c7, 0x0005c7, 0), R(0x000600, 0x000605, 0), R(0x000610, 0x00061a, 0), R(0x00061c, 0x00061c, 0), R(0x00064b, 0x00065f, 0), R(0x000670, 0x000670, 0), R(0x0006d6, 0x0006dd, 0), R(0x0006df, 0x0006e4, 0), R(0x0006e7, 0x0006e8, 0), R(0x0006ea, 0x0006ed, 0), R(0x00070f, 0x00070f, 0), R(0x000711, 0x000711, 0), R(0x000730, 0x00074a, 0), R(0x0007a6, 0x0007b0, 0), R(0x0007eb, 0x0007f3, 0), R(0x0007fd, 0x0007fd, 0), R(0x000816, 0x000819, 0), R(0x00081b, 0x000823, 0), R(0x000825, 0x000827, 0), R(0x000829, 0x00082d, 0), R(0x000859, 0x00085b, 0), R(0x000890, 0x000891, 0), R(0x000897, 0x00089f, 0), R(0x0008ca, 0x000903, 0), R(0x00093a, 0x00093c, 0), R(0x00093e, 0x00094f, 0), R(0x000951, 0x000957, 0), R(0x000962, 0x000963, 0), R(0x000981, 0x000983, 0), R(0x0009bc, 0x0009bc, 0), R(0x0009be, 0x0009c4, 0), R(0x0009c7, 0x0009c8, 0), R(0x0009cb, 0x0009cd, 0), R(0x0009d7, 0x0009d7, 0), R(0x0009e2, 0x0009e3, 0), R(0x0009fe, 0x0009fe, 0), R(0x000a01, 0x000a03, 0), R(0x000a3c, 0x000a3c, 0), R(0x000a3e, 0x000a42, 0), R(0x000a47, 0x000a48, 0), R(0x000a4b, 0x000a4d, 0), R(0x000a51, 0x000a51, 0), R(0x000a70, 0x000a71, 0), R(0x000a75, 0x000a75, 0), R(0x000a81, 0x000a83, 0), R(0x000abc, 0x000abc, 0), R(0x000abe, 0x000ac5, 0), R(0x000ac7, 0x000ac9, 0), R(0x000acb, 0x000acd, 0), R(0x000ae2, 0x000ae3, 0), R(0x000afa, 0x000aff, 0), R(0x000b01, 0x000b03, 0), R(0x000b3c, 0x000b3c, 0), R(0x000b3e, 0x000b44, 0), R(0x000b47, 0x000b48, 0), R(0x000b4b, 0x000b4d, 0), R(0x000b55, 0x000b57, 0), R(0x000b62, 0x000b63, 0), R(0x000b82, 0x000b82, 0), R(0x000bbe, 0x000bc2, 0), R(0x000bc6, 0x000bc8, 0), R(0x000bca, 0x000bcd, 0), R(0x000bd7, 0x000bd7, 0), R(0x000c00, 0x000c04, 0), R(0x000c3c, 0x000c3c, 0), R(0x000c3e, 0x000c44, 0), R(0x000c46, 0x000c48, 0), R(0x000c4a, 0x000c4d, 0), R(0x000c55, 0x000c56, 0), R(0x000c62, 0x000c63, 0), R(0x000c81, 0x000c83, 0), R(0x000cbc, 0x000cbc, 0), R(0x000cbe, 0x000cc4, 0), R(0x000cc6, 0x000cc8, 0), R(0x000cca, 0x000ccd, 0), R(0x000cd5, 0x000cd6, 0), R(0x000ce2, 0x000ce3, 0), R(0x000cf3, 0x000cf3, 0), R(0x000d00, 0x000d03, 0), R(0x000d3b, 0x000d3c, 0), R(0x000d3e, 0x000d44, 0), R(0x000d46, 0x000d48, 0), R(0x000d4a, 0x000d4d, 0), R(0x000d57, 0x000d57, 0), R(0x000d62, 0x000d63, 0), R(0x000d81, 0x000d83, 0), R(0x000dca, 0x000dca, 0), R(0x000dcf, 0x000dd4, 0), R(0x000dd6, 0x000dd6, 0), R(0x000dd8, 0x000ddf, 0), R(0x000df2, 0x000df3, 0), R(0x000e31, 0x000e31, 0), R(0x000e34, 0x000e3a, 0), R(0x000e47, 0x000e4e, 0), R(0x000eb1, 0x000eb1, 0), R(0x000eb4, 0x000ebc, 0), R(0x000ec8, 0x000ece, 0), R(0x000f18, 0x000f19, 0), R(0x000f35, 0x000f35, 0), R(0x000f37, 0x000f37, 0), R(0x000f39, 0x000f39, 0), R(0x000f3e, 0x000f3f, 0), R(0x000f71, 0x000f84, 0), R(0x000f86, 0x000f87, 0), R(0x000f8d, 0x000f97, 0), R(0x000f99, 0x000fbc, 0), R(0x000fc6, 0x000fc6, 0), R(0x00102b, 0x00103e, 0), R(0x001056, 0x001059, 0), R(0x00105e, 0x001060, 0), R(0x001062, 0x001064, 0), R(0x001067, 0x00106d, 0), R(0x001071, 0x001074, 0), R(0x001082, 0x00108d, 0), R(0x00108f, 0x00108f, 0), R(0x00109a, 0x00109d, 0), R(0x001100, 0x00115f, 2), R(0x001160, 0x0011ff, 0), R(0x00135d, 0x00135f, 0), R(0x001712, 0x001715, 0), R(0x001732, 0x001734, 0), R(0x001752, 0x001753, 0), R(0x001772, 0x001773, 0), R(0x0017b4, 0x0017d3, 0), R(0x0017dd, 0x0017dd, 0), R(0x00180b, 0x00180f, 0), R(0x001885, 0x001886, 0), R(0x0018a9, 0x0018a9, 0), R(0x001920, 0x00192b, 0), R(0x001930, 0x00193b, 0), R(0x001a17, 0x001a1b, 0), R(0x001a55, 0x001a5e, 0), R(0x001a60, 0x001a7c, 0), R(0x001a7f, 0x001a7f, 0), R(0x001ab0, 0x001add, 0), R(0x001ae0, 0x001aeb, 0), R(0x001b00, 0x001b04, 0), R(0x001b34, 0x001b44, 0), R(0x001b6b, 0x001b73, 0), R(0x001b80, 0x001b82, 0), R(0x001ba1, 0x001bad, 0), R(0x001be6, 0x001bf3, 0), R(0x001c24, 0x001c37, 0), R(0x001cd0, 0x001cd2, 0), R(0x001cd4, 0x001ce8, 0), R(0x001ced, 0x001ced, 0), R(0x001cf4, 0x001cf4, 0), R(0x001cf7, 0x001cf9, 0), R(0x001dc0, 0x001dff, 0), R(0x00200b, 0x00200f, 0), R(0x00202a, 0x00202e, 0), R(0x002060, 0x002064, 0), R(0x002066, 0x00206f, 0), R(0x0020d0, 0x0020f0, 0), R(0x00231a, 0x00231b, 2), R(0x002329, 0x00232a, 2), R(0x0023e9, 0x0023ec, 2), R(0x0023f0, 0x0023f0, 2), R(0x0023f3, 0x0023f3, 2), R(0x0025fd, 0x0025fe, 2), R(0x002614, 0x002615, 2), R(0x002630, 0x002637, 2), R(0x002648, 0x002653, 2), R(0x00267f, 0x00267f, 2), R(0x00268a, 0x00268f, 2), R(0x002693, 0x002693, 2), R(0x0026a1, 0x0026a1, 2), R(0x0026aa, 0x0026ab, 2), R(0x0026bd, 0x0026be, 2), R(0x0026c4, 0x0026c5, 2), R(0x0026ce, 0x0026ce, 2), R(0x0026d4, 0x0026d4, 2), R(0x0026ea, 0x0026ea, 2), R(0x0026f2, 0x0026f3, 2), R(0x0026f5, 0x0026f5, 2), R(0x0026fa, 0x0026fa, 2), R(0x0026fd, 0x0026fd, 2), R(0x002705, 0x002705, 2), R(0x00270a, 0x00270b, 2), R(0x002728, 0x002728, 2), R(0x00274c, 0x00274c, 2), R(0x00274e, 0x00274e, 2), R(0x002753, 0x002755, 2), R(0x002757, 0x002757, 2), R(0x002795, 0x002797, 2), R(0x0027b0, 0x0027b0, 2), R(0x0027bf, 0x0027bf, 2), R(0x002b1b, 0x002b1c, 2), R(0x002b50, 0x002b50, 2), R(0x002b55, 0x002b55, 2), R(0x002cef, 0x002cf1, 0), R(0x002d7f, 0x002d7f, 0), R(0x002de0, 0x002dff, 0), R(0x002e80, 0x002e99, 2), R(0x002e9b, 0x002ef3, 2), R(0x002f00, 0x002fd5, 2), R(0x002ff0, 0x003029, 2), R(0x00302a, 0x00302f, 0), R(0x003030, 0x00303e, 2), R(0x003041, 0x003096, 2), R(0x003099, 0x00309a, 0), R(0x00309b, 0x0030ff, 2), R(0x003105, 0x00312f, 2), R(0x003131, 0x00318e, 2), R(0x003190, 0x0031e5, 2), R(0x0031ef, 0x00321e, 2), R(0x003220, 0x003247, 2), R(0x003250, 0x00a48c, 2), R(0x00a490, 0x00a4c6, 2), R(0x00a66f, 0x00a672, 0), R(0x00a674, 0x00a67d, 0), R(0x00a69e, 0x00a69f, 0), R(0x00a6f0, 0x00a6f1, 0), R(0x00a802, 0x00a802, 0), R(0x00a806, 0x00a806, 0), R(0x00a80b, 0x00a80b, 0), R(0x00a823, 0x00a827, 0), R(0x00a82c, 0x00a82c, 0), R(0x00a880, 0x00a881, 0), R(0x00a8b4, 0x00a8c5, 0), R(0x00a8e0, 0x00a8f1, 0), R(0x00a8ff, 0x00a8ff, 0), R(0x00a926, 0x00a92d, 0), R(0x00a947, 0x00a953, 0), R(0x00a960, 0x00a97c, 2), R(0x00a980, 0x00a983, 0), R(0x00a9b3, 0x00a9c0, 0), R(0x00a9e5, 0x00a9e5, 0), R(0x00aa29, 0x00aa36, 0), R(0x00aa43, 0x00aa43, 0), R(0x00aa4c, 0x00aa4d, 0), R(0x00aa7b, 0x00aa7d, 0), R(0x00aab0, 0x00aab0, 0), R(0x00aab2, 0x00aab4, 0), R(0x00aab7, 0x00aab8, 0), R(0x00aabe, 0x00aabf, 0), R(0x00aac1, 0x00aac1, 0), R(0x00aaeb, 0x00aaef, 0), R(0x00aaf5, 0x00aaf6, 0), R(0x00abe3, 0x00abea, 0), R(0x00abec, 0x00abed, 0), R(0x00ac00, 0x00d7a3, 2), R(0x00d7b0, 0x00d7c6, 0), R(0x00d7cb, 0x00d7fb, 0), R(0x00f900, 0x00faff, 2), R(0x00fb1e, 0x00fb1e, 0), R(0x00fe00, 0x00fe0f, 0), R(0x00fe10, 0x00fe19, 2), R(0x00fe20, 0x00fe2f, 0), R(0x00fe30, 0x00fe52, 2), R(0x00fe54, 0x00fe66, 2), R(0x00fe68, 0x00fe6b, 2), R(0x00feff, 0x00feff, 0), R(0x00ff01, 0x00ff60, 2), R(0x00ffe0, 0x00ffe6, 2), R(0x00fff9, 0x00fffb, 0), R(0x0101fd, 0x0101fd, 0), R(0x0102e0, 0x0102e0, 0), R(0x010376, 0x01037a, 0), R(0x010a01, 0x010a03, 0), R(0x010a05, 0x010a06, 0), R(0x010a0c, 0x010a0f, 0), R(0x010a38, 0x010a3a, 0), R(0x010a3f, 0x010a3f, 0), R(0x010ae5, 0x010ae6, 0), R(0x010d24, 0x010d27, 0), R(0x010d69, 0x010d6d, 0), R(0x010eab, 0x010eac, 0), R(0x010efa, 0x010eff, 0), R(0x010f46, 0x010f50, 0), R(0x010f82, 0x010f85, 0), R(0x011000, 0x011002, 0), R(0x011038, 0x011046, 0), R(0x011070, 0x011070, 0), R(0x011073, 0x011074, 0), R(0x01107f, 0x011082, 0), R(0x0110b0, 0x0110ba, 0), R(0x0110bd, 0x0110bd, 0), R(0x0110c2, 0x0110c2, 0), R(0x0110cd, 0x0110cd, 0), R(0x011100, 0x011102, 0), R(0x011127, 0x011134, 0), R(0x011145, 0x011146, 0), R(0x011173, 0x011173, 0), R(0x011180, 0x011182, 0), R(0x0111b3, 0x0111c0, 0), R(0x0111c9, 0x0111cc, 0), R(0x0111ce, 0x0111cf, 0), R(0x01122c, 0x011237, 0), R(0x01123e, 0x01123e, 0), R(0x011241, 0x011241, 0), R(0x0112df, 0x0112ea, 0), R(0x011300, 0x011303, 0), R(0x01133b, 0x01133c, 0), R(0x01133e, 0x011344, 0), R(0x011347, 0x011348, 0), R(0x01134b, 0x01134d, 0), R(0x011357, 0x011357, 0), R(0x011362, 0x011363, 0), R(0x011366, 0x01136c, 0), R(0x011370, 0x011374, 0), R(0x0113b8, 0x0113c0, 0), R(0x0113c2, 0x0113c2, 0), R(0x0113c5, 0x0113c5, 0), R(0x0113c7, 0x0113ca, 0), R(0x0113cc, 0x0113d0, 0), R(0x0113d2, 0x0113d2, 0), R(0x0113e1, 0x0113e2, 0), R(0x011435, 0x011446, 0), R(0x01145e, 0x01145e, 0), R(0x0114b0, 0x0114c3, 0), R(0x0115af, 0x0115b5, 0), R(0x0115b8, 0x0115c0, 0), R(0x0115dc, 0x0115dd, 0), R(0x011630, 0x011640, 0), R(0x0116ab, 0x0116b7, 0), R(0x01171d, 0x01172b, 0), R(0x01182c, 0x01183a, 0), R(0x011930, 0x011935, 0), R(0x011937, 0x011938, 0), R(0x01193b, 0x01193e, 0), R(0x011940, 0x011940, 0), R(0x011942, 0x011943, 0), R(0x0119d1, 0x0119d7, 0), R(0x0119da, 0x0119e0, 0), R(0x0119e4, 0x0119e4, 0), R(0x011a01, 0x011a0a, 0), R(0x011a33, 0x011a39, 0), R(0x011a3b, 0x011a3e, 0), R(0x011a47, 0x011a47, 0), R(0x011a51, 0x011a5b, 0), R(0x011a8a, 0x011a99, 0), R(0x011b60, 0x011b67, 0), R(0x011c2f, 0x011c36, 0), R(0x011c38, 0x011c3f, 0), R(0x011c92, 0x011ca7, 0), R(0x011ca9, 0x011cb6, 0), R(0x011d31, 0x011d36, 0), R(0x011d3a, 0x011d3a, 0), R(0x011d3c, 0x011d3d, 0), R(0x011d3f, 0x011d45, 0), R(0x011d47, 0x011d47, 0), R(0x011d8a, 0x011d8e, 0), R(0x011d90, 0x011d91, 0), R(0x011d93, 0x011d97, 0), R(0x011ef3, 0x011ef6, 0), R(0x011f00, 0x011f01, 0), R(0x011f03, 0x011f03, 0), R(0x011f34, 0x011f3a, 0), R(0x011f3e, 0x011f42, 0), R(0x011f5a, 0x011f5a, 0), R(0x013430, 0x013440, 0), R(0x013447, 0x013455, 0), R(0x01611e, 0x01612f, 0), R(0x016af0, 0x016af4, 0), R(0x016b30, 0x016b36, 0), R(0x016f4f, 0x016f4f, 0), R(0x016f51, 0x016f87, 0), R(0x016f8f, 0x016f92, 0), R(0x016fe0, 0x016fe3, 2), R(0x016fe4, 0x016fe4, 0), R(0x016ff0, 0x016ff1, 0), R(0x016ff2, 0x016ff6, 2), R(0x017000, 0x018cd5, 2), R(0x018cff, 0x018d1e, 2), R(0x018d80, 0x018df2, 2), R(0x01aff0, 0x01aff3, 2), R(0x01aff5, 0x01affb, 2), R(0x01affd, 0x01affe, 2), R(0x01b000, 0x01b122, 2), R(0x01b132, 0x01b132, 2), R(0x01b150, 0x01b152, 2), R(0x01b155, 0x01b155, 2), R(0x01b164, 0x01b167, 2), R(0x01b170, 0x01b2fb, 2), R(0x01bc9d, 0x01bc9e, 0), R(0x01bca0, 0x01bca3, 0), R(0x01cf00, 0x01cf2d, 0), R(0x01cf30, 0x01cf46, 0), R(0x01d165, 0x01d169, 0), R(0x01d16d, 0x01d182, 0), R(0x01d185, 0x01d18b, 0), R(0x01d1aa, 0x01d1ad, 0), R(0x01d242, 0x01d244, 0), R(0x01d300, 0x01d356, 2), R(0x01d360, 0x01d376, 2), R(0x01da00, 0x01da36, 0), R(0x01da3b, 0x01da6c, 0), R(0x01da75, 0x01da75, 0), R(0x01da84, 0x01da84, 0), R(0x01da9b, 0x01da9f, 0), R(0x01daa1, 0x01daaf, 0), R(0x01e000, 0x01e006, 0), R(0x01e008, 0x01e018, 0), R(0x01e01b, 0x01e021, 0), R(0x01e023, 0x01e024, 0), R(0x01e026, 0x01e02a, 0), R(0x01e08f, 0x01e08f, 0), R(0x01e130, 0x01e136, 0), R(0x01e2ae, 0x01e2ae, 0), R(0x01e2ec, 0x01e2ef, 0), R(0x01e4ec, 0x01e4ef, 0), R(0x01e5ee, 0x01e5ef, 0), R(0x01e6e3, 0x01e6e3, 0), R(0x01e6e6, 0x01e6e6, 0), R(0x01e6ee, 0x01e6ef, 0), R(0x01e6f5, 0x01e6f5, 0), R(0x01e8d0, 0x01e8d6, 0), R(0x01e944, 0x01e94a, 0), R(0x01f004, 0x01f004, 2), R(0x01f0cf, 0x01f0cf, 2), R(0x01f18e, 0x01f18e, 2), R(0x01f191, 0x01f19a, 2), R(0x01f200, 0x01f202, 2), R(0x01f210, 0x01f23b, 2), R(0x01f240, 0x01f248, 2), R(0x01f250, 0x01f251, 2), R(0x01f260, 0x01f265, 2), R(0x01f300, 0x01f320, 2), R(0x01f32d, 0x01f335, 2), R(0x01f337, 0x01f37c, 2), R(0x01f37e, 0x01f393, 2), R(0x01f3a0, 0x01f3ca, 2), R(0x01f3cf, 0x01f3d3, 2), R(0x01f3e0, 0x01f3f0, 2), R(0x01f3f4, 0x01f3f4, 2), R(0x01f3f8, 0x01f3fa, 2), R(0x01f3fb, 0x01f3ff, 0), R(0x01f400, 0x01f43e, 2), R(0x01f440, 0x01f440, 2), R(0x01f442, 0x01f4fc, 2), R(0x01f4ff, 0x01f53d, 2), R(0x01f54b, 0x01f54e, 2), R(0x01f550, 0x01f567, 2), R(0x01f57a, 0x01f57a, 2), R(0x01f595, 0x01f596, 2), R(0x01f5a4, 0x01f5a4, 2), R(0x01f5fb, 0x01f64f, 2), R(0x01f680, 0x01f6c5, 2), R(0x01f6cc, 0x01f6cc, 2), R(0x01f6d0, 0x01f6d2, 2), R(0x01f6d5, 0x01f6d8, 2), R(0x01f6dc, 0x01f6df, 2), R(0x01f6eb, 0x01f6ec, 2), R(0x01f6f4, 0x01f6fc, 2), R(0x01f7e0, 0x01f7eb, 2), R(0x01f7f0, 0x01f7f0, 2), R(0x01f90c, 0x01f93a, 2), R(0x01f93c, 0x01f945, 2), R(0x01f947, 0x01f9ff, 2), R(0x01fa70, 0x01fa7c, 2), R(0x01fa80, 0x01fa8a, 2), R(0x01fa8e, 0x01fac6, 2), R(0x01fac8, 0x01fac8, 2), R(0x01facd, 0x01fadc, 2), R(0x01fadf, 0x01faea, 2), R(0x01faef, 0x01faf8, 2), R(0x020000, 0x027fff, 2), R(0x028000, 0x02fffd, 2), R(0x030000, 0x037fff, 2), R(0x038000, 0x03fffd, 2), R(0x0e0001, 0x0e0001, 0), R(0x0e0020, 0x0e007f, 0), R(0x0e0100, 0x0e01ef, 0), #undef R }; /* planes[p], planes[p+1] are [from, to) at "ranges" for plane p */ static const unsigned short planes[18] = { 0, 262, 463, 465, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 470 }; /******* END OF STATIC DATA *******/ unsigned p, bot, top; /* 0:0, 1..31:-1 (C0), 32..126:1 (isprint), 127..159:-1 (DEL, C1) */ if (ucs < 160) return ((ucs + 1) & 127) > 32 ? 1 : ucs ? -1 : 0; /* out of range for "planes" (and non-unicode), non-characters. */ /* (some also test surrogate halves, but not required by POSIX) */ if (ucs > 0x10ffff || (ucs & 0xfffe) == 0xfffe) return -1; p = ucs >> 16; ucs &= 0xffff; for (bot = planes[p], top = planes[p+1]; bot < top; ) { unsigned mid = (bot + top) / 2; if (ucs < ranges[mid].first) top = mid; else if (ucs > ranges[mid].first + ranges[mid].delta) bot = mid + 1; else return 2 * ranges[mid].iswide; } return 1; } /* wcwidth - Unicode 17.0.0 */