154646Smckusick#!/bin/sh - 268305Scgdcopyright=' 368305Scgd/* 4*69392Smckusick * Copyright (c) 1992, 1993, 1994, 1995 568305Scgd * The Regents of the University of California. All rights reserved. 668305Scgd * 768305Scgd * %sccs.include.redist.sh% 868305Scgd * 968305Scgd * from: NetBSD: vnode_if.sh,v 1.7 1994/08/25 03:04:28 cgd Exp $ 1068305Scgd */ 1168305Scgd' 12*69392SmckusickSCRIPT_ID='@(#)vnode_if.sh 8.7 (Berkeley) 05/11/95' 1354646Smckusick 1454646Smckusick# Script to produce VFS front-end sugar. 1554725Sbostic# 1654725Sbostic# usage: vnode_if.sh srcfile 1754725Sbostic# (where srcfile is currently /sys/kern/vnode_if.src) 1854725Sbostic# 1954646Smckusick 2054725Sbosticif [ $# -ne 1 ] ; then 2155323Sheideman echo 'usage: vnode_if.sh srcfile' 2254725Sbostic exit 1 2354725Sbosticfi 2454725Sbostic 2554725Sbostic# Name of the source file. 2667635Smckusicksrc=$1 2754725Sbostic 2854725Sbostic# Names of the created files. 2967635Smckusickout_c=vnode_if.c 3067635Smckusickout_h=vnode_if.h 3154725Sbostic 3267635Smckusick# Awk program (must support nawk extensions) 3367635Smckusick# Use "awk" at Berkeley, "nawk" or "gawk" elsewhere. 3467635Smckusickawk=${AWK:-awk} 3555323Sheideman 3667635Smckusick# Does this awk have a "toupper" function? (i.e. is it GNU awk) 3767635Smckusickisgawk=`$awk 'BEGIN { print toupper("true"); exit; }' 2>/dev/null` 3867635Smckusick 3967635Smckusick# If this awk does not define "toupper" then define our own. 4067635Smckusickif [ "$isgawk" = TRUE ] ; then 4167635Smckusick # GNU awk provides it. 4267635Smckusick toupper= 4367635Smckusickelse 4467635Smckusick # Provide our own toupper() 4567635Smckusick toupper=' 4667635Smckusickfunction toupper(str) { 4767635Smckusick _toupper_cmd = "echo "str" |tr a-z A-Z" 4867635Smckusick _toupper_cmd | getline _toupper_str; 4967635Smckusick close(_toupper_cmd); 5067635Smckusick return _toupper_str; 5167635Smckusick}' 5267635Smckusickfi 5367635Smckusick 5467635Smckusick# 5567635Smckusick# This is the common part of all awk programs that read $src 5667635Smckusick# This parses the input for one function into the arrays: 5767635Smckusick# argdir, argtype, argname, willrele 5867635Smckusick# and calls "doit()" to generate output for the function. 5967635Smckusick# 6067635Smckusick# Input to this parser is pre-processed slightly by sed 6167635Smckusick# so this awk parser doesn't have to work so hard. The 6267635Smckusick# changes done by the sed pre-processing step are: 6367635Smckusick# insert a space beween * and pointer name 6467635Smckusick# replace semicolons with spaces 6567635Smckusick# 6667635Smckusicksed_prep='s:\*\([^\*/]\):\* \1:g 6767635Smckusicks/;/ /' 6867635Smckusickawk_parser=' 6967635Smckusick# Comment line 7067635Smckusick/^#/ { next; } 7167635Smckusick# First line of description 7267635Smckusick/^vop_/ { 7367635Smckusick name=$1; 7467635Smckusick argc=0; 7567635Smckusick next; 7667635Smckusick} 7767635Smckusick# Last line of description 7867635Smckusick/^}/ { 7967635Smckusick doit(); 8067635Smckusick next; 8167635Smckusick} 8267635Smckusick# Middle lines of description 8367635Smckusick{ 8467635Smckusick argdir[argc] = $1; i=2; 8567635Smckusick if ($2 == "WILLRELE") { 8667635Smckusick willrele[argc] = 1; 8767635Smckusick i++; 8867635Smckusick } else 8967635Smckusick willrele[argc] = 0; 9067793Smckusick argtype[argc] = $i; i++; 9167635Smckusick while (i < NF) { 9267793Smckusick argtype[argc] = argtype[argc]" "$i; 9367635Smckusick i++; 9467635Smckusick } 9567635Smckusick argname[argc] = $i; 9667635Smckusick argc++; 9767635Smckusick next; 9867635Smckusick} 9967635Smckusick' 10067635Smckusick 10167635Smckusick# This is put after the copyright on each generated file. 10267635Smckusickwarning=" 10354646Smckusick/* 10467635Smckusick * Warning: This file is generated automatically. 10567635Smckusick * (Modifications made here may easily be lost!) 10654646Smckusick * 10767635Smckusick * Created by the script: 10867635Smckusick * ${SCRIPT_ID} 10954646Smckusick */ 11067635Smckusick" 11154725Sbostic 11267793Smckusick# Get rid of ugly spaces 11367793Smckusickspace_elim='s:\([^/]\*\) :\1:g' 11467635Smckusick 11567635Smckusick# 11667635Smckusick# Redirect stdout to the H file. 11767635Smckusick# 11867635Smckusickecho "$0: Creating $out_h" 1>&2 11967635Smckusickexec > $out_h 12067635Smckusick 12167635Smckusick# Begin stuff 12267635Smckusickecho "$copyright" 12367635Smckusickecho "$warning" 12467635Smckusickecho ' 12554646Smckusickextern struct vnodeop_desc vop_default_desc; 12667635Smckusick' 12754646Smckusick 12867635Smckusick# Body stuff 12967635Smckusick# This awk program needs toupper() so define it if necessary. 13067635Smckusicksed -e "$sed_prep" $src | $awk "$toupper"' 13167635Smckusickfunction doit() { 13267635Smckusick # Declare arg struct, descriptor. 13367635Smckusick printf("\nstruct %s_args {\n", name); 13467793Smckusick printf("\tstruct vnodeop_desc * a_desc;\n"); 13567635Smckusick for (i=0; i<argc; i++) { 13667793Smckusick printf("\t%s a_%s;\n", argtype[i], argname[i]); 13754646Smckusick } 13867635Smckusick printf("};\n"); 13967635Smckusick printf("extern struct vnodeop_desc %s_desc;\n", name); 14067635Smckusick # Define inline function. 141*69392Smckusick printf("#define %s(", toupper(name)); 14267635Smckusick for (i=0; i<argc; i++) { 14367635Smckusick printf("%s", argname[i]); 14467635Smckusick if (i < (argc-1)) printf(", "); 14567635Smckusick } 146*69392Smckusick printf(") _%s(", toupper(name)); 147*69392Smckusick for (i=0; i<argc; i++) { 148*69392Smckusick printf("%s", argname[i]); 149*69392Smckusick if (i < (argc-1)) printf(", "); 150*69392Smckusick } 15167635Smckusick printf(")\n"); 152*69392Smckusick printf("static __inline int _%s(", toupper(name)); 15367635Smckusick for (i=0; i<argc; i++) { 154*69392Smckusick printf("%s", argname[i]); 155*69392Smckusick if (i < (argc-1)) printf(", "); 156*69392Smckusick } 157*69392Smckusick printf(")\n"); 158*69392Smckusick for (i=0; i<argc; i++) { 15967793Smckusick printf("\t%s %s;\n", argtype[i], argname[i]); 16067635Smckusick } 16167793Smckusick printf("{\n\tstruct %s_args a;\n", name); 16267635Smckusick printf("\ta.a_desc = VDESC(%s);\n", name); 16367635Smckusick for (i=0; i<argc; i++) { 16467635Smckusick printf("\ta.a_%s = %s;\n", argname[i], argname[i]); 16567635Smckusick } 16667635Smckusick printf("\treturn (VCALL(%s%s, VOFFSET(%s), &a));\n}\n", 16767635Smckusick argname[0], arg0special, name); 16867635Smckusick} 16967635SmckusickBEGIN { 17067635Smckusick arg0special=""; 17167635Smckusick} 17267635SmckusickEND { 17367635Smckusick printf("\n/* Special cases: */\n#include <sys/buf.h>\n"); 17467635Smckusick argc=1; 17567635Smckusick argtype[0]="struct buf *"; 17667635Smckusick argname[0]="bp"; 17767635Smckusick arg0special="->b_vp"; 17867635Smckusick name="vop_strategy"; 17967635Smckusick doit(); 18067635Smckusick name="vop_bwrite"; 18167635Smckusick doit(); 18267635Smckusick} 18367793Smckusick'"$awk_parser" | sed -e "$space_elim" 18454646Smckusick 18567635Smckusick# End stuff 18667635Smckusickecho ' 18767635Smckusick/* End of special cases. */' 18854646Smckusick 18954646Smckusick 19067635Smckusick# 19167635Smckusick# Redirect stdout to the C file. 19267635Smckusick# 19367635Smckusickecho "$0: Creating $out_c" 1>&2 19467635Smckusickexec > $out_c 19554646Smckusick 19667635Smckusick# Begin stuff 19767635Smckusickecho "$copyright" 19867635Smckusickecho "$warning" 19967635Smckusickecho ' 20054725Sbostic#include <sys/param.h> 20154725Sbostic#include <sys/mount.h> 20254725Sbostic#include <sys/vnode.h> 20354725Sbostic 20454725Sbosticstruct vnodeop_desc vop_default_desc = { 20554725Sbostic 0, 20654725Sbostic "default", 20754725Sbostic 0, 20854725Sbostic NULL, 20954725Sbostic VDESC_NO_OFFSET, 21054725Sbostic VDESC_NO_OFFSET, 21154725Sbostic VDESC_NO_OFFSET, 21255323Sheideman VDESC_NO_OFFSET, 21354725Sbostic NULL, 21454725Sbostic}; 21567635Smckusick' 21654725Sbostic 21767635Smckusick# Body stuff 21867635Smckusicksed -e "$sed_prep" $src | $awk ' 21967635Smckusickfunction do_offset(typematch) { 22067635Smckusick for (i=0; i<argc; i++) { 22167635Smckusick if (argtype[i] == typematch) { 22267635Smckusick printf("\tVOPARG_OFFSETOF(struct %s_args, a_%s),\n", 22367635Smckusick name, argname[i]); 22467635Smckusick return i; 22567635Smckusick }; 22667635Smckusick }; 22767635Smckusick print "\tVDESC_NO_OFFSET,"; 22867635Smckusick return -1; 22967635Smckusick} 23054725Sbostic 23167635Smckusickfunction doit() { 23267635Smckusick # Define offsets array 23367635Smckusick printf("\nint %s_vp_offsets[] = {\n", name); 23467635Smckusick for (i=0; i<argc; i++) { 23567635Smckusick if (argtype[i] == "struct vnode *") { 23667635Smckusick printf ("\tVOPARG_OFFSETOF(struct %s_args,a_%s),\n", 23767635Smckusick name, argname[i]); 23867635Smckusick } 23955323Sheideman } 24067635Smckusick print "\tVDESC_NO_OFFSET"; 24167635Smckusick print "};"; 24267635Smckusick # Define F_desc 24367635Smckusick printf("struct vnodeop_desc %s_desc = {\n", name); 24467635Smckusick # offset 24567635Smckusick printf ("\t0,\n"); 24667635Smckusick # printable name 24767635Smckusick printf ("\t\"%s\",\n", name); 24867635Smckusick # flags 24967635Smckusick printf("\t0"); 25067635Smckusick vpnum = 0; 25167635Smckusick for (i=0; i<argc; i++) { 25267635Smckusick if (willrele[i]) { 25367635Smckusick if (argdir[i] ~ /OUT/) { 25467635Smckusick printf(" | VDESC_VPP_WILLRELE"); 25555323Sheideman } else { 25667635Smckusick printf(" | VDESC_VP%s_WILLRELE", vpnum); 25755323Sheideman }; 25867635Smckusick vpnum++; 25967635Smckusick } 26055323Sheideman } 26167635Smckusick print ","; 26267635Smckusick # vp offsets 26367635Smckusick printf ("\t%s_vp_offsets,\n", name); 26467635Smckusick # vpp (if any) 26567635Smckusick do_offset("struct vnode **"); 26667635Smckusick # cred (if any) 26767635Smckusick do_offset("struct ucred *"); 26867635Smckusick # proc (if any) 26967635Smckusick do_offset("struct proc *"); 27067635Smckusick # componentname 27167635Smckusick do_offset("struct componentname *"); 27267635Smckusick # transport layer information 27367635Smckusick printf ("\tNULL,\n};\n"); 27467635Smckusick} 27567635SmckusickEND { 27667635Smckusick printf("\n/* Special cases: */\n"); 27767635Smckusick argc=1; 27867635Smckusick argdir[0]="IN"; 27967635Smckusick argtype[0]="struct buf *"; 28067635Smckusick argname[0]="bp"; 28167635Smckusick willrele[0]=0; 28267635Smckusick name="vop_strategy"; 28367635Smckusick doit(); 28467635Smckusick name="vop_bwrite"; 28567635Smckusick doit(); 28667635Smckusick} 28767793Smckusick'"$awk_parser" | sed -e "$space_elim" 28855323Sheideman 28967635Smckusick# End stuff 29067635Smckusickecho ' 29167635Smckusick/* End of special cases. */' 29255323Sheideman 29367635Smckusick# Add the vfs_op_descs array to the C file. 29467635Smckusick# Begin stuff 29567635Smckusickecho ' 29667635Smckusickstruct vnodeop_desc *vfs_op_descs[] = { 29767635Smckusick &vop_default_desc, /* MUST BE FIRST */ 29867635Smckusick &vop_strategy_desc, /* XXX: SPECIAL CASE */ 29967635Smckusick &vop_bwrite_desc, /* XXX: SPECIAL CASE */ 30067635Smckusick' 30154725Sbostic 30267635Smckusick# Body stuff 30367635Smckusicksed -e "$sed_prep" $src | $awk ' 30467635Smckusickfunction doit() { 30567635Smckusick printf("\t&%s_desc,\n", name); 30654646Smckusick} 30767635Smckusick'"$awk_parser" 30854646Smckusick 30967635Smckusick# End stuff 31067635Smckusickecho ' NULL 31154646Smckusick}; 31267635Smckusick' 31354646Smckusick 31467635Smckusickexit 0 31554725Sbostic 31667635Smckusick# Local Variables: 31767635Smckusick# tab-width: 4 31867635Smckusick# End: 319