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