diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-03-14 05:42:27 +0000 |
---|---|---|
committer | <> | 2013-04-03 16:25:08 +0000 |
commit | c4dd7a1a684490673e25aaf4fabec5df138854c4 (patch) | |
tree | 4d57c44caae4480efff02b90b9be86f44bf25409 /ext/skeleton/create_stubs | |
download | php2-master.tar.gz |
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/skeleton/create_stubs')
-rwxr-xr-x | ext/skeleton/create_stubs | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/ext/skeleton/create_stubs b/ext/skeleton/create_stubs new file mode 100755 index 0000000..4cfdeb1 --- /dev/null +++ b/ext/skeleton/create_stubs @@ -0,0 +1,289 @@ +#!/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" \ + "<!-- $Id: f9f39b1795f7e18e4c822bb840ea42295f646938 $ -->\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_parse_parameters_none() == FAILURE) {\n\t\treturn;\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: + |