home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / gnu / gcc-2.3.3-src.lha / GNU / src / amiga / gcc-2.3.3 / fixincludes < prev    next >
Text File  |  1994-02-06  |  27KB  |  906 lines

  1. #! /bin/sh
  2. # Install modified versions of certain ANSI-incompatible system header files
  3. # which are fixed to work correctly with ANSI C
  4. # and placed in a directory that GNU C will search.
  5.  
  6. # See README-fixinc for more information.
  7.  
  8. # Directory where gcc sources (and sometimes special include files) live.
  9. # fixincludes doesn't use this, but fixinc.svr4 does, and I want to make
  10. # sure somebody doesn't try to use arg3 for something incompatible. -- gumby
  11. SRCDIR=${3-${SRCDIR-.}}
  12.  
  13. # Directory containing the original header files.
  14. # (This was named INCLUDES, but that conflicts with a name in Makefile.in.)
  15. INPUT=${2-${INPUT-/usr/include}}
  16.  
  17. # This prevents /bin/ex from failing if the current terminal type is
  18. # unrecognizable.
  19. TERM=unknown
  20. export TERM
  21. # This prevents two problems:
  22. # Either ex might find a .exrc file and get confused,
  23. # or ex might complain if the EXINIT variable is invalid. 
  24. # We know there is no .exrc in the GCC source.
  25. # `set' is a no-op ex command.
  26. EXINIT=set
  27. export EXINIT
  28.  
  29. # Define PWDCMD as a command to use to get the working dir
  30. # in the form that we want.
  31. PWDCMD=pwd
  32. case "`pwd`" in
  33. //*)
  34.     # On an Apollo, discard everything before `/usr'.
  35.     PWDCMD="eval pwd | sed -e 's,.*/usr/,/usr/,'"
  36.     ;;
  37. esac
  38.  
  39. # Directory in which to store the results.
  40. LIB=${1?"fixincludes: output directory not specified"}
  41.  
  42. # Make sure it exists.
  43. if [ ! -d $LIB ]; then
  44.   mkdir $LIB || exit 1
  45. fi
  46.  
  47. # Make LIB absolute.
  48. cd $LIB; LIB=`${PWDCMD}`
  49.  
  50. # Fail if no arg to specify a directory for the output.
  51. if [ x$1 = x ]
  52. then echo fixincludes: no output directory specified
  53. exit 1
  54. fi
  55.  
  56. echo Building fixed headers in ${LIB}
  57.  
  58. # Determine whether this system has symbolic links.
  59. if ln -s X $LIB/ShouldNotExist 2>/dev/null; then
  60.   rm -f $LIB/ShouldNotExist
  61.   LINKS=true
  62. else
  63.   LINKS=false
  64. fi
  65.  
  66. echo Finding directories and links to directories
  67. cd ${INPUT}
  68. # Find all directories and all symlinks that point to directories.
  69. # Put the list in $files.
  70. # Each time we find a symlink, add it to newdirs
  71. # so that we do another find within the dir the link points to.
  72. # Note that $files may have duplicates in it;
  73. # later parts of this file are supposed to ignore them.
  74. dirs="."
  75. levels=2
  76. while [ -n "$dirs" ] && [ $levels -gt 0 ]
  77. do
  78.     levels=`expr $levels - 1`
  79.     newdirs=
  80.     for d in $dirs
  81.     do
  82.     echo " Searching $INPUT/$d"
  83.     if [ "$d" != . ]
  84.     then
  85.         d=$d/.
  86.     fi
  87.  
  88.     # Find all directories under $d, relative to $d, excluding $d itself.
  89.         files="$files `find $d -type d -print | \
  90.                sed -e '/\/\.$/d' -e '/^\.$/d'`"
  91.     # Find all links to directories.
  92.     # Using `-exec test -d' in find fails on some systems,
  93.     # and trying to run test via sh fails on others,
  94.     # so this is the simplest alternative left.
  95.     # First find all the links, then test each one.
  96.     theselinks=
  97.     $LINKS && \
  98.       theselinks=`find $d -type l -print`
  99.     for d1 in $theselinks --dummy--
  100.     do
  101.         # If the link points to a directory,
  102.         # add that dir to $newdirs
  103.         if [ -d $d1 ]
  104.         then
  105.         newdirs="$newdirs $d1"
  106.         fi
  107.     done
  108.     done
  109.  
  110.     files="$files $newdirs"
  111.     dirs="$newdirs"
  112. done
  113.  
  114. dirs=
  115. echo "All directories (including links to directories):"
  116. echo $files
  117.  
  118. for file in $files; do
  119.   rm -rf $LIB/$file
  120.   if [ ! -d $LIB/$file ]
  121.   then mkdir $LIB/$file
  122.   fi
  123. done
  124. mkdir $LIB/root
  125.  
  126. # treetops gets an alternating list
  127. # of old directories to copy
  128. # and the new directories to copy to.
  129. treetops="${INPUT} ${LIB}"
  130.  
  131. if $LINKS; then
  132.   echo 'Making symbolic directory links'
  133.   for file in $files; do
  134.     dest=`ls -ld $file | sed -n 's/.*-> //p'`
  135.     if [ "$dest" ]; then    
  136.       cwd=`${PWDCMD}`
  137.       # In case $dest is relative, get to $file's dir first.
  138.       cd ${INPUT}
  139.       cd `echo ./$file | sed -n 's&[^/]*$&&p'`
  140.       # Check that the target directory exists.
  141.       # Redirections changed to avoid bug in sh on Ultrix.
  142.       (cd $dest) > /dev/null 2>&1
  143.       if [ $? = 0 ]; then
  144.     cd $dest
  145.     # X gets the dir that the link actually leads to.
  146.     x=`${PWDCMD}`
  147.     # If a link points to ., make a similar link to .
  148.     if [ $x = $INPUT ]; then
  149.       echo $file '->' . ': Making link'
  150.       rm -fr ${LIB}/$file > /dev/null 2>&1
  151.       ln -s . ${LIB}/$file > /dev/null 2>&1
  152.     # If link leads back into ${INPUT},
  153.     # make a similar link here.
  154.     elif expr $x : "${INPUT}/.*" > /dev/null; then
  155.       # Y gets the actual target dir name, relative to ${INPUT}.
  156.       y=`echo $x | sed -n "s&${INPUT}/&&p"`
  157.       echo $file '->' $y ': Making link'
  158.       rm -fr ${LIB}/$file > /dev/null 2>&1
  159.       ln -s ${LIB}/$y ${LIB}/$file > /dev/null 2>&1
  160.     else
  161.       # If the link is to a dir $target outside ${INPUT},
  162.       # repoint the link at ${INPUT}/root$target
  163.       # and process $target into ${INPUT}/root$target
  164.       # treat this directory as if it actually contained the files.
  165.       echo $file '->' root$x ': Making link'
  166.       if [ -d $LIB/root$x ]
  167.       then true
  168.       else
  169.         dirname=root$x/
  170.         dirmade=.
  171.         cd $LIB
  172.         while [ x$dirname != x ]; do
  173.           component=`echo $dirname | sed -e 's|/.*$||'`
  174.           mkdir $component >/dev/null 2>&1
  175.           cd $component
  176.           dirmade=$dirmade/$component
  177.           dirname=`echo $dirname | sed -e 's|[^/]*/||'`
  178.         done
  179.       fi
  180.       rm -fr ${LIB}/$file > /dev/null 2>&1
  181.       ln -s ${LIB}/root$x ${LIB}/$file > /dev/null 2>&1
  182.       treetops="$treetops $x ${LIB}/root$x"
  183.     fi
  184.       fi
  185.       cd $cwd
  186.     fi
  187.   done
  188. fi
  189.  
  190. set - $treetops
  191. while [ $# != 0 ]; do
  192.   # $1 is an old directory to copy, and $2 is the new directory to copy to.
  193.   cd ${INPUT}
  194.   cd $1
  195. # The same dir can appear more than once in treetops.
  196. # There's no need to scan it more than once.
  197.   if [ -f $2/DONE ]
  198.   then
  199.     files=
  200.   else
  201.     touch $2/DONE
  202.     echo Fixing directory $1 into $2
  203. # Check .h files which are symlinks as well as those which are files.
  204. # A link to a header file will not be processed by anything but this.
  205.     if $LINKS; then
  206.       files=`find . -name '*.h' \( -type f -o -type l \) -print`
  207.     else
  208.       files=`find . -name '*.h' -type f -print`
  209.     fi
  210.     echo Checking header files
  211.   fi
  212. # Note that BSD43_* are used on recent MIPS systems.
  213.   for file in $files; do
  214. # This call to egrep is essential, since checking a file with egrep
  215. # is much faster than actually trying to fix it.
  216. # It is also essential that most files *not* match!
  217. # Thus, matching every #endif is unacceptable.
  218. # But the argument to egrep must be kept small, or many versions of egrep
  219. # won't be able to handle it.
  220. # rms: I removed `|#[el].*if.*[^/     ]' because it made egrep fail.
  221.     if egrep '//|[     _]_IO|CTRL|#define.NULL|#[el]*if.*([0-9]|sparc|vax|sun|pyr)' $file > /dev/null; then
  222.       echo Fixing $file
  223.       if [ -r $file ]; then
  224.     cp $file $2/$file >/dev/null 2>&1    \
  225.     || echo "Can't copy $file"
  226.     chmod +w $2/$file
  227. # Following two lines removed.
  228. #      s%^\([     ]*#[     ]*endif[     ]*\)\([^/     ].*\)$%\1/* \2 */%
  229. #      s%^\([     ]*#[     ]*else[     ]*\)\([^/     ].*\)$%\1/* \2 */%
  230.  
  231.     sed -e '
  232.                    :loop
  233.       /\\$/            N
  234.       /\\$/            b loop
  235.       /\/\//            s|//\(.*\)$|/*\1*/|
  236.       /[     ]_IO[A-Z]*[     ]*(/    s/(\(.\),/('\''\1'\'',/
  237.       /[     ]BSD43__IO[A-Z]*[     ]*(/    s/(\(.\),/('\''\1'\'',/
  238.       /#define._IO/            s/'\''x'\''/x/g
  239.       /#define.BSD43__IO/        s/'\''x'\''/x/g
  240.       /[^A-Z]CTRL[     ]*(/        s/\([^'\'']\))/'\''\1'\'')/
  241.       /#define.CTRL/        s/'\''c'\''/c/g
  242.       /#define._CTRL/        s/'\''c'\''/c/g
  243.       /#define.BSD43_CTRL/        s/'\''c'\''/c/g
  244.       /#[a-z]*if.*[     (]m68k/    s/\([^_]\)m68k/\1__m68k__/g
  245.       /#[a-z]*if.*[     (]__i386/    s/__i386/__i386__/g
  246.       /#[a-z]*if.*[     (]i386/    s/\([^_]\)i386/\1__i386__/g
  247.       /#[a-z]*if.*[     (]sparc/    s/\([^_]\)sparc/\1__sparc__/g
  248.       /#[a-z]*if.*[     (]mc68000/    s/\([^_]\)mc68000/\1__mc68000__/g
  249.       /#[a-z]*if.*[     (]vax/        s/\([^_]\)vax/\1__vax__/g
  250.       /#[a-z]*if.*[     (]sun/        s/\([^_]\)\(sun[a-z0-9]*\)\([^a-z0-9_]\)/\1__\2__\3/g
  251.       /#[a-z]*if.*[     (]sun/        s/\([^_]\)\(sun[a-z0-9]*\)$/\1__\2__/g
  252.       /#[a-z]*if.*[     (]ns32000/    s/\([^_]\)ns32000/\1__ns32000__/g
  253.       /#[a-z]*if.*[     (]pyr/        s/\([^_]\)pyr/\1__pyr__/g
  254.       /#[a-z]*if.*[     (]is68k/    s/\([^_]\)is68k/\1__is68k__/g
  255.       /^#define.NULL[     ]/    i\
  256.         #undef NULL
  257.     ' $2/$file > $2/$file.sed
  258.     mv $2/$file.sed $2/$file
  259.     if cmp $file $2/$file >/dev/null 2>&1; then
  260.        echo Deleting $2/$file\; no fixes were needed.
  261.        rm $2/$file
  262.     fi
  263.       fi
  264.     fi
  265.   done
  266.   shift; shift
  267. done
  268.  
  269. cd ${INPUT}
  270.  
  271. # Fix one other error in this file: a mismatched quote not inside a C comme