xref: /titanic_51/usr/src/lib/libshell/common/tests/glob.sh (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
1da2e3ebdSchin########################################################################
2da2e3ebdSchin#                                                                      #
3da2e3ebdSchin#               This software is part of the ast package               #
4*3e14f97fSRoger A. Faulkner#          Copyright (c) 1982-2010 AT&T Intellectual Property          #
5da2e3ebdSchin#                      and is licensed under the                       #
6da2e3ebdSchin#                  Common Public License, Version 1.0                  #
77c2fbfb3SApril Chin#                    by AT&T Intellectual Property                     #
8da2e3ebdSchin#                                                                      #
9da2e3ebdSchin#                A copy of the License is available at                 #
10da2e3ebdSchin#            http://www.opensource.org/licenses/cpl1.0.txt             #
11da2e3ebdSchin#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
12da2e3ebdSchin#                                                                      #
13da2e3ebdSchin#              Information and Software Systems Research               #
14da2e3ebdSchin#                            AT&T Research                             #
15da2e3ebdSchin#                           Florham Park NJ                            #
16da2e3ebdSchin#                                                                      #
17da2e3ebdSchin#                  David Korn <dgk@research.att.com>                   #
18da2e3ebdSchin#                                                                      #
19da2e3ebdSchin########################################################################
20da2e3ebdSchinfunction err_exit
21da2e3ebdSchin{
227c2fbfb3SApril Chin	print -u2 -r $'\t'"${Command}[$1] ${@:2}"
23da2e3ebdSchin	((errors++))
24da2e3ebdSchin}
25da2e3ebdSchinalias err_exit='err_exit $LINENO'
26da2e3ebdSchin
2734f9b3eeSRoland MainzCommand=${0##*/}
2834f9b3eeSRoland Mainzinteger aware=0 contrary=0 errors=0 ignorant=0
2934f9b3eeSRoland Mainz
3034f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
3134f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT
32da2e3ebdSchin
33da2e3ebdSchinfunction test_glob
34da2e3ebdSchin{
35da2e3ebdSchin	typeset lineno expected drop arg got sep op val add del
367c2fbfb3SApril Chin	lineno=$1
377c2fbfb3SApril Chin	shift
38da2e3ebdSchin	if	[[ $1 == --* ]]
39da2e3ebdSchin	then	del=${1#--}
40da2e3ebdSchin		shift
41da2e3ebdSchin	fi
42da2e3ebdSchin	if	[[ $1 == ++* ]]
43da2e3ebdSchin	then	add=${1#++}
44da2e3ebdSchin		shift
45da2e3ebdSchin	fi
467c2fbfb3SApril Chin	expected=$1
477c2fbfb3SApril Chin	shift
48da2e3ebdSchin	if	(( contrary ))
49da2e3ebdSchin	then	if	[[ $expected == "<Beware> "* ]]
50da2e3ebdSchin		then	expected=${expected#"<Beware> "}
51da2e3ebdSchin			expected="$expected <Beware>"
52da2e3ebdSchin		fi
53da2e3ebdSchin		if	[[ $expected == *"<aXb> <abd>"* ]]
54da2e3ebdSchin		then	expected=${expected/"<aXb> <abd>"/"<abd> <aXb>"}
55da2e3ebdSchin		fi
56da2e3ebdSchin	fi
57da2e3ebdSchin	for arg
58da2e3ebdSchin	do	got="$got$sep<$arg>"
59da2e3ebdSchin		sep=" "
60da2e3ebdSchin	done
61da2e3ebdSchin	if	(( ignorant && aware ))
62da2e3ebdSchin	then	if	[[ $del ]]
63da2e3ebdSchin		then	got="<$del> $got"
64da2e3ebdSchin		fi
65da2e3ebdSchin		if	[[ $add ]]
66da2e3ebdSchin		then	expected="<$add> $expected"
67da2e3ebdSchin		fi
68da2e3ebdSchin	fi
69da2e3ebdSchin	if	[[ $got != "$expected" ]]
707c2fbfb3SApril Chin	then	'err_exit' $lineno "glob -- expected '$expected', got '$got'"
71da2e3ebdSchin	fi
72da2e3ebdSchin}
737c2fbfb3SApril Chinalias test_glob='test_glob $LINENO'
74da2e3ebdSchin
75da2e3ebdSchinfunction test_case
76da2e3ebdSchin{
77da2e3ebdSchin	typeset lineno expected subject pattern got
78da2e3ebdSchin	lineno=$1 expected=$2 subject=$3 pattern=$4
79da2e3ebdSchin	eval "
80da2e3ebdSchin		case $subject in
81da2e3ebdSchin		$pattern)	got='<match>' ;;
82da2e3ebdSchin		*)		got='<nomatch>' ;;
83da2e3ebdSchin		esac
84da2e3ebdSchin	"
85da2e3ebdSchin	if	[[ $got != "$expected" ]]
867c2fbfb3SApril Chin	then	'err_exit' $lineno "case $subject in $pattern) -- expected '$expected', got '$got'"
87da2e3ebdSchin	fi
88da2e3ebdSchin}
897c2fbfb3SApril Chinalias test_case='test_case $LINENO'
90da2e3ebdSchin
91da2e3ebdSchinunset undefined
92da2e3ebdSchin
93da2e3ebdSchinexport LC_COLLATE=C
94da2e3ebdSchin
9534f9b3eeSRoland Mainzcd $tmp || { err_exit "cd $tmp failed"; exit 1; }
96da2e3ebdSchin
97da2e3ebdSchintouch B b
98da2e3ebdSchinset -- *
99da2e3ebdSchincase $* in
100da2e3ebdSchin'b B')	contrary=1 ;;
101da2e3ebdSchinb|B)	ignorant=1 ;;
102da2e3ebdSchinesac
103da2e3ebdSchinset -- $(/bin/sh -c 'echo [a-c]')
104da2e3ebdSchincase $* in
105da2e3ebdSchinB)	aware=1 ;;
106da2e3ebdSchinesac
107da2e3ebdSchinrm -rf *
108da2e3ebdSchin
109da2e3ebdSchintouch a b c d abc abd abe bb bcd ca cb dd de Beware
110da2e3ebdSchinmkdir bdir
111da2e3ebdSchin
1127c2fbfb3SApril Chintest_glob '<a> <abc> <abd> <abe> <X*>' a* X*
1137c2fbfb3SApril Chintest_glob '<a> <abc> <abd> <abe>' \a*
114da2e3ebdSchin
115da2e3ebdSchinif	( set --nullglob ) 2>/dev/null
116da2e3ebdSchinthen
117da2e3ebdSchin	set --nullglob
118da2e3ebdSchin
1197c2fbfb3SApril Chin	test_glob '<a> <abc> <abd> <abe>' a* X*
120da2e3ebdSchin
121da2e3ebdSchin	set --nonullglob
122da2e3ebdSchinfi
123da2e3ebdSchin
124da2e3ebdSchinif	( set --failglob ) 2>/dev/null
125da2e3ebdSchinthen
126da2e3ebdSchin	set --failglob
127da2e3ebdSchin	mkdir tmp
128da2e3ebdSchin	touch tmp/l1 tmp/l2 tmp/l3
129da2e3ebdSchin
1307c2fbfb3SApril Chin	test_glob '' tmp/l[12] tmp/*4 tmp/*3
1317c2fbfb3SApril Chin	test_glob '' tmp/l[12] tmp/*4 tmp/*3
132da2e3ebdSchin
133da2e3ebdSchin	rm -r tmp
134da2e3ebdSchin	set --nofailglob
135da2e3ebdSchinfi
136da2e3ebdSchin
1377c2fbfb3SApril Chintest_glob '<bdir/>' b*/
1387c2fbfb3SApril Chintest_glob '<*>' \*
1397c2fbfb3SApril Chintest_glob '<a*>' 'a*'
1407c2fbfb3SApril Chintest_glob '<a*>' a\*
1417c2fbfb3SApril Chintest_glob '<c> <ca> <cb> <a*> <*q*>' c* a\* *q*
1427c2fbfb3SApril Chintest_glob '<**>' "*"*
1437c2fbfb3SApril Chintest_glob '<**>' \**
1447c2fbfb3SApril Chintest_glob '<\.\./*/>' "\.\./*/"
1457c2fbfb3SApril Chintest_glob '<s/\..*//>' 's/\..*//'
1467c2fbfb3SApril Chintest_glob '</^root:/{s/^[!:]*:[!:]*:\([!:]*\).*$/\1/>' "/^root:/{s/^[!:]*:[!:]*:\([!:]*\).*"'$'"/\1/"
1477c2fbfb3SApril Chintest_glob '<abc> <abd> <abe> <bb> <cb>' [a-c]b*
1487c2fbfb3SApril Chintest_glob ++Beware '<abd> <abe> <bb> <bcd> <bdir> <ca> <cb> <dd> <de>' [a-y]*[!c]
1497c2fbfb3SApril Chintest_glob '<abd> <abe>' a*[!c]
150da2e3ebdSchin
151da2e3ebdSchintouch a-b aXb
152da2e3ebdSchin
1537c2fbfb3SApril Chintest_glob '<a-b> <aXb>' a[X-]b
154da2e3ebdSchin
155da2e3ebdSchintouch .x .y
156da2e3ebdSchin
1577c2fbfb3SApril Chintest_glob --Beware '<Beware> <d> <dd> <de>' [!a-c]*
158da2e3ebdSchin
159da2e3ebdSchinif	mkdir a\*b 2>/dev/null
160da2e3ebdSchinthen
161da2e3ebdSchin	touch a\*b/ooo
162da2e3ebdSchin
1637c2fbfb3SApril Chin	test_glob '<a*b/ooo>' a\*b/*
1647c2fbfb3SApril Chin	test_glob '<a*b/ooo>' a\*?/*
1657c2fbfb3SApril Chin	test_case '<match>' '!7' '*\!*'
1667c2fbfb3SApril Chin	test_case '<match>' 'r.*' '*.\*'
1677c2fbfb3SApril Chin	test_glob '<abc>' a[b]c
1687c2fbfb3SApril Chin	test_glob '<abc>' a["b"]c
1697c2fbfb3SApril Chin	test_glob '<abc>' a[\b]c
1707c2fbfb3SApril Chin	test_glob '<abc>' a?c
1717c2fbfb3SApril Chin	test_case '<match>' 'abc' 'a"b"c'
1727c2fbfb3SApril Chin	test_case '<match>' 'abc' 'a*c'
1737c2fbfb3SApril Chin	test_case '<nomatch>' 'abc' '"a?c"'
1747c2fbfb3SApril Chin	test_case '<nomatch>' 'abc' 'a\*c'
1757c2fbfb3SApril Chin	test_case '<nomatch>' 'abc' 'a\[b]c'
1767c2fbfb3SApril Chin	test_case '<match>' '"$undefined"' '""'
1777c2fbfb3SApril Chin	test_case '<match>' 'abc' 'a["\b"]c'
178da2e3ebdSchin
179da2e3ebdSchin	rm -rf mkdir a\*b
180da2e3ebdSchinfi
181da2e3ebdSchin
182da2e3ebdSchinmkdir man
183da2e3ebdSchinmkdir man/man1
184da2e3ebdSchintouch man/man1/sh.1
185da2e3ebdSchin
1867c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' */man*/sh.*
1877c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' $(echo */man*/sh.*)
1887c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' "$(echo */man*/sh.*)"
189da2e3ebdSchin
1907c2fbfb3SApril Chintest_case '<match>' 'abc' 'a***c'
1917c2fbfb3SApril Chintest_case '<match>' 'abc' 'a*****?c'
1927c2fbfb3SApril Chintest_case '<match>' 'abc' '?*****??'
1937c2fbfb3SApril Chintest_case '<match>' 'abc' '*****??'
1947c2fbfb3SApril Chintest_case '<match>' 'abc' '*****??c'
1957c2fbfb3SApril Chintest_case '<match>' 'abc' '?*****?c'
1967c2fbfb3SApril Chintest_case '<match>' 'abc' '?***?****c'
1977c2fbfb3SApril Chintest_case '<match>' 'abc' '?***?****?'
1987c2fbfb3SApril Chintest_case '<match>' 'abc' '?***?****'
1997c2fbfb3SApril Chintest_case '<match>' 'abc' '*******c'
2007c2fbfb3SApril Chintest_case '<match>' 'abc' '*******?'
2017c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a*cd**?**??k'
2027c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a**?**cd**?**??k'
2037c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a**?**cd**?**??k***'
2047c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a**?**cd**?**??***k'
2057c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a**?**cd**?**??***k**'
2067c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a****c**?**??*****'
2077c2fbfb3SApril Chintest_case '<match>' "'-'" '[-abc]'
2087c2fbfb3SApril Chintest_case '<match>' "'-'" '[abc-]'
2097c2fbfb3SApril Chintest_case '<match>' "'\\'" '\\'
2107c2fbfb3SApril Chintest_case '<match>' "'\\'" '[\\]'
2117c2fbfb3SApril Chintest_case '<match>' "'\\'" "'\\'"
2127c2fbfb3SApril Chintest_case '<match>' "'['" '[[]'
2137c2fbfb3SApril Chintest_case '<match>' '[' '[[]'
2147c2fbfb3SApril Chintest_case '<match>' "'['" '['
2157c2fbfb3SApril Chintest_case '<match>' '[' '['
2167c2fbfb3SApril Chintest_case '<match>' "'[abc'" "'['*"
2177c2fbfb3SApril Chintest_case '<nomatch>' "'[abc'" '[*'
2187c2fbfb3SApril Chintest_case '<match>' '[abc' "'['*"
2197c2fbfb3SApril Chintest_case '<nomatch>' '[abc' '[*'
2207c2fbfb3SApril Chintest_case '<match>' 'abd' "a[b/c]d"
2217c2fbfb3SApril Chintest_case '<match>' 'a/d' "a[b/c]d"
2227c2fbfb3SApril Chintest_case '<match>' 'acd' "a[b/c]d"
2237c2fbfb3SApril Chintest_case '<match>' "']'" '[]]'
2247c2fbfb3SApril Chintest_case '<match>' "'-'" '[]-]'
2257c2fbfb3SApril Chintest_case '<match>' 'p' '[a-\z]'
2267c2fbfb3SApril Chintest_case '<match>' '"/tmp"' '[/\\]*'
2277c2fbfb3SApril Chintest_case '<nomatch>' 'abc' '??**********?****?'
2287c2fbfb3SApril Chintest_case '<nomatch>' 'abc' '??**********?****c'
2297c2fbfb3SApril Chintest_case '<nomatch>' 'abc' '?************c****?****'
2307c2fbfb3SApril Chintest_case '<nomatch>' 'abc' '*c*?**'
2317c2fbfb3SApril Chintest_case '<nomatch>' 'abc' 'a*****c*?**'
2327c2fbfb3SApril Chintest_case '<nomatch>' 'abc' 'a********???*******'
2337c2fbfb3SApril Chintest_case '<nomatch>' "'a'" '[]'
2347c2fbfb3SApril Chintest_case '<nomatch>' 'a' '[]'
2357c2fbfb3SApril Chintest_case '<nomatch>' "'['" '[abc'
2367c2fbfb3SApril Chintest_case '<nomatch>' '[' '[abc'
237da2e3ebdSchin
2387c2fbfb3SApril Chintest_glob ++Beware '<b> <bb> <bcd> <bdir>' b*
2397c2fbfb3SApril Chintest_glob '<Beware> <b> <bb> <bcd> <bdir>' [bB]*
240da2e3ebdSchin
241da2e3ebdSchinif	( set --nocaseglob ) 2>/dev/null
242da2e3ebdSchinthen
243da2e3ebdSchin	set --nocaseglob
244da2e3ebdSchin
2457c2fbfb3SApril Chin	test_glob '<Beware> <b> <bb> <bcd> <bdir>' b*
2467c2fbfb3SApril Chin	test_glob '<Beware> <b> <bb> <bcd> <bdir>' [b]*
2477c2fbfb3SApril Chin	test_glob '<Beware> <b> <bb> <bcd> <bdir>' [bB]*
248da2e3ebdSchin
249da2e3ebdSchin	set --nonocaseglob
250da2e3ebdSchinfi
251da2e3ebdSchin
252da2e3ebdSchinif	( set -f ) 2>/dev/null
253da2e3ebdSchinthen
254da2e3ebdSchin	set -f
255da2e3ebdSchin
2567c2fbfb3SApril Chin	test_glob '<*>' *
257da2e3ebdSchin
258da2e3ebdSchin	set +f
259da2e3ebdSchinfi
260da2e3ebdSchin
261da2e3ebdSchinif	( set --noglob ) 2>/dev/null
262da2e3ebdSchinthen
263da2e3ebdSchin	set --noglob
264da2e3ebdSchin
2657c2fbfb3SApril Chin	test_glob '<*>' *
266da2e3ebdSchin
267da2e3ebdSchin	set --glob
268da2e3ebdSchinfi
269da2e3ebdSchin
270da2e3ebdSchinFIGNORE='.*|*'
2717c2fbfb3SApril Chintest_glob '<*>' *
272da2e3ebdSchin
273da2e3ebdSchinFIGNORE='.*|*c|*e|?'
2747c2fbfb3SApril Chintest_glob '<a-b> <aXb> <abd> <bb> <bcd> <bdir> <ca> <cb> <dd> <man>' *
275da2e3ebdSchin
276da2e3ebdSchinFIGNORE='.*|*b|*d|?'
2777c2fbfb3SApril Chintest_glob '<Beware> <abc> <abe> <bdir> <ca> <de> <man>' *
278da2e3ebdSchin
279da2e3ebdSchinFIGNORE=
2807c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' */man*/sh.*
281da2e3ebdSchin
282da2e3ebdSchinunset FIGNORE
2837c2fbfb3SApril Chintest_glob '<bb> <ca> <cb> <dd> <de>' ??
2847c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' */man*/sh.*
285da2e3ebdSchin
286da2e3ebdSchinGLOBIGNORE='.*:*'
287da2e3ebdSchinset -- *
288da2e3ebdSchinif	[[ $1 == '*' ]]
289da2e3ebdSchinthen
290da2e3ebdSchin	GLOBIGNORE='.*:*c:*e:?'
2917c2fbfb3SApril Chin	test_glob '<>' *
292da2e3ebdSchin
293da2e3ebdSchin	GLOBIGNORE='.*:*b:*d:?'
2947c2fbfb3SApril Chin	test_glob '<>' *
295da2e3ebdSchin
296da2e3ebdSchin	unset GLOBIGNORE
2977c2fbfb3SApril Chin	test_glob '<>' *
2987c2fbfb3SApril Chin	test_glob '<man/man1/sh.1>' */man*/sh.*
299da2e3ebdSchin
300da2e3ebdSchin	GLOBIGNORE=
3017c2fbfb3SApril Chin	test_glob '<man/man1/sh.1>' */man*/sh.*
302da2e3ebdSchinfi
3037c2fbfb3SApril Chinunset GLOBIGNORE
3047c2fbfb3SApril Chin
3057c2fbfb3SApril Chinfunction test_sub
3067c2fbfb3SApril Chin{
3077c2fbfb3SApril Chin	x='${subject'$2'}'
3087c2fbfb3SApril Chin	eval g=$x
3097c2fbfb3SApril Chin	if	[[ "$g" != "$3" ]]
3107c2fbfb3SApril Chin	then	'err_exit' $1 subject="'$subject' $x failed, expected '$3', got '$g'"
3117c2fbfb3SApril Chin	fi
3127c2fbfb3SApril Chin}
3137c2fbfb3SApril Chinalias test_sub='test_sub $LINENO'
3147c2fbfb3SApril Chin
3157c2fbfb3SApril Chinset --noglob --nobraceexpand
3167c2fbfb3SApril Chin
3177c2fbfb3SApril Chinsubject='A regular expressions test'
3187c2fbfb3SApril Chin
3197c2fbfb3SApril Chintest_sub '/e/#'               'A r#gular expressions test'
3207c2fbfb3SApril Chintest_sub '//e/#'              'A r#gular #xpr#ssions t#st'
3217c2fbfb3SApril Chintest_sub '/[^e]/#'            '# regular expressions test'
3227c2fbfb3SApril Chintest_sub '//[^e]/#'           '###e######e###e########e##'
3237c2fbfb3SApril Chintest_sub '/+(e)/#'            'A r#gular expressions test'
3247c2fbfb3SApril Chintest_sub '//+(e)/#'           'A r#gular #xpr#ssions t#st'
3257c2fbfb3SApril Chintest_sub '/@-(e)/#'           'A r#gular expressions test'
3267c2fbfb3SApril Chintest_sub '//@-(e)/#'          'A r#gular #xpr#ssions t#st'
3277c2fbfb3SApril Chintest_sub '/?(e)/#'            '#A regular expressions test'
3287c2fbfb3SApril Chintest_sub '//?(e)/#'           '#A# #r#g#u#l#a#r# #x#p#r#s#s#i#o#n#s# #t#s#t#'
3297c2fbfb3SApril Chintest_sub '/*(e)/#'            '#A regular expressions test'
3307c2fbfb3SApril Chintest_sub '//*(e)/#'           '#A# #r#g#u#l#a#r# #x#p#r#s#s#i#o#n#s# #t#s#t#'
3317c2fbfb3SApril Chintest_sub '//@(e)/[\1]'        'A r[e]gular [e]xpr[e]ssions t[e]st'
3327c2fbfb3SApril Chintest_sub '//@-(e)/[\1]'       'A r[e]gular [e]xpr[e]ssions t[e]st'
3337c2fbfb3SApril Chintest_sub '//+(e)/[\1]'        'A r[e]gular [e]xpr[e]ssions t[e]st'
3347c2fbfb3SApril Chintest_sub '//+-(e)/[\1]'       'A r[e]gular [e]xpr[e]ssions t[e]st'
3357c2fbfb3SApril Chintest_sub '//@(+(e))/[\1]'     'A r[e]gular [e]xpr[e]ssions t[e]st'
3367c2fbfb3SApril Chintest_sub '//@(+-(e))/[\1]'    'A r[e]gular [e]xpr[e]ssions t[e]st'
3377c2fbfb3SApril Chintest_sub '//-(e)/#'           'A regular expressions test'
3387c2fbfb3SApril Chintest_sub '//--(e)/#'          'A regular expressions test'
3397c2fbfb3SApril Chintest_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[]'
3407c2fbfb3SApril Chintest_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[]'
3417c2fbfb3SApril Chintest_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[]'
3427c2fbfb3SApril Chintest_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[]'
3437c2fbfb3SApril Chintest_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[]'
3447c2fbfb3SApril Chintest_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[]'
3457c2fbfb3SApril Chintest_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[]'
3467c2fbfb3SApril Chintest_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[]'
3477c2fbfb3SApril Chintest_sub '/?-(e)/#'           '#A regular expressions test'
3487c2fbfb3SApril Chintest_sub '/@(?-(e))/[\1]'     '[]A regular expressions test'
3497c2fbfb3SApril Chintest_sub '/!(e)/#'            '#'
3507c2fbfb3SApril Chintest_sub '//!(e)/#'           '#'
3517c2fbfb3SApril Chintest_sub '/@(!(e))/[\1]'      '[A regular expressions test]'
3527c2fbfb3SApril Chintest_sub '//@(!(e))/[\1]'     '[A regular expressions test]'
3537c2fbfb3SApril Chin
3547c2fbfb3SApril Chinsubject='e'
3557c2fbfb3SApril Chin
3567c2fbfb3SApril Chintest_sub '/!(e)/#'            '#e'
3577c2fbfb3SApril Chintest_sub '//!(e)/#'           '#e#'
3587c2fbfb3SApril Chintest_sub '/!(e)/[\1]'         '[]e'
3597c2fbfb3SApril Chintest_sub '//!(e)/[\1]'        '[]e[]'
3607c2fbfb3SApril Chintest_sub '/@(!(e))/[\1]'      '[]e'
3617c2fbfb3SApril Chintest_sub '//@(!(e))/[\1]'     '[]e[]'
3627c2fbfb3SApril Chin
3637c2fbfb3SApril Chinsubject='a'
3647c2fbfb3SApril Chin
3657c2fbfb3SApril Chintest_sub '/@(!(a))/[\1]'      '[]a'
3667c2fbfb3SApril Chintest_sub '//@(!(a))/[\1]'     '[]a[]'
3677c2fbfb3SApril Chin
3687c2fbfb3SApril Chinsubject='aha'
3697c2fbfb3SApril Chin
3707c2fbfb3SApril Chintest_sub '/@(!(a))/[\1]'      '[aha]'
3717c2fbfb3SApril Chintest_sub '//@(!(a))/[\1]'     '[aha]'
3727c2fbfb3SApril Chintest_sub '/@(!(aha))/[\1]'    '[ah]a'
3737c2fbfb3SApril Chintest_sub '//@(!(aha))/[\1]'   '[ah][a]'
374da2e3ebdSchin
375da2e3ebdSchinexit $errors
376