#!/bin/bash
# This script generates the version scripts

set -e

debian_dir="$(dirname "$(readlink -f "$0")")"
cd "$debian_dir"
soname=$(./rules soname)

function map_symbols_file {
  declare -A versions=()
  declare -A c=()
  declare -A cpp=()

  while IFS='' read ligne; do
    if [[ "$ligne" =~ ^\ (\(([^\)]*)\))?\"?([^@\"]*)@([^\ \"]*)\"?\ ([^\ ]*)$ ]]; then
      flags="${BASH_REMATCH[2]}"
      symbol="${BASH_REMATCH[3]}"
      version_name="${BASH_REMATCH[4]}"
      version_first_seen="${BASH_REMATCH[5]}"
      if [ "$version_name" = "Base" ]; then
        version_name="$version_first_seen"
      else
        version_name="${version_name##*_}"
      fi
      if [ ! ${versions[$version_name]+_} ]; then
        versions[$version_name]=""
      fi
      if [[ "$flags" =~ (^|\|)c\+\+(\||$) ]]; then
        cpp[$version_name]="${cpp[$version_name]}${symbol}\n"
      else
        c[$version_name]="${c[$version_name]}${symbol}\n"
      fi
    fi
  done <"$1"

  echo "/* Generated from script $(basename "$0") */"
  echo
  prev_version=""
  for version in $(echo "${!versions[@]}" | sed 's/ /\n/g' | sort -V); do
    echo "HDF5_@MAP@_$version {"
    c[$version]="$(echo -e "${c[$version]}" | grep -v '^HDF5_\(SERIAL\|CPP\|MPI\)_[0-9\.]*$')"
    if [ -n "${cpp[$version]}${c[$version]}" ]; then
      echo "    global:"
    fi
    if [ -n "${cpp[$version]}" ]; then
      echo '        extern "C++" {'
      echo -e "${cpp[$version]}" | sort -u | sed '/^$/d;s/^/            "/;s/$/"\;/'
      echo '        };'
    fi
    echo -e "${c[$version]}" | sort -u | sed '/^$/d;s/^/        /;s/$/\;/'
    echo "}${prev_version:+ HDF5_@MAP@_$prev_version};"
    echo ""
    prev_version=$version
  done
}

map_symbols_file "libhdf5-$soname.symbols" | sed 's/@MAP@/SERIAL/' >map_serial.ver
map_symbols_file "libhdf5-cpp-$soname.symbols" | sed 's/@MAP@/CPP/' >>map_serial.ver
map_symbols_file "libhdf5-openmpi-$soname.symbols" | sed 's/@MAP@/MPI/' >map_mpi.ver
