nlopess Sun Jul 23 19:08:44 2006 UTC
Modified files: /phpdoc/scripts xml_proto.php Log: rewrite parse_proto() and parse_file() functions, so that they use regexes instead of hand-made parsers, which are impossible to maintain http://cvs.php.net/viewvc.cgi/phpdoc/scripts/xml_proto.php?r1=1.41&r2=1.42&diff_format=u Index: phpdoc/scripts/xml_proto.php diff -u phpdoc/scripts/xml_proto.php:1.41 phpdoc/scripts/xml_proto.php:1.42 --- phpdoc/scripts/xml_proto.php:1.41 Sun Jul 23 18:25:40 2006 +++ phpdoc/scripts/xml_proto.php Sun Jul 23 19:08:44 2006 @@ -16,7 +16,7 @@ | Authors: Brad House <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ - $Id: xml_proto.php,v 1.41 2006/07/23 18:25:40 nlopess Exp $ + $Id: xml_proto.php,v 1.42 2006/07/23 19:08:44 nlopess Exp $ */ /* @@ -438,156 +438,38 @@ } } function_add_purpose($func_num, $temp); - return(1); } function parse_proto($proto) { - $len=0; - $i=0; - $c=0; - $done=0; - $start=0; - $func_number=-1; - $got_proto_def=0; - $got_proto_type=0; - $got_proto_name=0; - $got_arg_type=0; - $start_args=0; - $temp=""; - $temp2=""; - $temp_len=0; - $isopt=0; - - $len=strlen($proto); - - for ($i=0; $i<$len; $i++) { - $c=substr($proto, $i, 1); - switch ($c) { - case '\r': - case '\n': - case ' ': - if ($temp_len) { - if (!$got_proto_def) { - if (strcasecmp($temp, "proto") != 0) { - // Possibly just a comment, don't output error info - // echo "Not a proper proto definition: $proto\n"; - return(0); - } else { - $got_proto_def=1; - } - } else if (!$got_proto_type) { - $func_number=new_function(); - function_add_type($func_number, $temp); - $got_proto_type=1; - } else if (!$got_proto_name) { - function_add_name($func_number, $temp); - $got_proto_name=1; - } else if ($start_args && !$got_arg_type) { - $got_arg_type=1; - $temp2=$temp; - } else if ($start_args && $got_arg_type) { - $got_arg_type=0; - function_add_arg($func_number, $temp2, $temp, $isopt); - $temp2=""; - } - $temp_len=0; - $temp=""; - } - break; - - case '[': - if ($got_proto_name) { - $isopt=1; - } else { - echo "Not a proper proto definition -5: $proto\n"; - } - break; - - case ']': - if ($got_proto_name && $isopt) { - } else { - echo "Not a proper proto definition -6: $proto\n"; - } - break; - - case '(': - if ($got_proto_type && $got_proto_def &&!$got_proto_name) { - function_add_name($func_number, $temp); - $temp=""; - $temp_len=0; - $start_args=1; - $got_proto_name=1; - } else { - echo "Not a proper proto definition -2: $proto\n"; - return(0); - } - - break; + if (!preg_match('/proto\s+([a-zA-Z]+)\s+([a-zA-Z0-9:_-]+)\s*\((.+)\)\s+(.+)/', $proto, $match)) { + echo "Not a proper proto definition: $proto\n"; + return; + } - case ')': - if ($start_args) { - if ($got_arg_type && $temp_len) { - function_add_arg($func_number, $temp2, $temp, $isopt); - $temp=""; - $temp_len=0; - } - $done=1; - } else { - echo "Not a proper proto definition -4: $proto\n"; - return(0); - } - break; + $func_number = new_function(); + function_add_type($func_number, $match[1]); + function_add_name($func_number, $match[2]); + parse_desc($func_number, $match[4]); - case ',': - if ($start_args && $got_arg_type) { - $got_arg_type=0; - function_add_arg($func_number, $temp2, $temp, $isopt); - $temp2=""; - $temp=""; - $temp_len=0; - } else if ($temp && !$temp2) { - echo "Not a proper proto definition -3: $temp2 : $temp : $proto\n"; - return(0); - } - break; + // now parse the arguments + if (!preg_match_all('/(?:(\[),\s*)?([a-zA-Z]+)\s+(&?[a-zA-Z0-9:_-]+)/', $match[3], $match, PREG_SET_ORDER)) { + echo "Not a proper proto definition: $proto\n"; + return; + } - default: - if ($c != '\r' && $c != '\n') { - $temp .= $c; - $temp_len++; - } - break; - } - if ($done) { - $start=$i+1; - break; - } - } - parse_desc($func_number, substr($proto, $start)); - return(1); + foreach ($match as $arg) { + function_add_arg($func_number, $arg[2], $arg[3], $arg[1]); + } } function parse_file($buffer) { - global $funclist, $num_funcs; - - $temp1=""; - $temp2=""; - $ptr=""; - $args=""; + preg_match_all('@/\*\s*{{{\s*(proto.+)\*/@sU', $buffer, $match); - $ptr=$buffer; - while (1) { - $temp1=strstr($ptr, "{{{"); - if ($temp1 == false) break; - $temp2=strstr($temp1, "*/"); - if ($temp2 == false) break; - $args=substr($temp1, 3, strlen($temp1)-strlen($temp2)-3); - parse_proto($args); - $ptr=$temp2; + foreach($match[1] as $proto) { + parse_proto(trim($proto)); } - return(1); } function add_constant_to_list($name, $type)