Rev 32 | Rev 36 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
27 | daniel-mar | 1 | <?php |
2 | |||
3 | error_reporting(0); |
||
4 | |||
33 | daniel-mar | 5 | define('ICON_ATTR_PRIVATE', 1); |
6 | define('ICON_ATTR_PROTECTED', 2); |
||
7 | define('ICON_ATTR_PUBLIC', 4); |
||
8 | define('ICON_ATTR_ABSTRACT', 8); |
||
9 | define('ICON_ATTR_STATIC', 16); |
||
10 | |||
11 | define('ICON_TYPE_FUNCTION', 'FUNC'); |
||
12 | define('ICON_TYPE_CONSTRUCTOR', 'CSTR'); |
||
13 | define('ICON_TYPE_DESTRUCTOR', 'DSTR'); |
||
14 | define('ICON_TYPE_MAGICMETHOD', 'MGIC'); |
||
15 | define('ICON_TYPE_CLASS', 'CLAS'); |
||
16 | define('ICON_TYPE_TRAIT', 'TRAI'); |
||
17 | define('ICON_TYPE_INTERFACE', 'INTF'); |
||
18 | define('ICON_TYPE_TODO', 'TODO'); |
||
19 | define('ICON_TYPE_ERROR', 'ERR!'); |
||
20 | define('ICON_TYPE_VAR', 'VAR_'); |
||
21 | define('ICON_TYPE_CONST', 'CONS'); |
||
22 | |||
23 | define('ICON_TYPE_FOLDER', 'FOLD'); // unused (TODO: use for TODO) |
||
24 | define('ICON_TYPE_FILE', 'FILE'); // unused |
||
25 | |||
27 | daniel-mar | 26 | while (true) { |
27 | $lines = array(); |
||
28 | while ($f = fgets(STDIN)){ |
||
29 | if (trim($f) == chr(1).chr(2).chr(3).chr(4).chr(5).chr(6).chr(7).chr(8)) break; |
||
30 | $lines[] = $f; |
||
31 | } |
||
32 | $code = implode("", $lines); |
||
33 | |||
34 | echo "FAST100!\n"; |
||
35 | |||
36 | $x = token_get_all($code); |
||
37 | |||
38 | if (!$x) { |
||
33 | daniel-mar | 39 | echo _outputLeafNode(ICON_TYPE_ERROR, 0, 1, 'SYNTAX ERROR'); |
27 | daniel-mar | 40 | } |
41 | |||
42 | $wait_function = false; |
||
43 | $wait_class = false; |
||
33 | daniel-mar | 44 | $wait_trait = false; |
45 | $wait_interface = false; |
||
46 | $wait_abstract_func_list_end = false; |
||
47 | $levelAry = array(); |
||
29 | daniel-mar | 48 | $icon_add_flags = 0; |
27 | daniel-mar | 49 | $dep = 0; |
33 | daniel-mar | 50 | $insideFuncAry = array(); |
27 | daniel-mar | 51 | |
52 | foreach ($x as $n => $data) { |
||
53 | if ($data == '{') $dep++; |
||
54 | if ($data == '}') { |
||
55 | $dep--; |
||
33 | daniel-mar | 56 | if ((count($levelAry) > 0) && (array_peek($levelAry) == $dep)) { |
57 | array_pop($levelAry); |
||
29 | daniel-mar | 58 | echo _outputDecreaseLevel(); |
59 | } |
||
33 | daniel-mar | 60 | if ((count($insideFuncAry) > 0) && (array_peek($insideFuncAry) == $dep)) { |
61 | array_pop($insideFuncAry); |
||
62 | } |
||
27 | daniel-mar | 63 | } |
64 | |||
29 | daniel-mar | 65 | $token = (!is_array($data)) ? null : $data[0]; |
66 | $value = (!is_array($data)) ? null : $data[1]; |
||
33 | daniel-mar | 67 | $line = (!is_array($data)) ? null : $data[2]; |
27 | daniel-mar | 68 | |
69 | if ($wait_function && ($token == T_STRING)) { |
||
33 | daniel-mar | 70 | $wait_function = false; |
71 | if (($icon_add_flags & ICON_ATTR_ABSTRACT) == ICON_ATTR_ABSTRACT) { |
||
72 | $desc = "abstract function $value()"; |
||
73 | $wait_abstract_func_list_end = true; |
||
74 | } else { |
||
75 | $desc = "function $value()"; |
||
76 | $insideFuncAry[] = $dep; |
||
27 | daniel-mar | 77 | } |
29 | daniel-mar | 78 | $icon_add_flags = 0; |
79 | |||
80 | if ($value == '__construct') { // TODO: auch eine methode mit dem namen der klasse soll eine konstruktor sein |
||
33 | daniel-mar | 81 | echo _outputLeafNode(ICON_TYPE_CONSTRUCTOR, $icon_add_flags, $line, $desc); |
29 | daniel-mar | 82 | } else if ($value == '__destruct') { |
33 | daniel-mar | 83 | echo _outputLeafNode(ICON_TYPE_DESTRUCTOR, $icon_add_flags, $line, $desc); |
29 | daniel-mar | 84 | } else if (substr($value, 0, 2) == '__') { |
33 | daniel-mar | 85 | echo _outputLeafNode(ICON_TYPE_MAGICMETHOD, $icon_add_flags, $line, $desc); |
29 | daniel-mar | 86 | } else { |
33 | daniel-mar | 87 | echo _outputLeafNode(ICON_TYPE_FUNCTION, $icon_add_flags, $line, $desc); |
29 | daniel-mar | 88 | } |
27 | daniel-mar | 89 | } |
90 | |||
91 | if ($wait_class && ($token == T_STRING)) { |
||
33 | daniel-mar | 92 | $desc = "Class $value\n"; |
93 | $icon_add_flags = 0; |
||
27 | daniel-mar | 94 | $wait_class = false; |
33 | daniel-mar | 95 | $levelAry[] = $dep; |
27 | daniel-mar | 96 | |
33 | daniel-mar | 97 | echo _outputLeafNode(ICON_TYPE_CLASS, $icon_add_flags, $line, $desc); |
29 | daniel-mar | 98 | echo _outputIncreaseLevel(); |
27 | daniel-mar | 99 | } |
100 | |||
33 | daniel-mar | 101 | if ($wait_trait && ($token == T_STRING)) { |
102 | $desc = "Trait $value\n"; |
||
103 | $icon_add_flags = 0; |
||
104 | $wait_trait = false; |
||
105 | $levelAry[] = $dep; |
||
106 | |||
107 | echo _outputLeafNode(ICON_TYPE_TRAIT, $icon_add_flags, $line, $desc); |
||
108 | echo _outputIncreaseLevel(); |
||
109 | } |
||
110 | |||
111 | if ($wait_interface && ($token == T_STRING)) { |
||
112 | $desc = "Interface $value\n"; |
||
113 | $icon_add_flags = 0; |
||
114 | $wait_interface = false; |
||
115 | $levelAry[] = $dep; |
||
116 | |||
117 | echo _outputLeafNode(ICON_TYPE_INTERFACE, $icon_add_flags, $line, $desc); |
||
118 | echo _outputIncreaseLevel(); |
||
119 | } |
||
120 | |||
121 | if ($wait_const && ($token == T_STRING)) { |
||
122 | $desc = "const $value\n"; |
||
123 | $icon_add_flags = 0; |
||
124 | $wait_const = false; |
||
125 | |||
126 | echo _outputLeafNode(ICON_TYPE_CONST, $icon_add_flags, $line, $desc); |
||
127 | } |
||
128 | |||
129 | if ((!$wait_abstract_func_list_end) && (count($levelAry) > 0) && (count($insideFuncAry) == 0) && ($token == T_VARIABLE)) { |
||
130 | $desc = "$value\n"; |
||
131 | $icon_add_flags = 0; |
||
132 | |||
133 | echo _outputLeafNode(ICON_TYPE_VAR, $icon_add_flags, $line, $desc); |
||
134 | } |
||
135 | |||
29 | daniel-mar | 136 | if ($token == T_PRIVATE) $icon_add_flags |= ICON_ATTR_PRIVATE; |
137 | if ($token == T_PROTECTED) $icon_add_flags |= ICON_ATTR_PROTECTED; |
||
33 | daniel-mar | 138 | if ($token == T_PUBLIC) $icon_add_flags |= ICON_ATTR_PUBLIC; |
139 | if ($token == T_ABSTRACT) $icon_add_flags |= ICON_ATTR_ABSTRACT; |
||
29 | daniel-mar | 140 | if ($token == T_STATIC) $icon_add_flags |= ICON_ATTR_STATIC; |
27 | daniel-mar | 141 | |
33 | daniel-mar | 142 | if (($data == ';') || ($data == '{') || ($data == '}')) { |
143 | $wait_abstract_func_list_end = false; |
||
144 | $icon_add_flags = 0; |
||
145 | } |
||
146 | |||
27 | daniel-mar | 147 | if ($token == T_FUNCTION) { |
148 | $wait_function = true; |
||
149 | } |
||
150 | if ($token == T_CLASS) { |
||
151 | $wait_class = true; |
||
152 | $dep = 0; |
||
153 | } |
||
33 | daniel-mar | 154 | if ($token == T_TRAIT) { |
155 | $wait_trait = true; |
||
156 | $dep = 0; |
||
157 | } |
||
27 | daniel-mar | 158 | |
33 | daniel-mar | 159 | if ($token == T_CONST) { |
160 | $wait_const = true; |
||
161 | } |
||
162 | |||
27 | daniel-mar | 163 | if ($token == T_COMMENT) { |
33 | daniel-mar | 164 | if ((stripos($value, 'TODO') !== false) || |
165 | (stripos($value, 'BUGBUG') !== false) || |
||
166 | (stripos($value, 'FIXME') !== false) || |
||
167 | (stripos($value, 'XXX') !== false)) { |
||
168 | echo _outputLeafNode(ICON_TYPE_TODO, 0, $line, strip_comment($value)); |
||
27 | daniel-mar | 169 | } |
170 | } |
||
171 | } |
||
172 | |||
173 | echo _outputExit(); |
||
29 | daniel-mar | 174 | |
27 | daniel-mar | 175 | echo chr(1).chr(2).chr(3).chr(4).chr(5).chr(6).chr(7).chr(8); |
176 | |||
177 | sleep(1); |
||
178 | } |
||
179 | |||
33 | daniel-mar | 180 | function _outputLeafNode($iconType, $iconAttr, $line, $description) { |
181 | return 'N'.str_pad($iconType, 4). |
||
182 | sprintf('%04s', $iconAttr). |
||
183 | sprintf('%08s', $line). |
||
184 | sprintf('%04s', strlen(trim($description))). |
||
185 | trim($description). |
||
186 | "\n"; |
||
27 | daniel-mar | 187 | } |
188 | |||
189 | function _outputIncreaseLevel() { |
||
31 | daniel-mar | 190 | return 'I'."\n"; |
27 | daniel-mar | 191 | } |
192 | |||
193 | function _outputDecreaseLevel() { |
||
31 | daniel-mar | 194 | return 'D'."\n"; |
27 | daniel-mar | 195 | } |
196 | |||
197 | function _outputExit() { |
||
31 | daniel-mar | 198 | return 'X'."\n"; |
27 | daniel-mar | 199 | } |
200 | |||
201 | function array_peek($array) { |
||
202 | if (!isset($array[count($array)-1])) return null; |
||
203 | return $array[count($array)-1]; |
||
204 | } |
||
205 | |||
206 | function strip_comment($x) { |
||
29 | daniel-mar | 207 | if (substr($x, 0, 1) == '#') return trim(substr($x, 1)); |
27 | daniel-mar | 208 | if (substr($x, 0, 2) == '//') return trim(substr($x, 2)); |
209 | if (substr($x, 0, 2) == '/*') return trim(substr($x, 2, strlen($x)-4)); |
||
210 | } |
||
29 | daniel-mar | 211 |