Blob Blame History Raw
#
# Copyright (c) 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 LucĂ­a Andrea Illanes Albornoz <lucia@luciaillanes.de>
# set +o errexit -o noglob -o nounset is assumed.
#

rtl_basename() {
	rtl_basename2 "${1}" "${1}";
};

rtl_basename2() {
	local	_rb2_rfname="${1#\$}" _rb2_rfname_out="${2#\$}"	\
		_rb2_fname="";

	eval _rb2_fname="\${${_rb2_rfname}}";
	eval ${_rb2_rfname_out}='${_rb2_fname##*/}';
	return 0;
};

rtl_check_digest() {
	local	_rcd_rdigest="${1#\$}" _rcd_fname="${2}" _rcd_digest_check="${3}"	\
		_rcd_digest="";

	if ! [ -e "${_rcd_fname}" ]; then
		return 1;
	else	set -- $(sha256sum "${_rcd_fname}");
		_rcd_digest="${1}";
		eval ${_rcd_rdigest}='${_rcd_digest}';
		if [ "${_rcd_digest}" = "${_rcd_digest_check}" ]; then
			return 0;
		else
			return 1;
		fi;
	fi;
};

rtl_check_digest_file() {
	local	_rcdf_fname="${1}" _rcdf_digest_check="${2}" _rcdf_digest_fname="${3}"	\
		_rcdf_digest="" _rcdf_digest_file="";

	if !  [ -e "${_rcdf_digest_fname}" ]; then
		return 1;
	else	_rcdf_digest_file="$(cat "${_rcdf_digest_fname}")";
		if [ "${_rcdf_digest_file}" != "${_rcdf_digest_check}" ]\
		|| ! rtl_check_digest \$_rcdf_digest "${_rcdf_fname}"	\
				"${_rcdf_digest_check}";
		then
			return 1;
		else
			return 0;
		fi;
	fi;
};

rtl_check_path_vars() {
	local	_rcpv_rstatus="${1#\$}" _rcpv_vnames="${2}"	\
		_rcpv_rc=0 _rcpv_vname="" _rcpv_vname_val="";

	for _rcpv_vname in ${_rcpv_vnames}; do
		rtl_get_var_unsafe \$_rcpv_vname_val "${_rcpv_vname}";
		if [ "${_rcpv_vname_val:+1}" != 1 ]; then
			_rcpv_rc=1;
			rtl_setrstatus "${_rcpv_rstatus}" 'Error: variable \`'"${_rcpv_vname}'"' is empty or unset.';
			break;
		elif [ "${_rcpv_vname_val#* *}" != "${_rcpv_vname_val}" ]; then
			_rcpv_rc=2;
			rtl_setrstatus "${_rcpv_rstatus}" 'Error: variable \`'"${_rcpv_vname}'"' contains one or more whitespace characters.';
			break;
		fi;
	done;
	return "${_rcpv_rc}";
};

rtl_dirname() {
	rtl_dirname2 "${1}" "${1}";
};

rtl_dirname2() {
	local	_rdname="${1#\$}" _rdname_out="${2#\$}"	\
		_rd2_dname="";

	eval _rd2_dname="\${${_rdname}}";
	_rd2_dname="${_rd2_dname%/*}";

	case "${_rd2_dname}" in
	"")	_rd2_dname="."; ;;
	*)	while rtl_matchr "${_rd2_dname}" "*/"; do
			_rd2_dname="${_rd2_dname%/}";
		done; ;;
	esac;

	eval ${_rdname_out}='${_rd2_dname}';
	return 0;
};

rtl_exists_any() {
	local _rea_subdir="${1}"; shift;

	while [ "${#}" -gt 0 ]; do
		if [ -e "${_rea_subdir}/${1}" ]; then
			return 0;
		else
			shift;
		fi;
	done;
	return 1;
};

rtl_flock_acquire() {
	local _rfa_fd="${1}" _rfa_conflict_exit_code="${2:-253}" _rfa_wait="${3:-3600}";

	while true; do
		if flock				\
			-E "${_rfa_conflict_exit_code}"	\
			-w "${_rfa_wait}"		\
			"${_rfa_fd}";
		then
			return 0;
		elif [ "${?}" -eq "${_rfa_conflict_exit_code}" ]; then
			continue;
		else
			return "${?}";
		fi;
	done;
};

rtl_is_newer() {
	local	_ris_new_fname="${1}" _ris_old_fname="${2}"	\
		_ris_new_ts="" _ris_old_ts="";

	if ! [ -e "${_ris_old_fname}" ]; then
		return 0;
	else
		_ris_new_ts="$(stat -c %Y "${_ris_new_fname}" 2>/dev/null)";
		_ris_old_ts="$(stat -c %Y "${_ris_old_fname}" 2>/dev/null)";

		if [ "${_ris_new_ts:-0}" -gt "${_ris_old_ts:-0}" ]; then
			return 0;
		else
			return 1;
		fi;
	fi;
};

rtl_patch_files() {
	local	_rpf_patch_cwd="${1}" _rpf_strip_count="${2}" _rpf_fn="${3}" 	\
		_rpf_patch_fname="" _rpf_patch_idx=0;
	shift $((3 + 2));

	_rpf_patch_idx=1;
	while "${_rpf_fn}"				\
		\$_rpf_patch_fname "${_rpf_patch_idx}"	\
		"${@}"					\
	   && [ "${_rpf_patch_fname:+1}" = 1 ];
	do
		: $((_rpf_patch_idx += 1));
		if [ -r "${_rpf_patch_fname}" ]\
		&& ! patch				\
			-b				\
			-d "${_rpf_patch_cwd}"		\
			"-p${_rpf_strip_count}"	\
			< "${_rpf_patch_fname}";
		then
			return 1;
		fi;
	done;
	return 0;
};

# vim:filetype=sh textwidth=0