vartree2.sh revision 7c2fbfb345896881c631598ee3852ce9ce33fb07
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin########################################################################
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# This software is part of the ast package #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Copyright (c) 1982-2008 AT&T Intellectual Property #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and is licensed under the #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Common Public License, Version 1.0 #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# by AT&T Intellectual Property #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# A copy of the License is available at #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Information and Software Systems Research #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# AT&T Research #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Florham Park NJ #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# David Korn <dgk@research.att.com> #
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# "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
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# - "built_tree2" uses "! (unset varname)", e.g. "unset" in a subshell
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#set -o errexit -o xtrace
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset a b c d e f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tree_mode="$3" # mode to define the type of leads
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${dest_tree.l1["$a"].l2["$b"]}" == "" ]] ; then
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 new_index=$(( ${#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[@]}+1 ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}]}" != "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin add_tree_leaf dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}] "${index}" "${tree_mode}"
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
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# - "built_tree2" uses "! (unset varname)", e.g. "unset" in a subshell
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#set -o errexit -o xtrace
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset a b c d e f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tree_mode="$3" # mode to define the type of leads
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #if [[ "${dest_tree.l1["$a"].l2["$b"]}" == "" ]] ; then
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 new_index=$(( ${#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[@]}+1 ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}]}" != "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin add_tree_leaf dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}] "${index}" "${tree_mode}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a filenames=( "${data_node.filenames[@]}" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a comments=( "${data_node.comments[@]}" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -f "ERROR: Unknown mode %s in add_tree_leaf\n" "${add_mode}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# "mysrcdata_local" and "mysrcdata_global" must be identical
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 # "mysrcdata_local" and "mysrcdata_global" must be identical
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 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 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 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 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 if [[ "${mytree_global1}" != "${mytree_local1}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Compound trees 'mytree_global1' and 'mytree_local1' not identical"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${mytree_global1}" != "${mytree_global2}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Compound trees 'mytree_global1' and 'mytree_global2' not identical"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${mytree_local1}" != "${mytree_local2}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Compound trees 'mytree_local1' and 'mytree_local2' not identical"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ( unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ) || \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Try 1: Variable 'mytree_global1.l1[urw].l2[itc zapfdingbats]' not found."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ( unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ) || \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Try 2: Variable 'mytree_global1.l1[urw].l2[itc zapfdingbats]' not found."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # remove parent node (array element) and then check whether the child is gone, too:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset '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 unset 'mytree_local1.l1[urw].l2[itc zapfdingbats]'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset '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 # remove parent node (array variable) and then check whether the child is gone, too:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset '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 unset '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 unset 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ||
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Variable 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' not found."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ "${mytree_global1}" != "${mytree_local1}" ]] || err_exit "mytree_global1 and mytree_local1 should differ"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ||
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Variable 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' not found."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${mytree_global1}" != "${mytree_local1}" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "Compound trees 'mytree_local1' and 'mytree_global1' not identical after unset"