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