xref: /dflybsd-src/sys/tools/makeobjops.awk (revision 2c64e990ea2bb1213bd0758af732469466873ba6)
1a43e4d55SJeroen Ruigrok/asmodai#!/usr/bin/awk -f
2a43e4d55SJeroen Ruigrok/asmodai#
3a43e4d55SJeroen Ruigrok/asmodai# Copyright (c) 1992, 1993
4a43e4d55SJeroen Ruigrok/asmodai#        The Regents of the University of California.  All rights reserved.
5a43e4d55SJeroen Ruigrok/asmodai#
6a43e4d55SJeroen Ruigrok/asmodai# Redistribution and use in source and binary forms, with or without
7a43e4d55SJeroen Ruigrok/asmodai# modification, are permitted provided that the following conditions
8a43e4d55SJeroen Ruigrok/asmodai# are met:
9a43e4d55SJeroen Ruigrok/asmodai# 1. Redistributions of source code must retain the above copyright
10a43e4d55SJeroen Ruigrok/asmodai#    notice, this list of conditions and the following disclaimer.
11a43e4d55SJeroen Ruigrok/asmodai# 2. Redistributions in binary form must reproduce the above copyright
12a43e4d55SJeroen Ruigrok/asmodai#    notice, this list of conditions and the following disclaimer in the
13a43e4d55SJeroen Ruigrok/asmodai#    documentation and/or other materials provided with the distribution.
14*2c64e990Szrj# 3. Neither the name of the University nor the names of its contributors
15a43e4d55SJeroen Ruigrok/asmodai#    may be used to endorse or promote products derived from this software
16a43e4d55SJeroen Ruigrok/asmodai#    without specific prior written permission.
17a43e4d55SJeroen Ruigrok/asmodai#
18a43e4d55SJeroen Ruigrok/asmodai# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19a43e4d55SJeroen Ruigrok/asmodai# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20a43e4d55SJeroen Ruigrok/asmodai# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21a43e4d55SJeroen Ruigrok/asmodai# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22a43e4d55SJeroen Ruigrok/asmodai# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23a43e4d55SJeroen Ruigrok/asmodai# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24a43e4d55SJeroen Ruigrok/asmodai# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25a43e4d55SJeroen Ruigrok/asmodai# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26a43e4d55SJeroen Ruigrok/asmodai# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27a43e4d55SJeroen Ruigrok/asmodai# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28a43e4d55SJeroen Ruigrok/asmodai# SUCH DAMAGE.
29a43e4d55SJeroen Ruigrok/asmodai#
30a43e4d55SJeroen Ruigrok/asmodai# From @(#)vnode_if.sh        8.1 (Berkeley) 6/10/93
31a43e4d55SJeroen Ruigrok/asmodai# From @(#)makedevops.sh 1.1 1998/06/14 13:53:12 dfr Exp $
32a43e4d55SJeroen Ruigrok/asmodai# From @(#)makedevops.sh ?.? 1998/10/05
33a43e4d55SJeroen Ruigrok/asmodai# From src/sys/kern/makedevops.pl,v 1.12 1999/11/22 14:40:04 n_hibma Exp
34a43e4d55SJeroen Ruigrok/asmodai# From src/sys/kern/makeobjops.pl,v 1.8 2001/11/16 02:02:42 joe Exp
35a43e4d55SJeroen Ruigrok/asmodai#
36ec7b1524SJeroen Ruigrok/asmodai# $FreeBSD: src/sys/tools/makeobjops.awk,v 1.3 2003/10/16 13:29:26 dfr Exp $
37a43e4d55SJeroen Ruigrok/asmodai
38a43e4d55SJeroen Ruigrok/asmodai#
39a43e4d55SJeroen Ruigrok/asmodai#   Script to produce kobj front-end sugar.
40a43e4d55SJeroen Ruigrok/asmodai#
41a43e4d55SJeroen Ruigrok/asmodai
42a43e4d55SJeroen Ruigrok/asmodaifunction usage ()
43a43e4d55SJeroen Ruigrok/asmodai{
44a43e4d55SJeroen Ruigrok/asmodai	print "usage: makeobjops.awk <srcfile.m> [-d] [-p] [-l <nr>] [-c|-h]";
45a43e4d55SJeroen Ruigrok/asmodai	print "where -c   produce only .c files";
46a43e4d55SJeroen Ruigrok/asmodai	print "      -h   produce only .h files";
47a43e4d55SJeroen Ruigrok/asmodai	print "      -p   use the path component in the source file for destination dir";
48a43e4d55SJeroen Ruigrok/asmodai	print "      -l   set line width for output files [80]";
49a43e4d55SJeroen Ruigrok/asmodai	print "      -d   switch on debugging";
50a43e4d55SJeroen Ruigrok/asmodai	exit 1;
51a43e4d55SJeroen Ruigrok/asmodai}
52a43e4d55SJeroen Ruigrok/asmodai
53a43e4d55SJeroen Ruigrok/asmodaifunction warn (msg)
54a43e4d55SJeroen Ruigrok/asmodai{
55a43e4d55SJeroen Ruigrok/asmodai	print "makeobjops.awk:", msg > "/dev/stderr";
56a43e4d55SJeroen Ruigrok/asmodai}
57a43e4d55SJeroen Ruigrok/asmodai
58a43e4d55SJeroen Ruigrok/asmodaifunction warnsrc (msg)
59a43e4d55SJeroen Ruigrok/asmodai{
60a43e4d55SJeroen Ruigrok/asmodai	warn(src ":" lineno ": " msg);
61a43e4d55SJeroen Ruigrok/asmodai}
62a43e4d55SJeroen Ruigrok/asmodai
63a43e4d55SJeroen Ruigrok/asmodaifunction debug (msg)
64a43e4d55SJeroen Ruigrok/asmodai{
65a43e4d55SJeroen Ruigrok/asmodai	if (opt_d)
66a43e4d55SJeroen Ruigrok/asmodai		warn(msg);
67a43e4d55SJeroen Ruigrok/asmodai}
68a43e4d55SJeroen Ruigrok/asmodai
69a43e4d55SJeroen Ruigrok/asmodaifunction die (msg)
70a43e4d55SJeroen Ruigrok/asmodai{
71a43e4d55SJeroen Ruigrok/asmodai	warn(msg);
72a43e4d55SJeroen Ruigrok/asmodai	exit 1;
73a43e4d55SJeroen Ruigrok/asmodai}
74a43e4d55SJeroen Ruigrok/asmodai
75a43e4d55SJeroen Ruigrok/asmodai#   These are just for convenience ...
76a43e4d55SJeroen Ruigrok/asmodaifunction printc(s) {if (opt_c) print s > ctmpfilename;}
77a43e4d55SJeroen Ruigrok/asmodaifunction printh(s) {if (opt_h) print s > htmpfilename;}
78a43e4d55SJeroen Ruigrok/asmodai
79a43e4d55SJeroen Ruigrok/asmodai#
80a43e4d55SJeroen Ruigrok/asmodai#   If a line exceeds maxlength, split it into multiple
81a43e4d55SJeroen Ruigrok/asmodai#   lines at commas.  Subsequent lines are indented by
82a43e4d55SJeroen Ruigrok/asmodai#   the specified number of spaces.
83a43e4d55SJeroen Ruigrok/asmodai#
84a43e4d55SJeroen Ruigrok/asmodai#   In other words:  Lines are split by replacing ", "
85a43e4d55SJeroen Ruigrok/asmodai#   by ",\n" plus indent spaces.
86a43e4d55SJeroen Ruigrok/asmodai#
87a43e4d55SJeroen Ruigrok/asmodai
88a43e4d55SJeroen Ruigrok/asmodaifunction format_line (line, maxlength, indent)
89a43e4d55SJeroen Ruigrok/asmodai{
90a43e4d55SJeroen Ruigrok/asmodai	rline = "";
91a43e4d55SJeroen Ruigrok/asmodai
92a43e4d55SJeroen Ruigrok/asmodai	while (length(line) > maxlength) {
93a43e4d55SJeroen Ruigrok/asmodai		#
94a43e4d55SJeroen Ruigrok/asmodai		#   Find the rightmost ", " so that the part
95a43e4d55SJeroen Ruigrok/asmodai		#   to the left of it is just within maxlength.
96a43e4d55SJeroen Ruigrok/asmodai		#   If there is none, give up and leave it as-is.
97a43e4d55SJeroen Ruigrok/asmodai		#
98a43e4d55SJeroen Ruigrok/asmodai		if (!match(substr(line, 1, maxlength + 1), /^.*, /))
99a43e4d55SJeroen Ruigrok/asmodai			break;
100a43e4d55SJeroen Ruigrok/asmodai		rline = rline substr(line, 1, RLENGTH - 1) "\n";
101a43e4d55SJeroen Ruigrok/asmodai		line = sprintf("%*s", indent, "") substr(line, RLENGTH + 1);
102a43e4d55SJeroen Ruigrok/asmodai	}
103a43e4d55SJeroen Ruigrok/asmodai	return rline line;
104a43e4d55SJeroen Ruigrok/asmodai}
105a43e4d55SJeroen Ruigrok/asmodai
106a43e4d55SJeroen Ruigrok/asmodai#
107a43e4d55SJeroen Ruigrok/asmodai#   Join an array into a string.
108a43e4d55SJeroen Ruigrok/asmodai#
109a43e4d55SJeroen Ruigrok/asmodai
110a43e4d55SJeroen Ruigrok/asmodaifunction join (separator, array, num)
111a43e4d55SJeroen Ruigrok/asmodai{
112a43e4d55SJeroen Ruigrok/asmodai	_result = ""
113a43e4d55SJeroen Ruigrok/asmodai	if (num) {
114a43e4d55SJeroen Ruigrok/asmodai		while (num > 1)
115a43e4d55SJeroen Ruigrok/asmodai			_result = separator array[num--] _result;
116a43e4d55SJeroen Ruigrok/asmodai		_result = array[1] _result;
117a43e4d55SJeroen Ruigrok/asmodai	}
118a43e4d55SJeroen Ruigrok/asmodai	return _result;
119a43e4d55SJeroen Ruigrok/asmodai}
120a43e4d55SJeroen Ruigrok/asmodai
121a43e4d55SJeroen Ruigrok/asmodai#
122a43e4d55SJeroen Ruigrok/asmodai#   Execute a system command and report if it failed.
123a43e4d55SJeroen Ruigrok/asmodai#
124a43e4d55SJeroen Ruigrok/asmodai
125a43e4d55SJeroen Ruigrok/asmodaifunction system_check (cmd)
126a43e4d55SJeroen Ruigrok/asmodai{
127a43e4d55SJeroen Ruigrok/asmodai	if ((rc = system(cmd)))
128a43e4d55SJeroen Ruigrok/asmodai		warn(cmd " failed (" rc ")");
129a43e4d55SJeroen Ruigrok/asmodai}
130a43e4d55SJeroen Ruigrok/asmodai
131a43e4d55SJeroen Ruigrok/asmodai#
132a43e4d55SJeroen Ruigrok/asmodai#   Handle "INTERFACE" line.
133a43e4d55SJeroen Ruigrok/asmodai#
134a43e4d55SJeroen Ruigrok/asmodai
135a43e4d55SJeroen Ruigrok/asmodaifunction handle_interface ()
136a43e4d55SJeroen Ruigrok/asmodai{
137a43e4d55SJeroen Ruigrok/asmodai	intname = $2;
138a43e4d55SJeroen Ruigrok/asmodai	sub(/;$/, "", intname);
139a43e4d55SJeroen Ruigrok/asmodai	if (intname !~ /^[a-z_][a-z0-9_]*$/) {
140a43e4d55SJeroen Ruigrok/asmodai		debug($0);
141a43e4d55SJeroen Ruigrok/asmodai		warnsrc("Invalid interface name '" intname "', use [a-z_][a-z0-9_]*");
142a43e4d55SJeroen Ruigrok/asmodai		error = 1;
143a43e4d55SJeroen Ruigrok/asmodai		return;
144a43e4d55SJeroen Ruigrok/asmodai	}
145a43e4d55SJeroen Ruigrok/asmodai	if (!/;[ 	]*$/)
146a43e4d55SJeroen Ruigrok/asmodai		warnsrc("Semicolon missing at end of line, no problem");
147a43e4d55SJeroen Ruigrok/asmodai
148a43e4d55SJeroen Ruigrok/asmodai	debug("Interface " intname);
149a43e4d55SJeroen Ruigrok/asmodai
150a43e4d55SJeroen Ruigrok/asmodai	printh("#ifndef _" intname "_if_h_");
151a43e4d55SJeroen Ruigrok/asmodai	printh("#define _" intname "_if_h_\n");
152a43e4d55SJeroen Ruigrok/asmodai	printc("#include \"" intname "_if.h\"\n");
153a43e4d55SJeroen Ruigrok/asmodai}
154a43e4d55SJeroen Ruigrok/asmodai
155a43e4d55SJeroen Ruigrok/asmodai#
156a43e4d55SJeroen Ruigrok/asmodai#   Handle "CODE" and "HEADER" sections.
157a43e4d55SJeroen Ruigrok/asmodai#   Returns the code as-is.
158a43e4d55SJeroen Ruigrok/asmodai#
159a43e4d55SJeroen Ruigrok/asmodai
160a43e4d55SJeroen Ruigrok/asmodaifunction handle_code ()
161a43e4d55SJeroen Ruigrok/asmodai{
162a43e4d55SJeroen Ruigrok/asmodai	code = "\n";
163a43e4d55SJeroen Ruigrok/asmodai	getline < src;
164a43e4d55SJeroen Ruigrok/asmodai	indent = $0;
165a43e4d55SJeroen Ruigrok/asmodai	sub(/[^	 ].*$/, "", indent);	# find the indent used
166a43e4d55SJeroen Ruigrok/asmodai	while (!/^}/) {
167a43e4d55SJeroen Ruigrok/asmodai		sub("^" indent, "");	# remove the indent
168a43e4d55SJeroen Ruigrok/asmodai		code = code $0 "\n";
169a43e4d55SJeroen Ruigrok/asmodai		getline < src;
170a43e4d55SJeroen Ruigrok/asmodai		lineno++;;
171a43e4d55SJeroen Ruigrok/asmodai	}
172a43e4d55SJeroen Ruigrok/asmodai	return code;
173a43e4d55SJeroen Ruigrok/asmodai}
174a43e4d55SJeroen Ruigrok/asmodai
175a43e4d55SJeroen Ruigrok/asmodai#
176a43e4d55SJeroen Ruigrok/asmodai#   Handle "METHOD" and "STATICMETHOD" sections.
177a43e4d55SJeroen Ruigrok/asmodai#
178a43e4d55SJeroen Ruigrok/asmodai
179a43e4d55SJeroen Ruigrok/asmodaifunction handle_method (static)
180a43e4d55SJeroen Ruigrok/asmodai{
181a43e4d55SJeroen Ruigrok/asmodai	#
182a43e4d55SJeroen Ruigrok/asmodai	#   Get the return type and function name and delete that from
183a43e4d55SJeroen Ruigrok/asmodai	#   the line. What is left is the possibly first function argument
184a43e4d55SJeroen Ruigrok/asmodai	#   if it is on the same line.
185a43e4d55SJeroen Ruigrok/asmodai	#
186a43e4d55SJeroen Ruigrok/asmodai	if (!intname) {
187a43e4d55SJeroen Ruigrok/asmodai		warnsrc("No interface name defined");
188a43e4d55SJeroen Ruigrok/asmodai		error = 1;
189a43e4d55SJeroen Ruigrok/asmodai		return;
190a43e4d55SJeroen Ruigrok/asmodai	}
191a43e4d55SJeroen Ruigrok/asmodai	sub(/^[^ 	]+[ 	]+/, "");
192a43e4d55SJeroen Ruigrok/asmodai	ret = $0;
193a43e4d55SJeroen Ruigrok/asmodai	sub(/[ 	]*\{.*$/, "", ret);
194a43e4d55SJeroen Ruigrok/asmodai	name = ret;
195a43e4d55SJeroen Ruigrok/asmodai	sub(/^.*[ 	]/, "", name);	# last element is name of method
196a43e4d55SJeroen Ruigrok/asmodai	sub(/[ 	]+[^ 	]+$/, "", ret);	# return type
197a43e4d55SJeroen Ruigrok/asmodai	debug("Method: name=" name " return type=" ret);
198a43e4d55SJeroen Ruigrok/asmodai
199a43e4d55SJeroen Ruigrok/asmodai	sub(/^[^\{]*\{[	 ]*/, "");
200a43e4d55SJeroen Ruigrok/asmodai
201a43e4d55SJeroen Ruigrok/asmodai	if (!name || !ret) {
202a43e4d55SJeroen Ruigrok/asmodai		debug($0);
203a43e4d55SJeroen Ruigrok/asmodai		warnsrc("Invalid method specification");
204a43e4d55SJeroen Ruigrok/asmodai		error = 1;
205a43e4d55SJeroen Ruigrok/asmodai		return;
206a43e4d55SJeroen Ruigrok/asmodai	}
207a43e4d55SJeroen Ruigrok/asmodai
208a43e4d55SJeroen Ruigrok/asmodai	if (name !~ /^[a-z_][a-z_0-9]*$/) {
209a43e4d55SJeroen Ruigrok/asmodai		warnsrc("Invalid method name '" name "', use [a-z_][a-z0-9_]*");
210a43e4d55SJeroen Ruigrok/asmodai		error = 1;
211a43e4d55SJeroen Ruigrok/asmodai		return;
212a43e4d55SJeroen Ruigrok/asmodai	}
213a43e4d55SJeroen Ruigrok/asmodai
214a43e4d55SJeroen Ruigrok/asmodai	if (methods[name]) {
215a43e4d55SJeroen Ruigrok/asmodai		warnsrc("Duplicate method name");
216a43e4d55SJeroen Ruigrok/asmodai		error = 1;
217a43e4d55SJeroen Ruigrok/asmodai		return;
218a43e4d55SJeroen Ruigrok/asmodai	}
219a43e4d55SJeroen Ruigrok/asmodai	methods[name] = name;
220a43e4d55SJeroen Ruigrok/asmodai
221a43e4d55SJeroen Ruigrok/asmodai	line = $0;
222a43e4d55SJeroen Ruigrok/asmodai	while (line !~ /\}/ && (getline < src) > 0) {
223a43e4d55SJeroen Ruigrok/asmodai		line = line " " $0;
224a43e4d55SJeroen Ruigrok/asmodai		lineno++
225a43e4d55SJeroen Ruigrok/asmodai	}
226a43e4d55SJeroen Ruigrok/asmodai
227a43e4d55SJeroen Ruigrok/asmodai	default = "";
228a43e4d55SJeroen Ruigrok/asmodai	if (!match(line, /\};?/)) {
229a43e4d55SJeroen Ruigrok/asmodai		warnsrc("Premature end of file");
230a43e4d55SJeroen Ruigrok/asmodai		error = 1;
231a43e4d55SJeroen Ruigrok/asmodai		return;
232a43e4d55SJeroen Ruigrok/asmodai	}
233a43e4d55SJeroen Ruigrok/asmodai	extra = substr(line, RSTART + RLENGTH);
234a43e4d55SJeroen Ruigrok/asmodai	if (extra ~ /[	 ]*DEFAULT[ 	]*[a-zA-Z_][a-zA-Z_0-9]*[ 	]*;/) {
235a43e4d55SJeroen Ruigrok/asmodai		default = extra;
236a43e4d55SJeroen Ruigrok/asmodai		sub(/.*DEFAULT[	 ]*/, "", default);
237a43e4d55SJeroen Ruigrok/asmodai		sub(/[; 	]+.*$/, "", default);
238a43e4d55SJeroen Ruigrok/asmodai	}
239a43e4d55SJeroen Ruigrok/asmodai	else if (extra && opt_d) {
240a43e4d55SJeroen Ruigrok/asmodai		#   Warn about garbage at end of line.
241a43e4d55SJeroen Ruigrok/asmodai		warnsrc("Ignored '" extra "'");
242a43e4d55SJeroen Ruigrok/asmodai	}
243a43e4d55SJeroen Ruigrok/asmodai	sub(/\};?.*$/, "", line);
244a43e4d55SJeroen Ruigrok/asmodai
245a43e4d55SJeroen Ruigrok/asmodai	#
246a43e4d55SJeroen Ruigrok/asmodai	#   Create a list of variables without the types prepended.
247a43e4d55SJeroen Ruigrok/asmodai	#
248a43e4d55SJeroen Ruigrok/asmodai	sub(/^[	 ]+/, "", line);	# remove leading ...
249a43e4d55SJeroen Ruigrok/asmodai	sub(/[ 	]+$/, "", line);	# ... and trailing whitespace
250a43e4d55SJeroen Ruigrok/asmodai	gsub(/[	 ]+/, " ", line);	# remove double spaces
251a43e4d55SJeroen Ruigrok/asmodai
252a43e4d55SJeroen Ruigrok/asmodai	num_arguments = split(line, arguments, / *; */) - 1;
253a43e4d55SJeroen Ruigrok/asmodai	delete varnames;		# list of varnames
254a43e4d55SJeroen Ruigrok/asmodai	num_varnames = 0;
255a43e4d55SJeroen Ruigrok/asmodai	for (i = 1; i <= num_arguments; i++) {
256a43e4d55SJeroen Ruigrok/asmodai		if (!arguments[i])
257a43e4d55SJeroen Ruigrok/asmodai			continue;	# skip argument if argument is empty
258a43e4d55SJeroen Ruigrok/asmodai		num_ar = split(arguments[i], ar, /[* 	]+/);
259a43e4d55SJeroen Ruigrok/asmodai		if (num_ar < 2) {	# only 1 word in argument?
260a43e4d55SJeroen Ruigrok/asmodai			warnsrc("no type for '" arguments[i] "'");
261a43e4d55SJeroen Ruigrok/asmodai			error = 1;
262a43e4d55SJeroen Ruigrok/asmodai			return;
263a43e4d55SJeroen Ruigrok/asmodai		}
264a43e4d55SJeroen Ruigrok/asmodai		#   Last element is name of variable.
265a43e4d55SJeroen Ruigrok/asmodai		varnames[++num_varnames] = ar[num_ar];
266a43e4d55SJeroen Ruigrok/asmodai	}
267a43e4d55SJeroen Ruigrok/asmodai
268a43e4d55SJeroen Ruigrok/asmodai	argument_list = join(", ", arguments, num_arguments);
269a43e4d55SJeroen Ruigrok/asmodai	varname_list = join(", ", varnames, num_varnames);
270a43e4d55SJeroen Ruigrok/asmodai
271a43e4d55SJeroen Ruigrok/asmodai	if (opt_d) {
272a43e4d55SJeroen Ruigrok/asmodai		warn("Arguments: " argument_list);
273a43e4d55SJeroen Ruigrok/asmodai		warn("Varnames: " varname_list);
274a43e4d55SJeroen Ruigrok/asmodai	}
275a43e4d55SJeroen Ruigrok/asmodai
276a43e4d55SJeroen Ruigrok/asmodai	mname = intname "_" name;	# method name
277a43e4d55SJeroen Ruigrok/asmodai	umname = toupper(mname);	# uppercase method name
278a43e4d55SJeroen Ruigrok/asmodai
279a43e4d55SJeroen Ruigrok/asmodai	firstvar = varnames[1];
280a43e4d55SJeroen Ruigrok/asmodai
281a43e4d55SJeroen Ruigrok/asmodai	if (default == "")
282b3dd25cbSJoerg Sonnenberger		default = "kobj_error_method";
283a43e4d55SJeroen Ruigrok/asmodai
284a43e4d55SJeroen Ruigrok/asmodai	# the method description
285a43e4d55SJeroen Ruigrok/asmodai	printh("extern struct kobjop_desc " mname "_desc;");
286a43e4d55SJeroen Ruigrok/asmodai	# the method typedef
287a43e4d55SJeroen Ruigrok/asmodai	prototype = "typedef " ret " " mname "_t(";
288a43e4d55SJeroen Ruigrok/asmodai	printh(format_line(prototype argument_list ");",
289a43e4d55SJeroen Ruigrok/asmodai	    line_width, length(prototype)));
290a43e4d55SJeroen Ruigrok/asmodai
291a43e4d55SJeroen Ruigrok/asmodai	# Print out the method desc
292a43e4d55SJeroen Ruigrok/asmodai	printc("struct kobjop_desc " mname "_desc = {");
2930e0fd600SSascha Wildner	printc("\t0, { &" mname "_desc, (kobjop_t)" default " }");
294a43e4d55SJeroen Ruigrok/asmodai	printc("};\n");
295a43e4d55SJeroen Ruigrok/asmodai
296a43e4d55SJeroen Ruigrok/asmodai	# Print out the method itself
297a43e4d55SJeroen Ruigrok/asmodai	if (0) {		# haven't chosen the format yet
298a43e4d55SJeroen Ruigrok/asmodai		printh("static __inline " ret " " umname "(" varname_list ")");
299a43e4d55SJeroen Ruigrok/asmodai		printh("\t" join(";\n\t", arguments, num_arguments) ";");
300a43e4d55SJeroen Ruigrok/asmodai	}
301a43e4d55SJeroen Ruigrok/asmodai	else {
302a43e4d55SJeroen Ruigrok/asmodai		prototype = "static __inline " ret " " umname "(";
303a43e4d55SJeroen Ruigrok/asmodai		printh(format_line(prototype argument_list ")",
304a43e4d55SJeroen Ruigrok/asmodai		    line_width, length(prototype)));
305a43e4d55SJeroen Ruigrok/asmodai	}
306a43e4d55SJeroen Ruigrok/asmodai	printh("{");
307a43e4d55SJeroen Ruigrok/asmodai	printh("\tkobjop_t _m;");
308a43e4d55SJeroen Ruigrok/asmodai	if (!static)
309a43e4d55SJeroen Ruigrok/asmodai		firstvar = "((kobj_t)" firstvar ")";
310a43e4d55SJeroen Ruigrok/asmodai	printh("\tKOBJOPLOOKUP(" firstvar "->ops, " mname ");");
311a43e4d55SJeroen Ruigrok/asmodai	retrn =  (ret != "void") ? "return " : "";
312a43e4d55SJeroen Ruigrok/asmodai	printh("\t" retrn "((" mname "_t *) _m)(" varname_list ");");
313a43e4d55SJeroen Ruigrok/asmodai	printh("}\n");
314a43e4d55SJeroen Ruigrok/asmodai}
315a43e4d55SJeroen Ruigrok/asmodai
316a43e4d55SJeroen Ruigrok/asmodai#
317a43e4d55SJeroen Ruigrok/asmodai#   Begin of the main program.
318a43e4d55SJeroen Ruigrok/asmodai#
319a43e4d55SJeroen Ruigrok/asmodai
320a43e4d55SJeroen Ruigrok/asmodaiBEGIN {
321a43e4d55SJeroen Ruigrok/asmodai
322a43e4d55SJeroen Ruigrok/asmodailine_width = 80;
323a43e4d55SJeroen Ruigrok/asmodaigerror = 0;
324a43e4d55SJeroen Ruigrok/asmodai
325a43e4d55SJeroen Ruigrok/asmodai#
326a43e4d55SJeroen Ruigrok/asmodai#   Process the command line.
327a43e4d55SJeroen Ruigrok/asmodai#
328a43e4d55SJeroen Ruigrok/asmodai
329a43e4d55SJeroen Ruigrok/asmodainum_files = 0;
330a43e4d55SJeroen Ruigrok/asmodai
331a43e4d55SJeroen Ruigrok/asmodaifor (i = 1; i < ARGC; i++) {
332a43e4d55SJeroen Ruigrok/asmodai	if (ARGV[i] ~ /^-/) {
333a43e4d55SJeroen Ruigrok/asmodai		#
334a43e4d55SJeroen Ruigrok/asmodai		#   awk doesn't have getopt(), so we have to do it ourselves.
335a43e4d55SJeroen Ruigrok/asmodai		#   This is a bit clumsy, but it works.
336a43e4d55SJeroen Ruigrok/asmodai		#
337a43e4d55SJeroen Ruigrok/asmodai		for (j = 2; j <= length(ARGV[i]); j++) {
338a43e4d55SJeroen Ruigrok/asmodai			o = substr(ARGV[i], j, 1);
339a43e4d55SJeroen Ruigrok/asmodai			if	(o == "c")	opt_c = 1;
340a43e4d55SJeroen Ruigrok/asmodai			else if	(o == "h")	opt_h = 1;
341a43e4d55SJeroen Ruigrok/asmodai			else if	(o == "p")	opt_p = 1;
342a43e4d55SJeroen Ruigrok/asmodai			else if	(o == "d")	opt_d = 1;
343a43e4d55SJeroen Ruigrok/asmodai			else if	(o == "l") {
344a43e4d55SJeroen Ruigrok/asmodai				if (length(ARGV[i]) > j) {
345a43e4d55SJeroen Ruigrok/asmodai					opt_l = substr(ARGV[i], j + 1);
346a43e4d55SJeroen Ruigrok/asmodai					break;
347a43e4d55SJeroen Ruigrok/asmodai				}
348a43e4d55SJeroen Ruigrok/asmodai				else {
349a43e4d55SJeroen Ruigrok/asmodai					if (++i < ARGC)
350a43e4d55SJeroen Ruigrok/asmodai						opt_l = ARGV[i];
351a43e4d55SJeroen Ruigrok/asmodai					else
352a43e4d55SJeroen Ruigrok/asmodai						usage();
353a43e4d55SJeroen Ruigrok/asmodai				}
354a43e4d55SJeroen Ruigrok/asmodai			}
355a43e4d55SJeroen Ruigrok/asmodai			else
356a43e4d55SJeroen Ruigrok/asmodai				usage();
357a43e4d55SJeroen Ruigrok/asmodai		}
358a43e4d55SJeroen Ruigrok/asmodai	}
359a43e4d55SJeroen Ruigrok/asmodai	else if (ARGV[i] ~ /\.m$/)
360a43e4d55SJeroen Ruigrok/asmodai		filenames[num_files++] = ARGV[i];
361a43e4d55SJeroen Ruigrok/asmodai	else
362a43e4d55SJeroen Ruigrok/asmodai		usage();
363a43e4d55SJeroen Ruigrok/asmodai}
364a43e4d55SJeroen Ruigrok/asmodai
365a43e4d55SJeroen Ruigrok/asmodaiif (!num_files || !(opt_c || opt_h))
366a43e4d55SJeroen Ruigrok/asmodai	usage();
367a43e4d55SJeroen Ruigrok/asmodai
368a43e4d55SJeroen Ruigrok/asmodaiif (opt_p)
369a43e4d55SJeroen Ruigrok/asmodai	debug("Will produce files in original not in current directory");
370a43e4d55SJeroen Ruigrok/asmodai
371a43e4d55SJeroen Ruigrok/asmodaiif (opt_l) {
372a43e4d55SJeroen Ruigrok/asmodai	if (opt_l !~ /^[0-9]+$/ || opt_l < 1)
373a43e4d55SJeroen Ruigrok/asmodai		die("Invalid line width '" opt_l "'");
374a43e4d55SJeroen Ruigrok/asmodai	line_width = opt_l;
375a43e4d55SJeroen Ruigrok/asmodai	debug("Line width set to " line_width);
376a43e4d55SJeroen Ruigrok/asmodai}
377a43e4d55SJeroen Ruigrok/asmodai
378a43e4d55SJeroen Ruigrok/asmodaifor (i = 0; i < num_files; i++)
379a43e4d55SJeroen Ruigrok/asmodai	debug("Filename: " filenames[i]);
380a43e4d55SJeroen Ruigrok/asmodai
381a43e4d55SJeroen Ruigrok/asmodaifor (file_i = 0; file_i < num_files; file_i++) {
382a43e4d55SJeroen Ruigrok/asmodai	src = filenames[file_i];
383a43e4d55SJeroen Ruigrok/asmodai	cfilename = hfilename = src;
384a43e4d55SJeroen Ruigrok/asmodai	sub(/\.m$/, ".c", cfilename);
385a43e4d55SJeroen Ruigrok/asmodai	sub(/\.m$/, ".h", hfilename);
386a43e4d55SJeroen Ruigrok/asmodai	if (!opt_p) {
387a43e4d55SJeroen Ruigrok/asmodai		sub(/^.*\//, "", cfilename);
388a43e4d55SJeroen Ruigrok/asmodai		sub(/^.*\//, "", hfilename);
389a43e4d55SJeroen Ruigrok/asmodai	}
390a43e4d55SJeroen Ruigrok/asmodai
391a43e4d55SJeroen Ruigrok/asmodai	debug("Processing from " src " to " cfilename " / " hfilename);
392a43e4d55SJeroen Ruigrok/asmodai
393a43e4d55SJeroen Ruigrok/asmodai	ctmpfilename = cfilename ".tmp";
394a43e4d55SJeroen Ruigrok/asmodai	htmpfilename = hfilename ".tmp";
395a43e4d55SJeroen Ruigrok/asmodai
396a43e4d55SJeroen Ruigrok/asmodai	common_head = \
397a43e4d55SJeroen Ruigrok/asmodai	    "/*\n" \
398a43e4d55SJeroen Ruigrok/asmodai	    " * This file is produced automatically.\n" \
399a43e4d55SJeroen Ruigrok/asmodai	    " * Do not modify anything in here by hand.\n" \
400a43e4d55SJeroen Ruigrok/asmodai	    " *\n" \
401a43e4d55SJeroen Ruigrok/asmodai	    " * Created from source file\n" \
402a43e4d55SJeroen Ruigrok/asmodai	    " *   " src "\n" \
403a43e4d55SJeroen Ruigrok/asmodai	    " * with\n" \
404a43e4d55SJeroen Ruigrok/asmodai	    " *   makeobjops.awk\n" \
405a43e4d55SJeroen Ruigrok/asmodai	    " *\n" \
406a43e4d55SJeroen Ruigrok/asmodai	    " * See the source file for legal information\n" \
407a43e4d55SJeroen Ruigrok/asmodai	    " */\n";
408a43e4d55SJeroen Ruigrok/asmodai
409a43e4d55SJeroen Ruigrok/asmodai	printc(common_head "\n" \
410a43e4d55SJeroen Ruigrok/asmodai	    "#include <sys/param.h>\n" \
411a43e4d55SJeroen Ruigrok/asmodai	    "#include <sys/queue.h>\n" \
412a43e4d55SJeroen Ruigrok/asmodai	    "#include <sys/kernel.h>\n" \
413a43e4d55SJeroen Ruigrok/asmodai	    "#include <sys/kobj.h>");
414a43e4d55SJeroen Ruigrok/asmodai
415a43e4d55SJeroen Ruigrok/asmodai	printh(common_head);
416a43e4d55SJeroen Ruigrok/asmodai
417a43e4d55SJeroen Ruigrok/asmodai	delete methods;		# clear list of methods
418a43e4d55SJeroen Ruigrok/asmodai	intname = "";
419a43e4d55SJeroen Ruigrok/asmodai	lineno = 0;
420a43e4d55SJeroen Ruigrok/asmodai	error = 0;		# to signal clean up and gerror setting
421a43e4d55SJeroen Ruigrok/asmodai
422a43e4d55SJeroen Ruigrok/asmodai	while (!error && (getline < src) > 0) {
423a43e4d55SJeroen Ruigrok/asmodai		lineno++;
424a43e4d55SJeroen Ruigrok/asmodai
425a43e4d55SJeroen Ruigrok/asmodai		#
426a43e4d55SJeroen Ruigrok/asmodai		#   Take special notice of include directives.
427a43e4d55SJeroen Ruigrok/asmodai		#
428a43e4d55SJeroen Ruigrok/asmodai		if (/^#[ 	]*include[ 	]+["<][^">]+[">]/) {
429a43e4d55SJeroen Ruigrok/asmodai			incld = $0;
430a43e4d55SJeroen Ruigrok/asmodai			sub(/^#[ 	]*include[ 	]+/, "", incld);
431a43e4d55SJeroen Ruigrok/asmodai			debug("Included file: " incld);
432a43e4d55SJeroen Ruigrok/asmodai			printc("#include " incld);
433a43e4d55SJeroen Ruigrok/asmodai		}
434a43e4d55SJeroen Ruigrok/asmodai
435a43e4d55SJeroen Ruigrok/asmodai		sub(/#.*/, "");		# remove comments
436a43e4d55SJeroen Ruigrok/asmodai		sub(/^[	 ]+/, "");	# remove leading ...
437a43e4d55SJeroen Ruigrok/asmodai		sub(/[ 	]+$/, "");	# ... and trailing whitespace
438a43e4d55SJeroen Ruigrok/asmodai
439a43e4d55SJeroen Ruigrok/asmodai		if (/^$/) {		# skip empty lines
440a43e4d55SJeroen Ruigrok/asmodai		}
441385a5296SSascha Wildner		else if (/^\/\*\*/)	# ... and doxygen comments
4425c89c3d7SSascha Wildner			while (!/\*\//) {
4435c89c3d7SSascha Wildner				getline < src;
4445c89c3d7SSascha Wildner				lineno++;
4455c89c3d7SSascha Wildner			}
446a43e4d55SJeroen Ruigrok/asmodai		else if (/^INTERFACE[ 	]+[^ 	;]*[ 	]*;?[ 	]*$/)
447a43e4d55SJeroen Ruigrok/asmodai			handle_interface();
448a43e4d55SJeroen Ruigrok/asmodai		else if (/^CODE[ 	]*{$/)
449a43e4d55SJeroen Ruigrok/asmodai			printc(handle_code());
450a43e4d55SJeroen Ruigrok/asmodai		else if (/^HEADER[	 ]*{$/)
451a43e4d55SJeroen Ruigrok/asmodai			printh(handle_code());
452a43e4d55SJeroen Ruigrok/asmodai		else if (/^METHOD/)
453a43e4d55SJeroen Ruigrok/asmodai			handle_method(0);
454a43e4d55SJeroen Ruigrok/asmodai		else if (/^STATICMETHOD/)
455a43e4d55SJeroen Ruigrok/asmodai			handle_method(1);
456a43e4d55SJeroen Ruigrok/asmodai		else {
457a43e4d55SJeroen Ruigrok/asmodai			debug($0);
458a43e4d55SJeroen Ruigrok/asmodai			warnsrc("Invalid line encountered");
459a43e4d55SJeroen Ruigrok/asmodai			error = 1;
460a43e4d55SJeroen Ruigrok/asmodai		}
461a43e4d55SJeroen Ruigrok/asmodai	}
462a43e4d55SJeroen Ruigrok/asmodai
463a43e4d55SJeroen Ruigrok/asmodai	#
464a43e4d55SJeroen Ruigrok/asmodai	#   Print the final '#endif' in the header file.
465a43e4d55SJeroen Ruigrok/asmodai	#
466a43e4d55SJeroen Ruigrok/asmodai	printh("#endif /* _" intname "_if_h_ */");
467a43e4d55SJeroen Ruigrok/asmodai
468a43e4d55SJeroen Ruigrok/asmodai	close (ctmpfilename);
469a43e4d55SJeroen Ruigrok/asmodai	close (htmpfilename);
470a43e4d55SJeroen Ruigrok/asmodai
471a43e4d55SJeroen Ruigrok/asmodai	if (error) {
472a43e4d55SJeroen Ruigrok/asmodai		warn("Output skipped");
473a43e4d55SJeroen Ruigrok/asmodai		system_check("rm -f " ctmpfilename " " htmpfilename);
474a43e4d55SJeroen Ruigrok/asmodai		gerror = 1;
475a43e4d55SJeroen Ruigrok/asmodai	}
476a43e4d55SJeroen Ruigrok/asmodai	else {
477a43e4d55SJeroen Ruigrok/asmodai		if (opt_c)
478a43e4d55SJeroen Ruigrok/asmodai			system_check("mv -f " ctmpfilename " " cfilename);
479a43e4d55SJeroen Ruigrok/asmodai		if (opt_h)
480a43e4d55SJeroen Ruigrok/asmodai			system_check("mv -f " htmpfilename " " hfilename);
481a43e4d55SJeroen Ruigrok/asmodai	}
482a43e4d55SJeroen Ruigrok/asmodai}
483a43e4d55SJeroen Ruigrok/asmodai
484a43e4d55SJeroen Ruigrok/asmodaiexit gerror;
485a43e4d55SJeroen Ruigrok/asmodai
486a43e4d55SJeroen Ruigrok/asmodai}
487