987cebe325f5b23026399462b36c8488928bfd72
[jlayton/glibc.git] / mach / shortcut.awk
1 # Icky intimate knowledge of MiG output.
2
3 BEGIN { print "/* This file is generated by shortcut.awk.  */";
4         echo=1;
5         inproto=0; proto=""; arglist="";
6       }
7
8 $1 == "LINTLIBRARY" { print "#include <mach.h>"; next }
9
10 # Copy the first line of the definition, but
11 # replace the function name (RPC) with CALL.
12 $NF == rpc \
13   {
14     for (i = 1; i < NF; ++i) printf "%s ", $i;
15     print call;
16     next;
17   }
18
19 # Collect the lines of the prototype in PROTO, and extract the parameter
20 # names into ARGLIST.
21 NF == 1 && $1 == ")" { inproto=0 }
22 inproto { proto = proto $0;
23           arg = $NF;
24           gsub(/[^a-zA-Z0-9_,]/, "", arg);
25           arglist = arglist arg;
26         }
27 NF == 1 && $1 == "(" { inproto=1 }
28
29 /^{$/ { echo=0; }
30
31 echo == 1 { print $0; }
32
33 /^}$/ \
34   {
35     print "{";
36     print "  kern_return_t err;";
37     print "  extern kern_return_t " syscall " (" proto ");";
38     print "  extern kern_return_t " rpc " (" proto ");";
39     print "  err = " syscall " (" arglist ");";
40     print "  if (err == MACH_SEND_INTERRUPTED)";
41     print "    err = " rpc " (" arglist ");";
42     print "  return err;"
43     print "}";
44     print "weak_alias (" call ", " alias ")";
45     # Declare RPC so the weak_alias that follows will work.
46     print "extern __typeof (" call ") " rpc ";";
47     echo = 1;
48   }