#!/bin/sh

# Copyright (c) 2013, Derek Buitenhuis
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

# mktemp isn't POSIX, so supply an implementation
mktemp() {
    echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
}

if [ $# -lt 2 ]; then
    echo "Usage: makedef <version_script> <objects>" >&2
    exit 0
fi

vscript=$1
shift

if [ ! -f "$vscript" ]; then
    echo "Version script does not exist" >&2
    exit 1
fi

for object in "$@"; do
    if [ ! -f "$object" ]; then
        echo "Object does not exist: ${object}" >&2
        exit 1
    fi
done

# Create a lib temporarily to dump symbols from.
# It's just much easier to do it this way
libname=$(mktemp -u "library").lib

trap 'rm -f -- $libname' EXIT

if [ -n "$AR" ]; then
    $AR rcs ${libname} $@ >/dev/null
else
    lib -out:${libname} $@ >/dev/null
fi
if [ $? != 0 ]; then
    echo "Could not create temporary library." >&2
    exit 1
fi

IFS='
'

prefix="$EXTERN_PREFIX"

started=0
regex="none"

for line in $(cat ${vscript} | tr '\t' ' '); do
    # We only care about global symbols
    echo "${line}" | grep -q '^ \+global:'
    if [ $? = 0 ]; then
        started=1
        line=$(echo "${line}" | sed -e 's/^ \{1,\}global: *//')
    else
        echo "${line}" | grep -q '^ \+local:'
        if [ $? = 0 ]; then
            started=0
        fi
    fi

    if [ ${started} = 0 ]; then
        continue
    fi

    # Handle multiple symbols on one line
    IFS=';'

    # Work around stupid expansion to filenames
    line=$(echo "${line}" | sed -e 's/\*/.\\+/g')
    for exp in ${line}; do
        # Remove leading and trailing whitespace
        exp=$(echo "${exp}" | sed -e 's/^ *//' -e 's/ *$//')

        if [ "${regex}" = "none" ]; then
            regex="${exp}"
        else
            regex="${regex};${exp}"
        fi
    done

    IFS='
'
done

if [ -n "$NM" ]; then
    # Use eval, since NM="nm -g"
    dump=$(eval "$NM --defined-only -g ${libname}" |
              grep -v : |
              grep -v ^$ |
              cut -d' ' -f3 |
              sed -e "s/^${prefix}//")
else
    dump=$(dumpbin -linkermember:1 ${libname} |
              sed -e '/public symbols/,$!d' -e '/^ \{1,\}Summary/,$d' -e "s/ \{1,\}${prefix}/ /" -e 's/ \{1,\}/ /g' |
              tail -n +2 |
              cut -d' ' -f3)
fi

rm ${libname}

IFS=';'
list=""
for exp in ${regex}; do
    list="${list}"'
'$(echo "${dump}" |
          grep "^${exp}" |
          sed -e 's/^/    /')
done

echo "EXPORTS"
echo "${list}" | sort | uniq | tail -n +2
