#!/bin/bash

if [[ $3 == '' ]]; then
  modname=`grep -m 1 '^ *module  *[a-zA-Z_]' $2 | sed -e's/ *module  *\([0-9a-zA-Z_]*\).*$/\L\1/'`
else
  modname=$3
fi
orig_modname=$(echo "$modname")
modname=$(echo "$modname" | sed -e's/global_pushpars/cdata/')
#Remove whitespace
modname=$(echo "$modname" | sed -e 's/[[:space:]]//g')

#if [[ $modname =~ entropy.* ]] || [[ $modname =~ temperature_.* ]] || [[ $modname == thermal_energy ]]; then
#  modname='energy'
#elif [[ $modname =~ eos_.* ]]; then
#  modname='equationofstate'
#fi

modheader=../$modname'_'$1's_c.h'
if [[ $1 == par ]]; then
  ptype=void
  headerdir=DSL/local
#submodule/acc-runtime/$DSL_MODULE_DIR
  modinit=$modheader
  modecs=tmp2
else
  ptype=int
  headerdir=diagnostics
  modinit=$modname'_diags_init_c.h'
  modecs=/dev/null
  rm -f $modinit
fi
#
# writes declaration of push$1s2c into $modfuncs
#
modfuncs=PC_module_$1funcs.h
rm -f tmp
if [ ! -f $modfuncs ]; then
  echo '// automatically generated; do not edit!' > $modfuncs
