#!/bin/sh
#
# SYNOPSIS
#	fixproto TARGET-DIR SOURCE-DIR-ALL SOURCE-DIR-STD
#
# COPYRIGHT
#	Copyright (C) 1993, 1994, 1997, 1998, 2002, 2003, 2007
#       Free Software Foundation, Inc.
#	This file is part of GCC.
#
#	GCC 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 3, or (at your option)
#	any later version.
#
#	GCC 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 GCC; see the file COPYING3.  If not see
#	<http://www.gnu.org/licenses/>.
#
# DESCRIPTION
#	Adjunct script for GCC to populate a directory with ANSI,
#	Posix.1, and C++ compatible header files.
#
#	Each file found under SOURCE-DIR-ALL is analyzed and "fixed."
#       Only standard ANSI/POSIX files found under SOURCE-DIR-STD
#       are analyzed and "fixed."
#	The SOURCE-DIRs are searched in order; a file found
#	under multiple SOURCE-DIRs is only handled for the first one.
#
# STRATEGY
#       Each include file is fed through cpp, and the scan-decls program
#	parses it, and emits any found function declarations.
#	The fix-header program analyzes the scan-decls output,
#	together with the original include file, and writes a "fixed"
#	include file, if needed.
#
#	The comment at the beginning of fix-header.c lists specifically
#	what kind of changes are made.
#
# NOTE
#	Some file space will be wasted, because the original header
#	files are copied.  An earlier version just included the original
#	by "reference", using GNU cpp's #include_next mechanism.
#	This is currently not done, partly because #include_next is
#	fragile (susceptible to version incompatibilities, and depends
#	and GCC-specific features), and partly for performance reasons.
#
# AUTHORS
#	Ron Guilmette (rfg@netcom.com) (original idea and code)
#	Per Bothner (bothner@cygnus.com) (major re-write)

dirname=`echo "$0" | sed 's,^[^/]*$,.,;s,//*[^/]*$,,'`
progname=`echo "$0" | sed 's,.*/,,'`
original_dir=`${PWDCMD-pwd}`
FIX_HEADER=${FIX_HEADER-$original_dir/fix-header}
DEFINES="-D__STDC__=0 -D__cplusplus ${FIXPROTO_DEFINES}"

if mkdir -p . 2> /dev/null; then
  # Great, mkdir accepts -p
  mkinstalldirs="mkdir -p"
else
  # We expect mkinstalldirs to be passed in the environment.
  # If it is not, assume it is in the directory that contains this script.
  mkinstalldirs=${mkinstalldirs-"/bin/sh $dirname/mkinstalldirs"}
  if $mkinstalldirs . 2> /dev/null; then
    :
  else
    # But, in case of failure, fallback to plain mkdir, and hope it works
    mkinstalldirs=mkdir
  fi
fi

if [ `echo $1 | wc -w` = 0 ] ; then
  echo $progname\: usage\: $progname target-dir \[ source-dir \.\.\. \]
  exit 1
fi

std_files="ctype.h dirent.h errno.h curses.h fcntl.h grp.h locale.h math.h pwd.h setjmp.h signal.h stdio.h stdlib.h string.h sys/socket.h sys/stat.h sys/times.h sys/resource.h sys/utsname.h sys/wait.h tar.h termios.h time.h unistd.h utime.h"

rel_target_dir=$1
# All files in $src_dir_all (normally same as $rel_target_dir) are
# processed.
src_dir_all=$2
# In $src_dir_std (normally same as /usr/include), only the
# "standard" ANSI/POSIX files listed in $std_files are processed.
src_dir_std=$3

