#!/bin/bash

# Universal bash program setup functions.

# Example usage:

# Source files to get required functions.
# source_files="gen_setup.sh"
# source_file_paths=$(type -p ${source_files})
# for file_path in ${source_file_paths} ; do source ${file_path} ; done

# Turn on extended globbing.
shopt -s extglob


function get_pgm_path_info() {
    local program_path_var="${1:-program_path}" ; shift
    local program_name_var="${1:-program_name}" ; shift
    local program_dir_path_var="${1:-program_dir_path}" ; shift
    local follow_links="${1:-0}" ; shift

    # Determine the program path, name and dir path and assign them to the variables indicated by the caller.

    # Description of argument(s):
    # program_path_var                The name of the variable to receive the program path.
    # program_name_var                The name of the variable to receive the program name.
    # program_dir_path_var            The name of the variable to receive the program dir path.
    # follow_links                    If the program running is actually a link to another file, use that file
    #                                 when calculating the above values.

    local _spn_loc_program_path_="${0}"

    # The program name is the program path minus all characters up to and including the first slash.
    local _spn_loc_program_name_=${_spn_loc_program_path_##*/}
    # The program dir path is the program path minus everything from the last slash to the end of the string.
    local _spn_loc_program_dir_path_=${_spn_loc_program_path_%${_spn_loc_program_name_}}

    # If program dir path does not start with a slash then it is relative.  Convert it to absolute.
    if [ "${_spn_loc_program_dir_path_:0:1}" != "/" ] ; then
        _spn_loc_program_dir_path_="$(readlink -f ${_spn_loc_program_dir_path_})/"
        # Re-assemble the parts into program path variable.
        _spn_loc_program_path_="${_spn_loc_program_dir_path_}${_spn_loc_program_name_}"
    fi

    if (( follow_links )) ; then
        _spn_loc_program_path_=$(readlink -f ${_spn_loc_program_path_})
        # Re-calculate program_name in case it is different now.
        _spn_loc_program_name_=${_spn_loc_program_path_##*/}
    fi

    # Set caller's variables.
    cmd_buf="${program_path_var}=\"\${_spn_loc_program_path_}\" ; ${program_name_var}=\"\${_spn_loc_program_name_}\" ; ${program_dir_path_var}=\"\${_spn_loc_program_dir_path_}\""
    eval "${cmd_buf}"

}