Files
zeekay a4debdba80 Read a .zap schema the way every other ZAP language reads it
C had no front end for the schema language at all. The compiler directory
holds a code generator plugin, which is handed a request by another tool
and never sees schema text, so a .zap file could not be read here in
either form -- indentation or braces.

zapgen reads it. Whitespace-significant source is rewritten into the brace
form BEFORE the parser, exactly as the Go reference does it: a near
identity that only adds the two tokens the brace grammar requires where
the indented form leaves them out. A file already in braces comes back
byte for byte, so one grammar reads both styles and neither is a dialect
of the other.

The identifier grammar is not restated. Its Unicode ranges are taken from
Go's own tables by gen/table, so a name this parser accepts is a name the
Go parser accepts, and a Go release that moves Unicode moves both.

The generated header gives each struct a view over the message bytes and
one reader per field at a fixed offset. Reading is in place and total: a
field past the end reads zero, a pointer into the head or out of the
message reads null. zap_view.h is the one place that says so.

Checked against the Go front end on every .zap in the estate plus 55
adversarial cases and 15000 random ones: the brace form each writes is
byte-identical, the layout each reads is field-for-field the same, and
they accept and refuse the same files for the same stated reason. A
message built by the Go runtime reads back through these bindings with
every field equal.
2026-09-15 11:32:12 -07:00

787 lines
18 KiB
C

