1*4887Schin######################################################################## 2*4887Schin# # 3*4887Schin# This software is part of the ast package # 4*4887Schin# Copyright (c) 1982-2007 AT&T Knowledge Ventures # 5*4887Schin# and is licensed under the # 6*4887Schin# Common Public License, Version 1.0 # 7*4887Schin# by AT&T Knowledge Ventures # 8*4887Schin# # 9*4887Schin# A copy of the License is available at # 10*4887Schin# http://www.opensource.org/licenses/cpl1.0.txt # 11*4887Schin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # 12*4887Schin# # 13*4887Schin# Information and Software Systems Research # 14*4887Schin# AT&T Research # 15*4887Schin# Florham Park NJ # 16*4887Schin# # 17*4887Schin# David Korn <dgk@research.att.com> # 18*4887Schin# # 19*4887Schin######################################################################## 20*4887Schinfunction err_exit 21*4887Schin{ 22*4887Schin print -u2 -n "\t" 23*4887Schin print -u2 -r ${Command}[$1]: "${@:2}" 24*4887Schin ((errors++)) 25*4887Schin} 26*4887Schinalias err_exit='err_exit $LINENO' 27*4887Schin 28*4887Schininteger aware=0 contrary=0 ignorant=0 29*4887Schin 30*4887Schinfunction test_glob 31*4887Schin{ 32*4887Schin typeset lineno expected drop arg got sep op val add del 33*4887Schin if [[ $1 == --* ]] 34*4887Schin then del=${1#--} 35*4887Schin shift 36*4887Schin fi 37*4887Schin if [[ $1 == ++* ]] 38*4887Schin then add=${1#++} 39*4887Schin shift 40*4887Schin fi 41*4887Schin lineno=$1 expected=$2 42*4887Schin shift 2 43*4887Schin if (( contrary )) 44*4887Schin then if [[ $expected == "<Beware> "* ]] 45*4887Schin then expected=${expected#"<Beware> "} 46*4887Schin expected="$expected <Beware>" 47*4887Schin fi 48*4887Schin if [[ $expected == *"<aXb> <abd>"* ]] 49*4887Schin then expected=${expected/"<aXb> <abd>"/"<abd> <aXb>"} 50*4887Schin fi 51*4887Schin fi 52*4887Schin for arg 53*4887Schin do got="$got$sep<$arg>" 54*4887Schin sep=" " 55*4887Schin done 56*4887Schin if (( ignorant && aware )) 57*4887Schin then if [[ $del ]] 58*4887Schin then got="<$del> $got" 59*4887Schin fi 60*4887Schin if [[ $add ]] 61*4887Schin then expected="<$add> $expected" 62*4887Schin fi 63*4887Schin fi 64*4887Schin if [[ $got != "$expected" ]] 65*4887Schin then err_exit $lineno "glob: got '$got' expected '$expected'" 66*4887Schin fi 67*4887Schin} 68*4887Schin 69*4887Schinfunction test_case 70*4887Schin{ 71*4887Schin typeset lineno expected subject pattern got 72*4887Schin lineno=$1 expected=$2 subject=$3 pattern=$4 73*4887Schin eval " 74*4887Schin case $subject in 75*4887Schin $pattern) got='<match>' ;; 76*4887Schin *) got='<nomatch>' ;; 77*4887Schin esac 78*4887Schin " 79*4887Schin if [[ $got != "$expected" ]] 80*4887Schin then err_exit $lineno "case $subject in $pattern) got '$got' expected '$expected'" 81*4887Schin fi 82*4887Schin} 83*4887Schin 84*4887SchinCommand=${0##*/} 85*4887Schintmp=/tmp/ksh$$ 86*4887Schininteger errors=0 87*4887Schinunset undefined 88*4887Schin 89*4887Schinexport LC_COLLATE=C 90*4887Schin 91*4887Schinmkdir $tmp || err_exit $LINENO "mkdir $tmp failed" 92*4887Schintrap "cd /; rm -rf $tmp" EXIT 93*4887Schincd $tmp || err_exit $LINENO "cd $tmp failed" 94*4887Schinrm -rf * 95*4887Schin 96*4887Schintouch B b 97*4887Schinset -- * 98*4887Schincase $* in 99*4887Schin'b B') contrary=1 ;; 100*4887Schinb|B) ignorant=1 ;; 101*4887Schinesac 102*4887Schinset -- $(/bin/sh -c 'echo [a-c]') 103*4887Schincase $* in 104*4887SchinB) aware=1 ;; 105*4887Schinesac 106*4887Schinrm -rf * 107*4887Schin 108*4887Schintouch a b c d abc abd abe bb bcd ca cb dd de Beware 109*4887Schinmkdir bdir 110*4887Schin 111*4887Schintest_glob $LINENO '<a> <abc> <abd> <abe> <X*>' a* X* 112*4887Schintest_glob $LINENO '<a> <abc> <abd> <abe>' \a* 113*4887Schin 114*4887Schinif ( set --nullglob ) 2>/dev/null 115*4887Schinthen 116*4887Schin set --nullglob 117*4887Schin 118*4887Schin test_glob $LINENO '<a> <abc> <abd> <abe>' a* X* 119*4887Schin 120*4887Schin set --nonullglob 121*4887Schinfi 122*4887Schin 123*4887Schinif ( set --failglob ) 2>/dev/null 124*4887Schinthen 125*4887Schin set --failglob 126*4887Schin mkdir tmp 127*4887Schin touch tmp/l1 tmp/l2 tmp/l3 128*4887Schin 129*4887Schin test_glob $LINENO '' tmp/l[12] tmp/*4 tmp/*3 130*4887Schin test_glob $LINENO '' tmp/l[12] tmp/*4 tmp/*3 131*4887Schin 132*4887Schin rm -r tmp 133*4887Schin set --nofailglob 134*4887Schinfi 135*4887Schin 136*4887Schintest_glob $LINENO '<bdir/>' b*/ 137*4887Schintest_glob $LINENO '<*>' \* 138*4887Schintest_glob $LINENO '<a*>' 'a*' 139*4887Schintest_glob $LINENO '<a*>' a\* 140*4887Schintest_glob $LINENO '<c> <ca> <cb> <a*> <*q*>' c* a\* *q* 141*4887Schintest_glob $LINENO '<**>' "*"* 142*4887Schintest_glob $LINENO '<**>' \** 143*4887Schintest_glob $LINENO '<\.\./*/>' "\.\./*/" 144*4887Schintest_glob $LINENO '<s/\..*//>' 's/\..*//' 145*4887Schintest_glob $LINENO '</^root:/{s/^[!:]*:[!:]*:\([!:]*\).*$/\1/>' "/^root:/{s/^[!:]*:[!:]*:\([!:]*\).*"'$'"/\1/" 146*4887Schintest_glob $LINENO '<abc> <abd> <abe> <bb> <cb>' [a-c]b* 147*4887Schintest_glob ++Beware $LINENO '<abd> <abe> <bb> <bcd> <bdir> <ca> <cb> <dd> <de>' [a-y]*[!c] 148*4887Schintest_glob $LINENO '<abd> <abe>' a*[!c] 149*4887Schin 150*4887Schintouch a-b aXb 151*4887Schin 152*4887Schintest_glob $LINENO '<a-b> <aXb>' a[X-]b 153*4887Schin 154*4887Schintouch .x .y 155*4887Schin 156*4887Schintest_glob --Beware $LINENO '<Beware> <d> <dd> <de>' [!a-c]* 157*4887Schin 158*4887Schinif mkdir a\*b 2>/dev/null 159*4887Schinthen 160*4887Schin touch a\*b/ooo 161*4887Schin 162*4887Schin test_glob $LINENO '<a*b/ooo>' a\*b/* 163*4887Schin test_glob $LINENO '<a*b/ooo>' a\*?/* 164*4887Schin test_case $LINENO '<match>' '!7' '*\!*' 165*4887Schin test_case $LINENO '<match>' 'r.*' '*.\*' 166*4887Schin test_glob $LINENO '<abc>' a[b]c 167*4887Schin test_glob $LINENO '<abc>' a["b"]c 168*4887Schin test_glob $LINENO '<abc>' a[\b]c 169*4887Schin test_glob $LINENO '<abc>' a?c 170*4887Schin test_case $LINENO '<match>' 'abc' 'a"b"c' 171*4887Schin test_case $LINENO '<match>' 'abc' 'a*c' 172*4887Schin test_case $LINENO '<nomatch>' 'abc' '"a?c"' 173*4887Schin test_case $LINENO '<nomatch>' 'abc' 'a\*c' 174*4887Schin test_case $LINENO '<nomatch>' 'abc' 'a\[b]c' 175*4887Schin test_case $LINENO '<match>' '"$undefined"' '""' 176*4887Schin test_case $LINENO '<match>' 'abc' 'a["\b"]c' 177*4887Schin 178*4887Schin rm -rf mkdir a\*b 179*4887Schinfi 180*4887Schin 181*4887Schinmkdir man 182*4887Schinmkdir man/man1 183*4887Schintouch man/man1/sh.1 184*4887Schin 185*4887Schintest_glob $LINENO '<man/man1/sh.1>' */man*/sh.* 186*4887Schintest_glob $LINENO '<man/man1/sh.1>' $(echo */man*/sh.*) 187*4887Schintest_glob $LINENO '<man/man1/sh.1>' "$(echo */man*/sh.*)" 188*4887Schin 189*4887Schintest_case $LINENO '<match>' 'abc' 'a***c' 190*4887Schintest_case $LINENO '<match>' 'abc' 'a*****?c' 191*4887Schintest_case $LINENO '<match>' 'abc' '?*****??' 192*4887Schintest_case $LINENO '<match>' 'abc' '*****??' 193*4887Schintest_case $LINENO '<match>' 'abc' '*****??c' 194*4887Schintest_case $LINENO '<match>' 'abc' '?*****?c' 195*4887Schintest_case $LINENO '<match>' 'abc' '?***?****c' 196*4887Schintest_case $LINENO '<match>' 'abc' '?***?****?' 197*4887Schintest_case $LINENO '<match>' 'abc' '?***?****' 198*4887Schintest_case $LINENO '<match>' 'abc' '*******c' 199*4887Schintest_case $LINENO '<match>' 'abc' '*******?' 200*4887Schintest_case $LINENO '<match>' 'abcdecdhjk' 'a*cd**?**??k' 201*4887Schintest_case $LINENO '<match>' 'abcdecdhjk' 'a**?**cd**?**??k' 202*4887Schintest_case $LINENO '<match>' 'abcdecdhjk' 'a**?**cd**?**??k***' 203*4887Schintest_case $LINENO '<match>' 'abcdecdhjk' 'a**?**cd**?**??***k' 204*4887Schintest_case $LINENO '<match>' 'abcdecdhjk' 'a**?**cd**?**??***k**' 205*4887Schintest_case $LINENO '<match>' 'abcdecdhjk' 'a****c**?**??*****' 206*4887Schintest_case $LINENO '<match>' "'-'" '[-abc]' 207*4887Schintest_case $LINENO '<match>' "'-'" '[abc-]' 208*4887Schintest_case $LINENO '<match>' "'\\'" '\\' 209*4887Schintest_case $LINENO '<match>' "'\\'" '[\\]' 210*4887Schintest_case $LINENO '<match>' "'\\'" "'\\'" 211*4887Schintest_case $LINENO '<match>' "'['" '[[]' 212*4887Schintest_case $LINENO '<match>' '[' '[[]' 213*4887Schintest_case $LINENO '<match>' "'['" '[' 214*4887Schintest_case $LINENO '<match>' '[' '[' 215*4887Schintest_case $LINENO '<match>' "'[abc'" "'['*" 216*4887Schintest_case $LINENO '<nomatch>' "'[abc'" '[*' 217*4887Schintest_case $LINENO '<match>' '[abc' "'['*" 218*4887Schintest_case $LINENO '<nomatch>' '[abc' '[*' 219*4887Schintest_case $LINENO '<match>' 'abd' "a[b/c]d" 220*4887Schintest_case $LINENO '<match>' 'a/d' "a[b/c]d" 221*4887Schintest_case $LINENO '<match>' 'acd' "a[b/c]d" 222*4887Schintest_case $LINENO '<match>' "']'" '[]]' 223*4887Schintest_case $LINENO '<match>' "'-'" '[]-]' 224*4887Schintest_case $LINENO '<match>' 'p' '[a-\z]' 225*4887Schintest_case $LINENO '<match>' '"/tmp"' '[/\\]*' 226*4887Schintest_case $LINENO '<nomatch>' 'abc' '??**********?****?' 227*4887Schintest_case $LINENO '<nomatch>' 'abc' '??**********?****c' 228*4887Schintest_case $LINENO '<nomatch>' 'abc' '?************c****?****' 229*4887Schintest_case $LINENO '<nomatch>' 'abc' '*c*?**' 230*4887Schintest_case $LINENO '<nomatch>' 'abc' 'a*****c*?**' 231*4887Schintest_case $LINENO '<nomatch>' 'abc' 'a********???*******' 232*4887Schintest_case $LINENO '<nomatch>' "'a'" '[]' 233*4887Schintest_case $LINENO '<nomatch>' 'a' '[]' 234*4887Schintest_case $LINENO '<nomatch>' "'['" '[abc' 235*4887Schintest_case $LINENO '<nomatch>' '[' '[abc' 236*4887Schin 237*4887Schintest_glob ++Beware $LINENO '<b> <bb> <bcd> <bdir>' b* 238*4887Schintest_glob $LINENO '<Beware> <b> <bb> <bcd> <bdir>' [bB]* 239*4887Schin 240*4887Schinif ( set --nocaseglob ) 2>/dev/null 241*4887Schinthen 242*4887Schin set --nocaseglob 243*4887Schin 244*4887Schin test_glob $LINENO '<Beware> <b> <bb> <bcd> <bdir>' b* 245*4887Schin test_glob $LINENO '<Beware> <b> <bb> <bcd> <bdir>' [b]* 246*4887Schin test_glob $LINENO '<Beware> <b> <bb> <bcd> <bdir>' [bB]* 247*4887Schin 248*4887Schin set --nonocaseglob 249*4887Schinfi 250*4887Schin 251*4887Schinif ( set -f ) 2>/dev/null 252*4887Schinthen 253*4887Schin set -f 254*4887Schin 255*4887Schin test_glob $LINENO '<*>' * 256*4887Schin 257*4887Schin set +f 258*4887Schinfi 259*4887Schin 260*4887Schinif ( set --noglob ) 2>/dev/null 261*4887Schinthen 262*4887Schin set --noglob 263*4887Schin 264*4887Schin test_glob $LINENO '<*>' * 265*4887Schin 266*4887Schin set --glob 267*4887Schinfi 268*4887Schin 269*4887SchinFIGNORE='.*|*' 270*4887Schintest_glob $LINENO '<*>' * 271*4887Schin 272*4887SchinFIGNORE='.*|*c|*e|?' 273*4887Schintest_glob $LINENO '<a-b> <aXb> <abd> <bb> <bcd> <bdir> <ca> <cb> <dd> <man>' * 274*4887Schin 275*4887SchinFIGNORE='.*|*b|*d|?' 276*4887Schintest_glob $LINENO '<Beware> <abc> <abe> <bdir> <ca> <de> <man>' * 277*4887Schin 278*4887SchinFIGNORE= 279*4887Schintest_glob $LINENO '<man/man1/sh.1>' */man*/sh.* 280*4887Schin 281*4887Schinunset FIGNORE 282*4887Schintest_glob $LINENO '<bb> <ca> <cb> <dd> <de>' ?? 283*4887Schintest_glob $LINENO '<man/man1/sh.1>' */man*/sh.* 284*4887Schin 285*4887SchinGLOBIGNORE='.*:*' 286*4887Schinset -- * 287*4887Schinif [[ $1 == '*' ]] 288*4887Schinthen 289*4887Schin GLOBIGNORE='.*:*c:*e:?' 290*4887Schin test_glob $LINENO '<>' * 291*4887Schin 292*4887Schin GLOBIGNORE='.*:*b:*d:?' 293*4887Schin test_glob $LINENO '<>' * 294*4887Schin 295*4887Schin unset GLOBIGNORE 296*4887Schin test_glob $LINENO '<>' * 297*4887Schin test_glob $LINENO '<man/man1/sh.1>' */man*/sh.* 298*4887Schin 299*4887Schin GLOBIGNORE= 300*4887Schin test_glob $LINENO '<man/man1/sh.1>' */man*/sh.* 301*4887Schinfi 302*4887Schin 303*4887Schinexit $errors 304