7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin########################################################################
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# This software is part of the ast package #
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 1982-2010 AT&T Intellectual Property #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and is licensed under the #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Common Public License, Version 1.0 #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# by AT&T Intellectual Property #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# A copy of the License is available at #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# http://www.opensource.org/licenses/cpl1.0.txt #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Information and Software Systems Research #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# AT&T Research #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Florham Park NJ #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# David Korn <dgk@research.att.com> #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin########################################################################
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction err_exit
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -n "\t"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -r ${Command}[$1]: "${@:2}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( Errors+=1 ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinalias err_exit='err_exit $LINENO'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinCommand=${0##*/}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chininteger Errors=0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztrap "cd /; rm -rf $tmp" EXIT
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chininteger n=2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -T Type_t=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset name=foobar
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset x=(hi=ok bar=yes)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset y=(xa=xx xq=89)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A aa=([one]=abc [two]=def)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a ia=(abc def)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -i z=5
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfor ((i=0; i < 10; i++))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Type_t r s
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $r == "$s" ]] || err_exit 'r is not equal to s'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -C x=r.x
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin y=(xa=bb xq=cc)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin y2=xyz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin z2=xyz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -C z=y
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $y == "$z" ]] || err_exit 'y is not equal to z'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -C s.y=z
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $y == "${s.y}" ]] || err_exit 'y is not equal to s.y'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin .sh.q=$y
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -C www=.sh.q
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $www == "$z" ]] || err_exit 'www is not equal to z'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -C s.x=r.x
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ ${s.x} == "${r.x}" ]] || err_exit 's.x is not equal to r.x'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin function foo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref x=$1 y=$2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset z=$x
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin y=$x
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $x == "$y" ]] || err_exit "x is not equal to y with ${!x}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin foo r.y y
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $y == "${r.y}" ]] || err_exit 'y is not equal to r.y'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -C y=z
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin foo y r.y
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $y == "${r.y}" ]] || err_exit 'y is not equal to r.y again'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -C y=z
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin q=${z}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $q == "$z" ]] || err_exit 'q is not equal to z'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin z=abc
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $z == "$y" ]] || err_exit 'value of z not preserved after subshell'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset z y r s x z2 y2 www .sh.q
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -T Frame_t=( typeset file lineno )
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinFrame_t frame
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $(typeset -p frame) == 'Frame_t frame=(typeset file;typeset lineno;)' ]] || err_exit 'empty fields in type not displayed'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinx=( typeset -a arr=([2]=abc [4]=(x=1 y=def));zz=abc)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -C y=x
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ "$x" == "$y" ]] || print -u2 'y is not equal to x'
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinType_t z=(y=(xa=bb xq=cc))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -A arr=([foo]=one [bar]=2)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -A brr=([foo]=one [bar]=2)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ "${arr[@]}" == "${brr[@]}" ]] || err_exit 'arr is not brr'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfor ((i=0; i < 1; i++))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindo typeset -m zzz=x
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $zzz == "$y" ]] || err_exit 'zzz is not equal to y'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -m x=zzz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $x == "$y" ]] || err_exit 'x is not equal to y'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Type_t t=(y=(xa=bb xq=cc))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -m r=t
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $r == "$z" ]] || err_exit 'r is not equal to z'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -m t=r
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $t == "$z" ]] || err_exit 't is not equal to z'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -m crr=arr
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ "${crr[@]}" == "${brr[@]}" ]] || err_exit 'crr is not brr'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -m arr=crr
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ "${arr[@]}" == "${brr[@]}" ]] || err_exit 'brr is not arr'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -m brr[foo]=brr[bar]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${brr[foo]} == 2 ]] || err_exit 'move an associative array element fails'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${brr[bar]} ]] && err_exit 'brr[bar] should be unset after move'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinunset x y zzz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinx=(a b c)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -m x[1]=x[2]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${x[1]} == c ]] || err_exit 'move an indexed array element fails'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${x[2]} ]] && err_exit 'x[2] should be unset after move'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat > $tmp/types <<- \+++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -T Pt_t=(float x=1. y=0.)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Pt_t p=(y=2)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -r -- ${p.y}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin+++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexpected=2
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzgot=$(. $tmp/types) 2>/dev/null
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ "$got" == "$expected" ]] || err_exit "typedefs in dot script failed -- expected '$expected', got '$got'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -T X_t=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset x=foo y=bar
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset s=${_.x}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin create()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin _.y=bam
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin)
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinX_t x
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${x.x} == foo ]] || err_exit 'x.x should be foo'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${x.y} == bam ]] || err_exit 'x.y should be bam'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${x.s} == ${x.x} ]] || err_exit 'x.s should be x.x'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -T Y_t=( X_t r )
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinY_t z
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${z.r.x} == foo ]] || err_exit 'z.r.x should be foo'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${z.r.y} == bam ]] || err_exit 'z.r.y should be bam'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${z.r.s} == ${z.r.x} ]] || err_exit 'z.r.s should be z.r.x'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinunset xx yy
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -T xx=(typeset yy=zz)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinxx=yy
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{ typeset -T xx=(typeset yy=zz) ;} 2>/dev/null && err_exit 'type redefinition should fail'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin$SHELL 2> /dev/null <<- +++ || err_exit 'typedef with only f(){} fails'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -T X_t=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin f()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print ok
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin+++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin$SHELL 2> /dev/null <<- +++ || err_exit 'unable to redefine f discipline function'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -T X_t=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x=1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin f()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print ok
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin X_t z=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin function f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print override f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin+++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin$SHELL 2> /dev/null <<- +++ && err_exit 'invalid discipline name should be an error'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -T X_t=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x=1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin f()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print ok
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin X_t z=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin function g
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print override f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin+++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# compound variables containing type variables
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinType_t r
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinvar=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset x=foobar
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Type_t r
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer z=5
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${var.r} == "$r" ]] || err_exit 'var.r != r'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin(( var.z == 5)) || err_exit 'var.z !=5'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ "$var" == *x=foobar* ]] || err_exit '$var does not contain x=foobar'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -T A_t=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset x=aha
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset b=${_.x}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinunset x
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinA_t x
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexpected=aha
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chingot=${x.b}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ "$got" == "$expected" ]] || err_exit "type '_' reference failed -- expected '$expected', got '$got'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -T Tst_t=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin function f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin A_t a
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print ${ _.g ${a.x}; }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin function g
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print foo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin)
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinTst_t tst
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexpected=foo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chingot=${ tst.f;}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ "$got" == "$expected" ]] || err_exit "_.g where g is a function in type discipline method failed -- expected '$expected', got '$got'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -T B_t=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer -a arr
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin function f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( _.arr[0] = 0 ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( _.arr[1] = 1 ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print ${_.arr[*]}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinunset x
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinB_t x
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexpected='0 1'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chingot=${ x.f;}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ "$got" == "$expected" ]] || err_exit "array assignment of subscripts in type discipline arithmetic failed -- expected '$expected', got '$got'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -T Fileinfo_t=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size=-1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -a text=()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer mtime=-1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin)
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinFileinfo_t -A _Dbg_filenames
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinFileinfo_t finfo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction bar
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin finfo.text=(line1 line2 line3)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin finfo.size=${#finfo.text[@]}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin _Dbg_filenames[foo]=finfo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbar
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexpected='Fileinfo_t -A _Dbg_filenames=([foo]=(size=2;typeset -C -a text=([0]=line1 [1]=line2 [2]=line3);typeset -l -i mtime=-1;))'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chingot=$(typeset -p _Dbg_filenames)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ "$got" == "$expected" ]] || {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin got=$(printf %q "$got")
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin err_exit "copy to associative array of types in function failed -- expected '$expected', got '$got'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin$SHELL > /dev/null <<- '+++++' || err_exit 'passing _ as nameref arg not working'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin function f1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -n v=$1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -r -- "$v"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -T A_t=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset blah=xxx
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin function f { f1 _ ;}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin A_t a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ ${ a.f ./t1;} == "$a" ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin+++++
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexpected='A_t b.a=(name=one;)'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $( $SHELL << \+++
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -T A_t=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset name=aha
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -T B_t=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset arr
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz A_t a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz f()
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz _.a=(name=one)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -p _.a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz B_t b
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz b.f
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz+++
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz) == "$expected" ]] 2> /dev/null || err_exit '_.a=(name=one) not expanding correctly'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexpected='A_t x=(name=xxx;)'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $( $SHELL << \+++
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -T A_t=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset name
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz A_t x=(name="xxx")
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -p x
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz+++
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz) == "$expected" ]] || err_exit 'empty field in definition does not expand correctly'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztypeset -T Foo_t=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz integer x=3
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz integer y=4
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz len() { print -r -- $(( sqrt(_.x**2 + _.y**2))) ;}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzFoo_t foo
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ ${foo.len} == 5 ]] || err_exit "discipline function len not working"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztypeset -T benchmark_t=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz integer num_iterations
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfunction do_benchmarks
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nameref tst=b
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz integer num_iterations
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz (( num_iterations= int(tst.num_iterations * 1.0) ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz printf "%d\n" num_iterations
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzbenchmark_t b=(num_iterations=5)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $(do_benchmarks) == 5 ]] || err_exit 'scoping of nameref of type variables in arithmetic expressions not working'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfunction cat_content
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cat <<- EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz (
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz foo_t -a foolist=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( val=3 )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( val=4 )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ( val=5 )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return 0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztypeset -T foo_t=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz integer val=-1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz function print
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -- ${_.val}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfunction do_something
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nameref li=$1 # "li" may be an index or associative array
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz li[2].print
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat_content | read -C x
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $(do_something x.foolist) == 5 ]] || err_exit 'subscripts not honored for arrays of type with disciplines'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztypeset -T benchcmd_t=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz float x=1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz float y=2
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzunset x
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcompound x=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz float o
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz benchcmd_t -a m
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz integer h
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexpected=$'(\n\ttypeset -l -i h=0\n\tbenchcmd_t -a m\n\ttypeset -l -E o=0\n)'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $x == "$expected" ]] || err_exit 'compound variable with array of types with no elements not working'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexpected=$'Std_file_t db.file[/etc/profile]=(action=preserve;typeset -A sum=([8242e663d6f7bb4c5427a0e58e2925f3]=1);)'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz got=$($SHELL <<- \EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz MAGIC='stdinstall (at&t research) 2009-08-25'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -T Std_file_t=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset action
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -A sum
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -T Std_t=(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset magic=$MAGIC
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Std_file_t -A file
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz )
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 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);));)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -p db.file[/etc/profile]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz EOF)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz} 2> /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $got == "$expected" ]] || err_exit 'types with arrays of types as members fails'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexit $Errors