fi
#
# extracts body of push$1s2c from module source > tmp
#
sed -n '
  /^ *subroutine  *push'$1's2c/,/^ *end *subroutine  *push'$1's2c/ {
  /dimension *( *: *)/ d
  /subroutine/ d
  /call  *keep_compiler/ d
  /use / d
  /^ *!/ d
  /set_type *(/ d
  p
  }
' < $2 > tmp
#
# writes declarations of n_$1s_<modname>, p_$1_<modname> and call of push$1s2c into $modname_$1s_c.h
#
rm -f $modheader tmp1
if [[ $MODULE_NAME_ORDER == 'CRAY' ]]; then
  str=$2
  substr="/special/"
  if [[ "$str" == *"$substr"* ]]; then
    sed -n '
      /parameter/ {
         h
         s/^.*parameter *:: *n_'$1's\( *= *[1-9][0-9]*\) *$/const int n_'$1's_'$modname'\1;\n EXTERN '$ptype' *p_'$1'_'$modname'[n_'$1's_'$modname'];\n extern "C" void *'$MODULE_PREFIX'push'$1's2c'$MODULE_INFIX$orig_modname$MODULE_SUFFIX'('$ptype' *(\&p_'$1')[n_'$1's_'$modname']);/
         t store
         b cont
         : store
         p
         : cont
         g
         s/^.*parameter *:: *n_'$1's\( *= *[1-9][0-9]*\) *$/for (int i=0;i<n_pars_'$modname';i++)p_'$1'_'$modname'[i]=NULL;\npushpars_special("'$MODULE_PREFIX'push'$1's2c'$MODULE_INFIX$orig_modname$MODULE_SUFFIX'",p_'$1'_'$modname');/ w '$modinit'
      }
    ' < tmp >> $modfuncs
  else
    sed -n '
      /parameter/ {
         h
         s/^.*parameter *:: *n_'$1's\( *= *[1-9][0-9]*\) *$/const int n_'$1's_'$modname'\1;\n EXTERN '$ptype' *p_'$1'_'$modname'[n_'$1's_'$modname'];\n extern "C" void *'$MODULE_PREFIX'push'$1's2c'$MODULE_INFIX$orig_modname$MODULE_SUFFIX'('$ptype' *(\&p_'$1')[n_'$1's_'$modname']);/
         t store
         b cont
         : store
         p
         : cont
         g
         s/^.*parameter *:: *n_'$1's\( *= *[1-9][0-9]*\) *$/for (int i=0;i<n_pars_'$modname';i++)p_'$1'_'$modname'[i]=NULL;\n'$MODULE_PREFIX'push'$1's2c'$MODULE_INFIX$orig_modname$MODULE_SUFFIX'(p_'$1'_'$modname');/ w '$modinit'
      }
    ' < tmp >> $modfuncs
  fi
else
  str=$2
  substr="/special/"
  if [[ "$str" == *"$substr"* ]]; then
    sed -n '
      /parameter/ {
         h
         s/^.*parameter *:: *n_'$1's\( *= *[1-9][0-9]*\) *$/const int n_'$1's_'$modname'\1;\n EXTERN '$ptype' *p_'$1'_'$modname'[n_'$1's_'$modname'];\n extern "C" void *'$MODULE_PREFIX$orig_modname$MODULE_INFIX'push'$1's2c'$MODULE_SUFFIX'('$ptype' *(\&p_'$1')[n_'$1's_'$modname']);/
         t store
         b cont
         : store
         p
         : cont
         g
         s/^.*parameter *:: *n_'$1's\( *= *[1-9][0-9]*\) *$/for (int i=0;i<n_pars_'$modname';i++)p_'$1'_'$modname'[i]=NULL;\npushpars_special("'$MODULE_PREFIX$orig_modname$MODULE_INFIX'push'$1's2c'$MODULE_SUFFIX'",p_'$1'_'$modname');/ w '$modinit'
      }
    ' < tmp >> $modfuncs
  else
    sed -n '
      /parameter/ {
         h
         s/^.*parameter *:: *n_'$1's\( *= *[1-9][0-9]*\) *$/const int n_'$1's_'$modname'\1;\n EXTERN '$ptype' *p_'$1'_'$modname'[n_'$1's_'$modname'];\n extern "C" void *'$MODULE_PREFIX$orig_modname$MODULE_INFIX'push'$1's2c'$MODULE_SUFFIX'('$ptype' *(\&p_'$1')[n_'$1's_'$modname']);/
         t store
         b cont
         : store
         p
         : cont
         g
         s/^.*parameter *:: *n_'$1's\( *= *[1-9][0-9]*\) *$/for (int i=0;i<n_pars_'$modname';i++)p_'$1'_'$modname'[i]=NULL;\n'$MODULE_PREFIX$orig_modname$MODULE_INFIX'push'$1's2c'$MODULE_SUFFIX'(p_'$1'_'$modname');/ w '$modinit'
      }
    ' < tmp >> $modfuncs
  fi
fi
#
if [[ $1 == 'par' ]]; then
  sed -n '
          /^[^!]*call  *copy_addr[a-zA-Z0-9_]* *(/ {
	    s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname'); \/\/ [\2-1] \1 real/w tmp1
	    s/PCLoad(config,AC_dt,dt);.*//
	    s/PCLoad(config,AC_dt__mod__cdata,dt__mod__cdata);.*//
	    s/PCLoad(config,AC_t,t);.*//
	    s/PCLoad(config,AC_t__mod__cdata,t__mod__cdata);.*//
            t cont
	    s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! *\([a-zA-Z][a-zA-Z0-9_]*\) *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname'); \/\/ [\2-1] \1 \3/w tmp1
	    s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! *\([a-zA-Z][a-zA-Z0-9_]*\) *\([a-zA-Z][a-zA-Z0-9_]*\) *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname'); \/\/ [\2-1] \1 \3 \4/w tmp1
            t cont
           s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname'); \/\/ [\2-1] \1 real(\3)/w tmp1
	    s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) gmem *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname'); \/\/ [\2-1] \1 real(\3) gmem/w tmp1
	    s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) dconst *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname'); \/\/ [\2-1] \1 real(\3) dconst/w tmp1
	    s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! bool *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname'); \/\/ [\2-1] \1 bool(\3)/w tmp1
	    s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! int *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname'); \/\/ [\2-1] \1 int(\3)/w tmp1
	    s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! int *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname'); \/\/ [\2-1] \1 int(\3) (\4)/w tmp1
	    s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname'); \/\/ [\2-1] \1 real(\3) (\4)/w tmp1
	    s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname'); \/\/ [\2-1] \1 real(\3) (\4) (\5)/w tmp1
	    s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname'); \/\/ [\2-1] \1 real(\3) (\4) (\5) (\6)/w tmp1
#            s/call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *$/ \/\/memcpy(config.real_arr_params[\uA\uC\L_\1],\1,\3*sizeof(real)); \/\/ [\2-1] \1 real(\3)/w tmp1
            t cont
	    s/^[^!]*call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! *\([a-zA-Z]*\) *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *$/ PCLoad(config,\uA\uC\L_\1__mod__'$modname',\1__mod__'$modname');  \/\/ [\2-1] \1 \3(\4)/w tmp1
#            s/call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! *\([a-zA-Z]*\) *( *\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\) *) *$/ \/\/memcpy(config.\3_arr_params[\uA\uC\L_\1],\1,\4*sizeof(\3));  \/\/ [\2-1] \1 \3(\4)/w tmp1
            b
            : cont
            p
          }
  '< tmp >> $modheader
