xref: /onnv-gate/usr/src/lib/libshell/common/tests/vartree1.sh (revision 12068:08a39a083754)
18462SApril.Chin@Sun.COM########################################################################
28462SApril.Chin@Sun.COM#                                                                      #
38462SApril.Chin@Sun.COM#               This software is part of the ast package               #
4*12068SRoger.Faulkner@Oracle.COM#          Copyright (c) 1982-2010 AT&T Intellectual Property          #
58462SApril.Chin@Sun.COM#                      and is licensed under the                       #
68462SApril.Chin@Sun.COM#                  Common Public License, Version 1.0                  #
78462SApril.Chin@Sun.COM#                    by AT&T Intellectual Property                     #
88462SApril.Chin@Sun.COM#                                                                      #
98462SApril.Chin@Sun.COM#                A copy of the License is available at                 #
108462SApril.Chin@Sun.COM#            http://www.opensource.org/licenses/cpl1.0.txt             #
118462SApril.Chin@Sun.COM#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
128462SApril.Chin@Sun.COM#                                                                      #
138462SApril.Chin@Sun.COM#              Information and Software Systems Research               #
148462SApril.Chin@Sun.COM#                            AT&T Research                             #
158462SApril.Chin@Sun.COM#                           Florham Park NJ                            #
168462SApril.Chin@Sun.COM#                                                                      #
178462SApril.Chin@Sun.COM#                  David Korn <dgk@research.att.com>                   #
188462SApril.Chin@Sun.COM#                                                                      #
198462SApril.Chin@Sun.COM########################################################################
208462SApril.Chin@Sun.COM#
218462SApril.Chin@Sun.COM# variable tree test #001
228462SApril.Chin@Sun.COM# Propose of this test is whether ksh93 handles global variable trees
238462SApril.Chin@Sun.COM# and function-local variable trees the same way, including "nameref"
248462SApril.Chin@Sun.COM# and "unset" handling.
258462SApril.Chin@Sun.COM#
268462SApril.Chin@Sun.COM
278462SApril.Chin@Sun.COMfunction err_exit
288462SApril.Chin@Sun.COM{
298462SApril.Chin@Sun.COM	print -u2 -n "\t"
308462SApril.Chin@Sun.COM	print -u2 -r ${Command}[$1]: "${@:2}"
318462SApril.Chin@Sun.COM	(( Errors+=1 ))
328462SApril.Chin@Sun.COM}
338462SApril.Chin@Sun.COM
348462SApril.Chin@Sun.COMalias err_exit='err_exit $LINENO'
358462SApril.Chin@Sun.COM
368462SApril.Chin@Sun.COMfunction build_tree
378462SApril.Chin@Sun.COM{
388462SApril.Chin@Sun.COM#set -o errexit -o xtrace
398462SApril.Chin@Sun.COM	typeset index
408462SApril.Chin@Sun.COM	typeset s
418462SApril.Chin@Sun.COM	typeset i
428462SApril.Chin@Sun.COM	typeset dummy
438462SApril.Chin@Sun.COM	typeset a b c d e f
4410898Sroland.mainz@nrubsig.org
458462SApril.Chin@Sun.COM	nameref dest_tree="$1" # destination tree
468462SApril.Chin@Sun.COM	nameref srcdata="$2"   # source data
478462SApril.Chin@Sun.COM	typeset tree_mode="$3" # mode to define the type of leads
488462SApril.Chin@Sun.COM
498462SApril.Chin@Sun.COM	typeset -A dest_tree.l1
508462SApril.Chin@Sun.COM
518462SApril.Chin@Sun.COM	for index in "${!srcdata.hashnodes[@]}" ; do
528462SApril.Chin@Sun.COM		nameref node=srcdata.hashnodes["${index}"]
538462SApril.Chin@Sun.COM
548462SApril.Chin@Sun.COM		for i in "${node.xlfd[@]}" ; do
558462SApril.Chin@Sun.COM			IFS='-' read dummy a b c d e f <<<"$i"
5610898Sroland.mainz@nrubsig.org
578462SApril.Chin@Sun.COM			if [[ "$a" == "" ]] ; then
588462SApril.Chin@Sun.COM				a="$dummy"
598462SApril.Chin@Sun.COM			fi
6010898Sroland.mainz@nrubsig.org
618462SApril.Chin@Sun.COM			[[ "$a" == "" ]] && a='-'
628462SApril.Chin@Sun.COM			[[ "$b" == "" ]] && b='-'
638462SApril.Chin@Sun.COM			[[ "$c" == "" ]] && c='-'
6410898Sroland.mainz@nrubsig.org
658462SApril.Chin@Sun.COM			if [[ "${dest_tree.l1["$a"]}" == "" ]] ; then
668462SApril.Chin@Sun.COM			#if ! (unset dest_tree.l1["$a"]) ; then
678462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2
688462SApril.Chin@Sun.COM			fi
698462SApril.Chin@Sun.COM
708462SApril.Chin@Sun.COM			if [[ "${dest_tree.l1["$a"].l2["$b"]}" == "" ]] ; then
718462SApril.Chin@Sun.COM			#if ! (unset dest_tree.l1["$a"].l2["$b"]) ; then
728462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2["$b"].l3
738462SApril.Chin@Sun.COM			fi
748462SApril.Chin@Sun.COM
758462SApril.Chin@Sun.COM			if [[ "${!dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[*]}" == "" ]] ; then
768462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2["$b"].l3["$c"].entries
778462SApril.Chin@Sun.COM			fi
7810898Sroland.mainz@nrubsig.org
798462SApril.Chin@Sun.COM			#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries+=( "$index" )
808462SApril.Chin@Sun.COM			typeset new_index
818462SApril.Chin@Sun.COM			if [[ "${tree_mode}" == "leaf_name" ]] ; then
828462SApril.Chin@Sun.COM				new_index=$(( ${#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[@]}+1 ))
838462SApril.Chin@Sun.COM			else
848462SApril.Chin@Sun.COM				new_index="${node.name}"
858462SApril.Chin@Sun.COM
868462SApril.Chin@Sun.COM				# skip if the leaf node already exists
878462SApril.Chin@Sun.COM				if [[ "${dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}]}" != "" ]] ; then
888462SApril.Chin@Sun.COM					continue
898462SApril.Chin@Sun.COM				fi
908462SApril.Chin@Sun.COM			fi
9110898Sroland.mainz@nrubsig.org
928462SApril.Chin@Sun.COM			add_tree_leaf dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}] "${index}" "${tree_mode}"
938462SApril.Chin@Sun.COM		done
948462SApril.Chin@Sun.COM	done
9510898Sroland.mainz@nrubsig.org
9610898Sroland.mainz@nrubsig.org	return 0
978462SApril.Chin@Sun.COM}
988462SApril.Chin@Sun.COM
998462SApril.Chin@Sun.COMfunction add_tree_leaf
1008462SApril.Chin@Sun.COM{
1018462SApril.Chin@Sun.COM	nameref tree_leafnode="$1"
1028462SApril.Chin@Sun.COM	nameref data_node=srcdata.hashnodes["$2"]
1038462SApril.Chin@Sun.COM	typeset add_mode="$3"
10410898Sroland.mainz@nrubsig.org
1058462SApril.Chin@Sun.COM	case "${add_mode}" in
1068462SApril.Chin@Sun.COM		"leaf_name")
1078462SApril.Chin@Sun.COM			tree_leafnode="${data_node.name}"
1088462SApril.Chin@Sun.COM			return 0
1098462SApril.Chin@Sun.COM			;;
1108462SApril.Chin@Sun.COM		"leaf_compound")
1118462SApril.Chin@Sun.COM			tree_leafnode=(
1128462SApril.Chin@Sun.COM				typeset name="${data_node.name}"
1138462SApril.Chin@Sun.COM				typeset -a filenames=( "${data_node.filenames[@]}" )
1148462SApril.Chin@Sun.COM				typeset -a comments=( "${data_node.comments[@]}" )
1158462SApril.Chin@Sun.COM				typeset -a xlfd=( "${data_node.xlfd[@]}" )
1168462SApril.Chin@Sun.COM			)
1178462SApril.Chin@Sun.COM			return 0
1188462SApril.Chin@Sun.COM			;;
1198462SApril.Chin@Sun.COM		*)
1208462SApril.Chin@Sun.COM			print -u2 -f "ERROR: Unknown mode %s in add_tree_leaf\n" "${add_mode}"
1218462SApril.Chin@Sun.COM			return 1
1228462SApril.Chin@Sun.COM			;;
1238462SApril.Chin@Sun.COM	esac
12410898Sroland.mainz@nrubsig.org
1258462SApril.Chin@Sun.COM	# not reached
1268462SApril.Chin@Sun.COM	return 1
1278462SApril.Chin@Sun.COM}
1288462SApril.Chin@Sun.COM
1298462SApril.Chin@Sun.COM# "mysrcdata_local" and "mysrcdata_global" must be identical
1308462SApril.Chin@Sun.COMtypeset mysrcdata_global=(
1318462SApril.Chin@Sun.COM	typeset -A hashnodes=(
1328462SApril.Chin@Sun.COM		[abcd]=(
1338462SApril.Chin@Sun.COM			name='abcd'
1348462SApril.Chin@Sun.COM			typeset -a xlfd=(
1358462SApril.Chin@Sun.COM				'-urw-itc zapfchancery-medium-i-normal--0-0-0-0-p-0-iso8859-1'
1368462SApril.Chin@Sun.COM				'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific'
1378462SApril.Chin@Sun.COM				'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-sun-fontspecific'
1388462SApril.Chin@Sun.COM			)
1398462SApril.Chin@Sun.COM			typeset -a comments=(
1408462SApril.Chin@Sun.COM				'comment 1'
1418462SApril.Chin@Sun.COM				'comment 2'
1428462SApril.Chin@Sun.COM				'comment 3'
1438462SApril.Chin@Sun.COM			)
1448462SApril.Chin@Sun.COM			typeset -a filenames=(
1458462SApril.Chin@Sun.COM				'/home/foo/abcd_1'
1468462SApril.Chin@Sun.COM				'/home/foo/abcd_2'
1478462SApril.Chin@Sun.COM				'/home/foo/abcd_3'
1488462SApril.Chin@Sun.COM			)
1498462SApril.Chin@Sun.COM		)
1508462SApril.Chin@Sun.COM	)
1518462SApril.Chin@Sun.COM)
1528462SApril.Chin@Sun.COM
1538462SApril.Chin@Sun.COMmytree_global=()
15410898Sroland.mainz@nrubsig.org
1558462SApril.Chin@Sun.COMfunction main
1568462SApril.Chin@Sun.COM{
1578462SApril.Chin@Sun.COM	# "mysrcdata_local" and "mysrcdata_global" must be identical
1588462SApril.Chin@Sun.COM	typeset mysrcdata_local=(
1598462SApril.Chin@Sun.COM		typeset -A hashnodes=(
1608462SApril.Chin@Sun.COM			[abcd]=(
1618462SApril.Chin@Sun.COM				name='abcd'
1628462SApril.Chin@Sun.COM				typeset -a xlfd=(
1638462SApril.Chin@Sun.COM					'-urw-itc zapfchancery-medium-i-normal--0-0-0-0-p-0-iso8859-1'
1648462SApril.Chin@Sun.COM					'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific'
1658462SApril.Chin@Sun.COM					'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-sun-fontspecific'
1668462SApril.Chin@Sun.COM				)
1678462SApril.Chin@Sun.COM				typeset -a comments=(
1688462SApril.Chin@Sun.COM					'comment 1'
1698462SApril.Chin@Sun.COM					'comment 2'
1708462SApril.Chin@Sun.COM					'comment 3'
1718462SApril.Chin@Sun.COM				)
1728462SApril.Chin@Sun.COM				typeset -a filenames=(
1738462SApril.Chin@Sun.COM					'/home/foo/abcd_1'
1748462SApril.Chin@Sun.COM					'/home/foo/abcd_2'
1758462SApril.Chin@Sun.COM					'/home/foo/abcd_3'
1768462SApril.Chin@Sun.COM				)
1778462SApril.Chin@Sun.COM			)
1788462SApril.Chin@Sun.COM		)
1798462SApril.Chin@Sun.COM	)
1808462SApril.Chin@Sun.COM
1818462SApril.Chin@Sun.COM	# build tree using global tree variables
1828462SApril.Chin@Sun.COM	build_tree mytree_global mysrcdata_global leaf_compound || \
1838462SApril.Chin@Sun.COM		err_exit 'build_tree mytree_global mysrcdata_global leaf_compound returned an error'
1848462SApril.Chin@Sun.COM
18510898Sroland.mainz@nrubsig.org	(( $(print -r -- "${mytree_global}" | wc -l) > 10 )) || err_exit "compound tree 'mytree_global' too small"
1868462SApril.Chin@Sun.COM
1878462SApril.Chin@Sun.COM	# build tree using local tree variables
1888462SApril.Chin@Sun.COM	mytree_local=()
1898462SApril.Chin@Sun.COM	build_tree mytree_local mysrcdata_local leaf_compound || \
1908462SApril.Chin@Sun.COM		err_exit 'build_tree mytree_local mysrcdata_local leaf_compound returned an error'
1918462SApril.Chin@Sun.COM
19210898Sroland.mainz@nrubsig.org	(( $(print -r -- "${mytree_local}" | wc -l) > 10 )) || err_exit "compound tree 'mytree_local' too small"
19310898Sroland.mainz@nrubsig.org
1948462SApril.Chin@Sun.COM	# Compare trees
1958462SApril.Chin@Sun.COM	if [[ "${mytree_global}" != "${mytree_local}" ]] ; then
19610898Sroland.mainz@nrubsig.org		err_exit "compound trees 'mytree_local' and 'mytree_global' not identical"
1978462SApril.Chin@Sun.COM	fi
19810898Sroland.mainz@nrubsig.org
1998462SApril.Chin@Sun.COM	unset 'mytree_global.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ||
20010898Sroland.mainz@nrubsig.org		err_exit "variable 'mytree_global.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' not found"
20110898Sroland.mainz@nrubsig.org
2028462SApril.Chin@Sun.COM	[[ "${mytree_global}" != "${mytree_local}" ]] || err_exit "mytree_global and mytree_local should differ"
2038462SApril.Chin@Sun.COM
2048462SApril.Chin@Sun.COM	unset 'mytree_local.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ||
20510898Sroland.mainz@nrubsig.org		err_exit "variable 'mytree_local.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' not found"
20610898Sroland.mainz@nrubsig.org
2078462SApril.Chin@Sun.COM	# Compare trees (after "unset")
2088462SApril.Chin@Sun.COM	if [[ "${mytree_global}" != "${mytree_local}" ]] ; then
20910898Sroland.mainz@nrubsig.org		err_exit "compound trees 'mytree_local' and 'mytree_global' not identical after unset"
21010898Sroland.mainz@nrubsig.org	fi
2118462SApril.Chin@Sun.COM}
2128462SApril.Chin@Sun.COM
2138462SApril.Chin@Sun.COMmain
2148462SApril.Chin@Sun.COMexit $((Errors))
215