#!/bin/ksh
#
# update,v 1.2 1995/05/31 17:20:58 joel Exp
#
# Either bash or ksh will be ok for this; requires 'test -ot'
#  (-p above just says to not parse $ENV file; makes it faster for
#   those of us who set $ENV)
#
#
# NOTE
#
#   This is potentially a very dangerous program.

# progname=`basename $0`
progname=${0##*/}        # fast basename hack for ksh, bash

USAGE=\
"
usage: $progname [ -vs ] [ -b base_directory ] [-p file] [-f] [files...]
	-v	    -- verbose
	-p	    -- file with replacement instructions
	-s	    -- skip prompt for backup verification
	-f	    -- do files at end of line

base_directory is the root directory of the source code to update.  It
defaults to the current directory.

This program updates C, H, and .inl files.
"

fatal() {
    if [ "$1" ]
    then
        echo    >&2
        echo $* >&2
        echo    >&2
    fi
    echo "$USAGE" 1>&2
    exit 1
}

#
#  KLUDGE to figure out at runtime how to echo a line without a
#  newline.
#
count=`echo "\\c" | wc -c`
if [ ${count} -ne 0 ] ; then
  EARG="-n"
  EOL=""
else
  EARG=""
  EOL="\\c"
fi

#
#  Function to make sure they do a backup
#

WARNING=\
"

*******************************************************************************
*******************************************************************************
*******************************************************************************
****                                                                       ****
****        WARNING!!!          WARNING!!!           WARNING!!!            ****
****                                                                       ****
****   ALL SOURCE CODE SHOULD BE BACKED UP BEFORE RUNNING THIS PROGRAM!!   ****
****                                                                       ****
****        WARNING!!!          WARNING!!!           WARNING!!!            ****
****                                                                       ****
*******************************************************************************
*******************************************************************************
*******************************************************************************

"

verify_backup()
{
  echo "$WARNING"
  continue="yes"
  while [ $continue = "yes" ]
  do
echo ${EARG} "Do you wish to update the source tree at this time [y|n]? " ${EOL}
    read answer
    case $answer in
      [yY]*)
        continue="no"
        ;;
      [nN]*)
        echo
        echo "Exitting at user request"
        echo
        exit 0
        ;;
    esac
  done
}

#
#  Default tools to use...
#
#  NOTE: The GNU versions of both of these are faster.
#
find_prog=find
xargs_prog=xargs

#
# process the options
#

verbose=""
suffix=""
mode=""
base_directory=.
do_files="no"
do_prompt="yes"
replacement_file="${RTEMS_HOME}/update-tools/310_to_320_list"

while getopts sfp:b:v OPT
do
    case "$OPT" in
        v)
          verbose="yes";;
        s)
          do_prompt="no";;
        b)
          base_directory=${OPTARG};;
        p)
          replacement_file=${OPTARG};;
        f)
          do_files="yes";;
        *)
          fatal
    esac
done

let $((shiftcount = $OPTIND - 1))
shift $shiftcount

args=$*

#
#  Make sure they have done a backup
#

if [ ${do_prompt} = "yes" ]
then
  verify_backup
fi

#
# Validate the base directory
#

if [ ! -d $base_directory ]
then
    fatal "${base_directory} does not exist"
fi

#
# Validate the replacement file
#

if [ ! -r $replacement_file ]
then
    fatal "${replacement_file} does not exist or is not readable"
fi


#
#  Verify enough of the RTEMS environment variables are set
#

if [ ! -d "${RTEMS_HOME}" ]
then
    fatal "RTEMS_HOME environment variable is not initialized"
fi

#
# Update the files
#

generate_list()
{
  if [ ${do_files} = "yes" ]
  then
    for i in $args
    do
      echo $i
    done
  else
    ${find_prog} ${base_directory} \(  -name "*.[ch]" -o -name "*.inl" \) -print
  fi
}

generate_list | ${xargs_prog} |
  while read line
  do
    ${RTEMS_HOME}/update-tools/word-replace -p ${replacement_file} ${line}
    if [ $? -ne 0 ]
    then
      exit 1
    fi
    for file in ${line}
    do
      mv ${file}.fixed ${file}
    done
  done

exit 0

# Local Variables: ***
# mode:ksh ***
# End: ***
