#!/bin/sh -
#	$Id$
#
# Build structure signature code.

a=/tmp/__db_a.$$
b=/tmp/__db_b.$$
c=/tmp/__db_c.$$
trap 'rm -f $a $b $c; exit 0' 0 1 2 3 13 15

cat ../src/dbinc/db.in ../src/dbinc/db_int.in ../src/dbinc/*.h | 
sed -e '/.*struct.*mutex.*{[	 ]*\/\* SHARED \*\/.*/i\
#ifdef	HAVE_MUTEX_SUPPORT' \
    -e '/.*struct.*mutex.*{[	 ]*\/\* SHARED \*\/.*/a\
#endif' \
    -e 's/.*[	 ]*\(__[a-z_]*\)[	 ]*{[	 ]*\/\* SHARED \*\/.*/	__ADD(\1);/p' \
    -e d > $a

cat ../src/dbinc/db.in ../src/dbinc/db_int.in ../src/dbinc/*.h | 
sed -e '/__addrinfo/d' \
    -e '/__aes_cipher/d' \
    -e '/__cipher/d' \
    -e '/__channel/d' \
    -e '/__queued_output/d' \
    -e '/__repmgr_connection/d' \
    -e '/__repmgr_message/d' \
    -e '/__repmgr_response/d' \
    -e '/__repmgr_retry/d' \
    -e '/__repmgr_runnable/d' \
    -e '/__repmgr_site/d' \
    -e '/.*[	 ]*\(__[a-z_]*\)[	 ]*{[	 ]*\/\* SHARED \*\/.*/d' \
    -e '/struct.*mutex.*{/i\
#ifdef	HAVE_MUTEX_SUPPORT' \
    -e '/struct.*mutex.*{/a\
#endif' \
    -e 's/.*[	 ]*struct[	 ]*\(__[a-z_]*\)[	 ]*{.*/	__ADD(\1);/p' \
    -e d > $c

cnt1=`sed -e '$=' -e d $a`
cnt2=`sed -e '$=' -e d $c`

cat << END_OF_TEXT > $b
/*-
 * DO NOT EDIT: automatically built by dist/s_sig.
 *
 * \$Id$
 */

#include "db_config.h"

#include "db_int.h"

#include "dbinc/db_page.h"
#include "dbinc/btree.h"
#include "dbinc/crypto.h"
#include "dbinc/db_join.h"
#include "dbinc/db_verify.h"
#include "dbinc/hash.h"
#include "dbinc/heap.h"
#include "dbinc/lock.h"
#include "dbinc/log_verify.h"
#include "dbinc/mp.h"
#include "dbinc/partition.h"
#include "dbinc/qam.h"
#include "dbinc/txn.h"

END_OF_TEXT
cat << END_OF_TEXT >> $b
/* 
 * For a pure 32bit/64bit environment, we check all structures and calculate a
 * signature. For compatible environment, we only check the structures in
 * shared memory.
 */
END_OF_TEXT
echo "#ifdef HAVE_MIXED_SIZE_ADDRESSING" >> $b
echo "#define	__STRUCTURE_COUNT	$cnt1" >> $b
echo "#else" >> $b
echo "#define	__STRUCTURE_COUNT	($cnt1 + $cnt2)" >> $b
echo "#endif" >> $b

cat << END_OF_TEXT >> $b

/*
 * __env_struct_sig --
 *	Compute signature of structures.
 *
 * PUBLIC: u_int32_t __env_struct_sig __P((void));
 */
u_int32_t
__env_struct_sig()
{
	u_short t[__STRUCTURE_COUNT + 5];
	u_int i;

	i = 0;
#define	__ADD(s)	(t[i++] = sizeof(struct s))

END_OF_TEXT

cat $a >> $b

cat << END_OF_TEXT >> $b

#ifndef HAVE_MIXED_SIZE_ADDRESSING
END_OF_TEXT

cat $c >> $b

echo "#endif" >> $b

cat << END_OF_TEXT >> $b

	return (__ham_func5(NULL, t, i * sizeof(t[0])));
}
END_OF_TEXT

f=../src/env/env_sig.c
cmp $b $f > /dev/null 2>&1 ||
    (echo "Building $f" && rm -f $f && cp $b $f)
