]> arthur.barton.de Git - netatalk.git/commitdiff
case-conversion slightly faster
authorHAT <hat@fa2.so-net.ne.jp>
Fri, 8 Apr 2011 16:26:53 +0000 (01:26 +0900)
committerHAT <hat@fa2.so-net.ne.jp>
Fri, 8 Apr 2011 16:26:53 +0000 (01:26 +0900)
contrib/misc/make-casetable.pl
libatalk/unicode/utf16_case.c
libatalk/unicode/utf16_casetable.h

index 5227150d07d0c80f7cf06f5d4b90d3cdf99f814a..68bcfc9baa8c983e176fda8d7702709e2f47a94a 100755 (executable)
@@ -144,6 +144,9 @@ sub make_array{
         $block_enable[$block] = 0;
     }
 
+    $block_enable[1] = 1;           # ASCII block is forcibly included
+    $block_enable[2] = 1;           # in the array for Speed-Up.
+
     for ($block = 1024 ; $block <= 17409 ; $block++) {
         $block_enable_sp[$block] = 0;
     }
@@ -155,21 +158,21 @@ sub make_array{
     while (<UNICODEDATA>) {
         chop;
         (
-         $code0,
-         $Name1,
-         $General_Category2,
-         $Canonical_Combining_Class3,
-         $Bidi_Class4,
-         $Decomposition_Mapping5,
-         $Numeric_Value6,
-         $Numeric_Value7,
-         $Numeric_Value8,
-         $Bidi_Mirrored9,
-         $Unicode_1_Name10,
-         $ISO_Comment11,
-         $Simple_Uppercase_Mapping12,
-         $Simple_Lowercase_Mapping13,
-         $Simple_Titlecase_Mapping14
+            $code0,
+            $Name1,
+            $General_Category2,
+            $Canonical_Combining_Class3,
+            $Bidi_Class4,
+            $Decomposition_Mapping5,
+            $Numeric_Value6,
+            $Numeric_Value7,
+            $Numeric_Value8,
+            $Bidi_Mirrored9,
+            $Unicode_1_Name10,
+            $ISO_Comment11,
+            $Simple_Uppercase_Mapping12,
+            $Simple_Lowercase_Mapping13,
+            $Simple_Titlecase_Mapping14
         ) = split(/\;/);
 
         if ($_[0] eq "upper") {
@@ -236,15 +239,22 @@ sub make_array{
                        $table[$char][0],
                        $table[$char][1],
                        $table[$char][2]
-                    );
+                   );
             }
             printf(CHEADER "\}\;\n");
             printf(CHEADER "\n");
 
-            printf(CSOURCE "    if \( val \>\= 0x%04X \&\& val \<\= 0x%04X)\n",
-                   $char_start, $char_end);
-            printf(CSOURCE "        return %s\_table\_%d\[val-0x%04X\]\;\n",
-                   $_[0], $table_no, $char_start);
+            if ($char_start == 0x0000) {
+                printf(CSOURCE "    if \( val \<\= 0x%04X)\n",
+                       $char_end);
+                printf(CSOURCE "        return %s\_table\_%d\[val]\;\n",
+                       $_[0], $table_no);
+            } else {
+                printf(CSOURCE "    if \( val \>\= 0x%04X \&\& val \<\= 0x%04X)\n",
+                       $char_start, $char_end);
+                printf(CSOURCE "        return %s\_table\_%d\[val-0x%04X\]\;\n",
+                       $_[0], $table_no, $char_start);
+            }
             printf(CSOURCE "\n");
 
             $table_no++;
@@ -269,13 +279,13 @@ sub make_array{
 
         # rising edge detection
         if ((($block_enable_sp[$block - 1] == 0) || ((($block - 1) & 0xF) == 0))
-            && ($block_enable_sp[$block] == 1)) {
+                && ($block_enable_sp[$block] == 1)) {
             $block_start = $block;
         }
 
         # falling edge detection
         if (($block_enable_sp[$block] == 1) &&
-            ((($block - 1) & 0xF == 0xF) || ($block_enable_sp[$block + 1] == 0))) {
+                ((($block - 1) & 0xF == 0xF) || ($block_enable_sp[$block + 1] == 0))) {
             $block_end = $block;
 
             $char_start = ($block_start -1)* 64;
@@ -291,7 +301,7 @@ sub make_array{
                        $table_sp[$char][2],
                        $table_sp[$char][3],
                        $table_sp[$char][4]
-                    );
+                   );
             }
             printf(CHEADER "\}\;\n");
             printf(CHEADER "\n");
index bdf5e3a4731ea14650c36320cf06fb94adbb9f47..5b23ee32c970e9b7b9ec904ee917f0a727d702e0 100644 (file)
@@ -17,8 +17,8 @@ http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
 *******************************************************************/
 ucs2_t toupper_w(ucs2_t val)
 {
-    if ( val >= 0x0040 && val <= 0x02BF)
-        return upper_table_1[val-0x0040];
+    if ( val <= 0x02BF)
+        return upper_table_1[val];
 
     if ( val >= 0x0340 && val <= 0x05BF)
         return upper_table_2[val-0x0340];
@@ -66,8 +66,8 @@ u_int32_t toupper_sp(u_int32_t val)
 *******************************************************************/
 ucs2_t tolower_w(ucs2_t val)
 {
-    if ( val >= 0x0040 && val <= 0x007F)
-        return lower_table_1[val-0x0040];
+    if ( val <= 0x007F)
+        return lower_table_1[val];
 
     if ( val >= 0x00C0 && val <= 0x027F)
         return lower_table_2[val-0x00C0];
index 4872a8c407718bbd777ae4d11dccba0d5fd92b2f..9a1366e32f91f45bea06c72af8b8552355e9de0f 100644 (file)
@@ -8,7 +8,71 @@ UnicodeData.txt is got from
 http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
 */
 
-static const u_int16_t upper_table_1[640] = {
+static const u_int16_t upper_table_1[704] = {
+  0x0000, /*U+0000*/ /**/
+  0x0001, /*U+0001*/ /**/
+  0x0002, /*U+0002*/ /**/
+  0x0003, /*U+0003*/ /**/
+  0x0004, /*U+0004*/ /**/
+  0x0005, /*U+0005*/ /**/
+  0x0006, /*U+0006*/ /**/
+  0x0007, /*U+0007*/ /**/
+  0x0008, /*U+0008*/ /**/
+  0x0009, /*U+0009*/ /**/
+  0x000A, /*U+000A*/ /**/
+  0x000B, /*U+000B*/ /**/
+  0x000C, /*U+000C*/ /**/
+  0x000D, /*U+000D*/ /**/
+  0x000E, /*U+000E*/ /**/
+  0x000F, /*U+000F*/ /**/
+  0x0010, /*U+0010*/ /**/
+  0x0011, /*U+0011*/ /**/
+  0x0012, /*U+0012*/ /**/
+  0x0013, /*U+0013*/ /**/
+  0x0014, /*U+0014*/ /**/
+  0x0015, /*U+0015*/ /**/
+  0x0016, /*U+0016*/ /**/
+  0x0017, /*U+0017*/ /**/
+  0x0018, /*U+0018*/ /**/
+  0x0019, /*U+0019*/ /**/
+  0x001A, /*U+001A*/ /**/
+  0x001B, /*U+001B*/ /**/
+  0x001C, /*U+001C*/ /**/
+  0x001D, /*U+001D*/ /**/
+  0x001E, /*U+001E*/ /**/
+  0x001F, /*U+001F*/ /**/
+  0x0020, /*U+0020*/ /**/
+  0x0021, /*U+0021*/ /**/
+  0x0022, /*U+0022*/ /**/
+  0x0023, /*U+0023*/ /**/
+  0x0024, /*U+0024*/ /**/
+  0x0025, /*U+0025*/ /**/
+  0x0026, /*U+0026*/ /**/
+  0x0027, /*U+0027*/ /**/
+  0x0028, /*U+0028*/ /**/
+  0x0029, /*U+0029*/ /**/
+  0x002A, /*U+002A*/ /**/
+  0x002B, /*U+002B*/ /**/
+  0x002C, /*U+002C*/ /**/
+  0x002D, /*U+002D*/ /**/
+  0x002E, /*U+002E*/ /**/
+  0x002F, /*U+002F*/ /**/
+  0x0030, /*U+0030*/ /**/
+  0x0031, /*U+0031*/ /**/
+  0x0032, /*U+0032*/ /**/
+  0x0033, /*U+0033*/ /**/
+  0x0034, /*U+0034*/ /**/
+  0x0035, /*U+0035*/ /**/
+  0x0036, /*U+0036*/ /**/
+  0x0037, /*U+0037*/ /**/
+  0x0038, /*U+0038*/ /**/
+  0x0039, /*U+0039*/ /**/
+  0x003A, /*U+003A*/ /**/
+  0x003B, /*U+003B*/ /**/
+  0x003C, /*U+003C*/ /**/
+  0x003D, /*U+003D*/ /**/
+  0x003E, /*U+003E*/ /**/
+  0x003F, /*U+003F*/ /**/
   0x0040, /*U+0040*/ /**/
   0x0041, /*U+0041*/ /**/
   0x0042, /*U+0042*/ /**/
@@ -2921,7 +2985,71 @@ static const u_int32_t upper_table_sp_1[128] = {
   0xD801DC7F, /*0xD801DC7F*/ /*U+01047F*/ /*U+01047F*/ /**/
 };
 
-static const u_int16_t lower_table_1[64] = {
+static const u_int16_t lower_table_1[128] = {
+  0x0000, /*U+0000*/ /**/
+  0x0001, /*U+0001*/ /**/
+  0x0002, /*U+0002*/ /**/
+  0x0003, /*U+0003*/ /**/
+  0x0004, /*U+0004*/ /**/
+  0x0005, /*U+0005*/ /**/
+  0x0006, /*U+0006*/ /**/
+  0x0007, /*U+0007*/ /**/
+  0x0008, /*U+0008*/ /**/
+  0x0009, /*U+0009*/ /**/
+  0x000A, /*U+000A*/ /**/
+  0x000B, /*U+000B*/ /**/
+  0x000C, /*U+000C*/ /**/
+  0x000D, /*U+000D*/ /**/
+  0x000E, /*U+000E*/ /**/
+  0x000F, /*U+000F*/ /**/
+  0x0010, /*U+0010*/ /**/
+  0x0011, /*U+0011*/ /**/
+  0x0012, /*U+0012*/ /**/
+  0x0013, /*U+0013*/ /**/
+  0x0014, /*U+0014*/ /**/
+  0x0015, /*U+0015*/ /**/
+  0x0016, /*U+0016*/ /**/
+  0x0017, /*U+0017*/ /**/
+  0x0018, /*U+0018*/ /**/
+  0x0019, /*U+0019*/ /**/
+  0x001A, /*U+001A*/ /**/
+  0x001B, /*U+001B*/ /**/
+  0x001C, /*U+001C*/ /**/
+  0x001D, /*U+001D*/ /**/
+  0x001E, /*U+001E*/ /**/
+  0x001F, /*U+001F*/ /**/
+  0x0020, /*U+0020*/ /**/
+  0x0021, /*U+0021*/ /**/
+  0x0022, /*U+0022*/ /**/
+  0x0023, /*U+0023*/ /**/
+  0x0024, /*U+0024*/ /**/
+  0x0025, /*U+0025*/ /**/
+  0x0026, /*U+0026*/ /**/
+  0x0027, /*U+0027*/ /**/
+  0x0028, /*U+0028*/ /**/
+  0x0029, /*U+0029*/ /**/
+  0x002A, /*U+002A*/ /**/
+  0x002B, /*U+002B*/ /**/
+  0x002C, /*U+002C*/ /**/
+  0x002D, /*U+002D*/ /**/
+  0x002E, /*U+002E*/ /**/
+  0x002F, /*U+002F*/ /**/
+  0x0030, /*U+0030*/ /**/
+  0x0031, /*U+0031*/ /**/
+  0x0032, /*U+0032*/ /**/
+  0x0033, /*U+0033*/ /**/
+  0x0034, /*U+0034*/ /**/
+  0x0035, /*U+0035*/ /**/
+  0x0036, /*U+0036*/ /**/
+  0x0037, /*U+0037*/ /**/
+  0x0038, /*U+0038*/ /**/
+  0x0039, /*U+0039*/ /**/
+  0x003A, /*U+003A*/ /**/
+  0x003B, /*U+003B*/ /**/
+  0x003C, /*U+003C*/ /**/
+  0x003D, /*U+003D*/ /**/
+  0x003E, /*U+003E*/ /**/
+  0x003F, /*U+003F*/ /**/
   0x0040, /*U+0040*/ /**/
   0x0061, /*U+0041*/ /*LATIN CAPITAL LETTER A*/
   0x0062, /*U+0042*/ /*LATIN CAPITAL LETTER B*/