# # set +o errexit -o noglob -o nounset is assumed. # # # Private globals and subroutines # RTLP_LOG_FNAME=""; RTLP_LOG_NO_ATTR=0; RTLP_LOG_TAGS=""; rtlp_log_printf() { local _attr="${1}" _fmt_pfx="${2}" _fmt="${3#*;}" _fmt_argc="${3%%;*}"; shift 3; if [ "${#}" -ne "${_fmt_argc}" ]; then if [ "${_fmt_argc}" -eq 0 ]; then shift "${#}"; else rtlp_log_printf "" "" "0;==> FIXME TODO XXX MESSAGE STRING ARGUMENT COUNT MISMATCH\n"; fi; fi; _msg="$(printf "${_fmt_pfx}${_fmt}" "${@}")"; if [ -n "${RTLP_LOG_FNAME}" ]; then printf "%s\n" "${_msg}" >> "${RTLP_LOG_FNAME}"; fi; if [ "${RTLP_LOG_NO_ATTR:-0}" -eq 0 ]; then printf "\033[0m\033[${_attr}m%s\033[0m\n" "${_msg}"; else printf "%s\n" "${_msg}"; fi; return 0; }; # # Public subroutines # rtl_log_clear_tags() { RTLP_LOG_TAGS=""; return 0; }; rtl_log_enable_tags() { local IFS=","; set -- ${*}; while [ "${#}" -gt 0 ]; do if ! rtl_lmatch "${RTLP_LOG_TAGS}" "${1}" ","; then RTLP_LOG_TAGS="${RTLP_LOG_TAGS:+${RTLP_LOG_TAGS},}${1}"; fi; shift; done; return 0; }; rtl_log_env_vars() { local _tag="${1}" _type="${2}" _arg_len_max=0; shift 2; rtl_log_msg "${_tag}" "${MSG_rtl_log_vars_header}" "${_type}"; _arg_len_max="$(rtl_lmax "${@}")"; while [ "${#}" -gt 0 ]; do rtl_log_msg "${_tag}" \ "2;%${_arg_len_max}.${_arg_len_max}s=%s" \ "${1%%=*}" "$(rtl_get_var_unsafe "${1#*=}")"; shift; done; return 0; }; rtl_log_msg() { local _tag="${1}" _fmt="${2}" _attr="" _exitfl=0; shift 2; [ "x${_tag}" = "xfatalexit" ] && { _tag="fatal"; _exitfl=1; }; if rtl_lmatch "${RTLP_LOG_TAGS}" "${_tag}" ","; then eval _attr='${LOG_TAG_'"${_tag}"':-}'; if [ "${#_attr}" -eq 0 ]; then rtlp_log_printf "" "" "0;==> FIXME TODO XXX UNKNOWN TAG \`${_tag}' PASSED TO rtl_log_msg()\n"; fi; rtlp_log_printf "${_attr}" "==> $(rtl_date) " "${_fmt}" "${@}"; if [ "${_exitfl}" -eq 1 ]; then exit 1; fi; fi; return 0; }; rtl_log_set_fname() { RTLP_LOG_FNAME="${1}"; return 0; }; rtl_log_set_no_attr() { RTLP_LOG_NO_ATTR="${1}"; return 0; }; # vim:filetype=sh