- array-ify code, remove local implementation

R=r
OCL=19648
CL=19651
diff --git a/usr/gri/pretty/ast.go b/usr/gri/pretty/ast.go
index 3731a03..25a9337 100644
--- a/usr/gri/pretty/ast.go
+++ b/usr/gri/pretty/ast.go
@@ -4,7 +4,10 @@
 
 package AST
 
-import Scanner "scanner"
+import (
+	"array";
+	Scanner "scanner";
+)
 
 
 type (
@@ -17,90 +20,6 @@
 
 
 // ----------------------------------------------------------------------------
-// Lists
-//
-// If p is a list and p == nil, then p.len() == 0.
-// Thus, empty lists can be represented by nil.
-
-export type List struct {
-	a *[] Any;
-}
-
-
-func (p *List) Init() {
-	p.a = new([] Any, 10) [0 : 0];
-}
-
-
-func (p *List) len() int {
-	if p == nil { return 0; }
-	return len(p.a);
-}
-
-
-func (p *List) at(i int) Any {
-	return p.a[i];
-}
-
-
-func (p *List) last() Any {
-	return p.a[len(p.a) - 1];
-}
-
-
-func (p *List) set(i int, x Any) {
-	p.a[i] = x;
-}
-
-
-func (p *List) Add(x Any) {
-	a := p.a;
-	n := len(a);
-
-	if n == cap(a) {
-		b := new([] Any, 2*n);
-		for i := 0; i < n; i++ {
-			b[i] = a[i];
-		}
-		a = b;
-	}
-
-	a = a[0 : n + 1];
-	a[n] = x;
-	p.a = a;
-}
-
-
-func (p *List) Pop() Any {
-	a := p.a;
-	n := len(a);
-	
-	var x Any;
-	if n > 0 {
-		x = a[n - 1];
-		a = a[0 : n - 1];
-		p.a = a;
-	} else {
-		panic("pop from empty list");
-	}
-	
-	return x;
-}
-
-
-func (p *List) Clear() {
-	p.a = p.a[0 : 0];
-}
-
-
-export func NewList() *List {
-	p := new(List);
-	p.Init();
-	return p;
-}
-
-
-// ----------------------------------------------------------------------------
 // All nodes have a source position and and token.
 
 export type Node struct {
@@ -117,11 +36,11 @@
 	// TODO find a more space efficient way to hold these
 	s string;  // identifiers and literals
 	t *Type;  // type expressions, function literal types
-	block *List;  // stats for function literals
+	block *array.Array;  // stats for function literals
 }
 
 
-func (x *Expr) len() int {
+func (x *Expr) Len() int {
 	if x == nil {
 		return 0;
 	}
@@ -169,14 +88,17 @@
 	mode int;  // channel mode
 	key *Type;  // receiver type, map key
 	elt *Type;  // array element, map or channel value, or pointer base type, result type
-	list *List;  // struct fields, interface methods, function parameters
+	list *array.Array;  // struct fields, interface methods, function parameters
 }
 
 
 func (t *Type) nfields() int {
+	if t.list == nil {
+		return 0;
+	}
 	nx, nt := 0, 0;
-	for i, n := 0, t.list.len(); i < n; i++ {
-		if t.list.at(i).(*Expr).tok == Scanner.TYPE {
+	for i, n := 0, t.list.Len(); i < n; i++ {
+		if t.list.At(i).(*Expr).tok == Scanner.TYPE {
 			nt++;
 		} else {
 			nx++;
@@ -214,7 +136,7 @@
 	Node;
 	init, post *Stat;
 	expr *Expr;
-	block *List;
+	block *array.Array;
 	decl *Decl;
 }
 
@@ -240,7 +162,7 @@
 	val *Expr;
 	// list of *Decl for ()-style declarations
 	// list of *Stat for func declarations (or nil for forward decl)
-	list *List;
+	list *array.Array;
 }
 
 
@@ -273,8 +195,8 @@
 export type Program struct {
 	pos int;  // tok is Scanner.PACKAGE
 	ident *Expr;
-	decls *List;
-	comments *List;
+	decls *array.Array;
+	comments *array.Array;
 }
 
 
diff --git a/usr/gri/pretty/compilation.go b/usr/gri/pretty/compilation.go
index e4720c5..d52953f 100644
--- a/usr/gri/pretty/compilation.go
+++ b/usr/gri/pretty/compilation.go
@@ -4,6 +4,7 @@
 
 package Compilation
 
+import "array"
 import OS "os"
 import Platform "platform"
 import Scanner "scanner"
@@ -61,7 +62,7 @@
 }
 
 
-func AddDeps(globalset *map [string] bool, wset *AST.List, src_file string, flags *Flags) {
+func AddDeps(globalset *map [string] bool, wset *array.Array, src_file string, flags *Flags) {
 	dummy, found := globalset[src_file];
 	if !found {
 		globalset[src_file] = true;
@@ -71,13 +72,13 @@
 			return;
 		}
 		
-		nimports := prog.decls.len();
+		nimports := prog.decls.Len();
 		if nimports > 0 {
 			print(src_file, ".6:\t");
 			
 			localset := new(map [string] bool);
 			for i := 0; i < nimports; i++ {
-				decl := prog.decls.at(i).(*AST.Decl);
+				decl := prog.decls.At(i).(*AST.Decl);
 				assert(decl.tok == Scanner.IMPORT && decl.val.tok == Scanner.STRING);
 				src := decl.val.s;
 				src = src[1 : len(src) - 1];  // strip "'s
@@ -87,7 +88,7 @@
 				if !found {
 					localset[src] = true;
 					if FileExists(src + ".go") {
-						wset.Add(src);
+						wset.Push(src);
 						print(" ", src, ".6");
 					} else if
 						FileExists(Platform.GOROOT + "/pkg/" + src + ".6") ||
@@ -107,9 +108,9 @@
 
 export func ComputeDeps(src_file string, flags *Flags) {
 	globalset := new(map [string] bool);
-	wset := AST.NewList();
-	wset.Add(src_file);
-	for wset.len() > 0 {
+	wset := array.New(0);
+	wset.Push(src_file);
+	for wset.Len() > 0 {
 		AddDeps(globalset, wset, wset.Pop().(string), flags);
 	}
 }
diff --git a/usr/gri/pretty/parser.go b/usr/gri/pretty/parser.go
index 9e6bc10..2b942ac 100644
--- a/usr/gri/pretty/parser.go
+++ b/usr/gri/pretty/parser.go
@@ -4,6 +4,7 @@
 
 package Parser
 
+import "array"
 import Scanner "scanner"
 import AST "ast"
 
@@ -16,7 +17,7 @@
 	// Scanner
 	scanner *Scanner.Scanner;
 	tokchan *<-chan *Scanner.Token;
-	comments *AST.List;
+	comments *array.Array;
 	
 	// Scanner.Token
 	pos int;  // token source position
@@ -85,7 +86,7 @@
 		P.tok == Scanner.COMMENT_BB ;
 		P.Next0() 
 	{
-		P.comments.Add(AST.NewComment(P.pos, P.tok, P.val));
+		P.comments.Push(AST.NewComment(P.pos, P.tok, P.val));
 	}
 }
 
@@ -98,7 +99,7 @@
 	
 	P.scanner = scanner;
 	P.tokchan = tokchan;
-	P.comments = AST.NewList();
+	P.comments = array.New(0);
 	
 	P.Next();
 	P.expr_lev = 0;
@@ -327,13 +328,13 @@
 }
 
 
-func (P *Parser) ParseVarDeclList(list *AST.List, ellipsis_ok bool) {
+func (P *Parser) ParseVarDeclList(list *array.Array, ellipsis_ok bool) {
 	P.Trace("VarDeclList");
 
 	// parse a list of types
-	i0 := list.len();
+	i0 := list.Len();
 	for {
-		list.Add(P.ParseVarDecl(ellipsis_ok /* param list */ && i0 > 0));
+		list.Push(P.ParseVarDecl(ellipsis_ok /* param list */ && i0 > 0));
 		if P.tok == Scanner.COMMA {
 			P.Next();
 		} else {
@@ -357,24 +358,24 @@
 	if typ != nil {
 		// all list entries must be identifiers
 		// convert the type entries into identifiers
-		for i, n := i0, list.len(); i < n; i++ {
-			t := list.at(i).(*AST.Type);
+		for i, n := i0, list.Len(); i < n; i++ {
+			t := list.At(i).(*AST.Type);
 			if t.tok == Scanner.IDENT && t.expr.tok == Scanner.IDENT {
-				list.set(i, t.expr);
+				list.Set(i, t.expr);
 			} else {
-				list.set(i, AST.BadExpr);
+				list.Set(i, AST.BadExpr);
 				P.Error(t.pos, "identifier expected");
 			}
 		}
 		// add type
-		list.Add(AST.NewTypeExpr(typ));
+		list.Push(AST.NewTypeExpr(typ));
 
 	} else {
 		// all list entries are types
 		// convert all type entries into type expressions
-		for i, n := i0, list.len(); i < n; i++ {
-			t := list.at(i).(*AST.Type);
-			list.set(i, AST.NewTypeExpr(t));
+		for i, n := i0, list.Len(); i < n; i++ {
+			t := list.At(i).(*AST.Type);
+			list.Set(i, AST.NewTypeExpr(t));
 		}
 	}
 	
@@ -382,10 +383,10 @@
 }
 
 
-func (P *Parser) ParseParameterList(ellipsis_ok bool) *AST.List {
+func (P *Parser) ParseParameterList(ellipsis_ok bool) *array.Array {
 	P.Trace("ParameterList");
 	
-	list := AST.NewList();
+	list := array.New(0);
 	P.ParseVarDeclList(list, ellipsis_ok);
 	for P.tok == Scanner.COMMA {
 		P.Next();
@@ -438,8 +439,8 @@
 		typ := P.TryType();
 		if typ != nil {
 			t = AST.NewType(P.pos, Scanner.STRUCT);
-			t.list = AST.NewList();
-			t.list.Add(AST.NewTypeExpr(typ));
+			t.list = array.New(0);
+			t.list.Push(AST.NewTypeExpr(typ));
 		}
 	}
 
@@ -466,17 +467,17 @@
 }
 
 
-func (P *Parser) ParseMethodSpec(list *AST.List) {
+func (P *Parser) ParseMethodSpec(list *array.Array) {
 	P.Trace("MethodDecl");
 	
-	list.Add(P.ParseIdentList());
+	list.Push(P.ParseIdentList());
 	t := AST.BadType;
 	if P.sixg {
 		t = P.ParseType();
 	} else {
 		t = P.ParseFunctionType();
 	}
-	list.Add(AST.NewTypeExpr(t));
+	list.Push(AST.NewTypeExpr(t));
 	
 	P.Ecart();
 }
@@ -489,7 +490,7 @@
 	P.Expect(Scanner.INTERFACE);
 	if P.tok == Scanner.LBRACE {
 		P.Next();
-		t.list = AST.NewList();
+		t.list = array.New(0);
 		for P.tok == Scanner.IDENT {
 			P.ParseMethodSpec(t.list);
 			if P.tok != Scanner.RBRACE {
@@ -528,12 +529,12 @@
 	P.Expect(Scanner.STRUCT);
 	if P.tok == Scanner.LBRACE {
 		P.Next();
-		t.list = AST.NewList();
+		t.list = array.New(0);
 		for P.tok != Scanner.RBRACE && P.tok != Scanner.EOF {
 			P.ParseVarDeclList(t.list, false);
 			if P.tok == Scanner.STRING {
 				// ParseOperand takes care of string concatenation
-				t.list.Add(P.ParseOperand());
+				t.list.Push(P.ParseOperand());
 			}
 			if P.tok == Scanner.SEMICOLON {
 				P.Next();
@@ -586,15 +587,15 @@
 // ----------------------------------------------------------------------------
 // Blocks
 
-func (P *Parser) ParseStatementList() *AST.List {
+func (P *Parser) ParseStatementList() *array.Array {
 	P.Trace("StatementList");
 	
-	list := AST.NewList();
+	list := array.New(0);
 	for P.tok != Scanner.CASE && P.tok != Scanner.DEFAULT && P.tok != Scanner.RBRACE && P.tok != Scanner.EOF {
 		s := P.ParseStatement();
 		if s != nil {
 			// not the empty statement
-			list.Add(s);
+			list.Push(s);
 		}
 		if P.tok == Scanner.SEMICOLON {
 			P.Next();
@@ -615,7 +616,7 @@
 }
 
 
-func (P *Parser) ParseBlock() *AST.List {
+func (P *Parser) ParseBlock() *array.Array {
 	P.Trace("Block");
 	
 	P.Expect(Scanner.LBRACE);
@@ -982,7 +983,7 @@
 		// label declaration
 		s = AST.NewStat(P.pos, Scanner.COLON);
 		s.expr = x;
-		if x.len() != 1 {
+		if x.Len() != 1 {
 			P.Error(x.pos, "illegal label declaration");
 		}
 		P.Next();  // consume ":"
@@ -997,7 +998,7 @@
 		pos, tok := P.pos, P.tok;
 		P.Next();
 		y := P.ParseExpressionList();
-		if xl, yl := x.len(), y.len(); xl > 1 && yl > 1 && xl != yl {
+		if xl, yl := x.Len(), y.Len(); xl > 1 && yl > 1 && xl != yl {
 			P.Error(x.pos, "arity of lhs doesn't match rhs");
 		}
 		s = AST.NewStat(x.pos, Scanner.EXPRSTAT);
@@ -1013,7 +1014,7 @@
 		}
 		s = AST.NewStat(pos, tok);
 		s.expr = x;
-		if x.len() != 1 {
+		if x.Len() != 1 {
 			P.Error(x.pos, "only one expression allowed");
 		}
 	}
@@ -1113,8 +1114,8 @@
 				if s1.tok != Scanner.LBRACE {
 					// wrap in a block if we don't have one
 					b := AST.NewStat(P.pos, Scanner.LBRACE);
-					b.block = AST.NewList();
-					b.block.Add(s1);
+					b.block = array.New(0);
+					b.block.Push(s1);
 					s1 = b;
 				}
 				s.post = s1;
@@ -1178,10 +1179,10 @@
 	P.Trace("SwitchStat");
 	
 	s := P.ParseControlClause(Scanner.SWITCH);
-	s.block = AST.NewList();
+	s.block = array.New(0);
 	P.Expect(Scanner.LBRACE);
 	for P.tok != Scanner.RBRACE && P.tok != Scanner.EOF {
-		s.block.Add(P.ParseCaseClause());
+		s.block.Push(P.ParseCaseClause());
 	}
 	P.Expect(Scanner.RBRACE);
 	P.opt_semi = true;
@@ -1236,11 +1237,11 @@
 	P.Trace("SelectStat");
 	
 	s := AST.NewStat(P.pos, Scanner.SELECT);
-	s.block = AST.NewList();
+	s.block = array.New(0);
 	P.Expect(Scanner.SELECT);
 	P.Expect(Scanner.LBRACE);
 	for P.tok != Scanner.RBRACE && P.tok != Scanner.EOF {
-		s.block.Add(P.ParseCommClause());
+		s.block.Push(P.ParseCommClause());
 	}
 	P.Expect(Scanner.RBRACE);
 	P.opt_semi = true;
@@ -1414,9 +1415,9 @@
 	if P.tok == Scanner.LPAREN {
 		P.Next();
 		d = AST.NewDecl(P.pos, keyword, exported);
-		d.list = AST.NewList();
+		d.list = array.New(0);
 		for P.tok != Scanner.RPAREN && P.tok != Scanner.EOF {
-			d.list.Add(P.ParseSpec(exported, keyword));
+			d.list.Push(P.ParseSpec(exported, keyword));
 			if P.tok == Scanner.SEMICOLON {
 				P.Next();
 			} else {
@@ -1539,15 +1540,15 @@
 	P.Expect(Scanner.PACKAGE);
 	p.ident = P.ParseIdent();
 	
-	p.decls = AST.NewList();
+	p.decls = array.New(0);
 	for P.tok == Scanner.IMPORT {
-		p.decls.Add(P.ParseDecl(false, Scanner.IMPORT));
+		p.decls.Push(P.ParseDecl(false, Scanner.IMPORT));
 		P.OptSemicolon();
 	}
 	
 	if !P.deps {
 		for P.tok != Scanner.EOF {
-			p.decls.Add(P.ParseDeclaration());
+			p.decls.Push(P.ParseDeclaration());
 			P.OptSemicolon();
 		}
 	}
diff --git a/usr/gri/pretty/printer.go b/usr/gri/pretty/printer.go
index 06f7240..3e36461 100644
--- a/usr/gri/pretty/printer.go
+++ b/usr/gri/pretty/printer.go
@@ -4,6 +4,7 @@
 
 package Printer
 
+import "array"
 import Strings "strings"
 import Scanner "scanner"
 import AST "ast"
@@ -44,7 +45,7 @@
 	newl int;  // pending "\n"'s
 
 	// comments
-	clist *AST.List;
+	clist *array.Array;
 	cindex int;
 	cpos int;
 }
@@ -71,7 +72,7 @@
 		//print("cc", P.cpos, "\n");
 		
 		// we have a comment that comes before s
-		comment := P.clist.at(P.cindex).(*AST.Comment);
+		comment := P.clist.At(P.cindex).(*AST.Comment);
 		text := comment.text;
 		assert(len(text) >= 3);  // classification char + "//" or "/*"
 		
@@ -115,8 +116,8 @@
 		}
 
 		P.cindex++;
-		if P.cindex < P.clist.len() {
-			P.cpos = P.clist.at(P.cindex).(*AST.Comment).pos;
+		if P.cindex < P.clist.Len() {
+			P.cpos = P.clist.At(P.cindex).(*AST.Comment).pos;
 		} else {
 			P.cpos = 1000000000;  // infinite
 		}
@@ -191,43 +192,47 @@
 func (P *Printer) Type(t *AST.Type)
 func (P *Printer) Expr(x *AST.Expr)
 
-func (P *Printer) Parameters(pos int, list *AST.List) {
+func (P *Printer) Parameters(pos int, list *array.Array) {
 	P.String(pos, "(");
-	var prev int;
-	for i, n := 0, list.len(); i < n; i++ {
-		x := list.at(i).(*AST.Expr);
-		if i > 0 {
-			if prev == x.tok || prev == Scanner.TYPE {
-				P.String(0, ", ");
-			} else {
-				P.Blank();
+	if list != nil {
+		var prev int;
+		for i, n := 0, list.Len(); i < n; i++ {
+			x := list.At(i).(*AST.Expr);
+			if i > 0 {
+				if prev == x.tok || prev == Scanner.TYPE {
+					P.String(0, ", ");
+				} else {
+					P.Blank();
+				}
 			}
+			P.Expr(x);
+			prev = x.tok;
 		}
-		P.Expr(x);
-		prev = x.tok;
 	}
 	P.String(0, ")");
 }
 
 
-func (P *Printer) Fields(list *AST.List) {
+func (P *Printer) Fields(list *array.Array) {
 	P.OpenScope("{");
-	var prev int;
-	for i, n := 0, list.len(); i < n; i++ {
-		x := list.at(i).(*AST.Expr);
-		if i > 0 {
-			if prev == Scanner.TYPE && x.tok != Scanner.STRING || prev == Scanner.STRING {
-				P.semi, P.newl = true, 1;
-			} else if prev == x.tok {
-				P.String(0, ", ");
-			} else {
-				P.Tab();
+	if list != nil {
+		var prev int;
+		for i, n := 0, list.Len(); i < n; i++ {
+			x := list.At(i).(*AST.Expr);
+			if i > 0 {
+				if prev == Scanner.TYPE && x.tok != Scanner.STRING || prev == Scanner.STRING {
+					P.semi, P.newl = true, 1;
+				} else if prev == x.tok {
+					P.String(0, ", ");
+				} else {
+					P.Tab();
+				}
 			}
+			P.Expr(x);
+			prev = x.tok;
 		}
-		P.Expr(x);
-		prev = x.tok;
+		P.newl = 1;
 	}
-	P.newl = 1;
 	P.CloseScope("}");
 }
 
@@ -291,7 +296,7 @@
 // ----------------------------------------------------------------------------
 // Expressions
 
-func (P *Printer) Block(list *AST.List, indent bool);
+func (P *Printer) Block(list *array.Array, indent bool);
 
 func (P *Printer) Expr1(x *AST.Expr, prec1 int) {
 	if x == nil {
@@ -391,15 +396,17 @@
 
 func (P *Printer) Stat(s *AST.Stat)
 
-func (P *Printer) StatementList(list *AST.List) {
-	for i, n := 0, list.len(); i < n; i++ {
-		P.Stat(list.at(i).(*AST.Stat));
-		P.newl = 1;
+func (P *Printer) StatementList(list *array.Array) {
+	if list != nil {
+		for i, n := 0, list.Len(); i < n; i++ {
+			P.Stat(list.At(i).(*AST.Stat));
+			P.newl = 1;
+		}
 	}
 }
 
 
-func (P *Printer) Block(list *AST.List, indent bool) {
+func (P *Printer) Block(list *array.Array, indent bool) {
 	P.OpenScope("{");
 	if !indent {
 		P.indent--;
@@ -536,8 +543,8 @@
 
 	if d.tok != Scanner.FUNC && d.list != nil {
 		P.OpenScope("(");
-		for i := 0; i < d.list.len(); i++ {
-			P.Declaration(d.list.at(i).(*AST.Decl), true);
+		for i := 0; i < d.list.Len(); i++ {
+			P.Declaration(d.list.At(i).(*AST.Decl), true);
 			P.semi, P.newl = true, 1;
 		}
 		P.CloseScope(")");
@@ -601,8 +608,8 @@
 	
 	P.clist = p.comments;
 	P.cindex = 0;
-	if p.comments.len() > 0 {
-		P.cpos = p.comments.at(0).(*AST.Comment).pos;
+	if p.comments.Len() > 0 {
+		P.cpos = p.comments.At(0).(*AST.Comment).pos;
 	} else {
 		P.cpos = 1000000000;  // infinite
 	}
@@ -611,8 +618,8 @@
 	P.String(p.pos, "package ");
 	P.Expr(p.ident);
 	P.newl = 2;
-	for i := 0; i < p.decls.len(); i++ {
-		P.Declaration(p.decls.at(i), false);
+	for i := 0; i < p.decls.Len(); i++ {
+		P.Declaration(p.decls.At(i), false);
 	}
 	P.newl = 2;	// TODO we should be able to do this with 1 instead of 2
 				// but we are loosing the last buffer flush in that case
diff --git a/usr/gri/pretty/tabwriter.go b/usr/gri/pretty/tabwriter.go
index 7ba7a0d..53a2755 100644
--- a/usr/gri/pretty/tabwriter.go
+++ b/usr/gri/pretty/tabwriter.go
@@ -5,14 +5,15 @@
 package tabwriter
 
 import (
-	OS "os";
-	IO "io";
-	Vector "vector";
+	"os";
+	"io";
+	"array";
 )
 
 
 // ----------------------------------------------------------------------------
 // ByteArray
+// TODO move this into std lib eventually
 
 type ByteArray struct {
 	a *[]byte;
@@ -75,7 +76,7 @@
 
 
 // ----------------------------------------------------------------------------
-// Implemententation of flexible tab stops.
+// Implementation of flexible tab stops.
 
 // TabWriter is a representation for a list of lines consisting of
 // cells. A new cell is added for each Tab() call, and a new line
@@ -87,42 +88,42 @@
 
 export type TabWriter struct {
 	// configuration
-	writer IO.Write;
+	writer io.Write;
 	usetabs bool;
 	tabwidth int;
 
 	// current state
 	buf ByteArray;  // the collected text w/o tabs and newlines
 	width int;  // width of last incomplete cell
-	lines Vector.Vector;  // list of lines; each line is a list of cell widths
-	widths Vector.Vector;  // list of column widths - (re-)used during formatting
+	lines array.Array;  // list of lines; each line is a list of cell widths
+	widths array.IntArray;  // list of column widths - (re-)used during formatting
 }
 
 
 func (b *TabWriter) AddLine() {
-	b.lines.Append(Vector.New());
+	b.lines.Push(array.NewIntArray(0));
 }
 
 
-func (b *TabWriter) Init(writer IO.Write, usetabs bool, tabwidth int) {
+func (b *TabWriter) Init(writer io.Write, usetabs bool, tabwidth int) {
 	b.writer = writer;
 	b.usetabs = usetabs;
 	b.tabwidth = tabwidth;
 	
 	b.buf.Init(1024);
-	b.lines.Init();
-	b.widths.Init();
+	b.lines.Init(0);
+	b.widths.Init(0);
 	b.AddLine();  // the very first line
 }
 
 
-func (b *TabWriter) Line(i int) *Vector.Vector {
-	return b.lines.At(i).(*Vector.Vector);
+func (b *TabWriter) Line(i int) *array.IntArray {
+	return b.lines.At(i).(*array.IntArray);
 }
 
 
-func (b *TabWriter) LastLine() *Vector.Vector {
-	return b.lines.At(b.lines.Len() - 1).(*Vector.Vector);
+func (b *TabWriter) LastLine() *array.IntArray {
+	return b.lines.At(b.lines.Len() - 1).(*array.IntArray);
 }
 
 
@@ -133,7 +134,7 @@
 		line := b.Line(i);
 		print("(", i, ") ");
 		for j := 0; j < line.Len(); j++ {
-			w := line.At(j).(int);
+			w := line.At(j);
 			print("[", string(b.buf.a[pos : pos + w]), "]");
 			pos += w;
 		}
@@ -177,14 +178,14 @@
 	for i := line0; i < line1; i++ {
 		line := b.Line(i);
 		for j := 0; j < line.Len(); j++ {
-			w := line.At(j).(int);
+			w := line.At(j);
 			m, err := b.writer.Write(b.buf.a[pos : pos + w]);
 			if m != w {
 				panic();
 			}
 			pos += w;
 			if j < b.widths.Len() {
-				b.Padding(w, b.widths.At(j).(int));
+				b.Padding(w, b.widths.At(j));
 			}
 		}
 		m, err := b.writer.Write(Newline);
@@ -215,7 +216,7 @@
 				if column < line.Len() - 1 {
 					// cell exists in this column
 					// update width
-					w := line.At(column).(int) + 1; // 1 = minimum space between cells
+					w := line.At(column) + 1; // 1 = minimum space between cells
 					if w > width {
 						width = w;
 					}
@@ -232,9 +233,9 @@
 			
 			// format and print all columns to the right of this column
 			// (we know the widths of this column and all columns to the left)
-			b.widths.Append(width);
+			b.widths.Push(width);
 			pos = b.Format(pos, last, this);
-			b.widths.Remove(b.widths.Len() - 1);
+			b.widths.Pop();
 			last = this;
 		}
 	}
@@ -250,7 +251,7 @@
 
 
 func (b *TabWriter) Tab() {
-	b.LastLine().Append(b.width);
+	b.LastLine().Push(b.width);
 	b.width = 0;
 }
 
@@ -273,14 +274,14 @@
 		// reset TabWriter
 		b.width = 0;
 		b.buf.Clear();
-		b.lines.Reset();
+		b.lines.Init(0);
 	}
 
 	b.AddLine();
 }
 
 
-func (b *TabWriter) Write(buf *[]byte) (i int, err *OS.Error) {
+func (b *TabWriter) Write(buf *[]byte) (i int, err *os.Error) {
 	i0, n := 0, len(buf);
 	for i = 0; i < n; i++ {
 		switch buf[i] {
@@ -302,7 +303,7 @@
 }
 
 
-export func MakeTabWriter(writer IO.Write, usetabs bool, tabwidth int) *TabWriter {
+export func MakeTabWriter(writer io.Write, usetabs bool, tabwidth int) *TabWriter {
 	b := new(TabWriter);
 	b.Init(writer, usetabs, tabwidth);
 	return b;
diff --git a/usr/gri/pretty/untab.go b/usr/gri/pretty/untab.go
index 5f033e1..a2232b3 100644
--- a/usr/gri/pretty/untab.go
+++ b/usr/gri/pretty/untab.go
@@ -5,28 +5,28 @@
 package main
 
 import (
-	OS "os";
-	IO "io";
-	Flag "flag";
-	Fmt "fmt";
-	TabWriter "tabwriter";
+	"os";
+	"io";
+	"flag";
+	"fmt";
+	"tabwriter";
 )
 
 
 var (
-	usetabs = Flag.Bool("usetabs", false, nil, "align with tabs instead of blanks");
-	tabwidth = Flag.Int("tabwidth", 4, nil, "tab width");
+	usetabs = flag.Bool("usetabs", false, nil, "align with tabs instead of blanks");
+	tabwidth = flag.Int("tabwidth", 4, nil, "tab width");
 )
 
 
-func Error(fmt string, params ...) {
-	Fmt.printf(fmt, params);
+func Error(format string, params ...) {
+	fmt.printf(format, params);
 	sys.exit(1);
 }
 
 
-func Untab(name string, src *OS.FD, dst *TabWriter.TabWriter) {
-	n, err := IO.Copyn(src, dst, 2e9 /* inf */);  // TODO use Copy
+func Untab(name string, src *os.FD, dst *tabwriter.TabWriter) {
+	n, err := io.Copy(src, dst);
 	if err != nil {
 		Error("error while processing %s (%v)", name, err);
 	}
@@ -35,12 +35,12 @@
 
 
 func main() {
-	Flag.Parse();
-	dst := TabWriter.MakeTabWriter(OS.Stdout, usetabs.BVal(), int(tabwidth.IVal()));
-	if Flag.NArg() > 0 {
-		for i := 0; i < Flag.NArg(); i++ {
-			name := Flag.Arg(i);
-			src, err := OS.Open(name, OS.O_RDONLY, 0);
+	flag.Parse();
+	dst := tabwriter.MakeTabWriter(os.Stdout, usetabs.BVal(), int(tabwidth.IVal()));
+	if flag.NArg() > 0 {
+		for i := 0; i < flag.NArg(); i++ {
+			name := flag.Arg(i);
+			src, err := os.Open(name, os.O_RDONLY, 0);
 			if err != nil {
 				Error("could not open %s (%v)\n", name, err);
 			}
@@ -49,6 +49,6 @@
 		}
 	} else {
 		// no files => use stdin
-		Untab("/dev/stdin", OS.Stdin, dst);
+		Untab("/dev/stdin", os.Stdin, dst);
 	}
 }