techtonik               Tue Apr  5 15:37:58 2005 EDT

  Modified files:              
    /phpdoc/scripts     genfuncsummary.php 
  Log:
  + rewritten from scratch
  Extract function summaries from sources of PHP and it's extensions
  Replacement for both genfuncsummary.sh and funcsummary.awk in phpdoc/scripts
  
http://cvs.php.net/diff.php/phpdoc/scripts/genfuncsummary.php?r1=1.3&r2=1.4&ty=u
Index: phpdoc/scripts/genfuncsummary.php
diff -u phpdoc/scripts/genfuncsummary.php:1.3 
phpdoc/scripts/genfuncsummary.php:1.4
--- phpdoc/scripts/genfuncsummary.php:1.3       Wed Dec 31 19:47:42 2003
+++ phpdoc/scripts/genfuncsummary.php   Tue Apr  5 15:37:57 2005
@@ -3,7 +3,7 @@
   +----------------------------------------------------------------------+
   | PHP Version 4                                                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) 1997-2004 The PHP Group                                |
+  | Copyright (c) 2005 The PHP Group                                     |
   +----------------------------------------------------------------------+
   | This source file is subject to version 3.0 of the PHP license,       |
   | that is bundled with this package in the file LICENSE, and is        |
@@ -13,77 +13,142 @@
   | obtain it through the world-wide-web, please send a note to          |
   | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
   +----------------------------------------------------------------------+
-  | Authors:    Jesus M. Castagnetto <[EMAIL PROTECTED]>                     |
+  | Authors:    anatoly techtonik <[EMAIL PROTECTED]>                    |
   +----------------------------------------------------------------------+
  
-  $Id: genfuncsummary.php,v 1.3 2004/01/01 00:47:42 goba Exp $
+  $Id: genfuncsummary.php,v 1.4 2005/04/05 19:37:57 techtonik Exp $
 */
 
-// WARNING: still a work in progress
-// TODO: check why sometimes the regex is fubared
 