// SPDX-License-Identifier: BSD-3-Clause-Eco
//
// Generated by gen/table from Go's unicode tables (Unicode 15.0.0).
// DO NOT EDIT. Run: go run ./table > ../rune.c
#include "rune.h"
static const struct span letter16[] = {
{0x0041, 0x005A, 1},
{0x0061, 0x007A, 1},
{0x00AA, 0x00B5, 11},
{0x00BA, 0x00C0, 6},
{0x00C1, 0x00D6, 1},
{0x00D8, 0x00F6, 1},
{0x00F8, 0x02C1, 1},
{0x02C6, 0x02D1, 1},
{0x02E0, 0x02E4, 1},
{0x02EC, 0x02EE, 2},
{0x0370, 0x0374, 1},
{0x0376, 0x0377, 1},
{0x037A, 0x037D, 1},
{0x037F, 0x0386, 7},
{0x0388, 0x038A, 1},
{0x038C, 0x038E, 2},
{0x038F, 0x03A1, 1},
{0x03A3, 0x03F5, 1},
{0x03F7, 0x0481, 1},
{0x048A, 0x052F, 1},
{0x0531, 0x0556, 1},
{0x0559, 0x0560, 7},
{0x0561, 0x0588, 1},
{0x05D0, 0x05EA, 1},
{0x05EF, 0x05F2, 1},
{0x0620, 0x064A, 1},
{0x066E, 0x066F, 1},
{0x0671, 0x06D3, 1},
{0x06D5, 0x06E5, 16},
{0x06E6, 0x06EE, 8},
{0x06EF, 0x06FA, 11},
{0x06FB, 0x06FC, 1},
{0x06FF, 0x0710, 17},
{0x0712, 0x072F, 1},
{0x074D, 0x07A5, 1},
{0x07B1, 0x07CA, 25},
{0x07CB, 0x07EA, 1},
{0x07F4, 0x07F5, 1},
{0x07FA, 0x0800, 6},
{0x0801, 0x0815, 1},
{0x081A, 0x0824, 10},
{0x0828, 0x0840, 24},
{0x0841, 0x0858, 1},
{0x0860, 0x086A, 1},
{0x0870, 0x0887, 1},
{0x0889, 0x088E, 1},
{0x08A0, 0x08C9, 1},
{0x0904, 0x0939, 1},
{0x093D, 0x0950, 19},
{0x0958, 0x0961, 1},
{0x0971, 0x0980, 1},
{0x0985, 0x098C, 1},
{0x098F, 0x0990, 1},
{0x0993, 0x09A8, 1},
{0x09AA, 0x09B0, 1},
{0x09B2, 0x09B6, 4},
{0x09B7, 0x09B9, 1},
{0x09BD, 0x09CE, 17},
{0x09DC, 0x09DD, 1},
{0x09DF, 0x09E1, 1},
{0x09F0, 0x09F1, 1},
{0x09FC, 0x0A05, 9},
{0x0A06, 0x0A0A, 1},
{0x0A0F, 0x0A10, 1},
{0x0A13, 0x0A28, 1},
{0x0A2A, 0x0A30, 1},
{0x0A32, 0x0A33, 1},
{0x0A35, 0x0A36, 1},
{0x0A38, 0x0A39, 1},
{0x0A59, 0x0A5C, 1},
{0x0A5E, 0x0A72, 20},
{0x0A73, 0x0A74, 1},
{0x0A85, 0x0A8D, 1},
{0x0A8F, 0x0A91, 1},
{0x0A93, 0x0AA8, 1},
{0x0AAA, 0x0AB0, 1},
{0x0AB2, 0x0AB3, 1},
{0x0AB5, 0x0AB9, 1},
{0x0ABD, 0x0AD0, 19},
{0x0AE0, 0x0AE1, 1},
{0x0AF9, 0x0B05, 12},
{0x0B06, 0x0B0C, 1},
{0x0B0F, 0x0B10, 1},
{0x0B13, 0x0B28, 1},
{0x0B2A, 0x0B30, 1},
{0x0B32, 0x0B33, 1},
{0x0B35, 0x0B39, 1},
{0x0B3D, 0x0B5C, 31},
{0x0B5D, 0x0B5F, 2},
{0x0B60, 0x0B61, 1},
{0x0B71, 0x0B83, 18},
{0x0B85, 0x0B8A, 1},
{0x0B8E, 0x0B90, 1},
{0x0B92, 0x0B95, 1},
{0x0B99, 0x0B9A, 1},
{0x0B9C, 0x0B9E, 2},
{0x0B9F, 0x0BA3, 4},
{0x0BA4, 0x0BA8, 4},
{0x0BA9, 0x0BAA, 1},
{0x0BAE, 0x0BB9, 1},
{0x0BD0, 0x0C05, 53},
{0x0C06, 0x0C0C, 1},
{0x0C0E, 0x0C10, 1},
{0x0C12, 0x0C28, 1},
{0x0C2A, 0x0C39, 1},
{0x0C3D, 0x0C58, 27},
{0x0C59, 0x0C5A, 1},
{0x0C5D, 0x0C60, 3},
{0x0C61, 0x0C80, 31},
{0x0C85, 0x0C8C, 1},
{0x0C8E, 0x0C90, 1},
{0x0C92, 0x0CA8, 1},
{0x0CAA, 0x0CB3, 1},
{0x0CB5, 0x0CB9, 1},
{0x0CBD, 0x0CDD, 32},
{0x0CDE, 0x0CE0, 2},
{0x0CE1, 0x0CF1, 16},
{0x0CF2, 0x0D04, 18},
{0x0D05, 0x0D0C, 1},
{0x0D0E, 0x0D10, 1},
{0x0D12, 0x0D3A, 1},
{0x0D3D, 0x0D4E, 17},
{0x0D54, 0x0D56, 1},
{0x0D5F, 0x0D61, 1},
{0x0D7A, 0x0D7F, 1},
{0x0D85, 0x0D96, 1},
{0x0D9A, 0x0DB1, 1},
{0x0DB3, 0x0DBB, 1},
{0x0DBD, 0x0DC0, 3},
{0x0DC1, 0x0DC6, 1},
{0x0E01, 0x0E30, 1},
{0x0E32, 0x0E33, 1},
{0x0E40, 0x0E46, 1},
{0x0E81, 0x0E82, 1},
{0x0E84, 0x0E86, 2},
{0x0E87, 0x0E8A, 1},
{0x0E8C, 0x0EA3, 1},
{0x0EA5, 0x0EA7, 2},
{0x0EA8, 0x0EB0, 1},
{0x0EB2, 0x0EB3, 1},
{0x0EBD, 0x0EC0, 3},
{0x0EC1, 0x0EC4, 1},
{0x0EC6, 0x0EDC, 22},
{0x0EDD, 0x0EDF, 1},
{0x0F00, 0x0F40, 64},
{0x0F41, 0x0F47, 1},
{0x0F49, 0x0F6C, 1},
{0x0F88, 0x0F8C, 1},
{0x1000, 0x102A, 1},
{0x103F, 0x1050, 17},
{0x1051, 0x1055, 1},
{0x105A, 0x105D, 1},
{0x1061, 0x1065, 4},
{0x1066, 0x106E, 8},
{0x106F, 0x1070, 1},
{0x1075, 0x1081, 1},
{0x108E, 0x10A0, 18},
{0x10A1, 0x10C5, 1},
{0x10C7, 0x10CD, 6},
{0x10D0, 0x10FA, 1},
{0x10FC, 0x1248, 1},
{0x124A, 0x124D, 1},
{0x1250, 0x1256, 1},
{0x1258, 0x125A, 2},
{0x125B, 0x125D, 1},
{0x1260, 0x1288, 1},
{0x128A, 0x128D, 1},
{0x1290, 0x12B0, 1},
{0x12B2, 0x12B5, 1},
{0x12B8, 0x12BE, 1},
{0x12C0, 0x12C2, 2},
{0x12C3, 0x12C5, 1},
{0x12C8, 0x12D6, 1},
{0x12D8, 0x1310, 1},
{0x1312, 0x1315, 1},
{0x1318, 0x135A, 1},
{0x1380, 0x138F, 1},
{0x13A0, 0x13F5, 1},
{0x13F8, 0x13FD, 1},
{0x1401, 0x166C, 1},
{0x166F, 0x167F, 1},
{0x1681, 0x169A, 1},
{0x16A0, 0x16EA, 1},
{0x16F1, 0x16F8, 1},
{0x1700, 0x1711, 1},
{0x171F, 0x1731, 1},
{0x1740, 0x1751, 1},
{0x1760, 0x176C, 1},
{0x176E, 0x1770, 1},
{0x1780, 0x17B3, 1},
{0x17D7, 0x17DC, 5},
{0x1820, 0x1878, 1},
{0x1880, 0x1884, 1},
{0x1887, 0x18A8, 1},
{0x18AA, 0x18B0, 6},
{0x18B1, 0x18F5, 1},
{0x1900, 0x191E, 1},
{0x1950, 0x196D, 1},
{0x1970, 0x1974, 1},
{0x1980, 0x19AB, 1},
{0x19B0, 0x19C9, 1},
{0x1A00, 0x1A16, 1},
{0x1A20, 0x1A54, 1},
{0x1AA7, 0x1B05, 94},
{0x1B06, 0x1B33, 1},
{0x1B45, 0x1B4C, 1},
{0x1B83, 0x1BA0, 1},
{0x1BAE, 0x1BAF, 1},
{0x1BBA, 0x1BE5, 1},
{0x1C00, 0x1C23, 1},
{0x1C4D, 0x1C4F, 1},
{0x1C5A, 0x1C7D, 1},
{0x1C80, 0x1C88, 1},
{0x1C90, 0x1CBA, 1},
{0x1CBD, 0x1CBF, 1},
{0x1CE9, 0x1CEC, 1},
{0x1CEE, 0x1CF3, 1},
{0x1CF5, 0x1CF6, 1},
{0x1CFA, 0x1D00, 6},
{0x1D01, 0x1DBF, 1},
{0x1E00, 0x1F15, 1},
{0x1F18, 0x1F1D, 1},
{0x1F20, 0x1F45, 1},
{0x1F48, 0x1F4D, 1},
{0x1F50, 0x1F57, 1},
{0x1F59, 0x1F5F, 2},
{0x1F60, 0x1F7D, 1},
{0x1F80, 0x1FB4, 1},
{0x1FB6, 0x1FBC, 1},
{0x1FBE, 0x1FC2, 4},
{0x1FC3, 0x1FC4, 1},
{0x1FC6, 0x1FCC, 1},
{0x1FD0, 0x1FD3, 1},
{0x1FD6, 0x1FDB, 1},
{0x1FE0, 0x1FEC, 1},
{0x1FF2, 0x1FF4, 1},
{0x1FF6, 0x1FFC, 1},
{0x2071, 0x207F, 14},
{0x2090, 0x209C, 1},
{0x2102, 0x2107, 5},
{0x210A, 0x2113, 1},
{0x2115, 0x2119, 4},
{0x211A, 0x211D, 1},
{0x2124, 0x212A, 2},
{0x212B, 0x212D, 1},
{0x212F, 0x2139, 1},
{0x213C, 0x213F, 1},
{0x2145, 0x2149, 1},
{0x214E, 0x2183, 53},
{0x2184, 0x2C00, 2684},
{0x2C01, 0x2CE4, 1},
{0x2CEB, 0x2CEE, 1},
{0x2CF2, 0x2CF3, 1},
{0x2D00, 0x2D25, 1},
{0x2D27, 0x2D2D, 6},
{0x2D30, 0x2D67, 1},
{0x2D6F, 0x2D80, 17},
{0x2D81, 0x2D96, 1},
{0x2DA0, 0x2DA6, 1},
{0x2DA8, 0x2DAE, 1},
{0x2DB0, 0x2DB6, 1},
{0x2DB8, 0x2DBE, 1},
{0x2DC0, 0x2DC6, 1},
{0x2DC8, 0x2DCE, 1},
{0x2DD0, 0x2DD6, 1},
{0x2DD8, 0x2DDE, 1},
{0x2E2F, 0x3005, 470},
{0x3006, 0x3031, 43},
{0x3032, 0x3035, 1},
{0x303B, 0x303C, 1},
{0x3041, 0x3096, 1},
{0x309D, 0x309F, 1},
{0x30A1, 0x30FA, 1},
{0x30FC, 0x30FF, 1},
{0x3105, 0x312F, 1},
{0x3131, 0x318E, 1},
{0x31A0, 0x31BF, 1},
{0x31F0, 0x31FF, 1},
{0x3400, 0x4DBF, 1},
{0x4E00, 0xA48C, 1},
{0xA4D0, 0xA4FD, 1},
{0xA500, 0xA60C, 1},
{0xA610, 0xA61F, 1},
{0xA62A, 0xA62B, 1},
{0xA640, 0xA66E, 1},
{0xA67F, 0xA69D, 1},
{0xA6A0, 0xA6E5, 1},
{0xA717, 0xA71F, 1},
{0xA722, 0xA788, 1},
{0xA78B, 0xA7CA, 1},
{0xA7D0, 0xA7D1, 1},
{0xA7D3, 0xA7D5, 2},
{0xA7D6, 0xA7D9, 1},
{0xA7F2, 0xA801, 1},
{0xA803, 0xA805, 1},
{0xA807, 0xA80A, 1},
{0xA80C, 0xA822, 1},
{0xA840, 0xA873, 1},
{0xA882, 0xA8B3, 1},
{0xA8F2, 0xA8F7, 1},
{0xA8FB, 0xA8FD, 2},
{0xA8FE, 0xA90A, 12},
{0xA90B, 0xA925, 1},
{0xA930, 0xA946, 1},
{0xA960, 0xA97C, 1},
{0xA984, 0xA9B2, 1},
{0xA9CF, 0xA9E0, 17},
{0xA9E1, 0xA9E4, 1},
{0xA9E6, 0xA9EF, 1},
{0xA9FA, 0xA9FE, 1},
{0xAA00, 0xAA28, 1},
{0xAA40, 0xAA42, 1},
{0xAA44, 0xAA4B, 1},
{0xAA60, 0xAA76, 1},
{0xAA7A, 0xAA7E, 4},
{0xAA7F, 0xAAAF, 1},
{0xAAB1, 0xAAB5, 4},
{0xAAB6, 0xAAB9, 3},
{0xAABA, 0xAABD, 1},
{0xAAC0, 0xAAC2, 2},
{0xAADB, 0xAADD, 1},
{0xAAE0, 0xAAEA, 1},
{0xAAF2, 0xAAF4, 1},
{0xAB01, 0xAB06, 1},
{0xAB09, 0xAB0E, 1},
{0xAB11, 0xAB16, 1},
{0xAB20, 0xAB26, 1},
{0xAB28, 0xAB2E, 1},
{0xAB30, 0xAB5A, 1},
{0xAB5C, 0xAB69, 1},
{0xAB70, 0xABE2, 1},
{0xAC00, 0xD7A3, 1},
{0xD7B0, 0xD7C6, 1},
{0xD7CB, 0xD7FB, 1},
{0xF900, 0xFA6D, 1},
{0xFA70, 0xFAD9, 1},
{0xFB00, 0xFB06, 1},
{0xFB13, 0xFB17, 1},
{0xFB1D, 0xFB1F, 2},
{0xFB20, 0xFB28, 1},
{0xFB2A, 0xFB36, 1},
{0xFB38, 0xFB3C, 1},
{0xFB3E, 0xFB40, 2},
{0xFB41, 0xFB43, 2},
{0xFB44, 0xFB46, 2},
{0xFB47, 0xFBB1, 1},
{0xFBD3, 0xFD3D, 1},
{0xFD50, 0xFD8F, 1},
{0xFD92, 0xFDC7, 1},
{0xFDF0, 0xFDFB, 1},
{0xFE70, 0xFE74, 1},
{0xFE76, 0xFEFC, 1},
{0xFF21, 0xFF3A, 1},
{0xFF41, 0xFF5A, 1},
{0xFF66, 0xFFBE, 1},
{0xFFC2, 0xFFC7, 1},
{0xFFCA, 0xFFCF, 1},
{0xFFD2, 0xFFD7, 1},
{0xFFDA, 0xFFDC, 1},
};
static const struct span letter32[] = {
{0x010000, 0x01000B, 1},
{0x01000D, 0x010026, 1},
{0x010028, 0x01003A, 1},
{0x01003C, 0x01003D, 1},
{0x01003F, 0x01004D, 1},
{0x010050, 0x01005D, 1},
{0x010080, 0x0100FA, 1},
{0x010280, 0x01029C, 1},
{0x0102A0, 0x0102D0, 1},
{0x010300, 0x01031F, 1},
{0x01032D, 0x010340, 1},
{0x010342, 0x010349, 1},
{0x010350, 0x010375, 1},
{0x010380, 0x01039D, 1},
{0x0103A0, 0x0103C3, 1},
{0x0103C8, 0x0103CF, 1},
{0x010400, 0x01049D, 1},
{0x0104B0, 0x0104D3, 1},
{0x0104D8, 0x0104FB, 1},
{0x010500, 0x010527, 1},
{0x010530, 0x010563, 1},
{0x010570, 0x01057A, 1},
{0x01057C, 0x01058A, 1},
{0x01058C, 0x010592, 1},
{0x010594, 0x010595, 1},
{0x010597, 0x0105A1, 1},
{0x0105A3, 0x0105B1, 1},
{0x0105B3, 0x0105B9, 1},
{0x0105BB, 0x0105BC, 1},
{0x010600, 0x010736, 1},
{0x010740, 0x010755, 1},
{0x010760, 0x010767, 1},
{0x010780, 0x010785, 1},
{0x010787, 0x0107B0, 1},
{0x0107B2, 0x0107BA, 1},
{0x010800, 0x010805, 1},
{0x010808, 0x01080A, 2},
{0x01080B, 0x010835, 1},
{0x010837, 0x010838, 1},
{0x01083C, 0x01083F, 3},
{0x010840, 0x010855, 1},
{0x010860, 0x010876, 1},
{0x010880, 0x01089E, 1},
{0x0108E0, 0x0108F2, 1},
{0x0108F4, 0x0108F5, 1},
{0x010900, 0x010915, 1},
{0x010920, 0x010939, 1},
{0x010980, 0x0109B7, 1},
{0x0109BE, 0x0109BF, 1},
{0x010A00, 0x010A10, 16},
{0x010A11, 0x010A13, 1},
{0x010A15, 0x010A17, 1},
{0x010A19, 0x010A35, 1},
{0x010A60, 0x010A7C, 1},
{0x010A80, 0x010A9C, 1},
{0x010AC0, 0x010AC7, 1},
{0x010AC9, 0x010AE4, 1},
{0x010B00, 0x010B35, 1},
{0x010B40, 0x010B55, 1},
{0x010B60, 0x010B72, 1},
{0x010B80, 0x010B91, 1},
{0x010C00, 0x010C48, 1},
{0x010C80, 0x010CB2, 1},
{0x010CC0, 0x010CF2, 1},
{0x010D00, 0x010D23, 1},
{0x010E80, 0x010EA9, 1},
{0x010EB0, 0x010EB1, 1},
{0x010F00, 0x010F1C, 1},
{0x010F27, 0x010F30, 9},
{0x010F31, 0x010F45, 1},
{0x010F70, 0x010F81, 1},
{0x010FB0, 0x010FC4, 1},
{0x010FE0, 0x010FF6, 1},
{0x011003, 0x011037, 1},
{0x011071, 0x011072, 1},
{0x011075, 0x011083, 14},
{0x011084, 0x0110AF, 1},
{0x0110D0, 0x0110E8, 1},
{0x011103, 0x011126, 1},
{0x011144, 0x011147, 3},
{0x011150, 0x011172, 1},
{0x011176, 0x011183, 13},
{0x011184, 0x0111B2, 1},
{0x0111C1, 0x0111C4, 1},
{0x0111DA, 0x0111DC, 2},
{0x011200, 0x011211, 1},
{0x011213, 0x01122B, 1},
{0x01123F, 0x011240, 1},
{0x011280, 0x011286, 1},
{0x011288, 0x01128A, 2},
{0x01128B, 0x01128D, 1},
{0x01128F, 0x01129D, 1},
{0x01129F, 0x0112A8, 1},
{0x0112B0, 0x0112DE, 1},
{0x011305, 0x01130C, 1},
{0x01130F, 0x011310, 1},
{0x011313, 0x011328, 1},
{0x01132A, 0x011330, 1},
{0x011332, 0x011333, 1},
{0x011335, 0x011339, 1},
{0x01133D, 0x011350, 19},
{0x01135D, 0x011361, 1},
{0x011400, 0x011434, 1},
{0x011447, 0x01144A, 1},
{0x01145F, 0x011461, 1},
{0x011480, 0x0114AF, 1},
{0x0114C4, 0x0114C5, 1},
{0x0114C7, 0x011580, 185},
{0x011581, 0x0115AE, 1},
{0x0115D8, 0x0115DB, 1},
{0x011600, 0x01162F, 1},
{0x011644, 0x011680, 60},
{0x011681, 0x0116AA, 1},
{0x0116B8, 0x011700, 72},
{0x011701, 0x01171A, 1},
{0x011740, 0x011746, 1},
{0x011800, 0x01182B, 1},
{0x0118A0, 0x0118DF, 1},
{0x0118FF, 0x011906, 1},
{0x011909, 0x01190C, 3},
{0x01190D, 0x011913, 1},
{0x011915, 0x011916, 1},
{0x011918, 0x01192F, 1},
{0x01193F, 0x011941, 2},
{0x0119A0, 0x0119A7, 1},
{0x0119AA, 0x0119D0, 1},
{0x0119E1, 0x0119E3, 2},
{0x011A00, 0x011A0B, 11},
{0x011A0C, 0x011A32, 1},
{0x011A3A, 0x011A50, 22},
{0x011A5C, 0x011A89, 1},
{0x011A9D, 0x011AB0, 19},
{0x011AB1, 0x011AF8, 1},
{0x011C00, 0x011C08, 1},
{0x011C0A, 0x011C2E, 1},
{0x011C40, 0x011C72, 50},
{0x011C73, 0x011C8F, 1},
{0x011D00, 0x011D06, 1},
{0x011D08, 0x011D09, 1},
{0x011D0B, 0x011D30, 1},
{0x011D46, 0x011D60, 26},
{0x011D61, 0x011D65, 1},
{0x011D67, 0x011D68, 1},
{0x011D6A, 0x011D89, 1},
{0x011D98, 0x011EE0, 328},
{0x011EE1, 0x011EF2, 1},
{0x011F02, 0x011F04, 2},
{0x011F05, 0x011F10, 1},
{0x011F12, 0x011F33, 1},
{0x011FB0, 0x012000, 80},
{0x012001, 0x012399, 1},
{0x012480, 0x012543, 1},
{0x012F90, 0x012FF0, 1},
{0x013000, 0x01342F, 1},
{0x013441, 0x013446, 1},
{0x014400, 0x014646, 1},
{0x016800, 0x016A38, 1},
{0x016A40, 0x016A5E, 1},
{0x016A70, 0x016ABE, 1},
{0x016AD0, 0x016AED, 1},
{0x016B00, 0x016B2F, 1},
{0x016B40, 0x016B43, 1},
{0x016B63, 0x016B77, 1},
{0x016B7D, 0x016B8F, 1},
{0x016E40, 0x016E7F, 1},
{0x016F00, 0x016F4A, 1},
{0x016F50, 0x016F93, 67},
{0x016F94, 0x016F9F, 1},
{0x016FE0, 0x016FE1, 1},
{0x016FE3, 0x017000, 29},
{0x017001, 0x0187F7, 1},
{0x018800, 0x018CD5, 1},
{0x018D00, 0x018D08, 1},
{0x01AFF0, 0x01AFF3, 1},
{0x01AFF5, 0x01AFFB, 1},
{0x01AFFD, 0x01AFFE, 1},
{0x01B000, 0x01B122, 1},
{0x01B132, 0x01B150, 30},
{0x01B151, 0x01B152, 1},
{0x01B155, 0x01B164, 15},
{0x01B165, 0x01B167, 1},
{0x01B170, 0x01B2FB, 1},
{0x01BC00, 0x01BC6A, 1},
{0x01BC70, 0x01BC7C, 1},
{0x01BC80, 0x01BC88, 1},
{0x01BC90, 0x01BC99, 1},
{0x01D400, 0x01D454, 1},
{0x01D456, 0x01D49C, 1},
{0x01D49E, 0x01D49F, 1},
{0x01D4A2, 0x01D4A5, 3},
{0x01D4A6, 0x01D4A9, 3},
{0x01D4AA, 0x01D4AC, 1},
{0x01D4AE, 0x01D4B9, 1},
{0x01D4BB, 0x01D4BD, 2},
{0x01D4BE, 0x01D4C3, 1},
{0x01D4C5, 0x01D505, 1},
{0x01D507, 0x01D50A, 1},
{0x01D50D, 0x01D514, 1},
{0x01D516, 0x01D51C, 1},
{0x01D51E, 0x01D539, 1},
{0x01D53B, 0x01D53E, 1},
{0x01D540, 0x01D544, 1},
{0x01D546, 0x01D54A, 4},
{0x01D54B, 0x01D550, 1},
{0x01D552, 0x01D6A5, 1},
{0x01D6A8, 0x01D6C0, 1},
{0x01D6C2, 0x01D6DA, 1},
{0x01D6DC, 0x01D6FA, 1},
{0x01D6FC, 0x01D714, 1},
{0x01D716, 0x01D734, 1},
{0x01D736, 0x01D74E, 1},
{0x01D750, 0x01D76E, 1},
{0x01D770, 0x01D788, 1},
{0x01D78A, 0x01D7A8, 1},
{0x01D7AA, 0x01D7C2, 1},
{0x01D7C4, 0x01D7CB, 1},
{0x01DF00, 0x01DF1E, 1},
{0x01DF25, 0x01DF2A, 1},
{0x01E030, 0x01E06D, 1},
{0x01E100, 0x01E12C, 1},
{0x01E137, 0x01E13D, 1},
{0x01E14E, 0x01E290, 322},
{0x01E291, 0x01E2AD, 1},
{0x01E2C0, 0x01E2EB, 1},
{0x01E4D0, 0x01E4EB, 1},
{0x01E7E0, 0x01E7E6, 1},
{0x01E7E8, 0x01E7EB, 1},
{0x01E7ED, 0x01E7EE, 1},
{0x01E7F0, 0x01E7FE, 1},
{0x01E800, 0x01E8C4, 1},
{0x01E900, 0x01E943, 1},
{0x01E94B, 0x01EE00, 1205},
{0x01EE01, 0x01EE03, 1},
{0x01EE05, 0x01EE1F, 1},
{0x01EE21, 0x01EE22, 1},
{0x01EE24, 0x01EE27, 3},
{0x01EE29, 0x01EE32, 1},
{0x01EE34, 0x01EE37, 1},
{0x01EE39, 0x01EE3B, 2},
{0x01EE42, 0x01EE47, 5},
{0x01EE49, 0x01EE4D, 2},
{0x01EE4E, 0x01EE4F, 1},
{0x01EE51, 0x01EE52, 1},
{0x01EE54, 0x01EE57, 3},
{0x01EE59, 0x01EE61, 2},
{0x01EE62, 0x01EE64, 2},
{0x01EE67, 0x01EE6A, 1},
{0x01EE6C, 0x01EE72, 1},
{0x01EE74, 0x01EE77, 1},
{0x01EE79, 0x01EE7C, 1},
{0x01EE7E, 0x01EE80, 2},
{0x01EE81, 0x01EE89, 1},
{0x01EE8B, 0x01EE9B, 1},
{0x01EEA1, 0x01EEA3, 1},
{0x01EEA5, 0x01EEA9, 1},
{0x01EEAB, 0x01EEBB, 1},
{0x020000, 0x02A6DF, 1},
{0x02A700, 0x02B739, 1},
{0x02B740, 0x02B81D, 1},
{0x02B820, 0x02CEA1, 1},
{0x02CEB0, 0x02EBE0, 1},
{0x02F800, 0x02FA1D, 1},
{0x030000, 0x03134A, 1},
{0x031350, 0x0323AF, 1},
};
static const struct span digit16[] = {
{0x0030, 0x0039, 1},
{0x0660, 0x0669, 1},
{0x06F0, 0x06F9, 1},
{0x07C0, 0x07C9, 1},
{0x0966, 0x096F, 1},
{0x09E6, 0x09EF, 1},
{0x0A66, 0x0A6F, 1},
{0x0AE6, 0x0AEF, 1},
{0x0B66, 0x0B6F, 1},
{0x0BE6, 0x0BEF, 1},
{0x0C66, 0x0C6F, 1},
{0x0CE6, 0x0CEF, 1},
{0x0D66, 0x0D6F, 1},
{0x0DE6, 0x0DEF, 1},
{0x0E50, 0x0E59, 1},
{0x0ED0, 0x0ED9, 1},
{0x0F20, 0x0F29, 1},
{0x1040, 0x1049, 1},
{0x1090, 0x1099, 1},
{0x17E0, 0x17E9, 1},
{0x1810, 0x1819, 1},
{0x1946, 0x194F, 1},
{0x19D0, 0x19D9, 1},
{0x1A80, 0x1A89, 1},
{0x1A90, 0x1A99, 1},
{0x1B50, 0x1B59, 1},
{0x1BB0, 0x1BB9, 1},
{0x1C40, 0x1C49, 1},
{0x1C50, 0x1C59, 1},
{0xA620, 0xA629, 1},
{0xA8D0, 0xA8D9, 1},
{0xA900, 0xA909, 1},
{0xA9D0, 0xA9D9, 1},
{0xA9F0, 0xA9F9, 1},
{0xAA50, 0xAA59, 1},
{0xABF0, 0xABF9, 1},
{0xFF10, 0xFF19, 1},
};
static const struct span digit32[] = {
{0x0104A0, 0x0104A9, 1},
{0x010D30, 0x010D39, 1},
{0x011066, 0x01106F, 1},
{0x0110F0, 0x0110F9, 1},
{0x011136, 0x01113F, 1},
{0x0111D0, 0x0111D9, 1},
{0x0112F0, 0x0112F9, 1},
{0x011450, 0x011459, 1},
{0x0114D0, 0x0114D9, 1},
{0x011650, 0x011659, 1},
{0x0116C0, 0x0116C9, 1},
{0x011730, 0x011739, 1},
{0x0118E0, 0x0118E9, 1},
{0x011950, 0x011959, 1},
{0x011C50, 0x011C59, 1},
{0x011D50, 0x011D59, 1},
{0x011DA0, 0x011DA9, 1},
{0x011F50, 0x011F59, 1},
{0x016A60, 0x016A69, 1},
{0x016AC0, 0x016AC9, 1},
{0x016B50, 0x016B59, 1},
{0x01D7CE, 0x01D7FF, 1},
{0x01E140, 0x01E149, 1},
{0x01E2F0, 0x01E2F9, 1},
{0x01E4F0, 0x01E4F9, 1},
{0x01E950, 0x01E959, 1},
{0x01FBF0, 0x01FBF9, 1},
};
static int inspan(const struct span *s, size_t n, uint32_t r)
{
size_t lo = 0, hi = n;
while (lo < hi) {
size_t mid = lo + (hi - lo) / 2;
if (r < s[mid].lo) {
hi = mid;
} else if (r > s[mid].hi) {
lo = mid + 1;
} else {
return (r - s[mid].lo) % s[mid].stride == 0;
}
}
return 0;
}
static int inset(const struct span *s16, size_t n16,
const struct span *s32, size_t n32, uint32_t r)
{
if (r <= 0xFFFF)
return inspan(s16, n16, r);
return inspan(s32, n32, r);
}
int rune_letter(uint32_t r)
{
return inset(letter16, sizeof(letter16) / sizeof(letter16[0]),
letter32, sizeof(letter32) / sizeof(letter32[0]), r);
}
int rune_digit(uint32_t r)
{
return inset(digit16, sizeof(digit16) / sizeof(digit16[0]),
digit32, sizeof(digit32) / sizeof(digit32[0]), r);
}
#define BAD 0xFFFD
uint32_t rune_read(const char *src, size_t len, size_t *size)
{
const unsigned char *s = (const unsigned char *)src;
uint32_t r;
size_t n;
if (len == 0) {
*size = 0;
return 0;
}
*size = 1;
if (s[0] < 0x80)
return s[0];
if (s[0] < 0xC2 || s[0] > 0xF4)
return BAD;
if (s[0] < 0xE0) {
n = 2;
r = s[0] & 0x1F;
} else if (s[0] < 0xF0) {
n = 3;
r = s[0] & 0x0F;
} else {
n = 4;
r = s[0] & 0x07;
}
if (len < n)
return BAD;
for (size_t i = 1; i < n; i++) {
if ((s[i] & 0xC0) != 0x80)
return BAD;
r = (r << 6) | (s[i] & 0x3F);
}
/* Reject overlong forms, surrogates and out-of-range code points, as
* utf8.DecodeRune does. */
if (n == 3 && r < 0x800)
return BAD;
if (n == 4 && (r < 0x10000 || r > 0x10FFFF))
return BAD;
if (r >= 0xD800 && r <= 0xDFFF)
return BAD;
*size = n;
return r;
}