diff options
Diffstat (limited to 'REORG.TODO/mach/shortcut.awk')
-rw-r--r-- | REORG.TODO/mach/shortcut.awk | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/REORG.TODO/mach/shortcut.awk b/REORG.TODO/mach/shortcut.awk new file mode 100644 index 0000000000..ea283d49ba --- /dev/null +++ b/REORG.TODO/mach/shortcut.awk @@ -0,0 +1,50 @@ +# 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; + } |