1*b30d1939SAndy Fiddaman########################################################################
2*b30d1939SAndy Fiddaman#                                                                      #
3*b30d1939SAndy Fiddaman#               This software is part of the ast package               #
4*b30d1939SAndy Fiddaman#          Copyright (c) 1982-2012 AT&T Intellectual Property          #
5*b30d1939SAndy Fiddaman#                      and is licensed under the                       #
6*b30d1939SAndy Fiddaman#                 Eclipse Public License, Version 1.0                  #
7*b30d1939SAndy Fiddaman#                    by AT&T Intellectual Property                     #
8*b30d1939SAndy Fiddaman#                                                                      #
9*b30d1939SAndy Fiddaman#                A copy of the License is available at                 #
10*b30d1939SAndy Fiddaman#          http://www.eclipse.org/org/documents/epl-v10.html           #
11*b30d1939SAndy Fiddaman#         (with md5 checksum b35adb5213ca9657e911e9befb180842)         #
12*b30d1939SAndy Fiddaman#                                                                      #
13*b30d1939SAndy Fiddaman#              Information and Software Systems Research               #
14*b30d1939SAndy Fiddaman#                            AT&T Research                             #
15*b30d1939SAndy Fiddaman#                           Florham Park NJ                            #
16*b30d1939SAndy Fiddaman#                                                                      #
17*b30d1939SAndy Fiddaman#                  David Korn <dgk@research.att.com>                   #
18*b30d1939SAndy Fiddaman#                                                                      #
19*b30d1939SAndy Fiddaman########################################################################
20*b30d1939SAndy Fiddamanfunction err_exit
21*b30d1939SAndy Fiddaman{
22*b30d1939SAndy Fiddaman	print -u2 -n "\t"
23*b30d1939SAndy Fiddaman	print -u2 -r ${Command}[$1]: "${@:2}"
24*b30d1939SAndy Fiddaman	let Errors+=1
25*b30d1939SAndy Fiddaman}
26*b30d1939SAndy Fiddamanalias err_exit='err_exit $LINENO'
27*b30d1939SAndy Fiddaman
28*b30d1939SAndy FiddamanCommand=${0##*/}
29*b30d1939SAndy Fiddamaninteger Errors=0
30*b30d1939SAndy Fiddaman
31*b30d1939SAndy Fiddamanunset LANG ${!LC_*}
32*b30d1939SAndy Fiddaman
33*b30d1939SAndy Fiddamantmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
34*b30d1939SAndy Fiddamantrap "cd /; rm -rf $tmp" EXIT
35*b30d1939SAndy Fiddamancd $tmp || exit
36*b30d1939SAndy Fiddaman
37*b30d1939SAndy Fiddamana=$($SHELL -c '/' 2>&1 | sed -e "s,.*: *,," -e "s, *\[.*,,")
38*b30d1939SAndy Fiddamanb=$($SHELL -c '(LC_ALL=debug / 2>/dev/null); /' 2>&1 | sed -e "s,.*: *,," -e "s, *\[.*,,")
39*b30d1939SAndy Fiddaman[[ "$b" == "$a" ]] || err_exit "locale not restored after subshell -- expected '$a', got '$b'"
40*b30d1939SAndy Fiddamanb=$($SHELL -c '(LC_ALL=debug; / 2>/dev/null); /' 2>&1 | sed -e "s,.*: *,," -e "s, *\[.*,,")
41*b30d1939SAndy Fiddaman[[ "$b" == "$a" ]] || err_exit "locale not restored after subshell -- expected '$a', got '$b'"
42*b30d1939SAndy Fiddaman
43*b30d1939SAndy Fiddaman# test shift-jis \x81\x40 ... \x81\x7E encodings
44*b30d1939SAndy Fiddaman# (shift char followed by 7 bit ascii)
45*b30d1939SAndy Fiddaman
46*b30d1939SAndy Fiddamantypeset -i16 chr
47*b30d1939SAndy Fiddamanfor locale in $(PATH=/bin:/usr/bin locale -a 2>/dev/null | grep -i jis)
48*b30d1939SAndy Fiddamando	export LC_ALL=$locale
49*b30d1939SAndy Fiddaman	for ((chr=0x40; chr<=0x7E; chr++))
50*b30d1939SAndy Fiddaman	do	c=${chr#16#}
51*b30d1939SAndy Fiddaman		for s in \\x81\\x$c \\x$c
52*b30d1939SAndy Fiddaman		do	b="$(printf "$s")"
53*b30d1939SAndy Fiddaman			eval n=\$\'$s\'
54*b30d1939SAndy Fiddaman			[[ $b == "$n" ]] || err_exit "LC_ALL=$locale printf difference for \"$s\" -- expected '$n', got '$b'"
55*b30d1939SAndy Fiddaman			u=$(print -- $b)
56*b30d1939SAndy Fiddaman			q=$(print -- "$b")
57*b30d1939SAndy Fiddaman			[[ $u == "$q" ]] || err_exit "LC_ALL=$locale quoted print difference for \"$s\" -- $b => '$u' vs \"$b\" => '$q'"
58*b30d1939SAndy Fiddaman		done
59*b30d1939SAndy Fiddaman	done
60*b30d1939SAndy Fiddamandone
61*b30d1939SAndy Fiddaman
62*b30d1939SAndy Fiddaman# this locale is supported by ast on all platforms
63*b30d1939SAndy Fiddaman# EU for { decimal_point="," thousands_sep="." }
64*b30d1939SAndy Fiddaman
65*b30d1939SAndy Fiddamanlocale=C_EU.UTF-8
66*b30d1939SAndy Fiddaman
67*b30d1939SAndy Fiddamanexport LC_ALL=C
68*b30d1939SAndy Fiddaman
69*b30d1939SAndy Fiddaman# test multibyte value/trace format -- $'\303\274' is UTF-8 u-umlaut
70*b30d1939SAndy Fiddaman
71*b30d1939SAndy Fiddamanc=$(LC_ALL=C $SHELL -c "printf $':%2s:\n' $'\303\274'")
72*b30d1939SAndy Fiddamanu=$(LC_ALL=$locale $SHELL -c "printf $':%2s:\n' $'\303\274'" 2>/dev/null)
73*b30d1939SAndy Fiddamanif	[[ "$c" != "$u" ]]
74*b30d1939SAndy Fiddamanthen	LC_ALL=$locale
75*b30d1939SAndy Fiddaman	x=$'+2+ typeset item.text\
76*b30d1939SAndy Fiddaman+3+ item.text=\303\274\
77*b30d1939SAndy Fiddaman+4+ print -- \303\274\
78*b30d1939SAndy Fiddaman\303\274\
79*b30d1939SAndy Fiddaman+5+ eval $\'arr[0]=(\\n\\ttext=\\303\\274\\n)\'
80*b30d1939SAndy Fiddaman+2+ arr[0].text=ü\
81*b30d1939SAndy Fiddaman+6+ print -- \303\274\
82*b30d1939SAndy Fiddamanü\
83*b30d1939SAndy Fiddaman+7+ eval txt=$\'(\\n\\ttext=\\303\\274\\n)\'
84*b30d1939SAndy Fiddaman+2+ txt.text=\303\274\
85*b30d1939SAndy Fiddaman+8+ print -- \'(\' text=$\'\\303\\274\' \')\'\
86*b30d1939SAndy Fiddaman( text=\303\274 )'
87*b30d1939SAndy Fiddaman	u=$(LC_ALL=$locale PS4='+$LINENO+ ' $SHELL -x -c "
88*b30d1939SAndy Fiddaman		item=(typeset text)
89*b30d1939SAndy Fiddaman		item.text=$'\303\274'
90*b30d1939SAndy Fiddaman		print -- \"\${item.text}\"
91*b30d1939SAndy Fiddaman		eval \"arr[0]=\$item\"
92*b30d1939SAndy Fiddaman		print -- \"\${arr[0].text}\"
93*b30d1939SAndy Fiddaman		eval \"txt=\${arr[0]}\"
94*b30d1939SAndy Fiddaman		print -- \$txt
95*b30d1939SAndy Fiddaman	" 2>&1)
96*b30d1939SAndy Fiddaman	[[ "$u" == "$x" ]] || err_exit LC_ALL=$locale multibyte value/trace format failed
97*b30d1939SAndy Fiddaman
98*b30d1939SAndy Fiddaman	x=$'00fc\n20ac'
99*b30d1939SAndy Fiddaman	u=$(LC_ALL=$locale $SHELL -c $'printf "%04x\n" \$\'\"\303\274\"\' \$\'\"\xE2\x82\xAC\"\'')
100*b30d1939SAndy Fiddaman	[[ $u == $x ]] || err_exit LC_ALL=$locale multibyte %04x printf format failed
101*b30d1939SAndy Fiddamanfi
102*b30d1939SAndy Fiddaman
103*b30d1939SAndy Fiddamanif	(( $($SHELL -c $'export LC_ALL='$locale$'; print -r "\342\202\254\342\202\254\342\202\254\342\202\254w\342\202\254\342\202\254\342\202\254\342\202\254" | wc -m' 2>/dev/null) == 10 ))
104*b30d1939SAndy Fiddamanthen	LC_ALL=$locale $SHELL -c b1=$'"\342\202\254\342\202\254\342\202\254\342\202\254w\342\202\254\342\202\254\342\202\254\342\202\254"; [[ ${b1:4:1} == w ]]' || err_exit 'multibyte ${var:offset:len} not working correctly'
105*b30d1939SAndy Fiddamanfi
106*b30d1939SAndy Fiddaman
107*b30d1939SAndy Fiddaman#$SHELL -c 'export LANG='$locale'; printf "\u[20ac]\u[20ac]" > $tmp/two_euro_chars.txt'
108*b30d1939SAndy Fiddamanprintf $'\342\202\254\342\202\254' > $tmp/two_euro_chars.txt
109*b30d1939SAndy Fiddamanexp="6 2 6"
110*b30d1939SAndy Fiddamanset -- $($SHELL -c "
111*b30d1939SAndy Fiddaman	unset LC_CTYPE
112*b30d1939SAndy Fiddaman	export LANG=$locale
113*b30d1939SAndy Fiddaman	export LC_ALL=C
114*b30d1939SAndy Fiddaman	command wc -C < $tmp/two_euro_chars.txt
115*b30d1939SAndy Fiddaman	unset LC_ALL
116*b30d1939SAndy Fiddaman	command wc -C < $tmp/two_euro_chars.txt
117*b30d1939SAndy Fiddaman	export LC_ALL=C
118*b30d1939SAndy Fiddaman	command wc -C < $tmp/two_euro_chars.txt
119*b30d1939SAndy Fiddaman")
120*b30d1939SAndy Fiddamangot=$*
121*b30d1939SAndy Fiddaman[[ $got == $exp ]] || err_exit "command wc LC_ALL default failed -- expected '$exp', got '$got'"
122*b30d1939SAndy Fiddamanset -- $($SHELL -c "
123*b30d1939SAndy Fiddaman	if	builtin wc 2>/dev/null || builtin -f cmd wc 2>/dev/null
124*b30d1939SAndy Fiddaman	then	unset LC_CTYPE
125*b30d1939SAndy Fiddaman		export LANG=$locale
126*b30d1939SAndy Fiddaman		export LC_ALL=C
127*b30d1939SAndy Fiddaman		wc -C < $tmp/two_euro_chars.txt
128*b30d1939SAndy Fiddaman		unset LC_ALL
129*b30d1939SAndy Fiddaman		wc -C < $tmp/two_euro_chars.txt
130*b30d1939SAndy Fiddaman		export LC_ALL=C
131*b30d1939SAndy Fiddaman		wc -C < $tmp/two_euro_chars.txt
132*b30d1939SAndy Fiddaman	fi
133*b30d1939SAndy Fiddaman")
134*b30d1939SAndy Fiddamangot=$*
135*b30d1939SAndy Fiddaman[[ $got == $exp ]] || err_exit "builtin wc LC_ALL default failed -- expected '$exp', got '$got'"
136*b30d1939SAndy Fiddaman
137*b30d1939SAndy Fiddaman# multibyte char straddling buffer boundary
138*b30d1939SAndy Fiddaman
139*b30d1939SAndy Fiddaman{
140*b30d1939SAndy Fiddaman	unset i
141*b30d1939SAndy Fiddaman	integer i
142*b30d1939SAndy Fiddaman	for ((i = 0; i < 163; i++))
143*b30d1939SAndy Fiddaman	do	print "#234567890123456789012345678901234567890123456789"
144*b30d1939SAndy Fiddaman	done
145*b30d1939SAndy Fiddaman	printf $'%-.*c\n' 15 '#'
146*b30d1939SAndy Fiddaman	for ((i = 0; i < 2; i++))
147*b30d1939SAndy Fiddaman	do	print $': "\xe5\xae\x9f\xe8\xa1\x8c\xe6\xa9\x9f\xe8\x83\xbd\xe3\x82\x92\xe8\xa1\xa8\xe7\xa4\xba\xe3\x81\x97\xe3\x81\xbe\xe3\x81\x99\xe3\x80\x82" :'
148*b30d1939SAndy Fiddaman	done
149*b30d1939SAndy Fiddaman} > ko.dat
150*b30d1939SAndy Fiddaman
151*b30d1939SAndy FiddamanLC_ALL=$locale $SHELL < ko.dat 2> /dev/null || err_exit "script with multibyte char straddling buffer boundary fails"
152*b30d1939SAndy Fiddaman
153*b30d1939SAndy Fiddaman#	exp	LC_ALL		LC_NUMERIC	LANG
154*b30d1939SAndy Fiddamanset -- \
155*b30d1939SAndy Fiddaman	2,5	$locale		C		''		\
156*b30d1939SAndy Fiddaman	2.5	C		$locale		''		\
157*b30d1939SAndy Fiddaman	2,5	$locale		''		C		\
158*b30d1939SAndy Fiddaman	2,5	''		$locale		C		\
159*b30d1939SAndy Fiddaman	2.5	C		''		$locale		\
160*b30d1939SAndy Fiddaman	2.5	''		C		$locale		\
161*b30d1939SAndy Fiddaman
162*b30d1939SAndy Fiddamanunset a b c
163*b30d1939SAndy Fiddamanunset LC_ALL LC_NUMERIC LANG
164*b30d1939SAndy Fiddamaninteger a b c
165*b30d1939SAndy Fiddamanwhile	(( $# >= 4 ))
166*b30d1939SAndy Fiddamando	exp=$1
167*b30d1939SAndy Fiddaman	unset H V
168*b30d1939SAndy Fiddaman	typeset -A H
169*b30d1939SAndy Fiddaman	typeset -a V
170*b30d1939SAndy Fiddaman	[[ $2 ]] && V[0]="export LC_ALL=$2;"
171*b30d1939SAndy Fiddaman	[[ $3 ]] && V[1]="export LC_NUMERIC=$3;"
172*b30d1939SAndy Fiddaman	[[ $4 ]] && V[2]="export LANG=$4;"
173*b30d1939SAndy Fiddaman	for ((a = 0; a < 3; a++))
174*b30d1939SAndy Fiddaman	do	for ((b = 0; b < 3; b++))
175*b30d1939SAndy Fiddaman		do	if	(( b != a ))
176*b30d1939SAndy Fiddaman			then	for ((c = 0; c < 3; c++))
177*b30d1939SAndy Fiddaman				do	if	(( c != a && c != b ))
178*b30d1939SAndy Fiddaman					then	T=${V[$a]}${V[$b]}${V[$c]}
179*b30d1939SAndy Fiddaman						if	[[ ! ${H[$T]} ]]
180*b30d1939SAndy Fiddaman						then	H[$T]=1
181*b30d1939SAndy Fiddaman							got=$($SHELL -c "${T}print \$(( $exp ))" 2>&1)
182*b30d1939SAndy Fiddaman							[[ $got == $exp ]] || err_exit "${T} sequence failed -- expected '$exp', got '$got'"
183*b30d1939SAndy Fiddaman						fi
184*b30d1939SAndy Fiddaman					fi
185*b30d1939SAndy Fiddaman				done
186*b30d1939SAndy Fiddaman			fi
187*b30d1939SAndy Fiddaman		done
188*b30d1939SAndy Fiddaman	done
189*b30d1939SAndy Fiddaman	shift 4
190*b30d1939SAndy Fiddamandone
191*b30d1939SAndy Fiddaman
192*b30d1939SAndy Fiddaman# setocale(LC_ALL,"") after setlocale() initialization
193*b30d1939SAndy Fiddaman
194*b30d1939SAndy Fiddamanprintf 'f1\357\274\240f2\n' > input1
195*b30d1939SAndy Fiddamanprintf 't2\357\274\240f1\n' > input2
196*b30d1939SAndy Fiddamanprintf '\357\274\240\n' > delim
197*b30d1939SAndy Fiddamanprint "export LC_ALL=$locale
198*b30d1939SAndy Fiddamanjoin -j1 1 -j2 2 -o 1.1 -t \$(cat delim) input1 input2 > out" > script
199*b30d1939SAndy Fiddaman$SHELL -c 'unset LANG ${!LC_*}; $SHELL ./script' ||
200*b30d1939SAndy Fiddamanerr_exit "join test script failed -- exit code $?"
201*b30d1939SAndy Fiddamanexp="f1"
202*b30d1939SAndy Fiddamangot="$(<out)"
203*b30d1939SAndy Fiddaman[[ $got == "$exp" ]] || err_exit "LC_ALL test script failed -- expected '$exp', got '$got'"
204*b30d1939SAndy Fiddaman
205*b30d1939SAndy Fiddaman# multibyte identifiers
206*b30d1939SAndy Fiddaman
207*b30d1939SAndy Fiddamanexp=OK
208*b30d1939SAndy Fiddamangot=$(LC_ALL=C.UTF-8 $SHELL -c $'\u[5929]=OK; print ${\u[5929]}' 2>&1)
209*b30d1939SAndy Fiddaman[[ $got == "$exp" ]] || err_exit "multibyte variable definition/expansion failed -- expected '$exp', got '$got'"
210*b30d1939SAndy Fiddamangot=$(LC_ALL=C.UTF-8 $SHELL -c $'function \u[5929]\n{\nprint OK;\n}; \u[5929]' 2>&1)
211*b30d1939SAndy Fiddaman[[ $got == "$exp" ]] || err_exit "multibyte ksh function definition/execution failed -- expected '$exp', got '$got'"
212*b30d1939SAndy Fiddamangot=$(LC_ALL=C.UTF-8 $SHELL -c $'\u[5929]()\n{\nprint OK;\n}; \u[5929]' 2>&1)
213*b30d1939SAndy Fiddaman[[ $got == "$exp" ]] || err_exit "multibyte posix function definition/execution failed -- expected '$exp', got '$got'"
214*b30d1939SAndy Fiddaman
215*b30d1939SAndy Fiddaman# this locale is supported by ast on all platforms
216*b30d1939SAndy Fiddaman# mainly used to debug multibyte and message translation code
217*b30d1939SAndy Fiddaman# however wctype is not supported but that's ok for these tests
218*b30d1939SAndy Fiddaman
219*b30d1939SAndy Fiddamanlocale=debug
220*b30d1939SAndy Fiddaman
221*b30d1939SAndy Fiddamanif	[[ "$(LC_ALL=$locale $SHELL <<- \+EOF+
222*b30d1939SAndy Fiddaman		x=a<1z>b<2yx>c
223*b30d1939SAndy Fiddaman		print ${#x}
224*b30d1939SAndy Fiddaman		+EOF+)" != 5
225*b30d1939SAndy Fiddaman	]]
226*b30d1939SAndy Fiddamanthen	err_exit '${#x} not working with multibyte locales'
227*b30d1939SAndy Fiddamanfi
228*b30d1939SAndy Fiddaman
229*b30d1939SAndy Fiddamandir=_not_found_
230*b30d1939SAndy Fiddamanexp=2
231*b30d1939SAndy Fiddamanfor cmd in \
232*b30d1939SAndy Fiddaman	"cd $dir; export LC_ALL=debug; cd $dir" \
233*b30d1939SAndy Fiddaman	"cd $dir; LC_ALL=debug cd $dir" \
234*b30d1939SAndy Fiddaman
235*b30d1939SAndy Fiddamando	got=$($SHELL -c "$cmd" 2>&1 | sort -u | wc -l)
236*b30d1939SAndy Fiddaman	(( ${got:-0} == $exp )) || err_exit "'$cmd' sequence failed -- error message not localized"
237*b30d1939SAndy Fiddamandone
238*b30d1939SAndy Fiddamanexp=121
239*b30d1939SAndy Fiddamanfor lc in LANG LC_MESSAGES LC_ALL
240*b30d1939SAndy Fiddamando	for cmd in "($lc=$locale;cd $dir)" "$lc=$locale;cd $dir;unset $lc" "function tst { typeset $lc=$locale;cd $dir; }; tst"
241*b30d1939SAndy Fiddaman	do	tst="$lc=C;cd $dir;$cmd;cd $dir;:"
242*b30d1939SAndy Fiddaman		$SHELL -c "unset LANG \${!LC_*}; $SHELL -c '$tst'" > out 2>&1 ||
243*b30d1939SAndy Fiddaman		err_exit "'$tst' failed -- exit status $?"
244*b30d1939SAndy Fiddaman		integer id=0
245*b30d1939SAndy Fiddaman		unset msg
246*b30d1939SAndy Fiddaman		typeset -A msg
247*b30d1939SAndy Fiddaman		got=
248*b30d1939SAndy Fiddaman		while	read -r line
249*b30d1939SAndy Fiddaman		do	line=${line##*:}
250*b30d1939SAndy Fiddaman			if	[[ ! ${msg[$line]} ]]
251*b30d1939SAndy Fiddaman			then	msg[$line]=$((++id))
252*b30d1939SAndy Fiddaman			fi
253*b30d1939SAndy Fiddaman			got+=${msg[$line]}
254*b30d1939SAndy Fiddaman		done < out
255*b30d1939SAndy Fiddaman		[[ $got == $exp ]] || err_exit "'$tst' failed -- expected '$exp', got '$got'"
256*b30d1939SAndy Fiddaman	done
257*b30d1939SAndy Fiddamandone
258*b30d1939SAndy Fiddaman
259*b30d1939SAndy Fiddamanexp=123
260*b30d1939SAndy Fiddamangot=$(LC_ALL=debug $SHELL -c "a<2A@>z=$exp; print \$a<2A@>z")
261*b30d1939SAndy Fiddaman[[ $got == $exp ]] || err_exit "multibyte debug locale \$a<2A@>z failed -- expected '$exp', got '$got'"
262*b30d1939SAndy Fiddaman
263*b30d1939SAndy Fiddamanunset LC_ALL LC_MESSAGES
264*b30d1939SAndy Fiddamanexport LANG=debug
265*b30d1939SAndy Fiddamanfunction message
266*b30d1939SAndy Fiddaman{
267*b30d1939SAndy Fiddaman        print -r $"An error occurred."
268*b30d1939SAndy Fiddaman}
269*b30d1939SAndy Fiddamanexp=$'(libshell,3,46)\nAn error occurred.\n(libshell,3,46)'
270*b30d1939SAndy Fiddamanalt=$'(debug,message,libshell,An error occurred.)\nAn error occurred.\n(debug,message,libshell,An error occurred.)'
271*b30d1939SAndy Fiddamangot=$(message; LANG=C message; message)
272*b30d1939SAndy Fiddaman[[ $got == "$exp" || $got == "$alt" ]] || {
273*b30d1939SAndy Fiddaman	EXP=$(printf %q "$exp")
274*b30d1939SAndy Fiddaman	ALT=$(printf %q "$alt")
275*b30d1939SAndy Fiddaman	GOT=$(printf %q "$got")
276*b30d1939SAndy Fiddaman	err_exit "LANG change not seen by function -- expected $EXP or $ALT, got $GOT"
277*b30d1939SAndy Fiddaman}
278*b30d1939SAndy Fiddaman
279*b30d1939SAndy Fiddamana_thing=fish
280*b30d1939SAndy Fiddamangot=$(print -r aa$"\\ahello \" /\\${a_thing}/\\"zz)
281*b30d1939SAndy Fiddamanexp='aa(debug,'$Command',libshell,\ahello " /\fish/\)zz'
282*b30d1939SAndy Fiddaman[[ $got == "$exp" ]] || err_exit "$\"...\" containing expansions fails: expected $exp, got $got"
283*b30d1939SAndy Fiddaman
284*b30d1939SAndy Fiddamanexp='(debug,'$Command',libshell,This is a string\n)'
285*b30d1939SAndy Fiddamantypeset got=$"This is a string\n"
286*b30d1939SAndy Fiddaman[[ $got == "$exp" ]] || err_exit "$\"...\" in assignment expansion fails: expected $exp got $got"
287*b30d1939SAndy Fiddaman
288*b30d1939SAndy Fiddamanunset LANG
289*b30d1939SAndy Fiddaman
290*b30d1939SAndy FiddamanLC_ALL=C
291*b30d1939SAndy Fiddamanx=$"hello"
292*b30d1939SAndy Fiddaman[[ $x == hello ]] || err_exit 'assignment of message strings not working'
293*b30d1939SAndy Fiddaman
294*b30d1939SAndy Fiddaman# tests for multibyte characteer at buffer boundary
295*b30d1939SAndy Fiddaman{
296*b30d1939SAndy Fiddaman	print 'cat << \\EOF'
297*b30d1939SAndy Fiddaman	for ((i=1; i < 164; i++))
298*b30d1939SAndy Fiddaman	do	print 123456789+123456789+123456789+123456789+123456789
299*b30d1939SAndy Fiddaman	done
300*b30d1939SAndy Fiddaman	print $'next character is multibyte<2b|>c<3d|\>foo'
301*b30d1939SAndy Fiddaman	for ((i=1; i < 10; i++))
302*b30d1939SAndy Fiddaman	do	print 123456789+123456789+123456789+123456789+123456789
303*b30d1939SAndy Fiddaman	done
304*b30d1939SAndy Fiddaman	print EOF
305*b30d1939SAndy Fiddaman} > script$$.1
306*b30d1939SAndy Fiddamanchmod +x script$$.1
307*b30d1939SAndy Fiddamanx=$(  LC_ALL=debug $SHELL ./script$$.1)
308*b30d1939SAndy Fiddaman[[ ${#x} == 8641 ]] || err_exit 'here doc contains wrong number of chars with multibyte locale'
309*b30d1939SAndy Fiddaman[[ $x == *$'next character is multibyte<2b|>c<3d|\>foo'* ]] || err_exit "here_doc doesn't contain line with multibyte chars"
310*b30d1939SAndy Fiddaman
311*b30d1939SAndy Fiddaman
312*b30d1939SAndy Fiddamanx=$(LC_ALL=debug $SHELL -c 'x="a<2b|>c";print -r -- ${#x}')
313*b30d1939SAndy Fiddaman(( x == 3  )) || err_exit 'character length of multibyte character should be 3'
314*b30d1939SAndy Fiddamanx=$(LC_ALL=debug $SHELL -c 'typeset -R10 x="a<2b|>c";print -r -- "${x}"')
315*b30d1939SAndy Fiddaman[[ $x == '   a<2b|>c' ]] || err_exit 'typeset -R10 should begin with three spaces'
316*b30d1939SAndy Fiddamanx=$(LC_ALL=debug $SHELL -c 'typeset -L10 x="a<2b|>c";print -r -- "${x}"')
317*b30d1939SAndy Fiddaman[[ $x == 'a<2b|>c   ' ]] || err_exit 'typeset -L10 should end in three spaces'
318*b30d1939SAndy Fiddaman
319*b30d1939SAndy Fiddamanif      $SHELL -c "export LC_ALL=en_US.UTF-8; c=$'\342\202\254'; [[ \${#c} == 1 ]]" 2>/dev/null
320*b30d1939SAndy Fiddamanthen	LC_ALL=en_US.UTF-8
321*b30d1939SAndy Fiddaman	unset i p1 p2 x
322*b30d1939SAndy Fiddaman	for i in 9 b c d 20 1680 2000 2001 2002 2003 2004 2005 2006 2008 2009 200a 2028 2029 3000 # 1803 2007 202f  205f
323*b30d1939SAndy Fiddaman	do	if	! eval "[[ \$'\\u[$i]' == [[:space:]] ]]"
324*b30d1939SAndy Fiddaman		then	x+=,$i
325*b30d1939SAndy Fiddaman		fi
326*b30d1939SAndy Fiddaman	done
327*b30d1939SAndy Fiddaman	if	[[ $x ]]
328*b30d1939SAndy Fiddaman	then	if	[[ $x == ,*,* ]]
329*b30d1939SAndy Fiddaman		then	p1=s p2="are not space characters"
330*b30d1939SAndy Fiddaman		else	p1=  p2="is not a space character"
331*b30d1939SAndy Fiddaman		fi
332*b30d1939SAndy Fiddaman		err_exit "unicode char$p1 ${x#?} $p2 in locale $LC_ALL"
333*b30d1939SAndy Fiddaman	fi
334*b30d1939SAndy Fiddaman	unset x
335*b30d1939SAndy Fiddaman	x=$(printf "hello\u[20ac]\xee world")
336*b30d1939SAndy Fiddaman	[[ $(print -r -- "$x") == $'hello\u[20ac]\xee world' ]] || err_exit '%q with unicode and non-unicode not working'
337*b30d1939SAndy Fiddaman	if	[[ $(whence od) ]]
338*b30d1939SAndy Fiddaman	then	got='68 65 6c 6c 6f e2 82 ac ee 20 77 6f 72 6c 64 0a'
339*b30d1939SAndy Fiddaman		[[ $(print -r -- "$x" | od -An -tx1 | xargs echo) == "$got" ]] || err_exit "incorrect string from printf %q"
340*b30d1939SAndy Fiddaman	fi
341*b30d1939SAndy Fiddaman
342*b30d1939SAndy Fiddamanfi
343*b30d1939SAndy Fiddaman
344*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125))
345*b30d1939SAndy Fiddaman
346