#!/bin/sh

# Copyright (c) 2009, Aleksey Cheusov <vle@gmx.net>
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

# usage: mkc_check_sizeof <type>

set -e

LC_ALL=C
export LC_ALL

##################################################
# options
usage (){
    cat <<EOF
mkc_check_sizeof detects sizeof(type)
by compiling a test program.
mkc_check_sizeof doesn't run a generated executable
and therefore is ready for cross-compiling.

Usage: mkc_check_sizeof type [headers...]

Examples:
   mkc_check_sizeof 'void*'
   mkc_check_sizeof long-long
   mkc_check_sizeof size_t stdlib.h
EOF
}

if test $# -eq 0; then
    usage
    exit 1
fi
if test "$1" = '-h' -o "$1" = '--help'; then
    usage
    exit 0
fi

##################################################
# initializing

type=`echo $1 | tr ' -' '  '`
pathpart=`echo $type | tr '*' 'P'`

. mkc_check_common.sh

##################################################
# test

if test "$MKC_NOCACHE" != 1 && test -f "$cache"; then
    cached=1
    printme '%s' "checking for sizeof ${type}... (cached) " 1>&2
    ret=`cat "$cache"`
else
    printme '%s' "checking for sizeof ${type}... " 1>&2
    ret=failed
    for sz in 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1; do
	for f in $MKC_COMMON_HEADERS $2; do
	    echo "#include <$f>"
	done > "$tmpc"
	cat >> "$tmpc" <<EOF
int main ()
{
   char a [sizeof ($type)-${sz}];
   return 0;
}
EOF

	if $CC -c -o "${tmpo}" $CPPFLAGS $CFLAGS "${tmpc}" 2>"${tmperr}"
	then
	    echo $sz > "$cache"
	    ret=$sz
	    break
	fi
    done
fi

##################################################
# clean-ups

cleanup

##################################################
# finishing

printme "$ret\n" 1>&2
echo $ret
