#!/bin/sh
cat << EOF > ev.h
/* This file automatically generated from ev.struct. Do not edit by hand. */

/* ev.h  event structure header file */

int ev_init(int);
void wrtev(void);
EOF
cat << EOF > ev.i
C  This file automatically generated from ev.struct. Do not edit by hand.

EOF
cat << EOF > ev.c
/* 
 * This file automatically generated from ev.struct, ev.header and ev.trailer.
 * Do not edit by hand. Edit ev.header and/or ev.trailer instead.
 */

#include <stdio.h>
#include <stdlib.h>
#include "ev.h" 
EOF
if test -r ev.header ;
then
    cat << EOF >> ev.c
/* ev.header starts here */

EOF
    sed '/^HEADER /d' ev.header >> ev.c
    sed -e '/^HEADER /!d' -e 's/^HEADER //' ev.header >> ev.h
    cat << EOF >> ev.c
/* ev.header ends here */
EOF
fi

parsing=
cat ev.struct | (
    cfuncs=
    hfuncs=
    while read type var
    do
        case "$type" in
        \#*)
            stype=
            ;;
        "")
            stype=
            ;;
	header)
	    if test -n "$parsing" ;
	    then
		echo "Unexpected header declaration." 1>&2
		exit 1
	    fi
	    parsing=header
	    stype=
	    p1=
	    p2=
	    p3=
	    sep=
	    in=head
	    in2=head
	    cat << EOF >> ev.h

extern struct evhead {
EOF
	    ;;
	particles)
	    case "$parsing" in
	    "")
		;;
	    header)
	        cat << EOF >> ev.h
} evhead;
EOF
                echo "struct evhead evhead;" >> ev.c
		;;
	    *)
		echo "Unexpected particles declaration." 1>&2
		exit 1
		;;
	    esac
	    parsing=particles
	    stype=
	    p1=int
	    p2="int i"
	    p3="int *i"
	    sep=", "
#           in="[i-1]"         WRONG!!  WANT ARRAYS SAME AS THE FORTRAN SPGC
#	    in2="[(*i)-1]"     WRONG!!  WANT ARRAYS SAME AS THE FORTRAN SPGC
	    in="[i]"
	    in2="[(*i)]"

	   
	    cat << EOF >> ev.h

extern struct ev {
EOF
	    ;;
        real|float)
            stype=float
            rtype=float
            ftype=real
            ;;
        double)
            stype=double
            rtype=double
            ftype="double precision"
            ;;
        int|integer)
            stype=int
            rtype=int
            ftype=integer
            ;;
        bool|boolean|logical)
            stype=char
            rtype=int
            ftype=integer
            ;;
        *)
            echo "Uexpected word $type." 1>&2
            exit 1
            ;;
        esac
        if test -n "$stype" ;
        then
            cat << EOF >> ev.i
      external ev_$var
      $ftype ev_$var
EOF
            cat << EOF >> ev.h
    $stype $var;
EOF
            hfuncs="$hfuncs
$rtype ev_$var($p1);
void evs_$var($p1$sep$rtype);
"
            cfuncs="$cfuncs
$rtype ev_$var($p2) { return(ev$in.$var); }
void evs_$var($p2$sep$rtype v) { ev$in.$var = v; }
$rtype ev_${var}_($p3) { return(ev$in2.$var); }
void evs_${var}_($p3$sep$stype *v) { ev$in2.$var = *v; }
"
        fi
    done
    if test "$parsing" != "particles" ;
    then
	echo "No per particle record defined." 2>&1
	exit 1
    fi
    cat << EOF >> ev.h
} *ev;

$hfuncs
EOF
    cat << EOF >> ev.c
struct ev *ev = NULL;

int ev_init(int n)
{
    if (ev != NULL)
    	free(ev);

    return ((ev = (struct ev *) calloc(1<<n, sizeof(struct ev))) != NULL);
}

int ev_init_(int *n)
{
    return(ev_init(*n));
}
$cfuncs
EOF
if test -r ev.trailer ;
then
    cat << EOF >> ev.c
/* ev.trailer starts here */

EOF
    sed '/^HEADER /d' ev.trailer >> ev.c
    sed -e '/^HEADER /!d' -e 's/^HEADER //' ev.trailer >> ev.h
    cat << EOF >> ev.c
/* ev.trailer ends here */
EOF
fi
)
