#!/usr/bin/env bash
set -o errexit -o pipefail -o posix

# Copyright (c) 2019-2024 Cosmin Truta.
#
# Use, modification and distribution are subject to the MIT License.
# Please see the accompanying file LICENSE_MIT.txt
#
# SPDX-License-Identifier: MIT

# shellcheck source="ci/lib/ci.lib.sh"
source "$(dirname "$0")/lib/ci.lib.sh"
cd "$CI_TOPLEVEL_DIR"

function ci_shellify_c {
    # Convert C preprocessor text, specifically originating
    # from png.h, to shell scripting text.
    # Select only the easy-to-parse definitions of PNG_LIBPNG_*.
    sed -n -e '/^\# *define * PNG_LIBPNG_[^ ]* * ["0-9A-Za-z_]/ p' |
        sed -e 's/^\# *define * PNG\([^ ]*\) * \([^ ]*\)/PNG\1=\2/' \
            -e 's/=PNG\([0-9A-Za-z_]*\)/=\${PNG\1}/' \
            -e 's/^\([^ ]*=[^ ]*\).*$/export \1;/'
}

function ci_shellify_autoconf {
    # Convert autoconf (M4) text, specifically originating
    # from configure.ac, to shell scripting text.
    # Select only the easy-to-parse definitions of PNGLIB_*.
    sed -n -e '/^ *PNGLIB_[^ ]*=[$"0-9A-Za-z_]/ p' |
        sed -e 's/^ *PNG\([0-9A-Za-z_]*\)=\([^# ]*\).*$/PNG\1=\2/' \
            -e 's/^\([^ ]*=[^ ]*\).*$/export \1;/'
}

function ci_shellify_cmake {
    # Convert CMake lists text, specifically originating
    # from CMakeLists.txt, to shell scripting text.
    # Select only the easy-to-parse definitions of PNGLIB_*.
    sed -n -e '/^ *set *(PNGLIB_[^ ]* * [$"0-9A-Za-z_].*)/ p' |
        sed -e 's/^ *set *(PNG\([^ ]*\) * \([^() ]*\)).*$/PNG\1=\2/' \
            -e 's/^\([^ ]*=[^ ]*\).*$/export \1;/'
}

function ci_shellify {
    local arg filename
    for arg in "$@"
    do
        test -f "$arg" || ci_err "no such file: '$arg'"
        filename="$(basename -- "$arg")"
        case "$filename" in
        ( *.[ch] )
            [[ $filename == png.h ]] || {
                ci_err "unable to shellify: '$filename' (expecting: 'png.h')"
            }
            ci_shellify_c <"$arg" ;;
        ( config* | *.ac )
            [[ $filename == configure.ac ]] || {
                ci_err "unable to shellify: '$filename' (expecting: 'configure.ac')"
            }
            ci_shellify_autoconf <"$arg" ;;
        ( *CMake* | *cmake* | *.txt )
            [[ $filename == [Cc][Mm]ake[Ll]ists.txt ]] || {
                ci_err "unable to shellify: '$filename' (expecting: 'CMakeLists.txt')"
            }
            ci_shellify_cmake <"$arg" ;;
        ( * )
            ci_err "unable to shellify: '$arg'" ;;
        esac
    done
}

function usage {
    echo "usage: $CI_SCRIPT_NAME [<options>] <files>..."
    echo "options: -?|-h|--help"
    echo "files: png.h|configure.ac|CMakeLists.txt"
    exit "${@:-0}"
}

function main {
    local opt
    while getopts ":" opt
    do
        # This ain't a while-loop. It only pretends to be.
        [[ $1 == -[?h]* || $1 == --help || $1 == --help=* ]] && usage 0
        ci_err "unknown option: '$1'"
    done
    shift $((OPTIND - 1))
    [[ $# -eq 0 ]] && usage 2
    # And... go!
    ci_shellify "$@"
}

main "$@"
