@@ -1469,6 +1469,22 @@ pub mod decompose {
1469
1469
}
1470
1470
1471
1471
1472
+ fn bsearch_range_value_table ( c : char , r : & ' static [ ( char , char , u8 ) ] ) -> u8 {
1473
+ use cmp:: { Equal , Less , Greater } ;
1474
+ match r. bsearch ( |& ( lo, hi, _) | {
1475
+ if lo <= c && c <= hi { Equal }
1476
+ else if hi < c { Less }
1477
+ else { Greater }
1478
+ } ) {
1479
+ Some ( idx) => {
1480
+ let ( _, _, result) = r[ idx] ;
1481
+ result
1482
+ }
1483
+ None => 0
1484
+ }
1485
+ }
1486
+
1487
+
1472
1488
// Canonical decompositions
1473
1489
static canonical_table : & ' static [ ( char , & ' static [ char ] ) ] = & [
1474
1490
( '\xc0' , & [ '\x41' , '\u0300' ] ) , ( '\xc1' , & [ '\x41' , '\u0301' ] ) , ( '\xc2' , & [ '\x41' , '\u0302' ] ) ,
@@ -3465,10 +3481,160 @@ pub mod decompose {
3465
3481
& [ '\u53ef' ] )
3466
3482
] ;
3467
3483
3484
+ static combining_class_table : & ' static [ ( char , char , u8 ) ] = & [
3485
+ ( '\u0300' , '\u0314' , 230 ) , ( '\u0315' , '\u0315' , 232 ) ,
3486
+ ( '\u0316' , '\u0319' , 220 ) , ( '\u031a' , '\u031a' , 232 ) ,
3487
+ ( '\u031b' , '\u031b' , 216 ) , ( '\u031c' , '\u0320' , 220 ) ,
3488
+ ( '\u0321' , '\u0322' , 202 ) , ( '\u0323' , '\u0326' , 220 ) ,
3489
+ ( '\u0327' , '\u0328' , 202 ) , ( '\u0329' , '\u0333' , 220 ) ,
3490
+ ( '\u0334' , '\u0338' , 1 ) , ( '\u0339' , '\u033c' , 220 ) ,
3491
+ ( '\u033d' , '\u0344' , 230 ) , ( '\u0345' , '\u0345' , 240 ) ,
3492
+ ( '\u0346' , '\u0346' , 230 ) , ( '\u0347' , '\u0349' , 220 ) ,
3493
+ ( '\u034a' , '\u034c' , 230 ) , ( '\u034d' , '\u034e' , 220 ) ,
3494
+ ( '\u0350' , '\u0352' , 230 ) , ( '\u0353' , '\u0356' , 220 ) ,
3495
+ ( '\u0357' , '\u0357' , 230 ) , ( '\u0358' , '\u0358' , 232 ) ,
3496
+ ( '\u0359' , '\u035a' , 220 ) , ( '\u035b' , '\u035b' , 230 ) ,
3497
+ ( '\u035c' , '\u035c' , 233 ) , ( '\u035d' , '\u035e' , 234 ) ,
3498
+ ( '\u035f' , '\u035f' , 233 ) , ( '\u0360' , '\u0361' , 234 ) ,
3499
+ ( '\u0362' , '\u0362' , 233 ) , ( '\u0363' , '\u036f' , 230 ) ,
3500
+ ( '\u0483' , '\u0487' , 230 ) , ( '\u0591' , '\u0591' , 220 ) ,
3501
+ ( '\u0592' , '\u0595' , 230 ) , ( '\u0596' , '\u0596' , 220 ) ,
3502
+ ( '\u0597' , '\u0599' , 230 ) , ( '\u059a' , '\u059a' , 222 ) ,
3503
+ ( '\u059b' , '\u059b' , 220 ) , ( '\u059c' , '\u05a1' , 230 ) ,
3504
+ ( '\u05a2' , '\u05a7' , 220 ) , ( '\u05a8' , '\u05a9' , 230 ) ,
3505
+ ( '\u05aa' , '\u05aa' , 220 ) , ( '\u05ab' , '\u05ac' , 230 ) ,
3506
+ ( '\u05ad' , '\u05ad' , 222 ) , ( '\u05ae' , '\u05ae' , 228 ) ,
3507
+ ( '\u05af' , '\u05af' , 230 ) , ( '\u05b0' , '\u05b0' , 10 ) ,
3508
+ ( '\u05b1' , '\u05b1' , 11 ) , ( '\u05b2' , '\u05b2' , 12 ) ,
3509
+ ( '\u05b3' , '\u05b3' , 13 ) , ( '\u05b4' , '\u05b4' , 14 ) ,
3510
+ ( '\u05b5' , '\u05b5' , 15 ) , ( '\u05b6' , '\u05b6' , 16 ) ,
3511
+ ( '\u05b7' , '\u05b7' , 17 ) , ( '\u05b8' , '\u05b8' , 18 ) ,
3512
+ ( '\u05b9' , '\u05ba' , 19 ) , ( '\u05bb' , '\u05bb' , 20 ) ,
3513
+ ( '\u05bc' , '\u05bc' , 21 ) , ( '\u05bd' , '\u05bd' , 22 ) ,
3514
+ ( '\u05bf' , '\u05bf' , 23 ) , ( '\u05c1' , '\u05c1' , 24 ) ,
3515
+ ( '\u05c2' , '\u05c2' , 25 ) , ( '\u05c4' , '\u05c4' , 230 ) ,
3516
+ ( '\u05c5' , '\u05c5' , 220 ) , ( '\u05c7' , '\u05c7' , 18 ) ,
3517
+ ( '\u0610' , '\u0617' , 230 ) , ( '\u0618' , '\u0618' , 30 ) ,
3518
+ ( '\u0619' , '\u0619' , 31 ) , ( '\u061a' , '\u061a' , 32 ) ,
3519
+ ( '\u064b' , '\u064b' , 27 ) , ( '\u064c' , '\u064c' , 28 ) ,
3520
+ ( '\u064d' , '\u064d' , 29 ) , ( '\u064e' , '\u064e' , 30 ) ,
3521
+ ( '\u064f' , '\u064f' , 31 ) , ( '\u0650' , '\u0650' , 32 ) ,
3522
+ ( '\u0651' , '\u0651' , 33 ) , ( '\u0652' , '\u0652' , 34 ) ,
3523
+ ( '\u0653' , '\u0654' , 230 ) , ( '\u0655' , '\u0656' , 220 ) ,
3524
+ ( '\u0657' , '\u065b' , 230 ) , ( '\u065c' , '\u065c' , 220 ) ,
3525
+ ( '\u065d' , '\u065e' , 230 ) , ( '\u065f' , '\u065f' , 220 ) ,
3526
+ ( '\u0670' , '\u0670' , 35 ) , ( '\u06d6' , '\u06dc' , 230 ) ,
3527
+ ( '\u06df' , '\u06e2' , 230 ) , ( '\u06e3' , '\u06e3' , 220 ) ,
3528
+ ( '\u06e4' , '\u06e4' , 230 ) , ( '\u06e7' , '\u06e8' , 230 ) ,
3529
+ ( '\u06ea' , '\u06ea' , 220 ) , ( '\u06eb' , '\u06ec' , 230 ) ,
3530
+ ( '\u06ed' , '\u06ed' , 220 ) , ( '\u0711' , '\u0711' , 36 ) ,
3531
+ ( '\u0730' , '\u0730' , 230 ) , ( '\u0731' , '\u0731' , 220 ) ,
3532
+ ( '\u0732' , '\u0733' , 230 ) , ( '\u0734' , '\u0734' , 220 ) ,
3533
+ ( '\u0735' , '\u0736' , 230 ) , ( '\u0737' , '\u0739' , 220 ) ,
3534
+ ( '\u073a' , '\u073a' , 230 ) , ( '\u073b' , '\u073c' , 220 ) ,
3535
+ ( '\u073d' , '\u073d' , 230 ) , ( '\u073e' , '\u073e' , 220 ) ,
3536
+ ( '\u073f' , '\u0741' , 230 ) , ( '\u0742' , '\u0742' , 220 ) ,
3537
+ ( '\u0743' , '\u0743' , 230 ) , ( '\u0744' , '\u0744' , 220 ) ,
3538
+ ( '\u0745' , '\u0745' , 230 ) , ( '\u0746' , '\u0746' , 220 ) ,
3539
+ ( '\u0747' , '\u0747' , 230 ) , ( '\u0748' , '\u0748' , 220 ) ,
3540
+ ( '\u0749' , '\u074a' , 230 ) , ( '\u07eb' , '\u07f1' , 230 ) ,
3541
+ ( '\u07f2' , '\u07f2' , 220 ) , ( '\u07f3' , '\u07f3' , 230 ) ,
3542
+ ( '\u0816' , '\u0819' , 230 ) , ( '\u081b' , '\u0823' , 230 ) ,
3543
+ ( '\u0825' , '\u0827' , 230 ) , ( '\u0829' , '\u082d' , 230 ) ,
3544
+ ( '\u0859' , '\u085b' , 220 ) , ( '\u08e4' , '\u08e5' , 230 ) ,
3545
+ ( '\u08e6' , '\u08e6' , 220 ) , ( '\u08e7' , '\u08e8' , 230 ) ,
3546
+ ( '\u08e9' , '\u08e9' , 220 ) , ( '\u08ea' , '\u08ec' , 230 ) ,
3547
+ ( '\u08ed' , '\u08ef' , 220 ) , ( '\u08f0' , '\u08f0' , 27 ) ,
3548
+ ( '\u08f1' , '\u08f1' , 28 ) , ( '\u08f2' , '\u08f2' , 29 ) ,
3549
+ ( '\u08f3' , '\u08f5' , 230 ) , ( '\u08f6' , '\u08f6' , 220 ) ,
3550
+ ( '\u08f7' , '\u08f8' , 230 ) , ( '\u08f9' , '\u08fa' , 220 ) ,
3551
+ ( '\u08fb' , '\u08fe' , 230 ) , ( '\u093c' , '\u093c' , 7 ) ,
3552
+ ( '\u094d' , '\u094d' , 9 ) , ( '\u0951' , '\u0951' , 230 ) ,
3553
+ ( '\u0952' , '\u0952' , 220 ) , ( '\u0953' , '\u0954' , 230 ) ,
3554
+ ( '\u09bc' , '\u09bc' , 7 ) , ( '\u09cd' , '\u09cd' , 9 ) ,
3555
+ ( '\u0a3c' , '\u0a3c' , 7 ) , ( '\u0a4d' , '\u0a4d' , 9 ) ,
3556
+ ( '\u0abc' , '\u0abc' , 7 ) , ( '\u0acd' , '\u0acd' , 9 ) ,
3557
+ ( '\u0b3c' , '\u0b3c' , 7 ) , ( '\u0b4d' , '\u0b4d' , 9 ) ,
3558
+ ( '\u0bcd' , '\u0bcd' , 9 ) , ( '\u0c4d' , '\u0c4d' , 9 ) ,
3559
+ ( '\u0c55' , '\u0c55' , 84 ) , ( '\u0c56' , '\u0c56' , 91 ) ,
3560
+ ( '\u0cbc' , '\u0cbc' , 7 ) , ( '\u0ccd' , '\u0ccd' , 9 ) ,
3561
+ ( '\u0d4d' , '\u0d4d' , 9 ) , ( '\u0dca' , '\u0dca' , 9 ) ,
3562
+ ( '\u0e38' , '\u0e39' , 103 ) , ( '\u0e3a' , '\u0e3a' , 9 ) ,
3563
+ ( '\u0e48' , '\u0e4b' , 107 ) , ( '\u0eb8' , '\u0eb9' , 118 ) ,
3564
+ ( '\u0ec8' , '\u0ecb' , 122 ) , ( '\u0f18' , '\u0f19' , 220 ) ,
3565
+ ( '\u0f35' , '\u0f35' , 220 ) , ( '\u0f37' , '\u0f37' , 220 ) ,
3566
+ ( '\u0f39' , '\u0f39' , 216 ) , ( '\u0f71' , '\u0f71' , 129 ) ,
3567
+ ( '\u0f72' , '\u0f72' , 130 ) , ( '\u0f74' , '\u0f74' , 132 ) ,
3568
+ ( '\u0f7a' , '\u0f7d' , 130 ) , ( '\u0f80' , '\u0f80' , 130 ) ,
3569
+ ( '\u0f82' , '\u0f83' , 230 ) , ( '\u0f84' , '\u0f84' , 9 ) ,
3570
+ ( '\u0f86' , '\u0f87' , 230 ) , ( '\u0fc6' , '\u0fc6' , 220 ) ,
3571
+ ( '\u1037' , '\u1037' , 7 ) , ( '\u1039' , '\u103a' , 9 ) ,
3572
+ ( '\u108d' , '\u108d' , 220 ) , ( '\u135d' , '\u135f' , 230 ) ,
3573
+ ( '\u1714' , '\u1714' , 9 ) , ( '\u1734' , '\u1734' , 9 ) ,
3574
+ ( '\u17d2' , '\u17d2' , 9 ) , ( '\u17dd' , '\u17dd' , 230 ) ,
3575
+ ( '\u18a9' , '\u18a9' , 228 ) , ( '\u1939' , '\u1939' , 222 ) ,
3576
+ ( '\u193a' , '\u193a' , 230 ) , ( '\u193b' , '\u193b' , 220 ) ,
3577
+ ( '\u1a17' , '\u1a17' , 230 ) , ( '\u1a18' , '\u1a18' , 220 ) ,
3578
+ ( '\u1a60' , '\u1a60' , 9 ) , ( '\u1a75' , '\u1a7c' , 230 ) ,
3579
+ ( '\u1a7f' , '\u1a7f' , 220 ) , ( '\u1b34' , '\u1b34' , 7 ) ,
3580
+ ( '\u1b44' , '\u1b44' , 9 ) , ( '\u1b6b' , '\u1b6b' , 230 ) ,
3581
+ ( '\u1b6c' , '\u1b6c' , 220 ) , ( '\u1b6d' , '\u1b73' , 230 ) ,
3582
+ ( '\u1baa' , '\u1bab' , 9 ) , ( '\u1be6' , '\u1be6' , 7 ) ,
3583
+ ( '\u1bf2' , '\u1bf3' , 9 ) , ( '\u1c37' , '\u1c37' , 7 ) ,
3584
+ ( '\u1cd0' , '\u1cd2' , 230 ) , ( '\u1cd4' , '\u1cd4' , 1 ) ,
3585
+ ( '\u1cd5' , '\u1cd9' , 220 ) , ( '\u1cda' , '\u1cdb' , 230 ) ,
3586
+ ( '\u1cdc' , '\u1cdf' , 220 ) , ( '\u1ce0' , '\u1ce0' , 230 ) ,
3587
+ ( '\u1ce2' , '\u1ce8' , 1 ) , ( '\u1ced' , '\u1ced' , 220 ) ,
3588
+ ( '\u1cf4' , '\u1cf4' , 230 ) , ( '\u1dc0' , '\u1dc1' , 230 ) ,
3589
+ ( '\u1dc2' , '\u1dc2' , 220 ) , ( '\u1dc3' , '\u1dc9' , 230 ) ,
3590
+ ( '\u1dca' , '\u1dca' , 220 ) , ( '\u1dcb' , '\u1dcc' , 230 ) ,
3591
+ ( '\u1dcd' , '\u1dcd' , 234 ) , ( '\u1dce' , '\u1dce' , 214 ) ,
3592
+ ( '\u1dcf' , '\u1dcf' , 220 ) , ( '\u1dd0' , '\u1dd0' , 202 ) ,
3593
+ ( '\u1dd1' , '\u1de6' , 230 ) , ( '\u1dfc' , '\u1dfc' , 233 ) ,
3594
+ ( '\u1dfd' , '\u1dfd' , 220 ) , ( '\u1dfe' , '\u1dfe' , 230 ) ,
3595
+ ( '\u1dff' , '\u1dff' , 220 ) , ( '\u20d0' , '\u20d1' , 230 ) ,
3596
+ ( '\u20d2' , '\u20d3' , 1 ) , ( '\u20d4' , '\u20d7' , 230 ) ,
3597
+ ( '\u20d8' , '\u20da' , 1 ) , ( '\u20db' , '\u20dc' , 230 ) ,
3598
+ ( '\u20e1' , '\u20e1' , 230 ) , ( '\u20e5' , '\u20e6' , 1 ) ,
3599
+ ( '\u20e7' , '\u20e7' , 230 ) , ( '\u20e8' , '\u20e8' , 220 ) ,
3600
+ ( '\u20e9' , '\u20e9' , 230 ) , ( '\u20ea' , '\u20eb' , 1 ) ,
3601
+ ( '\u20ec' , '\u20ef' , 220 ) , ( '\u20f0' , '\u20f0' , 230 ) ,
3602
+ ( '\u2cef' , '\u2cf1' , 230 ) , ( '\u2d7f' , '\u2d7f' , 9 ) ,
3603
+ ( '\u2de0' , '\u2dff' , 230 ) , ( '\u302a' , '\u302a' , 218 ) ,
3604
+ ( '\u302b' , '\u302b' , 228 ) , ( '\u302c' , '\u302c' , 232 ) ,
3605
+ ( '\u302d' , '\u302d' , 222 ) , ( '\u302e' , '\u302f' , 224 ) ,
3606
+ ( '\u3099' , '\u309a' , 8 ) , ( '\ua66f' , '\ua66f' , 230 ) ,
3607
+ ( '\ua674' , '\ua67d' , 230 ) , ( '\ua69f' , '\ua69f' , 230 ) ,
3608
+ ( '\ua6f0' , '\ua6f1' , 230 ) , ( '\ua806' , '\ua806' , 9 ) ,
3609
+ ( '\ua8c4' , '\ua8c4' , 9 ) , ( '\ua8e0' , '\ua8f1' , 230 ) ,
3610
+ ( '\ua92b' , '\ua92d' , 220 ) , ( '\ua953' , '\ua953' , 9 ) ,
3611
+ ( '\ua9b3' , '\ua9b3' , 7 ) , ( '\ua9c0' , '\ua9c0' , 9 ) ,
3612
+ ( '\uaab0' , '\uaab0' , 230 ) , ( '\uaab2' , '\uaab3' , 230 ) ,
3613
+ ( '\uaab4' , '\uaab4' , 220 ) , ( '\uaab7' , '\uaab8' , 230 ) ,
3614
+ ( '\uaabe' , '\uaabf' , 230 ) , ( '\uaac1' , '\uaac1' , 230 ) ,
3615
+ ( '\uaaf6' , '\uaaf6' , 9 ) , ( '\uabed' , '\uabed' , 9 ) ,
3616
+ ( '\ufb1e' , '\ufb1e' , 26 ) , ( '\ufe20' , '\ufe26' , 230 ) ,
3617
+ ( ' \U 000101 fd' , ' \U 000101 fd' , 220 ) , ( ' \U 00010 a0d' , ' \U 00010 a0d' , 220 ) ,
3618
+ ( ' \U 00010 a0f' , ' \U 00010 a0f' , 230 ) , ( ' \U 00010 a38' , ' \U 00010 a38' , 230 ) ,
3619
+ ( ' \U 00010 a39' , ' \U 00010 a39' , 1 ) , ( ' \U 00010 a3a' , ' \U 00010 a3a' , 220 ) ,
3620
+ ( ' \U 00010 a3f' , ' \U 00010 a3f' , 9 ) , ( ' \U 00011046 ' , ' \U 00011046 ' , 9 ) ,
3621
+ ( ' \U 000110 b9' , ' \U 000110 b9' , 9 ) , ( ' \U 000110 ba' , ' \U 000110 ba' , 7 ) ,
3622
+ ( ' \U 00011100 ' , ' \U 00011102 ' , 230 ) , ( ' \U 00011133 ' , ' \U 00011134 ' , 9 ) ,
3623
+ ( ' \U 000111 c0' , ' \U 000111 c0' , 9 ) , ( ' \U 000116 b6' , ' \U 000116 b6' , 9 ) ,
3624
+ ( ' \U 000116 b7' , ' \U 000116 b7' , 7 ) , ( ' \U 0001 d165' , ' \U 0001 d166' , 216 ) ,
3625
+ ( ' \U 0001 d167' , ' \U 0001 d169' , 1 ) , ( ' \U 0001 d16d' , ' \U 0001 d16d' , 226 ) ,
3626
+ ( ' \U 0001 d16e' , ' \U 0001 d172' , 216 ) , ( ' \U 0001 d17b' , ' \U 0001 d182' , 220 ) ,
3627
+ ( ' \U 0001 d185' , ' \U 0001 d189' , 230 ) , ( ' \U 0001 d18a' , ' \U 0001 d18b' , 220 ) ,
3628
+ ( ' \U 0001 d1aa' , ' \U 0001 d1ad' , 230 ) , ( ' \U 0001 d242' , ' \U 0001 d244' , 230 )
3629
+ ] ;
3468
3630
pub fn canonical ( c : char , i : & fn ( char ) ) { d ( c, i, false ) ; }
3469
3631
3470
3632
pub fn compatibility ( c : char , i : & fn ( char ) ) { d ( c, i, true ) ; }
3471
3633
3634
+ pub fn canonical_combining_class ( c : char ) -> u8 {
3635
+ bsearch_range_value_table ( c, combining_class_table)
3636
+ }
3637
+
3472
3638
fn d ( c : char , i : & fn ( char ) , k : bool ) {
3473
3639
use iterator:: Iterator ;
3474
3640
if c <= '\x7f' { i ( c) ; return ; }
0 commit comments