-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfunclist.php3
executable file
·119 lines (98 loc) · 3.2 KB
/
funclist.php3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#! ./php -q
<?
/* To be started in your /php3 source direcory,
using a CGI PHP interpreter within this directory.
max_execution_time on my system (P1, 133 MHz): 300 Sec.
*/
function scanforfunction($file) {
global $func, $module;
$size = filesize($file);
$tstart = time();
print "processing $file ($size bytes): "; flush();
$cfile = basename($file);
$line = implode("", @file($file));
print "names "; flush();
# Scan for "function_entry" block
if (preg_match("!function_entry\s+(\w+)_functions\[\]\s*=\s*\{(.*)\};!sUS", $line, $m)) :
# save module name
$module[$m[1]] = $m[1];
$cmodule = $m[1];
# split function block into function names
# Regexp ist an Alternative (alternative1|alternative2)
# Alternative 1 matches '{ "func_name", php3_func_name,'
# Alternative 2 matches 'PHP_FE(func_name,'
if (preg_match_all(
"!(\{\s*\"(\w+)\"\s*,\s*(\w+)\s*,|PHP_FE\(\s*(\w+)\s*,)!sUS",
$m[2],
$m)) :
$fnames = $m[2];
$cnames = $m[3];
$xnames = $m[4];
reset($xnames);
while(list($k, $v) = each($xnames)) :
if ($v) :
$fnames[] = $v;
$cnames[] = "php3_$v";
endif;
endwhile;
reset($fnames);
while (list($k, $v) = each($fnames)) :
if ($v) :
$func[$fnames[$k]]["name"] = $fnames[$k];
$func[$fnames[$k]]["cfunc"] = $cnames[$k];
$func[$fnames[$k]]["module"]= $cmodule;
$func[$fnames[$k]]["file"] = $cfile;
endif;
endwhile;
endif;
endif;
print "descriptions "; flush();
# Scan for '/* {{{ proto ... */ ... }}} */' blocks
if (preg_match_all(
"!/\*\s*\{\{\{(.*)\*/.*\}\}\}\s*\*/!sUS",
$line,
$m,
PREG_SET_ORDER)) :
reset($m);
while(list($k, $v) = each($m)) :
preg_match("!proto\s+(\w+)\s+(\w+)\((.*)\).*\n(.*)$!sUS", $v[1], $n);
$func[$n[2]]["return"] = $n[1];
$func[$n[2]]["parameter"] = $n[3];
$func[$n[2]]["desc"] = $n[4];
endwhile;
endif;
$tstop = time();
$tuse = $tstop - $tstart;
$tfunc = count($func);
$tmod = count($module);
print "($tuse sec, $tfunc functions in $tmod modules).\n"; flush();
}
function scandir($dirname = ".") {
$dp = opendir($dirname);
if (!$dp)
die("Cannot open $dirname");
while($name = readdir($dp)) {
# skip . and ..
if ("." == $name or ".." == $name)
continue;
# recurse subdirectories
if ("dir" == filetype("$dirname/$name"))
scandir("$dirname/$name");
# skip all non-.c files
if (!preg_match("/\.c$/", $name))
continue;
# scan the file for functions
scanforfunction("$dirname/$name");
}
closedir($dp);
}
scandir();
reset($func);
while(list($k, $v) = each($func)) :
printf("Function %s (Module %s, %s:%s()):\n",
$k, $v["module"], $v["file"], $v["cfunc"]);
printf("%s %s(%s)\n", $v["return"], $k, $v["parameter"]);
printf("%s\n\n", $v["desc"]);
endwhile;
exit;
?>