18462SApril.Chin@Sun.COM#
28462SApril.Chin@Sun.COM# CDDL HEADER START
38462SApril.Chin@Sun.COM#
48462SApril.Chin@Sun.COM# The contents of this file are subject to the terms of the
58462SApril.Chin@Sun.COM# Common Development and Distribution License (the "License").
68462SApril.Chin@Sun.COM# You may not use this file except in compliance with the License.
78462SApril.Chin@Sun.COM#
88462SApril.Chin@Sun.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
98462SApril.Chin@Sun.COM# or http://www.opensolaris.org/os/licensing.
108462SApril.Chin@Sun.COM# See the License for the specific language governing permissions
118462SApril.Chin@Sun.COM# and limitations under the License.
128462SApril.Chin@Sun.COM#
138462SApril.Chin@Sun.COM# When distributing Covered Code, include this CDDL HEADER in each
148462SApril.Chin@Sun.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
158462SApril.Chin@Sun.COM# If applicable, add the following below this CDDL HEADER, with the
168462SApril.Chin@Sun.COM# fields enclosed by brackets "[]" replaced with your own identifying
178462SApril.Chin@Sun.COM# information: Portions Copyright [yyyy] [name of copyright owner]
188462SApril.Chin@Sun.COM#
198462SApril.Chin@Sun.COM# CDDL HEADER END
208462SApril.Chin@Sun.COM#
218462SApril.Chin@Sun.COM
228462SApril.Chin@Sun.COM#
23*12068SRoger.Faulkner@Oracle.COM# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
248462SApril.Chin@Sun.COM#
258462SApril.Chin@Sun.COM
268462SApril.Chin@Sun.COM#
278462SApril.Chin@Sun.COM# variable tree test #001
288462SApril.Chin@Sun.COM# Propose of this test is whether ksh93 crashes or not - ast-ksh.2008-05-14
298462SApril.Chin@Sun.COM# crashes like this when running this test:
308462SApril.Chin@Sun.COM#
318462SApril.Chin@Sun.COM# program terminated by signal ILL (illegal opcode)
328462SApril.Chin@Sun.COM# 0xffffffffffffffff:     <bad address 0xffffffffffffffff>
338462SApril.Chin@Sun.COM# Current function is nv_diropen
348462SApril.Chin@Sun.COM#   123                   dp->hp = (Namval_t*)dtprev(dp->root,&fake);
358462SApril.Chin@Sun.COM# (dbx) where
368462SApril.Chin@Sun.COM#   [1] 0x100381e80(0x100381e80, 0xffffffff7fffe690, 0x10, 0x61, 0x0, 0x100381ec9), at 0x100381e80
378462SApril.Chin@Sun.COM# =>[2] nv_diropen(np = (nil), name = 0x100381ebc "mysrcdata"), line 123 in "nvtree.c"
388462SApril.Chin@Sun.COM#   [3] walk_tree(np = 0x1003809e0, dlete = 524289), line 743 in "nvtree.c"
398462SApril.Chin@Sun.COM#   [4] put_tree(np = 0x1003809e0, val = (nil), flags = 524289, fp = 0x100381db0), line 814 in "nvtree.c"
408462SApril.Chin@Sun.COM#   [5] nv_putv(np = 0x1003809e0, value = (nil), flags = 524289, nfp = 0x100381db0), line 141 in "nvdisc.c"
418462SApril.Chin@Sun.COM#   [6] _nv_unset(np = 0x1003809e0, flags = 524289), line 1976 in "name.c"
428462SApril.Chin@Sun.COM#   [7] table_unset(shp = 0x10033e900, root = 0x100380900, flags = 524289, oroot = 0x100360980), line 1902 in "name.c"
438462SApril.Chin@Sun.COM#   [8] sh_unscope(shp = 0x10033e900), line 2711 in "name.c"
448462SApril.Chin@Sun.COM#   [9] sh_funscope(argn = 1, argv = 0x10035e680, fun = (nil), arg = 0xffffffff7ffff118, execflg = 4), line 2470 in "xec.c"
458462SApril.Chin@Sun.COM#   [10] sh_funct(np = 0x100380860, argn = 1, argv = 0x10035e680, envlist = (nil), execflg = 4), line 2528 in "xec.c"
468462SApril.Chin@Sun.COM#   [11] sh_exec(t = 0x10035e620, flags = 4), line 1032 in "xec.c"
478462SApril.Chin@Sun.COM#   [12] exfile(shp = 0x10033e900, iop = 0x100379a20, fno = 10), line 589 in "main.c"
488462SApril.Chin@Sun.COM#   [13] sh_main(ac = 2, av = 0xffffffff7ffffa08, userinit = (nil)), line 364 in "main.c"
498462SApril.Chin@Sun.COM#   [14] main(argc = 2, argv = 0xffffffff7ffffa08), line 46 in "pmain.c"
508462SApril.Chin@Sun.COM#
518462SApril.Chin@Sun.COM
5210898Sroland.mainz@nrubsig.org# test setup
538462SApril.Chin@Sun.COMfunction err_exit
548462SApril.Chin@Sun.COM{
558462SApril.Chin@Sun.COM	print -u2 -n "\t"
568462SApril.Chin@Sun.COM	print -u2 -r ${Command}[$1]: "${@:2}"
57*12068SRoger.Faulkner@Oracle.COM	(( Errors < 127 && Errors++ ))
588462SApril.Chin@Sun.COM}
598462SApril.Chin@Sun.COMalias err_exit='err_exit $LINENO'
608462SApril.Chin@Sun.COM
6110898Sroland.mainz@nrubsig.org# the test cannot use "nounset"
6210898Sroland.mainz@nrubsig.orgCommand=${0##*/}
638462SApril.Chin@Sun.COMinteger Errors=0
648462SApril.Chin@Sun.COM
658462SApril.Chin@Sun.COM
668462SApril.Chin@Sun.COMfunction build_tree
678462SApril.Chin@Sun.COM{
688462SApril.Chin@Sun.COM#set -o errexit -o xtrace
698462SApril.Chin@Sun.COM	typeset index
708462SApril.Chin@Sun.COM	typeset s
718462SApril.Chin@Sun.COM	typeset i
728462SApril.Chin@Sun.COM	typeset dummy
738462SApril.Chin@Sun.COM	typeset a b c d e f
748462SApril.Chin@Sun.COM
758462SApril.Chin@Sun.COM	nameref dest_tree="$1" # destination tree
768462SApril.Chin@Sun.COM	nameref srcdata="$2"   # source data
778462SApril.Chin@Sun.COM	typeset tree_mode="$3" # mode to define the type of leads
788462SApril.Chin@Sun.COM
798462SApril.Chin@Sun.COM	typeset -A dest_tree.l1
808462SApril.Chin@Sun.COM
818462SApril.Chin@Sun.COM	for index in "${!srcdata.hashnodes[@]}" ; do
828462SApril.Chin@Sun.COM		nameref node=srcdata.hashnodes["${index}"]
838462SApril.Chin@Sun.COM
848462SApril.Chin@Sun.COM		for i in "${node.xlfd[@]}" ; do
858462SApril.Chin@Sun.COM			IFS='-' read dummy a b c d e f <<<"$i"
868462SApril.Chin@Sun.COM
878462SApril.Chin@Sun.COM			if [[ "$a" == "" ]] ; then
888462SApril.Chin@Sun.COM				a="$dummy"
898462SApril.Chin@Sun.COM			fi
908462SApril.Chin@Sun.COM
918462SApril.Chin@Sun.COM			[[ "$a" == "" ]] && a='-'
928462SApril.Chin@Sun.COM			[[ "$b" == "" ]] && b='-'
938462SApril.Chin@Sun.COM			[[ "$c" == "" ]] && c='-'
948462SApril.Chin@Sun.COM
958462SApril.Chin@Sun.COM			if [[ "${dest_tree.l1["$a"]}" == "" ]] ; then
968462SApril.Chin@Sun.COM			#if ! (unset dest_tree.l1["$a"]) ; then
978462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2
988462SApril.Chin@Sun.COM			fi
998462SApril.Chin@Sun.COM
1008462SApril.Chin@Sun.COM			if [[ "${dest_tree.l1["$a"].l2["$b"]}" == "" ]] ; then
1018462SApril.Chin@Sun.COM			#if ! (unset dest_tree.l1["$a"].l2["$b"]) ; then
1028462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2["$b"].l3
1038462SApril.Chin@Sun.COM			fi
1048462SApril.Chin@Sun.COM
1058462SApril.Chin@Sun.COM			if [[ "${!dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[*]}" == "" ]] ; then
1068462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2["$b"].l3["$c"].entries
1078462SApril.Chin@Sun.COM			fi
1088462SApril.Chin@Sun.COM
1098462SApril.Chin@Sun.COM			#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries+=( "$index" )
1108462SApril.Chin@Sun.COM			typeset new_index
1118462SApril.Chin@Sun.COM			if [[ "${tree_mode}" == "leaf_name" ]] ; then
1128462SApril.Chin@Sun.COM				new_index=$(( ${#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[@]}+1 ))
1138462SApril.Chin@Sun.COM			else
1148462SApril.Chin@Sun.COM				new_index="${node.name}"
1158462SApril.Chin@Sun.COM
1168462SApril.Chin@Sun.COM				# skip if the leaf node already exists
1178462SApril.Chin@Sun.COM				if [[ "${dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}]}" != "" ]] ; then
1188462SApril.Chin@Sun.COM					continue
1198462SApril.Chin@Sun.COM				fi
1208462SApril.Chin@Sun.COM			fi
1218462SApril.Chin@Sun.COM
1228462SApril.Chin@Sun.COM			add_tree_leaf dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}] "${index}" "${tree_mode}"
1238462SApril.Chin@Sun.COM		done
1248462SApril.Chin@Sun.COM	done
1258462SApril.Chin@Sun.COM
1268462SApril.Chin@Sun.COM	return 0
1278462SApril.Chin@Sun.COM}
1288462SApril.Chin@Sun.COM
1298462SApril.Chin@Sun.COMfunction add_tree_leaf
1308462SApril.Chin@Sun.COM{
1318462SApril.Chin@Sun.COM	nameref tree_leafnode="$1"
1328462SApril.Chin@Sun.COM	nameref data_node=srcdata.hashnodes["$2"]
1338462SApril.Chin@Sun.COM	typeset add_mode="$3"
1348462SApril.Chin@Sun.COM
1358462SApril.Chin@Sun.COM	case "${add_mode}" in
1368462SApril.Chin@Sun.COM		"leaf_name")
1378462SApril.Chin@Sun.COM			tree_leafnode="${data_node.name}"
1388462SApril.Chin@Sun.COM			return 0
1398462SApril.Chin@Sun.COM			;;
1408462SApril.Chin@Sun.COM		"leaf_compound")
1418462SApril.Chin@Sun.COM			tree_leafnode=(
1428462SApril.Chin@Sun.COM				typeset name="${data_node.name}"
1438462SApril.Chin@Sun.COM				typeset -a filenames=( "${data_node.filenames[@]}" )
1448462SApril.Chin@Sun.COM				typeset -a comments=( "${data_node.comments[@]}" )
1458462SApril.Chin@Sun.COM				typeset -a xlfd=( "${data_node.xlfd[@]}" )
1468462SApril.Chin@Sun.COM			)
1478462SApril.Chin@Sun.COM			return 0
1488462SApril.Chin@Sun.COM			;;
1498462SApril.Chin@Sun.COM		*)
1508462SApril.Chin@Sun.COM			print -u2 -f "ERROR: Unknown mode %s in add_tree_leaf\n" "${add_mode}"
1518462SApril.Chin@Sun.COM			return 1
1528462SApril.Chin@Sun.COM			;;
1538462SApril.Chin@Sun.COM	esac
1548462SApril.Chin@Sun.COM
1558462SApril.Chin@Sun.COM	# not reached
1568462SApril.Chin@Sun.COM	return 1
1578462SApril.Chin@Sun.COM}
1588462SApril.Chin@Sun.COM
1598462SApril.Chin@Sun.COMfunction main
1608462SApril.Chin@Sun.COM{
1618462SApril.Chin@Sun.COM	typeset mysrcdata=(
1628462SApril.Chin@Sun.COM		typeset -A hashnodes=(
1638462SApril.Chin@Sun.COM			[abcd]=(
1648462SApril.Chin@Sun.COM				name='abcd'
1658462SApril.Chin@Sun.COM				typeset -a xlfd=(
1668462SApril.Chin@Sun.COM					'-urw-itc zapfchancery-medium-i-normal--0-0-0-0-p-0-iso8859-1'
1678462SApril.Chin@Sun.COM					'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific'
1688462SApril.Chin@Sun.COM					'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-sun-fontspecific'
1698462SApril.Chin@Sun.COM				)
1708462SApril.Chin@Sun.COM				typeset -a comments=(
1718462SApril.Chin@Sun.COM					'comment 1'
1728462SApril.Chin@Sun.COM					'comment 2'
1738462SApril.Chin@Sun.COM					'comment 3'
1748462SApril.Chin@Sun.COM				)
1758462SApril.Chin@Sun.COM				typeset -a filenames=(
1768462SApril.Chin@Sun.COM					'/home/foo/abcd_1'
1778462SApril.Chin@Sun.COM					'/home/foo/abcd_2'
1788462SApril.Chin@Sun.COM					'/home/foo/abcd_3'
1798462SApril.Chin@Sun.COM				)
1808462SApril.Chin@Sun.COM			)
1818462SApril.Chin@Sun.COM		)
1828462SApril.Chin@Sun.COM	)
1838462SApril.Chin@Sun.COM
1848462SApril.Chin@Sun.COM	mytree=()
1858462SApril.Chin@Sun.COM	build_tree mytree mysrcdata leaf_compound
1868462SApril.Chin@Sun.COM#	(( $(print -r -- "$mytree" | wc -l) > 10 )) || err_exit "Compound tree too small."
1878462SApril.Chin@Sun.COM}
1888462SApril.Chin@Sun.COM
1898462SApril.Chin@Sun.COMmain
1908462SApril.Chin@Sun.COM
1918462SApril.Chin@Sun.COM# tests done
1928462SApril.Chin@Sun.COMexit $((Errors))
193