localedef: Improve cc_list parsing
[dragonfly.git] / sys / kern / makesyscalls.sh
blobdfd147299a4febf964428ea93ba0b6dce33f2b74
1 #! /bin/sh -
2 # @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93
3 # $FreeBSD: src/sys/kern/makesyscalls.sh,v 1.39.2.4 2001/10/20 09:01:24 marcel Exp $
5 set -e
7 # name of compat option:
8 compat=COMPAT_43
10 # output files:
11 sysnames="syscalls.c"
12 sysproto="../sys/sysproto.h"
13 sysunion="../sys/sysunion.h"
14 sysproto_h=_SYS_SYSPROTO_H_
15 syshdr="../sys/syscall.h"
16 sysmk="../sys/syscall.mk"
17 syssw="init_sysent.c"
18 syscallprefix="SYS_"
19 switchname="sysent"
20 namesname="syscallnames"
22 # tmp files:
23 sysdcl="sysent.dcl.$$"
24 syscompat="sysent.compat.$$"
25 syscompatdcl="sysent.compatdcl.$$"
26 sysent="sysent.switch.$$"
27 sysinc="sysinc.switch.$$"
28 sysarg="sysarg.switch.$$"
29 sysun="sysunion.switch.$$"
31 trap "rm $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg $sysun" 0
33 touch $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg $sysun
35 case $# in
36 0) echo "Usage: $0 input-file <config-file>" 1>&2
37 exit 1
39 esac
41 if [ -n "$2" -a -f "$2" ]; then
42 . $2
45 sed -e '
46 s/\$//g
47 :join
48 /\\$/{a\
51 s/\\\n//
52 b join
54 2,${
55 /^#/!s/\([{}()*,]\)/ \1 /g
57 ' < $1 | awk "
58 BEGIN {
59 sysdcl = \"$sysdcl\"
60 sysproto = \"$sysproto\"
61 sysproto_h = \"$sysproto_h\"
62 syscompat = \"$syscompat\"
63 syscompatdcl = \"$syscompatdcl\"
64 sysent = \"$sysent\"
65 syssw = \"$syssw\"
66 sysinc = \"$sysinc\"
67 sysarg = \"$sysarg\"
68 sysun = \"$sysun\"
69 sysnames = \"$sysnames\"
70 syshdr = \"$syshdr\"
71 sysmk = \"$sysmk\"
72 compat = \"$compat\"
73 syscallprefix = \"$syscallprefix\"
74 switchname = \"$switchname\"
75 namesname = \"$namesname\"
76 infile = \"$1\"
79 printf "/*\n * System call switch table.\n *\n" > syssw
80 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > syssw
81 printf " * by running make sysent in the same directory.\n" > syssw
82 printf " */\n\n" > syssw
84 printf "/*\n * System call prototypes.\n *\n" > sysarg
85 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysarg
86 printf " * by running make sysent in the same directory.\n" > sysarg
87 printf " */\n\n" > sysarg
88 printf "#ifndef %s\n", sysproto_h > sysarg
89 printf "#define\t%s\n\n", sysproto_h > sysarg
90 printf "#include <sys/select.h>\n\n" > sysarg
91 printf "#include <sys/signal.h>\n\n" > sysarg
92 printf "#include <sys/acl.h>\n\n" > sysarg
93 printf "#include <sys/msgport.h>\n\n" > sysarg
94 printf "#include <sys/sysmsg.h>\n\n" > sysarg
95 printf "#include <sys/procctl.h>\n\n" > sysarg
96 printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg
97 printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg
99 printf "\n#ifdef %s\n\n", compat > syscompat
101 printf "/*\n * System call names.\n *\n" > sysnames
102 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysnames
103 printf " * by running make sysent in the same directory.\n" > sysnames
104 printf " */\n\n" > sysnames
105 printf "const char *%s[] = {\n", namesname > sysnames
107 printf "/*\n * System call numbers.\n *\n" > syshdr
108 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > syshdr
109 printf " * by running make sysent in the same directory.\n" > syshdr
110 printf " */\n\n" > syshdr
112 printf "# DragonFly system call names.\n" > sysmk
113 printf "# DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysmk
114 printf "# by running make sysent in the same directory.\n" > sysmk
115 printf "MIASM = " > sysmk
117 printf "/*\n * Union of syscall args for messaging.\n *\n" > sysun
118 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysun
119 printf " * by running make sysent in the same directory.\n" > sysun
120 printf " */\n\n" > sysun
121 printf "union sysunion {\n" > sysun
122 printf "#ifdef _KERNEL /* header only applies in kernel */\n" > sysun
123 printf "\tstruct\tlwkt_msg lmsg;\n" > sysun
124 printf "\tstruct\tsysmsg sysmsg;\n" > sysun
125 printf "#endif\n" > sysun
127 printf "\n/* The casts are bogus but will do for now. */\n" > sysent
128 printf "struct sysent %s[] = {\n",switchname > sysent
130 printf "\n#ifdef _KERNEL\n\n" > sysdcl
131 printf "\n#ifdef _KERNEL\n\n" > syscompatdcl
133 NF == 0 || $1 ~ /^;/ {
134 next
136 $1 ~ /^#[ ]*include/ {
137 print > sysinc
138 next
140 $1 ~ /^#[ ]*if/ {
141 print > sysent
142 print > sysdcl
143 print > sysarg
144 print > syscompat
145 print > sysnames
146 print > sysun
147 savesyscall = syscall
148 next
150 $1 ~ /^#[ ]*else/ {
151 print > sysent
152 print > sysdcl
153 print > sysarg
154 print > sysun
155 print > syscompat
156 print > sysnames
157 syscall = savesyscall
158 next
160 $1 ~ /^#/ {
161 print > sysent
162 print > sysdcl
163 print > sysarg
164 print > sysun
165 print > syscompat
166 print > sysnames
167 next
169 syscall != $1 {
170 printf "%s: line %d: syscall number out of sync at %d\n",
171 infile, NR, syscall
172 printf "line is:\n"
173 print
174 exit 1
176 function align_sysent_comment(column) {
177 printf("\t") > sysent
178 column = column + 8 - column % 8
179 while (column < 56) {
180 printf("\t") > sysent
181 column = column + 8
184 function parserr(was, wanted) {
185 printf "%s: line %d: unexpected %s (expected %s)\n",
186 infile, NR, was, wanted
187 exit 1
189 function parseline() {
190 f=3 # toss number and type
191 argc= 0;
192 argssize = "0"
193 if ($NF != "}") {
194 funcalias=$(NF-2)
195 argalias=$(NF-1)
196 rettype=$NF
197 end=NF-3
198 } else {
199 funcalias=""
200 argalias=""
201 rettype="int"
202 end=NF
204 if ($2 == "NODEF") {
205 funcname=$3
206 argssize = "AS(" $5 ")"
207 return
209 if ($f != "{")
210 parserr($f, "{")
212 if ($end != "}")
213 parserr($end, "}")
214 end--
215 if ($end != ";")
216 parserr($end, ";")
217 end--
218 if ($end != ")")
219 parserr($end, ")")
220 end--
222 f++ #function return type
224 funcname=$f
225 usefuncname=$f
226 if (funcalias == "")
227 funcalias = funcname
228 if (argalias == "") {
229 argalias = funcname "_args"
230 if ($2 == "COMPAT") {
231 argalias = "o" argalias
232 usefuncname = "sys_o" funcname
237 if ($f != "(")
238 parserr($f, ")")
241 if (f == end) {
242 if ($f != "void")
243 parserr($f, "argument definition")
244 return
247 while (f <= end) {
248 argc++
249 argtype[argc]=""
250 oldf=""
251 while (f < end && $(f+1) != ",") {
252 if (argtype[argc] != "" && oldf != "*")
253 argtype[argc] = argtype[argc]" ";
254 argtype[argc] = argtype[argc]$f;
255 oldf = $f;
258 if (argtype[argc] == "")
259 parserr($f, "argument definition")
260 argname[argc]=$f;
261 f += 2; # skip name, and any comma
263 if (argc != 0)
264 argssize = "AS(" argalias ")"
266 { comment = $3
267 if (NF < 6)
268 for (i = 4; i <= NF; i++)
269 comment = comment " " $i
271 $2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "NOPROTO" \
272 || $2 == "NOIMPL" {
273 parseline()
274 if ((!nosys || funcname != "nosys") && \
275 (funcname != "lkmnosys")) {
276 if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") {
277 printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
278 printf("struct\t%s {\n", argalias) > sysarg
279 printf("#ifdef _KERNEL\n") > sysarg
280 printf("\tstruct sysmsg sysmsg;\n") > sysarg
281 printf("#endif\n") > sysarg
282 for (i = 1; i <= argc; i++)
283 printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n",
284 argtype[i], argname[i],
285 argname[i], argtype[i]) > sysarg
286 printf("};\n") > sysarg
288 else if ($2 != "NOARGS" && $2 != "NOPROTO" && \
289 $2 != "NODEF") {
290 printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
291 printf("struct\t%s {\n", argalias) > sysarg
292 printf("#ifdef _KERNEL\n") > sysarg
293 printf("\tstruct sysmsg sysmsg;\n") > sysarg
294 printf("#endif\n") > sysarg
295 printf("\tregister_t dummy;\n") > sysarg
296 printf("};\n") > sysarg
299 if (($2 != "NOPROTO" && $2 != "NODEF" && \
300 (funcname != "nosys" || !nosys)) || \
301 (funcname == "lkmnosys" && !lkmnosys) || \
302 funcname == "lkmressys") {
303 printf("%s\tsys_%s (struct %s *)",
304 rettype, funcname, argalias) > sysdcl
305 printf(";\n") > sysdcl
307 if (funcname == "nosys")
308 nosys = 1
309 if (funcname == "lkmnosys")
310 lkmnosys = 1
311 printf("\t{ %s, (sy_call_t *)", argssize) > sysent
312 column = 8 + 2 + length(argssize) + 15
313 if ($2 != "NOIMPL") {
314 printf("sys_%s },", funcname) > sysent
315 column = column + length(funcname) + 7
316 } else {
317 printf("sys_%s },", "nosys") > sysent
318 column = column + length("nosys") + 7
320 align_sysent_comment(column)
321 printf("/* %d = %s */\n", syscall, funcalias) > sysent
322 printf("\t\"%s\",\t\t\t/* %d = %s */\n",
323 funcalias, syscall, funcalias) > sysnames
324 if ($2 != "NODEF") {
325 printf("#define\t%s%s\t%d\n", syscallprefix,
326 funcalias, syscall) > syshdr
327 printf(" \\\n\t%s.o", funcalias) > sysmk
329 syscall++
330 next
332 $2 == "COMPAT" || $2 == "CPT_NOA" {
333 ncompat++
334 parseline()
335 if (argc != 0 && $2 != "CPT_NOA") {
336 printf("#ifdef %s\n", compat) > sysun
337 printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
338 printf("#endif\n") > sysun
339 printf("struct\t%s {\n", argalias) > syscompat
340 printf("#ifdef _KERNEL\n") > syscompat
341 printf("\tstruct sysmsg sysmsg;\n") > syscompat
342 printf("#endif\n") > syscompat
343 for (i = 1; i <= argc; i++)
344 printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n",
345 argtype[i], argname[i],
346 argname[i], argtype[i]) > syscompat
347 printf("};\n") > syscompat
349 else if($2 != "CPT_NOA") {
350 printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
351 printf("struct\t%s {\n", argalias) > sysarg
352 printf("#ifdef _KERNEL\n") > sysarg
353 printf("\tstruct sysmsg sysmsg;\n") > sysarg
354 printf("#endif\n") > sysarg
355 printf("\tregister_t dummy;\n") > sysarg
356 printf("};\n") > sysarg
358 printf("%s\tsys_o%s (struct %s *);\n",
359 rettype, funcname, argalias) > syscompatdcl
360 printf("\t{ compat(%s,%s) },",
361 argssize, funcname) > sysent
362 align_sysent_comment(8 + 9 + \
363 length(argssize) + 1 + length(funcname) + 4)
364 printf("/* %d = old %s */\n", syscall, funcalias) > sysent
365 printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
366 funcalias, syscall, funcalias) > sysnames
367 printf("\t\t\t\t/* %d is old %s */\n",
368 syscall, funcalias) > syshdr
369 syscall++
370 next
372 $2 == "LIBCOMPAT" {
373 ncompat++
374 parseline()
375 printf("%s\tsys_o%s();\n", rettype, funcname) > syscompatdcl
376 printf("\t{ compat(%s,%s) },",
377 argssize, funcname) > sysent
378 align_sysent_comment(8 + 9 + \
379 length(argssize) + 1 + length(funcname) + 4)
380 printf("/* %d = old %s */\n", syscall, funcalias) > sysent
381 printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
382 funcalias, syscall, funcalias) > sysnames
383 printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n",
384 syscallprefix, funcalias, syscall) > syshdr
385 printf(" \\\n\t%s.o", funcalias) > sysmk
386 syscall++
387 next
389 $2 == "OBSOL" {
390 printf("\t{ 0, (sy_call_t *)sys_nosys },") > sysent
391 align_sysent_comment(37)
392 printf("/* %d = obsolete %s */\n", syscall, comment) > sysent
393 printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n",
394 $3, syscall, comment) > sysnames
395 printf("\t\t\t\t/* %d is obsolete %s */\n",
396 syscall, comment) > syshdr
397 syscall++
398 next
400 $2 == "UNIMPL" {
401 printf("\t{ 0, (sy_call_t *)sys_nosys },\t\t\t/* %d = %s */\n",
402 syscall, comment) > sysent
403 printf("\t\"#%d\",\t\t\t/* %d = %s */\n",
404 syscall, syscall, comment) > sysnames
405 syscall++
406 next
409 printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2
410 exit 1
412 END {
413 printf "\n#define AS(name) ((sizeof(struct name) - sizeof(struct sysmsg)) / sizeof(register_t))\n" > sysinc
414 if (ncompat != 0) {
415 printf "#include \"opt_compat.h\"\n\n" > syssw
416 printf "\n#ifdef %s\n", compat > sysinc
417 printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(sys_,__CONCAT(o,name))\n" > sysinc
418 printf "#else\n" > sysinc
419 printf "#define compat(n, name) 0, (sy_call_t *)sys_nosys\n" > sysinc
420 printf "#endif\n" > sysinc
423 printf("\n#endif /* _KERNEL */\n") > syscompatdcl
424 printf("\n#endif /* %s */\n\n", compat) > syscompatdcl
426 printf("\n") > sysmk
427 printf("};\n") > sysent
428 printf("};\n") > sysnames
429 printf("};\n") > sysun
430 printf("\n#endif /* !%s */\n", sysproto_h) > sysdcl
431 printf("#undef PAD_\n") > sysdcl
432 printf("\n#endif /* _KERNEL */\n") > sysdcl
433 printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
434 > syshdr
437 cat $sysinc $sysent >> $syssw
438 cat $sysarg $syscompat $syscompatdcl $sysdcl > $sysproto
439 cat $sysun > $sysunion