diff options
author | Jouni Ahto <jah@php.net> | 2000-06-15 01:57:23 +0000 |
---|---|---|
committer | Jouni Ahto <jah@php.net> | 2000-06-15 01:57:23 +0000 |
commit | 495a957c99cc49677979e19920900e2b0a62a76c (patch) | |
tree | b5b3f269bc6d6d3f2362e98291814b03b518b083 /ext/skeleton | |
parent | 9ded807a20a48d4482d21bea8cb4cc24f20f04bc (diff) | |
download | php-git-495a957c99cc49677979e19920900e2b0a62a76c.tar.gz |
- Fixed incorrect code generated when all parameters are optional.
- Fixed handling of grouped optional parameters.
- Added an option to generate xml documentation.
- Added an option not to be nice and helpful and create all kinds
of comments and testing functions.
- Added on option to create function stubs only.
- Added options --assing-params and --string-lens that change
the generated code.
- Updated documentation.
Diffstat (limited to 'ext/skeleton')
-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 |
3 files changed, 199 insertions, 101 deletions
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__ */ |