add some tests
fix some bugs in () ordering and rune processing

R=rsc
DELTA=72  (27 added, 5 deleted, 40 changed)
OCL=17147
CL=17147
diff --git a/usr/r/regexp/main.go b/usr/r/regexp/main.go
index 25ec07a..c89f9b5 100644
--- a/usr/r/regexp/main.go
+++ b/usr/r/regexp/main.go
@@ -10,22 +10,22 @@
 )
 
 var good_re = []string{
-	``
-,	`.`
-,	`^.$`
-,	`a`
-,	`a*`
-,	`a+`
-,	`a?`
-,	`a|b`
-,	`a*|b*`
-,	`(a*|b)(c*|d)`
-,	`[a-z]`
-,	`[a-abc-c\-\]\[]`
-,	`[a-z]+`
-,	`[]`
-,	`[abc]`
-,	`[^1234]`
+	``,
+	`.`,
+	`^.$`,
+	`a`,
+	`a*`,
+	`a+`,
+	`a?`,
+	`a|b`,
+	`a*|b*`,
+	`(a*|b)(c*|d)`,
+	`[a-z]`,
+	`[a-abc-c\-\]\[]`,
+	`[a-z]+`,
+	`[]`,
+	`[abc]`,
+	`[^1234]`,
 }
 
 // TODO: nice to do this with a map but we don't have an iterator
@@ -45,7 +45,7 @@
 	StringError{ `a*+`,	regexp.ErrBadClosure },	
 	StringError{ `a??`,	regexp.ErrBadClosure },	
 	StringError{ `*`,	 	regexp.ErrBareClosure },	
-	StringError{ `\x`,	regexp.ErrBadBackslash }
+	StringError{ `\x`,	regexp.ErrBadBackslash },
 }
 
 type Vec [20]int;
@@ -56,17 +56,33 @@
 	match	Vec;
 }
 
+const END = -1000
+
 var matches = []Tester {
-	Tester{ ``,	"",	Vec{0,0, -1,-1} },
-	Tester{ `a`,	"a",	Vec{0,1, -1,-1} },
-	Tester{ `b`,	"abc",	Vec{1,2, -1,-1} },
-	Tester{ `.`,	"a",	Vec{0,1, -1,-1} },
-	Tester{ `.*`,	"abcdef",	Vec{0,6, -1,-1} },
-	Tester{ `^abcd$`,	"abcd",	Vec{0,4, -1,-1} },
-	Tester{ `^bcd'`,	"abcdef",	Vec{-1,-1} },
-	Tester{ `^abcd$`,	"abcde",	Vec{-1,-1} },
-	Tester{ `a+`,	"baaab",	Vec{1, 4, -1,-1} },
-	Tester{ `a*`,	"baaab",	Vec{0, 0, -1,-1} }
+	Tester{ ``,	"",	Vec{0,0, END} },
+	Tester{ `a`,	"a",	Vec{0,1, END} },
+	Tester{ `b`,	"abc",	Vec{1,2, END} },
+	Tester{ `.`,	"a",	Vec{0,1, END} },
+	Tester{ `.*`,	"abcdef",	Vec{0,6, END} },
+	Tester{ `^abcd$`,	"abcd",	Vec{0,4, END} },
+	Tester{ `^bcd'`,	"abcdef",	Vec{END} },
+	Tester{ `^abcd$`,	"abcde",	Vec{END} },
+	Tester{ `a+`,	"baaab",	Vec{1,4, END} },
+	Tester{ `a*`,	"baaab",	Vec{0,0, END} },
+	Tester{ `[a-z]+`,	"abcd",	Vec{0,4, END} },
+	Tester{ `[^a-z]+`,	"ab1234cd",	Vec{2,6, END} },
+	Tester{ `[a\-\]z]+`,	"az]-bcz",	Vec{0,4, END} },
+	Tester{ `[日本語]+`,	"日本語日本語",	Vec{0,18, END} },
+	Tester{ `()`,	"",	Vec{0,0, 0,0, END} },
+	Tester{ `(a)`,	"a",	Vec{0,1, 0,1, END} },
+	Tester{ `(.)(.)`,	"日a",	Vec{0,4, 0,3, 3,4, END} },
+	Tester{ `(.*)`,	"",	Vec{0,0, 0,0, END} },
+	Tester{ `(.*)`,	"abcd",	Vec{0,4, 0,4, END} },
+	Tester{ `(..)(..)`,	"abcd",	Vec{0,4, 0,2, 2,4, END} },
+	Tester{ `(([^xyz]*)(d))`,	"abcd",	Vec{0,4, 0,4, 0,3, 3,4, END} },
+	Tester{ `((a|b|c)*(d))`,	"abcd",	Vec{0,4, 0,4, 2,3, 3,4, END} },
+	Tester{ `(((a|b|c)*)(d))`,	"abcd",	Vec{0,4, 0,4, 0,3, 2,3, 3,4, END} },
+	Tester{ `a*(|(b))c*`,	"aacc",	Vec{0,4, 2,2, -1,-1, END} },
 }
 
 func Compile(expr string, error *os.Error) regexp.Regexp {
@@ -83,15 +99,19 @@
 		return 0
 	}
 	var i int;
-	for i = 0; i < len(m) && m[i] >= 0; i = i+2 {
+	for i = 0; i < len(m) && m[i] != END; i = i+2 {
 	}
 	return i
 }
 
 func PrintVec(m *[] int) {
 	l := MarkedLen(m);
-	for i := 0; i < l && m[i] >= 0; i = i+2 {
-		print(m[i], ",", m[i+1], " ")
+	if l == 0 {
+		print("<no match>");
+	} else {
+		for i := 0; i < l && m[i] != END; i = i+2 {
+			print(m[i], ",", m[i+1], " ")
+		}
 	}
 }
 
@@ -122,6 +142,7 @@
 }
 
 func main() {
+	//regexp.debug = true;
 	if sys.argc() > 1 {
 		Compile(sys.argv(1), nil);
 		sys.exit(0);