|
Packit |
992a25 |
########################################################################
|
|
Packit |
992a25 |
# #
|
|
Packit |
992a25 |
# This software is part of the ast package #
|
|
Packit |
992a25 |
# Copyright (c) 1982-2012 AT&T Intellectual Property #
|
|
Packit |
992a25 |
# and is licensed under the #
|
|
Packit |
992a25 |
# Eclipse Public License, Version 1.0 #
|
|
Packit |
992a25 |
# by AT&T Intellectual Property #
|
|
Packit |
992a25 |
# #
|
|
Packit |
992a25 |
# A copy of the License is available at #
|
|
Packit |
992a25 |
# http://www.eclipse.org/org/documents/epl-v10.html #
|
|
Packit |
992a25 |
# (with md5 checksum b35adb5213ca9657e911e9befb180842) #
|
|
Packit |
992a25 |
# #
|
|
Packit |
992a25 |
# Information and Software Systems Research #
|
|
Packit |
992a25 |
# AT&T Research #
|
|
Packit |
992a25 |
# Florham Park NJ #
|
|
Packit |
992a25 |
# #
|
|
Packit |
992a25 |
# David Korn <dgk@research.att.com> #
|
|
Packit |
992a25 |
# #
|
|
Packit |
992a25 |
########################################################################
|
|
Packit |
992a25 |
function err_exit
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print -u2 -n "\t"
|
|
Packit |
992a25 |
print -u2 -r ${Command}[$1]: "${@:2}"
|
|
Packit |
992a25 |
(( Errors+=1 ))
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
alias err_exit='err_exit $LINENO'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
Command=${0##*/}
|
|
Packit |
992a25 |
integer Errors=0
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
tmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
|
|
Packit |
992a25 |
trap "cd /; rm -rf $tmp" EXIT
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
integer n=2
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T Type_t=(
|
|
Packit |
992a25 |
typeset name=foobar
|
|
Packit |
992a25 |
typeset x=(hi=ok bar=yes)
|
|
Packit |
992a25 |
typeset y=(xa=xx xq=89)
|
|
Packit |
992a25 |
typeset -A aa=([one]=abc [two]=def)
|
|
Packit |
992a25 |
typeset -a ia=(abc def)
|
|
Packit |
992a25 |
typeset -i z=5
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
for ((i=0; i < 10; i++))
|
|
Packit |
992a25 |
do
|
|
Packit |
992a25 |
Type_t r s
|
|
Packit |
992a25 |
[[ $r == "$s" ]] || err_exit 'r is not equal to s'
|
|
Packit |
992a25 |
typeset -C x=r.x
|
|
Packit |
992a25 |
y=(xa=bb xq=cc)
|
|
Packit |
992a25 |
y2=xyz
|
|
Packit |
992a25 |
z2=xyz
|
|
Packit |
992a25 |
typeset -C z=y
|
|
Packit |
992a25 |
[[ $y == "$z" ]] || err_exit 'y is not equal to z'
|
|
Packit |
992a25 |
typeset -C s.y=z
|
|
Packit |
992a25 |
[[ $y == "${s.y}" ]] || err_exit 'y is not equal to s.y'
|
|
Packit |
992a25 |
.sh.q=$y
|
|
Packit |
992a25 |
typeset -C www=.sh.q
|
|
Packit |
992a25 |
[[ $www == "$z" ]] || err_exit 'www is not equal to z'
|
|
Packit |
992a25 |
typeset -C s.x=r.x
|
|
Packit |
992a25 |
[[ ${s.x} == "${r.x}" ]] || err_exit 's.x is not equal to r.x'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
function foo
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
nameref x=$1 y=$2
|
|
Packit |
992a25 |
typeset z=$x
|
|
Packit |
992a25 |
y=$x
|
|
Packit |
992a25 |
[[ $x == "$y" ]] || err_exit "x is not equal to y with ${!x}"
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
foo r.y y
|
|
Packit |
992a25 |
[[ $y == "${r.y}" ]] || err_exit 'y is not equal to r.y'
|
|
Packit |
992a25 |
typeset -C y=z
|
|
Packit |
992a25 |
foo y r.y
|
|
Packit |
992a25 |
[[ $y == "${r.y}" ]] || err_exit 'y is not equal to r.y again'
|
|
Packit |
992a25 |
typeset -C y=z
|
|
Packit |
992a25 |
(
|
|
Packit |
992a25 |
q=${z}
|
|
Packit |
992a25 |
[[ $q == "$z" ]] || err_exit 'q is not equal to z'
|
|
Packit |
992a25 |
z=abc
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
[[ $z == "$y" ]] || err_exit 'value of z not preserved after subshell'
|
|
Packit |
992a25 |
unset z y r s x z2 y2 www .sh.q
|
|
Packit |
992a25 |
done
|
|
Packit |
992a25 |
typeset -T Frame_t=( typeset file lineno )
|
|
Packit |
992a25 |
Frame_t frame
|
|
Packit |
992a25 |
[[ $(typeset -p frame) == 'Frame_t frame=(typeset file;typeset lineno)' ]] || err_exit 'empty fields in type not displayed'
|
|
Packit |
992a25 |
x=( typeset -a arr=([2]=abc [4]=(x=1 y=def));zz=abc)
|
|
Packit |
992a25 |
typeset -C y=x
|
|
Packit |
992a25 |
[[ "$x" == "$y" ]] || print -u2 'y is not equal to x'
|
|
Packit |
992a25 |
Type_t z=(y=(xa=bb xq=cc))
|
|
Packit |
992a25 |
typeset -A arr=([foo]=one [bar]=2)
|
|
Packit |
992a25 |
typeset -A brr=([foo]=one [bar]=2)
|
|
Packit |
992a25 |
[[ "${arr[@]}" == "${brr[@]}" ]] || err_exit 'arr is not brr'
|
|
Packit |
992a25 |
for ((i=0; i < 1; i++))
|
|
Packit |
992a25 |
do typeset -m zzz=x
|
|
Packit |
992a25 |
[[ $zzz == "$y" ]] || err_exit 'zzz is not equal to y'
|
|
Packit |
992a25 |
typeset -m x=zzz
|
|
Packit |
992a25 |
[[ $x == "$y" ]] || err_exit 'x is not equal to y'
|
|
Packit |
992a25 |
Type_t t=(y=(xa=bb xq=cc))
|
|
Packit |
992a25 |
typeset -m r=t
|
|
Packit |
992a25 |
[[ $r == "$z" ]] || err_exit 'r is not equal to z'
|
|
Packit |
992a25 |
typeset -m t=r
|
|
Packit |
992a25 |
[[ $t == "$z" ]] || err_exit 't is not equal to z'
|
|
Packit |
992a25 |
typeset -m crr=arr
|
|
Packit |
992a25 |
[[ "${crr[@]}" == "${brr[@]}" ]] || err_exit 'crr is not brr'
|
|
Packit |
992a25 |
typeset -m arr=crr
|
|
Packit |
992a25 |
[[ "${arr[@]}" == "${brr[@]}" ]] || err_exit 'brr is not arr'
|
|
Packit |
992a25 |
done
|
|
Packit |
992a25 |
typeset -m brr[foo]=brr[bar]
|
|
Packit |
992a25 |
[[ ${brr[foo]} == 2 ]] || err_exit 'move an associative array element fails'
|
|
Packit |
992a25 |
[[ ${brr[bar]} ]] && err_exit 'brr[bar] should be unset after move'
|
|
Packit |
992a25 |
unset x y zzz
|
|
Packit |
992a25 |
x=(a b c)
|
|
Packit |
992a25 |
typeset -m x[1]=x[2]
|
|
Packit |
992a25 |
[[ ${x[1]} == c ]] || err_exit 'move an indexed array element fails'
|
|
Packit |
992a25 |
[[ ${x[2]} ]] && err_exit 'x[2] should be unset after move'
|
|
Packit |
992a25 |
cat > $tmp/types <<- \+++
|
|
Packit |
992a25 |
typeset -T Pt_t=(float x=1. y=0.)
|
|
Packit |
992a25 |
Pt_t p=(y=2)
|
|
Packit |
992a25 |
print -r -- ${p.y}
|
|
Packit |
992a25 |
+++
|
|
Packit |
992a25 |
expected=2
|
|
Packit |
992a25 |
got=$(. $tmp/types) 2>/dev/null
|
|
Packit |
992a25 |
[[ "$got" == "$expected" ]] || err_exit "typedefs in dot script failed -- expected '$expected', got '$got'"
|
|
Packit |
992a25 |
typeset -T X_t=(
|
|
Packit |
992a25 |
typeset x=foo y=bar
|
|
Packit |
992a25 |
typeset s=${_.x}
|
|
Packit |
992a25 |
create()
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
_.y=bam
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
X_t x
|
|
Packit |
992a25 |
[[ ${x.x} == foo ]] || err_exit 'x.x should be foo'
|
|
Packit |
992a25 |
[[ ${x.y} == bam ]] || err_exit 'x.y should be bam'
|
|
Packit |
992a25 |
[[ ${x.s} == ${x.x} ]] || err_exit 'x.s should be x.x'
|
|
Packit |
992a25 |
typeset -T Y_t=( X_t r )
|
|
Packit |
992a25 |
Y_t z
|
|
Packit |
992a25 |
[[ ${z.r.x} == foo ]] || err_exit 'z.r.x should be foo'
|
|
Packit |
992a25 |
[[ ${z.r.y} == bam ]] || err_exit 'z.r.y should be bam'
|
|
Packit |
992a25 |
[[ ${z.r.s} == ${z.r.x} ]] || err_exit 'z.r.s should be z.r.x'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
unset xx yy
|
|
Packit |
992a25 |
typeset -T xx=(typeset yy=zz)
|
|
Packit |
992a25 |
xx=yy
|
|
Packit |
992a25 |
{ typeset -T xx=(typeset yy=zz) ;} 2>/dev/null && err_exit 'type redefinition should fail'
|
|
Packit |
992a25 |
$SHELL 2> /dev/null <<- +++ || err_exit 'typedef with only f(){} fails'
|
|
Packit |
992a25 |
typeset -T X_t=(
|
|
Packit |
992a25 |
f()
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print ok
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
+++
|
|
Packit |
992a25 |
$SHELL 2> /dev/null <<- +++ || err_exit 'unable to redefine f discipline function'
|
|
Packit |
992a25 |
typeset -T X_t=(
|
|
Packit |
992a25 |
x=1
|
|
Packit |
992a25 |
f()
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print ok
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
X_t z=(
|
|
Packit |
992a25 |
function f
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print override f
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
+++
|
|
Packit |
992a25 |
$SHELL 2> /dev/null <<- +++ && err_exit 'invalid discipline name should be an error'
|
|
Packit |
992a25 |
typeset -T X_t=(
|
|
Packit |
992a25 |
x=1
|
|
Packit |
992a25 |
f()
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print ok
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
X_t z=(
|
|
Packit |
992a25 |
function g
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print override f
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
+++
|
|
Packit |
992a25 |
# compound variables containing type variables
|
|
Packit |
992a25 |
Type_t r
|
|
Packit |
992a25 |
var=(
|
|
Packit |
992a25 |
typeset x=foobar
|
|
Packit |
992a25 |
Type_t r
|
|
Packit |
992a25 |
integer z=5
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
[[ ${var.r} == "$r" ]] || err_exit 'var.r != r'
|
|
Packit |
992a25 |
(( var.z == 5)) || err_exit 'var.z !=5'
|
|
Packit |
992a25 |
[[ "$var" == *x=foobar* ]] || err_exit '$var does not contain x=foobar'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T A_t=(
|
|
Packit |
992a25 |
typeset x=aha
|
|
Packit |
992a25 |
typeset b=${_.x}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
unset x
|
|
Packit |
992a25 |
A_t x
|
|
Packit |
992a25 |
expected=aha
|
|
Packit |
992a25 |
got=${x.b}
|
|
Packit |
992a25 |
[[ "$got" == "$expected" ]] || err_exit "type '_' reference failed -- expected '$expected', got '$got'"
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T Tst_t=(
|
|
Packit |
992a25 |
function f
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
A_t a
|
|
Packit |
992a25 |
print ${ _.g ${a.x}; }
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
function g
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print foo
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
Tst_t tst
|
|
Packit |
992a25 |
expected=foo
|
|
Packit |
992a25 |
got=${ tst.f;}
|
|
Packit |
992a25 |
[[ "$got" == "$expected" ]] || err_exit "_.g where g is a function in type discipline method failed -- expected '$expected', got '$got'"
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T B_t=(
|
|
Packit |
992a25 |
integer -a arr
|
|
Packit |
992a25 |
function f
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
(( _.arr[0] = 0 ))
|
|
Packit |
992a25 |
(( _.arr[1] = 1 ))
|
|
Packit |
992a25 |
print ${_.arr[*]}
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
unset x
|
|
Packit |
992a25 |
B_t x
|
|
Packit |
992a25 |
expected='0 1'
|
|
Packit |
992a25 |
got=${ x.f;}
|
|
Packit |
992a25 |
[[ "$got" == "$expected" ]] || err_exit "array assignment of subscripts in type discipline arithmetic failed -- expected '$expected', got '$got'"
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T Fileinfo_t=(
|
|
Packit |
992a25 |
size=-1
|
|
Packit |
992a25 |
typeset -a text=()
|
|
Packit |
992a25 |
integer mtime=-1
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
Fileinfo_t -A _Dbg_filenames
|
|
Packit |
992a25 |
Fileinfo_t finfo
|
|
Packit |
992a25 |
function bar
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
finfo.text=(line1 line2 line3)
|
|
Packit |
992a25 |
finfo.size=${#finfo.text[@]}
|
|
Packit |
992a25 |
_Dbg_filenames[foo]=finfo
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
bar
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
expected='Fileinfo_t -A _Dbg_filenames=([foo]=(size=3;typeset -a text=(line1 line2 line3);typeset -l -i mtime=-1))'
|
|
Packit |
992a25 |
got=$(typeset -p _Dbg_filenames)
|
|
Packit |
992a25 |
[[ "$got" == "$expected" ]] || {
|
|
Packit |
992a25 |
got=$(printf %q "$got")
|
|
Packit |
992a25 |
err_exit "copy to associative array of types in function failed -- expected '$expected', got $got"
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
$SHELL > /dev/null <<- '+++++' || err_exit 'passing _ as nameref arg not working'
|
|
Packit |
992a25 |
function f1
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
typeset -n v=$1
|
|
Packit |
992a25 |
print -r -- "$v"
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
typeset -T A_t=(
|
|
Packit |
992a25 |
typeset blah=xxx
|
|
Packit |
992a25 |
function f { f1 _ ;}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
A_t a
|
|
Packit |
992a25 |
[[ ${ a.f ./t1;} == "$a" ]]
|
|
Packit |
992a25 |
+++++
|
|
Packit |
992a25 |
expected='A_t b.a=(name=one)'
|
|
Packit |
992a25 |
[[ $( $SHELL << \+++
|
|
Packit |
992a25 |
typeset -T A_t=(
|
|
Packit |
992a25 |
typeset name=aha
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
typeset -T B_t=(
|
|
Packit |
992a25 |
typeset arr
|
|
Packit |
992a25 |
A_t a
|
|
Packit |
992a25 |
f()
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
_.a=(name=one)
|
|
Packit |
992a25 |
typeset -p _.a
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
B_t b
|
|
Packit |
992a25 |
b.f
|
|
Packit |
992a25 |
+++
|
|
Packit |
992a25 |
) == "$expected" ]] 2> /dev/null || err_exit '_.a=(name=one) not expanding correctly'
|
|
Packit |
992a25 |
expected='A_t x=(name=xxx)'
|
|
Packit |
992a25 |
[[ $( $SHELL << \+++
|
|
Packit |
992a25 |
typeset -T A_t=(
|
|
Packit |
992a25 |
typeset name
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
A_t x=(name="xxx")
|
|
Packit |
992a25 |
typeset -p x
|
|
Packit |
992a25 |
+++
|
|
Packit |
992a25 |
) == "$expected" ]] || err_exit 'empty field in definition does not expand correctly'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T Foo_t=(
|
|
Packit |
992a25 |
integer x=3
|
|
Packit |
992a25 |
integer y=4
|
|
Packit |
992a25 |
len() { print -r -- $(( sqrt(_.x**2 + _.y**2))) ;}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
Foo_t foo
|
|
Packit |
992a25 |
[[ ${foo.len} == 5 ]] || err_exit "discipline function len not working"
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T benchmark_t=(
|
|
Packit |
992a25 |
integer num_iterations
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
function do_benchmarks
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
nameref tst=b
|
|
Packit |
992a25 |
integer num_iterations
|
|
Packit |
992a25 |
(( num_iterations= int(tst.num_iterations * 1.0) ))
|
|
Packit |
992a25 |
printf "%d\n" num_iterations
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
benchmark_t b=(num_iterations=5)
|
|
Packit |
992a25 |
[[ $(do_benchmarks) == 5 ]] || err_exit 'scoping of nameref of type variables in arithmetic expressions not working'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
function cat_content
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
cat <<- EOF
|
|
Packit |
992a25 |
(
|
|
Packit |
992a25 |
foo_t -a foolist=(
|
|
Packit |
992a25 |
( val=3 )
|
|
Packit |
992a25 |
( val=4 )
|
|
Packit |
992a25 |
( val=5 )
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
EOF
|
|
Packit |
992a25 |
return 0
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
typeset -T foo_t=(
|
|
Packit |
992a25 |
integer val=-1
|
|
Packit |
992a25 |
function print
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print -- ${_.val}
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
function do_something
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
nameref li=$1 # "li" may be an index or associative array
|
|
Packit |
992a25 |
li[2].print
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
cat_content | read -C x
|
|
Packit |
992a25 |
[[ $(do_something x.foolist) == 5 ]] || err_exit 'subscripts not honored for arrays of type with disciplines'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T benchcmd_t=(
|
|
Packit |
992a25 |
float x=1
|
|
Packit |
992a25 |
float y=2
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
unset x
|
|
Packit |
992a25 |
compound x=(
|
|
Packit |
992a25 |
float o
|
|
Packit |
992a25 |
benchcmd_t -a m
|
|
Packit |
992a25 |
integer h
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
expected=$'(\n\ttypeset -l -i h=0\n\tbenchcmd_t -a m\n\ttypeset -l -E o=0\n)'
|
|
Packit |
992a25 |
[[ $x == "$expected" ]] || err_exit 'compound variable with array of types with no elements not working'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
expected=$'Std_file_t db.file[/etc/profile]=(action=preserve;typeset -A sum=([8242e663d6f7bb4c5427a0e58e2925f3]=1);)'
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
got=$($SHELL <<- \EOF
|
|
Packit |
992a25 |
MAGIC='stdinstall (at&t research) 2009-08-25'
|
|
Packit |
992a25 |
typeset -T Std_file_t=(
|
|
Packit |
992a25 |
typeset action
|
|
Packit |
992a25 |
typeset -A sum
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
typeset -T Std_t=(
|
|
Packit |
992a25 |
typeset magic=$MAGIC
|
|
Packit |
992a25 |
Std_file_t -A file
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
Std_t db=(magic='stdinstall (at&t research) 2009-08-25';Std_file_t -A file=( [/./home/gsf/.env.sh]=(action=preserve;typeset -A sum=([9b67ab407d01a52b3e73e3945b9a3ee0]=1);)[/etc/profile]=(action=preserve;typeset -A sum=([8242e663d6f7bb4c5427a0e58e2925f3]=1);)[/home/gsf/.profile]=(action=preserve;typeset -A sum=([3ce23137335219672bf2865d003a098e]=1);));)
|
|
Packit |
992a25 |
typeset -p db.file[/etc/profile]
|
|
Packit |
992a25 |
EOF)
|
|
Packit |
992a25 |
} 2> /dev/null
|
|
Packit |
992a25 |
[[ $got == "$expected" ]] || err_exit 'types with arrays of types as members fails'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T x_t=(
|
|
Packit |
992a25 |
integer dummy
|
|
Packit |
992a25 |
function set
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
[[ ${.sh.name} == v ]] || err_exit "name=${.sh.name} should be v"
|
|
Packit |
992a25 |
[[ ${.sh.subscript} == 4 ]] || err_exit "subscript=${.sh.subscript} should be 4"
|
|
Packit |
992a25 |
[[ ${.sh.value} == hello ]] || err_exit "value=${.sh.value} should be hello"
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
x_t -a v
|
|
Packit |
992a25 |
v[4]="hello"
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T oset=(
|
|
Packit |
992a25 |
typeset -A s
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
oset foo bar
|
|
Packit |
992a25 |
: ${foo.s[a]:=foobar}
|
|
Packit |
992a25 |
: ${bar.s[d]:=foobar}
|
|
Packit |
992a25 |
[[ ${bar.s[a]} == foobar ]] && err_exit '${var:=val} for types assigns to type instead of type instance'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T olist=(
|
|
Packit |
992a25 |
typeset -a l
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
olist foo
|
|
Packit |
992a25 |
foo.l[1]=x
|
|
Packit |
992a25 |
[[ ${!foo.l[*]} == *0* ]] && '0-th elment of foo.l should not be set'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T oset2=( typeset -A foo )
|
|
Packit |
992a25 |
oset2 bar
|
|
Packit |
992a25 |
: ${bar.foo[a]}
|
|
Packit |
992a25 |
bar.foo[a]=b
|
|
Packit |
992a25 |
[[ ${#bar.foo[*]} == 1 ]] || err_exit "bar.foo should have 1 element not ${#bar.foo[*]}"
|
|
Packit |
992a25 |
[[ ${bar.foo[*]} == b ]] || err_exit "bar.foo[*] should be 'b' not ${bar.foo[*]}"
|
|
Packit |
992a25 |
[[ ${bar.foo[a]} == b ]] || err_exit "bar.foo[a] should be 'b' not ${bar.foo[*]}"
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
{ x=$( $SHELL 2> /dev/null << \++EOF++
|
|
Packit |
992a25 |
typeset -T ab_t=(
|
|
Packit |
992a25 |
integer a=1 b=2
|
|
Packit |
992a25 |
function increment
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
(( _.a++, _.b++ ))
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
function ar_n
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
nameref sn=$2
|
|
Packit |
992a25 |
sn.increment
|
|
Packit |
992a25 |
$1 && printf "a=%d, b=%d\n" sn.a sn.b
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
function ar
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
ab_t -S -a s
|
|
Packit |
992a25 |
[[ -v s[5] ]] || s[5]=( )
|
|
Packit |
992a25 |
ar_n $1 s[5]
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
x=$(ar false ; ar false ; ar true ; printf ";")
|
|
Packit |
992a25 |
y=$(ar false ; ar false ; ar true ; printf ";")
|
|
Packit |
992a25 |
print -r -- "\"$x\"" == "\"$y\""
|
|
Packit |
992a25 |
++EOF++
|
|
Packit |
992a25 |
) ;} 2> /dev/null
|
|
Packit |
992a25 |
[[ $x == *a=4*b=5* ]] || err_exit 'static types in a function not working'
|
|
Packit |
992a25 |
{ eval "[[ $x ]]";} 2> /dev/null || err_exit 'arrays of types leaving side effects in subshells'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T y_t=(
|
|
Packit |
992a25 |
typeset dummy
|
|
Packit |
992a25 |
function print_b
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print "B"
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
y_t a b=(
|
|
Packit |
992a25 |
function print_b
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print "1"
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
[[ $(a.print_b) == B ]] || err_exit 'default discipline not working'
|
|
Packit |
992a25 |
[[ $(b.print_b) == 1 ]] || err_exit 'discipline override not working'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
$SHELL 2> /dev/null -c 'true || { typeset -T Type_t=(typeset name=foo);
|
|
Packit |
992a25 |
Type_t z=(name=bar) ;}' || err_exit 'unable to parse type command until typeset -T executes'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
cd "$tmp"
|
|
Packit |
992a25 |
FPATH=$PWD
|
|
Packit |
992a25 |
PATH=$PWD:$PATH
|
|
Packit |
992a25 |
cat > A_t <<- \EOF
|
|
Packit |
992a25 |
typeset -T A_t=(
|
|
Packit |
992a25 |
B_t b
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
EOF
|
|
Packit |
992a25 |
cat > B_t <<- \EOF
|
|
Packit |
992a25 |
typeset -T B_t=(
|
|
Packit |
992a25 |
integer n=5
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
EOF
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
unset n
|
|
Packit |
992a25 |
if n=$(FPATH=$PWD PATH=$PWD:$PATH $SHELL 2> /dev/null -c 'A_t a; print ${a.b.n}')
|
|
Packit |
992a25 |
then (( n==5 )) || err_exit 'dynamic loading of types gives wrong result'
|
|
Packit |
992a25 |
else err_exit 'unable to load types dynamically'
|
|
Packit |
992a25 |
fi
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
# check that typeset -T reproduces a type.
|
|
Packit |
992a25 |
if $SHELL > /dev/null 2>&1 -c 'typeset -T'
|
|
Packit |
992a25 |
then $SHELL > junk1 <<- \+++EOF
|
|
Packit |
992a25 |
typeset -T foo_t=(
|
|
Packit |
992a25 |
integer x=3 y=4
|
|
Packit |
992a25 |
float z=1.2
|
|
Packit |
992a25 |
len()
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
((.sh.value=sqrt(_.x**2 + _.y**2) ))
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
function count
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print z=$z
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
typeset -T
|
|
Packit |
992a25 |
print 'typeset -T'
|
|
Packit |
992a25 |
+++EOF
|
|
Packit |
992a25 |
$SHELL -c '. ./junk1;print "typeset -T"' > junk2
|
|
Packit |
992a25 |
diff junk[12] > /dev/null || err_exit 'typeset -T not idempotent'
|
|
Packit |
992a25 |
$SHELL -c '. ./junk1;print "typeset +f"' > junk2
|
|
Packit |
992a25 |
[[ -s junk2 ]] || err_exit 'non-discipline-method functions found'
|
|
Packit |
992a25 |
else
|
|
Packit |
992a25 |
err_exit 'typeset -T not supported'
|
|
Packit |
992a25 |
fi
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
[[ $($SHELL -c 'typeset -T x=( typeset -a h ) ; x j; print -v j.h') ]] && err_exit 'type with indexed array without elements inserts element 0'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
[[ $($SHELL -c 'typeset -T x=( integer -a s ) ; compound c ; x c.i ; c.i.s[4]=666 ; print -v c') == *'[0]'* ]] && err_exit 'type with indexed array with non-zero element inserts element 0'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
{ $SHELL -c '(sleep 3;kill $$)& typeset -T x=( typeset -a s );compound c;x c.i;c.i.s[7][5][3]=hello;x c.j=c.i;[[ ${c.i} == "${c.j}" ]]';} 2> /dev/null
|
|
Packit |
992a25 |
exitval=$?
|
|
Packit |
992a25 |
if [[ $(kill -l $exitval) == TERM ]]
|
|
Packit |
992a25 |
then err_exit 'clone of multi-dimensional array timed out'
|
|
Packit |
992a25 |
elif ((exitval))
|
|
Packit |
992a25 |
then err_exit "c.i and c.j are not the same multi-dimensional array"
|
|
Packit |
992a25 |
fi
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T foobar_t=(
|
|
Packit |
992a25 |
float x=1 y=0
|
|
Packit |
992a25 |
slen()
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print -r -- $((sqrt(_.x**2 + _.y**2)))
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
typeset -fS slen
|
|
Packit |
992a25 |
len()
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print -r -- $((sqrt(_.x**2 + _.y**2)))
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
unset z
|
|
Packit |
992a25 |
foobar_t z=(x=3 y=4)
|
|
Packit |
992a25 |
(( z.len == 5 )) || err_exit 'z.len should be 5'
|
|
Packit |
992a25 |
(( z.slen == 1 )) || err_exit 'z.slen should be 1'
|
|
Packit |
992a25 |
(( .sh.type.foobar_t.slen == 1 )) || err_exit '.sh.type.foobar_t.slen should be 1'
|
|
Packit |
992a25 |
(( .sh.type.foobar_t.len == 1 )) || err_exit '.sh.type.foobar_t.len should be 1'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T z_t=( typeset -a ce )
|
|
Packit |
992a25 |
z_t x1
|
|
Packit |
992a25 |
x1.ce[3][4]=45
|
|
Packit |
992a25 |
compound c
|
|
Packit |
992a25 |
z_t -a c.x2
|
|
Packit |
992a25 |
c.x2[9]=x1
|
|
Packit |
992a25 |
got=$(typeset +p "c.x2[9].ce")
|
|
Packit |
992a25 |
exp='typeset -a c.x2[9].ce'
|
|
Packit |
992a25 |
[[ $got == "$exp" ]] || err_exit "typeset +p 'c.x2[9].ce' failed -- expected '$exp', got '$got'"
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
unset b
|
|
Packit |
992a25 |
typeset -T a_t=(
|
|
Packit |
992a25 |
typeset a="hello"
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
typeset -T b_t=(
|
|
Packit |
992a25 |
a_t b
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
compound b
|
|
Packit |
992a25 |
compound -a b.ca
|
|
Packit |
992a25 |
b_t b.ca[4].b
|
|
Packit |
992a25 |
exp='typeset -C b=(typeset -C -a ca=( [4]=(b_t b=(a_t b=(a=hello))));)'
|
|
Packit |
992a25 |
got=$(typeset -p b)
|
|
Packit |
992a25 |
[[ $got == "$exp" ]] || err_exit 'typeset -p of nested type not correct'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T u_t=(
|
|
Packit |
992a25 |
integer dummy
|
|
Packit |
992a25 |
unset()
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print unset
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
unset z
|
|
Packit |
992a25 |
u_t -a x | read z
|
|
Packit |
992a25 |
[[ $z == unset ]] && err_exit 'unset discipline called on type creation'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
{ z=$($SHELL 2> /dev/null 'typeset -T foo; typeset -T') ;} 2> /dev/null
|
|
Packit |
992a25 |
[[ $z == 'typeset -T foo' ]] || err_exit '"typeset -T foo; typeset -T" failed'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
{ z=$($SHELL 2> /dev/null 'typeset -T foo=bar; typeset -T') ;} 2> /dev/null
|
|
Packit |
992a25 |
[[ $z ]] && err_exit '"typeset -T foo=bar" should not creates type foo'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
$SHELL << \EOF
|
|
Packit |
992a25 |
typeset -T board_t=(
|
|
Packit |
992a25 |
compound -a board_y
|
|
Packit |
992a25 |
function binsert
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
nameref figure=$1
|
|
Packit |
992a25 |
integer y=$2 x=$3
|
|
Packit |
992a25 |
typeset -m "_.board_y[y].board_x[x].field=figure"
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
function main
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
compound c=(
|
|
Packit |
992a25 |
board_t b
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
for ((i=0 ; i < 2 ; i++ )) ; do
|
|
Packit |
992a25 |
compound p=( hello=world )
|
|
Packit |
992a25 |
c.b.binsert p 1 $i
|
|
Packit |
992a25 |
done
|
|
Packit |
992a25 |
exp='typeset -C c=(board_t b=(typeset -a board_y=( [1]=(typeset -a board_x=( [0]=(field=(hello=world;))[1]=(field=(hello=world)));));))'
|
|
Packit |
992a25 |
[[ $(typeset -p c) == "$exp" ]] || exit 1
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
main
|
|
Packit |
992a25 |
EOF
|
|
Packit |
992a25 |
} 2> /dev/null
|
|
Packit |
992a25 |
if (( exitval=$?))
|
|
Packit |
992a25 |
then if [[ $(kill -l $exitval) == SEGV ]]
|
|
Packit |
992a25 |
then err_exit 'typeset -m in type discipline causes exception'
|
|
Packit |
992a25 |
else err_exit 'typeset -m in type discipline gives wrong value'
|
|
Packit |
992a25 |
fi
|
|
Packit |
992a25 |
fi
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T pawn_t=(
|
|
Packit |
992a25 |
print_debug()
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
print 'PAWN'
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
function main
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
compound c=(
|
|
Packit |
992a25 |
compound -a board
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
for ((i=2 ; i < 8 ; i++ )) ; do
|
|
Packit |
992a25 |
pawn_t c.board[1][$i]
|
|
Packit |
992a25 |
done
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
main 2> /dev/null && err_exit 'type assignment to compound array instance should generate an error'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
{ $SHELL -c 'typeset -T Foo_t=(integer -a data=([0]=0) );Foo_t x=(data[0]=2);((x.data[0]==2))'
|
|
Packit |
992a25 |
} 2> /dev/null || err_exit 'type definition with integer array variable not working'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
typeset -T Bar_t=(
|
|
Packit |
992a25 |
typeset -a foo
|
|
Packit |
992a25 |
)
|
|
Packit |
992a25 |
Bar_t bar
|
|
Packit |
992a25 |
bar.foo+=(bam)
|
|
Packit |
992a25 |
[[ ${bar.foo[0]} == bam ]] || err_exit 'appending to empty array variable in type does not create element 0'
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
exit $((Errors<125?Errors:125))
|