File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / skeleton / create_stubs
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:34:42 2012 UTC (12 years, 1 month ago) by misho
Branches: php, MAIN
CVS tags: v5_4_3elwix, v5_4_29p0, v5_4_29, v5_4_20p0, v5_4_20, v5_4_17p0, v5_4_17, HEAD
php 5.4.3+patches

    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:     "<!-- $Id: create_stubs,v 1.1.1.2 2012/05/29 12:34:42 misho Exp $ -->\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>