7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER START
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# The contents of this file are subject to the terms of the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Common Development and Distribution License (the "License").
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You may not use this file except in compliance with the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# or http://www.opensolaris.org/os/licensing.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# See the License for the specific language governing permissions
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and limitations under the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# When distributing Covered Code, include this CDDL HEADER in each
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# If applicable, add the following below this CDDL HEADER, with the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# fields enclosed by brackets "[]" replaced with your own identifying
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# information: Portions Copyright [yyyy] [name of copyright owner]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER END
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# variable tree test #002
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Propose of this test is whether ksh93 handles global variable trees
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and function-local variable trees the same way, including "nameref"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and "unset" handling.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test setup
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction err_exit
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -n "\t"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -r ${Command}[$1]: "${@:2}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner (( Errors < 127 && Errors++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinalias err_exit='err_exit $LINENO'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# the test cannot use "nounset"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzCommand=${0##*/}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chininteger Errors=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# "built_tree1" and "built_tree2" are identical except the way how they test
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# whether a variable exists:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# - "built_tree1" uses "${varname}" != "", e.g. looking whether the variable
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# as non-zero length content
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# - "built_tree2" uses "! ([[ -v varname ]] ; res=$? ; unset varname ; exit $res)", e.g. "unset" in a subshell.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction build_tree1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#set -o errexit -o xtrace
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset index
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset s
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset i
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset dummy
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset a b c d e f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref dest_tree="$1" # destination tree
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref srcdata="$2" # source data
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tree_mode="$3" # mode to define the type of leads
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A dest_tree.l1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for index in "${!srcdata.hashnodes[@]}" ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref node=srcdata.hashnodes["${index}"]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for i in "${node.xlfd[@]}" ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin IFS='-' read dummy a b c d e f <<<"$i"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "$a" == "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a="$dummy"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ "$a" == "" ]] && a='-'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ "$b" == "" ]] && b='-'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ "$c" == "" ]] && c='-'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${dest_tree.l1["$a"]}" == "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #if ! (unset dest_tree.l1["$a"]) ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A dest_tree.l1["$a"].l2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${dest_tree.l1["$a"].l2["$b"]}" == "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #if ! (unset dest_tree.l1["$a"].l2["$b"]) ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A dest_tree.l1["$a"].l2["$b"].l3
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${!dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[*]}" == "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A dest_tree.l1["$a"].l2["$b"].l3["$c"].entries
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset new_index
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${tree_mode}" == "leaf_name" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin new_index=$(( ${#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[@]}+1 ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin new_index="${node.name}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # skip if the leaf node already exists
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}]}" != "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin add_tree_leaf dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}] "${index}" "${tree_mode}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# "built_tree1" and "built_tree2" are identical except the way how they test
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# whether a variable exists:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# - "built_tree1" uses "${varname}" != "", e.g. looking whether the variable
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# as non-zero length content
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# - "built_tree2" uses "! ([[ -v varname ]] ; res=$? ; unset varname ; exit $res)", e.g. "unset" in a subshell.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction build_tree2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#set -o errexit -o xtrace
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset index
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset s
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset i
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset dummy
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset a b c d e f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref dest_tree="$1" # destination tree
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref srcdata="$2" # source data
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tree_mode="$3" # mode to define the type of leads
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A dest_tree.l1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for index in "${!srcdata.hashnodes[@]}" ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref node=srcdata.hashnodes["${index}"]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for i in "${node.xlfd[@]}" ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin IFS='-' read dummy a b c d e f <<<"$i"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "$a" == "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a="$dummy"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ "$a" == "" ]] && a='-'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ "$b" == "" ]] && b='-'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ "$c" == "" ]] && c='-'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #if [[ "${dest_tree.l1["$a"]}" == "" ]] ; then
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ! ([[ -v dest_tree.l1["$a"] ]] ; res=$? ; unset dest_tree.l1["$a"] ; exit $res) ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A dest_tree.l1["$a"].l2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #if [[ "${dest_tree.l1["$a"].l2["$b"]}" == "" ]] ; then
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ! ([[ -v dest_tree.l1["$a"].l2["$b"] ]] ; res=$? ; unset dest_tree.l1["$a"].l2["$b"] ; exit $res) ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A dest_tree.l1["$a"].l2["$b"].l3
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${!dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[*]}" == "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A dest_tree.l1["$a"].l2["$b"].l3["$c"].entries
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset new_index
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${tree_mode}" == "leaf_name" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin new_index=$(( ${#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[@]}+1 ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin new_index="${node.name}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # skip if the leaf node already exists
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}]}" != "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin add_tree_leaf dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}] "${index}" "${tree_mode}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction add_tree_leaf
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref tree_leafnode="$1"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref data_node=srcdata.hashnodes["$2"]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset add_mode="$3"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case "${add_mode}" in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "leaf_name")
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tree_leafnode="${data_node.name}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "leaf_compound")
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tree_leafnode=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset name="${data_node.name}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a filenames=( "${data_node.filenames[@]}" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a comments=( "${data_node.comments[@]}" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a xlfd=( "${data_node.xlfd[@]}" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -f "ERROR: Unknown mode %s in add_tree_leaf\n" "${add_mode}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # not reached
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# "mysrcdata_local" and "mysrcdata_global" must be identical
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset mysrcdata_global=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A hashnodes=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [abcd]=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin name='abcd'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a xlfd=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '-urw-itc zapfchancery-medium-i-normal--0-0-0-0-p-0-iso8859-1'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-sun-fontspecific'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a comments=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 'comment 1'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 'comment 2'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 'comment 3'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a filenames=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '/home/foo/abcd_1'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '/home/foo/abcd_2'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '/home/foo/abcd_3'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinmytree_global1=()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinmytree_global2=()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction main
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # "mysrcdata_local" and "mysrcdata_global" must be identical
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset mysrcdata_local=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A hashnodes=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [abcd]=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin name='abcd'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a xlfd=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '-urw-itc zapfchancery-medium-i-normal--0-0-0-0-p-0-iso8859-1'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-sun-fontspecific'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a comments=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 'comment 1'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 'comment 2'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 'comment 3'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a filenames=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '/home/foo/abcd_1'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '/home/foo/abcd_2'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '/home/foo/abcd_3'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #### Build tree using global tree variables
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin build_tree1 mytree_global1 mysrcdata_global leaf_compound || \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit 'build_tree1 mytree_global1 mysrcdata_global leaf_compound returned an error'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( $(print -r -- "${mytree_global1}" | wc -l) > 10 )) || err_exit "Compound tree 'mytree_global1' too small."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin build_tree2 mytree_global2 mysrcdata_global leaf_compound || \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit 'build_tree2 mytree_global2 mysrcdata_global leaf_compound returned an error'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( $(print -r -- "${mytree_global2}" | wc -l) > 10 )) || err_exit "Compound tree 'mytree_global2' too small."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #### build tree using local tree variables
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mytree_local1=()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mytree_local2=()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin build_tree1 mytree_local1 mysrcdata_local leaf_compound || \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit 'build_tree1 mytree_local1 mysrcdata_local leaf_compound returned an error'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( $(print -r -- "${mytree_local1}" | wc -l) > 10 )) || err_exit "Compound tree 'mytree_local1' too small."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin build_tree2 mytree_local2 mysrcdata_local leaf_compound || \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit 'build_tree2 mytree_local2 mysrcdata_local leaf_compound returned an error'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( $(print -r -- "${mytree_local2}" | wc -l) > 10 )) || err_exit "Compound tree 'mytree_local2' too small."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #### Compare treess
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${mytree_global1}" != "${mytree_local1}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Compound trees 'mytree_global1' and 'mytree_local1' not identical"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin diff -u <( printf "%s\n" "${mytree_global1}" ) <( printf "%s\n" "${mytree_local1}" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${mytree_global1}" != "${mytree_global2}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Compound trees 'mytree_global1' and 'mytree_global2' not identical"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin diff -u <( printf "%s\n" "${mytree_global1}" ) <( printf "%s\n" "${mytree_global2}" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${mytree_local1}" != "${mytree_local2}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Compound trees 'mytree_local1' and 'mytree_local2' not identical"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin diff -u <( printf "%s\n" "${mytree_local1}" ) <( printf "%s\n" "${mytree_local2}" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #### test "unset" in a subshell
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( [[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ]] ; res=$? ; unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ; exit $res ) || \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Try 1: Variable 'mytree_global1.l1[urw].l2[itc zapfdingbats]' not found."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( [[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ]] ; res=$? ; unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ; exit $res ) || \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Try 2: Variable 'mytree_global1.l1[urw].l2[itc zapfdingbats]' not found."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # remove parent node (array element) and then check whether the child is gone, too:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin set -o errexit
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ! [[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ) || err_exit "Global: Parent node removed (array element), child still exists"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin set -o errexit
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset 'mytree_local1.l1[urw].l2[itc zapfdingbats]'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ! [[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ) || err_exit "Local: Parent node removed (array element), child still exists"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # remove parent node (array variable) and then check whether the child is gone, too:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin set -o errexit
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset 'mytree_local1.l1[urw].l2'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ! [[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ) || err_exit "Global: Parent node removed (array variable), child still exists"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin set -o errexit
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset 'mytree_local1.l1[urw].l2'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ! [[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ) || err_exit "Local: Parent node removed (array variable), child still exists"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #### test "unset" and compare trees
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]] ; res=$?
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz unset 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz (( res == 0 )) ||
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Variable 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' not found."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ "${mytree_global1}" != "${mytree_local1}" ]] || err_exit "mytree_global1 and mytree_local1 should differ"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]] ; res=$?
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz unset 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz (( res == 0 )) ||
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Variable 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' not found."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # Compare trees (after "unset")
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${mytree_global1}" != "${mytree_local1}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Compound trees 'mytree_local1' and 'mytree_global1' not identical after unset"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin diff -u <( printf "%s\n" "${mytree_global1}" ) <( printf "%s\n" "${mytree_local1}" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinmain
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# tests done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexit $((Errors))