home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / kern / makesyscalls.sh < prev    next >
Encoding:
Linux/UNIX/POSIX Shell Script  |  1991-04-20  |  4.0 KB  |  172 lines

  1. #! /bin/sh -
  2. #    @(#)makesyscalls.sh    7.6 (Berkeley) 4/20/91
  3.  
  4. set -e
  5.  
  6. # name of compat option:
  7. compat=COMPAT_43
  8.  
  9. # output files:
  10. sysnames="syscalls.c"
  11. syshdr="../sys/syscall.h"
  12. syssw="init_sysent.c"
  13.  
  14. # tmp files:
  15. sysdcl="sysent.dcl"
  16. syscompat="sysent.compat"
  17. sysent="sysent.switch"
  18.  
  19. trap "rm $sysdcl $syscompat $sysent" 0
  20.  
  21. case $# in
  22.     0)    echo "Usage: $0 input-file" 1>&2
  23.     exit 1
  24.     ;;
  25. esac
  26.  
  27. awk < $1 "
  28.     BEGIN {
  29.         sysdcl = \"$sysdcl\"
  30.         syscompat = \"$syscompat\"
  31.         sysent = \"$sysent\"
  32.         sysnames = \"$sysnames\"
  33.         syshdr = \"$syshdr\"
  34.         compat = \"$compat\"
  35.         infile = \"$1\"
  36.         "'
  37.  
  38.         printf "/*\n * System call switch table.\n *\n" > sysdcl
  39.         printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysdcl
  40.  
  41.         printf "\n#ifdef %s\n", compat > syscompat
  42.         printf "#define compat(n, name) n, __CONCAT(o,name)\n\n" > syscompat
  43.  
  44.         printf "/*\n * System call names.\n *\n" > sysnames
  45.         printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames
  46.  
  47.         printf "/*\n * System call numbers.\n *\n" > syshdr
  48.         printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr
  49.     }
  50.     NR == 1 {
  51.         printf " * created from%s\n */\n\n", $0 > sysdcl
  52.         printf "#include \"param.h\"\n" > sysdcl
  53.         printf "#include \"systm.h\"\n\n" > sysdcl
  54.         printf "int\tnosys();\n\n" > sysdcl
  55.  
  56.         printf "struct sysent sysent[] = {\n" > sysent
  57.  
  58.         printf " * created from%s\n */\n\n", $0 > sysnames
  59.         printf "char *syscallnames[] = {\n" > sysnames
  60.  
  61.         printf " * created from%s\n */\n\n", $0 > syshdr
  62.         next
  63.     }
  64.     NF == 0 || $1 ~ /^;/ {
  65.         next
  66.     }
  67.     $1 ~ /^#[     ]*if/ {
  68.         print > sysent
  69.         print > sysdcl
  70.         print > syscompat
  71.         print > sysnames
  72.         savesyscall = syscall
  73.         next
  74.     }
  75.     $1 ~ /^#[     ]*else/ {
  76.         print > sysent
  77.         print > sysdcl
  78.         print > syscompat
  79.         print > sysnames
  80.         syscall = savesyscall
  81.         next
  82.     }
  83.     $1 ~ /^#/ {
  84.         print > sysent
  85.         print > sysdcl
  86.         print > syscompat
  87.         print > sysnames
  88.         next
  89.     }
  90.     syscall != $1 {
  91.         printf "%s: line %d: syscall number out of sync at %d\n", \
  92.            infile, NR, syscall
  93.         printf "line is:\n"
  94.         print
  95.         exit 1
  96.     }
  97.     {    comment = $4
  98.         for (i = 5; i <= NF; i++)
  99.             comment = comment " " $i
  100.         if (NF < 5)
  101.             $5 = $4
  102.     }
  103.     $2 == "STD" {
  104.         printf("int\t%s();\n", $4) > sysdcl
  105.         printf("\t%d, %s,\t\t\t/* %d = %s */\n", \
  106.             $3, $4, syscall, $5) > sysent
  107.         printf("\t\"%s\",\t\t\t/* %d = %s */\n", \
  108.             $5, syscall, $5) > sysnames
  109.         printf("#define\tSYS_%s\t%d\n", \
  110.             $5, syscall) > syshdr
  111.         syscall++
  112.         next
  113.     }
  114.     $2 == "COMPAT" {
  115.         printf("int\to%s();\n", $4) > syscompat
  116.         printf("\tcompat(%d,%s),\t\t/* %d = old %s */\n", \
  117.             $3, $4, syscall, $5) > sysent
  118.         printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
  119.             $5, syscall, $5) > sysnames
  120.         printf("\t\t\t\t/* %d is old %s */\n", \
  121.             syscall, comment) > syshdr
  122.         syscall++
  123.         next
  124.     }
  125.     $2 == "LIBCOMPAT" {
  126.         printf("int\to%s();\n", $4) > syscompat
  127.         printf("\tcompat(%d,%s),\t\t/* %d = old %s */\n", \
  128.             $3, $4, syscall, $5) > sysent
  129.         printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
  130.             $5, syscall, $5) > sysnames
  131.         printf("#define\tSYS_%s\t%d\t/* compatibility; still used by libc */\n", \
  132.             $5, syscall) > syshdr
  133.         syscall++
  134.         next
  135.     }
  136.     $2 == "OBSOL" {
  137.         printf("\t0, nosys,\t\t\t/* %d = obsolete %s */\n", \
  138.             syscall, comment) > sysent
  139.         printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", \
  140.             $4, syscall, comment) > sysnames
  141.         printf("\t\t\t\t/* %d is obsolete %s */\n", \
  142.             syscall, comment) > syshdr
  143.         syscall++
  144.         next
  145.     }
  146.     $2 == "UNIMPL" {
  147.         printf("\t0, nosys,\t\t\t/* %d = %s */\n", \
  148.             syscall, comment) > sysent
  149.         printf("\t\"#%d\",\t\t\t/* %d = %s */\n", \
  150.             syscall, syscall, comment) > sysnames
  151.         syscall++
  152.         next
  153.     }
  154.     {
  155.         printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2
  156.         exit 1
  157.     }
  158.     END {
  159.         printf("\n#else /* %s */\n", compat) > syscompat
  160.         printf("#define compat(n, name) 0, nosys\n") > syscompat
  161.         printf("#endif /* %s */\n\n", compat) > syscompat
  162.  
  163.         printf("};\n\n") > sysent
  164.         printf("int\tnsysent = sizeof(sysent) / sizeof(sysent[0]);\n") > sysent
  165.  
  166.         printf("};\n") > sysnames
  167.     } '
  168.  
  169. cat $sysdcl $syscompat $sysent >$syssw
  170.  
  171. chmod 444 $sysnames $syshdr $syssw
  172.