cvs: functable / genfunclist.php

From: 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; } ?>

« previous php.doc.web (#433) next »