case $rel_target_dir in
  /* | [A-Za-z]:[\\/]*)
     abs_target_dir=$rel_target_dir
     ;;
  *)
     abs_target_dir=$original_dir/$rel_target_dir
     ;;
esac

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

if [ \! -d $abs_target_dir ] ; then
  echo $progname\: creating directory $rel_target_dir
  $mkinstalldirs $abs_target_dir
fi

echo $progname\: populating \`$rel_target_dir\'

include_path=""

if [ `echo $* | wc -w` != 0 ] ; then
  for rel_source_dir in $src_dir_all $src_dir_std; do
     case $rel_source_dir in
       /* | [A-Za-z]:[\\/]*)
         abs_source_dir=$rel_source_dir
         ;;
       *)
         abs_source_dir=$original_dir/$rel_source_dir
         ;;
     esac
    include_path="$include_path -I$abs_source_dir"
  done
fi

done_dirs=""
subdirs_made=""
echo "" >fixproto.list

for code in ALL STD ; do

  subdirs="."

  case $code in
    ALL)
      rel_source_dir=$src_dir_all

      dirs="."
      levels=2
      while $LINKS && test -n "$dirs" -a $levels -gt 0
      do
        levels=`expr $levels - 1`
	newdirs=
	for d in $dirs ; do
	  # Find all directories under $d, relative to $d, excluding $d itself.
	  # Assume directory names ending in CC or containing ++ are
	  # for C++, so skip those.
	  subdirs="$subdirs "`cd $rel_source_dir/$d; find . -type d -print | \
	           sed -e '/^\.$/d' -e "s|^\./|${d}/|" -e 's|^\./||' \
		     -e '/CC$/d' -e '/[+][+]/d'`
	  links=
	  links=`cd $rel_source_dir; find $d/. -type l -print | \
		       sed -e "s|$d/./|$d/|" -e 's|^\./||'`
	  for link in $links --dummy-- ; do
	    test -d $rel_source_dir/$link/. && newdirs="$newdirs $link"
	  done
	done
	dirs="$newdirs"
	subdirs="$subdirs $newdirs"
      done
      ;;
    STD)
      rel_source_dir=$src_dir_std
      ;;
  esac

  case $rel_source_dir in
    /* | [A-Za-z]:[\\/]*)
       abs_source_dir=$rel_source_dir
       ;;
    *)
       abs_source_dir=$original_dir/$rel_source_dir
       ;;
  esac

  if [ \! -d $abs_source_dir ] ; then
    echo $progname\: warning\: no such directory\: \`$rel_source_dir\'
    continue
  fi

  for rel_source_subdir in $subdirs; do

      abs_target_subdir=${abs_target_dir}/${rel_source_subdir}
      if [ \! -d $abs_target_subdir ] ; then
	if $mkinstalldirs $abs_target_subdir ; then
	  subdirs_made="$abs_target_subdir $subdirs_made"
	fi
      fi
      # Append "/"; remove initial "./". Hence "." -> "" and "sys" -> "sys/".
      rel_source_prefix=`echo $rel_source_subdir | sed -e 's|$|/|' -e 's|^\./||'`

      case $code in
	ALL)
	  # The 'sed' is in case the *.h matches nothing, which yields "*.h"
	  # which would then get re-globbed in the current directory.  Sigh.
	  rel_source_files=`cd ${abs_source_dir}/${rel_source_subdir}; echo *.h | sed -e 's|[*].h|NONE|'`
	  ;;

	STD)
	  files_to_check="$std_files"
	  rel_source_files=""

	  # Also process files #included by the $std_files.
	  while [ -n "${files_to_check}" ]
	  do
	    new_files_to_check=""
	    for file in $files_to_check ; do
	      xxfile=`echo $file | sed -e 's|/\([^/\.][^/\.]*\)/\.\./|/|'`
	      # Create the dir where this file will go when fixed.
	      xxdir=`echo ./$file | sed -e 's|/[^/]*$||'`
	      if [ \! -d $abs_target_subdir/$xxdir ] ; then
		if $mkinstalldirs $abs_target_subdir/$xxdir ; then
		  subdirs_made="$abs_target_subdir/$xxdir $subdirs_made"
		fi
	      fi
	      # Just in case we have edited out a symbolic link
	      if [ -f $src_dir_std/$file -a -f $src_dir_std/$xxfile ] ; then
		file=$xxfile
	      fi
	      case " $rel_source_files " in
	        *" ${file} "*)
		  # Already seen $file; nothing to do
		  ;;
		*)
		  if test -f $src_dir_std/$file ; then
		    rel_dir=`echo $file | sed -n -e 's|^\(.*/\)[^/]*$|\1|p'`
		    # For #include "foo.h", that might be either "foo.h"
		    # or "${rel_dir}foo.h (or something bogus).
	            new_files_to_check="$new_files_to_check "`sed -n \
			-e 's@	@ @g' \
		        -e 's@^ *# *include *<\([^>]*\)>.*$@\1@p' -e \
		        's@^ *# *include *\"\([^\"]*\)\".*$@\1 '$rel_dir'\1@p'\
			<$src_dir_std/$file`
	            rel_source_files="$rel_source_files $file"
		  fi
		  ;;
	      esac
	    done
	    files_to_check="$new_files_to_check"
	  done
	  rel_source_files="$rel_source_files"
	  ;;
      esac

      for filename in $rel_source_files ; do
	rel_source_file=${rel_source_prefix}${filename}
	abs_source_file=$abs_source_dir/$rel_source_file
	abs_target_file=$abs_target_dir/$rel_source_file

	if test "$filename" = 'NONE' ; then
	  echo "(No *.h files in $abs_source_dir/$rel_source_subdir)"
	# If target file exists, check if was written while processing one
	# of the earlier source directories;  if so ignore it.
	elif test -f $abs_target_file -a -n "$done_dirs" \
	  && grep "$rel_source_file" fixproto.list >/dev/null
	then true
	else
	  $FIX_HEADER $rel_source_file $abs_source_file $abs_target_file ${DEFINES} $include_path
	  if test $? != 0 ; then exit 1 ; fi
	  echo "${rel_source_file}" >>fixproto.list
	fi
      done
    done
    done_dirs="$done_dir $rel_source_dir"
