Dear Bash Maintainers,
I encountered an issue in Bash and would like to report it. crash2.txt is 
attached to the email. 

Steps to reproduce

$ CC=clang-19 CFLAGS="-fsanitize=address -g -O0" ./configure 
--without-bash-malloc
$ make
$ cat crash2.txt | ./bash 

Expected Behaviour

Any error messages without asan ERROR.

Actual Behaviour

==2054281==ERROR: AddressSanitizer: SEGV on unknown address 0x00009fff7fff (pc 
0x5555556f8b1c bp 0x7fffffff7df0 sp 0x7fffffff7de0 T0)
==2054281==The signal is caused by a READ memory access.
   #0 0x5555556f8b1c in rewind_input_string 
/home/as/projects/bash/up/bash/./parse.y:1816:7
   #1 0x5555558711b3 in parse_string 
/home/as/projects/bash/up/bash/builtins/evalstring.c:729:6
   #2 0x5555556fe39d in xparse_dolparen 
/home/as/projects/bash/up/bash/./parse.y:4738:8
   #3 0x555555789ee2 in extract_command_subst 
/home/as/projects/bash/up/bash/subst.c:1271:13
   #4 0x55555578b175 in extract_delimited_string 
/home/as/projects/bash/up/bash/subst.c:1429:15
   #5 0x55555578b51a in extract_delimited_string 
/home/as/projects/bash/up/bash/subst.c:1449:8
   #6 0x55555578b51a in extract_delimited_string 
/home/as/projects/bash/up/bash/subst.c:1449:8
   #7 0x55555578b5ec in extract_delimited_string 
/home/as/projects/bash/up/bash/subst.c:1459:8
   #8 0x5555557945b2 in skip_matched_pair 
/home/as/projects/bash/up/bash/subst.c:2158:13
   #9 0x5555557930db in skipsubscript 
/home/as/projects/bash/up/bash/subst.c:2186:11
   #10 0x5555557157e4 in assignment 
/home/as/projects/bash/up/bash/general.c:509:11
   #11 0x555555711b33 in token_is_assignment 
/home/as/projects/bash/up/bash/./parse.y:5269:7
   #12 0x55555570a27e in read_token_word 
/home/as/projects/bash/up/bash/./parse.y:5638:15
   #13 0x555555704a1d in read_token 
/home/as/projects/bash/up/bash/./parse.y:3801:12
   #14 0x5555556f8390 in yylex /home/as/projects/bash/up/bash/./parse.y:3068:19
   #15 0x5555556ee897 in yyparse /home/as/projects/bash/up/bash/y.tab.c:1912:16
   #16 0x555555710e41 in parse_comsub 
/home/as/projects/bash/up/bash/./parse.y:4539:7
   #17 0x555555710322 in parse_matched_pair 
/home/as/projects/bash/up/bash/./parse.y:4163:16
   #18 0x555555709f64 in read_token_word 
/home/as/projects/bash/up/bash/./parse.y:5624:11
   #19 0x555555704a1d in read_token 
/home/as/projects/bash/up/bash/./parse.y:3801:12
   #20 0x5555556f8390 in yylex /home/as/projects/bash/up/bash/./parse.y:3068:19
   #21 0x5555556ee897 in yyparse /home/as/projects/bash/up/bash/y.tab.c:1912:16
   #22 0x5555556edd29 in parse_command 
/home/as/projects/bash/up/bash/eval.c:369:7
   #23 0x5555556ed53e in read_command 
/home/as/projects/bash/up/bash/eval.c:414:12
   #24 0x5555556ec9ec in reader_loop 
/home/as/projects/bash/up/bash/eval.c:147:11
   #25 0x5555556e743e in main /home/as/projects/bash/up/bash/shell.c:834:3
   #26 0x7ffff7cac249 in __libc_start_call_main 
csu/../sysdeps/nptl/libc_start_call_main.h:58:16
   #27 0x7ffff7cac304 in __libc_start_main csu/../csu/libc-start.c:360:3
   #28 0x555555606aa0 in _start (/home/as/projects/bash/up/bash/bash+0xb2aa0) 
(BuildId: de2fc7db85184fa111505879caea6faa2d9470c4)
==2054281==Register values:
rax = 0x000000001fffffff  rbx = 0x00007fffffff7fe0  rcx = 0x00005555563c5820  
rdx = 0x000000000000013b  
rdi = 0x00007ffff78dc050  rsi = 0x00007ffff78dc0d0  rbp = 0x00007fffffff7df0  
rsp = 0x00007fffffff7de0  
r8 = 0x0000000000000020   r9 = 0x0000524000054000  r10 = 0x00007fffffffff01  
r11 = 0x22901ec408173e01  
r12 = 0x0000000000000000  r13 = 0x00007fffffffde98  r14 = 0x0000555555a1afd0  
r15 = 0x00007ffff7ffd020  
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV /home/as/projects/bash/up/bash/./parse.y:1816:7 
in rewind_input_string
==2054281==ABORTING

Additional Notes

The reason of the fault is trying to dereference string field which is nullptr:
 