#            s/call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *$/ config.real_params[\uA\uC\l_\1]=\1;  \/\/ \1 real/w tmp1
#            s/call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *$/CUDA_ERRCHK( cudaMemcpyToSymbol(d_\U\1\L, p_par_'$modname'[\2-1], sizeof(real)) );  \/\/ \1 real/w tmp1
#            s/call  *copy_addr[a-zA-Z0-9_]* *( *\([a-zA-Z0-9_]*\) *, *p_par(\([0-9]*\))) *! *\([a-zA-Z][a-zA-Z]*\) *$/CUDA_ERRCHK( cudaMemcpyToSymbol(d_\U\1\L, p_par_'$modname'[\2-1], sizeof(\3)) ); \/\/ \1 \3/w tmp1
else
  sed -n '
          /call  *copy_addr[a-zA-Z0-9_]* *(/ {
             h
             s/call  *copy_addr[a-zA-Z0-9_]* *( *idiag_\([a-zA-Z0-9_]\)\([mr][am][sx]\) *, *p_'$1' *( *\([0-9]*\) *) *) *$/if (idiag_\1\2>0) {\n  diag=reduce_cuda_PC(\U\2_VEC\L, h_grid.\U\1\1X\L);\n  save_name(diag,idiag_\1\2);\n}/ 
             s/call  *copy_addr[a-zA-Z0-9_]* *( *idiag_\([a-zA-Z0-9_]\)\(min\) *, *p_'$1' *( *\([0-9]*\) *) *) *$/if (idiag_\1\2>0) {\n  diag=-reduce_cuda_PC(\U\2_VEC\L, h_grid.\U\1\1X\L);\n  save_name(diag,idiag_\1\2);\n}/ 
             t store
             b cont
             : store
             p
             : cont
             s/call  *copy_addr[a-zA-Z0-9_]* *( *idiag_\([a-zA-Z0-9_]\)\([xyz]\)\([mr][iam][nsx]\) *, *p_'$1' *( *\([0-9]*\) *) *) *$/if (idiag_\1\2\3>0) {\n  diag=reduce_cuda_PC(\U\3_SCAL\L, h_grid.\U\1\1\2\L);\n  save_name(diag,idiag_\1\2\3);\n}/ 
             s/call  *copy_addr[a-zA-Z0-9_]* *( *idiag_\([a-zA-Z0-9_]\)\([xyz]\)\(min\) *, *p_'$1' *( *\([0-9]*\) *) *) *$/if (idiag_\1\2\3>0) {\n  diag=-reduce_cuda_PC(\U\3_SCAL\L, h_grid.\U\1\1\2\L);\n  save_name(diag,diag_\1\2\3);\n}/ 
             s/call  *copy_addr[a-zA-Z0-9_]* *( *idiag_\([a-zA-Z0-9_]*\)\([mr][am][sx]\) *, *p_'$1' *( *\([0-9]*\) *) *) *$/if (idiag_\1\2>0) {\n  diag=reduce_cuda_PC(\U\2_SCAL\L, h_grid.\U\1\L);\n  save_name(diag,idiag_\1\2);\n}/ 
             s/call  *copy_addr[a-zA-Z0-9_]* *( *idiag_\([a-zA-Z0-9_]*\)\(min\) *, *p_'$1' *( *\([0-9]*\) *) *) *$/if (idiag_\1\2>0) {\n  diag=-reduce_cuda_PC(\U\2_SCAL\L, h_grid.\U\1\L);\n  save_name(diag,idiag_\1\2);\n}/ 
             s/call  *copy_addr[a-zA-Z0-9_]* *( *idiag_\([a-zA-Z0-9_]*\)\(m\) *, *p_'$1' *( *\([0-9]*\) *) *) *$/if (idiag_\1\2>0) {\n  diag=reduce_cuda_PC(\U SUM_SCAL\L, h_grid.\U\1\L);\n  save_name(diag,idiag_\1\2);\n}/ 
             t store1
             b cont1
             : store1
             p
             : cont1
             g
             s/( *idiag_\([a-zA-Z0-9_]*\) *, *p_'$1' *( *\([0-9]*\)).*$/p_'$1'_'$modname'[\2-1] \/\/ idiag_\1 int/ w tmp1
         }
  ' < tmp >> $modheader
fi

rm -f tmp
#
# writes macro definition of individual p_'$1' into $modfuncs
#
#s/^#define *\([a-zA-Z0-9_]*\).*(( *\([a-zA-Z0-9_]*\) .*$/run_const \2 AC_\1 \/\/ from '$modname'\n#define \1 \AC_\1/
if [ -f tmp1 ]; then
  sed -n '
         s/^.*\/\/ *\(\[.*\]\) *\([a-zA-Z0-9_]*\)  *\([a-zA-Z0-9_]*\) *$/#define \2__mod__'$modname' to_\3(p_par_'$modname'\1,"p_par_'$modname'\1")/
         s/^.*\/\/ *\(\[.*\]\) *\([a-zA-Z0-9_]*\)  *\([a-zA-Z0-9_]*\) dconst *$/#define \2__mod__'$modname' to_\3(p_par_'$modname'\1,"p_par_'$modname'\1") \/\/ dconst/
         s/^.*\/\/ *\(\[.*\]\) *\([a-zA-Z0-9_]*\)  *\([a-zA-Z0-9_]*\) run_const *$/#define \2__mod__'$modname' to_\3(p_par_'$modname'\1,"p_par_'$modname'\1")/
         t cont
         b dimen
         : cont
         p
         s/^#define *\([a-zA-Z0-9_]*\) to_\([a-zA-Z0-9_]*\).*\/\/ dconst$/dconst \2 AC_\1 \/\/ from '$modname'\n#define \1 \AC_\1/
         s/^#define *\([a-zA-Z0-9_]*\) to_\([a-zA-Z0-9_]*\).*$/run_const \2 AC_\1 \/\/ from '$modname'\n#define \1 \AC_\1/
	 s/.*run_const real AC_dt //
	 s/#define dt AC_dt//
	 s/.*run_const real AC_dt__mod__cdata //
	 s/#define dt AC_dt__mod__cdata//
	 s/#define dt AC_t//
	 s/.*run_const real AC_t__mod__cdata //
	 s/#define dt AC_t__mod__cdata//
         H
         b end
         : dimen
         s/^.*\/\/ *\(\[.*\]\) *\([a-zA-Z0-9_]*\)  *\([a-zA-Z0-9_]*\) *\(( *[a-zA-Z0-9_+\*\/-]* *)\) *$/#define \2__mod__'$modname' ((\3 *) p_'$1'_'$modname'\1) \/\/ \4/
         s/^.*\/\/ *\(\[.*\]\) *\([a-zA-Z0-9_]*\)  *\([a-zA-Z0-9_]*\) *\(( *[a-zA-Z0-9_+\*\/-]* *)\) gmem *$/#define \2__mod__'$modname' ((\3 *) p_'$1'_'$modname'\1) \/\/ \4 gmem/
         s/^.*\/\/ *\(\[.*\]\) *\([a-zA-Z0-9_]*\)  *\([a-zA-Z0-9_]*\) *\(( *[a-zA-Z0-9_+\*\/-]* *)\) dconst *$/#define \2__mod__'$modname' ((\3 *) p_'$1'_'$modname'\1) \/\/ \4 dconst/
         s/^.*\/\/ *\(\[.*\]\) *\([a-zA-Z0-9_]*\)  *\([a-zA-Z0-9_]*\) *\(( *[a-zA-Z0-9_+\*\/-]* *)\) *\(( *[a-zA-Z0-9_+\*\/-]* *)\) *$/#define \2__mod__'$modname' ((\3 *) p_'$1'_'$modname'\1) \/\/ \4 \5/ 
         s/^.*\/\/ *\(\[.*\]\) *\([a-zA-Z0-9_]*\)  *\([a-zA-Z0-9_]*\) *\(( *[a-zA-Z0-9_+\*\/-]* *)\) *\(( *[a-zA-Z0-9_+\*\/-]* *)\) *\(( *[a-zA-Z0-9_+\*\/-]* *)\) *$/#define \2__mod__'$modname' ((\3 *) p_'$1'_'$modname'\1) \/\/ \4 \5 \6/
         s/^.*\/\/ *\(\[.*\]\) *\([a-zA-Z0-9_]*\)  *\([a-zA-Z0-9_]*\) *\(( *[a-zA-Z0-9_+\*\/-]* *)\) *\(( *[a-zA-Z0-9_+\*\/-]* *)\) *\(( *[a-zA-Z0-9_+\*\/-]* *)\) *\(( *[a-zA-Z0-9_+\*\/-]* *)\) *$/#define \2__mod__'$modname' ((\3 *) p_'$1'_'$modname'\1) \/\/ \4 \5 \6 \7/
         p
         s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\([mn]\)\([xyz]*\)\(grid\)\?) *$/gmem \2 AC_\1[AC_\3\4\5] \/\/ from '$modname'\n#define \1 \AC_\1/
	 s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\(max_n\)) *$/gmem \2 AC_\1[max_n] \/\/ from '$modname'\n#define \1 \AC_\1/

	 s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\(hcond_prof_size\)) *$/gmem \2 AC_\1[hcond_prof_size] \/\/ from '$modname'\n#define \1 \AC_\1/
	 s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\(chit_prof_size\)) *$/gmem \2 AC_\1[chit_prof_size] \/\/ from '$modname'\n#define \1 \AC_\1/
	 s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\(chit_prof_fluct_stored_size\)) *$/gmem \2 AC_\1[chit_prof_fluct_stored_size] \/\/ from '$modname'\n#define \1 \AC_\1/

         s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\)) *$/run_const \2 AC_\1[\3] \/\/ from '$modname'\n#define \1 \AC_\1/
         s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\)) gmem *$/gmem \2 AC_\1[\3] \/\/ from '$modname'\n#define \1 \AC_\1/
         s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\)) dconst *$/dconst \2 AC_\1[\3] \/\/ from '$modname'\n#define \1 \AC_\1/
         s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\([mn]\)\([xyz]*\)\(grid\)\?) *(\([mn]\)\([xyz]*\)\(grid\)\?) *$/gmem \2 AC_\1[AC_\3\4\5][AC_\6\7\8] \/\/ from '$modname'\n#define \1 \AC_\1/
         s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\)) *(\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\)) *$/gmem \2 AC_\1[\3][\4] \/\/ from '$modname'\n#define \1 \AC_\1/
         s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\)) *(\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\)) *(\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\)) *$/gmem \2 AC_\1[\3][\4][\5] \/\/ from '$modname'\n#define \1 \AC_\1/
         s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\)) *(\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\)) *(\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\)) *(\([a-zA-Z0-9_][a-zA-Z0-9_+\*\/-]*\)) *$/gmem \2 AC_\1[\3][\4][\5][\6] \/\/ from '$modname'\n#define \1 \AC_\1/
         H
         : end
         $ {
            g
            w '$modecs'
           }
         ' < tmp1 >> $modfuncs
  rm -f tmp1
fi
#         s/^#define *\([a-zA-Z0-9_]*\) (( *\([a-zA-Z0-9_]*\) \*).*\/\/ *(\([mn]\)\([xyz]*\)) *$/Profile_\l\4 AC_\1[AC_\3\4] \/\/ from '$modname'\n#define \1 \AC_\1/
#
# writes #include "$modname_$1s_c.h" into /PC_module$1s.h
#
echo '#include "'$modheader'"' >> PC_module$1s.h
#
# writes #include "$modname_par_decs_c.h" into $headerdir/PC_modulepardecs.h
#
if [[ $1 == 'par' ]]; then
  cat $modecs >> $headerdir/PC_modulepardecs.h
  rm -f tmp2
fi


