#!/bin/sh
#
# modified for dgux by hassey@dg-rtp.dg.com based on
#
#   fixinc.svr4  written by Ron Guilmette (rfg@ncd.com).
#
# This file is part of GNU CC.
# 
# GNU CC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# 
# GNU CC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with GNU CC; see the file COPYING.  If not, write to
# the Free Software Foundation, 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#
#
#	See README-fixinc for more information.

# Fail if no arg to specify a directory for the output.
if [ x$1 = x ]
then echo fixincludes: no output directory specified
exit 1
fi

# Directory in which to store the results.
LIB=${1?"fixincludes: output directory not specified"}

# Make sure it exists.
if [ ! -d $LIB ]; then
  mkdir $LIB || exit 1
fi

ORIG_DIR=`${PWDCMD-pwd}`

# Make LIB absolute if it is relative.
# Don't do this if not necessary, since may screw up automounters.
case $LIB in
/*)
	;;
*)
	cd $LIB; LIB=`${PWDCMD-pwd}`
	;;
esac

echo 'Building fixincludes in ' ${LIB}

# Determine whether this filesystem has symbolic links.
if ln -s X $LIB/ShouldNotExist 2>/dev/null; then
  rm -f $LIB/ShouldNotExist
  LINKS=true
else
  LINKS=false
fi

echo 'Making directories:'
# Directory containing the original header files.
shift
if [ $# -eq 0 ] ; then
  set /usr/include
fi

INLIST="$@"

for INPUT in ${INLIST} ; do
cd ${ORIG_DIR}
cd ${INPUT}

if $LINKS; then
  files=`ls -LR | sed -n s/:$//p`
else
  files=`find . -type d -print | sed '/^.$/d'`
fi
for file in $files; do
  rm -rf $LIB/$file
  if [ ! -d $LIB/$file ]
  then mkdir $LIB/$file
  fi
done

# treetops gets an alternating list
# of old directories to copy
# and the new directories to copy to.
treetops="${INPUT} ${LIB}"

if $LINKS; then
  echo 'Making internal symbolic directory links'
  for file in $files; do
    dest=`ls -ld $file | sed -n 's/.*-> //p'`
    if [ "$dest" ]; then    
      cwd=`${PWDCMD-pwd}`
      # In case $dest is relative, get to $file's dir first.
      cd ${INPUT}
      cd `echo ./$file | sed -n 's&[^/]*$&&p'`
      # Check that the target directory exists.
      # Redirections changed to avoid bug in sh on Ultrix.
      (cd $dest) > /dev/null 2>&1
      if [ $? = 0 ]; then
	cd $dest
	# X gets the dir that the link actually leads to.
	x=`${PWDCMD-pwd}`
	# If link leads back into ${INPUT},
	# make a similar link here.
	if expr $x : "${INPUT}/.*" > /dev/null; then
	  # Y gets the actual target dir name, relative to ${INPUT}.
	  y=`echo $x | sed -n "s&${INPUT}/&&p"`
	  # DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}.
	  dots=`echo "$file" |
	    sed -e 's@^./@@' -e 's@/./@/@g' -e 's@[^/][^/]*@..@g' -e 's@..$@@'`
	  echo $file '->' $dots$y ': Making link'
	  rm -fr ${LIB}/$file > /dev/null 2>&1
	  ln -s $dots$y ${LIB}/$file > /dev/null 2>&1
	else
	  # If the link is to outside ${INPUT},
	  # treat this directory as if it actually contained the files.
# This line used to have $dest instead of $x.
# $dest seemed to be wrong for links found in subdirectories
# of ${INPUT}.  Does this change break anything?
	  treetops="$treetops $x ${LIB}/$file"
	fi
      fi
      cd $cwd
    fi
  done
fi

# Completely replace <_int_varargs.h> with a file that defines
# va_list and gnuc_va_list

file=_int_varargs.h
if [ -r ${INPUT}/$file ]; then
  echo Replacing $file
  cat > ${LIB}/$file << EOF
/* This file was generated by fixinc.dgux.  */
#ifndef __INT_VARARGS_H
#define __INT_VARARGS_H

#ifndef ___int_features_h
#include <sys/_int_features.h>
#endif

#if !(defined(_VA_LIST) || defined(_VA_LIST_))
#define _VA_LIST
#define _VA_LIST_

#ifdef __LINT__

#ifdef __STDC__
typedef void * va_list;
#else
typedef char * va_list;
#endif

#else
#if _M88K_ANY

#if defined(__DCC__)

typedef struct {
       int     next_arg;
       int     *mem_ptr;
       int     *reg_ptr;
} va_list;

#else  /* ! defined(__DCC__) */

typedef struct {
       int  __va_arg;          /* argument number */
       int *__va_stk;          /* start of args passed on stack */
       int *__va_reg;          /* start of args passed in regs */
} va_list;

#endif  /* ! defined(__DCC__) */

#elif _IX86_ANY

#if defined(__GNUC__) || defined(__STDC__)
typedef void * va_list;
#else
typedef char * va_list;
#endif

#endif  /*  _IX86_ANY */

#endif /* __LINT__ */
#endif /*  !(defined(_VA_LIST) || defined(_VA_LIST_)) */
#endif /*  #ifndef __INT_VARARGS_H  */

EOF
  chmod a+r ${LIB}/$file
fi

echo 'Removing unneeded directories:'
cd $LIB
files=`find . -type d -print | sort -r`
for file in $files; do
  rmdir $LIB/$file > /dev/null 2>&1
done

if $LINKS; then
  echo 'Making internal symbolic non-directory links'
  cd ${INPUT}
  files=`find . -type l -print`
  for file in $files; do
    dest=`ls -ld $file | sed -n 's/.*-> //p'`
    if expr "$dest" : '[^/].*' > /dev/null; then    
      target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"`
      if [ -f $target ]; then
        ln -s $dest ${LIB}/$file >/dev/null 2>&1
      fi
    fi
  done
fi

done

exit 0
