xref: /csrg-svn/sys/kern/vnode_if.sh (revision 67635)
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