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