Subversion Repositories fastphp

Rev

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