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