summary refs log tree commit diff
path: root/noarch/bash_debugging
diff options
context:
space:
mode:
authorStarfall <us@starfall.systems>2024-01-08 09:40:24 -0600
committerStarfall <us@starfall.systems>2024-01-08 09:40:24 -0600
commita91d41375fc87c958f0b4b2ec09d5bfa2bab9414 (patch)
tree5ecf2d3f5b5962bb2d317ad4ce1fddd88e8b0ed7 /noarch/bash_debugging
Initial commit HEAD main
Diffstat (limited to 'noarch/bash_debugging')
-rwxr-xr-xnoarch/bash_debugging112
1 files changed, 112 insertions, 0 deletions
diff --git a/noarch/bash_debugging b/noarch/bash_debugging
new file mode 100755
index 0000000..4b31c54
--- /dev/null
+++ b/noarch/bash_debugging
@@ -0,0 +1,112 @@
+#
+# This file contains "bash"-specific debugging support utility functions.
+#
+# NOTE: This file must be "sourced" (not executed).
+#
+# WARNING: This file depends on functions from "run_time_utils" file.
+
+_print_call_stack() {
+    _report "call stack:"
+    local X_INDENT="${X_INDENT}${X_INDENT_STEP}"
+    #_report "[0]=${BASH_SOURCE[0]}:?:${FUNCNAME[$i]}"
+    for ((i=1, j=0; i<${#FUNCNAME[@]}; ++i, ++j)) ; do
+        _report "[$i]=${BASH_SOURCE[$i]}:${BASH_LINENO[$j]}:${FUNCNAME[$i]}"
+    done
+}
+
+_get_caller_location() {
+    local CALL_STACK_OFFSET=$(( 1 + ${CALL_STACK_OFFSET:-0} ))
+
+    local CALLER_LOCATION="${BASH_SOURCE[${CALL_STACK_OFFSET}]}:${BASH_LINENO[$(( ${CALL_STACK_OFFSET} - 1 ))]}:${FUNCNAME[${CALL_STACK_OFFSET}]}"
+
+    echo "${CALLER_LOCATION}"
+}
+
+#
+# Aborts execution printing diagnostic message.
+#
+_abort_execution() {
+	if [ $# -ne 0 ] ; then
+		_report_error "ABORT: '$@', execution aborted"
+	else
+		_report_error "ABORT: execution aborted"
+	fi
+	_print_call_stack
+	exit 1
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+#
+# Scripts debugging support.
+#
+
+#
+# Outputs arguments to "stderr" if "DEBUG_STDERR" environment variable is not
+# empty.
+#
+# Appends arguments to "${DEBUG_LOG_FILE}" file if "DEBUG_LOG_FILE" environment
+# variable is not empty.
+#
+# Appends arguments to "${SCRIPT_LOG_FILE}" file if "SCRIPT_LOG_FILE"
+# environment variable is not empty.
+#
+# Appends arguments to "${PACKAGE_LOG_FILE}" file if "PACKAGE_LOG_FILE"
+# environment variable is not empty.
+#
+log_message() {
+	local CALL_STACK_OFFSET="$(( 1 + ${CALL_STACK_OFFSET:-0} ))"
+	local CALLER_LOCATION="$(_get_caller_location)"
+	local PID="$$"
+	local LOG_MSG="${PID} ${CALLER_LOCATION} $@"
+
+	if [ -n "${DEBUG_STDERR}" ] ; then
+		>&2 echo "DEBUG: ${LOG_MSG}"
+	fi
+
+	if [ -n "${DEBUG_LOG_FILE}" ] ; then
+		>>"${DEBUG_LOG_FILE}" echo "${LOG_MSG}"
+	fi
+
+	if [ -n "${SCRIPT_LOG_FILE}" ] ; then
+		>>"${SCRIPT_LOG_FILE}" echo "${LOG_MSG}"
+	fi
+
+	if [ -n "${PACKAGE_LOG_FILE}" ] ; then
+		>>"${PACKAGE_LOG_FILE}" echo "${LOG_MSG}"
+	fi
+}
+
+#
+# Depending on enabled debug outputs copies everything from "stdin" into one of
+# "${PACKAGE_LOG_FILE}", "${SCRIPT_LOG_FILE}", "${DEBUG_LOG_FILE}", "stderr" or
+# simply discards everything.
+#
+log_redirected_output() {
+	local CALL_STACK_OFFSET="$(( 1 + ${CALL_STACK_OFFSET:-0} ))"
+
+	#log_message "vvvvv redirected_output vvvvv"
+	if [ -n "${PACKAGE_LOG_FILE}" ] ; then
+		>>"${PACKAGE_LOG_FILE}" cat
+	elif [ -n "${SCRIPT_LOG_FILE}" ] ; then
+		>>"${SCRIPT_LOG_FILE}" cat
+	elif [ -n "${DEBUG_LOG_FILE}" ] ; then
+		>>"${DEBUG_LOG_FILE}" cat
+	elif [ -n "${DEBUG_STDERR}" ] ; then
+		>&2 cat
+	else
+		>/dev/null cat
+	fi
+	#log_message "^^^^^ redirected_output ^^^^^"
+}
+
+#
+# Outputs variable name and value to debug log.
+#
+log_variable() {
+	local CALL_STACK_OFFSET="$(( 1 + ${CALL_STACK_OFFSET:-0} ))"
+
+	if [ -z "$1" ] ; then _abort_execution "variable name unspecified" ; fi
+	#log_message $(eval echo "${1}=\${${1}}")
+	log_message $(eval echo "\"${1}='\${${1}}'\"")
+}