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