diff --git a/Pmodules/libstd.bash b/Pmodules/libstd.bash
index fedd0c4da0b41020263ecf4b22f13ab2babc1978..f56ae57d83b431fe5e9c91372e3fd8678bf530b2 100644
--- a/Pmodules/libstd.bash
+++ b/Pmodules/libstd.bash
@@ -133,16 +133,29 @@ std::replace_path () {
 }
 
 #
-# split file name
+# split an absolute path
 #
-std::split_fname() {
-        local -r savedIFS="${IFS}"
+# Args:
+#     $1  upvar
+#     $2  absolute path
+#     $3  opt upvar: number of components
+#
+std::split_abspath() {
+	local parts="$1"
+	local  -r path="$2"
+	if [[ "${path:0:1}" == '/' ]]; then
+		local -r std__split_path_tmp="${path:1}"
+	else
+		std::die 255 "Oops: Internal error in '${FUNCNAME[0]}' called by '${FUNCNAME[1]}' }"
+	fi
+
         IFS='/'
-        local std__split_fname_result__=( $(echo "${@: -1}") )
-        IFS=${savedIFS}
-        eval $1=\(\"\${std__split_fname_result__[@]}\"\)
+        local std__split_path_result=( ${std__split_path_tmp} )
+	unset IFS
+	std::upvar ${parts} "${std__split_path_result[@]}"
 	if (( $# >= 3 )); then
-	        eval $2=${#std__split_fname_result__[@]}
+		# return number of parts
+	        std::upvar "$3" ${#std__split_path_result[@]}
 	fi
 }