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