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# $FreeBSD$ 40dfbf15eeSDavid E. O'Brien 41dfbf15eeSDavid E. O'Brien# 42dfbf15eeSDavid E. O'Brien# Script to produce kobj front-end sugar. 43dfbf15eeSDavid E. O'Brien# 44dfbf15eeSDavid E. O'Brien 45dfbf15eeSDavid E. O'Brienfunction usage () 46dfbf15eeSDavid E. O'Brien{ 47dfbf15eeSDavid E. O'Brien print "usage: makeobjops.awk <srcfile.m> [-d] [-p] [-l <nr>] [-c|-h]"; 48dfbf15eeSDavid E. O'Brien print "where -c produce only .c files"; 49dfbf15eeSDavid E. O'Brien print " -h produce only .h files"; 50dfbf15eeSDavid E. O'Brien print " -p use the path component in the source file for destination dir"; 51dfbf15eeSDavid E. O'Brien print " -l set line width for output files [80]"; 52dfbf15eeSDavid E. O'Brien print " -d switch on debugging"; 53dfbf15eeSDavid E. O'Brien exit 1; 54dfbf15eeSDavid E. O'Brien} 55dfbf15eeSDavid E. O'Brien 56dfbf15eeSDavid E. O'Brienfunction warn (msg) 57dfbf15eeSDavid E. O'Brien{ 58dfbf15eeSDavid E. O'Brien print "makeobjops.awk:", msg > "/dev/stderr"; 59dfbf15eeSDavid E. O'Brien} 60dfbf15eeSDavid E. O'Brien 61dfbf15eeSDavid E. O'Brienfunction warnsrc (msg) 62dfbf15eeSDavid E. O'Brien{ 63dfbf15eeSDavid E. O'Brien warn(src ":" lineno ": " msg); 64dfbf15eeSDavid E. O'Brien} 65dfbf15eeSDavid E. O'Brien 66dfbf15eeSDavid E. O'Brienfunction debug (msg) 67dfbf15eeSDavid E. O'Brien{ 68dfbf15eeSDavid E. O'Brien if (opt_d) 69dfbf15eeSDavid E. O'Brien warn(msg); 70dfbf15eeSDavid E. O'Brien} 71dfbf15eeSDavid E. O'Brien 72dfbf15eeSDavid E. O'Brienfunction die (msg) 73dfbf15eeSDavid E. O'Brien{ 74dfbf15eeSDavid E. O'Brien warn(msg); 75dfbf15eeSDavid E. O'Brien exit 1; 76dfbf15eeSDavid E. O'Brien} 77dfbf15eeSDavid E. O'Brien 78dfbf15eeSDavid E. O'Brien# These are just for convenience ... 79dfbf15eeSDavid E. O'Brienfunction printc(s) {if (opt_c) print s > ctmpfilename;} 80dfbf15eeSDavid E. O'Brienfunction printh(s) {if (opt_h) print s > htmpfilename;} 81dfbf15eeSDavid E. O'Brien 82dfbf15eeSDavid E. O'Brien# 83dfbf15eeSDavid E. O'Brien# If a line exceeds maxlength, split it into multiple 84dfbf15eeSDavid E. O'Brien# lines at commas. Subsequent lines are indented by 85dfbf15eeSDavid E. O'Brien# the specified number of spaces. 86dfbf15eeSDavid E. O'Brien# 87dfbf15eeSDavid E. O'Brien# In other words: Lines are split by replacing ", " 88dfbf15eeSDavid E. O'Brien# by ",\n" plus indent spaces. 89dfbf15eeSDavid E. O'Brien# 90dfbf15eeSDavid E. O'Brien 91dfbf15eeSDavid E. O'Brienfunction format_line (line, maxlength, indent) 92dfbf15eeSDavid E. O'Brien{ 93dfbf15eeSDavid E. O'Brien rline = ""; 94dfbf15eeSDavid E. O'Brien 95dfbf15eeSDavid E. O'Brien while (length(line) > maxlength) { 96dfbf15eeSDavid E. O'Brien # 97dfbf15eeSDavid E. O'Brien # Find the rightmost ", " so that the part 98dfbf15eeSDavid E. O'Brien # to the left of it is just within maxlength. 99dfbf15eeSDavid E. O'Brien # If there is none, give up and leave it as-is. 100dfbf15eeSDavid E. O'Brien # 101dfbf15eeSDavid E. O'Brien if (!match(substr(line, 1, maxlength + 1), /^.*, /)) 102dfbf15eeSDavid E. O'Brien break; 103dfbf15eeSDavid E. O'Brien rline = rline substr(line, 1, RLENGTH - 1) "\n"; 104dfbf15eeSDavid E. O'Brien line = sprintf("%*s", indent, "") substr(line, RLENGTH + 1); 105dfbf15eeSDavid E. O'Brien } 106dfbf15eeSDavid E. O'Brien return rline line; 107dfbf15eeSDavid E. O'Brien} 108dfbf15eeSDavid E. O'Brien 109dfbf15eeSDavid E. O'Brien# 110dfbf15eeSDavid E. O'Brien# Join an array into a string. 111dfbf15eeSDavid E. O'Brien# 112dfbf15eeSDavid E. O'Brien 113dfbf15eeSDavid E. O'Brienfunction join (separator, array, num) 114dfbf15eeSDavid E. O'Brien{ 115dfbf15eeSDavid E. O'Brien _result = "" 116dfbf15eeSDavid E. O'Brien if (num) { 117dfbf15eeSDavid E. O'Brien while (num > 1) 118dfbf15eeSDavid E. O'Brien _result = separator array[num--] _result; 119dfbf15eeSDavid E. O'Brien _result = array[1] _result; 120dfbf15eeSDavid E. O'Brien } 121dfbf15eeSDavid E. O'Brien return _result; 122dfbf15eeSDavid E. O'Brien} 123dfbf15eeSDavid E. O'Brien 124dfbf15eeSDavid E. O'Brien# 125dfbf15eeSDavid E. O'Brien# Execute a system command and report if it failed. 126dfbf15eeSDavid E. O'Brien# 127dfbf15eeSDavid E. O'Brien 128dfbf15eeSDavid E. O'Brienfunction system_check (cmd) 129dfbf15eeSDavid E. O'Brien{ 130dfbf15eeSDavid E. O'Brien if ((rc = system(cmd))) 131dfbf15eeSDavid E. O'Brien warn(cmd " failed (" rc ")"); 132dfbf15eeSDavid E. O'Brien} 133dfbf15eeSDavid E. O'Brien 134dfbf15eeSDavid E. O'Brien# 135dfbf15eeSDavid E. O'Brien# Handle "INTERFACE" line. 136dfbf15eeSDavid E. O'Brien# 137dfbf15eeSDavid E. O'Brien 138dfbf15eeSDavid E. O'Brienfunction handle_interface () 139dfbf15eeSDavid E. O'Brien{ 140dfbf15eeSDavid E. O'Brien intname = $2; 141dfbf15eeSDavid E. O'Brien sub(/;$/, "", intname); 142dfbf15eeSDavid E. O'Brien if (intname !~ /^[a-z_][a-z0-9_]*$/) { 143dfbf15eeSDavid E. O'Brien debug($0); 144dfbf15eeSDavid E. O'Brien warnsrc("Invalid interface name '" intname "', use [a-z_][a-z0-9_]*"); 145dfbf15eeSDavid E. O'Brien error = 1; 146dfbf15eeSDavid E. O'Brien return; 147dfbf15eeSDavid E. O'Brien } 148dfbf15eeSDavid E. O'Brien if (!/;[ ]*$/) 149dfbf15eeSDavid E. O'Brien warnsrc("Semicolon missing at end of line, no problem"); 150dfbf15eeSDavid E. O'Brien 151dfbf15eeSDavid E. O'Brien debug("Interface " intname); 152dfbf15eeSDavid E. O'Brien 153dfbf15eeSDavid E. O'Brien printh("#ifndef _" intname "_if_h_"); 154dfbf15eeSDavid E. O'Brien printh("#define _" intname "_if_h_\n"); 155dfbf15eeSDavid E. O'Brien printc("#include \"" intname "_if.h\"\n"); 156dfbf15eeSDavid E. O'Brien} 157dfbf15eeSDavid E. O'Brien 158dfbf15eeSDavid E. O'Brien# 1598ff7da8cSDoug Rabson# Pass doc comments through to the C file 1608ff7da8cSDoug Rabson# 1618ff7da8cSDoug Rabsonfunction handle_doc () 1628ff7da8cSDoug Rabson{ 1638ff7da8cSDoug Rabson doc = "" 1648ff7da8cSDoug Rabson while (!/\*\//) { 1658ff7da8cSDoug Rabson doc = doc $0 "\n"; 1668ff7da8cSDoug Rabson getline < src; 1678ff7da8cSDoug Rabson lineno++; 1688ff7da8cSDoug Rabson } 1698ff7da8cSDoug Rabson doc = doc $0 "\n"; 1708ff7da8cSDoug Rabson return doc; 1718ff7da8cSDoug Rabson} 1728ff7da8cSDoug Rabson 1738ff7da8cSDoug Rabson# 174dfbf15eeSDavid E. O'Brien# Handle "CODE" and "HEADER" sections. 175dfbf15eeSDavid E. O'Brien# Returns the code as-is. 176dfbf15eeSDavid E. O'Brien# 177dfbf15eeSDavid E. O'Brien 178dfbf15eeSDavid E. O'Brienfunction handle_code () 179dfbf15eeSDavid E. O'Brien{ 180dfbf15eeSDavid E. O'Brien code = "\n"; 181dfbf15eeSDavid E. O'Brien getline < src; 182dfbf15eeSDavid E. O'Brien indent = $0; 183dfbf15eeSDavid E. O'Brien sub(/[^ ].*$/, "", indent); # find the indent used 184dfbf15eeSDavid E. O'Brien while (!/^}/) { 185dfbf15eeSDavid E. O'Brien sub("^" indent, ""); # remove the indent 186dfbf15eeSDavid E. O'Brien code = code $0 "\n"; 187dfbf15eeSDavid E. O'Brien getline < src; 188dfbf15eeSDavid E. O'Brien lineno++;; 189dfbf15eeSDavid E. O'Brien } 190dfbf15eeSDavid E. O'Brien return code; 191dfbf15eeSDavid E. O'Brien} 192dfbf15eeSDavid E. O'Brien 193dfbf15eeSDavid E. O'Brien# 194dfbf15eeSDavid E. O'Brien# Handle "METHOD" and "STATICMETHOD" sections. 195dfbf15eeSDavid E. O'Brien# 196dfbf15eeSDavid E. O'Brien 1978ff7da8cSDoug Rabsonfunction handle_method (static, doc) 198dfbf15eeSDavid E. O'Brien{ 199dfbf15eeSDavid E. O'Brien # 200dfbf15eeSDavid E. O'Brien # Get the return type and function name and delete that from 201dfbf15eeSDavid E. O'Brien # the line. What is left is the possibly first function argument 202dfbf15eeSDavid E. O'Brien # if it is on the same line. 203dfbf15eeSDavid E. O'Brien # 204dfbf15eeSDavid E. O'Brien if (!intname) { 205dfbf15eeSDavid E. O'Brien warnsrc("No interface name defined"); 206dfbf15eeSDavid E. O'Brien error = 1; 207dfbf15eeSDavid E. O'Brien return; 208dfbf15eeSDavid E. O'Brien } 209dfbf15eeSDavid E. O'Brien sub(/^[^ ]+[ ]+/, ""); 210dfbf15eeSDavid E. O'Brien ret = $0; 211dfbf15eeSDavid E. O'Brien sub(/[ ]*\{.*$/, "", ret); 212dfbf15eeSDavid E. O'Brien name = ret; 213dfbf15eeSDavid E. O'Brien sub(/^.*[ ]/, "", name); # last element is name of method 214dfbf15eeSDavid E. O'Brien sub(/[ ]+[^ ]+$/, "", ret); # return type 215dfbf15eeSDavid E. O'Brien debug("Method: name=" name " return type=" ret); 216dfbf15eeSDavid E. O'Brien 217dfbf15eeSDavid E. O'Brien sub(/^[^\{]*\{[ ]*/, ""); 218dfbf15eeSDavid E. O'Brien 219dfbf15eeSDavid E. O'Brien if (!name || !ret) { 220dfbf15eeSDavid E. O'Brien debug($0); 221dfbf15eeSDavid E. O'Brien warnsrc("Invalid method specification"); 222dfbf15eeSDavid E. O'Brien error = 1; 223dfbf15eeSDavid E. O'Brien return; 224dfbf15eeSDavid E. O'Brien } 225dfbf15eeSDavid E. O'Brien 226dfbf15eeSDavid E. O'Brien if (name !~ /^[a-z_][a-z_0-9]*$/) { 227dfbf15eeSDavid E. O'Brien warnsrc("Invalid method name '" name "', use [a-z_][a-z0-9_]*"); 228dfbf15eeSDavid E. O'Brien error = 1; 229dfbf15eeSDavid E. O'Brien return; 230dfbf15eeSDavid E. O'Brien } 231dfbf15eeSDavid E. O'Brien 232dfbf15eeSDavid E. O'Brien if (methods[name]) { 233dfbf15eeSDavid E. O'Brien warnsrc("Duplicate method name"); 234dfbf15eeSDavid E. O'Brien error = 1; 235dfbf15eeSDavid E. O'Brien return; 236dfbf15eeSDavid E. O'Brien } 237dfbf15eeSDavid E. O'Brien methods[name] = name; 238dfbf15eeSDavid E. O'Brien 239dfbf15eeSDavid E. O'Brien line = $0; 240dfbf15eeSDavid E. O'Brien while (line !~ /\}/ && (getline < src) > 0) { 241dfbf15eeSDavid E. O'Brien line = line " " $0; 242dfbf15eeSDavid E. O'Brien lineno++ 243dfbf15eeSDavid E. O'Brien } 244dfbf15eeSDavid E. O'Brien 24597aa4d98SEd Maste default_function = ""; 246dfbf15eeSDavid E. O'Brien if (!match(line, /\};?/)) { 247dfbf15eeSDavid E. O'Brien warnsrc("Premature end of file"); 248dfbf15eeSDavid E. O'Brien error = 1; 249dfbf15eeSDavid E. O'Brien return; 250dfbf15eeSDavid E. O'Brien } 251dfbf15eeSDavid E. O'Brien extra = substr(line, RSTART + RLENGTH); 252dfbf15eeSDavid E. O'Brien if (extra ~ /[ ]*DEFAULT[ ]*[a-zA-Z_][a-zA-Z_0-9]*[ ]*;/) { 25397aa4d98SEd Maste default_function = extra; 25497aa4d98SEd Maste sub(/.*DEFAULT[ ]*/, "", default_function); 25597aa4d98SEd Maste sub(/[; ]+.*$/, "", default_function); 256dfbf15eeSDavid E. O'Brien } 257dfbf15eeSDavid E. O'Brien else if (extra && opt_d) { 258dfbf15eeSDavid E. O'Brien # Warn about garbage at end of line. 259dfbf15eeSDavid E. O'Brien warnsrc("Ignored '" extra "'"); 260dfbf15eeSDavid E. O'Brien } 261dfbf15eeSDavid E. O'Brien sub(/\};?.*$/, "", line); 262dfbf15eeSDavid E. O'Brien 263dfbf15eeSDavid E. O'Brien # 264dfbf15eeSDavid E. O'Brien # Create a list of variables without the types prepended. 265dfbf15eeSDavid E. O'Brien # 266dfbf15eeSDavid E. O'Brien sub(/^[ ]+/, "", line); # remove leading ... 267dfbf15eeSDavid E. O'Brien sub(/[ ]+$/, "", line); # ... and trailing whitespace 268dfbf15eeSDavid E. O'Brien gsub(/[ ]+/, " ", line); # remove double spaces 269dfbf15eeSDavid E. O'Brien 270dfbf15eeSDavid E. O'Brien num_arguments = split(line, arguments, / *; */) - 1; 271dfbf15eeSDavid E. O'Brien delete varnames; # list of varnames 272dfbf15eeSDavid E. O'Brien num_varnames = 0; 273dfbf15eeSDavid E. O'Brien for (i = 1; i <= num_arguments; i++) { 274dfbf15eeSDavid E. O'Brien if (!arguments[i]) 275dfbf15eeSDavid E. O'Brien continue; # skip argument if argument is empty 276dfbf15eeSDavid E. O'Brien num_ar = split(arguments[i], ar, /[* ]+/); 277dfbf15eeSDavid E. O'Brien if (num_ar < 2) { # only 1 word in argument? 278dfbf15eeSDavid E. O'Brien warnsrc("no type for '" arguments[i] "'"); 279dfbf15eeSDavid E. O'Brien error = 1; 280dfbf15eeSDavid E. O'Brien return; 281dfbf15eeSDavid E. O'Brien } 282dfbf15eeSDavid E. O'Brien # Last element is name of variable. 283dfbf15eeSDavid E. O'Brien varnames[++num_varnames] = ar[num_ar]; 284dfbf15eeSDavid E. O'Brien } 285dfbf15eeSDavid E. O'Brien 286dfbf15eeSDavid E. O'Brien argument_list = join(", ", arguments, num_arguments); 287dfbf15eeSDavid E. O'Brien varname_list = join(", ", varnames, num_varnames); 288dfbf15eeSDavid E. O'Brien 289dfbf15eeSDavid E. O'Brien if (opt_d) { 290dfbf15eeSDavid E. O'Brien warn("Arguments: " argument_list); 291dfbf15eeSDavid E. O'Brien warn("Varnames: " varname_list); 292dfbf15eeSDavid E. O'Brien } 293dfbf15eeSDavid E. O'Brien 294dfbf15eeSDavid E. O'Brien mname = intname "_" name; # method name 295dfbf15eeSDavid E. O'Brien umname = toupper(mname); # uppercase method name 296dfbf15eeSDavid E. O'Brien 297dfbf15eeSDavid E. O'Brien firstvar = varnames[1]; 298dfbf15eeSDavid E. O'Brien 29997aa4d98SEd Maste if (default_function == "") 30097aa4d98SEd Maste default_function = "kobj_error_method"; 301dfbf15eeSDavid E. O'Brien 302dfbf15eeSDavid E. O'Brien # the method description 3038ff7da8cSDoug Rabson printh("/** @brief Unique descriptor for the " umname "() method */"); 304dfbf15eeSDavid E. O'Brien printh("extern struct kobjop_desc " mname "_desc;"); 305dfbf15eeSDavid E. O'Brien # the method typedef 3068ff7da8cSDoug Rabson printh("/** @brief A function implementing the " umname "() method */"); 307dfbf15eeSDavid E. O'Brien prototype = "typedef " ret " " mname "_t("; 308dfbf15eeSDavid E. O'Brien printh(format_line(prototype argument_list ");", 309dfbf15eeSDavid E. O'Brien line_width, length(prototype))); 310dfbf15eeSDavid E. O'Brien 3115cac9fa0SEd Schouten # Print out the method desc 312dfbf15eeSDavid E. O'Brien printc("struct kobjop_desc " mname "_desc = {"); 313d09ebcecSEd Schouten printc("\t0, { &" mname "_desc, (kobjop_t)" default_function " }"); 314dfbf15eeSDavid E. O'Brien printc("};\n"); 315dfbf15eeSDavid E. O'Brien 316dfbf15eeSDavid E. O'Brien # Print out the method itself 3178ff7da8cSDoug Rabson printh(doc); 318dfbf15eeSDavid E. O'Brien if (0) { # haven't chosen the format yet 319dfbf15eeSDavid E. O'Brien printh("static __inline " ret " " umname "(" varname_list ")"); 320dfbf15eeSDavid E. O'Brien printh("\t" join(";\n\t", arguments, num_arguments) ";"); 321dfbf15eeSDavid E. O'Brien } 322dfbf15eeSDavid E. O'Brien else { 323dfbf15eeSDavid E. O'Brien prototype = "static __inline " ret " " umname "("; 324dfbf15eeSDavid E. O'Brien printh(format_line(prototype argument_list ")", 325dfbf15eeSDavid E. O'Brien line_width, length(prototype))); 326dfbf15eeSDavid E. O'Brien } 327dfbf15eeSDavid E. O'Brien printh("{"); 328*de8dd262SJustin Hibbits if (singleton) 329*de8dd262SJustin Hibbits printh("\tstatic kobjop_t _m;"); 330*de8dd262SJustin Hibbits else 331dfbf15eeSDavid E. O'Brien printh("\tkobjop_t _m;"); 332a21a2da5SColin Percival if (ret != "void") 333a21a2da5SColin Percival printh("\t" ret " rc;"); 334dfbf15eeSDavid E. O'Brien if (!static) 335dfbf15eeSDavid E. O'Brien firstvar = "((kobj_t)" firstvar ")"; 336a21a2da5SColin Percival if (prolog != "") 337a21a2da5SColin Percival printh(prolog); 338*de8dd262SJustin Hibbits if (singleton) 339*de8dd262SJustin Hibbits printh("\tif (_m == NULL)"); 340dfbf15eeSDavid E. O'Brien printh("\tKOBJOPLOOKUP(" firstvar "->ops," mname ");"); 341a21a2da5SColin Percival rceq = (ret != "void") ? "rc = " : ""; 342a21a2da5SColin Percival printh("\t" rceq "((" mname "_t *) _m)(" varname_list ");"); 343a21a2da5SColin Percival if (epilog != "") 344a21a2da5SColin Percival printh(epilog); 345a21a2da5SColin Percival if (ret != "void") 346a21a2da5SColin Percival printh("\treturn (rc);"); 347dfbf15eeSDavid E. O'Brien printh("}\n"); 348dfbf15eeSDavid E. O'Brien} 349dfbf15eeSDavid E. O'Brien 350dfbf15eeSDavid E. O'Brien# 351dfbf15eeSDavid E. O'Brien# Begin of the main program. 352dfbf15eeSDavid E. O'Brien# 353dfbf15eeSDavid E. O'Brien 354dfbf15eeSDavid E. O'BrienBEGIN { 355dfbf15eeSDavid E. O'Brien 356dfbf15eeSDavid E. O'Brienline_width = 80; 357dfbf15eeSDavid E. O'Briengerror = 0; 358dfbf15eeSDavid E. O'Brien 359dfbf15eeSDavid E. O'Brien# 360dfbf15eeSDavid E. O'Brien# Process the command line. 361dfbf15eeSDavid E. O'Brien# 362dfbf15eeSDavid E. O'Brien 363dfbf15eeSDavid E. O'Briennum_files = 0; 364dfbf15eeSDavid E. O'Brien 365dfbf15eeSDavid E. O'Brienfor (i = 1; i < ARGC; i++) { 366dfbf15eeSDavid E. O'Brien if (ARGV[i] ~ /^-/) { 367dfbf15eeSDavid E. O'Brien # 368dfbf15eeSDavid E. O'Brien # awk doesn't have getopt(), so we have to do it ourselves. 369dfbf15eeSDavid E. O'Brien # This is a bit clumsy, but it works. 370dfbf15eeSDavid E. O'Brien # 371dfbf15eeSDavid E. O'Brien for (j = 2; j <= length(ARGV[i]); j++) { 372dfbf15eeSDavid E. O'Brien o = substr(ARGV[i], j, 1); 373dfbf15eeSDavid E. O'Brien if (o == "c") opt_c = 1; 374dfbf15eeSDavid E. O'Brien else if (o == "h") opt_h = 1; 375dfbf15eeSDavid E. O'Brien else if (o == "p") opt_p = 1; 376dfbf15eeSDavid E. O'Brien else if (o == "d") opt_d = 1; 377dfbf15eeSDavid E. O'Brien else if (o == "l") { 378dfbf15eeSDavid E. O'Brien if (length(ARGV[i]) > j) { 379dfbf15eeSDavid E. O'Brien opt_l = substr(ARGV[i], j + 1); 380dfbf15eeSDavid E. O'Brien break; 381dfbf15eeSDavid E. O'Brien } 382dfbf15eeSDavid E. O'Brien else { 383dfbf15eeSDavid E. O'Brien if (++i < ARGC) 384dfbf15eeSDavid E. O'Brien opt_l = ARGV[i]; 385dfbf15eeSDavid E. O'Brien else 386dfbf15eeSDavid E. O'Brien usage(); 387dfbf15eeSDavid E. O'Brien } 388dfbf15eeSDavid E. O'Brien } 389dfbf15eeSDavid E. O'Brien else 390dfbf15eeSDavid E. O'Brien usage(); 391dfbf15eeSDavid E. O'Brien } 392dfbf15eeSDavid E. O'Brien } 393dfbf15eeSDavid E. O'Brien else if (ARGV[i] ~ /\.m$/) 394dfbf15eeSDavid E. O'Brien filenames[num_files++] = ARGV[i]; 395dfbf15eeSDavid E. O'Brien else 396dfbf15eeSDavid E. O'Brien usage(); 397dfbf15eeSDavid E. O'Brien} 398dfbf15eeSDavid E. O'Brien 399dfbf15eeSDavid E. O'Brienif (!num_files || !(opt_c || opt_h)) 400dfbf15eeSDavid E. O'Brien usage(); 401dfbf15eeSDavid E. O'Brien 402dfbf15eeSDavid E. O'Brienif (opt_p) 403dfbf15eeSDavid E. O'Brien debug("Will produce files in original not in current directory"); 404dfbf15eeSDavid E. O'Brien 405dfbf15eeSDavid E. O'Brienif (opt_l) { 406dfbf15eeSDavid E. O'Brien if (opt_l !~ /^[0-9]+$/ || opt_l < 1) 407dfbf15eeSDavid E. O'Brien die("Invalid line width '" opt_l "'"); 408dfbf15eeSDavid E. O'Brien line_width = opt_l; 409dfbf15eeSDavid E. O'Brien debug("Line width set to " line_width); 410dfbf15eeSDavid E. O'Brien} 411dfbf15eeSDavid E. O'Brien 412dfbf15eeSDavid E. O'Brienfor (i = 0; i < num_files; i++) 413dfbf15eeSDavid E. O'Brien debug("Filename: " filenames[i]); 414dfbf15eeSDavid E. O'Brien 415dfbf15eeSDavid E. O'Brienfor (file_i = 0; file_i < num_files; file_i++) { 416dfbf15eeSDavid E. O'Brien src = filenames[file_i]; 417dfbf15eeSDavid E. O'Brien cfilename = hfilename = src; 418dfbf15eeSDavid E. O'Brien sub(/\.m$/, ".c", cfilename); 419dfbf15eeSDavid E. O'Brien sub(/\.m$/, ".h", hfilename); 420dfbf15eeSDavid E. O'Brien if (!opt_p) { 421dfbf15eeSDavid E. O'Brien sub(/^.*\//, "", cfilename); 422dfbf15eeSDavid E. O'Brien sub(/^.*\//, "", hfilename); 423dfbf15eeSDavid E. O'Brien } 424dfbf15eeSDavid E. O'Brien 425dfbf15eeSDavid E. O'Brien debug("Processing from " src " to " cfilename " / " hfilename); 426dfbf15eeSDavid E. O'Brien 427dfbf15eeSDavid E. O'Brien ctmpfilename = cfilename ".tmp"; 428dfbf15eeSDavid E. O'Brien htmpfilename = hfilename ".tmp"; 429dfbf15eeSDavid E. O'Brien 43052bcb118SEd Maste # Avoid a literal generated file tag here. 43152bcb118SEd Maste generated = "@" "generated"; 43252bcb118SEd Maste 433dfbf15eeSDavid E. O'Brien common_head = \ 434dfbf15eeSDavid E. O'Brien "/*\n" \ 43552bcb118SEd Maste " * This file is " generated " automatically.\n" \ 436dfbf15eeSDavid E. O'Brien " * Do not modify anything in here by hand.\n" \ 437dfbf15eeSDavid E. O'Brien " *\n" \ 438dfbf15eeSDavid E. O'Brien " * Created from source file\n" \ 439dfbf15eeSDavid E. O'Brien " * " src "\n" \ 440dfbf15eeSDavid E. O'Brien " * with\n" \ 441dfbf15eeSDavid E. O'Brien " * makeobjops.awk\n" \ 442dfbf15eeSDavid E. O'Brien " *\n" \ 443dfbf15eeSDavid E. O'Brien " * See the source file for legal information\n" \ 444dfbf15eeSDavid E. O'Brien " */\n"; 445dfbf15eeSDavid E. O'Brien 446dfbf15eeSDavid E. O'Brien printc(common_head "\n" \ 447dfbf15eeSDavid E. O'Brien "#include <sys/param.h>\n" \ 448dfbf15eeSDavid E. O'Brien "#include <sys/queue.h>\n" \ 449dfbf15eeSDavid E. O'Brien "#include <sys/kernel.h>\n" \ 450dfbf15eeSDavid E. O'Brien "#include <sys/kobj.h>"); 451dfbf15eeSDavid E. O'Brien 452dfbf15eeSDavid E. O'Brien printh(common_head); 453dfbf15eeSDavid E. O'Brien 454dfbf15eeSDavid E. O'Brien delete methods; # clear list of methods 455dfbf15eeSDavid E. O'Brien intname = ""; 456dfbf15eeSDavid E. O'Brien lineno = 0; 457dfbf15eeSDavid E. O'Brien error = 0; # to signal clean up and gerror setting 4588ff7da8cSDoug Rabson lastdoc = ""; 459a21a2da5SColin Percival prolog = ""; 460a21a2da5SColin Percival epilog = ""; 461*de8dd262SJustin Hibbits singleton = 0; 462dfbf15eeSDavid E. O'Brien 463dfbf15eeSDavid E. O'Brien while (!error && (getline < src) > 0) { 464dfbf15eeSDavid E. O'Brien lineno++; 465dfbf15eeSDavid E. O'Brien 466dfbf15eeSDavid E. O'Brien # 467dfbf15eeSDavid E. O'Brien # Take special notice of include directives. 468dfbf15eeSDavid E. O'Brien # 469dfbf15eeSDavid E. O'Brien if (/^#[ ]*include[ ]+["<][^">]+[">]/) { 470dfbf15eeSDavid E. O'Brien incld = $0; 471dfbf15eeSDavid E. O'Brien sub(/^#[ ]*include[ ]+/, "", incld); 472dfbf15eeSDavid E. O'Brien debug("Included file: " incld); 473dfbf15eeSDavid E. O'Brien printc("#include " incld); 474dfbf15eeSDavid E. O'Brien } 475dfbf15eeSDavid E. O'Brien 476dfbf15eeSDavid E. O'Brien sub(/#.*/, ""); # remove comments 477dfbf15eeSDavid E. O'Brien sub(/^[ ]+/, ""); # remove leading ... 478dfbf15eeSDavid E. O'Brien sub(/[ ]+$/, ""); # ... and trailing whitespace 479dfbf15eeSDavid E. O'Brien 480dfbf15eeSDavid E. O'Brien if (/^$/) { # skip empty lines 481dfbf15eeSDavid E. O'Brien } 4828ff7da8cSDoug Rabson else if (/^\/\*\*/) 4838ff7da8cSDoug Rabson lastdoc = handle_doc(); 4848ff7da8cSDoug Rabson else if (/^INTERFACE[ ]+[^ ;]*[ ]*;?[ ]*$/) { 4858ff7da8cSDoug Rabson printh(lastdoc); 4868ff7da8cSDoug Rabson lastdoc = ""; 487dfbf15eeSDavid E. O'Brien handle_interface(); 4888ff7da8cSDoug Rabson } else if (/^CODE[ ]*{$/) 489dfbf15eeSDavid E. O'Brien printc(handle_code()); 490dfbf15eeSDavid E. O'Brien else if (/^HEADER[ ]*{$/) 491dfbf15eeSDavid E. O'Brien printh(handle_code()); 4928ff7da8cSDoug Rabson else if (/^METHOD/) { 4938ff7da8cSDoug Rabson handle_method(0, lastdoc); 4948ff7da8cSDoug Rabson lastdoc = ""; 495a21a2da5SColin Percival prolog = ""; 496a21a2da5SColin Percival epilog = ""; 4978ff7da8cSDoug Rabson } else if (/^STATICMETHOD/) { 4988ff7da8cSDoug Rabson handle_method(1, lastdoc); 4998ff7da8cSDoug Rabson lastdoc = ""; 500a21a2da5SColin Percival prolog = ""; 501a21a2da5SColin Percival epilog = ""; 502a21a2da5SColin Percival } else if (/^PROLOG[ ]*{$/) 503a21a2da5SColin Percival prolog = handle_code(); 504a21a2da5SColin Percival else if (/^EPILOG[ ]*{$/) 505a21a2da5SColin Percival epilog = handle_code(); 506*de8dd262SJustin Hibbits else if (/^SINGLETON/) 507*de8dd262SJustin Hibbits singleton = 1; 508a21a2da5SColin Percival else { 509dfbf15eeSDavid E. O'Brien debug($0); 510dfbf15eeSDavid E. O'Brien warnsrc("Invalid line encountered"); 511dfbf15eeSDavid E. O'Brien error = 1; 512dfbf15eeSDavid E. O'Brien } 513dfbf15eeSDavid E. O'Brien } 514dfbf15eeSDavid E. O'Brien 515dfbf15eeSDavid E. O'Brien # 516dfbf15eeSDavid E. O'Brien # Print the final '#endif' in the header file. 517dfbf15eeSDavid E. O'Brien # 518dfbf15eeSDavid E. O'Brien printh("#endif /* _" intname "_if_h_ */"); 519dfbf15eeSDavid E. O'Brien 520dfbf15eeSDavid E. O'Brien close (ctmpfilename); 521dfbf15eeSDavid E. O'Brien close (htmpfilename); 522dfbf15eeSDavid E. O'Brien 523dfbf15eeSDavid E. O'Brien if (error) { 524dfbf15eeSDavid E. O'Brien warn("Output skipped"); 525dfbf15eeSDavid E. O'Brien system_check("rm -f " ctmpfilename " " htmpfilename); 526dfbf15eeSDavid E. O'Brien gerror = 1; 527dfbf15eeSDavid E. O'Brien } 528dfbf15eeSDavid E. O'Brien else { 529dfbf15eeSDavid E. O'Brien if (opt_c) 5301c8deadcSDavid E. O'Brien system_check("mv -f " ctmpfilename " " cfilename); 531dfbf15eeSDavid E. O'Brien if (opt_h) 5321c8deadcSDavid E. O'Brien system_check("mv -f " htmpfilename " " hfilename); 533dfbf15eeSDavid E. O'Brien } 534dfbf15eeSDavid E. O'Brien} 535dfbf15eeSDavid E. O'Brien 536dfbf15eeSDavid E. O'Brienexit gerror; 537dfbf15eeSDavid E. O'Brien 538dfbf15eeSDavid E. O'Brien} 539