#!/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

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

IFS='
'

# Determine if we're building for x86 or x86_64 and
# set the symbol prefix accordingly.
prefix=""
arch=$(dumpbin -headers ${libname} |
       tr '\t' ' ' |
       grep '^ \+.\+machine \+(.\+)' |
       head -1 |
       sed -e 's/^ \{1,\}.\{1,\} \{1,\}machine \{1,\}(\(...\)).*/\1/')

if [ "${arch}" = "x86" ]; then
    prefix="_"
else
    if [ "${arch}" != "ARM" ] && [ "${arch}" != "x64" ]; then
        echo "Unknown machine type." >&2
        exit 1
    fi
fi

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

dump=$(dumpbin -linkermember:1 ${libname})

rm ${libname}

IFS=';'
list=""
for exp in ${regex}; do
    list="${list}"'
'$(echo "${dump}" |
          sed -e '/public symbols/,$!d' -e '/^ \{1,\}Summary/,$d' -e "s/ \{1,\}${prefix}/ /" -e 's/ \{1,\}/ /g' |
          tail -n +2 |
          cut -d' ' -f3 |
          grep "^${exp}" |
          sed -e 's/^/    /')
done

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