summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rwxr-xr-xext/ext_skel152
-rwxr-xr-xext/skeleton/create_stubs243
-rw-r--r--ext/skeleton/php_skeleton.h27
-rw-r--r--ext/skeleton/skeleton.c30
4 files changed, 320 insertions, 132 deletions
diff --git a/ext/ext_skel b/ext/ext_skel
index b6235469bb..fb60bf2d81 100755
--- a/ext/ext_skel
+++ b/ext/ext_skel
@@ -1,19 +1,76 @@
#!/bin/sh
-extname="$1"
-EXTNAME=`echo $1|tr a-z A-Z`
-if [ ! -z $2 -a -r $2 ]; then
- functions=$2
- echo=$2
-fi
-
givup() {
echo $*
exit 1
}
-if test "$extname" = ""; then
- givup "usage: $0 extension-name [function-list]"
+usage() {
+echo "$0 --extname=module [--proto=file] [--stubs=file] [--xml[=file]]"
+echo " [--full-xml] [--no-help] [--assign-params [--string-lens]]"
+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 " --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"
+echo " --assign-params"
+echo " --string-lens"
+exit 1
+}
+
+if test $# -eq 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 a-z A-Z`
+ ;;
+ --proto=?*)
+ proto=$optarg
+ ;;
+ --stubs=*)
+ stubs=yes
+ stubfile=$optarg
+ ;;
+ --xml)
+ xml="yes"
+ ;;
+ --xml=?*)
+ xml=$optarg
+ ;;
+ --full-xml)
+ full_xml="yes"
+ ;;
+ --no-help)
+ no_help="yes"
+ ;;
+ --assign-params)
+ assign_params="yes"
+ ;;
+ --string-lens)
+ string_lens="yes"
+ ;;
+ *)
+ usage
+ ;;
+ esac
+ shift
+done
+
+if [ -z "$assign_params" -a ! -z "$string_lens" ]; then
+ usage
fi
if test -d "$extname" ; then
@@ -32,15 +89,18 @@ else
ECHO_C='\c'
fi
-echo "Creating directory"
+if [ -z $stubs ]; then
+echo "Creating directory $extname"
+stubfile=$extname"/function_stubs"
mkdir $extname || givup "Cannot create directory $extname"
+fi
-if [ ! -z $functions ]; then
- echo $functions
- cat $functions | awk -v extname=$extname -f ./skeleton/create_stubs
+if [ ! -z $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 -v assign_params=$assign_params -v string_lens=$string_lens -f ./skeleton/create_stubs
fi
+if [ -z $stubs ]; then
cd $extname
chmod 755 .
@@ -102,32 +162,59 @@ libs.mk
eof
$ECHO_N " $extname.c$ECHO_C"
-cat ../skeleton/skeleton.c | sed \
--e "s/extname/$extname/g" \
--e "s/EXTNAME/$EXTNAME/g" \
--e '/__function_entries_here__/r function_entries' \
--e '/__function_stubs_here__/r function_stubs' \
--e '/__function_entries_here__/D' \
--e '/__function_stubs_here__/D' \
-> $extname.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
+
+cat ../skeleton/skeleton.c | sed -f sedscript > $extname.c
+
$ECHO_N " php_$extname.h$ECHO_C"
-cat ../skeleton/php_skeleton.h | sed \
--e "s/extname/$extname/g" \
--e "s/EXTNAME/$EXTNAME/g" \
--e '/__function_declarations_here__/r function_declarations' \
--e '/__function_declarations_here__/D' \
-> php_$extname.h
+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
+cat ../skeleton/php_skeleton.h | sed -f sedscript > php_$extname.h
+
+rm sedscript
+if [ -z "$stubs" -a -z "$no_help" ]; then
$ECHO_N " $extname.php$ECHO_C"
cat ../skeleton/skeleton.php | sed \
-e "s/extname/$extname/g" \
> $extname.php
+fi
-if [ ! -z $functions ]; then
- rm function_entries
- rm function_declarations
- rm function_stubs
+if [ ! -z $proto ]; then
+ if [ -z $stubs ]; then
+ rm function_entries
+ rm function_declarations
+ rm function_stubs
+ fi
if [ -f function_warning ]; then
rm function_warning
warning="
@@ -139,9 +226,11 @@ in the instructions above.
fi
chmod 644 *
+fi
echo " [done]."
+if [ -z "$no_help" -a -z "$stubs" ]; then
cat <<eof
To use your new extension, you will have to execute the following steps:
@@ -160,3 +249,4 @@ step 6 confirms that your module is compiled in PHP. Then, start writing
code and repeat the last two steps as often as necessary.
$warning
eof
+fi
diff --git a/ext/skeleton/create_stubs b/ext/skeleton/create_stubs
index 2488c5c9c6..3692dfb65a 100755
--- a/ext/skeleton/create_stubs
+++ b/ext/skeleton/create_stubs
@@ -9,39 +9,101 @@ function gobble(s, x)
return x
}
-function convert(i, j)
+function convert(i, j, t)
{
type = argtypes[i,j]
name = argnames[i,j]
opt = optionals[i,j]
- x = ""
+ tabs = x = ""
+
+ for (i = 0; i < t; i++) { tabs = tabs "\t" }
if (type == "int") {
- x = "convert_to_long_ex(" name ");\n"
+ x = tabs "convert_to_long_ex(" name ext ");\n" \
+ (ext? tabs name " = Z_LVAL_PP(" name ext ");\n": "")
+ ints = ints "\tint " name ";\n"
+ } else if (type == "bool") {
+ x = tabs "convert_to_long_ex(" name ext ");\n" \
+ (ext? tabs name " = Z_LVAL_PP(" name ext ");\n": "")
+ ints = ints "\tint " name ";\n"
} else if (type == "double") {
- x = "convert_to_double_ex(" name ");\n"
+ x = tabs "convert_to_double_ex(" name ext ");\n" \
+ (ext? tabs name " = Z_DVAL_PP(" name ext ");\n": "")
+ doubles = doubles "\tdouble " name ";\n"
+ } else if (type == "float") {
+ x = tabs "convert_to_double_ex(" name ext ");\n" \
+ (ext? tabs name " = (float) Z_DVAL_PP(" name ext ");\n": "")
+ floats = floats "\tfloat " name ";\n"
} else if (type == "string") {
- x = "convert_to_string_ex(" name ");\n"
+ x = tabs "convert_to_string_ex(" name ext ");\n" \
+ (ext? tabs name " = Z_STRVAL_PP(" name ext ");\n": "")
+ (ext ? strings = strings "\tchar *" name " = NULL;\n" : 0)
+ if (string_lens) {
+ x = x tabs name "_len = Z_STRLEN_PP(" name ext ");\n"
+ ints = ints "\tint " name "_len;\n"
+ }
} else if (type == "array") {
- x = "convert_to_array_ex(" name ");\n"
+ x = "convert_to_array_ex(" name ext ");\n"
} else if (type == "resource") {
- if (opt && i) {
- resources = resources "\tif (argc < " j+1 ") {\n\t\t/* Argument not given, do something before\n\t\t trying to fetch resource " name ". */\n\t}\n\tZEND_FETCH_RESOURCE(???, ???, " name ", " name "_id, \"???\", ???G());\n"
+ if (opt && i > -1) {
+ resources = resources "\tif (argc < " j+1 ") {\n" \
+ comment("\t\t/* Argument not given, do something before\n\t\t trying to fetch resource " name ". */\n") \
+ "\t}\n\tZEND_FETCH_RESOURCE(???, ???, " name ext ", " name "_id, \"???\", ???G());\n"
} else {
- resources = resources "\tZEND_FETCH_RESOURCE(???, ???, " name ", " name "_id, \"???\", ???G());\n"
+ resources = resources "\tZEND_FETCH_RESOURCE(???, ???, " name ext ", " name "_id, \"???\", ???G());\n"
}
funcvals = funcvals "\tint " name "_id = -1;\n"
} else {
- x = "/* Write your own code here to handle argument " name ". */\n"
+ x = comment("/* Write your own code here to handle argument " name ". */\n")
}
if (x) return x
}
+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|double|string|bool|array|object|resource|mixed|void"
+ type = "int|double|float|string|bool|array|object|resource|mixed|void"
num_funcs = 0
+
+ if (assign_params) ext = "_arg"
+
+ if (xml && xml != "yes") {
+ xmldoc = xml
+ } else {
+ xmldoc = extname "/" extname ".xml"
+ }
+
+
+ xmlhead = " <reference id=\"ref." extname "\">\n" \
+" <title> functions</title>\n" \
+" <titleabbrev></titleabbrev>\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" \
+ "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" \
+ "-->\n"
}
{
@@ -72,7 +134,11 @@ BEGIN {
optional++
}
- gobble(",")
+ y = gobble(",")
+ if (!x && y && optional) {
+ check_argc_in_switch[num_funcs] = 1
+ grouped_optional_param[num_funcs,i] = 1
+ }
i++
}
}
@@ -86,24 +152,44 @@ BEGIN {
}
END {
+ if (xml) print xmlhead > xmldoc
for (i = 0; i < num_funcs; i++) {
compareargc = maxargs[i] - minargs[i]
- funcvals = resources = handleargs = closeopts = ""
+ closefetch = xmlparams = funcvals = resources = handleargs = closeopts = ""
+ ints = doubles = floats = strings = arrays = ""
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></refpurpose>\n" \
+ " </refnamediv>\n" \
+ " <refsect1>\n" \
+ " <title>Description</title>\n" \
+ " <funcsynopsis>\n" \
+ " <funcdef>" types[i] " <function>" funcs[i] "</function></funcdef>\n"
+
if (maxargs[i]) {
zvals = "\tzval "
if (compareargc) {
funcvals = "\tint argc;\n"
if (minargs[i]) {
- fetchargs = "\targc = ZEND_NUM_ARGS();\n\tif (argc < " minargs[i] " || argc > " maxargs[i] " || zend_get_parameters_ex(argc, "
+ fetchargs = "\targc = ZEND_NUM_ARGS();\n\tif (argc < " \
+ minargs[i] " || argc > " maxargs[i] \
+ " || zend_get_parameters_ex(argc, "
} else {
- fetchargs = "\targc = ZEND_NUM_ARGS();\n\tif ((argc && argc < " maxargs[i]+1 " || zend_get_parameters_ex(argc, "
+ fetchargs = "\targc = ZEND_NUM_ARGS();\n\tif (argc > " \
+ maxargs[i] " || (argc && zend_get_parameters_ex(argc, "
+ closefetch = ")"
}
} else {
- fetchargs = "\tif (ZEND_NUM_ARGS() != " maxargs[i] " || zend_get_parameters_ex(" maxargs[i] ", "
+ fetchargs = "\tif (ZEND_NUM_ARGS() != " maxargs[i] \
+ " || zend_get_parameters_ex(" maxargs[i] ", "
}
}
@@ -114,63 +200,122 @@ END {
fetchargs = fetchargs ", "
}
- zvals = zvals "**" argnames[i,j]
- fetchargs = fetchargs "&" argnames[i,j]
+ zvals = zvals "**" argnames[i,j] ext
+ fetchargs = fetchargs "&" argnames[i,j] ext
+ xmlparams = xmlparams " <paramdef>" argtypes[i,j]
if (j > minargs[i]-1) {
- if (j) proto = proto " "
- proto = proto "["
- closeopts = closeopts "]"
+ 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]
- code = convert(i, j)
+# code = convert(i, j)
+ # Clean up this mess...
+
if (useswitch[i]) {
- if (j > minargs[i]-1) {
- if (code) {
- handleargs = "\t\tcase " j+1 ":\n\t\t\t" code "\t\t\t/* Fall-through. */\n" handleargs
- } else {
- handleargs = "\t\tcase " j+1 ":\t/* Fall-through. */\n" handleargs
- }
- } else if (j >= minargs[i]-1) {
- if (code) {
- handleargs = "\t\tcase " j+1 ":\n\t\t\t" code handleargs
+ if (grouped_optional_param[i,j] && code) {
+ handleargs = convert(i, j, 3) \
+ ((grouped_optional_param[i,j-1]) ? "" : comment("\t\t\t/* Fall-through. */\n")) \
+ handleargs
+ } else {
+ if (j > minargs[i]-1) {
+ if (code = convert(i, j, 3)) {
+ handleargs = "\t\tcase " j+1 ":\n" code \
+ ((grouped_optional_param[i,j-1]) ? "" : comment("\t\t\t/* Fall-through. */\n")) \
+ handleargs
+ } else {
+ handleargs = "\t\tcase " j+1 ":" \
+ comment("\t/* Fall-through. */") \
+ "\n" handleargs
+ }
+ } else if (j >= minargs[i]-1) {
+ if (code = convert(i, j, 3)) {
+ handleargs = "\t\tcase " j+1 ":\n" code handleargs
+ } else {
+ handleargs = "\t\tcase " j+1 ":\n" handleargs
+ }
} else {
- handleargs = "\t\tcase " j+1 ":\n" handleargs
+ if (code = convert(i, j, 3)) handleargs = code handleargs
}
- } else {
- handleargs = "\t\t\t" code handleargs
}
} else {
- if (code) handleargs = handleargs "\t" code
+ if (code = convert(i, j, 1)) handleargs = handleargs code
}
}
proto = proto closeopts ")\n */\nPHP_FUNCTION(" funcs[i] ")\n{"
if (maxargs[i]) {
zvals = zvals ";"
- fetchargs = fetchargs ") == FAILURE) {\n\t\tWRONG_PARAM_COUNT;\n\t}\n"
+ fetchargs = fetchargs ") == FAILURE)" closefetch "{\n\t\tWRONG_PARAM_COUNT;\n\t}\n"
+ }
+ funcvals = ints doubles floats strings funcvals
+ if (resources) funcvals = funcvals "\t???LS_FETCH();\n"
+ if (useswitch[i]) {
+ if (check_argc_in_switch[i]) {
+ check_argc = "\t\tdefault:\n\t\t\tWRONG_PARAM_COUNT;\n"
+ } else {
+ check_argc = ""
+ }
+ handleargs = "\tswitch (argc) {\n" \
+ handleargs \
+ (minargs[i] ? "" : "\t\tcase 0:\n") \
+ "\t\t\tbreak;\n" check_argc "\t}"
}
- if (resources ) funcvals = funcvals "\t???LS_FETCH();\n"
- if (useswitch[i]) handleargs = "\tswitch (argc) {\n" handleargs "\t\t\tbreak;\n\t\tdefault:\n\t\t\tWRONG_PARAM_COUNT;\n\t}"
+ xmlstr = xmlstr xmlparams \
+ " </funcsynopsis>\n" \
+ " <para>\n" \
+ " </para>\n" \
+ " </refsect1>\n" \
+ " </refentry>\n"
- print proto > extname "/function_stubs"
- if (zvals) print zvals > extname "/function_stubs"
- if (funcvals) print funcvals > extname "/function_stubs"
- if (fetchargs) print fetchargs > extname "/function_stubs"
+ print proto > stubfile
+ if (zvals) print zvals > stubfile
+ if (funcvals) print funcvals > stubfile
+ if (fetchargs) print fetchargs > stubfile
if (resources) {
- print resources > extname "/function_stubs"
- print "" > extname "/function_warning"
+ print resources > stubfile
+ if (!stubs) print "" > extname "/function_warning"
}
- if (handleargs) print handleargs > extname "/function_stubs"
- print "\n\tphp_error(E_WARNING, \"" funcs[i] ": not yet implemented\");" > extname "/function_stubs"
- print "}\n/* }}} */\n" > extname "/function_stubs"
- print "PHP_FUNCTION(" funcs[i] ");" > extname "/function_declarations"
- print "\tPHP_FE(" funcs[i] ",\tNULL)" > extname "/function_entries"
+ if (handleargs) print handleargs > stubfile
+ if (!i_know_what_to_do_shut_up_i_dont_need_your_help_mode) {
+ print "\n\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
}
#
diff --git a/ext/skeleton/php_skeleton.h b/ext/skeleton/php_skeleton.h
index ba20b27f5c..eaa1b6e592 100644
--- a/ext/skeleton/php_skeleton.h
+++ b/ext/skeleton/php_skeleton.h
@@ -1,22 +1,4 @@
-/*
- +----------------------------------------------------------------------+
- | PHP version 4.0 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 2.02 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available at through the world-wide-web at |
- | http://www.php.net/license/2_02.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. |
- +----------------------------------------------------------------------+
- | Authors: |
- +----------------------------------------------------------------------+
- */
-
-/* $Id: */
+/* __header_here__ */
#ifndef _PHP_EXTNAME_H
#define _PHP_EXTNAME_H
@@ -79,9 +61,4 @@ typedef struct {
#endif /* _PHP_EXTNAME_H */
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- */
+/* __footer_here__ */
diff --git a/ext/skeleton/skeleton.c b/ext/skeleton/skeleton.c
index e21e61f662..0b567e197b 100644
--- a/ext/skeleton/skeleton.c
+++ b/ext/skeleton/skeleton.c
@@ -1,22 +1,4 @@
-/*
- +----------------------------------------------------------------------+
- | PHP version 4.0 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 2.02 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available at through the world-wide-web at |
- | http://www.php.net/license/2_02.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. |
- +----------------------------------------------------------------------+
- | Authors: |
- +----------------------------------------------------------------------+
- */
-
-/* $Id: */
+/* __header_here__ */
#include "php.h"
#include "php_ini.h"
@@ -102,8 +84,7 @@ PHP_MINFO_FUNCTION(extname)
/* 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.
-*/
+ purposes. */
/* Every user-visible function in PHP should document itself in the source */
/* {{{ proto string confirm_extname_compiled(string arg)
@@ -134,9 +115,4 @@ PHP_FUNCTION(confirm_extname_compiled)
#endif /* HAVE_EXTNAME */
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- */
+/* __footer_here__ */