|
|
1.1 ! root 1: #!/bin/sh - ! 2: copyright=' ! 3: /* ! 4: * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved ! 5: * Copyright (c) 1992, 1993, 1994, 1995 ! 6: * The Regents of the University of California. All rights reserved. ! 7: * ! 8: * Redistribution and use in source and binary forms, with or without ! 9: * modification, are permitted provided that the following conditions ! 10: * are met: ! 11: * 1. Redistributions of source code must retain the above copyright ! 12: * notice, this list of conditions and the following disclaimer. ! 13: * 2. Redistributions in binary form must reproduce the above copyright ! 14: * notice, this list of conditions and the following disclaimer in the ! 15: * documentation and/or other materials provided with the distribution. ! 16: * 3. All advertising materials mentioning features or use of this software ! 17: * must display the following acknowledgement: ! 18: * This product includes software developed by the University of ! 19: * California, Berkeley and its contributors. ! 20: * 4. Neither the name of the University nor the names of its contributors ! 21: * may be used to endorse or promote products derived from this software ! 22: * without specific prior written permission. ! 23: * ! 24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 34: * SUCH DAMAGE. ! 35: */ ! 36: ' ! 37: SCRIPT_ID='@(#)vnode_if.sh 8.7 (Berkeley) 5/11/95' ! 38: ! 39: # Script to produce VFS front-end sugar. ! 40: # ! 41: # usage: vnode_if.sh srcfile ! 42: # (where srcfile is currently /sys/kern/vnode_if.src) ! 43: # ! 44: ! 45: if [ $# -ne 1 ] ; then ! 46: echo 'usage: vnode_if.sh srcfile' ! 47: exit 1 ! 48: fi ! 49: ! 50: # Name of the source file. ! 51: src=$1 ! 52: ! 53: # Names of the created files. ! 54: out_c=vnode_if.c ! 55: out_h=vnode_if.h ! 56: ! 57: # Awk program (must support nawk extensions) ! 58: # Use "awk" at Berkeley, "nawk" or "gawk" elsewhere. ! 59: #awk=${AWK:-awk} ! 60: awk=${AWK:-gawk} ! 61: ! 62: # Does this awk have a "toupper" function? (i.e. is it GNU awk) ! 63: isgawk=`$awk 'BEGIN { print toupper("true"); exit; }' 2>/dev/null` ! 64: ! 65: # If this awk does not define "toupper" then define our own. ! 66: if [ "$isgawk" = TRUE ] ; then ! 67: # GNU awk provides it. ! 68: toupper= ! 69: else ! 70: # Provide our own toupper() ! 71: toupper=' ! 72: function toupper(str) { ! 73: _toupper_cmd = "echo "str" |tr a-z A-Z" ! 74: _toupper_cmd | getline _toupper_str; ! 75: close(_toupper_cmd); ! 76: return _toupper_str; ! 77: }' ! 78: fi ! 79: ! 80: # ! 81: # This is the common part of all awk programs that read $src ! 82: # This parses the input for one function into the arrays: ! 83: # argdir, argtype, argname, willrele ! 84: # and calls "doit()" to generate output for the function. ! 85: # ! 86: # Input to this parser is pre-processed slightly by sed ! 87: # so this awk parser doesn't have to work so hard. The ! 88: # changes done by the sed pre-processing step are: ! 89: # insert a space beween * and pointer name ! 90: # replace semicolons with spaces ! 91: # ! 92: sed_prep='s:\*\([^\*/]\):\* \1:g ! 93: s/;/ /' ! 94: awk_parser=' ! 95: # Comment line ! 96: /^#/ { next; } ! 97: # First line of description ! 98: /^vop_/ { ! 99: name=$1; ! 100: argc=0; ! 101: next; ! 102: } ! 103: # Last line of description ! 104: /^}/ { ! 105: doit(); ! 106: next; ! 107: } ! 108: # Middle lines of description ! 109: { ! 110: argdir[argc] = $1; i=2; ! 111: if ($2 == "WILLRELE") { ! 112: willrele[argc] = 1; ! 113: i++; ! 114: } else ! 115: willrele[argc] = 0; ! 116: argtype[argc] = $i; i++; ! 117: while (i < NF) { ! 118: argtype[argc] = argtype[argc]" "$i; ! 119: i++; ! 120: } ! 121: argname[argc] = $i; ! 122: argc++; ! 123: next; ! 124: } ! 125: ' ! 126: ! 127: # This is put after the copyright on each generated file. ! 128: warning=" ! 129: /* ! 130: * Warning: This file is generated automatically. ! 131: * (Modifications made here may easily be lost!) ! 132: * ! 133: * Created by the script: ! 134: * ${SCRIPT_ID} ! 135: */ ! 136: " ! 137: ! 138: # Get rid of ugly spaces ! 139: space_elim='s:\([^/]\*\) :\1:g' ! 140: ! 141: # ! 142: # Redirect stdout to the H file. ! 143: # ! 144: echo "$0: Creating $out_h" 1>&2 ! 145: exec > $out_h ! 146: ! 147: # Begin stuff ! 148: echo "$copyright" ! 149: echo "$warning" ! 150: echo ' ! 151: extern struct vnodeop_desc vop_default_desc; ! 152: ' ! 153: ! 154: # Body stuff ! 155: # This awk program needs toupper() so define it if necessary. ! 156: sed -e "$sed_prep" $src | $awk "$toupper"' ! 157: function doit() { ! 158: # Declare arg struct, descriptor. ! 159: printf("\nstruct %s_args {\n", name); ! 160: printf("\tstruct vnodeop_desc * a_desc;\n"); ! 161: for (i=0; i<argc; i++) { ! 162: printf("\t%s a_%s;\n", argtype[i], argname[i]); ! 163: } ! 164: printf("};\n"); ! 165: printf("extern struct vnodeop_desc %s_desc;\n", name); ! 166: # Define inline function. ! 167: printf("#define %s(", toupper(name)); ! 168: for (i=0; i<argc; i++) { ! 169: printf("%s", argname[i]); ! 170: if (i < (argc-1)) printf(", "); ! 171: } ! 172: printf(") _%s(", toupper(name)); ! 173: for (i=0; i<argc; i++) { ! 174: printf("%s", argname[i]); ! 175: if (i < (argc-1)) printf(", "); ! 176: } ! 177: printf(")\n"); ! 178: printf("static __inline int _%s(", toupper(name)); ! 179: for (i=0; i<argc; i++) { ! 180: printf("%s", argname[i]); ! 181: if (i < (argc-1)) printf(", "); ! 182: } ! 183: printf(")\n"); ! 184: for (i=0; i<argc; i++) { ! 185: printf("\t%s %s;\n", argtype[i], argname[i]); ! 186: } ! 187: printf("{\n\tstruct %s_args a;\n", name); ! 188: printf("\ta.a_desc = VDESC(%s);\n", name); ! 189: for (i=0; i<argc; i++) { ! 190: printf("\ta.a_%s = %s;\n", argname[i], argname[i]); ! 191: } ! 192: printf("\treturn (VCALL(%s%s, VOFFSET(%s), &a));\n}\n", ! 193: argname[0], arg0special, name); ! 194: } ! 195: BEGIN { ! 196: arg0special=""; ! 197: } ! 198: END { ! 199: printf("\n/* Special cases: */\n#include <sys/buf.h>\n#include <sys/vm.h>\n"); ! 200: argc=1; ! 201: argtype[0]="struct buf *"; ! 202: argname[0]="bp"; ! 203: arg0special="->b_vp"; ! 204: name="vop_strategy"; ! 205: doit(); ! 206: name="vop_bwrite"; ! 207: doit(); ! 208: } ! 209: '"$awk_parser" | sed -e "$space_elim" ! 210: ! 211: # End stuff ! 212: echo ' ! 213: /* End of special cases. */' ! 214: ! 215: ! 216: # ! 217: # Redirect stdout to the C file. ! 218: # ! 219: echo "$0: Creating $out_c" 1>&2 ! 220: exec > $out_c ! 221: ! 222: # Begin stuff ! 223: echo "$copyright" ! 224: echo "$warning" ! 225: echo ' ! 226: #include <sys/param.h> ! 227: #include <sys/mount.h> ! 228: #include <sys/vm.h> ! 229: #include <sys/vnode.h> ! 230: ! 231: struct vnodeop_desc vop_default_desc = { ! 232: 0, ! 233: "default", ! 234: 0, ! 235: NULL, ! 236: VDESC_NO_OFFSET, ! 237: VDESC_NO_OFFSET, ! 238: VDESC_NO_OFFSET, ! 239: VDESC_NO_OFFSET, ! 240: NULL, ! 241: }; ! 242: ' ! 243: ! 244: # Body stuff ! 245: sed -e "$sed_prep" $src | $awk ' ! 246: function do_offset(typematch) { ! 247: for (i=0; i<argc; i++) { ! 248: if (argtype[i] == typematch) { ! 249: printf("\tVOPARG_OFFSETOF(struct %s_args, a_%s),\n", ! 250: name, argname[i]); ! 251: return i; ! 252: }; ! 253: }; ! 254: print "\tVDESC_NO_OFFSET,"; ! 255: return -1; ! 256: } ! 257: ! 258: function doit() { ! 259: # Define offsets array ! 260: printf("\nint %s_vp_offsets[] = {\n", name); ! 261: for (i=0; i<argc; i++) { ! 262: if (argtype[i] == "struct vnode *") { ! 263: printf ("\tVOPARG_OFFSETOF(struct %s_args,a_%s),\n", ! 264: name, argname[i]); ! 265: } ! 266: } ! 267: print "\tVDESC_NO_OFFSET"; ! 268: print "};"; ! 269: # Define F_desc ! 270: printf("struct vnodeop_desc %s_desc = {\n", name); ! 271: # offset ! 272: printf ("\t0,\n"); ! 273: # printable name ! 274: printf ("\t\"%s\",\n", name); ! 275: # flags ! 276: printf("\t0"); ! 277: vpnum = 0; ! 278: for (i=0; i<argc; i++) { ! 279: if (willrele[i]) { ! 280: if (argdir[i] ~ /OUT/) { ! 281: printf(" | VDESC_VPP_WILLRELE"); ! 282: } else { ! 283: printf(" | VDESC_VP%s_WILLRELE", vpnum); ! 284: }; ! 285: vpnum++; ! 286: } ! 287: } ! 288: print ","; ! 289: # vp offsets ! 290: printf ("\t%s_vp_offsets,\n", name); ! 291: # vpp (if any) ! 292: do_offset("struct vnode **"); ! 293: # cred (if any) ! 294: do_offset("struct ucred *"); ! 295: # proc (if any) ! 296: do_offset("struct proc *"); ! 297: # componentname ! 298: do_offset("struct componentname *"); ! 299: # transport layer information ! 300: printf ("\tNULL,\n};\n"); ! 301: } ! 302: END { ! 303: printf("\n/* Special cases: */\n"); ! 304: argc=1; ! 305: argdir[0]="IN"; ! 306: argtype[0]="struct buf *"; ! 307: argname[0]="bp"; ! 308: willrele[0]=0; ! 309: name="vop_strategy"; ! 310: doit(); ! 311: name="vop_bwrite"; ! 312: doit(); ! 313: } ! 314: '"$awk_parser" | sed -e "$space_elim" ! 315: ! 316: # End stuff ! 317: echo ' ! 318: /* End of special cases. */' ! 319: ! 320: # Add the vfs_op_descs array to the C file. ! 321: # Begin stuff ! 322: echo ' ! 323: struct vnodeop_desc *vfs_op_descs[] = { ! 324: &vop_default_desc, /* MUST BE FIRST */ ! 325: &vop_strategy_desc, /* XXX: SPECIAL CASE */ ! 326: &vop_bwrite_desc, /* XXX: SPECIAL CASE */ ! 327: ' ! 328: ! 329: # Body stuff ! 330: sed -e "$sed_prep" $src | $awk ' ! 331: function doit() { ! 332: printf("\t&%s_desc,\n", name); ! 333: } ! 334: '"$awk_parser" ! 335: ! 336: # End stuff ! 337: echo ' NULL ! 338: }; ! 339: ' ! 340: ! 341: exit 0 ! 342: ! 343: # Local Variables: ! 344: # tab-width: 4 ! 345: # End:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.