1awk < syscalls '\ 2 BEGIN { \ 3 sysent = "sysent"; 4 sysnames = "syscall.c"; 5 syshdr = "syscall.h"; 6 printf "/*\n * System call names.\n */\n" > sysnames; \ 7 printf "char *syscallnames[] = {\n" > sysnames; \ 8 printf "/*\n * System call numbers.\n */\n" > syshdr; \ 9 } \ 10 $1 ~ /^#[ ]*if/ { \ 11 print > sysent; \ 12 savesyscall = syscall; \ 13 next; 14 } \ 15 $1 ~ /^#[ ]*el/ { \ 16 print > sysent; \ 17 syscall = savesyscall; \ 18 next; \ 19 } \ 20 $1 ~ /^#/ { \ 21 print > sysent; \ 22 next; \ 23 } \ 24 syscall != $1 { \ 25 printf "syscall number out of sync at %d; line is:\n", syscall; \ 26 print; \ 27 exit 1; \ 28 } \ 29 { comment = $4; \ 30 for (i = 5; i <= NF; i++) \ 31 comment = comment " " $i; \ 32 if (NF < 5) \ 33 $5 = $4; \ 34 } \ 35 $2 == "STD" { \ 36 printf("\t%d, %s,\t\t\t/* %d = %s */\n", \ 37 $3, $4, syscall, $5) > sysent; \ 38 printf("\t\"%s\",\t\t\t/* %d = %s */\n", \ 39 $5, syscall, $5) > sysnames; \ 40 printf("#define\tSYS_%s\t%d\n", \ 41 $5, syscall) > syshdr; \ 42 } \ 43 $2 == "COMPAT" { \ 44 printf("\tcompat(%d, %s),\t\t/* %d = old %s */\n", \ 45 $3, $4, syscall, $5) > sysent; \ 46 printf("\t\"old %s\",\t\t/* %d = old %s */\n", \ 47 $5, syscall, $5) > sysnames; \ 48 printf("\t\t\t\t/* %d is old %s */\n", \ 49 syscall, comment) > syshdr; \ 50 } \ 51 $2 == "OBSOL" { \ 52 printf("\t0, nosys,\t\t\t/* %d = old %s */\n", \ 53 syscall, comment) > sysent; \ 54 printf("\t\"#%d\",\t\t\t/* %d = old %s */\n", \ 55 syscall, syscall, comment) > sysnames; \ 56 printf("\t\t\t\t/* %d is old %s */\n", \ 57 syscall, comment) > syshdr; \ 58 } \ 59 $2 == "UNIMPL" { \ 60 printf("\t0, nosys,\t\t\t/* %d = %s */\n", \ 61 syscall, comment) > sysent; \ 62 printf("\t\"#%d\",\t\t\t/* %d = %s */\n", \ 63 syscall, syscall, comment) > sysnames; \ 64 } \ 65 { syscall++ }\ 66 END { \ 67 printf("};\n") > sysnames; \ 68 } 69 ' 70