coverity fixups
[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 $m = 0xfffff000 >> $b;
13 $b2 = 8;
14 $x = $m >> $b2;
15
16 $f = fopen($i18n, "r");
17 $c = false;
18 $a = false;
19
20 $ranges = $lables = $gotos = [];
21
22 ob_start(null, 0xfffff);
23
24 while (!feof($f)) {
25 $line = fgets($f);
26 if (!$c && $line !== "LC_CTYPE\n") {
27 continue;
28 }
29 $c = true;
30 if ($line === "END LC_CTYPE\n") {
31 break;
32 }
33 switch($line{0}) {
34 case "%":
35 break;
36 case "\n":
37 if ($a) {
38 break 2;
39 }
40 break;
41 case " ":
42 if ($a) {
43 foreach (explode(";", trim($line, "\n/ ;")) as $list) {
44 $range = explode("..", $list);
45 $step = 0;
46 $end = 0;
47 switch (count($range)) {
48 case 3:
49 list($sstart, $sstep, $send) = $range;
50 sscanf($sstart, "<U%X>", $start);
51 sscanf($sstep, "(%d)", $step);
52 sscanf($send, "<U%X>", $end);
53
54 break;
55 case 2:
56 list($sstart, $send) = $range;
57 $step = 1;
58 sscanf($sstart, "<U%X>", $start);
59 sscanf($send, "<U%X>", $end);
60 break;
61 case 1:
62 list($sstart) = $range;
63 sscanf($sstart, "<U%X>", $start);
64 break;
65 }
66 $sw = $start >> $b;
67 $sw2 = ($start & $m) >> $b2;
68 if (isset($ranges[$sw][$sw2])) {
69 //$ranges[$sw][$sw2] = array_filter($ranges[$sw][$sw2]);
70 }
71 $ranges[$sw][$sw2][]=[$start,$end,$step];
72 if ($end) {
73 $goto = $start;
74 }
75 while (($start += $step) <= $end) {
76 $ssw = $start >> $b;
77 $ssw2 = ($start & $m) >> $b2;
78 if (!isset($ranges[$ssw][$ssw2]) || null !== end($ranges[$ssw][$ssw2])) {
79 $ranges[$ssw][$ssw2][]=null;
80 }
81 if ($ssw != $sw || $ssw2 != $sw2) {
82 $gotos[$ssw][$ssw2] = $goto;
83 $labels[$sw][$sw2] = $goto;
84 }
85 }
86 }
87 }
88 break;
89 default:
90 if ($a) {
91 break 2;
92 } elseif ($line === "alpha /\n") {
93 $a = true;
94 }
95 break;
96 }
97 }
98
99 function sp($sp, $ch = " ") { return str_repeat($ch, $sp); }
100
101 printf("switch (ch >> %d) {\n", $b);
102 foreach ($ranges as $sw => $sws) {
103 printf("case 0x%08X:\n", $sw);
104 printf(" switch((ch & 0x%08X) >> %d) {\n", $m, $b2);
105 foreach ($sws as $sw2 => $specs) {
106 printf(" case 0x%08X:\n", $sw2);
107 $sp = 2;
108 $start = null;
109 foreach ($specs as $index => $spec) {
110 if ($spec) {
111 list($start, $end, $step) = $spec;
112 if (isset($labels[$sw][$sw2])) {
113 $label = $labels[$sw][$sw2];
114 if ((!$end && $label == $start) || ($end && $label >= $start && $label <= $end)) {
115 printf("%sc_%08X:;\n", sp($sp), $label);
116 }
117 }
118 if ($end) {
119 if ($step > 1) {
120 die("\nUNEXPECTED: step>1\n");
121 printf("\tfor (i=0x%08X; i <= 0x%08X; i+= %d) { if (i == ch) return 1; }\n", $start, $end, $step);
122 } else {
123 printf("%sif (ch >= 0x%08X) {\n", sp($sp), $start);
124 printf("%sif (ch <= 0x%08X) return 1;\n", sp(++$sp), $end);
125 }
126 } else {
127 printf("%sif (ch == 0x%08X) return 1;\n", sp($sp), $start);
128 }
129 } else {
130 if (isset($gotos[$sw][$sw2]) && !$start) {
131 if (isset($specs[$index + 1])) {
132 list($next) = $specs[$index + 1];
133 printf("%sif (ch < 0x%08X)\n ", sp($sp), $next);
134 }
135 $goto = $gotos[$sw][$sw2];
136 printf("%sgoto c_%08X;\n", sp($sp), $goto);
137 $start = $goto;
138 }
139 }
140 }
141 if ($sp > 2) {
142 printf(" %s\n", sp($sp-2, "}"));
143 }
144 printf(" break;\n");
145 }
146 printf(" }\n break;\n");
147 }
148 printf("}\n");
149
150 file_put_contents("php_http_utf8.h",
151 preg_replace('/(\/\* BEGIN::UTF8SWITCH \*\/\n).*(\n\s*\/\* END::UTF8SWITCH \*\/)/s', '$1'. ob_get_contents() .'$2',
152 file_get_contents("php_http_utf8.h")));