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