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