4 error_reporting(E_ALL
);
5 set_error_handler(function($c, $e, $f, $l) {
6 throw new Exception("$e in $f on line $l");
9 $i18n = $argc >= 2 ?
$argv[1] : "/usr/share/i18n/locales/i18n";
12 $m = 0xfffff000 >> $b;
16 $f = fopen($i18n, "r");
20 ob_start(null, 0xfffff);
22 printf("/* generated on %s with\n b = %d\n m = 0x%08x\n b2= %d\n*/",
23 strftime("%x %X"), $b, $m, $b2);
27 if (!$c && $line !== "LC_CTYPE\n") {
31 if ($line === "END LC_CTYPE\n") {
44 foreach (explode(";", trim($line, "\n/ ;")) as $ranges) {
45 $range = explode("..", $ranges);
48 switch (count($range)) {
50 list($sstart, $sstep, $send) = $range;
51 sscanf($sstart, "<U%X>", $start);
52 sscanf($sstep, "(%d)", $step);
53 sscanf($send, "<U%X>", $end);
57 list($sstart, $send) = $range;
59 sscanf($sstart, "<U%X>", $start);
60 sscanf($send, "<U%X>", $end);
63 list($sstart) = $range;
64 sscanf($sstart, "<U%X>", $start);
67 $r[$start >> $b][($start & $m) >> $b2][]=[$start,$end,$step];
74 } elseif ($line === "alpha /\n") {
81 function sp($sp, $ch = " ") { return str_repeat($ch, $sp); }
82 printf("switch (ch >> %d) {\n", $b);
83 foreach ($r as $sw => $sws) {
84 printf("case 0x%08X:\n", $sw);
85 printf(" switch((ch & 0x%08X) >> %d) {\n", $m, $b2);
86 foreach ($sws as $sw2 => $specs) {
87 printf(" case 0x%08X:\n", $sw2);
89 foreach ($specs as list($start, $end, $step)) {
92 die("\nUNEXPECTED: step>1\n");
93 printf("\tfor (i=0x%08X; i <= 0x%08X; i+= %d) { if (i == ch) return 1; }\n", $start, $end, $step);
95 //printf(" if (ch >= 0x%08X && ch <= 0x%08X) return 1;\n", $start, $end);
96 printf("%sif (ch >= 0x%08X) {\n", sp($sp), $start);
97 printf("%sif (ch <= 0x%08X) return 1;\n", sp(++
$sp), $end);
100 printf("%sif (ch == 0x%08X) return 1;\n", sp($sp), $start);
103 printf(" %s\n break;\n", sp($sp-2, "}"));
105 printf(" }\n break;\n");
109 file_put_contents("php_http_utf8.h",
110 preg_replace('/(\/\* BEGIN::UTF8SWITCH \*\/\n).*(\n\s*\/\* END::UTF8SWITCH \*\/)/s', '$1'. ob_get_contents() .'$2',
111 file_get_contents("php_http_utf8.h")));