makelintstub revision 1.3 1 #!/bin/sh -
2 # $NetBSD: makelintstub,v 1.3 1998/03/01 10:20:06 fvdl Exp $
3 #
4 # Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
14 # 3. All advertising materials mentioning features or use of this software
15 # must display the following acknowledgement:
16 # This product includes software developed for the NetBSD Project
17 # by Christopher G. Demetriou.
18 # 4. The name of the author may not be used to endorse or promote products
19 # derived from this software without specific prior written permission
20 #
21 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32 usage()
33 {
34
35 echo "usage: $0 [-n|-p] [-o filename] object ..."
36 exit 1
37 }
38
39 header()
40 {
41
42 cat <<- __EOF__
43 /*
44 * THIS IS AN AUTOMATICALLY GENERATED FILE. DO NOT EDIT.
45 */
46
47 #include <sys/param.h>
48 #include <sys/time.h>
49 #include <sys/mount.h>
50 #include <sys/stat.h>
51 #include <ufs/ufs/dinode.h>
52 #include <ufs/lfs/lfs.h>
53 #include <sys/resource.h>
54 #include <sys/poll.h>
55 #include <sys/uio.h>
56 #include <sys/ipc.h>
57 #include <sys/msg.h>
58 #include <sys/sem.h>
59 #include <sys/shm.h>
60 #include <sys/timex.h>
61 #include <sys/socket.h>
62 #ifdef __STDC__
63 #include <stdarg.h>
64 #else
65 #include <varargs.h>
66 #endif
67
68 __EOF__
69 }
70
71 syscall_stub()
72 {
73
74 syscallhdr="$1"
75 syscallname="$2"
76 funcname="$3"
77
78 arglist="`printf '#include "'"$syscallhdr"'"' | cpp -C | \
79 grep '^/\* syscall: "'"$syscallname"'" ' | \
80 sed -e 's,^/\* syscall: ,,;s, \*/$,,'`"
81
82 eval set -f -- "$arglist"
83
84 if [ $# -lt 4 ]; then
85 echo syscall $syscallname not found! 1>&2
86 exit 1
87 fi
88
89 syscallname=$1
90 shift 2 # kill name and "ret:"
91 returntype=$1
92 shift 2 # kill return type and "args:"
93
94 cat <<- __EOF__
95 /*ARGSUSED*/
96 $returntype
97 __EOF__
98
99 if [ "`eval echo -n \\$$#`" = "..." ]; then
100 varargs=YES
101 nargs=$(($# - 1))
102 else
103 varargs=NO
104 nargs=$#
105 fi
106 nargswithva=$#
107
108 # do ANSI C function header
109 if [ $varargs = YES ]; then
110 echo "#ifdef __STDC__"
111
112 echo -n "$funcname("
113 i=1
114 while [ $i -le $nargs ]; do
115 eval echo -n \""\$$i"\"
116 echo -n " arg$i"
117 if [ $i -lt $nargswithva ]; then
118 echo -n ", "
119 fi
120 i=$(($i + 1))
121 done
122 if [ $varargs = YES ]; then
123 echo -n "..."
124 fi
125 echo ")"
126
127 # do K&R C function header
128 echo "#else"
129 fi
130
131 echo -n "$funcname("
132 i=1
133 while [ $i -le $nargs ]; do
134 echo -n "arg$i"
135 if [ $i -lt $nargswithva ]; then
136 echo -n ", "
137 fi
138 i=$(($i + 1))
139 done
140 if [ $varargs = YES ]; then
141 echo -n "va_alist"
142 fi
143 echo ")"
144 i=1
145 while [ $i -le $nargs ]; do
146 eval echo -n \"" \$$i"\"
147 echo " arg$i;"
148 i=$(($i + 1))
149 done
150 if [ $varargs = YES ]; then
151 echo " va_dcl"
152 fi
153
154 # do function body
155 if [ $varargs = YES ]; then
156 echo "#endif"
157 fi
158 echo "{"
159 if [ "$returntype" != "void" ]; then
160 echo " return (($returntype)0);"
161 fi
162 echo "}"
163 }
164
165 trailer()
166 {
167
168 cat <<- __EOF__
169 /* END */
170 __EOF__
171 }
172
173 set -- `getopt no:ps: $*`
174
175 pflag=NO
176 nflag=NO
177 oarg=""
178 syscallhdr=/usr/include/sys/syscall.h
179
180 if test $? -ne 0; then
181 usage
182 fi
183 for i; do
184 case "$i" in
185 -n) nflag=YES; shift;;
186 -o) oarg=$2; shift; shift;;
187 -p) pflag=YES; shift;;
188 -s) syscallhdr=$2; shift; shift;;
189 --) shift; break;;
190 esac
191 done
192
193 if [ $pflag = YES ] && [ $nflag = YES ]; then
194 echo "$0: -n flag and -p flag may not be used together"
195 echo ""
196 usage
197 fi
198
199 if [ "X$oarg" != "X" ]; then
200 exec > $oarg
201 fi
202
203 header
204 for syscall; do
205 fnname=`echo $syscall | sed -e 's,\.o$,,'`
206 if [ $pflag = YES ]; then
207 scname=`echo $fnname | sed -e 's,^_,,'`
208 else
209 scname=$fnname
210 fi
211 syscall_stub $syscallhdr $scname $fnname
212 echo ""
213 done
214 trailer
215
216 exit 0
217