Annotation of embedaddon/php/ext/skeleton/create_stubs, revision 1.1
1.1 ! misho 1: #!/usr/bin/awk -f
! 2:
! 3: function gobble(s, x)
! 4: {
! 5: sub(/^ /, "", line)
! 6: match(line, "^" "(" s ")")
! 7: x = substr(line, 1, RLENGTH)
! 8: line = substr(line, RLENGTH+1)
! 9: return x
! 10: }
! 11:
! 12: function convert(i, j, t)
! 13: {
! 14: type = argtypes[i,j]
! 15: name = argnames[i,j]
! 16: opt = optionals[i,j]
! 17: tabs = x = ""
! 18:
! 19: for (i = 0; i < t; i++) { tabs = tabs "\t" }
! 20:
! 21: if (type == "int" || type == "long") {
! 22: longs = longs "\tlong " name ";\n"
! 23: } else if (type == "bool" || type == "boolean") {
! 24: bools = bools "\tzend_bool " name ";\n"
! 25: } else if (type == "double" || type == "float") {
! 26: doubles = doubles "\tdouble " name ";\n"
! 27: } else if (type == "string") {
! 28: strings = strings "\tchar *" name " = NULL;\n"
! 29: ints = ints "\tint " name "_len;\n"
! 30: } else if (type == "array" || type == "object" || type == "mixed") {
! 31: zvals = zvals "\tzval *" name " = NULL;\n"
! 32: } else if (type == "resource" || type == "handle") {
! 33: zvals = zvals "\tzval *" name " = NULL;\n"
! 34: resources = resources "\tif (" name ") {\n" \
! 35: "\t\tZEND_FETCH_RESOURCE(???, ???, " name ", " name "_id, \"???\", ???_rsrc_id);\n\t}\n"
! 36: ints = ints "\tint " name "_id = -1;\n"
! 37: }
! 38: }
! 39:
! 40: function comment(s)
! 41: {
! 42: if (i_know_what_to_do_shut_up_i_dont_need_your_help_mode) {
! 43: return
! 44: } else {
! 45: return s
! 46: }
! 47: }
! 48:
! 49: BEGIN {
! 50: name = "[_A-Za-z][_A-Za-z0-9]*"
! 51: type = "int|long|double|float|string|bool|boolean|array|object|resource|handle|mixed|void"
! 52: spec = "l|l|d|d|s|b|b|a|o|r|r|z|"
! 53: num_funcs = 0
! 54:
! 55: # create a map from type name to the spec
! 56: split(type, type_array, "\|")
! 57: split(spec, spec_array, "\|")
! 58: for (i in type_array) {
! 59: spec_map[type_array[i]] = spec_array[i]
! 60: }
! 61:
! 62: if (xml && xml != "yes") {
! 63: xmldoc = xml
! 64: } else {
! 65: xmldoc = extname "/" extname ".xml"
! 66: }
! 67:
! 68:
! 69: xmlhead = "<?xml version='1.0' encoding='iso-8859-1'?>\n" \
! 70: "<!-- $Revision: 254820 $ -->\n" \
! 71: " <reference id=\"ref." extname "\">\n" \
! 72: " <title> functions</title>\n" \
! 73: " <titleabbrev></titleabbrev>\n\n" \
! 74: " <partintro>\n" \
! 75: " &warn.experimental;\n" \
! 76: " <para>\n" \
! 77: " </para>\n" \
! 78: " </partintro>\n\n";
! 79:
! 80: xmlfoot = " </reference>\n\n" \
! 81: "<!-- Keep this comment at the end of the file\n" \
! 82: "Local variables:\n" \
! 83: "mode: sgml\n" \
! 84: "sgml-omittag:t\n" \
! 85: "sgml-shorttag:t\n" \
! 86: "sgml-minimize-attributes:nil\n" \
! 87: "sgml-always-quote-attributes:t\n" \
! 88: "sgml-indent-step:1\n" \
! 89: "sgml-indent-data:t\n" \
! 90: "indent-tabs-mode:nil\n" \
! 91: "sgml-parent-document:nil\n" \
! 92: "sgml-default-dtd-file:\"../../manual.ced\"\n" \
! 93: "sgml-exposed-tags:nil\n" \
! 94: "sgml-local-catalogs:nil\n" \
! 95: "sgml-local-ecat-files:nil\n" \
! 96: "End:\n" \
! 97: "vim600: syn=xml fen fdm=syntax fdl=2 si\n" \
! 98: "vim: et tw=78 syn=sgml\n" \
! 99: "vi: ts=1 sw=1\n" \
! 100: "-->\n"
! 101: }
! 102:
! 103: {
! 104: args_max = args_min = optional = i = spec_opt = 0
! 105: line = $0
! 106: spec_str = "\""
! 107:
! 108: ## php extension must use lower case function names.
! 109: ## this will translate any capitalized letter to lowercase
! 110: ## and warn the user
! 111: if (match(func_name,"[A-Z]") != 0) {
! 112: printf("NOTICE: lower casing function name '%s'\n",func_name)
! 113: func_name = tolower(func_name)
! 114: }
! 115: func_type = gobble(type);
! 116: func_name = gobble(name);
! 117:
! 118: if (gobble("\\(")) {
! 119: if (gobble("\\[")) optional = 1
! 120: while (arg_type = gobble(type)) {
! 121: arg_name = gobble(name)
! 122: if(arg_type == "void") {
! 123: args_max = 0;
! 124: args_min = 0;
! 125: break;
! 126: } else {
! 127: argtypes[num_funcs,args_max] = arg_type
! 128: argnames[num_funcs,args_max] = arg_name
! 129:
! 130: args_max++
! 131: if (optional) {
! 132: if (!spec_opt) {
! 133: spec_str = spec_str "|"
! 134: spec_opt = 1
! 135: }
! 136: optionals[num_funcs,i] = optional
! 137: } else {
! 138: args_min++
! 139: }
! 140: spec_str = spec_str spec_map[arg_type]
! 141:
! 142: if (x = gobble("\\[")) {
! 143: optional++
! 144: }
! 145:
! 146: y = gobble(",")
! 147: if (!x && y && optional) {
! 148: grouped_optional_param[num_funcs,i] = 1
! 149: }
! 150: i++
! 151: }
! 152: }
! 153: }
! 154:
! 155: # if (x = gobble("\\)")) {
! 156: gobble("\\]* *\\)")
! 157: sub(/^[ \t]+/, "", line)
! 158: fcomments[num_funcs] = line
! 159: # }
! 160:
! 161: spec_str = spec_str "\""
! 162:
! 163: funcs[num_funcs] = func_name
! 164: types[num_funcs] = func_type
! 165: maxargs[num_funcs] = args_max
! 166: minargs[num_funcs] = args_min
! 167: specs[num_funcs] = spec_str
! 168: spec_opts[num_funcs] = spec_opt
! 169:
! 170: num_funcs++
! 171: }
! 172:
! 173: END {
! 174: if (xml) print xmlhead > xmldoc
! 175: for (i = 0; i < num_funcs; i++) {
! 176: compareargc = maxargs[i] - minargs[i]
! 177: closefetch = fetchargs = zvals = xmlparams = funcvals = resources = handleargs = closeopts = ""
! 178: ints = longs = doubles = strings = bools = zvals = ""
! 179:
! 180: proto = "/* {{{ proto " types[i] " " funcs[i] "("
! 181:
! 182: refid = funcs[i]
! 183: gsub(/_/, "-", refid)
! 184: xmlstr = " <refentry id=\"function." refid "\">\n" \
! 185: " <refnamediv>\n" \
! 186: " <refname>" funcs[i] "</refname>\n" \
! 187: " <refpurpose>" fcomments[i] "</refpurpose>\n" \
! 188: " </refnamediv>\n" \
! 189: " <refsect1>\n" \
! 190: " <title>Description</title>\n" \
! 191: " <funcsynopsis>\n" \
! 192: " <funcprototype>\n" \
! 193: " <funcdef>" types[i] " <function>" funcs[i] "</function></funcdef>\n"
! 194:
! 195: if (maxargs[i]>0) {
! 196: fetchargs = "\tif (zend_parse_parameters("
! 197: ints = ints "\tint argc = ZEND_NUM_ARGS();\n"
! 198: fetchargs = fetchargs "argc TSRMLS_CC, " specs[i]
! 199: } else {
! 200: fetchargs = fetchargs "\tif (zend_parse_parameters_none() == FAILURE) {\n\t\treturn;\n\t}"
! 201: xmlparams = xmlparams " <void/>\n"
! 202: }
! 203:
! 204: for (j = 0; j < maxargs[i]; j++) {
! 205:
! 206: fetchargs = fetchargs ", "
! 207:
! 208: fetchargs = fetchargs "&" argnames[i,j]
! 209: if (argtypes[i,j] == "string") {
! 210: fetchargs = fetchargs ", &" argnames[i,j] "_len"
! 211: }
! 212:
! 213: xmlparams = xmlparams " <paramdef>" argtypes[i,j]
! 214: if (j > minargs[i]-1) {
! 215: if (!grouped_optional_param[i,j-1]) {
! 216: if (j > 0) proto = proto " "
! 217: proto = proto "["
! 218: closeopts = closeopts "]"
! 219: }
! 220: xmlparams = xmlparams "\n <parameter><optional>" \
! 221: argnames[i,j] \
! 222: "</optional></parameter>\n </paramdef>\n"
! 223: } else {
! 224: xmlparams = xmlparams \
! 225: " <parameter>" \
! 226: argnames[i,j] \
! 227: "</parameter></paramdef>\n"
! 228: }
! 229:
! 230: if (j > 0) proto = proto ", "
! 231: proto = proto argtypes[i,j] " " argnames[i,j]
! 232:
! 233: convert(i, j, 1)
! 234: }
! 235:
! 236: proto = proto closeopts ")\n " fcomments[i] " */\nPHP_FUNCTION(" funcs[i] ")\n{"
! 237: if (maxargs[i]>0) {
! 238: fetchargs = fetchargs ") == FAILURE)" closefetch " \n\t\treturn;\n"
! 239: }
! 240: funcvals = strings ints longs doubles bools zvals
! 241: xmlstr = xmlstr xmlparams \
! 242: " </funcprototype>\n" \
! 243: " </funcsynopsis>\n" \
! 244: " &warn.experimental.func;\n" \
! 245: " <para>\n" \
! 246: " &warn.undocumented.func;\n" \
! 247: " </para>\n" \
! 248: " </refsect1>\n" \
! 249: " </refentry>\n"
! 250:
! 251: print proto > stubfile
! 252: if (funcvals) print funcvals > stubfile
! 253: if (fetchargs) print fetchargs > stubfile
! 254: if (resources) {
! 255: print resources > stubfile
! 256: if (!stubs) print "" > extname "/function_warning"
! 257: }
! 258: if (!i_know_what_to_do_shut_up_i_dont_need_your_help_mode) {
! 259: print "\tphp_error(E_WARNING, \"" funcs[i] ": not yet implemented\");" > stubfile
! 260: }
! 261: print "}\n/* }}} */\n" > stubfile
! 262:
! 263: if (stubs) {
! 264: h_stubs = h_stubs "PHP_FUNCTION(" funcs[i] ");\n"
! 265: c_stubs = c_stubs "\tPHP_FE(" funcs[i] ",\tNULL)\n"
! 266: } else {
! 267: print "PHP_FUNCTION(" funcs[i] ");" > extname "/function_declarations"
! 268: print "\tPHP_FE(" funcs[i] ",\tNULL)" > extname "/function_entries"
! 269: }
! 270:
! 271: if (xml) print xmlstr > xmldoc
! 272: }
! 273:
! 274: if (stubs) {
! 275: print "\n/* ----------------------------------------------------------- */\n" > stubfile
! 276: print c_stubs > stubfile
! 277: print "\n/* ----------------------------------------------------------- */\n" > stubfile
! 278: print h_stubs > stubfile
! 279: }
! 280:
! 281: if (xml) print xmlfoot > xmldoc
! 282: }
! 283:
! 284: #
! 285: # Local variables:
! 286: # tab-width: 2
! 287: # c-basic-offset: 2
! 288: # End:
! 289:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>