17c2fbfb3SApril Chin######################################################################## 27c2fbfb3SApril Chin# # 37c2fbfb3SApril Chin# This software is part of the ast package # 4*b30d1939SAndy Fiddaman# Copyright (c) 1982-2012 AT&T Intellectual Property # 57c2fbfb3SApril Chin# and is licensed under the # 6*b30d1939SAndy Fiddaman# Eclipse Public License, Version 1.0 # 77c2fbfb3SApril Chin# by AT&T Intellectual Property # 87c2fbfb3SApril Chin# # 97c2fbfb3SApril Chin# 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) # 127c2fbfb3SApril Chin# # 137c2fbfb3SApril Chin# Information and Software Systems Research # 147c2fbfb3SApril Chin# AT&T Research # 157c2fbfb3SApril Chin# Florham Park NJ # 167c2fbfb3SApril Chin# # 177c2fbfb3SApril Chin# David Korn <dgk@research.att.com> # 187c2fbfb3SApril Chin# # 197c2fbfb3SApril Chin######################################################################## 207c2fbfb3SApril Chinfunction err_exit 217c2fbfb3SApril Chin{ 227c2fbfb3SApril Chin print -u2 -n "\t" 237c2fbfb3SApril Chin print -u2 -r ${Command}[$1]: "${@:2}" 247c2fbfb3SApril Chin (( Errors+=1 )) 257c2fbfb3SApril Chin} 267c2fbfb3SApril Chinalias err_exit='err_exit $LINENO' 277c2fbfb3SApril Chin 287c2fbfb3SApril ChinCommand=${0##*/} 297c2fbfb3SApril Chininteger Errors=0 3034f9b3eeSRoland Mainz 3134f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; } 3234f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT 3334f9b3eeSRoland Mainz 347c2fbfb3SApril Chininteger n=2 357c2fbfb3SApril Chin 367c2fbfb3SApril Chintypeset -T Type_t=( 377c2fbfb3SApril Chin typeset name=foobar 387c2fbfb3SApril Chin typeset x=(hi=ok bar=yes) 397c2fbfb3SApril Chin typeset y=(xa=xx xq=89) 407c2fbfb3SApril Chin typeset -A aa=([one]=abc [two]=def) 417c2fbfb3SApril Chin typeset -a ia=(abc def) 427c2fbfb3SApril Chin typeset -i z=5 437c2fbfb3SApril Chin) 447c2fbfb3SApril Chinfor ((i=0; i < 10; i++)) 457c2fbfb3SApril Chindo 467c2fbfb3SApril Chin Type_t r s 477c2fbfb3SApril Chin [[ $r == "$s" ]] || err_exit 'r is not equal to s' 487c2fbfb3SApril Chin typeset -C x=r.x 497c2fbfb3SApril Chin y=(xa=bb xq=cc) 507c2fbfb3SApril Chin y2=xyz 517c2fbfb3SApril Chin z2=xyz 527c2fbfb3SApril Chin typeset -C z=y 537c2fbfb3SApril Chin [[ $y == "$z" ]] || err_exit 'y is not equal to z' 547c2fbfb3SApril Chin typeset -C s.y=z 557c2fbfb3SApril Chin [[ $y == "${s.y}" ]] || err_exit 'y is not equal to s.y' 567c2fbfb3SApril Chin .sh.q=$y 577c2fbfb3SApril Chin typeset -C www=.sh.q 587c2fbfb3SApril Chin [[ $www == "$z" ]] || err_exit 'www is not equal to z' 597c2fbfb3SApril Chin typeset -C s.x=r.x 607c2fbfb3SApril Chin [[ ${s.x} == "${r.x}" ]] || err_exit 's.x is not equal to r.x' 617c2fbfb3SApril Chin 627c2fbfb3SApril Chin function foo 637c2fbfb3SApril Chin { 647c2fbfb3SApril Chin nameref x=$1 y=$2 657c2fbfb3SApril Chin typeset z=$x 667c2fbfb3SApril Chin y=$x 677c2fbfb3SApril Chin [[ $x == "$y" ]] || err_exit "x is not equal to y with ${!x}" 687c2fbfb3SApril Chin } 697c2fbfb3SApril Chin foo r.y y 707c2fbfb3SApril Chin [[ $y == "${r.y}" ]] || err_exit 'y is not equal to r.y' 717c2fbfb3SApril Chin typeset -C y=z 727c2fbfb3SApril Chin foo y r.y 737c2fbfb3SApril Chin [[ $y == "${r.y}" ]] || err_exit 'y is not equal to r.y again' 747c2fbfb3SApril Chin typeset -C y=z 757c2fbfb3SApril Chin ( 767c2fbfb3SApril Chin q=${z} 777c2fbfb3SApril Chin [[ $q == "$z" ]] || err_exit 'q is not equal to z' 787c2fbfb3SApril Chin z=abc 797c2fbfb3SApril Chin ) 807c2fbfb3SApril Chin [[ $z == "$y" ]] || err_exit 'value of z not preserved after subshell' 817c2fbfb3SApril Chin unset z y r s x z2 y2 www .sh.q 827c2fbfb3SApril Chindone 837c2fbfb3SApril Chintypeset -T Frame_t=( typeset file lineno ) 847c2fbfb3SApril ChinFrame_t frame 85*b30d1939SAndy Fiddaman[[ $(typeset -p frame) == 'Frame_t frame=(typeset file;typeset lineno)' ]] || err_exit 'empty fields in type not displayed' 867c2fbfb3SApril Chinx=( typeset -a arr=([2]=abc [4]=(x=1 y=def));zz=abc) 877c2fbfb3SApril Chintypeset -C y=x 887c2fbfb3SApril Chin[[ "$x" == "$y" ]] || print -u2 'y is not equal to x' 897c2fbfb3SApril ChinType_t z=(y=(xa=bb xq=cc)) 907c2fbfb3SApril Chintypeset -A arr=([foo]=one [bar]=2) 917c2fbfb3SApril Chintypeset -A brr=([foo]=one [bar]=2) 927c2fbfb3SApril Chin[[ "${arr[@]}" == "${brr[@]}" ]] || err_exit 'arr is not brr' 937c2fbfb3SApril Chinfor ((i=0; i < 1; i++)) 947c2fbfb3SApril Chindo typeset -m zzz=x 957c2fbfb3SApril Chin [[ $zzz == "$y" ]] || err_exit 'zzz is not equal to y' 967c2fbfb3SApril Chin typeset -m x=zzz 977c2fbfb3SApril Chin [[ $x == "$y" ]] || err_exit 'x is not equal to y' 987c2fbfb3SApril Chin Type_t t=(y=(xa=bb xq=cc)) 997c2fbfb3SApril Chin typeset -m r=t 1007c2fbfb3SApril Chin [[ $r == "$z" ]] || err_exit 'r is not equal to z' 1017c2fbfb3SApril Chin typeset -m t=r 1027c2fbfb3SApril Chin [[ $t == "$z" ]] || err_exit 't is not equal to z' 1037c2fbfb3SApril Chin typeset -m crr=arr 1047c2fbfb3SApril Chin [[ "${crr[@]}" == "${brr[@]}" ]] || err_exit 'crr is not brr' 1057c2fbfb3SApril Chin typeset -m arr=crr 1067c2fbfb3SApril Chin [[ "${arr[@]}" == "${brr[@]}" ]] || err_exit 'brr is not arr' 1077c2fbfb3SApril Chindone 1087c2fbfb3SApril Chintypeset -m brr[foo]=brr[bar] 1097c2fbfb3SApril Chin[[ ${brr[foo]} == 2 ]] || err_exit 'move an associative array element fails' 1107c2fbfb3SApril Chin[[ ${brr[bar]} ]] && err_exit 'brr[bar] should be unset after move' 1117c2fbfb3SApril Chinunset x y zzz 1127c2fbfb3SApril Chinx=(a b c) 1137c2fbfb3SApril Chintypeset -m x[1]=x[2] 1147c2fbfb3SApril Chin[[ ${x[1]} == c ]] || err_exit 'move an indexed array element fails' 1157c2fbfb3SApril Chin[[ ${x[2]} ]] && err_exit 'x[2] should be unset after move' 11634f9b3eeSRoland Mainzcat > $tmp/types <<- \+++ 1177c2fbfb3SApril Chin typeset -T Pt_t=(float x=1. y=0.) 1187c2fbfb3SApril Chin Pt_t p=(y=2) 1197c2fbfb3SApril Chin print -r -- ${p.y} 1207c2fbfb3SApril Chin+++ 1217c2fbfb3SApril Chinexpected=2 12234f9b3eeSRoland Mainzgot=$(. $tmp/types) 2>/dev/null 1237c2fbfb3SApril Chin[[ "$got" == "$expected" ]] || err_exit "typedefs in dot script failed -- expected '$expected', got '$got'" 1247c2fbfb3SApril Chintypeset -T X_t=( 1257c2fbfb3SApril Chin typeset x=foo y=bar 1267c2fbfb3SApril Chin typeset s=${_.x} 1277c2fbfb3SApril Chin create() 1287c2fbfb3SApril Chin { 1297c2fbfb3SApril Chin _.y=bam 1307c2fbfb3SApril Chin } 1317c2fbfb3SApril Chin) 1327c2fbfb3SApril ChinX_t x 1337c2fbfb3SApril Chin[[ ${x.x} == foo ]] || err_exit 'x.x should be foo' 1347c2fbfb3SApril Chin[[ ${x.y} == bam ]] || err_exit 'x.y should be bam' 1357c2fbfb3SApril Chin[[ ${x.s} == ${x.x} ]] || err_exit 'x.s should be x.x' 1367c2fbfb3SApril Chintypeset -T Y_t=( X_t r ) 1377c2fbfb3SApril ChinY_t z 1387c2fbfb3SApril Chin[[ ${z.r.x} == foo ]] || err_exit 'z.r.x should be foo' 1397c2fbfb3SApril Chin[[ ${z.r.y} == bam ]] || err_exit 'z.r.y should be bam' 1407c2fbfb3SApril Chin[[ ${z.r.s} == ${z.r.x} ]] || err_exit 'z.r.s should be z.r.x' 1417c2fbfb3SApril Chin 1427c2fbfb3SApril Chinunset xx yy 1437c2fbfb3SApril Chintypeset -T xx=(typeset yy=zz) 1447c2fbfb3SApril Chinxx=yy 1457c2fbfb3SApril Chin{ typeset -T xx=(typeset yy=zz) ;} 2>/dev/null && err_exit 'type redefinition should fail' 1467c2fbfb3SApril Chin$SHELL 2> /dev/null <<- +++ || err_exit 'typedef with only f(){} fails' 1477c2fbfb3SApril Chin typeset -T X_t=( 1487c2fbfb3SApril Chin f() 1497c2fbfb3SApril Chin { 1507c2fbfb3SApril Chin print ok 1517c2fbfb3SApril Chin } 1527c2fbfb3SApril Chin ) 1537c2fbfb3SApril Chin+++ 1547c2fbfb3SApril Chin$SHELL 2> /dev/null <<- +++ || err_exit 'unable to redefine f discipline function' 1557c2fbfb3SApril Chin typeset -T X_t=( 1567c2fbfb3SApril Chin x=1 1577c2fbfb3SApril Chin f() 1587c2fbfb3SApril Chin { 1597c2fbfb3SApril Chin print ok 1607c2fbfb3SApril Chin } 1617c2fbfb3SApril Chin ) 1627c2fbfb3SApril Chin X_t z=( 1637c2fbfb3SApril Chin function f 1647c2fbfb3SApril Chin { 1657c2fbfb3SApril Chin print override f 1667c2fbfb3SApril Chin } 1677c2fbfb3SApril Chin ) 1687c2fbfb3SApril Chin+++ 1697c2fbfb3SApril Chin$SHELL 2> /dev/null <<- +++ && err_exit 'invalid discipline name should be an error' 1707c2fbfb3SApril Chin typeset -T X_t=( 1717c2fbfb3SApril Chin x=1 1727c2fbfb3SApril Chin f() 1737c2fbfb3SApril Chin { 1747c2fbfb3SApril Chin print ok 1757c2fbfb3SApril Chin } 1767c2fbfb3SApril Chin ) 1777c2fbfb3SApril Chin X_t z=( 1787c2fbfb3SApril Chin function g 1797c2fbfb3SApril Chin { 1807c2fbfb3SApril Chin print override f 1817c2fbfb3SApril Chin } 1827c2fbfb3SApril Chin ) 1837c2fbfb3SApril Chin+++ 1847c2fbfb3SApril Chin# compound variables containing type variables 1857c2fbfb3SApril ChinType_t r 1867c2fbfb3SApril Chinvar=( 1877c2fbfb3SApril Chin typeset x=foobar 1887c2fbfb3SApril Chin Type_t r 1897c2fbfb3SApril Chin integer z=5 1907c2fbfb3SApril Chin) 1917c2fbfb3SApril Chin[[ ${var.r} == "$r" ]] || err_exit 'var.r != r' 1927c2fbfb3SApril Chin(( var.z == 5)) || err_exit 'var.z !=5' 1937c2fbfb3SApril Chin[[ "$var" == *x=foobar* ]] || err_exit '$var does not contain x=foobar' 1947c2fbfb3SApril Chin 1957c2fbfb3SApril Chintypeset -T A_t=( 1967c2fbfb3SApril Chin typeset x=aha 1977c2fbfb3SApril Chin typeset b=${_.x} 1987c2fbfb3SApril Chin) 1997c2fbfb3SApril Chinunset x 2007c2fbfb3SApril ChinA_t x 2017c2fbfb3SApril Chinexpected=aha 2027c2fbfb3SApril Chingot=${x.b} 2037c2fbfb3SApril Chin[[ "$got" == "$expected" ]] || err_exit "type '_' reference failed -- expected '$expected', got '$got'" 2047c2fbfb3SApril Chin 2057c2fbfb3SApril Chintypeset -T Tst_t=( 2067c2fbfb3SApril Chin function f 2077c2fbfb3SApril Chin { 2087c2fbfb3SApril Chin A_t a 2097c2fbfb3SApril Chin print ${ _.g ${a.x}; } 2107c2fbfb3SApril Chin } 2117c2fbfb3SApril Chin function g 2127c2fbfb3SApril Chin { 2137c2fbfb3SApril Chin print foo 2147c2fbfb3SApril Chin } 2157c2fbfb3SApril Chin) 2167c2fbfb3SApril ChinTst_t tst 2177c2fbfb3SApril Chinexpected=foo 2187c2fbfb3SApril Chingot=${ tst.f;} 2197c2fbfb3SApril Chin[[ "$got" == "$expected" ]] || err_exit "_.g where g is a function in type discipline method failed -- expected '$expected', got '$got'" 2207c2fbfb3SApril Chin 2217c2fbfb3SApril Chintypeset -T B_t=( 2227c2fbfb3SApril Chin integer -a arr 2237c2fbfb3SApril Chin function f 2247c2fbfb3SApril Chin { 2257c2fbfb3SApril Chin (( _.arr[0] = 0 )) 2267c2fbfb3SApril Chin (( _.arr[1] = 1 )) 2277c2fbfb3SApril Chin print ${_.arr[*]} 2287c2fbfb3SApril Chin } 2297c2fbfb3SApril Chin) 2307c2fbfb3SApril Chinunset x 2317c2fbfb3SApril ChinB_t x 2327c2fbfb3SApril Chinexpected='0 1' 2337c2fbfb3SApril Chingot=${ x.f;} 2347c2fbfb3SApril Chin[[ "$got" == "$expected" ]] || err_exit "array assignment of subscripts in type discipline arithmetic failed -- expected '$expected', got '$got'" 2357c2fbfb3SApril Chin 2367c2fbfb3SApril Chintypeset -T Fileinfo_t=( 2377c2fbfb3SApril Chin size=-1 2387c2fbfb3SApril Chin typeset -a text=() 2397c2fbfb3SApril Chin integer mtime=-1 2407c2fbfb3SApril Chin) 2417c2fbfb3SApril ChinFileinfo_t -A _Dbg_filenames 2427c2fbfb3SApril ChinFileinfo_t finfo 2437c2fbfb3SApril Chinfunction bar 2447c2fbfb3SApril Chin{ 2457c2fbfb3SApril Chin finfo.text=(line1 line2 line3) 2467c2fbfb3SApril Chin finfo.size=${#finfo.text[@]} 2477c2fbfb3SApril Chin _Dbg_filenames[foo]=finfo 2487c2fbfb3SApril Chin} 2497c2fbfb3SApril Chinbar 2507c2fbfb3SApril Chin 251*b30d1939SAndy Fiddamanexpected='Fileinfo_t -A _Dbg_filenames=([foo]=(size=3;typeset -a text=(line1 line2 line3);typeset -l -i mtime=-1))' 2527c2fbfb3SApril Chingot=$(typeset -p _Dbg_filenames) 2537c2fbfb3SApril Chin[[ "$got" == "$expected" ]] || { 2547c2fbfb3SApril Chin got=$(printf %q "$got") 255*b30d1939SAndy Fiddaman err_exit "copy to associative array of types in function failed -- expected '$expected', got $got" 2567c2fbfb3SApril Chin} 2577c2fbfb3SApril Chin 2587c2fbfb3SApril Chin$SHELL > /dev/null <<- '+++++' || err_exit 'passing _ as nameref arg not working' 2597c2fbfb3SApril Chin function f1 2607c2fbfb3SApril Chin { 2617c2fbfb3SApril Chin typeset -n v=$1 2627c2fbfb3SApril Chin print -r -- "$v" 2637c2fbfb3SApril Chin } 2647c2fbfb3SApril Chin typeset -T A_t=( 2657c2fbfb3SApril Chin typeset blah=xxx 2667c2fbfb3SApril Chin function f { f1 _ ;} 2677c2fbfb3SApril Chin ) 2687c2fbfb3SApril Chin A_t a 26934f9b3eeSRoland Mainz [[ ${ a.f ./t1;} == "$a" ]] 2707c2fbfb3SApril Chin+++++ 271*b30d1939SAndy Fiddamanexpected='A_t b.a=(name=one)' 27234f9b3eeSRoland Mainz[[ $( $SHELL << \+++ 27334f9b3eeSRoland Mainz typeset -T A_t=( 27434f9b3eeSRoland Mainz typeset name=aha 27534f9b3eeSRoland Mainz ) 27634f9b3eeSRoland Mainz typeset -T B_t=( 27734f9b3eeSRoland Mainz typeset arr 27834f9b3eeSRoland Mainz A_t a 27934f9b3eeSRoland Mainz f() 28034f9b3eeSRoland Mainz { 28134f9b3eeSRoland Mainz _.a=(name=one) 28234f9b3eeSRoland Mainz typeset -p _.a 28334f9b3eeSRoland Mainz } 28434f9b3eeSRoland Mainz ) 28534f9b3eeSRoland Mainz B_t b 28634f9b3eeSRoland Mainz b.f 28734f9b3eeSRoland Mainz+++ 28834f9b3eeSRoland Mainz) == "$expected" ]] 2> /dev/null || err_exit '_.a=(name=one) not expanding correctly' 289*b30d1939SAndy Fiddamanexpected='A_t x=(name=xxx)' 29034f9b3eeSRoland Mainz[[ $( $SHELL << \+++ 29134f9b3eeSRoland Mainz typeset -T A_t=( 29234f9b3eeSRoland Mainz typeset name 29334f9b3eeSRoland Mainz ) 29434f9b3eeSRoland Mainz A_t x=(name="xxx") 29534f9b3eeSRoland Mainz typeset -p x 29634f9b3eeSRoland Mainz+++ 29734f9b3eeSRoland Mainz) == "$expected" ]] || err_exit 'empty field in definition does not expand correctly' 29834f9b3eeSRoland Mainz 29934f9b3eeSRoland Mainztypeset -T Foo_t=( 30034f9b3eeSRoland Mainz integer x=3 30134f9b3eeSRoland Mainz integer y=4 30234f9b3eeSRoland Mainz len() { print -r -- $(( sqrt(_.x**2 + _.y**2))) ;} 30334f9b3eeSRoland Mainz) 30434f9b3eeSRoland MainzFoo_t foo 30534f9b3eeSRoland Mainz[[ ${foo.len} == 5 ]] || err_exit "discipline function len not working" 30634f9b3eeSRoland Mainz 30734f9b3eeSRoland Mainztypeset -T benchmark_t=( 30834f9b3eeSRoland Mainz integer num_iterations 30934f9b3eeSRoland Mainz) 31034f9b3eeSRoland Mainzfunction do_benchmarks 31134f9b3eeSRoland Mainz{ 31234f9b3eeSRoland Mainz nameref tst=b 31334f9b3eeSRoland Mainz integer num_iterations 31434f9b3eeSRoland Mainz (( num_iterations= int(tst.num_iterations * 1.0) )) 31534f9b3eeSRoland Mainz printf "%d\n" num_iterations 31634f9b3eeSRoland Mainz} 31734f9b3eeSRoland Mainzbenchmark_t b=(num_iterations=5) 31834f9b3eeSRoland Mainz[[ $(do_benchmarks) == 5 ]] || err_exit 'scoping of nameref of type variables in arithmetic expressions not working' 31934f9b3eeSRoland Mainz 32034f9b3eeSRoland Mainzfunction cat_content 32134f9b3eeSRoland Mainz{ 32234f9b3eeSRoland Mainz cat <<- EOF 32334f9b3eeSRoland Mainz ( 32434f9b3eeSRoland Mainz foo_t -a foolist=( 32534f9b3eeSRoland Mainz ( val=3 ) 32634f9b3eeSRoland Mainz ( val=4 ) 32734f9b3eeSRoland Mainz ( val=5 ) 32834f9b3eeSRoland Mainz ) 32934f9b3eeSRoland Mainz ) 33034f9b3eeSRoland Mainz EOF 33134f9b3eeSRoland Mainz return 0 33234f9b3eeSRoland Mainz} 33334f9b3eeSRoland Mainztypeset -T foo_t=( 33434f9b3eeSRoland Mainz integer val=-1 33534f9b3eeSRoland Mainz function print 33634f9b3eeSRoland Mainz { 33734f9b3eeSRoland Mainz print -- ${_.val} 33834f9b3eeSRoland Mainz } 33934f9b3eeSRoland Mainz) 34034f9b3eeSRoland Mainzfunction do_something 34134f9b3eeSRoland Mainz{ 34234f9b3eeSRoland Mainz nameref li=$1 # "li" may be an index or associative array 34334f9b3eeSRoland Mainz li[2].print 34434f9b3eeSRoland Mainz} 34534f9b3eeSRoland Mainzcat_content | read -C x 34634f9b3eeSRoland Mainz[[ $(do_something x.foolist) == 5 ]] || err_exit 'subscripts not honored for arrays of type with disciplines' 34734f9b3eeSRoland Mainz 34834f9b3eeSRoland Mainztypeset -T benchcmd_t=( 34934f9b3eeSRoland Mainz float x=1 35034f9b3eeSRoland Mainz float y=2 35134f9b3eeSRoland Mainz) 35234f9b3eeSRoland Mainzunset x 35334f9b3eeSRoland Mainzcompound x=( 35434f9b3eeSRoland Mainz float o 35534f9b3eeSRoland Mainz benchcmd_t -a m 35634f9b3eeSRoland Mainz integer h 35734f9b3eeSRoland Mainz) 35834f9b3eeSRoland Mainzexpected=$'(\n\ttypeset -l -i h=0\n\tbenchcmd_t -a m\n\ttypeset -l -E o=0\n)' 35934f9b3eeSRoland Mainz[[ $x == "$expected" ]] || err_exit 'compound variable with array of types with no elements not working' 36034f9b3eeSRoland Mainz 36134f9b3eeSRoland Mainzexpected=$'Std_file_t db.file[/etc/profile]=(action=preserve;typeset -A sum=([8242e663d6f7bb4c5427a0e58e2925f3]=1);)' 36234f9b3eeSRoland Mainz{ 36334f9b3eeSRoland Mainz got=$($SHELL <<- \EOF 36434f9b3eeSRoland Mainz MAGIC='stdinstall (at&t research) 2009-08-25' 36534f9b3eeSRoland Mainz typeset -T Std_file_t=( 36634f9b3eeSRoland Mainz typeset action 36734f9b3eeSRoland Mainz typeset -A sum 36834f9b3eeSRoland Mainz ) 36934f9b3eeSRoland Mainz typeset -T Std_t=( 37034f9b3eeSRoland Mainz typeset magic=$MAGIC 37134f9b3eeSRoland Mainz Std_file_t -A file 37234f9b3eeSRoland Mainz ) 37334f9b3eeSRoland 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);));) 37434f9b3eeSRoland Mainz typeset -p db.file[/etc/profile] 37534f9b3eeSRoland Mainz EOF) 37634f9b3eeSRoland Mainz} 2> /dev/null 37734f9b3eeSRoland Mainz[[ $got == "$expected" ]] || err_exit 'types with arrays of types as members fails' 37834f9b3eeSRoland Mainz 379*b30d1939SAndy Fiddamantypeset -T x_t=( 380*b30d1939SAndy Fiddaman integer dummy 381*b30d1939SAndy Fiddaman function set 382*b30d1939SAndy Fiddaman { 383*b30d1939SAndy Fiddaman [[ ${.sh.name} == v ]] || err_exit "name=${.sh.name} should be v" 384*b30d1939SAndy Fiddaman [[ ${.sh.subscript} == 4 ]] || err_exit "subscript=${.sh.subscript} should be 4" 385*b30d1939SAndy Fiddaman [[ ${.sh.value} == hello ]] || err_exit "value=${.sh.value} should be hello" 386*b30d1939SAndy Fiddaman } 387*b30d1939SAndy Fiddaman) 388*b30d1939SAndy Fiddamanx_t -a v 389*b30d1939SAndy Fiddamanv[4]="hello" 390*b30d1939SAndy Fiddaman 391*b30d1939SAndy Fiddamantypeset -T oset=( 392*b30d1939SAndy Fiddaman typeset -A s 393*b30d1939SAndy Fiddaman) 394*b30d1939SAndy Fiddamanoset foo bar 395*b30d1939SAndy Fiddaman: ${foo.s[a]:=foobar} 396*b30d1939SAndy Fiddaman: ${bar.s[d]:=foobar} 397*b30d1939SAndy Fiddaman[[ ${bar.s[a]} == foobar ]] && err_exit '${var:=val} for types assigns to type instead of type instance' 398*b30d1939SAndy Fiddaman 399*b30d1939SAndy Fiddamantypeset -T olist=( 400*b30d1939SAndy Fiddaman typeset -a l 401*b30d1939SAndy Fiddaman) 402*b30d1939SAndy Fiddamanolist foo 403*b30d1939SAndy Fiddamanfoo.l[1]=x 404*b30d1939SAndy Fiddaman[[ ${!foo.l[*]} == *0* ]] && '0-th elment of foo.l should not be set' 405*b30d1939SAndy Fiddaman 406*b30d1939SAndy Fiddamantypeset -T oset2=( typeset -A foo ) 407*b30d1939SAndy Fiddamanoset2 bar 408*b30d1939SAndy Fiddaman: ${bar.foo[a]} 409*b30d1939SAndy Fiddamanbar.foo[a]=b 410*b30d1939SAndy Fiddaman[[ ${#bar.foo[*]} == 1 ]] || err_exit "bar.foo should have 1 element not ${#bar.foo[*]}" 411*b30d1939SAndy Fiddaman[[ ${bar.foo[*]} == b ]] || err_exit "bar.foo[*] should be 'b' not ${bar.foo[*]}" 412*b30d1939SAndy Fiddaman[[ ${bar.foo[a]} == b ]] || err_exit "bar.foo[a] should be 'b' not ${bar.foo[*]}" 413*b30d1939SAndy Fiddaman 414*b30d1939SAndy Fiddaman{ x=$( $SHELL 2> /dev/null << \++EOF++ 415*b30d1939SAndy Fiddaman typeset -T ab_t=( 416*b30d1939SAndy Fiddaman integer a=1 b=2 417*b30d1939SAndy Fiddaman function increment 418*b30d1939SAndy Fiddaman { 419*b30d1939SAndy Fiddaman (( _.a++, _.b++ )) 420*b30d1939SAndy Fiddaman } 421*b30d1939SAndy Fiddaman ) 422*b30d1939SAndy Fiddaman function ar_n 423*b30d1939SAndy Fiddaman { 424*b30d1939SAndy Fiddaman nameref sn=$2 425*b30d1939SAndy Fiddaman sn.increment 426*b30d1939SAndy Fiddaman $1 && printf "a=%d, b=%d\n" sn.a sn.b 427*b30d1939SAndy Fiddaman } 428*b30d1939SAndy Fiddaman function ar 429*b30d1939SAndy Fiddaman { 430*b30d1939SAndy Fiddaman ab_t -S -a s 431*b30d1939SAndy Fiddaman [[ -v s[5] ]] || s[5]=( ) 432*b30d1939SAndy Fiddaman ar_n $1 s[5] 433*b30d1939SAndy Fiddaman } 434*b30d1939SAndy Fiddaman x=$(ar false ; ar false ; ar true ; printf ";") 435*b30d1939SAndy Fiddaman y=$(ar false ; ar false ; ar true ; printf ";") 436*b30d1939SAndy Fiddaman print -r -- "\"$x\"" == "\"$y\"" 437*b30d1939SAndy Fiddaman++EOF++ 438*b30d1939SAndy Fiddaman) ;} 2> /dev/null 439*b30d1939SAndy Fiddaman[[ $x == *a=4*b=5* ]] || err_exit 'static types in a function not working' 440*b30d1939SAndy Fiddaman{ eval "[[ $x ]]";} 2> /dev/null || err_exit 'arrays of types leaving side effects in subshells' 441*b30d1939SAndy Fiddaman 442*b30d1939SAndy Fiddamantypeset -T y_t=( 443*b30d1939SAndy Fiddaman typeset dummy 444*b30d1939SAndy Fiddaman function print_b 445*b30d1939SAndy Fiddaman { 446*b30d1939SAndy Fiddaman print "B" 447*b30d1939SAndy Fiddaman } 448*b30d1939SAndy Fiddaman) 449*b30d1939SAndy Fiddamany_t a b=( 450*b30d1939SAndy Fiddaman function print_b 451*b30d1939SAndy Fiddaman { 452*b30d1939SAndy Fiddaman print "1" 453*b30d1939SAndy Fiddaman } 454*b30d1939SAndy Fiddaman) 455*b30d1939SAndy Fiddaman[[ $(a.print_b) == B ]] || err_exit 'default discipline not working' 456*b30d1939SAndy Fiddaman[[ $(b.print_b) == 1 ]] || err_exit 'discipline override not working' 457*b30d1939SAndy Fiddaman 458*b30d1939SAndy Fiddaman$SHELL 2> /dev/null -c 'true || { typeset -T Type_t=(typeset name=foo); 459*b30d1939SAndy Fiddaman Type_t z=(name=bar) ;}' || err_exit 'unable to parse type command until typeset -T executes' 460*b30d1939SAndy Fiddaman 461*b30d1939SAndy Fiddamancd "$tmp" 462*b30d1939SAndy FiddamanFPATH=$PWD 463*b30d1939SAndy FiddamanPATH=$PWD:$PATH 464*b30d1939SAndy Fiddamancat > A_t <<- \EOF 465*b30d1939SAndy Fiddaman typeset -T A_t=( 466*b30d1939SAndy Fiddaman B_t b 467*b30d1939SAndy Fiddaman ) 468*b30d1939SAndy FiddamanEOF 469*b30d1939SAndy Fiddamancat > B_t <<- \EOF 470*b30d1939SAndy Fiddaman typeset -T B_t=( 471*b30d1939SAndy Fiddaman integer n=5 472*b30d1939SAndy Fiddaman ) 473*b30d1939SAndy FiddamanEOF 474*b30d1939SAndy Fiddaman 475*b30d1939SAndy Fiddamanunset n 476*b30d1939SAndy Fiddamanif n=$(FPATH=$PWD PATH=$PWD:$PATH $SHELL 2> /dev/null -c 'A_t a; print ${a.b.n}') 477*b30d1939SAndy Fiddamanthen (( n==5 )) || err_exit 'dynamic loading of types gives wrong result' 478*b30d1939SAndy Fiddamanelse err_exit 'unable to load types dynamically' 479*b30d1939SAndy Fiddamanfi 480*b30d1939SAndy Fiddaman 481*b30d1939SAndy Fiddaman# check that typeset -T reproduces a type. 482*b30d1939SAndy Fiddamanif $SHELL > /dev/null 2>&1 -c 'typeset -T' 483*b30d1939SAndy Fiddamanthen $SHELL > junk1 <<- \+++EOF 484*b30d1939SAndy Fiddaman typeset -T foo_t=( 485*b30d1939SAndy Fiddaman integer x=3 y=4 486*b30d1939SAndy Fiddaman float z=1.2 487*b30d1939SAndy Fiddaman len() 488*b30d1939SAndy Fiddaman { 489*b30d1939SAndy Fiddaman ((.sh.value=sqrt(_.x**2 + _.y**2) )) 490*b30d1939SAndy Fiddaman } 491*b30d1939SAndy Fiddaman function count 492*b30d1939SAndy Fiddaman { 493*b30d1939SAndy Fiddaman print z=$z 494*b30d1939SAndy Fiddaman } 495*b30d1939SAndy Fiddaman ) 496*b30d1939SAndy Fiddaman typeset -T 497*b30d1939SAndy Fiddaman print 'typeset -T' 498*b30d1939SAndy Fiddaman +++EOF 499*b30d1939SAndy Fiddaman $SHELL -c '. ./junk1;print "typeset -T"' > junk2 500*b30d1939SAndy Fiddaman diff junk[12] > /dev/null || err_exit 'typeset -T not idempotent' 501*b30d1939SAndy Fiddaman $SHELL -c '. ./junk1;print "typeset +f"' > junk2 502*b30d1939SAndy Fiddaman [[ -s junk2 ]] || err_exit 'non-discipline-method functions found' 503*b30d1939SAndy Fiddamanelse 504*b30d1939SAndy Fiddaman err_exit 'typeset -T not supported' 505*b30d1939SAndy Fiddamanfi 506*b30d1939SAndy Fiddaman 507*b30d1939SAndy Fiddaman[[ $($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' 508*b30d1939SAndy Fiddaman 509*b30d1939SAndy Fiddaman[[ $($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' 510*b30d1939SAndy Fiddaman 511*b30d1939SAndy Fiddaman 512*b30d1939SAndy Fiddaman{ $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 513*b30d1939SAndy Fiddamanexitval=$? 514*b30d1939SAndy Fiddamanif [[ $(kill -l $exitval) == TERM ]] 515*b30d1939SAndy Fiddamanthen err_exit 'clone of multi-dimensional array timed out' 516*b30d1939SAndy Fiddamanelif ((exitval)) 517*b30d1939SAndy Fiddamanthen err_exit "c.i and c.j are not the same multi-dimensional array" 518*b30d1939SAndy Fiddamanfi 519*b30d1939SAndy Fiddaman 520*b30d1939SAndy Fiddamantypeset -T foobar_t=( 521*b30d1939SAndy Fiddaman float x=1 y=0 522*b30d1939SAndy Fiddaman slen() 523*b30d1939SAndy Fiddaman { 524*b30d1939SAndy Fiddaman print -r -- $((sqrt(_.x**2 + _.y**2))) 525*b30d1939SAndy Fiddaman } 526*b30d1939SAndy Fiddaman typeset -fS slen 527*b30d1939SAndy Fiddaman len() 528*b30d1939SAndy Fiddaman { 529*b30d1939SAndy Fiddaman print -r -- $((sqrt(_.x**2 + _.y**2))) 530*b30d1939SAndy Fiddaman } 531*b30d1939SAndy Fiddaman) 532*b30d1939SAndy Fiddamanunset z 533*b30d1939SAndy Fiddamanfoobar_t z=(x=3 y=4) 534*b30d1939SAndy Fiddaman(( z.len == 5 )) || err_exit 'z.len should be 5' 535*b30d1939SAndy Fiddaman(( z.slen == 1 )) || err_exit 'z.slen should be 1' 536*b30d1939SAndy Fiddaman(( .sh.type.foobar_t.slen == 1 )) || err_exit '.sh.type.foobar_t.slen should be 1' 537*b30d1939SAndy Fiddaman(( .sh.type.foobar_t.len == 1 )) || err_exit '.sh.type.foobar_t.len should be 1' 538*b30d1939SAndy Fiddaman 539*b30d1939SAndy Fiddamantypeset -T z_t=( typeset -a ce ) 540*b30d1939SAndy Fiddamanz_t x1 541*b30d1939SAndy Fiddamanx1.ce[3][4]=45 542*b30d1939SAndy Fiddamancompound c 543*b30d1939SAndy Fiddamanz_t -a c.x2 544*b30d1939SAndy Fiddamanc.x2[9]=x1 545*b30d1939SAndy Fiddamangot=$(typeset +p "c.x2[9].ce") 546*b30d1939SAndy Fiddamanexp='typeset -a c.x2[9].ce' 547*b30d1939SAndy Fiddaman[[ $got == "$exp" ]] || err_exit "typeset +p 'c.x2[9].ce' failed -- expected '$exp', got '$got'" 548*b30d1939SAndy Fiddaman 549*b30d1939SAndy Fiddamanunset b 550*b30d1939SAndy Fiddamantypeset -T a_t=( 551*b30d1939SAndy Fiddaman typeset a="hello" 552*b30d1939SAndy Fiddaman) 553*b30d1939SAndy Fiddamantypeset -T b_t=( 554*b30d1939SAndy Fiddaman a_t b 555*b30d1939SAndy Fiddaman) 556*b30d1939SAndy Fiddamancompound b 557*b30d1939SAndy Fiddamancompound -a b.ca 558*b30d1939SAndy Fiddamanb_t b.ca[4].b 559*b30d1939SAndy Fiddamanexp='typeset -C b=(typeset -C -a ca=( [4]=(b_t b=(a_t b=(a=hello))));)' 560*b30d1939SAndy Fiddamangot=$(typeset -p b) 561*b30d1939SAndy Fiddaman[[ $got == "$exp" ]] || err_exit 'typeset -p of nested type not correct' 562*b30d1939SAndy Fiddaman 563*b30d1939SAndy Fiddamantypeset -T u_t=( 564*b30d1939SAndy Fiddaman integer dummy 565*b30d1939SAndy Fiddaman unset() 566*b30d1939SAndy Fiddaman { 567*b30d1939SAndy Fiddaman print unset 568*b30d1939SAndy Fiddaman } 569*b30d1939SAndy Fiddaman) 570*b30d1939SAndy Fiddamanunset z 571*b30d1939SAndy Fiddamanu_t -a x | read z 572*b30d1939SAndy Fiddaman[[ $z == unset ]] && err_exit 'unset discipline called on type creation' 573*b30d1939SAndy Fiddaman 574*b30d1939SAndy Fiddaman{ z=$($SHELL 2> /dev/null 'typeset -T foo; typeset -T') ;} 2> /dev/null 575*b30d1939SAndy Fiddaman[[ $z == 'typeset -T foo' ]] || err_exit '"typeset -T foo; typeset -T" failed' 576*b30d1939SAndy Fiddaman 577*b30d1939SAndy Fiddaman{ z=$($SHELL 2> /dev/null 'typeset -T foo=bar; typeset -T') ;} 2> /dev/null 578*b30d1939SAndy Fiddaman[[ $z ]] && err_exit '"typeset -T foo=bar" should not creates type foo' 579*b30d1939SAndy Fiddaman 580*b30d1939SAndy Fiddaman{ 581*b30d1939SAndy Fiddaman$SHELL << \EOF 582*b30d1939SAndy Fiddaman typeset -T board_t=( 583*b30d1939SAndy Fiddaman compound -a board_y 584*b30d1939SAndy Fiddaman function binsert 585*b30d1939SAndy Fiddaman { 586*b30d1939SAndy Fiddaman nameref figure=$1 587*b30d1939SAndy Fiddaman integer y=$2 x=$3 588*b30d1939SAndy Fiddaman typeset -m "_.board_y[y].board_x[x].field=figure" 589*b30d1939SAndy Fiddaman } 590*b30d1939SAndy Fiddaman ) 591*b30d1939SAndy Fiddaman function main 592*b30d1939SAndy Fiddaman { 593*b30d1939SAndy Fiddaman compound c=( 594*b30d1939SAndy Fiddaman board_t b 595*b30d1939SAndy Fiddaman ) 596*b30d1939SAndy Fiddaman for ((i=0 ; i < 2 ; i++ )) ; do 597*b30d1939SAndy Fiddaman compound p=( hello=world ) 598*b30d1939SAndy Fiddaman c.b.binsert p 1 $i 599*b30d1939SAndy Fiddaman done 600*b30d1939SAndy Fiddaman exp='typeset -C c=(board_t b=(typeset -a board_y=( [1]=(typeset -a board_x=( [0]=(field=(hello=world;))[1]=(field=(hello=world)));));))' 601*b30d1939SAndy Fiddaman [[ $(typeset -p c) == "$exp" ]] || exit 1 602*b30d1939SAndy Fiddaman } 603*b30d1939SAndy Fiddaman main 604*b30d1939SAndy FiddamanEOF 605*b30d1939SAndy Fiddaman} 2> /dev/null 606*b30d1939SAndy Fiddamanif (( exitval=$?)) 607*b30d1939SAndy Fiddamanthen if [[ $(kill -l $exitval) == SEGV ]] 608*b30d1939SAndy Fiddaman then err_exit 'typeset -m in type discipline causes exception' 609*b30d1939SAndy Fiddaman else err_exit 'typeset -m in type discipline gives wrong value' 610*b30d1939SAndy Fiddaman fi 611*b30d1939SAndy Fiddamanfi 612*b30d1939SAndy Fiddaman 613*b30d1939SAndy Fiddamantypeset -T pawn_t=( 614*b30d1939SAndy Fiddaman print_debug() 615*b30d1939SAndy Fiddaman { 616*b30d1939SAndy Fiddaman print 'PAWN' 617*b30d1939SAndy Fiddaman } 618*b30d1939SAndy Fiddaman) 619*b30d1939SAndy Fiddamanfunction main 620*b30d1939SAndy Fiddaman{ 621*b30d1939SAndy Fiddaman compound c=( 622*b30d1939SAndy Fiddaman compound -a board 623*b30d1939SAndy Fiddaman ) 624*b30d1939SAndy Fiddaman 625*b30d1939SAndy Fiddaman for ((i=2 ; i < 8 ; i++ )) ; do 626*b30d1939SAndy Fiddaman pawn_t c.board[1][$i] 627*b30d1939SAndy Fiddaman done 628*b30d1939SAndy Fiddaman 629*b30d1939SAndy Fiddaman} 630*b30d1939SAndy Fiddamanmain 2> /dev/null && err_exit 'type assignment to compound array instance should generate an error' 631*b30d1939SAndy Fiddaman 632*b30d1939SAndy Fiddaman{ $SHELL -c 'typeset -T Foo_t=(integer -a data=([0]=0) );Foo_t x=(data[0]=2);((x.data[0]==2))' 633*b30d1939SAndy Fiddaman} 2> /dev/null || err_exit 'type definition with integer array variable not working' 634*b30d1939SAndy Fiddaman 635*b30d1939SAndy Fiddamantypeset -T Bar_t=( 636*b30d1939SAndy Fiddaman typeset -a foo 637*b30d1939SAndy Fiddaman) 638*b30d1939SAndy FiddamanBar_t bar 639*b30d1939SAndy Fiddamanbar.foo+=(bam) 640*b30d1939SAndy Fiddaman[[ ${bar.foo[0]} == bam ]] || err_exit 'appending to empty array variable in type does not create element 0' 641*b30d1939SAndy Fiddaman 642*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125)) 643