done

# This might be more cleanly moved into the main loop, by adding
# a <dummy> source directory at the end.  FIXME!

# All the headers we create define size_t and NULL.
for rel_source_file in unistd.h stdlib.h string.h time.h ; do
  if grep "$rel_source_file" fixproto.list >/dev/null ; then
    : # It exists, we don't need to make it
  else
    echo Adding missing $rel_source_file
    rel_source_ident=`echo $rel_source_file | tr ./ __`
    cat >tmp.h <<EOF
/* Fake ${rel_source_file}, created by GCC.
   The functions declared in this file do not necessarily exist in
   your C library. */
#ifndef __${rel_source_ident}
#define __${rel_source_ident}

#define __need_NULL
#define __need_size_t
#include <stddef.h>
EOF
    # Insert special stuff for particular files here.
    case ${rel_source_file} in
      time.h)
        # If time.h doesn't exist, find out if sys/time.h does.
        if test -f $src_dir_std/sys/time.h \
            || grep "sys/time.h" fixproto.list >/dev/null ; then
          # It does; include it and hope it has the needed declarations.
          # Some versions require sys/types.h.
          cat >>tmp.h <<EOF

#include <sys/types.h>
#include <sys/time.h>
EOF
        else
          # It doesn't.  Make up plausible definitions for time_t, clock_t.
          # Forward-declare struct tm.  Hope nobody tries to use it.  (Odds
          # are they won't.)
          cat >>tmp.h <<EOF

typedef long time_t;
typedef long clock_t;
struct tm;
EOF
        fi ;;
    esac
    cat >>tmp.h <<EOF

#endif /* __${rel_source_ident} */
EOF
    ${FIX_HEADER} $rel_source_file tmp.h $abs_target_dir/$rel_source_file ${DEFINES} $include_path
    if test $? != 0 ; then exit 1 ; fi
    if test -f $abs_target_dir/$rel_source_file ; then
      rm tmp.h
    else
      mv tmp.h $abs_target_dir/$rel_source_file
    fi
  fi
done

# Remove any directories that we made that are still empty.
rmdir $subdirs_made 2>/dev/null

exit 0
