1*b30d1939SAndy Fiddaman########################################################################
2*b30d1939SAndy Fiddaman#                                                                      #
3*b30d1939SAndy Fiddaman#               This software is part of the ast package               #
4*b30d1939SAndy Fiddaman#          Copyright (c) 1982-2011 AT&T Intellectual Property          #
5*b30d1939SAndy Fiddaman#                      and is licensed under the                       #
6*b30d1939SAndy Fiddaman#                 Eclipse Public License, Version 1.0                  #
7*b30d1939SAndy Fiddaman#                    by AT&T Intellectual Property                     #
8*b30d1939SAndy Fiddaman#                                                                      #
9*b30d1939SAndy Fiddaman#                A copy of the License is available at                 #
10*b30d1939SAndy Fiddaman#          http://www.eclipse.org/org/documents/epl-v10.html           #
11*b30d1939SAndy Fiddaman#         (with md5 checksum b35adb5213ca9657e911e9befb180842)         #
12*b30d1939SAndy Fiddaman#                                                                      #
13*b30d1939SAndy Fiddaman#              Information and Software Systems Research               #
14*b30d1939SAndy Fiddaman#                            AT&T Research                             #
15*b30d1939SAndy Fiddaman#                           Florham Park NJ                            #
16*b30d1939SAndy Fiddaman#                                                                      #
17*b30d1939SAndy Fiddaman#                  David Korn <dgk@research.att.com>                   #
18*b30d1939SAndy Fiddaman#                                                                      #
19*b30d1939SAndy Fiddaman########################################################################
20*b30d1939SAndy Fiddaman#
21*b30d1939SAndy Fiddaman# CDDL HEADER START
22*b30d1939SAndy Fiddaman#
23*b30d1939SAndy Fiddaman# The contents of this file are subject to the terms of the
24*b30d1939SAndy Fiddaman# Common Development and Distribution License (the "License").
25*b30d1939SAndy Fiddaman# You may not use this file except in compliance with the License.
26*b30d1939SAndy Fiddaman#
27*b30d1939SAndy Fiddaman# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
28*b30d1939SAndy Fiddaman# or http://www.opensolaris.org/os/licensing.
29*b30d1939SAndy Fiddaman# See the License for the specific language governing permissions
30*b30d1939SAndy Fiddaman# and limitations under the License.
31*b30d1939SAndy Fiddaman#
32*b30d1939SAndy Fiddaman# When distributing Covered Code, include this CDDL HEADER in each
33*b30d1939SAndy Fiddaman# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
34*b30d1939SAndy Fiddaman# If applicable, add the following below this CDDL HEADER, with the
35*b30d1939SAndy Fiddaman# fields enclosed by brackets "[]" replaced with your own identifying
36*b30d1939SAndy Fiddaman# information: Portions Copyright [yyyy] [name of copyright owner]
37*b30d1939SAndy Fiddaman#
38*b30d1939SAndy Fiddaman# CDDL HEADER END
39*b30d1939SAndy Fiddaman#
40*b30d1939SAndy Fiddaman
41*b30d1939SAndy Fiddaman#
42*b30d1939SAndy Fiddaman# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
43*b30d1939SAndy Fiddaman# Use is subject to license terms.
44*b30d1939SAndy Fiddaman#
45*b30d1939SAndy Fiddaman
46*b30d1939SAndy Fiddaman#
47*b30d1939SAndy Fiddaman# This test checks whether "typeset -m" correctly moves local variables
48*b30d1939SAndy Fiddaman# into a global variable tree.
49*b30d1939SAndy Fiddaman#
50*b30d1939SAndy Fiddaman# This was reported as CR #XXXXXXXX ("XXXX"):
51*b30d1939SAndy Fiddaman# -- snip --
52*b30d1939SAndy Fiddaman#XXXX
53*b30d1939SAndy Fiddaman# -- snip --
54*b30d1939SAndy Fiddaman#
55*b30d1939SAndy Fiddaman
56*b30d1939SAndy Fiddamanfunction err_exit
57*b30d1939SAndy Fiddaman{
58*b30d1939SAndy Fiddaman	print -u2 -n "\t"
59*b30d1939SAndy Fiddaman	print -u2 -r ${Command}[$1]: "${@:2}"
60*b30d1939SAndy Fiddaman	(( Errors+=1 ))
61*b30d1939SAndy Fiddaman}
62*b30d1939SAndy Fiddaman
63*b30d1939SAndy Fiddamanalias err_exit='err_exit $LINENO'
64*b30d1939SAndy Fiddaman
65*b30d1939SAndy Fiddamaninteger Errors=0
66*b30d1939SAndy Fiddaman
67*b30d1939SAndy Fiddaman## test start
68*b30d1939SAndy Fiddamantypeset -C tree1 tree2
69*b30d1939SAndy Fiddaman
70*b30d1939SAndy Fiddaman# add node to tree which uses "typeset -m" to move a local variable
71*b30d1939SAndy Fiddaman# into tree1.subtree["a_node"]
72*b30d1939SAndy Fiddamanfunction f1
73*b30d1939SAndy Fiddaman{
74*b30d1939SAndy Fiddaman	nameref tr=$1
75*b30d1939SAndy Fiddaman	typeset -A tr.subtree
76*b30d1939SAndy Fiddaman	typeset -C node
77*b30d1939SAndy Fiddaman	node.one="hello"
78*b30d1939SAndy Fiddaman	node.two="world"
79*b30d1939SAndy Fiddaman	# move local note into the array
80*b30d1939SAndy Fiddamanfalse
81*b30d1939SAndy Fiddaman	typeset -m tr.subtree["a_node"]=node
82*b30d1939SAndy Fiddaman	return 0
83*b30d1939SAndy Fiddaman}
84*b30d1939SAndy Fiddaman
85*b30d1939SAndy Fiddaman# Alternative version which uses "nameref" instead of "typeset -m"
86*b30d1939SAndy Fiddamanfunction f2
87*b30d1939SAndy Fiddaman{
88*b30d1939SAndy Fiddaman	nameref tr=$1
89*b30d1939SAndy Fiddaman	typeset -A tr.subtree
90*b30d1939SAndy Fiddaman	nameref node=tr.subtree["a_node"]
91*b30d1939SAndy Fiddaman	node.one="hello"
92*b30d1939SAndy Fiddaman	node.two="world"
93*b30d1939SAndy Fiddaman	return 0
94*b30d1939SAndy Fiddaman}
95*b30d1939SAndy Fiddaman
96*b30d1939SAndy Fiddamanf1 tree1
97*b30d1939SAndy Fiddamanf2 tree2
98*b30d1939SAndy Fiddaman
99*b30d1939SAndy Fiddaman[[ "${tree1.subtree["a_node"].one}" == "hello" ]] || err_exit "expected tree1.subtree[\"a_node\"].one == 'hello', got ${tree1.subtree["a_node"].one}"
100*b30d1939SAndy Fiddaman[[ "${tree1.subtree["a_node"].two}" == "world" ]] || err_exit "expected tree1.subtree[\"a_node\"].two == 'world', got ${tree1.subtree["a_node"].two}"
101*b30d1939SAndy Fiddaman[[ "${tree1}" == "${tree2}" ]] || err_exit "tree1 and tree2 differ:$'\n'"
102*b30d1939SAndy Fiddaman
103*b30d1939SAndy Fiddamanunset c
104*b30d1939SAndy Fiddamancompound c
105*b30d1939SAndy Fiddamantypeset -C -a c.ar
106*b30d1939SAndy Fiddamanc.ar[4]=( a4=1 )
107*b30d1939SAndy Fiddamantypeset -m "c.ar[5]=c.ar[4]"
108*b30d1939SAndy Fiddamanexp=$'(\n\ttypeset -C -a ar=(\n\t\t[5]=(\n\t\t\ta4=1\n\t\t)\n\t)\n)'
109*b30d1939SAndy Fiddaman[[ $(print -v c) == "$exp" ]] || err_exit 'typeset -m "c.ar[5]=c.ar[4]" not working'
110*b30d1939SAndy Fiddaman
111*b30d1939SAndy Fiddamantypeset -T x_t=( hello=world )
112*b30d1939SAndy Fiddamanfunction m
113*b30d1939SAndy Fiddaman{
114*b30d1939SAndy Fiddaman	compound c
115*b30d1939SAndy Fiddaman	compound -a c.x
116*b30d1939SAndy Fiddaman	x_t c.x[4][5][8].field
117*b30d1939SAndy Fiddaman	x_t x
118*b30d1939SAndy Fiddaman	typeset -m c.x[4][6][9].field=x
119*b30d1939SAndy Fiddaman	exp=$'(\n\ttypeset -C -a x=(\n\t\t[4]=(\n\t\t\t[5]=(\n\t\t\t\t[8]=(\n\t\t\t\t\tx_t field=(\n\t\t\t\t\t\thello=world\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t\t[6]=(\n\t\t\t\t[9]=(\n\t\t\t\t\tx_t field=(\n\t\t\t\t\t\thello=world\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t)\n)'
120*b30d1939SAndy Fiddaman	[[ $(print -v c) == "$exp" ]] || err_exit "typeset -m c.x[4][6][9].field=x where x is a type is not working"
121*b30d1939SAndy Fiddaman}
122*b30d1939SAndy Fiddamanm
123*b30d1939SAndy Fiddaman
124*b30d1939SAndy Fiddamanfunction moveme
125*b30d1939SAndy Fiddaman{
126*b30d1939SAndy Fiddaman	nameref src=$2 dest=$1
127*b30d1939SAndy Fiddaman	typeset -m dest=src
128*b30d1939SAndy Fiddaman}
129*b30d1939SAndy Fiddamanfunction main
130*b30d1939SAndy Fiddaman{
131*b30d1939SAndy Fiddaman	compound a=( aa=1 )
132*b30d1939SAndy Fiddaman	compound -a ar
133*b30d1939SAndy Fiddaman	moveme ar[4] a 2> /dev/null || err_exit 'function moveme fails'
134*b30d1939SAndy Fiddaman	exp=$'(\n\t[4]=(\n\t\taa=1\n\t)\n)'
135*b30d1939SAndy Fiddaman	[[ $(print -v ar) == "$exp" ]] || err_exit 'typeset -m dest=src where dest and src are name references fails'
136*b30d1939SAndy Fiddaman}
137*b30d1939SAndy Fiddamanmain
138*b30d1939SAndy Fiddaman
139*b30d1939SAndy Fiddaman
140*b30d1939SAndy Fiddaman{
141*b30d1939SAndy Fiddaman$SHELL <<- \EOF
142*b30d1939SAndy Fiddaman	function main
143*b30d1939SAndy Fiddaman	{
144*b30d1939SAndy Fiddaman		compound c=(
145*b30d1939SAndy Fiddaman			compound -a board
146*b30d1939SAndy Fiddaman		)
147*b30d1939SAndy Fiddaman		for ((i=0 ; i < 2 ; i++ )) ; do
148*b30d1939SAndy Fiddaman			compound el=(typeset id='pawn')
149*b30d1939SAndy Fiddaman			typeset -m "c.board[1][i]=el"
150*b30d1939SAndy Fiddaman		done
151*b30d1939SAndy Fiddaman		exp=$'(\n\ttypeset -C -a board=(\n\t\t[1]=(\n\t\t\t(\n\t\t\t\tid=pawn\n\t\t\t)\n\t\t\t(\n\t\t\t\tid=pawn\n\t\t\t)\n\t\t)\n\t)\n)'
152*b30d1939SAndy Fiddaman		[[ $(print -v c) == "$exp" ]] || exit 1
153*b30d1939SAndy Fiddaman	}
154*b30d1939SAndy Fiddaman	main
155*b30d1939SAndy FiddamanEOF
156*b30d1939SAndy Fiddaman} 2> /dev/null
157*b30d1939SAndy Fiddamanif	((exitval=$?))
158*b30d1939SAndy Fiddamanthen	if	[[ $(kill -l $exitval) == SEGV ]]
159*b30d1939SAndy Fiddaman	then	err_exit 'typeset -m "c.board[1][i]=el" core dumps'
160*b30d1939SAndy Fiddaman	else	err_exit 'typeset -m "c.board[1][i]=el" gives wrong value'
161*b30d1939SAndy Fiddaman	fi
162*b30d1939SAndy Fiddamanfi
163*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125))
164