techtonik Mon Sep 13 09:36:01 2004 EDT
Added files:
/phpdoc/scripts genfunclist.php
Log:
Initial checkin.
Builds function list from PHP sources. Replacement for both funcparse.awk
and genfunclist.sh in phpdoc/scripts
http://cvs.php.net/co.php/phpdoc/scripts/genfunclist.php?r=1.1&p=1
Index: phpdoc/scripts/genfunclist.php
+++ phpdoc/scripts/genfunclist.php
<?php
/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2004 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 |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_0.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| [EMAIL PROTECTED] so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Ariel Shkedi <[EMAIL PROTECTED]> or <[EMAIL PROTECTED]> |
| Rasmus Lerdorf <[EMAIL PROTECTED]> |
| |
| anatoly techtonik <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
$Id: genfunclist.php,v 1.1 2004/09/13 13:36:00 techtonik Exp $
*/
/**
* Builds function list from PHP sources
*
* Finds all source files, which contain Zend Function Block and extracts
* information from them to build a list. Replacement for both funcparse.awk
* and genfunclist.sh
*
* Requires PEAR File_Find class.
*
* Known limitations:
* - can't handle multiline comments and precompiler directives
*/
/**
* include function block headers in output
*/
$show_block_names = true;
/**
* sort function names (disable this to output directive and comments stuff)
*/
$sort_names = true;
/**
* if sorting disabled, output directives
*/
$show_directives = true;
/**
* if sorting disabled, output comments and other stuff
*/
$show_stuff = true;
if ($argc != 2 ||
in_array($argv[1], array('--help', '-help', '-h', '-?')) ||
!is_dir($argv[1])) {
echo "Builds function list from PHP sources\n\n";
echo "Usage:\n";
echo " $argv[0] <php source dir>\n\n";
echo " --help, -help, -h, -?\n";
echo " to get this help.";
} else {
// check for PHP3 sources
$PHP3_lex = is_file($argv[1]."/language-scanner.lex") // only in PHP3 sources
? $argv[1]."/language-scanner.lex"
: NULL;
require_once "File/Find.php";
// $parsefiles = File_Find::search('/\.(c|cpp|h|ec)$/i', $argv[1], 'perl');
$ff = &new File_Find();
$parsefiles = $ff->search('/\.(c|cpp|h|ec)$/i', $argv[1], 'perl');
// make unified directory separator - /
if (DIRECTORY_SEPARATOR == '\\') {
$parsefiles = array_map( create_function('$a', 'return str_replace("\\\\",
"/", $a);'), $parsefiles );
}
//$FB_exclude = "_class_functions";
$ZendFB_regex = "`^[ \t]*(?:static)?[
\t]*(?:zend_)?function_entry\s*(?!php_hw_api_)\w+(?<!_class_functions)\s*\[\]\s*=\s*\{(.*)(?:\{\s*NULL\s*,\s*NULL\s*,\s*NULL\s*\}|\{0\})`msU";
// function blocks
$blocks = array();
$block_titles = array();
foreach ($parsefiles as $key => $file) {
$file_contents = file_get_contents($file);
if (strpos($file_contents, 'function_entry') === FALSE) {
unset($parsefiles[$key]);
} else {
$m = preg_match_all($ZendFB_regex, $file_contents, $matches);
if ($m) {
foreach ($matches[0] as $mk => $mv) {
$block_titles[$key][$mk] = strtok($mv, "\n");
}
$blocks[$key] = $matches[1];
} else {
unset($parsefiles[$key]);
}
}
}
array_multisort($parsefiles, $blocks, $block_titles);
// print_r($parsefiles);
// print_r($block_titles);
$macronames =
"ZEND_FE|ZEND_FALIAS|PHP_FE|PHP_FALIAS|ZEND_NAMED_FE|PHP_NAMED_FE|PHP_STATIC_FE";
if ($PHP3_lex) $macronames .= "|UODBC_FE(?:_ALIAS)?";
$FB_instance_regex = "`^[ \t]*(?:($macronames)\s*\(|\{)\s*\"?(\w+)`im";
foreach ($parsefiles as $key => $file) {
// output source file name
echo str_replace($argv[1], "# php-src", $file)."\n";
foreach ($blocks[$key] as $bk => $bv) {
// output function block title
if ($show_block_names) {
echo "# ".$block_titles[$key][$bk]."\n";
}
$resultecho = array();
$tok = strtok($bv, "\n");
while ($tok) {
if (preg_match($FB_instance_regex, $tok, $matches)) {
if ($PHP3_lex && ereg("^UODBC_FE",$matches[1]))
$matches[2] = "odbc_".$matches[2];
// output function name
if (!$sort_names):
echo $matches[2]."\n";
else:
$resultecho[] = $matches[2]."\n";
endif;
} elseif (!$sort_names) {
// to use this turn off sorting
// output stuff
if ($show_stuff && $tok{0} != '#') echo $tok."\n";
// output compiler directives
if ($show_directives && $tok{0} == '#') echo $tok."\n";
}
$tok = strtok("\n");
}
if ($sort_names) {
sort($resultecho);
echo implode("", $resultecho);
}
}
echo "\n";
}
if ( $PHP3_lex ) {
echo str_replace($argv[1], "# php-src", $PHP3_lex)."\n";
// worst case <IN_PHP>"highlight_file"|"show_source" {
$LEX_regex = "|<IN_PHP>\"([\w\d_]+)\"(?:\|\"([\w\d_]+)\")? \{|";
preg_match_all($LEX_regex, file_get_contents($PHP3_lex), $matches);
$names = $matches[2][0] ? array_merge($matches[1], $matches[2]) : $matches[1];
sort($names);
echo implode("\n",$names);
}
}
/****[ Original genfunclist.sh ] *****/
# | Authors: Ariel Shkedi <[EMAIL PROTECTED]> or <[EMAIL PROTECTED]> |
# | Rasmus Lerdorf <[EMAIL PROTECTED]> |
/*
for i in `find $1 -name "*.[c]" -print -o -name "*.ec" -print | xargs egrep -li
function_entry | sort` ; do
echo $i | sed -e "s|$1|# php-src|"
if test -f funcparse.awk ; then
awk -f funcparse.awk < $i | sort
elif test -f scripts/funcparse.awk; then
awk -f scripts/funcparse.awk < $i | sort
else
echo 1>&2 funcparse.awk not found
exit
fi
done
if test -f $1/language-scanner.lex # only in PHP3 sources
then
echo $1/language-scanner.lex | sed -e 's/\.\.\//# /'
awk -f funcparse.awk < $1/language-scanner.lex | sort
fi
*/
/****[ Original funcparse.awk ] *****/
/*
BEGIN { parse=0; FS="[\"(,]"; }
/^.*function_entry.*$/ { parse=1; }
/^.*function_entry.*_class_functions.*$/ { parse=0; }
/^.*function_entry.*OrbitStruct.*$/ { parse=0; }
/^.*function_entry.*OrbitObject.*$/ { parse=0; }
/^.*shutdown_function_entry.*$/ { parse=0; }
/^.*\(function_entry.*$/ { parse=0; }
/^.*function_entry \*ptr.*$/ { parse=0; }
/^.*\(zend_function_entry.*$/ { parse=0; }
/^.*zend_function_entry \*ptr.*$/ { parse=0; }
/NULL.*?NULL.*?NULL/ { parse=0; }
/^[[:space:]]{0}/ { parse=0; }
/^[[:space:]]*{/ { if(parse) { print $2; } }
/^[[:space:]]*PHP_FE/ { if(parse) { print $2; } }
/^[[:space:]]*PHP_FALIAS/ { if(parse) { print $2; } }
/^[[:space:]]*PHP_NAMED_FE/ { if(parse) { print $2; } }
/^[[:space:]]*PHP_STATIC_FE/ { if(parse) { print $3; } }
/^[[:space:]]*ZEND_FE/ { if(parse) { print $2; } }
/^[[:space:]]*ZEND_FALIAS/ { if(parse) { print $2; } }
/^[[:space:]]*ZEND_NAMED_FE/ { if(parse) { print $2; } }
/^[[:space:]]*cybercash_functions/ { if (parse) { print $2; } }
/^[[:space:]]*UODBC_FE/ { if(parse) { print "odbc_"$2; } }
/^<IN_PHP>/ { if(match($2,"^[A-Za-z0-9_]+$")) print $2; }
*/
?>