mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
ext_skel is no more, and ext_skel_ng is moving to PEAR::PECL_Gen
This commit is contained in:
195
README.EXT_SKEL
195
README.EXT_SKEL
@@ -1,193 +1,2 @@
|
||||
(NOTE: you may also want to take a look at scripts/ext_skel_ng,
|
||||
a PHP-only alternative for this script thats supposed
|
||||
to replace it completely in the long run ...)
|
||||
|
||||
WHAT IT IS
|
||||
|
||||
It's a tool for automatically creating the basic framework for a PHP module
|
||||
and writing C code handling arguments passed to your functions from a simple
|
||||
configuration file. See an example at the end of this file.
|
||||
|
||||
HOW TO USE IT
|
||||
|
||||
Very simple. First, change to the ext/ directory of the PHP 4 sources. If
|
||||
you just need the basic framework and will be writing all the code in your
|
||||
functions yourself, you can now do
|
||||
|
||||
./ext_skel --extname=module_name
|
||||
|
||||
and everything you need is placed in directory module_name.
|
||||
|
||||
[ Note that GNU awk is likely required for this script to work. Debian
|
||||
systems seem to default to using mawk, so you may need to change the
|
||||
#! line in skeleton/create_stubs and the cat $proto | awk line in
|
||||
ext_skel to use gawk explicitly. ]
|
||||
|
||||
If you don't need to test the existence of any external header files,
|
||||
libraries or functions in them, the module is already almost ready to be
|
||||
compiled in PHP. Just remove 3 comments in your_module_name/config.m4,
|
||||
change back up to PHP sources top directory, and do
|
||||
|
||||
./buildconf; ./configure --enable-module_name; make
|
||||
|
||||
But if you already have planned the overall scheme of your module, what
|
||||
functions it will contain, their return types and the arguments they take
|
||||
(a very good idea) and don't want to bother yourself with creating function
|
||||
definitions and handling arguments passed yourself, it's time to create a
|
||||
function definitions file, which you will give as an argument to ext_skel
|
||||
with option
|
||||
|
||||
--proto=filename.
|
||||
|
||||
FORMAT OF FUNCTION DEFINITIONS FILE
|
||||
|
||||
All the definitions must be on one line. In it's simplest form, it's just
|
||||
the function name, e.g.
|
||||
|
||||
my_function
|
||||
|
||||
but then you'll be left with an almost empty function body without any
|
||||
argument handling.
|
||||
|
||||
Arguments are given in parenthesis after the function name, and are of
|
||||
the form 'argument_type argument_name'. Arguments are separated from each
|
||||
other with a comma and optional space. Argument_type can be one of int,
|
||||
bool, double, float, string, array, object or mixed.
|
||||
|
||||
An optional argument is separated from the previous by an optional space,
|
||||
then '[' and of course comma and optional space, like all the other
|
||||
arguments. You should close a row of optional arguments with same amount of
|
||||
']'s as there where '['s. Currently, it does not harm if you forget to do it
|
||||
or there is a wrong amount of ']'s, but this may change in the future.
|
||||
|
||||
An additional short description may be added after the parameters.
|
||||
If present it will be filled into the 'proto' header comments in the stubs
|
||||
code and the <refpurpose> tag in the XML documentation.
|
||||
|
||||
An example:
|
||||
|
||||
my_function(int arg1, int arg2 [, int arg3 [, int arg4]]) this is my 1st
|
||||
|
||||
Arguments arg3 and arg4 are optional.
|
||||
|
||||
If possible, the function definition should also contain it's return type
|
||||
in front of the definition. It's not actually used for any C code generating
|
||||
purposes but PHP in-source documentation instead, and as such, very useful.
|
||||
It can be any of int, double, string, bool, array, object, resource, mixed
|
||||
or void.
|
||||
|
||||
The file must contain nothing else but function definitions, no comments or
|
||||
empty lines.
|
||||
|
||||
OTHER OPTIONS
|
||||
|
||||
--no-help
|
||||
|
||||
By default, ext_skel creates both comments in the source code and a test
|
||||
function to help first time module writers to get started and testing
|
||||
configuring and compiling their module. This option turns off all such things
|
||||
which may just annoy experienced PHP module coders. Especially useful with
|
||||
|
||||
--stubs=file
|
||||
|
||||
which will leave out also all module specific stuff and write just function
|
||||
stubs with function value declarations and passed argument handling, and
|
||||
function entries and definitions at the end of the file, for copying and
|
||||
pasting into an already existing module.
|
||||
|
||||
--assign-params
|
||||
--string-lens
|
||||
|
||||
By default, function proto 'void foo(string bar)' creates the following:
|
||||
...
|
||||
zval **bar;
|
||||
... (zend_get_parameters_ex() called in the middle...)
|
||||
convert_to_string_ex(bar);
|
||||
|
||||
Specifying both of these options changes the generated code to:
|
||||
...
|
||||
zval **bar_arg;
|
||||
int bar_len;
|
||||
char *bar = NULL;
|
||||
... (zend_get_parameters_ex() called in the middle...)
|
||||
convert_to_string_ex(bar_arg);
|
||||
bar = Z_STRVAL_PP(bar_arg);
|
||||
bar_len = Z_STRLEN_PP(bar_arg);
|
||||
|
||||
You shouldn't have to ask what happens if you leave --string-lens out. If you
|
||||
have to, it's questionable whether you should be reading this document.
|
||||
|
||||
--with-xml[=file]
|
||||
|
||||
Creates the basics for phpdoc .xml file.
|
||||
|
||||
--full-xml
|
||||
|
||||
Not implemented yet. When or if there will ever be created a framework for
|
||||
self-contained extensions to use phpdoc system for their documentation, this
|
||||
option enables it on the created xml file.
|
||||
|
||||
CURRENT LIMITATIONS, BUGS AND OTHER ODDITIES
|
||||
|
||||
Only arguments of types int, bool, double, float, string and array are
|
||||
handled. For other types you must write the code yourself. And for type
|
||||
mixed, it wouldn't even be possible to write anything, because only you
|
||||
know what to expect.
|
||||
|
||||
It can't handle correctly, and probably never will, variable list of
|
||||
of arguments. (void foo(int bar [, ...])
|
||||
|
||||
Don't trust the generated code too much. It tries to be useful in most of
|
||||
the situations you might encounter, but automatic code generation will never
|
||||
beat a programmer who knows the real situation at hand. ext_skel is generally
|
||||
best suited for quickly generating a wrapper for c-library functions you
|
||||
might want to have available in PHP too.
|
||||
|
||||
This program doesn't have a --help option. It has --no-help instead.
|
||||
|
||||
EXAMPLE
|
||||
|
||||
The following _one_ line
|
||||
|
||||
bool my_drawtext(resource image, string text, resource font, int x, int y [, int color])
|
||||
|
||||
will create this function definition for you (note that there are a few
|
||||
question marks to be replaced by you, and you must of course add your own
|
||||
value definitions too):
|
||||
|
||||
/* {{{ proto bool my_drawtext(resource image, string text, resource font, int x, int y[, int color])
|
||||
*/
|
||||
PHP_FUNCTION(my_drawtext)
|
||||
{
|
||||
zval **image, **text, **font, **x, **y, **color;
|
||||
int argc;
|
||||
int image_id = -1;
|
||||
int font_id = -1;
|
||||
|
||||
argc = ZEND_NUM_ARGS();
|
||||
if (argc < 5 || argc > 6 || zend_get_parameters_ex(argc, &image, &text, &font, &x, &y, &color) == FAILURE) {
|
||||
WRONG_PARAM_COUNT;
|
||||
}
|
||||
|
||||
ZEND_FETCH_RESOURCE(???, ???, image, image_id, "???", ???_rsrc_id);
|
||||
ZEND_FETCH_RESOURCE(???, ???, font, font_id, "???", ???_rsrc_id);
|
||||
|
||||
switch (argc) {
|
||||
case 6:
|
||||
convert_to_long_ex(color);
|
||||
/* Fall-through. */
|
||||
case 5:
|
||||
convert_to_long_ex(y);
|
||||
convert_to_long_ex(x);
|
||||
/* font: fetching resources already handled. */
|
||||
convert_to_string_ex(text);
|
||||
/* image: fetching resources already handled. */
|
||||
break;
|
||||
default:
|
||||
WRONG_PARAM_COUNT;
|
||||
}
|
||||
|
||||
php_error(E_WARNING, "my_drawtext: not yet implemented");
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
NOTE: ext_skel does no longer exist, it has been replaced
|
||||
by the PEAR package PECL_Gen
|
||||
|
||||
284
ext/ext_skel
284
ext/ext_skel
@@ -1,284 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
givup() {
|
||||
echo $*
|
||||
exit 1
|
||||
}
|
||||
|
||||
usage() {
|
||||
echo "$0 --extname=module [--proto=file] [--stubs=file] [--xml[=file]]"
|
||||
echo " [--skel=dir] [--full-xml] [--no-help]"
|
||||
echo ""
|
||||
echo " --extname=module module is the name of your extension"
|
||||
echo " --proto=file file contains prototypes of functions to create"
|
||||
echo " --stubs=file generate only function stubs in file"
|
||||
echo " --xml generate xml documentation to be added to phpdoc-cvs"
|
||||
echo " --skel=dir path to the skeleton directory"
|
||||
echo " --full-xml generate xml documentation for a self-contained extension"
|
||||
echo " (not yet implemented)"
|
||||
echo " --no-help don't try to be nice and create comments in the code"
|
||||
echo " and helper functions to test if the module compiled"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if test $# = 0; then
|
||||
usage
|
||||
fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case "$1" in
|
||||
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
||||
*) optarg= ;;
|
||||
esac
|
||||
|
||||
case $1 in
|
||||
--extname=?*)
|
||||
extname=$optarg
|
||||
EXTNAME=`echo $extname | tr "[:lower:]" "[:upper:]"`
|
||||
;;
|
||||
--proto=?*)
|
||||
proto=$optarg
|
||||
;;
|
||||
--stubs=*)
|
||||
stubs=yes
|
||||
stubfile=$optarg
|
||||
;;
|
||||
--xml)
|
||||
xml="yes"
|
||||
;;
|
||||
--xml=?*)
|
||||
xml=$optarg
|
||||
;;
|
||||
--full-xml)
|
||||
full_xml="yes"
|
||||
;;
|
||||
--no-help)
|
||||
no_help="yes"
|
||||
;;
|
||||
--skel=?*)
|
||||
skel_dir=$optarg
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if test -d "$extname" ; then
|
||||
givup "Directory $extname already exists."
|
||||
fi
|
||||
|
||||
if test -z "$skel_dir"; then
|
||||
skel_dir="skeleton"
|
||||
fi
|
||||
|
||||
## convert skel_dir to full path
|
||||
skel_dir=`cd $skel_dir && pwd`
|
||||
|
||||
test -d $skel_dir || givup "directory $skel_dir does not exist or is not directory"
|
||||
|
||||
if echo '\c' | grep -s c >/dev/null 2>&1
|
||||
then
|
||||
ECHO_N="echo -n"
|
||||
ECHO_C=""
|
||||
else
|
||||
ECHO_N="echo"
|
||||
ECHO_C='\c'
|
||||
fi
|
||||
|
||||
if test -z "$stubs"; then
|
||||
echo "Creating directory $extname"
|
||||
stubfile=$extname"/function_stubs"
|
||||
mkdir $extname || givup "Cannot create directory $extname"
|
||||
fi
|
||||
|
||||
if test -n "$proto"; then
|
||||
cat $proto | awk -v extname=$extname -v stubs=$stubs -v stubfile=$stubfile -v xml=$xml -v full_xml=$full_xml -v i_know_what_to_do_shut_up_i_dont_need_your_help_mode=$no_help -f $skel_dir/create_stubs
|
||||
fi
|
||||
|
||||
if test -z "$stubs"; then
|
||||
cd $extname
|
||||
chmod 755 .
|
||||
|
||||
$ECHO_N "Creating basic files:$ECHO_C"
|
||||
|
||||
$ECHO_N " config.m4$ECHO_C"
|
||||
cat >config.m4 <<eof
|
||||
dnl \$Id\$
|
||||
dnl config.m4 for extension $extname
|
||||
|
||||
dnl Comments in this file start with the string 'dnl'.
|
||||
dnl Remove where necessary. This file will not work
|
||||
dnl without editing.
|
||||
|
||||
dnl If your extension references something external, use with:
|
||||
|
||||
dnl PHP_ARG_WITH($extname, for $extname support,
|
||||
dnl Make sure that the comment is aligned:
|
||||
dnl [ --with-$extname Include $extname support])
|
||||
|
||||
dnl Otherwise use enable:
|
||||
|
||||
dnl PHP_ARG_ENABLE($extname, whether to enable $extname support,
|
||||
dnl Make sure that the comment is aligned:
|
||||
dnl [ --enable-$extname Enable $extname support])
|
||||
|
||||
if test "\$PHP_$EXTNAME" != "no"; then
|
||||
dnl Write more examples of tests here...
|
||||
|
||||
dnl # --with-$extname -> check with-path
|
||||
dnl SEARCH_PATH="/usr/local /usr" # you might want to change this
|
||||
dnl SEARCH_FOR="/include/$extname.h" # you most likely want to change this
|
||||
dnl if test -r \$PHP_$EXTNAME/\$SEARCH_FOR; then # path given as parameter
|
||||
dnl ${EXTNAME}_DIR=\$PHP_$EXTNAME
|
||||
dnl else # search default path list
|
||||
dnl AC_MSG_CHECKING([for $extname files in default path])
|
||||
dnl for i in \$SEARCH_PATH ; do
|
||||
dnl if test -r \$i/\$SEARCH_FOR; then
|
||||
dnl ${EXTNAME}_DIR=\$i
|
||||
dnl AC_MSG_RESULT(found in \$i)
|
||||
dnl fi
|
||||
dnl done
|
||||
dnl fi
|
||||
dnl
|
||||
dnl if test -z "\$${EXTNAME}_DIR"; then
|
||||
dnl AC_MSG_RESULT([not found])
|
||||
dnl AC_MSG_ERROR([Please reinstall the $extname distribution])
|
||||
dnl fi
|
||||
|
||||
dnl # --with-$extname -> add include path
|
||||
dnl PHP_ADD_INCLUDE(\$${EXTNAME}_DIR/include)
|
||||
|
||||
dnl # --with-$extname -> check for lib and symbol presence
|
||||
dnl LIBNAME=$extname # you may want to change this
|
||||
dnl LIBSYMBOL=$extname # you most likely want to change this
|
||||
|
||||
dnl PHP_CHECK_LIBRARY(\$LIBNAME,\$LIBSYMBOL,
|
||||
dnl [
|
||||
dnl PHP_ADD_LIBRARY_WITH_PATH(\$LIBNAME, \$${EXTNAME}_DIR/lib, ${EXTNAME}_SHARED_LIBADD)
|
||||
dnl AC_DEFINE(HAVE_${EXTNAME}LIB,1,[ ])
|
||||
dnl ],[
|
||||
dnl AC_MSG_ERROR([wrong $extname lib version or lib not found])
|
||||
dnl ],[
|
||||
dnl -L\$${EXTNAME}_DIR/lib -lm -ldl
|
||||
dnl ])
|
||||
dnl
|
||||
dnl PHP_SUBST(${EXTNAME}_SHARED_LIBADD)
|
||||
|
||||
PHP_NEW_EXTENSION($extname, $extname.c, \$ext_shared)
|
||||
fi
|
||||
eof
|
||||
|
||||
|
||||
$ECHO_N " .cvsignore$ECHO_C"
|
||||
cat >.cvsignore <<eof
|
||||
.deps
|
||||
*.lo
|
||||
*.la
|
||||
eof
|
||||
|
||||
$ECHO_N " $extname.c$ECHO_C"
|
||||
echo "s/extname/$extname/g" > sedscript
|
||||
echo "s/EXTNAME/$EXTNAME/g" >> sedscript
|
||||
echo '/__function_entries_here__/r function_entries' >> sedscript
|
||||
echo '/__function_stubs_here__/r function_stubs' >> sedscript
|
||||
echo '/__header_here__/r ../../header' >> sedscript
|
||||
echo '/__footer_here__/r ../../footer' >> sedscript
|
||||
echo '/__function_entries_here__/D' >> sedscript
|
||||
echo '/__function_stubs_here__/D' >> sedscript
|
||||
echo '/__header_here__/D' >> sedscript
|
||||
echo '/__footer_here__/D' >> sedscript
|
||||
if [ ! -z "$no_help" ]; then
|
||||
echo "/confirm_$extname_compiled/D" >> sedscript
|
||||
echo '/Remove the following/,/^\*\//D' >> sedscript
|
||||
echo 's/[[:space:]]\/\*.\+\*\///' >> sedscript
|
||||
echo 's/^\/\*.*\*\/$//' >> sedscript
|
||||
echo '/^[[:space:]]*\/\*/,/^[[:space:]]*\*\//D' >> sedscript
|
||||
fi
|
||||
|
||||
sed -f sedscript < $skel_dir/skeleton.c > $extname.c
|
||||
|
||||
|
||||
$ECHO_N " php_$extname.h$ECHO_C"
|
||||
echo "s/extname/$extname/g" > sedscript
|
||||
echo "s/EXTNAME/$EXTNAME/g" >> sedscript
|
||||
echo '/__function_declarations_here__/r function_declarations' >> sedscript
|
||||
echo '/__header_here__/r ../../header' >> sedscript
|
||||
echo '/__footer_here__/r ../../footer' >> sedscript
|
||||
echo '/__function_declarations_here__/D' >> sedscript
|
||||
echo '/__header_here__/D' >> sedscript
|
||||
echo '/__footer_here__/D' >> sedscript
|
||||
if [ ! -z "$no_help" ]; then
|
||||
echo "/confirm_$extname_compiled/D" >> sedscript
|
||||
echo 's/[[:space:]]\/\*.\+\*\///' >> sedscript
|
||||
echo 's/^\/\*.*\*\/$//' >> sedscript
|
||||
echo '/^[[:space:]]*\/\*/,/^[[:space:]]*\*\//D' >> sedscript
|
||||
fi
|
||||
sed -f sedscript <$skel_dir/php_skeleton.h > php_$extname.h
|
||||
|
||||
$ECHO_N " CREDITS$ECHO_C"
|
||||
echo "s/extname/$extname/g" > sedscript
|
||||
sed -f sedscript <$skel_dir/CREDITS > CREDITS
|
||||
|
||||
$ECHO_N " EXPERIMENTAL$ECHO_C"
|
||||
echo "s/extname/$extname/g" > sedscript
|
||||
sed -f sedscript <$skel_dir/EXPERIMENTAL > EXPERIMENTAL
|
||||
|
||||
$ECHO_N " tests/001.phpt$ECHO_C"
|
||||
mkdir tests || givup "Cannot create tests directory"
|
||||
chmod 755 tests
|
||||
sed -f sedscript <$skel_dir/tests/001.phpt > tests/001.phpt
|
||||
|
||||
if test -z "$stubs" && test -z "$no_help"; then
|
||||
$ECHO_N " $extname.php$ECHO_C"
|
||||
sed \
|
||||
-e "s/extname/$extname/g" \
|
||||
<$skel_dir/skeleton.php \
|
||||
> $extname.php
|
||||
fi
|
||||
|
||||
rm sedscript
|
||||
|
||||
if test -n "$proto"; then
|
||||
if test -z "$stubs"; then
|
||||
rm function_entries
|
||||
rm function_declarations
|
||||
rm function_stubs
|
||||
fi
|
||||
if test -f function_warning; then
|
||||
rm function_warning
|
||||
warning="
|
||||
NOTE! Because some arguments to functions were resources, the code generated
|
||||
cannot yet be compiled without editing. Please consider this to be step 4.5
|
||||
in the instructions above.
|
||||
"
|
||||
fi
|
||||
fi
|
||||
|
||||
find . -type f | xargs chmod 644
|
||||
find . -type d | xargs chmod 755
|
||||
fi
|
||||
|
||||
echo " [done]."
|
||||
|
||||
if test -z "$no_help" && test -z "$stubs"; then
|
||||
cat <<eof
|
||||
|
||||
To use your new extension, you will have to execute the following steps:
|
||||
|
||||
1. $ cd ..
|
||||
2. $ vi ext/$extname/config.m4
|
||||
3. $ ./buildconf
|
||||
4. $ ./configure --[with|enable]-$extname
|
||||
5. $ make
|
||||
6. $ ./php -f ext/$extname/$extname.php
|
||||
7. $ vi ext/$extname/$extname.c
|
||||
8. $ make
|
||||
|
||||
Repeat steps 3-6 until you are satisfied with ext/$extname/config.m4 and
|
||||
step 6 confirms that your module is compiled into PHP. Then, start writing
|
||||
code and repeat the last two steps as often as necessary.
|
||||
$warning
|
||||
eof
|
||||
fi
|
||||
@@ -1,52 +0,0 @@
|
||||
<?php
|
||||
/* $Id$ */
|
||||
|
||||
if (php_sapi_name() != "cli") {
|
||||
echo "Please run this script using the CLI version of PHP\n";
|
||||
exit;
|
||||
}
|
||||
/*
|
||||
This script can be used on Win32 systems
|
||||
|
||||
1) Make sure you have CygWin installed
|
||||
2) Adjust the $cygwin_path to match your installation
|
||||
3) Change the environment cariable PATHEXT to include .PHP
|
||||
4) run ext_skel --ext_name=...
|
||||
the first time you run this script you will be asked to
|
||||
associate it with a program. chooses the CLI version of php.
|
||||
*/
|
||||
|
||||
$cygwin_path = 'c:\cygwin\bin';
|
||||
|
||||
$path = getenv("PATH");
|
||||
putenv("PATH=$cygwin_path;$path");
|
||||
|
||||
array_shift($argv);
|
||||
system("sh ext_skel " . implode(" ", $argv));
|
||||
|
||||
$extname = "";
|
||||
$skel = "skeleton";
|
||||
foreach($argv as $arg) {
|
||||
if (strtolower(substr($arg, 0, 9)) == "--extname") {
|
||||
$extname = substr($arg, 10);
|
||||
}
|
||||
if (strtolower(substr($arg, 0, 6)) == "--skel") {
|
||||
$skel = substr($arg, 7);
|
||||
}
|
||||
}
|
||||
|
||||
$fp = fopen("$skel/skeleton.dsp", "rb");
|
||||
if ($fp) {
|
||||
$dsp_file = fread($fp, filesize("$skel/skeleton.dsp"));
|
||||
fclose($fp);
|
||||
|
||||
$dsp_file = str_replace("extname", $extname, $dsp_file);
|
||||
$dsp_file = str_replace("EXTNAME", strtoupper($extname), $dsp_file);
|
||||
$fp = fopen("$extname/$extname.dsp", "wb");
|
||||
if ($fp) {
|
||||
fwrite($fp, $dsp_file);
|
||||
fclose($fp);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1 +0,0 @@
|
||||
extname
|
||||
@@ -1,289 +0,0 @@
|
||||
#!/usr/bin/awk -f
|
||||
|
||||
function gobble(s, x)
|
||||
{
|
||||
sub(/^ /, "", line)
|
||||
match(line, "^" "(" s ")")
|
||||
x = substr(line, 1, RLENGTH)
|
||||
line = substr(line, RLENGTH+1)
|
||||
return x
|
||||
}
|
||||
|
||||
function convert(i, j, t)
|
||||
{
|
||||
type = argtypes[i,j]
|
||||
name = argnames[i,j]
|
||||
opt = optionals[i,j]
|
||||
tabs = x = ""
|
||||
|
||||
for (i = 0; i < t; i++) { tabs = tabs "\t" }
|
||||
|
||||
if (type == "int" || type == "long") {
|
||||
longs = longs "\tlong " name ";\n"
|
||||
} else if (type == "bool" || type == "boolean") {
|
||||
bools = bools "\tzend_bool " name ";\n"
|
||||
} else if (type == "double" || type == "float") {
|
||||
doubles = doubles "\tdouble " name ";\n"
|
||||
} else if (type == "string") {
|
||||
strings = strings "\tchar *" name " = NULL;\n"
|
||||
ints = ints "\tint " name "_len;\n"
|
||||
} else if (type == "array" || type == "object" || type == "mixed") {
|
||||
zvals = zvals "\tzval *" name " = NULL;\n"
|
||||
} else if (type == "resource" || type == "handle") {
|
||||
zvals = zvals "\tzval *" name " = NULL;\n"
|
||||
resources = resources "\tif (" name ") {\n" \
|
||||
"\t\tZEND_FETCH_RESOURCE(???, ???, " name ", " name "_id, \"???\", ???_rsrc_id);\n\t}\n"
|
||||
ints = ints "\tint " name "_id = -1;\n"
|
||||
}
|
||||
}
|
||||
|
||||
function comment(s)
|
||||
{
|
||||
if (i_know_what_to_do_shut_up_i_dont_need_your_help_mode) {
|
||||
return
|
||||
} else {
|
||||
return s
|
||||
}
|
||||
}
|
||||
|
||||
BEGIN {
|
||||
name = "[_A-Za-z][_A-Za-z0-9]*"
|
||||
type = "int|long|double|float|string|bool|boolean|array|object|resource|handle|mixed|void"
|
||||
spec = "l|l|d|d|s|b|b|a|o|r|r|z|"
|
||||
num_funcs = 0
|
||||
|
||||
# create a map from type name to the spec
|
||||
split(type, type_array, "\|")
|
||||
split(spec, spec_array, "\|")
|
||||
for (i in type_array) {
|
||||
spec_map[type_array[i]] = spec_array[i]
|
||||
}
|
||||
|
||||
if (xml && xml != "yes") {
|
||||
xmldoc = xml
|
||||
} else {
|
||||
xmldoc = extname "/" extname ".xml"
|
||||
}
|
||||
|
||||
|
||||
xmlhead = "<?xml version='1.0' encoding='iso-8859-1'?>\n" \
|
||||
"<!-- $Revision$ -->\n" \
|
||||
" <reference id=\"ref." extname "\">\n" \
|
||||
" <title> functions</title>\n" \
|
||||
" <titleabbrev></titleabbrev>\n\n" \
|
||||
" <partintro>\n" \
|
||||
" &warn.experimental;\n" \
|
||||
" <para>\n" \
|
||||
" </para>\n" \
|
||||
" </partintro>\n\n";
|
||||
|
||||
xmlfoot = " </reference>\n\n" \
|
||||
"<!-- Keep this comment at the end of the file\n" \
|
||||
"Local variables:\n" \
|
||||
"mode: sgml\n" \
|
||||
"sgml-omittag:t\n" \
|
||||
"sgml-shorttag:t\n" \
|
||||
"sgml-minimize-attributes:nil\n" \
|
||||
"sgml-always-quote-attributes:t\n" \
|
||||
"sgml-indent-step:1\n" \
|
||||
"sgml-indent-data:t\n" \
|
||||
"indent-tabs-mode:nil\n" \
|
||||
"sgml-parent-document:nil\n" \
|
||||
"sgml-default-dtd-file:\"../../manual.ced\"\n" \
|
||||
"sgml-exposed-tags:nil\n" \
|
||||
"sgml-local-catalogs:nil\n" \
|
||||
"sgml-local-ecat-files:nil\n" \
|
||||
"End:\n" \
|
||||
"vim600: syn=xml fen fdm=syntax fdl=2 si\n" \
|
||||
"vim: et tw=78 syn=sgml\n" \
|
||||
"vi: ts=1 sw=1\n" \
|
||||
"-->\n"
|
||||
}
|
||||
|
||||
{
|
||||
args_max = args_min = optional = i = spec_opt = 0
|
||||
line = $0
|
||||
spec_str = "\""
|
||||
|
||||
## php extension must use lower case function names.
|
||||
## this will translate any capitalized letter to lowercase
|
||||
## and warn the user
|
||||
if (match(func_name,"[A-Z]") != 0) {
|
||||
printf("NOTICE: lower casing function name '%s'\n",func_name)
|
||||
func_name = tolower(func_name)
|
||||
}
|
||||
func_type = gobble(type);
|
||||
func_name = gobble(name);
|
||||
|
||||
if (gobble("\\(")) {
|
||||
if (gobble("\\[")) optional = 1
|
||||
while (arg_type = gobble(type)) {
|
||||
arg_name = gobble(name)
|
||||
if(arg_type == "void") {
|
||||
args_max = 0;
|
||||
args_min = 0;
|
||||
break;
|
||||
} else {
|
||||
argtypes[num_funcs,args_max] = arg_type
|
||||
argnames[num_funcs,args_max] = arg_name
|
||||
|
||||
args_max++
|
||||
if (optional) {
|
||||
if (!spec_opt) {
|
||||
spec_str = spec_str "|"
|
||||
spec_opt = 1
|
||||
}
|
||||
optionals[num_funcs,i] = optional
|
||||
} else {
|
||||
args_min++
|
||||
}
|
||||
spec_str = spec_str spec_map[arg_type]
|
||||
|
||||
if (x = gobble("\\[")) {
|
||||
optional++
|
||||
}
|
||||
|
||||
y = gobble(",")
|
||||
if (!x && y && optional) {
|
||||
grouped_optional_param[num_funcs,i] = 1
|
||||
}
|
||||
i++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# if (x = gobble("\\)")) {
|
||||
gobble("\\]* *\\)")
|
||||
sub(/^[ \t]+/, "", line)
|
||||
fcomments[num_funcs] = line
|
||||
# }
|
||||
|
||||
spec_str = spec_str "\""
|
||||
|
||||
funcs[num_funcs] = func_name
|
||||
types[num_funcs] = func_type
|
||||
maxargs[num_funcs] = args_max
|
||||
minargs[num_funcs] = args_min
|
||||
specs[num_funcs] = spec_str
|
||||
spec_opts[num_funcs] = spec_opt
|
||||
|
||||
num_funcs++
|
||||
}
|
||||
|
||||
END {
|
||||
if (xml) print xmlhead > xmldoc
|
||||
for (i = 0; i < num_funcs; i++) {
|
||||
compareargc = maxargs[i] - minargs[i]
|
||||
closefetch = fetchargs = zvals = xmlparams = funcvals = resources = handleargs = closeopts = ""
|
||||
ints = longs = doubles = strings = bools = zvals = ""
|
||||
|
||||
proto = "/* {{{ proto " types[i] " " funcs[i] "("
|
||||
|
||||
refid = funcs[i]
|
||||
gsub(/_/, "-", refid)
|
||||
xmlstr = " <refentry id=\"function." refid "\">\n" \
|
||||
" <refnamediv>\n" \
|
||||
" <refname>" funcs[i] "</refname>\n" \
|
||||
" <refpurpose>" fcomments[i] "</refpurpose>\n" \
|
||||
" </refnamediv>\n" \
|
||||
" <refsect1>\n" \
|
||||
" <title>Description</title>\n" \
|
||||
" <funcsynopsis>\n" \
|
||||
" <funcprototype>\n" \
|
||||
" <funcdef>" types[i] " <function>" funcs[i] "</function></funcdef>\n"
|
||||
|
||||
if (maxargs[i]>0) {
|
||||
fetchargs = "\tif (zend_parse_parameters("
|
||||
ints = ints "\tint argc = ZEND_NUM_ARGS();\n"
|
||||
fetchargs = fetchargs "argc TSRMLS_CC, " specs[i]
|
||||
} else {
|
||||
fetchargs = fetchargs "\tif (ZEND_NUM_ARGS() != 0) {\n\t\tWRONG_PARAM_COUNT;\n\t}"
|
||||
xmlparams = xmlparams " <void/>\n"
|
||||
}
|
||||
|
||||
for (j = 0; j < maxargs[i]; j++) {
|
||||
|
||||
fetchargs = fetchargs ", "
|
||||
|
||||
fetchargs = fetchargs "&" argnames[i,j]
|
||||
if (argtypes[i,j] == "string") {
|
||||
fetchargs = fetchargs ", &" argnames[i,j] "_len"
|
||||
}
|
||||
|
||||
xmlparams = xmlparams " <paramdef>" argtypes[i,j]
|
||||
if (j > minargs[i]-1) {
|
||||
if (!grouped_optional_param[i,j-1]) {
|
||||
if (j > 0) proto = proto " "
|
||||
proto = proto "["
|
||||
closeopts = closeopts "]"
|
||||
}
|
||||
xmlparams = xmlparams "\n <parameter><optional>" \
|
||||
argnames[i,j] \
|
||||
"</optional></parameter>\n </paramdef>\n"
|
||||
} else {
|
||||
xmlparams = xmlparams \
|
||||
" <parameter>" \
|
||||
argnames[i,j] \
|
||||
"</parameter></paramdef>\n"
|
||||
}
|
||||
|
||||
if (j > 0) proto = proto ", "
|
||||
proto = proto argtypes[i,j] " " argnames[i,j]
|
||||
|
||||
convert(i, j, 1)
|
||||
}
|
||||
|
||||
proto = proto closeopts ")\n " fcomments[i] " */\nPHP_FUNCTION(" funcs[i] ")\n{"
|
||||
if (maxargs[i]>0) {
|
||||
fetchargs = fetchargs ") == FAILURE)" closefetch " \n\t\treturn;\n"
|
||||
}
|
||||
funcvals = strings ints longs doubles bools zvals
|
||||
xmlstr = xmlstr xmlparams \
|
||||
" </funcprototype>\n" \
|
||||
" </funcsynopsis>\n" \
|
||||
" &warn.experimental.func;\n" \
|
||||
" <para>\n" \
|
||||
" &warn.undocumented.func;\n" \
|
||||
" </para>\n" \
|
||||
" </refsect1>\n" \
|
||||
" </refentry>\n"
|
||||
|
||||
print proto > stubfile
|
||||
if (funcvals) print funcvals > stubfile
|
||||
if (fetchargs) print fetchargs > stubfile
|
||||
if (resources) {
|
||||
print resources > stubfile
|
||||
if (!stubs) print "" > extname "/function_warning"
|
||||
}
|
||||
if (!i_know_what_to_do_shut_up_i_dont_need_your_help_mode) {
|
||||
print "\tphp_error(E_WARNING, \"" funcs[i] ": not yet implemented\");" > stubfile
|
||||
}
|
||||
print "}\n/* }}} */\n" > stubfile
|
||||
|
||||
if (stubs) {
|
||||
h_stubs = h_stubs "PHP_FUNCTION(" funcs[i] ");\n"
|
||||
c_stubs = c_stubs "\tPHP_FE(" funcs[i] ",\tNULL)\n"
|
||||
} else {
|
||||
print "PHP_FUNCTION(" funcs[i] ");" > extname "/function_declarations"
|
||||
print "\tPHP_FE(" funcs[i] ",\tNULL)" > extname "/function_entries"
|
||||
}
|
||||
|
||||
if (xml) print xmlstr > xmldoc
|
||||
}
|
||||
|
||||
if (stubs) {
|
||||
print "\n/* ----------------------------------------------------------- */\n" > stubfile
|
||||
print c_stubs > stubfile
|
||||
print "\n/* ----------------------------------------------------------- */\n" > stubfile
|
||||
print h_stubs > stubfile
|
||||
}
|
||||
|
||||
if (xml) print xmlfoot > xmldoc
|
||||
}
|
||||
|
||||
#
|
||||
# Local variables:
|
||||
# tab-width: 2
|
||||
# c-basic-offset: 2
|
||||
# End:
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
/* __header_here__ */
|
||||
|
||||
#ifndef PHP_EXTNAME_H
|
||||
#define PHP_EXTNAME_H
|
||||
|
||||
extern zend_module_entry extname_module_entry;
|
||||
#define phpext_extname_ptr &extname_module_entry
|
||||
|
||||
#ifdef PHP_WIN32
|
||||
#define PHP_EXTNAME_API __declspec(dllexport)
|
||||
#else
|
||||
#define PHP_EXTNAME_API
|
||||
#endif
|
||||
|
||||
#ifdef ZTS
|
||||
#include "TSRM.h"
|
||||
#endif
|
||||
|
||||
PHP_MINIT_FUNCTION(extname);
|
||||
PHP_MSHUTDOWN_FUNCTION(extname);
|
||||
PHP_RINIT_FUNCTION(extname);
|
||||
PHP_RSHUTDOWN_FUNCTION(extname);
|
||||
PHP_MINFO_FUNCTION(extname);
|
||||
|
||||
PHP_FUNCTION(confirm_extname_compiled); /* For testing, remove later. */
|
||||
/* __function_declarations_here__ */
|
||||
|
||||
/*
|
||||
Declare any global variables you may need between the BEGIN
|
||||
and END macros here:
|
||||
|
||||
ZEND_BEGIN_MODULE_GLOBALS(extname)
|
||||
long global_value;
|
||||
char *global_string;
|
||||
ZEND_END_MODULE_GLOBALS(extname)
|
||||
*/
|
||||
|
||||
/* In every utility function you add that needs to use variables
|
||||
in php_extname_globals, call TSRM_FETCH(); after declaring other
|
||||
variables used by that function, or better yet, pass in TSRMLS_CC
|
||||
after the last function argument and declare your utility function
|
||||
with TSRMLS_DC after the last declared argument. Always refer to
|
||||
the globals in your function as EXTNAME_G(variable). You are
|
||||
encouraged to rename these macros something shorter, see
|
||||
examples in any other php module directory.
|
||||
*/
|
||||
|
||||
#ifdef ZTS
|
||||
#define EXTNAME_G(v) TSRMG(extname_globals_id, zend_extname_globals *, v)
|
||||
#else
|
||||
#define EXTNAME_G(v) (extname_globals.v)
|
||||
#endif
|
||||
|
||||
#endif /* PHP_EXTNAME_H */
|
||||
|
||||
/* __footer_here__ */
|
||||
@@ -1,167 +0,0 @@
|
||||
/* __header_here__ */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "php.h"
|
||||
#include "php_ini.h"
|
||||
#include "ext/standard/info.h"
|
||||
#include "php_extname.h"
|
||||
|
||||
/* If you declare any globals in php_extname.h uncomment this:
|
||||
ZEND_DECLARE_MODULE_GLOBALS(extname)
|
||||
*/
|
||||
|
||||
/* True global resources - no need for thread safety here */
|
||||
static int le_extname;
|
||||
|
||||
/* {{{ extname_functions[]
|
||||
*
|
||||
* Every user visible function must have an entry in extname_functions[].
|
||||
*/
|
||||
function_entry extname_functions[] = {
|
||||
PHP_FE(confirm_extname_compiled, NULL) /* For testing, remove later. */
|
||||
/* __function_entries_here__ */
|
||||
{NULL, NULL, NULL} /* Must be the last line in extname_functions[] */
|
||||
};
|
||||
/* }}} */
|
||||
|
||||
/* {{{ extname_module_entry
|
||||
*/
|
||||
zend_module_entry extname_module_entry = {
|
||||
#if ZEND_MODULE_API_NO >= 20010901
|
||||
STANDARD_MODULE_HEADER,
|
||||
#endif
|
||||
"extname",
|
||||
extname_functions,
|
||||
PHP_MINIT(extname),
|
||||
PHP_MSHUTDOWN(extname),
|
||||
PHP_RINIT(extname), /* Replace with NULL if there's nothing to do at request start */
|
||||
PHP_RSHUTDOWN(extname), /* Replace with NULL if there's nothing to do at request end */
|
||||
PHP_MINFO(extname),
|
||||
#if ZEND_MODULE_API_NO >= 20010901
|
||||
"0.1", /* Replace with version number for your extension */
|
||||
#endif
|
||||
STANDARD_MODULE_PROPERTIES
|
||||
};
|
||||
/* }}} */
|
||||
|
||||
#ifdef COMPILE_DL_EXTNAME
|
||||
ZEND_GET_MODULE(extname)
|
||||
#endif
|
||||
|
||||
/* {{{ PHP_INI
|
||||
*/
|
||||
/* Remove comments and fill if you need to have entries in php.ini
|
||||
PHP_INI_BEGIN()
|
||||
STD_PHP_INI_ENTRY("extname.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_extname_globals, extname_globals)
|
||||
STD_PHP_INI_ENTRY("extname.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_extname_globals, extname_globals)
|
||||
PHP_INI_END()
|
||||
*/
|
||||
/* }}} */
|
||||
|
||||
/* {{{ php_extname_init_globals
|
||||
*/
|
||||
/* Uncomment this function if you have INI entries
|
||||
static void php_extname_init_globals(zend_extname_globals *extname_globals)
|
||||
{
|
||||
extname_globals->global_value = 0;
|
||||
extname_globals->global_string = NULL;
|
||||
}
|
||||
*/
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MINIT_FUNCTION
|
||||
*/
|
||||
PHP_MINIT_FUNCTION(extname)
|
||||
{
|
||||
/* If you have INI entries, uncomment these lines
|
||||
ZEND_INIT_MODULE_GLOBALS(extname, php_extname_init_globals, NULL);
|
||||
REGISTER_INI_ENTRIES();
|
||||
*/
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MSHUTDOWN_FUNCTION
|
||||
*/
|
||||
PHP_MSHUTDOWN_FUNCTION(extname)
|
||||
{
|
||||
/* uncomment this line if you have INI entries
|
||||
UNREGISTER_INI_ENTRIES();
|
||||
*/
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* Remove if there's nothing to do at request start */
|
||||
/* {{{ PHP_RINIT_FUNCTION
|
||||
*/
|
||||
PHP_RINIT_FUNCTION(extname)
|
||||
{
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* Remove if there's nothing to do at request end */
|
||||
/* {{{ PHP_RSHUTDOWN_FUNCTION
|
||||
*/
|
||||
PHP_RSHUTDOWN_FUNCTION(extname)
|
||||
{
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MINFO_FUNCTION
|
||||
*/
|
||||
PHP_MINFO_FUNCTION(extname)
|
||||
{
|
||||
php_info_print_table_start();
|
||||
php_info_print_table_header(2, "extname support", "enabled");
|
||||
php_info_print_table_end();
|
||||
|
||||
/* Remove comments if you have entries in php.ini
|
||||
DISPLAY_INI_ENTRIES();
|
||||
*/
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* Remove the following function when you have succesfully modified config.m4
|
||||
so that your module can be compiled into PHP, it exists only for testing
|
||||
purposes. */
|
||||
|
||||
/* Every user-visible function in PHP should document itself in the source */
|
||||
/* {{{ proto string confirm_extname_compiled(string arg)
|
||||
Return a string to confirm that the module is compiled in */
|
||||
PHP_FUNCTION(confirm_extname_compiled)
|
||||
{
|
||||
char *arg = NULL;
|
||||
int arg_len, len;
|
||||
char string[256];
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
len = sprintf(string, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "extname", arg);
|
||||
RETURN_STRINGL(string, len, 1);
|
||||
}
|
||||
/* }}} */
|
||||
/* The previous line is meant for vim and emacs, so it can correctly fold and
|
||||
unfold functions in source code. See the corresponding marks just before
|
||||
function definition, where the functions purpose is also documented. Please
|
||||
follow this convention for the convenience of others editing your code.
|
||||
*/
|
||||
|
||||
/* __function_stubs_here__ */
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: noet sw=4 ts=4 fdm=marker
|
||||
* vim<600: noet sw=4 ts=4
|
||||
*/
|
||||
@@ -1,113 +0,0 @@
|
||||
# Microsoft Developer Studio Project File - Name="extname" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=extname - Win32 Release_TS
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "extname.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "extname.mak" CFG="extname - Win32 Release_TS"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "extname - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "extname - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "extname - Win32 Release_TS"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release_TS"
|
||||
# PROP BASE Intermediate_Dir "Release_TS"
|
||||
# PROP BASE Ignore_Export_Lib 0
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release_TS"
|
||||
# PROP Intermediate_Dir "Release_TS"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\..\TSRM" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_EXTNAME" /D ZTS=1 /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D ZEND_DEBUG=0 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXTNAME_EXPORTS" /D "COMPILE_DL_EXTNAME" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_EXTNAME=1 /D "LIBZEND_EXPORTS" /FR /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x406 /d "NDEBUG"
|
||||
# ADD RSC /l 0x406 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/extname.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline"
|
||||
|
||||
!ELSEIF "$(CFG)" == "extname - Win32 Debug_TS"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Debug_TS"
|
||||
# PROP BASE Intermediate_Dir "Debug_TS"
|
||||
# PROP BASE Ignore_Export_Lib 0
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Debug_TS"
|
||||
# PROP Intermediate_Dir "Debug_TS"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_EXTNAME" /D ZTS=1 /YX /FD /c
|
||||
# ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXTNAME_EXPORTS" /D "COMPILE_DL_EXTNAME" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_EXTNAME=1 /D "LIBZEND_EXPORTS" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x406 /d "NDEBUG"
|
||||
# ADD RSC /l 0x406 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts_debug.lib /nologo /dll /machine:I386 /out:"..\..\Debug_TS/extname.dll" /libpath:"..\..\Debug_TS"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "extname - Win32 Release_TS"
|
||||
# Name "extname - Win32 Debug_TS"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\extname.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\php_extname.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
||||
@@ -1,19 +0,0 @@
|
||||
<?
|
||||
if(!extension_loaded('extname')) {
|
||||
dl('extname.' . PHP_SHLIB_SUFFIX);
|
||||
}
|
||||
$module = 'extname';
|
||||
$functions = get_extension_funcs($module);
|
||||
echo "Functions available in the test extension:<br>\n";
|
||||
foreach($functions as $func) {
|
||||
echo $func."<br>\n";
|
||||
}
|
||||
echo "<br>\n";
|
||||
$function = 'confirm_' . $module . '_compiled';
|
||||
if (extension_loaded($module)) {
|
||||
$str = $function($module);
|
||||
} else {
|
||||
$str = "Module $module is not compiled into PHP";
|
||||
}
|
||||
echo "$str\n";
|
||||
?>
|
||||
@@ -1,24 +0,0 @@
|
||||
--TEST--
|
||||
Check for extname presence
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded("extname")) print "skip"; ?>
|
||||
--POST--
|
||||
--GET--
|
||||
--INI--
|
||||
--FILE--
|
||||
<?php
|
||||
echo "extname extension is available";
|
||||
/*
|
||||
you can add regression tests for your extension here
|
||||
|
||||
the output of your test code has to be equal to the
|
||||
text in the --EXPECT-- section below for the tests
|
||||
to pass, differences between the output and the
|
||||
expected text are interpreted as failure
|
||||
|
||||
see php4/README.TESTING for further information on
|
||||
writing regression tests
|
||||
*/
|
||||
?>
|
||||
--EXPECT--
|
||||
extname extension is available
|
||||
@@ -1,2 +0,0 @@
|
||||
(just that this file is currently empty does not
|
||||
prove that there are no bugs in this software ;)
|
||||
@@ -1,36 +0,0 @@
|
||||
sorry, no real documentation yet ...
|
||||
just a short look at what is going on
|
||||
|
||||
ext_skel_ng.php gets an extension description
|
||||
from an "extension.xml" file and generates working
|
||||
code and documentation stubs from that
|
||||
|
||||
call "php ext_skel_ng.php" to see it at work,
|
||||
it will create a dummy extension including
|
||||
|
||||
- module globals and ini paramter setup
|
||||
- function registration and stubbs
|
||||
- documentation framework
|
||||
- config.m4 (only minimal for now)
|
||||
- ...
|
||||
|
||||
almost every aspect of an extension may now be
|
||||
configured using one xml description file instead
|
||||
of the old mixture of command line parameters
|
||||
and a proto file
|
||||
|
||||
it is even possible to embed function code into
|
||||
the xml description right away, so it should be
|
||||
possible to create complete working extensions
|
||||
from just the xml description without further
|
||||
editing in a not to distant future
|
||||
|
||||
for now almost all the 'helpfull comments' have
|
||||
been removed from the generated code. some of
|
||||
them (like 'uncomment this if you have ini params)
|
||||
just don't make sense anymore, others will come
|
||||
back (configurable) at a later state
|
||||
|
||||
... have fun!
|
||||
|
||||
Hartmut Holzgraefe <hholzgra@php.net>
|
||||
@@ -1,35 +0,0 @@
|
||||
- *more* input checking
|
||||
- XML level (libxml2 does cover all this?)
|
||||
- needed attributes given
|
||||
- tag nesting ok
|
||||
- tags closed properly
|
||||
- ...
|
||||
- code level
|
||||
- use of reserved names
|
||||
- duplicate names
|
||||
- ...
|
||||
- ...
|
||||
- config.m4 support for
|
||||
- header checks
|
||||
- ...
|
||||
- class implementation and documentation support
|
||||
- docbook namespace support
|
||||
- protos
|
||||
- object type specification (as in resources)
|
||||
- default values (needs tokenizer/parser changes ...)
|
||||
- code generation for 'pass by refecence' and 'return by reference'
|
||||
- ? option for 'old style' parameter parsing code generation ?
|
||||
(less readable but faster and more flexible)
|
||||
- more licenses
|
||||
- GPL (with exception to allow linking against PHP)
|
||||
- QPL
|
||||
- MPL?
|
||||
- Artistic
|
||||
- ...
|
||||
- dual/multiple licensing?
|
||||
- full support for stream wrappers and filters
|
||||
- code generation for custom test tags
|
||||
- XShema instead of DTD
|
||||
- VC++ 7 (VS.net) project files
|
||||
- create just function stubs instead of complete
|
||||
extension (as supported by the old ext_skel)
|
||||
@@ -1,28 +0,0 @@
|
||||
<?php
|
||||
|
||||
class config_m4 {
|
||||
# name, with[], libs[], language, files[]
|
||||
var $name;
|
||||
var $language = "c";
|
||||
var $with = false;
|
||||
var $libs = array();
|
||||
var $files = array();
|
||||
|
||||
function __construct($name) {
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
function write_file() {
|
||||
$upname = strtoupper($this->name);
|
||||
|
||||
// CVS ID header
|
||||
echo
|
||||
'dnl
|
||||
dnl $ Id: $
|
||||
dnl
|
||||
';
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 377 B |
@@ -1,73 +0,0 @@
|
||||
<?php
|
||||
$min_version = "5.0.0-dev";
|
||||
if (!function_exists("version_compare") || version_compare(phpversion(), $min_version) <0) {
|
||||
die("need at least PHP version $min_version, you are running ".phpversion());
|
||||
}
|
||||
|
||||
require_once "extension_parser.php";
|
||||
require_once "System.php";
|
||||
|
||||
// parse command line arguments
|
||||
if (isset($_SERVER['argv'][1])) {
|
||||
$filename = $_SERVER["argv"][1];
|
||||
echo "using '$filename' as specification file\n";
|
||||
} else {
|
||||
$filename = "extension.xml";
|
||||
echo "using default file '$filename' as specification file\n";
|
||||
}
|
||||
|
||||
// open specification file
|
||||
$fp = fopen($filename, "r");
|
||||
if (!is_resource($fp)) {
|
||||
error_log("can't read specification file '$filename'");
|
||||
exit;
|
||||
}
|
||||
|
||||
// parse specification file
|
||||
$ext = new extension_parser($fp);
|
||||
fclose($fp);
|
||||
|
||||
// purge and create extension directory
|
||||
System::rm("-rf {$ext->name}");
|
||||
mkdir($ext->name);
|
||||
|
||||
// write LICENSE file
|
||||
if(is_object($ext->license)) {
|
||||
$ext->license->write_license_file("{$ext->name}/LICENSE");
|
||||
}
|
||||
|
||||
// generate code
|
||||
$ext->write_header_file();
|
||||
$ext->write_code_file();
|
||||
if (isset($ext->logo)) {
|
||||
$fp = fopen("{$ext->name}/{$ext->name}_logo.h", "w");
|
||||
fwrite($fp, $ext->logo->h_code());
|
||||
fclose($fp);
|
||||
}
|
||||
|
||||
// generate project files for configure (unices and similar platforms like cygwin)
|
||||
if ($ext->platform === "all" || in_array("unix", $ext->platform)) {
|
||||
$ext->write_config_m4();
|
||||
}
|
||||
|
||||
// generate project files for Windows platform (VisualStudio/C++ V6)
|
||||
if ($ext->platform === "all" || in_array("win32", $ext->platform)) {
|
||||
$ext->write_ms_devstudio_dsp();
|
||||
}
|
||||
|
||||
// generate EXPERIMENTAL file for unstable release states
|
||||
$ext->write_experimental();
|
||||
|
||||
// generate CREDITS file
|
||||
$ext->write_credits();
|
||||
|
||||
// generate PEAR/PECL package.xml file
|
||||
$ext->write_package_xml();
|
||||
|
||||
// generate DocBook XML documantation for PHP manual
|
||||
$ext->generate_documentation();
|
||||
|
||||
// generate test case templates
|
||||
$ext->write_test_files();
|
||||
|
||||
?>
|
||||
@@ -1,126 +0,0 @@
|
||||
<!ELEMENT extension (name|summary|description|license|maintainers|logo|release|changelog|functions|constants|globals|deps|resources|code|streams|tests)*>
|
||||
|
||||
<!ELEMENT name (#PCDATA)>
|
||||
|
||||
<!ELEMENT summary (#PCDATA)>
|
||||
|
||||
<!ELEMENT description (#PCDATA)>
|
||||
|
||||
<!ELEMENT maintainers (maintainer)+>
|
||||
|
||||
<!ELEMENT maintainer (user|role|name|email)*>
|
||||
|
||||
<!ELEMENT logo (#PCDATA)>
|
||||
<!ATTLIST logo
|
||||
src CDATA #REQUIRED
|
||||
>
|
||||
|
||||
<!ELEMENT user (#PCDATA)>
|
||||
|
||||
<!ELEMENT role (#PCDATA)>
|
||||
|
||||
<!ELEMENT email (#PCDATA)>
|
||||
|
||||
<!ELEMENT changelog (release)*>
|
||||
|
||||
<!ELEMENT release (version|license|state|date|notes|filelist|deps)*>
|
||||
|
||||
<!ELEMENT version (#PCDATA)>
|
||||
|
||||
<!ELEMENT state (#PCDATA)>
|
||||
|
||||
<!ELEMENT license (#PCDATA)>
|
||||
|
||||
<!ELEMENT date (#PCDATA)>
|
||||
|
||||
<!ELEMENT notes (#PCDATA)>
|
||||
|
||||
<!ELEMENT functions (function)*>
|
||||
<!ELEMENT function (summary|proto|description|code)*>
|
||||
<!ATTLIST function
|
||||
role (internal|private|public) "public"
|
||||
name CDATA #REQUIRED
|
||||
>
|
||||
<!ELEMENT proto (#PCDATA)>
|
||||
<!ELEMENT code (#PCDATA)>
|
||||
<!ATTLIST code
|
||||
role (header|code) "code"
|
||||
>
|
||||
<!ELEMENT constants (constant)*>
|
||||
<!ELEMENT constant (#PCDATA)>
|
||||
<!ATTLIST constant
|
||||
name CDATA #REQUIRED
|
||||
value CDATA #REQUIRED
|
||||
type (string|int|float) "string"
|
||||
>
|
||||
|
||||
<!ELEMENT globals (phpini|global)*>
|
||||
<!ELEMENT phpini (#PCDATA)>
|
||||
<!ATTLIST phpini
|
||||
name CDATA #REQUIRED
|
||||
type CDATA #REQUIRED
|
||||
value CDATA #REQUIRED
|
||||
access (system|perdir|user|all) "all"
|
||||
onupdate CDATA #IMPLIED
|
||||
>
|
||||
<!ELEMENT global (#PCDATA)>
|
||||
<!ATTLIST global
|
||||
name CDATA #REQUIRED
|
||||
type CDATA #REQUIRED
|
||||
>
|
||||
|
||||
<!ELEMENT deps (with|lib|header|file|program)*>
|
||||
<!ATTLIST deps
|
||||
language (c|cpp) "c"
|
||||
platform (unix|win32|all) "all"
|
||||
>
|
||||
<!ELEMENT with (#PCDATA)>
|
||||
<!ATTLIST with
|
||||
defaults CDATA #REQUIRED
|
||||
testfile CDATA #REQUIRED
|
||||
name CDATA #IMPLIED
|
||||
>
|
||||
<!ELEMENT lib (#PCDATA)>
|
||||
<!ATTLIST lib
|
||||
name CDATA #REQUIRED
|
||||
function CDATA #REQUIRED
|
||||
searchpath CDATA #IMPLIED
|
||||
platform (unix|win32|all) "all"
|
||||
>
|
||||
<!ELEMENT header (#PCDATA)>
|
||||
<!ATTLIST header
|
||||
name CDATA #REQUIRED
|
||||
function CDATA #IMPLIED
|
||||
searchpath CDATA #IMPLIED
|
||||
prepend (yes|no) "no"
|
||||
>
|
||||
|
||||
<!ELEMENT resources (resource)*>
|
||||
<!ELEMENT resource (description?, destruct?)>
|
||||
<!ATTLIST resource
|
||||
name CDATA #REQUIRED
|
||||
payload CDATA #IMPLIED
|
||||
alloc (yes|no) "no"
|
||||
>
|
||||
<!ELEMENT destruct (#PCDATA)>
|
||||
|
||||
<!ELEMENT streams (stream)*>
|
||||
<!ELEMENT stream (description?, ops?, data?)>
|
||||
<!ATTLIST stream
|
||||
name CDATA #REQUIRED
|
||||
>
|
||||
<!ELEMENT ops (op)*>
|
||||
<!ELEMENT op (#PCDATA)>
|
||||
<!ATTLIST op
|
||||
name CDATA #REQUIRED
|
||||
>
|
||||
|
||||
|
||||
<!ELEMENT tests (test)*>
|
||||
<!ELEMENT test (title, skipif?, post?, get?, code, output)>
|
||||
<!ELEMENT title (#PCDATA)>
|
||||
<!ELEMENT skipif (#PCDATA)>
|
||||
<!ELEMENT post (#PCDATA)>
|
||||
<!ELEMENT get (#PCDATA)>
|
||||
<!ELEMENT code (#PCDATA)>
|
||||
<!ELEMENT output (#PCDATA)>
|
||||
@@ -1,178 +0,0 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1" ?>
|
||||
<!DOCTYPE extension SYSTEM "extension.dtd">
|
||||
<extension>
|
||||
<name>dummy</name>
|
||||
<summary>experimental dummy extension</summary>
|
||||
<description>
|
||||
this is used for testing of the extension generater only
|
||||
</description>
|
||||
|
||||
<maintainers>
|
||||
<maintainer>
|
||||
<user>hholzgra</user>
|
||||
<name>Hartmut Holzgraefe</name>
|
||||
<email>hholzgra@php.net</email>
|
||||
<role>lead</role>
|
||||
</maintainer>
|
||||
<maintainer>
|
||||
<user>dummy</user>
|
||||
<name>Crashtest Dummy</name>
|
||||
<email>dummy@example.com</email>
|
||||
<role>dummy</role>
|
||||
</maintainer>
|
||||
</maintainers>
|
||||
|
||||
<logo src='dummy.gif'></logo>
|
||||
|
||||
<release>
|
||||
<version>0.1</version>
|
||||
<date>2002-02-16</date>
|
||||
<state>alpha</state>
|
||||
<license>php</license>
|
||||
<notes>
|
||||
- first experimental draft
|
||||
</notes>
|
||||
</release>
|
||||
|
||||
<changelog>
|
||||
</changelog>
|
||||
|
||||
|
||||
<deps language="c">
|
||||
<!-- these are not yet used in any way :( -->
|
||||
<with defaults='/usr:/usr/local' testfile='include/dummy.h'></with>
|
||||
<lib name='dummy' function='dummy' searchpath='/usr/lib:/lib'></lib>
|
||||
</deps>
|
||||
|
||||
<constants>
|
||||
<constant name="DUMMY_OK" type="int" value="1">dummy ok status</constant>
|
||||
<constant name="DUMMY_ERR" type="int" value="0">dummy fault status</constant>
|
||||
</constants>
|
||||
|
||||
<globals>
|
||||
<global name="foobar" type="int"></global>
|
||||
<phpini name="foo_int" type="int" value="42" access="system">some int value</phpini>
|
||||
<phpini name="foo_bool" type="int" value="on" access="all" onupdate="OnUpdateBool"></phpini>
|
||||
<phpini name="foo_string" type="string" value="foobar" access="all" ></phpini>
|
||||
</globals>
|
||||
|
||||
<resources>
|
||||
<resource name="dummy_resource" payload="char *">
|
||||
<description>
|
||||
a dummy string resource
|
||||
</description>
|
||||
<destruct>
|
||||
<![CDATA[
|
||||
free(resource);
|
||||
]]>
|
||||
</destruct>
|
||||
</resource>
|
||||
<resource name="dummy_resource2">
|
||||
</resource>
|
||||
</resources>
|
||||
|
||||
|
||||
<functions>
|
||||
|
||||
<function role='internal' name='MINIT'>
|
||||
<code>
|
||||
<![CDATA[
|
||||
int dummy = 42;
|
||||
|
||||
dummy = dummy;
|
||||
]]>
|
||||
</code>
|
||||
</function>
|
||||
|
||||
<function role='internal' name='MSHUTDOWN'>
|
||||
<code>
|
||||
<![CDATA[
|
||||
int dummy = 42;
|
||||
|
||||
dummy = dummy;
|
||||
]]>
|
||||
</code>
|
||||
</function>
|
||||
|
||||
<function role='internal' name='RINIT'>
|
||||
<code>
|
||||
<![CDATA[
|
||||
int dummy = 42;
|
||||
|
||||
dummy = dummy;
|
||||
]]>
|
||||
</code>
|
||||
</function>
|
||||
|
||||
<function role='internal' name='RSHUTDOWN'>
|
||||
<code>
|
||||
<![CDATA[
|
||||
int dummy = 42;
|
||||
|
||||
dummy = dummy;
|
||||
]]>
|
||||
</code>
|
||||
</function>
|
||||
|
||||
<function role='internal' name='MINFO'>
|
||||
<code>
|
||||
<![CDATA[
|
||||
php_info_print_table_start();
|
||||
php_info_print_table_header(2, "test", "table");
|
||||
php_info_print_table_end();
|
||||
]]>
|
||||
</code>
|
||||
</function>
|
||||
|
||||
<function role='private' name='myfunc'>
|
||||
<code>
|
||||
<![CDATA[
|
||||
static int myfunc(void) {
|
||||
return 23;
|
||||
}
|
||||
]]>
|
||||
</code>
|
||||
</function>
|
||||
|
||||
|
||||
<function role='public' name='dummy_int'>
|
||||
<summary>dummy integer conversion</summary>
|
||||
<proto>int dummy_int(int bar)</proto>
|
||||
<description>
|
||||
some funcy longer description
|
||||
|
||||
foo
|
||||
bar
|
||||
</description>
|
||||
</function>
|
||||
|
||||
<function role='public' name='dummy_resource'>
|
||||
<summary>dummy resource test</summary>
|
||||
<proto>resource dummy_resource(resource bar)</proto>
|
||||
</function>
|
||||
|
||||
<function name='dummy_string'>
|
||||
<summary>dummy string conversion</summary>
|
||||
<proto>string dummy_string(string bar) foobar</proto>
|
||||
<code>
|
||||
<![CDATA[
|
||||
RETURN_STRINGL(bar, bar_len, 1);
|
||||
]]>
|
||||
</code>
|
||||
</function>
|
||||
|
||||
<function name="dummy_void">
|
||||
<proto>void dummy_void(void)</proto>
|
||||
</function>
|
||||
|
||||
<function name="dummy_void2">
|
||||
<proto>void dummy_void2()</proto>
|
||||
</function>
|
||||
|
||||
<function name="dummy_stream">
|
||||
<proto>stream dummy_stream(stream s)</proto>
|
||||
</function>
|
||||
|
||||
</functions>
|
||||
|
||||
</extension>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,42 +0,0 @@
|
||||
<?php
|
||||
|
||||
abstract class license
|
||||
{
|
||||
function __construct($options = array()) {
|
||||
$this->options = $options;
|
||||
}
|
||||
|
||||
static function factory($name, $options=array()) {
|
||||
$classname = "license_".strtolower($name);
|
||||
|
||||
if (!class_exists($classname)) {
|
||||
if (file_exists("./$classname.php")) {
|
||||
require_once "./$classname.php";
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
class_exists($classname)
|
||||
? new $classname($options)
|
||||
: false;
|
||||
}
|
||||
|
||||
abstract function license_comment();
|
||||
|
||||
function write_license_file($path = "./LICENSE") {
|
||||
$fp = fopen($path, "w");
|
||||
|
||||
if (is_resource($fp)) {
|
||||
fputs($fp, $this->license_file_text());
|
||||
fclose($fp);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
abstract function license_file_text();
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -1,70 +0,0 @@
|
||||
<?php
|
||||
|
||||
class license_lgpl extends license
|
||||
{
|
||||
function license_comment() {
|
||||
return <<<EOD
|
||||
| All rights reserved |
|
||||
| |
|
||||
| Redistribution and use in source and binary forms, with or without |
|
||||
| modification, are permitted provided that the following conditions |
|
||||
| are met: |
|
||||
| |
|
||||
| 1. Redistributions of source code must retain the above copyright |
|
||||
| notice, this list of conditions and the following disclaimer. |
|
||||
| 2. Redistributions in binary form must reproduce the above copyright |
|
||||
| notice, this list of conditions and the following disclaimer in |
|
||||
| the documentation and/or other materials provided with the |
|
||||
| distribution. |
|
||||
| 3. The names of the authors may not be used to endorse or promote |
|
||||
| products derived from this software without specific prior |
|
||||
| written permission. |
|
||||
| |
|
||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
|
||||
| FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
|
||||
| COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
|
||||
| INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
|
||||
| BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|
||||
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|
||||
| CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
||||
| LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
|
||||
| ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
||||
| POSSIBILITY OF SUCH DAMAGE. |
|
||||
|
||||
EOD;
|
||||
}
|
||||
|
||||
function license_file_text() {
|
||||
return <<<EOD
|
||||
All rights reserved
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. The names of the authors may not be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
EOD;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,540 +0,0 @@
|
||||
<?php
|
||||
|
||||
class license_lgpl extends license
|
||||
{
|
||||
function license_comment() {
|
||||
return <<<EOD
|
||||
| This library is free software; you can redistribute it and/or |
|
||||
| modify it under the terms of the GNU Lesser General Public |
|
||||
| License as published by the Free Software Foundation; either |
|
||||
| version 2.1 of the License, or (at your option) any later version. |
|
||||
| |
|
||||
| This library is distributed in the hope that it will be useful, |
|
||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
||||
| Lesser General Public License for more details. |
|
||||
| |
|
||||
| You should have received a copy of the GNU Lesser General Public |
|
||||
| License in the file LICENSE along with this library; |
|
||||
| if not, write to the |
|
||||
| |
|
||||
| Free Software Foundation, Inc., |
|
||||
| 59 Temple Place, Suite 330, |
|
||||
| Boston, MA 02111-1307 USA |
|
||||
|
||||
EOD;
|
||||
}
|
||||
|
||||
function license_file_text() {
|
||||
ob_start();
|
||||
?>
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
<?php
|
||||
$text = ob_get_contents();
|
||||
ob_end_clean();
|
||||
return $text;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,93 +0,0 @@
|
||||
<?php
|
||||
|
||||
class license_php extends license
|
||||
{
|
||||
function license_comment() {
|
||||
return <<<EOD
|
||||
| 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 |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
|
||||
EOD;
|
||||
}
|
||||
|
||||
function license_file_text() {
|
||||
return <<<EOD
|
||||
--------------------------------------------------------------------
|
||||
The PHP License, Version 3.0
|
||||
Copyright (c) 1999 - 2003 The PHP Group. All rights reserved.
|
||||
--------------------------------------------------------------------
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, is permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
3. The name "PHP" must not be used to endorse or promote products
|
||||
derived from this software without prior written permission. For
|
||||
written permission, please contact group@php.net.
|
||||
|
||||
4. Products derived from this software may not be called "PHP", nor
|
||||
may "PHP" appear in their name, without prior written permission
|
||||
from group@php.net. You may indicate that your software works in
|
||||
conjunction with PHP by saying "Foo for PHP" instead of calling
|
||||
it "PHP Foo" or "phpfoo"
|
||||
|
||||
5. The PHP Group may publish revised and/or new versions of the
|
||||
license from time to time. Each version will be given a
|
||||
distinguishing version number.
|
||||
Once covered code has been published under a particular version
|
||||
of the license, you may always continue to use it under the terms
|
||||
of that version. You may also choose to use such covered code
|
||||
under the terms of any subsequent version of the license
|
||||
published by the PHP Group. No one other than the PHP Group has
|
||||
the right to modify the terms applicable to covered code created
|
||||
under this License.
|
||||
|
||||
6. Redistributions of any form whatsoever must retain the following
|
||||
acknowledgment:
|
||||
"This product includes PHP, freely available from
|
||||
<http://www.php.net/>".
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND
|
||||
ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP
|
||||
DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
--------------------------------------------------------------------
|
||||
|
||||
This software consists of voluntary contributions made by many
|
||||
individuals on behalf of the PHP Group.
|
||||
|
||||
The PHP Group can be contacted via Email at group@php.net.
|
||||
|
||||
For more information on the PHP Group and the PHP project,
|
||||
please see <http://www.php.net>.
|
||||
|
||||
This product includes the Zend Engine, freely available at
|
||||
<http://www.zend.com>.
|
||||
|
||||
EOD;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,83 +0,0 @@
|
||||
<?php
|
||||
|
||||
class php_constant extends php_element {
|
||||
|
||||
function __construct($attr, $desc) {
|
||||
|
||||
$this->name = $attr["name"];
|
||||
if (!$this->is_name($this->name)) {
|
||||
$this->error[] = "'$attr[name]'is not a valid constant name";
|
||||
}
|
||||
|
||||
$this->type = isset($attr["type"]) ? $this->is_type($attr["type"]) : "string";
|
||||
if (!in_array($this->type, array('int', 'float', 'string'))) {
|
||||
$this->error[] = "'$attr[type]' is not a valid constant type, only int, float and string";
|
||||
}
|
||||
|
||||
$this->value= $attr["value"];
|
||||
$this->desc = $desc;
|
||||
}
|
||||
|
||||
|
||||
static function c_code_header($name) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function c_code() {
|
||||
switch ($this->type) {
|
||||
case "int":
|
||||
return "REGISTER_LONG_CONSTANT(\"{$this->name}\", {$this->value}, 0);\n";
|
||||
|
||||
case "float":
|
||||
return "REGISTER_DOUBLE_CONSTANT(\"{$this->name}\", {$this->value}, 0);\n";
|
||||
|
||||
case "string":
|
||||
return "REGISTER_STRING_CONSTANT(\"{$this->name}\", \"$value\", ".strlen($this->value).", 0);\n";
|
||||
}
|
||||
}
|
||||
|
||||
static function c_code_footer() {
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
static function docbook_xml_header($name) {
|
||||
return
|
||||
" <table>
|
||||
<title>$name constants</title>
|
||||
<tgroup cols='3'>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>name</entry>
|
||||
<entry>value</entry>
|
||||
<entry>descrpition</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
";
|
||||
}
|
||||
|
||||
function docbook_xml() {
|
||||
return trim("
|
||||
<row>
|
||||
<entry>
|
||||
<constant id='constant".strtolower(str_replace("_","-",$this->name))."'>{$this->name}</constant>
|
||||
(<link linkend='language.types.integer'>integer</link>)
|
||||
</entry>
|
||||
<entry>{$this->value}</entry>
|
||||
<entry>{$this->desc}</entry>
|
||||
</row>
|
||||
")."\n";
|
||||
}
|
||||
|
||||
static function docbook_xml_footer() {
|
||||
return
|
||||
" </tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
";
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,76 +0,0 @@
|
||||
<?php
|
||||
|
||||
class php_element {
|
||||
function is_type($name) {
|
||||
$types = array("void" => "void",
|
||||
"bool" => "bool",
|
||||
"boolean" => "bool",
|
||||
"int" => "int",
|
||||
"integer" => "int",
|
||||
"float" => "float",
|
||||
"double" => "float",
|
||||
"real" => "float",
|
||||
"string" => "string",
|
||||
"array" => "array",
|
||||
"object" => "object",
|
||||
"resource" => "resource",
|
||||
"mixed" => "mixed",
|
||||
"callback" => "callback",
|
||||
"stream" => "stream"
|
||||
);
|
||||
|
||||
if (isset($types[$name])) {
|
||||
return $types[$name];
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function is_name($name) {
|
||||
if (ereg("^[[:alpha:]_][[:alnum:]_]*$",$name)) {
|
||||
// TODO reserved words
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
function c_code() {
|
||||
return "";
|
||||
}
|
||||
|
||||
function h_code() {
|
||||
return "";
|
||||
}
|
||||
|
||||
function docbook_xml() {
|
||||
return "";
|
||||
}
|
||||
|
||||
function docbook_editor_settings($level=3) {
|
||||
return '
|
||||
<!-- Keep this comment at the end of the file
|
||||
Local'.' variables:
|
||||
mode: sgml
|
||||
sgml-omittag:t
|
||||
sgml-shorttag:t
|
||||
sgml-minimize-attributes:nil
|
||||
sgml-always-quote-attributes:t
|
||||
sgml-indent-step:1
|
||||
sgml-indent-data:t
|
||||
indent-tabs-mode:nil
|
||||
sgml-parent-document:nil
|
||||
sgml-default-dtd-file:"'.str_repeat("../",$level).'manual.ced"
|
||||
sgml-exposed-tags:nil
|
||||
sgml-local-catalogs:nil
|
||||
sgml-local-ecat-files:nil
|
||||
End:
|
||||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||||
vim: et tw=78 syn=sgml
|
||||
vi: ts=1 sw=1
|
||||
-->
|
||||
';
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,426 +0,0 @@
|
||||
<?php
|
||||
|
||||
class php_function extends php_element {
|
||||
|
||||
function __construct($name, $summary, $proto, $desc="", $code="", $role="") {
|
||||
$this->name = $name;
|
||||
$this->summary = $summary;
|
||||
$this->desc = empty($desc) ? "&warn.undocumented.func;" : $desc;
|
||||
$this->code = $code;
|
||||
$this->role = empty($role) ? "public" : $role;
|
||||
if ($this->role === "public") {
|
||||
$this->status = $this->parse_proto($proto);
|
||||
}
|
||||
}
|
||||
|
||||
function parse_proto($proto) {
|
||||
/* TODO
|
||||
a 'real' parser is needed here (lex/yacc with PHP output anyone?)
|
||||
to support stuff like default values
|
||||
the current tokenizer is not clever enough for this ...
|
||||
|
||||
the grammer for a prototype would look like this: ?
|
||||
|
||||
proto: type name '(' param-list ')'
|
||||
|
||||
name: [A-Za-z_][A-Za-z0-9_]*
|
||||
|
||||
type: "void"
|
||||
| typespec
|
||||
|
||||
typespec: typename
|
||||
| typename '&'
|
||||
|
||||
typename: bool | boolean
|
||||
| int | integer | long
|
||||
| float | double | real
|
||||
| string
|
||||
| array
|
||||
| object | object name
|
||||
| resource | resource name
|
||||
| mixed
|
||||
| callback
|
||||
| stream
|
||||
|
||||
param-list: void
|
||||
| parameter
|
||||
| parm-list ',' parameter
|
||||
|
||||
parameter: typespec name
|
||||
| typespec name '=' default-value
|
||||
|
||||
default-value: "true" | "false" | "array()"
|
||||
| numeric-value
|
||||
| string
|
||||
|
||||
string: '"' character* '"'
|
||||
|
||||
number: ... the usual int, float, hex and octal stuff ...
|
||||
*/
|
||||
|
||||
// 'tokenize' it
|
||||
$tokens=array();
|
||||
|
||||
// we collect valid C names as Strings, any other character for itself, blanks are skipped
|
||||
// TODO: this does no longer work if we ever add default values ...
|
||||
$len=strlen($proto);
|
||||
$name="";
|
||||
for ($n=0;$n<$len;$n++) {
|
||||
$char = $proto{$n};
|
||||
if (ctype_alpha($char) || $char == '_' || ($n && ctype_digit($char))) {
|
||||
$name.=$char;
|
||||
} else {
|
||||
if ($name) $tokens[]=$name;
|
||||
$name="";
|
||||
if (trim($char)) $tokens[]=$char;
|
||||
}
|
||||
}
|
||||
if ($name) $tokens[]=$name;
|
||||
|
||||
$n=0;
|
||||
$opts=0;
|
||||
$params=array();
|
||||
$return_type = ($this->is_type($tokens[$n])) ? $tokens[$n++] : "void";
|
||||
$function_name = $tokens[$n++];
|
||||
if ($return_type === "resource" && $tokens[$n] !== "(") {
|
||||
$return_subtype = $function_name;
|
||||
$function_name = $tokens[$n++];
|
||||
}
|
||||
if (! $this->is_name($function_name)) {
|
||||
return("$function_name is not a valid function name");
|
||||
}
|
||||
if ($function_name != $this->name) {
|
||||
return "proto function name is '$function_name' instead of '{$this->name}'";
|
||||
}
|
||||
|
||||
if ($tokens[$n]!='(') return("'(' expected instead of '$tokens[$n]'");
|
||||
if ($tokens[++$n]!=')') {
|
||||
for ($param=0;$tokens[$n];$n++,$param++) {
|
||||
if ($tokens[$n]=='[') {
|
||||
$params[$param]['optional']=true;
|
||||
$opts++;
|
||||
$n++;
|
||||
if ($param>0) {
|
||||
if ($tokens[$n]!=',') return("',' expected after '[' instead of '$token[$n]'");
|
||||
$n++;
|
||||
}
|
||||
}
|
||||
if (!$this->is_type($tokens[$n])) return("type name expected instead of '$tokens[$n]'");
|
||||
$params[$param]['type']=$tokens[$n];
|
||||
$n++;
|
||||
if ($tokens[$n] == "&") {
|
||||
$params[$param]['by_ref'] = true;
|
||||
$n++;
|
||||
}
|
||||
if ($this->is_name($tokens[$n])) {
|
||||
$params[$param]['name']=$tokens[$n];
|
||||
$n++;
|
||||
}
|
||||
if ($tokens[$n] == "&") {
|
||||
$params[$param]['by_ref'] = true;
|
||||
$n++;
|
||||
}
|
||||
if ($params[$param]['type'] === "resource" && $this->is_name($tokens[$n])) {
|
||||
$params[$param]['subtype'] = $params[$param]['name'];
|
||||
$params[$param]['name'] = $tokens[$n];
|
||||
$n++;
|
||||
}
|
||||
if ($tokens[$n]=='[') {
|
||||
$n--;
|
||||
continue;
|
||||
}
|
||||
if ($tokens[$n]==',') continue;
|
||||
if ($tokens[$n]==']') break;
|
||||
if ($tokens[$n]==')') break;
|
||||
}
|
||||
}
|
||||
$numopts=$opts;
|
||||
while ($tokens[$n]==']') {
|
||||
$n++;
|
||||
$opts--;
|
||||
}
|
||||
if ($opts!=0) return ("'[' / ']' count mismatch");
|
||||
if ($tokens[$n] != ')') return("')' expected instead of '$tokens[$n]'");
|
||||
|
||||
$this->name = $function_name;
|
||||
$this->returns = $return_type;
|
||||
if (isset($return_subtype)) {
|
||||
$this->returns .= " $return_subtype";
|
||||
}
|
||||
$this->params = $params;
|
||||
$this->optional = $numopts;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function c_code($extension) {
|
||||
$code = "";
|
||||
|
||||
$returns = explode(" ", $this->returns);
|
||||
|
||||
switch ($this->role) {
|
||||
case "public":
|
||||
$code .= "\n/* {{{ proto {$this->returns} {$this->name}(";
|
||||
if (isset($this->params)) {
|
||||
foreach ($this->params as $key => $param) {
|
||||
if (!empty($param['optional']))
|
||||
$code.=" [";
|
||||
if ($key)
|
||||
$code.=", ";
|
||||
$code .= $param['type']." ";
|
||||
if (isset($param['subtype'])) {
|
||||
$code .= $param['subtype']." ";
|
||||
}
|
||||
if ($param['type'] !== 'void') {
|
||||
if (isset($param['by_ref'])) {
|
||||
$code .= "&";
|
||||
}
|
||||
$code .= $param['name'];
|
||||
}
|
||||
}
|
||||
}
|
||||
for ($n=$this->optional; $n>0; $n--) {
|
||||
$code .= "]";
|
||||
}
|
||||
$code .= ")\n ";
|
||||
if (!empty($this->summary)) {
|
||||
$code .= $this->summary;
|
||||
}
|
||||
$code .= " */\n";
|
||||
$code .= "PHP_FUNCTION({$this->name})\n";
|
||||
$code .= "{\n";
|
||||
|
||||
if ($returns[0] === "resource" && isset($returns[1])) {
|
||||
$resource = $extension->resources[$returns[1]];
|
||||
if ($resource->alloc === "yes") {
|
||||
$payload = $resource->payload;
|
||||
$code .= " $payload * return_res = ($payload *)emalloc(sizeof($payload));\n";
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($this->params) && count($this->params)) {
|
||||
$arg_string="";
|
||||
$arg_pointers=array();
|
||||
$optional=false;
|
||||
$res_fetch="";
|
||||
foreach ($this->params as $key => $param) {
|
||||
if ($param["type"] === "void") continue;
|
||||
$name = $param['name'];
|
||||
$arg_pointers[]="&$name";
|
||||
if (isset($param['optional'])&&!$optional) {
|
||||
$optional=true;
|
||||
$arg_string.="|";
|
||||
}
|
||||
switch ($param['type']) {
|
||||
case "bool":
|
||||
$arg_string.="b";
|
||||
$code .= " zend_bool $name = 0;\n";
|
||||
break;
|
||||
case "int":
|
||||
$arg_string.="l";
|
||||
$code .= " long $name = 0;\n";
|
||||
break;
|
||||
case "float":
|
||||
$arg_string.="d";
|
||||
$code .= " double $name = 0.0;\n";
|
||||
break;
|
||||
case "string":
|
||||
$arg_string.="s";
|
||||
$code .= " char * $name = NULL;\n";
|
||||
$code .= " int {$name}_len = 0;\n";
|
||||
$arg_pointers[]="&{$name}_len";
|
||||
break;
|
||||
case "array":
|
||||
$arg_string.="a";
|
||||
$code .= " zval * $name = NULL;\n";
|
||||
break;
|
||||
case "object":
|
||||
$arg_string.="o";
|
||||
$code .= " zval * $name = NULL;\n";
|
||||
break;
|
||||
case "resource":
|
||||
$arg_string.="r";
|
||||
$code .= " zval * $name = NULL;\n";
|
||||
$code .= " int {$name}_id = -1;\n";
|
||||
// dummfug? $arg_pointers[]="&{$name}_id";
|
||||
if (isset($param['subtype'])) {
|
||||
$resource = $extension->resources[$param['subtype']];
|
||||
$varname = "res_{$name}";
|
||||
$code .= " {$resource->payload} * $varname;\n";
|
||||
|
||||
$res_fetch.=" if ($name) {\n"
|
||||
." ZEND_FETCH_RESOURCE($varname, {$resource->payload} *, &$name, {$name}_id, \"$param[subtype]\", le_$param[subtype]);\n"
|
||||
." }\n";
|
||||
} else {
|
||||
$res_fetch.=" if ($name) {\n"
|
||||
." ZEND_FETCH_RESOURCE(???, ???, $name, {$name}_id, \"???\", ???_rsrc_id);\n"
|
||||
." }\n";
|
||||
}
|
||||
break;
|
||||
case "stream":
|
||||
$arg_string .= "r";
|
||||
$code .= " zval * _z$name = NULL; \n";
|
||||
$code .= " php_stream * $name = NULL:\n";
|
||||
$res_fetch.= " php_stream_from_zval($name, &_z$name);\n";
|
||||
break;
|
||||
case "mixed":
|
||||
case "callback":
|
||||
$arg_string.="z";
|
||||
$code .= " zval * $name = NULL;\n";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($arg_string) && strlen($arg_string)) {
|
||||
$code .= " int argc = ZEND_NUM_ARGS();\n\n";
|
||||
$code .= " if (zend_parse_parameters(argc TSRMLS_CC, \"$arg_string\", ".join(", ",$arg_pointers).") == FAILURE) return;\n";
|
||||
if ($res_fetch) $code.="\n$res_fetch\n";
|
||||
} else {
|
||||
$code .= " if (ZEND_NUM_ARGS()>0) { WRONG_PARAM_COUNT; }\n\n";
|
||||
}
|
||||
|
||||
if ($this->code) {
|
||||
$code .= " {\n$this->code }\n"; // {...} for local variables ...
|
||||
} else {
|
||||
$code .= " php_error(E_WARNING, \"{$this->name}: not yet implemented\"); RETURN_FALSE;\n\n";
|
||||
|
||||
switch ($returns[0]) {
|
||||
case "void":
|
||||
break;
|
||||
|
||||
case "bool":
|
||||
$code .= " RETURN_FALSE;\n";
|
||||
break;
|
||||
|
||||
case "int":
|
||||
$code .= " RETURN_LONG(0);\n";
|
||||
break;
|
||||
|
||||
case "float":
|
||||
$code .= " RETURN_DOUBLE(0.0);\n";
|
||||
break;
|
||||
|
||||
case "string":
|
||||
$code .= " RETURN_STRINGL(\"\", 0, 1);\n";
|
||||
break;
|
||||
|
||||
case "array":
|
||||
$code .= " array_init(return_value);\n";
|
||||
break;
|
||||
|
||||
case "object":
|
||||
$code .= " object_init(return_value)\n";
|
||||
break;
|
||||
|
||||
case "resource":
|
||||
if (isset($returns[1])) {
|
||||
$code .= " ZEND_REGISTER_RESOURCE(return_value, return_res, le_$returns[1]);\n";
|
||||
} else {
|
||||
$code .= " /* RETURN_RESOURCE(...); /*\n";
|
||||
}
|
||||
break;
|
||||
|
||||
case "stream":
|
||||
$code .= " /* php_stream_to_zval(stream, return_value); */\n";
|
||||
break;
|
||||
|
||||
case "mixed":
|
||||
$code .= " /* RETURN_...(...); /*\n";
|
||||
break;
|
||||
|
||||
default:
|
||||
$code .= " /* UNKNOWN RETURN TYPE '$this->returns' /*\n";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$code .= "}\n/* }}} */\n\n";
|
||||
break;
|
||||
|
||||
case "internal":
|
||||
if (!empty($this->code)) {
|
||||
$code .= " {\n";
|
||||
$code .= $this->code."\n";
|
||||
$code .= " }\n";
|
||||
}
|
||||
break;
|
||||
|
||||
case "private":
|
||||
$code .= $this->code."\n";
|
||||
break;
|
||||
}
|
||||
return $code;
|
||||
}
|
||||
|
||||
function docbook_xml() {
|
||||
$xml =
|
||||
'<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- '.'$'.'Revision: 1.0 $ -->
|
||||
<refentry id="function.'.strtolower(str_replace("_","-",$this->name)).'">
|
||||
<refnamediv>
|
||||
<refname>'.$this->name.'</refname>
|
||||
<refpurpose>'.$this->summary.'</refpurpose>
|
||||
</refnamediv>
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
<methodsynopsis>
|
||||
';
|
||||
|
||||
$xml .= " <type>{$this->returns}</type><methodname>{$this->name}</methodname>\n";
|
||||
if (empty($this->params) || $this->params[0]["type"]==="void") {
|
||||
$xml .= " <void/>\n";
|
||||
} else {
|
||||
foreach ($this->params as $key => $param) {
|
||||
if (isset($param['optional'])) {
|
||||
$xml .= " <methodparam choice='opt'>";
|
||||
} else {
|
||||
$xml .= " <methodparam>";
|
||||
}
|
||||
$xml .= "<type>$param[type]</type><parameter>";
|
||||
if (isset($param['by_ref'])) {
|
||||
$xml .= "&";
|
||||
}
|
||||
$xml .= "$param[name]</parameter>";
|
||||
$xml .= "</methodparam>\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$desc = $this->desc;
|
||||
|
||||
if (!strstr($this->desc,"<para>")) {
|
||||
$desc = " <para>\n$desc </para>\n";
|
||||
}
|
||||
|
||||
$xml .=
|
||||
' </methodsynopsis>
|
||||
'.$desc.'
|
||||
</refsect1>
|
||||
</refentry>
|
||||
';
|
||||
$xml .= $this->docbook_editor_settings(4);
|
||||
|
||||
return $xml;
|
||||
}
|
||||
|
||||
function write_test($extension) {
|
||||
$fp = fopen("{$extension->name}/tests/{$this->name}.phpt", "w");
|
||||
fputs($fp,
|
||||
"--TEST--
|
||||
{$this->name}() function
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded('{$extension->name}')) print 'skip'; ?>
|
||||
--POST--
|
||||
--GET--
|
||||
--FILE--
|
||||
<?php
|
||||
echo 'no test case for {$this->name}() yet';
|
||||
?>
|
||||
--EXPECT--
|
||||
no test case for {$this->name}() yet");
|
||||
fclose($fp);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,85 +0,0 @@
|
||||
<?php
|
||||
|
||||
class php_global extends php_element {
|
||||
|
||||
function __construct($attr) {
|
||||
|
||||
$this->name = $attr["name"];
|
||||
|
||||
if (!$this->is_name($this->name)) {
|
||||
$this->error[] = "'$attr[name]' is not a valid C variable name";
|
||||
}
|
||||
|
||||
$this->type = $attr['type'];
|
||||
if (!$this->is_type($this->type)) {
|
||||
$this->error[] = "'$attr[type]' is not a valid C data type";
|
||||
}
|
||||
}
|
||||
|
||||
/* overriding type check as we deal with C types here
|
||||
check is rather naive as it doesn't know about context
|
||||
so we check for a sequence of valid names for now
|
||||
TODO: check for either simple type, struct/class or single word (typedef)
|
||||
*/
|
||||
function is_type($type) {
|
||||
$array = explode(" ", str_replace('*',' ',$type));
|
||||
foreach ($array as $name) {
|
||||
if (empty($name)) continue;
|
||||
if (!$this->is_name($name)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static function c_code_header($name) {
|
||||
return "static void php_{$name}_init_globals(zend_{$name}_globals *{$name}_globals)\n{\n";
|
||||
}
|
||||
|
||||
function c_code($name) {
|
||||
$code = " {$name}_globals->{$this->name} = ";
|
||||
if (strstr($this->type, "*")) {
|
||||
$code .= "NULL;\n";
|
||||
} else {
|
||||
$code .= "0;\n";
|
||||
}
|
||||
return $code;
|
||||
}
|
||||
|
||||
static function c_code_footer($name) {
|
||||
return "
|
||||
}
|
||||
|
||||
static void php_{$name}_shutdown_globals(zend_{$name}_globals *{$name}_globals)
|
||||
{
|
||||
}";
|
||||
}
|
||||
|
||||
static function h_code_header($name) {
|
||||
return "ZEND_BEGIN_MODULE_GLOBALS({$name})\n";
|
||||
}
|
||||
|
||||
function h_code($name) {
|
||||
return " {$this->type} {$this->name};\n";
|
||||
}
|
||||
|
||||
static function h_code_footer($name) {
|
||||
$upname = strtoupper($name);
|
||||
|
||||
return "
|
||||
ZEND_END_MODULE_GLOBALS({$name})
|
||||
|
||||
#ifdef ZTS
|
||||
#define {$upname}_G(v) TSRMG({$name}_globals_id, zend_{$name}_globals *, v)
|
||||
#else
|
||||
#define {$upname}_G(v) ({$name}_globals.v)
|
||||
#endif
|
||||
|
||||
";
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,117 +0,0 @@
|
||||
<?php
|
||||
|
||||
class php_ini extends php_element {
|
||||
|
||||
function __construct($attr) {
|
||||
|
||||
$this->name = $attr["name"];
|
||||
|
||||
if (!$this->is_name($this->name)) {
|
||||
$this->error[] = "'$attr[name]' is not a valid php.ini directive name";
|
||||
}
|
||||
|
||||
$this->type = $this->is_type($attr['type']);
|
||||
if (!$this->type) {
|
||||
$this->error[] = "'$attr[type]' is not a valid PHP data type";
|
||||
}
|
||||
|
||||
$this->value = $attr["value"];
|
||||
$this->desc = $attr["desc"];
|
||||
|
||||
switch (@$attr["access"]) {
|
||||
case "system":
|
||||
$this->access = "PHP_INI_SYSTEM";
|
||||
break;
|
||||
case "perdir":
|
||||
$this->access = "PHP_INI_PERDIR";
|
||||
break;
|
||||
case "user":
|
||||
$this->access = "PHP_INI_USER";
|
||||
break;
|
||||
case "all":
|
||||
case "":
|
||||
$this->access = "PHP_INI_ALL";
|
||||
break;
|
||||
default:
|
||||
$this->error[] = "'$attr[access]' is not a valid access mode (system|perdir|user|all)";
|
||||
}
|
||||
|
||||
switch ($this->type) {
|
||||
case "bool":
|
||||
$this->onupdate = "OnUpdateBool";
|
||||
$this->c_type = "zend_bool";
|
||||
break;
|
||||
case "int":
|
||||
$this->onupdate = "OnUpdateLong";
|
||||
$this->c_type = "long";
|
||||
break;
|
||||
case "float":
|
||||
$this->onupdate = "OnUpdateReal";
|
||||
$this->c_type = "double";
|
||||
break;
|
||||
case "string":
|
||||
$this->onupdate = "OnUpdateString";
|
||||
$this->c_type = "char *";
|
||||
break;
|
||||
default:
|
||||
$this->error[] = "'$this->type' not supported, only bool, int, float and string";
|
||||
break;
|
||||
}
|
||||
|
||||
if (isset($attr["onupdate"])) {
|
||||
$this->onupdate = $attr["onupdate"];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static function c_code_header($name) {
|
||||
return "PHP_INI_BEGIN()\n";
|
||||
}
|
||||
|
||||
function c_code($name) {
|
||||
return " STD_PHP_INI_ENTRY(\"$name.{$this->name}\", \"{$this->value}\", {$this->access}, {$this->onupdate}, {$this->name}, zend_{$name}_globals, {$name}_globals)\n";
|
||||
}
|
||||
|
||||
static function c_code_footer() {
|
||||
return "PHP_INI_END()\n\n";
|
||||
}
|
||||
|
||||
|
||||
|
||||
static function docbook_xml_header($name) {
|
||||
return
|
||||
" <table>
|
||||
<title>$name runtime configuration</title>
|
||||
<tgroup cols='3'>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>directive</entry>
|
||||
<entry>default value</entry>
|
||||
<entry>descrpition</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
";
|
||||
}
|
||||
|
||||
function docbook_xml() {
|
||||
return
|
||||
" <row>
|
||||
<entry>$this->name</entry>
|
||||
<entry>$this->value</entry>
|
||||
<entry>$this->desc</entry>
|
||||
</row>
|
||||
";
|
||||
}
|
||||
|
||||
static function docbook_xml_footer() {
|
||||
return
|
||||
" </tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
";
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,52 +0,0 @@
|
||||
<?php
|
||||
|
||||
class php_logo extends php_element {
|
||||
|
||||
function __construct($name, $attr) {
|
||||
$this->name = $name;
|
||||
$this->attr = $attr;
|
||||
$this->id = '"'.strtoupper($name).'_LOGO_ID"';
|
||||
|
||||
$this->data = file_get_contents($attr['src']);
|
||||
$this->size = strlen($this->data);
|
||||
|
||||
$this->mime_type = "image/gif";
|
||||
}
|
||||
|
||||
function docbook_xml($base) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function minit_code() {
|
||||
return " php_register_info_logo({$this->id}, \"{$this->mime_type}\", {$this->name}_logo, {$this->size});\n";
|
||||
}
|
||||
|
||||
function c_code() {
|
||||
return "
|
||||
static unsigned char {$this->name}_logo[] = {
|
||||
#include \"{$this->name}_logo.h\"
|
||||
};
|
||||
";
|
||||
}
|
||||
|
||||
function h_code() {
|
||||
$len = strlen($this->data);
|
||||
$code = " ";
|
||||
$i=0;
|
||||
for ($n = 0; $n < $len; $n++) {
|
||||
$code .= sprintf(" %3d",ord($this->data[$n]));
|
||||
if ($n == $len - 1) break;
|
||||
$code .= ",";
|
||||
if (++$i==8) {
|
||||
$code .= "\n ";
|
||||
$i=0;
|
||||
}
|
||||
}
|
||||
|
||||
$code .= "\n";
|
||||
|
||||
return $code;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,75 +0,0 @@
|
||||
<?php
|
||||
|
||||
class php_resource extends php_element {
|
||||
|
||||
function __construct($attr, $destruct, $description) {
|
||||
$this->name = $attr['name'];
|
||||
if (!$this->is_name($this->name)) {
|
||||
$this->error[] = "'$attr[name] is not a valid resource name";
|
||||
}
|
||||
|
||||
|
||||
$this->payload = @$attr['payload'];
|
||||
$this->alloc = @$attr['alloc'];
|
||||
$this->destruct = $destruct;
|
||||
$this->description = $description;
|
||||
|
||||
if (empty($this->payload)) {
|
||||
$this->payload = "void";
|
||||
}
|
||||
}
|
||||
|
||||
function docbook_xml($base) {
|
||||
return "
|
||||
<section id='$base.resources.{$this->name}'>
|
||||
<title><literal>{$this->name}</literal></title>
|
||||
<para>
|
||||
{$this->description}
|
||||
</para>
|
||||
</section>
|
||||
";
|
||||
}
|
||||
|
||||
function minit_code() {
|
||||
return "
|
||||
le_{$this->name} = zend_register_list_destructors_ex({$this->name}_dtor,
|
||||
NULL,
|
||||
\"{$this->name}\",
|
||||
module_number);
|
||||
|
||||
";
|
||||
}
|
||||
|
||||
function c_code() {
|
||||
$dtor = "
|
||||
int le_{$this->name};
|
||||
|
||||
void {$this->name}_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
|
||||
{
|
||||
{$this->payload} * resource = ({$this->payload} *)(rsrc->ptr);
|
||||
|
||||
{$this->destruct}
|
||||
";
|
||||
|
||||
if ($this->alloc === "yes") {
|
||||
$dtor .= " efree(resource);\n";
|
||||
}
|
||||
|
||||
$dtor .= "}\n";
|
||||
|
||||
return $dtor;
|
||||
}
|
||||
|
||||
function h_code() {
|
||||
$upname = strtoupper($this->name);
|
||||
|
||||
return "
|
||||
#define {$upname}_FETCH(r, z) ZEND_FETCH_RESOURCE(r, {$this->payload} *, z, -1, ${$this->name}, le_{$this->name }); \
|
||||
if (!r) { RETURN_FALSE; }
|
||||
|
||||
#define {$upname}_REGISTER(r) ZEND_REGISTER_RESOURCE(return_value, r, le_{$this->name });
|
||||
";
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,36 +0,0 @@
|
||||
<?php
|
||||
class xml_stream_callback_parser extends xml_stream_parser {
|
||||
|
||||
function __construct($stream) {
|
||||
$this->cdata = "";
|
||||
$this->tags = array();
|
||||
$this->attrs = array();
|
||||
|
||||
parent::__construct($stream);
|
||||
}
|
||||
|
||||
function cdata($parser, $cdata) {
|
||||
$this->cdata .= $cdata;
|
||||
}
|
||||
|
||||
function tag_open($parser, $tag, $attributes) {
|
||||
array_push($this->tags, $tag);
|
||||
array_push($this->attrs, $attributes);
|
||||
}
|
||||
|
||||
function tag_close($parser, $tag) {
|
||||
$attributes = array_pop($this->attrs);
|
||||
|
||||
for ($tags = $this->tags; count($tags); array_shift($tags)) {
|
||||
$method = "handle_".join("_", $tags);
|
||||
if (method_exists($this, $method)) {
|
||||
$this->$method($attributes);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$this->cdata = "";
|
||||
array_pop($this->tags);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,54 +0,0 @@
|
||||
<?php
|
||||
class xml_stream_parser {
|
||||
var $parser;
|
||||
|
||||
function __construct($stream)
|
||||
{
|
||||
if (!is_resource($stream)) die("not a stream");
|
||||
if (get_resource_type($stream) != "stream") die("not a stream");
|
||||
|
||||
$this->parser = xml_parser_create();
|
||||
|
||||
xml_set_object($this->parser, $this);
|
||||
xml_set_element_handler($this->parser, "tag_open", "tag_close");
|
||||
xml_set_character_data_handler($this->parser, "cdata");
|
||||
xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
|
||||
|
||||
while (!feof($stream)) {
|
||||
xml_parse($this->parser, fgets($stream), feof($stream));
|
||||
}
|
||||
xml_parser_free($this->parser);
|
||||
}
|
||||
|
||||
function tag_open($parser, $tag, $attributes)
|
||||
{
|
||||
var_dump($parser, $tag, $attributes);
|
||||
}
|
||||
|
||||
function cdata($parser, $cdata)
|
||||
{
|
||||
var_dump($parser, $cdata);
|
||||
}
|
||||
|
||||
function tag_close($parser, $tag)
|
||||
{
|
||||
var_dump($parser, $tag);
|
||||
}
|
||||
|
||||
function error($msg)
|
||||
{
|
||||
if (is_array($msg)) {
|
||||
if (count($msg)==1) {
|
||||
$msg = current($msg);
|
||||
} else {
|
||||
foreach ($msg as $text) {
|
||||
echo "$text\n";
|
||||
}
|
||||
$msg = "...";
|
||||
}
|
||||
}
|
||||
|
||||
die("$msg on line ".xml_get_current_line_number($this->parser));
|
||||
}
|
||||
} // end of class xml
|
||||
?>
|
||||
Reference in New Issue
Block a user