10 """Generate C++ table for Unicode case folding."""
12 from __future__
import absolute_import
13 from __future__
import division
14 from __future__
import print_function
20 // GENERATED BY make_unicode_casefold.py; DO NOT EDIT.
21 // make_unicode_casefold.py >unicode_casefold.cc
23 #include "re2/unicode_casefold.h"
36 """Compute the delta for b - a. Even/odd and odd/even
37 are handled specially, as described above."""
51 """Return a + delta, handling EvenOdd and OddEven specially."""
52 if type(delta) == int:
54 if delta ==
'EvenOdd':
59 if delta ==
'OddEven':
64 print(
"Bad Delta:", delta, file=sys.stderr)
68 """Turn a list like [(65,97), (66, 98), ..., (90,122)]
69 into [(65, 90, +32)]."""
73 def evenodd(last, a, b, r):
74 if a != last+1
or b !=
_AddDelta(a, r[2]):
79 def evenoddpair(last, a, b, r):
84 if type(delta)
is not str:
86 if delta.endswith(
'Skip'):
97 if ranges
and evenodd(last, a, b, ranges[-1]):
99 elif ranges
and evenoddpair(last, a, b, ranges[-1]):
102 ranges.append([a, a,
_Delta(a, b)])
120 if len(c) > MaxCasefoldGroup:
124 raise unicode.Error(
"bad casegroups %d -> %d" % (c[i-1], c[i]))
126 foldpairs.append([c[i-1], c[i]])
129 for lower, group
in lowergroups.items():
132 lowerpairs.append([g, lower])
134 def printpairs(name, foldpairs):
137 print(
"// %d groups, %d pairs, %d ranges" % (
len(casegroups),
len(foldpairs),
len(foldranges)))
138 print(
"const CaseFold unicode_%s[] = {" % (name,))
139 for lo, hi, delta
in foldranges:
140 print(
"\t{ %d, %d, %s }," % (lo, hi, delta))
142 print(
"const int num_unicode_%s = %d;" % (name,
len(foldranges)))
146 printpairs(
"casefold", foldpairs)
147 printpairs(
"tolower", lowerpairs)
150 if __name__ ==
'__main__':