fix edge cases with @
[m6w6/ext-http] / gen_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 $f = fopen($i18n, "r");
12 $c = false;
13 $a = false;
14
15 ob_start(null, 0xffff);
16 while (!feof($f)) {
17 $line = fgets($f);
18 if (!$c && $line !== "LC_CTYPE\n") {
19 continue;
20 }
21 $c = true;
22 if ($line === "END LC_CTYPE\n") {
23 break;
24 }
25 switch($line{0}) {
26 case "%":
27 if ($a) {
28 printf("/* %s */\n", trim($line, "%\n/ "));
29 }
30 break;
31 case "\n":
32 if ($a) {
33 break 2;
34 }
35 break;
36 case " ":
37 if ($a) {
38 foreach (explode(";", trim($line, "\n/ ;")) as $ranges) {
39 $range = explode("..", $ranges);
40 $step = 0;
41 $end = 0;
42 switch (count($range)) {
43 case 3:
44 list($sstart, $sstep, $send) = $range;
45 sscanf($sstart, "<U%X>", $start);
46 sscanf($sstep, "(%d)", $step);
47 sscanf($send, "<U%X>", $end);
48
49 break;
50 case 2:
51 list($sstart, $send) = $range;
52 $step = 1;
53 sscanf($sstart, "<U%X>", $start);
54 sscanf($send, "<U%X>", $end);
55 break;
56 case 1:
57 list($sstart) = $range;
58 sscanf($sstart, "<U%X>", $start);
59 break;
60 }
61 print "\t{";
62 if ($start >= 0xffff) {
63 printf("0x%08X, ", $start);
64 if ($end) {
65 printf("0x%08X, ", $end);
66 } else {
67 print(" 0, ");
68 }
69 } else {
70 printf(" 0x%04X, ", $start);
71 if ($end) {
72 printf(" 0x%04X, ", $end);
73 } else {
74 print(" 0, ");
75 }
76 }
77 printf("%d},\n", $step);
78 }
79 }
80 break;
81 default:
82 if ($a) {
83 break 2;
84 } elseif ($line === "alpha /\n") {
85 $a = true;
86 }
87 break;
88 }
89 }
90
91 file_put_contents("php_http_utf8.h",
92 preg_replace('/(\/\* BEGIN::UTF8TABLE \*\/\n).*(\n\s*\/\* END::UTF8TABLE \*\/)/s', '$1'. ob_get_contents() .'$2',
93 file_get_contents("php_http_utf8.h")));