154646Smckusick#!/bin/sh - 254646Smckusick# 363176Sbostic# Copyright (c) 1992, 1993 463176Sbostic# The Regents of the University of California. All rights reserved. 554646Smckusick# 654646Smckusick# %sccs.include.redist.sh% 754646Smckusick# 8*67635Smckusick# from: $NetBSD: vnode_if.sh,v 1.4.2.1 1994/07/15 22:32:01 cgd Exp $ 954646Smckusick# 10*67635SmckusickSCRIPT_ID='@(#)vnode_if.sh 8.3 (Berkeley) 08/10/94' 1154646Smckusick 1254646Smckusick# Script to produce VFS front-end sugar. 1354725Sbostic# 1454725Sbostic# usage: vnode_if.sh srcfile 1554725Sbostic# (where srcfile is currently /sys/kern/vnode_if.src) 1654725Sbostic# 1754646Smckusick 1854725Sbosticif [ $# -ne 1 ] ; then 1955323Sheideman echo 'usage: vnode_if.sh srcfile' 2054725Sbostic exit 1 2154725Sbosticfi 2254725Sbostic 2354725Sbostic# Name of the source file. 24*67635Smckusicksrc=$1 2554725Sbostic 2654725Sbostic# Names of the created files. 27*67635Smckusickout_c=vnode_if.c 28*67635Smckusickout_h=vnode_if.h 2954725Sbostic 30*67635Smckusick# Awk program (must support nawk extensions) 31*67635Smckusick# Use "awk" at Berkeley, "nawk" or "gawk" elsewhere. 32*67635Smckusickawk=${AWK:-awk} 3355323Sheideman 34*67635Smckusick# Does this awk have a "toupper" function? (i.e. is it GNU awk) 35*67635Smckusickisgawk=`$awk 'BEGIN { print toupper("true"); exit; }' 2>/dev/null` 36*67635Smckusick 37*67635Smckusick# If this awk does not define "toupper" then define our own. 38*67635Smckusickif [ "$isgawk" = TRUE ] ; then 39*67635Smckusick # GNU awk provides it. 40*67635Smckusick toupper= 41*67635Smckusickelse 42*67635Smckusick # Provide our own toupper() 43*67635Smckusick toupper=' 44*67635Smckusickfunction toupper(str) { 45*67635Smckusick _toupper_cmd = "echo "str" |tr a-z A-Z" 46*67635Smckusick _toupper_cmd | getline _toupper_str; 47*67635Smckusick close(_toupper_cmd); 48*67635Smckusick return _toupper_str; 49*67635Smckusick}' 50*67635Smckusickfi 51*67635Smckusick 52*67635Smckusick# 53*67635Smckusick# This is the common part of all awk programs that read $src 54*67635Smckusick# This parses the input for one function into the arrays: 55*67635Smckusick# argdir, argtype, argname, willrele 56*67635Smckusick# and calls "doit()" to generate output for the function. 57*67635Smckusick# 58*67635Smckusick# Input to this parser is pre-processed slightly by sed 59*67635Smckusick# so this awk parser doesn't have to work so hard. The 60*67635Smckusick# changes done by the sed pre-processing step are: 61*67635Smckusick# insert a space beween * and pointer name 62*67635Smckusick# replace semicolons with spaces 63*67635Smckusick# 64*67635Smckusicksed_prep='s:\*\([^\*/]\):\* \1:g 65*67635Smckusicks/;/ /' 66*67635Smckusickawk_parser=' 67*67635Smckusick# Comment line 68*67635Smckusick/^#/ { next; } 69*67635Smckusick# First line of description 70*67635Smckusick/^vop_/ { 71*67635Smckusick name=$1; 72*67635Smckusick argc=0; 73*67635Smckusick next; 74*67635Smckusick} 75*67635Smckusick# Last line of description 76*67635Smckusick/^}/ { 77*67635Smckusick doit(); 78*67635Smckusick next; 79*67635Smckusick} 80*67635Smckusick# Middle lines of description 81*67635Smckusick{ 82*67635Smckusick argdir[argc] = $1; i=2; 83*67635Smckusick if ($2 == "WILLRELE") { 84*67635Smckusick willrele[argc] = 1; 85*67635Smckusick i++; 86*67635Smckusick } else 87*67635Smckusick willrele[argc] = 0; 88*67635Smckusick argtype[argc] = $i; i++; 89*67635Smckusick while (i < NF) { 90*67635Smckusick argtype[argc] = argtype[argc]" "$i; 91*67635Smckusick i++; 92*67635Smckusick } 93*67635Smckusick argname[argc] = $i; 94*67635Smckusick argc++; 95*67635Smckusick next; 96*67635Smckusick} 97*67635Smckusick' 98*67635Smckusick 99*67635Smckusick# This is put after the copyright on each generated file. 100*67635Smckusickwarning=" 10154646Smckusick/* 102*67635Smckusick * Warning: This file is generated automatically. 103*67635Smckusick * (Modifications made here may easily be lost!) 10454646Smckusick * 105*67635Smckusick * Created by the script: 106*67635Smckusick * ${SCRIPT_ID} 10754646Smckusick */ 108*67635Smckusick" 10954725Sbostic 110*67635Smckusick 111*67635Smckusick# 112*67635Smckusick# Redirect stdout to the H file. 113*67635Smckusick# 114*67635Smckusickecho "$0: Creating $out_h" 1>&2 115*67635Smckusickexec > $out_h 116*67635Smckusick 117*67635Smckusick# Begin stuff 118*67635Smckusickecho "$copyright" 119*67635Smckusickecho "$warning" 120*67635Smckusickecho ' 12154646Smckusickextern struct vnodeop_desc vop_default_desc; 122*67635Smckusick' 12354646Smckusick 124*67635Smckusick# Body stuff 125*67635Smckusick# This awk program needs toupper() so define it if necessary. 126*67635Smckusicksed -e "$sed_prep" $src | $awk "$toupper"' 127*67635Smckusickfunction doit() { 128*67635Smckusick # Declare arg struct, descriptor. 129*67635Smckusick printf("\nstruct %s_args {\n", name); 130*67635Smckusick printf("\tstruct vnodeop_desc * a_desc;\n"); 131*67635Smckusick for (i=0; i<argc; i++) { 132*67635Smckusick printf("\t%s a_%s;\n", argtype[i], argname[i]); 13354646Smckusick } 134*67635Smckusick printf("};\n"); 135*67635Smckusick printf("extern struct vnodeop_desc %s_desc;\n", name); 136*67635Smckusick # Define inline function. 137*67635Smckusick printf("static __inline int %s(", toupper(name)); 138*67635Smckusick for (i=0; i<argc; i++) { 139*67635Smckusick printf("%s", argname[i]); 140*67635Smckusick if (i < (argc-1)) printf(", "); 141*67635Smckusick } 142*67635Smckusick printf(")\n"); 143*67635Smckusick for (i=0; i<argc; i++) { 144*67635Smckusick printf("\t%s %s;\n", argtype[i], argname[i]); 145*67635Smckusick } 146*67635Smckusick printf("{\n\tstruct %s_args a;\n", name); 147*67635Smckusick printf("\ta.a_desc = VDESC(%s);\n", name); 148*67635Smckusick for (i=0; i<argc; i++) { 149*67635Smckusick printf("\ta.a_%s = %s;\n", argname[i], argname[i]); 150*67635Smckusick } 151*67635Smckusick printf("\treturn (VCALL(%s%s, VOFFSET(%s), &a));\n}\n", 152*67635Smckusick argname[0], arg0special, name); 153*67635Smckusick} 154*67635SmckusickBEGIN { 155*67635Smckusick arg0special=""; 156*67635Smckusick} 157*67635SmckusickEND { 158*67635Smckusick printf("\n/* Special cases: */\n#include <sys/buf.h>\n"); 159*67635Smckusick argc=1; 160*67635Smckusick argtype[0]="struct buf *"; 161*67635Smckusick argname[0]="bp"; 162*67635Smckusick arg0special="->b_vp"; 163*67635Smckusick name="vop_strategy"; 164*67635Smckusick doit(); 165*67635Smckusick name="vop_bwrite"; 166*67635Smckusick doit(); 167*67635Smckusick} 168*67635Smckusick'"$awk_parser" 16954646Smckusick 170*67635Smckusick# End stuff 171*67635Smckusickecho ' 172*67635Smckusick/* End of special cases. */' 17354646Smckusick 17454646Smckusick 175*67635Smckusick# 176*67635Smckusick# Redirect stdout to the C file. 177*67635Smckusick# 178*67635Smckusickecho "$0: Creating $out_c" 1>&2 179*67635Smckusickexec > $out_c 18054646Smckusick 181*67635Smckusick# Begin stuff 182*67635Smckusickecho "$copyright" 183*67635Smckusickecho "$warning" 184*67635Smckusickecho ' 18554725Sbostic#include <sys/param.h> 18654725Sbostic#include <sys/mount.h> 18754725Sbostic#include <sys/vnode.h> 18854725Sbostic 18954725Sbosticstruct vnodeop_desc vop_default_desc = { 19054725Sbostic 0, 19154725Sbostic "default", 19254725Sbostic 0, 19354725Sbostic NULL, 19454725Sbostic VDESC_NO_OFFSET, 19554725Sbostic VDESC_NO_OFFSET, 19654725Sbostic VDESC_NO_OFFSET, 19755323Sheideman VDESC_NO_OFFSET, 19854725Sbostic NULL, 19954725Sbostic}; 200*67635Smckusick' 20154725Sbostic 202*67635Smckusick# Body stuff 203*67635Smckusicksed -e "$sed_prep" $src | $awk ' 204*67635Smckusickfunction do_offset(typematch) { 205*67635Smckusick for (i=0; i<argc; i++) { 206*67635Smckusick if (argtype[i] == typematch) { 207*67635Smckusick printf("\tVOPARG_OFFSETOF(struct %s_args, a_%s),\n", 208*67635Smckusick name, argname[i]); 209*67635Smckusick return i; 210*67635Smckusick }; 211*67635Smckusick }; 212*67635Smckusick print "\tVDESC_NO_OFFSET,"; 213*67635Smckusick return -1; 214*67635Smckusick} 21554725Sbostic 216*67635Smckusickfunction doit() { 217*67635Smckusick # Define offsets array 218*67635Smckusick printf("\nint %s_vp_offsets[] = {\n", name); 219*67635Smckusick for (i=0; i<argc; i++) { 220*67635Smckusick if (argtype[i] == "struct vnode *") { 221*67635Smckusick printf ("\tVOPARG_OFFSETOF(struct %s_args,a_%s),\n", 222*67635Smckusick name, argname[i]); 223*67635Smckusick } 22455323Sheideman } 225*67635Smckusick print "\tVDESC_NO_OFFSET"; 226*67635Smckusick print "};"; 227*67635Smckusick # Define F_desc 228*67635Smckusick printf("struct vnodeop_desc %s_desc = {\n", name); 229*67635Smckusick # offset 230*67635Smckusick printf ("\t0,\n"); 231*67635Smckusick # printable name 232*67635Smckusick printf ("\t\"%s\",\n", name); 233*67635Smckusick # flags 234*67635Smckusick printf("\t0"); 235*67635Smckusick vpnum = 0; 236*67635Smckusick for (i=0; i<argc; i++) { 237*67635Smckusick if (willrele[i]) { 238*67635Smckusick if (argdir[i] ~ /OUT/) { 239*67635Smckusick printf(" | VDESC_VPP_WILLRELE"); 24055323Sheideman } else { 241*67635Smckusick printf(" | VDESC_VP%s_WILLRELE", vpnum); 24255323Sheideman }; 243*67635Smckusick vpnum++; 244*67635Smckusick } 24555323Sheideman } 246*67635Smckusick print ","; 247*67635Smckusick # vp offsets 248*67635Smckusick printf ("\t%s_vp_offsets,\n", name); 249*67635Smckusick # vpp (if any) 250*67635Smckusick do_offset("struct vnode **"); 251*67635Smckusick # cred (if any) 252*67635Smckusick do_offset("struct ucred *"); 253*67635Smckusick # proc (if any) 254*67635Smckusick do_offset("struct proc *"); 255*67635Smckusick # componentname 256*67635Smckusick do_offset("struct componentname *"); 257*67635Smckusick # transport layer information 258*67635Smckusick printf ("\tNULL,\n};\n"); 259*67635Smckusick} 260*67635SmckusickEND { 261*67635Smckusick printf("\n/* Special cases: */\n"); 262*67635Smckusick argc=1; 263*67635Smckusick argdir[0]="IN"; 264*67635Smckusick argtype[0]="struct buf *"; 265*67635Smckusick argname[0]="bp"; 266*67635Smckusick willrele[0]=0; 267*67635Smckusick name="vop_strategy"; 268*67635Smckusick doit(); 269*67635Smckusick name="vop_bwrite"; 270*67635Smckusick doit(); 271*67635Smckusick} 272*67635Smckusick'"$awk_parser" 27355323Sheideman 274*67635Smckusick# End stuff 275*67635Smckusickecho ' 276*67635Smckusick/* End of special cases. */' 27755323Sheideman 278*67635Smckusick# Add the vfs_op_descs array to the C file. 279*67635Smckusick# Begin stuff 280*67635Smckusickecho ' 281*67635Smckusickstruct vnodeop_desc *vfs_op_descs[] = { 282*67635Smckusick &vop_default_desc, /* MUST BE FIRST */ 283*67635Smckusick &vop_strategy_desc, /* XXX: SPECIAL CASE */ 284*67635Smckusick &vop_bwrite_desc, /* XXX: SPECIAL CASE */ 285*67635Smckusick' 28654725Sbostic 287*67635Smckusick# Body stuff 288*67635Smckusicksed -e "$sed_prep" $src | $awk ' 289*67635Smckusickfunction doit() { 290*67635Smckusick printf("\t&%s_desc,\n", name); 29154646Smckusick} 292*67635Smckusick'"$awk_parser" 29354646Smckusick 294*67635Smckusick# End stuff 295*67635Smckusickecho ' NULL 29654646Smckusick}; 297*67635Smckusick' 29854646Smckusick 299*67635Smckusickexit 0 30054725Sbostic 301*67635Smckusick# Local Variables: 302*67635Smckusick# tab-width: 4 303*67635Smckusick# End: 304