@@ -178,50 +178,118 @@ def emit_property_module_old(f, mod, tbl):
178
178
f .write (" }\n \n " )
179
179
f .write ("}\n " )
180
180
181
+ def format_table_content (f , content , indent ):
182
+ line = " " * indent
183
+ first = True
184
+ for chunk in content .split ("," ):
185
+ if len (line ) + len (chunk ) < 98 :
186
+ if first :
187
+ line += chunk
188
+ else :
189
+ line += ", " + chunk
190
+ first = False
191
+ else :
192
+ f .write (line + ",\n " )
193
+ line = " " * indent + chunk
194
+ f .write (line )
195
+
181
196
def emit_decomp_module (f , canon , compat ):
182
197
canon_keys = canon .keys ()
183
198
canon_keys .sort ()
184
199
185
200
compat_keys = compat .keys ()
186
201
compat_keys .sort ()
187
- f .write ("mod decompose {\n \n " );
188
- f .write (" export canonical, compatibility;\n \n " )
189
- f .write (" fn canonical(c: char, i: block(char)) "
190
- + "{ d(c, i, false); }\n \n " )
191
- f .write (" fn compatibility(c: char, i: block(char)) "
202
+ f .write ("pub mod decompose {\n " );
203
+ f .write (" use option::Option;\n " );
204
+ f .write (" use option::{Some, None};\n " );
205
+ f .write (" use vec::ImmutableVector;\n " );
206
+ f .write ("""
207
+ fn bsearch_table(c: char, r: &'static [(char, &'static [char])]) -> Option<&'static [char]> {
208
+ use cmp::{Equal, Less, Greater};
209
+ match r.bsearch(|&(val, _)| {
210
+ if c == val { Equal }
211
+ else if val < c { Less }
212
+ else { Greater }
213
+ }) {
214
+ Some(idx) => {
215
+ let (_, result) = r[idx];
216
+ Some(result)
217
+ }
218
+ None => None
219
+ }
220
+ }\n \n
221
+ """ )
222
+ f .write (" // Canonical decompositions\n " )
223
+ f .write (" static canonical_table : &'static [(char, &'static [char])] = &[\n " )
224
+ data = ""
225
+ first = True
226
+ for char in canon_keys :
227
+ if not first :
228
+ data += ","
229
+ first = False
230
+ data += "(%s,&[" % escape_char (char )
231
+ first2 = True
232
+ for d in canon [char ]:
233
+ if not first2 :
234
+ data += ","
235
+ first2 = False
236
+ data += escape_char (d )
237
+ data += "])"
238
+ format_table_content (f , data , 8 )
239
+ f .write ("\n ];\n \n " )
240
+ f .write (" // Compatibility decompositions\n " )
241
+ f .write (" static compatibility_table : &'static [(char, &'static [char])] = &[\n " )
242
+ data = ""
243
+ first = True
244
+ for char in compat_keys :
245
+ if not first :
246
+ data += ","
247
+ first = False
248
+ data += "(%s,&[" % escape_char (char )
249
+ first2 = True
250
+ for d in compat [char ]:
251
+ if not first2 :
252
+ data += ","
253
+ first2 = False
254
+ data += escape_char (d )
255
+ data += "])"
256
+ format_table_content (f , data , 8 )
257
+ f .write ("\n ];\n \n " )
258
+ f .write (" pub fn canonical(c: char, i: &fn(char)) "
259
+ + "{ d(c, i, false); }\n \n " )
260
+ f .write (" pub fn compatibility(c: char, i: &fn(char)) "
192
261
+ "{ d(c, i, true); }\n \n " )
193
- f .write (" fn d(c: char, i: block(char), k: bool) {\n " )
262
+ f .write (" fn d(c: char, i: &fn(char), k: bool) {\n " )
263
+ f .write (" use iterator::Iterator;\n " );
194
264
195
- f .write (" if c <= '\\ x7f' { i(c); ret ; }\n " )
265
+ f .write (" if c <= '\\ x7f' { i(c); return ; }\n " )
196
266
197
267
# First check the canonical decompositions
198
- f .write (" // Canonical decomposition\n " )
199
- f .write (" alt c {\n " )
200
- for char in canon_keys :
201
- f .write (" %s {\n " % escape_char (char ))
202
- for d in canon [char ]:
203
- f .write (" d(%s, i, k);\n "
204
- % escape_char (d ))
205
- f .write (" }\n " )
206
-
207
- f .write (" _ { }\n " )
208
- f .write (" }\n \n " )
268
+ f .write ("""
269
+ match bsearch_table(c, canonical_table) {
270
+ Some(canon) => {
271
+ for x in canon.iter() {
272
+ d(*x, |b| i(b), k);
273
+ }
274
+ return;
275
+ }
276
+ None => ()
277
+ }\n \n """ )
209
278
210
279
# Bottom out if we're not doing compat.
211
- f .write (" if !k { i(c); ret ; }\n \n " )
280
+ f .write (" if !k { i(c); return ; }\n " )
212
281
213
282
# Then check the compatibility decompositions
214
- f .write (" // Compatibility decomposition\n " )
215
- f .write (" alt c {\n " )
216
- for char in compat_keys :
217
- f .write (" %s {\n " % escape_char (char ))
218
- for d in compat [char ]:
219
- f .write (" d(%s, i, k);\n "
220
- % escape_char (d ))
221
- f .write (" }\n " )
222
-
223
- f .write (" _ { }\n " )
224
- f .write (" }\n \n " )
283
+ f .write ("""
284
+ match bsearch_table(c, compatibility_table) {
285
+ Some(compat) => {
286
+ for x in compat.iter() {
287
+ d(*x, |b| i(b), k);
288
+ }
289
+ return;
290
+ }
291
+ None => ()
292
+ }\n \n """ )
225
293
226
294
# Finally bottom out.
227
295
f .write (" i(c);\n " )
@@ -256,7 +324,7 @@ def emit_decomp_module(f, canon, compat):
256
324
257
325
emit_property_module (rf , "general_category" , gencats )
258
326
259
- # emit_decomp_module(rf, canon_decomp, compat_decomp)
327
+ emit_decomp_module (rf , canon_decomp , compat_decomp )
260
328
261
329
derived = load_derived_core_properties ("DerivedCoreProperties.txt" )
262
330
emit_property_module (rf , "derived_property" , derived )
0 commit comments