-$php4src = realpath("../../php4");
+// Extract function summaries from sources of PHP and it's extensions
+//
+// Example of block looked in .c, .cpp, .h and .ec files
+//
+// /* {{{ proto string zend_version(void)
+//   Get the version of the Zend Engine */
+//
+
+if ($argc != 2 ||
+      in_array($argv[1], array('--help', '-help', '-h', '-?')) ||
+      !is_dir($argv[1])) {
+
+    echo "Extract function summaries from sources of PHP\n\n";
+    echo "Usage:      $argv[0] <php source dir>\n";
+    echo "            --help, -help, -h, -?      - to get this help\n";
+    die;
 
-include_once 'File/Find.php';
-$find = new File_Find();
-$filelist = $find->search("/.*\.(c|h|ec)$/",realpath($php4src), 'perl');
-sort($filelist);
-
-$proto_re = 
"/[[:space:]]*\/\*[[:space:]]*\{\{\{[[:space:]]*proto[[:space:]]*(.+)[[:space:]]*\*\//msU";
-$re_split1 = "proto[[:space:]]+|\\*\/[[:space:]]*$";
-$re_split2 = "\\**\/[[:space:]]*$";
-$re_proto_parts = "/^(.+)[[:space:]]+([[:alnum:]_]+)\((.*)\)[[:space:]]*$/";
-
-foreach ($filelist as $filename) {
-       $proto_arr = array();
-       $parse = $same = false;
-       $matches = array();
-       $lines = implode("\n",file($filename));
-       preg_match_all($proto_re, $lines, $matches);
-       if (!empty($matches[1])) {
-               $name = str_replace(realpath("../../")."/", "# ", $filename);
-               echo "$name\n";
-               echo str_replace("\n\n","\n",implode("\n", $matches[1]))."\n";
-       }
-       /*
-       foreach (file($filename) as $line) {
-               $content = array();
-               if (preg_match($proto_re, $line)) {
-                       list(,$proto) = split($re_split1, $line);
-                       $proto = trim($proto);
-                       $parse = $same = true;
-                       continue;
-               } elseif (preg_match("/\*\//",$line)) {
-                       if ($parse) {
-                               $proto_info = implode(" ", $content);
-                               if ($same) {
-                                       $temp = split($re_split2, $line);
-                                       $proto_info .= " ".$temp[0];
-                               }
-                               // maybe this can be used for autogeneration of 
protos in the manual
-                               $matches = array();
-                               preg_match($re_proto_parts, $proto, $matches);
-                               $funcname = trim($matches[2]);
-                               $proto_arr[$funcname] = sprintf("%s\n  %s", 
$proto, $proto_info);
-                               $parse = false;
-                               }
-                       continue;
-               } else {
-                       if ($parse && !$same) {
-                               $temp = split($re_split2, $line);
-                               $content[] = $temp[0];
-                       }
-                       $same = false;
-                       continue;
-               }
-       }
-       if (!empty($proto_arr)) {
-               $filename = str_replace(realpath("../../")."/", "# ", 
$filename);
-               ksort($proto_arr);
-               echo "$filename\n";
-               echo implode("\n", $proto_arr)."\n";
-       }
-       */
 }
 
+// find all source files recursively - returns array with filenames
+function get_parsefiles($srcpath) {
+   $parsefiles = array();
+   $srcdir = dir($srcpath);
+   while (false !== ($file = $srcdir->read())) {
+       $filepath = $srcpath."/".$file;
+       if (is_dir($filepath) && $file !== "." && $file !== "..") {
+           $parsefiles = array_merge($parsefiles, get_parsefiles($filepath));
+           continue;
+       }
+       if (preg_match('/\.(c|cpp|h|ec)$/i', $file)) {
+           $parsefiles[] = $filepath;
+       }
+   }
+   $srcdir->close();
+   return $parsefiles;
+}
+
+$parsefiles = get_parsefiles($argv[1]);
+sort($parsefiles);
+
+// check for PHP3 sources
+if (is_file($argv[1]."/language-scanner.lex")) {  // only in PHP3 sources
+    $parsefiles[] = $argv[1]."/language-scanner.lex";
+}
+
+// make unified directory separator - /
+if (DIRECTORY_SEPARATOR == '\\') {
+    $parsefiles = array_map( create_function('$a', 'return str_replace("\\\\", 
"/", $a);'), $parsefiles );
+}
+
+// proto regex
+$proto_regex  = "`^\s*/\*\s+\{{3}\s+proto\s+(\S+)\s+?(.+)$(.+)\*/`msU";
+// matches[1] - return value from function prototype
+// matches[2] - rest of prototype starting with function name to sort by
+// matches[3] - description with newlines to be stripped and identation to be 
added
+
+// prototype blocks
+foreach ($parsefiles as $key => $file) {
+    $file_contents = file_get_contents($file);
+    $m = preg_match_all($proto_regex, $file_contents, $matches);
+    if ($m) {
+        // output source file name
+        echo preg_replace("|^[./]+|", "# ", $file)."\n";
+        $preturn = array();
+       $prest = array();
+        $pdesc = array();
+        foreach($matches[1] as $mk => $mv) {
+           $preturn[] = $matches[1][$mk];
+           $prest[]   = $matches[2][$mk];
+           $pdesc[]   = "     " . preg_replace("`\s+`msU", " ", 
trim($matches[3][$mk]));
+        }
+        array_multisort($prest, $preturn, $pdesc);
+        foreach($preturn as $k => $v) {
+            echo $preturn[$k] . " " . $prest[$k] . " \n" . $pdesc[$k] . "  \n";
+        }
+    } else {
+        unset($parsefiles[$key]);
+    }
+}
+
+
+/****[ Original algorithm of genfunclist.sh ] *****/
+
+# | Authors:    Gabor Hoitsy <[EMAIL PROTECTED]>                              |
+
+/* 
+
+for i in `find $1 -name "*.[ch]" -print -o -name "*.ec" -print | xargs egrep 
-li "\{\{\{ proto" | sort` ; do
+ echo $i | sed -e "s|$1|# php-src|"
+ $awkprog -f $awkscript < $i | sort +1 | $awkprog -F "---" '{ print $1; print 
$2; }' | sed -e's/^[[:space:]]+//' -e's/[[:space:]]+/     /'
+done
+if test -f $1/language-scanner.lex # only in PHP3
+then
+  $awkprog -f funcsummary.awk < $1/language-scanner.lex | sort +1 | $awkprog 
-F "---" '{ print $1; print $2; }'
+fi
+
+*/
+
+/****[ Original funcsummary.awk ] *****/
+//
+///^[[:space:]]*\/\*[[:space:]]*\{\{\{[[:space:]]*proto/ { 
+//     split($0,proto,"proto[[:space:]]+|\\*/[[:space:]]*$");
+//     parse=1; 
+//     same=1;
+//     lc=0;
+//}
+///\*\// {
+//     if(parse) {
+//             lines="";
+//             for(i=0;i<lc;i++) {
+//                     lines = sprintf("%s %s ",lines,line[i]);
+//             }
+//             if(!same) {
+//                     split($0,temp,"\\*/[[:space:]]*$");
+//                     lines = sprintf("%s %s ",lines,temp[1]);
+//             }
+//             printf("%s --- %s\n",proto[2],lines);
+//             parse=0;
+//     }
+//     next;
+//}
+//{    
+//     if(parse && !same) { 
+//             split($0,temp,"\\*/[[:space:]]*$");
+//             line[lc++]=temp[1];
+//             
+//     } 
+//     same=0;
+//}
+
+
 ?>

Reply via email to