New gen_setup.sh bash source file

Change-Id: I755b1a93862047678d1daacb36cbb0d564a07966
Signed-off-by: Michael Walsh <micwalsh@us.ibm.com>
diff --git a/bin/gen_setup.sh b/bin/gen_setup.sh
new file mode 100755
index 0000000..e37dfa7
--- /dev/null
+++ b/bin/gen_setup.sh
@@ -0,0 +1,63 @@
+#!/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 everythin 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}"
+
+}