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; }
*/

?>

Reply via email to