154646Smckusick#!/bin/sh - 254646Smckusick# 3*67793Smckusick# Copyright (c) 1992, 1993, 1994 463176Sbostic# The Regents of the University of California. All rights reserved. 554646Smckusick# 654646Smckusick# %sccs.include.redist.sh% 754646Smckusick# 8*67793Smckusick# from: $NetBSD: vnode_if.sh,v 1.7 1994/08/25 03:04:28 cgd Exp $ 954646Smckusick# 10*67793SmckusickSCRIPT_ID='@(#)vnode_if.sh 8.5 (Berkeley) 10/09/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. 2467635Smckusicksrc=$1 2554725Sbostic 2654725Sbostic# Names of the created files. 2767635Smckusickout_c=vnode_if.c 2867635Smckusickout_h=vnode_if.h 2954725Sbostic 3067635Smckusick# Awk program (must support nawk extensions) 3167635Smckusick# Use "awk" at Berkeley, "nawk" or "gawk" elsewhere. 3267635Smckusickawk=${AWK:-awk} 3355323Sheideman 3467635Smckusick# Does this awk have a "toupper" function? (i.e. is it GNU awk) 3567635Smckusickisgawk=`$awk 'BEGIN { print toupper("true"); exit; }' 2>/dev/null` 3667635Smckusick 3767635Smckusick# If this awk does not define "toupper" then define our own. 3867635Smckusickif [ "$isgawk" = TRUE ] ; then 3967635Smckusick # GNU awk provides it. 4067635Smckusick toupper= 4167635Smckusickelse 4267635Smckusick # Provide our own toupper() 4367635Smckusick toupper=' 4467635Smckusickfunction toupper(str) { 4567635Smckusick _toupper_cmd = "echo "str" |tr a-z A-Z" 4667635Smckusick _toupper_cmd | getline _toupper_str; 4767635Smckusick close(_toupper_cmd); 4867635Smckusick return _toupper_str; 4967635Smckusick}' 5067635Smckusickfi 5167635Smckusick 5267635Smckusick# 5367635Smckusick# This is the common part of all awk programs that read $src 5467635Smckusick# This parses the input for one function into the arrays: 5567635Smckusick# argdir, argtype, argname, willrele 5667635Smckusick# and calls "doit()" to generate output for the function. 5767635Smckusick# 5867635Smckusick# Input to this parser is pre-processed slightly by sed 5967635Smckusick# so this awk parser doesn't have to work so hard. The 6067635Smckusick# changes done by the sed pre-processing step are: 6167635Smckusick# insert a space beween * and pointer name 6267635Smckusick# replace semicolons with spaces 6367635Smckusick# 6467635Smckusicksed_prep='s:\*\([^\*/]\):\* \1:g 6567635Smckusicks/;/ /' 6667635Smckusickawk_parser=' 6767635Smckusick# Comment line 6867635Smckusick/^#/ { next; } 6967635Smckusick# First line of description 7067635Smckusick/^vop_/ { 7167635Smckusick name=$1; 7267635Smckusick argc=0; 7367635Smckusick next; 7467635Smckusick} 7567635Smckusick# Last line of description 7667635Smckusick/^}/ { 7767635Smckusick doit(); 7867635Smckusick next; 7967635Smckusick} 8067635Smckusick# Middle lines of description 8167635Smckusick{ 8267635Smckusick argdir[argc] = $1; i=2; 8367635Smckusick if ($2 == "WILLRELE") { 8467635Smckusick willrele[argc] = 1; 8567635Smckusick i++; 8667635Smckusick } else 8767635Smckusick willrele[argc] = 0; 88*67793Smckusick argtype[argc] = $i; i++; 8967635Smckusick while (i < NF) { 90*67793Smckusick argtype[argc] = argtype[argc]" "$i; 9167635Smckusick i++; 9267635Smckusick } 9367635Smckusick argname[argc] = $i; 9467635Smckusick argc++; 9567635Smckusick next; 9667635Smckusick} 9767635Smckusick' 9867635Smckusick 9967635Smckusick# This is put after the copyright on each generated file. 10067635Smckusickwarning=" 10154646Smckusick/* 10267635Smckusick * Warning: This file is generated automatically. 10367635Smckusick * (Modifications made here may easily be lost!) 10454646Smckusick * 10567635Smckusick * Created by the script: 10667635Smckusick * ${SCRIPT_ID} 10754646Smckusick */ 10867635Smckusick" 10954725Sbostic 110*67793Smckusick# Get rid of ugly spaces 111*67793Smckusickspace_elim='s:\([^/]\*\) :\1:g' 11267635Smckusick 11367635Smckusick# 11467635Smckusick# Redirect stdout to the H file. 11567635Smckusick# 11667635Smckusickecho "$0: Creating $out_h" 1>&2 11767635Smckusickexec > $out_h 11867635Smckusick 11967635Smckusick# Begin stuff 12067635Smckusickecho "$copyright" 12167635Smckusickecho "$warning" 12267635Smckusickecho ' 12354646Smckusickextern struct vnodeop_desc vop_default_desc; 12467635Smckusick' 12554646Smckusick 12667635Smckusick# Body stuff 12767635Smckusick# This awk program needs toupper() so define it if necessary. 12867635Smckusicksed -e "$sed_prep" $src | $awk "$toupper"' 12967635Smckusickfunction doit() { 13067635Smckusick # Declare arg struct, descriptor. 13167635Smckusick printf("\nstruct %s_args {\n", name); 132*67793Smckusick printf("\tstruct vnodeop_desc * a_desc;\n"); 13367635Smckusick for (i=0; i<argc; i++) { 134*67793Smckusick printf("\t%s a_%s;\n", argtype[i], argname[i]); 13554646Smckusick } 13667635Smckusick printf("};\n"); 13767635Smckusick printf("extern struct vnodeop_desc %s_desc;\n", name); 13867635Smckusick # Define inline function. 13967635Smckusick printf("static __inline int %s(", toupper(name)); 14067635Smckusick for (i=0; i<argc; i++) { 14167635Smckusick printf("%s", argname[i]); 14267635Smckusick if (i < (argc-1)) printf(", "); 14367635Smckusick } 14467635Smckusick printf(")\n"); 14567635Smckusick for (i=0; i<argc; i++) { 146*67793Smckusick printf("\t%s %s;\n", argtype[i], argname[i]); 14767635Smckusick } 148*67793Smckusick printf("{\n\tstruct %s_args a;\n", name); 14967635Smckusick printf("\ta.a_desc = VDESC(%s);\n", name); 15067635Smckusick for (i=0; i<argc; i++) { 15167635Smckusick printf("\ta.a_%s = %s;\n", argname[i], argname[i]); 15267635Smckusick } 15367635Smckusick printf("\treturn (VCALL(%s%s, VOFFSET(%s), &a));\n}\n", 15467635Smckusick argname[0], arg0special, name); 15567635Smckusick} 15667635SmckusickBEGIN { 15767635Smckusick arg0special=""; 15867635Smckusick} 15967635SmckusickEND { 16067635Smckusick printf("\n/* Special cases: */\n#include <sys/buf.h>\n"); 16167635Smckusick argc=1; 16267635Smckusick argtype[0]="struct buf *"; 16367635Smckusick argname[0]="bp"; 16467635Smckusick arg0special="->b_vp"; 16567635Smckusick name="vop_strategy"; 16667635Smckusick doit(); 16767635Smckusick name="vop_bwrite"; 16867635Smckusick doit(); 16967635Smckusick} 170*67793Smckusick'"$awk_parser" | sed -e "$space_elim" 17154646Smckusick 17267635Smckusick# End stuff 17367635Smckusickecho ' 17467635Smckusick/* End of special cases. */' 17554646Smckusick 17654646Smckusick 17767635Smckusick# 17867635Smckusick# Redirect stdout to the C file. 17967635Smckusick# 18067635Smckusickecho "$0: Creating $out_c" 1>&2 18167635Smckusickexec > $out_c 18254646Smckusick 18367635Smckusick# Begin stuff 18467635Smckusickecho "$copyright" 18567635Smckusickecho "$warning" 18667635Smckusickecho ' 18754725Sbostic#include <sys/param.h> 18854725Sbostic#include <sys/mount.h> 18954725Sbostic#include <sys/vnode.h> 19054725Sbostic 19154725Sbosticstruct vnodeop_desc vop_default_desc = { 19254725Sbostic 0, 19354725Sbostic "default", 19454725Sbostic 0, 19554725Sbostic NULL, 19654725Sbostic VDESC_NO_OFFSET, 19754725Sbostic VDESC_NO_OFFSET, 19854725Sbostic VDESC_NO_OFFSET, 19955323Sheideman VDESC_NO_OFFSET, 20054725Sbostic NULL, 20154725Sbostic}; 20267635Smckusick' 20354725Sbostic 20467635Smckusick# Body stuff 20567635Smckusicksed -e "$sed_prep" $src | $awk ' 20667635Smckusickfunction do_offset(typematch) { 20767635Smckusick for (i=0; i<argc; i++) { 20867635Smckusick if (argtype[i] == typematch) { 20967635Smckusick printf("\tVOPARG_OFFSETOF(struct %s_args, a_%s),\n", 21067635Smckusick name, argname[i]); 21167635Smckusick return i; 21267635Smckusick }; 21367635Smckusick }; 21467635Smckusick print "\tVDESC_NO_OFFSET,"; 21567635Smckusick return -1; 21667635Smckusick} 21754725Sbostic 21867635Smckusickfunction doit() { 21967635Smckusick # Define offsets array 22067635Smckusick printf("\nint %s_vp_offsets[] = {\n", name); 22167635Smckusick for (i=0; i<argc; i++) { 22267635Smckusick if (argtype[i] == "struct vnode *") { 22367635Smckusick printf ("\tVOPARG_OFFSETOF(struct %s_args,a_%s),\n", 22467635Smckusick name, argname[i]); 22567635Smckusick } 22655323Sheideman } 22767635Smckusick print "\tVDESC_NO_OFFSET"; 22867635Smckusick print "};"; 22967635Smckusick # Define F_desc 23067635Smckusick printf("struct vnodeop_desc %s_desc = {\n", name); 23167635Smckusick # offset 23267635Smckusick printf ("\t0,\n"); 23367635Smckusick # printable name 23467635Smckusick printf ("\t\"%s\",\n", name); 23567635Smckusick # flags 23667635Smckusick printf("\t0"); 23767635Smckusick vpnum = 0; 23867635Smckusick for (i=0; i<argc; i++) { 23967635Smckusick if (willrele[i]) { 24067635Smckusick if (argdir[i] ~ /OUT/) { 24167635Smckusick printf(" | VDESC_VPP_WILLRELE"); 24255323Sheideman } else { 24367635Smckusick printf(" | VDESC_VP%s_WILLRELE", vpnum); 24455323Sheideman }; 24567635Smckusick vpnum++; 24667635Smckusick } 24755323Sheideman } 24867635Smckusick print ","; 24967635Smckusick # vp offsets 25067635Smckusick printf ("\t%s_vp_offsets,\n", name); 25167635Smckusick # vpp (if any) 25267635Smckusick do_offset("struct vnode **"); 25367635Smckusick # cred (if any) 25467635Smckusick do_offset("struct ucred *"); 25567635Smckusick # proc (if any) 25667635Smckusick do_offset("struct proc *"); 25767635Smckusick # componentname 25867635Smckusick do_offset("struct componentname *"); 25967635Smckusick # transport layer information 26067635Smckusick printf ("\tNULL,\n};\n"); 26167635Smckusick} 26267635SmckusickEND { 26367635Smckusick printf("\n/* Special cases: */\n"); 26467635Smckusick argc=1; 26567635Smckusick argdir[0]="IN"; 26667635Smckusick argtype[0]="struct buf *"; 26767635Smckusick argname[0]="bp"; 26867635Smckusick willrele[0]=0; 26967635Smckusick name="vop_strategy"; 27067635Smckusick doit(); 27167635Smckusick name="vop_bwrite"; 27267635Smckusick doit(); 27367635Smckusick} 274*67793Smckusick'"$awk_parser" | sed -e "$space_elim" 27555323Sheideman 27667635Smckusick# End stuff 27767635Smckusickecho ' 27867635Smckusick/* End of special cases. */' 27955323Sheideman 28067635Smckusick# Add the vfs_op_descs array to the C file. 28167635Smckusick# Begin stuff 28267635Smckusickecho ' 28367635Smckusickstruct vnodeop_desc *vfs_op_descs[] = { 28467635Smckusick &vop_default_desc, /* MUST BE FIRST */ 28567635Smckusick &vop_strategy_desc, /* XXX: SPECIAL CASE */ 28667635Smckusick &vop_bwrite_desc, /* XXX: SPECIAL CASE */ 28767635Smckusick' 28854725Sbostic 28967635Smckusick# Body stuff 29067635Smckusicksed -e "$sed_prep" $src | $awk ' 29167635Smckusickfunction doit() { 29267635Smckusick printf("\t&%s_desc,\n", name); 29354646Smckusick} 29467635Smckusick'"$awk_parser" 29554646Smckusick 29667635Smckusick# End stuff 29767635Smckusickecho ' NULL 29854646Smckusick}; 29967635Smckusick' 30054646Smckusick 30167635Smckusickexit 0 30254725Sbostic 30367635Smckusick# Local Variables: 30467635Smckusick# tab-width: 4 30567635Smckusick# End: 306