#! /bin/sh
# a script to generate externals.h
# the latter is included by all LoopTools code, with the purpose
# of making internal symbols "invisible" from the outside
# this file is part of LoopTools
# last modified 15 Jul 11 th


base=`dirname $0`/../..
ext=$base/src/include/externals.h
cext=$base/src/include/cexternals.h
lib=$base/build/libooptools.a
prefix=lj

shopt -s nullglob

set -- `nm $lib | awk '
  /\.o:$/ {
    file = $1;
    sub(".o:$", "", file);
  }
  /\.o\):$/ {
    file = $1;
    sub("^.*\\\\(", "", file);
    sub("\\\\.o\\\\):$", "", file);
  }
  $2 ~ /^(T|C)$/ && $3 !~ /^_*(\
a00c|a00|a00subc|a00sub|a0c|a0|a0subc|a0sub|\
b001c|b001|b00c|b00|b0c|b0ic|b0i|b0|b111c|b111|b11c|b11|b1c|b1|bgetc|bget|\
db00c|db00|db0c|db0|db11c|db11|db1c|db1|\
c0c|c0ic|c0i|c0|c0subc|c0sub|cgetc|cget|\
d0c|d0ic|d0i|d0|d0subc|d0sub|dgetc|dget|\
e0c|e0ic|e0i|e0|e0subc|e0sub|egetc|eget|\
li2c|li2csub|li2|li2sub|li2omxc|li2omxcsub|li2omx|li2omxsub|\
ltini|ltexi|ltcache|ltvars|ltregul|\
clearcache|markcache|restorecache|getcachelast|setcachelast|\
getcmpbits|getdebugkey|getdelta|geterrdigits|getlambda|\
getmaxdev|getminmass|getmudim|getversionkey|getwarndigits|\
setcmpbits|setdebugkey|setdebugrange|setdelta|seterrdigits|setlambda|\
setmaxdev|setminmass|setmudim|setversionkey|setwarndigits)_$/ {
    sub("^_", "", $3);
    sub("^" PREFIX, "", $3);
    sub("_*$", "", $3);
    print file " " $3;
  }
' PREFIX="$prefix"`

fdefs=""
cdefs=""
c_defs=""

[ -f $ext ] && mv -f $ext $ext.old
touch $ext
[ -f $cext ] && mv -f $cext $cext.old
touch $cext

cd build

while [ $# -gt 1 ] ; do
  file=
  cppflags=
  for file in $1.[Fc] ; do
    break
  done
  [ -z "$file" ] && case "$1" in
  *C)	file=`echo "$1.F" | sed 's/C\.F$/\.F/'`
	cppflags="-DCOMPLEXPARA"
	;;
  esac
  case $file in
  *.c)	sym=`gcc -E -P $file | sed -n "
	  s|^[^ ]* *\($2\)(.*|\1|pI
	  s|} \($2\);|\1|pI
	  T
	  q"`
	c_defs="$c_defs
#define ${sym}_ $prefix${sym}_"
	cdefs="$cdefs
#define $sym $prefix$sym"
	fdefs="$fdefs
#define $sym $prefix$sym"
	;;
  *)	sym=${2:0:29}
	sym=`gfortran -E -P $cppflags $file | sed -n "
	  s|^[^c*].*subroutine *\($sym\).*|\1|pI
	  s|^[^c*].*function *\($sym\).*|\1|pI
	  s|^[^c*].*entry *\($sym\).*|\1|pI
	  s|^[^c*].*block data *\($sym\).*|\1|pI
	  s|^[^c*].*common */\($sym\).*|\1|pI
	  T
	  q"`
	fdefs="$fdefs
#define $sym $prefix$sym"
	;;
  esac
  echo $sym
  [ -z "$sym" ] && echo "Symbol $2 not found in $file." 1>&2
  shift 2
done


cat > $ext << _EOF_
#if 0
This file was generated by `basename $0` on `date`.
Do not edit.
#endif
`echo "$fdefs" | sort -u`
_EOF_


cat > $cext << _EOF_
#if 0
This file was generated by `basename $0` on `date`.
Do not edit.
#endif

#if NOUNDERSCORE
`echo "$cdefs" | sort -u`

#else
`echo "$c_defs" | sort -u`

#endif
_EOF_

