| # Icky intimate knowledge of MiG output. |
| |
| BEGIN { print "/* This file is generated by shortcut.awk. */"; |
| echo=1; |
| inproto=0; proto=""; arglist=""; |
| } |
| |
| $1 == "LINTLIBRARY" { print "#include <mach.h>"; next } |
| |
| $1 == "weak_alias" { next } |
| |
| # Copy the first line of the definition, but |
| # replace the function name (RPC) with CALL. |
| $NF == rpc \ |
| { |
| for (i = 1; i < NF; ++i) printf "%s ", $i; |
| print call; |
| next; |
| } |
| |
| # Collect the lines of the prototype in PROTO, and extract the parameter |
| # names into ARGLIST. |
| NF == 1 && $1 == ")" { inproto=0 } |
| inproto { proto = proto $0; |
| arg = $NF; |
| gsub(/[^a-zA-Z0-9_,]/, "", arg); |
| arglist = arglist arg; |
| } |
| NF == 1 && $1 == "(" { inproto=1 } |
| |
| /^{$/ { echo=0; } |
| |
| echo == 1 { print $0; } |
| |
| /^}$/ && proto != "" \ |
| { |
| print "{"; |
| print " kern_return_t err;"; |
| print " extern kern_return_t " syscall " (" proto ");"; |
| print " extern kern_return_t " rpc " (" proto ");"; |
| print " err = " syscall " (" arglist ");"; |
| print " if (err == MACH_SEND_INTERRUPTED)"; |
| print " err = " rpc " (" arglist ");"; |
| print " return err;" |
| print "}"; |
| print "weak_alias (" call ", " alias ")"; |
| # Declare RPC so the weak_alias that follows will work. |
| print "extern __typeof (" call ") " rpc ";"; |
| echo = 1; |
| } |