1da2e3ebdSchin########################################################################
2da2e3ebdSchin#                                                                      #
3da2e3ebdSchin#               This software is part of the ast package               #
4*b30d1939SAndy Fiddaman#          Copyright (c) 1982-2012 AT&T Intellectual Property          #
5da2e3ebdSchin#                      and is licensed under the                       #
6*b30d1939SAndy Fiddaman#                 Eclipse Public License, Version 1.0                  #
77c2fbfb3SApril Chin#                    by AT&T Intellectual Property                     #
8da2e3ebdSchin#                                                                      #
9da2e3ebdSchin#                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)         #
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}"
23*b30d1939SAndy Fiddaman	((Errors++))
24da2e3ebdSchin}
25da2e3ebdSchinalias err_exit='err_exit $LINENO'
26da2e3ebdSchin
2734f9b3eeSRoland MainzCommand=${0##*/}
28*b30d1939SAndy Fiddamaninteger 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
9334f9b3eeSRoland Mainzcd $tmp || { err_exit "cd $tmp failed"; exit 1; }
94da2e3ebdSchin
95*b30d1939SAndy Fiddamanexport LC_COLLATE=C
96da2e3ebdSchintouch B b
97da2e3ebdSchinset -- *
98da2e3ebdSchincase $* in
99da2e3ebdSchin'b B')	contrary=1 ;;
100da2e3ebdSchinb|B)	ignorant=1 ;;
101da2e3ebdSchinesac
102*b30d1939SAndy Fiddamanset -- $(LC_ALL=C /bin/sh -c 'echo [a-c]')
103da2e3ebdSchincase $* in
104da2e3ebdSchinB)	aware=1 ;;
105da2e3ebdSchinesac
106da2e3ebdSchinrm -rf *
107da2e3ebdSchin
108da2e3ebdSchintouch a b c d abc abd abe bb bcd ca cb dd de Beware
109da2e3ebdSchinmkdir bdir
110da2e3ebdSchin
1117c2fbfb3SApril Chintest_glob '<a> <abc> <abd> <abe> <X*>' a* X*
1127c2fbfb3SApril Chintest_glob '<a> <abc> <abd> <abe>' \a*
113da2e3ebdSchin
114da2e3ebdSchinif	( set --nullglob ) 2>/dev/null
115da2e3ebdSchinthen
116da2e3ebdSchin	set --nullglob
117da2e3ebdSchin
1187c2fbfb3SApril Chin	test_glob '<a> <abc> <abd> <abe>' a* X*
119da2e3ebdSchin
120da2e3ebdSchin	set --nonullglob
121da2e3ebdSchinfi
122da2e3ebdSchin
123da2e3ebdSchinif	( set --failglob ) 2>/dev/null
124da2e3ebdSchinthen
125da2e3ebdSchin	set --failglob
126da2e3ebdSchin	mkdir tmp
127da2e3ebdSchin	touch tmp/l1 tmp/l2 tmp/l3
128da2e3ebdSchin
1297c2fbfb3SApril Chin	test_glob '' tmp/l[12] tmp/*4 tmp/*3
1307c2fbfb3SApril Chin	test_glob '' tmp/l[12] tmp/*4 tmp/*3
131da2e3ebdSchin
132da2e3ebdSchin	rm -r tmp
133da2e3ebdSchin	set --nofailglob
134da2e3ebdSchinfi
135da2e3ebdSchin
1367c2fbfb3SApril Chintest_glob '<bdir/>' b*/
1377c2fbfb3SApril Chintest_glob '<*>' \*
1387c2fbfb3SApril Chintest_glob '<a*>' 'a*'
1397c2fbfb3SApril Chintest_glob '<a*>' a\*
1407c2fbfb3SApril Chintest_glob '<c> <ca> <cb> <a*> <*q*>' c* a\* *q*
1417c2fbfb3SApril Chintest_glob '<**>' "*"*
1427c2fbfb3SApril Chintest_glob '<**>' \**
1437c2fbfb3SApril Chintest_glob '<\.\./*/>' "\.\./*/"
1447c2fbfb3SApril Chintest_glob '<s/\..*//>' 's/\..*//'
1457c2fbfb3SApril Chintest_glob '</^root:/{s/^[!:]*:[!:]*:\([!:]*\).*$/\1/>' "/^root:/{s/^[!:]*:[!:]*:\([!:]*\).*"'$'"/\1/"
1467c2fbfb3SApril Chintest_glob '<abc> <abd> <abe> <bb> <cb>' [a-c]b*
1477c2fbfb3SApril Chintest_glob ++Beware '<abd> <abe> <bb> <bcd> <bdir> <ca> <cb> <dd> <de>' [a-y]*[!c]
1487c2fbfb3SApril Chintest_glob '<abd> <abe>' a*[!c]
149da2e3ebdSchin
150da2e3ebdSchintouch a-b aXb
151da2e3ebdSchin
1527c2fbfb3SApril Chintest_glob '<a-b> <aXb>' a[X-]b
153da2e3ebdSchin
154da2e3ebdSchintouch .x .y
155da2e3ebdSchin
1567c2fbfb3SApril Chintest_glob --Beware '<Beware> <d> <dd> <de>' [!a-c]*
157da2e3ebdSchin
158da2e3ebdSchinif	mkdir a\*b 2>/dev/null
159da2e3ebdSchinthen
160da2e3ebdSchin	touch a\*b/ooo
161da2e3ebdSchin
1627c2fbfb3SApril Chin	test_glob '<a*b/ooo>' a\*b/*
1637c2fbfb3SApril Chin	test_glob '<a*b/ooo>' a\*?/*
1647c2fbfb3SApril Chin	test_case '<match>' '!7' '*\!*'
1657c2fbfb3SApril Chin	test_case '<match>' 'r.*' '*.\*'
1667c2fbfb3SApril Chin	test_glob '<abc>' a[b]c
1677c2fbfb3SApril Chin	test_glob '<abc>' a["b"]c
1687c2fbfb3SApril Chin	test_glob '<abc>' a[\b]c
1697c2fbfb3SApril Chin	test_glob '<abc>' a?c
1707c2fbfb3SApril Chin	test_case '<match>' 'abc' 'a"b"c'
1717c2fbfb3SApril Chin	test_case '<match>' 'abc' 'a*c'
1727c2fbfb3SApril Chin	test_case '<nomatch>' 'abc' '"a?c"'
1737c2fbfb3SApril Chin	test_case '<nomatch>' 'abc' 'a\*c'
1747c2fbfb3SApril Chin	test_case '<nomatch>' 'abc' 'a\[b]c'
1757c2fbfb3SApril Chin	test_case '<match>' '"$undefined"' '""'
1767c2fbfb3SApril Chin	test_case '<match>' 'abc' 'a["\b"]c'
177da2e3ebdSchin
178da2e3ebdSchin	rm -rf mkdir a\*b
179da2e3ebdSchinfi
180da2e3ebdSchin
181da2e3ebdSchinmkdir man
182da2e3ebdSchinmkdir man/man1
183da2e3ebdSchintouch man/man1/sh.1
184da2e3ebdSchin
1857c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' */man*/sh.*
1867c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' $(echo */man*/sh.*)
1877c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' "$(echo */man*/sh.*)"
1887c2fbfb3SApril Chin
1897c2fbfb3SApril Chintest_case '<match>' 'abc' 'a***c'
1907c2fbfb3SApril Chintest_case '<match>' 'abc' 'a*****?c'
1917c2fbfb3SApril Chintest_case '<match>' 'abc' '?*****??'
1927c2fbfb3SApril Chintest_case '<match>' 'abc' '*****??'
1937c2fbfb3SApril Chintest_case '<match>' 'abc' '*****??c'
1947c2fbfb3SApril Chintest_case '<match>' 'abc' '?*****?c'
1957c2fbfb3SApril Chintest_case '<match>' 'abc' '?***?****c'
1967c2fbfb3SApril Chintest_case '<match>' 'abc' '?***?****?'
1977c2fbfb3SApril Chintest_case '<match>' 'abc' '?***?****'
1987c2fbfb3SApril Chintest_case '<match>' 'abc' '*******c'
1997c2fbfb3SApril Chintest_case '<match>' 'abc' '*******?'
2007c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a*cd**?**??k'
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****c**?**??*****'
2067c2fbfb3SApril Chintest_case '<match>' "'-'" '[-abc]'
2077c2fbfb3SApril Chintest_case '<match>' "'-'" '[abc-]'
2087c2fbfb3SApril Chintest_case '<match>' "'\\'" '\\'
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>' "'[abc'" "'['*"
2167c2fbfb3SApril Chintest_case '<nomatch>' "'[abc'" '[*'
2177c2fbfb3SApril Chintest_case '<match>' '[abc' "'['*"
2187c2fbfb3SApril Chintest_case '<nomatch>' '[abc' '[*'
2197c2fbfb3SApril Chintest_case '<match>' 'abd' "a[b/c]d"
2207c2fbfb3SApril Chintest_case '<match>' 'a/d' "a[b/c]d"
2217c2fbfb3SApril Chintest_case '<match>' 'acd' "a[b/c]d"
2227c2fbfb3SApril Chintest_case '<match>' "']'" '[]]'
2237c2fbfb3SApril Chintest_case '<match>' "'-'" '[]-]'
2247c2fbfb3SApril Chintest_case '<match>' 'p' '[a-\z]'
2257c2fbfb3SApril Chintest_case '<match>' '"/tmp"' '[/\\]*'
2267c2fbfb3SApril Chintest_case '<nomatch>' 'abc' '??**********?****?'
2277c2fbfb3SApril Chintest_case '<nomatch>' 'abc' '??**********?****c'
2287c2fbfb3SApril Chintest_case '<nomatch>' 'abc' '?************c****?****'
2297c2fbfb3SApril Chintest_case '<nomatch>' 'abc' '*c*?**'
2307c2fbfb3SApril Chintest_case '<nomatch>' 'abc' 'a*****c*?**'
2317c2fbfb3SApril Chintest_case '<nomatch>' 'abc' 'a********???*******'
2327c2fbfb3SApril Chintest_case '<nomatch>' "'a'" '[]'
2337c2fbfb3SApril Chintest_case '<nomatch>' 'a' '[]'
2347c2fbfb3SApril Chintest_case '<nomatch>' "'['" '[abc'
2357c2fbfb3SApril Chintest_case '<nomatch>' '[' '[abc'
2367c2fbfb3SApril Chin
2377c2fbfb3SApril Chintest_glob ++Beware '<b> <bb> <bcd> <bdir>' b*
2387c2fbfb3SApril Chintest_glob '<Beware> <b> <bb> <bcd> <bdir>' [bB]*
239da2e3ebdSchin
240da2e3ebdSchinif	( set --nocaseglob ) 2>/dev/null
241da2e3ebdSchinthen
242da2e3ebdSchin	set --nocaseglob
243da2e3ebdSchin
2447c2fbfb3SApril Chin	test_glob '<Beware> <b> <bb> <bcd> <bdir>' b*
2457c2fbfb3SApril Chin	test_glob '<Beware> <b> <bb> <bcd> <bdir>' [b]*
2467c2fbfb3SApril Chin	test_glob '<Beware> <b> <bb> <bcd> <bdir>' [bB]*
247da2e3ebdSchin
248da2e3ebdSchin	set --nonocaseglob
249da2e3ebdSchinfi
250da2e3ebdSchin
251da2e3ebdSchinif	( set -f ) 2>/dev/null
252da2e3ebdSchinthen
253da2e3ebdSchin	set -f
254da2e3ebdSchin
2557c2fbfb3SApril Chin	test_glob '<*>' *
256da2e3ebdSchin
257da2e3ebdSchin	set +f
258da2e3ebdSchinfi
259da2e3ebdSchin
260da2e3ebdSchinif	( set --noglob ) 2>/dev/null
261da2e3ebdSchinthen
262da2e3ebdSchin	set --noglob
263da2e3ebdSchin
2647c2fbfb3SApril Chin	test_glob '<*>' *
265da2e3ebdSchin
266da2e3ebdSchin	set --glob
267da2e3ebdSchinfi
268da2e3ebdSchin
269*b30d1939SAndy FiddamanFIGNORE='@(.*|*)'
2707c2fbfb3SApril Chintest_glob '<*>' *
271da2e3ebdSchin
272*b30d1939SAndy FiddamanFIGNORE='@(.*|*c|*e|?)'
2737c2fbfb3SApril Chintest_glob '<a-b> <aXb> <abd> <bb> <bcd> <bdir> <ca> <cb> <dd> <man>' *
274da2e3ebdSchin
275*b30d1939SAndy FiddamanFIGNORE='@(.*|*b|*d|?)'
2767c2fbfb3SApril Chintest_glob '<Beware> <abc> <abe> <bdir> <ca> <de> <man>' *
277da2e3ebdSchin
278da2e3ebdSchinFIGNORE=
2797c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' */man*/sh.*
280da2e3ebdSchin
281da2e3ebdSchinunset FIGNORE
2827c2fbfb3SApril Chintest_glob '<bb> <ca> <cb> <dd> <de>' ??
2837c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' */man*/sh.*
284da2e3ebdSchin
285da2e3ebdSchinGLOBIGNORE='.*:*'
286da2e3ebdSchinset -- *
287da2e3ebdSchinif	[[ $1 == '*' ]]
288da2e3ebdSchinthen
289da2e3ebdSchin	GLOBIGNORE='.*:*c:*e:?'
2907c2fbfb3SApril Chin	test_glob '<>' *
291da2e3ebdSchin
292da2e3ebdSchin	GLOBIGNORE='.*:*b:*d:?'
2937c2fbfb3SApril Chin	test_glob '<>' *
294da2e3ebdSchin
295da2e3ebdSchin	unset GLOBIGNORE
2967c2fbfb3SApril Chin	test_glob '<>' *
2977c2fbfb3SApril Chin	test_glob '<man/man1/sh.1>' */man*/sh.*
298da2e3ebdSchin
299da2e3ebdSchin	GLOBIGNORE=
3007c2fbfb3SApril Chin	test_glob '<man/man1/sh.1>' */man*/sh.*
301da2e3ebdSchinfi
3027c2fbfb3SApril Chinunset GLOBIGNORE
3037c2fbfb3SApril Chin
3047c2fbfb3SApril Chinfunction test_sub
3057c2fbfb3SApril Chin{
3067c2fbfb3SApril Chin	x='${subject'$2'}'
3077c2fbfb3SApril Chin	eval g=$x
3087c2fbfb3SApril Chin	if	[[ "$g" != "$3" ]]
3097c2fbfb3SApril Chin	then	'err_exit' $1 subject="'$subject' $x failed, expected '$3', got '$g'"
3107c2fbfb3SApril Chin	fi
3117c2fbfb3SApril Chin}
3127c2fbfb3SApril Chinalias test_sub='test_sub $LINENO'
3137c2fbfb3SApril Chin
3147c2fbfb3SApril Chinset --noglob --nobraceexpand
3157c2fbfb3SApril Chin
3167c2fbfb3SApril Chinsubject='A regular expressions test'
3177c2fbfb3SApril Chin
3187c2fbfb3SApril Chintest_sub '/e/#'               'A r#gular expressions test'
3197c2fbfb3SApril Chintest_sub '//e/#'              'A r#gular #xpr#ssions t#st'
3207c2fbfb3SApril Chintest_sub '/[^e]/#'            '# regular expressions test'
3217c2fbfb3SApril Chintest_sub '//[^e]/#'           '###e######e###e########e##'
3227c2fbfb3SApril Chintest_sub '/+(e)/#'            'A r#gular expressions test'
3237c2fbfb3SApril Chintest_sub '//+(e)/#'           'A r#gular #xpr#ssions t#st'
3247c2fbfb3SApril Chintest_sub '/@-(e)/#'           'A r#gular expressions test'
3257c2fbfb3SApril Chintest_sub '//@-(e)/#'          'A r#gular #xpr#ssions t#st'
3267c2fbfb3SApril Chintest_sub '/?(e)/#'            '#A regular expressions test'
3277c2fbfb3SApril Chintest_sub '//?(e)/#'           '#A# #r#g#u#l#a#r# #x#p#r#s#s#i#o#n#s# #t#s#t#'
3287c2fbfb3SApril Chintest_sub '/*(e)/#'            '#A regular expressions test'
3297c2fbfb3SApril Chintest_sub '//*(e)/#'           '#A# #r#g#u#l#a#r# #x#p#r#s#s#i#o#n#s# #t#s#t#'
3307c2fbfb3SApril Chintest_sub '//@(e)/[\1]'        'A r[e]gular [e]xpr[e]ssions t[e]st'
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)/#'           'A regular expressions test'
3377c2fbfb3SApril Chintest_sub '//--(e)/#'          'A regular expressions test'
3387c2fbfb3SApril 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[]'
3397c2fbfb3SApril 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[]'
3407c2fbfb3SApril 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[]'
3417c2fbfb3SApril 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[]'
3427c2fbfb3SApril 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[]'
3437c2fbfb3SApril 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[]'
3447c2fbfb3SApril 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[]'
3457c2fbfb3SApril 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[]'
3467c2fbfb3SApril Chintest_sub '/?-(e)/#'           '#A regular expressions test'
3477c2fbfb3SApril Chintest_sub '/@(?-(e))/[\1]'     '[]A regular expressions test'
3487c2fbfb3SApril Chintest_sub '/!(e)/#'            '#'
3497c2fbfb3SApril Chintest_sub '//!(e)/#'           '#'
3507c2fbfb3SApril Chintest_sub '/@(!(e))/[\1]'      '[A regular expressions test]'
3517c2fbfb3SApril Chintest_sub '//@(!(e))/[\1]'     '[A regular expressions test]'
3527c2fbfb3SApril Chin
3537c2fbfb3SApril Chinsubject='e'
3547c2fbfb3SApril Chin
3557c2fbfb3SApril Chintest_sub '/!(e)/#'            '#e'
3567c2fbfb3SApril Chintest_sub '//!(e)/#'           '#e#'
3577c2fbfb3SApril Chintest_sub '/!(e)/[\1]'         '[]e'
3587c2fbfb3SApril Chintest_sub '//!(e)/[\1]'        '[]e[]'
3597c2fbfb3SApril Chintest_sub '/@(!(e))/[\1]'      '[]e'
3607c2fbfb3SApril Chintest_sub '//@(!(e))/[\1]'     '[]e[]'
3617c2fbfb3SApril Chin
3627c2fbfb3SApril Chinsubject='a'
3637c2fbfb3SApril Chin
3647c2fbfb3SApril Chintest_sub '/@(!(a))/[\1]'      '[]a'
3657c2fbfb3SApril Chintest_sub '//@(!(a))/[\1]'     '[]a[]'
3667c2fbfb3SApril Chin
3677c2fbfb3SApril Chinsubject='aha'
3687c2fbfb3SApril Chin
3697c2fbfb3SApril Chintest_sub '/@(!(a))/[\1]'      '[aha]'
3707c2fbfb3SApril Chintest_sub '//@(!(a))/[\1]'     '[aha]'
3717c2fbfb3SApril Chintest_sub '/@(!(aha))/[\1]'    '[ah]a'
3727c2fbfb3SApril Chintest_sub '//@(!(aha))/[\1]'   '[ah][a]'
373da2e3ebdSchin
374*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125))
375