print array (not just *array) using %v

TBR=rsc
DELTA=34  (33 added, 0 deleted, 1 changed)
OCL=21718
CL=21718
diff --git a/src/lib/fmt/fmt_test.go b/src/lib/fmt/fmt_test.go
index 20539df..5b016ca 100644
--- a/src/lib/fmt/fmt_test.go
+++ b/src/lib/fmt/fmt_test.go
@@ -232,3 +232,17 @@
 		}
 	}
 }
+
+export func TestArrayPrinter(t *testing.T) {
+	a := []int{1, 2, 3, 4, 5};
+	want := "[1 2 3 4 5]";
+	out := fmt.sprintf("%v", a);
+	if out != want {
+		t.Errorf("sprintf(%%v, array) = %q, want %q", out, want);
+	}
+	want = "&" + want;
+	out = fmt.sprintf("%v", &a);
+	if out != want {
+		t.Errorf("sprintf(%%v, &array) = %q, want %q", out, want);
+	}
+}
diff --git a/src/lib/fmt/print.go b/src/lib/fmt/print.go
index bb69ba4..6546e13 100644
--- a/src/lib/fmt/print.go
+++ b/src/lib/fmt/print.go
@@ -305,6 +305,14 @@
 	return nil, false;
 }
 
+func getArray(v reflect.Value) (val reflect.ArrayValue, ok bool) {
+	switch v.Kind() {
+	case reflect.ArrayKind:
+		return v.(reflect.ArrayValue), true;
+	}
+	return nil, false;
+}
+
 // Convert ASCII to integer.  n is 0 (and got is false) if no number present.
 
 func parsenum(s string, start, end int) (n int, got bool, newi int) {
@@ -365,7 +373,7 @@
 		if v, ok := getPtr(field); v == 0 {
 			s = "<nil>"
 		} else {
-			// pointer to array?
+			// pointer to array?  (TODO(r): holdover; delete?)
 			if a, ok := getArrayPtr(field); ok {
 				p.addstr("&[");
 				for i := 0; i < a.Len(); i++ {
@@ -380,6 +388,17 @@
 				s = p.fmt.uX64(uint64(v)).str();
 			}
 		}
+	case reflect.ArrayKind:
+		if a, ok := getArray(field); ok {
+			p.addstr("[");
+			for i := 0; i < a.Len(); i++ {
+				if i > 0 {
+					p.addstr(" ");
+				}
+				p.printField(a.Elem(i));
+			}
+			p.addstr("]");
+		}
 	case reflect.StructKind:
 		p.add('{');
 		v := field.(reflect.StructValue);