xref: /onnv-gate/usr/src/lib/libshell/common/tests/glob.sh (revision 12068:08a39a083754)
14887Schin########################################################################
24887Schin#                                                                      #
34887Schin#               This software is part of the ast package               #
4*12068SRoger.Faulkner@Oracle.COM#          Copyright (c) 1982-2010 AT&T Intellectual Property          #
54887Schin#                      and is licensed under the                       #
64887Schin#                  Common Public License, Version 1.0                  #
78462SApril.Chin@Sun.COM#                    by AT&T Intellectual Property                     #
84887Schin#                                                                      #
94887Schin#                A copy of the License is available at                 #
104887Schin#            http://www.opensource.org/licenses/cpl1.0.txt             #
114887Schin#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
124887Schin#                                                                      #
134887Schin#              Information and Software Systems Research               #
144887Schin#                            AT&T Research                             #
154887Schin#                           Florham Park NJ                            #
164887Schin#                                                                      #
174887Schin#                  David Korn <dgk@research.att.com>                   #
184887Schin#                                                                      #
194887Schin########################################################################
204887Schinfunction err_exit
214887Schin{
228462SApril.Chin@Sun.COM	print -u2 -r $'\t'"${Command}[$1] ${@:2}"
234887Schin	((errors++))
244887Schin}
254887Schinalias err_exit='err_exit $LINENO'
264887Schin
2710898Sroland.mainz@nrubsig.orgCommand=${0##*/}
2810898Sroland.mainz@nrubsig.orginteger aware=0 contrary=0 errors=0 ignorant=0
2910898Sroland.mainz@nrubsig.org
3010898Sroland.mainz@nrubsig.orgtmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
3110898Sroland.mainz@nrubsig.orgtrap "cd /; rm -rf $tmp" EXIT
324887Schin
334887Schinfunction test_glob
344887Schin{
354887Schin	typeset lineno expected drop arg got sep op val add del
368462SApril.Chin@Sun.COM	lineno=$1
378462SApril.Chin@Sun.COM	shift
384887Schin	if	[[ $1 == --* ]]
394887Schin	then	del=${1#--}
404887Schin		shift
414887Schin	fi
424887Schin	if	[[ $1 == ++* ]]
434887Schin	then	add=${1#++}
444887Schin		shift
454887Schin	fi
468462SApril.Chin@Sun.COM	expected=$1
478462SApril.Chin@Sun.COM	shift
484887Schin	if	(( contrary ))
494887Schin	then	if	[[ $expected == "<Beware> "* ]]
504887Schin		then	expected=${expected#"<Beware> "}
514887Schin			expected="$expected <Beware>"
524887Schin		fi
534887Schin		if	[[ $expected == *"<aXb> <abd>"* ]]
544887Schin		then	expected=${expected/"<aXb> <abd>"/"<abd> <aXb>"}
554887Schin		fi
564887Schin	fi
574887Schin	for arg
584887Schin	do	got="$got$sep<$arg>"
594887Schin		sep=" "
604887Schin	done
614887Schin	if	(( ignorant && aware ))
624887Schin	then	if	[[ $del ]]
634887Schin		then	got="<$del> $got"
644887Schin		fi
654887Schin		if	[[ $add ]]
664887Schin		then	expected="<$add> $expected"
674887Schin		fi
684887Schin	fi
694887Schin	if	[[ $got != "$expected" ]]
708462SApril.Chin@Sun.COM	then	'err_exit' $lineno "glob -- expected '$expected', got '$got'"
714887Schin	fi
724887Schin}
738462SApril.Chin@Sun.COMalias test_glob='test_glob $LINENO'
744887Schin
754887Schinfunction test_case
764887Schin{
774887Schin	typeset lineno expected subject pattern got
784887Schin	lineno=$1 expected=$2 subject=$3 pattern=$4
794887Schin	eval "
804887Schin		case $subject in
814887Schin		$pattern)	got='<match>' ;;
824887Schin		*)		got='<nomatch>' ;;
834887Schin		esac
844887Schin	"
854887Schin	if	[[ $got != "$expected" ]]
868462SApril.Chin@Sun.COM	then	'err_exit' $lineno "case $subject in $pattern) -- expected '$expected', got '$got'"
874887Schin	fi
884887Schin}
898462SApril.Chin@Sun.COMalias test_case='test_case $LINENO'
904887Schin
914887Schinunset undefined
924887Schin
934887Schinexport LC_COLLATE=C
944887Schin
9510898Sroland.mainz@nrubsig.orgcd $tmp || { err_exit "cd $tmp failed"; exit 1; }
964887Schin
974887Schintouch B b
984887Schinset -- *
994887Schincase $* in
1004887Schin'b B')	contrary=1 ;;
1014887Schinb|B)	ignorant=1 ;;
1024887Schinesac
1034887Schinset -- $(/bin/sh -c 'echo [a-c]')
1044887Schincase $* in
1054887SchinB)	aware=1 ;;
1064887Schinesac
1074887Schinrm -rf *
1084887Schin
1094887Schintouch a b c d abc abd abe bb bcd ca cb dd de Beware
1104887Schinmkdir bdir
1114887Schin
1128462SApril.Chin@Sun.COMtest_glob '<a> <abc> <abd> <abe> <X*>' a* X*
1138462SApril.Chin@Sun.COMtest_glob '<a> <abc> <abd> <abe>' \a*
1144887Schin
1154887Schinif	( set --nullglob ) 2>/dev/null
1164887Schinthen
1174887Schin	set --nullglob
1184887Schin
1198462SApril.Chin@Sun.COM	test_glob '<a> <abc> <abd> <abe>' a* X*
1204887Schin
1214887Schin	set --nonullglob
1224887Schinfi
1234887Schin
1244887Schinif	( set --failglob ) 2>/dev/null
1254887Schinthen
1264887Schin	set --failglob
1274887Schin	mkdir tmp
1284887Schin	touch tmp/l1 tmp/l2 tmp/l3
1294887Schin
1308462SApril.Chin@Sun.COM	test_glob '' tmp/l[12] tmp/*4 tmp/*3
1318462SApril.Chin@Sun.COM	test_glob '' tmp/l[12] tmp/*4 tmp/*3
1324887Schin
1334887Schin	rm -r tmp
1344887Schin	set --nofailglob
1354887Schinfi
1364887Schin
1378462SApril.Chin@Sun.COMtest_glob '<bdir/>' b*/
1388462SApril.Chin@Sun.COMtest_glob '<*>' \*
1398462SApril.Chin@Sun.COMtest_glob '<a*>' 'a*'
1408462SApril.Chin@Sun.COMtest_glob '<a*>' a\*
1418462SApril.Chin@Sun.COMtest_glob '<c> <ca> <cb> <a*> <*q*>' c* a\* *q*
1428462SApril.Chin@Sun.COMtest_glob '<**>' "*"*
1438462SApril.Chin@Sun.COMtest_glob '<**>' \**
1448462SApril.Chin@Sun.COMtest_glob '<\.\./*/>' "\.\./*/"
1458462SApril.Chin@Sun.COMtest_glob '<s/\..*//>' 's/\..*//'
1468462SApril.Chin@Sun.COMtest_glob '</^root:/{s/^[!:]*:[!:]*:\([!:]*\).*$/\1/>' "/^root:/{s/^[!:]*:[!:]*:\([!:]*\).*"'$'"/\1/"
1478462SApril.Chin@Sun.COMtest_glob '<abc> <abd> <abe> <bb> <cb>' [a-c]b*
1488462SApril.Chin@Sun.COMtest_glob ++Beware '<abd> <abe> <bb> <bcd> <bdir> <ca> <cb> <dd> <de>' [a-y]*[!c]
1498462SApril.Chin@Sun.COMtest_glob '<abd> <abe>' a*[!c]
1504887Schin
1514887Schintouch a-b aXb
1524887Schin
1538462SApril.Chin@Sun.COMtest_glob '<a-b> <aXb>' a[X-]b
1544887Schin
1554887Schintouch .x .y
1564887Schin
1578462SApril.Chin@Sun.COMtest_glob --Beware '<Beware> <d> <dd> <de>' [!a-c]*
1584887Schin
1594887Schinif	mkdir a\*b 2>/dev/null
1604887Schinthen
1614887Schin	touch a\*b/ooo
1624887Schin
1638462SApril.Chin@Sun.COM	test_glob '<a*b/ooo>' a\*b/*
1648462SApril.Chin@Sun.COM	test_glob '<a*b/ooo>' a\*?/*
1658462SApril.Chin@Sun.COM	test_case '<match>' '!7' '*\!*'
1668462SApril.Chin@Sun.COM	test_case '<match>' 'r.*' '*.\*'
1678462SApril.Chin@Sun.COM	test_glob '<abc>' a[b]c
1688462SApril.Chin@Sun.COM	test_glob '<abc>' a["b"]c
1698462SApril.Chin@Sun.COM	test_glob '<abc>' a[\b]c
1708462SApril.Chin@Sun.COM	test_glob '<abc>' a?c
1718462SApril.Chin@Sun.COM	test_case '<match>' 'abc' 'a"b"c'
1728462SApril.Chin@Sun.COM	test_case '<match>' 'abc' 'a*c'
1738462SApril.Chin@Sun.COM	test_case '<nomatch>' 'abc' '"a?c"'
1748462SApril.Chin@Sun.COM	test_case '<nomatch>' 'abc' 'a\*c'
1758462SApril.Chin@Sun.COM	test_case '<nomatch>' 'abc' 'a\[b]c'
1768462SApril.Chin@Sun.COM	test_case '<match>' '"$undefined"' '""'
1778462SApril.Chin@Sun.COM	test_case '<match>' 'abc' 'a["\b"]c'
1784887Schin
1794887Schin	rm -rf mkdir a\*b
1804887Schinfi
1814887Schin
1824887Schinmkdir man
1834887Schinmkdir man/man1
1844887Schintouch man/man1/sh.1
1854887Schin
1868462SApril.Chin@Sun.COMtest_glob '<man/man1/sh.1>' */man*/sh.*
1878462SApril.Chin@Sun.COMtest_glob '<man/man1/sh.1>' $(echo */man*/sh.*)
1888462SApril.Chin@Sun.COMtest_glob '<man/man1/sh.1>' "$(echo */man*/sh.*)"
1894887Schin
1908462SApril.Chin@Sun.COMtest_case '<match>' 'abc' 'a***c'
1918462SApril.Chin@Sun.COMtest_case '<match>' 'abc' 'a*****?c'
1928462SApril.Chin@Sun.COMtest_case '<match>' 'abc' '?*****??'
1938462SApril.Chin@Sun.COMtest_case '<match>' 'abc' '*****??'
1948462SApril.Chin@Sun.COMtest_case '<match>' 'abc' '*****??c'
1958462SApril.Chin@Sun.COMtest_case '<match>' 'abc' '?*****?c'
1968462SApril.Chin@Sun.COMtest_case '<match>' 'abc' '?***?****c'
1978462SApril.Chin@Sun.COMtest_case '<match>' 'abc' '?***?****?'
1988462SApril.Chin@Sun.COMtest_case '<match>' 'abc' '?***?****'
1998462SApril.Chin@Sun.COMtest_case '<match>' 'abc' '*******c'
2008462SApril.Chin@Sun.COMtest_case '<match>' 'abc' '*******?'
2018462SApril.Chin@Sun.COMtest_case '<match>' 'abcdecdhjk' 'a*cd**?**??k'
2028462SApril.Chin@Sun.COMtest_case '<match>' 'abcdecdhjk' 'a**?**cd**?**??k'
2038462SApril.Chin@Sun.COMtest_case '<match>' 'abcdecdhjk' 'a**?**cd**?**??k***'
2048462SApril.Chin@Sun.COMtest_case '<match>' 'abcdecdhjk' 'a**?**cd**?**??***k'
2058462SApril.Chin@Sun.COMtest_case '<match>' 'abcdecdhjk' 'a**?**cd**?**??***k**'
2068462SApril.Chin@Sun.COMtest_case '<match>' 'abcdecdhjk' 'a****c**?**??*****'
2078462SApril.Chin@Sun.COMtest_case '<match>' "'-'" '[-abc]'
2088462SApril.Chin@Sun.COMtest_case '<match>' "'-'" '[abc-]'
2098462SApril.Chin@Sun.COMtest_case '<match>' "'\\'" '\\'
2108462SApril.Chin@Sun.COMtest_case '<match>' "'\\'" '[\\]'
2118462SApril.Chin@Sun.COMtest_case '<match>' "'\\'" "'\\'"
2128462SApril.Chin@Sun.COMtest_case '<match>' "'['" '[[]'
2138462SApril.Chin@Sun.COMtest_case '<match>' '[' '[[]'
2148462SApril.Chin@Sun.COMtest_case '<match>' "'['" '['
2158462SApril.Chin@Sun.COMtest_case '<match>' '[' '['
2168462SApril.Chin@Sun.COMtest_case '<match>' "'[abc'" "'['*"
2178462SApril.Chin@Sun.COMtest_case '<nomatch>' "'[abc'" '[*'
2188462SApril.Chin@Sun.COMtest_case '<match>' '[abc' "'['*"
2198462SApril.Chin@Sun.COMtest_case '<nomatch>' '[abc' '[*'
2208462SApril.Chin@Sun.COMtest_case '<match>' 'abd' "a[b/c]d"
2218462SApril.Chin@Sun.COMtest_case '<match>' 'a/d' "a[b/c]d"
2228462SApril.Chin@Sun.COMtest_case '<match>' 'acd' "a[b/c]d"
2238462SApril.Chin@Sun.COMtest_case '<match>' "']'" '[]]'
2248462SApril.Chin@Sun.COMtest_case '<match>' "'-'" '[]-]'
2258462SApril.Chin@Sun.COMtest_case '<match>' 'p' '[a-\z]'
2268462SApril.Chin@Sun.COMtest_case '<match>' '"/tmp"' '[/\\]*'
2278462SApril.Chin@Sun.COMtest_case '<nomatch>' 'abc' '??**********?****?'
2288462SApril.Chin@Sun.COMtest_case '<nomatch>' 'abc' '??**********?****c'
2298462SApril.Chin@Sun.COMtest_case '<nomatch>' 'abc' '?************c****?****'
2308462SApril.Chin@Sun.COMtest_case '<nomatch>' 'abc' '*c*?**'
2318462SApril.Chin@Sun.COMtest_case '<nomatch>' 'abc' 'a*****c*?**'
2328462SApril.Chin@Sun.COMtest_case '<nomatch>' 'abc' 'a********???*******'
2338462SApril.Chin@Sun.COMtest_case '<nomatch>' "'a'" '[]'
2348462SApril.Chin@Sun.COMtest_case '<nomatch>' 'a' '[]'
2358462SApril.Chin@Sun.COMtest_case '<nomatch>' "'['" '[abc'
2368462SApril.Chin@Sun.COMtest_case '<nomatch>' '[' '[abc'
2374887Schin
2388462SApril.Chin@Sun.COMtest_glob ++Beware '<b> <bb> <bcd> <bdir>' b*
2398462SApril.Chin@Sun.COMtest_glob '<Beware> <b> <bb> <bcd> <bdir>' [bB]*
2404887Schin
2414887Schinif	( set --nocaseglob ) 2>/dev/null
2424887Schinthen
2434887Schin	set --nocaseglob
2444887Schin
2458462SApril.Chin@Sun.COM	test_glob '<Beware> <b> <bb> <bcd> <bdir>' b*
2468462SApril.Chin@Sun.COM	test_glob '<Beware> <b> <bb> <bcd> <bdir>' [b]*
2478462SApril.Chin@Sun.COM	test_glob '<Beware> <b> <bb> <bcd> <bdir>' [bB]*
2484887Schin
2494887Schin	set --nonocaseglob
2504887Schinfi
2514887Schin
2524887Schinif	( set -f ) 2>/dev/null
2534887Schinthen
2544887Schin	set -f
2554887Schin
2568462SApril.Chin@Sun.COM	test_glob '<*>' *
2574887Schin
2584887Schin	set +f
2594887Schinfi
2604887Schin
2614887Schinif	( set --noglob ) 2>/dev/null
2624887Schinthen
2634887Schin	set --noglob
2644887Schin
2658462SApril.Chin@Sun.COM	test_glob '<*>' *
2664887Schin
2674887Schin	set --glob
2684887Schinfi
2694887Schin
2704887SchinFIGNORE='.*|*'
2718462SApril.Chin@Sun.COMtest_glob '<*>' *
2724887Schin
2734887SchinFIGNORE='.*|*c|*e|?'
2748462SApril.Chin@Sun.COMtest_glob '<a-b> <aXb> <abd> <bb> <bcd> <bdir> <ca> <cb> <dd> <man>' *
2754887Schin
2764887SchinFIGNORE='.*|*b|*d|?'
2778462SApril.Chin@Sun.COMtest_glob '<Beware> <abc> <abe> <bdir> <ca> <de> <man>' *
2784887Schin
2794887SchinFIGNORE=
2808462SApril.Chin@Sun.COMtest_glob '<man/man1/sh.1>' */man*/sh.*
2814887Schin
2824887Schinunset FIGNORE
2838462SApril.Chin@Sun.COMtest_glob '<bb> <ca> <cb> <dd> <de>' ??
2848462SApril.Chin@Sun.COMtest_glob '<man/man1/sh.1>' */man*/sh.*
2854887Schin
2864887SchinGLOBIGNORE='.*:*'
2874887Schinset -- *
2884887Schinif	[[ $1 == '*' ]]
2894887Schinthen
2904887Schin	GLOBIGNORE='.*:*c:*e:?'
2918462SApril.Chin@Sun.COM	test_glob '<>' *
2924887Schin
2934887Schin	GLOBIGNORE='.*:*b:*d:?'
2948462SApril.Chin@Sun.COM	test_glob '<>' *
2954887Schin
2964887Schin	unset GLOBIGNORE
2978462SApril.Chin@Sun.COM	test_glob '<>' *
2988462SApril.Chin@Sun.COM	test_glob '<man/man1/sh.1>' */man*/sh.*
2994887Schin
3004887Schin	GLOBIGNORE=
3018462SApril.Chin@Sun.COM	test_glob '<man/man1/sh.1>' */man*/sh.*
3024887Schinfi
3038462SApril.Chin@Sun.COMunset GLOBIGNORE
3048462SApril.Chin@Sun.COM
3058462SApril.Chin@Sun.COMfunction test_sub
3068462SApril.Chin@Sun.COM{
3078462SApril.Chin@Sun.COM	x='${subject'$2'}'
3088462SApril.Chin@Sun.COM	eval g=$x
3098462SApril.Chin@Sun.COM	if	[[ "$g" != "$3" ]]
3108462SApril.Chin@Sun.COM	then	'err_exit' $1 subject="'$subject' $x failed, expected '$3', got '$g'"
3118462SApril.Chin@Sun.COM	fi
3128462SApril.Chin@Sun.COM}
3138462SApril.Chin@Sun.COMalias test_sub='test_sub $LINENO'
3148462SApril.Chin@Sun.COM
3158462SApril.Chin@Sun.COMset --noglob --nobraceexpand
3168462SApril.Chin@Sun.COM
3178462SApril.Chin@Sun.COMsubject='A regular expressions test'
3188462SApril.Chin@Sun.COM
3198462SApril.Chin@Sun.COMtest_sub '/e/#'               'A r#gular expressions test'
3208462SApril.Chin@Sun.COMtest_sub '//e/#'              'A r#gular #xpr#ssions t#st'
3218462SApril.Chin@Sun.COMtest_sub '/[^e]/#'            '# regular expressions test'
3228462SApril.Chin@Sun.COMtest_sub '//[^e]/#'           '###e######e###e########e##'
3238462SApril.Chin@Sun.COMtest_sub '/+(e)/#'            'A r#gular expressions test'
3248462SApril.Chin@Sun.COMtest_sub '//+(e)/#'           'A r#gular #xpr#ssions t#st'
3258462SApril.Chin@Sun.COMtest_sub '/@-(e)/#'           'A r#gular expressions test'
3268462SApril.Chin@Sun.COMtest_sub '//@-(e)/#'          'A r#gular #xpr#ssions t#st'
3278462SApril.Chin@Sun.COMtest_sub '/?(e)/#'            '#A regular expressions test'
3288462SApril.Chin@Sun.COMtest_sub '//?(e)/#'           '#A# #r#g#u#l#a#r# #x#p#r#s#s#i#o#n#s# #t#s#t#'
3298462SApril.Chin@Sun.COMtest_sub '/*(e)/#'            '#A regular expressions test'
3308462SApril.Chin@Sun.COMtest_sub '//*(e)/#'           '#A# #r#g#u#l#a#r# #x#p#r#s#s#i#o#n#s# #t#s#t#'
3318462SApril.Chin@Sun.COMtest_sub '//@(e)/[\1]'        'A r[e]gular [e]xpr[e]ssions t[e]st'
3328462SApril.Chin@Sun.COMtest_sub '//@-(e)/[\1]'       'A r[e]gular [e]xpr[e]ssions t[e]st'
3338462SApril.Chin@Sun.COMtest_sub '//+(e)/[\1]'        'A r[e]gular [e]xpr[e]ssions t[e]st'
3348462SApril.Chin@Sun.COMtest_sub '//+-(e)/[\1]'       'A r[e]gular [e]xpr[e]ssions t[e]st'
3358462SApril.Chin@Sun.COMtest_sub '//@(+(e))/[\1]'     'A r[e]gular [e]xpr[e]ssions t[e]st'
3368462SApril.Chin@Sun.COMtest_sub '//@(+-(e))/[\1]'    'A r[e]gular [e]xpr[e]ssions t[e]st'
3378462SApril.Chin@Sun.COMtest_sub '//-(e)/#'           'A regular expressions test'
3388462SApril.Chin@Sun.COMtest_sub '//--(e)/#'          'A regular expressions test'
3398462SApril.Chin@Sun.COMtest_sub '//?(e)/[\1]'        '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
3408462SApril.Chin@Sun.COMtest_sub '//{0,1}(e)/[\1]'    '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
3418462SApril.Chin@Sun.COMtest_sub '//*(e)/[\1]'        '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
3428462SApril.Chin@Sun.COMtest_sub '//{0,}(e)/[\1]'     '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
3438462SApril.Chin@Sun.COMtest_sub '//@(?(e))/[\1]'     '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
3448462SApril.Chin@Sun.COMtest_sub '//@({0,1}(e))/[\1]' '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
3458462SApril.Chin@Sun.COMtest_sub '//@(*(e))/[\1]'     '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
3468462SApril.Chin@Sun.COMtest_sub '//@({0,}(e))/[\1]'  '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
3478462SApril.Chin@Sun.COMtest_sub '/?-(e)/#'           '#A regular expressions test'
3488462SApril.Chin@Sun.COMtest_sub '/@(?-(e))/[\1]'     '[]A regular expressions test'
3498462SApril.Chin@Sun.COMtest_sub '/!(e)/#'            '#'
3508462SApril.Chin@Sun.COMtest_sub '//!(e)/#'           '#'
3518462SApril.Chin@Sun.COMtest_sub '/@(!(e))/[\1]'      '[A regular expressions test]'
3528462SApril.Chin@Sun.COMtest_sub '//@(!(e))/[\1]'     '[A regular expressions test]'
3538462SApril.Chin@Sun.COM
3548462SApril.Chin@Sun.COMsubject='e'
3558462SApril.Chin@Sun.COM
3568462SApril.Chin@Sun.COMtest_sub '/!(e)/#'            '#e'
3578462SApril.Chin@Sun.COMtest_sub '//!(e)/#'           '#e#'
3588462SApril.Chin@Sun.COMtest_sub '/!(e)/[\1]'         '[]e'
3598462SApril.Chin@Sun.COMtest_sub '//!(e)/[\1]'        '[]e[]'
3608462SApril.Chin@Sun.COMtest_sub '/@(!(e))/[\1]'      '[]e'
3618462SApril.Chin@Sun.COMtest_sub '//@(!(e))/[\1]'     '[]e[]'
3628462SApril.Chin@Sun.COM
3638462SApril.Chin@Sun.COMsubject='a'
3648462SApril.Chin@Sun.COM
3658462SApril.Chin@Sun.COMtest_sub '/@(!(a))/[\1]'      '[]a'
3668462SApril.Chin@Sun.COMtest_sub '//@(!(a))/[\1]'     '[]a[]'
3678462SApril.Chin@Sun.COM
3688462SApril.Chin@Sun.COMsubject='aha'
3698462SApril.Chin@Sun.COM
3708462SApril.Chin@Sun.COMtest_sub '/@(!(a))/[\1]'      '[aha]'
3718462SApril.Chin@Sun.COMtest_sub '//@(!(a))/[\1]'     '[aha]'
3728462SApril.Chin@Sun.COMtest_sub '/@(!(aha))/[\1]'    '[ah]a'
3738462SApril.Chin@Sun.COMtest_sub '//@(!(aha))/[\1]'   '[ah][a]'
3744887Schin
3754887Schinexit $errors
376