unrolled isualpha
[m6w6/ext-http] / scripts / gen_switch_utf8.php
1 #!/usr/bin/env php
2 <?php
3
4 error_reporting(E_ALL);
5 set_error_handler(function($c, $e, $f, $l) {
6 throw new Exception("$e in $f on line $l");
7 });
8
9 $i18n = $argc >= 2 ? $argv[1] : "/usr/share/i18n/locales/i18n";
10
11 $b = 10;
12
13 $f = fopen($i18n, "r");
14 $c = false;
15 $a = false;
16
17 ob_start(null, 0xfffff);
18 while (!feof($f)) {
19 $line = fgets($f);
20 if (!$c && $line !== "LC_CTYPE\n") {
21 continue;
22 }
23 $c = true;
24 if ($line === "END LC_CTYPE\n") {
25 break;
26 }
27 switch($line{0}) {
28 case "%":
29 break;
30 case "\n":
31 if ($a) {
32 break 2;
33 }
34 break;
35 case " ":
36 if ($a) {
37 foreach (explode(";", trim($line, "\n/ ;")) as $ranges) {
38 $range = explode("..", $ranges);
39 $step = 0;
40 $end = 0;
41 switch (count($range)) {
42 case 3:
43 list($sstart, $sstep, $send) = $range;
44 sscanf($sstart, "<U%X>", $start);
45 sscanf($sstep, "(%d)", $step);
46 sscanf($send, "<U%X>", $end);
47
48 break;
49 case 2:
50 list($sstart, $send) = $range;
51 $step = 1;
52 sscanf($sstart, "<U%X>", $start);
53 sscanf($send, "<U%X>", $end);
54 break;
55 case 1:
56 list($sstart) = $range;
57 sscanf($sstart, "<U%X>", $start);
58 break;
59 }
60 $r[$start >> $b][]=[$start,$end,$step];
61 }
62 }
63 break;
64 default:
65 if ($a) {
66 break 2;
67 } elseif ($line === "alpha /\n") {
68 $a = true;
69 }
70 break;
71 }
72 }
73
74 function sp($sp, $ch = " ") { return str_repeat($ch, $sp); }
75 printf("switch (ch >> %d) {\n", $b);
76 foreach ($r as $sw => $specs) {
77 printf("case 0x%08X:\n", $sw);
78 $sp = 1;
79 foreach ($specs as list($start, $end, $step)) {
80 if ($end) {
81 if ($step > 1) {
82 die("\nUNEXPECTED: step>1\n");
83 printf("\tfor (i=0x%08X; i <= 0x%08X; i+= %d) { if (i == ch) return 1; }\n", $start, $end, $step);
84 } else {
85 //printf(" if (ch >= 0x%08X && ch <= 0x%08X) return 1;\n", $start, $end);
86 printf("%sif (ch >= 0x%08X) {\n", sp($sp), $start);
87 printf("%sif (ch <= 0x%08X) return 1;\n", sp(++$sp), $end);
88 }
89 } else {
90 printf("%sif (ch == 0x%08X) return 1;\n", sp($sp), $start);
91 }
92 }
93 printf(" %s\n break;\n", sp(--$sp, "}"));
94 }
95 printf("}\n");
96
97 file_put_contents("php_http_utf8.h",
98 preg_replace('/(\/\* BEGIN::UTF8SWITCH \*\/\n).*(\n\s*\/\* END::UTF8SWITCH \*\/)/s', '$1'. ob_get_contents() .'$2',
99 file_get_contents("php_http_utf8.h")));