void
rewind_input_string ()
{
     int xchars;
     /* number of unconsumed characters in the input -- XXX need to take 
newlines
    into account, e.g., $(...\n) */
    xchars = shell_input_line_len - shell_input_line_index;
-->if (bash_input.location.string[-1] == '\n')
         xchars++;

Suggested Solution

Add extra check in conditional statement:

if (!bash_input.location.string && bash_input.location.string[-1] == '\n')


Bash Version

as@astra:~/projects/bash/up/bash$ ./bashversion 
5.3.0(1)-rc1

Also, the behaviour is repeating on release bash 5.2 version.

System Info

Linux astra 6.1.90-1-generic #astra2+ci15 SMP PREEMPT_DYNAMIC Tue Jul 23 
09:49:19 MSK 2024 x86_64 GNU/Linux
Debian clang version 19.1.1 
(++20241001124028+d401987fe349-1~exp1~20241001124040.50) 
Target: x86_64-pc-linux-gnu 
Thread model: posix 
InstalledDir: /usr/lib/llvm-19/bin

Attached file you can download from https://dropmefiles.com/deEbb. Or just see 
attaches to the message.
aá;ray[%(( 1001 - $( ec5 &
sleep&3 .arranty of
#  #نk >&-9::::p 5 &
sle 5 &
sleep #   Thim is free software: you can redistribute it and/or modify
#$  it under the terms of the GNU Geneposix interp 217 introduced in  by
#   the Free S echo f: ${Tuntion, either very
array[$(( $( echo -n 1001 ) - t your option) any later version.
#
#   This program is distributed in the hope thaa&3 .>&-3 .>&-9::::t it will 
be useful,
B   buv WITHOUT ANY WARRANTY; without even th[ implied ÿÿÿanty of
#  #نarray[0]'
arraaaaaaaaaaaaaaaaying cÿs -- problem E.  See the
#   GNU General Public License for more details.
##   You shoulÿÿÿve receLved a copy oÿthe GNU General Public License
#   along with this profram.  If not, see <http://www.gnu.org/licenses/>.
#
# problems with fix f‚r ral Publi#   This program is free software: you can 
redistribute it and/oU modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either ve€sionf the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU GeneralPublic License fected (error token i   You should have received 
a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
set +o posix
declare -i iv jv

iv=$(( 3 + 5 * 32 ))
echo $iv
iv=iv+3
echo $iv
iv=2
jv=iv

let "jv *= 2"
echo $jv
jv=$(( $jv << 2 ))
echo $jv

let jv="$jv / 2"
echo $jv
jv="jv >> 2"
echo $jv

iv=$((iv+¥¥¥¥€¥¥¥¥¥¥¥¥0 ô $jv))
echo $iv
echo $((iv -= jv))
echo $iv
echo $(( iv == jv ))
echo $(( iv != $jv ))
echo $(( iv < j” ))
echo $(( $iv > $jv ))
echo $(( iv <= $jv ))
echo $(( $iv >= jv ))

echo $jv
echo $(( ~$& 0 )jv ))
echo $(( ~1 ))
echo $(( ! 0 ))

echo $(( jv % 2 ))
echo $(( $iXa;4E&&31#   This prpgram is free software: you can redistribute it 
and/or modify
#   it under the#   terms of the GNUdGeneral Public License 
asssssssssssssssssssss$'\x{X'
rby
#   the Free Software Foundation, either version 3 of the License, o  (at your 
option) a
echo $?

time time -p

[[ ab/../ == @(??)/..$( #(?(/) ]] &later version.
##   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PAR\ICULAR PURPOSE.  See the
#   GNU General Public Licenecho $?

!
echtails.
#
#   You should have received a copy of the GNU GeneraPublic License
#   along wi\nuseser %2U\nsys % of the GNU General Public 2S' not, see 
<http://www.gnu. a
echo $?

!
echo $?
org/licenses/>.
#
# Test timed and negated pipelines in ba#   This program is free software: you 
can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free S unary pluoftware Foundation, either version 3 of the License, or
#   (at your ‹ption) anc License as publ#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

# arithmetic operators for conditional commands and arithmetic commands

declare -A assoc
declare -a index

key='x],b[$(echo uname >&2)'
key1=']'
key2='` echo >&2 foo`'
key3='~'
key4='7<(4+2)'
key5='$( ech14' [0x1te)'
key6='Xa;4#   This!program is free software: you can rednstribute it and/or 
modify
#   ot under the terms of the GNU General Public License as published#   This 
program is free software: you can redistribute it and/rr modit under the terms 
of the GNU General Public Licenseas published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is /à²rrrb{
        echoaahe hope that it will be usefl,
#   but WITHOUT ANY WARRANTY; without even the iˆplied warranty of
#   MER(at your option) any latFOR A PARTICULAR PUOPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have Ueceived a copy of the GNU General Public License
#   along wish this program.  If not, see <http://www.gnu.org/licenses/>.
#
. ./test-glue-functions

export LANG=en_US.UTF-8

printf '%s\n' "$(printf '\uff')" | od -b | _intl_n’ž“–…š 
ŒžœšŒõ–‘‹™ßØÚŒ£‘ØßÛØ£Š™“†ß™ž–“߈–™Ø 
ƒß›ßҝ߃ž螆¤%(( 1001 - $( ec5 &
sleep&3 .arranty of
#  #نk MERCHANT>&-9::::p 5 &
sle 5 &
sleep #   Thim is free software: you can redistribute it and/or modify
#$  it under the terms of the GNU Geneposix interp 217 introduced in  by
#   the Free S echo f: ${Tuntion, either very
array[$(( $( echo -n 1001 ) - t your option) any later version.
#
#   This program is distributed in the hope thaa&3 .>&-3 .>&-9::::t it will 
be useful,
#   buv WITHOUT ANY WARRANTY; without even th[ implied ÿÿÿanty of
#  #نarray[0]'
arraaaaaaaaaaaaaaaaying cÿs -- problem E.  See the
#   GNU General Public License for more details.
##   You shoulÿÿÿve receLved a copy oÿthe GNU General Public License
#   along with this profram.  If not, see <http://www.gnu.org/licenses/>.
#
# problems with fix f‚r ral Public Licev„e as publishedbash-4.2

declare -ax arrasion 3 of the License, or
# $jv / 2"
echo $jv
jv="jv >>1001 ))]=1 

echo ${array[0]}
echo ${arra\[@]}

unsecho "$b„i
e=$(Qataa#    prog#   This program is free software: you can redistribute it 
and/or modify
#   nder the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#xpect()
{
        echo expect "$@"
}

expect '<^J^J^J>'
recho $'\n\n\n'

expect '<++^J++>'
f=$'\n'
recho "++$f++"
unset f

z1=$''
expect '<>'
recho "$z1"

ZIFS=$'\n'$'\t'$' '

expect '<^J^I >'
recho "$ZIFS"

expect '<abc>'
recho $'abc'

expect '<^M^[^Gabc>'
recho $'\r\e\aabc'

D=$"hello"," "$"world"

expect '<hello,> <world>'
recho $D

expect '<hello, world>'
recho "$D"

D=$""
expect '<>'
recho "$D"

world=chet

expect '<$hello, world>'
recho \$"hello, world"

expect '<hello, $world>'
recho $"hello, \$world"

expect '<hello, "world">'
recho $"hello, \"world\""

expect '<hello, $"world">'
recho $"hello"', $"world"'

expect '<hello, $"world">'
recho $'hello, $"world"'

expect '<$hello, chet>'
recho \$"hello, $world"

expect '<hello, chet>'
recho $"hello, $world"

z=$'\v\# terrrrrrrrrrr_clo~e,/gn
: {fd=€=dev/null

efd
exec {fd}>&c3o redir€&$fd
exec {fd}>&-

shopt -s farredir}close

: {fd}>>/ddddddddddddddddddd#   This program is free software: you can 
redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either èion 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied wactness
fff()
{
  ed ${TMPDIrranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for recho $'\xA PA'

recho $'\xA Pmore details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# basics
cat <<EOF
a
b
c
EOF
read x <<EOF
a
b
c
# errors 
{
${THIS_SH} -c 'EOF
echo "$x"
read x y <<\EOF
$PS4
EOF
echo "$x"

# empty here-documents
read x <<EOF
EOF
echo "$x"
read x <<\EOF
EOF
echo "$x"
read x <<EOF
$empty
EOF
echo "$x"

# check order and content of multiple here docs
cat << EOF1 << EOF2 
hi
EOF1
e
EOF2

while read line1; do
        read line2 <&3
        echo $line1 - $line2
done <<EOF1 3<<EOF2
one
t
EOF1
alpha
beta
gamma
EOF2


##   This program is free software: you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warrantz of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
unset LC_ALL

ErrorCnt=0
TestCnt=0

  function check_valid_var_name {
    case "${1:?Missing Variable Name}" in
      [!a-zA-Z_]* | *[!a-zA-Z_0-9]* ) return 3;;
    esac
  }
  # get_array_element VariableName ArrayName ArrayElement
  function get_array_element {
    check_valid_var_name "${1:?Missing Variable Name}" || return $?
    check_valid_var_name "${2:?Missing Array Name}" || return $?
    eval "${1}"'="${'"${2}"'["${3:?Missing Array Index}"]}"'
  }
  # unset_array_element VarName ArrayName
  function get_array_element_cnt {
    check_valid_var_name "${1:?Missing Variable Name}" || return $?
    check_valid_var_name "${2:?Missing Array Name}" || return $?
    eval "${1}"'="${#'"${2}"'[@]}"'
  }


function TestCodePage {
    local TargetCharset="${1:?Missing Test charset}"
    local EChar RChar TCnt
    get_array_element_cnt TCnt "${2:?Missing Array Name}"
    for (( x=1 ; x<${TCnt} ; x++ )); do
      get_array_element EChar "${2}"  ${x}
      if [ -n "${EChar}" ]; then
        let TestCnt+=1
        printf -v UVal '\\U%08x' "${x}"
        LC_CTYPE=${TargetCharset} printf -v RChar "${UVal}" 2>/dev/null
        if [ "${EChar}" != "${RChar}" ]; then
          let ErrorCnt+=1
          printf "${TargetCharset}: Error Encoding U+%08X to ${TL} [ \"%q\" != 
\"%q\" ]\n" "${x}" "${EChar}" "${RChar}"
        fi
      fi
    done
}


#for ((x=1;x<255;x++)); do printf ' [0x%04x]=$'\''\%03o'\' $x $x ; [ $(($x%5)) 
= 0 ] && echo; done
fr_FR_ISO_8859_1=(
 [0x0001]=$'\001' [0x0002]=$'\002' [0x0003]=$'\003' [0x0004]=$'\004' 
[0x0005]=$'\005'
 [0x0006]=$'\006' [0x0007]=$'\007' [0x0008]=$'\010' [0x0009]=$'\011' 
[0x000a]=$'\012'
 [0x000b]=$'\013' [0x000c]=$'\014' [0x000d]=$'\015' [0x000e]=$'\016' 
[0x000f]=$'\017'
 [0x0010]=$'\020' [0x0011]=$'\021' [0x0012]=$'\022' [0x0013]=$'\023' 
[0x0014]=$'\024'
 [0x0015]=$'\025' [0x0016]=$'\026' [0x0017]=$'\027' [0x0018]=$'\030' 
[0x0019]=$'\031'
 [0x001a]=$'\032' [0x001b]=$'\033' [0x001c]=$'\034' [0x001d]=$'\035' 
[0x001e]=$'\036'
 [0x001f]=$'\037' [0x0020]=$'\040' [0x0021]=$'\041' [0x0022]=$'\042' 
[0x0023]=$'\043'
 [0x0024]=$'\044' [0x0025]=$'\045' [0x0026]=$'\046' [0x0027]=$'\047' 
[0x0028]=$'\050'
 [0x0029]=$'\051' [0x002a]=$'\052' [0x002b]=$'\053' [0x002c]=$'\054' 
[0x002d]=$'\055'
 [0x002e]=$'\056' [0x002f]=$'\057' [0x0030]=$'\060' [0x0031]=$'\061' 
[0x0032]=$'\062'
 [0x0033]=$'\063' [0x0034]=$'\064' [0x0035]=$'\065' [0x0036]=$'\066' 
[0x0037]=$'\067'
 [0x0038]=$'\070' [0x0039]=$'\071' [0x003a]=$'\072' [0x003b]=$'\073' 
[0x003c]=$'\074'
 [0x003d]=$'\075' [0x003e]=$'\076' [0x003f]=$'\077' [0x0040]=$'\100' 
[0x0041]=$'\101'
 [0x0042]=$'\102' [0x0043]=$'\103' [0x0044]=$'\104' [0x0045]=$'\105' 
[0x0046]=$'\106'
 [0x0047]=$'\107' [0x0048]=$'\110' [0x0049]=$'\111' [0x004a]=$'\112' 
[0x004b]=$'\113'
 [0x004c]=$'\114' [0x004d]=$'\115' [0x004e]=$'\116' [0x004f]=$'\117' 
[0x0050]=$'\120'
 [0x0051]=$'\121' [0x0052]=$'\122' [0x0053]=$'\123' [0x0054]=$'\124' 
[0x0055]=$'\125'
 [0x0056]=$'\126' [0x0057]=$'\127' [0x0058]=$'\130' [0x0059]=$'\131' 
[0x005a]=$'\132'
 [0x005b]=$'\133' [0x005c]=$'\134' [0x005d]=$'\135' [0x005e]=$'\136' 
[0x005f]=$'\137'
 [0x0060]=$'\140' [0x0061]=$'\141' [0x0062]=$'\142' [0x0063]=$'\143' 
[0x0064]=$'\144'
 [0x0065]=$'\145' [0x0066]=$'\146' [0x0067]=$'\147' [0x0068]=$'\150' 
[0x0069]=$'\151'
 [0x006a]=$'\152' [0x006b]=$'\153' [0x006c]=$'\154' [0x006d]=$'\155' 
[0x006e]=$'\156'
 [0x006f]=$'\157' [0x0070]=$'\160' [0x0071]=$'\161' [0x0072]=$'\162' 
[0x0073]=$'\163'
 [0x0074]=$'\164' [0x0075]=$'\165' [0x0076]=$'\166' [0x0077]=$'\167' 
[0x0078]=$'\170'
 [0x0079]=$'\171' [0x007a]=$'\172' [0x007b]=$'\173' [0x007c]=$'\174' 
[0x007d]=$'\175'
 [0x007e]=$'\176' [0x007f]=$'\177' [0x0080]=$'\200' [0x0081]=$'\201' 
[0x0082]=$'\202'
 [0x0083]=$'\203' [0x0084]=$'\204' [0x0085]=$'\205' [0x0086]=$'\206' 
[0x0087]=$'\207'
 [0x0088]=$'\210' [0x0089]=$'\211' [0x008a]=$'\212' [0x008b]=$'\213' 
[0x008c]=$'\214'
 [0x008d]=$'\215' [0x008e]=$'\216' [0x008f]=$'\217' [0x0090]=$'\220' 
[0x0091]=$'\221'
 [0x0092]=$'\222' [0x0093]=$'\223' [0x0094]=$'\224' [0x0095]=$'\225' 
[0x0096]=$'\226'
 [0x0097]=$'\227' [0x0098]=$'\230' [0x0099]=$'\231' [0x009a]=$'\232' 
[0x009b]=$'\233'
 [0x009c]=$'\234' [0x009d]=$'\235' [0x009e]=$'\236' [0x009f]=$'\237' 
[0x00a0]=$'\240'
 [0x00a1]=$'\241' [0x00a2]=$'\242' [0x00a3]=$'\243' [0x00a4]=$'\244' 
[0x00a5]=$'\245'
 [0x00a6]=$'\246' [0x00a7]=$'\247' [0x00a8]=$'\250' [0x00a9]=$'\251' 
[0x00aa]=$'\252'
 [0x00ab]=$'\253' [0x00ac]=$'\254' [0x00ad]=$'\255' [0x00ae]=$'\256' 
[0x00af]=$'\257'
 [0x00b0]=$''''''''''''b1]=$'\261' [0x00b2]=$'\262' [0x00b3]=$'\263' 
[0x00b4]=$'\264'
 [0x00b5]=$'\265' [0x00b6]=$'\266' [0x00b7]=$'\267' [0x00b8]=$'\270' 
[0x00b9]=$'\271'
 [0x0016 ))
eba]=$'\272' [0x00bb]=$'\273' [0x00bc]=$'\274' [0x00bd]=$'\275' [0x00be]=$'\276'
 [0x00bf]=$'\277' [0x00c0]=$'\300' [0x00c1]=$'\301' [0x00c2]=$'\302' 
[0x00c3]=$'\303'
 [0x00c4]=$'\304' [0x00c5]=$'\305' [0x00c6]=$'\306' [0x00c7]=$'\307' 
[0x00c8]=$'\310'
 [0x00c9]=$'\311' [0x00ca]=$'\312' [0x00cb]=$'\313' [0x00cc]=$'\314' 
[0x00cd]=$'\315'
 [0x00ce]=$'\316' [0x00cf]=$'\317' [0x00d0]=$'\320' [0x00d1]=$'\321' 
[0x00d2]=$'\322'
 [0x00d3]=$'\323' [0x00d4]=$'\324' [0x00d5]=$'\325' [0x00d6]=$'\326' 
[0x00d7]=$'\327'
 [0x00d8]=$'\330' [0x00d9]=$'\331' [0x00da]=$'\332' [0x00db]=$'\333' 
[0x00dc]=$'\334'
 [0x00dd]=$'\335' [0x00de]=$'\336' [0x00df]=$'\337' [0x00e0]=$'\340' 
[0x00e1]=$'\341'
 [0x00e2]=$'\342' [0x00e3]=$'\343' [0x00e4]=$'\344' [0x00e5]=$'\345' 
[0x00e6]=$'\346'
 [0x00e7]=$'\347' [0x00e8]=$'\350' [0x00e9]=$'\351' [0x00ea]=$'\352' 
[0x00eb]=$'\353'
 [0x00ec]=$'\354' [0x00ed]=$'\355' [0x00ee]=$'\356' [0x00ef]=$'\357' 
[0x00f0]=$'\360'
 [0x00f1]=$'\361' [0x00f2]=$'\362' [0x00f3]=$'\363' [0x00f4]=$'\364' 
[0x00f5]=$'\365'
 [0x00f6]=$'\366' [0x00f7]=$'\367' [0x00f8]=$'\370' [0x00f9]=$'\371' 
[0x00fa]=$'\372'
 [0x00fb]=$'\373' [0x00fc]=$'\374' [0x00fd]=$'\375' [0x00fe]=$'\376'    
)

# this locale causes problems all over the place
if locale -a | grep -i '^fr_FR\.ISO8859.*1$' >/dev/null ; then
        TestCodePage fr_FR.ISO8859-1 fr_FR_ISO_8859_1
else
        echo "unicode1.sub: warning: you do not have the fr_FR.ISO8859-1 locale 
installed;" >&2
        echo "unicode1.sub: that will cause some of these tests to be skipped." 
>&2
fi

zh_TW_BIG5=(
 [0x00f6]=$'\366' [0x00f7]=$'\367' [0x00f8]=$'\370' [0x00f9]=$'\371' 
[0x00fa]=$'\372'
 [0x00fb]=$'\373' [0x00fc]=$'\374' [0x00fd]=$'\375' [0x00fe]=$'\376'    
)
TestCodePage zh_TW.BIG5 zh_TW_BIG5

jp_JP_SHIFT_JIS=(
  [0x0001]=$'\x01' #  START OF HEADING
  [0x0002]=$'\x02' #  START OF TEXT
  [0x0003]=$'\x03' #  END OF TEXT
  [0x0004]=$'\x04' #  END OF TRANSMISSION
  [0x0005]=$'\x05' #  ENQUIRY
  [0x0006]=$'\x06' #  ACKNOWLEDGE
  [0x0007]=$'\x07' #  BELL
  [0x0008]=$'\x08' #  BACKSPACE
  [0x0009]=$'\x09' #  HORIZONTAL TABULATION
  [0x000A]=$'\x0A' #  LINE FEED
  [0x000B]=$'\x0B' #  VERTICAL TABULATION
  [0x000C]=$'\x0C' #  FORM FEED
  [0x000D]=$'\x0D' #  CARRIAGE RETURN
  [0x000E]=$'\x0E' #  SHIFT OUT
  [0x000F]=$'\x0F' #  SHIFT IN
  [0x0010]=$'\x10' #  DATA LINK ESCAPE
  [0x0011]=$'\x11' #  DEVICE CONTROL ONE
  [0x0012]=$'\x12' #  DEVICE CONTROL TWO
€ÿÿÿx0013]_$'\x13' #  DEVICE CONTROL THREE
  [0x0014]=$'\x14' #  DEVICE CONTROL FOUR
  [0x0015]=$'\x15' #  NEGATIVE ACKNOWLEDGE
  [0x0016]=$'\x16' #``````````````  SYNCHRONOUS IDLE
  [0x0017]=$'\x17' #  END OF TRANSMISSION BLOCK
  [0x0018]=$'\x18' #  CANCEL
  [0x0019]=$'\x19' #  END OF MEDIUM
  [0x001A]=$'\x1A' #  SUBSTITUTE
  [0x001B]=$'\x1B' #  ESCAPE
  [0x001C]=$'\x1C' #  FILE SEPARATOR
  [0x001D]=$'\x1D' #  GROUP SEPARATOR
  [0x001E]=$'\x1E' #  RECORD SEPARATOR
  [0x001F]=$'\x1F' #  UNIT SEPARATOR
  [0x0020]=$'\x20' #  SPACE
  [0x0021]=$'\x21' #  EXCLAMATION MARK
  [0x0022]=$'\x22' #  QUOTATION MARK
  [0x0023]=$'\x23' #  NUMBER SIGN
  [0x0024]=$'\x24' #  DOLLAR SIGN
  [0x0025]=$'\x25' #  PERCENT SIGN
  [0x0026]=$'\x26' #  AMPERSAND
  [0x0027]=$'\x27' #  APOSTROPHE
  [0x0028]=$'\x28' #  LEFT PARENTHESIS
  [0x0029]=$'\x29' #  RIGHT PARENTHESIS
  [0x002A]=$'\x2A' #  ASTERISK
  14' [0x020d]=$'\310\215'
 [0x0[0x002B]=$'\x2B' #  PLUS SIGN
  [0x002C]=$'\x2C' #  COMMA
  [0x002D]=$'\x2D' #  HYPHEN-MINUS
  [0x002E]=$'\x2E' #  FULL STOP
  [0x002F]=$'\x2F' #  SOLIDUS
  [0x0030]=$'\x30' #  DIGIT ZERO
  [0x0031]=$'\x31' #  DIGIT ONE
  [0x0032]=$'\x32' #  DIGIT TWO
  [0x0033]=$'\x33' #  DIGIT THREE
  [0x0034]=$'\x34' #  DIGIT FOUR
  [0x0035]=$'\x35' #  DIGIT FIVE
  [0x0036]=$'\x36' #  DIGIT SIX
  $'\302\224'\x37' #  DIGIT SEVEN
  [0x0038]=$'\x38' #  DIGIT EIGHT
  [0x0039]=$'\x39' #  DIGIT NINE
  [0x003A]=$'\x3A' #  COLON
  [0x003B]=$'\x3B' #  SEMICOLON
  [0x003C]=$'\x3C' #  LESS-THAN SIGN
  [0x003D]=$'\x3D' #  EQUALS SIGN
  [0x003E]=$'\x3E' #  GREATER-THAN SIGN
  [0x003F]=$'\x3F' #  QUESTION MARK
  [0x0040]=$'\x40' #  COMMERCIAL AT
  [0x0041]=$'\x41' #  LATIN CAPITAL LETTER A
  [0x0042]=$'\x42' #  LATIN CAPITAL LETTER B
  [0x0043]=$'\x43' #  LATIN CAPITAL LETTER C
  [0x0044]=$'\x44' #  LATIN CAPITAL LETTER D
  [0x0045]=$'\x45' #  LATIN CAPITAL LETTER E
  [0x0046]=$'\x46' #  LATIN CAPITAL LETTER F
  [0x0047]=$'\x47' #  LATIN CAPITAL$LETTER G
  [0x0048]=$'\x48' #  LATIN CAPITAL LETTER H
  [0x0049]=$'\x49' #  LATIN CAPITAL LETTER I
  [0x004A]=$'\x4A' #  LATIN CAPITAL LETTER J
  [0x004B]=$'\x4B' #  LATIN CAPITAL LETTER K
  [0x004C]=$'\x4C' #  LATIN CAPITAL LETTER L
  [0x004D]=$'\x4D' #  LATIN CAPITAL LETTER M
  [0x004E]=$'\x4E' #  LATIN CAPITAL LETTER N
  [0x004F]=$'\x4F' #  LATIN CAPITAL LETTER O
  [0x0050]=$'\x50' #  LATIN CAPITAL LETTER P
  [0x0051]=$'\x51' #  LATIN CAPITAL LETTER Q
  [0x0052]=$'\x52' #  LATIN CAPITAL LETTER R
  [0x0053]=$'\x53' #  LATIN CAou can redistPITAL LETTER S
  [0x0054]=$'\x54' #  LATIN CAPITAL LEEEEEEEEEEEEEEEEEEEEEEEEE' #  LATIN 
CAPITAL LETTER U
  [0x0056]=$'\x56' #  LATIN CAPITAL LETTER V
  [0x0057]=$'\x57' #  LATIN CAPITAL LETTER W
  [0x0058]=$'\x58' #  LATIN CAPITAL LETTER X
  [0x0059]=$'\x59' #  LATIN CAPITAL LETTER Y
  [0x005A]=$'\x5A' #  LATIN CPITAL LETTER Z
  [0x005B]=$'\x5B' #  LEFT SQUARE BRACKET
  [0x005C]=$'\x5C' #  REVERSE SOLIDUS (YEN SIGN)
  [0x005D]=$'\x5D' #  RIGHT SQUARE BRACKET
  [0x005E]=$'\x5E' #  CIRCUMFLEX ACCENT
  [0x005F]=$'\x5F' #  LOW LINE
  [0x0060]=$'\x60' #  GRAVE ACCENT
  [0x0061]=$'\x61' #  LATIN SMALL LETTER A
  [0x0062]=$'\x62' #  LATIN SMALL LETTER B
  [0x0063]=$'\x63' #  LATIN SMALL LETTER C
  [0x0064]=$'\x64' #  LATIN SMALL LETTER D
  [0x0065]=$'\x65' #  LATIN SMALL LETTER E
  [0x0066]=$'\x66' #  LATIN SMALL LETTER F
  [0x0067]=$'\x67' #  LATIN SMALL LETTER G
  [0x0068]=$'\x68' #  LATIN SMALL LETTER H
  [0x0069]=$'\x69' #  LATIN SMALL LETTER I
  [0x006A]=$'\x6A' #  LATIN SMALL LETTER J
  [0x006B]=$'\x6B' #  LATIN SMALL LETTER K
  [0x006C]=$'\x6C' #  LATIN SMALL LETTER L
  [0x006D]=$'\x6D' #  LATIN SMALL LETTER M
  [0x006E]=$'\x6E' #  LATIN SMALL LETTER N
  [0x006F]=$'\x6F' #  LATIN SMALL LETTER O
  [0x0070]=$'\x70' #  LATIN SMALL LETTER P
  [0x0071]=$'\x71' #  LATIN SMALL LETTER Q
  [0x0072]=$'\x72' #  LATIN SMALL LETTER R
  [0x0073]=$'\x73' #  LATIN SMALL LETTERMALL LETTER T
  [0x0075]=$'\x75' #  LATIN SMALL LETTER U
  [0x0076]=$'\x76' #  LATIN SMALL LETTER V
  [0x0077]=$'\x77' #  LATIN SMALL LETTER W
  [0x0078]=$'\x78' #  LATIN SMALL LETTER X
  [0x0079]=$'\x79' #  LATIN SMALL LETTER Y
  [0„i
e=$(Qataa#    prog#   This program is free software: you can redistribute it 
and/or modify
#   nder the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#xpect()
{
        echo expect "$@"
}

expect '<^J^J^J>'
recho $'\n\n\n'

expect '<++^J++>'
f=$'\n'
recho "++$f++"
unset f

z1=$''
expect '<>'
recho "$z1"

ZIFS=$'\n'$'\t'$' '

expect '<^J^I >'
recho "$ZIFS"

expect '<abc>'
recho $'abc'

expect '<^M^[^Gabc>'
recho $'\r\e\aabc'

D=$"hello"," "$"world"

expect '<hello,> <world>'
recho $D

expect '<hello, world>'
recho "$D"

D=$""
expect '<>'
recho "$D"

world=chet

expect '<$hello, world>'
recho \$"hello, world"

expect '<hello, $world>'
recho $"hello, \$world"

expect '<hello, "world">'
recho $"hello, \"world\""

expect '<hello, $"world">'
recho $"hello"', $"world"'

expect '<hello, $"world">'
recho $'hello, $"world"'

expect '<$hello, chet>'
recho \$"hello, $world"

expect '<hello, chet>'
recho $"hello, $world"

z=$'\v\# terrrrrrrrrrr_clo~e,/gn
: {fd=€=dev/null

efd
exec {fd}>&c3o redir€&$fd
exec {fd}>&-

shopt -s farredir}close

: {fd}>>/ddddddddddddddddddd#   This program is free software: you can 
redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied wactness
fff()
{
  ed ${TMPDIrranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for recho $'\xA PA'

recho $'\xA Pmore details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# basics
cat <<EOF
a
b
c
EOF
read x <<EOF
a
b
c
EOF
echo "$x"
read x y <<\EOF
$PS4
EOF
echo "$x"

# empty here-documents
read x <<EOF
EOecho "$x"
read x <<\EOF
EOF
echo "$x"
read x <<EOF
$empty
EOF
echo "$x"

# check order and content of multiple here docs
cat << EOF1 << EOF2 
hi
EOF1
e
EOF2

while read line1; do
        read line2 <&3
        echo $line1 - $line2
done <<EOF1 3<<EOF2
one
t
EOF1
alpha
beta
gamma
EOF2


##   This program is free software: you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
unset LC_ALL

ErrorCnt=0
TestCnt=0

  function check_valid_var_name {
    case "${1:?Missing Variable Name}" in
      [!a-zA-Z_]* | *[!a-zA-Z_0-9]* ) return 3;;
    esac
  }
  # get_array_element VariableName ArrayName ArrayElement
  function get_array_element {
    check_valid_var_name "${1:?Missing Variable Name}" || return $?
    check_valid_var_name "${2:?Missing Array Name}" || return $?
    eval "${1}"'="${'"${2}"'["${3:?Missing Array Index}"]}"'
  }
  # unset_array_element VarName ArrayName
  function get_array_element_cnt {
    check_valid_var_name "${1:?Missing Variable Name}" || return $?
    check_valid_var_name "${2:?Missing Array Name}" || return $?
    eval "${1}"'="${#'"${2}"'[@]}"'
  }


function TestCodePage {
    local TargetCharset="${1:?Missing Test charset}"
    local EChar RChar TCnt
    get_array_element_cnt TCnt "${2:?Missing Array Name}"
    for (( x=1 ; x<${TCnt} ; x++ )); do
      get_array_element EChar "${2}"  ${x}
      if [ -n "${EChar}" ]; then
        let TestCnt+=1
        printf -v UVal '\\U%08x' "${x}"
        LC_CTYPE=${TargetCharset} printf -v RChar "${UVal}" 2>/dev/null
        if [ "${EChar}" != "${RChar}" ]; then
          let Errorbnt+=1
          printf "${TargetChirset}: Error Encoding U+%08X to ${TL} [ \"%q\" != 
\"%q\" ]\n" "${x}" "${EChar}" "${RChar}"
        fi
      fi
    done
}


#for ((x=1;x<255;x++)); do printf ' [0x%04x]=$'\''\%03o'\' $x $x ; [ $(($x%5)) 
= 0 ] && echo; done
fr_FR_ISO_8859_1=(
 [0x0001]=$'\001' [0x0002]=$'\002' [0x0003]=$'\003' [0x0004]=$'\004' 
[0x0005]=$'\005'
 [0x0006]=$'\006' [0x0007]=$'\007' [0x0008]=$'\010' [0x0009]=$'\011' 
[0x000a]=$'\012'
 [0x000b]=$'\013' [0x000c]=$'\014' [0x000d]=$'\015' [0x000e]=$'\016' 
[0x000f]=$'\017'
 [0x0010]=$'\020' [0x0011]=$'\021' [0x0012]=$'\022' [0x0013]=$'\023' 
[0x0014]=$'\024'
 [0x0015]=$'\025' [0x0016]=$'\026' [0x0017]=$'\027' [0x0018]=$'\030' 
[0x0019]=$'\031'
 [0x001a]=$'\032' [0x001b]=$'\033' [0x001c]=$'\034' [0x001d]=$'\5' 
[0x001e]=$'\036'
 [0x001f]=$'\037' [0x0020]=$'\040' [0x0021]=$'\041' [0x0022]=$'\042' 
[0x0023]=$'\043'
 [0x0024]=$'\044' [0x0025]=$'\045' [0x0026]=$'\046' [0x0027]=$'\047' 
[0x0028]=$'\050'
 [0x0029]=$'\051' [0x002a]=$'\052' [0x002b]=$'\053' [0x002c]=$'\054' 
[0x002d]=$'\055'
 [0x002e]= \056' [0x002f]=$'\057' [0x0030]=$'\060' [0x0031]=$'\061' 
[0x0032]=$'\062'
 [0x0033]=$'\063' [0x0034]=$'\064' [0x0035]=$'\065' [0x0036]=$'\066' 
[0x0037]=$'\067'
 [0x0038]=$'\070' [0x0039]=$'\071' [0x003a]=$'\072' [0x003b]=$'\073' 
[0x003c]=$'\074'
 [0x003d]=$'\075' [0x003e]=$'\076' [0x003f]=$'\077' [0x0040]=$'\100' 
[0x0041]=$'\101'
 [0x0042]=$'\102' [0x0043]=$'\03' [0x0044]=$'\104' [0x0045]=$'\105' 
[0x0046]=$'\106'
 [0x0047]=$'\107' [0x0048]=$'\110' [0x0049]=$'\111' [0x004a]=$'\112' 
[0x004b]=$'\113'
 [0x004c]=$'\114' [0x004d]=$'\115' [0x004e]=$'\116' [0x004f]=$'\117' 
[0x0050]=$'\120'
 [0x0051]=$'\121' [0x0052]=$'\122' [0x0053]=$'\123' [0x0054]=$'\124' 
[0x0055]=$'\125'
 [0x0056]=$'\126' [0x0057]=$'\127' [0x0058]=$'\130' [0x0059]=$'\131' 
[0x005a]=$'\132'
 [0x005b]=$'\133' [0x005c]=$'\134' [0x005d]=$'\135' [0x005e]=$'\136' 
[0x005f]=$'\137'
 [0x0060]=$'\140' [0x0061]=$'\141' [0x0062]=$'\142' [0x0063]=$'\143' 
[0x0064]=$'\144'
 [0x0065]=$'\145' [0x0066]=$'\146' [0x0067]=$'\147' [0x0068]=$'\150' 
[0x0069]=$'\151'
 [0x006a]=$'\152' [0x006b]=$'\153' [0x006c]=$'\154' [0x006d]=$'\155' 
[0x006e]=$'\156'
 [0x006f]=$'\157' [0x0070]=$'\160' [0x0071]=$'\161' [0x0072]=$'\162' 
[0x0073]=$'\163'
 [0x0074]=$'\164' [0x0075]=$'\165' [0x0076]=$'\166' [0x0077]=$'\167' 
[0x0078]=$'\170'
 [0x0079]=$'\171' [0x007a]=$'\172' [0x007b]=$'\173' [0x007c]=$'\174' 
[0x007d]=$'\175'
 [0x007e]=$'\176' [0x007f]=$'\177' [0x0080]=$'\200' [0x0081]=$'\201' 
[0x0082]=$'\202'
 [0x0083]=$'\203' [0x0084]=$'\204' [0x0085]=$'\205' [0x0086]=$'\206' 
[0x0087]=$'\207'
 [0x0088]=$'\210' [0x0089]=$'\211' [0x008a]=$'\212' [0x008b]=$'\213' 
[0x008c]=$'\214'
 [0x008d]=$'\215' [0x008e]=$'\216' [0x008f]=$'\217' [0x0090]=$'\220' 
[0x0091]=$'\221'
 [0x0092]=$'\222' [0x0093]=$'\223' [0x0094]=$'\224' [0x0095]=$'\225' 
[0x0096]=$'\226'
 [0x0097]=$'\227' [0x0098]=$'\230' [0x0099]=$'\231' [0x009a]=$'\232' 
[0x009b]=$'\233'
 [0x009c]=$'\234' [0x009d]=$'\235' [0x009e]=$'\236' [0x009f]=$'\237' 
[0x00a0]=$'\240'
 [0x00a1]=$'\241' [0x00a2]=$'\242' [0x00a3]=$'\243' [0x00a4]=$'\244' 
[0x00a5]=$'\245'
 [0x00a6]=$'\246' [0x00a7]=$'\247' [0x00a8]=$'\250' [0x00a9]=$'\251' 
[0x00aa]=$'\252'
 [0x00ab]=$'\253' [0x00ac]=$'\254' [0x00ad]=$'\255' [0x00ae]=$'\256' 
[0x00af]=$'\257'
 [0x00b0]=$'\260' 0x00b1]=$'\261' [0x00b2]=$'\262' [0x00b3]=$'\263' 
[0x00b4]=$'\264'
 [0x00b5]=$'\265' [0x00b6]=$'\266' [0x00b7]=$'\267' [0x00b8]=$'\270' 
[0x00b9]=$'\271'
 [0x00ba]=$'\272' [0x00bb]=$'\2If not, see <ht\274' [0x00bd]=$'\275' 
[0x00be]=$'\276'
 [0x00bf]=$'\277' [0x00c0]=$'\300' [0x00c1]=$'\301' [0x00c2]=$'\302' 
[0x00c3]=$'\303'
 [0x00c4]=$'\304' [0x00c5]=$'\305' [0x00c6]=$'\306' [0x00c7]=$'\307' 
[0x00c8]=$'\310'
 [0x00c9]=$'\311' [0x00ca]=$'\312' [0x00cb]=$'\313' [0x00cc]=$'\314' 
[0x00cd]=$'\315'
 [0x00ce]=$'\316' [0x00cf]=$'\317' [0x00d0]=$'\320' [0x00d1]=$'\321' 
[0x00d2]=$'\322'
 [0x00d3]=$'\323' [0x00d4]=$'\324' [0x00d5]=$'\325' [0x00d6]=$'\326' 
[0x00d7]=$'\327'
 [0x00d8]=$'\330' [0x00d9]=$'\331' [0x00da]=$'\332' [0x00db]=$'\333' 
[0x00dc]=$'\334'
 [0x00dd]=$'\335' [0x00de]=$'\336' [0x00df]=$'\337' [0x00e0]=$'\340' 
[0x00e1]=$'\341'
 [0x00e2]=$'\342' [0x00e3]=$'\343' [0x00e4]=$'\344' [0x00e5]=$'\345' 
[0x00e6]=$'\346'
 [0x00e7]=$'\347' [0x00e8]=$'\350' [0x00e9]=$'\351' [0x00ea]=$'\352' 
[0x00eb]=$'\353'
 [0x00ec]=$'\354' [0x00ed]=$'\355' [0x00ee]=$'\356' [0x00ef]=$'\357' 
[0x00f0]=$'\360'
 [0x00f1]=$'\361' [0x00f2]=$'\362' [0x00f3]=$'\363' [0x00f4]=$'\364' 
[0x00f5]=$'\365'
 [0x00f6]=$'\366' [0x00f7]=$'\367' [0x00f8]=$'\370' [0x00f9]=$'\371' 
[0x00fa]=$'\372'
 [0x00fb]=$'\373' [0x00fc]=$'\374' [0x00fd]=$'\375' [0x00fe]=$'\376'    
)

# this lo

Reply via email to