Subversion Repositories fastphp

Rev

Rev 32 | Rev 36 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. <?php
  2.  
  3. error_reporting(0);
  4.  
  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.  
  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) {
  39.                 echo _outputLeafNode(ICON_TYPE_ERROR, 0, 1, 'SYNTAX ERROR');
  40.         }
  41.        
  42.         $wait_function = false;
  43.         $wait_class = false;
  44.         $wait_trait = false;
  45.         $wait_interface = false;
  46.         $wait_abstract_func_list_end = false;
  47.         $levelAry = array();
  48.         $icon_add_flags = 0;
  49.         $dep = 0;
  50.         $insideFuncAry = array();
  51.  
  52.         foreach ($x as $n => $data) {
  53.                 if ($data == '{') $dep++;
  54.                 if ($data == '}') {
  55.                         $dep--;
  56.                         if ((count($levelAry) > 0) && (array_peek($levelAry) == $dep)) {
  57.                                 array_pop($levelAry);
  58.                                 echo _outputDecreaseLevel();
  59.                         }
  60.                         if ((count($insideFuncAry) > 0) && (array_peek($insideFuncAry) == $dep)) {
  61.                                 array_pop($insideFuncAry);
  62.                         }
  63.                 }
  64.  
  65.                 $token = (!is_array($data)) ? null : $data[0];
  66.                 $value = (!is_array($data)) ? null : $data[1];
  67.                 $line  = (!is_array($data)) ? null : $data[2];
  68.  
  69.                 if ($wait_function && ($token == T_STRING)) {
  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;
  77.                         }
  78.                         $icon_add_flags = 0;
  79.  
  80.                         if ($value == '__construct') { // TODO: auch eine methode mit dem namen der klasse soll eine konstruktor sein
  81.                                 echo _outputLeafNode(ICON_TYPE_CONSTRUCTOR, $icon_add_flags, $line, $desc);
  82.                         } else if ($value == '__destruct') {
  83.                                 echo _outputLeafNode(ICON_TYPE_DESTRUCTOR,  $icon_add_flags, $line, $desc);
  84.                         } else if (substr($value, 0, 2) == '__') {
  85.                                 echo _outputLeafNode(ICON_TYPE_MAGICMETHOD, $icon_add_flags, $line, $desc);
  86.                         } else {
  87.                                 echo _outputLeafNode(ICON_TYPE_FUNCTION,    $icon_add_flags, $line, $desc);
  88.                         }
  89.                 }
  90.  
  91.                 if ($wait_class && ($token == T_STRING)) {
  92.                         $desc = "Class $value\n";
  93.                         $icon_add_flags = 0;
  94.                         $wait_class = false;
  95.                         $levelAry[] = $dep;
  96.  
  97.                         echo _outputLeafNode(ICON_TYPE_CLASS, $icon_add_flags, $line, $desc);
  98.                         echo _outputIncreaseLevel();
  99.                 }
  100.  
  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.  
  136.                 if ($token == T_PRIVATE)   $icon_add_flags |= ICON_ATTR_PRIVATE;
  137.                 if ($token == T_PROTECTED) $icon_add_flags |= ICON_ATTR_PROTECTED;
  138.                 if ($token == T_PUBLIC)    $icon_add_flags |= ICON_ATTR_PUBLIC;
  139.                 if ($token == T_ABSTRACT)  $icon_add_flags |= ICON_ATTR_ABSTRACT;
  140.                 if ($token == T_STATIC)    $icon_add_flags |= ICON_ATTR_STATIC;
  141.  
  142.                 if (($data == ';') || ($data == '{') || ($data == '}')) {
  143.                         $wait_abstract_func_list_end = false;
  144.                         $icon_add_flags = 0;
  145.                 }
  146.  
  147.                 if ($token == T_FUNCTION) {
  148.                         $wait_function = true;
  149.                 }
  150.                 if ($token == T_CLASS) {
  151.                         $wait_class = true;
  152.                         $dep = 0;
  153.                 }
  154.                 if ($token == T_TRAIT) {
  155.                         $wait_trait = true;
  156.                         $dep = 0;
  157.                 }
  158.  
  159.                 if ($token == T_CONST) {
  160.                         $wait_const = true;
  161.                 }
  162.  
  163.                 if ($token == T_COMMENT) {
  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));
  169.                         }
  170.                 }
  171.         }
  172.        
  173.         echo _outputExit();
  174.  
  175.         echo chr(1).chr(2).chr(3).chr(4).chr(5).chr(6).chr(7).chr(8);
  176.  
  177.         sleep(1);
  178. }
  179.  
  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";
  187. }
  188.  
  189. function _outputIncreaseLevel() {
  190.         return 'I'."\n";
  191. }
  192.  
  193. function _outputDecreaseLevel() {
  194.         return 'D'."\n";
  195. }
  196.  
  197. function _outputExit() {
  198.         return 'X'."\n";
  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) {
  207.         if (substr($x, 0, 1) == '#') return trim(substr($x, 1));
  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. }
  211.  
  212.