update
[m6w6/ext-http] / ctype.php
1 <?php
2
3 error_reporting(E_ALL);
4 set_error_handler(function($c, $e, $f, $l) {
5 throw new Exception("$e in $f on line $l");
6 });
7
8 $i18n = $argc >= 2 ? $argv[1] : "/usr/share/i18n/locales/i18n";
9
10 $f = fopen($i18n, "r");
11 $c = false;
12 $a = false;
13 $r = array();
14
15 print <<<C
16 typedef struct utf8_range {
17 unsigned int start;
18 unsigned int end;
19 unsigned char step;
20 } utf8_range_t;
21
22 static const utf8_range_t utf8_ranges[] = {
23
24 C;
25 while (!feof($f)) {
26 $line = fgets($f);
27 if (!$c && $line !== "LC_CTYPE\n") {
28 continue;
29 }
30 $c = true;
31 if ($line === "END LC_CTYPE\n") {
32 break;
33 }
34 switch($line{0}) {
35 case "%":
36 if ($a) {
37 printf("/* %s */\n", trim($line, "%\n/ "));
38 }
39 break;
40 case "\n":
41 if ($a) {
42 break 2;
43 }
44 break;
45 case " ":
46 if ($a) {
47 foreach (explode(";", trim($line, "\n/ ;")) as $ranges) {
48 $range = explode("..", $ranges);
49 $step = 0;
50 $end = 0;
51 switch (count($range)) {
52 case 3:
53 list($sstart, $sstep, $send) = $range;
54 sscanf($sstart, "<U%X>", $start);
55 sscanf($sstep, "(%d)", $step);
56 sscanf($send, "<U%X>", $end);
57
58 break;
59 case 2:
60 list($sstart, $send) = $range;
61 $step = 1;
62 sscanf($sstart, "<U%X>", $start);
63 sscanf($send, "<U%X>", $end);
64 break;
65 case 1:
66 list($sstart) = $range;
67 sscanf($sstart, "<U%X>", $start);
68 break;
69 }
70 print "\t{";
71 if ($start >= 0xffff) {
72 printf("0x%08X, ", $start);
73 if ($end) {
74 printf("0x%08X, ", $end);
75 } else {
76 print(" 0, ");
77 }
78 } else {
79 printf(" 0x%04X, ", $start);
80 if ($end) {
81 printf(" 0x%04X, ", $end);
82 } else {
83 print(" 0, ");
84 }
85 }
86 printf("%d},\n", $step);
87 }
88 }
89 break;
90 default:
91 if ($a) {
92 break 2;
93 } elseif ($line === "alpha /\n") {
94 $a = true;
95 }
96 break;
97 }
98 }
99
100 print <<<C
101 {0, 0, 0}
102 };
103
104 C;