diff options
Diffstat (limited to 'ext')
-rwxr-xr-x | ext/ext_skel | 152 | ||||
-rwxr-xr-x | ext/skeleton/create_stubs | 243 | ||||
-rw-r--r-- | ext/skeleton/php_skeleton.h | 27 | ||||
-rw-r--r-- | ext/skeleton/skeleton.c | 30 |
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__ */ |