cvs: functable / genfunclist.php
| From: | Hartmut Holzgraefe | Date: | Sat, 13 Nov 2004 19:44:21 +0000 |
| Subject: | cvs: functable / genfunclist.php | ||
| Groups: | php.doc.web | ||
| Request: | Send a blank email to doc-web+get-433@lists.php.net to get a copy of this message | ||
hholzgra Sat Nov 13 14:44:21 2004 EDT
Added files:
/functable genfunclist.php
Log:
finally starting rewrite using php5/sqlite
this script is supposed to replace genfunclist and func*.awk
http://cvs.php.net/co.php/functable/genfunclist.php?r=1.1&p=1
Index: functable/genfunclist.php
+++ functable/genfunclist.php
#!/usr/local/php5dev/bin/php -q
<?php
db_open();
$versions = find_versions();
foreach ($versions as $version) {
$version = trim($version);
if ($version == '') continue;
echo "parsing version $version\n";
// we can reuse already existing database entries for non-CVS versions
if (!strstr($version, "cvs")) {
$count = db_function_count($version);
error_log("$version $count");
if ($count > 300) continue;
}
db_purge_version($version);
$codefiles = find_files("sources/$version", '\.e?c$');
foreach ($codefiles as $file) {
echo "parsing file $file\n";
$funcdef = array();
$funcimp = array();
find_functions("sources/$version", $file, $funcdef, $funcimp);
foreach ($funcdef as $function => $entry) {
db_add_funcdef($function, $version, $entry);
}
foreach ($funcimp as $function => $entry) {
db_add_funcimp($function, $version, $entry);
}
}
}
function db_open() {
global $db;
$dbfile = "functable.data";
$new_db = !file_exists($dbfile);
$db = sqlite_open("functable.data");
if (!$db) {
die("Can't open database");
}
if ($new_db) {
sqlite_query("
CREATE TABLE funcdef (
name varchar(100),
version varchar(20),
file varchar(100),
line int,
alias_for varchar(100),
primary key (name, version)
)", $db);
sqlite_query("
CREATE TABLE funcimp (
name varchar(100),
version varchar(20),
file varchar(100),
line int,
primary key (name, version)
)", $db);
}
}
function db_close() {
global $db;
sqlite_close($db);
}
function db_add_funcdef($function, $version, $entry) {
global $db;
$query = "INSERT INTO funcdef VALUES ('$function','$version'";
$query.=
",'".$entry['file']."',".$entry['line'];
if (isset($entry['alias_for'])) {
$query .= ",'".$entry['alias_for']."'";
} else {
$query .= ",NULL";
}
$query.= ")";
sqlite_query($query, $db);
}
function db_add_funcimp($function, $version, $entry) {
global $db;
$query = "INSERT INTO funcimp VALUES ('$function','$version'";
$query.=
",'".$entry['file']."',".$entry['line'];
$query.= ")";
sqlite_query($query, $db);
}
function db_function_count($version) {
global $db;
$query = "SELECT COUNT(*) AS anzahl FROM funcdef WHERE version = '$version'";
$r = sqlite_query($query, $db);
$row = sqlite_fetch_array($r, SQLITE_ASSOC);
return $row["anzahl"];
}
function db_purge_version($version) {
global $db;
$query = "DELETE FROM funcdef WHERE version = '$version'";
sqlite_query($query,$db);
$query = "DELETE FROM funcimp WHERE version = '$version'";
sqlite_query($query, $db);
}
function find_versions() {
// get all release version tags from version files
$versions = array();
# foreach (glob("version*.tags") as $file) {
# $versions = array_merge($versions, file($file));
# }
// add the CVS major version branches
# $versions[] = "php_3_cvs";
$versions[] = "php_4_cvs";
# $versions[] = "php_5_cvs";
sort($versions);
return $versions;
}
function find_files($dir, $regex) {
$files = _find_files($dir, $regex);
if ($files) {
foreach ($files as $key => $file) {
$files[$key] = str_replace("$dir/", "", $file);
}
}
return $files;
}
function _find_files($dir, $regex) {
$d = opendir($dir);
if (!is_resource($d)) return false;
$files = array();
while ($file = readdir($d)) {
if ($file == '.') continue;
if ($file == '..') continue;
if (is_dir("$dir/$file")) {
$subfiles = _find_files("$dir/$file", $regex);
if ($subfiles) {
$files = array_merge($files, $subfiles);
}
}
if (ereg($regex, $file)) {
$files[] = "$dir/$file";
}
}
closedir($d);
return $files;
}
function find_functions($path, $file, &$funcdef, &$funcimp) {
$fp = fopen("$path/$file", "r");
if (!$fp) return false;
$functions = array();
$parse = false;
$lineno = 0;
while (!feof($fp)) {
$line = fgets($fp);
$lineno++;
if (strstr($line, "function_entry")) {
if (strstr($line, "ptr")) $parse = 0;
else if (strstr($line, "_class_functions")) $parse = 0;
else if (strstr($line, "OrbitStruct")) $parse = 0;
else if (strstr($line, "OrbitObject")) $parse = 0;
else if (strstr($line, "shutdown_function_entry")) $parse = 0;
else if (strstr($line, "(function_entry")) $parse = 0;
else if (strstr($line, "(zend_function_entry")) $parse = 0;
else $parse = 1;
continue;
}
if (ereg("NULL[[:space:]]*,[[:space:]]*NULL[[:space:]]*,[[:space:]]*NULL[[:space:]]*",
$line)) {
$parse = 0;
continue;
}
if ($parse) {
if (strstr($line, "PHP_FUNCTION")) {
if (ereg("PHP_FUNCTION\\(([[:alnum:]_]+)", $line, $matches)) {
add_function($funcimp, $file, $lineno, $matches[1]);
}
continue;
}
if (strstr($line, "ZEND_FUNCTION")) {
if (ereg("ZEND_FUNCTION\\(([[:alnum:]_]+)", $line, $matches)) {
add_function($funcimp, $file, $lineno, $matches[1]);
}
continue;
}
if (strstr($line, "PHP_FE")) {
if (ereg("PHP_FE\\(([[:alnum:]_]+)", $line, $matches)) {
add_function($funcdef, $file, $lineno, $matches[1]);
}
continue;
}
if (strstr($line, "ZEND_FE")) {
if (ereg("ZEND_FE\\(([[:alnum:]_]+)", $line, $matches)) {
add_function($funcdef, $file, $lineno, $matches[1]);
}
continue;
}
if (strstr($line, "UODBC_FE")) {
if (ereg("UOBDC_FE\\(([[:alnum:]_]+)", $line, $matches)) {
add_function($funcdef, $file, $lineno, $matches[1]);
}
continue;
}
if (strstr($line, "cybercash_functions")) {
if (ereg("cybercash_functions\\(([[:alnum:]_]+)", $line, $matches)) {
add_function($funcdef, $file, $lineno, $matches[1]);
}
continue;
}
if (strstr($line, "PHP_NAMED_FE")) {
if (ereg("PHP_NAMED_FE\\(([[:alnum:]_]+)", $line, $matches)) {
add_function($funcdef, $file, $lineno, $matches[1]);
}
continue;
}
if (strstr($line, "ZEND_NAMED_FE")) {
if (ereg("ZEND_NAMED_FE\\(([[:alnum:]_]+)", $line, $matches)) {
add_function($funcdef, $file, $lineno, $matches[1]);
}
continue;
}
if (strstr($line, "PHP_STATIC_FE")) {
if (ereg('PHP_STATIC_FE\("([[:alnum:]_]+)"', $line, $matches)) {
add_function($funcdef, $file, $lineno, $matches[1]);
}
continue;
}
if (strstr($line, "ZEND_STATIC_FE")) {
if (ereg("ZEND_STATIC_FE\\(\"([[:alnum:]_]+)\"", $line, $matches)) {
add_function($funcdef, $file, $lineno, $matches[1]);
}
continue;
}
if (strstr($line, "PHP_FALIAS")) {
if (ereg("PHP_FALIAS\\(([[:alnum:]_]+)[[:space:]]*,[[:space:]]*([[:alnum:]_]+)",
$line, $matches)) {
add_function($funcdef, $file, $lineno, $matches[1], $matches[2]);
}
continue;
}
if (strstr($line, "ZEND_FALIAS")) {
if (ereg("ZEND_FALIAS\\(([[:alnum:]_]+)[[:space:]]*,[[:space:]]*([[:alnum:]_]+)",
$line, $matches)) {
add_function($funcdef, $file, $lineno, $matches[1], $matches[2]);
}
continue;
}
}
}
fclose($fp);
return $functions;
}
function add_function(&$funclist, $file, $line, $function, $alias_for = NULL) {
if (isset($funclist[$function])) return; // TODO: multiple definitions ignored for now
$entry = array("file" => $file, "line" => $line);
if ($alias_for) $entry["alias_for"] = $alias_for;
$funclist[$function] = $entry;
}
?>