diff options
| author | Tyge Løvset <[email protected]> | 2022-02-14 00:22:38 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2022-02-14 00:22:38 +0100 |
| commit | 708931e82219c5dd235000c9cdb39f2d6ddfa9df (patch) | |
| tree | 948beb842a05f9653c7bcb1de2a250e8643aec87 /src | |
| parent | e1478d0a6fff28ebdb2399dded96998bef0186be (diff) | |
| download | STC-modified-708931e82219c5dd235000c9cdb39f2d6ddfa9df.tar.gz STC-modified-708931e82219c5dd235000c9cdb39f2d6ddfa9df.zip | |
Big update on cregex.
Diffstat (limited to 'src')
| -rw-r--r-- | src/cregex.c | 104 | ||||
| -rw-r--r-- | src/cregex_utf8.c | 412 |
2 files changed, 282 insertions, 234 deletions
diff --git a/src/cregex.c b/src/cregex.c index 6d48e696..5724c558 100644 --- a/src/cregex.c +++ b/src/cregex.c @@ -120,9 +120,9 @@ enum { QUEST , /* a? == a|nothing, i.e. 0 or 1 a's */
RUNE = 0x8100000,
IRUNE,
- ASC_d , ASC_D, /* digit, non-digit */
- ASC_s , ASC_S, /* space, non-space */
- ASC_w , ASC_W, /* word, non-word */
+ ASC_d , ASC_D, /* dec digit, non-digit */
+ ASC_s , ASC_S, /* utf8 space, non-space */
+ ASC_w , ASC_W, /* utf8 word, non-word */
ASC_an , ASC_AN, /* alnum */
ASC_al , ASC_AL, /* alpha */
ASC_bl , ASC_BL, /* blank */
@@ -133,16 +133,17 @@ enum { ASC_pr , ASC_PR, /* print */
ASC_pt , ASC_PT, /* punct */
ASC_xd , ASC_XD, /* xdigit */
- UNI_La , UNX_La, /* alpha */
- UNI_Ll , UNX_Ll, /* lower */
- UNI_Lu , UNX_Lu, /* upper */
- UNI_P , UNX_P, /* punct */
- UNI_Zs , UNX_Zs, /* white space */
+ U8_La , NU8_La, /* utf8 alpha */
+ U8_Ll , NU8_Ll, /* utf8 lower */
+ U8_Lu , NU8_Lu, /* utf8 upper */
+ U8_Zs , NU8_Zs, /* utf8 white space */
+ U8_Xnx , NU8_Xnx, /* utf8 hex digit */
+ U8_Xan , NU8_Xan, /* utf8 alphanumeric */
ANY = 0x8200000, /* Any character except newline, . */
ANYNL , /* Any character including newline, . */
NOP , /* No operation, internal use only */
- BOL , /* Beginning of line, ^ */
- EOL , /* End of line, $ */
+ BOL , BOS, /* Beginning of line, string, ^ */
+ EOL , EOS, EOZ, /* End of line, string, $ */
CCLASS , /* Character class, [] */
NCCLASS , /* Negated character class, [] */
WBOUND , /* Non-word boundary, not consuming meta char */
@@ -328,6 +329,7 @@ typedef struct Parser Reflags flags;
int dot_type;
int rune_type;
+ bool litmode;
bool lastwasand; /* Last token was operand */
bool lexdone;
short nbra;
@@ -575,7 +577,7 @@ nextc(Parser *par, Rune *rp) par->exprp += chartorune(rp, par->exprp);
if (*rp == '\\') {
par->exprp += chartorune(rp, par->exprp);
- switch (*rp) {
+ if (!par->litmode) switch (*rp) {
case 't': *rp = '\t'; break;
case 'n': *rp = '\n'; break;
case 'r': *rp = '\r'; break;
@@ -589,15 +591,18 @@ nextc(Parser *par, Rune *rp) case 'W': *rp = ASC_W; break;
case 'p': case 'P': { /* https://www.regular-expressions.info/unicode.html */
static struct { const char* c; int n, r; } cls[] = {
- {"{Ll}", 4, UNI_Ll}, {"{Lowercase_Letter}", 18, UNI_Ll},
- {"{Lu}", 4, UNI_Lu}, {"{Uppercase_Letter}", 18, UNI_Lu},
- {"{L&}", 4, UNI_La}, {"{Cased_Letter}", 14, UNI_La},
+ {"{Ll}", 4, U8_Ll}, {"{Lowercase_Letter}", 18, U8_Ll},
+ {"{Lu}", 4, U8_Lu}, {"{Uppercase_Letter}", 18, U8_Lu},
+ {"{L}", 3, U8_La}, {"{L&}", 4, U8_La}, {"{Cased_Letter}", 14, U8_La},
+ {"{Zs}", 4, U8_Zs}, {"{Space_Separator}", 17, U8_Zs},
+ {"{Xnx}", 5, U8_Xnx}, {"{Hex_Digit}", 11, U8_Xnx},
+ {"{Xan}", 5, U8_Xan}, {"{Alphanumeric}", 14, U8_Xan},
};
int inv = *rp == 'P';
for (unsigned i = 0; i < (sizeof cls/sizeof *cls); ++i)
if (!strncmp(par->exprp, cls[i].c, cls[i].n)) {
- if (par->rune_type == IRUNE && (cls[i].r == UNI_Ll || cls[i].r == UNI_Lu))
- *rp = UNI_La + inv;
+ if (par->rune_type == IRUNE && (cls[i].r == U8_Ll || cls[i].r == U8_Lu))
+ *rp = U8_La + inv;
else
*rp = cls[i].r + inv;
par->exprp += cls[i].n;
@@ -613,7 +618,7 @@ nextc(Parser *par, Rune *rp) }
if (*rp == 0)
par->lexdone = true;
- return false;
+ return par->litmode;
}
static Token
@@ -622,11 +627,21 @@ lex(Parser *par) int quoted;
start:
quoted = nextc(par, &par->yyrune);
- if (quoted) switch (par->yyrune) {
+ if (quoted) {
+ if (par->litmode) {
+ if (par->yyrune == 'E') { par->litmode = false; goto start; }
+ return par->yyrune == 0 ? END : par->rune_type;
+ }
+ switch (par->yyrune) {
case 0 : return END;
case 'b': return WBOUND;
case 'B': return NWBOUND;
+ case 'A': return BOS;
+ case 'z': return EOS;
+ case 'Z': return EOZ;
+ case 'Q': par->litmode = true; goto start;
default : return par->rune_type;
+ }
}
switch (par->yyrune) {
@@ -642,8 +657,8 @@ lex(Parser *par) case 0 : par->exprp += k; return END;
case ')': par->exprp += k + 1; goto start;
case '-': enable = 0; break;
- case 's': if (!par->flags.dotall) par->dot_type = enable ? ANYNL : ANY; break;
- case 'i': if (!par->flags.caseless) par->rune_type = enable ? IRUNE : RUNE; break;
+ case 's': if (!par->flags.dotall) par->dot_type = ANY + enable; break;
+ case 'i': if (!par->flags.caseless) par->rune_type = RUNE + enable; break;
default: rcerror(par, creg_unknownoperator); return 0;
}
}
@@ -786,6 +801,7 @@ regcomp1(Parser *par, const char *s, int cflags) par->flags = pp->flags;
par->rune_type = pp->flags.caseless ? IRUNE : RUNE;
par->dot_type = pp->flags.dotall ? ANYNL : ANY;
+ par->litmode = false;
par->exprp = s;
par->nclass = 0;
par->nbra = 0;
@@ -843,9 +859,9 @@ runematch(Rune s, Rune r, bool icase) case ASC_D: inv = 1; /* fallthrough */
case ASC_d: return inv ^ (isdigit(r) != 0);
case ASC_S: inv = 1;
- case ASC_s: return inv ^ (isspace(r) != 0);
+ case ASC_s: return inv ^ utf8_isspace(r);
case ASC_W: inv = 1;
- case ASC_w: return inv ^ ((isalnum(r) != 0) | (r == '_'));
+ case ASC_w: return inv ^ (utf8_isalnum(r) | (r == '_'));
case ASC_AL: inv = 1;
case ASC_al: return inv ^ (isalpha(r) != 0);
case ASC_LO: inv = 1;
@@ -866,12 +882,18 @@ runematch(Rune s, Rune r, bool icase) case ASC_pt: return inv ^ (ispunct(r) != 0);
case ASC_XD: inv = 1;
case ASC_xd: return inv ^ (isxdigit(r) != 0);
- case UNX_La: inv = 1;
- case UNI_La: return inv ^ utf8_isalpha(r);
- case UNX_Ll: inv = 1;
- case UNI_Ll: return inv ^ utf8_islower(r);
- case UNX_Lu: inv = 1;
- case UNI_Lu: return inv ^ utf8_isupper(r);
+ case NU8_La: inv = 1;
+ case U8_La: return inv ^ utf8_isalpha(r);
+ case NU8_Ll: inv = 1;
+ case U8_Ll: return inv ^ utf8_islower(r);
+ case NU8_Lu: inv = 1;
+ case U8_Lu: return inv ^ utf8_isupper(r);
+ case NU8_Zs: inv = 1;
+ case U8_Zs: return inv ^ utf8_isspace(r);
+ case NU8_Xan: inv = 1;
+ case U8_Xan: return inv ^ utf8_isalnum(r);
+ case NU8_Xnx: inv = 1;
+ case U8_Xnx: return inv ^ utf8_isxdigit(r);
}
return icase ? utf8_tolower(s) == utf8_tolower(r) : s == r;
}
@@ -972,23 +994,29 @@ regexec1(const Reprog *progp, /* program to run */ ok = true;
break;
case BOL:
- if (s == bol || *(s-1) == '\n')
- continue;
+ if (s == bol || s[-1] == '\n') continue;
+ break;
+ case BOS:
+ if (s == bol) continue;
break;
case EOL:
- if (s == j->eol || r == 0 || r == '\n')
- continue;
+ if (r == '\n') continue;
+ case EOS: /* fallthrough */
+ if (s == j->eol || r == 0) continue;
+ break;
+ case EOZ:
+ if (s == j->eol || r == 0 || r == '\n' && s[1] == 0) continue;
break;
case NWBOUND:
- ok = true; /* fallthrough */
- case WBOUND:
- if (ok ^ (s == bol || s == j->eol || ((isalnum(s[-1]) || s[-1] == '_')
- ^ (isalnum(s[ 0]) || s[ 0] == '_'))))
+ ok = true;
+ case WBOUND: /* fallthrough */
+ if (ok ^ (s == bol || s == j->eol || ((utf8_isalnum(s[-1]) || s[-1] == '_')
+ ^ (utf8_isalnum(s[ 0]) || s[ 0] == '_'))))
continue;
break;
case NCCLASS:
- ok = true; /* fallthrough */
- case CCLASS:
+ ok = true;
+ case CCLASS: /* fallthrough */
ep = inst->r.classp->end;
for (rp = inst->r.classp->spans; rp < ep; rp += 2) {
if ((r >= rp[0] && r <= rp[1]) || (rp[0] == rp[1] && runematch(rp[0], r, icase)))
diff --git a/src/cregex_utf8.c b/src/cregex_utf8.c index d0e4fc35..dac38ce7 100644 --- a/src/cregex_utf8.c +++ b/src/cregex_utf8.c @@ -4,32 +4,32 @@ enum { UPPER = 0, LOWER = 1, HT_SIZE = 1997 };
// based on unicode CaseFolding.txt
static const uint16_t cfold[][2] = {
-{0x00041, 0x00061}, // LATIN CAPITAL LETTER A
-{0x00042, 0x00062}, // LATIN CAPITAL LETTER B
-{0x00043, 0x00063}, // LATIN CAPITAL LETTER C
-{0x00044, 0x00064}, // LATIN CAPITAL LETTER D
-{0x00045, 0x00065}, // LATIN CAPITAL LETTER E
-{0x00046, 0x00066}, // LATIN CAPITAL LETTER F
-{0x00047, 0x00067}, // LATIN CAPITAL LETTER G
-{0x00048, 0x00068}, // LATIN CAPITAL LETTER H
-{0x00049, 0x00069}, // LATIN CAPITAL LETTER I
-{0x0004A, 0x0006A}, // LATIN CAPITAL LETTER J
-{0x0004B, 0x0006B}, // LATIN CAPITAL LETTER K
-{0x0004C, 0x0006C}, // LATIN CAPITAL LETTER L
-{0x0004D, 0x0006D}, // LATIN CAPITAL LETTER M
-{0x0004E, 0x0006E}, // LATIN CAPITAL LETTER N
-{0x0004F, 0x0006F}, // LATIN CAPITAL LETTER O
-{0x00050, 0x00070}, // LATIN CAPITAL LETTER P
-{0x00051, 0x00071}, // LATIN CAPITAL LETTER Q
-{0x00052, 0x00072}, // LATIN CAPITAL LETTER R
-{0x00053, 0x00073}, // LATIN CAPITAL LETTER S
-{0x00054, 0x00074}, // LATIN CAPITAL LETTER T
-{0x00055, 0x00075}, // LATIN CAPITAL LETTER U
-{0x00056, 0x00076}, // LATIN CAPITAL LETTER V
-{0x00057, 0x00077}, // LATIN CAPITAL LETTER W
-{0x00058, 0x00078}, // LATIN CAPITAL LETTER X
-{0x00059, 0x00079}, // LATIN CAPITAL LETTER Y
-{0x0005A, 0x0007A}, // LATIN CAPITAL LETTER Z
+//{0x00041, 0x00061}, // LATIN CAPITAL LETTER A
+//{0x00042, 0x00062}, // LATIN CAPITAL LETTER B
+//{0x00043, 0x00063}, // LATIN CAPITAL LETTER C
+//{0x00044, 0x00064}, // LATIN CAPITAL LETTER D
+//{0x00045, 0x00065}, // LATIN CAPITAL LETTER E
+//{0x00046, 0x00066}, // LATIN CAPITAL LETTER F
+//{0x00047, 0x00067}, // LATIN CAPITAL LETTER G
+//{0x00048, 0x00068}, // LATIN CAPITAL LETTER H
+//{0x00049, 0x00069}, // LATIN CAPITAL LETTER I
+//{0x0004A, 0x0006A}, // LATIN CAPITAL LETTER J
+//{0x0004B, 0x0006B}, // LATIN CAPITAL LETTER K
+//{0x0004C, 0x0006C}, // LATIN CAPITAL LETTER L
+//{0x0004D, 0x0006D}, // LATIN CAPITAL LETTER M
+//{0x0004E, 0x0006E}, // LATIN CAPITAL LETTER N
+//{0x0004F, 0x0006F}, // LATIN CAPITAL LETTER O
+//{0x00050, 0x00070}, // LATIN CAPITAL LETTER P
+//{0x00051, 0x00071}, // LATIN CAPITAL LETTER Q
+//{0x00052, 0x00072}, // LATIN CAPITAL LETTER R
+//{0x00053, 0x00073}, // LATIN CAPITAL LETTER S
+//{0x00054, 0x00074}, // LATIN CAPITAL LETTER T
+//{0x00055, 0x00075}, // LATIN CAPITAL LETTER U
+//{0x00056, 0x00076}, // LATIN CAPITAL LETTER V
+//{0x00057, 0x00077}, // LATIN CAPITAL LETTER W
+//{0x00058, 0x00078}, // LATIN CAPITAL LETTER X
+//{0x00059, 0x00079}, // LATIN CAPITAL LETTER Y
+//{0x0005A, 0x0007A}, // LATIN CAPITAL LETTER Z
{0x000B5, 0x003BC}, // MICRO SIGN
{0x000C0, 0x000E0}, // LATIN CAPITAL LETTER A WITH GRAVE
{0x000C1, 0x000E1}, // LATIN CAPITAL LETTER A WITH ACUTE
@@ -438,15 +438,15 @@ static const uint16_t cfold[][2] = { {0x0052A, 0x0052B}, // CYRILLIC CAPITAL LETTER DZZHE
{0x0052C, 0x0052D}, // CYRILLIC CAPITAL LETTER DCHE
{0x0052E, 0x0052F}, // CYRILLIC CAPITAL LETTER EL WITH DESCENDER
-// {0x01C80, 0x00432}, // CYRILLIC SMALL LETTER ROUNDED VE
-// {0x01C81, 0x00434}, // CYRILLIC SMALL LETTER LONG-LEGGED DE
-// {0x01C82, 0x0043E}, // CYRILLIC SMALL LETTER NARROW O
-// {0x01C83, 0x00441}, // CYRILLIC SMALL LETTER WIDE ES
-// {0x01C84, 0x00442}, // CYRILLIC SMALL LETTER TALL TE
-// {0x01C85, 0x00442}, // CYRILLIC SMALL LETTER THREE-LEGGED TE
-// {0x01C86, 0x0044A}, // CYRILLIC SMALL LETTER TALL HARD SIGN
-// {0x01C87, 0x00463}, // CYRILLIC SMALL LETTER TALL YAT
-// {0x01C88, 0x0A64B}, // CYRILLIC SMALL LETTER UNBLENDED UK
+{0x01C80, 0x00432}, // CYRILLIC SMALL LETTER ROUNDED VE
+{0x01C81, 0x00434}, // CYRILLIC SMALL LETTER LONG-LEGGED DE
+{0x01C82, 0x0043E}, // CYRILLIC SMALL LETTER NARROW O
+{0x01C83, 0x00441}, // CYRILLIC SMALL LETTER WIDE ES
+{0x01C84, 0x00442}, // CYRILLIC SMALL LETTER TALL TE
+{0x01C85, 0x00442}, // CYRILLIC SMALL LETTER THREE-LEGGED TE
+{0x01C86, 0x0044A}, // CYRILLIC SMALL LETTER TALL HARD SIGN
+{0x01C87, 0x00463}, // CYRILLIC SMALL LETTER TALL YAT
+{0x01C88, 0x0A64B}, // CYRILLIC SMALL LETTER UNBLENDED UK
{0x01E00, 0x01E01}, // LATIN CAPITAL LETTER A WITH RING BELOW
{0x01E02, 0x01E03}, // LATIN CAPITAL LETTER B WITH DOT ABOVE
{0x01E04, 0x01E05}, // LATIN CAPITAL LETTER B WITH DOT BELOW
@@ -839,21 +839,21 @@ static const uint16_t cfold[][2] = { {0x0A7B3, 0x0AB53}, // LATIN CAPITAL LETTER CHI
{0x0A7B4, 0x0A7B5}, // LATIN CAPITAL LETTER BETA
{0x0A7B6, 0x0A7B7}, // LATIN CAPITAL LETTER OMEGA
-// {0x0A7B8, 0x0A7B9}, // LATIN CAPITAL LETTER U WITH STROKE
-// {0x0A7BA, 0x0A7BB}, // LATIN CAPITAL LETTER GLOTTAL A
-// {0x0A7BC, 0x0A7BD}, // LATIN CAPITAL LETTER GLOTTAL I
-// {0x0A7BE, 0x0A7BF}, // LATIN CAPITAL LETTER GLOTTAL U
-// {0x0A7C0, 0x0A7C1}, // LATIN CAPITAL LETTER OLD POLISH O
-// {0x0A7C2, 0x0A7C3}, // LATIN CAPITAL LETTER ANGLICANA W
-// {0x0A7C4, 0x0A794}, // LATIN CAPITAL LETTER C WITH PALATAL HOOK
-// {0x0A7C5, 0x00282}, // LATIN CAPITAL LETTER S WITH HOOK
-// {0x0A7C6, 0x01D8E}, // LATIN CAPITAL LETTER Z WITH PALATAL HOOK
-// {0x0A7C7, 0x0A7C8}, // LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY
-// {0x0A7C9, 0x0A7CA}, // LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY
-// {0x0A7D0, 0x0A7D1}, // LATIN CAPITAL LETTER CLOSED INSULAR G
-// {0x0A7D6, 0x0A7D7}, // LATIN CAPITAL LETTER MIDDLE SCOTS S
-// {0x0A7D8, 0x0A7D9}, // LATIN CAPITAL LETTER SIGMOID S
-// {0x0A7F5, 0x0A7F6}, // LATIN CAPITAL LETTER REVERSED HALF H
+{0x0A7B8, 0x0A7B9}, // LATIN CAPITAL LETTER U WITH STROKE
+{0x0A7BA, 0x0A7BB}, // LATIN CAPITAL LETTER GLOTTAL A
+{0x0A7BC, 0x0A7BD}, // LATIN CAPITAL LETTER GLOTTAL I
+{0x0A7BE, 0x0A7BF}, // LATIN CAPITAL LETTER GLOTTAL U
+{0x0A7C0, 0x0A7C1}, // LATIN CAPITAL LETTER OLD POLISH O
+{0x0A7C2, 0x0A7C3}, // LATIN CAPITAL LETTER ANGLICANA W
+{0x0A7C4, 0x0A794}, // LATIN CAPITAL LETTER C WITH PALATAL HOOK
+{0x0A7C5, 0x00282}, // LATIN CAPITAL LETTER S WITH HOOK
+{0x0A7C6, 0x01D8E}, // LATIN CAPITAL LETTER Z WITH PALATAL HOOK
+{0x0A7C7, 0x0A7C8}, // LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY
+{0x0A7C9, 0x0A7CA}, // LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY
+{0x0A7D0, 0x0A7D1}, // LATIN CAPITAL LETTER CLOSED INSULAR G
+{0x0A7D6, 0x0A7D7}, // LATIN CAPITAL LETTER MIDDLE SCOTS S
+{0x0A7D8, 0x0A7D9}, // LATIN CAPITAL LETTER SIGMOID S
+{0x0A7F5, 0x0A7F6}, // LATIN CAPITAL LETTER REVERSED HALF H
{0x0FF21, 0x0FF41}, // FULLWIDTH LATIN CAPITAL LETTER A
{0x0FF22, 0x0FF42}, // FULLWIDTH LATIN CAPITAL LETTER B
{0x0FF23, 0x0FF43}, // FULLWIDTH LATIN CAPITAL LETTER C
@@ -883,140 +883,140 @@ static const uint16_t cfold[][2] = { };
static short cfold_idx[HT_SIZE] = {
- -1, 285, 897, -1, 803, 1334, -1, 1211, -1, 711, 81, 1122, 307, 619, 1658,
- -1, 1036, 1569, 545, -1, 337, 950, 462, -1, 856, 237, 1236, 1399, 765, 148,
- 1176, 1447, 680, 66, 1701, 1089, 1409, 604, 19, 391, 1003, 485, 1530, 911, 302,
- 1285, 1414, 817, 197, 1279, 1331, 725, 1372, 107, 1134, 1482, 647, 1686, 1050, 440,
- 1583, 4, -1, 350, 964, -1, -1, 255, 872, 1248, 1319, 778, -1, 1188, 1461,
- 694, 94, 1103, -1, 632, 1622, 47, 405, 1017, 530, 1544, 925, 1430, -1, 1352,
- 831, 211, 1219, 1400, 739, 123, 1496, 1159, -1, 579, -1, 1064, 1427, 560, 32,
- 978, 364, 498, 1588, -1, 433, 886, -1, 792, -1, 173, 1192, 1475, -1, 59,
- 1117, 1643, 660, 1640, -1, 419, 1025, 534, 1558, 326, 939, 1300, -1, 845, 225,
- 1231, 1377, 753, 137, 1171, 1436, 669, 1679, -1, 265, 1078, 582, -1, 992, 380,
- 524, 1521, -1, 289, 900, -1, 806, 186, 1340, 1200, -1, 714, 87, 1128, 1664,
- 625, -1, 1039, -1, 548, 1572, -1, 257, 953, 1306, 859, 240, -1, 1242, 1405,
- 768, 151, 1183, 1450, 683, 72, 1092, -1, 1611, 610, 25, 394, 1006, 491, 1533,
- 914, 305, 1417, -1, 820, 200, 1291, 1337, 728, 113, 1378, 1140, 1485, 653, 1692,
- 445, 1053, -1, 10, 967, 353, -1, -1, -1, 258, 875, 1254, 781, -1, 163,
- 1464, -1, 697, -1, 1106, -1, 638, 1625, -1, 408, -1, 517, 1547, 312, 928,
- 1295, -1, 834, 214, 1225, 1355, 742, 126, 1148, 1314, 585, 1499, 1657, 1067, -1,
- 564, 38, 981, 369, 504, 1510, 1592, 276, 889, 1266, 795, 176, -1, 1478, -1,
- 703, 65, 299, 1123, 666, 1317, 1028, 422, 1561, 1646, -1, 329, 942, 461, 848,
- -1, 228, 1237, 1383, 756, 140, 1177, 1439, 672, 1685, -1, 267, 1081, 588, 3,
- 383, 995, 465, 1603, 903, -1, 1274, -1, 809, 189, 1206, 1346, 717, 1356, 93,
- 1135, 1670, 631, -1, 1042, 431, 551, 1575, 956, 342, -1, -1, 862, 244, -1,
- 1249, -1, 771, 154, 1189, 1453, 686, 78, 1095, 1423, 616, 31, 1614, 397, 1009,
- 497, 553, 309, 917, 1420, 1343, 823, 203, 1297, 1384, 731, 115, 1488, 1536, 659,
- 1591, 1698, 448, 1056, -1, 16, 970, 356, 482, -1, -1, 263, 878, 1260, 784,
- 166, -1, 1193, 1467, 700, 104, 1109, -1, 644, 1628, 1018, 411, 523, 1550, -1,
- 316, 931, -1, 837, -1, 217, 1214, 1361, 745, 129, 1154, 1502, 591, 1663, -1,
- 1070, 1595, 566, 44, 372, 984, 510, 1513, 892, 280, 454, -1, 798, 179, 1201,
- 1324, 706, 1481, 71, 1129, -1, 609, 1650, 1031, 425, 540, 1564, -1, 332, 945,
- -1, 851, 232, -1, 1243, 1389, 760, 143, 1166, 1442, 675, 56, 1084, 1631, 594,
- 1691, 9, 386, 998, 471, 1525, 906, 294, 1280, 1321, 812, 192, 1212, 1362, 720,
- 99, 1408, 1141, 1676, 637, -1, 1045, 1433, 1578, -1, 959, 345, 466, -1, 865,
- 248, 1255, -1, 773, 157, -1, 1178, 1456, 689, 84, 1098, -1, 622, 37, 239,
- 400, 1012, 503, 1539, 310, 920, 1286, 1349, 826, 206, 1309, 1390, 734, 118, 1149,
- 1426, 665, 1491, 1617, 451, 1059, 563, 22, 358, 973, 488, -1, 881, 365, -1,
- -1, 787, 168, -1, 1470, -1, -1, 110, 1112, -1, 650, 1632, 1020, 414, 529,
- 1553, 1432, 320, 934, -1, 840, 220, -1, 1220, 1367, 748, 132, 1160, 1505, 597,
- 1669, 1073, 261, 572, 1598, 50, 375, 987, 514, 1516, 895, 283, -1, 1330, 801,
- 182, 1207, -1, 709, 77, 1654, 1118, -1, 615, -1, 1034, -1, 543, 1567, 948,
- 335, 571, -1, 854, 235, 1232, 1395, 763, 1697, 146, 1172, 1445, 678, 62, 1087,
- 269, 600, 15, 1608, 389, 1001, 481, 535, 298, 429, 909, 1327, 815, 195, 1275,
- 1368, 723, 103, 1528, 1641, 643, 1682, -1, 437, 1048, 1581, 0, 962, 348, -1,
- -1, 870, 252, 1261, -1, 776, 160, -1, 1184, 1459, 692, 90, 1101, -1, 628,
- 43, 1015, 403, 509, 541, 1429, 367, 923, 1542, 829, 209, 1620, 1215, 1396, 737,
- 121, 1155, 1494, 575, -1, 1062, 1425, 558, 1586, 28, 362, 976, 494, -1, 884,
- 272, -1, -1, 790, 171, 1190, 1473, -1, 55, -1, 1115, -1, 656, 1638, 417,
- 1023, 477, 1556, 937, 324, 458, 1296, 843, 223, 1226, 1373, 751, 1508, 135, 1167,
- 1675, 603, -1, 1076, -1, 578, 1601, -1, 378, 990, 520, 1519, 286, 898, 1283,
- 1336, 804, 184, 1213, -1, 712, 83, 1124, 1660, 621, -1, -1, 1037, -1, 546,
- 1570, 951, 338, 1302, -1, 857, 238, 1238, 1401, 766, 149, 1703, 1179, 1448, 681,
- 68, 1090, 1637, 606, 21, 1004, 392, 487, 559, 1315, 303, 912, 1287, 818, 1333,
- 198, 1281, 1374, 726, 109, 1136, 1415, 649, 1483, 1531, 442, 1051, 1584, 6, 351,
- 965, 474, 1019, 873, 1688, 1250, -1, 779, -1, -1, 1462, 695, 96, -1, 1104,
- -1, 634, 49, 406, 1623, 513, 531, 926, 1431, 1545, -1, 832, 212, 1221, 1353,
- 1402, 740, 124, 1161, 1497, 581, 1653, 1065, 241, 561, 34, 1589, 366, 979, 500,
- -1, 887, -1, 1262, -1, 793, 174, 1476, -1, -1, 61, 1119, 295, 662, 1642,
- -1, 420, 1026, 536, 1559, 940, 327, -1, -1, 846, 226, 1233, 1379, 754, 138,
- 1681, 1173, 1437, 670, -1, 1079, 1635, 584, -1, 993, 381, 526, 1522, -1, 290,
- 901, -1, 807, 1342, 187, 1202, -1, 715, 89, 1130, 1666, 627, -1, -1, 428,
- 1040, 549, 1573, 340, 954, 1308, -1, 860, 242, 1244, -1, 769, 152, 1185, 1451,
- 684, -1, 74, 275, 1093, 612, 27, 1007, 395, 493, 537, 557, 306, 915, 1418,
- 821, 201, 1339, 1303, 1380, 729, 231, 1142, 1486, 655, 1534, 1054, 446, 1612, 12,
- 1694, 354, 968, 478, -1, 876, 260, 1256, -1, 782, 164, 1191, 1465, 698, 100,
- 1107, 1413, 1626, 640, -1, -1, -1, 519, 539, 929, 314, 1548, -1, 835, 215,
- 1227, 1357, 743, 127, 1316, 1150, 1500, 587, 1659, 251, 1068, 565, 40, 982, 370,
- 506, 1511, 1593, 409, 890, 1268, 796, 1320, 177, 1196, 1479, 704, 67, 1125, 301,
- 605, 1648, -1, 423, 1029, 1562, -1, 330, 943, -1, -1, 849, 229, 1239, 1385,
- 758, 141, 1162, 1440, 673, 1687, -1, 1082, -1, 590, 5, 996, 384, 467, 1604,
- 1406, 292, 904, 1276, 810, 190, 1348, 1208, 1358, 718, 95, 1137, 1672, 633, -1,
- 1043, 432, 1576, -1, -1, 343, 957, 464, 863, -1, 245, 1251, -1, 757, 155,
- 1454, -1, 687, 80, -1, 277, 1096, 618, 33, 398, 1010, 499, 1537, 918, 1422,
- 1615, -1, 824, 204, 1299, 1345, 732, 1386, 116, 1489, 1700, 661, -1, 1057, 449,
- 552, 18, -1, 357, 971, 484, -1, 264, 879, 1263, -1, 785, 167, 1468, -1,
- 701, 106, 1110, 287, 646, 1629, -1, 412, -1, 525, 1313, 318, 932, 1301, 1551,
- 838, 218, 1216, 1363, 746, 130, 1156, 1503, 1665, 593, -1, 259, 1071, 568, 46,
- 985, 373, 1514, 1596, -1, 281, 893, 1272, 799, 180, 1326, 1203, -1, 707, 73,
- 1131, -1, 611, 1651, 1032, 426, 533, 1565, -1, 333, 946, 567, 852, 1311, 233,
- 1245, 1391, 761, 144, 1168, 1443, 676, 58, 1693, 1085, 1606, 596, 11, 387, 999,
- 1526, -1, 907, 296, 1282, 1410, 813, 193, 1267, 1323, 721, 1364, 1678, 1143, -1,
- 639, -1, 1046, 1435, 1579, -1, -1, 346, 960, 468, 866, 249, 868, 1257, -1,
- 774, 158, 1180, 1457, 690, 86, 1099, 279, 624, 1618, 39, 401, 1013, 505, 1540,
- 921, 311, 1288, 1351, 827, 207, 1492, 1392, 735, 119, 1411, 1151, -1, 667, -1,
- 452, 1060, 463, 24, 974, 360, 490, -1, -1, 268, 882, 1271, 788, 169, -1,
- 1197, 1471, -1, 112, 1113, 291, 652, 1634, -1, 415, 1554, 473, -1, 322, 935,
- 456, 1292, 841, 221, 1222, 1369, 749, 133, 1163, 1434, 599, 1506, 1671, 1074, 1633,
- 574, 1599, 376, 988, 516, 1517, 896, 284, -1, -1, 802, 183, 1209, 1332, 710,
- 1656, 79, 1120, -1, 617, -1, 1035, -1, 544, 1568, -1, 336, 949, -1, 855,
- 236, -1, 1234, 1397, 764, 147, 1174, 1446, 679, 64, 1088, 1639, 602, 1609, 17,
- 390, 1002, 483, 1529, 435, 300, 910, 1329, 816, 196, 1277, 1370, 724, 105, 1684,
- 1699, -1, 645, -1, 438, 1049, 1582, 2, 963, 349, 472, -1, -1, 254, 871,
- 1246, 777, -1, 161, 1186, 1460, 693, 92, 1102, -1, 630, 45, 1621, 404, 1016,
- 511, 555, 924, 1543, -1, -1, 830, 210, 1217, 1398, 738, 122, 1157, 1312, 577,
- 1495, -1, 1063, 1421, 1587, 30, 977, 363, 496, -1, -1, 273, 885, -1, 791,
- 172, -1, 1474, -1, -1, 57, 1116, -1, 658, -1, 1024, 418, 532, 1557, -1,
- 325, 938, 459, 844, 224, 1298, 1228, 1375, 752, 136, 1169, 1509, 668, 1677, 1077,
- -1, 580, -1, -1, 379, 991, 522, 1520, 899, 288, -1, 1338, 805, 185, 1198,
- -1, 713, 85, 1662, 1126, -1, 623, -1, 1038, -1, 547, 1571, 952, 339, 1304,
- -1, 858, 439, 1240, 1403, 767, -1, 150, 1181, 1449, 682, 70, 1091, -1, 608,
- 23, 1610, 393, 1005, 489, 1532, 304, 913, 1416, 1335, 819, 199, 1289, 1376, 727,
- 111, 1138, 1484, 651, 1690, -1, 444, 1052, 1585, 8, 966, 352, 476, -1, -1,
- 256, 874, 1252, 780, 162, -1, 1463, -1, 696, 98, 1105, -1, 636, 51, 1624,
- 407, 515, 1546, -1, 927, 1293, -1, 833, -1, 213, 1223, 1404, 741, 125, 1146,
- 1498, 583, 1655, -1, 247, 1066, 562, 36, 368, 980, 502, 1590, 888, 274, 1264,
- -1, 794, 175, 1194, 1477, 702, 63, -1, 441, 1121, 664, 1644, 1027, 421, 1560,
- -1, 941, 328, -1, 460, 847, 227, 1235, 1381, -1, 755, 139, 1175, 1438, 671,
- 1683, 1080, -1, 586, 1, 1602, 382, 994, 528, 1523, 902, -1, -1, 1344, 808,
- 188, 1204, 1354, 716, 91, 1132, 1668, 629, -1, -1, 430, 1041, 550, 1574, 955,
- 341, 1310, -1, 861, 243, 1247, -1, 770, 153, -1, 1187, 1452, 685, 76, 1094,
- -1, 614, 29, 1008, 396, 455, 495, 1273, 308, 916, 1419, 822, 1341, 202, 1305,
- 1382, 730, 114, 1144, 1487, 657, 1535, 1613, 447, 1055, 1696, 14, 355, 969, 480,
- -1, 877, 262, 1258, -1, 783, 165, -1, 1466, 699, -1, 102, 1108, -1, 642,
- 1627, -1, 410, 521, 1549, -1, 313, 315, 930, 836, 216, -1, 1229, 1359, 744,
- 128, 1152, 1501, 589, 1661, 1069, 253, 1594, -1, 42, 371, 983, 508, 1512, 891,
- 278, 1270, 1322, 797, 178, 1199, 1480, 705, 69, -1, 443, 1127, 607, 1649, 424,
- 1030, 538, 1563, 944, 331, -1, -1, 850, 230, 1241, 1387, 759, 142, 1689, 1164,
- 1441, 674, 54, 1083, 1605, 592, 7, 997, 385, 469, 1524, -1, 293, 905, 1278,
- 1350, 811, 191, 1210, 1360, 719, 97, 1139, 1407, 635, 1674, -1, 434, 1044, 1577,
- -1, 344, 958, -1, -1, 864, 246, 1253, -1, 772, 156, -1, 1455, 688, -1,
- 82, 1097, -1, 620, 35, 1011, 399, 53, 501, 1424, 919, 1284, 1538, 825, 205,
- 1347, 1307, 1388, 733, 117, 1147, 1490, 663, 1616, 1058, 450, 554, 1702, 20, 972,
- -1, 486, -1, 880, 266, 1265, -1, 786, -1, 1195, 1469, -1, 108, -1, 1111,
- 1630, 648, -1, 413, -1, 527, 1552, 933, 317, 319, -1, 839, 219, 1218, 1365,
- 747, 1504, 131, 1158, 1667, 595, 52, 1072, -1, 570, 48, 1597, 374, 986, 512,
- 1515, 282, 894, -1, 1328, 800, 181, 1205, -1, 708, 75, 1133, 1652, 613, -1,
- -1, 427, 1033, 542, 1566, 334, 947, 569, -1, 853, 234, 1230, 1393, 762, 145,
- 1170, 1444, 1695, 677, 60, 271, 1086, 598, 13, 1000, 388, 479, 1527, 1412, 297,
- 908, 1607, 814, 194, 1325, 1269, 1366, 722, 101, 1145, 1645, 641, 1680, 1047, 436,
- 1580, -1, -1, 347, 961, 470, 867, 869, 250, 1259, -1, 775, 159, 1182, 1458,
- 691, 88, -1, 1100, -1, 626, 41, 402, 1014, 507, 1541, 922, 1428, 1290, 1619,
- 828, 208, -1, 1394, 736, 1493, 120, 1153, -1, 573, -1, 1061, 453, 556, 26,
- -1, 359, 361, 492, 975, 270, 883, -1, -1, 789, 170, 1472, -1, -1, 1021,
- 1114, 1647, 654, 1636, -1, 416, 1022, 475, 1555, 936, 321, 323, 457, 842, 222,
- 1224, 1294, 750, 134, 1318, 1165, 1371, 601, 1507, 1075, 1673, 576, 1600, 989, 377,
- 518, 1518,
+ -1, 233, 863, -1, 751, 1300, -1, 1177, -1, 659, 29, 1088, 255, 567, 1621,
+ 1654, 1002, 1535, 493, -1, 285, 916, 410, -1, 804, 185, 1202, 1365, 713, 96,
+ 1142, 833, 628, 14, 1413, 1055, 1375, 552, 1631, 339, 969, 433, 828, 877, 250,
+ 1251, 1380, 765, 145, 1245, 1297, 673, 1338, 55, 1100, 1448, 595, 1496, 1016, 388,
+ 1549, 1638, 1682, 298, 930, 1697, -1, 203, 838, 1214, 1285, 726, -1, 1154, 1427,
+ 642, 42, 1069, -1, 580, 1588, -1, 353, 983, 478, 1510, 891, 1396, -1, 1318,
+ 779, 159, 1185, 1366, 687, 71, 1462, 1125, 1643, 527, -1, 1030, 1393, 508, 1554,
+ 944, 312, 446, -1, -1, 381, 852, -1, 740, -1, 121, 1158, 1441, -1, 7,
+ 1083, 1609, 608, 1606, -1, 367, 991, 482, 1524, 274, 905, 1266, -1, 793, 173,
+ 1197, 1343, 701, 85, 1137, 1402, 617, 1675, -1, 213, 1044, 530, -1, 958, 328,
+ 472, 1487, -1, 237, 866, -1, 754, 134, 1306, 1166, -1, 662, 35, 1094, 1660,
+ 573, 1624, 1005, -1, 496, 1538, -1, 205, 919, 1272, 807, 188, -1, 1208, 1371,
+ 716, 99, 1149, 1416, 631, 20, 1058, -1, 1577, 558, -1, 342, 972, 439, 1499,
+ 880, 253, 1383, -1, 768, 148, 1257, 1303, 676, 61, 1344, 1106, 1451, 601, 1688,
+ 393, 1019, -1, -1, 933, 301, -1, -1, -1, 206, 841, 1220, 729, -1, 111,
+ 1430, -1, 645, -1, 1072, -1, 586, 1591, -1, 356, -1, 465, 1513, 260, 894,
+ 1261, -1, 782, 162, 1191, 1321, 690, 74, 1114, 1280, 533, 1465, 1653, 1033, -1,
+ 512, 1558, 947, 317, 452, 1476, -1, 224, 855, 1232, 743, 124, -1, 1444, -1,
+ 651, 13, 247, 1089, 614, 1283, 994, 370, 1527, 1612, -1, 277, 908, 409, 796,
+ -1, 176, 1203, 1349, 704, 88, 1143, 1405, 620, 1681, -1, 215, 1047, 536, 1569,
+ 331, 961, 413, -1, 869, -1, 1240, -1, 757, 137, 1172, 1312, 665, 1322, 41,
+ 1101, 1666, 579, 1627, 1008, 379, 499, 1541, 922, 290, -1, -1, 810, 192, -1,
+ 1215, -1, 719, 102, 1155, 1419, 634, 26, 1061, 1389, 564, 1580, 1647, 345, 975,
+ 445, 501, 257, 883, 1386, 1309, 771, 151, 1263, 1350, 679, 63, 1454, 1502, 607,
+ 1557, 1694, 396, 1022, -1, -1, 936, 304, 430, -1, -1, 211, 844, 1226, 732,
+ 114, -1, 1159, 1433, 648, 52, 1075, -1, 592, 1594, 984, 359, 471, 1516, -1,
+ 264, 897, -1, 785, -1, 165, 1180, 1327, 693, 77, 1120, 1468, 539, 1659, -1,
+ 1036, 1561, 514, -1, 320, 950, 458, 1479, 858, 228, 402, -1, 746, 127, 1167,
+ 1290, 654, 1447, 19, 1095, -1, 557, 817, 997, 373, 488, 1530, 1616, 280, 911,
+ -1, 799, 180, -1, 1209, 1355, 708, 91, 1132, 1408, 623, 4, 1050, 1597, 542,
+ 1687, -1, 334, 964, 419, 818, 872, 242, 1246, 1287, 760, 140, 1178, 1328, 668,
+ 47, 1374, 1107, 1491, 585, 1630, 1011, 1399, 1544, 1672, 925, 293, 414, -1, 813,
+ 196, 1221, -1, 721, 105, -1, 1144, 1422, 637, 32, 1064, -1, 570, 187, 978,
+ 348, 1505, 451, 1583, 258, 886, 1252, 1315, 774, 154, 1275, 1356, 682, 66, 1115,
+ 1392, 613, 1457, -1, 399, 1025, 511, -1, 306, 939, 436, -1, 847, 313, -1,
+ -1, 735, 116, -1, 1436, -1, -1, 58, 1078, 1633, 598, 1598, 986, 362, 477,
+ 1519, 1398, 268, 900, -1, 788, 168, -1, 1186, 1333, 696, 80, 1126, 1471, 545,
+ 1665, 1039, 209, 520, 1564, -1, 323, 953, 462, 1482, 861, 231, -1, 1296, 749,
+ 130, 1173, -1, 657, 25, 1650, 1084, 1619, 563, -1, 1000, -1, 491, 1533, 914,
+ 283, 519, -1, 802, 183, 1198, 1361, 711, 1693, 94, 1138, 1411, 626, 10, 1053,
+ 217, 548, 1574, -1, 337, 967, 429, 483, 246, 377, 824, 875, 763, 143, 1241,
+ 1293, 671, 51, 1334, 1494, 591, 1607, 1636, 385, 1014, 1547, 1678, 928, 296, -1,
+ -1, 836, 200, 1227, -1, 724, 108, -1, 1150, 1425, 640, 38, 1067, -1, 576,
+ 1586, 981, 351, 457, 489, 1395, 315, 889, 1508, 777, 157, -1, 1181, 1362, 685,
+ 69, 1121, 1460, 523, -1, 1028, 1391, 506, 1552, -1, 310, 942, 442, -1, 850,
+ 220, -1, -1, 738, 119, 1156, 1439, -1, 3, -1, 1081, -1, 604, 1604, 365,
+ 989, 425, 1522, 903, 272, 406, 1262, 791, 171, 1192, 1339, 699, 1474, 83, 1133,
+ 1671, 551, -1, 1042, -1, 526, 1567, -1, 326, 956, 468, 1485, 234, 864, 1249,
+ 1302, 752, 132, 1179, -1, 660, 31, 1090, 1656, 569, 1622, -1, 1003, -1, 494,
+ 1536, 917, 286, 1268, -1, 805, 186, 1204, 1367, 714, 97, 1699, 1145, 1414, 629,
+ 16, 1056, 1603, 554, 1281, 970, 340, 435, 507, 830, 251, 878, 1253, 766, 1299,
+ 146, 1247, 1340, 674, 57, 1102, 1381, 597, 1449, 1497, 390, 1017, 1550, 1639, 299,
+ 931, 422, 985, 839, 1684, 1216, -1, 727, -1, -1, 1428, 643, 44, -1, 1070,
+ -1, 582, 1589, 354, -1, 461, 479, 892, 1397, 1511, -1, 780, 160, 1187, 1319,
+ 1368, 688, 72, 1127, 1463, 529, 1644, 1031, 189, 509, 1555, 1649, 314, 945, 448,
+ -1, 853, -1, 1228, -1, 741, 122, 1442, -1, -1, 9, 1085, 243, 610, 1608,
+ -1, 368, 992, 484, 1525, 906, 275, -1, -1, 794, 174, 1199, 1345, 702, 86,
+ 1677, 1139, 1403, 618, -1, 1045, 1601, 532, -1, 959, 329, 474, 1488, -1, 238,
+ 867, -1, 755, 1308, 135, 1168, -1, 663, 37, 1096, 1662, 575, 1625, -1, 376,
+ 1006, 497, 1539, 288, 920, 1274, -1, 808, 190, 1210, -1, 717, 100, 1151, 1417,
+ 632, -1, 22, 223, 1059, 560, 1578, 973, 343, 441, 485, 505, 254, 881, 1384,
+ 769, 149, 1305, 1269, 1346, 677, 179, 1108, 1452, 603, 1500, 1020, 394, 1690, -1,
+ -1, 302, 934, 426, -1, 842, 208, 1222, -1, 730, 112, 1157, 1431, 646, 48,
+ 1073, 1379, 1592, 588, -1, -1, -1, 467, 487, 895, 262, 1514, -1, 783, 163,
+ 1193, 1323, 691, 75, 1282, 1116, 1466, 535, 1655, 199, 1034, 513, 1559, 948, 318,
+ 454, 1477, -1, 357, 856, 1234, 744, 1286, 125, 1162, 1445, 652, 15, 1091, 249,
+ 553, 1614, -1, 371, 995, 1528, -1, 278, 909, -1, -1, 797, 177, 1205, 1351,
+ 706, 89, 1128, 1406, 621, 1683, -1, 1048, -1, 538, 1570, 962, 332, 415, -1,
+ 1372, 240, 870, 1242, 758, 138, 1314, 1174, 1324, 666, 43, 1103, 1668, 581, 821,
+ 1009, 380, 1542, 1628, -1, 291, 923, 412, 811, -1, 193, 1217, -1, 705, 103,
+ 1420, -1, 635, 28, -1, 225, 1062, 566, 1581, 346, 976, 447, 1503, 884, 1388,
+ -1, -1, 772, 152, 1265, 1311, 680, 1352, 64, 1455, 1696, 609, 1640, 1023, 397,
+ 500, -1, -1, 305, 937, 432, -1, 212, 845, 1229, -1, 733, 115, 1434, -1,
+ 649, 54, 1076, 235, 594, 1595, -1, 360, -1, 473, 1279, 266, 898, 1267, 1517,
+ 786, 166, 1182, 1329, 694, 78, 1122, 1469, 1661, 541, -1, 207, 1037, 516, 1562,
+ 951, 321, 1480, -1, -1, 229, 859, 1238, 747, 128, 1292, 1169, -1, 655, 21,
+ 1097, -1, 559, 1617, 998, 374, 481, 1531, -1, 281, 912, 515, 800, 1277, 181,
+ 1211, 1357, 709, 92, 1134, 1409, 624, 6, 1689, 1051, 1572, 544, -1, 335, 965,
+ 1492, 820, 873, 244, 1248, 1376, 761, 141, 1233, 1289, 669, 1330, 1674, 1109, -1,
+ 587, 823, 1012, 1401, 1545, 1632, -1, 294, 926, 416, 814, 197, 834, 1223, -1,
+ 722, 106, 1146, 1423, 638, 34, 1065, 227, 572, 1584, -1, 349, 979, 453, 1506,
+ 887, 259, 1254, 1317, 775, 155, 1458, 1358, 683, 67, 1377, 1117, -1, 615, -1,
+ 400, 1026, 411, -1, 940, 308, 438, -1, -1, 216, 848, 1237, 736, 117, -1,
+ 1163, 1437, -1, 60, 1079, 239, 600, 1600, -1, 363, 1520, 421, -1, 270, 901,
+ 404, 1258, 789, 169, 1188, 1335, 697, 81, 1129, 1400, 547, 1472, 1667, 1040, 1599,
+ 522, 1565, 324, 954, 464, 1483, 862, 232, -1, -1, 750, 131, 1175, 1298, 658,
+ 1652, 27, 1086, -1, 565, 1620, 1001, -1, 492, 1534, -1, 284, 915, -1, 803,
+ 184, -1, 1200, 1363, 712, 95, 1140, 1412, 627, 12, 1054, 1605, 550, 1575, 1695,
+ 338, 968, 431, 826, 383, 248, 876, 1295, 764, 144, 1243, 1336, 672, 53, 1495,
+ 1680, 1637, 593, -1, 386, 1015, 1548, -1, 929, 297, 420, -1, -1, 202, 837,
+ 1212, 725, -1, 109, 1152, 1426, 641, 40, 1068, -1, 578, 1587, -1, 352, 982,
+ 459, 503, 890, 1509, -1, -1, 778, 158, 1183, 1364, 686, 70, 1123, 1278, 525,
+ 1461, 1642, 1029, 1387, 1553, -1, 943, 311, 444, -1, -1, 221, 851, -1, 739,
+ 120, -1, 1440, -1, -1, 5, 1082, -1, 606, -1, 990, 366, 480, 1523, -1,
+ 273, 904, 407, 792, 172, 1264, 1194, 1341, 700, 84, 1135, 1475, 616, 1635, 1043,
+ 1673, 528, -1, -1, 327, 957, 470, 1486, 865, 236, -1, 1304, 753, 133, 1164,
+ -1, 661, 33, 1658, 1092, -1, 571, 1623, 1004, -1, 495, 1537, 918, 287, 1270,
+ -1, 806, 387, 1206, 1369, 715, -1, 98, 1147, 1415, 630, 18, 1057, -1, 556,
+ 1576, -1, 341, 971, 437, 832, 252, 879, 1382, 1301, 767, 147, 1255, 1342, 675,
+ 59, 1104, 1450, 599, 1498, 1686, 392, 1018, 1551, -1, 932, 300, 424, -1, -1,
+ 204, 840, 1218, 728, 110, -1, 1429, -1, 644, 46, 1071, -1, 584, 1590, -1,
+ 355, 463, 1512, -1, 893, 1259, -1, 781, -1, 161, 1189, 1370, 689, 73, 1112,
+ 1464, 531, 1645, 1651, 195, 1032, 510, 1556, 316, 946, 450, -1, 854, 222, 1230,
+ -1, 742, 123, 1160, 1443, 650, 11, -1, 389, 1087, 612, 1610, 993, 369, 1526,
+ -1, 907, 276, -1, 408, 795, 175, 1201, 1347, -1, 703, 87, 1141, 1404, 619,
+ 831, 1046, 1679, 534, 1568, -1, 330, 960, 476, 1489, 868, -1, -1, 1310, 756,
+ 136, 1170, 1320, 664, 39, 1098, 1664, 577, 1626, -1, 378, 1007, 498, 1540, 921,
+ 289, 1276, -1, 809, 191, 1213, -1, 718, 101, -1, 1153, 1418, 633, 24, 1060,
+ 1646, 562, 1579, 974, 344, 403, 443, 1239, 256, 882, 1385, 770, 1307, 150, 1271,
+ 1348, 678, 62, 1110, 1453, 605, 829, 1501, 395, 1021, 1692, -1, 303, 935, 428,
+ -1, 843, 210, 1224, -1, 731, 113, -1, 1432, 647, -1, 50, 1074, -1, 590,
+ 1593, -1, 358, 469, 1515, -1, 261, 263, 896, 784, 164, -1, 1195, 1325, 692,
+ 76, 1118, 1467, 537, 1657, 1035, 201, 1560, -1, -1, 319, 949, 456, 1478, 857,
+ 226, 1236, 1288, 745, 126, 1165, 1446, 653, 17, -1, 391, 1093, 555, 1615, 372,
+ 996, 486, 1529, 910, 279, -1, -1, 798, 178, 1207, 1353, 707, 90, 1685, 1130,
+ 1407, 622, 2, 1049, 1571, 540, -1, 963, 333, 417, 816, 1490, 241, 871, 1244,
+ 1316, 759, 139, 1176, 1326, 667, 45, 1105, 1373, 583, 1629, 1670, 382, 1010, 1543,
+ -1, 292, 924, -1, -1, 812, 194, 1219, -1, 720, 104, -1, 1421, 636, -1,
+ 30, 1063, -1, 568, 1582, 977, 347, 1, 449, 1390, 885, 1250, 1504, 773, 153,
+ 1313, 1273, 1354, 681, 65, 1113, 1456, 611, 1641, 1024, 398, 502, 1698, -1, 938,
+ -1, 434, -1, 846, 214, 1231, -1, 734, -1, 1161, 1435, -1, 56, -1, 1077,
+ 1596, 596, -1, 361, -1, 475, 1518, 899, 265, 267, -1, 787, 167, 1184, 1331,
+ 695, 1470, 79, 1124, 1663, 543, 0, 1038, -1, 518, 1563, -1, 322, 952, 460,
+ 1481, 230, 860, -1, 1294, 748, 129, 1171, -1, 656, 23, 1099, 1648, 561, 819,
+ 1618, 375, 999, 490, 1532, 282, 913, 517, -1, 801, 182, 1196, 1359, 710, 93,
+ 1136, 1410, 1691, 625, 8, 219, 1052, 546, 1573, 966, 336, 427, 822, 1378, 245,
+ 874, 1493, 762, 142, 1291, 1235, 1332, 670, 49, 1111, 1611, 589, 825, 827, 384,
+ 1013, 1546, 1634, 295, 927, 418, 815, 835, 198, 1225, 1676, 723, 107, 1148, 1424,
+ 639, 36, -1, 1066, -1, 574, 1585, 350, 980, 455, 1507, 888, 1394, 1256, -1,
+ 776, 156, -1, 1360, 684, 1459, 68, 1119, -1, 521, -1, 1027, 401, 504, -1,
+ -1, 307, 309, 440, 941, 218, 849, -1, -1, 737, 118, 1438, -1, -1, 987,
+ 1080, 1613, 602, 1602, -1, 364, 988, 423, 1521, 902, 269, 271, 405, 790, 170,
+ 1190, 1260, 698, 82, 1284, 1131, 1337, 549, 1473, 1041, 1669, 524, 1566, 955, 325,
+ 466, 1484,
};
static const size_t cfold_len = sizeof cfold / sizeof cfold[0];
@@ -1029,9 +1029,8 @@ static inline uint32_t hash(uint32_t key, size_t len) { static inline int cfold_lookup(uint32_t codep) {
int idx, i = hash(codep, HT_SIZE);
- while ((idx = cfold_idx[i]) != -1 && cfold_tab[idx] != codep) {
+ while ((idx = cfold_idx[i]) != -1 && cfold_tab[idx] != codep)
if (++i == HT_SIZE) i = 0;
- }
return idx;
}
@@ -1041,29 +1040,47 @@ static inline int utf8_isupper(uint32_t codep) { }
static inline int utf8_islower(uint32_t codep) {
- if (codep <= 'z') return codep >= 'a';
+ if (codep < 128) return (codep >= 'a') & (codep <= 'z');
int idx = cfold_lookup(codep);
return (idx != -1) & (idx & 1);
}
static inline uint32_t utf8_toupper(uint32_t codep) {
+ if (codep < 128) return toupper(codep);
int idx = cfold_lookup(codep);
return (idx == -1) | !(idx & 1) ? codep : cfold_tab[idx - 1];
}
static inline uint32_t utf8_tolower(uint32_t codep) {
+ if (codep < 128) return tolower(codep);
int idx = cfold_lookup(codep);
return (idx == -1) | (idx & 1) ? codep : cfold_tab[idx + 1];
}
static inline int utf8_isalpha(uint32_t codep) {
- int idx = cfold_lookup(codep);
- return (idx != -1);
+ if (codep < 128) return isalpha(codep) != 0;
+ return cfold_lookup(codep) != -1;
}
static inline int utf8_isalnum(uint32_t codep) {
- int idx = cfold_lookup(codep);
- return (idx != -1) | ((codep >= '0') & (codep <= '9'));
+ if (codep < 128) return isalnum(codep) != 0;
+ return cfold_lookup(codep) != -1;
+}
+
+static inline int utf8_isspace(uint32_t codep) {
+ static uint16_t t[] = {0x09, 0x0D, 0x20, 0x85, 0xA0, 0x1680,
+ 0x2028, 0x2029, 0x202F, 0x205F, 0x3000};
+ for (int i=0; i<sizeof t/sizeof *t; ++i)
+ if (codep == t[i]) return true;
+ return (codep >= 0x2000) & (codep <= 0x200A);
+}
+
+static inline int utf8_isxdigit(uint32_t codep) {
+ static uint16_t t[] = {0x30, 0x39, 0x41, 0x46, 0x61, 0x66,
+ 0xFF10, 0xFF19, 0xFF21, 0xFF26, 0xFF41, 0xFF46};
+ for (int i=1; i<sizeof t/sizeof *t; i += 2)
+ if (codep <= t[i]) return codep >= t[i - 1];
+ return false;
}
// ------------------------------------------------------------
@@ -1155,11 +1172,14 @@ int main() {
//printchars();
maketables();
- //printtables();
- printtest();
+ printtables();
+ //printtest();
printf("\ncoll1 %d, probe1: %d\n", coll, count);
- printf("sizes %zu\n", cfold_len*8 + HT_SIZE*2);
-
- printf("size %zu\n", cfold_len);
+ printf("sizes %zu\n", cfold_len*4 + HT_SIZE*2);
+ printf("count %zu\n", cfold_len);
+ int n = 0;
+ for (int i=128; i<256; ++i)
+ n += cfold_lookup(i) != -1;
+ printf("look: %zu, %d\n", look, n);
}
#endif
|
