summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pkg/go/ast/ast.go720
-rw-r--r--src/pkg/go/ast/filter.go116
-rw-r--r--src/pkg/go/ast/scope.go12
-rw-r--r--src/pkg/go/ast/walk.go160
-rw-r--r--src/pkg/go/doc/comment.go152
-rw-r--r--src/pkg/go/doc/doc.go390
-rw-r--r--src/pkg/go/parser/interface.go82
-rw-r--r--src/pkg/go/parser/parser.go1050
-rw-r--r--src/pkg/go/parser/parser_test.go18
-rw-r--r--src/pkg/go/printer/nodes.go796
-rw-r--r--src/pkg/go/printer/printer.go472
-rw-r--r--src/pkg/go/printer/printer_test.go82
-rw-r--r--src/pkg/go/scanner/errors.go62
-rw-r--r--src/pkg/go/scanner/scanner.go342
-rw-r--r--src/pkg/go/scanner/scanner_test.go154
-rw-r--r--src/pkg/go/token/token.go242
-rw-r--r--src/pkg/gob/codec_test.go790
-rw-r--r--src/pkg/gob/decode.go448
-rw-r--r--src/pkg/gob/decoder.go92
-rw-r--r--src/pkg/gob/encode.go298
-rw-r--r--src/pkg/gob/encoder.go116
-rw-r--r--src/pkg/gob/encoder_test.go164
-rw-r--r--src/pkg/gob/type.go222
-rw-r--r--src/pkg/gob/type_test.go82
-rw-r--r--src/pkg/hash/adler32/adler32.go56
-rw-r--r--src/pkg/hash/adler32/adler32_test.go20
-rw-r--r--src/pkg/hash/crc32/crc32.go58
-rw-r--r--src/pkg/hash/crc32/crc32_test.go28
-rw-r--r--src/pkg/hash/hash.go12
-rw-r--r--src/pkg/http/client.go120
-rw-r--r--src/pkg/http/client_test.go14
-rw-r--r--src/pkg/http/fs.go106
-rw-r--r--src/pkg/http/request.go246
-rw-r--r--src/pkg/http/request_test.go46
-rw-r--r--src/pkg/http/server.go254
-rw-r--r--src/pkg/http/status.go80
-rw-r--r--src/pkg/http/triv.go126
-rw-r--r--src/pkg/http/url.go158
-rw-r--r--src/pkg/http/url_test.go72
-rw-r--r--src/pkg/image/color.go178
-rw-r--r--src/pkg/image/image.go120
-rw-r--r--src/pkg/image/png/reader.go234
-rw-r--r--src/pkg/image/png/reader_test.go112
-rw-r--r--src/pkg/image/png/writer.go264
-rw-r--r--src/pkg/image/png/writer_test.go56
-rw-r--r--src/pkg/io/io.go140
-rw-r--r--src/pkg/io/io_test.go60
-rw-r--r--src/pkg/io/ioutil/ioutil.go58
-rw-r--r--src/pkg/io/ioutil/ioutil_test.go40
-rw-r--r--src/pkg/io/pipe.go122
-rw-r--r--src/pkg/io/pipe_test.go130
-rw-r--r--src/pkg/json/decode.go58
-rw-r--r--src/pkg/json/decode_test.go102
-rw-r--r--src/pkg/json/error.go4
-rw-r--r--src/pkg/json/parse.go322
-rw-r--r--src/pkg/json/struct.go114
-rw-r--r--src/pkg/json/struct_test.go146
-rw-r--r--src/pkg/log/log.go122
-rw-r--r--src/pkg/log/log_test.go52
-rw-r--r--src/pkg/malloc/malloc.go16
-rw-r--r--src/pkg/math/all_test.go50
-rw-r--r--src/pkg/math/asin.go12
-rw-r--r--src/pkg/math/atan.go32
-rw-r--r--src/pkg/math/atan2.go8
-rw-r--r--src/pkg/math/bits.go70
-rw-r--r--src/pkg/math/const.go58
-rw-r--r--src/pkg/math/exp.go38
-rw-r--r--src/pkg/math/fabs.go2
-rw-r--r--src/pkg/math/floor.go10
-rw-r--r--src/pkg/math/fmod.go16
-rw-r--r--src/pkg/math/hypot.go22
-rw-r--r--src/pkg/math/log.go46
-rw-r--r--src/pkg/math/pow.go40
-rw-r--r--src/pkg/math/pow10.go12
-rw-r--r--src/pkg/math/sin.go54
-rw-r--r--src/pkg/math/sinh.go32
-rw-r--r--src/pkg/math/sqrt.go32
-rw-r--r--src/pkg/math/tan.go54
-rw-r--r--src/pkg/math/tanh.go6
-rw-r--r--src/pkg/math/unsafe.go8
-rw-r--r--src/pkg/net/dialgoogle_test.go52
-rw-r--r--src/pkg/net/dnsclient.go144
-rw-r--r--src/pkg/net/dnsconfig.go74
-rw-r--r--src/pkg/net/dnsmsg.go444
-rw-r--r--src/pkg/net/fd.go360
-rw-r--r--src/pkg/net/fd_darwin.go62
-rw-r--r--src/pkg/net/fd_freebsd.go62
-rw-r--r--src/pkg/net/fd_linux.go80
-rw-r--r--src/pkg/net/fd_nacl.go16
-rw-r--r--src/pkg/net/ip.go182
-rw-r--r--src/pkg/net/ip_test.go10
-rw-r--r--src/pkg/net/ipsock.go92
-rw-r--r--src/pkg/net/net.go108
-rw-r--r--src/pkg/net/net_test.go28
-rw-r--r--src/pkg/net/parse.go118
-rw-r--r--src/pkg/net/parse_test.go28
-rw-r--r--src/pkg/net/port.go32
-rw-r--r--src/pkg/net/port_test.go12
-rw-r--r--src/pkg/net/server_test.go138
-rw-r--r--src/pkg/net/sock.go116
-rw-r--r--src/pkg/net/tcpsock.go96
-rw-r--r--src/pkg/net/timeout_test.go28
-rw-r--r--src/pkg/net/udpsock.go84
-rw-r--r--src/pkg/net/unixsock.go132
104 files changed, 7004 insertions, 7004 deletions
diff --git a/src/pkg/go/ast/ast.go b/src/pkg/go/ast/ast.go
index 60a90050c..16a0c66a1 100644
--- a/src/pkg/go/ast/ast.go
+++ b/src/pkg/go/ast/ast.go
@@ -8,9 +8,9 @@
package ast
import (
- "go/token";
- "unicode";
- "utf8";
+ "go/token"
+ "unicode"
+ "utf8"
)
@@ -35,28 +35,28 @@ import (
// All node types implement the Node interface.
type Node interface {
// Pos returns the (beginning) position of the node.
- Pos() token.Position;
+ Pos() token.Position
}
// All expression nodes implement the Expr interface.
type Expr interface {
- Node;
- exprNode();
+ Node
+ exprNode()
}
// All statement nodes implement the Stmt interface.
type Stmt interface {
- Node;
- stmtNode();
+ Node
+ stmtNode()
}
// All declaration nodes implement the Decl interface.
type Decl interface {
- Node;
- declNode();
+ Node
+ declNode()
}
@@ -65,8 +65,8 @@ type Decl interface {
// A Comment node represents a single //-style or /*-style comment.
type Comment struct {
- token.Position; // beginning position of the comment
- Text []byte; // comment text (excluding '\n' for //-style comments)
+ token.Position // beginning position of the comment
+ Text []byte // comment text (excluding '\n' for //-style comments)
}
@@ -74,8 +74,8 @@ type Comment struct {
// with no other tokens and no empty lines between.
//
type CommentGroup struct {
- List []*Comment;
- Next *CommentGroup; // next comment group in source order
+ List []*Comment
+ Next *CommentGroup // next comment group in source order
}
@@ -87,11 +87,11 @@ type CommentGroup struct {
// in a signature.
//
type Field struct {
- Doc *CommentGroup; // associated documentation; or nil
- Names []*Ident; // field/method/parameter names; or nil if anonymous field
- Type Expr; // field/method/parameter type
- Tag []*BasicLit; // field tag; or nil
- Comment *CommentGroup; // line comments; or nil
+ Doc *CommentGroup // associated documentation; or nil
+ Names []*Ident // field/method/parameter names; or nil if anonymous field
+ Type Expr // field/method/parameter type
+ Tag []*BasicLit // field tag; or nil
+ Comment *CommentGroup // line comments; or nil
}
@@ -99,7 +99,7 @@ func (f *Field) Pos() token.Position {
if len(f.Names) > 0 {
return f.Names[0].Pos()
}
- return f.Type.Pos();
+ return f.Type.Pos()
}
@@ -111,129 +111,129 @@ type (
// syntax errors for which no correct expression nodes can be
// created.
//
- BadExpr struct {
- token.Position; // beginning position of bad expression
- };
+ BadExpr struct {
+ token.Position // beginning position of bad expression
+ }
// An Ident node represents an identifier.
- Ident struct {
- token.Position; // identifier position
- Value string; // identifier string (e.g. foobar)
- };
+ Ident struct {
+ token.Position // identifier position
+ Value string // identifier string (e.g. foobar)
+ }
// An Ellipsis node stands for the "..." type in a
// parameter list or the "..." length in an array type.
//
- Ellipsis struct {
- token.Position; // position of "..."
- };
+ Ellipsis struct {
+ token.Position // position of "..."
+ }
// A BasicLit node represents a literal of basic type.
- BasicLit struct {
- token.Position; // literal position
- Kind token.Token; // token.INT, token.FLOAT, token.CHAR, or token.STRING
- Value []byte; // literal string; e.g. 42, 0x7f, 3.14, 1e-9, 'a', '\x7f', "foo" or `\m\n\o`
- };
+ BasicLit struct {
+ token.Position // literal position
+ Kind token.Token // token.INT, token.FLOAT, token.CHAR, or token.STRING
+ Value []byte // literal string; e.g. 42, 0x7f, 3.14, 1e-9, 'a', '\x7f', "foo" or `\m\n\o`
+ }
// A StringList node represents a sequence of adjacent string literals.
// A single string literal (common case) is represented by a BasicLit
// node; StringList nodes are used only if there are two or more string
// literals in a sequence.
//
- StringList struct {
- Strings []*BasicLit; // list of strings, len(Strings) > 1
- };
+ StringList struct {
+ Strings []*BasicLit // list of strings, len(Strings) > 1
+ }
// A FuncLit node represents a function literal.
- FuncLit struct {
- Type *FuncType; // function type
- Body *BlockStmt; // function body
- };
+ FuncLit struct {
+ Type *FuncType // function type
+ Body *BlockStmt // function body
+ }
// A CompositeLit node represents a composite literal.
//
- CompositeLit struct {
- Type Expr; // literal type
- Lbrace token.Position; // position of "{"
- Elts []Expr; // list of composite elements
- Rbrace token.Position; // position of "}"
- };
+ CompositeLit struct {
+ Type Expr // literal type
+ Lbrace token.Position // position of "{"
+ Elts []Expr // list of composite elements
+ Rbrace token.Position // position of "}"
+ }
// A ParenExpr node represents a parenthesized expression.
- ParenExpr struct {
- token.Position; // position of "("
- X Expr; // parenthesized expression
- Rparen token.Position; // position of ")"
- };
+ ParenExpr struct {
+ token.Position // position of "("
+ X Expr // parenthesized expression
+ Rparen token.Position // position of ")"
+ }
// A SelectorExpr node represents an expression followed by a selector.
- SelectorExpr struct {
- X Expr; // expression
- Sel *Ident; // field selector
- };
+ SelectorExpr struct {
+ X Expr // expression
+ Sel *Ident // field selector
+ }
// An IndexExpr node represents an expression followed by an index.
- IndexExpr struct {
- X Expr; // expression
- Index Expr; // index expression
- };
+ IndexExpr struct {
+ X Expr // expression
+ Index Expr // index expression
+ }
// An SliceExpr node represents an expression followed by slice indices.
- SliceExpr struct {
- X Expr; // expression
- Index Expr; // beginning of slice range
- End Expr; // end of slice range; or nil
- };
+ SliceExpr struct {
+ X Expr // expression
+ Index Expr // beginning of slice range
+ End Expr // end of slice range; or nil
+ }
// A TypeAssertExpr node represents an expression followed by a
// type assertion.
//
- TypeAssertExpr struct {
- X Expr; // expression
- Type Expr; // asserted type; nil means type switch X.(type)
- };
+ TypeAssertExpr struct {
+ X Expr // expression
+ Type Expr // asserted type; nil means type switch X.(type)
+ }
// A CallExpr node represents an expression followed by an argument list.
- CallExpr struct {
- Fun Expr; // function expression
- Lparen token.Position; // position of "("
- Args []Expr; // function arguments
- Rparen token.Position; // positions of ")"
- };
+ CallExpr struct {
+ Fun Expr // function expression
+ Lparen token.Position // position of "("
+ Args []Expr // function arguments
+ Rparen token.Position // positions of ")"
+ }
// A StarExpr node represents an expression of the form "*" Expression.
// Semantically it could be a unary "*" expression, or a pointer type.
- StarExpr struct {
- token.Position; // position of "*"
- X Expr; // operand
- };
+ StarExpr struct {
+ token.Position // position of "*"
+ X Expr // operand
+ }
// A UnaryExpr node represents a unary expression.
// Unary "*" expressions are represented via StarExpr nodes.
//
- UnaryExpr struct {
- token.Position; // position of Op
- Op token.Token; // operator
- X Expr; // operand
- };
+ UnaryExpr struct {
+ token.Position // position of Op
+ Op token.Token // operator
+ X Expr // operand
+ }
// A BinaryExpr node represents a binary expression.
//
- BinaryExpr struct {
- X Expr; // left operand
- OpPos token.Position; // position of Op
- Op token.Token; // operator
- Y Expr; // right operand
- };
+ BinaryExpr struct {
+ X Expr // left operand
+ OpPos token.Position // position of Op
+ Op token.Token // operator
+ Y Expr // right operand
+ }
// A KeyValueExpr node represents (key : value) pairs
// in composite literals.
//
- KeyValueExpr struct {
- Key Expr;
- Colon token.Position; // position of ":"
- Value Expr;
- };
+ KeyValueExpr struct {
+ Key Expr
+ Colon token.Position // position of ":"
+ Value Expr
+ }
)
@@ -243,8 +243,8 @@ type (
type ChanDir int
const (
- SEND ChanDir = 1 << iota;
- RECV;
+ SEND ChanDir = 1 << iota
+ RECV
)
@@ -254,110 +254,110 @@ const (
//
type (
// An ArrayType node represents an array or slice type.
- ArrayType struct {
- token.Position; // position of "["
- Len Expr; // Ellipsis node for [...]T array types, nil for slice types
- Elt Expr; // element type
- };
+ ArrayType struct {
+ token.Position // position of "["
+ Len Expr // Ellipsis node for [...]T array types, nil for slice types
+ Elt Expr // element type
+ }
// A StructType node represents a struct type.
- StructType struct {
- token.Position; // position of "struct" keyword
- Lbrace token.Position; // position of "{"
- Fields []*Field; // list of field declarations
- Rbrace token.Position; // position of "}"
- Incomplete bool; // true if (source) fields are missing in the Fields list
- };
+ StructType struct {
+ token.Position // position of "struct" keyword
+ Lbrace token.Position // position of "{"
+ Fields []*Field // list of field declarations
+ Rbrace token.Position // position of "}"
+ Incomplete bool // true if (source) fields are missing in the Fields list
+ }
// Pointer types are represented via StarExpr nodes.
// A FuncType node represents a function type.
- FuncType struct {
- token.Position; // position of "func" keyword
- Params []*Field; // (incoming) parameters
- Results []*Field; // (outgoing) results
- };
+ FuncType struct {
+ token.Position // position of "func" keyword
+ Params []*Field // (incoming) parameters
+ Results []*Field // (outgoing) results
+ }
// An InterfaceType node represents an interface type.
- InterfaceType struct {
- token.Position; // position of "interface" keyword
- Lbrace token.Position; // position of "{"
- Methods []*Field; // list of methods
- Rbrace token.Position; // position of "}"
- Incomplete bool; // true if (source) methods are missing in the Methods list
- };
+ InterfaceType struct {
+ token.Position // position of "interface" keyword
+ Lbrace token.Position // position of "{"
+ Methods []*Field // list of methods
+ Rbrace token.Position // position of "}"
+ Incomplete bool // true if (source) methods are missing in the Methods list
+ }
// A MapType node represents a map type.
- MapType struct {
- token.Position; // position of "map" keyword
- Key Expr;
- Value Expr;
- };
+ MapType struct {
+ token.Position // position of "map" keyword
+ Key Expr
+ Value Expr
+ }
// A ChanType node represents a channel type.
- ChanType struct {
- token.Position; // position of "chan" keyword or "<-" (whichever comes first)
- Dir ChanDir; // channel direction
- Value Expr; // value type
- };
+ ChanType struct {
+ token.Position // position of "chan" keyword or "<-" (whichever comes first)
+ Dir ChanDir // channel direction
+ Value Expr // value type
+ }
)
// Pos() implementations for expression/type where the position
// corresponds to the position of a sub-node.
//
-func (x *StringList) Pos() token.Position { return x.Strings[0].Pos() }
-func (x *FuncLit) Pos() token.Position { return x.Type.Pos() }
-func (x *CompositeLit) Pos() token.Position { return x.Type.Pos() }
-func (x *SelectorExpr) Pos() token.Position { return x.X.Pos() }
-func (x *IndexExpr) Pos() token.Position { return x.X.Pos() }
-func (x *SliceExpr) Pos() token.Position { return x.X.Pos() }
-func (x *TypeAssertExpr) Pos() token.Position { return x.X.Pos() }
-func (x *CallExpr) Pos() token.Position { return x.Fun.Pos() }
-func (x *BinaryExpr) Pos() token.Position { return x.X.Pos() }
-func (x *KeyValueExpr) Pos() token.Position { return x.Key.Pos() }
+func (x *StringList) Pos() token.Position { return x.Strings[0].Pos() }
+func (x *FuncLit) Pos() token.Position { return x.Type.Pos() }
+func (x *CompositeLit) Pos() token.Position { return x.Type.Pos() }
+func (x *SelectorExpr) Pos() token.Position { return x.X.Pos() }
+func (x *IndexExpr) Pos() token.Position { return x.X.Pos() }
+func (x *SliceExpr) Pos() token.Position { return x.X.Pos() }
+func (x *TypeAssertExpr) Pos() token.Position { return x.X.Pos() }
+func (x *CallExpr) Pos() token.Position { return x.Fun.Pos() }
+func (x *BinaryExpr) Pos() token.Position { return x.X.Pos() }
+func (x *KeyValueExpr) Pos() token.Position { return x.Key.Pos() }
// exprNode() ensures that only expression/type nodes can be
// assigned to an ExprNode.
-func (x *BadExpr) exprNode() {}
-func (x *Ident) exprNode() {}
-func (x *Ellipsis) exprNode() {}
-func (x *BasicLit) exprNode() {}
-func (x *StringList) exprNode() {}
-func (x *FuncLit) exprNode() {}
-func (x *CompositeLit) exprNode() {}
-func (x *ParenExpr) exprNode() {}
-func (x *SelectorExpr) exprNode() {}
-func (x *IndexExpr) exprNode() {}
-func (x *SliceExpr) exprNode() {}
-func (x *TypeAssertExpr) exprNode() {}
-func (x *CallExpr) exprNode() {}
-func (x *StarExpr) exprNode() {}
-func (x *UnaryExpr) exprNode() {}
-func (x *BinaryExpr) exprNode() {}
-func (x *KeyValueExpr) exprNode() {}
-
-func (x *ArrayType) exprNode() {}
-func (x *StructType) exprNode() {}
-func (x *FuncType) exprNode() {}
-func (x *InterfaceType) exprNode() {}
-func (x *MapType) exprNode() {}
-func (x *ChanType) exprNode() {}
+func (x *BadExpr) exprNode() {}
+func (x *Ident) exprNode() {}
+func (x *Ellipsis) exprNode() {}
+func (x *BasicLit) exprNode() {}
+func (x *StringList) exprNode() {}
+func (x *FuncLit) exprNode() {}
+func (x *CompositeLit) exprNode() {}
+func (x *ParenExpr) exprNode() {}
+func (x *SelectorExpr) exprNode() {}
+func (x *IndexExpr) exprNode() {}
+func (x *SliceExpr) exprNode() {}
+func (x *TypeAssertExpr) exprNode() {}
+func (x *CallExpr) exprNode() {}
+func (x *StarExpr) exprNode() {}
+func (x *UnaryExpr) exprNode() {}
+func (x *BinaryExpr) exprNode() {}
+func (x *KeyValueExpr) exprNode() {}
+
+func (x *ArrayType) exprNode() {}
+func (x *StructType) exprNode() {}
+func (x *FuncType) exprNode() {}
+func (x *InterfaceType) exprNode() {}
+func (x *MapType) exprNode() {}
+func (x *ChanType) exprNode() {}
// IsExported returns whether name is an exported Go symbol
// (i.e., whether it begins with an uppercase letter).
func IsExported(name string) bool {
- ch, _ := utf8.DecodeRuneInString(name);
- return unicode.IsUpper(ch);
+ ch, _ := utf8.DecodeRuneInString(name)
+ return unicode.IsUpper(ch)
}
// IsExported returns whether name is an exported Go symbol
// (i.e., whether it begins with an uppercase letter).
-func (name *Ident) IsExported() bool { return IsExported(name.Value) }
+func (name *Ident) IsExported() bool { return IsExported(name.Value) }
-func (name *Ident) String() string { return name.Value }
+func (name *Ident) String() string { return name.Value }
// ----------------------------------------------------------------------------
@@ -371,196 +371,196 @@ type (
// syntax errors for which no correct statement nodes can be
// created.
//
- BadStmt struct {
- token.Position; // beginning position of bad statement
- };
+ BadStmt struct {
+ token.Position // beginning position of bad statement
+ }
// A DeclStmt node represents a declaration in a statement list.
- DeclStmt struct {
- Decl Decl;
- };
+ DeclStmt struct {
+ Decl Decl
+ }
// An EmptyStmt node represents an empty statement.
// The "position" of the empty statement is the position
// of the immediately preceeding semicolon.
//
- EmptyStmt struct {
- token.Position; // position of preceeding ";"
- };
+ EmptyStmt struct {
+ token.Position // position of preceeding ";"
+ }
// A LabeledStmt node represents a labeled statement.
- LabeledStmt struct {
- Label *Ident;
- Stmt Stmt;
- };
+ LabeledStmt struct {
+ Label *Ident
+ Stmt Stmt
+ }
// An ExprStmt node represents a (stand-alone) expression
// in a statement list.
//
- ExprStmt struct {
- X Expr; // expression
- };
+ ExprStmt struct {
+ X Expr // expression
+ }
// An IncDecStmt node represents an increment or decrement statement.
- IncDecStmt struct {
- X Expr;
- Tok token.Token; // INC or DEC
- };
+ IncDecStmt struct {
+ X Expr
+ Tok token.Token // INC or DEC
+ }
// An AssignStmt node represents an assignment or
// a short variable declaration.
- AssignStmt struct {
- Lhs []Expr;
- TokPos token.Position; // position of Tok
- Tok token.Token; // assignment token, DEFINE
- Rhs []Expr;
- };
+ AssignStmt struct {
+ Lhs []Expr
+ TokPos token.Position // position of Tok
+ Tok token.Token // assignment token, DEFINE
+ Rhs []Expr
+ }
// A GoStmt node represents a go statement.
- GoStmt struct {
- token.Position; // position of "go" keyword
- Call *CallExpr;
- };
+ GoStmt struct {
+ token.Position // position of "go" keyword
+ Call *CallExpr
+ }
// A DeferStmt node represents a defer statement.
- DeferStmt struct {
- token.Position; // position of "defer" keyword
- Call *CallExpr;
- };
+ DeferStmt struct {
+ token.Position // position of "defer" keyword
+ Call *CallExpr
+ }
// A ReturnStmt node represents a return statement.
- ReturnStmt struct {
- token.Position; // position of "return" keyword
- Results []Expr;
- };
+ ReturnStmt struct {
+ token.Position // position of "return" keyword
+ Results []Expr
+ }
// A BranchStmt node represents a break, continue, goto,
// or fallthrough statement.
//
- BranchStmt struct {
- token.Position; // position of Tok
- Tok token.Token; // keyword token (BREAK, CONTINUE, GOTO, FALLTHROUGH)
- Label *Ident;
- };
+ BranchStmt struct {
+ token.Position // position of Tok
+ Tok token.Token // keyword token (BREAK, CONTINUE, GOTO, FALLTHROUGH)
+ Label *Ident
+ }
// A BlockStmt node represents a braced statement list.
- BlockStmt struct {
- token.Position; // position of "{"
- List []Stmt;
- Rbrace token.Position; // position of "}"
- };
+ BlockStmt struct {
+ token.Position // position of "{"
+ List []Stmt
+ Rbrace token.Position // position of "}"
+ }
// An IfStmt node represents an if statement.
- IfStmt struct {
- token.Position; // position of "if" keyword
- Init Stmt;
- Cond Expr;
- Body *BlockStmt;
- Else Stmt;
- };
+ IfStmt struct {
+ token.Position // position of "if" keyword
+ Init Stmt
+ Cond Expr
+ Body *BlockStmt
+ Else Stmt
+ }
// A CaseClause represents a case of an expression switch statement.
- CaseClause struct {
- token.Position; // position of "case" or "default" keyword
- Values []Expr; // nil means default case
- Colon token.Position; // position of ":"
- Body []Stmt; // statement list; or nil
- };
+ CaseClause struct {
+ token.Position // position of "case" or "default" keyword
+ Values []Expr // nil means default case
+ Colon token.Position // position of ":"
+ Body []Stmt // statement list; or nil
+ }
// A SwitchStmt node represents an expression switch statement.
- SwitchStmt struct {
- token.Position; // position of "switch" keyword
- Init Stmt;
- Tag Expr;
- Body *BlockStmt; // CaseClauses only
- };
+ SwitchStmt struct {
+ token.Position // position of "switch" keyword
+ Init Stmt
+ Tag Expr
+ Body *BlockStmt // CaseClauses only
+ }
// A TypeCaseClause represents a case of a type switch statement.
- TypeCaseClause struct {
- token.Position; // position of "case" or "default" keyword
- Types []Expr; // nil means default case
- Colon token.Position; // position of ":"
- Body []Stmt; // statement list; or nil
- };
+ TypeCaseClause struct {
+ token.Position // position of "case" or "default" keyword
+ Types []Expr // nil means default case
+ Colon token.Position // position of ":"
+ Body []Stmt // statement list; or nil
+ }
// An TypeSwitchStmt node represents a type switch statement.
- TypeSwitchStmt struct {
- token.Position; // position of "switch" keyword
- Init Stmt;
- Assign Stmt; // x := y.(type)
- Body *BlockStmt; // TypeCaseClauses only
- };
+ TypeSwitchStmt struct {
+ token.Position // position of "switch" keyword
+ Init Stmt
+ Assign Stmt // x := y.(type)
+ Body *BlockStmt // TypeCaseClauses only
+ }
// A CommClause node represents a case of a select statement.
- CommClause struct {
- token.Position; // position of "case" or "default" keyword
- Tok token.Token; // ASSIGN or DEFINE (valid only if Lhs != nil)
- Lhs, Rhs Expr; // Rhs == nil means default case
- Colon token.Position; // position of ":"
- Body []Stmt; // statement list; or nil
- };
+ CommClause struct {
+ token.Position // position of "case" or "default" keyword
+ Tok token.Token // ASSIGN or DEFINE (valid only if Lhs != nil)
+ Lhs, Rhs Expr // Rhs == nil means default case
+ Colon token.Position // position of ":"
+ Body []Stmt // statement list; or nil
+ }
// An SelectStmt node represents a select statement.
- SelectStmt struct {
- token.Position; // position of "select" keyword
- Body *BlockStmt; // CommClauses only
- };
+ SelectStmt struct {
+ token.Position // position of "select" keyword
+ Body *BlockStmt // CommClauses only
+ }
// A ForStmt represents a for statement.
- ForStmt struct {
- token.Position; // position of "for" keyword
- Init Stmt;
- Cond Expr;
- Post Stmt;
- Body *BlockStmt;
- };
+ ForStmt struct {
+ token.Position // position of "for" keyword
+ Init Stmt
+ Cond Expr
+ Post Stmt
+ Body *BlockStmt
+ }
// A RangeStmt represents a for statement with a range clause.
- RangeStmt struct {
- token.Position; // position of "for" keyword
- Key, Value Expr; // Value may be nil
- TokPos token.Position; // position of Tok
- Tok token.Token; // ASSIGN, DEFINE
- X Expr; // value to range over
- Body *BlockStmt;
- };
+ RangeStmt struct {
+ token.Position // position of "for" keyword
+ Key, Value Expr // Value may be nil
+ TokPos token.Position // position of Tok
+ Tok token.Token // ASSIGN, DEFINE
+ X Expr // value to range over
+ Body *BlockStmt
+ }
)
// Pos() implementations for statement nodes where the position
// corresponds to the position of a sub-node.
//
-func (s *DeclStmt) Pos() token.Position { return s.Decl.Pos() }
-func (s *LabeledStmt) Pos() token.Position { return s.Label.Pos() }
-func (s *ExprStmt) Pos() token.Position { return s.X.Pos() }
-func (s *IncDecStmt) Pos() token.Position { return s.X.Pos() }
-func (s *AssignStmt) Pos() token.Position { return s.Lhs[0].Pos() }
+func (s *DeclStmt) Pos() token.Position { return s.Decl.Pos() }
+func (s *LabeledStmt) Pos() token.Position { return s.Label.Pos() }
+func (s *ExprStmt) Pos() token.Position { return s.X.Pos() }
+func (s *IncDecStmt) Pos() token.Position { return s.X.Pos() }
+func (s *AssignStmt) Pos() token.Position { return s.Lhs[0].Pos() }
// stmtNode() ensures that only statement nodes can be
// assigned to a StmtNode.
//
-func (s *BadStmt) stmtNode() {}
-func (s *DeclStmt) stmtNode() {}
-func (s *EmptyStmt) stmtNode() {}
-func (s *LabeledStmt) stmtNode() {}
-func (s *ExprStmt) stmtNode() {}
-func (s *IncDecStmt) stmtNode() {}
-func (s *AssignStmt) stmtNode() {}
-func (s *GoStmt) stmtNode() {}
-func (s *DeferStmt) stmtNode() {}
-func (s *ReturnStmt) stmtNode() {}
-func (s *BranchStmt) stmtNode() {}
-func (s *BlockStmt) stmtNode() {}
-func (s *IfStmt) stmtNode() {}
-func (s *CaseClause) stmtNode() {}
-func (s *SwitchStmt) stmtNode() {}
-func (s *TypeCaseClause) stmtNode() {}
-func (s *TypeSwitchStmt) stmtNode() {}
-func (s *CommClause) stmtNode() {}
-func (s *SelectStmt) stmtNode() {}
-func (s *ForStmt) stmtNode() {}
-func (s *RangeStmt) stmtNode() {}
+func (s *BadStmt) stmtNode() {}
+func (s *DeclStmt) stmtNode() {}
+func (s *EmptyStmt) stmtNode() {}
+func (s *LabeledStmt) stmtNode() {}
+func (s *ExprStmt) stmtNode() {}
+func (s *IncDecStmt) stmtNode() {}
+func (s *AssignStmt) stmtNode() {}
+func (s *GoStmt) stmtNode() {}
+func (s *DeferStmt) stmtNode() {}
+func (s *ReturnStmt) stmtNode() {}
+func (s *BranchStmt) stmtNode() {}
+func (s *BlockStmt) stmtNode() {}
+func (s *IfStmt) stmtNode() {}
+func (s *CaseClause) stmtNode() {}
+func (s *SwitchStmt) stmtNode() {}
+func (s *TypeCaseClause) stmtNode() {}
+func (s *TypeSwitchStmt) stmtNode() {}
+func (s *CommClause) stmtNode() {}
+func (s *SelectStmt) stmtNode() {}
+func (s *ForStmt) stmtNode() {}
+func (s *RangeStmt) stmtNode() {}
// ----------------------------------------------------------------------------
@@ -571,36 +571,36 @@ func (s *RangeStmt) stmtNode() {}
//
type (
// The Spec type stands for any of *ImportSpec, *ValueSpec, and *TypeSpec.
- Spec interface {
- Node;
- specNode();
- };
+ Spec interface {
+ Node
+ specNode()
+ }
// An ImportSpec node represents a single package import.
- ImportSpec struct {
- Doc *CommentGroup; // associated documentation; or nil
- Name *Ident; // local package name (including "."); or nil
- Path []*BasicLit; // package path
- Comment *CommentGroup; // line comments; or nil
- };
+ ImportSpec struct {
+ Doc *CommentGroup // associated documentation; or nil
+ Name *Ident // local package name (including "."); or nil
+ Path []*BasicLit // package path
+ Comment *CommentGroup // line comments; or nil
+ }
// A ValueSpec node represents a constant or variable declaration
// (ConstSpec or VarSpec production).
- ValueSpec struct {
- Doc *CommentGroup; // associated documentation; or nil
- Names []*Ident; // value names
- Type Expr; // value type; or nil
- Values []Expr; // initial values; or nil
- Comment *CommentGroup; // line comments; or nil
- };
+ ValueSpec struct {
+ Doc *CommentGroup // associated documentation; or nil
+ Names []*Ident // value names
+ Type Expr // value type; or nil
+ Values []Expr // initial values; or nil
+ Comment *CommentGroup // line comments; or nil
+ }
// A TypeSpec node represents a type declaration (TypeSpec production).
- TypeSpec struct {
- Doc *CommentGroup; // associated documentation; or nil
- Name *Ident; // type name
- Type Expr;
- Comment *CommentGroup; // line comments; or nil
- };
+ TypeSpec struct {
+ Doc *CommentGroup // associated documentation; or nil
+ Name *Ident // type name
+ Type Expr
+ Comment *CommentGroup // line comments; or nil
+ }
)
@@ -610,19 +610,19 @@ func (s *ImportSpec) Pos() token.Position {
if s.Name != nil {
return s.Name.Pos()
}
- return s.Path[0].Pos();
+ return s.Path[0].Pos()
}
-func (s *ValueSpec) Pos() token.Position { return s.Names[0].Pos() }
-func (s *TypeSpec) Pos() token.Position { return s.Name.Pos() }
+func (s *ValueSpec) Pos() token.Position { return s.Names[0].Pos() }
+func (s *TypeSpec) Pos() token.Position { return s.Name.Pos() }
// specNode() ensures that only spec nodes can be
// assigned to a Spec.
//
-func (s *ImportSpec) specNode() {}
-func (s *ValueSpec) specNode() {}
-func (s *TypeSpec) specNode() {}
+func (s *ImportSpec) specNode() {}
+func (s *ValueSpec) specNode() {}
+func (s *TypeSpec) specNode() {}
// A declaration is represented by one of the following declaration nodes.
@@ -632,9 +632,9 @@ type (
// syntax errors for which no correct declaration nodes can be
// created.
//
- BadDecl struct {
- token.Position; // beginning position of bad declaration
- };
+ BadDecl struct {
+ token.Position // beginning position of bad declaration
+ }
// A GenDecl node (generic declaration node) represents an import,
// constant, type or variable declaration. A valid Lparen position
@@ -647,36 +647,36 @@ type (
// token.TYPE *TypeSpec
// token.VAR *ValueSpec
//
- GenDecl struct {
- Doc *CommentGroup; // associated documentation; or nil
- token.Position; // position of Tok
- Tok token.Token; // IMPORT, CONST, TYPE, VAR
- Lparen token.Position; // position of '(', if any
- Specs []Spec;
- Rparen token.Position; // position of ')', if any
- };
+ GenDecl struct {
+ Doc *CommentGroup // associated documentation; or nil
+ token.Position // position of Tok
+ Tok token.Token // IMPORT, CONST, TYPE, VAR
+ Lparen token.Position // position of '(', if any
+ Specs []Spec
+ Rparen token.Position // position of ')', if any
+ }
// A FuncDecl node represents a function declaration.
- FuncDecl struct {
- Doc *CommentGroup; // associated documentation; or nil
- Recv *Field; // receiver (methods); or nil (functions)
- Name *Ident; // function/method name
- Type *FuncType; // position of Func keyword, parameters and results
- Body *BlockStmt; // function body; or nil (forward declaration)
- };
+ FuncDecl struct {
+ Doc *CommentGroup // associated documentation; or nil
+ Recv *Field // receiver (methods); or nil (functions)
+ Name *Ident // function/method name
+ Type *FuncType // position of Func keyword, parameters and results
+ Body *BlockStmt // function body; or nil (forward declaration)
+ }
)
// The position of a FuncDecl node is the position of its function type.
-func (d *FuncDecl) Pos() token.Position { return d.Type.Pos() }
+func (d *FuncDecl) Pos() token.Position { return d.Type.Pos() }
// declNode() ensures that only declaration nodes can be
// assigned to a DeclNode.
//
-func (d *BadDecl) declNode() {}
-func (d *GenDecl) declNode() {}
-func (d *FuncDecl) declNode() {}
+func (d *BadDecl) declNode() {}
+func (d *GenDecl) declNode() {}
+func (d *FuncDecl) declNode() {}
// ----------------------------------------------------------------------------
@@ -685,11 +685,11 @@ func (d *FuncDecl) declNode() {}
// A File node represents a Go source file.
//
type File struct {
- Doc *CommentGroup; // associated documentation; or nil
- token.Position; // position of "package" keyword
- Name *Ident; // package name
- Decls []Decl; // top-level declarations
- Comments *CommentGroup; // list of all comments in the source file
+ Doc *CommentGroup // associated documentation; or nil
+ token.Position // position of "package" keyword
+ Name *Ident // package name
+ Decls []Decl // top-level declarations
+ Comments *CommentGroup // list of all comments in the source file
}
@@ -697,7 +697,7 @@ type File struct {
// collectively building a Go package.
//
type Package struct {
- Name string; // package name
- Path string; // package path
- Files map[string]*File; // path-relative filenames
+ Name string // package name
+ Path string // package path
+ Files map[string]*File // path-relative filenames
}
diff --git a/src/pkg/go/ast/filter.go b/src/pkg/go/ast/filter.go
index 772407400..697c9fcdc 100644
--- a/src/pkg/go/ast/filter.go
+++ b/src/pkg/go/ast/filter.go
@@ -8,14 +8,14 @@ import "go/token"
func filterIdentList(list []*Ident) []*Ident {
- j := 0;
+ j := 0
for _, x := range list {
if x.IsExported() {
- list[j] = x;
- j++;
+ list[j] = x
+ j++
}
}
- return list[0:j];
+ return list[0:j]
}
@@ -32,14 +32,14 @@ func isExportedType(typ Expr) bool {
case *StarExpr:
return isExportedType(t.X)
}
- return false;
+ return false
}
func filterFieldList(list []*Field, incomplete *bool) []*Field {
- j := 0;
+ j := 0
for _, f := range list {
- exported := false;
+ exported := false
if len(f.Names) == 0 {
// anonymous field
// (Note that a non-exported anonymous field
@@ -49,23 +49,23 @@ func filterFieldList(list []*Field, incomplete *bool) []*Field {
// type information.)
exported = isExportedType(f.Type)
} else {
- n := len(f.Names);
- f.Names = filterIdentList(f.Names);
+ n := len(f.Names)
+ f.Names = filterIdentList(f.Names)
if len(f.Names) < n {
*incomplete = true
}
- exported = len(f.Names) > 0;
+ exported = len(f.Names) > 0
}
if exported {
- filterType(f.Type);
- list[j] = f;
- j++;
+ filterType(f.Type)
+ list[j] = f
+ j++
}
}
if j < len(list) {
*incomplete = true
}
- return list[0:j];
+ return list[0:j]
}
@@ -85,13 +85,13 @@ func filterType(typ Expr) {
case *StructType:
t.Fields = filterFieldList(t.Fields, &t.Incomplete)
case *FuncType:
- filterParamList(t.Params);
- filterParamList(t.Results);
+ filterParamList(t.Params)
+ filterParamList(t.Results)
case *InterfaceType:
t.Methods = filterFieldList(t.Methods, &t.Incomplete)
case *MapType:
- filterType(t.Key);
- filterType(t.Value);
+ filterType(t.Key)
+ filterType(t.Value)
case *ChanType:
filterType(t.Value)
}
@@ -101,48 +101,48 @@ func filterType(typ Expr) {
func filterSpec(spec Spec) bool {
switch s := spec.(type) {
case *ValueSpec:
- s.Names = filterIdentList(s.Names);
+ s.Names = filterIdentList(s.Names)
if len(s.Names) > 0 {
- filterType(s.Type);
- return true;
+ filterType(s.Type)
+ return true
}
case *TypeSpec:
// TODO(gri) consider stripping forward declarations
// of structs, interfaces, functions, and methods
if s.Name.IsExported() {
- filterType(s.Type);
- return true;
+ filterType(s.Type)
+ return true
}
}
- return false;
+ return false
}
func filterSpecList(list []Spec) []Spec {
- j := 0;
+ j := 0
for _, s := range list {
if filterSpec(s) {
- list[j] = s;
- j++;
+ list[j] = s
+ j++
}
}
- return list[0:j];
+ return list[0:j]
}
func filterDecl(decl Decl) bool {
switch d := decl.(type) {
case *GenDecl:
- d.Specs = filterSpecList(d.Specs);
- return len(d.Specs) > 0;
+ d.Specs = filterSpecList(d.Specs)
+ return len(d.Specs) > 0
case *FuncDecl:
// TODO consider removing function declaration altogether if
// forward declaration (i.e., if d.Body == nil) because
// in that case the actual declaration will come later.
- d.Body = nil; // strip body
- return d.Name.IsExported();
+ d.Body = nil // strip body
+ return d.Name.IsExported()
}
- return false;
+ return false
}
@@ -157,15 +157,15 @@ func filterDecl(decl Decl) bool {
// false otherwise.
//
func FileExports(src *File) bool {
- j := 0;
+ j := 0
for _, d := range src.Decls {
if filterDecl(d) {
- src.Decls[j] = d;
- j++;
+ src.Decls[j] = d
+ j++
}
}
- src.Decls = src.Decls[0:j];
- return j > 0;
+ src.Decls = src.Decls[0:j]
+ return j > 0
}
@@ -177,13 +177,13 @@ func FileExports(src *File) bool {
// returns false otherwise.
//
func PackageExports(pkg *Package) bool {
- hasExports := false;
+ hasExports := false
for _, f := range pkg.Files {
if FileExports(f) {
hasExports = true
}
}
- return hasExports;
+ return hasExports
}
@@ -199,13 +199,13 @@ var separator = &Comment{noPos, []byte{'/', '/'}}
func MergePackageFiles(pkg *Package) *File {
// Count the number of package comments and declarations across
// all package files.
- ncomments := 0;
- ndecls := 0;
+ ncomments := 0
+ ndecls := 0
for _, f := range pkg.Files {
if f.Doc != nil {
- ncomments += len(f.Doc.List) + 1 // +1 for separator
+ ncomments += len(f.Doc.List) + 1 // +1 for separator
}
- ndecls += len(f.Decls);
+ ndecls += len(f.Decls)
}
// Collect package comments from all package files into a single
@@ -213,35 +213,35 @@ func MergePackageFiles(pkg *Package) *File {
// is unspecified. In general there should be only one file with
// a package comment; but it's better to collect extra comments
// than drop them on the floor.
- var doc *CommentGroup;
+ var doc *CommentGroup
if ncomments > 0 {
- list := make([]*Comment, ncomments-1); // -1: no separator before first group
- i := 0;
+ list := make([]*Comment, ncomments-1) // -1: no separator before first group
+ i := 0
for _, f := range pkg.Files {
if f.Doc != nil {
if i > 0 {
// not the first group - add separator
- list[i] = separator;
- i++;
+ list[i] = separator
+ i++
}
for _, c := range f.Doc.List {
- list[i] = c;
- i++;
+ list[i] = c
+ i++
}
}
}
- doc = &CommentGroup{list, nil};
+ doc = &CommentGroup{list, nil}
}
// Collect declarations from all package files.
- var decls []Decl;
+ var decls []Decl
if ndecls > 0 {
- decls = make([]Decl, ndecls);
- i := 0;
+ decls = make([]Decl, ndecls)
+ i := 0
for _, f := range pkg.Files {
for _, d := range f.Decls {
- decls[i] = d;
- i++;
+ decls[i] = d
+ i++
}
}
}
@@ -249,5 +249,5 @@ func MergePackageFiles(pkg *Package) *File {
// TODO(gri) Should collect comments as well. For that the comment
// list should be changed back into a []*CommentGroup,
// otherwise need to modify the existing linked list.
- return &File{doc, noPos, &Ident{noPos, pkg.Name}, decls, nil};
+ return &File{doc, noPos, &Ident{noPos, pkg.Name}, decls, nil}
}
diff --git a/src/pkg/go/ast/scope.go b/src/pkg/go/ast/scope.go
index 240953673..e8ad12f97 100644
--- a/src/pkg/go/ast/scope.go
+++ b/src/pkg/go/ast/scope.go
@@ -11,13 +11,13 @@ package ast
// NOTE: WORK IN PROGRESS
//
type Scope struct {
- Outer *Scope;
- Names map[string]*Ident;
+ Outer *Scope
+ Names map[string]*Ident
}
// NewScope creates a new scope nested in the outer scope.
-func NewScope(outer *Scope) *Scope { return &Scope{outer, make(map[string]*Ident)} }
+func NewScope(outer *Scope) *Scope { return &Scope{outer, make(map[string]*Ident)} }
// Declare inserts an identifier into the scope s. If the
@@ -28,8 +28,8 @@ func (s *Scope) Declare(ident *Ident) bool {
if _, found := s.Names[ident.Value]; found {
return false
}
- s.Names[ident.Value] = ident;
- return true;
+ s.Names[ident.Value] = ident
+ return true
}
@@ -43,7 +43,7 @@ func (s *Scope) Lookup(name string) *Ident {
return ident
}
}
- return nil;
+ return nil
}
diff --git a/src/pkg/go/ast/walk.go b/src/pkg/go/ast/walk.go
index dc9c1fe3b..104596623 100644
--- a/src/pkg/go/ast/walk.go
+++ b/src/pkg/go/ast/walk.go
@@ -10,7 +10,7 @@ import "fmt"
// If the result visitor w is not nil, Walk visits each of the children
// of node with the visitor w, followed by a call of w.Visit(nil).
type Visitor interface {
- Visit(node interface{}) (w Visitor);
+ Visit(node interface{}) (w Visitor)
}
@@ -71,13 +71,13 @@ func Walk(v Visitor, node interface{}) {
// comments list.
case *Field:
- walkCommentGroup(v, n.Doc);
- Walk(v, n.Names);
- Walk(v, n.Type);
+ walkCommentGroup(v, n.Doc)
+ Walk(v, n.Names)
+ Walk(v, n.Type)
for _, x := range n.Tag {
Walk(v, x)
}
- walkCommentGroup(v, n.Comment);
+ walkCommentGroup(v, n.Comment)
// Expressions
case *BadExpr, *Ident, *Ellipsis, *BasicLit:
@@ -92,35 +92,35 @@ func Walk(v Visitor, node interface{}) {
if n != nil {
Walk(v, n.Type)
}
- walkBlockStmt(v, n.Body);
+ walkBlockStmt(v, n.Body)
case *CompositeLit:
- Walk(v, n.Type);
- Walk(v, n.Elts);
+ Walk(v, n.Type)
+ Walk(v, n.Elts)
case *ParenExpr:
Walk(v, n.X)
case *SelectorExpr:
- Walk(v, n.X);
- walkIdent(v, n.Sel);
+ Walk(v, n.X)
+ walkIdent(v, n.Sel)
case *IndexExpr:
- Walk(v, n.X);
- Walk(v, n.Index);
+ Walk(v, n.X)
+ Walk(v, n.Index)
case *SliceExpr:
- Walk(v, n.X);
- Walk(v, n.Index);
- Walk(v, n.End);
+ Walk(v, n.X)
+ Walk(v, n.Index)
+ Walk(v, n.End)
case *TypeAssertExpr:
- Walk(v, n.X);
- Walk(v, n.Type);
+ Walk(v, n.X)
+ Walk(v, n.Type)
case *CallExpr:
- Walk(v, n.Fun);
- Walk(v, n.Args);
+ Walk(v, n.Fun)
+ Walk(v, n.Args)
case *StarExpr:
Walk(v, n.X)
@@ -129,31 +129,31 @@ func Walk(v Visitor, node interface{}) {
Walk(v, n.X)
case *BinaryExpr:
- Walk(v, n.X);
- Walk(v, n.Y);
+ Walk(v, n.X)
+ Walk(v, n.Y)
case *KeyValueExpr:
- Walk(v, n.Key);
- Walk(v, n.Value);
+ Walk(v, n.Key)
+ Walk(v, n.Value)
// Types
case *ArrayType:
- Walk(v, n.Len);
- Walk(v, n.Elt);
+ Walk(v, n.Len)
+ Walk(v, n.Elt)
case *StructType:
Walk(v, n.Fields)
case *FuncType:
- Walk(v, n.Params);
- Walk(v, n.Results);
+ Walk(v, n.Params)
+ Walk(v, n.Results)
case *InterfaceType:
Walk(v, n.Methods)
case *MapType:
- Walk(v, n.Key);
- Walk(v, n.Value);
+ Walk(v, n.Key)
+ Walk(v, n.Value)
case *ChanType:
Walk(v, n.Value)
@@ -169,8 +169,8 @@ func Walk(v Visitor, node interface{}) {
// nothing to do
case *LabeledStmt:
- walkIdent(v, n.Label);
- Walk(v, n.Stmt);
+ walkIdent(v, n.Label)
+ Walk(v, n.Stmt)
case *ExprStmt:
Walk(v, n.X)
@@ -179,8 +179,8 @@ func Walk(v Visitor, node interface{}) {
Walk(v, n.X)
case *AssignStmt:
- Walk(v, n.Lhs);
- Walk(v, n.Rhs);
+ Walk(v, n.Lhs)
+ Walk(v, n.Rhs)
case *GoStmt:
if n.Call != nil {
@@ -202,99 +202,99 @@ func Walk(v Visitor, node interface{}) {
Walk(v, n.List)
case *IfStmt:
- Walk(v, n.Init);
- Walk(v, n.Cond);
- walkBlockStmt(v, n.Body);
- Walk(v, n.Else);
+ Walk(v, n.Init)
+ Walk(v, n.Cond)
+ walkBlockStmt(v, n.Body)
+ Walk(v, n.Else)
case *CaseClause:
- Walk(v, n.Values);
- Walk(v, n.Body);
+ Walk(v, n.Values)
+ Walk(v, n.Body)
case *SwitchStmt:
- Walk(v, n.Init);
- Walk(v, n.Tag);
- walkBlockStmt(v, n.Body);
+ Walk(v, n.Init)
+ Walk(v, n.Tag)
+ walkBlockStmt(v, n.Body)
case *TypeCaseClause:
- Walk(v, n.Types);
- Walk(v, n.Body);
+ Walk(v, n.Types)
+ Walk(v, n.Body)
case *TypeSwitchStmt:
- Walk(v, n.Init);
- Walk(v, n.Assign);
- walkBlockStmt(v, n.Body);
+ Walk(v, n.Init)
+ Walk(v, n.Assign)
+ walkBlockStmt(v, n.Body)
case *CommClause:
- Walk(v, n.Lhs);
- Walk(v, n.Rhs);
- Walk(v, n.Body);
+ Walk(v, n.Lhs)
+ Walk(v, n.Rhs)
+ Walk(v, n.Body)
case *SelectStmt:
walkBlockStmt(v, n.Body)
case *ForStmt:
- Walk(v, n.Init);
- Walk(v, n.Cond);
- Walk(v, n.Post);
- walkBlockStmt(v, n.Body);
+ Walk(v, n.Init)
+ Walk(v, n.Cond)
+ Walk(v, n.Post)
+ walkBlockStmt(v, n.Body)
case *RangeStmt:
- Walk(v, n.Key);
- Walk(v, n.Value);
- Walk(v, n.X);
- walkBlockStmt(v, n.Body);
+ Walk(v, n.Key)
+ Walk(v, n.Value)
+ Walk(v, n.X)
+ walkBlockStmt(v, n.Body)
// Declarations
case *ImportSpec:
- walkCommentGroup(v, n.Doc);
- walkIdent(v, n.Name);
+ walkCommentGroup(v, n.Doc)
+ walkIdent(v, n.Name)
for _, x := range n.Path {
Walk(v, x)
}
- walkCommentGroup(v, n.Comment);
+ walkCommentGroup(v, n.Comment)
case *ValueSpec:
- walkCommentGroup(v, n.Doc);
- Walk(v, n.Names);
- Walk(v, n.Type);
- Walk(v, n.Values);
- walkCommentGroup(v, n.Comment);
+ walkCommentGroup(v, n.Doc)
+ Walk(v, n.Names)
+ Walk(v, n.Type)
+ Walk(v, n.Values)
+ walkCommentGroup(v, n.Comment)
case *TypeSpec:
- walkCommentGroup(v, n.Doc);
- walkIdent(v, n.Name);
- Walk(v, n.Type);
- walkCommentGroup(v, n.Comment);
+ walkCommentGroup(v, n.Doc)
+ walkIdent(v, n.Name)
+ Walk(v, n.Type)
+ walkCommentGroup(v, n.Comment)
case *BadDecl:
// nothing to do
case *GenDecl:
- walkCommentGroup(v, n.Doc);
+ walkCommentGroup(v, n.Doc)
for _, s := range n.Specs {
Walk(v, s)
}
case *FuncDecl:
- walkCommentGroup(v, n.Doc);
+ walkCommentGroup(v, n.Doc)
if n.Recv != nil {
Walk(v, n.Recv)
}
- walkIdent(v, n.Name);
+ walkIdent(v, n.Name)
if n.Type != nil {
Walk(v, n.Type)
}
- walkBlockStmt(v, n.Body);
+ walkBlockStmt(v, n.Body)
// Files and packages
case *File:
- walkCommentGroup(v, n.Doc);
- walkIdent(v, n.Name);
+ walkCommentGroup(v, n.Doc)
+ walkIdent(v, n.Name)
for _, d := range n.Decls {
Walk(v, d)
}
- walkCommentGroup(v, n.Comments);
+ walkCommentGroup(v, n.Comments)
case *Package:
for _, f := range n.Files {
@@ -322,9 +322,9 @@ func Walk(v Visitor, node interface{}) {
}
default:
- fmt.Printf("ast.Walk: unexpected type %T", n);
- panic();
+ fmt.Printf("ast.Walk: unexpected type %T", n)
+ panic()
}
- v.Visit(nil);
+ v.Visit(nil)
}
diff --git a/src/pkg/go/doc/comment.go b/src/pkg/go/doc/comment.go
index 79f837927..09622f715 100644
--- a/src/pkg/go/doc/comment.go
+++ b/src/pkg/go/doc/comment.go
@@ -7,10 +7,10 @@
package doc
import (
- "go/ast";
- "io";
- "strings";
- "template"; // for htmlEscape
+ "go/ast"
+ "io"
+ "strings"
+ "template" // for htmlEscape
)
// Comment extraction
@@ -21,12 +21,12 @@ func CommentText(comment *ast.CommentGroup) string {
if comment == nil {
return ""
}
- comments := make([]string, len(comment.List));
+ comments := make([]string, len(comment.List))
for i, c := range comment.List {
comments[i] = string(c.Text)
}
- lines := make([]string, 0, 20);
+ lines := make([]string, 0, 20)
for _, c := range comments {
// Remove comment markers.
// The parser has given us exactly the comment text.
@@ -34,7 +34,7 @@ func CommentText(comment *ast.CommentGroup) string {
case n >= 4 && c[0:2] == "/*" && c[n-2:n] == "*/":
c = c[2 : n-2]
case n >= 2 && c[0:2] == "//":
- c = c[2:n];
+ c = c[2:n]
// Remove leading space after //, if there is one.
if len(c) > 0 && c[0] == ' ' {
c = c[1:]
@@ -42,61 +42,61 @@ func CommentText(comment *ast.CommentGroup) string {
}
// Split on newlines.
- cl := strings.Split(c, "\n", 0);
+ cl := strings.Split(c, "\n", 0)
// Walk lines, stripping trailing white space and adding to list.
for _, l := range cl {
// Strip trailing white space
- m := len(l);
+ m := len(l)
for m > 0 && (l[m-1] == ' ' || l[m-1] == '\n' || l[m-1] == '\t' || l[m-1] == '\r') {
m--
}
- l = l[0:m];
+ l = l[0:m]
// Add to list.
- n := len(lines);
+ n := len(lines)
if n+1 >= cap(lines) {
- newlines := make([]string, n, 2*cap(lines));
+ newlines := make([]string, n, 2*cap(lines))
for k := range newlines {
newlines[k] = lines[k]
}
- lines = newlines;
+ lines = newlines
}
- lines = lines[0 : n+1];
- lines[n] = l;
+ lines = lines[0 : n+1]
+ lines[n] = l
}
}
// Remove leading blank lines; convert runs of
// interior blank lines to a single blank line.
- n := 0;
+ n := 0
for _, line := range lines {
if line != "" || n > 0 && lines[n-1] != "" {
- lines[n] = line;
- n++;
+ lines[n] = line
+ n++
}
}
- lines = lines[0:n];
+ lines = lines[0:n]
// Add final "" entry to get trailing newline from Join.
// The original loop always leaves room for one more.
if n > 0 && lines[n-1] != "" {
- lines = lines[0 : n+1];
- lines[n] = "";
+ lines = lines[0 : n+1]
+ lines[n] = ""
}
- return strings.Join(lines, "\n");
+ return strings.Join(lines, "\n")
}
// Split bytes into lines.
func split(text []byte) [][]byte {
// count lines
- n := 0;
- last := 0;
+ n := 0
+ last := 0
for i, c := range text {
if c == '\n' {
- last = i + 1;
- n++;
+ last = i + 1
+ n++
}
}
if last < len(text) {
@@ -104,76 +104,76 @@ func split(text []byte) [][]byte {
}
// split
- out := make([][]byte, n);
- last = 0;
- n = 0;
+ out := make([][]byte, n)
+ last = 0
+ n = 0
for i, c := range text {
if c == '\n' {
- out[n] = text[last : i+1];
- last = i + 1;
- n++;
+ out[n] = text[last : i+1]
+ last = i + 1
+ n++
}
}
if last < len(text) {
out[n] = text[last:]
}
- return out;
+ return out
}
var (
- ldquo = strings.Bytes("&ldquo;");
- rdquo = strings.Bytes("&rdquo;");
+ ldquo = strings.Bytes("&ldquo;")
+ rdquo = strings.Bytes("&rdquo;")
)
// Escape comment text for HTML.
// Also, turn `` into &ldquo; and '' into &rdquo;.
func commentEscape(w io.Writer, s []byte) {
- last := 0;
+ last := 0
for i := 0; i < len(s)-1; i++ {
if s[i] == s[i+1] && (s[i] == '`' || s[i] == '\'') {
- template.HTMLEscape(w, s[last:i]);
- last = i + 2;
+ template.HTMLEscape(w, s[last:i])
+ last = i + 2
switch s[i] {
case '`':
w.Write(ldquo)
case '\'':
w.Write(rdquo)
}
- i++; // loop will add one more
+ i++ // loop will add one more
}
}
- template.HTMLEscape(w, s[last:]);
+ template.HTMLEscape(w, s[last:])
}
var (
- html_p = strings.Bytes("<p>\n");
- html_endp = strings.Bytes("</p>\n");
- html_pre = strings.Bytes("<pre>");
- html_endpre = strings.Bytes("</pre>\n");
+ html_p = strings.Bytes("<p>\n")
+ html_endp = strings.Bytes("</p>\n")
+ html_pre = strings.Bytes("<pre>")
+ html_endpre = strings.Bytes("</pre>\n")
)
func indentLen(s []byte) int {
- i := 0;
+ i := 0
for i < len(s) && (s[i] == ' ' || s[i] == '\t') {
i++
}
- return i;
+ return i
}
-func isBlank(s []byte) bool { return len(s) == 0 || (len(s) == 1 && s[0] == '\n') }
+func isBlank(s []byte) bool { return len(s) == 0 || (len(s) == 1 && s[0] == '\n') }
func commonPrefix(a, b []byte) []byte {
- i := 0;
+ i := 0
for i < len(a) && i < len(b) && a[i] == b[i] {
i++
}
- return a[0:i];
+ return a[0:i]
}
@@ -183,13 +183,13 @@ func unindent(block [][]byte) {
}
// compute maximum common white prefix
- prefix := block[0][0:indentLen(block[0])];
+ prefix := block[0][0:indentLen(block[0])]
for _, line := range block {
if !isBlank(line) {
prefix = commonPrefix(prefix, line[0:indentLen(line)])
}
}
- n := len(prefix);
+ n := len(prefix)
// remove
for i, line := range block {
@@ -212,37 +212,37 @@ func unindent(block [][]byte) {
// TODO(rsc): I'd like to pass in an array of variable names []string
// and then italicize those strings when they appear as words.
func ToHTML(w io.Writer, s []byte) {
- inpara := false;
+ inpara := false
close := func() {
if inpara {
- w.Write(html_endp);
- inpara = false;
+ w.Write(html_endp)
+ inpara = false
}
- };
+ }
open := func() {
if !inpara {
- w.Write(html_p);
- inpara = true;
+ w.Write(html_p)
+ inpara = true
}
- };
+ }
- lines := split(s);
- unindent(lines);
+ lines := split(s)
+ unindent(lines)
for i := 0; i < len(lines); {
- line := lines[i];
+ line := lines[i]
if isBlank(line) {
// close paragraph
- close();
- i++;
- continue;
+ close()
+ i++
+ continue
}
if indentLen(line) > 0 {
// close paragraph
- close();
+ close()
// count indented or blank lines
- j := i + 1;
+ j := i + 1
for j < len(lines) && (isBlank(lines[j]) || indentLen(lines[j]) > 0) {
j++
}
@@ -250,25 +250,25 @@ func ToHTML(w io.Writer, s []byte) {
for j > i && isBlank(lines[j-1]) {
j--
}
- block := lines[i:j];
- i = j;
+ block := lines[i:j]
+ i = j
- unindent(block);
+ unindent(block)
// put those lines in a pre block.
// they don't get the nice text formatting,
// just html escaping
- w.Write(html_pre);
+ w.Write(html_pre)
for _, line := range block {
template.HTMLEscape(w, line)
}
- w.Write(html_endpre);
- continue;
+ w.Write(html_endpre)
+ continue
}
// open paragraph
- open();
- commentEscape(w, lines[i]);
- i++;
+ open()
+ commentEscape(w, lines[i])
+ i++
}
- close();
+ close()
}
diff --git a/src/pkg/go/doc/doc.go b/src/pkg/go/doc/doc.go
index b7cc8f3b0..be03ddfd6 100644
--- a/src/pkg/go/doc/doc.go
+++ b/src/pkg/go/doc/doc.go
@@ -6,11 +6,11 @@
package doc
import (
- "container/vector";
- "go/ast";
- "go/token";
- "regexp";
- "sort";
+ "container/vector"
+ "go/ast"
+ "go/token"
+ "regexp"
+ "sort"
)
@@ -19,11 +19,11 @@ import (
type typeDoc struct {
// len(decl.Specs) == 1, and the element type is *ast.TypeSpec
// if the type declaration hasn't been seen yet, decl is nil
- decl *ast.GenDecl;
+ decl *ast.GenDecl
// values, factory functions, and methods associated with the type
- values *vector.Vector; // list of *ast.GenDecl (consts and vars)
- factories map[string]*ast.FuncDecl;
- methods map[string]*ast.FuncDecl;
+ values *vector.Vector // list of *ast.GenDecl (consts and vars)
+ factories map[string]*ast.FuncDecl
+ methods map[string]*ast.FuncDecl
}
@@ -35,27 +35,27 @@ type typeDoc struct {
// printing the corresponding AST node).
//
type docReader struct {
- doc *ast.CommentGroup; // package documentation, if any
- pkgName string;
- values *vector.Vector; // list of *ast.GenDecl (consts and vars)
- types map[string]*typeDoc;
- funcs map[string]*ast.FuncDecl;
- bugs *vector.Vector; // list of *ast.CommentGroup
+ doc *ast.CommentGroup // package documentation, if any
+ pkgName string
+ values *vector.Vector // list of *ast.GenDecl (consts and vars)
+ types map[string]*typeDoc
+ funcs map[string]*ast.FuncDecl
+ bugs *vector.Vector // list of *ast.CommentGroup
}
func (doc *docReader) init(pkgName string) {
- doc.pkgName = pkgName;
- doc.values = new(vector.Vector);
- doc.types = make(map[string]*typeDoc);
- doc.funcs = make(map[string]*ast.FuncDecl);
- doc.bugs = new(vector.Vector);
+ doc.pkgName = pkgName
+ doc.values = new(vector.Vector)
+ doc.types = make(map[string]*typeDoc)
+ doc.funcs = make(map[string]*ast.FuncDecl)
+ doc.bugs = new(vector.Vector)
}
func (doc *docReader) addType(decl *ast.GenDecl) {
- spec := decl.Specs[0].(*ast.TypeSpec);
- typ := doc.lookupTypeDoc(spec.Name.Value);
+ spec := decl.Specs[0].(*ast.TypeSpec)
+ typ := doc.lookupTypeDoc(spec.Name.Value)
// typ should always be != nil since declared types
// are always named - be conservative and check
if typ != nil {
@@ -68,15 +68,15 @@ func (doc *docReader) addType(decl *ast.GenDecl) {
func (doc *docReader) lookupTypeDoc(name string) *typeDoc {
if name == "" {
- return nil // no type docs for anonymous types
+ return nil // no type docs for anonymous types
}
if tdoc, found := doc.types[name]; found {
return tdoc
}
// type wasn't found - add one without declaration
- tdoc := &typeDoc{nil, new(vector.Vector), make(map[string]*ast.FuncDecl), make(map[string]*ast.FuncDecl)};
- doc.types[name] = tdoc;
- return tdoc;
+ tdoc := &typeDoc{nil, new(vector.Vector), make(map[string]*ast.FuncDecl), make(map[string]*ast.FuncDecl)}
+ doc.types[name] = tdoc
+ return tdoc
}
@@ -91,7 +91,7 @@ func baseTypeName(typ ast.Expr) string {
case *ast.StarExpr:
return baseTypeName(t.X)
}
- return "";
+ return ""
}
@@ -100,12 +100,12 @@ func (doc *docReader) addValue(decl *ast.GenDecl) {
// Heuristic: For each typed entry, determine the type name, if any.
// If there is exactly one type name that is sufficiently
// frequent, associate the decl with the respective type.
- domName := "";
- domFreq := 0;
- prev := "";
+ domName := ""
+ domFreq := 0
+ prev := ""
for _, s := range decl.Specs {
if v, ok := s.(*ast.ValueSpec); ok {
- name := "";
+ name := ""
switch {
case v.Type != nil:
// a type is present; determine it's name
@@ -122,38 +122,38 @@ func (doc *docReader) addValue(decl *ast.GenDecl) {
if domName != "" && domName != name {
// more than one type name - do not associate
// with any type
- domName = "";
- break;
+ domName = ""
+ break
}
- domName = name;
- domFreq++;
+ domName = name
+ domFreq++
}
- prev = name;
+ prev = name
}
}
// determine values list
- const threshold = 0.75;
- values := doc.values;
+ const threshold = 0.75
+ values := doc.values
if domName != "" && domFreq >= int(float(len(decl.Specs))*threshold) {
// typed entries are sufficiently frequent
- typ := doc.lookupTypeDoc(domName);
+ typ := doc.lookupTypeDoc(domName)
if typ != nil {
- values = typ.values // associate with that type
+ values = typ.values // associate with that type
}
}
- values.Push(decl);
+ values.Push(decl)
}
func (doc *docReader) addFunc(fun *ast.FuncDecl) {
- name := fun.Name.Value;
+ name := fun.Name.Value
// determine if it should be associated with a type
if fun.Recv != nil {
// method
- typ := doc.lookupTypeDoc(baseTypeName(fun.Recv.Type));
+ typ := doc.lookupTypeDoc(baseTypeName(fun.Recv.Type))
if typ != nil {
// exported receiver type
typ.methods[name] = fun
@@ -163,19 +163,19 @@ func (doc *docReader) addFunc(fun *ast.FuncDecl) {
// that can be called because of exported values (consts, vars, or
// function results) of that type. Could determine if that is the
// case and then show those methods in an appropriate section.
- return;
+ return
}
// perhaps a factory function
// determine result type, if any
if len(fun.Type.Results) >= 1 {
- res := fun.Type.Results[0];
+ res := fun.Type.Results[0]
if len(res.Names) <= 1 {
// exactly one (named or anonymous) result associated
// with the first type in result signature (there may
// be more than one result)
- tname := baseTypeName(res.Type);
- typ := doc.lookupTypeDoc(tname);
+ tname := baseTypeName(res.Type)
+ typ := doc.lookupTypeDoc(tname)
if typ != nil {
// named and exported result type
@@ -187,18 +187,18 @@ func (doc *docReader) addFunc(fun *ast.FuncDecl) {
if doc.pkgName == "os" && tname == "Error" &&
name != "NewError" && name != "NewSyscallError" {
// not a factory function for os.Error
- doc.funcs[name] = fun; // treat as ordinary function
- return;
+ doc.funcs[name] = fun // treat as ordinary function
+ return
}
- typ.factories[name] = fun;
- return;
+ typ.factories[name] = fun
+ return
}
}
}
// ordinary function
- doc.funcs[name] = fun;
+ doc.funcs[name] = fun
}
@@ -212,7 +212,7 @@ func (doc *docReader) addDecl(decl ast.Decl) {
doc.addValue(d)
case token.TYPE:
// types are handled individually
- var noPos token.Position;
+ var noPos token.Position
for _, spec := range d.Specs {
// make a (fake) GenDecl node for this TypeSpec
// (we need to do this here - as opposed to just
@@ -237,17 +237,17 @@ func (doc *docReader) addDecl(decl ast.Decl) {
func copyCommentList(list []*ast.Comment) []*ast.Comment {
- copy := make([]*ast.Comment, len(list));
+ copy := make([]*ast.Comment, len(list))
for i, c := range list {
copy[i] = c
}
- return copy;
+ return copy
}
var (
- bug_markers = regexp.MustCompile("^/[/*][ \t]*BUG\\(.*\\):[ \t]*"); // BUG(uid):
- bug_content = regexp.MustCompile("[^ \n\r\t]+"); // at least one non-whitespace char
+ bug_markers = regexp.MustCompile("^/[/*][ \t]*BUG\\(.*\\):[ \t]*") // BUG(uid):
+ bug_content = regexp.MustCompile("[^ \n\r\t]+") // at least one non-whitespace char
)
@@ -262,8 +262,8 @@ func (doc *docReader) addFile(src *ast.File) {
// using ast.MergePackageFiles which handles these
// comments correctly (but currently looses BUG(...)
// comments).
- doc.doc = src.Doc;
- src.Doc = nil; // doc consumed - remove from ast.File node
+ doc.doc = src.Doc
+ src.Doc = nil // doc consumed - remove from ast.File node
}
// add all declarations
@@ -273,41 +273,41 @@ func (doc *docReader) addFile(src *ast.File) {
// collect BUG(...) comments
for c := src.Comments; c != nil; c = c.Next {
- text := c.List[0].Text;
- cstr := string(text);
+ text := c.List[0].Text
+ cstr := string(text)
if m := bug_markers.ExecuteString(cstr); len(m) > 0 {
// found a BUG comment; maybe empty
if bstr := cstr[m[1]:]; bug_content.MatchString(bstr) {
// non-empty BUG comment; collect comment without BUG prefix
- list := copyCommentList(c.List);
- list[0].Text = text[m[1]:];
- doc.bugs.Push(&ast.CommentGroup{list, nil});
+ list := copyCommentList(c.List)
+ list[0].Text = text[m[1]:]
+ doc.bugs.Push(&ast.CommentGroup{list, nil})
}
}
}
- src.Comments = nil; // consumed unassociated comments - remove from ast.File node
+ src.Comments = nil // consumed unassociated comments - remove from ast.File node
}
func NewFileDoc(file *ast.File) *PackageDoc {
- var r docReader;
- r.init(file.Name.Value);
- r.addFile(file);
- return r.newDoc("", "", nil);
+ var r docReader
+ r.init(file.Name.Value)
+ r.addFile(file)
+ return r.newDoc("", "", nil)
}
func NewPackageDoc(pkg *ast.Package, importpath string) *PackageDoc {
- var r docReader;
- r.init(pkg.Name);
- filenames := make([]string, len(pkg.Files));
- i := 0;
+ var r docReader
+ r.init(pkg.Name)
+ filenames := make([]string, len(pkg.Files))
+ i := 0
for filename, f := range pkg.Files {
- r.addFile(f);
- filenames[i] = filename;
- i++;
+ r.addFile(f)
+ filenames[i] = filename
+ i++
}
- return r.newDoc(importpath, pkg.Path, filenames);
+ return r.newDoc(importpath, pkg.Path, filenames)
}
@@ -318,15 +318,15 @@ func NewPackageDoc(pkg *ast.Package, importpath string) *PackageDoc {
// values, either vars or consts.
//
type ValueDoc struct {
- Doc string;
- Decl *ast.GenDecl;
- order int;
+ Doc string
+ Decl *ast.GenDecl
+ order int
}
type sortValueDoc []*ValueDoc
-func (p sortValueDoc) Len() int { return len(p) }
-func (p sortValueDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+func (p sortValueDoc) Len() int { return len(p) }
+func (p sortValueDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func declName(d *ast.GenDecl) string {
@@ -341,7 +341,7 @@ func declName(d *ast.GenDecl) string {
return v.Name.Value
}
- return "";
+ return ""
}
@@ -352,24 +352,24 @@ func (p sortValueDoc) Less(i, j int) bool {
if ni, nj := declName(p[i].Decl), declName(p[j].Decl); ni != nj {
return ni < nj
}
- return p[i].order < p[j].order;
+ return p[i].order < p[j].order
}
func makeValueDocs(v *vector.Vector, tok token.Token) []*ValueDoc {
- d := make([]*ValueDoc, v.Len()); // big enough in any case
- n := 0;
+ d := make([]*ValueDoc, v.Len()) // big enough in any case
+ n := 0
for i := range d {
- decl := v.At(i).(*ast.GenDecl);
+ decl := v.At(i).(*ast.GenDecl)
if decl.Tok == tok {
- d[n] = &ValueDoc{CommentText(decl.Doc), decl, i};
- n++;
- decl.Doc = nil; // doc consumed - removed from AST
+ d[n] = &ValueDoc{CommentText(decl.Doc), decl, i}
+ n++
+ decl.Doc = nil // doc consumed - removed from AST
}
}
- d = d[0:n];
- sort.Sort(sortValueDoc(d));
- return d;
+ d = d[0:n]
+ sort.Sort(sortValueDoc(d))
+ return d
}
@@ -377,36 +377,36 @@ func makeValueDocs(v *vector.Vector, tok token.Token) []*ValueDoc {
// either a top-level function or a method function.
//
type FuncDoc struct {
- Doc string;
- Recv ast.Expr; // TODO(rsc): Would like string here
- Name string;
- Decl *ast.FuncDecl;
+ Doc string
+ Recv ast.Expr // TODO(rsc): Would like string here
+ Name string
+ Decl *ast.FuncDecl
}
type sortFuncDoc []*FuncDoc
-func (p sortFuncDoc) Len() int { return len(p) }
-func (p sortFuncDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
-func (p sortFuncDoc) Less(i, j int) bool { return p[i].Name < p[j].Name }
+func (p sortFuncDoc) Len() int { return len(p) }
+func (p sortFuncDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+func (p sortFuncDoc) Less(i, j int) bool { return p[i].Name < p[j].Name }
func makeFuncDocs(m map[string]*ast.FuncDecl) []*FuncDoc {
- d := make([]*FuncDoc, len(m));
- i := 0;
+ d := make([]*FuncDoc, len(m))
+ i := 0
for _, f := range m {
- doc := new(FuncDoc);
- doc.Doc = CommentText(f.Doc);
- f.Doc = nil; // doc consumed - remove from ast.FuncDecl node
+ doc := new(FuncDoc)
+ doc.Doc = CommentText(f.Doc)
+ f.Doc = nil // doc consumed - remove from ast.FuncDecl node
if f.Recv != nil {
doc.Recv = f.Recv.Type
}
- doc.Name = f.Name.Value;
- doc.Decl = f;
- d[i] = doc;
- i++;
+ doc.Name = f.Name.Value
+ doc.Decl = f
+ d[i] = doc
+ i++
}
- sort.Sort(sortFuncDoc(d));
- return d;
+ sort.Sort(sortFuncDoc(d))
+ return d
}
@@ -415,20 +415,20 @@ func makeFuncDocs(m map[string]*ast.FuncDecl) []*FuncDoc {
// Factories is a sorted list of factory functions that return that type.
// Methods is a sorted list of method functions on that type.
type TypeDoc struct {
- Doc string;
- Type *ast.TypeSpec;
- Consts []*ValueDoc;
- Vars []*ValueDoc;
- Factories []*FuncDoc;
- Methods []*FuncDoc;
- Decl *ast.GenDecl;
- order int;
+ Doc string
+ Type *ast.TypeSpec
+ Consts []*ValueDoc
+ Vars []*ValueDoc
+ Factories []*FuncDoc
+ Methods []*FuncDoc
+ Decl *ast.GenDecl
+ order int
}
type sortTypeDoc []*TypeDoc
-func (p sortTypeDoc) Len() int { return len(p) }
-func (p sortTypeDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+func (p sortTypeDoc) Len() int { return len(p) }
+func (p sortTypeDoc) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (p sortTypeDoc) Less(i, j int) bool {
// sort by name
// pull blocks (name = "") up to top
@@ -436,7 +436,7 @@ func (p sortTypeDoc) Less(i, j int) bool {
if ni, nj := p[i].Type.Name.Value, p[j].Type.Name.Value; ni != nj {
return ni < nj
}
- return p[i].order < p[j].order;
+ return p[i].order < p[j].order
}
@@ -444,32 +444,32 @@ func (p sortTypeDoc) Less(i, j int) bool {
// blocks, but the doc extractor above has split them into
// individual declarations.
func (doc *docReader) makeTypeDocs(m map[string]*typeDoc) []*TypeDoc {
- d := make([]*TypeDoc, len(m));
- i := 0;
+ d := make([]*TypeDoc, len(m))
+ i := 0
for _, old := range m {
// all typeDocs should have a declaration associated with
// them after processing an entire package - be conservative
// and check
if decl := old.decl; decl != nil {
- typespec := decl.Specs[0].(*ast.TypeSpec);
- t := new(TypeDoc);
- doc := typespec.Doc;
- typespec.Doc = nil; // doc consumed - remove from ast.TypeSpec node
+ typespec := decl.Specs[0].(*ast.TypeSpec)
+ t := new(TypeDoc)
+ doc := typespec.Doc
+ typespec.Doc = nil // doc consumed - remove from ast.TypeSpec node
if doc == nil {
// no doc associated with the spec, use the declaration doc, if any
doc = decl.Doc
}
- decl.Doc = nil; // doc consumed - remove from ast.Decl node
- t.Doc = CommentText(doc);
- t.Type = typespec;
- t.Consts = makeValueDocs(old.values, token.CONST);
- t.Vars = makeValueDocs(old.values, token.VAR);
- t.Factories = makeFuncDocs(old.factories);
- t.Methods = makeFuncDocs(old.methods);
- t.Decl = old.decl;
- t.order = i;
- d[i] = t;
- i++;
+ decl.Doc = nil // doc consumed - remove from ast.Decl node
+ t.Doc = CommentText(doc)
+ t.Type = typespec
+ t.Consts = makeValueDocs(old.values, token.CONST)
+ t.Vars = makeValueDocs(old.values, token.VAR)
+ t.Factories = makeFuncDocs(old.factories)
+ t.Methods = makeFuncDocs(old.methods)
+ t.Decl = old.decl
+ t.order = i
+ d[i] = t
+ i++
} else {
// no corresponding type declaration found - move any associated
// values, factory functions, and methods back to the top-level
@@ -477,7 +477,7 @@ func (doc *docReader) makeTypeDocs(m map[string]*typeDoc) []*TypeDoc {
// file containing the explicit type declaration is missing or if
// an unqualified type name was used after a "." import)
// 1) move values
- doc.values.AppendVector(old.values);
+ doc.values.AppendVector(old.values)
// 2) move factory functions
for name, f := range old.factories {
doc.funcs[name] = f
@@ -491,56 +491,56 @@ func (doc *docReader) makeTypeDocs(m map[string]*typeDoc) []*TypeDoc {
}
}
}
- d = d[0:i]; // some types may have been ignored
- sort.Sort(sortTypeDoc(d));
- return d;
+ d = d[0:i] // some types may have been ignored
+ sort.Sort(sortTypeDoc(d))
+ return d
}
func makeBugDocs(v *vector.Vector) []string {
- d := make([]string, v.Len());
+ d := make([]string, v.Len())
for i := 0; i < v.Len(); i++ {
d[i] = CommentText(v.At(i).(*ast.CommentGroup))
}
- return d;
+ return d
}
// PackageDoc is the documentation for an entire package.
//
type PackageDoc struct {
- PackageName string;
- ImportPath string;
- FilePath string;
- Filenames []string;
- Doc string;
- Consts []*ValueDoc;
- Types []*TypeDoc;
- Vars []*ValueDoc;
- Funcs []*FuncDoc;
- Bugs []string;
+ PackageName string
+ ImportPath string
+ FilePath string
+ Filenames []string
+ Doc string
+ Consts []*ValueDoc
+ Types []*TypeDoc
+ Vars []*ValueDoc
+ Funcs []*FuncDoc
+ Bugs []string
}
// newDoc returns the accumulated documentation for the package.
//
func (doc *docReader) newDoc(importpath, filepath string, filenames []string) *PackageDoc {
- p := new(PackageDoc);
- p.PackageName = doc.pkgName;
- p.ImportPath = importpath;
- p.FilePath = filepath;
- sort.SortStrings(filenames);
- p.Filenames = filenames;
- p.Doc = CommentText(doc.doc);
+ p := new(PackageDoc)
+ p.PackageName = doc.pkgName
+ p.ImportPath = importpath
+ p.FilePath = filepath
+ sort.SortStrings(filenames)
+ p.Filenames = filenames
+ p.Doc = CommentText(doc.doc)
// makeTypeDocs may extend the list of doc.values and
// doc.funcs and thus must be called before any other
// function consuming those lists
- p.Types = doc.makeTypeDocs(doc.types);
- p.Consts = makeValueDocs(doc.values, token.CONST);
- p.Vars = makeValueDocs(doc.values, token.VAR);
- p.Funcs = makeFuncDocs(doc.funcs);
- p.Bugs = makeBugDocs(doc.bugs);
- return p;
+ p.Types = doc.makeTypeDocs(doc.types)
+ p.Consts = makeValueDocs(doc.values, token.CONST)
+ p.Vars = makeValueDocs(doc.values, token.VAR)
+ p.Funcs = makeFuncDocs(doc.funcs)
+ p.Bugs = makeBugDocs(doc.bugs)
+ return p
}
@@ -549,7 +549,7 @@ func (doc *docReader) newDoc(importpath, filepath string, filenames []string) *P
// Does s look like a regular expression?
func isRegexp(s string) bool {
- metachars := ".(|)*+?^$[]";
+ metachars := ".(|)*+?^$[]"
for _, c := range s {
for _, m := range metachars {
if c == m {
@@ -557,7 +557,7 @@ func isRegexp(s string) bool {
}
}
}
- return false;
+ return false
}
@@ -572,7 +572,7 @@ func match(s string, names []string) bool {
return true
}
}
- return false;
+ return false
}
@@ -591,54 +591,54 @@ func matchDecl(d *ast.GenDecl, names []string) bool {
}
}
}
- return false;
+ return false
}
func filterValueDocs(a []*ValueDoc, names []string) []*ValueDoc {
- w := 0;
+ w := 0
for _, vd := range a {
if matchDecl(vd.Decl, names) {
- a[w] = vd;
- w++;
+ a[w] = vd
+ w++
}
}
- return a[0:w];
+ return a[0:w]
}
func filterFuncDocs(a []*FuncDoc, names []string) []*FuncDoc {
- w := 0;
+ w := 0
for _, fd := range a {
if match(fd.Name, names) {
- a[w] = fd;
- w++;
+ a[w] = fd
+ w++
}
}
- return a[0:w];
+ return a[0:w]
}
func filterTypeDocs(a []*TypeDoc, names []string) []*TypeDoc {
- w := 0;
+ w := 0
for _, td := range a {
- n := 0; // number of matches
+ n := 0 // number of matches
if matchDecl(td.Decl, names) {
n = 1
} else {
// type name doesn't match, but we may have matching consts, vars, factories or methods
- td.Consts = filterValueDocs(td.Consts, names);
- td.Vars = filterValueDocs(td.Vars, names);
- td.Factories = filterFuncDocs(td.Factories, names);
- td.Methods = filterFuncDocs(td.Methods, names);
- n += len(td.Consts) + len(td.Vars) + len(td.Factories) + len(td.Methods);
+ td.Consts = filterValueDocs(td.Consts, names)
+ td.Vars = filterValueDocs(td.Vars, names)
+ td.Factories = filterFuncDocs(td.Factories, names)
+ td.Methods = filterFuncDocs(td.Methods, names)
+ n += len(td.Consts) + len(td.Vars) + len(td.Factories) + len(td.Methods)
}
if n > 0 {
- a[w] = td;
- w++;
+ a[w] = td
+ w++
}
}
- return a[0:w];
+ return a[0:w]
}
@@ -648,9 +648,9 @@ func filterTypeDocs(a []*TypeDoc, names []string) []*TypeDoc {
// TODO(r): maybe precompile the regexps.
//
func (p *PackageDoc) Filter(names []string) {
- p.Consts = filterValueDocs(p.Consts, names);
- p.Vars = filterValueDocs(p.Vars, names);
- p.Types = filterTypeDocs(p.Types, names);
- p.Funcs = filterFuncDocs(p.Funcs, names);
- p.Doc = ""; // don't show top-level package doc
+ p.Consts = filterValueDocs(p.Consts, names)
+ p.Vars = filterValueDocs(p.Vars, names)
+ p.Types = filterTypeDocs(p.Types, names)
+ p.Funcs = filterFuncDocs(p.Funcs, names)
+ p.Doc = "" // don't show top-level package doc
}
diff --git a/src/pkg/go/parser/interface.go b/src/pkg/go/parser/interface.go
index 7e8f5d25e..b6fe4441e 100644
--- a/src/pkg/go/parser/interface.go
+++ b/src/pkg/go/parser/interface.go
@@ -7,15 +7,15 @@
package parser
import (
- "bytes";
- "fmt";
- "go/ast";
- "go/scanner";
- "io";
- "io/ioutil";
- "os";
- pathutil "path";
- "strings";
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/scanner"
+ "io"
+ "io/ioutil"
+ "os"
+ pathutil "path"
+ "strings"
)
@@ -36,18 +36,18 @@ func readSource(filename string, src interface{}) ([]byte, os.Error) {
return s.Bytes(), nil
}
case io.Reader:
- var buf bytes.Buffer;
- _, err := io.Copy(&buf, s);
+ var buf bytes.Buffer
+ _, err := io.Copy(&buf, s)
if err != nil {
return nil, err
}
- return buf.Bytes(), nil;
+ return buf.Bytes(), nil
default:
return nil, os.ErrorString("invalid source")
}
}
- return ioutil.ReadFile(filename);
+ return ioutil.ReadFile(filename)
}
@@ -57,14 +57,14 @@ func readSource(filename string, src interface{}) ([]byte, os.Error) {
// may be nil or contain a partial AST.
//
func ParseExpr(filename string, src interface{}) (ast.Expr, os.Error) {
- data, err := readSource(filename, src);
+ data, err := readSource(filename, src)
if err != nil {
return nil, err
}
- var p parser;
- p.init(filename, data, 0);
- return p.parseExpr(), p.GetError(scanner.Sorted);
+ var p parser
+ p.init(filename, data, 0)
+ return p.parseExpr(), p.GetError(scanner.Sorted)
}
@@ -74,14 +74,14 @@ func ParseExpr(filename string, src interface{}) (ast.Expr, os.Error) {
// list may be nil or contain partial ASTs.
//
func ParseStmtList(filename string, src interface{}) ([]ast.Stmt, os.Error) {
- data, err := readSource(filename, src);
+ data, err := readSource(filename, src)
if err != nil {
return nil, err
}
- var p parser;
- p.init(filename, data, 0);
- return p.parseStmtList(), p.GetError(scanner.Sorted);
+ var p parser
+ p.init(filename, data, 0)
+ return p.parseStmtList(), p.GetError(scanner.Sorted)
}
@@ -91,14 +91,14 @@ func ParseStmtList(filename string, src interface{}) ([]ast.Stmt, os.Error) {
// list may be nil or contain partial ASTs.
//
func ParseDeclList(filename string, src interface{}) ([]ast.Decl, os.Error) {
- data, err := readSource(filename, src);
+ data, err := readSource(filename, src)
if err != nil {
return nil, err
}
- var p parser;
- p.init(filename, data, 0);
- return p.parseDeclList(), p.GetError(scanner.Sorted);
+ var p parser
+ p.init(filename, data, 0)
+ return p.parseDeclList(), p.GetError(scanner.Sorted)
}
@@ -121,14 +121,14 @@ func ParseDeclList(filename string, src interface{}) ([]ast.Decl, os.Error) {
// are returned via a scanner.ErrorList which is sorted by file position.
//
func ParseFile(filename string, src interface{}, mode uint) (*ast.File, os.Error) {
- data, err := readSource(filename, src);
+ data, err := readSource(filename, src)
if err != nil {
return nil, err
}
- var p parser;
- p.init(filename, data, mode);
- return p.parseFile(), p.GetError(scanner.NoMultiples);
+ var p parser
+ p.init(filename, data, mode)
+ return p.parseFile(), p.GetError(scanner.NoMultiples)
}
@@ -139,13 +139,13 @@ func ParseFile(filename string, src interface{}, mode uint) (*ast.File, os.Error
// flags that control the amount of source text parsed are ignored.
//
func ParsePkgFile(pkgname, filename string, mode uint) (*ast.File, os.Error) {
- src, err := ioutil.ReadFile(filename);
+ src, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
if pkgname != "" {
- prog, err := ParseFile(filename, src, PackageClauseOnly);
+ prog, err := ParseFile(filename, src, PackageClauseOnly)
if err != nil {
return nil, err
}
@@ -155,7 +155,7 @@ func ParsePkgFile(pkgname, filename string, mode uint) (*ast.File, os.Error) {
}
// ignore flags that control partial parsing
- return ParseFile(filename, src, mode&^(PackageClauseOnly|ImportsOnly));
+ return ParseFile(filename, src, mode&^(PackageClauseOnly|ImportsOnly))
}
@@ -167,27 +167,27 @@ func ParsePkgFile(pkgname, filename string, mode uint) (*ast.File, os.Error) {
// Mode flags that control the amount of source text parsed are ignored.
//
func ParsePackage(path string, filter func(*os.Dir) bool, mode uint) (*ast.Package, os.Error) {
- fd, err := os.Open(path, os.O_RDONLY, 0);
+ fd, err := os.Open(path, os.O_RDONLY, 0)
if err != nil {
return nil, err
}
- defer fd.Close();
+ defer fd.Close()
- list, err := fd.Readdir(-1);
+ list, err := fd.Readdir(-1)
if err != nil {
return nil, err
}
- name := "";
- files := make(map[string]*ast.File);
+ name := ""
+ files := make(map[string]*ast.File)
for i := 0; i < len(list); i++ {
- entry := &list[i];
+ entry := &list[i]
if filter == nil || filter(entry) {
- src, err := ParsePkgFile(name, pathutil.Join(path, entry.Name), mode);
+ src, err := ParsePkgFile(name, pathutil.Join(path, entry.Name), mode)
if err != nil {
return nil, err
}
- files[entry.Name] = src;
+ files[entry.Name] = src
if name == "" {
name = src.Name.Value
}
@@ -198,5 +198,5 @@ func ParsePackage(path string, filter func(*os.Dir) bool, mode uint) (*ast.Packa
return nil, os.NewError(path + ": no package found")
}
- return &ast.Package{name, path, files}, nil;
+ return &ast.Package{name, path, files}, nil
}
diff --git a/src/pkg/go/parser/parser.go b/src/pkg/go/parser/parser.go
index fa6fb545e..bd7ca158e 100644
--- a/src/pkg/go/parser/parser.go
+++ b/src/pkg/go/parser/parser.go
@@ -10,11 +10,11 @@
package parser
import (
- "container/vector";
- "fmt";
- "go/ast";
- "go/scanner";
- "go/token";
+ "container/vector"
+ "fmt"
+ "go/ast"
+ "go/scanner"
+ "go/token"
)
@@ -27,59 +27,59 @@ var noPos token.Position
// parser functionality.
//
const (
- PackageClauseOnly uint = 1 << iota; // parsing stops after package clause
- ImportsOnly; // parsing stops after import declarations
- ParseComments; // parse comments and add them to AST
- Trace; // print a trace of parsed productions
+ PackageClauseOnly uint = 1 << iota // parsing stops after package clause
+ ImportsOnly // parsing stops after import declarations
+ ParseComments // parse comments and add them to AST
+ Trace // print a trace of parsed productions
)
// The parser structure holds the parser's internal state.
type parser struct {
- scanner.ErrorVector;
- scanner scanner.Scanner;
+ scanner.ErrorVector
+ scanner scanner.Scanner
// Tracing/debugging
- mode uint; // parsing mode
- trace bool; // == (mode & Trace != 0)
- indent uint; // indentation used for tracing output
+ mode uint // parsing mode
+ trace bool // == (mode & Trace != 0)
+ indent uint // indentation used for tracing output
// Comments
- comments *ast.CommentGroup; // list of collected comments
- lastComment *ast.CommentGroup; // last comment in the comments list
- leadComment *ast.CommentGroup; // the last lead comment
- lineComment *ast.CommentGroup; // the last line comment
+ comments *ast.CommentGroup // list of collected comments
+ lastComment *ast.CommentGroup // last comment in the comments list
+ leadComment *ast.CommentGroup // the last lead comment
+ lineComment *ast.CommentGroup // the last line comment
// Next token
- pos token.Position; // token position
- tok token.Token; // one token look-ahead
- lit []byte; // token literal
+ pos token.Position // token position
+ tok token.Token // one token look-ahead
+ lit []byte // token literal
// Non-syntactic parser control
- exprLev int; // < 0: in control clause, >= 0: in expression
+ exprLev int // < 0: in control clause, >= 0: in expression
// Scopes
- pkgScope *ast.Scope;
- fileScope *ast.Scope;
- topScope *ast.Scope;
+ pkgScope *ast.Scope
+ fileScope *ast.Scope
+ topScope *ast.Scope
}
// scannerMode returns the scanner mode bits given the parser's mode bits.
func scannerMode(mode uint) uint {
- var m uint = scanner.InsertSemis;
+ var m uint = scanner.InsertSemis
if mode&ParseComments != 0 {
m |= scanner.ScanComments
}
- return m;
+ return m
}
func (p *parser) init(filename string, src []byte, mode uint) {
- p.scanner.Init(filename, src, p, scannerMode(mode));
- p.mode = mode;
- p.trace = mode&Trace != 0; // for convenience (p.trace is used frequently)
- p.next();
+ p.scanner.Init(filename, src, p, scannerMode(mode))
+ p.mode = mode
+ p.trace = mode&Trace != 0 // for convenience (p.trace is used frequently)
+ p.next()
}
@@ -88,29 +88,29 @@ func (p *parser) init(filename string, src []byte, mode uint) {
func (p *parser) printTrace(a ...) {
const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " +
- ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ";
- const n = uint(len(dots));
- fmt.Printf("%5d:%3d: ", p.pos.Line, p.pos.Column);
- i := 2 * p.indent;
+ ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "
+ const n = uint(len(dots))
+ fmt.Printf("%5d:%3d: ", p.pos.Line, p.pos.Column)
+ i := 2 * p.indent
for ; i > n; i -= n {
fmt.Print(dots)
}
- fmt.Print(dots[0:i]);
- fmt.Println(a);
+ fmt.Print(dots[0:i])
+ fmt.Println(a)
}
func trace(p *parser, msg string) *parser {
- p.printTrace(msg, "(");
- p.indent++;
- return p;
+ p.printTrace(msg, "(")
+ p.indent++
+ return p
}
// Usage pattern: defer un(trace(p, "..."));
func un(p *parser) {
- p.indent--;
- p.printTrace(")");
+ p.indent--
+ p.printTrace(")")
}
@@ -121,7 +121,7 @@ func (p *parser) next0() {
// very first token (p.pos.Line == 0) is not initialized (it
// is token.ILLEGAL), so don't print it .
if p.trace && p.pos.Line > 0 {
- s := p.tok.String();
+ s := p.tok.String()
switch {
case p.tok.IsLiteral():
p.printTrace(s, string(p.lit))
@@ -132,14 +132,14 @@ func (p *parser) next0() {
}
}
- p.pos, p.tok, p.lit = p.scanner.Scan();
+ p.pos, p.tok, p.lit = p.scanner.Scan()
}
// Consume a comment and return it and the line on which it ends.
func (p *parser) consumeComment() (comment *ast.Comment, endline int) {
// /*-style comments may end on a different line than where they start.
// Scan the comment for '\n' chars and adjust endline accordingly.
- endline = p.pos.Line;
+ endline = p.pos.Line
if p.lit[1] == '*' {
for _, b := range p.lit {
if b == '\n' {
@@ -148,10 +148,10 @@ func (p *parser) consumeComment() (comment *ast.Comment, endline int) {
}
}
- comment = &ast.Comment{p.pos, p.lit};
- p.next0();
+ comment = &ast.Comment{p.pos, p.lit}
+ p.next0()
- return;
+ return
}
@@ -161,30 +161,30 @@ func (p *parser) consumeComment() (comment *ast.Comment, endline int) {
// a comment group.
//
func (p *parser) consumeCommentGroup() int {
- var list vector.Vector;
- endline := p.pos.Line;
+ var list vector.Vector
+ endline := p.pos.Line
for p.tok == token.COMMENT && endline+1 >= p.pos.Line {
- var comment *ast.Comment;
- comment, endline = p.consumeComment();
- list.Push(comment);
+ var comment *ast.Comment
+ comment, endline = p.consumeComment()
+ list.Push(comment)
}
// convert list
- group := make([]*ast.Comment, list.Len());
+ group := make([]*ast.Comment, list.Len())
for i := 0; i < list.Len(); i++ {
group[i] = list.At(i).(*ast.Comment)
}
// add comment group to the comments list
- g := &ast.CommentGroup{group, nil};
+ g := &ast.CommentGroup{group, nil}
if p.lastComment != nil {
p.lastComment.Next = g
} else {
p.comments = g
}
- p.lastComment = g;
+ p.lastComment = g
- return endline;
+ return endline
}
@@ -204,16 +204,16 @@ func (p *parser) consumeCommentGroup() int {
// stored in the AST.
//
func (p *parser) next() {
- p.leadComment = nil;
- p.lineComment = nil;
- line := p.pos.Line; // current line
- p.next0();
+ p.leadComment = nil
+ p.lineComment = nil
+ line := p.pos.Line // current line
+ p.next0()
if p.tok == token.COMMENT {
if p.pos.Line == line {
// The comment is on same line as previous token; it
// cannot be a lead comment but may be a line comment.
- endline := p.consumeCommentGroup();
+ endline := p.consumeCommentGroup()
if p.pos.Line != endline {
// The next token is on a different line, thus
// the last comment group is a line comment.
@@ -222,7 +222,7 @@ func (p *parser) next() {
}
// consume successor comments, if any
- endline := -1;
+ endline := -1
for p.tok == token.COMMENT {
endline = p.consumeCommentGroup()
}
@@ -237,26 +237,26 @@ func (p *parser) next() {
func (p *parser) errorExpected(pos token.Position, msg string) {
- msg = "expected " + msg;
+ msg = "expected " + msg
if pos.Offset == p.pos.Offset {
// the error happened at the current position;
// make the error message more specific
- msg += ", found '" + p.tok.String() + "'";
+ msg += ", found '" + p.tok.String() + "'"
if p.tok.IsLiteral() {
msg += " " + string(p.lit)
}
}
- p.Error(pos, msg);
+ p.Error(pos, msg)
}
func (p *parser) expect(tok token.Token) token.Position {
- pos := p.pos;
+ pos := p.pos
if p.tok != tok {
p.errorExpected(pos, "'"+tok.String()+"'")
}
- p.next(); // make progress in any case
- return pos;
+ p.next() // make progress in any case
+ return pos
}
@@ -271,13 +271,13 @@ func (p *parser) expectSemi() {
// Scope support
func openScope(p *parser) *parser {
- p.topScope = ast.NewScope(p.topScope);
- return p;
+ p.topScope = ast.NewScope(p.topScope)
+ return p
}
// Usage pattern: defer close(openScope(p));
-func close(p *parser) { p.topScope = p.topScope.Outer }
+func close(p *parser) { p.topScope = p.topScope.Outer }
func (p *parser) declare(ident *ast.Ident) {
@@ -299,12 +299,12 @@ func (p *parser) declareList(idents []*ast.Ident) {
func (p *parser) parseIdent() *ast.Ident {
if p.tok == token.IDENT {
- x := &ast.Ident{p.pos, string(p.lit)};
- p.next();
- return x;
+ x := &ast.Ident{p.pos, string(p.lit)}
+ p.next()
+ return x
}
- p.expect(token.IDENT); // use expect() error handling
- return &ast.Ident{p.pos, ""};
+ p.expect(token.IDENT) // use expect() error handling
+ return &ast.Ident{p.pos, ""}
}
@@ -313,29 +313,29 @@ func (p *parser) parseIdentList() []*ast.Ident {
defer un(trace(p, "IdentList"))
}
- var list vector.Vector;
- list.Push(p.parseIdent());
+ var list vector.Vector
+ list.Push(p.parseIdent())
for p.tok == token.COMMA {
- p.next();
- list.Push(p.parseIdent());
+ p.next()
+ list.Push(p.parseIdent())
}
// convert vector
- idents := make([]*ast.Ident, list.Len());
+ idents := make([]*ast.Ident, list.Len())
for i := 0; i < list.Len(); i++ {
idents[i] = list.At(i).(*ast.Ident)
}
- return idents;
+ return idents
}
func makeExprList(list *vector.Vector) []ast.Expr {
- exprs := make([]ast.Expr, list.Len());
+ exprs := make([]ast.Expr, list.Len())
for i := 0; i < list.Len(); i++ {
exprs[i] = list.At(i).(ast.Expr)
}
- return exprs;
+ return exprs
}
@@ -344,14 +344,14 @@ func (p *parser) parseExprList() []ast.Expr {
defer un(trace(p, "ExpressionList"))
}
- var list vector.Vector;
- list.Push(p.parseExpr());
+ var list vector.Vector
+ list.Push(p.parseExpr())
for p.tok == token.COMMA {
- p.next();
- list.Push(p.parseExpr());
+ p.next()
+ list.Push(p.parseExpr())
}
- return makeExprList(&list);
+ return makeExprList(&list)
}
@@ -363,15 +363,15 @@ func (p *parser) parseType() ast.Expr {
defer un(trace(p, "Type"))
}
- typ := p.tryType();
+ typ := p.tryType()
if typ == nil {
- p.errorExpected(p.pos, "type");
- p.next(); // make progress
- return &ast.BadExpr{p.pos};
+ p.errorExpected(p.pos, "type")
+ p.next() // make progress
+ return &ast.BadExpr{p.pos}
}
- return typ;
+ return typ
}
@@ -380,14 +380,14 @@ func (p *parser) parseQualifiedIdent() ast.Expr {
defer un(trace(p, "QualifiedIdent"))
}
- var x ast.Expr = p.parseIdent();
+ var x ast.Expr = p.parseIdent()
if p.tok == token.PERIOD {
// first identifier is a package identifier
- p.next();
- sel := p.parseIdent();
- x = &ast.SelectorExpr{x, sel};
+ p.next()
+ sel := p.parseIdent()
+ x = &ast.SelectorExpr{x, sel}
}
- return x;
+ return x
}
@@ -396,7 +396,7 @@ func (p *parser) parseTypeName() ast.Expr {
defer un(trace(p, "TypeName"))
}
- return p.parseQualifiedIdent();
+ return p.parseQualifiedIdent()
}
@@ -405,33 +405,33 @@ func (p *parser) parseArrayType(ellipsisOk bool) ast.Expr {
defer un(trace(p, "ArrayType"))
}
- lbrack := p.expect(token.LBRACK);
- var len ast.Expr;
+ lbrack := p.expect(token.LBRACK)
+ var len ast.Expr
if ellipsisOk && p.tok == token.ELLIPSIS {
- len = &ast.Ellipsis{p.pos};
- p.next();
+ len = &ast.Ellipsis{p.pos}
+ p.next()
} else if p.tok != token.RBRACK {
len = p.parseExpr()
}
- p.expect(token.RBRACK);
- elt := p.parseType();
+ p.expect(token.RBRACK)
+ elt := p.parseType()
- return &ast.ArrayType{lbrack, len, elt};
+ return &ast.ArrayType{lbrack, len, elt}
}
func (p *parser) makeIdentList(list *vector.Vector) []*ast.Ident {
- idents := make([]*ast.Ident, list.Len());
+ idents := make([]*ast.Ident, list.Len())
for i := 0; i < list.Len(); i++ {
- ident, isIdent := list.At(i).(*ast.Ident);
+ ident, isIdent := list.At(i).(*ast.Ident)
if !isIdent {
- pos := list.At(i).(ast.Expr).Pos();
- p.errorExpected(pos, "identifier");
- idents[i] = &ast.Ident{pos, ""};
+ pos := list.At(i).(ast.Expr).Pos()
+ p.errorExpected(pos, "identifier")
+ idents[i] = &ast.Ident{pos, ""}
}
- idents[i] = ident;
+ idents[i] = ident
}
- return idents;
+ return idents
}
@@ -440,32 +440,32 @@ func (p *parser) parseFieldDecl() *ast.Field {
defer un(trace(p, "FieldDecl"))
}
- doc := p.leadComment;
+ doc := p.leadComment
// a list of identifiers looks like a list of type names
- var list vector.Vector;
+ var list vector.Vector
for {
// TODO(gri): do not allow ()'s here
- list.Push(p.parseType());
+ list.Push(p.parseType())
if p.tok != token.COMMA {
break
}
- p.next();
+ p.next()
}
// if we had a list of identifiers, it must be followed by a type
- typ := p.tryType();
+ typ := p.tryType()
// optional tag
- var tag []*ast.BasicLit;
+ var tag []*ast.BasicLit
if p.tok == token.STRING {
- x := &ast.BasicLit{p.pos, p.tok, p.lit};
- p.next();
- tag = []*ast.BasicLit{x};
+ x := &ast.BasicLit{p.pos, p.tok, p.lit}
+ p.next()
+ tag = []*ast.BasicLit{x}
}
// analyze case
- var idents []*ast.Ident;
+ var idents []*ast.Ident
if typ != nil {
// IdentifierList Type
idents = p.makeIdentList(&list)
@@ -475,14 +475,14 @@ func (p *parser) parseFieldDecl() *ast.Field {
// TODO(gri): check that this looks like a type
typ = list.At(0).(ast.Expr)
} else {
- p.errorExpected(p.pos, "anonymous field");
- typ = &ast.BadExpr{p.pos};
+ p.errorExpected(p.pos, "anonymous field")
+ typ = &ast.BadExpr{p.pos}
}
}
- p.expectSemi();
+ p.expectSemi()
- return &ast.Field{doc, idents, typ, tag, p.lineComment};
+ return &ast.Field{doc, idents, typ, tag, p.lineComment}
}
@@ -491,21 +491,21 @@ func (p *parser) parseStructType() *ast.StructType {
defer un(trace(p, "StructType"))
}
- pos := p.expect(token.STRUCT);
- lbrace := p.expect(token.LBRACE);
- var list vector.Vector;
+ pos := p.expect(token.STRUCT)
+ lbrace := p.expect(token.LBRACE)
+ var list vector.Vector
for p.tok == token.IDENT || p.tok == token.MUL {
list.Push(p.parseFieldDecl())
}
- rbrace := p.expect(token.RBRACE);
+ rbrace := p.expect(token.RBRACE)
// convert vector
- fields := make([]*ast.Field, list.Len());
+ fields := make([]*ast.Field, list.Len())
for i := list.Len() - 1; i >= 0; i-- {
fields[i] = list.At(i).(*ast.Field)
}
- return &ast.StructType{pos, lbrace, fields, rbrace, false};
+ return &ast.StructType{pos, lbrace, fields, rbrace, false}
}
@@ -514,35 +514,35 @@ func (p *parser) parsePointerType() *ast.StarExpr {
defer un(trace(p, "PointerType"))
}
- star := p.expect(token.MUL);
- base := p.parseType();
+ star := p.expect(token.MUL)
+ base := p.parseType()
- return &ast.StarExpr{star, base};
+ return &ast.StarExpr{star, base}
}
func (p *parser) tryParameterType(ellipsisOk bool) ast.Expr {
if ellipsisOk && p.tok == token.ELLIPSIS {
- pos := p.pos;
- p.next();
+ pos := p.pos
+ p.next()
if p.tok != token.RPAREN {
// "..." always must be at the very end of a parameter list
p.Error(pos, "expected type, found '...'")
}
- return &ast.Ellipsis{pos};
+ return &ast.Ellipsis{pos}
}
- return p.tryType();
+ return p.tryType()
}
func (p *parser) parseParameterType(ellipsisOk bool) ast.Expr {
- typ := p.tryParameterType(ellipsisOk);
+ typ := p.tryParameterType(ellipsisOk)
if typ == nil {
- p.errorExpected(p.pos, "type");
- p.next(); // make progress
- typ = &ast.BadExpr{p.pos};
+ p.errorExpected(p.pos, "type")
+ p.next() // make progress
+ typ = &ast.BadExpr{p.pos}
}
- return typ;
+ return typ
}
@@ -552,20 +552,20 @@ func (p *parser) parseParameterDecl(ellipsisOk bool) (*vector.Vector, ast.Expr)
}
// a list of identifiers looks like a list of type names
- var list vector.Vector;
+ var list vector.Vector
for {
// TODO(gri): do not allow ()'s here
- list.Push(p.parseParameterType(ellipsisOk));
+ list.Push(p.parseParameterType(ellipsisOk))
if p.tok != token.COMMA {
break
}
- p.next();
+ p.next()
}
// if we had a list of identifiers, it must be followed by a type
- typ := p.tryParameterType(ellipsisOk);
+ typ := p.tryParameterType(ellipsisOk)
- return &list, typ;
+ return &list, typ
}
@@ -574,24 +574,24 @@ func (p *parser) parseParameterList(ellipsisOk bool) []*ast.Field {
defer un(trace(p, "ParameterList"))
}
- list, typ := p.parseParameterDecl(ellipsisOk);
+ list, typ := p.parseParameterDecl(ellipsisOk)
if typ != nil {
// IdentifierList Type
- idents := p.makeIdentList(list);
- list.Resize(0, 0);
- list.Push(&ast.Field{nil, idents, typ, nil, nil});
+ idents := p.makeIdentList(list)
+ list.Resize(0, 0)
+ list.Push(&ast.Field{nil, idents, typ, nil, nil})
if p.tok == token.COMMA {
p.next()
}
for p.tok != token.RPAREN && p.tok != token.EOF {
- idents := p.parseIdentList();
- typ := p.parseParameterType(ellipsisOk);
- list.Push(&ast.Field{nil, idents, typ, nil, nil});
+ idents := p.parseIdentList()
+ typ := p.parseParameterType(ellipsisOk)
+ list.Push(&ast.Field{nil, idents, typ, nil, nil})
if p.tok != token.COMMA {
break
}
- p.next();
+ p.next()
}
} else {
@@ -603,12 +603,12 @@ func (p *parser) parseParameterList(ellipsisOk bool) []*ast.Field {
}
// convert list
- params := make([]*ast.Field, list.Len());
+ params := make([]*ast.Field, list.Len())
for i := 0; i < list.Len(); i++ {
params[i] = list.At(i).(*ast.Field)
}
- return params;
+ return params
}
@@ -617,14 +617,14 @@ func (p *parser) parseParameters(ellipsisOk bool) []*ast.Field {
defer un(trace(p, "Parameters"))
}
- var params []*ast.Field;
- p.expect(token.LPAREN);
+ var params []*ast.Field
+ p.expect(token.LPAREN)
if p.tok != token.RPAREN {
params = p.parseParameterList(ellipsisOk)
}
- p.expect(token.RPAREN);
+ p.expect(token.RPAREN)
- return params;
+ return params
}
@@ -633,18 +633,18 @@ func (p *parser) parseResult() []*ast.Field {
defer un(trace(p, "Result"))
}
- var results []*ast.Field;
+ var results []*ast.Field
if p.tok == token.LPAREN {
results = p.parseParameters(false)
} else if p.tok != token.FUNC {
- typ := p.tryType();
+ typ := p.tryType()
if typ != nil {
- results = make([]*ast.Field, 1);
- results[0] = &ast.Field{Type: typ};
+ results = make([]*ast.Field, 1)
+ results[0] = &ast.Field{Type: typ}
}
}
- return results;
+ return results
}
@@ -653,10 +653,10 @@ func (p *parser) parseSignature() (params []*ast.Field, results []*ast.Field) {
defer un(trace(p, "Signature"))
}
- params = p.parseParameters(true);
- results = p.parseResult();
+ params = p.parseParameters(true)
+ results = p.parseResult()
- return;
+ return
}
@@ -665,10 +665,10 @@ func (p *parser) parseFuncType() *ast.FuncType {
defer un(trace(p, "FuncType"))
}
- pos := p.expect(token.FUNC);
- params, results := p.parseSignature();
+ pos := p.expect(token.FUNC)
+ params, results := p.parseSignature()
- return &ast.FuncType{pos, params, results};
+ return &ast.FuncType{pos, params, results}
}
@@ -677,22 +677,22 @@ func (p *parser) parseMethodSpec() *ast.Field {
defer un(trace(p, "MethodSpec"))
}
- doc := p.leadComment;
- var idents []*ast.Ident;
- var typ ast.Expr;
- x := p.parseQualifiedIdent();
+ doc := p.leadComment
+ var idents []*ast.Ident
+ var typ ast.Expr
+ x := p.parseQualifiedIdent()
if ident, isIdent := x.(*ast.Ident); isIdent && p.tok == token.LPAREN {
// method
- idents = []*ast.Ident{ident};
- params, results := p.parseSignature();
- typ = &ast.FuncType{noPos, params, results};
+ idents = []*ast.Ident{ident}
+ params, results := p.parseSignature()
+ typ = &ast.FuncType{noPos, params, results}
} else {
// embedded interface
typ = x
}
- p.expectSemi();
+ p.expectSemi()
- return &ast.Field{doc, idents, typ, nil, p.lineComment};
+ return &ast.Field{doc, idents, typ, nil, p.lineComment}
}
@@ -701,21 +701,21 @@ func (p *parser) parseInterfaceType() *ast.InterfaceType {
defer un(trace(p, "InterfaceType"))
}
- pos := p.expect(token.INTERFACE);
- lbrace := p.expect(token.LBRACE);
- var list vector.Vector;
+ pos := p.expect(token.INTERFACE)
+ lbrace := p.expect(token.LBRACE)
+ var list vector.Vector
for p.tok == token.IDENT {
list.Push(p.parseMethodSpec())
}
- rbrace := p.expect(token.RBRACE);
+ rbrace := p.expect(token.RBRACE)
// convert vector
- methods := make([]*ast.Field, list.Len());
+ methods := make([]*ast.Field, list.Len())
for i := list.Len() - 1; i >= 0; i-- {
methods[i] = list.At(i).(*ast.Field)
}
- return &ast.InterfaceType{pos, lbrace, methods, rbrace, false};
+ return &ast.InterfaceType{pos, lbrace, methods, rbrace, false}
}
@@ -724,13 +724,13 @@ func (p *parser) parseMapType() *ast.MapType {
defer un(trace(p, "MapType"))
}
- pos := p.expect(token.MAP);
- p.expect(token.LBRACK);
- key := p.parseType();
- p.expect(token.RBRACK);
- value := p.parseType();
+ pos := p.expect(token.MAP)
+ p.expect(token.LBRACK)
+ key := p.parseType()
+ p.expect(token.RBRACK)
+ value := p.parseType()
- return &ast.MapType{pos, key, value};
+ return &ast.MapType{pos, key, value}
}
@@ -739,22 +739,22 @@ func (p *parser) parseChanType() *ast.ChanType {
defer un(trace(p, "ChanType"))
}
- pos := p.pos;
- dir := ast.SEND | ast.RECV;
+ pos := p.pos
+ dir := ast.SEND | ast.RECV
if p.tok == token.CHAN {
- p.next();
+ p.next()
if p.tok == token.ARROW {
- p.next();
- dir = ast.SEND;
+ p.next()
+ dir = ast.SEND
}
} else {
- p.expect(token.ARROW);
- p.expect(token.CHAN);
- dir = ast.RECV;
+ p.expect(token.ARROW)
+ p.expect(token.CHAN)
+ dir = ast.RECV
}
- value := p.parseType();
+ value := p.parseType()
- return &ast.ChanType{pos, dir, value};
+ return &ast.ChanType{pos, dir, value}
}
@@ -777,30 +777,30 @@ func (p *parser) tryRawType(ellipsisOk bool) ast.Expr {
case token.CHAN, token.ARROW:
return p.parseChanType()
case token.LPAREN:
- lparen := p.pos;
- p.next();
- typ := p.parseType();
- rparen := p.expect(token.RPAREN);
- return &ast.ParenExpr{lparen, typ, rparen};
+ lparen := p.pos
+ p.next()
+ typ := p.parseType()
+ rparen := p.expect(token.RPAREN)
+ return &ast.ParenExpr{lparen, typ, rparen}
}
// no type found
- return nil;
+ return nil
}
-func (p *parser) tryType() ast.Expr { return p.tryRawType(false) }
+func (p *parser) tryType() ast.Expr { return p.tryRawType(false) }
// ----------------------------------------------------------------------------
// Blocks
func makeStmtList(list *vector.Vector) []ast.Stmt {
- stats := make([]ast.Stmt, list.Len());
+ stats := make([]ast.Stmt, list.Len())
for i := 0; i < list.Len(); i++ {
stats[i] = list.At(i).(ast.Stmt)
}
- return stats;
+ return stats
}
@@ -809,12 +809,12 @@ func (p *parser) parseStmtList() []ast.Stmt {
defer un(trace(p, "StatementList"))
}
- var list vector.Vector;
+ var list vector.Vector
for p.tok != token.CASE && p.tok != token.DEFAULT && p.tok != token.RBRACE && p.tok != token.EOF {
list.Push(p.parseStmt())
}
- return makeStmtList(&list);
+ return makeStmtList(&list)
}
@@ -823,13 +823,13 @@ func (p *parser) parseBlockStmt() *ast.BlockStmt {
defer un(trace(p, "BlockStmt"))
}
- defer close(openScope(p));
+ defer close(openScope(p))
- lbrace := p.expect(token.LBRACE);
- list := p.parseStmtList();
- rbrace := p.expect(token.RBRACE);
+ lbrace := p.expect(token.LBRACE)
+ list := p.parseStmtList()
+ rbrace := p.expect(token.RBRACE)
- return &ast.BlockStmt{lbrace, list, rbrace};
+ return &ast.BlockStmt{lbrace, list, rbrace}
}
@@ -841,17 +841,17 @@ func (p *parser) parseFuncTypeOrLit() ast.Expr {
defer un(trace(p, "FuncTypeOrLit"))
}
- typ := p.parseFuncType();
+ typ := p.parseFuncType()
if p.tok != token.LBRACE {
// function type only
return typ
}
- p.exprLev++;
- body := p.parseBlockStmt();
- p.exprLev--;
+ p.exprLev++
+ body := p.parseBlockStmt()
+ p.exprLev--
- return &ast.FuncLit{typ, body};
+ return &ast.FuncLit{typ, body}
}
@@ -868,32 +868,32 @@ func (p *parser) parseOperand() ast.Expr {
return p.parseIdent()
case token.INT, token.FLOAT, token.CHAR, token.STRING:
- x := &ast.BasicLit{p.pos, p.tok, p.lit};
- p.next();
- return x;
+ x := &ast.BasicLit{p.pos, p.tok, p.lit}
+ p.next()
+ return x
case token.LPAREN:
- lparen := p.pos;
- p.next();
- p.exprLev++;
- x := p.parseExpr();
- p.exprLev--;
- rparen := p.expect(token.RPAREN);
- return &ast.ParenExpr{lparen, x, rparen};
+ lparen := p.pos
+ p.next()
+ p.exprLev++
+ x := p.parseExpr()
+ p.exprLev--
+ rparen := p.expect(token.RPAREN)
+ return &ast.ParenExpr{lparen, x, rparen}
case token.FUNC:
return p.parseFuncTypeOrLit()
default:
- t := p.tryRawType(true); // could be type for composite literal or conversion
+ t := p.tryRawType(true) // could be type for composite literal or conversion
if t != nil {
return t
}
}
- p.errorExpected(p.pos, "operand");
- p.next(); // make progress
- return &ast.BadExpr{p.pos};
+ p.errorExpected(p.pos, "operand")
+ p.next() // make progress
+ return &ast.BadExpr{p.pos}
}
@@ -902,25 +902,25 @@ func (p *parser) parseSelectorOrTypeAssertion(x ast.Expr) ast.Expr {
defer un(trace(p, "SelectorOrTypeAssertion"))
}
- p.expect(token.PERIOD);
+ p.expect(token.PERIOD)
if p.tok == token.IDENT {
// selector
- sel := p.parseIdent();
- return &ast.SelectorExpr{x, sel};
+ sel := p.parseIdent()
+ return &ast.SelectorExpr{x, sel}
}
// type assertion
- p.expect(token.LPAREN);
- var typ ast.Expr;
+ p.expect(token.LPAREN)
+ var typ ast.Expr
if p.tok == token.TYPE {
// type switch: typ == nil
p.next()
} else {
typ = p.parseType()
}
- p.expect(token.RPAREN);
+ p.expect(token.RPAREN)
- return &ast.TypeAssertExpr{x, typ};
+ return &ast.TypeAssertExpr{x, typ}
}
@@ -929,23 +929,23 @@ func (p *parser) parseIndexOrSlice(x ast.Expr) ast.Expr {
defer un(trace(p, "IndexOrSlice"))
}
- p.expect(token.LBRACK);
- p.exprLev++;
- index := p.parseExpr();
+ p.expect(token.LBRACK)
+ p.exprLev++
+ index := p.parseExpr()
if p.tok == token.COLON {
- p.next();
- var end ast.Expr;
+ p.next()
+ var end ast.Expr
if p.tok != token.RBRACK {
end = p.parseExpr()
}
- x = &ast.SliceExpr{x, index, end};
+ x = &ast.SliceExpr{x, index, end}
} else {
x = &ast.IndexExpr{x, index}
}
- p.exprLev--;
- p.expect(token.RBRACK);
+ p.exprLev--
+ p.expect(token.RBRACK)
- return x;
+ return x
}
@@ -954,20 +954,20 @@ func (p *parser) parseCallOrConversion(fun ast.Expr) *ast.CallExpr {
defer un(trace(p, "CallOrConversion"))
}
- lparen := p.expect(token.LPAREN);
- p.exprLev++;
- var list vector.Vector;
+ lparen := p.expect(token.LPAREN)
+ p.exprLev++
+ var list vector.Vector
for p.tok != token.RPAREN && p.tok != token.EOF {
- list.Push(p.parseExpr());
+ list.Push(p.parseExpr())
if p.tok != token.COMMA {
break
}
- p.next();
+ p.next()
}
- p.exprLev--;
- rparen := p.expect(token.RPAREN);
+ p.exprLev--
+ rparen := p.expect(token.RPAREN)
- return &ast.CallExpr{fun, lparen, makeExprList(&list), rparen};
+ return &ast.CallExpr{fun, lparen, makeExprList(&list), rparen}
}
@@ -976,14 +976,14 @@ func (p *parser) parseElement() ast.Expr {
defer un(trace(p, "Element"))
}
- x := p.parseExpr();
+ x := p.parseExpr()
if p.tok == token.COLON {
- colon := p.pos;
- p.next();
- x = &ast.KeyValueExpr{x, colon, p.parseExpr()};
+ colon := p.pos
+ p.next()
+ x = &ast.KeyValueExpr{x, colon, p.parseExpr()}
}
- return x;
+ return x
}
@@ -992,16 +992,16 @@ func (p *parser) parseElementList() []ast.Expr {
defer un(trace(p, "ElementList"))
}
- var list vector.Vector;
+ var list vector.Vector
for p.tok != token.RBRACE && p.tok != token.EOF {
- list.Push(p.parseElement());
+ list.Push(p.parseElement())
if p.tok != token.COMMA {
break
}
- p.next();
+ p.next()
}
- return makeExprList(&list);
+ return makeExprList(&list)
}
@@ -1010,13 +1010,13 @@ func (p *parser) parseCompositeLit(typ ast.Expr) ast.Expr {
defer un(trace(p, "CompositeLit"))
}
- lbrace := p.expect(token.LBRACE);
- var elts []ast.Expr;
+ lbrace := p.expect(token.LBRACE)
+ var elts []ast.Expr
if p.tok != token.RBRACE {
elts = p.parseElementList()
}
- rbrace := p.expect(token.RBRACE);
- return &ast.CompositeLit{typ, lbrace, elts, rbrace};
+ rbrace := p.expect(token.RBRACE)
+ return &ast.CompositeLit{typ, lbrace, elts, rbrace}
}
@@ -1042,24 +1042,24 @@ func (p *parser) checkExpr(x ast.Expr) ast.Expr {
case *ast.TypeAssertExpr:
if t.Type == nil {
// the form X.(type) is only allowed in type switch expressions
- p.errorExpected(x.Pos(), "expression");
- x = &ast.BadExpr{x.Pos()};
+ p.errorExpected(x.Pos(), "expression")
+ x = &ast.BadExpr{x.Pos()}
}
case *ast.CallExpr:
case *ast.StarExpr:
case *ast.UnaryExpr:
if t.Op == token.RANGE {
// the range operator is only allowed at the top of a for statement
- p.errorExpected(x.Pos(), "expression");
- x = &ast.BadExpr{x.Pos()};
+ p.errorExpected(x.Pos(), "expression")
+ x = &ast.BadExpr{x.Pos()}
}
case *ast.BinaryExpr:
default:
// all other nodes are not proper expressions
- p.errorExpected(x.Pos(), "expression");
- x = &ast.BadExpr{x.Pos()};
+ p.errorExpected(x.Pos(), "expression")
+ x = &ast.BadExpr{x.Pos()}
}
- return x;
+ return x
}
@@ -1070,13 +1070,13 @@ func isTypeName(x ast.Expr) bool {
case *ast.BadExpr:
case *ast.Ident:
case *ast.ParenExpr:
- return isTypeName(t.X) // TODO(gri): should (TypeName) be illegal?
+ return isTypeName(t.X) // TODO(gri): should (TypeName) be illegal?
case *ast.SelectorExpr:
return isTypeName(t.X)
default:
- return false // all other nodes are not type names
+ return false // all other nodes are not type names
}
- return true;
+ return true
}
@@ -1094,9 +1094,9 @@ func isCompositeLitType(x ast.Expr) bool {
case *ast.StructType:
case *ast.MapType:
default:
- return false // all other nodes are not legal composite literal types
+ return false // all other nodes are not legal composite literal types
}
- return true;
+ return true
}
@@ -1109,18 +1109,18 @@ func (p *parser) checkExprOrType(x ast.Expr) ast.Expr {
case *ast.UnaryExpr:
if t.Op == token.RANGE {
// the range operator is only allowed at the top of a for statement
- p.errorExpected(x.Pos(), "expression");
- x = &ast.BadExpr{x.Pos()};
+ p.errorExpected(x.Pos(), "expression")
+ x = &ast.BadExpr{x.Pos()}
}
case *ast.ArrayType:
if len, isEllipsis := t.Len.(*ast.Ellipsis); isEllipsis {
- p.Error(len.Pos(), "expected array length, found '...'");
- x = &ast.BadExpr{x.Pos()};
+ p.Error(len.Pos(), "expected array length, found '...'")
+ x = &ast.BadExpr{x.Pos()}
}
}
// all other nodes are expressions or types
- return x;
+ return x
}
@@ -1129,8 +1129,8 @@ func (p *parser) parsePrimaryExpr() ast.Expr {
defer un(trace(p, "PrimaryExpr"))
}
- x := p.parseOperand();
-L: for {
+ x := p.parseOperand()
+L: for {
switch p.tok {
case token.PERIOD:
x = p.parseSelectorOrTypeAssertion(p.checkExpr(x))
@@ -1149,7 +1149,7 @@ L: for {
}
}
- return x;
+ return x
}
@@ -1160,20 +1160,20 @@ func (p *parser) parseUnaryExpr() ast.Expr {
switch p.tok {
case token.ADD, token.SUB, token.NOT, token.XOR, token.ARROW, token.AND, token.RANGE:
- pos, op := p.pos, p.tok;
- p.next();
- x := p.parseUnaryExpr();
- return &ast.UnaryExpr{pos, op, p.checkExpr(x)};
+ pos, op := p.pos, p.tok
+ p.next()
+ x := p.parseUnaryExpr()
+ return &ast.UnaryExpr{pos, op, p.checkExpr(x)}
case token.MUL:
// unary "*" expression or pointer type
- pos := p.pos;
- p.next();
- x := p.parseUnaryExpr();
- return &ast.StarExpr{pos, p.checkExprOrType(x)};
+ pos := p.pos
+ p.next()
+ x := p.parseUnaryExpr()
+ return &ast.StarExpr{pos, p.checkExprOrType(x)}
}
- return p.parsePrimaryExpr();
+ return p.parsePrimaryExpr()
}
@@ -1182,17 +1182,17 @@ func (p *parser) parseBinaryExpr(prec1 int) ast.Expr {
defer un(trace(p, "BinaryExpr"))
}
- x := p.parseUnaryExpr();
+ x := p.parseUnaryExpr()
for prec := p.tok.Precedence(); prec >= prec1; prec-- {
for p.tok.Precedence() == prec {
- pos, op := p.pos, p.tok;
- p.next();
- y := p.parseBinaryExpr(prec + 1);
- x = &ast.BinaryExpr{p.checkExpr(x), pos, op, p.checkExpr(y)};
+ pos, op := p.pos, p.tok
+ p.next()
+ y := p.parseBinaryExpr(prec + 1)
+ x = &ast.BinaryExpr{p.checkExpr(x), pos, op, p.checkExpr(y)}
}
}
- return x;
+ return x
}
@@ -1203,7 +1203,7 @@ func (p *parser) parseExpr() ast.Expr {
defer un(trace(p, "Expression"))
}
- return p.parseBinaryExpr(token.LowestPrec + 1);
+ return p.parseBinaryExpr(token.LowestPrec + 1)
}
@@ -1215,19 +1215,19 @@ func (p *parser) parseSimpleStmt(labelOk bool) ast.Stmt {
defer un(trace(p, "SimpleStmt"))
}
- x := p.parseExprList();
+ x := p.parseExprList()
switch p.tok {
case token.COLON:
// labeled statement
- p.next();
+ p.next()
if labelOk && len(x) == 1 {
if label, isIdent := x[0].(*ast.Ident); isIdent {
return &ast.LabeledStmt{label, p.parseStmt()}
}
}
- p.Error(x[0].Pos(), "illegal label declaration");
- return &ast.BadStmt{x[0].Pos()};
+ p.Error(x[0].Pos(), "illegal label declaration")
+ return &ast.BadStmt{x[0].Pos()}
case
token.DEFINE, token.ASSIGN, token.ADD_ASSIGN,
@@ -1235,13 +1235,13 @@ func (p *parser) parseSimpleStmt(labelOk bool) ast.Stmt {
token.REM_ASSIGN, token.AND_ASSIGN, token.OR_ASSIGN,
token.XOR_ASSIGN, token.SHL_ASSIGN, token.SHR_ASSIGN, token.AND_NOT_ASSIGN:
// assignment statement
- pos, tok := p.pos, p.tok;
- p.next();
- y := p.parseExprList();
+ pos, tok := p.pos, p.tok
+ p.next()
+ y := p.parseExprList()
if len(x) > 1 && len(y) > 1 && len(x) != len(y) {
p.Error(x[0].Pos(), "arity of lhs doesn't match rhs")
}
- return &ast.AssignStmt{x, pos, tok, y};
+ return &ast.AssignStmt{x, pos, tok, y}
}
if len(x) > 1 {
@@ -1251,23 +1251,23 @@ func (p *parser) parseSimpleStmt(labelOk bool) ast.Stmt {
if p.tok == token.INC || p.tok == token.DEC {
// increment or decrement
- s := &ast.IncDecStmt{x[0], p.tok};
- p.next(); // consume "++" or "--"
- return s;
+ s := &ast.IncDecStmt{x[0], p.tok}
+ p.next() // consume "++" or "--"
+ return s
}
// expression
- return &ast.ExprStmt{x[0]};
+ return &ast.ExprStmt{x[0]}
}
func (p *parser) parseCallExpr() *ast.CallExpr {
- x := p.parseExpr();
+ x := p.parseExpr()
if call, isCall := x.(*ast.CallExpr); isCall {
return call
}
- p.errorExpected(x.Pos(), "function/method call");
- return nil;
+ p.errorExpected(x.Pos(), "function/method call")
+ return nil
}
@@ -1276,14 +1276,14 @@ func (p *parser) parseGoStmt() ast.Stmt {
defer un(trace(p, "GoStmt"))
}
- pos := p.expect(token.GO);
- call := p.parseCallExpr();
- p.expectSemi();
+ pos := p.expect(token.GO)
+ call := p.parseCallExpr()
+ p.expectSemi()
if call == nil {
return &ast.BadStmt{pos}
}
- return &ast.GoStmt{pos, call};
+ return &ast.GoStmt{pos, call}
}
@@ -1292,14 +1292,14 @@ func (p *parser) parseDeferStmt() ast.Stmt {
defer un(trace(p, "DeferStmt"))
}
- pos := p.expect(token.DEFER);
- call := p.parseCallExpr();
- p.expectSemi();
+ pos := p.expect(token.DEFER)
+ call := p.parseCallExpr()
+ p.expectSemi()
if call == nil {
return &ast.BadStmt{pos}
}
- return &ast.DeferStmt{pos, call};
+ return &ast.DeferStmt{pos, call}
}
@@ -1308,15 +1308,15 @@ func (p *parser) parseReturnStmt() *ast.ReturnStmt {
defer un(trace(p, "ReturnStmt"))
}
- pos := p.pos;
- p.expect(token.RETURN);
- var x []ast.Expr;
+ pos := p.pos
+ p.expect(token.RETURN)
+ var x []ast.Expr
if p.tok != token.SEMICOLON && p.tok != token.RBRACE {
x = p.parseExprList()
}
- p.expectSemi();
+ p.expectSemi()
- return &ast.ReturnStmt{pos, x};
+ return &ast.ReturnStmt{pos, x}
}
@@ -1325,14 +1325,14 @@ func (p *parser) parseBranchStmt(tok token.Token) *ast.BranchStmt {
defer un(trace(p, "BranchStmt"))
}
- s := &ast.BranchStmt{p.pos, tok, nil};
- p.expect(tok);
+ s := &ast.BranchStmt{p.pos, tok, nil}
+ p.expect(tok)
if tok != token.FALLTHROUGH && p.tok == token.IDENT {
s.Label = p.parseIdent()
}
- p.expectSemi();
+ p.expectSemi()
- return s;
+ return s
}
@@ -1343,27 +1343,27 @@ func (p *parser) makeExpr(s ast.Stmt) ast.Expr {
if es, isExpr := s.(*ast.ExprStmt); isExpr {
return p.checkExpr(es.X)
}
- p.Error(s.Pos(), "expected condition, found simple statement");
- return &ast.BadExpr{s.Pos()};
+ p.Error(s.Pos(), "expected condition, found simple statement")
+ return &ast.BadExpr{s.Pos()}
}
func (p *parser) parseControlClause(isForStmt bool) (s1, s2, s3 ast.Stmt) {
if p.tok != token.LBRACE {
- prevLev := p.exprLev;
- p.exprLev = -1;
+ prevLev := p.exprLev
+ p.exprLev = -1
if p.tok != token.SEMICOLON {
s1 = p.parseSimpleStmt(false)
}
if p.tok == token.SEMICOLON {
- p.next();
+ p.next()
if p.tok != token.LBRACE && p.tok != token.SEMICOLON {
s2 = p.parseSimpleStmt(false)
}
if isForStmt {
// for statements have a 3rd section
- p.expectSemi();
+ p.expectSemi()
if p.tok != token.LBRACE {
s3 = p.parseSimpleStmt(false)
}
@@ -1372,10 +1372,10 @@ func (p *parser) parseControlClause(isForStmt bool) (s1, s2, s3 ast.Stmt) {
s1, s2 = nil, s1
}
- p.exprLev = prevLev;
+ p.exprLev = prevLev
}
- return s1, s2, s3;
+ return s1, s2, s3
}
@@ -1385,20 +1385,20 @@ func (p *parser) parseIfStmt() *ast.IfStmt {
}
// IfStmt block
- defer close(openScope(p));
+ defer close(openScope(p))
- pos := p.expect(token.IF);
- s1, s2, _ := p.parseControlClause(false);
- body := p.parseBlockStmt();
- var else_ ast.Stmt;
+ pos := p.expect(token.IF)
+ s1, s2, _ := p.parseControlClause(false)
+ body := p.parseBlockStmt()
+ var else_ ast.Stmt
if p.tok == token.ELSE {
- p.next();
- else_ = p.parseStmt();
+ p.next()
+ else_ = p.parseStmt()
} else {
p.expectSemi()
}
- return &ast.IfStmt{pos, s1, p.makeExpr(s2), body, else_};
+ return &ast.IfStmt{pos, s1, p.makeExpr(s2), body, else_}
}
@@ -1408,22 +1408,22 @@ func (p *parser) parseCaseClause() *ast.CaseClause {
}
// CaseClause block
- defer close(openScope(p));
+ defer close(openScope(p))
// SwitchCase
- pos := p.pos;
- var x []ast.Expr;
+ pos := p.pos
+ var x []ast.Expr
if p.tok == token.CASE {
- p.next();
- x = p.parseExprList();
+ p.next()
+ x = p.parseExprList()
} else {
p.expect(token.DEFAULT)
}
- colon := p.expect(token.COLON);
- body := p.parseStmtList();
+ colon := p.expect(token.COLON)
+ body := p.parseStmtList()
- return &ast.CaseClause{pos, x, colon, body};
+ return &ast.CaseClause{pos, x, colon, body}
}
@@ -1432,14 +1432,14 @@ func (p *parser) parseTypeList() []ast.Expr {
defer un(trace(p, "TypeList"))
}
- var list vector.Vector;
- list.Push(p.parseType());
+ var list vector.Vector
+ list.Push(p.parseType())
for p.tok == token.COMMA {
- p.next();
- list.Push(p.parseType());
+ p.next()
+ list.Push(p.parseType())
}
- return makeExprList(&list);
+ return makeExprList(&list)
}
@@ -1449,22 +1449,22 @@ func (p *parser) parseTypeCaseClause() *ast.TypeCaseClause {
}
// TypeCaseClause block
- defer close(openScope(p));
+ defer close(openScope(p))
// TypeSwitchCase
- pos := p.pos;
- var types []ast.Expr;
+ pos := p.pos
+ var types []ast.Expr
if p.tok == token.CASE {
- p.next();
- types = p.parseTypeList();
+ p.next()
+ types = p.parseTypeList()
} else {
p.expect(token.DEFAULT)
}
- colon := p.expect(token.COLON);
- body := p.parseStmtList();
+ colon := p.expect(token.COLON)
+ body := p.parseStmtList()
- return &ast.TypeCaseClause{pos, types, colon, body};
+ return &ast.TypeCaseClause{pos, types, colon, body}
}
@@ -1474,11 +1474,11 @@ func isExprSwitch(s ast.Stmt) bool {
}
if e, ok := s.(*ast.ExprStmt); ok {
if a, ok := e.X.(*ast.TypeAssertExpr); ok {
- return a.Type != nil // regular type assertion
+ return a.Type != nil // regular type assertion
}
- return true;
+ return true
}
- return false;
+ return false
}
@@ -1488,34 +1488,34 @@ func (p *parser) parseSwitchStmt() ast.Stmt {
}
// SwitchStmt block
- defer close(openScope(p));
+ defer close(openScope(p))
- pos := p.expect(token.SWITCH);
- s1, s2, _ := p.parseControlClause(false);
+ pos := p.expect(token.SWITCH)
+ s1, s2, _ := p.parseControlClause(false)
if isExprSwitch(s2) {
- lbrace := p.expect(token.LBRACE);
- var cases vector.Vector;
+ lbrace := p.expect(token.LBRACE)
+ var cases vector.Vector
for p.tok == token.CASE || p.tok == token.DEFAULT {
cases.Push(p.parseCaseClause())
}
- rbrace := p.expect(token.RBRACE);
- body := &ast.BlockStmt{lbrace, makeStmtList(&cases), rbrace};
- p.expectSemi();
- return &ast.SwitchStmt{pos, s1, p.makeExpr(s2), body};
+ rbrace := p.expect(token.RBRACE)
+ body := &ast.BlockStmt{lbrace, makeStmtList(&cases), rbrace}
+ p.expectSemi()
+ return &ast.SwitchStmt{pos, s1, p.makeExpr(s2), body}
}
// type switch
// TODO(gri): do all the checks!
- lbrace := p.expect(token.LBRACE);
- var cases vector.Vector;
+ lbrace := p.expect(token.LBRACE)
+ var cases vector.Vector
for p.tok == token.CASE || p.tok == token.DEFAULT {
cases.Push(p.parseTypeCaseClause())
}
- rbrace := p.expect(token.RBRACE);
- p.expectSemi();
- body := &ast.BlockStmt{lbrace, makeStmtList(&cases), rbrace};
- return &ast.TypeSwitchStmt{pos, s1, s2, body};
+ rbrace := p.expect(token.RBRACE)
+ p.expectSemi()
+ body := &ast.BlockStmt{lbrace, makeStmtList(&cases), rbrace}
+ return &ast.TypeSwitchStmt{pos, s1, s2, body}
}
@@ -1525,29 +1525,29 @@ func (p *parser) parseCommClause() *ast.CommClause {
}
// CommClause block
- defer close(openScope(p));
+ defer close(openScope(p))
// CommCase
- pos := p.pos;
- var tok token.Token;
- var lhs, rhs ast.Expr;
+ pos := p.pos
+ var tok token.Token
+ var lhs, rhs ast.Expr
if p.tok == token.CASE {
- p.next();
+ p.next()
if p.tok == token.ARROW {
// RecvExpr without assignment
rhs = p.parseExpr()
} else {
// SendExpr or RecvExpr
- rhs = p.parseExpr();
+ rhs = p.parseExpr()
if p.tok == token.ASSIGN || p.tok == token.DEFINE {
// RecvExpr with assignment
- tok = p.tok;
- p.next();
- lhs = rhs;
+ tok = p.tok
+ p.next()
+ lhs = rhs
if p.tok == token.ARROW {
rhs = p.parseExpr()
} else {
- p.expect(token.ARROW) // use expect() error handling
+ p.expect(token.ARROW) // use expect() error handling
}
}
// else SendExpr
@@ -1556,10 +1556,10 @@ func (p *parser) parseCommClause() *ast.CommClause {
p.expect(token.DEFAULT)
}
- colon := p.expect(token.COLON);
- body := p.parseStmtList();
+ colon := p.expect(token.COLON)
+ body := p.parseStmtList()
- return &ast.CommClause{pos, tok, lhs, rhs, colon, body};
+ return &ast.CommClause{pos, tok, lhs, rhs, colon, body}
}
@@ -1568,17 +1568,17 @@ func (p *parser) parseSelectStmt() *ast.SelectStmt {
defer un(trace(p, "SelectStmt"))
}
- pos := p.expect(token.SELECT);
- lbrace := p.expect(token.LBRACE);
- var cases vector.Vector;
+ pos := p.expect(token.SELECT)
+ lbrace := p.expect(token.LBRACE)
+ var cases vector.Vector
for p.tok == token.CASE || p.tok == token.DEFAULT {
cases.Push(p.parseCommClause())
}
- rbrace := p.expect(token.RBRACE);
- p.expectSemi();
- body := &ast.BlockStmt{lbrace, makeStmtList(&cases), rbrace};
+ rbrace := p.expect(token.RBRACE)
+ p.expectSemi()
+ body := &ast.BlockStmt{lbrace, makeStmtList(&cases), rbrace}
- return &ast.SelectStmt{pos, body};
+ return &ast.SelectStmt{pos, body}
}
@@ -1588,50 +1588,50 @@ func (p *parser) parseForStmt() ast.Stmt {
}
// ForStmt block
- defer close(openScope(p));
+ defer close(openScope(p))
- pos := p.expect(token.FOR);
- s1, s2, s3 := p.parseControlClause(true);
- body := p.parseBlockStmt();
- p.expectSemi();
+ pos := p.expect(token.FOR)
+ s1, s2, s3 := p.parseControlClause(true)
+ body := p.parseBlockStmt()
+ p.expectSemi()
if as, isAssign := s2.(*ast.AssignStmt); isAssign {
// possibly a for statement with a range clause; check assignment operator
if as.Tok != token.ASSIGN && as.Tok != token.DEFINE {
- p.errorExpected(as.TokPos, "'=' or ':='");
- return &ast.BadStmt{pos};
+ p.errorExpected(as.TokPos, "'=' or ':='")
+ return &ast.BadStmt{pos}
}
// check lhs
- var key, value ast.Expr;
+ var key, value ast.Expr
switch len(as.Lhs) {
case 2:
- value = as.Lhs[1];
- fallthrough;
+ value = as.Lhs[1]
+ fallthrough
case 1:
key = as.Lhs[0]
default:
- p.errorExpected(as.Lhs[0].Pos(), "1 or 2 expressions");
- return &ast.BadStmt{pos};
+ p.errorExpected(as.Lhs[0].Pos(), "1 or 2 expressions")
+ return &ast.BadStmt{pos}
}
// check rhs
if len(as.Rhs) != 1 {
- p.errorExpected(as.Rhs[0].Pos(), "1 expressions");
- return &ast.BadStmt{pos};
+ p.errorExpected(as.Rhs[0].Pos(), "1 expressions")
+ return &ast.BadStmt{pos}
}
if rhs, isUnary := as.Rhs[0].(*ast.UnaryExpr); isUnary && rhs.Op == token.RANGE {
// rhs is range expression; check lhs
return &ast.RangeStmt{pos, key, value, as.TokPos, as.Tok, rhs.X, body}
} else {
- p.errorExpected(s2.Pos(), "range clause");
- return &ast.BadStmt{pos};
+ p.errorExpected(s2.Pos(), "range clause")
+ return &ast.BadStmt{pos}
}
} else {
// regular for statement
return &ast.ForStmt{pos, s1, p.makeExpr(s2), s3, body}
}
- panic(); // unreachable
- return nil;
+ panic() // unreachable
+ return nil
}
@@ -1645,10 +1645,10 @@ func (p *parser) parseStmt() (s ast.Stmt) {
s = &ast.DeclStmt{p.parseDecl()}
case
// tokens that may start a top-level expression
- token.IDENT, token.INT, token.FLOAT, token.CHAR, token.STRING, token.FUNC, token.LPAREN, // operand
- token.LBRACK, token.STRUCT, // composite type
- token.MUL, token.AND, token.ARROW, token.ADD, token.SUB, token.XOR: // unary operators
- s = p.parseSimpleStmt(true);
+ token.IDENT, token.INT, token.FLOAT, token.CHAR, token.STRING, token.FUNC, token.LPAREN, // operand
+ token.LBRACK, token.STRUCT, // composite type
+ token.MUL, token.AND, token.ARROW, token.ADD, token.SUB, token.XOR: // unary operators
+ s = p.parseSimpleStmt(true)
// because of the required look-ahead, labeled statements are
// parsed by parseSimpleStmt - don't expect a semicolon after
// them
@@ -1664,8 +1664,8 @@ func (p *parser) parseStmt() (s ast.Stmt) {
case token.BREAK, token.CONTINUE, token.GOTO, token.FALLTHROUGH:
s = p.parseBranchStmt(p.tok)
case token.LBRACE:
- s = p.parseBlockStmt();
- p.expectSemi();
+ s = p.parseBlockStmt()
+ p.expectSemi()
case token.IF:
s = p.parseIfStmt()
case token.SWITCH:
@@ -1675,19 +1675,19 @@ func (p *parser) parseStmt() (s ast.Stmt) {
case token.FOR:
s = p.parseForStmt()
case token.SEMICOLON:
- p.next();
- fallthrough;
+ p.next()
+ fallthrough
case token.RBRACE:
// a semicolon may be omitted before a closing "}"
s = &ast.EmptyStmt{p.pos}
default:
// no statement found
- p.errorExpected(p.pos, "statement");
- p.next(); // make progress
- s = &ast.BadStmt{p.pos};
+ p.errorExpected(p.pos, "statement")
+ p.next() // make progress
+ s = &ast.BadStmt{p.pos}
}
- return;
+ return
}
@@ -1702,25 +1702,25 @@ func parseImportSpec(p *parser, doc *ast.CommentGroup) ast.Spec {
defer un(trace(p, "ImportSpec"))
}
- var ident *ast.Ident;
+ var ident *ast.Ident
if p.tok == token.PERIOD {
- ident = &ast.Ident{p.pos, "."};
- p.next();
+ ident = &ast.Ident{p.pos, "."}
+ p.next()
} else if p.tok == token.IDENT {
ident = p.parseIdent()
}
- var path []*ast.BasicLit;
+ var path []*ast.BasicLit
if p.tok == token.STRING {
- x := &ast.BasicLit{p.pos, p.tok, p.lit};
- p.next();
- path = []*ast.BasicLit{x};
+ x := &ast.BasicLit{p.pos, p.tok, p.lit}
+ p.next()
+ path = []*ast.BasicLit{x}
} else {
- p.expect(token.STRING) // use expect() error handling
+ p.expect(token.STRING) // use expect() error handling
}
- p.expectSemi();
+ p.expectSemi()
- return &ast.ImportSpec{doc, ident, path, p.lineComment};
+ return &ast.ImportSpec{doc, ident, path, p.lineComment}
}
@@ -1729,16 +1729,16 @@ func parseConstSpec(p *parser, doc *ast.CommentGroup) ast.Spec {
defer un(trace(p, "ConstSpec"))
}
- idents := p.parseIdentList();
- typ := p.tryType();
- var values []ast.Expr;
+ idents := p.parseIdentList()
+ typ := p.tryType()
+ var values []ast.Expr
if typ != nil || p.tok == token.ASSIGN {
- p.expect(token.ASSIGN);
- values = p.parseExprList();
+ p.expect(token.ASSIGN)
+ values = p.parseExprList()
}
- p.expectSemi();
+ p.expectSemi()
- return &ast.ValueSpec{doc, idents, typ, values, p.lineComment};
+ return &ast.ValueSpec{doc, idents, typ, values, p.lineComment}
}
@@ -1747,11 +1747,11 @@ func parseTypeSpec(p *parser, doc *ast.CommentGroup) ast.Spec {
defer un(trace(p, "TypeSpec"))
}
- ident := p.parseIdent();
- typ := p.parseType();
- p.expectSemi();
+ ident := p.parseIdent()
+ typ := p.parseType()
+ p.expectSemi()
- return &ast.TypeSpec{doc, ident, typ, p.lineComment};
+ return &ast.TypeSpec{doc, ident, typ, p.lineComment}
}
@@ -1760,16 +1760,16 @@ func parseVarSpec(p *parser, doc *ast.CommentGroup) ast.Spec {
defer un(trace(p, "VarSpec"))
}
- idents := p.parseIdentList();
- typ := p.tryType();
- var values []ast.Expr;
+ idents := p.parseIdentList()
+ typ := p.tryType()
+ var values []ast.Expr
if typ == nil || p.tok == token.ASSIGN {
- p.expect(token.ASSIGN);
- values = p.parseExprList();
+ p.expect(token.ASSIGN)
+ values = p.parseExprList()
}
- p.expectSemi();
+ p.expectSemi()
- return &ast.ValueSpec{doc, idents, typ, values, p.lineComment};
+ return &ast.ValueSpec{doc, idents, typ, values, p.lineComment}
}
@@ -1778,29 +1778,29 @@ func (p *parser) parseGenDecl(keyword token.Token, f parseSpecFunction) *ast.Gen
defer un(trace(p, keyword.String()+"Decl"))
}
- doc := p.leadComment;
- pos := p.expect(keyword);
- var lparen, rparen token.Position;
- var list vector.Vector;
+ doc := p.leadComment
+ pos := p.expect(keyword)
+ var lparen, rparen token.Position
+ var list vector.Vector
if p.tok == token.LPAREN {
- lparen = p.pos;
- p.next();
+ lparen = p.pos
+ p.next()
for p.tok != token.RPAREN && p.tok != token.EOF {
list.Push(f(p, p.leadComment))
}
- rparen = p.expect(token.RPAREN);
- p.expectSemi();
+ rparen = p.expect(token.RPAREN)
+ p.expectSemi()
} else {
list.Push(f(p, nil))
}
// convert vector
- specs := make([]ast.Spec, list.Len());
+ specs := make([]ast.Spec, list.Len())
for i := 0; i < list.Len(); i++ {
specs[i] = list.At(i).(ast.Spec)
}
- return &ast.GenDecl{doc, pos, keyword, lparen, specs, rparen};
+ return &ast.GenDecl{doc, pos, keyword, lparen, specs, rparen}
}
@@ -1809,19 +1809,19 @@ func (p *parser) parseReceiver() *ast.Field {
defer un(trace(p, "Receiver"))
}
- pos := p.pos;
- par := p.parseParameters(false);
+ pos := p.pos
+ par := p.parseParameters(false)
// must have exactly one receiver
if len(par) != 1 || len(par) == 1 && len(par[0].Names) > 1 {
- p.errorExpected(pos, "exactly one receiver");
- return &ast.Field{Type: &ast.BadExpr{noPos}};
+ p.errorExpected(pos, "exactly one receiver")
+ return &ast.Field{Type: &ast.BadExpr{noPos}}
}
- recv := par[0];
+ recv := par[0]
// recv type must be TypeName or *TypeName
- base := recv.Type;
+ base := recv.Type
if ptr, isPtr := base.(*ast.StarExpr); isPtr {
base = ptr.X
}
@@ -1829,7 +1829,7 @@ func (p *parser) parseReceiver() *ast.Field {
p.errorExpected(base.Pos(), "type name")
}
- return recv;
+ return recv
}
@@ -1838,24 +1838,24 @@ func (p *parser) parseFunctionDecl() *ast.FuncDecl {
defer un(trace(p, "FunctionDecl"))
}
- doc := p.leadComment;
- pos := p.expect(token.FUNC);
+ doc := p.leadComment
+ pos := p.expect(token.FUNC)
- var recv *ast.Field;
+ var recv *ast.Field
if p.tok == token.LPAREN {
recv = p.parseReceiver()
}
- ident := p.parseIdent();
- params, results := p.parseSignature();
+ ident := p.parseIdent()
+ params, results := p.parseSignature()
- var body *ast.BlockStmt;
+ var body *ast.BlockStmt
if p.tok == token.LBRACE {
body = p.parseBlockStmt()
}
- p.expectSemi();
+ p.expectSemi()
- return &ast.FuncDecl{doc, recv, ident, &ast.FuncType{pos, params, results}, body};
+ return &ast.FuncDecl{doc, recv, ident, &ast.FuncType{pos, params, results}, body}
}
@@ -1864,7 +1864,7 @@ func (p *parser) parseDecl() ast.Decl {
defer un(trace(p, "Declaration"))
}
- var f parseSpecFunction;
+ var f parseSpecFunction
switch p.tok {
case token.CONST:
f = parseConstSpec
@@ -1879,14 +1879,14 @@ func (p *parser) parseDecl() ast.Decl {
return p.parseFunctionDecl()
default:
- pos := p.pos;
- p.errorExpected(pos, "declaration");
- decl := &ast.BadDecl{pos};
- p.next(); // make progress in any case
- return decl;
+ pos := p.pos
+ p.errorExpected(pos, "declaration")
+ decl := &ast.BadDecl{pos}
+ p.next() // make progress in any case
+ return decl
}
- return p.parseGenDecl(p.tok, f);
+ return p.parseGenDecl(p.tok, f)
}
@@ -1895,18 +1895,18 @@ func (p *parser) parseDeclList() []ast.Decl {
defer un(trace(p, "DeclList"))
}
- var list vector.Vector;
+ var list vector.Vector
for p.tok != token.EOF {
list.Push(p.parseDecl())
}
// convert vector
- decls := make([]ast.Decl, list.Len());
+ decls := make([]ast.Decl, list.Len())
for i := 0; i < list.Len(); i++ {
decls[i] = list.At(i).(ast.Decl)
}
- return decls;
+ return decls
}
@@ -1919,22 +1919,22 @@ func (p *parser) parseFile() *ast.File {
}
// file block
- defer close(openScope(p));
+ defer close(openScope(p))
// package clause
- doc := p.leadComment;
- pos := p.expect(token.PACKAGE);
- ident := p.parseIdent();
- p.expectSemi();
+ doc := p.leadComment
+ pos := p.expect(token.PACKAGE)
+ ident := p.parseIdent()
+ p.expectSemi()
- var decls []ast.Decl;
+ var decls []ast.Decl
// Don't bother parsing the rest if we had errors already.
// Likely not a Go source file at all.
if p.ErrorCount() == 0 && p.mode&PackageClauseOnly == 0 {
// import decls
- var list vector.Vector;
+ var list vector.Vector
for p.tok == token.IMPORT {
list.Push(p.parseGenDecl(token.IMPORT, parseImportSpec))
}
@@ -1947,11 +1947,11 @@ func (p *parser) parseFile() *ast.File {
}
// convert declaration list
- decls = make([]ast.Decl, list.Len());
+ decls = make([]ast.Decl, list.Len())
for i := 0; i < list.Len(); i++ {
decls[i] = list.At(i).(ast.Decl)
}
}
- return &ast.File{doc, pos, ident, decls, p.comments};
+ return &ast.File{doc, pos, ident, decls, p.comments}
}
diff --git a/src/pkg/go/parser/parser_test.go b/src/pkg/go/parser/parser_test.go
index ccb8a4511..208a7c513 100644
--- a/src/pkg/go/parser/parser_test.go
+++ b/src/pkg/go/parser/parser_test.go
@@ -5,8 +5,8 @@
package parser
import (
- "os";
- "testing";
+ "os"
+ "testing"
)
@@ -20,7 +20,7 @@ var illegalInputs = []interface{}{
func TestParseIllegalInputs(t *testing.T) {
for _, src := range illegalInputs {
- _, err := ParseFile("", src, 0);
+ _, err := ParseFile("", src, 0)
if err == nil {
t.Errorf("ParseFile(%v) should have failed", src)
}
@@ -37,7 +37,7 @@ var validPrograms = []interface{}{
func TestParseValidPrograms(t *testing.T) {
for _, src := range validPrograms {
- _, err := ParseFile("", src, 0);
+ _, err := ParseFile("", src, 0)
if err != nil {
t.Errorf("ParseFile(%q): %v", src, err)
}
@@ -53,7 +53,7 @@ var validFiles = []string{
func TestParse3(t *testing.T) {
for _, filename := range validFiles {
- _, err := ParseFile(filename, nil, 0);
+ _, err := ParseFile(filename, nil, 0)
if err != nil {
t.Errorf("ParseFile(%s): %v", filename, err)
}
@@ -69,16 +69,16 @@ func nameFilter(filename string) bool {
default:
return false
}
- return true;
+ return true
}
-func dirFilter(d *os.Dir) bool { return nameFilter(d.Name) }
+func dirFilter(d *os.Dir) bool { return nameFilter(d.Name) }
func TestParse4(t *testing.T) {
- path := ".";
- pkg, err := ParsePackage(path, dirFilter, 0);
+ path := "."
+ pkg, err := ParsePackage(path, dirFilter, 0)
if err != nil {
t.Fatalf("ParsePackage(%s): %v", path, err)
}
diff --git a/src/pkg/go/printer/nodes.go b/src/pkg/go/printer/nodes.go
index f324bbc90..b082c2e40 100644
--- a/src/pkg/go/printer/nodes.go
+++ b/src/pkg/go/printer/nodes.go
@@ -9,15 +9,15 @@
package printer
import (
- "bytes";
- "go/ast";
- "go/token";
+ "bytes"
+ "go/ast"
+ "go/token"
)
// Disabled formatting - enable eventually and remove the flag.
const (
- compositeLitBlank = false;
+ compositeLitBlank = false
)
@@ -43,7 +43,7 @@ const (
// TODO(gri): Reconsider signature (provide position instead of line)
//
func (p *printer) linebreak(line, min, max int, ws whiteSpace, newSection bool) (printedBreak bool) {
- n := line - p.pos.Line;
+ n := line - p.pos.Line
switch {
case n < min:
n = min
@@ -52,18 +52,18 @@ func (p *printer) linebreak(line, min, max int, ws whiteSpace, newSection bool)
}
if n > 0 {
- p.print(ws);
+ p.print(ws)
if newSection {
- p.print(formfeed);
- n--;
- printedBreak = true;
+ p.print(formfeed)
+ n--
+ printedBreak = true
}
}
for ; n > 0; n-- {
- p.print(newline);
- printedBreak = true;
+ p.print(newline)
+ printedBreak = true
}
- return;
+ return
}
@@ -74,9 +74,9 @@ func (p *printer) linebreak(line, min, max int, ws whiteSpace, newSection bool)
// Print a list of individual comments.
func (p *printer) commentList(list []*ast.Comment) {
for i, c := range list {
- t := c.Text;
+ t := c.Text
// TODO(gri): this needs to be styled like normal comments
- p.print(c.Pos(), t);
+ p.print(c.Pos(), t)
if t[1] == '/' && i+1 < len(list) {
//-style comment which is not at the end; print a newline
p.print(newline)
@@ -89,8 +89,8 @@ func (p *printer) commentList(list []*ast.Comment) {
func (p *printer) leadComment(d *ast.CommentGroup) {
// Ignore the comment if we have comments interspersed (p.comment != nil).
if p.comment == nil && d != nil {
- p.commentList(d.List);
- p.print(newline);
+ p.commentList(d.List)
+ p.print(newline)
}
}
@@ -101,8 +101,8 @@ func (p *printer) leadComment(d *ast.CommentGroup) {
func (p *printer) lineComment(d *ast.CommentGroup) {
// Ignore the comment if we have comments interspersed (p.comment != nil).
if p.comment == nil && d != nil {
- p.print(vtab);
- p.commentList(d.List);
+ p.print(vtab)
+ p.commentList(d.List)
}
}
@@ -110,34 +110,34 @@ func (p *printer) lineComment(d *ast.CommentGroup) {
// Sets multiLine to true if the identifier list spans multiple lines.
func (p *printer) identList(list []*ast.Ident, multiLine *bool) {
// convert into an expression list so we can re-use exprList formatting
- xlist := make([]ast.Expr, len(list));
+ xlist := make([]ast.Expr, len(list))
for i, x := range list {
xlist[i] = x
}
- p.exprList(noPos, xlist, 1, commaSep, multiLine);
+ p.exprList(noPos, xlist, 1, commaSep, multiLine)
}
// Sets multiLine to true if the string list spans multiple lines.
func (p *printer) stringList(list []*ast.BasicLit, multiLine *bool) {
// convert into an expression list so we can re-use exprList formatting
- xlist := make([]ast.Expr, len(list));
+ xlist := make([]ast.Expr, len(list))
for i, x := range list {
xlist[i] = x
}
- p.exprList(noPos, xlist, 1, plusSep, multiLine);
+ p.exprList(noPos, xlist, 1, plusSep, multiLine)
}
type exprListMode uint
const (
- blankStart exprListMode = 1 << iota; // print a blank before a non-empty list
- blankEnd; // print a blank after a non-empty list
- plusSep; // elements are separared by + operators
- commaSep; // elements are separated by commas
- commaTerm; // elements are terminated by comma
- noIndent; // no extra indentation in multi-line lists
+ blankStart exprListMode = 1 << iota // print a blank before a non-empty list
+ blankEnd // print a blank after a non-empty list
+ plusSep // elements are separared by + operators
+ commaSep // elements are separated by commas
+ commaTerm // elements are terminated by comma
+ noIndent // no extra indentation in multi-line lists
)
@@ -153,12 +153,12 @@ const (
// some reasonable grace period (12/11/09).
func (p *printer) beforeComment(pos token.Position) token.Position {
if p.comment != nil {
- p := p.comment.List[0].Position;
+ p := p.comment.List[0].Position
if !pos.IsValid() || pos.Offset > p.Offset {
return p
}
}
- return pos;
+ return pos
}
@@ -178,8 +178,8 @@ func (p *printer) exprList(prev token.Position, list []ast.Expr, depth int, mode
// TODO(gri): endLine may be incorrect as it is really the beginning
// of the last list entry. There may be only one, very long
// entry in which case line == endLine.
- line := list[0].Pos().Line;
- endLine := list[len(list)-1].Pos().Line;
+ line := list[0].Pos().Line
+ endLine := list[len(list)-1].Pos().Line
if prev.IsValid() && prev.Line == line && line == endLine {
// all list entries on a single line
@@ -191,14 +191,14 @@ func (p *printer) exprList(prev token.Position, list []ast.Expr, depth int, mode
if mode&commaSep != 0 {
p.print(token.COMMA)
}
- p.print(blank);
+ p.print(blank)
}
- p.expr0(x, depth, multiLine);
+ p.expr0(x, depth, multiLine)
}
if mode&blankEnd != 0 {
p.print(blank)
}
- return;
+ return
}
// list entries span multiple lines;
@@ -206,19 +206,19 @@ func (p *printer) exprList(prev token.Position, list []ast.Expr, depth int, mode
// don't add extra indentation if noIndent is set;
// i.e., pretend that the first line is already indented
- ws := ignore;
+ ws := ignore
if mode&noIndent == 0 {
ws = indent
}
if prev.IsValid() && prev.Line < line && p.linebreak(line, 1, 2, ws, true) {
- ws = ignore;
- *multiLine = true;
+ ws = ignore
+ *multiLine = true
}
for i, x := range list {
- prev := line;
- line = x.Pos().Line;
+ prev := line
+ line = x.Pos().Line
if i > 0 {
if mode&plusSep != 0 {
p.print(blank, p.beforeComment(noPos), token.ADD)
@@ -228,24 +228,24 @@ func (p *printer) exprList(prev token.Position, list []ast.Expr, depth int, mode
}
if prev < line && prev > 0 && line > 0 {
if p.linebreak(line, 1, 2, ws, true) {
- ws = ignore;
- *multiLine = true;
+ ws = ignore
+ *multiLine = true
}
} else {
p.print(blank)
}
}
- p.expr0(x, depth, multiLine);
+ p.expr0(x, depth, multiLine)
}
if mode&commaTerm != 0 {
- p.print(token.COMMA);
+ p.print(token.COMMA)
if ws == ignore && mode&noIndent == 0 {
// unindent if we indented
p.print(unindent)
}
- p.print(formfeed); // terminating comma needs a line break to look good
- return;
+ p.print(formfeed) // terminating comma needs a line break to look good
+ return
}
if mode&blankEnd != 0 {
@@ -261,79 +261,79 @@ func (p *printer) exprList(prev token.Position, list []ast.Expr, depth int, mode
// Sets multiLine to true if the the parameter list spans multiple lines.
func (p *printer) parameters(list []*ast.Field, multiLine *bool) {
- p.print(token.LPAREN);
+ p.print(token.LPAREN)
if len(list) > 0 {
for i, par := range list {
if i > 0 {
p.print(token.COMMA, blank)
}
if len(par.Names) > 0 {
- p.identList(par.Names, multiLine);
- p.print(blank);
+ p.identList(par.Names, multiLine)
+ p.print(blank)
}
- p.expr(par.Type, multiLine);
+ p.expr(par.Type, multiLine)
}
}
- p.print(token.RPAREN);
+ p.print(token.RPAREN)
}
// Returns true if a separating semicolon is optional.
// Sets multiLine to true if the signature spans multiple lines.
func (p *printer) signature(params, result []*ast.Field, multiLine *bool) (optSemi bool) {
- p.parameters(params, multiLine);
+ p.parameters(params, multiLine)
if result != nil {
- p.print(blank);
+ p.print(blank)
if len(result) == 1 && result[0].Names == nil {
// single anonymous result; no ()'s unless it's a function type
- f := result[0];
+ f := result[0]
if _, isFtyp := f.Type.(*ast.FuncType); !isFtyp {
- optSemi = p.expr(f.Type, multiLine);
- return;
+ optSemi = p.expr(f.Type, multiLine)
+ return
}
}
- p.parameters(result, multiLine);
+ p.parameters(result, multiLine)
}
- return;
+ return
}
func identListSize(list []*ast.Ident, maxSize int) (size int) {
for i, x := range list {
if i > 0 {
- size += 2 // ", "
+ size += 2 // ", "
}
- size += len(x.Value);
+ size += len(x.Value)
if size >= maxSize {
break
}
}
- return;
+ return
}
func (p *printer) isOneLineFieldList(list []*ast.Field) bool {
if len(list) != 1 {
- return false // allow only one field
+ return false // allow only one field
}
- f := list[0];
+ f := list[0]
if f.Tag != nil || f.Comment != nil {
- return false // don't allow tags or comments
+ return false // don't allow tags or comments
}
// only name(s) and type
- const maxSize = 30; // adjust as appropriate, this is an approximate value
- namesSize := identListSize(f.Names, maxSize);
+ const maxSize = 30 // adjust as appropriate, this is an approximate value
+ namesSize := identListSize(f.Names, maxSize)
if namesSize > 0 {
- namesSize = 1 // blank between names and types
+ namesSize = 1 // blank between names and types
}
- typeSize := p.nodeSize(f.Type, maxSize);
- return namesSize+typeSize <= maxSize;
+ typeSize := p.nodeSize(f.Type, maxSize)
+ return namesSize+typeSize <= maxSize
}
@@ -342,63 +342,63 @@ func (p *printer) fieldList(lbrace token.Position, list []*ast.Field, rbrace tok
// possibly a one-line struct/interface
if len(list) == 0 {
// no blank between keyword and {} in this case
- p.print(lbrace, token.LBRACE, rbrace, token.RBRACE);
- return;
+ p.print(lbrace, token.LBRACE, rbrace, token.RBRACE)
+ return
} else if ctxt&(compositeLit|structType) == compositeLit|structType &&
- p.isOneLineFieldList(list) { // for now ignore interfaces
+ p.isOneLineFieldList(list) { // for now ignore interfaces
// small enough - print on one line
// (don't use identList and ignore source line breaks)
- p.print(lbrace, token.LBRACE, blank);
- f := list[0];
+ p.print(lbrace, token.LBRACE, blank)
+ f := list[0]
for i, x := range f.Names {
if i > 0 {
p.print(token.COMMA, blank)
}
- p.expr(x, ignoreMultiLine);
+ p.expr(x, ignoreMultiLine)
}
if len(f.Names) > 0 {
p.print(blank)
}
- p.expr(f.Type, ignoreMultiLine);
- p.print(blank, rbrace, token.RBRACE);
- return;
+ p.expr(f.Type, ignoreMultiLine)
+ p.print(blank, rbrace, token.RBRACE)
+ return
}
}
// at least one entry or incomplete
- p.print(blank, lbrace, token.LBRACE, indent, formfeed);
+ p.print(blank, lbrace, token.LBRACE, indent, formfeed)
if ctxt&structType != 0 {
- sep := vtab;
+ sep := vtab
if len(list) == 1 {
sep = blank
}
- var ml bool;
+ var ml bool
for i, f := range list {
if i > 0 {
p.linebreak(f.Pos().Line, 1, 2, ignore, ml)
}
- ml = false;
- extraTabs := 0;
- p.leadComment(f.Doc);
+ ml = false
+ extraTabs := 0
+ p.leadComment(f.Doc)
if len(f.Names) > 0 {
// named fields
- p.identList(f.Names, &ml);
- p.print(sep);
- p.expr(f.Type, &ml);
- extraTabs = 1;
+ p.identList(f.Names, &ml)
+ p.print(sep)
+ p.expr(f.Type, &ml)
+ extraTabs = 1
} else {
// anonymous field
- p.expr(f.Type, &ml);
- extraTabs = 2;
+ p.expr(f.Type, &ml)
+ extraTabs = 2
}
if f.Tag != nil {
if len(f.Names) > 0 && sep == vtab {
p.print(sep)
}
- p.print(sep);
- p.expr(&ast.StringList{f.Tag}, &ml);
- extraTabs = 0;
+ p.print(sep)
+ p.expr(&ast.StringList{f.Tag}, &ml)
+ extraTabs = 0
}
if p.Mode&NoSemis == 0 {
p.print(token.SEMICOLON)
@@ -407,7 +407,7 @@ func (p *printer) fieldList(lbrace token.Position, list []*ast.Field, rbrace tok
for ; extraTabs > 0; extraTabs-- {
p.print(vtab)
}
- p.lineComment(f.Comment);
+ p.lineComment(f.Comment)
}
}
if isIncomplete {
@@ -415,22 +415,22 @@ func (p *printer) fieldList(lbrace token.Position, list []*ast.Field, rbrace tok
p.print(formfeed)
}
// TODO(gri): this needs to be styled like normal comments
- p.print("// contains unexported fields");
+ p.print("// contains unexported fields")
}
- } else { // interface
+ } else { // interface
- var ml bool;
+ var ml bool
for i, f := range list {
if i > 0 {
p.linebreak(f.Pos().Line, 1, 2, ignore, ml)
}
- ml = false;
- p.leadComment(f.Doc);
+ ml = false
+ p.leadComment(f.Doc)
if ftyp, isFtyp := f.Type.(*ast.FuncType); isFtyp {
// method
- p.expr(f.Names[0], &ml);
- p.signature(ftyp.Params, ftyp.Results, &ml);
+ p.expr(f.Names[0], &ml)
+ p.signature(ftyp.Params, ftyp.Results, &ml)
} else {
// embedded interface
p.expr(f.Type, &ml)
@@ -438,18 +438,18 @@ func (p *printer) fieldList(lbrace token.Position, list []*ast.Field, rbrace tok
if p.Mode&NoSemis == 0 {
p.print(token.SEMICOLON)
}
- p.lineComment(f.Comment);
+ p.lineComment(f.Comment)
}
if isIncomplete {
if len(list) > 0 {
p.print(formfeed)
}
// TODO(gri): this needs to be styled like normal comments
- p.print("// contains unexported methods");
+ p.print("// contains unexported methods")
}
}
- p.print(unindent, formfeed, rbrace, token.RBRACE);
+ p.print(unindent, formfeed, rbrace, token.RBRACE)
}
@@ -460,8 +460,8 @@ func (p *printer) fieldList(lbrace token.Position, list []*ast.Field, rbrace tok
type exprContext uint
const (
- compositeLit = 1 << iota;
- structType;
+ compositeLit = 1 << iota
+ structType
)
@@ -480,9 +480,9 @@ func walkBinary(e *ast.BinaryExpr) (has5, has6 bool, maxProblem int) {
// pretend this is an *ast.ParenExpr and do nothing.
break
}
- h5, h6, mp := walkBinary(l);
- has5 = has5 || h5;
- has6 = has6 || h6;
+ h5, h6, mp := walkBinary(l)
+ has5 = has5 || h5
+ has6 = has6 || h6
if maxProblem < mp {
maxProblem = mp
}
@@ -495,9 +495,9 @@ func walkBinary(e *ast.BinaryExpr) (has5, has6 bool, maxProblem int) {
// pretend this is an *ast.ParenExpr and do nothing.
break
}
- h5, h6, mp := walkBinary(r);
- has5 = has5 || h5;
- has6 = has6 || h6;
+ h5, h6, mp := walkBinary(r)
+ has5 = has5 || h5
+ has6 = has6 || h6
if maxProblem < mp {
maxProblem = mp
}
@@ -517,12 +517,12 @@ func walkBinary(e *ast.BinaryExpr) (has5, has6 bool, maxProblem int) {
}
}
}
- return;
+ return
}
func cutoff(e *ast.BinaryExpr, depth int) int {
- has5, has6, maxProblem := walkBinary(e);
+ has5, has6, maxProblem := walkBinary(e)
if maxProblem > 0 {
return maxProblem + 1
}
@@ -530,21 +530,21 @@ func cutoff(e *ast.BinaryExpr, depth int) int {
if depth == 1 {
return 6
}
- return 5;
+ return 5
}
if depth == 1 {
return 7
}
- return 5;
+ return 5
}
func diffPrec(expr ast.Expr, prec int) int {
- x, ok := expr.(*ast.BinaryExpr);
+ x, ok := expr.(*ast.BinaryExpr)
if !ok || prec != x.Op.Precedence() {
return 1
}
- return 0;
+ return 0
}
@@ -584,40 +584,40 @@ func diffPrec(expr ast.Expr, prec int) int {
//
// Sets multiLine to true if the binary expression spans multiple lines.
func (p *printer) binaryExpr(x *ast.BinaryExpr, prec1, cutoff, depth int, multiLine *bool) {
- prec := x.Op.Precedence();
+ prec := x.Op.Precedence()
if prec < prec1 {
// parenthesis needed
// Note: The parser inserts an ast.ParenExpr node; thus this case
// can only occur if the AST is created in a different way.
- p.print(token.LPAREN);
- p.expr0(x, depth-1, multiLine); // parentheses undo one level of depth
- p.print(token.RPAREN);
- return;
+ p.print(token.LPAREN)
+ p.expr0(x, depth-1, multiLine) // parentheses undo one level of depth
+ p.print(token.RPAREN)
+ return
}
- printBlank := prec < cutoff;
+ printBlank := prec < cutoff
- ws := indent;
- p.expr1(x.X, prec, depth+diffPrec(x.X, prec), 0, multiLine);
+ ws := indent
+ p.expr1(x.X, prec, depth+diffPrec(x.X, prec), 0, multiLine)
if printBlank {
p.print(blank)
}
- xline := p.pos.Line; // before the operator (it may be on the next line!)
- yline := x.Y.Pos().Line;
- p.print(p.beforeComment(x.OpPos), x.Op);
+ xline := p.pos.Line // before the operator (it may be on the next line!)
+ yline := x.Y.Pos().Line
+ p.print(p.beforeComment(x.OpPos), x.Op)
if xline != yline && xline > 0 && yline > 0 {
// at least one line break, but respect an extra empty line
// in the source
if p.linebreak(yline, 1, 2, ws, true) {
- ws = ignore;
- *multiLine = true;
- printBlank = false; // no blank after line break
+ ws = ignore
+ *multiLine = true
+ printBlank = false // no blank after line break
}
}
if printBlank {
p.print(blank)
}
- p.expr1(x.Y, prec+1, depth+1, 0, multiLine);
+ p.expr1(x.Y, prec+1, depth+1, 0, multiLine)
if ws == ignore {
p.print(unindent)
}
@@ -625,15 +625,15 @@ func (p *printer) binaryExpr(x *ast.BinaryExpr, prec1, cutoff, depth int, multiL
func isBinary(expr ast.Expr) bool {
- _, ok := expr.(*ast.BinaryExpr);
- return ok;
+ _, ok := expr.(*ast.BinaryExpr)
+ return ok
}
// Returns true if a separating semicolon is optional.
// Sets multiLine to true if the expression spans multiple lines.
func (p *printer) expr1(expr ast.Expr, prec1, depth int, ctxt exprContext, multiLine *bool) (optSemi bool) {
- p.print(expr.Pos());
+ p.print(expr.Pos())
switch x := expr.(type) {
case *ast.BadExpr:
@@ -644,44 +644,44 @@ func (p *printer) expr1(expr ast.Expr, prec1, depth int, ctxt exprContext, multi
case *ast.BinaryExpr:
if depth < 1 {
- p.internalError("depth < 1:", depth);
- depth = 1;
+ p.internalError("depth < 1:", depth)
+ depth = 1
}
- p.binaryExpr(x, prec1, cutoff(x, depth), depth, multiLine);
+ p.binaryExpr(x, prec1, cutoff(x, depth), depth, multiLine)
case *ast.KeyValueExpr:
- p.expr(x.Key, multiLine);
- p.print(x.Colon, token.COLON, blank);
- p.expr(x.Value, multiLine);
+ p.expr(x.Key, multiLine)
+ p.print(x.Colon, token.COLON, blank)
+ p.expr(x.Value, multiLine)
case *ast.StarExpr:
- const prec = token.UnaryPrec;
+ const prec = token.UnaryPrec
if prec < prec1 {
// parenthesis needed
- p.print(token.LPAREN);
- p.print(token.MUL);
- optSemi = p.expr(x.X, multiLine);
- p.print(token.RPAREN);
+ p.print(token.LPAREN)
+ p.print(token.MUL)
+ optSemi = p.expr(x.X, multiLine)
+ p.print(token.RPAREN)
} else {
// no parenthesis needed
- p.print(token.MUL);
- optSemi = p.expr(x.X, multiLine);
+ p.print(token.MUL)
+ optSemi = p.expr(x.X, multiLine)
}
case *ast.UnaryExpr:
- const prec = token.UnaryPrec;
+ const prec = token.UnaryPrec
if prec < prec1 {
// parenthesis needed
- p.print(token.LPAREN);
- p.expr(x, multiLine);
- p.print(token.RPAREN);
+ p.print(token.LPAREN)
+ p.expr(x, multiLine)
+ p.print(token.RPAREN)
} else {
// no parenthesis needed
- p.print(x.Op);
+ p.print(x.Op)
if x.Op == token.RANGE {
p.print(blank)
}
- p.expr1(x.X, prec, depth, 0, multiLine);
+ p.expr1(x.X, prec, depth, 0, multiLine)
}
case *ast.BasicLit:
@@ -691,41 +691,41 @@ func (p *printer) expr1(expr ast.Expr, prec1, depth int, ctxt exprContext, multi
p.stringList(x.Strings, multiLine)
case *ast.FuncLit:
- p.expr(x.Type, multiLine);
- p.funcBody(x.Body, distance(x.Type.Pos(), p.pos), true, multiLine);
+ p.expr(x.Type, multiLine)
+ p.funcBody(x.Body, distance(x.Type.Pos(), p.pos), true, multiLine)
case *ast.ParenExpr:
- p.print(token.LPAREN);
- p.expr0(x.X, depth-1, multiLine); // parentheses undo one level of depth
- p.print(x.Rparen, token.RPAREN);
+ p.print(token.LPAREN)
+ p.expr0(x.X, depth-1, multiLine) // parentheses undo one level of depth
+ p.print(x.Rparen, token.RPAREN)
case *ast.SelectorExpr:
- p.expr1(x.X, token.HighestPrec, depth, 0, multiLine);
- p.print(token.PERIOD);
- p.expr1(x.Sel, token.HighestPrec, depth, 0, multiLine);
+ p.expr1(x.X, token.HighestPrec, depth, 0, multiLine)
+ p.print(token.PERIOD)
+ p.expr1(x.Sel, token.HighestPrec, depth, 0, multiLine)
case *ast.TypeAssertExpr:
- p.expr1(x.X, token.HighestPrec, depth, 0, multiLine);
- p.print(token.PERIOD, token.LPAREN);
+ p.expr1(x.X, token.HighestPrec, depth, 0, multiLine)
+ p.print(token.PERIOD, token.LPAREN)
if x.Type != nil {
p.expr(x.Type, multiLine)
} else {
p.print(token.TYPE)
}
- p.print(token.RPAREN);
+ p.print(token.RPAREN)
case *ast.IndexExpr:
// TODO(gri): should treat[] like parentheses and undo one level of depth
- p.expr1(x.X, token.HighestPrec, 1, 0, multiLine);
- p.print(token.LBRACK);
- p.expr0(x.Index, depth+1, multiLine);
- p.print(token.RBRACK);
+ p.expr1(x.X, token.HighestPrec, 1, 0, multiLine)
+ p.print(token.LBRACK)
+ p.expr0(x.Index, depth+1, multiLine)
+ p.print(token.RBRACK)
case *ast.SliceExpr:
// TODO(gri): should treat[] like parentheses and undo one level of depth
- p.expr1(x.X, token.HighestPrec, 1, 0, multiLine);
- p.print(token.LBRACK);
- p.expr0(x.Index, depth+1, multiLine);
+ p.expr1(x.X, token.HighestPrec, 1, 0, multiLine)
+ p.print(token.LBRACK)
+ p.expr0(x.Index, depth+1, multiLine)
// blanks around ":" if both sides exist and either side is a binary expression
if depth <= 1 && x.End != nil && (isBinary(x.Index) || isBinary(x.End)) {
p.print(blank, token.COLON, blank)
@@ -735,24 +735,24 @@ func (p *printer) expr1(expr ast.Expr, prec1, depth int, ctxt exprContext, multi
if x.End != nil {
p.expr0(x.End, depth+1, multiLine)
}
- p.print(token.RBRACK);
+ p.print(token.RBRACK)
case *ast.CallExpr:
if len(x.Args) > 1 {
depth++
}
- p.expr1(x.Fun, token.HighestPrec, depth, 0, multiLine);
- p.print(x.Lparen, token.LPAREN);
- p.exprList(x.Lparen, x.Args, depth, commaSep, multiLine);
- p.print(x.Rparen, token.RPAREN);
+ p.expr1(x.Fun, token.HighestPrec, depth, 0, multiLine)
+ p.print(x.Lparen, token.LPAREN)
+ p.exprList(x.Lparen, x.Args, depth, commaSep, multiLine)
+ p.print(x.Rparen, token.RPAREN)
case *ast.CompositeLit:
- p.expr1(x.Type, token.HighestPrec, depth, compositeLit, multiLine);
- mode := commaSep | commaTerm;
+ p.expr1(x.Type, token.HighestPrec, depth, compositeLit, multiLine)
+ mode := commaSep | commaTerm
if compositeLitBlank {
// add blank padding around composite literal
// contents for a less dense look
- mode |= blankStart | blankEnd;
+ mode |= blankStart | blankEnd
if x.Lbrace.Line < x.Rbrace.Line {
// add a blank before the opening { for multi-line composites
// TODO(gri): for now this decision is made by looking at the
@@ -761,40 +761,40 @@ func (p *printer) expr1(expr ast.Expr, prec1, depth int, ctxt exprContext, multi
p.print(blank)
}
}
- p.print(x.Lbrace, token.LBRACE);
- p.exprList(x.Lbrace, x.Elts, 1, mode, multiLine);
- p.print(x.Rbrace, token.RBRACE);
+ p.print(x.Lbrace, token.LBRACE)
+ p.exprList(x.Lbrace, x.Elts, 1, mode, multiLine)
+ p.print(x.Rbrace, token.RBRACE)
case *ast.Ellipsis:
p.print(token.ELLIPSIS)
case *ast.ArrayType:
- p.print(token.LBRACK);
+ p.print(token.LBRACK)
if x.Len != nil {
p.expr(x.Len, multiLine)
}
- p.print(token.RBRACK);
- optSemi = p.expr(x.Elt, multiLine);
+ p.print(token.RBRACK)
+ optSemi = p.expr(x.Elt, multiLine)
case *ast.StructType:
- p.print(token.STRUCT);
- p.fieldList(x.Lbrace, x.Fields, x.Rbrace, x.Incomplete, ctxt|structType);
- optSemi = true;
+ p.print(token.STRUCT)
+ p.fieldList(x.Lbrace, x.Fields, x.Rbrace, x.Incomplete, ctxt|structType)
+ optSemi = true
case *ast.FuncType:
- p.print(token.FUNC);
- optSemi = p.signature(x.Params, x.Results, multiLine);
+ p.print(token.FUNC)
+ optSemi = p.signature(x.Params, x.Results, multiLine)
case *ast.InterfaceType:
- p.print(token.INTERFACE);
- p.fieldList(x.Lbrace, x.Methods, x.Rbrace, x.Incomplete, ctxt);
- optSemi = true;
+ p.print(token.INTERFACE)
+ p.fieldList(x.Lbrace, x.Methods, x.Rbrace, x.Incomplete, ctxt)
+ optSemi = true
case *ast.MapType:
- p.print(token.MAP, token.LBRACK);
- p.expr(x.Key, multiLine);
- p.print(token.RBRACK);
- optSemi = p.expr(x.Value, multiLine);
+ p.print(token.MAP, token.LBRACK)
+ p.expr(x.Key, multiLine)
+ p.print(token.RBRACK)
+ optSemi = p.expr(x.Value, multiLine)
case *ast.ChanType:
switch x.Dir {
@@ -805,14 +805,14 @@ func (p *printer) expr1(expr ast.Expr, prec1, depth int, ctxt exprContext, multi
case ast.SEND:
p.print(token.CHAN, token.ARROW)
}
- p.print(blank);
- optSemi = p.expr(x.Value, multiLine);
+ p.print(blank)
+ optSemi = p.expr(x.Value, multiLine)
default:
panic("unreachable")
}
- return;
+ return
}
@@ -824,15 +824,15 @@ func (p *printer) expr0(x ast.Expr, depth int, multiLine *bool) (optSemi bool) {
// Returns true if a separating semicolon is optional.
// Sets multiLine to true if the expression spans multiple lines.
func (p *printer) expr(x ast.Expr, multiLine *bool) (optSemi bool) {
- const depth = 1;
- return p.expr1(x, token.LowestPrec, depth, 0, multiLine);
+ const depth = 1
+ return p.expr1(x, token.LowestPrec, depth, 0, multiLine)
}
// ----------------------------------------------------------------------------
// Statements
-const maxStmtNewlines = 2 // maximum number of newlines between statements
+const maxStmtNewlines = 2 // maximum number of newlines between statements
// Print the statement list indented, but without a newline after the last statement.
// Extra line breaks between statements in the source are respected but at most one
@@ -842,12 +842,12 @@ func (p *printer) stmtList(list []ast.Stmt, _indent int) {
if _indent > 0 {
p.print(indent)
}
- var multiLine bool;
+ var multiLine bool
for i, s := range list {
// _indent == 0 only for lists of switch/select case clauses;
// in those cases each clause is a new section
- p.linebreak(s.Pos().Line, 1, maxStmtNewlines, ignore, i == 0 || _indent == 0 || multiLine);
- multiLine = false;
+ p.linebreak(s.Pos().Line, 1, maxStmtNewlines, ignore, i == 0 || _indent == 0 || multiLine)
+ multiLine = false
if !p.stmt(s, &multiLine) && len(list) > 1 && p.Mode&NoSemis == 0 {
p.print(token.SEMICOLON)
}
@@ -876,10 +876,10 @@ func (p *printer) block(s *ast.BlockStmt, indent int, moveComments bool) {
} else {
p.print(s.Pos())
}
- p.print(token.LBRACE);
- p.stmtList(s.List, indent);
- p.linebreak(s.Rbrace.Line, 1, maxStmtNewlines, ignore, true);
- p.print(s.Rbrace, token.RBRACE);
+ p.print(token.LBRACE)
+ p.stmtList(s.List, indent)
+ p.linebreak(s.Rbrace.Line, 1, maxStmtNewlines, ignore, true)
+ p.print(s.Rbrace, token.RBRACE)
}
@@ -890,18 +890,18 @@ func stripParens(x ast.Expr) ast.Expr {
if px, hasParens := x.(*ast.ParenExpr); hasParens {
return stripParens(px.X)
}
- return x;
+ return x
}
func (p *printer) controlClause(isForStmt bool, init ast.Stmt, expr ast.Expr, post ast.Stmt) {
- p.print(blank);
- needsBlank := false;
+ p.print(blank)
+ needsBlank := false
if init == nil && post == nil {
// no semicolons required
if expr != nil {
- p.expr(stripParens(expr), ignoreMultiLine);
- needsBlank = true;
+ p.expr(stripParens(expr), ignoreMultiLine)
+ needsBlank = true
}
} else {
// all semicolons required
@@ -909,17 +909,17 @@ func (p *printer) controlClause(isForStmt bool, init ast.Stmt, expr ast.Expr, po
if init != nil {
p.stmt(init, ignoreMultiLine)
}
- p.print(token.SEMICOLON, blank);
+ p.print(token.SEMICOLON, blank)
if expr != nil {
- p.expr(stripParens(expr), ignoreMultiLine);
- needsBlank = true;
+ p.expr(stripParens(expr), ignoreMultiLine)
+ needsBlank = true
}
if isForStmt {
- p.print(token.SEMICOLON, blank);
- needsBlank = false;
+ p.print(token.SEMICOLON, blank)
+ needsBlank = false
if post != nil {
- p.stmt(post, ignoreMultiLine);
- needsBlank = true;
+ p.stmt(post, ignoreMultiLine)
+ needsBlank = true
}
}
}
@@ -932,15 +932,15 @@ func (p *printer) controlClause(isForStmt bool, init ast.Stmt, expr ast.Expr, po
// Returns true if a separating semicolon is optional.
// Sets multiLine to true if the statements spans multiple lines.
func (p *printer) stmt(stmt ast.Stmt, multiLine *bool) (optSemi bool) {
- p.print(stmt.Pos());
+ p.print(stmt.Pos())
switch s := stmt.(type) {
case *ast.BadStmt:
p.print("BadStmt")
case *ast.DeclStmt:
- p.decl(s.Decl, inStmtList, multiLine);
- optSemi = true; // decl prints terminating semicolon if necessary
+ p.decl(s.Decl, inStmtList, multiLine)
+ optSemi = true // decl prints terminating semicolon if necessary
case *ast.EmptyStmt:
// nothing to do
@@ -949,164 +949,164 @@ func (p *printer) stmt(stmt ast.Stmt, multiLine *bool) (optSemi bool) {
// a "correcting" unindent immediately following a line break
// is applied before the line break if there is no comment
// between (see writeWhitespace)
- p.print(unindent);
- p.expr(s.Label, multiLine);
- p.print(token.COLON, vtab, indent);
- p.linebreak(s.Stmt.Pos().Line, 0, 1, ignore, true);
- optSemi = p.stmt(s.Stmt, multiLine);
+ p.print(unindent)
+ p.expr(s.Label, multiLine)
+ p.print(token.COLON, vtab, indent)
+ p.linebreak(s.Stmt.Pos().Line, 0, 1, ignore, true)
+ optSemi = p.stmt(s.Stmt, multiLine)
case *ast.ExprStmt:
- const depth = 1;
- p.expr0(s.X, depth, multiLine);
+ const depth = 1
+ p.expr0(s.X, depth, multiLine)
case *ast.IncDecStmt:
- const depth = 1;
- p.expr0(s.X, depth+1, multiLine);
- p.print(s.Tok);
+ const depth = 1
+ p.expr0(s.X, depth+1, multiLine)
+ p.print(s.Tok)
case *ast.AssignStmt:
- var depth = 1;
+ var depth = 1
if len(s.Lhs) > 1 && len(s.Rhs) > 1 {
depth++
}
- p.exprList(s.Pos(), s.Lhs, depth, commaSep, multiLine);
- p.print(blank, s.TokPos, s.Tok);
- p.exprList(s.TokPos, s.Rhs, depth, blankStart|commaSep, multiLine);
+ p.exprList(s.Pos(), s.Lhs, depth, commaSep, multiLine)
+ p.print(blank, s.TokPos, s.Tok)
+ p.exprList(s.TokPos, s.Rhs, depth, blankStart|commaSep, multiLine)
case *ast.GoStmt:
- p.print(token.GO, blank);
- p.expr(s.Call, multiLine);
+ p.print(token.GO, blank)
+ p.expr(s.Call, multiLine)
case *ast.DeferStmt:
- p.print(token.DEFER, blank);
- p.expr(s.Call, multiLine);
+ p.print(token.DEFER, blank)
+ p.expr(s.Call, multiLine)
case *ast.ReturnStmt:
- p.print(token.RETURN);
+ p.print(token.RETURN)
if s.Results != nil {
p.exprList(s.Pos(), s.Results, 1, blankStart|commaSep, multiLine)
}
case *ast.BranchStmt:
- p.print(s.Tok);
+ p.print(s.Tok)
if s.Label != nil {
- p.print(blank);
- p.expr(s.Label, multiLine);
+ p.print(blank)
+ p.expr(s.Label, multiLine)
}
case *ast.BlockStmt:
- p.block(s, 1, false);
- *multiLine = true;
- optSemi = true;
+ p.block(s, 1, false)
+ *multiLine = true
+ optSemi = true
case *ast.IfStmt:
- p.print(token.IF);
- p.controlClause(false, s.Init, s.Cond, nil);
- p.block(s.Body, 1, true);
- *multiLine = true;
- optSemi = true;
+ p.print(token.IF)
+ p.controlClause(false, s.Init, s.Cond, nil)
+ p.block(s.Body, 1, true)
+ *multiLine = true
+ optSemi = true
if s.Else != nil {
- p.print(blank, token.ELSE, blank);
+ p.print(blank, token.ELSE, blank)
switch s.Else.(type) {
case *ast.BlockStmt, *ast.IfStmt:
optSemi = p.stmt(s.Else, ignoreMultiLine)
default:
- p.print(token.LBRACE, indent, formfeed);
- p.stmt(s.Else, ignoreMultiLine);
- p.print(unindent, formfeed, token.RBRACE);
+ p.print(token.LBRACE, indent, formfeed)
+ p.stmt(s.Else, ignoreMultiLine)
+ p.print(unindent, formfeed, token.RBRACE)
}
}
case *ast.CaseClause:
if s.Values != nil {
- p.print(token.CASE);
- p.exprList(s.Pos(), s.Values, 1, blankStart|commaSep, multiLine);
+ p.print(token.CASE)
+ p.exprList(s.Pos(), s.Values, 1, blankStart|commaSep, multiLine)
} else {
p.print(token.DEFAULT)
}
- p.print(s.Colon, token.COLON);
- p.stmtList(s.Body, 1);
- optSemi = true; // "block" without {}'s
+ p.print(s.Colon, token.COLON)
+ p.stmtList(s.Body, 1)
+ optSemi = true // "block" without {}'s
case *ast.SwitchStmt:
- p.print(token.SWITCH);
- p.controlClause(false, s.Init, s.Tag, nil);
- p.block(s.Body, 0, true);
- *multiLine = true;
- optSemi = true;
+ p.print(token.SWITCH)
+ p.controlClause(false, s.Init, s.Tag, nil)
+ p.block(s.Body, 0, true)
+ *multiLine = true
+ optSemi = true
case *ast.TypeCaseClause:
if s.Types != nil {
- p.print(token.CASE);
- p.exprList(s.Pos(), s.Types, 1, blankStart|commaSep, multiLine);
+ p.print(token.CASE)
+ p.exprList(s.Pos(), s.Types, 1, blankStart|commaSep, multiLine)
} else {
p.print(token.DEFAULT)
}
- p.print(s.Colon, token.COLON);
- p.stmtList(s.Body, 1);
- optSemi = true; // "block" without {}'s
+ p.print(s.Colon, token.COLON)
+ p.stmtList(s.Body, 1)
+ optSemi = true // "block" without {}'s
case *ast.TypeSwitchStmt:
- p.print(token.SWITCH);
+ p.print(token.SWITCH)
if s.Init != nil {
- p.print(blank);
- p.stmt(s.Init, ignoreMultiLine);
- p.print(token.SEMICOLON);
+ p.print(blank)
+ p.stmt(s.Init, ignoreMultiLine)
+ p.print(token.SEMICOLON)
}
- p.print(blank);
- p.stmt(s.Assign, ignoreMultiLine);
- p.print(blank);
- p.block(s.Body, 0, true);
- *multiLine = true;
- optSemi = true;
+ p.print(blank)
+ p.stmt(s.Assign, ignoreMultiLine)
+ p.print(blank)
+ p.block(s.Body, 0, true)
+ *multiLine = true
+ optSemi = true
case *ast.CommClause:
if s.Rhs != nil {
- p.print(token.CASE, blank);
+ p.print(token.CASE, blank)
if s.Lhs != nil {
- p.expr(s.Lhs, multiLine);
- p.print(blank, s.Tok, blank);
+ p.expr(s.Lhs, multiLine)
+ p.print(blank, s.Tok, blank)
}
- p.expr(s.Rhs, multiLine);
+ p.expr(s.Rhs, multiLine)
} else {
p.print(token.DEFAULT)
}
- p.print(s.Colon, token.COLON);
- p.stmtList(s.Body, 1);
- optSemi = true; // "block" without {}'s
+ p.print(s.Colon, token.COLON)
+ p.stmtList(s.Body, 1)
+ optSemi = true // "block" without {}'s
case *ast.SelectStmt:
- p.print(token.SELECT, blank);
- p.block(s.Body, 0, false);
- *multiLine = true;
- optSemi = true;
+ p.print(token.SELECT, blank)
+ p.block(s.Body, 0, false)
+ *multiLine = true
+ optSemi = true
case *ast.ForStmt:
- p.print(token.FOR);
- p.controlClause(true, s.Init, s.Cond, s.Post);
- p.block(s.Body, 1, true);
- *multiLine = true;
- optSemi = true;
+ p.print(token.FOR)
+ p.controlClause(true, s.Init, s.Cond, s.Post)
+ p.block(s.Body, 1, true)
+ *multiLine = true
+ optSemi = true
case *ast.RangeStmt:
- p.print(token.FOR, blank);
- p.expr(s.Key, multiLine);
+ p.print(token.FOR, blank)
+ p.expr(s.Key, multiLine)
if s.Value != nil {
- p.print(token.COMMA, blank);
- p.expr(s.Value, multiLine);
+ p.print(token.COMMA, blank)
+ p.expr(s.Value, multiLine)
}
- p.print(blank, s.TokPos, s.Tok, blank, token.RANGE, blank);
- p.expr(s.X, multiLine);
- p.print(blank);
- p.block(s.Body, 1, true);
- *multiLine = true;
- optSemi = true;
+ p.print(blank, s.TokPos, s.Tok, blank, token.RANGE, blank)
+ p.expr(s.X, multiLine)
+ p.print(blank)
+ p.block(s.Body, 1, true)
+ *multiLine = true
+ optSemi = true
default:
panic("unreachable")
}
- return;
+ return
}
@@ -1116,9 +1116,9 @@ func (p *printer) stmt(stmt ast.Stmt, multiLine *bool) (optSemi bool) {
type declContext uint
const (
- atTop declContext = iota;
- inGroup;
- inStmtList;
+ atTop declContext = iota
+ inGroup
+ inStmtList
)
// The parameter n is the number of specs in the group; context specifies
@@ -1128,25 +1128,25 @@ const (
//
func (p *printer) spec(spec ast.Spec, n int, context declContext, multiLine *bool) {
var (
- optSemi bool; // true if a semicolon is optional
- comment *ast.CommentGroup; // a line comment, if any
- extraTabs int; // number of extra tabs before comment, if any
+ optSemi bool // true if a semicolon is optional
+ comment *ast.CommentGroup // a line comment, if any
+ extraTabs int // number of extra tabs before comment, if any
)
switch s := spec.(type) {
case *ast.ImportSpec:
- p.leadComment(s.Doc);
+ p.leadComment(s.Doc)
if s.Name != nil {
- p.expr(s.Name, multiLine);
- p.print(blank);
- p.moveCommentsAfter(s.Path[0].Pos());
+ p.expr(s.Name, multiLine)
+ p.print(blank)
+ p.moveCommentsAfter(s.Path[0].Pos())
}
- p.expr(&ast.StringList{s.Path}, multiLine);
- comment = s.Comment;
+ p.expr(&ast.StringList{s.Path}, multiLine)
+ comment = s.Comment
case *ast.ValueSpec:
- p.leadComment(s.Doc);
- p.identList(s.Names, multiLine); // always present
+ p.leadComment(s.Doc)
+ p.identList(s.Names, multiLine) // always present
if s.Values != nil {
p.moveCommentsAfter(s.Values[0].Pos())
} else if s.Type != nil {
@@ -1154,44 +1154,44 @@ func (p *printer) spec(spec ast.Spec, n int, context declContext, multiLine *boo
}
if n == 1 {
if s.Type != nil {
- p.print(blank);
- optSemi = p.expr(s.Type, multiLine);
+ p.print(blank)
+ optSemi = p.expr(s.Type, multiLine)
}
if s.Values != nil {
- p.print(blank, token.ASSIGN);
- p.exprList(noPos, s.Values, 1, blankStart|commaSep, multiLine);
- optSemi = false;
+ p.print(blank, token.ASSIGN)
+ p.exprList(noPos, s.Values, 1, blankStart|commaSep, multiLine)
+ optSemi = false
}
} else {
- extraTabs = 2;
+ extraTabs = 2
if s.Type != nil || s.Values != nil {
p.print(vtab)
}
if s.Type != nil {
- optSemi = p.expr(s.Type, multiLine);
- extraTabs = 1;
+ optSemi = p.expr(s.Type, multiLine)
+ extraTabs = 1
}
if s.Values != nil {
- p.print(vtab);
- p.print(token.ASSIGN);
- p.exprList(noPos, s.Values, 1, blankStart|commaSep, multiLine);
- optSemi = false;
- extraTabs = 0;
+ p.print(vtab)
+ p.print(token.ASSIGN)
+ p.exprList(noPos, s.Values, 1, blankStart|commaSep, multiLine)
+ optSemi = false
+ extraTabs = 0
}
}
- comment = s.Comment;
+ comment = s.Comment
case *ast.TypeSpec:
- p.leadComment(s.Doc);
- p.expr(s.Name, multiLine);
- p.moveCommentsAfter(s.Type.Pos());
+ p.leadComment(s.Doc)
+ p.expr(s.Name, multiLine)
+ p.moveCommentsAfter(s.Type.Pos())
if n == 1 {
p.print(blank)
} else {
p.print(vtab)
}
- optSemi = p.expr(s.Type, multiLine);
- comment = s.Comment;
+ optSemi = p.expr(s.Type, multiLine)
+ comment = s.Comment
default:
panic("unreachable")
@@ -1205,33 +1205,33 @@ func (p *printer) spec(spec ast.Spec, n int, context declContext, multiLine *boo
for ; extraTabs > 0; extraTabs-- {
p.print(vtab)
}
- p.lineComment(comment);
+ p.lineComment(comment)
}
}
// Sets multiLine to true if the declaration spans multiple lines.
func (p *printer) genDecl(d *ast.GenDecl, context declContext, multiLine *bool) {
- p.leadComment(d.Doc);
- p.print(d.Pos(), d.Tok, blank);
+ p.leadComment(d.Doc)
+ p.print(d.Pos(), d.Tok, blank)
if d.Lparen.IsValid() {
// group of parenthesized declarations
- p.print(d.Lparen, token.LPAREN);
+ p.print(d.Lparen, token.LPAREN)
if len(d.Specs) > 0 {
- p.print(indent, formfeed);
- var ml bool;
+ p.print(indent, formfeed)
+ var ml bool
for i, s := range d.Specs {
if i > 0 {
p.linebreak(s.Pos().Line, 1, 2, ignore, ml)
}
- ml = false;
- p.spec(s, len(d.Specs), inGroup, &ml);
+ ml = false
+ p.spec(s, len(d.Specs), inGroup, &ml)
}
- p.print(unindent, formfeed);
- *multiLine = true;
+ p.print(unindent, formfeed)
+ *multiLine = true
}
- p.print(d.Rparen, token.RPAREN);
+ p.print(d.Rparen, token.RPAREN)
} else {
// single declaration
@@ -1246,12 +1246,12 @@ func (p *printer) genDecl(d *ast.GenDecl, context declContext, multiLine *bool)
// any control chars. Otherwise, the result is > maxSize.
//
func (p *printer) nodeSize(n ast.Node, maxSize int) (size int) {
- size = maxSize + 1; // assume n doesn't fit
+ size = maxSize + 1 // assume n doesn't fit
// nodeSize computation must be indendent of particular
// style so that we always get the same decision; print
// in RawFormat
- cfg := Config{Mode: RawFormat};
- var buf bytes.Buffer;
+ cfg := Config{Mode: RawFormat}
+ var buf bytes.Buffer
if _, err := cfg.Fprint(&buf, n); err != nil {
return
}
@@ -1261,23 +1261,23 @@ func (p *printer) nodeSize(n ast.Node, maxSize int) (size int) {
return
}
}
- size = buf.Len(); // n fits
+ size = buf.Len() // n fits
}
- return;
+ return
}
func (p *printer) isOneLineFunc(b *ast.BlockStmt, headerSize int) bool {
- const maxSize = 90; // adjust as appropriate, this is an approximate value
- bodySize := 0;
+ const maxSize = 90 // adjust as appropriate, this is an approximate value
+ bodySize := 0
switch {
case len(b.List) > 1 || p.commentBefore(b.Rbrace):
- return false // too many statements or there is a comment - all bets are off
+ return false // too many statements or there is a comment - all bets are off
case len(b.List) == 1:
bodySize = p.nodeSize(b.List[0], maxSize)
}
// require both headers and overall size to be not "too large"
- return headerSize <= maxSize/2 && headerSize+bodySize <= maxSize;
+ return headerSize <= maxSize/2 && headerSize+bodySize <= maxSize
}
@@ -1288,23 +1288,23 @@ func (p *printer) funcBody(b *ast.BlockStmt, headerSize int, isLit bool, multiLi
}
if p.isOneLineFunc(b, headerSize) {
- sep := vtab;
+ sep := vtab
if isLit {
sep = blank
}
if len(b.List) > 0 {
- p.print(sep, b.Pos(), token.LBRACE, blank);
- p.stmt(b.List[0], ignoreMultiLine);
- p.print(blank, b.Rbrace, token.RBRACE);
+ p.print(sep, b.Pos(), token.LBRACE, blank)
+ p.stmt(b.List[0], ignoreMultiLine)
+ p.print(blank, b.Rbrace, token.RBRACE)
} else {
p.print(sep, b.Pos(), token.LBRACE, b.Rbrace, token.RBRACE)
}
- return;
+ return
}
- p.print(blank);
- p.block(b, 1, true);
- *multiLine = true;
+ p.print(blank)
+ p.block(b, 1, true)
+ *multiLine = true
}
@@ -1315,27 +1315,27 @@ func distance(from, to token.Position) int {
if from.IsValid() && to.IsValid() && from.Line == to.Line {
return to.Column - from.Column
}
- return 1 << 30;
+ return 1 << 30
}
// Sets multiLine to true if the declaration spans multiple lines.
func (p *printer) funcDecl(d *ast.FuncDecl, multiLine *bool) {
- p.leadComment(d.Doc);
- p.print(d.Pos(), token.FUNC, blank);
+ p.leadComment(d.Doc)
+ p.print(d.Pos(), token.FUNC, blank)
if recv := d.Recv; recv != nil {
// method: print receiver
- p.print(token.LPAREN);
+ p.print(token.LPAREN)
if len(recv.Names) > 0 {
- p.expr(recv.Names[0], multiLine);
- p.print(blank);
+ p.expr(recv.Names[0], multiLine)
+ p.print(blank)
}
- p.expr(recv.Type, multiLine);
- p.print(token.RPAREN, blank);
+ p.expr(recv.Type, multiLine)
+ p.print(token.RPAREN, blank)
}
- p.expr(d.Name, multiLine);
- p.signature(d.Type.Params, d.Type.Results, multiLine);
- p.funcBody(d.Body, distance(d.Pos(), p.pos), false, multiLine);
+ p.expr(d.Name, multiLine)
+ p.signature(d.Type.Params, d.Type.Results, multiLine)
+ p.funcBody(d.Body, distance(d.Pos(), p.pos), false, multiLine)
}
@@ -1357,40 +1357,40 @@ func (p *printer) decl(decl ast.Decl, context declContext, multiLine *bool) {
// ----------------------------------------------------------------------------
// Files
-const maxDeclNewlines = 3 // maximum number of newlines between declarations
+const maxDeclNewlines = 3 // maximum number of newlines between declarations
func declToken(decl ast.Decl) (tok token.Token) {
- tok = token.ILLEGAL;
+ tok = token.ILLEGAL
switch d := decl.(type) {
case *ast.GenDecl:
tok = d.Tok
case *ast.FuncDecl:
tok = token.FUNC
}
- return;
+ return
}
func (p *printer) file(src *ast.File) {
- p.leadComment(src.Doc);
- p.print(src.Pos(), token.PACKAGE, blank);
- p.expr(src.Name, ignoreMultiLine);
+ p.leadComment(src.Doc)
+ p.print(src.Pos(), token.PACKAGE, blank)
+ p.expr(src.Name, ignoreMultiLine)
if len(src.Decls) > 0 {
- tok := token.ILLEGAL;
+ tok := token.ILLEGAL
for _, d := range src.Decls {
- prev := tok;
- tok = declToken(d);
+ prev := tok
+ tok = declToken(d)
// if the declaration token changed (e.g., from CONST to TYPE)
// print an empty line between top-level declarations
- min := 1;
+ min := 1
if prev != tok {
min = 2
}
- p.linebreak(d.Pos().Line, min, maxDeclNewlines, ignore, false);
- p.decl(d, atTop, ignoreMultiLine);
+ p.linebreak(d.Pos().Line, min, maxDeclNewlines, ignore, false)
+ p.decl(d, atTop, ignoreMultiLine)
}
}
- p.print(newline);
+ p.print(newline)
}
diff --git a/src/pkg/go/printer/printer.go b/src/pkg/go/printer/printer.go
index 50f0007a6..994dabaa8 100644
--- a/src/pkg/go/printer/printer.go
+++ b/src/pkg/go/printer/printer.go
@@ -6,50 +6,50 @@
package printer
import (
- "bytes";
- "fmt";
- "go/ast";
- "go/token";
- "io";
- "os";
- "reflect";
- "runtime";
- "strings";
- "tabwriter";
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/token"
+ "io"
+ "os"
+ "reflect"
+ "runtime"
+ "strings"
+ "tabwriter"
)
const (
- debug = false; // enable for debugging
- maxNewlines = 3; // maximum vertical white space
+ debug = false // enable for debugging
+ maxNewlines = 3 // maximum vertical white space
)
type whiteSpace int
const (
- ignore = whiteSpace(0);
- blank = whiteSpace(' ');
- vtab = whiteSpace('\v');
- newline = whiteSpace('\n');
- formfeed = whiteSpace('\f');
- indent = whiteSpace('>');
- unindent = whiteSpace('<');
+ ignore = whiteSpace(0)
+ blank = whiteSpace(' ')
+ vtab = whiteSpace('\v')
+ newline = whiteSpace('\n')
+ formfeed = whiteSpace('\f')
+ indent = whiteSpace('>')
+ unindent = whiteSpace('<')
)
var (
- esc = []byte{tabwriter.Escape};
- htab = []byte{'\t'};
- htabs = [...]byte{'\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t'};
- newlines = [...]byte{'\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n'}; // more than maxNewlines
- formfeeds = [...]byte{'\f', '\f', '\f', '\f', '\f', '\f', '\f', '\f'}; // more than maxNewlines
-
- esc_quot = strings.Bytes("&#34;"); // shorter than "&quot;"
- esc_apos = strings.Bytes("&#39;"); // shorter than "&apos;"
- esc_amp = strings.Bytes("&amp;");
- esc_lt = strings.Bytes("&lt;");
- esc_gt = strings.Bytes("&gt;");
+ esc = []byte{tabwriter.Escape}
+ htab = []byte{'\t'}
+ htabs = [...]byte{'\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t'}
+ newlines = [...]byte{'\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n'} // more than maxNewlines
+ formfeeds = [...]byte{'\f', '\f', '\f', '\f', '\f', '\f', '\f', '\f'} // more than maxNewlines
+
+ esc_quot = strings.Bytes("&#34;") // shorter than "&quot;"
+ esc_apos = strings.Bytes("&#39;") // shorter than "&apos;"
+ esc_amp = strings.Bytes("&amp;")
+ esc_lt = strings.Bytes("&lt;")
+ esc_gt = strings.Bytes("&gt;")
)
@@ -63,49 +63,49 @@ var ignoreMultiLine = new(bool)
type printer struct {
// Configuration (does not change after initialization)
- output io.Writer;
- Config;
- errors chan os.Error;
+ output io.Writer
+ Config
+ errors chan os.Error
// Current state
- written int; // number of bytes written
- indent int; // current indentation
- escape bool; // true if in escape sequence
+ written int // number of bytes written
+ indent int // current indentation
+ escape bool // true if in escape sequence
// Buffered whitespace
- buffer []whiteSpace;
+ buffer []whiteSpace
// The (possibly estimated) position in the generated output;
// in AST space (i.e., pos is set whenever a token position is
// known accurately, and updated dependending on what has been
// written)
- pos token.Position;
+ pos token.Position
// The value of pos immediately after the last item has been
// written using writeItem.
- last token.Position;
+ last token.Position
// HTML support
- lastTaggedLine int; // last line for which a line tag was written
+ lastTaggedLine int // last line for which a line tag was written
// The list of comments; or nil.
- comment *ast.CommentGroup;
+ comment *ast.CommentGroup
}
func (p *printer) init(output io.Writer, cfg *Config) {
- p.output = output;
- p.Config = *cfg;
- p.errors = make(chan os.Error);
- p.buffer = make([]whiteSpace, 0, 16); // whitespace sequences are short
+ p.output = output
+ p.Config = *cfg
+ p.errors = make(chan os.Error)
+ p.buffer = make([]whiteSpace, 0, 16) // whitespace sequences are short
}
func (p *printer) internalError(msg ...) {
if debug {
- fmt.Print(p.pos.String() + ": ");
- fmt.Println(msg);
- panic();
+ fmt.Print(p.pos.String() + ": ")
+ fmt.Println(msg)
+ panic()
}
}
@@ -114,11 +114,11 @@ func (p *printer) internalError(msg ...) {
// write0 does not indent after newlines, and does not HTML-escape or update p.pos.
//
func (p *printer) write0(data []byte) {
- n, err := p.output.Write(data);
- p.written += n;
+ n, err := p.output.Write(data)
+ p.written += n
if err != nil {
- p.errors <- err;
- runtime.Goexit();
+ p.errors <- err
+ runtime.Goexit()
}
}
@@ -128,43 +128,43 @@ func (p *printer) write0(data []byte) {
// escapes characters if GenHTML is set. It updates p.pos as a side-effect.
//
func (p *printer) write(data []byte) {
- i0 := 0;
+ i0 := 0
for i, b := range data {
switch b {
case '\n', '\f':
// write segment ending in b
- p.write0(data[i0 : i+1]);
+ p.write0(data[i0 : i+1])
// update p.pos
- p.pos.Offset += i + 1 - i0;
- p.pos.Line++;
- p.pos.Column = 1;
+ p.pos.Offset += i + 1 - i0
+ p.pos.Line++
+ p.pos.Column = 1
if !p.escape {
// write indentation
// use "hard" htabs - indentation columns
// must not be discarded by the tabwriter
- j := p.indent;
+ j := p.indent
for ; j > len(htabs); j -= len(htabs) {
p.write0(&htabs)
}
- p.write0(htabs[0:j]);
+ p.write0(htabs[0:j])
// update p.pos
- p.pos.Offset += p.indent;
- p.pos.Column += p.indent;
+ p.pos.Offset += p.indent
+ p.pos.Column += p.indent
}
// next segment start
- i0 = i + 1;
+ i0 = i + 1
case '"', '\'', '&', '<', '>':
if p.Mode&GenHTML != 0 {
// write segment ending in b
- p.write0(data[i0:i]);
+ p.write0(data[i0:i])
// write HTML-escaped b
- var esc []byte;
+ var esc []byte
switch b {
case '"':
esc = esc_quot
@@ -177,15 +177,15 @@ func (p *printer) write(data []byte) {
case '>':
esc = esc_gt
}
- p.write0(esc);
+ p.write0(esc)
// update p.pos
- d := i + 1 - i0;
- p.pos.Offset += d;
- p.pos.Column += d;
+ d := i + 1 - i0
+ p.pos.Offset += d
+ p.pos.Column += d
// next segment start
- i0 = i + 1;
+ i0 = i + 1
}
case tabwriter.Escape:
@@ -194,12 +194,12 @@ func (p *printer) write(data []byte) {
}
// write remaining segment
- p.write0(data[i0:]);
+ p.write0(data[i0:])
// update p.pos
- d := len(data) - i0;
- p.pos.Offset += d;
- p.pos.Column += d;
+ d := len(data) - i0
+ p.pos.Offset += d
+ p.pos.Column += d
}
@@ -208,7 +208,7 @@ func (p *printer) writeNewlines(n int) {
if n > maxNewlines {
n = maxNewlines
}
- p.write(newlines[0:n]);
+ p.write(newlines[0:n])
}
}
@@ -218,7 +218,7 @@ func (p *printer) writeFormfeeds(n int) {
if n > maxNewlines {
n = maxNewlines
}
- p.write(formfeeds[0:n]);
+ p.write(formfeeds[0:n])
}
}
@@ -229,7 +229,7 @@ func (p *printer) writeTaggedItem(data []byte, tag HTMLTag) {
if tag.Start != "" {
p.write0(strings.Bytes(tag.Start))
}
- p.write(data);
+ p.write(data)
// write end tag, if any
if tag.End != "" {
p.write0(strings.Bytes(tag.End))
@@ -245,7 +245,7 @@ func (p *printer) writeTaggedItem(data []byte, tag HTMLTag) {
// immediately following the data.
//
func (p *printer) writeItem(pos token.Position, data []byte, tag HTMLTag) {
- p.pos = pos;
+ p.pos = pos
if debug {
// do not update p.pos - use write0
p.write0(strings.Bytes(fmt.Sprintf("[%d:%d]", pos.Line, pos.Column)))
@@ -255,14 +255,14 @@ func (p *printer) writeItem(pos token.Position, data []byte, tag HTMLTag) {
// TODO(gri): should write line tags on each line at the start
// will be more useful (e.g. to show line numbers)
if p.Styler != nil && pos.Line > p.lastTaggedLine {
- p.writeTaggedItem(p.Styler.LineTag(pos.Line));
- p.lastTaggedLine = pos.Line;
+ p.writeTaggedItem(p.Styler.LineTag(pos.Line))
+ p.lastTaggedLine = pos.Line
}
- p.writeTaggedItem(data, tag);
+ p.writeTaggedItem(data, tag)
} else {
p.write(data)
}
- p.last = p.pos;
+ p.last = p.pos
}
@@ -284,28 +284,28 @@ func (p *printer) writeCommentPrefix(pos, next token.Position, isFirst, isKeywor
if pos.Line == p.last.Line {
// comment on the same line as last item:
// separate with at least one separator
- hasSep := false;
+ hasSep := false
if isFirst {
- j := 0;
+ j := 0
for i, ch := range p.buffer {
switch ch {
case blank:
// ignore any blanks before a comment
- p.buffer[i] = ignore;
- continue;
+ p.buffer[i] = ignore
+ continue
case vtab:
// respect existing tabs - important
// for proper formatting of commented structs
- hasSep = true;
- continue;
+ hasSep = true
+ continue
case indent:
// apply pending indentation
continue
}
- j = i;
- break;
+ j = i
+ break
}
- p.writeWhitespace(j);
+ p.writeWhitespace(j)
}
// make sure there is at least one separator
if !hasSep {
@@ -323,13 +323,13 @@ func (p *printer) writeCommentPrefix(pos, next token.Position, isFirst, isKeywor
// comment on a different line:
// separate with at least one line break
if isFirst {
- j := 0;
+ j := 0
for i, ch := range p.buffer {
switch ch {
case blank, vtab:
// ignore any horizontal whitespace before line breaks
- p.buffer[i] = ignore;
- continue;
+ p.buffer[i] = ignore
+ continue
case indent:
// apply pending indentation
continue
@@ -347,31 +347,31 @@ func (p *printer) writeCommentPrefix(pos, next token.Position, isFirst, isKeywor
// TODO(gri): may want to keep formfeed info in some cases
p.buffer[i] = ignore
}
- j = i;
- break;
+ j = i
+ break
}
- p.writeWhitespace(j);
+ p.writeWhitespace(j)
}
// use formfeeds to break columns before a comment;
// this is analogous to using formfeeds to separate
// individual lines of /*-style comments
- p.writeFormfeeds(pos.Line - p.last.Line);
+ p.writeFormfeeds(pos.Line - p.last.Line)
}
}
func (p *printer) writeCommentLine(comment *ast.Comment, pos token.Position, line []byte) {
// line must pass through unchanged, bracket it with tabwriter.Escape
- esc := []byte{tabwriter.Escape};
- line = bytes.Join([][]byte{esc, line, esc}, nil);
+ esc := []byte{tabwriter.Escape}
+ line = bytes.Join([][]byte{esc, line, esc}, nil)
// apply styler, if any
- var tag HTMLTag;
+ var tag HTMLTag
if p.Styler != nil {
line, tag = p.Styler.Comment(comment, line)
}
- p.writeItem(pos, line, tag);
+ p.writeItem(pos, line, tag)
}
@@ -382,7 +382,7 @@ func (p *printer) writeCommentLine(comment *ast.Comment, pos token.Position, lin
// Split comment text into lines
func split(text []byte) [][]byte {
// count lines (comment text never ends in a newline)
- n := 1;
+ n := 1
for _, c := range text {
if c == '\n' {
n++
@@ -390,19 +390,19 @@ func split(text []byte) [][]byte {
}
// split
- lines := make([][]byte, n);
- n = 0;
- i := 0;
+ lines := make([][]byte, n)
+ n = 0
+ i := 0
for j, c := range text {
if c == '\n' {
- lines[n] = text[i:j]; // exclude newline
- i = j + 1; // discard newline
- n++;
+ lines[n] = text[i:j] // exclude newline
+ i = j + 1 // discard newline
+ n++
}
}
- lines[n] = text[i:];
+ lines[n] = text[i:]
- return lines;
+ return lines
}
@@ -412,22 +412,22 @@ func isBlank(s []byte) bool {
return false
}
}
- return true;
+ return true
}
func commonPrefix(a, b []byte) []byte {
- i := 0;
+ i := 0
for i < len(a) && i < len(b) && a[i] == b[i] && (a[i] <= ' ' || a[i] == '*') {
i++
}
- return a[0:i];
+ return a[0:i]
}
func stripCommonPrefix(lines [][]byte) {
if len(lines) < 2 {
- return // at most one line - nothing to do
+ return // at most one line - nothing to do
}
// The heuristic in this function tries to handle a few
@@ -441,7 +441,7 @@ func stripCommonPrefix(lines [][]byte) {
// Compute maximum common white prefix of all but the first,
// last, and blank lines, and replace blank lines with empty
// lines (the first line starts with /* and has no prefix).
- var prefix []byte;
+ var prefix []byte
for i, line := range lines {
switch {
case i == 0 || i == len(lines)-1:
@@ -458,14 +458,14 @@ func stripCommonPrefix(lines [][]byte) {
/*
* Check for vertical "line of stars" and correct prefix accordingly.
*/
- lineOfStars := false;
+ lineOfStars := false
if i := bytes.Index(prefix, []byte{'*'}); i >= 0 {
// Line of stars present.
if i > 0 && prefix[i-1] == ' ' {
- i-- // remove trailing blank from prefix so stars remain aligned
+ i-- // remove trailing blank from prefix so stars remain aligned
}
- prefix = prefix[0:i];
- lineOfStars = true;
+ prefix = prefix[0:i]
+ lineOfStars = true
} else {
// No line of stars present.
// Determine the white space on the first line after the /*
@@ -474,36 +474,36 @@ func stripCommonPrefix(lines [][]byte) {
// the /* is a tab. If the first comment line is empty but
// for the opening /*, assume up to 3 blanks or a tab. This
// whitespace may be found as suffix in the common prefix.
- first := lines[0];
+ first := lines[0]
if isBlank(first[2:]) {
// no comment text on the first line:
// reduce prefix by up to 3 blanks or a tab
// if present - this keeps comment text indented
// relative to the /* and */'s if it was indented
// in the first place
- i := len(prefix);
+ i := len(prefix)
for n := 0; n < 3 && i > 0 && prefix[i-1] == ' '; n++ {
i--
}
if i == len(prefix) && i > 0 && prefix[i-1] == '\t' {
i--
}
- prefix = prefix[0:i];
+ prefix = prefix[0:i]
} else {
// comment text on the first line
- suffix := make([]byte, len(first));
- n := 2;
+ suffix := make([]byte, len(first))
+ n := 2
for n < len(first) && first[n] <= ' ' {
- suffix[n] = first[n];
- n++;
+ suffix[n] = first[n]
+ n++
}
if n > 2 && suffix[2] == '\t' {
// assume the '\t' compensates for the /*
suffix = suffix[2:n]
} else {
// otherwise assume two blanks
- suffix[0], suffix[1] = ' ', ' ';
- suffix = suffix[0:n];
+ suffix[0], suffix[1] = ' ', ' '
+ suffix = suffix[0:n]
}
// Shorten the computed common prefix by the length of
// suffix, if it is found as suffix of the prefix.
@@ -516,17 +516,17 @@ func stripCommonPrefix(lines [][]byte) {
// Handle last line: If it only contains a closing */, align it
// with the opening /*, otherwise align the text with the other
// lines.
- last := lines[len(lines)-1];
- closing := []byte{'*', '/'};
- i := bytes.Index(last, closing);
+ last := lines[len(lines)-1]
+ closing := []byte{'*', '/'}
+ i := bytes.Index(last, closing)
if isBlank(last[0:i]) {
// last line only contains closing */
- var sep []byte;
+ var sep []byte
if lineOfStars {
// insert an aligning blank
sep = []byte{' '}
}
- lines[len(lines)-1] = bytes.Join([][]byte{prefix, closing}, sep);
+ lines[len(lines)-1] = bytes.Join([][]byte{prefix, closing}, sep)
} else {
// last line contains more comment text - assume
// it is aligned like the other lines
@@ -543,27 +543,27 @@ func stripCommonPrefix(lines [][]byte) {
func (p *printer) writeComment(comment *ast.Comment) {
- text := comment.Text;
+ text := comment.Text
// shortcut common case of //-style comments
if text[1] == '/' {
- p.writeCommentLine(comment, comment.Pos(), text);
- return;
+ p.writeCommentLine(comment, comment.Pos(), text)
+ return
}
// for /*-style comments, print line by line and let the
// write function take care of the proper indentation
- lines := split(text);
- stripCommonPrefix(lines);
+ lines := split(text)
+ stripCommonPrefix(lines)
// write comment lines, separated by formfeed,
// without a line break after the last line
- linebreak := formfeeds[0:1];
- pos := comment.Pos();
+ linebreak := formfeeds[0:1]
+ pos := comment.Pos()
for i, line := range lines {
if i > 0 {
- p.write(linebreak);
- pos = p.pos;
+ p.write(linebreak)
+ pos = p.pos
}
if len(line) > 0 {
p.writeCommentLine(comment, pos, line)
@@ -594,7 +594,7 @@ func (p *printer) writeCommentSuffix(needsLinebreak bool) {
}
}
}
- p.writeWhitespace(len(p.buffer));
+ p.writeWhitespace(len(p.buffer))
// make sure we have a line break
if needsLinebreak {
@@ -610,16 +610,16 @@ func (p *printer) writeCommentSuffix(needsLinebreak bool) {
// token is a keyword or not.
//
func (p *printer) intersperseComments(next token.Position, isKeyword bool) {
- isFirst := true;
- needsLinebreak := false;
- var last *ast.Comment;
+ isFirst := true
+ needsLinebreak := false
+ var last *ast.Comment
for ; p.commentBefore(next); p.comment = p.comment.Next {
for _, c := range p.comment.List {
- p.writeCommentPrefix(c.Pos(), next, isFirst, isKeyword);
- isFirst = false;
- p.writeComment(c);
- needsLinebreak = c.Text[1] == '/';
- last = c;
+ p.writeCommentPrefix(c.Pos(), next, isFirst, isKeyword)
+ isFirst = false
+ p.writeComment(c)
+ needsLinebreak = c.Text[1] == '/'
+ last = c
}
}
if last != nil && !needsLinebreak && last.Pos().Line == next.Line {
@@ -627,14 +627,14 @@ func (p *printer) intersperseComments(next token.Position, isKeyword bool) {
// follows on the same line: separate with an extra blank
p.write([]byte{' '})
}
- p.writeCommentSuffix(needsLinebreak);
+ p.writeCommentSuffix(needsLinebreak)
}
// whiteWhitespace writes the first n whitespace entries.
func (p *printer) writeWhitespace(n int) {
// write entries
- var data [1]byte;
+ var data [1]byte
for i := 0; i < n; i++ {
switch ch := p.buffer[i]; ch {
case ignore:
@@ -642,10 +642,10 @@ func (p *printer) writeWhitespace(n int) {
case indent:
p.indent++
case unindent:
- p.indent--;
+ p.indent--
if p.indent < 0 {
- p.internalError("negative indentation:", p.indent);
- p.indent = 0;
+ p.internalError("negative indentation:", p.indent)
+ p.indent = 0
}
case newline, formfeed:
// A line break immediately followed by a "correcting"
@@ -660,24 +660,24 @@ func (p *printer) writeWhitespace(n int) {
// to a wide column may increase the indentation column
// of lines before the label; effectively leading to wrong
// indentation.
- p.buffer[i], p.buffer[i+1] = unindent, formfeed;
- i--; // do it again
- continue;
+ p.buffer[i], p.buffer[i+1] = unindent, formfeed
+ i-- // do it again
+ continue
}
- fallthrough;
+ fallthrough
default:
- data[0] = byte(ch);
- p.write(&data);
+ data[0] = byte(ch)
+ p.write(&data)
}
}
// shift remaining entries down
- i := 0;
+ i := 0
for ; n < len(p.buffer); n++ {
- p.buffer[i] = p.buffer[n];
- i++;
+ p.buffer[i] = p.buffer[n]
+ i++
}
- p.buffer = p.buffer[0:i];
+ p.buffer = p.buffer[0:i]
}
@@ -696,14 +696,14 @@ func (p *printer) writeWhitespace(n int) {
// printed, followed by the actual token.
//
func (p *printer) print(args ...) {
- v := reflect.NewValue(args).(*reflect.StructValue);
+ v := reflect.NewValue(args).(*reflect.StructValue)
for i := 0; i < v.NumField(); i++ {
- f := v.Field(i);
+ f := v.Field(i)
- next := p.pos; // estimated position of next item
- var data []byte;
- var tag HTMLTag;
- isKeyword := false;
+ next := p.pos // estimated position of next item
+ var data []byte
+ var tag HTMLTag
+ isKeyword := false
switch x := f.Interface().(type) {
case whiteSpace:
if x == ignore {
@@ -712,16 +712,16 @@ func (p *printer) print(args ...) {
// LabeledStmt)
break
}
- i := len(p.buffer);
+ i := len(p.buffer)
if i == cap(p.buffer) {
// Whitespace sequences are very short so this should
// never happen. Handle gracefully (but possibly with
// bad comment placement) if it does happen.
- p.writeWhitespace(i);
- i = 0;
+ p.writeWhitespace(i)
+ i = 0
}
- p.buffer = p.buffer[0 : i+1];
- p.buffer[i] = x;
+ p.buffer = p.buffer[0 : i+1]
+ p.buffer[i] = x
case []byte:
// TODO(gri): remove this case once commentList
// handles comments correctly
@@ -746,32 +746,32 @@ func (p *printer) print(args ...) {
// (note that valid Go programs cannot contain esc ('\xff')
// bytes since they do not appear in legal UTF-8 sequences)
// TODO(gri): this this more efficiently.
- data = strings.Bytes("\xff" + string(data) + "\xff");
+ data = strings.Bytes("\xff" + string(data) + "\xff")
case token.Token:
if p.Styler != nil {
data, tag = p.Styler.Token(x)
} else {
data = strings.Bytes(x.String())
}
- isKeyword = x.IsKeyword();
+ isKeyword = x.IsKeyword()
case token.Position:
if x.IsValid() {
- next = x // accurate position of next item
+ next = x // accurate position of next item
}
default:
panicln("print: unsupported argument type", f.Type().String())
}
- p.pos = next;
+ p.pos = next
if data != nil {
- p.flush(next, isKeyword);
+ p.flush(next, isKeyword)
// intersperse extra newlines if present in the source
// (don't do this in flush as it will cause extra newlines
// at the end of a file)
- p.writeNewlines(next.Line - p.pos.Line);
+ p.writeNewlines(next.Line - p.pos.Line)
- p.writeItem(next, data, tag);
+ p.writeItem(next, data, tag)
}
}
}
@@ -794,7 +794,7 @@ func (p *printer) flush(next token.Position, isKeyword bool) {
p.intersperseComments(next, isKeyword)
}
// write any leftover whitespace
- p.writeWhitespace(len(p.buffer));
+ p.writeWhitespace(len(p.buffer))
}
@@ -807,8 +807,8 @@ func (p *printer) flush(next token.Position, isKeyword bool) {
// is used).
//
type trimmer struct {
- output io.Writer;
- buf bytes.Buffer;
+ output io.Writer
+ buf bytes.Buffer
}
@@ -821,12 +821,12 @@ type trimmer struct {
func (p *trimmer) Write(data []byte) (n int, err os.Error) {
// m < 0: no unwritten data except for whitespace
// m >= 0: data[m:n] unwritten and no whitespace
- m := 0;
+ m := 0
if p.buf.Len() > 0 {
m = -1
}
- var b byte;
+ var b byte
for n, b = range data {
switch b {
default:
@@ -835,13 +835,13 @@ func (p *trimmer) Write(data []byte) (n int, err os.Error) {
if _, err = p.output.Write(p.buf.Bytes()); err != nil {
return
}
- p.buf.Reset();
- m = n;
+ p.buf.Reset()
+ m = n
}
case '\v':
- b = '\t'; // convert to htab
- fallthrough;
+ b = '\t' // convert to htab
+ fallthrough
case '\t', ' ', tabwriter.Escape:
// write any pending (non-whitespace) data
@@ -849,22 +849,22 @@ func (p *trimmer) Write(data []byte) (n int, err os.Error) {
if _, err = p.output.Write(data[m:n]); err != nil {
return
}
- m = -1;
+ m = -1
}
// collect whitespace but discard tabrwiter.Escapes.
if b != tabwriter.Escape {
- p.buf.WriteByte(b) // WriteByte returns no errors
+ p.buf.WriteByte(b) // WriteByte returns no errors
}
case '\f', '\n':
// discard whitespace
- p.buf.Reset();
+ p.buf.Reset()
// write any pending (non-whitespace) data
if m >= 0 {
if _, err = p.output.Write(data[m:n]); err != nil {
return
}
- m = -1;
+ m = -1
}
// convert formfeed into newline
if _, err = p.output.Write(newlines[0:1]); err != nil {
@@ -872,7 +872,7 @@ func (p *trimmer) Write(data []byte) (n int, err os.Error) {
}
}
}
- n = len(data);
+ n = len(data)
// write any pending non-whitespace
if m >= 0 {
@@ -881,7 +881,7 @@ func (p *trimmer) Write(data []byte) (n int, err os.Error) {
}
}
- return;
+ return
}
@@ -890,17 +890,17 @@ func (p *trimmer) Write(data []byte) (n int, err os.Error) {
// General printing is controlled with these Config.Mode flags.
const (
- GenHTML uint = 1 << iota; // generate HTML
- RawFormat; // do not use a tabwriter; if set, UseSpaces is ignored
- TabIndent; // use tabs for indentation independent of UseSpaces
- UseSpaces; // use spaces instead of tabs for alignment
- NoSemis; // don't print semicolons at the end of a line
+ GenHTML uint = 1 << iota // generate HTML
+ RawFormat // do not use a tabwriter; if set, UseSpaces is ignored
+ TabIndent // use tabs for indentation independent of UseSpaces
+ UseSpaces // use spaces instead of tabs for alignment
+ NoSemis // don't print semicolons at the end of a line
)
// An HTMLTag specifies a start and end tag.
type HTMLTag struct {
- Start, End string; // empty if tags are absent
+ Start, End string // empty if tags are absent
}
@@ -908,19 +908,19 @@ type HTMLTag struct {
// A format consists of text and a (possibly empty) surrounding HTML tag.
//
type Styler interface {
- LineTag(line int) ([]byte, HTMLTag);
- Comment(c *ast.Comment, line []byte) ([]byte, HTMLTag);
- BasicLit(x *ast.BasicLit) ([]byte, HTMLTag);
- Ident(id *ast.Ident) ([]byte, HTMLTag);
- Token(tok token.Token) ([]byte, HTMLTag);
+ LineTag(line int) ([]byte, HTMLTag)
+ Comment(c *ast.Comment, line []byte) ([]byte, HTMLTag)
+ BasicLit(x *ast.BasicLit) ([]byte, HTMLTag)
+ Ident(id *ast.Ident) ([]byte, HTMLTag)
+ Token(tok token.Token) ([]byte, HTMLTag)
}
// A Config node controls the output of Fprint.
type Config struct {
- Mode uint; // default: 0
- Tabwidth int; // default: 8
- Styler Styler; // default: nil
+ Mode uint // default: 0
+ Tabwidth int // default: 8
+ Styler Styler // default: nil
}
@@ -934,34 +934,34 @@ func (cfg *Config) Fprint(output io.Writer, node interface{}) (int, os.Error) {
// (Input to a tabwriter must be untrimmed since trailing tabs provide
// formatting information. The tabwriter could provide trimming
// functionality but no tabwriter is used when RawFormat is set.)
- output = &trimmer{output: output};
+ output = &trimmer{output: output}
// setup tabwriter if needed and redirect output
- var tw *tabwriter.Writer;
+ var tw *tabwriter.Writer
if cfg.Mode&RawFormat == 0 {
- minwidth := cfg.Tabwidth;
+ minwidth := cfg.Tabwidth
- padchar := byte('\t');
+ padchar := byte('\t')
if cfg.Mode&UseSpaces != 0 {
padchar = ' '
}
- twmode := tabwriter.DiscardEmptyColumns;
+ twmode := tabwriter.DiscardEmptyColumns
if cfg.Mode&GenHTML != 0 {
twmode |= tabwriter.FilterHTML
}
if cfg.Mode&TabIndent != 0 {
- minwidth = 0;
- twmode |= tabwriter.TabIndent;
+ minwidth = 0
+ twmode |= tabwriter.TabIndent
}
- tw = tabwriter.NewWriter(output, minwidth, cfg.Tabwidth, 1, padchar, twmode);
- output = tw;
+ tw = tabwriter.NewWriter(output, minwidth, cfg.Tabwidth, 1, padchar, twmode)
+ output = tw
}
// setup printer and print node
- var p printer;
- p.init(output, cfg);
+ var p printer
+ p.init(output, cfg)
go func() {
switch n := node.(type) {
case ast.Expr:
@@ -971,23 +971,23 @@ func (cfg *Config) Fprint(output io.Writer, node interface{}) (int, os.Error) {
case ast.Decl:
p.decl(n, atTop, ignoreMultiLine)
case *ast.File:
- p.comment = n.Comments;
- p.file(n);
+ p.comment = n.Comments
+ p.file(n)
default:
- p.errors <- os.NewError(fmt.Sprintf("printer.Fprint: unsupported node type %T", n));
- runtime.Goexit();
+ p.errors <- os.NewError(fmt.Sprintf("printer.Fprint: unsupported node type %T", n))
+ runtime.Goexit()
}
- p.flush(token.Position{Offset: 1 << 30, Line: 1 << 30}, false); // flush to "infinity"
- p.errors <- nil; // no errors
- }();
- err := <-p.errors; // wait for completion of goroutine
+ p.flush(token.Position{Offset: 1 << 30, Line: 1 << 30}, false) // flush to "infinity"
+ p.errors <- nil // no errors
+ }()
+ err := <-p.errors // wait for completion of goroutine
// flush tabwriter, if any
if tw != nil {
- tw.Flush() // ignore errors
+ tw.Flush() // ignore errors
}
- return p.written, err;
+ return p.written, err
}
@@ -995,6 +995,6 @@ func (cfg *Config) Fprint(output io.Writer, node interface{}) (int, os.Error) {
// It calls Config.Fprint with default settings.
//
func Fprint(output io.Writer, node interface{}) os.Error {
- _, err := (&Config{Tabwidth: 8}).Fprint(output, node); // don't care about number of bytes written
- return err;
+ _, err := (&Config{Tabwidth: 8}).Fprint(output, node) // don't care about number of bytes written
+ return err
}
diff --git a/src/pkg/go/printer/printer_test.go b/src/pkg/go/printer/printer_test.go
index 823f61740..b733e359b 100644
--- a/src/pkg/go/printer/printer_test.go
+++ b/src/pkg/go/printer/printer_test.go
@@ -5,21 +5,21 @@
package printer
import (
- "bytes";
- oldParser "exp/parser";
- "flag";
- "io/ioutil";
- "go/ast";
- "go/parser";
- "os";
- "path";
- "testing";
+ "bytes"
+ oldParser "exp/parser"
+ "flag"
+ "io/ioutil"
+ "go/ast"
+ "go/parser"
+ "os"
+ "path"
+ "testing"
)
const (
- dataDir = "testdata";
- tabwidth = 8;
+ dataDir = "testdata"
+ tabwidth = 8
)
@@ -27,69 +27,69 @@ var update = flag.Bool("update", false, "update golden files")
func lineString(text []byte, i int) string {
- i0 := i;
+ i0 := i
for i < len(text) && text[i] != '\n' {
i++
}
- return string(text[i0:i]);
+ return string(text[i0:i])
}
type checkMode uint
const (
- export checkMode = 1 << iota;
- rawFormat;
- oldSyntax;
+ export checkMode = 1 << iota
+ rawFormat
+ oldSyntax
)
func check(t *testing.T, source, golden string, mode checkMode) {
// parse source
- var prog *ast.File;
- var err os.Error;
+ var prog *ast.File
+ var err os.Error
if mode&oldSyntax != 0 {
prog, err = oldParser.ParseFile(source, nil, parser.ParseComments)
} else {
prog, err = parser.ParseFile(source, nil, parser.ParseComments)
}
if err != nil {
- t.Error(err);
- return;
+ t.Error(err)
+ return
}
// filter exports if necessary
if mode&export != 0 {
- ast.FileExports(prog); // ignore result
- prog.Comments = nil; // don't print comments that are not in AST
+ ast.FileExports(prog) // ignore result
+ prog.Comments = nil // don't print comments that are not in AST
}
// determine printer configuration
- cfg := Config{Tabwidth: tabwidth};
+ cfg := Config{Tabwidth: tabwidth}
if mode&rawFormat != 0 {
cfg.Mode |= RawFormat
}
// format source
- var buf bytes.Buffer;
+ var buf bytes.Buffer
if _, err := cfg.Fprint(&buf, prog); err != nil {
t.Error(err)
}
- res := buf.Bytes();
+ res := buf.Bytes()
// update golden files if necessary
if *update {
if err := ioutil.WriteFile(golden, res, 0644); err != nil {
t.Error(err)
}
- return;
+ return
}
// get golden
- gld, err := ioutil.ReadFile(golden);
+ gld, err := ioutil.ReadFile(golden)
if err != nil {
- t.Error(err);
- return;
+ t.Error(err)
+ return
}
// compare lengths
@@ -99,24 +99,24 @@ func check(t *testing.T, source, golden string, mode checkMode) {
// compare contents
for i, line, offs := 0, 1, 0; i < len(res) && i < len(gld); i++ {
- ch := res[i];
+ ch := res[i]
if ch != gld[i] {
- t.Errorf("%s:%d:%d: %s", source, line, i-offs+1, lineString(res, offs));
- t.Errorf("%s:%d:%d: %s", golden, line, i-offs+1, lineString(gld, offs));
- t.Error();
- return;
+ t.Errorf("%s:%d:%d: %s", source, line, i-offs+1, lineString(res, offs))
+ t.Errorf("%s:%d:%d: %s", golden, line, i-offs+1, lineString(gld, offs))
+ t.Error()
+ return
}
if ch == '\n' {
- line++;
- offs = i + 1;
+ line++
+ offs = i + 1
}
}
}
type entry struct {
- source, golden string;
- mode checkMode;
+ source, golden string
+ mode checkMode
}
// Use gotest -update to create/update the respective golden files.
@@ -134,9 +134,9 @@ var data = []entry{
func Test(t *testing.T) {
for _, e := range data {
- source := path.Join(dataDir, e.source);
- golden := path.Join(dataDir, e.golden);
- check(t, source, golden, e.mode|oldSyntax);
+ source := path.Join(dataDir, e.source)
+ golden := path.Join(dataDir, e.golden)
+ check(t, source, golden, e.mode|oldSyntax)
// TODO(gri) check that golden is idempotent
//check(t, golden, golden, e.mode);
}
diff --git a/src/pkg/go/scanner/errors.go b/src/pkg/go/scanner/errors.go
index 12c1c852f..d1fdf2dcf 100644
--- a/src/pkg/go/scanner/errors.go
+++ b/src/pkg/go/scanner/errors.go
@@ -5,12 +5,12 @@
package scanner
import (
- "container/vector";
- "fmt";
- "go/token";
- "io";
- "os";
- "sort";
+ "container/vector"
+ "fmt"
+ "go/token"
+ "io"
+ "os"
+ "sort"
)
@@ -20,7 +20,7 @@ import (
// to the beginning of the offending token.
//
type ErrorHandler interface {
- Error(pos token.Position, msg string);
+ Error(pos token.Position, msg string)
}
@@ -34,16 +34,16 @@ type ErrorHandler interface {
// error handling is obtained.
//
type ErrorVector struct {
- errors vector.Vector;
+ errors vector.Vector
}
// Reset resets an ErrorVector to no errors.
-func (h *ErrorVector) Reset() { h.errors.Resize(0, 0) }
+func (h *ErrorVector) Reset() { h.errors.Resize(0, 0) }
// ErrorCount returns the number of errors collected.
-func (h *ErrorVector) ErrorCount() int { return h.errors.Len() }
+func (h *ErrorVector) ErrorCount() int { return h.errors.Len() }
// Within ErrorVector, an error is represented by an Error node. The
@@ -51,8 +51,8 @@ func (h *ErrorVector) ErrorCount() int { return h.errors.Len() }
// token, and the error condition is described by Msg.
//
type Error struct {
- Pos token.Position;
- Msg string;
+ Pos token.Position
+ Msg string
}
@@ -62,7 +62,7 @@ func (e *Error) String() string {
// TODO(gri) reconsider the semantics of Position.IsValid
return e.Pos.String() + ": " + e.Msg
}
- return e.Msg;
+ return e.Msg
}
@@ -71,13 +71,13 @@ type ErrorList []*Error
// ErrorList implements the sort Interface.
-func (p ErrorList) Len() int { return len(p) }
-func (p ErrorList) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+func (p ErrorList) Len() int { return len(p) }
+func (p ErrorList) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (p ErrorList) Less(i, j int) bool {
- e := &p[i].Pos;
- f := &p[j].Pos;
+ e := &p[i].Pos
+ f := &p[j].Pos
// Note that it is not sufficient to simply compare file offsets because
// the offsets do not reflect modified line information (through //line
// comments).
@@ -92,7 +92,7 @@ func (p ErrorList) Less(i, j int) bool {
return e.Column < f.Column
}
}
- return false;
+ return false
}
@@ -103,7 +103,7 @@ func (p ErrorList) String() string {
case 1:
return p[0].String()
}
- return fmt.Sprintf("%s (and %d more errors)", p[0].String(), len(p)-1);
+ return fmt.Sprintf("%s (and %d more errors)", p[0].String(), len(p)-1)
}
@@ -111,9 +111,9 @@ func (p ErrorList) String() string {
// returned by GetErrors.
//
const (
- Raw = iota; // leave error list unchanged
- Sorted; // sort error list by file, line, and column number
- NoMultiples; // sort error list and leave only the first error per line
+ Raw = iota // leave error list unchanged
+ Sorted // sort error list by file, line, and column number
+ NoMultiples // sort error list and leave only the first error per line
)
@@ -126,7 +126,7 @@ func (h *ErrorVector) GetErrorList(mode int) ErrorList {
return nil
}
- list := make(ErrorList, h.errors.Len());
+ list := make(ErrorList, h.errors.Len())
for i := 0; i < h.errors.Len(); i++ {
list[i] = h.errors.At(i).(*Error)
}
@@ -136,19 +136,19 @@ func (h *ErrorVector) GetErrorList(mode int) ErrorList {
}
if mode >= NoMultiples {
- var last token.Position; // initial last.Line is != any legal error line
- i := 0;
+ var last token.Position // initial last.Line is != any legal error line
+ i := 0
for _, e := range list {
if e.Pos.Filename != last.Filename || e.Pos.Line != last.Line {
- last = e.Pos;
- list[i] = e;
- i++;
+ last = e.Pos
+ list[i] = e
+ i++
}
}
- list = list[0:i];
+ list = list[0:i]
}
- return list;
+ return list
}
@@ -161,7 +161,7 @@ func (h *ErrorVector) GetError(mode int) os.Error {
return nil
}
- return h.GetErrorList(mode);
+ return h.GetErrorList(mode)
}
diff --git a/src/pkg/go/scanner/scanner.go b/src/pkg/go/scanner/scanner.go
index 026ae9976..fad3c0f75 100644
--- a/src/pkg/go/scanner/scanner.go
+++ b/src/pkg/go/scanner/scanner.go
@@ -9,11 +9,11 @@
package scanner
import (
- "bytes";
- "go/token";
- "strconv";
- "unicode";
- "utf8";
+ "bytes"
+ "go/token"
+ "strconv"
+ "unicode"
+ "utf8"
)
@@ -24,18 +24,18 @@ import (
//
type Scanner struct {
// immutable state
- src []byte; // source
- err ErrorHandler; // error reporting; or nil
- mode uint; // scanning mode
+ src []byte // source
+ err ErrorHandler // error reporting; or nil
+ mode uint // scanning mode
// scanning state
- pos token.Position; // previous reading position (position before ch)
- offset int; // current reading offset (position after ch)
- ch int; // one char look-ahead
- insertSemi bool; // insert a semicolon before next newline
+ pos token.Position // previous reading position (position before ch)
+ offset int // current reading offset (position after ch)
+ ch int // one char look-ahead
+ insertSemi bool // insert a semicolon before next newline
// public state - ok to modify
- ErrorCount int; // number of errors encountered
+ ErrorCount int // number of errors encountered
}
@@ -44,22 +44,22 @@ type Scanner struct {
//
func (S *Scanner) next() {
if S.offset < len(S.src) {
- S.pos.Offset = S.offset;
- S.pos.Column++;
- r, w := int(S.src[S.offset]), 1;
+ S.pos.Offset = S.offset
+ S.pos.Column++
+ r, w := int(S.src[S.offset]), 1
switch {
case r == '\n':
- S.pos.Line++;
- S.pos.Column = 0;
+ S.pos.Line++
+ S.pos.Column = 0
case r >= 0x80:
// not ASCII
r, w = utf8.DecodeRune(S.src[S.offset:])
}
- S.offset += w;
- S.ch = r;
+ S.offset += w
+ S.ch = r
} else {
- S.pos.Offset = len(S.src);
- S.ch = -1; // eof
+ S.pos.Offset = len(S.src)
+ S.ch = -1 // eof
}
}
@@ -68,9 +68,9 @@ func (S *Scanner) next() {
// They control scanner behavior.
//
const (
- ScanComments = 1 << iota; // return comments as COMMENT tokens
- AllowIllegalChars; // do not report an error for illegal chars
- InsertSemis; // automatically insert semicolons
+ ScanComments = 1 << iota // return comments as COMMENT tokens
+ AllowIllegalChars // do not report an error for illegal chars
+ InsertSemis // automatically insert semicolons
)
@@ -84,18 +84,18 @@ const (
//
func (S *Scanner) Init(filename string, src []byte, err ErrorHandler, mode uint) {
// Explicitly initialize all fields since a scanner may be reused.
- S.src = src;
- S.err = err;
- S.mode = mode;
- S.pos = token.Position{filename, 0, 1, 0};
- S.offset = 0;
- S.ErrorCount = 0;
- S.next();
+ S.src = src
+ S.err = err
+ S.mode = mode
+ S.pos = token.Position{filename, 0, 1, 0}
+ S.offset = 0
+ S.ErrorCount = 0
+ S.next()
}
func charString(ch int) string {
- var s string;
+ var s string
switch ch {
case -1:
return `EOF`
@@ -120,7 +120,7 @@ func charString(ch int) string {
default:
s = string(ch)
}
- return "'" + s + "' (U+" + strconv.Itob(ch, 16) + ")";
+ return "'" + s + "' (U+" + strconv.Itob(ch, 16) + ")"
}
@@ -128,7 +128,7 @@ func (S *Scanner) error(pos token.Position, msg string) {
if S.err != nil {
S.err.Error(pos, msg)
}
- S.ErrorCount++;
+ S.ErrorCount++
}
@@ -136,11 +136,11 @@ func (S *Scanner) expect(ch int) {
if S.ch != ch {
S.error(S.pos, "expected "+charString(ch)+", found "+charString(S.ch))
}
- S.next(); // always make progress
+ S.next() // always make progress
}
-var prefix = []byte{'l', 'i', 'n', 'e', ' '} // "line "
+var prefix = []byte{'l', 'i', 'n', 'e', ' '} // "line "
func (S *Scanner) scanComment(pos token.Position) {
// first '/' already consumed
@@ -148,44 +148,44 @@ func (S *Scanner) scanComment(pos token.Position) {
if S.ch == '/' {
//-style comment
for S.ch >= 0 {
- S.next();
+ S.next()
if S.ch == '\n' {
// '\n' is not part of the comment for purposes of scanning
// (the comment ends on the same line where it started)
if pos.Column == 1 {
- text := S.src[pos.Offset+2 : S.pos.Offset];
+ text := S.src[pos.Offset+2 : S.pos.Offset]
if bytes.HasPrefix(text, prefix) {
// comment starts at beginning of line with "//line ";
// get filename and line number, if any
- i := bytes.Index(text, []byte{':'});
+ i := bytes.Index(text, []byte{':'})
if i >= 0 {
if line, err := strconv.Atoi(string(text[i+1:])); err == nil && line > 0 {
// valid //line filename:line comment;
// update scanner position
- S.pos.Filename = string(text[len(prefix):i]);
- S.pos.Line = line;
+ S.pos.Filename = string(text[len(prefix):i])
+ S.pos.Line = line
}
}
}
}
- return;
+ return
}
}
} else {
/*-style comment */
- S.expect('*');
+ S.expect('*')
for S.ch >= 0 {
- ch := S.ch;
- S.next();
+ ch := S.ch
+ S.next()
if ch == '*' && S.ch == '/' {
- S.next();
- return;
+ S.next()
+ return
}
}
}
- S.error(pos, "comment not terminated");
+ S.error(pos, "comment not terminated")
}
@@ -193,30 +193,30 @@ func (S *Scanner) findNewline(pos token.Position) bool {
// first '/' already consumed; assume S.ch == '/' || S.ch == '*'
// read ahead until a newline or non-comment token is found
- newline := false;
+ newline := false
for pos1 := pos; S.ch >= 0; {
if S.ch == '/' {
//-style comment always contains a newline
- newline = true;
- break;
+ newline = true
+ break
}
- S.scanComment(pos1);
+ S.scanComment(pos1)
if pos1.Line < S.pos.Line {
/*-style comment contained a newline */
- newline = true;
- break;
+ newline = true
+ break
}
- S.skipWhitespace();
+ S.skipWhitespace()
if S.ch == '\n' {
- newline = true;
- break;
+ newline = true
+ break
}
if S.ch != '/' {
// non-comment token
break
}
- pos1 = S.pos;
- S.next();
+ pos1 = S.pos
+ S.next()
if S.ch != '/' && S.ch != '*' {
// non-comment token
break
@@ -224,11 +224,11 @@ func (S *Scanner) findNewline(pos token.Position) bool {
}
// reset position
- S.pos = pos;
- S.offset = pos.Offset + 1;
- S.ch = '/';
+ S.pos = pos
+ S.offset = pos.Offset + 1
+ S.ch = '/'
- return newline;
+ return newline
}
@@ -243,11 +243,11 @@ func isDigit(ch int) bool {
func (S *Scanner) scanIdentifier() token.Token {
- pos := S.pos.Offset;
+ pos := S.pos.Offset
for isLetter(S.ch) || isDigit(S.ch) {
S.next()
}
- return token.Lookup(S.src[pos:S.pos.Offset]);
+ return token.Lookup(S.src[pos:S.pos.Offset])
}
@@ -260,7 +260,7 @@ func digitVal(ch int) int {
case 'A' <= ch && ch <= 'F':
return ch - 'A' + 10
}
- return 16; // larger than any legal digit val
+ return 16 // larger than any legal digit val
}
@@ -272,65 +272,65 @@ func (S *Scanner) scanMantissa(base int) {
func (S *Scanner) scanNumber(seen_decimal_point bool) token.Token {
- tok := token.INT;
+ tok := token.INT
if seen_decimal_point {
- tok = token.FLOAT;
- S.scanMantissa(10);
- goto exponent;
+ tok = token.FLOAT
+ S.scanMantissa(10)
+ goto exponent
}
if S.ch == '0' {
// int or float
- S.next();
+ S.next()
if S.ch == 'x' || S.ch == 'X' {
// hexadecimal int
- S.next();
- S.scanMantissa(16);
+ S.next()
+ S.scanMantissa(16)
} else {
// octal int or float
- S.scanMantissa(8);
+ S.scanMantissa(8)
if digitVal(S.ch) < 10 || S.ch == '.' || S.ch == 'e' || S.ch == 'E' {
// float
- tok = token.FLOAT;
- goto mantissa;
+ tok = token.FLOAT
+ goto mantissa
}
// octal int
}
- goto exit;
+ goto exit
}
mantissa:
// decimal int or float
- S.scanMantissa(10);
+ S.scanMantissa(10)
if S.ch == '.' {
// float
- tok = token.FLOAT;
- S.next();
- S.scanMantissa(10);
+ tok = token.FLOAT
+ S.next()
+ S.scanMantissa(10)
}
exponent:
if S.ch == 'e' || S.ch == 'E' {
// float
- tok = token.FLOAT;
- S.next();
+ tok = token.FLOAT
+ S.next()
if S.ch == '-' || S.ch == '+' {
S.next()
}
- S.scanMantissa(10);
+ S.scanMantissa(10)
}
exit:
- return tok;
+ return tok
}
func (S *Scanner) scanDigits(base, length int) {
for length > 0 && digitVal(S.ch) < base {
- S.next();
- length--;
+ S.next()
+ length--
}
if length > 0 {
S.error(S.pos, "illegal char escape")
@@ -339,14 +339,14 @@ func (S *Scanner) scanDigits(base, length int) {
func (S *Scanner) scanEscape(quote int) {
- pos := S.pos;
- ch := S.ch;
- S.next();
+ pos := S.pos
+ ch := S.ch
+ S.next()
switch ch {
case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', quote:
// nothing to do
case '0', '1', '2', '3', '4', '5', '6', '7':
- S.scanDigits(8, 3-1) // 1 char read already
+ S.scanDigits(8, 3-1) // 1 char read already
case 'x':
S.scanDigits(16, 2)
case 'u':
@@ -362,22 +362,22 @@ func (S *Scanner) scanEscape(quote int) {
func (S *Scanner) scanChar(pos token.Position) {
// '\'' already consumed
- n := 0;
+ n := 0
for S.ch != '\'' {
- ch := S.ch;
- n++;
- S.next();
+ ch := S.ch
+ n++
+ S.next()
if ch == '\n' || ch < 0 {
- S.error(pos, "character literal not terminated");
- n = 1;
- break;
+ S.error(pos, "character literal not terminated")
+ n = 1
+ break
}
if ch == '\\' {
S.scanEscape('\'')
}
}
- S.next();
+ S.next()
if n != 1 {
S.error(pos, "illegal character literal")
@@ -389,18 +389,18 @@ func (S *Scanner) scanString(pos token.Position) {
// '"' already consumed
for S.ch != '"' {
- ch := S.ch;
- S.next();
+ ch := S.ch
+ S.next()
if ch == '\n' || ch < 0 {
- S.error(pos, "string not terminated");
- break;
+ S.error(pos, "string not terminated")
+ break
}
if ch == '\\' {
S.scanEscape('"')
}
}
- S.next();
+ S.next()
}
@@ -408,15 +408,15 @@ func (S *Scanner) scanRawString(pos token.Position) {
// '`' already consumed
for S.ch != '`' {
- ch := S.ch;
- S.next();
+ ch := S.ch
+ S.next()
if ch < 0 {
- S.error(pos, "string not terminated");
- break;
+ S.error(pos, "string not terminated")
+ break
}
}
- S.next();
+ S.next()
}
@@ -435,40 +435,40 @@ func (S *Scanner) skipWhitespace() {
func (S *Scanner) switch2(tok0, tok1 token.Token) token.Token {
if S.ch == '=' {
- S.next();
- return tok1;
+ S.next()
+ return tok1
}
- return tok0;
+ return tok0
}
func (S *Scanner) switch3(tok0, tok1 token.Token, ch2 int, tok2 token.Token) token.Token {
if S.ch == '=' {
- S.next();
- return tok1;
+ S.next()
+ return tok1
}
if S.ch == ch2 {
- S.next();
- return tok2;
+ S.next()
+ return tok2
}
- return tok0;
+ return tok0
}
func (S *Scanner) switch4(tok0, tok1 token.Token, ch2 int, tok2, tok3 token.Token) token.Token {
if S.ch == '=' {
- S.next();
- return tok1;
+ S.next()
+ return tok1
}
if S.ch == ch2 {
- S.next();
+ S.next()
if S.ch == '=' {
- S.next();
- return tok3;
+ S.next()
+ return tok3
}
- return tok2;
+ return tok2
}
- return tok0;
+ return tok0
}
@@ -487,25 +487,25 @@ var semicolon = []byte{';'}
//
func (S *Scanner) Scan() (pos token.Position, tok token.Token, lit []byte) {
scanAgain:
- S.skipWhitespace();
+ S.skipWhitespace()
// current token start
- insertSemi := false;
- pos, tok = S.pos, token.ILLEGAL;
+ insertSemi := false
+ pos, tok = S.pos, token.ILLEGAL
// determine token value
switch ch := S.ch; {
case isLetter(ch):
- tok = S.scanIdentifier();
+ tok = S.scanIdentifier()
switch tok {
case token.IDENT, token.BREAK, token.CONTINUE, token.FALLTHROUGH, token.RETURN:
insertSemi = true
}
case digitVal(ch) < 10:
- insertSemi = true;
- tok = S.scanNumber(false);
+ insertSemi = true
+ tok = S.scanNumber(false)
default:
- S.next(); // always make progress
+ S.next() // always make progress
switch ch {
case -1:
tok = token.EOF
@@ -513,31 +513,31 @@ scanAgain:
// we only reach here of S.insertSemi was
// set in the first place and exited early
// from S.skipWhitespace()
- S.insertSemi = false; // newline consumed
- return pos, token.SEMICOLON, semicolon;
+ S.insertSemi = false // newline consumed
+ return pos, token.SEMICOLON, semicolon
case '"':
- insertSemi = true;
- tok = token.STRING;
- S.scanString(pos);
+ insertSemi = true
+ tok = token.STRING
+ S.scanString(pos)
case '\'':
- insertSemi = true;
- tok = token.CHAR;
- S.scanChar(pos);
+ insertSemi = true
+ tok = token.CHAR
+ S.scanChar(pos)
case '`':
- insertSemi = true;
- tok = token.STRING;
- S.scanRawString(pos);
+ insertSemi = true
+ tok = token.STRING
+ S.scanRawString(pos)
case ':':
tok = S.switch2(token.COLON, token.DEFINE)
case '.':
if digitVal(S.ch) < 10 {
- insertSemi = true;
- tok = S.scanNumber(true);
+ insertSemi = true
+ tok = S.scanNumber(true)
} else if S.ch == '.' {
- S.next();
+ S.next()
if S.ch == '.' {
- S.next();
- tok = token.ELLIPSIS;
+ S.next()
+ tok = token.ELLIPSIS
}
} else {
tok = token.PERIOD
@@ -549,25 +549,25 @@ scanAgain:
case '(':
tok = token.LPAREN
case ')':
- insertSemi = true;
- tok = token.RPAREN;
+ insertSemi = true
+ tok = token.RPAREN
case '[':
tok = token.LBRACK
case ']':
- insertSemi = true;
- tok = token.RBRACK;
+ insertSemi = true
+ tok = token.RBRACK
case '{':
tok = token.LBRACE
case '}':
- insertSemi = true;
- tok = token.RBRACE;
+ insertSemi = true
+ tok = token.RBRACE
case '+':
- tok = S.switch3(token.ADD, token.ADD_ASSIGN, '+', token.INC);
+ tok = S.switch3(token.ADD, token.ADD_ASSIGN, '+', token.INC)
if tok == token.INC {
insertSemi = true
}
case '-':
- tok = S.switch3(token.SUB, token.SUB_ASSIGN, '-', token.DEC);
+ tok = S.switch3(token.SUB, token.SUB_ASSIGN, '-', token.DEC)
if tok == token.DEC {
insertSemi = true
}
@@ -577,16 +577,16 @@ scanAgain:
if S.ch == '/' || S.ch == '*' {
// comment
if S.insertSemi && S.findNewline(pos) {
- S.insertSemi = false; // newline consumed
- return pos, token.SEMICOLON, semicolon;
+ S.insertSemi = false // newline consumed
+ return pos, token.SEMICOLON, semicolon
}
- S.scanComment(pos);
+ S.scanComment(pos)
if S.mode&ScanComments == 0 {
// skip comment
- S.insertSemi = false; // newline consumed
- goto scanAgain;
+ S.insertSemi = false // newline consumed
+ goto scanAgain
}
- tok = token.COMMENT;
+ tok = token.COMMENT
} else {
tok = S.switch2(token.QUO, token.QUO_ASSIGN)
}
@@ -596,8 +596,8 @@ scanAgain:
tok = S.switch2(token.XOR, token.XOR_ASSIGN)
case '<':
if S.ch == '-' {
- S.next();
- tok = token.ARROW;
+ S.next()
+ tok = token.ARROW
} else {
tok = S.switch4(token.LSS, token.LEQ, '<', token.SHL, token.SHL_ASSIGN)
}
@@ -609,8 +609,8 @@ scanAgain:
tok = S.switch2(token.NOT, token.NEQ)
case '&':
if S.ch == '^' {
- S.next();
- tok = S.switch2(token.AND_NOT, token.AND_NOT_ASSIGN);
+ S.next()
+ tok = S.switch2(token.AND_NOT, token.AND_NOT_ASSIGN)
} else {
tok = S.switch3(token.AND, token.AND_ASSIGN, '&', token.LAND)
}
@@ -620,14 +620,14 @@ scanAgain:
if S.mode&AllowIllegalChars == 0 {
S.error(pos, "illegal character "+charString(ch))
}
- insertSemi = S.insertSemi; // preserve insertSemi info
+ insertSemi = S.insertSemi // preserve insertSemi info
}
}
if S.mode&InsertSemis != 0 {
S.insertSemi = insertSemi
}
- return pos, tok, S.src[pos.Offset:S.pos.Offset];
+ return pos, tok, S.src[pos.Offset:S.pos.Offset]
}
@@ -638,10 +638,10 @@ scanAgain:
// of errors encountered.
//
func Tokenize(filename string, src []byte, err ErrorHandler, mode uint, f func(pos token.Position, tok token.Token, lit []byte) bool) int {
- var s Scanner;
- s.Init(filename, src, err, mode);
+ var s Scanner
+ s.Init(filename, src, err, mode)
for f(s.Scan()) {
// action happens in f
}
- return s.ErrorCount;
+ return s.ErrorCount
}
diff --git a/src/pkg/go/scanner/scanner_test.go b/src/pkg/go/scanner/scanner_test.go
index b6d7e99ca..6ea4b2d58 100644
--- a/src/pkg/go/scanner/scanner_test.go
+++ b/src/pkg/go/scanner/scanner_test.go
@@ -5,18 +5,18 @@
package scanner
import (
- "go/token";
- "os";
- "strings";
- "testing";
+ "go/token"
+ "os"
+ "strings"
+ "testing"
)
const /* class */ (
- special = iota;
- literal;
- operator;
- keyword;
+ special = iota
+ literal
+ operator
+ keyword
)
@@ -29,14 +29,14 @@ func tokenclass(tok token.Token) int {
case tok.IsKeyword():
return keyword
}
- return special;
+ return special
}
type elt struct {
- tok token.Token;
- lit string;
- class int;
+ tok token.Token
+ lit string
+ class int
}
@@ -162,10 +162,10 @@ var tokens = [...]elt{
}
-const whitespace = " \t \n\n\n" // to separate tokens
+const whitespace = " \t \n\n\n" // to separate tokens
type TestErrorHandler struct {
- t *testing.T;
+ t *testing.T
}
func (h *TestErrorHandler) Error(pos token.Position, msg string) {
@@ -174,13 +174,13 @@ func (h *TestErrorHandler) Error(pos token.Position, msg string) {
func NewlineCount(s string) int {
- n := 0;
+ n := 0
for i := 0; i < len(s); i++ {
if s[i] == '\n' {
n++
}
}
- return n;
+ return n
}
@@ -203,27 +203,27 @@ func checkPos(t *testing.T, lit string, pos, expected token.Position) {
// Verify that calling Scan() provides the correct results.
func TestScan(t *testing.T) {
// make source
- var src string;
+ var src string
for _, e := range tokens {
src += e.lit + whitespace
}
- whitespace_linecount := NewlineCount(whitespace);
+ whitespace_linecount := NewlineCount(whitespace)
// verify scan
- index := 0;
- epos := token.Position{"", 0, 1, 1};
+ index := 0
+ epos := token.Position{"", 0, 1, 1}
nerrors := Tokenize("", strings.Bytes(src), &TestErrorHandler{t}, ScanComments,
func(pos token.Position, tok token.Token, litb []byte) bool {
- e := elt{token.EOF, "", special};
+ e := elt{token.EOF, "", special}
if index < len(tokens) {
e = tokens[index]
}
- lit := string(litb);
+ lit := string(litb)
if tok == token.EOF {
- lit = "<EOF>";
- epos.Column = 0;
+ lit = "<EOF>"
+ epos.Column = 0
}
- checkPos(t, lit, pos, epos);
+ checkPos(t, lit, pos, epos)
if tok != e.tok {
t.Errorf("bad token for %q: got %s, expected %s", lit, tok.String(), e.tok.String())
}
@@ -233,16 +233,16 @@ func TestScan(t *testing.T) {
if tokenclass(tok) != e.class {
t.Errorf("bad class for %q: got %d, expected %d", lit, tokenclass(tok), e.class)
}
- epos.Offset += len(lit) + len(whitespace);
- epos.Line += NewlineCount(lit) + whitespace_linecount;
+ epos.Offset += len(lit) + len(whitespace)
+ epos.Line += NewlineCount(lit) + whitespace_linecount
if tok == token.COMMENT && litb[1] == '/' {
// correct for unaccounted '/n' in //-style comment
- epos.Offset++;
- epos.Line++;
+ epos.Offset++
+ epos.Line++
}
- index++;
- return tok != token.EOF;
- });
+ index++
+ return tok != token.EOF
+ })
if nerrors != 0 {
t.Errorf("found %d errors", nerrors)
}
@@ -255,14 +255,14 @@ func getTok(_ token.Position, tok token.Token, _ []byte) token.Token {
func checkSemi(t *testing.T, line string, mode uint) {
- var S Scanner;
- S.Init("TestSemis", strings.Bytes(line), nil, mode);
- pos, tok, lit := S.Scan();
+ var S Scanner
+ S.Init("TestSemis", strings.Bytes(line), nil, mode)
+ pos, tok, lit := S.Scan()
for tok != token.EOF {
if tok == token.ILLEGAL {
// next token must be a semicolon
- offs := pos.Offset + 1;
- pos, tok, lit = S.Scan();
+ offs := pos.Offset + 1
+ pos, tok, lit = S.Scan()
if tok == token.SEMICOLON {
if pos.Offset != offs {
t.Errorf("bad offset for %q: got %d, expected %d", line, pos.Offset, offs)
@@ -276,7 +276,7 @@ func checkSemi(t *testing.T, line string, mode uint) {
} else if tok == token.SEMICOLON {
t.Errorf("bad token for %q: got ;, expected no ;", line)
}
- pos, tok, lit = S.Scan();
+ pos, tok, lit = S.Scan()
}
}
@@ -406,9 +406,9 @@ func TestSemis(t *testing.T) {
type seg struct {
- srcline string; // a line of source text
- filename string; // filename for current token
- line int; // line number for current token
+ srcline string // a line of source text
+ filename string // filename for current token
+ line int // line number for current token
}
@@ -416,15 +416,15 @@ var segments = []seg{
// exactly one token per line since the test consumes one token per segment
seg{" line1", "TestLineComments", 1},
seg{"\nline2", "TestLineComments", 2},
- seg{"\nline3 //line File1.go:100", "TestLineComments", 3}, // bad line comment, ignored
+ seg{"\nline3 //line File1.go:100", "TestLineComments", 3}, // bad line comment, ignored
seg{"\nline4", "TestLineComments", 4},
seg{"\n//line File1.go:100\n line100", "File1.go", 100},
seg{"\n//line File2.go:200\n line200", "File2.go", 200},
seg{"\n//line :1\n line1", "", 1},
seg{"\n//line foo:42\n line42", "foo", 42},
- seg{"\n //line foo:42\n line44", "foo", 44}, // bad line comment, ignored
- seg{"\n//line foo 42\n line46", "foo", 46}, // bad line comment, ignored
- seg{"\n//line foo:42 extra text\n line48", "foo", 48}, // bad line comment, ignored
+ seg{"\n //line foo:42\n line44", "foo", 44}, // bad line comment, ignored
+ seg{"\n//line foo 42\n line46", "foo", 46}, // bad line comment, ignored
+ seg{"\n//line foo:42 extra text\n line48", "foo", 48}, // bad line comment, ignored
seg{"\n//line foo:42\n line42", "foo", 42},
seg{"\n//line foo:42\n line42", "foo", 42},
seg{"\n//line File1.go:100\n line100", "File1.go", 100},
@@ -434,17 +434,17 @@ var segments = []seg{
// Verify that comments of the form "//line filename:line" are interpreted correctly.
func TestLineComments(t *testing.T) {
// make source
- var src string;
+ var src string
for _, e := range segments {
src += e.srcline
}
// verify scan
- var S Scanner;
- S.Init("TestLineComments", strings.Bytes(src), nil, 0);
+ var S Scanner
+ S.Init("TestLineComments", strings.Bytes(src), nil, 0)
for _, s := range segments {
- pos, _, lit := S.Scan();
- checkPos(t, string(lit), pos, token.Position{s.filename, pos.Offset, s.line, pos.Column});
+ pos, _, lit := S.Scan()
+ checkPos(t, string(lit), pos, token.Position{s.filename, pos.Offset, s.line, pos.Column})
}
if S.ErrorCount != 0 {
@@ -455,20 +455,20 @@ func TestLineComments(t *testing.T) {
// Verify that initializing the same scanner more then once works correctly.
func TestInit(t *testing.T) {
- var s Scanner;
+ var s Scanner
// 1st init
- s.Init("", strings.Bytes("if true { }"), nil, 0);
- s.Scan(); // if
- s.Scan(); // true
- _, tok, _ := s.Scan(); // {
+ s.Init("", strings.Bytes("if true { }"), nil, 0)
+ s.Scan() // if
+ s.Scan() // true
+ _, tok, _ := s.Scan() // {
if tok != token.LBRACE {
t.Errorf("bad token: got %s, expected %s", tok.String(), token.LBRACE)
}
// 2nd init
- s.Init("", strings.Bytes("go true { ]"), nil, 0);
- _, tok, _ = s.Scan(); // go
+ s.Init("", strings.Bytes("go true { ]"), nil, 0)
+ _, tok, _ = s.Scan() // go
if tok != token.GO {
t.Errorf("bad token: got %s, expected %s", tok.String(), token.GO)
}
@@ -480,12 +480,12 @@ func TestInit(t *testing.T) {
func TestIllegalChars(t *testing.T) {
- var s Scanner;
+ var s Scanner
- const src = "*?*$*@*";
- s.Init("", strings.Bytes(src), &TestErrorHandler{t}, AllowIllegalChars);
+ const src = "*?*$*@*"
+ s.Init("", strings.Bytes(src), &TestErrorHandler{t}, AllowIllegalChars)
for offs, ch := range src {
- pos, tok, lit := s.Scan();
+ pos, tok, lit := s.Scan()
if pos.Offset != offs {
t.Errorf("bad position for %s: got %d, expected %d", string(lit), pos.Offset, offs)
}
@@ -501,37 +501,37 @@ func TestIllegalChars(t *testing.T) {
func TestStdErrorHander(t *testing.T) {
- const src = "@\n" + // illegal character, cause an error
- "@ @\n" + // two errors on the same line
+ const src = "@\n" + // illegal character, cause an error
+ "@ @\n" + // two errors on the same line
"//line File2:20\n" +
- "@\n" + // different file, but same line
+ "@\n" + // different file, but same line
"//line File2:1\n" +
- "@ @\n" + // same file, decreasing line number
+ "@ @\n" + // same file, decreasing line number
"//line File1:1\n" +
- "@ @ @"; // original file, line 1 again
+ "@ @ @" // original file, line 1 again
- v := new(ErrorVector);
+ v := new(ErrorVector)
nerrors := Tokenize("File1", strings.Bytes(src), v, 0,
func(pos token.Position, tok token.Token, litb []byte) bool {
return tok != token.EOF
- });
+ })
- list := v.GetErrorList(Raw);
+ list := v.GetErrorList(Raw)
if len(list) != 9 {
- t.Errorf("found %d raw errors, expected 9", len(list));
- PrintError(os.Stderr, list);
+ t.Errorf("found %d raw errors, expected 9", len(list))
+ PrintError(os.Stderr, list)
}
- list = v.GetErrorList(Sorted);
+ list = v.GetErrorList(Sorted)
if len(list) != 9 {
- t.Errorf("found %d sorted errors, expected 9", len(list));
- PrintError(os.Stderr, list);
+ t.Errorf("found %d sorted errors, expected 9", len(list))
+ PrintError(os.Stderr, list)
}
- list = v.GetErrorList(NoMultiples);
+ list = v.GetErrorList(NoMultiples)
if len(list) != 4 {
- t.Errorf("found %d one-per-line errors, expected 4", len(list));
- PrintError(os.Stderr, list);
+ t.Errorf("found %d one-per-line errors, expected 4", len(list))
+ PrintError(os.Stderr, list)
}
if v.ErrorCount() != nerrors {
diff --git a/src/pkg/go/token/token.go b/src/pkg/go/token/token.go
index 10097efbd..95a35fed0 100644
--- a/src/pkg/go/token/token.go
+++ b/src/pkg/go/token/token.go
@@ -9,8 +9,8 @@
package token
import (
- "fmt";
- "strconv";
+ "fmt"
+ "strconv"
)
@@ -20,111 +20,111 @@ type Token int
// The list of tokens.
const (
// Special tokens
- ILLEGAL Token = iota;
- EOF;
- COMMENT;
+ ILLEGAL Token = iota
+ EOF
+ COMMENT
- literal_beg;
+ literal_beg
// Identifiers and basic type literals
// (these tokens stand for classes of literals)
- IDENT; // main
- INT; // 12345
- FLOAT; // 123.45
- CHAR; // 'a'
- STRING; // "abc"
- literal_end;
-
- operator_beg;
+ IDENT // main
+ INT // 12345
+ FLOAT // 123.45
+ CHAR // 'a'
+ STRING // "abc"
+ literal_end
+
+ operator_beg
// Operators and delimiters
- ADD; // +
- SUB; // -
- MUL; // *
- QUO; // /
- REM; // %
-
- AND; // &
- OR; // |
- XOR; // ^
- SHL; // <<
- SHR; // >>
- AND_NOT; // &^
-
- ADD_ASSIGN; // +=
- SUB_ASSIGN; // -=
- MUL_ASSIGN; // *=
- QUO_ASSIGN; // /=
- REM_ASSIGN; // %=
-
- AND_ASSIGN; // &=
- OR_ASSIGN; // |=
- XOR_ASSIGN; // ^=
- SHL_ASSIGN; // <<=
- SHR_ASSIGN; // >>=
- AND_NOT_ASSIGN; // &^=
-
- LAND; // &&
- LOR; // ||
- ARROW; // <-
- INC; // ++
- DEC; // --
-
- EQL; // ==
- LSS; // <
- GTR; // >
- ASSIGN; // =
- NOT; // !
-
- NEQ; // !=
- LEQ; // <=
- GEQ; // >=
- DEFINE; // :=
- ELLIPSIS; // ...
-
- LPAREN; // (
- LBRACK; // [
- LBRACE; // {
- COMMA; // ,
- PERIOD; // .
-
- RPAREN; // )
- RBRACK; // ]
- RBRACE; // }
- SEMICOLON; // ;
- COLON; // :
- operator_end;
-
- keyword_beg;
+ ADD // +
+ SUB // -
+ MUL // *
+ QUO // /
+ REM // %
+
+ AND // &
+ OR // |
+ XOR // ^
+ SHL // <<
+ SHR // >>
+ AND_NOT // &^
+
+ ADD_ASSIGN // +=
+ SUB_ASSIGN // -=
+ MUL_ASSIGN // *=
+ QUO_ASSIGN // /=
+ REM_ASSIGN // %=
+
+ AND_ASSIGN // &=
+ OR_ASSIGN // |=
+ XOR_ASSIGN // ^=
+ SHL_ASSIGN // <<=
+ SHR_ASSIGN // >>=
+ AND_NOT_ASSIGN // &^=
+
+ LAND // &&
+ LOR // ||
+ ARROW // <-
+ INC // ++
+ DEC // --
+
+ EQL // ==
+ LSS // <
+ GTR // >
+ ASSIGN // =
+ NOT // !
+
+ NEQ // !=
+ LEQ // <=
+ GEQ // >=
+ DEFINE // :=
+ ELLIPSIS // ...
+
+ LPAREN // (
+ LBRACK // [
+ LBRACE // {
+ COMMA // ,
+ PERIOD // .
+
+ RPAREN // )
+ RBRACK // ]
+ RBRACE // }
+ SEMICOLON // ;
+ COLON // :
+ operator_end
+
+ keyword_beg
// Keywords
- BREAK;
- CASE;
- CHAN;
- CONST;
- CONTINUE;
-
- DEFAULT;
- DEFER;
- ELSE;
- FALLTHROUGH;
- FOR;
-
- FUNC;
- GO;
- GOTO;
- IF;
- IMPORT;
-
- INTERFACE;
- MAP;
- PACKAGE;
- RANGE;
- RETURN;
-
- SELECT;
- STRUCT;
- SWITCH;
- TYPE;
- VAR;
- keyword_end;
+ BREAK
+ CASE
+ CHAN
+ CONST
+ CONTINUE
+
+ DEFAULT
+ DEFER
+ ELSE
+ FALLTHROUGH
+ FOR
+
+ FUNC
+ GO
+ GOTO
+ IF
+ IMPORT
+
+ INTERFACE
+ MAP
+ PACKAGE
+ RANGE
+ RETURN
+
+ SELECT
+ STRUCT
+ SWITCH
+ TYPE
+ VAR
+ keyword_end
)
@@ -241,7 +241,7 @@ func (tok Token) String() string {
if str, exists := tokens[tok]; exists {
return str
}
- return "token(" + strconv.Itoa(int(tok)) + ")";
+ return "token(" + strconv.Itoa(int(tok)) + ")"
}
@@ -252,9 +252,9 @@ func (tok Token) String() string {
// selector, indexing, and other operator and delimiter tokens.
//
const (
- LowestPrec = 0; // non-operators
- UnaryPrec = 7;
- HighestPrec = 8;
+ LowestPrec = 0 // non-operators
+ UnaryPrec = 7
+ HighestPrec = 8
)
@@ -277,14 +277,14 @@ func (op Token) Precedence() int {
case MUL, QUO, REM, SHL, SHR, AND, AND_NOT:
return 6
}
- return LowestPrec;
+ return LowestPrec
}
var keywords map[string]Token
func init() {
- keywords = make(map[string]Token);
+ keywords = make(map[string]Token)
for i := keyword_beg + 1; i < keyword_end; i++ {
keywords[tokens[i]] = i
}
@@ -299,7 +299,7 @@ func Lookup(ident []byte) Token {
if tok, is_keyword := keywords[string(ident)]; is_keyword {
return tok
}
- return IDENT;
+ return IDENT
}
@@ -308,50 +308,50 @@ func Lookup(ident []byte) Token {
// IsLiteral returns true for tokens corresponding to identifiers
// and basic type literals; returns false otherwise.
//
-func (tok Token) IsLiteral() bool { return literal_beg < tok && tok < literal_end }
+func (tok Token) IsLiteral() bool { return literal_beg < tok && tok < literal_end }
// IsOperator returns true for tokens corresponding to operators and
// delimiters; returns false otherwise.
//
-func (tok Token) IsOperator() bool { return operator_beg < tok && tok < operator_end }
+func (tok Token) IsOperator() bool { return operator_beg < tok && tok < operator_end }
// IsKeyword returns true for tokens corresponding to keywords;
// returns false otherwise.
//
-func (tok Token) IsKeyword() bool { return keyword_beg < tok && tok < keyword_end }
+func (tok Token) IsKeyword() bool { return keyword_beg < tok && tok < keyword_end }
// Token source positions are represented by a Position value.
// A Position is valid if the line number is > 0.
//
type Position struct {
- Filename string; // filename, if any
- Offset int; // byte offset, starting at 0
- Line int; // line number, starting at 1
- Column int; // column number, starting at 1 (character count)
+ Filename string // filename, if any
+ Offset int // byte offset, starting at 0
+ Line int // line number, starting at 1
+ Column int // column number, starting at 1 (character count)
}
// Pos is an accessor method for anonymous Position fields.
// It returns its receiver.
//
-func (pos *Position) Pos() Position { return *pos }
+func (pos *Position) Pos() Position { return *pos }
// IsValid returns true if the position is valid.
-func (pos *Position) IsValid() bool { return pos.Line > 0 }
+func (pos *Position) IsValid() bool { return pos.Line > 0 }
func (pos Position) String() string {
- s := pos.Filename;
+ s := pos.Filename
if pos.IsValid() {
if s != "" {
s += ":"
}
- s += fmt.Sprintf("%d:%d", pos.Line, pos.Column);
+ s += fmt.Sprintf("%d:%d", pos.Line, pos.Column)
}
if s == "" {
s = "???"
}
- return s;
+ return s
}
diff --git a/src/pkg/gob/codec_test.go b/src/pkg/gob/codec_test.go
index c5d070155..1c4fe1fc7 100644
--- a/src/pkg/gob/codec_test.go
+++ b/src/pkg/gob/codec_test.go
@@ -5,19 +5,19 @@
package gob
import (
- "bytes";
- "math";
- "os";
- "reflect";
- "strings";
- "testing";
- "unsafe";
+ "bytes"
+ "math"
+ "os"
+ "reflect"
+ "strings"
+ "testing"
+ "unsafe"
)
// Guarantee encoding format by comparing some encodings to hand-written values
type EncodeT struct {
- x uint64;
- b []byte;
+ x uint64
+ b []byte
}
var encodeT = []EncodeT{
@@ -39,12 +39,12 @@ var encodeT = []EncodeT{
// Test basic encode/decode routines for unsigned integers
func TestUintCodec(t *testing.T) {
- b := new(bytes.Buffer);
- encState := new(encoderState);
- encState.b = b;
+ b := new(bytes.Buffer)
+ encState := new(encoderState)
+ encState.b = b
for _, tt := range encodeT {
- b.Reset();
- encodeUint(encState, tt.x);
+ b.Reset()
+ encodeUint(encState, tt.x)
if encState.err != nil {
t.Error("encodeUint:", tt.x, encState.err)
}
@@ -52,14 +52,14 @@ func TestUintCodec(t *testing.T) {
t.Errorf("encodeUint: %#x encode: expected % x got % x", tt.x, tt.b, b.Bytes())
}
}
- decState := newDecodeState(b);
+ decState := newDecodeState(b)
for u := uint64(0); ; u = (u + 1) * 7 {
- b.Reset();
- encodeUint(encState, u);
+ b.Reset()
+ encodeUint(encState, u)
if encState.err != nil {
t.Error("encodeUint:", u, encState.err)
}
- v := decodeUint(decState);
+ v := decodeUint(decState)
if decState.err != nil {
t.Error("DecodeUint:", u, decState.err)
}
@@ -73,16 +73,16 @@ func TestUintCodec(t *testing.T) {
}
func verifyInt(i int64, t *testing.T) {
- var b = new(bytes.Buffer);
- encState := new(encoderState);
- encState.b = b;
- encodeInt(encState, i);
+ var b = new(bytes.Buffer)
+ encState := new(encoderState)
+ encState.b = b
+ encodeInt(encState, i)
if encState.err != nil {
t.Error("encodeInt:", i, encState.err)
}
- decState := newDecodeState(b);
- decState.buf = make([]byte, 8);
- j := decodeInt(decState);
+ decState := newDecodeState(b)
+ decState.buf = make([]byte, 8)
+ j := decodeInt(decState)
if decState.err != nil {
t.Error("DecodeInt:", i, decState.err)
}
@@ -95,15 +95,15 @@ func verifyInt(i int64, t *testing.T) {
func TestIntCodec(t *testing.T) {
for u := uint64(0); ; u = (u + 1) * 7 {
// Do positive and negative values
- i := int64(u);
- verifyInt(i, t);
- verifyInt(-i, t);
- verifyInt(^i, t);
+ i := int64(u)
+ verifyInt(i, t)
+ verifyInt(-i, t)
+ verifyInt(^i, t)
if u&(1<<63) != 0 {
break
}
}
- verifyInt(-1<<63, t); // a tricky case
+ verifyInt(-1<<63, t) // a tricky case
}
// The result of encoding a true boolean with field number 7
@@ -116,24 +116,24 @@ var floatResult = []byte{0x07, 0xFE, 0x31, 0x40}
var bytesResult = []byte{0x07, 0x05, 'h', 'e', 'l', 'l', 'o'}
func newencoderState(b *bytes.Buffer) *encoderState {
- b.Reset();
- state := new(encoderState);
- state.b = b;
- state.fieldnum = -1;
- return state;
+ b.Reset()
+ state := new(encoderState)
+ state.b = b
+ state.fieldnum = -1
+ return state
}
// Test instruction execution for encoding.
// Do not run the machine yet; instead do individual instructions crafted by hand.
func TestScalarEncInstructions(t *testing.T) {
- var b = new(bytes.Buffer);
+ var b = new(bytes.Buffer)
// bool
{
- data := struct{ a bool }{true};
- instr := &encInstr{encBool, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ data := struct{ a bool }{true}
+ instr := &encInstr{encBool, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(boolResult, b.Bytes()) {
t.Errorf("bool enc instructions: expected % x got % x", boolResult, b.Bytes())
}
@@ -141,11 +141,11 @@ func TestScalarEncInstructions(t *testing.T) {
// int
{
- b.Reset();
- data := struct{ a int }{17};
- instr := &encInstr{encInt, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a int }{17}
+ instr := &encInstr{encInt, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(signedResult, b.Bytes()) {
t.Errorf("int enc instructions: expected % x got % x", signedResult, b.Bytes())
}
@@ -153,11 +153,11 @@ func TestScalarEncInstructions(t *testing.T) {
// uint
{
- b.Reset();
- data := struct{ a uint }{17};
- instr := &encInstr{encUint, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a uint }{17}
+ instr := &encInstr{encUint, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(unsignedResult, b.Bytes()) {
t.Errorf("uint enc instructions: expected % x got % x", unsignedResult, b.Bytes())
}
@@ -165,11 +165,11 @@ func TestScalarEncInstructions(t *testing.T) {
// int8
{
- b.Reset();
- data := struct{ a int8 }{17};
- instr := &encInstr{encInt8, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a int8 }{17}
+ instr := &encInstr{encInt8, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(signedResult, b.Bytes()) {
t.Errorf("int8 enc instructions: expected % x got % x", signedResult, b.Bytes())
}
@@ -177,11 +177,11 @@ func TestScalarEncInstructions(t *testing.T) {
// uint8
{
- b.Reset();
- data := struct{ a uint8 }{17};
- instr := &encInstr{encUint8, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a uint8 }{17}
+ instr := &encInstr{encUint8, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(unsignedResult, b.Bytes()) {
t.Errorf("uint8 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
}
@@ -189,11 +189,11 @@ func TestScalarEncInstructions(t *testing.T) {
// int16
{
- b.Reset();
- data := struct{ a int16 }{17};
- instr := &encInstr{encInt16, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a int16 }{17}
+ instr := &encInstr{encInt16, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(signedResult, b.Bytes()) {
t.Errorf("int16 enc instructions: expected % x got % x", signedResult, b.Bytes())
}
@@ -201,11 +201,11 @@ func TestScalarEncInstructions(t *testing.T) {
// uint16
{
- b.Reset();
- data := struct{ a uint16 }{17};
- instr := &encInstr{encUint16, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a uint16 }{17}
+ instr := &encInstr{encUint16, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(unsignedResult, b.Bytes()) {
t.Errorf("uint16 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
}
@@ -213,11 +213,11 @@ func TestScalarEncInstructions(t *testing.T) {
// int32
{
- b.Reset();
- data := struct{ a int32 }{17};
- instr := &encInstr{encInt32, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a int32 }{17}
+ instr := &encInstr{encInt32, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(signedResult, b.Bytes()) {
t.Errorf("int32 enc instructions: expected % x got % x", signedResult, b.Bytes())
}
@@ -225,11 +225,11 @@ func TestScalarEncInstructions(t *testing.T) {
// uint32
{
- b.Reset();
- data := struct{ a uint32 }{17};
- instr := &encInstr{encUint32, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a uint32 }{17}
+ instr := &encInstr{encUint32, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(unsignedResult, b.Bytes()) {
t.Errorf("uint32 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
}
@@ -237,11 +237,11 @@ func TestScalarEncInstructions(t *testing.T) {
// int64
{
- b.Reset();
- data := struct{ a int64 }{17};
- instr := &encInstr{encInt64, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a int64 }{17}
+ instr := &encInstr{encInt64, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(signedResult, b.Bytes()) {
t.Errorf("int64 enc instructions: expected % x got % x", signedResult, b.Bytes())
}
@@ -249,11 +249,11 @@ func TestScalarEncInstructions(t *testing.T) {
// uint64
{
- b.Reset();
- data := struct{ a uint64 }{17};
- instr := &encInstr{encUint64, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a uint64 }{17}
+ instr := &encInstr{encUint64, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(unsignedResult, b.Bytes()) {
t.Errorf("uint64 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
}
@@ -261,11 +261,11 @@ func TestScalarEncInstructions(t *testing.T) {
// float
{
- b.Reset();
- data := struct{ a float }{17};
- instr := &encInstr{encFloat, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a float }{17}
+ instr := &encInstr{encFloat, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(floatResult, b.Bytes()) {
t.Errorf("float enc instructions: expected % x got % x", floatResult, b.Bytes())
}
@@ -273,11 +273,11 @@ func TestScalarEncInstructions(t *testing.T) {
// float32
{
- b.Reset();
- data := struct{ a float32 }{17};
- instr := &encInstr{encFloat32, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a float32 }{17}
+ instr := &encInstr{encFloat32, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(floatResult, b.Bytes()) {
t.Errorf("float32 enc instructions: expected % x got % x", floatResult, b.Bytes())
}
@@ -285,11 +285,11 @@ func TestScalarEncInstructions(t *testing.T) {
// float64
{
- b.Reset();
- data := struct{ a float64 }{17};
- instr := &encInstr{encFloat64, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a float64 }{17}
+ instr := &encInstr{encFloat64, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(floatResult, b.Bytes()) {
t.Errorf("float64 enc instructions: expected % x got % x", floatResult, b.Bytes())
}
@@ -297,11 +297,11 @@ func TestScalarEncInstructions(t *testing.T) {
// bytes == []uint8
{
- b.Reset();
- data := struct{ a []byte }{strings.Bytes("hello")};
- instr := &encInstr{encUint8Array, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a []byte }{strings.Bytes("hello")}
+ instr := &encInstr{encUint8Array, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(bytesResult, b.Bytes()) {
t.Errorf("bytes enc instructions: expected % x got % x", bytesResult, b.Bytes())
}
@@ -309,11 +309,11 @@ func TestScalarEncInstructions(t *testing.T) {
// string
{
- b.Reset();
- data := struct{ a string }{"hello"};
- instr := &encInstr{encString, 6, 0, 0};
- state := newencoderState(b);
- instr.op(instr, state, unsafe.Pointer(&data));
+ b.Reset()
+ data := struct{ a string }{"hello"}
+ instr := &encInstr{encString, 6, 0, 0}
+ state := newencoderState(b)
+ instr.op(instr, state, unsafe.Pointer(&data))
if !bytes.Equal(bytesResult, b.Bytes()) {
t.Errorf("string enc instructions: expected % x got % x", bytesResult, b.Bytes())
}
@@ -321,36 +321,36 @@ func TestScalarEncInstructions(t *testing.T) {
}
func execDec(typ string, instr *decInstr, state *decodeState, t *testing.T, p unsafe.Pointer) {
- v := int(decodeUint(state));
+ v := int(decodeUint(state))
if state.err != nil {
t.Fatalf("decoding %s field: %v", typ, state.err)
}
if v+state.fieldnum != 6 {
t.Fatalf("decoding field number %d, got %d", 6, v+state.fieldnum)
}
- instr.op(instr, state, decIndirect(p, instr.indir));
- state.fieldnum = 6;
+ instr.op(instr, state, decIndirect(p, instr.indir))
+ state.fieldnum = 6
}
func newDecodeStateFromData(data []byte) *decodeState {
- state := newDecodeState(bytes.NewBuffer(data));
- state.fieldnum = -1;
- return state;
+ state := newDecodeState(bytes.NewBuffer(data))
+ state.fieldnum = -1
+ return state
}
// Test instruction execution for decoding.
// Do not run the machine yet; instead do individual instructions crafted by hand.
func TestScalarDecInstructions(t *testing.T) {
- ovfl := os.ErrorString("overflow");
+ ovfl := os.ErrorString("overflow")
// bool
{
var data struct {
- a bool;
+ a bool
}
- instr := &decInstr{decBool, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(boolResult);
- execDec("bool", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decBool, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(boolResult)
+ execDec("bool", instr, state, t, unsafe.Pointer(&data))
if data.a != true {
t.Errorf("bool a = %v not true", data.a)
}
@@ -358,11 +358,11 @@ func TestScalarDecInstructions(t *testing.T) {
// int
{
var data struct {
- a int;
+ a int
}
- instr := &decInstr{decOpMap[valueKind(data.a)], 6, 0, 0, ovfl};
- state := newDecodeStateFromData(signedResult);
- execDec("int", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decOpMap[valueKind(data.a)], 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(signedResult)
+ execDec("int", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("int a = %v not 17", data.a)
}
@@ -371,11 +371,11 @@ func TestScalarDecInstructions(t *testing.T) {
// uint
{
var data struct {
- a uint;
+ a uint
}
- instr := &decInstr{decOpMap[valueKind(data.a)], 6, 0, 0, ovfl};
- state := newDecodeStateFromData(unsignedResult);
- execDec("uint", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decOpMap[valueKind(data.a)], 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(unsignedResult)
+ execDec("uint", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("uint a = %v not 17", data.a)
}
@@ -384,11 +384,11 @@ func TestScalarDecInstructions(t *testing.T) {
// int8
{
var data struct {
- a int8;
+ a int8
}
- instr := &decInstr{decInt8, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(signedResult);
- execDec("int8", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decInt8, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(signedResult)
+ execDec("int8", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("int8 a = %v not 17", data.a)
}
@@ -397,11 +397,11 @@ func TestScalarDecInstructions(t *testing.T) {
// uint8
{
var data struct {
- a uint8;
+ a uint8
}
- instr := &decInstr{decUint8, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(unsignedResult);
- execDec("uint8", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decUint8, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(unsignedResult)
+ execDec("uint8", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("uint8 a = %v not 17", data.a)
}
@@ -410,11 +410,11 @@ func TestScalarDecInstructions(t *testing.T) {
// int16
{
var data struct {
- a int16;
+ a int16
}
- instr := &decInstr{decInt16, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(signedResult);
- execDec("int16", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decInt16, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(signedResult)
+ execDec("int16", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("int16 a = %v not 17", data.a)
}
@@ -423,11 +423,11 @@ func TestScalarDecInstructions(t *testing.T) {
// uint16
{
var data struct {
- a uint16;
+ a uint16
}
- instr := &decInstr{decUint16, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(unsignedResult);
- execDec("uint16", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decUint16, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(unsignedResult)
+ execDec("uint16", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("uint16 a = %v not 17", data.a)
}
@@ -436,11 +436,11 @@ func TestScalarDecInstructions(t *testing.T) {
// int32
{
var data struct {
- a int32;
+ a int32
}
- instr := &decInstr{decInt32, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(signedResult);
- execDec("int32", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decInt32, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(signedResult)
+ execDec("int32", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("int32 a = %v not 17", data.a)
}
@@ -449,11 +449,11 @@ func TestScalarDecInstructions(t *testing.T) {
// uint32
{
var data struct {
- a uint32;
+ a uint32
}
- instr := &decInstr{decUint32, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(unsignedResult);
- execDec("uint32", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decUint32, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(unsignedResult)
+ execDec("uint32", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("uint32 a = %v not 17", data.a)
}
@@ -462,11 +462,11 @@ func TestScalarDecInstructions(t *testing.T) {
// uintptr
{
var data struct {
- a uintptr;
+ a uintptr
}
- instr := &decInstr{decOpMap[valueKind(data.a)], 6, 0, 0, ovfl};
- state := newDecodeStateFromData(unsignedResult);
- execDec("uintptr", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decOpMap[valueKind(data.a)], 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(unsignedResult)
+ execDec("uintptr", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("uintptr a = %v not 17", data.a)
}
@@ -475,11 +475,11 @@ func TestScalarDecInstructions(t *testing.T) {
// int64
{
var data struct {
- a int64;
+ a int64
}
- instr := &decInstr{decInt64, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(signedResult);
- execDec("int64", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decInt64, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(signedResult)
+ execDec("int64", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("int64 a = %v not 17", data.a)
}
@@ -488,11 +488,11 @@ func TestScalarDecInstructions(t *testing.T) {
// uint64
{
var data struct {
- a uint64;
+ a uint64
}
- instr := &decInstr{decUint64, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(unsignedResult);
- execDec("uint64", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decUint64, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(unsignedResult)
+ execDec("uint64", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("uint64 a = %v not 17", data.a)
}
@@ -501,11 +501,11 @@ func TestScalarDecInstructions(t *testing.T) {
// float
{
var data struct {
- a float;
+ a float
}
- instr := &decInstr{decOpMap[valueKind(data.a)], 6, 0, 0, ovfl};
- state := newDecodeStateFromData(floatResult);
- execDec("float", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decOpMap[valueKind(data.a)], 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(floatResult)
+ execDec("float", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("float a = %v not 17", data.a)
}
@@ -514,11 +514,11 @@ func TestScalarDecInstructions(t *testing.T) {
// float32
{
var data struct {
- a float32;
+ a float32
}
- instr := &decInstr{decFloat32, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(floatResult);
- execDec("float32", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decFloat32, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(floatResult)
+ execDec("float32", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("float32 a = %v not 17", data.a)
}
@@ -527,11 +527,11 @@ func TestScalarDecInstructions(t *testing.T) {
// float64
{
var data struct {
- a float64;
+ a float64
}
- instr := &decInstr{decFloat64, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(floatResult);
- execDec("float64", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decFloat64, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(floatResult)
+ execDec("float64", instr, state, t, unsafe.Pointer(&data))
if data.a != 17 {
t.Errorf("float64 a = %v not 17", data.a)
}
@@ -540,11 +540,11 @@ func TestScalarDecInstructions(t *testing.T) {
// bytes == []uint8
{
var data struct {
- a []byte;
+ a []byte
}
- instr := &decInstr{decUint8Array, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(bytesResult);
- execDec("bytes", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decUint8Array, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(bytesResult)
+ execDec("bytes", instr, state, t, unsafe.Pointer(&data))
if string(data.a) != "hello" {
t.Errorf(`bytes a = %q not "hello"`, string(data.a))
}
@@ -553,11 +553,11 @@ func TestScalarDecInstructions(t *testing.T) {
// string
{
var data struct {
- a string;
+ a string
}
- instr := &decInstr{decString, 6, 0, 0, ovfl};
- state := newDecodeStateFromData(bytesResult);
- execDec("bytes", instr, state, t, unsafe.Pointer(&data));
+ instr := &decInstr{decString, 6, 0, 0, ovfl}
+ state := newDecodeStateFromData(bytesResult)
+ execDec("bytes", instr, state, t, unsafe.Pointer(&data))
if data.a != "hello" {
t.Errorf(`bytes a = %q not "hello"`, data.a)
}
@@ -566,18 +566,18 @@ func TestScalarDecInstructions(t *testing.T) {
func TestEndToEnd(t *testing.T) {
type T2 struct {
- t string;
+ t string
}
- s1 := "string1";
- s2 := "string2";
+ s1 := "string1"
+ s2 := "string2"
type T1 struct {
- a, b, c int;
- n *[3]float;
- strs *[2]string;
- int64s *[]int64;
- s string;
- y []byte;
- t *T2;
+ a, b, c int
+ n *[3]float
+ strs *[2]string
+ int64s *[]int64
+ s string
+ y []byte
+ t *T2
}
t1 := &T1{
a: 17,
@@ -589,14 +589,14 @@ func TestEndToEnd(t *testing.T) {
s: "Now is the time",
y: strings.Bytes("hello, sailor"),
t: &T2{"this is T2"},
- };
- b := new(bytes.Buffer);
- err := NewEncoder(b).Encode(t1);
+ }
+ b := new(bytes.Buffer)
+ err := NewEncoder(b).Encode(t1)
if err != nil {
t.Error("encode:", err)
}
- var _t1 T1;
- err = NewDecoder(b).Decode(&_t1);
+ var _t1 T1
+ err = NewDecoder(b).Decode(&_t1)
if err != nil {
t.Fatal("decode:", err)
}
@@ -607,150 +607,150 @@ func TestEndToEnd(t *testing.T) {
func TestOverflow(t *testing.T) {
type inputT struct {
- maxi int64;
- mini int64;
- maxu uint64;
- maxf float64;
- minf float64;
- }
- var it inputT;
- var err os.Error;
- b := new(bytes.Buffer);
- enc := NewEncoder(b);
- dec := NewDecoder(b);
+ maxi int64
+ mini int64
+ maxu uint64
+ maxf float64
+ minf float64
+ }
+ var it inputT
+ var err os.Error
+ b := new(bytes.Buffer)
+ enc := NewEncoder(b)
+ dec := NewDecoder(b)
// int8
- b.Reset();
+ b.Reset()
it = inputT{
maxi: math.MaxInt8 + 1,
- };
+ }
type outi8 struct {
- maxi int8;
- mini int8;
+ maxi int8
+ mini int8
}
- var o1 outi8;
- enc.Encode(it);
- err = dec.Decode(&o1);
+ var o1 outi8
+ enc.Encode(it)
+ err = dec.Decode(&o1)
if err == nil || err.String() != `value for "maxi" out of range` {
t.Error("wrong overflow error for int8:", err)
}
it = inputT{
mini: math.MinInt8 - 1,
- };
- b.Reset();
- enc.Encode(it);
- err = dec.Decode(&o1);
+ }
+ b.Reset()
+ enc.Encode(it)
+ err = dec.Decode(&o1)
if err == nil || err.String() != `value for "mini" out of range` {
t.Error("wrong underflow error for int8:", err)
}
// int16
- b.Reset();
+ b.Reset()
it = inputT{
maxi: math.MaxInt16 + 1,
- };
+ }
type outi16 struct {
- maxi int16;
- mini int16;
+ maxi int16
+ mini int16
}
- var o2 outi16;
- enc.Encode(it);
- err = dec.Decode(&o2);
+ var o2 outi16
+ enc.Encode(it)
+ err = dec.Decode(&o2)
if err == nil || err.String() != `value for "maxi" out of range` {
t.Error("wrong overflow error for int16:", err)
}
it = inputT{
mini: math.MinInt16 - 1,
- };
- b.Reset();
- enc.Encode(it);
- err = dec.Decode(&o2);
+ }
+ b.Reset()
+ enc.Encode(it)
+ err = dec.Decode(&o2)
if err == nil || err.String() != `value for "mini" out of range` {
t.Error("wrong underflow error for int16:", err)
}
// int32
- b.Reset();
+ b.Reset()
it = inputT{
maxi: math.MaxInt32 + 1,
- };
+ }
type outi32 struct {
- maxi int32;
- mini int32;
+ maxi int32
+ mini int32
}
- var o3 outi32;
- enc.Encode(it);
- err = dec.Decode(&o3);
+ var o3 outi32
+ enc.Encode(it)
+ err = dec.Decode(&o3)
if err == nil || err.String() != `value for "maxi" out of range` {
t.Error("wrong overflow error for int32:", err)
}
it = inputT{
mini: math.MinInt32 - 1,
- };
- b.Reset();
- enc.Encode(it);
- err = dec.Decode(&o3);
+ }
+ b.Reset()
+ enc.Encode(it)
+ err = dec.Decode(&o3)
if err == nil || err.String() != `value for "mini" out of range` {
t.Error("wrong underflow error for int32:", err)
}
// uint8
- b.Reset();
+ b.Reset()
it = inputT{
maxu: math.MaxUint8 + 1,
- };
+ }
type outu8 struct {
- maxu uint8;
+ maxu uint8
}
- var o4 outu8;
- enc.Encode(it);
- err = dec.Decode(&o4);
+ var o4 outu8
+ enc.Encode(it)
+ err = dec.Decode(&o4)
if err == nil || err.String() != `value for "maxu" out of range` {
t.Error("wrong overflow error for uint8:", err)
}
// uint16
- b.Reset();
+ b.Reset()
it = inputT{
maxu: math.MaxUint16 + 1,
- };
+ }
type outu16 struct {
- maxu uint16;
+ maxu uint16
}
- var o5 outu16;
- enc.Encode(it);
- err = dec.Decode(&o5);
+ var o5 outu16
+ enc.Encode(it)
+ err = dec.Decode(&o5)
if err == nil || err.String() != `value for "maxu" out of range` {
t.Error("wrong overflow error for uint16:", err)
}
// uint32
- b.Reset();
+ b.Reset()
it = inputT{
maxu: math.MaxUint32 + 1,
- };
+ }
type outu32 struct {
- maxu uint32;
+ maxu uint32
}
- var o6 outu32;
- enc.Encode(it);
- err = dec.Decode(&o6);
+ var o6 outu32
+ enc.Encode(it)
+ err = dec.Decode(&o6)
if err == nil || err.String() != `value for "maxu" out of range` {
t.Error("wrong overflow error for uint32:", err)
}
// float32
- b.Reset();
+ b.Reset()
it = inputT{
maxf: math.MaxFloat32 * 2,
- };
+ }
type outf32 struct {
- maxf float32;
- minf float32;
+ maxf float32
+ minf float32
}
- var o7 outf32;
- enc.Encode(it);
- err = dec.Decode(&o7);
+ var o7 outf32
+ enc.Encode(it)
+ err = dec.Decode(&o7)
if err == nil || err.String() != `value for "maxf" out of range` {
t.Error("wrong overflow error for float32:", err)
}
@@ -759,18 +759,18 @@ func TestOverflow(t *testing.T) {
func TestNesting(t *testing.T) {
type RT struct {
- a string;
- next *RT;
- }
- rt := new(RT);
- rt.a = "level1";
- rt.next = new(RT);
- rt.next.a = "level2";
- b := new(bytes.Buffer);
- NewEncoder(b).Encode(rt);
- var drt RT;
- dec := NewDecoder(b);
- err := dec.Decode(&drt);
+ a string
+ next *RT
+ }
+ rt := new(RT)
+ rt.a = "level1"
+ rt.next = new(RT)
+ rt.next.a = "level2"
+ b := new(bytes.Buffer)
+ NewEncoder(b).Encode(rt)
+ var drt RT
+ dec := NewDecoder(b)
+ err := dec.Decode(&drt)
if err != nil {
t.Errorf("decoder error:", err)
}
@@ -787,122 +787,122 @@ func TestNesting(t *testing.T) {
// These three structures have the same data with different indirections
type T0 struct {
- a int;
- b int;
- c int;
- d int;
+ a int
+ b int
+ c int
+ d int
}
type T1 struct {
- a int;
- b *int;
- c **int;
- d ***int;
+ a int
+ b *int
+ c **int
+ d ***int
}
type T2 struct {
- a ***int;
- b **int;
- c *int;
- d int;
+ a ***int
+ b **int
+ c *int
+ d int
}
func TestAutoIndirection(t *testing.T) {
// First transfer t1 into t0
- var t1 T1;
- t1.a = 17;
- t1.b = new(int);
- *t1.b = 177;
- t1.c = new(*int);
- *t1.c = new(int);
- **t1.c = 1777;
- t1.d = new(**int);
- *t1.d = new(*int);
- **t1.d = new(int);
- ***t1.d = 17777;
- b := new(bytes.Buffer);
- enc := NewEncoder(b);
- enc.Encode(t1);
- dec := NewDecoder(b);
- var t0 T0;
- dec.Decode(&t0);
+ var t1 T1
+ t1.a = 17
+ t1.b = new(int)
+ *t1.b = 177
+ t1.c = new(*int)
+ *t1.c = new(int)
+ **t1.c = 1777
+ t1.d = new(**int)
+ *t1.d = new(*int)
+ **t1.d = new(int)
+ ***t1.d = 17777
+ b := new(bytes.Buffer)
+ enc := NewEncoder(b)
+ enc.Encode(t1)
+ dec := NewDecoder(b)
+ var t0 T0
+ dec.Decode(&t0)
if t0.a != 17 || t0.b != 177 || t0.c != 1777 || t0.d != 17777 {
t.Errorf("t1->t0: expected {17 177 1777 17777}; got %v", t0)
}
// Now transfer t2 into t0
- var t2 T2;
- t2.d = 17777;
- t2.c = new(int);
- *t2.c = 1777;
- t2.b = new(*int);
- *t2.b = new(int);
- **t2.b = 177;
- t2.a = new(**int);
- *t2.a = new(*int);
- **t2.a = new(int);
- ***t2.a = 17;
- b.Reset();
- enc.Encode(t2);
- t0 = T0{};
- dec.Decode(&t0);
+ var t2 T2
+ t2.d = 17777
+ t2.c = new(int)
+ *t2.c = 1777
+ t2.b = new(*int)
+ *t2.b = new(int)
+ **t2.b = 177
+ t2.a = new(**int)
+ *t2.a = new(*int)
+ **t2.a = new(int)
+ ***t2.a = 17
+ b.Reset()
+ enc.Encode(t2)
+ t0 = T0{}
+ dec.Decode(&t0)
if t0.a != 17 || t0.b != 177 || t0.c != 1777 || t0.d != 17777 {
t.Errorf("t2->t0 expected {17 177 1777 17777}; got %v", t0)
}
// Now transfer t0 into t1
- t0 = T0{17, 177, 1777, 17777};
- b.Reset();
- enc.Encode(t0);
- t1 = T1{};
- dec.Decode(&t1);
+ t0 = T0{17, 177, 1777, 17777}
+ b.Reset()
+ enc.Encode(t0)
+ t1 = T1{}
+ dec.Decode(&t1)
if t1.a != 17 || *t1.b != 177 || **t1.c != 1777 || ***t1.d != 17777 {
t.Errorf("t0->t1 expected {17 177 1777 17777}; got {%d %d %d %d}", t1.a, *t1.b, **t1.c, ***t1.d)
}
// Now transfer t0 into t2
- b.Reset();
- enc.Encode(t0);
- t2 = T2{};
- dec.Decode(&t2);
+ b.Reset()
+ enc.Encode(t0)
+ t2 = T2{}
+ dec.Decode(&t2)
if ***t2.a != 17 || **t2.b != 177 || *t2.c != 1777 || t2.d != 17777 {
t.Errorf("t0->t2 expected {17 177 1777 17777}; got {%d %d %d %d}", ***t2.a, **t2.b, *t2.c, t2.d)
}
// Now do t2 again but without pre-allocated pointers.
- b.Reset();
- enc.Encode(t0);
- ***t2.a = 0;
- **t2.b = 0;
- *t2.c = 0;
- t2.d = 0;
- dec.Decode(&t2);
+ b.Reset()
+ enc.Encode(t0)
+ ***t2.a = 0
+ **t2.b = 0
+ *t2.c = 0
+ t2.d = 0
+ dec.Decode(&t2)
if ***t2.a != 17 || **t2.b != 177 || *t2.c != 1777 || t2.d != 17777 {
t.Errorf("t0->t2 expected {17 177 1777 17777}; got {%d %d %d %d}", ***t2.a, **t2.b, *t2.c, t2.d)
}
}
type RT0 struct {
- a int;
- b string;
- c float;
+ a int
+ b string
+ c float
}
type RT1 struct {
- c float;
- b string;
- a int;
- notSet string;
+ c float
+ b string
+ a int
+ notSet string
}
func TestReorderedFields(t *testing.T) {
- var rt0 RT0;
- rt0.a = 17;
- rt0.b = "hello";
- rt0.c = 3.14159;
- b := new(bytes.Buffer);
- NewEncoder(b).Encode(rt0);
- dec := NewDecoder(b);
- var rt1 RT1;
+ var rt0 RT0
+ rt0.a = 17
+ rt0.b = "hello"
+ rt0.c = 3.14159
+ b := new(bytes.Buffer)
+ NewEncoder(b).Encode(rt0)
+ dec := NewDecoder(b)
+ var rt1 RT1
// Wire type is RT0, local type is RT1.
- err := dec.Decode(&rt1);
+ err := dec.Decode(&rt1)
if err != nil {
t.Error("decode error:", err)
}
@@ -913,37 +913,37 @@ func TestReorderedFields(t *testing.T) {
// Like an RT0 but with fields we'll ignore on the decode side.
type IT0 struct {
- a int64;
- b string;
- ignore_d []int;
- ignore_e [3]float;
- ignore_f bool;
- ignore_g string;
- ignore_h []byte;
- ignore_i *RT1;
- c float;
+ a int64
+ b string
+ ignore_d []int
+ ignore_e [3]float
+ ignore_f bool
+ ignore_g string
+ ignore_h []byte
+ ignore_i *RT1
+ c float
}
func TestIgnoredFields(t *testing.T) {
- var it0 IT0;
- it0.a = 17;
- it0.b = "hello";
- it0.c = 3.14159;
- it0.ignore_d = []int{1, 2, 3};
- it0.ignore_e[0] = 1.0;
- it0.ignore_e[1] = 2.0;
- it0.ignore_e[2] = 3.0;
- it0.ignore_f = true;
- it0.ignore_g = "pay no attention";
- it0.ignore_h = strings.Bytes("to the curtain");
- it0.ignore_i = &RT1{3.1, "hi", 7, "hello"};
-
- b := new(bytes.Buffer);
- NewEncoder(b).Encode(it0);
- dec := NewDecoder(b);
- var rt1 RT1;
+ var it0 IT0
+ it0.a = 17
+ it0.b = "hello"
+ it0.c = 3.14159
+ it0.ignore_d = []int{1, 2, 3}
+ it0.ignore_e[0] = 1.0
+ it0.ignore_e[1] = 2.0
+ it0.ignore_e[2] = 3.0
+ it0.ignore_f = true
+ it0.ignore_g = "pay no attention"
+ it0.ignore_h = strings.Bytes("to the curtain")
+ it0.ignore_i = &RT1{3.1, "hi", 7, "hello"}
+
+ b := new(bytes.Buffer)
+ NewEncoder(b).Encode(it0)
+ dec := NewDecoder(b)
+ var rt1 RT1
// Wire type is IT0, local type is RT1.
- err := dec.Decode(&rt1);
+ err := dec.Decode(&rt1)
if err != nil {
t.Error("error: ", err)
}
@@ -953,15 +953,15 @@ func TestIgnoredFields(t *testing.T) {
}
type Bad0 struct {
- inter interface{};
- c float;
+ inter interface{}
+ c float
}
func TestInvalidField(t *testing.T) {
- var bad0 Bad0;
- bad0.inter = 17;
- b := new(bytes.Buffer);
- err := encode(b, &bad0);
+ var bad0 Bad0
+ bad0.inter = 17
+ b := new(bytes.Buffer)
+ err := encode(b, &bad0)
if err == nil {
t.Error("expected error; got none")
} else if strings.Index(err.String(), "interface") < 0 {
diff --git a/src/pkg/gob/decode.go b/src/pkg/gob/decode.go
index a3294ac50..c7f314369 100644
--- a/src/pkg/gob/decode.go
+++ b/src/pkg/gob/decode.go
@@ -8,35 +8,35 @@ package gob
// the allocations in this file that use unsafe.Pointer.
import (
- "bytes";
- "io";
- "math";
- "os";
- "reflect";
- "runtime";
- "unsafe";
+ "bytes"
+ "io"
+ "math"
+ "os"
+ "reflect"
+ "runtime"
+ "unsafe"
)
var (
- errBadUint = os.ErrorString("gob: encoded unsigned integer out of range");
- errBadType = os.ErrorString("gob: unknown type id or corrupted data");
- errRange = os.ErrorString("gob: internal error: field numbers out of bounds");
- errNotStruct = os.ErrorString("gob: TODO: can only handle structs");
+ errBadUint = os.ErrorString("gob: encoded unsigned integer out of range")
+ errBadType = os.ErrorString("gob: unknown type id or corrupted data")
+ errRange = os.ErrorString("gob: internal error: field numbers out of bounds")
+ errNotStruct = os.ErrorString("gob: TODO: can only handle structs")
)
// The global execution state of an instance of the decoder.
type decodeState struct {
- b *bytes.Buffer;
- err os.Error;
- fieldnum int; // the last field number read.
- buf []byte;
+ b *bytes.Buffer
+ err os.Error
+ fieldnum int // the last field number read.
+ buf []byte
}
func newDecodeState(b *bytes.Buffer) *decodeState {
- d := new(decodeState);
- d.b = b;
- d.buf = make([]byte, uint64Size);
- return d;
+ d := new(decodeState)
+ d.b = b
+ d.buf = make([]byte, uint64Size)
+ return d
}
func overflow(name string) os.ErrorString {
@@ -46,33 +46,33 @@ func overflow(name string) os.ErrorString {
// decodeUintReader reads an encoded unsigned integer from an io.Reader.
// Used only by the Decoder to read the message length.
func decodeUintReader(r io.Reader, buf []byte) (x uint64, err os.Error) {
- _, err = r.Read(buf[0:1]);
+ _, err = r.Read(buf[0:1])
if err != nil {
return
}
- b := buf[0];
+ b := buf[0]
if b <= 0x7f {
return uint64(b), nil
}
- nb := -int(int8(b));
+ nb := -int(int8(b))
if nb > uint64Size {
- err = errBadUint;
- return;
+ err = errBadUint
+ return
}
- var n int;
- n, err = io.ReadFull(r, buf[0:nb]);
+ var n int
+ n, err = io.ReadFull(r, buf[0:nb])
if err != nil {
if err == os.EOF {
err = io.ErrUnexpectedEOF
}
- return;
+ return
}
// Could check that the high byte is zero but it's not worth it.
for i := 0; i < n; i++ {
- x <<= 8;
- x |= uint64(buf[i]);
+ x <<= 8
+ x |= uint64(buf[i])
}
- return;
+ return
}
// decodeUint reads an encoded unsigned integer from state.r.
@@ -82,50 +82,50 @@ func decodeUint(state *decodeState) (x uint64) {
if state.err != nil {
return
}
- var b uint8;
- b, state.err = state.b.ReadByte();
- if b <= 0x7f { // includes state.err != nil
+ var b uint8
+ b, state.err = state.b.ReadByte()
+ if b <= 0x7f { // includes state.err != nil
return uint64(b)
}
- nb := -int(int8(b));
+ nb := -int(int8(b))
if nb > uint64Size {
- state.err = errBadUint;
- return;
+ state.err = errBadUint
+ return
}
- var n int;
- n, state.err = state.b.Read(state.buf[0:nb]);
+ var n int
+ n, state.err = state.b.Read(state.buf[0:nb])
// Don't need to check error; it's safe to loop regardless.
// Could check that the high byte is zero but it's not worth it.
for i := 0; i < n; i++ {
- x <<= 8;
- x |= uint64(state.buf[i]);
+ x <<= 8
+ x |= uint64(state.buf[i])
}
- return x;
+ return x
}
// decodeInt reads an encoded signed integer from state.r.
// Sets state.err. If state.err is already non-nil, it does nothing.
// Does not check for overflow.
func decodeInt(state *decodeState) int64 {
- x := decodeUint(state);
+ x := decodeUint(state)
if state.err != nil {
return 0
}
if x&1 != 0 {
return ^int64(x >> 1)
}
- return int64(x >> 1);
+ return int64(x >> 1)
}
type decOp func(i *decInstr, state *decodeState, p unsafe.Pointer)
// The 'instructions' of the decoding machine
type decInstr struct {
- op decOp;
- field int; // field number of the wire type
- indir int; // how many pointer indirections to reach the value in the struct
- offset uintptr; // offset in the structure of the field to encode
- ovfl os.ErrorString; // error message for overflow/underflow (for arrays, of the elements)
+ op decOp
+ field int // field number of the wire type
+ indir int // how many pointer indirections to reach the value in the struct
+ offset uintptr // offset in the structure of the field to encode
+ ovfl os.ErrorString // error message for overflow/underflow (for arrays, of the elements)
}
// Since the encoder writes no zeros, if we arrive at a decoder we have
@@ -142,9 +142,9 @@ func decIndirect(p unsafe.Pointer, indir int) unsafe.Pointer {
// Allocation required
*(*unsafe.Pointer)(p) = unsafe.Pointer(new(unsafe.Pointer))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- return p;
+ return p
}
func ignoreUint(i *decInstr, state *decodeState, p unsafe.Pointer) {
@@ -156,9 +156,9 @@ func decBool(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new(bool))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- *(*bool)(p) = decodeInt(state) != 0;
+ *(*bool)(p) = decodeInt(state) != 0
}
func decInt8(i *decInstr, state *decodeState, p unsafe.Pointer) {
@@ -166,9 +166,9 @@ func decInt8(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new(int8))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- v := decodeInt(state);
+ v := decodeInt(state)
if v < math.MinInt8 || math.MaxInt8 < v {
state.err = i.ovfl
} else {
@@ -181,9 +181,9 @@ func decUint8(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new(uint8))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- v := decodeUint(state);
+ v := decodeUint(state)
if math.MaxUint8 < v {
state.err = i.ovfl
} else {
@@ -196,9 +196,9 @@ func decInt16(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new(int16))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- v := decodeInt(state);
+ v := decodeInt(state)
if v < math.MinInt16 || math.MaxInt16 < v {
state.err = i.ovfl
} else {
@@ -211,9 +211,9 @@ func decUint16(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new(uint16))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- v := decodeUint(state);
+ v := decodeUint(state)
if math.MaxUint16 < v {
state.err = i.ovfl
} else {
@@ -226,9 +226,9 @@ func decInt32(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new(int32))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- v := decodeInt(state);
+ v := decodeInt(state)
if v < math.MinInt32 || math.MaxInt32 < v {
state.err = i.ovfl
} else {
@@ -241,9 +241,9 @@ func decUint32(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new(uint32))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- v := decodeUint(state);
+ v := decodeUint(state)
if math.MaxUint32 < v {
state.err = i.ovfl
} else {
@@ -256,9 +256,9 @@ func decInt64(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new(int64))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- *(*int64)(p) = int64(decodeInt(state));
+ *(*int64)(p) = int64(decodeInt(state))
}
func decUint64(i *decInstr, state *decodeState, p unsafe.Pointer) {
@@ -266,9 +266,9 @@ func decUint64(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new(uint64))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- *(*uint64)(p) = uint64(decodeUint(state));
+ *(*uint64)(p) = uint64(decodeUint(state))
}
// Floating-point numbers are transmitted as uint64s holding the bits
@@ -277,13 +277,13 @@ func decUint64(i *decInstr, state *decodeState, p unsafe.Pointer) {
// (for example) transmit more compactly. This routine does the
// unswizzling.
func floatFromBits(u uint64) float64 {
- var v uint64;
+ var v uint64
for i := 0; i < 8; i++ {
- v <<= 8;
- v |= u & 0xFF;
- u >>= 8;
+ v <<= 8
+ v |= u & 0xFF
+ u >>= 8
}
- return math.Float64frombits(v);
+ return math.Float64frombits(v)
}
func decFloat32(i *decInstr, state *decodeState, p unsafe.Pointer) {
@@ -291,14 +291,14 @@ func decFloat32(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new(float32))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- v := floatFromBits(decodeUint(state));
- av := v;
+ v := floatFromBits(decodeUint(state))
+ av := v
if av < 0 {
av = -av
}
- if math.MaxFloat32 < av { // underflow is OK
+ if math.MaxFloat32 < av { // underflow is OK
state.err = i.ovfl
} else {
*(*float32)(p) = float32(v)
@@ -310,9 +310,9 @@ func decFloat64(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new(float64))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- *(*float64)(p) = floatFromBits(uint64(decodeUint(state)));
+ *(*float64)(p) = floatFromBits(uint64(decodeUint(state)))
}
// uint8 arrays are encoded as an unsigned count followed by the raw bytes.
@@ -321,11 +321,11 @@ func decUint8Array(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new([]uint8))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- b := make([]uint8, decodeUint(state));
- state.b.Read(b);
- *(*[]uint8)(p) = b;
+ b := make([]uint8, decodeUint(state))
+ state.b.Read(b)
+ *(*[]uint8)(p) = b
}
// Strings are encoded as an unsigned count followed by the raw bytes.
@@ -334,16 +334,16 @@ func decString(i *decInstr, state *decodeState, p unsafe.Pointer) {
if *(*unsafe.Pointer)(p) == nil {
*(*unsafe.Pointer)(p) = unsafe.Pointer(new([]byte))
}
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
}
- b := make([]byte, decodeUint(state));
- state.b.Read(b);
- *(*string)(p) = string(b);
+ b := make([]byte, decodeUint(state))
+ state.b.Read(b)
+ *(*string)(p) = string(b)
}
func ignoreUint8Array(i *decInstr, state *decodeState, p unsafe.Pointer) {
- b := make([]byte, decodeUint(state));
- state.b.Read(b);
+ b := make([]byte, decodeUint(state))
+ state.b.Read(b)
}
// Execution engine
@@ -351,13 +351,13 @@ func ignoreUint8Array(i *decInstr, state *decodeState, p unsafe.Pointer) {
// The encoder engine is an array of instructions indexed by field number of the incoming
// decoder. It is executed with random access according to field number.
type decEngine struct {
- instr []decInstr;
- numInstr int; // the number of active instructions
+ instr []decInstr
+ numInstr int // the number of active instructions
}
func decodeStruct(engine *decEngine, rtyp *reflect.StructType, b *bytes.Buffer, p uintptr, indir int) os.Error {
if indir > 0 {
- up := unsafe.Pointer(p);
+ up := unsafe.Pointer(p)
if indir > 1 {
up = decIndirect(up, indir)
}
@@ -365,120 +365,120 @@ func decodeStruct(engine *decEngine, rtyp *reflect.StructType, b *bytes.Buffer,
// Allocate object.
*(*unsafe.Pointer)(up) = unsafe.New((*runtime.StructType)(unsafe.Pointer(rtyp)))
}
- p = *(*uintptr)(up);
+ p = *(*uintptr)(up)
}
- state := newDecodeState(b);
- state.fieldnum = -1;
- basep := p;
+ state := newDecodeState(b)
+ state.fieldnum = -1
+ basep := p
for state.err == nil {
- delta := int(decodeUint(state));
+ delta := int(decodeUint(state))
if delta < 0 {
- state.err = os.ErrorString("gob decode: corrupted data: negative delta");
- break;
+ state.err = os.ErrorString("gob decode: corrupted data: negative delta")
+ break
}
- if state.err != nil || delta == 0 { // struct terminator is zero delta fieldnum
+ if state.err != nil || delta == 0 { // struct terminator is zero delta fieldnum
break
}
- fieldnum := state.fieldnum + delta;
+ fieldnum := state.fieldnum + delta
if fieldnum >= len(engine.instr) {
- state.err = errRange;
- break;
+ state.err = errRange
+ break
}
- instr := &engine.instr[fieldnum];
- p := unsafe.Pointer(basep + instr.offset);
+ instr := &engine.instr[fieldnum]
+ p := unsafe.Pointer(basep + instr.offset)
if instr.indir > 1 {
p = decIndirect(p, instr.indir)
}
- instr.op(instr, state, p);
- state.fieldnum = fieldnum;
+ instr.op(instr, state, p)
+ state.fieldnum = fieldnum
}
- return state.err;
+ return state.err
}
func ignoreStruct(engine *decEngine, b *bytes.Buffer) os.Error {
- state := newDecodeState(b);
- state.fieldnum = -1;
+ state := newDecodeState(b)
+ state.fieldnum = -1
for state.err == nil {
- delta := int(decodeUint(state));
+ delta := int(decodeUint(state))
if delta < 0 {
- state.err = os.ErrorString("gob ignore decode: corrupted data: negative delta");
- break;
+ state.err = os.ErrorString("gob ignore decode: corrupted data: negative delta")
+ break
}
- if state.err != nil || delta == 0 { // struct terminator is zero delta fieldnum
+ if state.err != nil || delta == 0 { // struct terminator is zero delta fieldnum
break
}
- fieldnum := state.fieldnum + delta;
+ fieldnum := state.fieldnum + delta
if fieldnum >= len(engine.instr) {
- state.err = errRange;
- break;
+ state.err = errRange
+ break
}
- instr := &engine.instr[fieldnum];
- instr.op(instr, state, unsafe.Pointer(nil));
- state.fieldnum = fieldnum;
+ instr := &engine.instr[fieldnum]
+ instr.op(instr, state, unsafe.Pointer(nil))
+ state.fieldnum = fieldnum
}
- return state.err;
+ return state.err
}
func decodeArrayHelper(state *decodeState, p uintptr, elemOp decOp, elemWid uintptr, length, elemIndir int, ovfl os.ErrorString) os.Error {
- instr := &decInstr{elemOp, 0, elemIndir, 0, ovfl};
+ instr := &decInstr{elemOp, 0, elemIndir, 0, ovfl}
for i := 0; i < length && state.err == nil; i++ {
- up := unsafe.Pointer(p);
+ up := unsafe.Pointer(p)
if elemIndir > 1 {
up = decIndirect(up, elemIndir)
}
- elemOp(instr, state, up);
- p += uintptr(elemWid);
+ elemOp(instr, state, up)
+ p += uintptr(elemWid)
}
- return state.err;
+ return state.err
}
func decodeArray(atyp *reflect.ArrayType, state *decodeState, p uintptr, elemOp decOp, elemWid uintptr, length, indir, elemIndir int, ovfl os.ErrorString) os.Error {
if indir > 0 {
- up := unsafe.Pointer(p);
+ up := unsafe.Pointer(p)
if *(*unsafe.Pointer)(up) == nil {
// Allocate object.
*(*unsafe.Pointer)(up) = unsafe.New(atyp)
}
- p = *(*uintptr)(up);
+ p = *(*uintptr)(up)
}
if n := decodeUint(state); n != uint64(length) {
return os.ErrorString("gob: length mismatch in decodeArray")
}
- return decodeArrayHelper(state, p, elemOp, elemWid, length, elemIndir, ovfl);
+ return decodeArrayHelper(state, p, elemOp, elemWid, length, elemIndir, ovfl)
}
func ignoreArrayHelper(state *decodeState, elemOp decOp, length int) os.Error {
- instr := &decInstr{elemOp, 0, 0, 0, os.ErrorString("no error")};
+ instr := &decInstr{elemOp, 0, 0, 0, os.ErrorString("no error")}
for i := 0; i < length && state.err == nil; i++ {
elemOp(instr, state, nil)
}
- return state.err;
+ return state.err
}
func ignoreArray(state *decodeState, elemOp decOp, length int) os.Error {
if n := decodeUint(state); n != uint64(length) {
return os.ErrorString("gob: length mismatch in ignoreArray")
}
- return ignoreArrayHelper(state, elemOp, length);
+ return ignoreArrayHelper(state, elemOp, length)
}
func decodeSlice(atyp *reflect.SliceType, state *decodeState, p uintptr, elemOp decOp, elemWid uintptr, indir, elemIndir int, ovfl os.ErrorString) os.Error {
- n := int(uintptr(decodeUint(state)));
+ n := int(uintptr(decodeUint(state)))
if indir > 0 {
- up := unsafe.Pointer(p);
+ up := unsafe.Pointer(p)
if *(*unsafe.Pointer)(up) == nil {
// Allocate the slice header.
*(*unsafe.Pointer)(up) = unsafe.Pointer(new([]unsafe.Pointer))
}
- p = *(*uintptr)(up);
+ p = *(*uintptr)(up)
}
// Allocate storage for the slice elements, that is, the underlying array.
// Always write a header at p.
- hdrp := (*reflect.SliceHeader)(unsafe.Pointer(p));
- hdrp.Data = uintptr(unsafe.NewArray(atyp.Elem(), n));
- hdrp.Len = n;
- hdrp.Cap = n;
- return decodeArrayHelper(state, hdrp.Data, elemOp, elemWid, n, elemIndir, ovfl);
+ hdrp := (*reflect.SliceHeader)(unsafe.Pointer(p))
+ hdrp.Data = uintptr(unsafe.NewArray(atyp.Elem(), n))
+ hdrp.Len = n
+ hdrp.Cap = n
+ return decodeArrayHelper(state, hdrp.Data, elemOp, elemWid, n, elemIndir, ovfl)
}
func ignoreSlice(state *decodeState, elemOp decOp) os.Error {
@@ -512,104 +512,104 @@ var decIgnoreOpMap = map[typeId]decOp{
// Return the decoding op for the base type under rt and
// the indirection count to reach it.
func (dec *Decoder) decOpFor(wireId typeId, rt reflect.Type, name string) (decOp, int, os.Error) {
- typ, indir := indirect(rt);
- op, ok := decOpMap[reflect.Typeof(typ)];
+ typ, indir := indirect(rt)
+ op, ok := decOpMap[reflect.Typeof(typ)]
if !ok {
// Special cases
switch t := typ.(type) {
case *reflect.SliceType:
- name = "element of " + name;
+ name = "element of " + name
if _, ok := t.Elem().(*reflect.Uint8Type); ok {
- op = decUint8Array;
- break;
+ op = decUint8Array
+ break
}
- var elemId typeId;
+ var elemId typeId
if tt, ok := builtinIdToType[wireId]; ok {
elemId = tt.(*sliceType).Elem
} else {
elemId = dec.wireType[wireId].slice.Elem
}
- elemOp, elemIndir, err := dec.decOpFor(elemId, t.Elem(), name);
+ elemOp, elemIndir, err := dec.decOpFor(elemId, t.Elem(), name)
if err != nil {
return nil, 0, err
}
- ovfl := overflow(name);
+ ovfl := overflow(name)
op = func(i *decInstr, state *decodeState, p unsafe.Pointer) {
state.err = decodeSlice(t, state, uintptr(p), elemOp, t.Elem().Size(), i.indir, elemIndir, ovfl)
- };
+ }
case *reflect.ArrayType:
- name = "element of " + name;
- elemId := wireId.gobType().(*arrayType).Elem;
- elemOp, elemIndir, err := dec.decOpFor(elemId, t.Elem(), name);
+ name = "element of " + name
+ elemId := wireId.gobType().(*arrayType).Elem
+ elemOp, elemIndir, err := dec.decOpFor(elemId, t.Elem(), name)
if err != nil {
return nil, 0, err
}
- ovfl := overflow(name);
+ ovfl := overflow(name)
op = func(i *decInstr, state *decodeState, p unsafe.Pointer) {
state.err = decodeArray(t, state, uintptr(p), elemOp, t.Elem().Size(), t.Len(), i.indir, elemIndir, ovfl)
- };
+ }
case *reflect.StructType:
// Generate a closure that calls out to the engine for the nested type.
- enginePtr, err := dec.getDecEnginePtr(wireId, typ);
+ enginePtr, err := dec.getDecEnginePtr(wireId, typ)
if err != nil {
return nil, 0, err
}
op = func(i *decInstr, state *decodeState, p unsafe.Pointer) {
// indirect through enginePtr to delay evaluation for recursive structs
state.err = decodeStruct(*enginePtr, t, state.b, uintptr(p), i.indir)
- };
+ }
}
}
if op == nil {
return nil, 0, os.ErrorString("gob: decode can't handle type " + rt.String())
}
- return op, indir, nil;
+ return op, indir, nil
}
// Return the decoding op for a field that has no destination.
func (dec *Decoder) decIgnoreOpFor(wireId typeId) (decOp, os.Error) {
- op, ok := decIgnoreOpMap[wireId];
+ op, ok := decIgnoreOpMap[wireId]
if !ok {
// Special cases
switch t := wireId.gobType().(type) {
case *sliceType:
- elemId := wireId.gobType().(*sliceType).Elem;
- elemOp, err := dec.decIgnoreOpFor(elemId);
+ elemId := wireId.gobType().(*sliceType).Elem
+ elemOp, err := dec.decIgnoreOpFor(elemId)
if err != nil {
return nil, err
}
op = func(i *decInstr, state *decodeState, p unsafe.Pointer) {
state.err = ignoreSlice(state, elemOp)
- };
+ }
case *arrayType:
- elemId := wireId.gobType().(*arrayType).Elem;
- elemOp, err := dec.decIgnoreOpFor(elemId);
+ elemId := wireId.gobType().(*arrayType).Elem
+ elemOp, err := dec.decIgnoreOpFor(elemId)
if err != nil {
return nil, err
}
op = func(i *decInstr, state *decodeState, p unsafe.Pointer) {
state.err = ignoreArray(state, elemOp, t.Len)
- };
+ }
case *structType:
// Generate a closure that calls out to the engine for the nested type.
- enginePtr, err := dec.getIgnoreEnginePtr(wireId);
+ enginePtr, err := dec.getIgnoreEnginePtr(wireId)
if err != nil {
return nil, err
}
op = func(i *decInstr, state *decodeState, p unsafe.Pointer) {
// indirect through enginePtr to delay evaluation for recursive structs
state.err = ignoreStruct(*enginePtr, state.b)
- };
+ }
}
}
if op == nil {
return nil, os.ErrorString("ignore can't handle type " + wireId.string())
}
- return op, nil;
+ return op, nil
}
// Are these two gob Types compatible?
@@ -618,10 +618,10 @@ func (dec *Decoder) decIgnoreOpFor(wireId typeId) (decOp, os.Error) {
func (dec *Decoder) compatibleType(fr reflect.Type, fw typeId) bool {
for {
if pt, ok := fr.(*reflect.PtrType); ok {
- fr = pt.Elem();
- continue;
+ fr = pt.Elem()
+ continue
}
- break;
+ break
}
switch t := fr.(type) {
default:
@@ -660,89 +660,89 @@ func (dec *Decoder) compatibleType(fr reflect.Type, fw typeId) bool {
case *reflect.StringType:
return fw == tString
case *reflect.ArrayType:
- aw, ok := fw.gobType().(*arrayType);
- return ok && t.Len() == aw.Len && dec.compatibleType(t.Elem(), aw.Elem);
+ aw, ok := fw.gobType().(*arrayType)
+ return ok && t.Len() == aw.Len && dec.compatibleType(t.Elem(), aw.Elem)
case *reflect.SliceType:
// Is it an array of bytes?
- et := t.Elem();
+ et := t.Elem()
if _, ok := et.(*reflect.Uint8Type); ok {
return fw == tBytes
}
// Extract and compare element types.
- var sw *sliceType;
+ var sw *sliceType
if tt, ok := builtinIdToType[fw]; ok {
sw = tt.(*sliceType)
} else {
sw = dec.wireType[fw].slice
}
- elem, _ := indirect(t.Elem());
- return sw != nil && dec.compatibleType(elem, sw.Elem);
+ elem, _ := indirect(t.Elem())
+ return sw != nil && dec.compatibleType(elem, sw.Elem)
case *reflect.StructType:
return true
}
- return true;
+ return true
}
func (dec *Decoder) compileDec(remoteId typeId, rt reflect.Type) (engine *decEngine, err os.Error) {
- srt, ok1 := rt.(*reflect.StructType);
- var wireStruct *structType;
+ srt, ok1 := rt.(*reflect.StructType)
+ var wireStruct *structType
// Builtin types can come from global pool; the rest must be defined by the decoder
if t, ok := builtinIdToType[remoteId]; ok {
wireStruct = t.(*structType)
} else {
- w, ok2 := dec.wireType[remoteId];
+ w, ok2 := dec.wireType[remoteId]
if !ok1 || !ok2 {
return nil, errNotStruct
}
- wireStruct = w.strct;
+ wireStruct = w.strct
}
- engine = new(decEngine);
- engine.instr = make([]decInstr, len(wireStruct.field));
+ engine = new(decEngine)
+ engine.instr = make([]decInstr, len(wireStruct.field))
// Loop over the fields of the wire type.
for fieldnum := 0; fieldnum < len(wireStruct.field); fieldnum++ {
- wireField := wireStruct.field[fieldnum];
+ wireField := wireStruct.field[fieldnum]
// Find the field of the local type with the same name.
- localField, present := srt.FieldByName(wireField.name);
- ovfl := overflow(wireField.name);
+ localField, present := srt.FieldByName(wireField.name)
+ ovfl := overflow(wireField.name)
// TODO(r): anonymous names
if !present {
- op, err := dec.decIgnoreOpFor(wireField.id);
+ op, err := dec.decIgnoreOpFor(wireField.id)
if err != nil {
return nil, err
}
- engine.instr[fieldnum] = decInstr{op, fieldnum, 0, 0, ovfl};
- continue;
+ engine.instr[fieldnum] = decInstr{op, fieldnum, 0, 0, ovfl}
+ continue
}
if !dec.compatibleType(localField.Type, wireField.id) {
- details := " (" + wireField.id.string() + " incompatible with " + localField.Type.String() + ") in type " + remoteId.Name();
- return nil, os.ErrorString("gob: wrong type for field " + wireField.name + details);
+ details := " (" + wireField.id.string() + " incompatible with " + localField.Type.String() + ") in type " + remoteId.Name()
+ return nil, os.ErrorString("gob: wrong type for field " + wireField.name + details)
}
- op, indir, err := dec.decOpFor(wireField.id, localField.Type, localField.Name);
+ op, indir, err := dec.decOpFor(wireField.id, localField.Type, localField.Name)
if err != nil {
return nil, err
}
- engine.instr[fieldnum] = decInstr{op, fieldnum, indir, uintptr(localField.Offset), ovfl};
- engine.numInstr++;
+ engine.instr[fieldnum] = decInstr{op, fieldnum, indir, uintptr(localField.Offset), ovfl}
+ engine.numInstr++
}
- return;
+ return
}
func (dec *Decoder) getDecEnginePtr(remoteId typeId, rt reflect.Type) (enginePtr **decEngine, err os.Error) {
- decoderMap, ok := dec.decoderCache[rt];
+ decoderMap, ok := dec.decoderCache[rt]
if !ok {
- decoderMap = make(map[typeId]**decEngine);
- dec.decoderCache[rt] = decoderMap;
+ decoderMap = make(map[typeId]**decEngine)
+ dec.decoderCache[rt] = decoderMap
}
if enginePtr, ok = decoderMap[remoteId]; !ok {
// To handle recursive types, mark this engine as underway before compiling.
- enginePtr = new(*decEngine);
- decoderMap[remoteId] = enginePtr;
- *enginePtr, err = dec.compileDec(remoteId, rt);
+ enginePtr = new(*decEngine)
+ decoderMap[remoteId] = enginePtr
+ *enginePtr, err = dec.compileDec(remoteId, rt)
if err != nil {
decoderMap[remoteId] = nil, false
}
}
- return;
+ return
}
// When ignoring data, in effect we compile it into this type
@@ -751,42 +751,42 @@ type emptyStruct struct{}
var emptyStructType = reflect.Typeof(emptyStruct{})
func (dec *Decoder) getIgnoreEnginePtr(wireId typeId) (enginePtr **decEngine, err os.Error) {
- var ok bool;
+ var ok bool
if enginePtr, ok = dec.ignorerCache[wireId]; !ok {
// To handle recursive types, mark this engine as underway before compiling.
- enginePtr = new(*decEngine);
- dec.ignorerCache[wireId] = enginePtr;
- *enginePtr, err = dec.compileDec(wireId, emptyStructType);
+ enginePtr = new(*decEngine)
+ dec.ignorerCache[wireId] = enginePtr
+ *enginePtr, err = dec.compileDec(wireId, emptyStructType)
if err != nil {
dec.ignorerCache[wireId] = nil, false
}
}
- return;
+ return
}
func (dec *Decoder) decode(wireId typeId, e interface{}) os.Error {
// Dereference down to the underlying struct type.
- rt, indir := indirect(reflect.Typeof(e));
- st, ok := rt.(*reflect.StructType);
+ rt, indir := indirect(reflect.Typeof(e))
+ st, ok := rt.(*reflect.StructType)
if !ok {
return os.ErrorString("gob: decode can't handle " + rt.String())
}
- enginePtr, err := dec.getDecEnginePtr(wireId, rt);
+ enginePtr, err := dec.getDecEnginePtr(wireId, rt)
if err != nil {
return err
}
- engine := *enginePtr;
+ engine := *enginePtr
if engine.numInstr == 0 && st.NumField() > 0 && len(wireId.gobType().(*structType).field) > 0 {
- name := rt.Name();
- return os.ErrorString("gob: type mismatch: no fields matched compiling decoder for " + name);
+ name := rt.Name()
+ return os.ErrorString("gob: type mismatch: no fields matched compiling decoder for " + name)
}
- return decodeStruct(engine, st, dec.state.b, uintptr(reflect.NewValue(e).Addr()), indir);
+ return decodeStruct(engine, st, dec.state.b, uintptr(reflect.NewValue(e).Addr()), indir)
}
func init() {
// We assume that the size of float is sufficient to tell us whether it is
// equivalent to float32 or to float64. This is very unlikely to be wrong.
- var op decOp;
+ var op decOp
switch unsafe.Sizeof(float(0)) {
case unsafe.Sizeof(float32(0)):
op = decFloat32
@@ -795,22 +795,22 @@ func init() {
default:
panic("gob: unknown size of float", unsafe.Sizeof(float(0)))
}
- decOpMap[valueKind(float(0))] = op;
+ decOpMap[valueKind(float(0))] = op
// A similar assumption about int and uint. Also assume int and uint have the same size.
- var uop decOp;
+ var uop decOp
switch unsafe.Sizeof(int(0)) {
case unsafe.Sizeof(int32(0)):
- op = decInt32;
- uop = decUint32;
+ op = decInt32
+ uop = decUint32
case unsafe.Sizeof(int64(0)):
- op = decInt64;
- uop = decUint64;
+ op = decInt64
+ uop = decUint64
default:
panic("gob: unknown size of int/uint", unsafe.Sizeof(int(0)))
}
- decOpMap[valueKind(int(0))] = op;
- decOpMap[valueKind(uint(0))] = uop;
+ decOpMap[valueKind(int(0))] = op
+ decOpMap[valueKind(uint(0))] = uop
// Finally uintptr
switch unsafe.Sizeof(uintptr(0)) {
@@ -821,5 +821,5 @@ func init() {
default:
panic("gob: unknown size of uintptr", unsafe.Sizeof(uintptr(0)))
}
- decOpMap[valueKind(uintptr(0))] = uop;
+ decOpMap[valueKind(uintptr(0))] = uop
}
diff --git a/src/pkg/gob/decoder.go b/src/pkg/gob/decoder.go
index 5202c8285..73f0979ed 100644
--- a/src/pkg/gob/decoder.go
+++ b/src/pkg/gob/decoder.go
@@ -5,51 +5,51 @@
package gob
import (
- "bytes";
- "io";
- "os";
- "reflect";
- "sync";
+ "bytes"
+ "io"
+ "os"
+ "reflect"
+ "sync"
)
// A Decoder manages the receipt of type and data information read from the
// remote side of a connection.
type Decoder struct {
- mutex sync.Mutex; // each item must be received atomically
- r io.Reader; // source of the data
- wireType map[typeId]*wireType; // map from remote ID to local description
- decoderCache map[reflect.Type]map[typeId]**decEngine; // cache of compiled engines
- ignorerCache map[typeId]**decEngine; // ditto for ignored objects
- state *decodeState; // reads data from in-memory buffer
- countState *decodeState; // reads counts from wire
- buf []byte;
- countBuf [9]byte; // counts may be uint64s (unlikely!), require 9 bytes
+ mutex sync.Mutex // each item must be received atomically
+ r io.Reader // source of the data
+ wireType map[typeId]*wireType // map from remote ID to local description
+ decoderCache map[reflect.Type]map[typeId]**decEngine // cache of compiled engines
+ ignorerCache map[typeId]**decEngine // ditto for ignored objects
+ state *decodeState // reads data from in-memory buffer
+ countState *decodeState // reads counts from wire
+ buf []byte
+ countBuf [9]byte // counts may be uint64s (unlikely!), require 9 bytes
}
// NewDecoder returns a new decoder that reads from the io.Reader.
func NewDecoder(r io.Reader) *Decoder {
- dec := new(Decoder);
- dec.r = r;
- dec.wireType = make(map[typeId]*wireType);
- dec.state = newDecodeState(nil); // buffer set in Decode(); rest is unimportant
- dec.decoderCache = make(map[reflect.Type]map[typeId]**decEngine);
- dec.ignorerCache = make(map[typeId]**decEngine);
+ dec := new(Decoder)
+ dec.r = r
+ dec.wireType = make(map[typeId]*wireType)
+ dec.state = newDecodeState(nil) // buffer set in Decode(); rest is unimportant
+ dec.decoderCache = make(map[reflect.Type]map[typeId]**decEngine)
+ dec.ignorerCache = make(map[typeId]**decEngine)
- return dec;
+ return dec
}
func (dec *Decoder) recvType(id typeId) {
// Have we already seen this type? That's an error
if _, alreadySeen := dec.wireType[id]; alreadySeen {
- dec.state.err = os.ErrorString("gob: duplicate type received");
- return;
+ dec.state.err = os.ErrorString("gob: duplicate type received")
+ return
}
// Type:
- wire := new(wireType);
- dec.state.err = dec.decode(tWireType, wire);
+ wire := new(wireType)
+ dec.state.err = dec.decode(tWireType, wire)
// Remember we've seen this type.
- dec.wireType[id] = wire;
+ dec.wireType[id] = wire
}
// Decode reads the next value from the connection and stores
@@ -60,19 +60,19 @@ func (dec *Decoder) Decode(e interface{}) os.Error {
// If e represents a value, the answer won't get back to the
// caller. Make sure it's a pointer.
if _, ok := reflect.Typeof(e).(*reflect.PtrType); !ok {
- dec.state.err = os.ErrorString("gob: attempt to decode into a non-pointer");
- return dec.state.err;
+ dec.state.err = os.ErrorString("gob: attempt to decode into a non-pointer")
+ return dec.state.err
}
// Make sure we're single-threaded through here.
- dec.mutex.Lock();
- defer dec.mutex.Unlock();
+ dec.mutex.Lock()
+ defer dec.mutex.Unlock()
- dec.state.err = nil;
+ dec.state.err = nil
for {
// Read a count.
- var nbytes uint64;
- nbytes, dec.state.err = decodeUintReader(dec.r, dec.countBuf[0:]);
+ var nbytes uint64
+ nbytes, dec.state.err = decodeUintReader(dec.r, dec.countBuf[0:])
if dec.state.err != nil {
break
}
@@ -80,42 +80,42 @@ func (dec *Decoder) Decode(e interface{}) os.Error {
if nbytes > uint64(len(dec.buf)) {
dec.buf = make([]byte, nbytes+1000)
}
- dec.state.b = bytes.NewBuffer(dec.buf[0:nbytes]);
+ dec.state.b = bytes.NewBuffer(dec.buf[0:nbytes])
// Read the data
- _, dec.state.err = io.ReadFull(dec.r, dec.buf[0:nbytes]);
+ _, dec.state.err = io.ReadFull(dec.r, dec.buf[0:nbytes])
if dec.state.err != nil {
if dec.state.err == os.EOF {
dec.state.err = io.ErrUnexpectedEOF
}
- break;
+ break
}
// Receive a type id.
- id := typeId(decodeInt(dec.state));
+ id := typeId(decodeInt(dec.state))
if dec.state.err != nil {
break
}
// Is it a new type?
- if id < 0 { // 0 is the error state, handled above
+ if id < 0 { // 0 is the error state, handled above
// If the id is negative, we have a type.
- dec.recvType(-id);
+ dec.recvType(-id)
if dec.state.err != nil {
break
}
- continue;
+ continue
}
// No, it's a value.
// Make sure the type has been defined already.
- _, ok := dec.wireType[id];
+ _, ok := dec.wireType[id]
if !ok {
- dec.state.err = errBadType;
- break;
+ dec.state.err = errBadType
+ break
}
- dec.state.err = dec.decode(id, e);
- break;
+ dec.state.err = dec.decode(id, e)
+ break
}
- return dec.state.err;
+ return dec.state.err
}
diff --git a/src/pkg/gob/encode.go b/src/pkg/gob/encode.go
index 36845b87c..fb9710928 100644
--- a/src/pkg/gob/encode.go
+++ b/src/pkg/gob/encode.go
@@ -5,12 +5,12 @@
package gob
import (
- "bytes";
- "io";
- "math";
- "os";
- "reflect";
- "unsafe";
+ "bytes"
+ "io"
+ "math"
+ "os"
+ "reflect"
+ "unsafe"
)
const uint64Size = unsafe.Sizeof(uint64(0))
@@ -20,10 +20,10 @@ const uint64Size = unsafe.Sizeof(uint64(0))
// number is initialized to -1 so 0 comes out as delta(1). A delta of
// 0 terminates the structure.
type encoderState struct {
- b *bytes.Buffer;
- err os.Error; // error encountered during encoding;
- fieldnum int; // the last field number written.
- buf [1 + uint64Size]byte; // buffer used by the encoder; here to avoid allocation.
+ b *bytes.Buffer
+ err os.Error // error encountered during encoding;
+ fieldnum int // the last field number written.
+ buf [1 + uint64Size]byte // buffer used by the encoder; here to avoid allocation.
}
// Unsigned integers have a two-state encoding. If the number is less
@@ -38,49 +38,49 @@ func encodeUint(state *encoderState, x uint64) {
return
}
if x <= 0x7F {
- state.err = state.b.WriteByte(uint8(x));
- return;
+ state.err = state.b.WriteByte(uint8(x))
+ return
}
- var n, m int;
- m = uint64Size;
+ var n, m int
+ m = uint64Size
for n = 1; x > 0; n++ {
- state.buf[m] = uint8(x & 0xFF);
- x >>= 8;
- m--;
+ state.buf[m] = uint8(x & 0xFF)
+ x >>= 8
+ m--
}
- state.buf[m] = uint8(-(n - 1));
- n, state.err = state.b.Write(state.buf[m : uint64Size+1]);
+ state.buf[m] = uint8(-(n - 1))
+ n, state.err = state.b.Write(state.buf[m : uint64Size+1])
}
// encodeInt writes an encoded signed integer to state.w.
// The low bit of the encoding says whether to bit complement the (other bits of the) uint to recover the int.
// Sets state.err. If state.err is already non-nil, it does nothing.
func encodeInt(state *encoderState, i int64) {
- var x uint64;
+ var x uint64
if i < 0 {
x = uint64(^i<<1) | 1
} else {
x = uint64(i << 1)
}
- encodeUint(state, uint64(x));
+ encodeUint(state, uint64(x))
}
type encOp func(i *encInstr, state *encoderState, p unsafe.Pointer)
// The 'instructions' of the encoding machine
type encInstr struct {
- op encOp;
- field int; // field number
- indir int; // how many pointer indirections to reach the value in the struct
- offset uintptr; // offset in the structure of the field to encode
+ op encOp
+ field int // field number
+ indir int // how many pointer indirections to reach the value in the struct
+ offset uintptr // offset in the structure of the field to encode
}
// Emit a field number and update the state to record its value for delta encoding.
// If the instruction pointer is nil, do nothing
func (state *encoderState) update(instr *encInstr) {
if instr != nil {
- encodeUint(state, uint64(instr.field-state.fieldnum));
- state.fieldnum = instr.field;
+ encodeUint(state, uint64(instr.field-state.fieldnum))
+ state.fieldnum = instr.field
}
}
@@ -92,107 +92,107 @@ func (state *encoderState) update(instr *encInstr) {
func encIndirect(p unsafe.Pointer, indir int) unsafe.Pointer {
for ; indir > 0; indir-- {
- p = *(*unsafe.Pointer)(p);
+ p = *(*unsafe.Pointer)(p)
if p == nil {
return unsafe.Pointer(nil)
}
}
- return p;
+ return p
}
func encBool(i *encInstr, state *encoderState, p unsafe.Pointer) {
- b := *(*bool)(p);
+ b := *(*bool)(p)
if b {
- state.update(i);
- encodeUint(state, 1);
+ state.update(i)
+ encodeUint(state, 1)
}
}
func encInt(i *encInstr, state *encoderState, p unsafe.Pointer) {
- v := int64(*(*int)(p));
+ v := int64(*(*int)(p))
if v != 0 {
- state.update(i);
- encodeInt(state, v);
+ state.update(i)
+ encodeInt(state, v)
}
}
func encUint(i *encInstr, state *encoderState, p unsafe.Pointer) {
- v := uint64(*(*uint)(p));
+ v := uint64(*(*uint)(p))
if v != 0 {
- state.update(i);
- encodeUint(state, v);
+ state.update(i)
+ encodeUint(state, v)
}
}
func encInt8(i *encInstr, state *encoderState, p unsafe.Pointer) {
- v := int64(*(*int8)(p));
+ v := int64(*(*int8)(p))
if v != 0 {
- state.update(i);
- encodeInt(state, v);
+ state.update(i)
+ encodeInt(state, v)
}
}
func encUint8(i *encInstr, state *encoderState, p unsafe.Pointer) {
- v := uint64(*(*uint8)(p));
+ v := uint64(*(*uint8)(p))
if v != 0 {
- state.update(i);
- encodeUint(state, v);
+ state.update(i)
+ encodeUint(state, v)
}
}
func encInt16(i *encInstr, state *encoderState, p unsafe.Pointer) {
- v := int64(*(*int16)(p));
+ v := int64(*(*int16)(p))
if v != 0 {
- state.update(i);
- encodeInt(state, v);
+ state.update(i)
+ encodeInt(state, v)
}
}
func encUint16(i *encInstr, state *encoderState, p unsafe.Pointer) {
- v := uint64(*(*uint16)(p));
+ v := uint64(*(*uint16)(p))
if v != 0 {
- state.update(i);
- encodeUint(state, v);
+ state.update(i)
+ encodeUint(state, v)
}
}
func encInt32(i *encInstr, state *encoderState, p unsafe.Pointer) {
- v := int64(*(*int32)(p));
+ v := int64(*(*int32)(p))
if v != 0 {
- state.update(i);
- encodeInt(state, v);
+ state.update(i)
+ encodeInt(state, v)
}
}
func encUint32(i *encInstr, state *encoderState, p unsafe.Pointer) {
- v := uint64(*(*uint32)(p));
+ v := uint64(*(*uint32)(p))
if v != 0 {
- state.update(i);
- encodeUint(state, v);
+ state.update(i)
+ encodeUint(state, v)
}
}
func encInt64(i *encInstr, state *encoderState, p unsafe.Pointer) {
- v := *(*int64)(p);
+ v := *(*int64)(p)
if v != 0 {
- state.update(i);
- encodeInt(state, v);
+ state.update(i)
+ encodeInt(state, v)
}
}
func encUint64(i *encInstr, state *encoderState, p unsafe.Pointer) {
- v := *(*uint64)(p);
+ v := *(*uint64)(p)
if v != 0 {
- state.update(i);
- encodeUint(state, v);
+ state.update(i)
+ encodeUint(state, v)
}
}
func encUintptr(i *encInstr, state *encoderState, p unsafe.Pointer) {
- v := uint64(*(*uintptr)(p));
+ v := uint64(*(*uintptr)(p))
if v != 0 {
- state.update(i);
- encodeUint(state, v);
+ state.update(i)
+ encodeUint(state, v)
}
}
@@ -202,60 +202,60 @@ func encUintptr(i *encInstr, state *encoderState, p unsafe.Pointer) {
// (for example) transmit more compactly. This routine does the
// swizzling.
func floatBits(f float64) uint64 {
- u := math.Float64bits(f);
- var v uint64;
+ u := math.Float64bits(f)
+ var v uint64
for i := 0; i < 8; i++ {
- v <<= 8;
- v |= u & 0xFF;
- u >>= 8;
+ v <<= 8
+ v |= u & 0xFF
+ u >>= 8
}
- return v;
+ return v
}
func encFloat(i *encInstr, state *encoderState, p unsafe.Pointer) {
- f := float(*(*float)(p));
+ f := float(*(*float)(p))
if f != 0 {
- v := floatBits(float64(f));
- state.update(i);
- encodeUint(state, v);
+ v := floatBits(float64(f))
+ state.update(i)
+ encodeUint(state, v)
}
}
func encFloat32(i *encInstr, state *encoderState, p unsafe.Pointer) {
- f := float32(*(*float32)(p));
+ f := float32(*(*float32)(p))
if f != 0 {
- v := floatBits(float64(f));
- state.update(i);
- encodeUint(state, v);
+ v := floatBits(float64(f))
+ state.update(i)
+ encodeUint(state, v)
}
}
func encFloat64(i *encInstr, state *encoderState, p unsafe.Pointer) {
- f := *(*float64)(p);
+ f := *(*float64)(p)
if f != 0 {
- state.update(i);
- v := floatBits(f);
- encodeUint(state, v);
+ state.update(i)
+ v := floatBits(f)
+ encodeUint(state, v)
}
}
// Byte arrays are encoded as an unsigned count followed by the raw bytes.
func encUint8Array(i *encInstr, state *encoderState, p unsafe.Pointer) {
- b := *(*[]byte)(p);
+ b := *(*[]byte)(p)
if len(b) > 0 {
- state.update(i);
- encodeUint(state, uint64(len(b)));
- state.b.Write(b);
+ state.update(i)
+ encodeUint(state, uint64(len(b)))
+ state.b.Write(b)
}
}
// Strings are encoded as an unsigned count followed by the raw bytes.
func encString(i *encInstr, state *encoderState, p unsafe.Pointer) {
- s := *(*string)(p);
+ s := *(*string)(p)
if len(s) > 0 {
- state.update(i);
- encodeUint(state, uint64(len(s)));
- io.WriteString(state.b, s);
+ state.update(i)
+ encodeUint(state, uint64(len(s)))
+ io.WriteString(state.b, s)
}
}
@@ -269,48 +269,48 @@ func encStructTerminator(i *encInstr, state *encoderState, p unsafe.Pointer) {
// The encoder engine is an array of instructions indexed by field number of the encoding
// data, typically a struct. It is executed top to bottom, walking the struct.
type encEngine struct {
- instr []encInstr;
+ instr []encInstr
}
func encodeStruct(engine *encEngine, b *bytes.Buffer, basep uintptr) os.Error {
- state := new(encoderState);
- state.b = b;
- state.fieldnum = -1;
+ state := new(encoderState)
+ state.b = b
+ state.fieldnum = -1
for i := 0; i < len(engine.instr); i++ {
- instr := &engine.instr[i];
- p := unsafe.Pointer(basep + instr.offset);
+ instr := &engine.instr[i]
+ p := unsafe.Pointer(basep + instr.offset)
if instr.indir > 0 {
if p = encIndirect(p, instr.indir); p == nil {
continue
}
}
- instr.op(instr, state, p);
+ instr.op(instr, state, p)
if state.err != nil {
break
}
}
- return state.err;
+ return state.err
}
func encodeArray(b *bytes.Buffer, p uintptr, op encOp, elemWid uintptr, length int, elemIndir int) os.Error {
- state := new(encoderState);
- state.b = b;
- state.fieldnum = -1;
- encodeUint(state, uint64(length));
+ state := new(encoderState)
+ state.b = b
+ state.fieldnum = -1
+ encodeUint(state, uint64(length))
for i := 0; i < length && state.err == nil; i++ {
- elemp := p;
- up := unsafe.Pointer(elemp);
+ elemp := p
+ up := unsafe.Pointer(elemp)
if elemIndir > 0 {
if up = encIndirect(up, elemIndir); up == nil {
- state.err = os.ErrorString("gob: encodeArray: nil element");
- break;
+ state.err = os.ErrorString("gob: encodeArray: nil element")
+ break
}
- elemp = uintptr(up);
+ elemp = uintptr(up)
}
- op(nil, state, unsafe.Pointer(elemp));
- p += uintptr(elemWid);
+ op(nil, state, unsafe.Pointer(elemp))
+ p += uintptr(elemWid)
}
- return state.err;
+ return state.err
}
var encOpMap = map[reflect.Type]encOp{
@@ -335,110 +335,110 @@ var encOpMap = map[reflect.Type]encOp{
// Return the encoding op for the base type under rt and
// the indirection count to reach it.
func encOpFor(rt reflect.Type) (encOp, int, os.Error) {
- typ, indir := indirect(rt);
- op, ok := encOpMap[reflect.Typeof(typ)];
+ typ, indir := indirect(rt)
+ op, ok := encOpMap[reflect.Typeof(typ)]
if !ok {
- typ, _ := indirect(rt);
+ typ, _ := indirect(rt)
// Special cases
switch t := typ.(type) {
case *reflect.SliceType:
if _, ok := t.Elem().(*reflect.Uint8Type); ok {
- op = encUint8Array;
- break;
+ op = encUint8Array
+ break
}
// Slices have a header; we decode it to find the underlying array.
- elemOp, indir, err := encOpFor(t.Elem());
+ elemOp, indir, err := encOpFor(t.Elem())
if err != nil {
return nil, 0, err
}
op = func(i *encInstr, state *encoderState, p unsafe.Pointer) {
- slice := (*reflect.SliceHeader)(p);
+ slice := (*reflect.SliceHeader)(p)
if slice.Len == 0 {
return
}
- state.update(i);
- state.err = encodeArray(state.b, slice.Data, elemOp, t.Elem().Size(), int(slice.Len), indir);
- };
+ state.update(i)
+ state.err = encodeArray(state.b, slice.Data, elemOp, t.Elem().Size(), int(slice.Len), indir)
+ }
case *reflect.ArrayType:
// True arrays have size in the type.
- elemOp, indir, err := encOpFor(t.Elem());
+ elemOp, indir, err := encOpFor(t.Elem())
if err != nil {
return nil, 0, err
}
op = func(i *encInstr, state *encoderState, p unsafe.Pointer) {
- state.update(i);
- state.err = encodeArray(state.b, uintptr(p), elemOp, t.Elem().Size(), t.Len(), indir);
- };
+ state.update(i)
+ state.err = encodeArray(state.b, uintptr(p), elemOp, t.Elem().Size(), t.Len(), indir)
+ }
case *reflect.StructType:
// Generate a closure that calls out to the engine for the nested type.
- _, err := getEncEngine(typ);
+ _, err := getEncEngine(typ)
if err != nil {
return nil, 0, err
}
- info := mustGetTypeInfo(typ);
+ info := mustGetTypeInfo(typ)
op = func(i *encInstr, state *encoderState, p unsafe.Pointer) {
- state.update(i);
+ state.update(i)
// indirect through info to delay evaluation for recursive structs
- state.err = encodeStruct(info.encoder, state.b, uintptr(p));
- };
+ state.err = encodeStruct(info.encoder, state.b, uintptr(p))
+ }
}
}
if op == nil {
return op, indir, os.ErrorString("gob enc: can't happen: encode type" + rt.String())
}
- return op, indir, nil;
+ return op, indir, nil
}
// The local Type was compiled from the actual value, so we know it's compatible.
func compileEnc(rt reflect.Type) (*encEngine, os.Error) {
- srt, ok := rt.(*reflect.StructType);
+ srt, ok := rt.(*reflect.StructType)
if !ok {
panicln("can't happen: non-struct")
}
- engine := new(encEngine);
- engine.instr = make([]encInstr, srt.NumField()+1); // +1 for terminator
+ engine := new(encEngine)
+ engine.instr = make([]encInstr, srt.NumField()+1) // +1 for terminator
for fieldnum := 0; fieldnum < srt.NumField(); fieldnum++ {
- f := srt.Field(fieldnum);
- op, indir, err := encOpFor(f.Type);
+ f := srt.Field(fieldnum)
+ op, indir, err := encOpFor(f.Type)
if err != nil {
return nil, err
}
- engine.instr[fieldnum] = encInstr{op, fieldnum, indir, uintptr(f.Offset)};
+ engine.instr[fieldnum] = encInstr{op, fieldnum, indir, uintptr(f.Offset)}
}
- engine.instr[srt.NumField()] = encInstr{encStructTerminator, 0, 0, 0};
- return engine, nil;
+ engine.instr[srt.NumField()] = encInstr{encStructTerminator, 0, 0, 0}
+ return engine, nil
}
// typeLock must be held (or we're in initialization and guaranteed single-threaded).
// The reflection type must have all its indirections processed out.
func getEncEngine(rt reflect.Type) (*encEngine, os.Error) {
- info, err := getTypeInfo(rt);
+ info, err := getTypeInfo(rt)
if err != nil {
return nil, err
}
if info.encoder == nil {
// mark this engine as underway before compiling to handle recursive types.
- info.encoder = new(encEngine);
- info.encoder, err = compileEnc(rt);
+ info.encoder = new(encEngine)
+ info.encoder, err = compileEnc(rt)
}
- return info.encoder, err;
+ return info.encoder, err
}
func encode(b *bytes.Buffer, e interface{}) os.Error {
// Dereference down to the underlying object.
- rt, indir := indirect(reflect.Typeof(e));
- v := reflect.NewValue(e);
+ rt, indir := indirect(reflect.Typeof(e))
+ v := reflect.NewValue(e)
for i := 0; i < indir; i++ {
v = reflect.Indirect(v)
}
if _, ok := v.(*reflect.StructValue); !ok {
return os.ErrorString("gob: encode can't handle " + v.Type().String())
}
- typeLock.Lock();
- engine, err := getEncEngine(rt);
- typeLock.Unlock();
+ typeLock.Lock()
+ engine, err := getEncEngine(rt)
+ typeLock.Unlock()
if err != nil {
return err
}
- return encodeStruct(engine, b, v.Addr());
+ return encodeStruct(engine, b, v.Addr())
}
diff --git a/src/pkg/gob/encoder.go b/src/pkg/gob/encoder.go
index 3be455210..cf380cd56 100644
--- a/src/pkg/gob/encoder.go
+++ b/src/pkg/gob/encoder.go
@@ -182,34 +182,34 @@
package gob
import (
- "bytes";
- "io";
- "os";
- "reflect";
- "sync";
+ "bytes"
+ "io"
+ "os"
+ "reflect"
+ "sync"
)
// An Encoder manages the transmission of type and data information to the
// other side of a connection.
type Encoder struct {
- mutex sync.Mutex; // each item must be sent atomically
- w io.Writer; // where to send the data
- sent map[reflect.Type]typeId; // which types we've already sent
- state *encoderState; // so we can encode integers, strings directly
- countState *encoderState; // stage for writing counts
- buf []byte; // for collecting the output.
+ mutex sync.Mutex // each item must be sent atomically
+ w io.Writer // where to send the data
+ sent map[reflect.Type]typeId // which types we've already sent
+ state *encoderState // so we can encode integers, strings directly
+ countState *encoderState // stage for writing counts
+ buf []byte // for collecting the output.
}
// NewEncoder returns a new encoder that will transmit on the io.Writer.
func NewEncoder(w io.Writer) *Encoder {
- enc := new(Encoder);
- enc.w = w;
- enc.sent = make(map[reflect.Type]typeId);
- enc.state = new(encoderState);
- enc.state.b = new(bytes.Buffer); // the rest isn't important; all we need is buffer and writer
- enc.countState = new(encoderState);
- enc.countState.b = new(bytes.Buffer); // the rest isn't important; all we need is buffer and writer
- return enc;
+ enc := new(Encoder)
+ enc.w = w
+ enc.sent = make(map[reflect.Type]typeId)
+ enc.state = new(encoderState)
+ enc.state.b = new(bytes.Buffer) // the rest isn't important; all we need is buffer and writer
+ enc.countState = new(encoderState)
+ enc.countState.b = new(bytes.Buffer) // the rest isn't important; all we need is buffer and writer
+ return enc
}
func (enc *Encoder) badType(rt reflect.Type) {
@@ -217,29 +217,29 @@ func (enc *Encoder) badType(rt reflect.Type) {
}
func (enc *Encoder) setError(err os.Error) {
- if enc.state.err == nil { // remember the first.
+ if enc.state.err == nil { // remember the first.
enc.state.err = err
}
- enc.state.b.Reset();
+ enc.state.b.Reset()
}
// Send the data item preceded by a unsigned count of its length.
func (enc *Encoder) send() {
// Encode the length.
- encodeUint(enc.countState, uint64(enc.state.b.Len()));
+ encodeUint(enc.countState, uint64(enc.state.b.Len()))
// Build the buffer.
- countLen := enc.countState.b.Len();
- total := countLen + enc.state.b.Len();
+ countLen := enc.countState.b.Len()
+ total := countLen + enc.state.b.Len()
if total > len(enc.buf) {
- enc.buf = make([]byte, total+1000) // extra for growth
+ enc.buf = make([]byte, total+1000) // extra for growth
}
// Place the length before the data.
// TODO(r): avoid the extra copy here.
- enc.countState.b.Read(enc.buf[0:countLen]);
+ enc.countState.b.Read(enc.buf[0:countLen])
// Now the data.
- enc.state.b.Read(enc.buf[countLen:total]);
+ enc.state.b.Read(enc.buf[countLen:total])
// Write the data.
- _, err := enc.w.Write(enc.buf[0:total]);
+ _, err := enc.w.Write(enc.buf[0:total])
if err != nil {
enc.setError(err)
}
@@ -247,7 +247,7 @@ func (enc *Encoder) send() {
func (enc *Encoder) sendType(origt reflect.Type) {
// Drill down to the base type.
- rt, _ := indirect(origt);
+ rt, _ := indirect(origt)
// We only send structs - everything else is basic or an error
switch rt := rt.(type) {
@@ -260,14 +260,14 @@ func (enc *Encoder) sendType(origt reflect.Type) {
return
}
// Otherwise we do send.
- break;
+ break
// Struct types are not sent, only their element types.
case *reflect.StructType:
break
case *reflect.ChanType, *reflect.FuncType, *reflect.MapType, *reflect.InterfaceType:
// Probably a bad field in a struct.
- enc.badType(rt);
- return;
+ enc.badType(rt)
+ return
}
// Have we already sent this type? This time we ask about the base type.
@@ -276,27 +276,27 @@ func (enc *Encoder) sendType(origt reflect.Type) {
}
// Need to send it.
- typeLock.Lock();
- info, err := getTypeInfo(rt);
- typeLock.Unlock();
+ typeLock.Lock()
+ info, err := getTypeInfo(rt)
+ typeLock.Unlock()
if err != nil {
- enc.setError(err);
- return;
+ enc.setError(err)
+ return
}
// Send the pair (-id, type)
// Id:
- encodeInt(enc.state, -int64(info.id));
+ encodeInt(enc.state, -int64(info.id))
// Type:
- encode(enc.state.b, info.wire);
- enc.send();
+ encode(enc.state.b, info.wire)
+ enc.send()
if enc.state.err != nil {
return
}
// Remember we've sent this type.
- enc.sent[rt] = info.id;
+ enc.sent[rt] = info.id
// Remember we've sent the top-level, possibly indirect type too.
- enc.sent[origt] = info.id;
+ enc.sent[origt] = info.id
// Now send the inner types
switch st := rt.(type) {
case *reflect.StructType:
@@ -306,7 +306,7 @@ func (enc *Encoder) sendType(origt reflect.Type) {
case reflect.ArrayOrSliceType:
enc.sendType(st.Elem())
}
- return;
+ return
}
// Encode transmits the data item represented by the empty interface value,
@@ -314,40 +314,40 @@ func (enc *Encoder) sendType(origt reflect.Type) {
func (enc *Encoder) Encode(e interface{}) os.Error {
// Make sure we're single-threaded through here, so multiple
// goroutines can share an encoder.
- enc.mutex.Lock();
- defer enc.mutex.Unlock();
+ enc.mutex.Lock()
+ defer enc.mutex.Unlock()
- enc.state.err = nil;
- rt, _ := indirect(reflect.Typeof(e));
+ enc.state.err = nil
+ rt, _ := indirect(reflect.Typeof(e))
// Must be a struct
if _, ok := rt.(*reflect.StructType); !ok {
- enc.badType(rt);
- return enc.state.err;
+ enc.badType(rt)
+ return enc.state.err
}
// Sanity check only: encoder should never come in with data present.
if enc.state.b.Len() > 0 || enc.countState.b.Len() > 0 {
- enc.state.err = os.ErrorString("encoder: buffer not empty");
- return enc.state.err;
+ enc.state.err = os.ErrorString("encoder: buffer not empty")
+ return enc.state.err
}
// Make sure the type is known to the other side.
// First, have we already sent this type?
if _, alreadySent := enc.sent[rt]; !alreadySent {
// No, so send it.
- enc.sendType(rt);
+ enc.sendType(rt)
if enc.state.err != nil {
- enc.countState.b.Reset();
- return enc.state.err;
+ enc.countState.b.Reset()
+ return enc.state.err
}
}
// Identify the type of this top-level value.
- encodeInt(enc.state, int64(enc.sent[rt]));
+ encodeInt(enc.state, int64(enc.sent[rt]))
// Encode the object.
- encode(enc.state.b, e);
- enc.send();
+ encode(enc.state.b, e)
+ enc.send()
- return enc.state.err;
+ return enc.state.err
}
diff --git a/src/pkg/gob/encoder_test.go b/src/pkg/gob/encoder_test.go
index 3445d0e53..1308b85d4 100644
--- a/src/pkg/gob/encoder_test.go
+++ b/src/pkg/gob/encoder_test.go
@@ -5,51 +5,51 @@
package gob
import (
- "bytes";
- "io";
- "os";
- "reflect";
- "strings";
- "testing";
+ "bytes"
+ "io"
+ "os"
+ "reflect"
+ "strings"
+ "testing"
)
type ET2 struct {
- x string;
+ x string
}
type ET1 struct {
- a int;
- et2 *ET2;
- next *ET1;
+ a int
+ et2 *ET2
+ next *ET1
}
// Like ET1 but with a different name for a field
type ET3 struct {
- a int;
- et2 *ET2;
- differentNext *ET1;
+ a int
+ et2 *ET2
+ differentNext *ET1
}
// Like ET1 but with a different type for a field
type ET4 struct {
- a int;
- et2 float;
- next int;
+ a int
+ et2 float
+ next int
}
func TestEncoderDecoder(t *testing.T) {
- b := new(bytes.Buffer);
- enc := NewEncoder(b);
- et1 := new(ET1);
- et1.a = 7;
- et1.et2 = new(ET2);
- enc.Encode(et1);
+ b := new(bytes.Buffer)
+ enc := NewEncoder(b)
+ et1 := new(ET1)
+ et1.a = 7
+ et1.et2 = new(ET2)
+ enc.Encode(et1)
if enc.state.err != nil {
t.Error("encoder fail:", enc.state.err)
}
- dec := NewDecoder(b);
- newEt1 := new(ET1);
- dec.Decode(newEt1);
+ dec := NewDecoder(b)
+ newEt1 := new(ET1)
+ dec.Decode(newEt1)
if dec.state.err != nil {
t.Fatal("error decoding ET1:", dec.state.err)
}
@@ -61,9 +61,9 @@ func TestEncoderDecoder(t *testing.T) {
t.Error("not at eof;", b.Len(), "bytes left")
}
- enc.Encode(et1);
- newEt1 = new(ET1);
- dec.Decode(newEt1);
+ enc.Encode(et1)
+ newEt1 = new(ET1)
+ dec.Decode(newEt1)
if dec.state.err != nil {
t.Fatal("round 2: error decoding ET1:", dec.state.err)
}
@@ -75,12 +75,12 @@ func TestEncoderDecoder(t *testing.T) {
}
// Now test with a running encoder/decoder pair that we recognize a type mismatch.
- enc.Encode(et1);
+ enc.Encode(et1)
if enc.state.err != nil {
t.Error("round 3: encoder fail:", enc.state.err)
}
- newEt2 := new(ET2);
- dec.Decode(newEt2);
+ newEt2 := new(ET2)
+ dec.Decode(newEt2)
if dec.state.err == nil {
t.Fatal("round 3: expected `bad type' error decoding ET2")
}
@@ -89,17 +89,17 @@ func TestEncoderDecoder(t *testing.T) {
// Run one value through the encoder/decoder, but use the wrong type.
// Input is always an ET1; we compare it to whatever is under 'e'.
func badTypeCheck(e interface{}, shouldFail bool, msg string, t *testing.T) {
- b := new(bytes.Buffer);
- enc := NewEncoder(b);
- et1 := new(ET1);
- et1.a = 7;
- et1.et2 = new(ET2);
- enc.Encode(et1);
+ b := new(bytes.Buffer)
+ enc := NewEncoder(b)
+ et1 := new(ET1)
+ et1.a = 7
+ et1.et2 = new(ET2)
+ enc.Encode(et1)
if enc.state.err != nil {
t.Error("encoder fail:", enc.state.err)
}
- dec := NewDecoder(b);
- dec.Decode(e);
+ dec := NewDecoder(b)
+ dec.Decode(e)
if shouldFail && (dec.state.err == nil) {
t.Error("expected error for", msg)
}
@@ -110,15 +110,15 @@ func badTypeCheck(e interface{}, shouldFail bool, msg string, t *testing.T) {
// Test that we recognize a bad type the first time.
func TestWrongTypeDecoder(t *testing.T) {
- badTypeCheck(new(ET2), true, "no fields in common", t);
- badTypeCheck(new(ET3), false, "different name of field", t);
- badTypeCheck(new(ET4), true, "different type of field", t);
+ badTypeCheck(new(ET2), true, "no fields in common", t)
+ badTypeCheck(new(ET3), false, "different name of field", t)
+ badTypeCheck(new(ET4), true, "different type of field", t)
}
func corruptDataCheck(s string, err os.Error, t *testing.T) {
- b := bytes.NewBufferString(s);
- dec := NewDecoder(b);
- dec.Decode(new(ET2));
+ b := bytes.NewBufferString(s)
+ dec := NewDecoder(b)
+ dec.Decode(new(ET2))
if dec.state.err != err {
t.Error("expected error", err, "got", dec.state.err)
}
@@ -126,9 +126,9 @@ func corruptDataCheck(s string, err os.Error, t *testing.T) {
// Check that we survive bad data.
func TestBadData(t *testing.T) {
- corruptDataCheck("", os.EOF, t);
- corruptDataCheck("\x7Fhi", io.ErrUnexpectedEOF, t);
- corruptDataCheck("\x03now is the time for all good men", errBadType, t);
+ corruptDataCheck("", os.EOF, t)
+ corruptDataCheck("\x7Fhi", io.ErrUnexpectedEOF, t)
+ corruptDataCheck("\x03now is the time for all good men", errBadType, t)
}
// Types not supported by the Encoder (only structs work at the top level).
@@ -146,10 +146,10 @@ var unsupportedValues = []interface{}{
}
func TestUnsupported(t *testing.T) {
- var b bytes.Buffer;
- enc := NewEncoder(&b);
+ var b bytes.Buffer
+ enc := NewEncoder(&b)
for _, v := range unsupportedValues {
- err := enc.Encode(v);
+ err := enc.Encode(v)
if err == nil {
t.Errorf("expected error for %T; got none", v)
}
@@ -157,27 +157,27 @@ func TestUnsupported(t *testing.T) {
}
func encAndDec(in, out interface{}) os.Error {
- b := new(bytes.Buffer);
- enc := NewEncoder(b);
- enc.Encode(in);
+ b := new(bytes.Buffer)
+ enc := NewEncoder(b)
+ enc.Encode(in)
if enc.state.err != nil {
return enc.state.err
}
- dec := NewDecoder(b);
- dec.Decode(out);
+ dec := NewDecoder(b)
+ dec.Decode(out)
if dec.state.err != nil {
return dec.state.err
}
- return nil;
+ return nil
}
func TestTypeToPtrType(t *testing.T) {
// Encode a T, decode a *T
type Type0 struct {
- a int;
+ a int
}
- t0 := Type0{7};
- t0p := (*Type0)(nil);
+ t0 := Type0{7}
+ t0p := (*Type0)(nil)
if err := encAndDec(t0, t0p); err != nil {
t.Error(err)
}
@@ -186,10 +186,10 @@ func TestTypeToPtrType(t *testing.T) {
func TestPtrTypeToType(t *testing.T) {
// Encode a *T, decode a T
type Type1 struct {
- a uint;
+ a uint
}
- t1p := &Type1{17};
- var t1 Type1;
+ t1p := &Type1{17}
+ var t1 Type1
if err := encAndDec(t1, t1p); err != nil {
t.Error(err)
}
@@ -197,15 +197,15 @@ func TestPtrTypeToType(t *testing.T) {
func TestTypeToPtrPtrPtrPtrType(t *testing.T) {
type Type2 struct {
- a ****float;
+ a ****float
}
- t2 := Type2{};
- t2.a = new(***float);
- *t2.a = new(**float);
- **t2.a = new(*float);
- ***t2.a = new(float);
- ****t2.a = 27.4;
- t2pppp := new(***Type2);
+ t2 := Type2{}
+ t2.a = new(***float)
+ *t2.a = new(**float)
+ **t2.a = new(*float)
+ ***t2.a = new(float)
+ ****t2.a = 27.4
+ t2pppp := new(***Type2)
if err := encAndDec(t2, t2pppp); err != nil {
t.Error(err)
}
@@ -216,10 +216,10 @@ func TestTypeToPtrPtrPtrPtrType(t *testing.T) {
func TestSlice(t *testing.T) {
type Type3 struct {
- a []string;
+ a []string
}
- t3p := &Type3{[]string{"hello", "world"}};
- var t3 Type3;
+ t3p := &Type3{[]string{"hello", "world"}}
+ var t3 Type3
if err := encAndDec(t3, t3p); err != nil {
t.Error(err)
}
@@ -228,10 +228,10 @@ func TestSlice(t *testing.T) {
func TestValueError(t *testing.T) {
// Encode a *T, decode a T
type Type4 struct {
- a int;
+ a int
}
- t4p := &Type4{3};
- var t4 Type4; // note: not a pointer.
+ t4p := &Type4{3}
+ var t4 Type4 // note: not a pointer.
if err := encAndDec(t4p, t4); err == nil || strings.Index(err.String(), "pointer") < 0 {
t.Error("expected error about pointer; got", err)
}
@@ -239,17 +239,17 @@ func TestValueError(t *testing.T) {
func TestArray(t *testing.T) {
type Type5 struct {
- a [3]string;
+ a [3]string
}
type Type6 struct {
- a [2]string; // can't hold t5.a
+ a [2]string // can't hold t5.a
}
- t5 := Type5{[3]string{"hello", ",", "world"}};
- var t5p Type5;
+ t5 := Type5{[3]string{"hello", ",", "world"}}
+ var t5p Type5
if err := encAndDec(t5, &t5p); err != nil {
t.Error(err)
}
- var t6 Type6;
+ var t6 Type6
if err := encAndDec(t5, &t6); err == nil {
t.Error("should fail with mismatched array sizes")
}
diff --git a/src/pkg/gob/type.go b/src/pkg/gob/type.go
index 08aaca5dc..58ed96b32 100644
--- a/src/pkg/gob/type.go
+++ b/src/pkg/gob/type.go
@@ -5,10 +5,10 @@
package gob
import (
- "fmt";
- "os";
- "reflect";
- "sync";
+ "fmt"
+ "os"
+ "reflect"
+ "sync"
)
type kind reflect.Type
@@ -25,67 +25,67 @@ type kind reflect.Type
// int8, int16, int, uint, float, func, chan, struct, and so on.
// That is, all struct types have the same kind, all func types have the same
// kind, all int8 types have the same kind, and so on.
-func typeKind(typ reflect.Type) kind { return kind(reflect.Typeof(typ)) }
+func typeKind(typ reflect.Type) kind { return kind(reflect.Typeof(typ)) }
// valueKind returns the kind of the value type
// stored inside the interface v.
-func valueKind(v interface{}) reflect.Type { return typeKind(reflect.Typeof(v)) }
+func valueKind(v interface{}) reflect.Type { return typeKind(reflect.Typeof(v)) }
// A typeId represents a gob Type as an integer that can be passed on the wire.
// Internally, typeIds are used as keys to a map to recover the underlying type info.
type typeId int32
-var nextId typeId // incremented for each new type we build
-var typeLock sync.Mutex // set while building a type
+var nextId typeId // incremented for each new type we build
+var typeLock sync.Mutex // set while building a type
type gobType interface {
- id() typeId;
- setId(id typeId);
- Name() string;
- string() string; // not public; only for debugging
- safeString(seen map[typeId]bool) string;
+ id() typeId
+ setId(id typeId)
+ Name() string
+ string() string // not public; only for debugging
+ safeString(seen map[typeId]bool) string
}
var types = make(map[reflect.Type]gobType)
var idToType = make(map[typeId]gobType)
-var builtinIdToType map[typeId]gobType // set in init() after builtins are established
+var builtinIdToType map[typeId]gobType // set in init() after builtins are established
func setTypeId(typ gobType) {
- nextId++;
- typ.setId(nextId);
- idToType[nextId] = typ;
+ nextId++
+ typ.setId(nextId)
+ idToType[nextId] = typ
}
func (t typeId) gobType() gobType {
if t == 0 {
return nil
}
- return idToType[t];
+ return idToType[t]
}
// string returns the string representation of the type associated with the typeId.
-func (t typeId) string() string { return t.gobType().string() }
+func (t typeId) string() string { return t.gobType().string() }
// Name returns the name of the type associated with the typeId.
-func (t typeId) Name() string { return t.gobType().Name() }
+func (t typeId) Name() string { return t.gobType().Name() }
// Common elements of all types.
type commonType struct {
- name string;
- _id typeId;
+ name string
+ _id typeId
}
-func (t *commonType) id() typeId { return t._id }
+func (t *commonType) id() typeId { return t._id }
-func (t *commonType) setId(id typeId) { t._id = id }
+func (t *commonType) setId(id typeId) { t._id = id }
-func (t *commonType) string() string { return t.name }
+func (t *commonType) string() string { return t.name }
func (t *commonType) safeString(seen map[typeId]bool) string {
return t.name
}
-func (t *commonType) Name() string { return t.name }
+func (t *commonType) Name() string { return t.name }
// Create and check predefined types
// The string for tBytes is "bytes" not "[]byte" to signify its specialness.
@@ -101,11 +101,11 @@ var tString = bootstrapType("string", "", 6)
var tWireType = mustGetTypeInfo(reflect.Typeof(wireType{})).id
func init() {
- checkId(7, tWireType);
- checkId(9, mustGetTypeInfo(reflect.Typeof(commonType{})).id);
- checkId(11, mustGetTypeInfo(reflect.Typeof(structType{})).id);
- checkId(12, mustGetTypeInfo(reflect.Typeof(fieldType{})).id);
- builtinIdToType = make(map[typeId]gobType);
+ checkId(7, tWireType)
+ checkId(9, mustGetTypeInfo(reflect.Typeof(commonType{})).id)
+ checkId(11, mustGetTypeInfo(reflect.Typeof(structType{})).id)
+ checkId(12, mustGetTypeInfo(reflect.Typeof(fieldType{})).id)
+ builtinIdToType = make(map[typeId]gobType)
for k, v := range idToType {
builtinIdToType[k] = v
}
@@ -113,58 +113,58 @@ func init() {
// Array type
type arrayType struct {
- commonType;
- Elem typeId;
- Len int;
+ commonType
+ Elem typeId
+ Len int
}
func newArrayType(name string, elem gobType, length int) *arrayType {
- a := &arrayType{commonType{name: name}, elem.id(), length};
- setTypeId(a);
- return a;
+ a := &arrayType{commonType{name: name}, elem.id(), length}
+ setTypeId(a)
+ return a
}
func (a *arrayType) safeString(seen map[typeId]bool) string {
if _, ok := seen[a._id]; ok {
return a.name
}
- seen[a._id] = true;
- return fmt.Sprintf("[%d]%s", a.Len, a.Elem.gobType().safeString(seen));
+ seen[a._id] = true
+ return fmt.Sprintf("[%d]%s", a.Len, a.Elem.gobType().safeString(seen))
}
-func (a *arrayType) string() string { return a.safeString(make(map[typeId]bool)) }
+func (a *arrayType) string() string { return a.safeString(make(map[typeId]bool)) }
// Slice type
type sliceType struct {
- commonType;
- Elem typeId;
+ commonType
+ Elem typeId
}
func newSliceType(name string, elem gobType) *sliceType {
- s := &sliceType{commonType{name: name}, elem.id()};
- setTypeId(s);
- return s;
+ s := &sliceType{commonType{name: name}, elem.id()}
+ setTypeId(s)
+ return s
}
func (s *sliceType) safeString(seen map[typeId]bool) string {
if _, ok := seen[s._id]; ok {
return s.name
}
- seen[s._id] = true;
- return fmt.Sprintf("[]%s", s.Elem.gobType().safeString(seen));
+ seen[s._id] = true
+ return fmt.Sprintf("[]%s", s.Elem.gobType().safeString(seen))
}
-func (s *sliceType) string() string { return s.safeString(make(map[typeId]bool)) }
+func (s *sliceType) string() string { return s.safeString(make(map[typeId]bool)) }
// Struct type
type fieldType struct {
- name string;
- id typeId;
+ name string
+ id typeId
}
type structType struct {
- commonType;
- field []*fieldType;
+ commonType
+ field []*fieldType
}
func (s *structType) safeString(seen map[typeId]bool) string {
@@ -174,36 +174,36 @@ func (s *structType) safeString(seen map[typeId]bool) string {
if _, ok := seen[s._id]; ok {
return s.name
}
- seen[s._id] = true;
- str := s.name + " = struct { ";
+ seen[s._id] = true
+ str := s.name + " = struct { "
for _, f := range s.field {
str += fmt.Sprintf("%s %s; ", f.name, f.id.gobType().safeString(seen))
}
- str += "}";
- return str;
+ str += "}"
+ return str
}
-func (s *structType) string() string { return s.safeString(make(map[typeId]bool)) }
+func (s *structType) string() string { return s.safeString(make(map[typeId]bool)) }
func newStructType(name string) *structType {
- s := &structType{commonType{name: name}, nil};
- setTypeId(s);
- return s;
+ s := &structType{commonType{name: name}, nil}
+ setTypeId(s)
+ return s
}
// Step through the indirections on a type to discover the base type.
// Return the number of indirections.
func indirect(t reflect.Type) (rt reflect.Type, count int) {
- rt = t;
+ rt = t
for {
- pt, ok := rt.(*reflect.PtrType);
+ pt, ok := rt.(*reflect.PtrType)
if !ok {
break
}
- rt = pt.Elem();
- count++;
+ rt = pt.Elem()
+ count++
}
- return;
+ return
}
func newTypeObject(name string, rt reflect.Type) (gobType, os.Error) {
@@ -247,50 +247,50 @@ func newTypeObject(name string, rt reflect.Type) (gobType, os.Error) {
return tString.gobType(), nil
case *reflect.ArrayType:
- gt, err := getType("", t.Elem());
+ gt, err := getType("", t.Elem())
if err != nil {
return nil, err
}
- return newArrayType(name, gt, t.Len()), nil;
+ return newArrayType(name, gt, t.Len()), nil
case *reflect.SliceType:
// []byte == []uint8 is a special case
if _, ok := t.Elem().(*reflect.Uint8Type); ok {
return tBytes.gobType(), nil
}
- gt, err := getType(t.Elem().Name(), t.Elem());
+ gt, err := getType(t.Elem().Name(), t.Elem())
if err != nil {
return nil, err
}
- return newSliceType(name, gt), nil;
+ return newSliceType(name, gt), nil
case *reflect.StructType:
// Install the struct type itself before the fields so recursive
// structures can be constructed safely.
- strType := newStructType(name);
- types[rt] = strType;
- idToType[strType.id()] = strType;
- field := make([]*fieldType, t.NumField());
+ strType := newStructType(name)
+ types[rt] = strType
+ idToType[strType.id()] = strType
+ field := make([]*fieldType, t.NumField())
for i := 0; i < t.NumField(); i++ {
- f := t.Field(i);
- typ, _ := indirect(f.Type);
- tname := typ.Name();
+ f := t.Field(i)
+ typ, _ := indirect(f.Type)
+ tname := typ.Name()
if tname == "" {
tname = f.Type.String()
}
- gt, err := getType(tname, f.Type);
+ gt, err := getType(tname, f.Type)
if err != nil {
return nil, err
}
- field[i] = &fieldType{f.Name, gt.id()};
+ field[i] = &fieldType{f.Name, gt.id()}
}
- strType.field = field;
- return strType, nil;
+ strType.field = field
+ return strType, nil
default:
return nil, os.ErrorString("gob NewTypeObject can't handle type: " + rt.String())
}
- return nil, nil;
+ return nil, nil
}
// getType returns the Gob type describing the given reflect.Type.
@@ -298,21 +298,21 @@ func newTypeObject(name string, rt reflect.Type) (gobType, os.Error) {
func getType(name string, rt reflect.Type) (gobType, os.Error) {
// Flatten the data structure by collapsing out pointers
for {
- pt, ok := rt.(*reflect.PtrType);
+ pt, ok := rt.(*reflect.PtrType)
if !ok {
break
}
- rt = pt.Elem();
+ rt = pt.Elem()
}
- typ, present := types[rt];
+ typ, present := types[rt]
if present {
return typ, nil
}
- typ, err := newTypeObject(name, rt);
+ typ, err := newTypeObject(name, rt)
if err == nil {
types[rt] = typ
}
- return typ, err;
+ return typ, err
}
func checkId(want, got typeId) {
@@ -323,16 +323,16 @@ func checkId(want, got typeId) {
// used for building the basic types; called only from init()
func bootstrapType(name string, e interface{}, expect typeId) typeId {
- rt := reflect.Typeof(e);
- _, present := types[rt];
+ rt := reflect.Typeof(e)
+ _, present := types[rt]
if present {
panicln("bootstrap type already present:", name)
}
- typ := &commonType{name: name};
- types[rt] = typ;
- setTypeId(typ);
- checkId(expect, nextId);
- return nextId;
+ typ := &commonType{name: name}
+ types[rt] = typ
+ setTypeId(typ)
+ checkId(expect, nextId)
+ return nextId
}
// Representation of the information we send and receive about this type.
@@ -346,25 +346,25 @@ func bootstrapType(name string, e interface{}, expect typeId) typeId {
// are built in encode.go's init() function.
type wireType struct {
- array *arrayType;
- slice *sliceType;
- strct *structType;
+ array *arrayType
+ slice *sliceType
+ strct *structType
}
func (w *wireType) name() string {
if w.strct != nil {
return w.strct.name
}
- return "unknown";
+ return "unknown"
}
type typeInfo struct {
- id typeId;
- encoder *encEngine;
- wire *wireType;
+ id typeId
+ encoder *encEngine
+ wire *wireType
}
-var typeInfoMap = make(map[reflect.Type]*typeInfo) // protected by typeLock
+var typeInfoMap = make(map[reflect.Type]*typeInfo) // protected by typeLock
// The reflection type must have all its indirections processed out.
// typeLock must be held.
@@ -372,16 +372,16 @@ func getTypeInfo(rt reflect.Type) (*typeInfo, os.Error) {
if _, ok := rt.(*reflect.PtrType); ok {
panicln("pointer type in getTypeInfo:", rt.String())
}
- info, ok := typeInfoMap[rt];
+ info, ok := typeInfoMap[rt]
if !ok {
- info = new(typeInfo);
- name := rt.Name();
- gt, err := getType(name, rt);
+ info = new(typeInfo)
+ name := rt.Name()
+ gt, err := getType(name, rt)
if err != nil {
return nil, err
}
- info.id = gt.id();
- t := info.id.gobType();
+ info.id = gt.id()
+ t := info.id.gobType()
switch typ := rt.(type) {
case *reflect.ArrayType:
info.wire = &wireType{array: t.(*arrayType)}
@@ -393,16 +393,16 @@ func getTypeInfo(rt reflect.Type) (*typeInfo, os.Error) {
case *reflect.StructType:
info.wire = &wireType{strct: t.(*structType)}
}
- typeInfoMap[rt] = info;
+ typeInfoMap[rt] = info
}
- return info, nil;
+ return info, nil
}
// Called only when a panic is acceptable and unexpected.
func mustGetTypeInfo(rt reflect.Type) *typeInfo {
- t, err := getTypeInfo(rt);
+ t, err := getTypeInfo(rt)
if err != nil {
panicln("getTypeInfo:", err.String())
}
- return t;
+ return t
}
diff --git a/src/pkg/gob/type_test.go b/src/pkg/gob/type_test.go
index f1f44bdc2..2c3d0442e 100644
--- a/src/pkg/gob/type_test.go
+++ b/src/pkg/gob/type_test.go
@@ -5,13 +5,13 @@
package gob
import (
- "reflect";
- "testing";
+ "reflect"
+ "testing"
)
type typeT struct {
- id typeId;
- str string;
+ id typeId
+ str string
}
var basicTypes = []typeT{
@@ -24,13 +24,13 @@ var basicTypes = []typeT{
}
func getTypeUnlocked(name string, rt reflect.Type) gobType {
- typeLock.Lock();
- defer typeLock.Unlock();
- t, err := getType(name, rt);
+ typeLock.Lock()
+ defer typeLock.Unlock()
+ t, err := getType(name, rt)
if err != nil {
panicln("getTypeUnlocked:", err.String())
}
- return t;
+ return t
}
// Sanity checks
@@ -47,86 +47,86 @@ func TestBasic(t *testing.T) {
// Reregister some basic types to check registration is idempotent.
func TestReregistration(t *testing.T) {
- newtyp := getTypeUnlocked("int", reflect.Typeof(int(0)));
+ newtyp := getTypeUnlocked("int", reflect.Typeof(int(0)))
if newtyp != tInt.gobType() {
t.Errorf("reregistration of %s got new type", newtyp.string())
}
- newtyp = getTypeUnlocked("uint", reflect.Typeof(uint(0)));
+ newtyp = getTypeUnlocked("uint", reflect.Typeof(uint(0)))
if newtyp != tUint.gobType() {
t.Errorf("reregistration of %s got new type", newtyp.string())
}
- newtyp = getTypeUnlocked("string", reflect.Typeof("hello"));
+ newtyp = getTypeUnlocked("string", reflect.Typeof("hello"))
if newtyp != tString.gobType() {
t.Errorf("reregistration of %s got new type", newtyp.string())
}
}
func TestArrayType(t *testing.T) {
- var a3 [3]int;
- a3int := getTypeUnlocked("foo", reflect.Typeof(a3));
- newa3int := getTypeUnlocked("bar", reflect.Typeof(a3));
+ var a3 [3]int
+ a3int := getTypeUnlocked("foo", reflect.Typeof(a3))
+ newa3int := getTypeUnlocked("bar", reflect.Typeof(a3))
if a3int != newa3int {
t.Errorf("second registration of [3]int creates new type")
}
- var a4 [4]int;
- a4int := getTypeUnlocked("goo", reflect.Typeof(a4));
+ var a4 [4]int
+ a4int := getTypeUnlocked("goo", reflect.Typeof(a4))
if a3int == a4int {
t.Errorf("registration of [3]int creates same type as [4]int")
}
- var b3 [3]bool;
- a3bool := getTypeUnlocked("", reflect.Typeof(b3));
+ var b3 [3]bool
+ a3bool := getTypeUnlocked("", reflect.Typeof(b3))
if a3int == a3bool {
t.Errorf("registration of [3]bool creates same type as [3]int")
}
- str := a3bool.string();
- expected := "[3]bool";
+ str := a3bool.string()
+ expected := "[3]bool"
if str != expected {
t.Errorf("array printed as %q; expected %q", str, expected)
}
}
func TestSliceType(t *testing.T) {
- var s []int;
- sint := getTypeUnlocked("slice", reflect.Typeof(s));
- var news []int;
- newsint := getTypeUnlocked("slice1", reflect.Typeof(news));
+ var s []int
+ sint := getTypeUnlocked("slice", reflect.Typeof(s))
+ var news []int
+ newsint := getTypeUnlocked("slice1", reflect.Typeof(news))
if sint != newsint {
t.Errorf("second registration of []int creates new type")
}
- var b []bool;
- sbool := getTypeUnlocked("", reflect.Typeof(b));
+ var b []bool
+ sbool := getTypeUnlocked("", reflect.Typeof(b))
if sbool == sint {
t.Errorf("registration of []bool creates same type as []int")
}
- str := sbool.string();
- expected := "[]bool";
+ str := sbool.string()
+ expected := "[]bool"
if str != expected {
t.Errorf("slice printed as %q; expected %q", str, expected)
}
}
type Bar struct {
- x string;
+ x string
}
// This structure has pointers and refers to itself, making it a good test case.
type Foo struct {
- a int;
- b int32; // will become int
- c string;
- d []byte;
- e *float; // will become float
- f ****float64; // will become float
- g *Bar;
- h *Bar; // should not interpolate the definition of Bar again
- i *Foo; // will not explode
+ a int
+ b int32 // will become int
+ c string
+ d []byte
+ e *float // will become float
+ f ****float64 // will become float
+ g *Bar
+ h *Bar // should not interpolate the definition of Bar again
+ i *Foo // will not explode
}
func TestStructType(t *testing.T) {
- sstruct := getTypeUnlocked("Foo", reflect.Typeof(Foo{}));
- str := sstruct.string();
+ sstruct := getTypeUnlocked("Foo", reflect.Typeof(Foo{}))
+ str := sstruct.string()
// If we can print it correctly, we built it correctly.
- expected := "Foo = struct { a int; b int; c string; d bytes; e float; f float; g Bar = struct { x string; }; h Bar; i Foo; }";
+ expected := "Foo = struct { a int; b int; c string; d bytes; e float; f float; g Bar = struct { x string; }; h Bar; i Foo; }"
if str != expected {
t.Errorf("struct printed as %q; expected %q", str, expected)
}
diff --git a/src/pkg/hash/adler32/adler32.go b/src/pkg/hash/adler32/adler32.go
index ec7c6dc30..cd0c2599a 100644
--- a/src/pkg/hash/adler32/adler32.go
+++ b/src/pkg/hash/adler32/adler32.go
@@ -12,12 +12,12 @@
package adler32
import (
- "hash";
- "os";
+ "hash"
+ "os"
)
const (
- mod = 65521;
+ mod = 65521
)
// The size of an Adler-32 checksum in bytes.
@@ -27,62 +27,62 @@ const Size = 4
type digest struct {
// invariant: (a < mod && b < mod) || a <= b
// invariant: a + b + 255 <= 0xffffffff
- a, b uint32;
+ a, b uint32
}
-func (d *digest) Reset() { d.a, d.b = 1, 0 }
+func (d *digest) Reset() { d.a, d.b = 1, 0 }
// New returns a new hash.Hash32 computing the Adler-32 checksum.
func New() hash.Hash32 {
- d := new(digest);
- d.Reset();
- return d;
+ d := new(digest)
+ d.Reset()
+ return d
}
-func (d *digest) Size() int { return Size }
+func (d *digest) Size() int { return Size }
// Add p to the running checksum a, b.
func update(a, b uint32, p []byte) (aa, bb uint32) {
for i := 0; i < len(p); i++ {
- a += uint32(p[i]);
- b += a;
+ a += uint32(p[i])
+ b += a
// invariant: a <= b
if b > (0xffffffff-255)/2 {
- a %= mod;
- b %= mod;
+ a %= mod
+ b %= mod
// invariant: a < mod && b < mod
} else {
// invariant: a + b + 255 <= 2 * b + 255 <= 0xffffffff
}
}
- return a, b;
+ return a, b
}
// Return the 32-bit checksum corresponding to a, b.
func finish(a, b uint32) uint32 {
if b >= mod {
- a %= mod;
- b %= mod;
+ a %= mod
+ b %= mod
}
- return b<<16 | a;
+ return b<<16 | a
}
func (d *digest) Write(p []byte) (nn int, err os.Error) {
- d.a, d.b = update(d.a, d.b, p);
- return len(p), nil;
+ d.a, d.b = update(d.a, d.b, p)
+ return len(p), nil
}
-func (d *digest) Sum32() uint32 { return finish(d.a, d.b) }
+func (d *digest) Sum32() uint32 { return finish(d.a, d.b) }
func (d *digest) Sum() []byte {
- p := make([]byte, 4);
- s := d.Sum32();
- p[0] = byte(s >> 24);
- p[1] = byte(s >> 16);
- p[2] = byte(s >> 8);
- p[3] = byte(s);
- return p;
+ p := make([]byte, 4)
+ s := d.Sum32()
+ p[0] = byte(s >> 24)
+ p[1] = byte(s >> 16)
+ p[2] = byte(s >> 8)
+ p[3] = byte(s)
+ return p
}
// Checksum returns the Adler-32 checksum of data.
-func Checksum(data []byte) uint32 { return finish(update(1, 0, data)) }
+func Checksum(data []byte) uint32 { return finish(update(1, 0, data)) }
diff --git a/src/pkg/hash/adler32/adler32_test.go b/src/pkg/hash/adler32/adler32_test.go
index 0197270b2..cfe9c9547 100644
--- a/src/pkg/hash/adler32/adler32_test.go
+++ b/src/pkg/hash/adler32/adler32_test.go
@@ -5,13 +5,13 @@
package adler32
import (
- "io";
- "testing";
+ "io"
+ "testing"
)
type _Adler32Test struct {
- out uint32;
- in string;
+ out uint32
+ in string
}
var golden = []_Adler32Test{
@@ -51,13 +51,13 @@ var golden = []_Adler32Test{
func TestGolden(t *testing.T) {
for i := 0; i < len(golden); i++ {
- g := golden[i];
- c := New();
- io.WriteString(c, g.in);
- s := c.Sum32();
+ g := golden[i]
+ c := New()
+ io.WriteString(c, g.in)
+ s := c.Sum32()
if s != g.out {
- t.Errorf("adler32(%s) = 0x%x want 0x%x", g.in, s, g.out);
- t.FailNow();
+ t.Errorf("adler32(%s) = 0x%x want 0x%x", g.in, s, g.out)
+ t.FailNow()
}
}
}
diff --git a/src/pkg/hash/crc32/crc32.go b/src/pkg/hash/crc32/crc32.go
index 9330f9812..c8fd9f014 100644
--- a/src/pkg/hash/crc32/crc32.go
+++ b/src/pkg/hash/crc32/crc32.go
@@ -7,8 +7,8 @@
package crc32
import (
- "hash";
- "os";
+ "hash"
+ "os"
)
// The size of a CRC-32 checksum in bytes.
@@ -18,17 +18,17 @@ const Size = 4
const (
// Far and away the most common CRC-32 polynomial.
// Used by ethernet (IEEE 802.3), v.42, fddi, gzip, zip, png, mpeg-2, ...
- IEEE = 0xedb88320;
+ IEEE = 0xedb88320
// Castagnoli's polynomial, used in iSCSI.
// Has better error detection characteristics than IEEE.
// http://dx.doi.org/10.1109/26.231911
- Castagnoli = 0x82f63b78;
+ Castagnoli = 0x82f63b78
// Koopman's polynomial.
// Also has better error detection characteristics than IEEE.
// http://dx.doi.org/10.1109/DSN.2002.1028931
- Koopman = 0xeb31d82e;
+ Koopman = 0xeb31d82e
)
// Table is a 256-word table representing the polynomial for efficient processing.
@@ -36,9 +36,9 @@ type Table [256]uint32
// MakeTable returns the Table constructed from the specified polynomial.
func MakeTable(poly uint32) *Table {
- t := new(Table);
+ t := new(Table)
for i := 0; i < 256; i++ {
- crc := uint32(i);
+ crc := uint32(i)
for j := 0; j < 8; j++ {
if crc&1 == 1 {
crc = (crc >> 1) ^ poly
@@ -46,9 +46,9 @@ func MakeTable(poly uint32) *Table {
crc >>= 1
}
}
- t[i] = crc;
+ t[i] = crc
}
- return t;
+ return t
}
// IEEETable is the table for the IEEE polynomial.
@@ -56,51 +56,51 @@ var IEEETable = MakeTable(IEEE)
// digest represents the partial evaluation of a checksum.
type digest struct {
- crc uint32;
- tab *Table;
+ crc uint32
+ tab *Table
}
// New creates a new hash.Hash32 computing the CRC-32 checksum
// using the polynomial represented by the Table.
-func New(tab *Table) hash.Hash32 { return &digest{0, tab} }
+func New(tab *Table) hash.Hash32 { return &digest{0, tab} }
// NewIEEE creates a new hash.Hash32 computing the CRC-32 checksum
// using the IEEE polynomial.
-func NewIEEE() hash.Hash32 { return New(IEEETable) }
+func NewIEEE() hash.Hash32 { return New(IEEETable) }
-func (d *digest) Size() int { return Size }
+func (d *digest) Size() int { return Size }
-func (d *digest) Reset() { d.crc = 0 }
+func (d *digest) Reset() { d.crc = 0 }
func update(crc uint32, tab *Table, p []byte) uint32 {
- crc = ^crc;
+ crc = ^crc
for i := 0; i < len(p); i++ {
crc = tab[byte(crc)^p[i]] ^ (crc >> 8)
}
- return ^crc;
+ return ^crc
}
func (d *digest) Write(p []byte) (n int, err os.Error) {
- d.crc = update(d.crc, d.tab, p);
- return len(p), nil;
+ d.crc = update(d.crc, d.tab, p)
+ return len(p), nil
}
-func (d *digest) Sum32() uint32 { return d.crc }
+func (d *digest) Sum32() uint32 { return d.crc }
func (d *digest) Sum() []byte {
- p := make([]byte, 4);
- s := d.Sum32();
- p[0] = byte(s >> 24);
- p[1] = byte(s >> 16);
- p[2] = byte(s >> 8);
- p[3] = byte(s);
- return p;
+ p := make([]byte, 4)
+ s := d.Sum32()
+ p[0] = byte(s >> 24)
+ p[1] = byte(s >> 16)
+ p[2] = byte(s >> 8)
+ p[3] = byte(s)
+ return p
}
// Checksum returns the CRC-32 checksum of data
// using the polynomial represented by the Table.
-func Checksum(data []byte, tab *Table) uint32 { return update(0, tab, data) }
+func Checksum(data []byte, tab *Table) uint32 { return update(0, tab, data) }
// ChecksumIEEE returns the CRC-32 checksum of data
// using the IEEE polynomial.
-func ChecksumIEEE(data []byte) uint32 { return update(0, IEEETable, data) }
+func ChecksumIEEE(data []byte) uint32 { return update(0, IEEETable, data) }
diff --git a/src/pkg/hash/crc32/crc32_test.go b/src/pkg/hash/crc32/crc32_test.go
index f9e6053ed..ce81b7231 100644
--- a/src/pkg/hash/crc32/crc32_test.go
+++ b/src/pkg/hash/crc32/crc32_test.go
@@ -5,13 +5,13 @@
package crc32
import (
- "io";
- "testing";
+ "io"
+ "testing"
)
type _Crc32Test struct {
- out uint32;
- in string;
+ out uint32
+ in string
}
var golden = []_Crc32Test{
@@ -50,25 +50,25 @@ var golden = []_Crc32Test{
func TestGolden(t *testing.T) {
for i := 0; i < len(golden); i++ {
- g := golden[i];
- c := NewIEEE();
- io.WriteString(c, g.in);
- s := c.Sum32();
+ g := golden[i]
+ c := NewIEEE()
+ io.WriteString(c, g.in)
+ s := c.Sum32()
if s != g.out {
- t.Errorf("crc32(%s) = 0x%x want 0x%x", g.in, s, g.out);
- t.FailNow();
+ t.Errorf("crc32(%s) = 0x%x want 0x%x", g.in, s, g.out)
+ t.FailNow()
}
}
}
func BenchmarkCrc32KB(b *testing.B) {
- b.StopTimer();
- data := make([]uint8, 1024);
+ b.StopTimer()
+ data := make([]uint8, 1024)
for i := 0; i < 1024; i++ {
data[i] = uint8(i)
}
- c := NewIEEE();
- b.StartTimer();
+ c := NewIEEE()
+ b.StartTimer()
for i := 0; i < b.N; i++ {
c.Write(data)
diff --git a/src/pkg/hash/hash.go b/src/pkg/hash/hash.go
index 62ec13ba8..470e9a36c 100644
--- a/src/pkg/hash/hash.go
+++ b/src/pkg/hash/hash.go
@@ -10,14 +10,14 @@ import "io"
// The Write method never returns an error.
// Sum returns the bytes of integer hash codes in big-endian order.
type Hash interface {
- io.Writer;
- Sum() []byte;
- Reset();
- Size() int; // number of bytes Sum returns
+ io.Writer
+ Sum() []byte
+ Reset()
+ Size() int // number of bytes Sum returns
}
// Hash32 is the common interface implemented by all 32-bit hash functions.
type Hash32 interface {
- Hash;
- Sum32() uint32;
+ Hash
+ Sum32() uint32
}
diff --git a/src/pkg/http/client.go b/src/pkg/http/client.go
index 70fa49fcc..aa3d3be6d 100644
--- a/src/pkg/http/client.go
+++ b/src/pkg/http/client.go
@@ -7,19 +7,19 @@
package http
import (
- "bufio";
- "fmt";
- "io";
- "net";
- "os";
- "strconv";
- "strings";
+ "bufio"
+ "fmt"
+ "io"
+ "net"
+ "os"
+ "strconv"
+ "strings"
)
// Response represents the response from an HTTP request.
type Response struct {
- Status string; // e.g. "200 OK"
- StatusCode int; // e.g. 200
+ Status string // e.g. "200 OK"
+ StatusCode int // e.g. 200
// Header maps header keys to values. If the response had multiple
// headers with the same key, they will be concatenated, with comma
@@ -27,10 +27,10 @@ type Response struct {
// be semantically equivalent to a comma-delimited sequence.)
//
// Keys in the map are canonicalized (see CanonicalHeaderKey).
- Header map[string]string;
+ Header map[string]string
// Stream from which the response body can be read.
- Body io.ReadCloser;
+ Body io.ReadCloser
}
// GetHeader returns the value of the response header with the given
@@ -39,15 +39,15 @@ type Response struct {
// response headers with the given key, it returns the empty string and
// false. Keys are not case sensitive.
func (r *Response) GetHeader(key string) (value string) {
- value, _ = r.Header[CanonicalHeaderKey(key)];
- return;
+ value, _ = r.Header[CanonicalHeaderKey(key)]
+ return
}
// AddHeader adds a value under the given key. Keys are not case sensitive.
func (r *Response) AddHeader(key, value string) {
- key = CanonicalHeaderKey(key);
+ key = CanonicalHeaderKey(key)
- oldValues, oldValuesPresent := r.Header[key];
+ oldValues, oldValuesPresent := r.Header[key]
if oldValuesPresent {
r.Header[key] = oldValues + "," + value
} else {
@@ -57,50 +57,50 @@ func (r *Response) AddHeader(key, value string) {
// Given a string of the form "host", "host:port", or "[ipv6::address]:port",
// return true if the string includes a port.
-func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") }
+func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") }
// Used in Send to implement io.ReadCloser by bundling together the
// io.BufReader through which we read the response, and the underlying
// network connection.
type readClose struct {
- io.Reader;
- io.Closer;
+ io.Reader
+ io.Closer
}
// ReadResponse reads and returns an HTTP response from r.
func ReadResponse(r *bufio.Reader) (*Response, os.Error) {
- resp := new(Response);
+ resp := new(Response)
// Parse the first line of the response.
- resp.Header = make(map[string]string);
+ resp.Header = make(map[string]string)
- line, err := readLine(r);
+ line, err := readLine(r)
if err != nil {
return nil, err
}
- f := strings.Split(line, " ", 3);
+ f := strings.Split(line, " ", 3)
if len(f) < 3 {
return nil, &badStringError{"malformed HTTP response", line}
}
- resp.Status = f[1] + " " + f[2];
- resp.StatusCode, err = strconv.Atoi(f[1]);
+ resp.Status = f[1] + " " + f[2]
+ resp.StatusCode, err = strconv.Atoi(f[1])
if err != nil {
return nil, &badStringError{"malformed HTTP status code", f[1]}
}
// Parse the response headers.
for {
- key, value, err := readKeyValue(r);
+ key, value, err := readKeyValue(r)
if err != nil {
return nil, err
}
if key == "" {
- break // end of response header
+ break // end of response header
}
- resp.AddHeader(key, value);
+ resp.AddHeader(key, value)
}
- return resp, nil;
+ return resp, nil
}
@@ -114,41 +114,41 @@ func send(req *Request) (resp *Response, err os.Error) {
return nil, &badStringError{"unsupported protocol scheme", req.URL.Scheme}
}
- addr := req.URL.Host;
+ addr := req.URL.Host
if !hasPort(addr) {
addr += ":http"
}
- conn, err := net.Dial("tcp", "", addr);
+ conn, err := net.Dial("tcp", "", addr)
if err != nil {
return nil, err
}
- err = req.Write(conn);
+ err = req.Write(conn)
if err != nil {
- conn.Close();
- return nil, err;
+ conn.Close()
+ return nil, err
}
- reader := bufio.NewReader(conn);
- resp, err = ReadResponse(reader);
+ reader := bufio.NewReader(conn)
+ resp, err = ReadResponse(reader)
if err != nil {
- conn.Close();
- return nil, err;
+ conn.Close()
+ return nil, err
}
- r := io.Reader(reader);
+ r := io.Reader(reader)
if v := resp.GetHeader("Transfer-Encoding"); v == "chunked" {
r = newChunkedReader(reader)
} else if v := resp.GetHeader("Content-Length"); v != "" {
- n, err := strconv.Atoi64(v);
+ n, err := strconv.Atoi64(v)
if err != nil {
return nil, &badStringError{"invalid Content-Length", v}
}
- r = io.LimitReader(r, n);
+ r = io.LimitReader(r, n)
}
- resp.Body = readClose{r, conn};
+ resp.Body = readClose{r, conn}
- return;
+ return
}
// True if the specified HTTP status code is one for which the Get utility should
@@ -158,7 +158,7 @@ func shouldRedirect(statusCode int) bool {
case StatusMovedPermanently, StatusFound, StatusSeeOther, StatusTemporaryRedirect:
return true
}
- return false;
+ return false
}
// Get issues a GET to the specified URL. If the response is one of the following
@@ -179,11 +179,11 @@ func Get(url string) (r *Response, finalURL string, err os.Error) {
// TODO: set referrer header on redirects.
for redirect := 0; ; redirect++ {
if redirect >= 10 {
- err = os.ErrorString("stopped after 10 redirects");
- break;
+ err = os.ErrorString("stopped after 10 redirects")
+ break
}
- var req Request;
+ var req Request
if req.URL, err = ParseURL(url); err != nil {
break
}
@@ -191,19 +191,19 @@ func Get(url string) (r *Response, finalURL string, err os.Error) {
break
}
if shouldRedirect(r.StatusCode) {
- r.Body.Close();
+ r.Body.Close()
if url = r.GetHeader("Location"); url == "" {
- err = os.ErrorString(fmt.Sprintf("%d response missing Location header", r.StatusCode));
- break;
+ err = os.ErrorString(fmt.Sprintf("%d response missing Location header", r.StatusCode))
+ break
}
- continue;
+ continue
}
- finalURL = url;
- return;
+ finalURL = url
+ return
}
- err = &URLError{"Get", url, err};
- return;
+ err = &URLError{"Get", url, err}
+ return
}
@@ -211,18 +211,18 @@ func Get(url string) (r *Response, finalURL string, err os.Error) {
//
// Caller should close r.Body when done reading it.
func Post(url string, bodyType string, body io.Reader) (r *Response, err os.Error) {
- var req Request;
- req.Method = "POST";
- req.Body = body;
+ var req Request
+ req.Method = "POST"
+ req.Body = body
req.Header = map[string]string{
"Content-Type": bodyType,
"Transfer-Encoding": "chunked",
- };
+ }
- req.URL, err = ParseURL(url);
+ req.URL, err = ParseURL(url)
if err != nil {
return nil, err
}
- return send(&req);
+ return send(&req)
}
diff --git a/src/pkg/http/client_test.go b/src/pkg/http/client_test.go
index 76aad7e81..6787825d8 100644
--- a/src/pkg/http/client_test.go
+++ b/src/pkg/http/client_test.go
@@ -7,20 +7,20 @@
package http
import (
- "io/ioutil";
- "strings";
- "testing";
+ "io/ioutil"
+ "strings"
+ "testing"
)
func TestClient(t *testing.T) {
// TODO: add a proper test suite. Current test merely verifies that
// we can retrieve the Google robots.txt file.
- r, _, err := Get("http://www.google.com/robots.txt");
- var b []byte;
+ r, _, err := Get("http://www.google.com/robots.txt")
+ var b []byte
if err == nil {
- b, err = ioutil.ReadAll(r.Body);
- r.Body.Close();
+ b, err = ioutil.ReadAll(r.Body)
+ r.Body.Close()
}
if err != nil {
t.Error(err)
diff --git a/src/pkg/http/fs.go b/src/pkg/http/fs.go
index 507ce33a9..fff0b8d0e 100644
--- a/src/pkg/http/fs.go
+++ b/src/pkg/http/fs.go
@@ -7,12 +7,12 @@
package http
import (
- "fmt";
- "io";
- "os";
- "path";
- "strings";
- "utf8";
+ "fmt"
+ "io"
+ "os"
+ "path"
+ "strings"
+ "utf8"
)
// TODO this should be in a mime package somewhere
@@ -30,7 +30,7 @@ var contentByExt = map[string]string{
// contain any unprintable ASCII or Unicode characters.
func isText(b []byte) bool {
for len(b) > 0 && utf8.FullRune(b) {
- rune, size := utf8.DecodeRune(b);
+ rune, size := utf8.DecodeRune(b)
if size == 1 && rune == utf8.RuneError {
// decoding error
return false
@@ -47,110 +47,110 @@ func isText(b []byte) bool {
return false
}
}
- b = b[size:];
+ b = b[size:]
}
- return true;
+ return true
}
func dirList(c *Conn, f *os.File) {
- fmt.Fprintf(c, "<pre>\n");
+ fmt.Fprintf(c, "<pre>\n")
for {
- dirs, err := f.Readdir(100);
+ dirs, err := f.Readdir(100)
if err != nil || len(dirs) == 0 {
break
}
for _, d := range dirs {
- name := d.Name;
+ name := d.Name
if d.IsDirectory() {
name += "/"
}
// TODO htmlescape
- fmt.Fprintf(c, "<a href=\"%s\">%s</a>\n", name, name);
+ fmt.Fprintf(c, "<a href=\"%s\">%s</a>\n", name, name)
}
}
- fmt.Fprintf(c, "</pre>\n");
+ fmt.Fprintf(c, "</pre>\n")
}
func serveFileInternal(c *Conn, r *Request, name string, redirect bool) {
- const indexPage = "/index.html";
+ const indexPage = "/index.html"
// redirect .../index.html to .../
if strings.HasSuffix(r.URL.Path, indexPage) {
- Redirect(c, r.URL.Path[0:len(r.URL.Path)-len(indexPage)+1], StatusMovedPermanently);
- return;
+ Redirect(c, r.URL.Path[0:len(r.URL.Path)-len(indexPage)+1], StatusMovedPermanently)
+ return
}
- f, err := os.Open(name, os.O_RDONLY, 0);
+ f, err := os.Open(name, os.O_RDONLY, 0)
if err != nil {
// TODO expose actual error?
- NotFound(c, r);
- return;
+ NotFound(c, r)
+ return
}
- defer f.Close();
+ defer f.Close()
- d, err1 := f.Stat();
+ d, err1 := f.Stat()
if err1 != nil {
// TODO expose actual error?
- NotFound(c, r);
- return;
+ NotFound(c, r)
+ return
}
if redirect {
// redirect to canonical path: / at end of directory url
// r.URL.Path always begins with /
- url := r.URL.Path;
+ url := r.URL.Path
if d.IsDirectory() {
if url[len(url)-1] != '/' {
- Redirect(c, url+"/", StatusMovedPermanently);
- return;
+ Redirect(c, url+"/", StatusMovedPermanently)
+ return
}
} else {
if url[len(url)-1] == '/' {
- Redirect(c, url[0:len(url)-1], StatusMovedPermanently);
- return;
+ Redirect(c, url[0:len(url)-1], StatusMovedPermanently)
+ return
}
}
}
// use contents of index.html for directory, if present
if d.IsDirectory() {
- index := name + indexPage;
- ff, err := os.Open(index, os.O_RDONLY, 0);
+ index := name + indexPage
+ ff, err := os.Open(index, os.O_RDONLY, 0)
if err == nil {
- defer ff.Close();
- dd, err := ff.Stat();
+ defer ff.Close()
+ dd, err := ff.Stat()
if err == nil {
- name = index;
- d = dd;
- f = ff;
+ name = index
+ d = dd
+ f = ff
}
}
}
if d.IsDirectory() {
- dirList(c, f);
- return;
+ dirList(c, f)
+ return
}
// serve file
// use extension to find content type.
- ext := path.Ext(name);
+ ext := path.Ext(name)
if ctype, ok := contentByExt[ext]; ok {
c.SetHeader("Content-Type", ctype)
} else {
// read first chunk to decide between utf-8 text and binary
- var buf [1024]byte;
- n, _ := io.ReadFull(f, &buf);
- b := buf[0:n];
+ var buf [1024]byte
+ n, _ := io.ReadFull(f, &buf)
+ b := buf[0:n]
if isText(b) {
c.SetHeader("Content-Type", "text-plain; charset=utf-8")
} else {
- c.SetHeader("Content-Type", "application/octet-stream") // generic binary
+ c.SetHeader("Content-Type", "application/octet-stream") // generic binary
}
- c.Write(b);
+ c.Write(b)
}
- io.Copy(c, f);
+ io.Copy(c, f)
}
// ServeFile replies to the request with the contents of the named file or directory.
@@ -159,22 +159,22 @@ func ServeFile(c *Conn, r *Request, name string) {
}
type fileHandler struct {
- root string;
- prefix string;
+ root string
+ prefix string
}
// FileServer returns a handler that serves HTTP requests
// with the contents of the file system rooted at root.
// It strips prefix from the incoming requests before
// looking up the file name in the file system.
-func FileServer(root, prefix string) Handler { return &fileHandler{root, prefix} }
+func FileServer(root, prefix string) Handler { return &fileHandler{root, prefix} }
func (f *fileHandler) ServeHTTP(c *Conn, r *Request) {
- path := r.URL.Path;
+ path := r.URL.Path
if !strings.HasPrefix(path, f.prefix) {
- NotFound(c, r);
- return;
+ NotFound(c, r)
+ return
}
- path = path[len(f.prefix):];
- serveFileInternal(c, r, f.root+"/"+path, true);
+ path = path[len(f.prefix):]
+ serveFileInternal(c, r, f.root+"/"+path, true)
}
diff --git a/src/pkg/http/request.go b/src/pkg/http/request.go
index 83374a549..bf1e299d7 100644
--- a/src/pkg/http/request.go
+++ b/src/pkg/http/request.go
@@ -10,50 +10,50 @@
package http
import (
- "bufio";
- "bytes";
- "container/vector";
- "fmt";
- "io";
- "io/ioutil";
- "os";
- "strconv";
- "strings";
+ "bufio"
+ "bytes"
+ "container/vector"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "strconv"
+ "strings"
)
const (
- maxLineLength = 1024; // assumed < bufio.DefaultBufSize
- maxValueLength = 1024;
- maxHeaderLines = 1024;
- chunkSize = 4 << 10; // 4 KB chunks
+ maxLineLength = 1024 // assumed < bufio.DefaultBufSize
+ maxValueLength = 1024
+ maxHeaderLines = 1024
+ chunkSize = 4 << 10 // 4 KB chunks
)
// HTTP request parsing errors.
type ProtocolError struct {
- os.ErrorString;
+ os.ErrorString
}
var (
- ErrLineTooLong = &ProtocolError{"header line too long"};
- ErrHeaderTooLong = &ProtocolError{"header too long"};
- ErrShortBody = &ProtocolError{"entity body too short"};
+ ErrLineTooLong = &ProtocolError{"header line too long"}
+ ErrHeaderTooLong = &ProtocolError{"header too long"}
+ ErrShortBody = &ProtocolError{"entity body too short"}
)
type badStringError struct {
- what string;
- str string;
+ what string
+ str string
}
-func (e *badStringError) String() string { return fmt.Sprintf("%s %q", e.what, e.str) }
+func (e *badStringError) String() string { return fmt.Sprintf("%s %q", e.what, e.str) }
// A Request represents a parsed HTTP request header.
type Request struct {
- Method string; // GET, POST, PUT, etc.
- RawURL string; // The raw URL given in the request.
- URL *URL; // Parsed URL.
- Proto string; // "HTTP/1.0"
- ProtoMajor int; // 1
- ProtoMinor int; // 0
+ Method string // GET, POST, PUT, etc.
+ RawURL string // The raw URL given in the request.
+ URL *URL // Parsed URL.
+ Proto string // "HTTP/1.0"
+ ProtoMajor int // 1
+ ProtoMinor int // 0
// A header mapping request lines to their values.
// If the header says
@@ -74,18 +74,18 @@ type Request struct {
// The request parser implements this by canonicalizing the
// name, making the first character and any characters
// following a hyphen uppercase and the rest lowercase.
- Header map[string]string;
+ Header map[string]string
// The message body.
- Body io.Reader;
+ Body io.Reader
// Whether to close the connection after replying to this request.
- Close bool;
+ Close bool
// The host on which the URL is sought.
// Per RFC 2616, this is either the value of the Host: header
// or the host name given in the URL itself.
- Host string;
+ Host string
// The referring URL, if sent in the request.
//
@@ -97,13 +97,13 @@ type Request struct {
// can diagnose programs that use the alternate
// (correct English) spelling req.Referrer but cannot
// diagnose programs that use Header["Referrer"].
- Referer string;
+ Referer string
// The User-Agent: header string, if sent in the request.
- UserAgent string;
+ UserAgent string
// The parsed form. Only available after ParseForm is called.
- Form map[string][]string;
+ Form map[string][]string
}
// ProtoAtLeast returns whether the HTTP protocol used
@@ -118,7 +118,7 @@ func valueOrDefault(value, def string) string {
if value != "" {
return value
}
- return def;
+ return def
}
const defaultUserAgent = "Go http package"
@@ -134,14 +134,14 @@ const defaultUserAgent = "Go http package"
//
// If Body is present, "Transfer-Encoding: chunked" is forced as a header.
func (req *Request) Write(w io.Writer) os.Error {
- uri := URLEscape(req.URL.Path);
+ uri := URLEscape(req.URL.Path)
if req.URL.RawQuery != "" {
uri += "?" + req.URL.RawQuery
}
- fmt.Fprintf(w, "%s %s HTTP/1.1\r\n", valueOrDefault(req.Method, "GET"), uri);
- fmt.Fprintf(w, "Host: %s\r\n", req.URL.Host);
- fmt.Fprintf(w, "User-Agent: %s\r\n", valueOrDefault(req.UserAgent, defaultUserAgent));
+ fmt.Fprintf(w, "%s %s HTTP/1.1\r\n", valueOrDefault(req.Method, "GET"), uri)
+ fmt.Fprintf(w, "Host: %s\r\n", req.URL.Host)
+ fmt.Fprintf(w, "User-Agent: %s\r\n", valueOrDefault(req.UserAgent, defaultUserAgent))
if req.Referer != "" {
fmt.Fprintf(w, "Referer: %s\r\n", req.Referer)
@@ -163,19 +163,19 @@ func (req *Request) Write(w io.Writer) os.Error {
io.WriteString(w, k+": "+v+"\r\n")
}
- io.WriteString(w, "\r\n");
+ io.WriteString(w, "\r\n")
if req.Body != nil {
- buf := make([]byte, chunkSize);
+ buf := make([]byte, chunkSize)
Loop:
for {
- var nr, nw int;
- var er, ew os.Error;
+ var nr, nw int
+ var er, ew os.Error
if nr, er = req.Body.Read(buf); nr > 0 {
if er == nil || er == os.EOF {
- fmt.Fprintf(w, "%x\r\n", nr);
- nw, ew = w.Write(buf[0:nr]);
- fmt.Fprint(w, "\r\n");
+ fmt.Fprintf(w, "%x\r\n", nr)
+ nw, ew = w.Write(buf[0:nr])
+ fmt.Fprint(w, "\r\n")
}
}
switch {
@@ -183,7 +183,7 @@ func (req *Request) Write(w io.Writer) os.Error {
if er == os.EOF {
break Loop
}
- return er;
+ return er
case ew != nil:
return ew
case nw < nr:
@@ -191,10 +191,10 @@ func (req *Request) Write(w io.Writer) os.Error {
}
}
// last-chunk CRLF
- fmt.Fprint(w, "0\r\n\r\n");
+ fmt.Fprint(w, "0\r\n\r\n")
}
- return nil;
+ return nil
}
// Read a line of bytes (up to \n) from b.
@@ -208,29 +208,29 @@ func readLineBytes(b *bufio.Reader) (p []byte, err os.Error) {
if err == os.EOF {
err = io.ErrUnexpectedEOF
}
- return nil, err;
+ return nil, err
}
if len(p) >= maxLineLength {
return nil, ErrLineTooLong
}
// Chop off trailing white space.
- var i int;
+ var i int
for i = len(p); i > 0; i-- {
if c := p[i-1]; c != ' ' && c != '\r' && c != '\t' && c != '\n' {
break
}
}
- return p[0:i], nil;
+ return p[0:i], nil
}
// readLineBytes, but convert the bytes into a string.
func readLine(b *bufio.Reader) (s string, err os.Error) {
- p, e := readLineBytes(b);
+ p, e := readLineBytes(b)
if e != nil {
return "", e
}
- return string(p), nil;
+ return string(p), nil
}
var colon = []byte{':'}
@@ -240,7 +240,7 @@ var colon = []byte{':'}
// and the Value can continue on multiple lines if each continuation line
// starts with a space.
func readKeyValue(b *bufio.Reader) (key, value string, err os.Error) {
- line, e := readLineBytes(b);
+ line, e := readLineBytes(b)
if e != nil {
return "", "", e
}
@@ -249,12 +249,12 @@ func readKeyValue(b *bufio.Reader) (key, value string, err os.Error) {
}
// Scan first line for colon.
- i := bytes.Index(line, colon);
+ i := bytes.Index(line, colon)
if i < 0 {
goto Malformed
}
- key = string(line[0:i]);
+ key = string(line[0:i])
if strings.Index(key, " ") >= 0 {
// Key field has space - no good.
goto Malformed
@@ -266,16 +266,16 @@ func readKeyValue(b *bufio.Reader) (key, value string, err os.Error) {
break
}
}
- value = string(line[i:]);
+ value = string(line[i:])
// Look for extension lines, which must begin with space.
for {
- c, e := b.ReadByte();
+ c, e := b.ReadByte()
if c != ' ' {
if e != os.EOF {
b.UnreadByte()
}
- break;
+ break
}
// Eat leading space.
@@ -284,43 +284,43 @@ func readKeyValue(b *bufio.Reader) (key, value string, err os.Error) {
if e == os.EOF {
e = io.ErrUnexpectedEOF
}
- return "", "", e;
+ return "", "", e
}
}
- b.UnreadByte();
+ b.UnreadByte()
// Read the rest of the line and add to value.
if line, e = readLineBytes(b); e != nil {
return "", "", e
}
- value += " " + string(line);
+ value += " " + string(line)
if len(value) >= maxValueLength {
return "", "", &badStringError{"value too long for key", key}
}
}
- return key, value, nil;
+ return key, value, nil
Malformed:
- return "", "", &badStringError{"malformed header line", string(line)};
+ return "", "", &badStringError{"malformed header line", string(line)}
}
// Convert decimal at s[i:len(s)] to integer,
// returning value, string position where the digits stopped,
// and whether there was a valid number (digits, not too big).
func atoi(s string, i int) (n, i1 int, ok bool) {
- const Big = 1000000;
+ const Big = 1000000
if i >= len(s) || s[i] < '0' || s[i] > '9' {
return 0, 0, false
}
- n = 0;
+ n = 0
for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
- n = n*10 + int(s[i]-'0');
+ n = n*10 + int(s[i]-'0')
if n > Big {
return 0, 0, false
}
}
- return n, i, true;
+ return n, i, true
}
// Parse HTTP version: "HTTP/1.2" -> (1, 2, true).
@@ -328,16 +328,16 @@ func parseHTTPVersion(vers string) (int, int, bool) {
if vers[0:5] != "HTTP/" {
return 0, 0, false
}
- major, i, ok := atoi(vers, 5);
+ major, i, ok := atoi(vers, 5)
if !ok || i >= len(vers) || vers[i] != '.' {
return 0, 0, false
}
- var minor int;
- minor, i, ok = atoi(vers, i+1);
+ var minor int
+ minor, i, ok = atoi(vers, i+1)
if !ok || i != len(vers) {
return 0, 0, false
}
- return major, minor, true;
+ return major, minor, true
}
var cmap = make(map[string]string)
@@ -356,8 +356,8 @@ func CanonicalHeaderKey(s string) string {
// and upper case after each dash.
// (Host, User-Agent, If-Modified-Since).
// HTTP headers are ASCII only, so no Unicode issues.
- a := strings.Bytes(s);
- upper := true;
+ a := strings.Bytes(s)
+ upper := true
for i, v := range a {
if upper && 'a' <= v && v <= 'z' {
a[i] = v + 'A' - 'a'
@@ -365,20 +365,20 @@ func CanonicalHeaderKey(s string) string {
if !upper && 'A' <= v && v <= 'Z' {
a[i] = v + 'a' - 'A'
}
- upper = false;
+ upper = false
if v == '-' {
upper = true
}
}
- t := string(a);
- cmap[s] = t;
- return t;
+ t := string(a)
+ cmap[s] = t
+ return t
}
type chunkedReader struct {
- r *bufio.Reader;
- n uint64; // unread bytes in chunk
- err os.Error;
+ r *bufio.Reader
+ n uint64 // unread bytes in chunk
+ err os.Error
}
func newChunkedReader(r *bufio.Reader) *chunkedReader {
@@ -387,19 +387,19 @@ func newChunkedReader(r *bufio.Reader) *chunkedReader {
func (cr *chunkedReader) beginChunk() {
// chunk-size CRLF
- var line string;
- line, cr.err = readLine(cr.r);
+ var line string
+ line, cr.err = readLine(cr.r)
if cr.err != nil {
return
}
- cr.n, cr.err = strconv.Btoui64(line, 16);
+ cr.n, cr.err = strconv.Btoui64(line, 16)
if cr.err != nil {
return
}
if cr.n == 0 {
// trailer CRLF
for {
- line, cr.err = readLine(cr.r);
+ line, cr.err = readLine(cr.r)
if cr.err != nil {
return
}
@@ -407,7 +407,7 @@ func (cr *chunkedReader) beginChunk() {
break
}
}
- cr.err = os.EOF;
+ cr.err = os.EOF
}
}
@@ -416,7 +416,7 @@ func (cr *chunkedReader) Read(b []uint8) (n int, err os.Error) {
return 0, cr.err
}
if cr.n == 0 {
- cr.beginChunk();
+ cr.beginChunk()
if cr.err != nil {
return 0, cr.err
}
@@ -424,36 +424,36 @@ func (cr *chunkedReader) Read(b []uint8) (n int, err os.Error) {
if uint64(len(b)) > cr.n {
b = b[0:cr.n]
}
- n, cr.err = cr.r.Read(b);
- cr.n -= uint64(n);
+ n, cr.err = cr.r.Read(b)
+ cr.n -= uint64(n)
if cr.n == 0 && cr.err == nil {
// end of chunk (CRLF)
- b := make([]byte, 2);
+ b := make([]byte, 2)
if _, cr.err = io.ReadFull(cr.r, b); cr.err == nil {
if b[0] != '\r' || b[1] != '\n' {
cr.err = os.NewError("malformed chunked encoding")
}
}
}
- return n, cr.err;
+ return n, cr.err
}
// ReadRequest reads and parses a request from b.
func ReadRequest(b *bufio.Reader) (req *Request, err os.Error) {
- req = new(Request);
+ req = new(Request)
// First line: GET /index.html HTTP/1.0
- var s string;
+ var s string
if s, err = readLine(b); err != nil {
return nil, err
}
- var f []string;
+ var f []string
if f = strings.Split(s, " ", 3); len(f) < 3 {
return nil, &badStringError{"malformed HTTP request", s}
}
- req.Method, req.RawURL, req.Proto = f[0], f[1], f[2];
- var ok bool;
+ req.Method, req.RawURL, req.Proto = f[0], f[1], f[2]
+ var ok bool
if req.ProtoMajor, req.ProtoMinor, ok = parseHTTPVersion(req.Proto); !ok {
return nil, &badStringError{"malformed HTTP version", req.Proto}
}
@@ -463,10 +463,10 @@ func ReadRequest(b *bufio.Reader) (req *Request, err os.Error) {
}
// Subsequent lines: Key: value.
- nheader := 0;
- req.Header = make(map[string]string);
+ nheader := 0
+ req.Header = make(map[string]string)
for {
- var key, value string;
+ var key, value string
if key, value, err = readKeyValue(b); err != nil {
return nil, err
}
@@ -477,12 +477,12 @@ func ReadRequest(b *bufio.Reader) (req *Request, err os.Error) {
return nil, ErrHeaderTooLong
}
- key = CanonicalHeaderKey(key);
+ key = CanonicalHeaderKey(key)
// RFC 2616 says that if you send the same header key
// multiple times, it has to be semantically equivalent
// to concatenating the values separated by commas.
- oldvalue, present := req.Header[key];
+ oldvalue, present := req.Header[key]
if present {
req.Header[key] = oldvalue + "," + value
} else {
@@ -561,30 +561,30 @@ func ReadRequest(b *bufio.Reader) (req *Request, err os.Error) {
if v, present := req.Header["Transfer-Encoding"]; present && v == "chunked" {
req.Body = newChunkedReader(b)
} else if v, present := req.Header["Content-Length"]; present {
- length, err := strconv.Btoui64(v, 10);
+ length, err := strconv.Btoui64(v, 10)
if err != nil {
return nil, &badStringError{"invalid Content-Length", v}
}
// TODO: limit the Content-Length. This is an easy DoS vector.
- raw := make([]byte, length);
- n, err := b.Read(raw);
+ raw := make([]byte, length)
+ n, err := b.Read(raw)
if err != nil || uint64(n) < length {
return nil, ErrShortBody
}
- req.Body = bytes.NewBuffer(raw);
+ req.Body = bytes.NewBuffer(raw)
}
- return req, nil;
+ return req, nil
}
func parseForm(m map[string][]string, query string) (err os.Error) {
- data := make(map[string]*vector.StringVector);
+ data := make(map[string]*vector.StringVector)
for _, kv := range strings.Split(query, "&", 0) {
- kvPair := strings.Split(kv, "=", 2);
+ kvPair := strings.Split(kv, "=", 2)
- var key, value string;
- var e os.Error;
- key, e = URLUnescape(kvPair[0]);
+ var key, value string
+ var e os.Error
+ key, e = URLUnescape(kvPair[0])
if e == nil && len(kvPair) > 1 {
value, e = URLUnescape(kvPair[1])
}
@@ -592,19 +592,19 @@ func parseForm(m map[string][]string, query string) (err os.Error) {
err = e
}
- vec, ok := data[key];
+ vec, ok := data[key]
if !ok {
- vec = new(vector.StringVector);
- data[key] = vec;
+ vec = new(vector.StringVector)
+ data[key] = vec
}
- vec.Push(value);
+ vec.Push(value)
}
for k, vec := range data {
m[k] = vec.Data()
}
- return;
+ return
}
// ParseForm parses the request body as a form for POST requests, or the raw query for GET requests.
@@ -613,9 +613,9 @@ func (r *Request) ParseForm() (err os.Error) {
if r.Form != nil {
return
}
- r.Form = make(map[string][]string);
+ r.Form = make(map[string][]string)
- var query string;
+ var query string
switch r.Method {
case "GET":
query = r.URL.RawQuery
@@ -623,20 +623,20 @@ func (r *Request) ParseForm() (err os.Error) {
if r.Body == nil {
return os.ErrorString("missing form body")
}
- ct, _ := r.Header["Content-Type"];
+ ct, _ := r.Header["Content-Type"]
switch strings.Split(ct, ";", 2)[0] {
case "text/plain", "application/x-www-form-urlencoded", "":
- var b []byte;
+ var b []byte
if b, err = ioutil.ReadAll(r.Body); err != nil {
return err
}
- query = string(b);
+ query = string(b)
// TODO(dsymonds): Handle multipart/form-data
default:
return &badStringError{"unknown Content-Type", ct}
}
}
- return parseForm(r.Form, query);
+ return parseForm(r.Form, query)
}
// FormValue returns the first value for the named component of the query.
@@ -648,5 +648,5 @@ func (r *Request) FormValue(key string) string {
if vs, ok := r.Form[key]; ok && len(vs) > 0 {
return vs[0]
}
- return "";
+ return ""
}
diff --git a/src/pkg/http/request_test.go b/src/pkg/http/request_test.go
index f2ef041bb..b93d1f79e 100644
--- a/src/pkg/http/request_test.go
+++ b/src/pkg/http/request_test.go
@@ -5,15 +5,15 @@
package http
import (
- "bytes";
- "testing";
+ "bytes"
+ "testing"
)
type stringMultimap map[string][]string
type parseTest struct {
- query string;
- out stringMultimap;
+ query string
+ out stringMultimap
}
var parseTests = []parseTest{
@@ -33,24 +33,24 @@ var parseTests = []parseTest{
func TestParseForm(t *testing.T) {
for i, test := range parseTests {
- form := make(map[string][]string);
- err := parseForm(form, test.query);
+ form := make(map[string][]string)
+ err := parseForm(form, test.query)
if err != nil {
- t.Errorf("test %d: Unexpected error: %v", i, err);
- continue;
+ t.Errorf("test %d: Unexpected error: %v", i, err)
+ continue
}
if len(form) != len(test.out) {
t.Errorf("test %d: len(form) = %d, want %d", i, len(form), len(test.out))
}
for k, evs := range test.out {
- vs, ok := form[k];
+ vs, ok := form[k]
if !ok {
- t.Errorf("test %d: Missing key %q", i, k);
- continue;
+ t.Errorf("test %d: Missing key %q", i, k)
+ continue
}
if len(vs) != len(evs) {
- t.Errorf("test %d: len(form[%q]) = %d, want %d", i, k, len(vs), len(evs));
- continue;
+ t.Errorf("test %d: len(form[%q]) = %d, want %d", i, k, len(vs), len(evs))
+ continue
}
for j, ev := range evs {
if v := vs[j]; v != ev {
@@ -62,8 +62,8 @@ func TestParseForm(t *testing.T) {
}
func TestQuery(t *testing.T) {
- req := &Request{Method: "GET"};
- req.URL, _ = ParseURL("http://www.google.com/search?q=foo&q=bar");
+ req := &Request{Method: "GET"}
+ req.URL, _ = ParseURL("http://www.google.com/search?q=foo&q=bar")
if q := req.FormValue("q"); q != "foo" {
t.Errorf(`req.FormValue("q") = %q, want "foo"`, q)
}
@@ -71,8 +71,8 @@ func TestQuery(t *testing.T) {
type stringMap map[string]string
type parseContentTypeTest struct {
- contentType stringMap;
- error bool;
+ contentType stringMap
+ error bool
}
var parseContentTypeTests = []parseContentTypeTest{
@@ -91,8 +91,8 @@ func TestPostContentTypeParsing(t *testing.T) {
Method: "POST",
Header: test.contentType,
Body: bytes.NewBufferString("body"),
- };
- err := req.ParseForm();
+ }
+ err := req.ParseForm()
if !test.error && err != nil {
t.Errorf("test %d: Unexpected error: %v", i, err)
}
@@ -104,14 +104,14 @@ func TestPostContentTypeParsing(t *testing.T) {
func TestRedirect(t *testing.T) {
const (
- start = "http://codesearch.google.com/";
- end = "http://www.google.com/codesearch";
+ start = "http://codesearch.google.com/"
+ end = "http://www.google.com/codesearch"
)
- r, url, err := Get(start);
+ r, url, err := Get(start)
if err != nil {
t.Fatal(err)
}
- r.Body.Close();
+ r.Body.Close()
if r.StatusCode != 200 || url != end {
t.Fatalf("Get(%s) got status %d at %s, want 200 at %s", start, r.StatusCode, url, end)
}
diff --git a/src/pkg/http/server.go b/src/pkg/http/server.go
index 9178d5438..f9771f9b4 100644
--- a/src/pkg/http/server.go
+++ b/src/pkg/http/server.go
@@ -12,61 +12,61 @@
package http
import (
- "bufio";
- "fmt";
- "io";
- "log";
- "net";
- "os";
- "path";
- "strconv";
- "strings";
+ "bufio"
+ "fmt"
+ "io"
+ "log"
+ "net"
+ "os"
+ "path"
+ "strconv"
+ "strings"
)
// Errors introduced by the HTTP server.
var (
- ErrWriteAfterFlush = os.NewError("Conn.Write called after Flush");
- ErrHijacked = os.NewError("Conn has been hijacked");
+ ErrWriteAfterFlush = os.NewError("Conn.Write called after Flush")
+ ErrHijacked = os.NewError("Conn has been hijacked")
)
// Objects implementing the Handler interface can be
// registered to serve a particular path or subtree
// in the HTTP server.
type Handler interface {
- ServeHTTP(*Conn, *Request);
+ ServeHTTP(*Conn, *Request)
}
// A Conn represents the server side of a single active HTTP connection.
type Conn struct {
- RemoteAddr string; // network address of remote side
- Req *Request; // current HTTP request
+ RemoteAddr string // network address of remote side
+ Req *Request // current HTTP request
- rwc io.ReadWriteCloser; // i/o connection
- buf *bufio.ReadWriter; // buffered rwc
- handler Handler; // request handler
- hijacked bool; // connection has been hijacked by handler
+ rwc io.ReadWriteCloser // i/o connection
+ buf *bufio.ReadWriter // buffered rwc
+ handler Handler // request handler
+ hijacked bool // connection has been hijacked by handler
// state for the current reply
- closeAfterReply bool; // close connection after this reply
- chunking bool; // using chunked transfer encoding for reply body
- wroteHeader bool; // reply header has been written
- header map[string]string; // reply header parameters
- written int64; // number of bytes written in body
- status int; // status code passed to WriteHeader
+ closeAfterReply bool // close connection after this reply
+ chunking bool // using chunked transfer encoding for reply body
+ wroteHeader bool // reply header has been written
+ header map[string]string // reply header parameters
+ written int64 // number of bytes written in body
+ status int // status code passed to WriteHeader
}
// Create new connection from rwc.
func newConn(rwc net.Conn, handler Handler) (c *Conn, err os.Error) {
- c = new(Conn);
+ c = new(Conn)
if a := rwc.RemoteAddr(); a != nil {
c.RemoteAddr = a.String()
}
- c.handler = handler;
- c.rwc = rwc;
- br := bufio.NewReader(rwc);
- bw := bufio.NewWriter(rwc);
- c.buf = bufio.NewReadWriter(br, bw);
- return c, nil;
+ c.handler = handler
+ c.rwc = rwc
+ br := bufio.NewReader(rwc)
+ bw := bufio.NewWriter(rwc)
+ c.buf = bufio.NewReadWriter(br, bw)
+ return c, nil
}
// Read next request from connection.
@@ -79,18 +79,18 @@ func (c *Conn) readRequest() (req *Request, err os.Error) {
}
// Reset per-request connection state.
- c.header = make(map[string]string);
- c.wroteHeader = false;
- c.Req = req;
+ c.header = make(map[string]string)
+ c.wroteHeader = false
+ c.Req = req
// Default output is HTML encoded in UTF-8.
- c.SetHeader("Content-Type", "text/html; charset=utf-8");
+ c.SetHeader("Content-Type", "text/html; charset=utf-8")
if req.ProtoAtLeast(1, 1) {
// HTTP/1.1 or greater: use chunked transfer encoding
// to avoid closing the connection at EOF.
- c.chunking = true;
- c.SetHeader("Transfer-Encoding", "chunked");
+ c.chunking = true
+ c.SetHeader("Transfer-Encoding", "chunked")
} else {
// HTTP version < 1.1: cannot do chunked transfer
// encoding, so signal EOF by closing connection.
@@ -98,11 +98,11 @@ func (c *Conn) readRequest() (req *Request, err os.Error) {
// a Content-Length: header in the response,
// but everyone who expects persistent connections
// does HTTP/1.1 now.
- c.closeAfterReply = true;
- c.chunking = false;
+ c.closeAfterReply = true
+ c.chunking = false
}
- return req, nil;
+ return req, nil
}
// SetHeader sets a header line in the eventual reply.
@@ -115,7 +115,7 @@ func (c *Conn) readRequest() (req *Request, err os.Error) {
// Content-Type in this library, so users need not make that
// particular call. Calls to SetHeader after WriteHeader (or Write)
// are ignored.
-func (c *Conn) SetHeader(hdr, val string) { c.header[CanonicalHeaderKey(hdr)] = val }
+func (c *Conn) SetHeader(hdr, val string) { c.header[CanonicalHeaderKey(hdr)] = val }
// WriteHeader sends an HTTP response header with status code.
// If WriteHeader is not called explicitly, the first call to Write
@@ -124,33 +124,33 @@ func (c *Conn) SetHeader(hdr, val string) { c.header[CanonicalHeaderKey(hdr)] =
// send error codes.
func (c *Conn) WriteHeader(code int) {
if c.hijacked {
- log.Stderr("http: Conn.WriteHeader on hijacked connection");
- return;
+ log.Stderr("http: Conn.WriteHeader on hijacked connection")
+ return
}
if c.wroteHeader {
- log.Stderr("http: multiple Conn.WriteHeader calls");
- return;
+ log.Stderr("http: multiple Conn.WriteHeader calls")
+ return
}
- c.wroteHeader = true;
- c.status = code;
- c.written = 0;
+ c.wroteHeader = true
+ c.status = code
+ c.written = 0
if !c.Req.ProtoAtLeast(1, 0) {
return
}
- proto := "HTTP/1.0";
+ proto := "HTTP/1.0"
if c.Req.ProtoAtLeast(1, 1) {
proto = "HTTP/1.1"
}
- codestring := strconv.Itoa(code);
- text, ok := statusText[code];
+ codestring := strconv.Itoa(code)
+ text, ok := statusText[code]
if !ok {
text = "status code " + codestring
}
- io.WriteString(c.buf, proto+" "+codestring+" "+text+"\r\n");
+ io.WriteString(c.buf, proto+" "+codestring+" "+text+"\r\n")
for k, v := range c.header {
io.WriteString(c.buf, k+": "+v+"\r\n")
}
- io.WriteString(c.buf, "\r\n");
+ io.WriteString(c.buf, "\r\n")
}
// Write writes the data to the connection as part of an HTTP reply.
@@ -158,8 +158,8 @@ func (c *Conn) WriteHeader(code int) {
// before writing the data.
func (c *Conn) Write(data []byte) (n int, err os.Error) {
if c.hijacked {
- log.Stderr("http: Conn.Write on hijacked connection");
- return 0, ErrHijacked;
+ log.Stderr("http: Conn.Write on hijacked connection")
+ return 0, ErrHijacked
}
if !c.wroteHeader {
c.WriteHeader(StatusOK)
@@ -168,15 +168,15 @@ func (c *Conn) Write(data []byte) (n int, err os.Error) {
return 0, nil
}
- c.written += int64(len(data)); // ignoring errors, for errorKludge
+ c.written += int64(len(data)) // ignoring errors, for errorKludge
// TODO(rsc): if chunking happened after the buffering,
// then there would be fewer chunk headers.
// On the other hand, it would make hijacking more difficult.
if c.chunking {
- fmt.Fprintf(c.buf, "%x\r\n", len(data)) // TODO(rsc): use strconv not fmt
+ fmt.Fprintf(c.buf, "%x\r\n", len(data)) // TODO(rsc): use strconv not fmt
}
- n, err = c.buf.Write(data);
+ n, err = c.buf.Write(data)
if err == nil && c.chunking {
if n != len(data) {
err = io.ErrShortWrite
@@ -186,7 +186,7 @@ func (c *Conn) Write(data []byte) (n int, err os.Error) {
}
}
- return n, err;
+ return n, err
}
// If this is an error reply (4xx or 5xx)
@@ -197,7 +197,7 @@ func (c *Conn) Write(data []byte) (n int, err os.Error) {
// browsers are in the 256-512 range.
// Pad to 1024 bytes.
func errorKludge(c *Conn, req *Request) {
- const min = 1024;
+ const min = 1024
// Is this an error?
if kind := c.status / 100; kind != 4 && kind != 5 {
@@ -210,7 +210,7 @@ func errorKludge(c *Conn, req *Request) {
}
// Is it a broken browser?
- var msg string;
+ var msg string
switch agent := req.UserAgent; {
case strings.Index(agent, "MSIE") >= 0:
msg = "Internet Explorer"
@@ -219,19 +219,19 @@ func errorKludge(c *Conn, req *Request) {
default:
return
}
- msg += " would ignore this error page if this text weren't here.\n";
+ msg += " would ignore this error page if this text weren't here.\n"
// Is it text? ("Content-Type" is always in the map)
- baseType := strings.Split(c.header["Content-Type"], ";", 2)[0];
+ baseType := strings.Split(c.header["Content-Type"], ";", 2)[0]
switch baseType {
case "text/html":
- io.WriteString(c, "<!-- ");
+ io.WriteString(c, "<!-- ")
for c.written < min {
io.WriteString(c, msg)
}
- io.WriteString(c, " -->");
+ io.WriteString(c, " -->")
case "text/plain":
- io.WriteString(c, "\n");
+ io.WriteString(c, "\n")
for c.written < min {
io.WriteString(c, msg)
}
@@ -242,13 +242,13 @@ func (c *Conn) finishRequest() {
if !c.wroteHeader {
c.WriteHeader(StatusOK)
}
- errorKludge(c, c.Req);
+ errorKludge(c, c.Req)
if c.chunking {
- io.WriteString(c.buf, "0\r\n");
+ io.WriteString(c.buf, "0\r\n")
// trailer key/value pairs, followed by blank line
- io.WriteString(c.buf, "\r\n");
+ io.WriteString(c.buf, "\r\n")
}
- c.buf.Flush();
+ c.buf.Flush()
}
// Flush sends any buffered data to the client.
@@ -256,41 +256,41 @@ func (c *Conn) Flush() {
if !c.wroteHeader {
c.WriteHeader(StatusOK)
}
- c.buf.Flush();
+ c.buf.Flush()
}
// Close the connection.
func (c *Conn) close() {
if c.buf != nil {
- c.buf.Flush();
- c.buf = nil;
+ c.buf.Flush()
+ c.buf = nil
}
if c.rwc != nil {
- c.rwc.Close();
- c.rwc = nil;
+ c.rwc.Close()
+ c.rwc = nil
}
}
// Serve a new connection.
func (c *Conn) serve() {
for {
- req, err := c.readRequest();
+ req, err := c.readRequest()
if err != nil {
break
}
// HTTP cannot have multiple simultaneous active requests.
// Until the server replies to this request, it can't read another,
// so we might as well run the handler in this goroutine.
- c.handler.ServeHTTP(c, req);
+ c.handler.ServeHTTP(c, req)
if c.hijacked {
return
}
- c.finishRequest();
+ c.finishRequest()
if c.closeAfterReply {
break
}
}
- c.close();
+ c.close()
}
// Hijack lets the caller take over the connection.
@@ -302,12 +302,12 @@ func (c *Conn) Hijack() (rwc io.ReadWriteCloser, buf *bufio.ReadWriter, err os.E
if c.hijacked {
return nil, nil, ErrHijacked
}
- c.hijacked = true;
- rwc = c.rwc;
- buf = c.buf;
- c.rwc = nil;
- c.buf = nil;
- return;
+ c.hijacked = true
+ rwc = c.rwc
+ buf = c.buf
+ c.rwc = nil
+ c.buf = nil
+ return
}
// The HandlerFunc type is an adapter to allow the use of
@@ -325,26 +325,26 @@ func (f HandlerFunc) ServeHTTP(c *Conn, req *Request) {
// NotFound replies to the request with an HTTP 404 not found error.
func NotFound(c *Conn, req *Request) {
- c.SetHeader("Content-Type", "text/plain; charset=utf-8");
- c.WriteHeader(StatusNotFound);
- io.WriteString(c, "404 page not found\n");
+ c.SetHeader("Content-Type", "text/plain; charset=utf-8")
+ c.WriteHeader(StatusNotFound)
+ io.WriteString(c, "404 page not found\n")
}
// NotFoundHandler returns a simple request handler
// that replies to each request with a ``404 page not found'' reply.
-func NotFoundHandler() Handler { return HandlerFunc(NotFound) }
+func NotFoundHandler() Handler { return HandlerFunc(NotFound) }
// Redirect replies to the request with a redirect to url,
// which may be a path relative to the request path.
func Redirect(c *Conn, url string, code int) {
// RFC2616 recommends that a short note "SHOULD" be included in the
// response because older user agents may not understand 301/307.
- note := "<a href=\"%v\">" + statusText[code] + "</a>.\n";
+ note := "<a href=\"%v\">" + statusText[code] + "</a>.\n"
if c.Req.Method == "POST" {
note = ""
}
- u, err := ParseURL(url);
+ u, err := ParseURL(url)
if err != nil {
goto finish
}
@@ -365,36 +365,36 @@ func Redirect(c *Conn, url string, code int) {
// Because of this problem, no one pays attention
// to the RFC; they all send back just a new path.
// So do we.
- oldpath := c.Req.URL.Path;
- if oldpath == "" { // should not happen, but avoid a crash if it does
+ oldpath := c.Req.URL.Path
+ if oldpath == "" { // should not happen, but avoid a crash if it does
oldpath = "/"
}
if u.Scheme == "" {
// no leading http://server
if url == "" || url[0] != '/' {
// make relative path absolute
- olddir, _ := path.Split(oldpath);
- url = olddir + url;
+ olddir, _ := path.Split(oldpath)
+ url = olddir + url
}
// clean up but preserve trailing slash
- trailing := url[len(url)-1] == '/';
- url = path.Clean(url);
+ trailing := url[len(url)-1] == '/'
+ url = path.Clean(url)
if trailing && url[len(url)-1] != '/' {
url += "/"
}
}
finish:
- c.SetHeader("Location", url);
- c.WriteHeader(code);
- fmt.Fprintf(c, note, url);
+ c.SetHeader("Location", url)
+ c.WriteHeader(code)
+ fmt.Fprintf(c, note, url)
}
// Redirect to a fixed URL
type redirectHandler struct {
- url string;
- code int;
+ url string
+ code int
}
func (rh *redirectHandler) ServeHTTP(c *Conn, req *Request) {
@@ -433,11 +433,11 @@ func RedirectHandler(url string, code int) Handler {
// redirecting any request containing . or .. elements to an
// equivalent .- and ..-free URL.
type ServeMux struct {
- m map[string]Handler;
+ m map[string]Handler
}
// NewServeMux allocates and returns a new ServeMux.
-func NewServeMux() *ServeMux { return &ServeMux{make(map[string]Handler)} }
+func NewServeMux() *ServeMux { return &ServeMux{make(map[string]Handler)} }
// DefaultServeMux is the default ServeMux used by Serve.
var DefaultServeMux = NewServeMux()
@@ -448,11 +448,11 @@ func pathMatch(pattern, path string) bool {
// should not happen
return false
}
- n := len(pattern);
+ n := len(pattern)
if pattern[n-1] != '/' {
return pattern == path
}
- return len(path) >= n && path[0:n] == pattern;
+ return len(path) >= n && path[0:n] == pattern
}
// Return the canonical path for p, eliminating . and .. elements.
@@ -463,13 +463,13 @@ func cleanPath(p string) string {
if p[0] != '/' {
p = "/" + p
}
- np := path.Clean(p);
+ np := path.Clean(p)
// path.Clean removes trailing slash except for root;
// put the trailing slash back if necessary.
if p[len(p)-1] == '/' && np != "/" {
np += "/"
}
- return np;
+ return np
}
// ServeHTTP dispatches the request to the handler whose
@@ -477,27 +477,27 @@ func cleanPath(p string) string {
func (mux *ServeMux) ServeHTTP(c *Conn, req *Request) {
// Clean path to canonical form and redirect.
if p := cleanPath(req.URL.Path); p != req.URL.Path {
- c.SetHeader("Location", p);
- c.WriteHeader(StatusMovedPermanently);
- return;
+ c.SetHeader("Location", p)
+ c.WriteHeader(StatusMovedPermanently)
+ return
}
// Most-specific (longest) pattern wins.
- var h Handler;
- var n = 0;
+ var h Handler
+ var n = 0
for k, v := range mux.m {
if !pathMatch(k, req.URL.Path) {
continue
}
if h == nil || len(k) > n {
- n = len(k);
- h = v;
+ n = len(k)
+ h = v
}
}
if h == nil {
h = NotFoundHandler()
}
- h.ServeHTTP(c, req);
+ h.ServeHTTP(c, req)
}
// Handle registers the handler for the given pattern.
@@ -506,11 +506,11 @@ func (mux *ServeMux) Handle(pattern string, handler Handler) {
panicln("http: invalid pattern", pattern)
}
- mux.m[pattern] = handler;
+ mux.m[pattern] = handler
// Helpful behavior:
// If pattern is /tree/, insert permanent redirect for /tree.
- n := len(pattern);
+ n := len(pattern)
if n > 0 && pattern[n-1] == '/' {
mux.m[pattern[0:n-1]] = RedirectHandler(pattern, StatusMovedPermanently)
}
@@ -518,7 +518,7 @@ func (mux *ServeMux) Handle(pattern string, handler Handler) {
// Handle registers the handler for the given pattern
// in the DefaultServeMux.
-func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
+func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
// Serve accepts incoming HTTP connections on the listener l,
// creating a new service thread for each. The service threads
@@ -529,17 +529,17 @@ func Serve(l net.Listener, handler Handler) os.Error {
handler = DefaultServeMux
}
for {
- rw, e := l.Accept();
+ rw, e := l.Accept()
if e != nil {
return e
}
- c, err := newConn(rw, handler);
+ c, err := newConn(rw, handler)
if err != nil {
continue
}
- go c.serve();
+ go c.serve()
}
- panic("not reached");
+ panic("not reached")
}
// ListenAndServe listens on the TCP network address addr
@@ -569,11 +569,11 @@ func Serve(l net.Listener, handler Handler) os.Error {
// }
// }
func ListenAndServe(addr string, handler Handler) os.Error {
- l, e := net.Listen("tcp", addr);
+ l, e := net.Listen("tcp", addr)
if e != nil {
return e
}
- e = Serve(l, handler);
- l.Close();
- return e;
+ e = Serve(l, handler)
+ l.Close()
+ return e
}
diff --git a/src/pkg/http/status.go b/src/pkg/http/status.go
index 21662c7ea..e39c19806 100644
--- a/src/pkg/http/status.go
+++ b/src/pkg/http/status.go
@@ -6,50 +6,50 @@ package http
// HTTP status codes, defined in RFC 2616.
const (
- StatusContinue = 100;
- StatusSwitchingProtocols = 101;
+ StatusContinue = 100
+ StatusSwitchingProtocols = 101
- StatusOK = 200;
- StatusCreated = 201;
- StatusAccepted = 202;
- StatusNonAuthoritativeInfo = 203;
- StatusNoContent = 204;
- StatusResetContent = 205;
- StatusPartialContent = 206;
+ StatusOK = 200
+ StatusCreated = 201
+ StatusAccepted = 202
+ StatusNonAuthoritativeInfo = 203
+ StatusNoContent = 204
+ StatusResetContent = 205
+ StatusPartialContent = 206
- StatusMultipleChoices = 300;
- StatusMovedPermanently = 301;
- StatusFound = 302;
- StatusSeeOther = 303;
- StatusNotModified = 304;
- StatusUseProxy = 305;
- StatusTemporaryRedirect = 307;
+ StatusMultipleChoices = 300
+ StatusMovedPermanently = 301
+ StatusFound = 302
+ StatusSeeOther = 303
+ StatusNotModified = 304
+ StatusUseProxy = 305
+ StatusTemporaryRedirect = 307
- StatusBadRequest = 400;
- StatusUnauthorized = 401;
- StatusPaymentRequired = 402;
- StatusForbidden = 403;
- StatusNotFound = 404;
- StatusMethodNotAllowed = 405;
- StatusNotAcceptable = 406;
- StatusProxyAuthRequired = 407;
- StatusRequestTimeout = 408;
- StatusConflict = 409;
- StatusGone = 410;
- StatusLengthRequired = 411;
- StatusPreconditionFailed = 412;
- StatusRequestEntityTooLarge = 413;
- StatusRequestURITooLong = 414;
- StatusUnsupportedMediaType = 415;
- StatusRequestedRangeNotSatisfiable = 416;
- StatusExpectationFailed = 417;
+ StatusBadRequest = 400
+ StatusUnauthorized = 401
+ StatusPaymentRequired = 402
+ StatusForbidden = 403
+ StatusNotFound = 404
+ StatusMethodNotAllowed = 405
+ StatusNotAcceptable = 406
+ StatusProxyAuthRequired = 407
+ StatusRequestTimeout = 408
+ StatusConflict = 409
+ StatusGone = 410
+ StatusLengthRequired = 411
+ StatusPreconditionFailed = 412
+ StatusRequestEntityTooLarge = 413
+ StatusRequestURITooLong = 414
+ StatusUnsupportedMediaType = 415
+ StatusRequestedRangeNotSatisfiable = 416
+ StatusExpectationFailed = 417
- StatusInternalServerError = 500;
- StatusNotImplemented = 501;
- StatusBadGateway = 502;
- StatusServiceUnavailable = 503;
- StatusGatewayTimeout = 504;
- StatusHTTPVersionNotSupported = 505;
+ StatusInternalServerError = 500
+ StatusNotImplemented = 501
+ StatusBadGateway = 502
+ StatusServiceUnavailable = 503
+ StatusGatewayTimeout = 504
+ StatusHTTPVersionNotSupported = 505
)
var statusText = map[int]string{
diff --git a/src/pkg/http/triv.go b/src/pkg/http/triv.go
index 529a6ebff..dea2c23b0 100644
--- a/src/pkg/http/triv.go
+++ b/src/pkg/http/triv.go
@@ -5,16 +5,16 @@
package main
import (
- "bytes";
- "bufio";
- "expvar";
- "flag";
- "fmt";
- "io";
- "log";
- "net";
- "os";
- "strconv";
+ "bytes"
+ "bufio"
+ "expvar"
+ "flag"
+ "fmt"
+ "io"
+ "log"
+ "net"
+ "os"
+ "strconv"
)
@@ -22,35 +22,35 @@ import (
var helloRequests = expvar.NewInt("hello-requests")
func HelloServer(c *http.Conn, req *http.Request) {
- helloRequests.Add(1);
- io.WriteString(c, "hello, world!\n");
+ helloRequests.Add(1)
+ io.WriteString(c, "hello, world!\n")
}
// Simple counter server. POSTing to it will set the value.
type Counter struct {
- n int;
+ n int
}
// This makes Counter satisfy the expvar.Var interface, so we can export
// it directly.
-func (ctr *Counter) String() string { return fmt.Sprintf("%d", ctr.n) }
+func (ctr *Counter) String() string { return fmt.Sprintf("%d", ctr.n) }
func (ctr *Counter) ServeHTTP(c *http.Conn, req *http.Request) {
switch req.Method {
case "GET":
ctr.n++
case "POST":
- buf := new(bytes.Buffer);
- io.Copy(buf, req.Body);
- body := buf.String();
+ buf := new(bytes.Buffer)
+ io.Copy(buf, req.Body)
+ body := buf.String()
if n, err := strconv.Atoi(body); err != nil {
fmt.Fprintf(c, "bad POST: %v\nbody: [%v]\n", err, body)
} else {
- ctr.n = n;
- fmt.Fprint(c, "counter reset\n");
+ ctr.n = n
+ fmt.Fprint(c, "counter reset\n")
}
}
- fmt.Fprintf(c, "counter = %d\n", ctr.n);
+ fmt.Fprintf(c, "counter = %d\n", ctr.n)
}
// simple file server
@@ -58,33 +58,33 @@ var webroot = flag.String("root", "/home/rsc", "web root directory")
var pathVar = expvar.NewMap("file-requests")
func FileServer(c *http.Conn, req *http.Request) {
- c.SetHeader("content-type", "text/plain; charset=utf-8");
- pathVar.Add(req.URL.Path, 1);
- path := *webroot + req.URL.Path; // TODO: insecure: use os.CleanName
- f, err := os.Open(path, os.O_RDONLY, 0);
+ c.SetHeader("content-type", "text/plain; charset=utf-8")
+ pathVar.Add(req.URL.Path, 1)
+ path := *webroot + req.URL.Path // TODO: insecure: use os.CleanName
+ f, err := os.Open(path, os.O_RDONLY, 0)
if err != nil {
- c.WriteHeader(http.StatusNotFound);
- fmt.Fprintf(c, "open %s: %v\n", path, err);
- return;
+ c.WriteHeader(http.StatusNotFound)
+ fmt.Fprintf(c, "open %s: %v\n", path, err)
+ return
}
- n, err1 := io.Copy(c, f);
- fmt.Fprintf(c, "[%d bytes]\n", n);
- f.Close();
+ n, err1 := io.Copy(c, f)
+ fmt.Fprintf(c, "[%d bytes]\n", n)
+ f.Close()
}
// simple flag server
var booleanflag = flag.Bool("boolean", true, "another flag for testing")
func FlagServer(c *http.Conn, req *http.Request) {
- c.SetHeader("content-type", "text/plain; charset=utf-8");
- fmt.Fprint(c, "Flags:\n");
+ c.SetHeader("content-type", "text/plain; charset=utf-8")
+ fmt.Fprint(c, "Flags:\n")
flag.VisitAll(func(f *flag.Flag) {
if f.Value.String() != f.DefValue {
fmt.Fprintf(c, "%s = %s [default = %s]\n", f.Name, f.Value.String(), f.DefValue)
} else {
fmt.Fprintf(c, "%s = %s\n", f.Name, f.Value.String())
}
- });
+ })
}
// simple argument server
@@ -98,13 +98,13 @@ func ArgServer(c *http.Conn, req *http.Request) {
type Chan chan int
func ChanCreate() Chan {
- c := make(Chan);
+ c := make(Chan)
go func(c Chan) {
for x := 0; ; x++ {
c <- x
}
- }(c);
- return c;
+ }(c)
+ return c
}
func (ch Chan) ServeHTTP(c *http.Conn, req *http.Request) {
@@ -113,46 +113,46 @@ func (ch Chan) ServeHTTP(c *http.Conn, req *http.Request) {
// exec a program, redirecting output
func DateServer(c *http.Conn, req *http.Request) {
- c.SetHeader("content-type", "text/plain; charset=utf-8");
- r, w, err := os.Pipe();
+ c.SetHeader("content-type", "text/plain; charset=utf-8")
+ r, w, err := os.Pipe()
if err != nil {
- fmt.Fprintf(c, "pipe: %s\n", err);
- return;
+ fmt.Fprintf(c, "pipe: %s\n", err)
+ return
}
- pid, err := os.ForkExec("/bin/date", []string{"date"}, os.Environ(), "", []*os.File{nil, w, w});
- defer r.Close();
- w.Close();
+ pid, err := os.ForkExec("/bin/date", []string{"date"}, os.Environ(), "", []*os.File{nil, w, w})
+ defer r.Close()
+ w.Close()
if err != nil {
- fmt.Fprintf(c, "fork/exec: %s\n", err);
- return;
+ fmt.Fprintf(c, "fork/exec: %s\n", err)
+ return
}
- io.Copy(c, r);
- wait, err := os.Wait(pid, 0);
+ io.Copy(c, r)
+ wait, err := os.Wait(pid, 0)
if err != nil {
- fmt.Fprintf(c, "wait: %s\n", err);
- return;
+ fmt.Fprintf(c, "wait: %s\n", err)
+ return
}
if !wait.Exited() || wait.ExitStatus() != 0 {
- fmt.Fprintf(c, "date: %v\n", wait);
- return;
+ fmt.Fprintf(c, "date: %v\n", wait)
+ return
}
}
func main() {
- flag.Parse();
+ flag.Parse()
// The counter is published as a variable directly.
- ctr := new(Counter);
- http.Handle("/counter", ctr);
- expvar.Publish("counter", ctr);
-
- http.Handle("/go/", http.HandlerFunc(FileServer));
- http.Handle("/flags", http.HandlerFunc(FlagServer));
- http.Handle("/args", http.HandlerFunc(ArgServer));
- http.Handle("/go/hello", http.HandlerFunc(HelloServer));
- http.Handle("/chan", ChanCreate());
- http.Handle("/date", http.HandlerFunc(DateServer));
- err := http.ListenAndServe(":12345", nil);
+ ctr := new(Counter)
+ http.Handle("/counter", ctr)
+ expvar.Publish("counter", ctr)
+
+ http.Handle("/go/", http.HandlerFunc(FileServer))
+ http.Handle("/flags", http.HandlerFunc(FlagServer))
+ http.Handle("/args", http.HandlerFunc(ArgServer))
+ http.Handle("/go/hello", http.HandlerFunc(HelloServer))
+ http.Handle("/chan", ChanCreate())
+ http.Handle("/date", http.HandlerFunc(DateServer))
+ err := http.ListenAndServe(":12345", nil)
if err != nil {
log.Crash("ListenAndServe: ", err)
}
diff --git a/src/pkg/http/url.go b/src/pkg/http/url.go
index ddf0ba986..ca8c344be 100644
--- a/src/pkg/http/url.go
+++ b/src/pkg/http/url.go
@@ -8,19 +8,19 @@
package http
import (
- "os";
- "strconv";
- "strings";
+ "os"
+ "strconv"
+ "strings"
)
// URLError reports an error and the operation and URL that caused it.
type URLError struct {
- Op string;
- URL string;
- Error os.Error;
+ Op string
+ URL string
+ Error os.Error
}
-func (e *URLError) String() string { return e.Op + " " + e.URL + ": " + e.Error.String() }
+func (e *URLError) String() string { return e.Op + " " + e.URL + ": " + e.Error.String() }
func ishex(c byte) bool {
switch {
@@ -31,7 +31,7 @@ func ishex(c byte) bool {
case 'A' <= c && c <= 'F':
return true
}
- return false;
+ return false
}
func unhex(c byte) byte {
@@ -43,7 +43,7 @@ func unhex(c byte) byte {
case 'A' <= c && c <= 'F':
return c - 'A' + 10
}
- return 0;
+ return 0
}
type URLEscapeError string
@@ -59,12 +59,12 @@ func shouldEscape(c byte) bool {
return true
}
switch c {
- case '<', '>', '#', '%', '"', // RFC 2396 delims
- '{', '}', '|', '\\', '^', '[', ']', '`', // RFC2396 unwise
- '?', '&', '=', '+': // RFC 2396 reserved in path
+ case '<', '>', '#', '%', '"', // RFC 2396 delims
+ '{', '}', '|', '\\', '^', '[', ']', '`', // RFC2396 unwise
+ '?', '&', '=', '+': // RFC 2396 reserved in path
return true
}
- return false;
+ return false
}
// URLUnescape unescapes a URL-encoded string,
@@ -73,23 +73,23 @@ func shouldEscape(c byte) bool {
// by two hexadecimal digits.
func URLUnescape(s string) (string, os.Error) {
// Count %, check that they're well-formed.
- n := 0;
- hasPlus := false;
+ n := 0
+ hasPlus := false
for i := 0; i < len(s); {
switch s[i] {
case '%':
- n++;
+ n++
if i+2 >= len(s) || !ishex(s[i+1]) || !ishex(s[i+2]) {
- s = s[i:];
+ s = s[i:]
if len(s) > 3 {
s = s[0:3]
}
- return "", URLEscapeError(s);
+ return "", URLEscapeError(s)
}
- i += 3;
+ i += 3
case '+':
- hasPlus = true;
- i++;
+ hasPlus = true
+ i++
default:
i++
}
@@ -99,32 +99,32 @@ func URLUnescape(s string) (string, os.Error) {
return s, nil
}
- t := make([]byte, len(s)-2*n);
- j := 0;
+ t := make([]byte, len(s)-2*n)
+ j := 0
for i := 0; i < len(s); {
switch s[i] {
case '%':
- t[j] = unhex(s[i+1])<<4 | unhex(s[i+2]);
- j++;
- i += 3;
+ t[j] = unhex(s[i+1])<<4 | unhex(s[i+2])
+ j++
+ i += 3
case '+':
- t[j] = ' ';
- j++;
- i++;
+ t[j] = ' '
+ j++
+ i++
default:
- t[j] = s[i];
- j++;
- i++;
+ t[j] = s[i]
+ j++
+ i++
}
}
- return string(t), nil;
+ return string(t), nil
}
// URLEscape converts a string into URL-encoded form.
func URLEscape(s string) string {
- spaceCount, hexCount := 0, 0;
+ spaceCount, hexCount := 0, 0
for i := 0; i < len(s); i++ {
- c := s[i];
+ c := s[i]
if shouldEscape(c) {
if c == ' ' {
spaceCount++
@@ -138,24 +138,24 @@ func URLEscape(s string) string {
return s
}
- t := make([]byte, len(s)+2*hexCount);
- j := 0;
+ t := make([]byte, len(s)+2*hexCount)
+ j := 0
for i := 0; i < len(s); i++ {
switch c := s[i]; {
case c == ' ':
- t[j] = '+';
- j++;
+ t[j] = '+'
+ j++
case shouldEscape(c):
- t[j] = '%';
- t[j+1] = "0123456789abcdef"[c>>4];
- t[j+2] = "0123456789abcdef"[c&15];
- j += 3;
+ t[j] = '%'
+ t[j+1] = "0123456789abcdef"[c>>4]
+ t[j+2] = "0123456789abcdef"[c&15]
+ j += 3
default:
- t[j] = s[i];
- j++;
+ t[j] = s[i]
+ j++
}
}
- return string(t);
+ return string(t)
}
// A URL represents a parsed URL (technically, a URI reference).
@@ -168,15 +168,15 @@ func URLEscape(s string) string {
// Note, the reason for using wire format for the query is that it needs
// to be split into key/value pairs before decoding.
type URL struct {
- Raw string; // the original string
- Scheme string; // scheme
- RawPath string; // //[userinfo@]host/path[?query][#fragment]
- Authority string; // [userinfo@]host
- Userinfo string; // userinfo
- Host string; // host
- Path string; // /path
- RawQuery string; // query
- Fragment string; // fragment
+ Raw string // the original string
+ Scheme string // scheme
+ RawPath string // //[userinfo@]host/path[?query][#fragment]
+ Authority string // [userinfo@]host
+ Userinfo string // userinfo
+ Host string // host
+ Path string // /path
+ RawQuery string // query
+ Fragment string // fragment
}
// Maybe rawurl is of the form scheme:path.
@@ -184,7 +184,7 @@ type URL struct {
// If so, return scheme, path; else return "", rawurl.
func getscheme(rawurl string) (scheme, path string, err os.Error) {
for i := 0; i < len(rawurl); i++ {
- c := rawurl[i];
+ c := rawurl[i]
switch {
case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z':
// do nothing
@@ -196,14 +196,14 @@ func getscheme(rawurl string) (scheme, path string, err os.Error) {
if i == 0 {
return "", "", os.ErrorString("missing protocol scheme")
}
- return rawurl[0:i], rawurl[i+1:], nil;
+ return rawurl[0:i], rawurl[i+1:], nil
default:
// we have encountered an invalid character,
// so there is no valid scheme
return "", rawurl, nil
}
}
- return "", rawurl, nil;
+ return "", rawurl, nil
}
// Maybe s is of the form t c u.
@@ -215,10 +215,10 @@ func split(s string, c byte, cutc bool) (string, string) {
if cutc {
return s[0:i], s[i+1:]
}
- return s[0:i], s[i:];
+ return s[0:i], s[i:]
}
}
- return s, "";
+ return s, ""
}
// TODO(rsc): The BUG comment is supposed to appear in the godoc output
@@ -233,18 +233,18 @@ func split(s string, c byte, cutc bool) (string, string) {
// (Web browsers strip #fragment before sending the URL to a web server.)
func ParseURL(rawurl string) (url *URL, err os.Error) {
if rawurl == "" {
- err = os.ErrorString("empty url");
- goto Error;
+ err = os.ErrorString("empty url")
+ goto Error
}
- url = new(URL);
- url.Raw = rawurl;
+ url = new(URL)
+ url.Raw = rawurl
// split off possible leading "http:", "mailto:", etc.
- var path string;
+ var path string
if url.Scheme, path, err = getscheme(rawurl); err != nil {
goto Error
}
- url.RawPath = path;
+ url.RawPath = path
// RFC 2396: a relative URI (no scheme) has a ?query,
// but absolute URIs only have query if path begins with /
@@ -279,32 +279,32 @@ func ParseURL(rawurl string) (url *URL, err os.Error) {
goto Error
}
if strings.Index(url.Scheme, "%") >= 0 {
- err = os.ErrorString("hexadecimal escape in scheme");
- goto Error;
+ err = os.ErrorString("hexadecimal escape in scheme")
+ goto Error
}
if strings.Index(url.Host, "%") >= 0 {
- err = os.ErrorString("hexadecimal escape in host");
- goto Error;
+ err = os.ErrorString("hexadecimal escape in host")
+ goto Error
}
- return url, nil;
+ return url, nil
Error:
- return nil, &URLError{"parse", rawurl, err};
+ return nil, &URLError{"parse", rawurl, err}
}
// ParseURLReference is like ParseURL but allows a trailing #fragment.
func ParseURLReference(rawurlref string) (url *URL, err os.Error) {
// Cut off #frag.
- rawurl, frag := split(rawurlref, '#', true);
+ rawurl, frag := split(rawurlref, '#', true)
if url, err = ParseURL(rawurl); err != nil {
return nil, err
}
if url.Fragment, err = URLUnescape(frag); err != nil {
return nil, &URLError{"parse", rawurl, err}
}
- return url, nil;
+ return url, nil
}
// String reassembles url into a valid URL string.
@@ -313,23 +313,23 @@ func ParseURLReference(rawurlref string) (url *URL, err os.Error) {
// the String method consults Scheme, Path, Host, Userinfo,
// RawQuery, and Fragment, but not Raw, RawPath or Authority.
func (url *URL) String() string {
- result := "";
+ result := ""
if url.Scheme != "" {
result += url.Scheme + ":"
}
if url.Host != "" || url.Userinfo != "" {
- result += "//";
+ result += "//"
if url.Userinfo != "" {
result += URLEscape(url.Userinfo) + "@"
}
- result += url.Host;
+ result += url.Host
}
- result += URLEscape(url.Path);
+ result += URLEscape(url.Path)
if url.RawQuery != "" {
result += "?" + url.RawQuery
}
if url.Fragment != "" {
result += "#" + URLEscape(url.Fragment)
}
- return result;
+ return result
}
diff --git a/src/pkg/http/url_test.go b/src/pkg/http/url_test.go
index 2f9707a2e..0e3fa2d6e 100644
--- a/src/pkg/http/url_test.go
+++ b/src/pkg/http/url_test.go
@@ -5,10 +5,10 @@
package http
import (
- "fmt";
- "os";
- "reflect";
- "testing";
+ "fmt"
+ "os"
+ "reflect"
+ "testing"
)
// TODO(rsc):
@@ -17,9 +17,9 @@ import (
// test ParseURL
type URLTest struct {
- in string;
- out *URL;
- roundtrip string; // expected result of reserializing the URL; empty means same as "in".
+ in string
+ out *URL
+ roundtrip string // expected result of reserializing the URL; empty means same as "in".
}
var urltests = []URLTest{
@@ -191,10 +191,10 @@ func ufmt(u *URL) string {
func DoTest(t *testing.T, parse func(string) (*URL, os.Error), name string, tests []URLTest) {
for _, tt := range tests {
- u, err := parse(tt.in);
+ u, err := parse(tt.in)
if err != nil {
- t.Errorf("%s(%q) returned error %s", name, tt.in, err);
- continue;
+ t.Errorf("%s(%q) returned error %s", name, tt.in, err)
+ continue
}
if !reflect.DeepEqual(u, tt.out) {
t.Errorf("%s(%q):\n\thave %v\n\twant %v\n",
@@ -204,24 +204,24 @@ func DoTest(t *testing.T, parse func(string) (*URL, os.Error), name string, test
}
func TestParseURL(t *testing.T) {
- DoTest(t, ParseURL, "ParseURL", urltests);
- DoTest(t, ParseURL, "ParseURL", urlnofragtests);
+ DoTest(t, ParseURL, "ParseURL", urltests)
+ DoTest(t, ParseURL, "ParseURL", urlnofragtests)
}
func TestParseURLReference(t *testing.T) {
- DoTest(t, ParseURLReference, "ParseURLReference", urltests);
- DoTest(t, ParseURLReference, "ParseURLReference", urlfragtests);
+ DoTest(t, ParseURLReference, "ParseURLReference", urltests)
+ DoTest(t, ParseURLReference, "ParseURLReference", urlfragtests)
}
func DoTestString(t *testing.T, parse func(string) (*URL, os.Error), name string, tests []URLTest) {
for _, tt := range tests {
- u, err := parse(tt.in);
+ u, err := parse(tt.in)
if err != nil {
- t.Errorf("%s(%q) returned error %s", name, tt.in, err);
- continue;
+ t.Errorf("%s(%q) returned error %s", name, tt.in, err)
+ continue
}
- s := u.String();
- expected := tt.in;
+ s := u.String()
+ expected := tt.in
if len(tt.roundtrip) > 0 {
expected = tt.roundtrip
}
@@ -232,18 +232,18 @@ func DoTestString(t *testing.T, parse func(string) (*URL, os.Error), name string
}
func TestURLString(t *testing.T) {
- DoTestString(t, ParseURL, "ParseURL", urltests);
- DoTestString(t, ParseURL, "ParseURL", urlfragtests);
- DoTestString(t, ParseURL, "ParseURL", urlnofragtests);
- DoTestString(t, ParseURLReference, "ParseURLReference", urltests);
- DoTestString(t, ParseURLReference, "ParseURLReference", urlfragtests);
- DoTestString(t, ParseURLReference, "ParseURLReference", urlnofragtests);
+ DoTestString(t, ParseURL, "ParseURL", urltests)
+ DoTestString(t, ParseURL, "ParseURL", urlfragtests)
+ DoTestString(t, ParseURL, "ParseURL", urlnofragtests)
+ DoTestString(t, ParseURLReference, "ParseURLReference", urltests)
+ DoTestString(t, ParseURLReference, "ParseURLReference", urlfragtests)
+ DoTestString(t, ParseURLReference, "ParseURLReference", urlnofragtests)
}
type URLEscapeTest struct {
- in string;
- out string;
- err os.Error;
+ in string
+ out string
+ err os.Error
}
var unescapeTests = []URLEscapeTest{
@@ -278,27 +278,27 @@ var unescapeTests = []URLEscapeTest{
nil,
},
URLEscapeTest{
- "%", // not enough characters after %
+ "%", // not enough characters after %
"",
URLEscapeError("%"),
},
URLEscapeTest{
- "%a", // not enough characters after %
+ "%a", // not enough characters after %
"",
URLEscapeError("%a"),
},
URLEscapeTest{
- "%1", // not enough characters after %
+ "%1", // not enough characters after %
"",
URLEscapeError("%1"),
},
URLEscapeTest{
- "123%45%6", // not enough characters after %
+ "123%45%6", // not enough characters after %
"",
URLEscapeError("%6"),
},
URLEscapeTest{
- "%zzzzz", // invalid hex digits
+ "%zzzzz", // invalid hex digits
"",
URLEscapeError("%zz"),
},
@@ -306,7 +306,7 @@ var unescapeTests = []URLEscapeTest{
func TestURLUnescape(t *testing.T) {
for _, tt := range unescapeTests {
- actual, err := URLUnescape(tt.in);
+ actual, err := URLUnescape(tt.in)
if actual != tt.out || (err != nil) != (tt.err != nil) {
t.Errorf("URLUnescape(%q) = %q, %s; want %q, %s", tt.in, actual, err, tt.out, tt.err)
}
@@ -343,13 +343,13 @@ var escapeTests = []URLEscapeTest{
func TestURLEscape(t *testing.T) {
for _, tt := range escapeTests {
- actual := URLEscape(tt.in);
+ actual := URLEscape(tt.in)
if tt.out != actual {
t.Errorf("URLEscape(%q) = %q, want %q", tt.in, actual, tt.out)
}
// for bonus points, verify that escape:unescape is an identity.
- roundtrip, err := URLUnescape(actual);
+ roundtrip, err := URLUnescape(actual)
if roundtrip != tt.in || err != nil {
t.Errorf("URLUnescape(%q) = %q, %s; want %q, %s", actual, roundtrip, err, tt.in, "[no error]")
}
diff --git a/src/pkg/image/color.go b/src/pkg/image/color.go
index bf8eefb60..8594ac538 100644
--- a/src/pkg/image/color.go
+++ b/src/pkg/image/color.go
@@ -8,102 +8,102 @@ package image
// All Colors can convert themselves, with a possible loss of precision, to 128-bit alpha-premultiplied RGBA.
type Color interface {
- RGBA() (r, g, b, a uint32);
+ RGBA() (r, g, b, a uint32)
}
// An RGBAColor represents a traditional 32-bit alpha-premultiplied color, having 8 bits for each of red, green, blue and alpha.
type RGBAColor struct {
- R, G, B, A uint8;
+ R, G, B, A uint8
}
func (c RGBAColor) RGBA() (r, g, b, a uint32) {
- r = uint32(c.R);
- r |= r << 8;
- r |= r << 16;
- g = uint32(c.G);
- g |= g << 8;
- g |= g << 16;
- b = uint32(c.B);
- b |= b << 8;
- b |= b << 16;
- a = uint32(c.A);
- a |= a << 8;
- a |= a << 16;
- return;
+ r = uint32(c.R)
+ r |= r << 8
+ r |= r << 16
+ g = uint32(c.G)
+ g |= g << 8
+ g |= g << 16
+ b = uint32(c.B)
+ b |= b << 8
+ b |= b << 16
+ a = uint32(c.A)
+ a |= a << 8
+ a |= a << 16
+ return
}
// An RGBA64Color represents a 64-bit alpha-premultiplied color, having 16 bits for each of red, green, blue and alpha.
type RGBA64Color struct {
- R, G, B, A uint16;
+ R, G, B, A uint16
}
func (c RGBA64Color) RGBA() (r, g, b, a uint32) {
- r = uint32(c.R);
- r |= r << 16;
- g = uint32(c.G);
- g |= g << 16;
- b = uint32(c.B);
- b |= b << 16;
- a = uint32(c.A);
- a |= a << 16;
- return;
+ r = uint32(c.R)
+ r |= r << 16
+ g = uint32(c.G)
+ g |= g << 16
+ b = uint32(c.B)
+ b |= b << 16
+ a = uint32(c.A)
+ a |= a << 16
+ return
}
// An NRGBAColor represents a non-alpha-premultiplied 32-bit color.
type NRGBAColor struct {
- R, G, B, A uint8;
+ R, G, B, A uint8
}
func (c NRGBAColor) RGBA() (r, g, b, a uint32) {
- r = uint32(c.R);
- r |= r << 8;
- r *= uint32(c.A);
- r /= 0xff;
- r |= r << 16;
- g = uint32(c.G);
- g |= g << 8;
- g *= uint32(c.A);
- g /= 0xff;
- g |= g << 16;
- b = uint32(c.B);
- b |= b << 8;
- b *= uint32(c.A);
- b /= 0xff;
- b |= b << 16;
- a = uint32(c.A);
- a |= a << 8;
- a |= a << 16;
- return;
+ r = uint32(c.R)
+ r |= r << 8
+ r *= uint32(c.A)
+ r /= 0xff
+ r |= r << 16
+ g = uint32(c.G)
+ g |= g << 8
+ g *= uint32(c.A)
+ g /= 0xff
+ g |= g << 16
+ b = uint32(c.B)
+ b |= b << 8
+ b *= uint32(c.A)
+ b /= 0xff
+ b |= b << 16
+ a = uint32(c.A)
+ a |= a << 8
+ a |= a << 16
+ return
}
// An NRGBA64Color represents a non-alpha-premultiplied 64-bit color, having 16 bits for each of red, green, blue and alpha.
type NRGBA64Color struct {
- R, G, B, A uint16;
+ R, G, B, A uint16
}
func (c NRGBA64Color) RGBA() (r, g, b, a uint32) {
- r = uint32(c.R);
- r *= uint32(c.A);
- r /= 0xffff;
- r |= r << 16;
- g = uint32(c.G);
- g *= uint32(c.A);
- g /= 0xffff;
- g |= g << 16;
- b = uint32(c.B);
- b *= uint32(c.A);
- b /= 0xffff;
- b |= b << 16;
- a = uint32(c.A);
- a |= a << 8;
- a |= a << 16;
- return;
+ r = uint32(c.R)
+ r *= uint32(c.A)
+ r /= 0xffff
+ r |= r << 16
+ g = uint32(c.G)
+ g *= uint32(c.A)
+ g /= 0xffff
+ g |= g << 16
+ b = uint32(c.B)
+ b *= uint32(c.A)
+ b /= 0xffff
+ b |= b << 16
+ a = uint32(c.A)
+ a |= a << 8
+ a |= a << 16
+ return
}
// A ColorModel can convert foreign Colors, with a possible loss of precision, to a Color
// from its own color model.
type ColorModel interface {
- Convert(c Color) Color;
+ Convert(c Color) Color
}
// The ColorModelFunc type is an adapter to allow the use of an ordinary
@@ -117,52 +117,52 @@ func (f ColorModelFunc) Convert(c Color) Color {
}
func toRGBAColor(c Color) Color {
- if _, ok := c.(RGBAColor); ok { // no-op conversion
+ if _, ok := c.(RGBAColor); ok { // no-op conversion
return c
}
- r, g, b, a := c.RGBA();
- return RGBAColor{uint8(r >> 24), uint8(g >> 24), uint8(b >> 24), uint8(a >> 24)};
+ r, g, b, a := c.RGBA()
+ return RGBAColor{uint8(r >> 24), uint8(g >> 24), uint8(b >> 24), uint8(a >> 24)}
}
func toRGBA64Color(c Color) Color {
- if _, ok := c.(RGBA64Color); ok { // no-op conversion
+ if _, ok := c.(RGBA64Color); ok { // no-op conversion
return c
}
- r, g, b, a := c.RGBA();
- return RGBA64Color{uint16(r >> 16), uint16(g >> 16), uint16(b >> 16), uint16(a >> 16)};
+ r, g, b, a := c.RGBA()
+ return RGBA64Color{uint16(r >> 16), uint16(g >> 16), uint16(b >> 16), uint16(a >> 16)}
}
func toNRGBAColor(c Color) Color {
- if _, ok := c.(NRGBAColor); ok { // no-op conversion
+ if _, ok := c.(NRGBAColor); ok { // no-op conversion
return c
}
- r, g, b, a := c.RGBA();
- a >>= 16;
+ r, g, b, a := c.RGBA()
+ a >>= 16
if a == 0xffff {
return NRGBAColor{uint8(r >> 24), uint8(g >> 24), uint8(b >> 24), 0xff}
}
if a == 0 {
return NRGBAColor{0, 0, 0, 0}
}
- r >>= 16;
- g >>= 16;
- b >>= 16;
+ r >>= 16
+ g >>= 16
+ b >>= 16
// Since Color.RGBA returns a alpha-premultiplied color, we should have r <= a && g <= a && b <= a.
- r = (r * 0xffff) / a;
- g = (g * 0xffff) / a;
- b = (b * 0xffff) / a;
- return NRGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)};
+ r = (r * 0xffff) / a
+ g = (g * 0xffff) / a
+ b = (b * 0xffff) / a
+ return NRGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)}
}
func toNRGBA64Color(c Color) Color {
- if _, ok := c.(NRGBA64Color); ok { // no-op conversion
+ if _, ok := c.(NRGBA64Color); ok { // no-op conversion
return c
}
- r, g, b, a := c.RGBA();
- a >>= 16;
- r >>= 16;
- g >>= 16;
- b >>= 16;
+ r, g, b, a := c.RGBA()
+ a >>= 16
+ r >>= 16
+ g >>= 16
+ b >>= 16
if a == 0xffff {
return NRGBA64Color{uint16(r), uint16(g), uint16(b), 0xffff}
}
@@ -170,10 +170,10 @@ func toNRGBA64Color(c Color) Color {
return NRGBA64Color{0, 0, 0, 0}
}
// Since Color.RGBA returns a alpha-premultiplied color, we should have r <= a && g <= a && b <= a.
- r = (r * 0xffff) / a;
- g = (g * 0xffff) / a;
- b = (b * 0xffff) / a;
- return NRGBA64Color{uint16(r), uint16(g), uint16(b), uint16(a)};
+ r = (r * 0xffff) / a
+ g = (g * 0xffff) / a
+ b = (b * 0xffff) / a
+ return NRGBA64Color{uint16(r), uint16(g), uint16(b), uint16(a)}
}
// The ColorModel associated with RGBAColor.
diff --git a/src/pkg/image/image.go b/src/pkg/image/image.go
index 9fc753b0f..b35094418 100644
--- a/src/pkg/image/image.go
+++ b/src/pkg/image/image.go
@@ -7,132 +7,132 @@ package image
// An Image is a rectangular grid of Colors drawn from a ColorModel.
type Image interface {
- ColorModel() ColorModel;
- Width() int;
- Height() int;
+ ColorModel() ColorModel
+ Width() int
+ Height() int
// At(0, 0) returns the upper-left pixel of the grid.
// At(Width()-1, Height()-1) returns the lower-right pixel.
- At(x, y int) Color;
+ At(x, y int) Color
}
// An RGBA is an in-memory image backed by a 2-D slice of RGBAColor values.
type RGBA struct {
// The Pixel field's indices are y first, then x, so that At(x, y) == Pixel[y][x].
- Pixel [][]RGBAColor;
+ Pixel [][]RGBAColor
}
-func (p *RGBA) ColorModel() ColorModel { return RGBAColorModel }
+func (p *RGBA) ColorModel() ColorModel { return RGBAColorModel }
func (p *RGBA) Width() int {
if len(p.Pixel) == 0 {
return 0
}
- return len(p.Pixel[0]);
+ return len(p.Pixel[0])
}
-func (p *RGBA) Height() int { return len(p.Pixel) }
+func (p *RGBA) Height() int { return len(p.Pixel) }
-func (p *RGBA) At(x, y int) Color { return p.Pixel[y][x] }
+func (p *RGBA) At(x, y int) Color { return p.Pixel[y][x] }
-func (p *RGBA) Set(x, y int, c Color) { p.Pixel[y][x] = toRGBAColor(c).(RGBAColor) }
+func (p *RGBA) Set(x, y int, c Color) { p.Pixel[y][x] = toRGBAColor(c).(RGBAColor) }
// NewRGBA returns a new RGBA with the given width and height.
func NewRGBA(w, h int) *RGBA {
- pixel := make([][]RGBAColor, h);
+ pixel := make([][]RGBAColor, h)
for y := 0; y < h; y++ {
pixel[y] = make([]RGBAColor, w)
}
- return &RGBA{pixel};
+ return &RGBA{pixel}
}
// An RGBA64 is an in-memory image backed by a 2-D slice of RGBA64Color values.
type RGBA64 struct {
// The Pixel field's indices are y first, then x, so that At(x, y) == Pixel[y][x].
- Pixel [][]RGBA64Color;
+ Pixel [][]RGBA64Color
}
-func (p *RGBA64) ColorModel() ColorModel { return RGBA64ColorModel }
+func (p *RGBA64) ColorModel() ColorModel { return RGBA64ColorModel }
func (p *RGBA64) Width() int {
if len(p.Pixel) == 0 {
return 0
}
- return len(p.Pixel[0]);
+ return len(p.Pixel[0])
}
-func (p *RGBA64) Height() int { return len(p.Pixel) }
+func (p *RGBA64) Height() int { return len(p.Pixel) }
-func (p *RGBA64) At(x, y int) Color { return p.Pixel[y][x] }
+func (p *RGBA64) At(x, y int) Color { return p.Pixel[y][x] }
-func (p *RGBA64) Set(x, y int, c Color) { p.Pixel[y][x] = toRGBA64Color(c).(RGBA64Color) }
+func (p *RGBA64) Set(x, y int, c Color) { p.Pixel[y][x] = toRGBA64Color(c).(RGBA64Color) }
// NewRGBA64 returns a new RGBA64 with the given width and height.
func NewRGBA64(w, h int) *RGBA64 {
- pixel := make([][]RGBA64Color, h);
+ pixel := make([][]RGBA64Color, h)
for y := 0; y < h; y++ {
pixel[y] = make([]RGBA64Color, w)
}
- return &RGBA64{pixel};
+ return &RGBA64{pixel}
}
// A NRGBA is an in-memory image backed by a 2-D slice of NRGBAColor values.
type NRGBA struct {
// The Pixel field's indices are y first, then x, so that At(x, y) == Pixel[y][x].
- Pixel [][]NRGBAColor;
+ Pixel [][]NRGBAColor
}
-func (p *NRGBA) ColorModel() ColorModel { return NRGBAColorModel }
+func (p *NRGBA) ColorModel() ColorModel { return NRGBAColorModel }
func (p *NRGBA) Width() int {
if len(p.Pixel) == 0 {
return 0
}
- return len(p.Pixel[0]);
+ return len(p.Pixel[0])
}
-func (p *NRGBA) Height() int { return len(p.Pixel) }
+func (p *NRGBA) Height() int { return len(p.Pixel) }
-func (p *NRGBA) At(x, y int) Color { return p.Pixel[y][x] }
+func (p *NRGBA) At(x, y int) Color { return p.Pixel[y][x] }
-func (p *NRGBA) Set(x, y int, c Color) { p.Pixel[y][x] = toNRGBAColor(c).(NRGBAColor) }
+func (p *NRGBA) Set(x, y int, c Color) { p.Pixel[y][x] = toNRGBAColor(c).(NRGBAColor) }
// NewNRGBA returns a new NRGBA with the given width and height.
func NewNRGBA(w, h int) *NRGBA {
- pixel := make([][]NRGBAColor, h);
+ pixel := make([][]NRGBAColor, h)
for y := 0; y < h; y++ {
pixel[y] = make([]NRGBAColor, w)
}
- return &NRGBA{pixel};
+ return &NRGBA{pixel}
}
// A NRGBA64 is an in-memory image backed by a 2-D slice of NRGBA64Color values.
type NRGBA64 struct {
// The Pixel field's indices are y first, then x, so that At(x, y) == Pixel[y][x].
- Pixel [][]NRGBA64Color;
+ Pixel [][]NRGBA64Color
}
-func (p *NRGBA64) ColorModel() ColorModel { return NRGBA64ColorModel }
+func (p *NRGBA64) ColorModel() ColorModel { return NRGBA64ColorModel }
func (p *NRGBA64) Width() int {
if len(p.Pixel) == 0 {
return 0
}
- return len(p.Pixel[0]);
+ return len(p.Pixel[0])
}
-func (p *NRGBA64) Height() int { return len(p.Pixel) }
+func (p *NRGBA64) Height() int { return len(p.Pixel) }
-func (p *NRGBA64) At(x, y int) Color { return p.Pixel[y][x] }
+func (p *NRGBA64) At(x, y int) Color { return p.Pixel[y][x] }
-func (p *NRGBA64) Set(x, y int, c Color) { p.Pixel[y][x] = toNRGBA64Color(c).(NRGBA64Color) }
+func (p *NRGBA64) Set(x, y int, c Color) { p.Pixel[y][x] = toNRGBA64Color(c).(NRGBA64Color) }
// NewNRGBA64 returns a new NRGBA64 with the given width and height.
func NewNRGBA64(w, h int) *NRGBA64 {
- pixel := make([][]NRGBA64Color, h);
+ pixel := make([][]NRGBA64Color, h)
for y := 0; y < h; y++ {
pixel[y] = make([]NRGBA64Color, w)
}
- return &NRGBA64{pixel};
+ return &NRGBA64{pixel}
}
// A PalettedColorModel represents a fixed palette of colors.
@@ -142,7 +142,7 @@ func diff(a, b uint32) uint32 {
if a > b {
return a - b
}
- return b - a;
+ return b - a
}
// Convert returns the palette color closest to c in Euclidean R,G,B space.
@@ -153,47 +153,47 @@ func (p PalettedColorModel) Convert(c Color) Color {
// TODO(nigeltao): Revisit the "pick the palette color which minimizes sum-squared-difference"
// algorithm when the premultiplied vs unpremultiplied issue is resolved.
// Currently, we only compare the R, G and B values, and ignore A.
- cr, cg, cb, _ := c.RGBA();
+ cr, cg, cb, _ := c.RGBA()
// Shift by 17 bits to avoid potential uint32 overflow in sum-squared-difference.
- cr >>= 17;
- cg >>= 17;
- cb >>= 17;
- result := Color(nil);
- bestSSD := uint32(1<<32 - 1);
+ cr >>= 17
+ cg >>= 17
+ cb >>= 17
+ result := Color(nil)
+ bestSSD := uint32(1<<32 - 1)
for _, v := range p {
- vr, vg, vb, _ := v.RGBA();
- vr >>= 17;
- vg >>= 17;
- vb >>= 17;
- dr, dg, db := diff(cr, vr), diff(cg, vg), diff(cb, vb);
- ssd := (dr * dr) + (dg * dg) + (db * db);
+ vr, vg, vb, _ := v.RGBA()
+ vr >>= 17
+ vg >>= 17
+ vb >>= 17
+ dr, dg, db := diff(cr, vr), diff(cg, vg), diff(cb, vb)
+ ssd := (dr * dr) + (dg * dg) + (db * db)
if ssd < bestSSD {
- bestSSD = ssd;
- result = v;
+ bestSSD = ssd
+ result = v
}
}
- return result;
+ return result
}
// A Paletted is an in-memory image backed by a 2-D slice of uint8 values and a PalettedColorModel.
type Paletted struct {
// The Pixel field's indices are y first, then x, so that At(x, y) == Palette[Pixel[y][x]].
- Pixel [][]uint8;
- Palette PalettedColorModel;
+ Pixel [][]uint8
+ Palette PalettedColorModel
}
-func (p *Paletted) ColorModel() ColorModel { return p.Palette }
+func (p *Paletted) ColorModel() ColorModel { return p.Palette }
func (p *Paletted) Width() int {
if len(p.Pixel) == 0 {
return 0
}
- return len(p.Pixel[0]);
+ return len(p.Pixel[0])
}
-func (p *Paletted) Height() int { return len(p.Pixel) }
+func (p *Paletted) Height() int { return len(p.Pixel) }
-func (p *Paletted) At(x, y int) Color { return p.Palette[p.Pixel[y][x]] }
+func (p *Paletted) At(x, y int) Color { return p.Palette[p.Pixel[y][x]] }
func (p *Paletted) ColorIndexAt(x, y int) uint8 {
return p.Pixel[y][x]
@@ -205,9 +205,9 @@ func (p *Paletted) SetColorIndex(x, y int, index uint8) {
// NewPaletted returns a new Paletted with the given width, height and palette.
func NewPaletted(w, h int, m PalettedColorModel) *Paletted {
- pixel := make([][]uint8, h);
+ pixel := make([][]uint8, h)
for y := 0; y < h; y++ {
pixel[y] = make([]uint8, w)
}
- return &Paletted{pixel, m};
+ return &Paletted{pixel, m}
}
diff --git a/src/pkg/image/png/reader.go b/src/pkg/image/png/reader.go
index 96528af0d..9176524c9 100644
--- a/src/pkg/image/png/reader.go
+++ b/src/pkg/image/png/reader.go
@@ -8,31 +8,31 @@
package png
import (
- "compress/zlib";
- "hash";
- "hash/crc32";
- "image";
- "io";
- "os";
+ "compress/zlib"
+ "hash"
+ "hash/crc32"
+ "image"
+ "io"
+ "os"
)
// Color type, as per the PNG spec.
const (
- ctGrayscale = 0;
- ctTrueColor = 2;
- ctPaletted = 3;
- ctGrayscaleAlpha = 4;
- ctTrueColorAlpha = 6;
+ ctGrayscale = 0
+ ctTrueColor = 2
+ ctPaletted = 3
+ ctGrayscaleAlpha = 4
+ ctTrueColorAlpha = 6
)
// Filter type, as per the PNG spec.
const (
- ftNone = 0;
- ftSub = 1;
- ftUp = 2;
- ftAverage = 3;
- ftPaeth = 4;
- nFilter = 5;
+ ftNone = 0
+ ftSub = 1
+ ftUp = 2
+ ftAverage = 3
+ ftPaeth = 4
+ nFilter = 5
)
// Decoding stage.
@@ -41,43 +41,43 @@ const (
// IDAT chunks must be sequential (i.e. they may not have any other chunks
// between them).
const (
- dsStart = iota;
- dsSeenIHDR;
- dsSeenPLTE;
- dsSeenIDAT;
- dsSeenIEND;
+ dsStart = iota
+ dsSeenIHDR
+ dsSeenPLTE
+ dsSeenIDAT
+ dsSeenIEND
)
const pngHeader = "\x89PNG\r\n\x1a\n"
type decoder struct {
- width, height int;
- image image.Image;
- colorType uint8;
- stage int;
- idatWriter io.WriteCloser;
- idatDone chan os.Error;
- tmp [3 * 256]byte;
+ width, height int
+ image image.Image
+ colorType uint8
+ stage int
+ idatWriter io.WriteCloser
+ idatDone chan os.Error
+ tmp [3 * 256]byte
}
// A FormatError reports that the input is not a valid PNG.
type FormatError string
-func (e FormatError) String() string { return "invalid PNG format: " + string(e) }
+func (e FormatError) String() string { return "invalid PNG format: " + string(e) }
var chunkOrderError = FormatError("chunk out of order")
// An IDATDecodingError wraps an inner error (such as a ZLIB decoding error) encountered while processing an IDAT chunk.
type IDATDecodingError struct {
- Err os.Error;
+ Err os.Error
}
-func (e IDATDecodingError) String() string { return "IDAT decoding error: " + e.Err.String() }
+func (e IDATDecodingError) String() string { return "IDAT decoding error: " + e.Err.String() }
// An UnsupportedError reports that the input uses a valid but unimplemented PNG feature.
type UnsupportedError string
-func (e UnsupportedError) String() string { return "unsupported PNG feature: " + string(e) }
+func (e UnsupportedError) String() string { return "unsupported PNG feature: " + string(e) }
// Big-endian.
func parseUint32(b []uint8) uint32 {
@@ -88,41 +88,41 @@ func abs(x int) int {
if x < 0 {
return -x
}
- return x;
+ return x
}
func min(a, b int) int {
if a < b {
return a
}
- return b;
+ return b
}
func (d *decoder) parseIHDR(r io.Reader, crc hash.Hash32, length uint32) os.Error {
if length != 13 {
return FormatError("bad IHDR length")
}
- _, err := io.ReadFull(r, d.tmp[0:13]);
+ _, err := io.ReadFull(r, d.tmp[0:13])
if err != nil {
return err
}
- crc.Write(d.tmp[0:13]);
+ crc.Write(d.tmp[0:13])
if d.tmp[8] != 8 {
return UnsupportedError("bit depth")
}
if d.tmp[10] != 0 || d.tmp[11] != 0 || d.tmp[12] != 0 {
return UnsupportedError("compression, filter or interlace method")
}
- w := int32(parseUint32(d.tmp[0:4]));
- h := int32(parseUint32(d.tmp[4:8]));
+ w := int32(parseUint32(d.tmp[0:4]))
+ h := int32(parseUint32(d.tmp[4:8]))
if w < 0 || h < 0 {
return FormatError("negative dimension")
}
- nPixels := int64(w) * int64(h);
+ nPixels := int64(w) * int64(h)
if nPixels != int64(int(nPixels)) {
return UnsupportedError("dimension overflow")
}
- d.colorType = d.tmp[9];
+ d.colorType = d.tmp[9]
switch d.colorType {
case ctTrueColor:
d.image = image.NewRGBA(int(w), int(h))
@@ -133,27 +133,27 @@ func (d *decoder) parseIHDR(r io.Reader, crc hash.Hash32, length uint32) os.Erro
default:
return UnsupportedError("color type")
}
- d.width, d.height = int(w), int(h);
- return nil;
+ d.width, d.height = int(w), int(h)
+ return nil
}
func (d *decoder) parsePLTE(r io.Reader, crc hash.Hash32, length uint32) os.Error {
- np := int(length / 3); // The number of palette entries.
+ np := int(length / 3) // The number of palette entries.
if length%3 != 0 || np <= 0 || np > 256 {
return FormatError("bad PLTE length")
}
- n, err := io.ReadFull(r, d.tmp[0:3*np]);
+ n, err := io.ReadFull(r, d.tmp[0:3*np])
if err != nil {
return err
}
- crc.Write(d.tmp[0:n]);
+ crc.Write(d.tmp[0:n])
switch d.colorType {
case ctPaletted:
- palette := make([]image.Color, np);
+ palette := make([]image.Color, np)
for i := 0; i < np; i++ {
palette[i] = image.RGBAColor{d.tmp[3*i+0], d.tmp[3*i+1], d.tmp[3*i+2], 0xff}
}
- d.image.(*image.Paletted).Palette = image.PalettedColorModel(palette);
+ d.image.(*image.Paletted).Palette = image.PalettedColorModel(palette)
case ctTrueColor, ctTrueColorAlpha:
// As per the PNG spec, a PLTE chunk is optional (and for practical purposes,
// ignorable) for the ctTrueColor and ctTrueColorAlpha color types (section 4.1.2).
@@ -161,63 +161,63 @@ func (d *decoder) parsePLTE(r io.Reader, crc hash.Hash32, length uint32) os.Erro
default:
return FormatError("PLTE, color type mismatch")
}
- return nil;
+ return nil
}
// The Paeth filter function, as per the PNG specification.
func paeth(a, b, c uint8) uint8 {
- p := int(a) + int(b) - int(c);
- pa := abs(p - int(a));
- pb := abs(p - int(b));
- pc := abs(p - int(c));
+ p := int(a) + int(b) - int(c)
+ pa := abs(p - int(a))
+ pb := abs(p - int(b))
+ pc := abs(p - int(c))
if pa <= pb && pa <= pc {
return a
} else if pb <= pc {
return b
}
- return c;
+ return c
}
func (d *decoder) idatReader(idat io.Reader) os.Error {
- r, err := zlib.NewInflater(idat);
+ r, err := zlib.NewInflater(idat)
if err != nil {
return err
}
- defer r.Close();
- bpp := 0; // Bytes per pixel.
- maxPalette := uint8(0);
+ defer r.Close()
+ bpp := 0 // Bytes per pixel.
+ maxPalette := uint8(0)
var (
- rgba *image.RGBA;
- nrgba *image.NRGBA;
- paletted *image.Paletted;
+ rgba *image.RGBA
+ nrgba *image.NRGBA
+ paletted *image.Paletted
)
switch d.colorType {
case ctTrueColor:
- bpp = 3;
- rgba = d.image.(*image.RGBA);
+ bpp = 3
+ rgba = d.image.(*image.RGBA)
case ctPaletted:
- bpp = 1;
- paletted = d.image.(*image.Paletted);
- maxPalette = uint8(len(paletted.Palette) - 1);
+ bpp = 1
+ paletted = d.image.(*image.Paletted)
+ maxPalette = uint8(len(paletted.Palette) - 1)
case ctTrueColorAlpha:
- bpp = 4;
- nrgba = d.image.(*image.NRGBA);
+ bpp = 4
+ nrgba = d.image.(*image.NRGBA)
}
// cr and pr are the bytes for the current and previous row.
// The +1 is for the per-row filter type, which is at cr[0].
- cr := make([]uint8, 1+bpp*d.width);
- pr := make([]uint8, 1+bpp*d.width);
+ cr := make([]uint8, 1+bpp*d.width)
+ pr := make([]uint8, 1+bpp*d.width)
for y := 0; y < d.height; y++ {
// Read the decompressed bytes.
- _, err := io.ReadFull(r, cr);
+ _, err := io.ReadFull(r, cr)
if err != nil {
return err
}
// Apply the filter.
- cdat := cr[1:];
- pdat := pr[1:];
+ cdat := cr[1:]
+ pdat := pr[1:]
switch cr[0] {
case ftNone:
// No-op.
@@ -258,7 +258,7 @@ func (d *decoder) idatReader(idat io.Reader) os.Error {
if cdat[x] > maxPalette {
return FormatError("palette index out of range")
}
- paletted.SetColorIndex(x, y, cdat[x]);
+ paletted.SetColorIndex(x, y, cdat[x])
}
case ctTrueColorAlpha:
for x := 0; x < d.width; x++ {
@@ -267,9 +267,9 @@ func (d *decoder) idatReader(idat io.Reader) os.Error {
}
// The current row for y is the previous row for y+1.
- pr, cr = cr, pr;
+ pr, cr = cr, pr
}
- return nil;
+ return nil
}
func (d *decoder) parseIDAT(r io.Reader, crc hash.Hash32, length uint32) os.Error {
@@ -279,65 +279,65 @@ func (d *decoder) parseIDAT(r io.Reader, crc hash.Hash32, length uint32) os.Erro
// we see them, and decode the stream in a separate go-routine, which
// signals its completion (successful or not) via a channel.
if d.idatWriter == nil {
- pr, pw := io.Pipe();
- d.idatWriter = pw;
- d.idatDone = make(chan os.Error);
+ pr, pw := io.Pipe()
+ d.idatWriter = pw
+ d.idatDone = make(chan os.Error)
go func() {
- err := d.idatReader(pr);
+ err := d.idatReader(pr)
if err == os.EOF {
err = FormatError("too little IDAT")
}
- pr.CloseWithError(FormatError("too much IDAT"));
- d.idatDone <- err;
- }();
+ pr.CloseWithError(FormatError("too much IDAT"))
+ d.idatDone <- err
+ }()
}
- var buf [4096]byte;
+ var buf [4096]byte
for length > 0 {
- n, err1 := r.Read(buf[0:min(len(buf), int(length))]);
+ n, err1 := r.Read(buf[0:min(len(buf), int(length))])
// We delay checking err1. It is possible to get n bytes and an error,
// but if the n bytes themselves contain a FormatError, for example, we
// want to report that error, and not the one that made the Read stop.
- n, err2 := d.idatWriter.Write(buf[0:n]);
+ n, err2 := d.idatWriter.Write(buf[0:n])
if err2 != nil {
return err2
}
if err1 != nil {
return err1
}
- crc.Write(buf[0:n]);
- length -= uint32(n);
+ crc.Write(buf[0:n])
+ length -= uint32(n)
}
- return nil;
+ return nil
}
func (d *decoder) parseIEND(r io.Reader, crc hash.Hash32, length uint32) os.Error {
if length != 0 {
return FormatError("bad IEND length")
}
- return nil;
+ return nil
}
func (d *decoder) parseChunk(r io.Reader) os.Error {
// Read the length.
- n, err := io.ReadFull(r, d.tmp[0:4]);
+ n, err := io.ReadFull(r, d.tmp[0:4])
if err == os.EOF {
return io.ErrUnexpectedEOF
}
if err != nil {
return err
}
- length := parseUint32(d.tmp[0:4]);
+ length := parseUint32(d.tmp[0:4])
// Read the chunk type.
- n, err = io.ReadFull(r, d.tmp[0:4]);
+ n, err = io.ReadFull(r, d.tmp[0:4])
if err == os.EOF {
return io.ErrUnexpectedEOF
}
if err != nil {
return err
}
- crc := crc32.NewIEEE();
- crc.Write(d.tmp[0:4]);
+ crc := crc32.NewIEEE()
+ crc.Write(d.tmp[0:4])
// Read the chunk data.
switch string(d.tmp[0:4]) {
@@ -345,36 +345,36 @@ func (d *decoder) parseChunk(r io.Reader) os.Error {
if d.stage != dsStart {
return chunkOrderError
}
- d.stage = dsSeenIHDR;
- err = d.parseIHDR(r, crc, length);
+ d.stage = dsSeenIHDR
+ err = d.parseIHDR(r, crc, length)
case "PLTE":
if d.stage != dsSeenIHDR {
return chunkOrderError
}
- d.stage = dsSeenPLTE;
- err = d.parsePLTE(r, crc, length);
+ d.stage = dsSeenPLTE
+ err = d.parsePLTE(r, crc, length)
case "IDAT":
if d.stage < dsSeenIHDR || d.stage > dsSeenIDAT || (d.colorType == ctPaletted && d.stage == dsSeenIHDR) {
return chunkOrderError
}
- d.stage = dsSeenIDAT;
- err = d.parseIDAT(r, crc, length);
+ d.stage = dsSeenIDAT
+ err = d.parseIDAT(r, crc, length)
case "IEND":
if d.stage != dsSeenIDAT {
return chunkOrderError
}
- d.stage = dsSeenIEND;
- err = d.parseIEND(r, crc, length);
+ d.stage = dsSeenIEND
+ err = d.parseIEND(r, crc, length)
default:
// Ignore this chunk (of a known length).
- var ignored [4096]byte;
+ var ignored [4096]byte
for length > 0 {
- n, err = io.ReadFull(r, ignored[0:min(len(ignored), int(length))]);
+ n, err = io.ReadFull(r, ignored[0:min(len(ignored), int(length))])
if err != nil {
return err
}
- crc.Write(ignored[0:n]);
- length -= uint32(n);
+ crc.Write(ignored[0:n])
+ length -= uint32(n)
}
}
if err != nil {
@@ -382,7 +382,7 @@ func (d *decoder) parseChunk(r io.Reader) os.Error {
}
// Read the checksum.
- n, err = io.ReadFull(r, d.tmp[0:4]);
+ n, err = io.ReadFull(r, d.tmp[0:4])
if err == os.EOF {
return io.ErrUnexpectedEOF
}
@@ -392,37 +392,37 @@ func (d *decoder) parseChunk(r io.Reader) os.Error {
if parseUint32(d.tmp[0:4]) != crc.Sum32() {
return FormatError("invalid checksum")
}
- return nil;
+ return nil
}
func (d *decoder) checkHeader(r io.Reader) os.Error {
- _, err := io.ReadFull(r, d.tmp[0:8]);
+ _, err := io.ReadFull(r, d.tmp[0:8])
if err != nil {
return err
}
if string(d.tmp[0:8]) != pngHeader {
return FormatError("not a PNG file")
}
- return nil;
+ return nil
}
// Decode reads a PNG formatted image from r and returns it as an image.Image.
// The type of Image returned depends on the PNG contents.
func Decode(r io.Reader) (image.Image, os.Error) {
- var d decoder;
- err := d.checkHeader(r);
+ var d decoder
+ err := d.checkHeader(r)
if err != nil {
return nil, err
}
for d.stage = dsStart; d.stage != dsSeenIEND; {
- err = d.parseChunk(r);
+ err = d.parseChunk(r)
if err != nil {
break
}
}
if d.idatWriter != nil {
- d.idatWriter.Close();
- err1 := <-d.idatDone;
+ d.idatWriter.Close()
+ err1 := <-d.idatDone
if err == nil {
err = err1
}
@@ -430,5 +430,5 @@ func Decode(r io.Reader) (image.Image, os.Error) {
if err != nil {
return nil, err
}
- return d.image, nil;
+ return d.image, nil
}
diff --git a/src/pkg/image/png/reader_test.go b/src/pkg/image/png/reader_test.go
index 2885b3344..68aab7832 100644
--- a/src/pkg/image/png/reader_test.go
+++ b/src/pkg/image/png/reader_test.go
@@ -5,12 +5,12 @@
package png
import (
- "bufio";
- "fmt";
- "image";
- "io";
- "os";
- "testing";
+ "bufio"
+ "fmt"
+ "image"
+ "io"
+ "os"
+ "testing"
)
// The go PNG library currently supports only a subset of the full PNG specification.
@@ -34,124 +34,124 @@ var filenames = []string{
}
func readPng(filename string) (image.Image, os.Error) {
- f, err := os.Open(filename, os.O_RDONLY, 0444);
+ f, err := os.Open(filename, os.O_RDONLY, 0444)
if err != nil {
return nil, err
}
- defer f.Close();
- return Decode(f);
+ defer f.Close()
+ return Decode(f)
}
// An approximation of the sng command-line tool.
func sng(w io.WriteCloser, filename string, png image.Image) {
- defer w.Close();
+ defer w.Close()
// For now, the go PNG parser only reads bitdepths of 8.
- bitdepth := 8;
+ bitdepth := 8
// Write the filename and IHDR.
- io.WriteString(w, "#SNG: from "+filename+".png\nIHDR {\n");
- fmt.Fprintf(w, " width: %d; height: %d; bitdepth: %d;\n", png.Width(), png.Height(), bitdepth);
- cm := png.ColorModel();
- var paletted *image.Paletted;
- cpm, _ := cm.(image.PalettedColorModel);
+ io.WriteString(w, "#SNG: from "+filename+".png\nIHDR {\n")
+ fmt.Fprintf(w, " width: %d; height: %d; bitdepth: %d;\n", png.Width(), png.Height(), bitdepth)
+ cm := png.ColorModel()
+ var paletted *image.Paletted
+ cpm, _ := cm.(image.PalettedColorModel)
switch {
case cm == image.RGBAColorModel:
io.WriteString(w, " using color;\n")
case cm == image.NRGBAColorModel:
io.WriteString(w, " using color alpha;\n")
case cpm != nil:
- io.WriteString(w, " using color palette;\n");
- paletted = png.(*image.Paletted);
+ io.WriteString(w, " using color palette;\n")
+ paletted = png.(*image.Paletted)
default:
io.WriteString(w, "unknown PNG decoder color model\n")
}
- io.WriteString(w, "}\n");
+ io.WriteString(w, "}\n")
// We fake a gAMA output. The test files have a gAMA chunk but the go PNG parser ignores it
// (the PNG spec section 11.3 says "Ancillary chunks may be ignored by a decoder").
- io.WriteString(w, "gAMA {1.0000}\n");
+ io.WriteString(w, "gAMA {1.0000}\n")
// Write the PLTE (if applicable).
if cpm != nil {
- io.WriteString(w, "PLTE {\n");
+ io.WriteString(w, "PLTE {\n")
for i := 0; i < len(cpm); i++ {
- r, g, b, _ := cpm[i].RGBA();
- r >>= 24;
- g >>= 24;
- b >>= 24;
- fmt.Fprintf(w, " (%3d,%3d,%3d) # rgb = (0x%02x,0x%02x,0x%02x)\n", r, g, b, r, g, b);
+ r, g, b, _ := cpm[i].RGBA()
+ r >>= 24
+ g >>= 24
+ b >>= 24
+ fmt.Fprintf(w, " (%3d,%3d,%3d) # rgb = (0x%02x,0x%02x,0x%02x)\n", r, g, b, r, g, b)
}
- io.WriteString(w, "}\n");
+ io.WriteString(w, "}\n")
}
// Write the IMAGE.
- io.WriteString(w, "IMAGE {\n pixels hex\n");
+ io.WriteString(w, "IMAGE {\n pixels hex\n")
for y := 0; y < png.Height(); y++ {
switch {
case cm == image.RGBAColorModel:
for x := 0; x < png.Width(); x++ {
- rgba := png.At(x, y).(image.RGBAColor);
- fmt.Fprintf(w, "%02x%02x%02x ", rgba.R, rgba.G, rgba.B);
+ rgba := png.At(x, y).(image.RGBAColor)
+ fmt.Fprintf(w, "%02x%02x%02x ", rgba.R, rgba.G, rgba.B)
}
case cm == image.NRGBAColorModel:
for x := 0; x < png.Width(); x++ {
- nrgba := png.At(x, y).(image.NRGBAColor);
- fmt.Fprintf(w, "%02x%02x%02x%02x ", nrgba.R, nrgba.G, nrgba.B, nrgba.A);
+ nrgba := png.At(x, y).(image.NRGBAColor)
+ fmt.Fprintf(w, "%02x%02x%02x%02x ", nrgba.R, nrgba.G, nrgba.B, nrgba.A)
}
case cpm != nil:
for x := 0; x < png.Width(); x++ {
fmt.Fprintf(w, "%02x", paletted.ColorIndexAt(x, y))
}
}
- io.WriteString(w, "\n");
+ io.WriteString(w, "\n")
}
- io.WriteString(w, "}\n");
+ io.WriteString(w, "}\n")
}
func TestReader(t *testing.T) {
for _, fn := range filenames {
// Read the .png file.
- image, err := readPng("testdata/pngsuite/" + fn + ".png");
+ image, err := readPng("testdata/pngsuite/" + fn + ".png")
if err != nil {
- t.Error(fn, err);
- continue;
+ t.Error(fn, err)
+ continue
}
- piper, pipew := io.Pipe();
- pb := bufio.NewReader(piper);
- go sng(pipew, fn, image);
- defer piper.Close();
+ piper, pipew := io.Pipe()
+ pb := bufio.NewReader(piper)
+ go sng(pipew, fn, image)
+ defer piper.Close()
// Read the .sng file.
- sf, err := os.Open("testdata/pngsuite/"+fn+".sng", os.O_RDONLY, 0444);
+ sf, err := os.Open("testdata/pngsuite/"+fn+".sng", os.O_RDONLY, 0444)
if err != nil {
- t.Error(fn, err);
- continue;
+ t.Error(fn, err)
+ continue
}
- defer sf.Close();
- sb := bufio.NewReader(sf);
+ defer sf.Close()
+ sb := bufio.NewReader(sf)
if err != nil {
- t.Error(fn, err);
- continue;
+ t.Error(fn, err)
+ continue
}
// Compare the two, in SNG format, line by line.
for {
- ps, perr := pb.ReadString('\n');
- ss, serr := sb.ReadString('\n');
+ ps, perr := pb.ReadString('\n')
+ ss, serr := sb.ReadString('\n')
if perr == os.EOF && serr == os.EOF {
break
}
if perr != nil {
- t.Error(fn, perr);
- break;
+ t.Error(fn, perr)
+ break
}
if serr != nil {
- t.Error(fn, serr);
- break;
+ t.Error(fn, serr)
+ break
}
if ps != ss {
- t.Errorf("%s: Mismatch\n%sversus\n%s\n", fn, ps, ss);
- break;
+ t.Errorf("%s: Mismatch\n%sversus\n%s\n", fn, ps, ss)
+ break
}
}
}
diff --git a/src/pkg/image/png/writer.go b/src/pkg/image/png/writer.go
index 9ec2544d0..b0550b0f1 100644
--- a/src/pkg/image/png/writer.go
+++ b/src/pkg/image/png/writer.go
@@ -5,44 +5,44 @@
package png
import (
- "bufio";
- "compress/zlib";
- "hash/crc32";
- "image";
- "io";
- "os";
- "strconv";
+ "bufio"
+ "compress/zlib"
+ "hash/crc32"
+ "image"
+ "io"
+ "os"
+ "strconv"
)
type encoder struct {
- w io.Writer;
- m image.Image;
- colorType uint8;
- err os.Error;
- header [8]byte;
- footer [4]byte;
- tmp [3 * 256]byte;
+ w io.Writer
+ m image.Image
+ colorType uint8
+ err os.Error
+ header [8]byte
+ footer [4]byte
+ tmp [3 * 256]byte
}
// Big-endian.
func writeUint32(b []uint8, u uint32) {
- b[0] = uint8(u >> 24);
- b[1] = uint8(u >> 16);
- b[2] = uint8(u >> 8);
- b[3] = uint8(u >> 0);
+ b[0] = uint8(u >> 24)
+ b[1] = uint8(u >> 16)
+ b[2] = uint8(u >> 8)
+ b[3] = uint8(u >> 0)
}
// Returns whether or not the image is fully opaque.
func opaque(m image.Image) bool {
for y := 0; y < m.Height(); y++ {
for x := 0; x < m.Width(); x++ {
- _, _, _, a := m.At(x, y).RGBA();
+ _, _, _, a := m.At(x, y).RGBA()
if a != 0xffffffff {
return false
}
}
}
- return true;
+ return true
}
// The absolute value of a byte interpreted as a signed int8.
@@ -50,66 +50,66 @@ func abs8(d uint8) int {
if d < 128 {
return int(d)
}
- return 256 - int(d);
+ return 256 - int(d)
}
func (e *encoder) writeChunk(b []byte, name string) {
if e.err != nil {
return
}
- n := uint32(len(b));
+ n := uint32(len(b))
if int(n) != len(b) {
- e.err = UnsupportedError(name + " chunk is too large: " + strconv.Itoa(len(b)));
- return;
+ e.err = UnsupportedError(name + " chunk is too large: " + strconv.Itoa(len(b)))
+ return
}
- writeUint32(e.header[0:4], n);
- e.header[4] = name[0];
- e.header[5] = name[1];
- e.header[6] = name[2];
- e.header[7] = name[3];
- crc := crc32.NewIEEE();
- crc.Write(e.header[4:8]);
- crc.Write(b);
- writeUint32(e.footer[0:4], crc.Sum32());
+ writeUint32(e.header[0:4], n)
+ e.header[4] = name[0]
+ e.header[5] = name[1]
+ e.header[6] = name[2]
+ e.header[7] = name[3]
+ crc := crc32.NewIEEE()
+ crc.Write(e.header[4:8])
+ crc.Write(b)
+ writeUint32(e.footer[0:4], crc.Sum32())
- _, e.err = e.w.Write(e.header[0:8]);
+ _, e.err = e.w.Write(e.header[0:8])
if e.err != nil {
return
}
- _, e.err = e.w.Write(b);
+ _, e.err = e.w.Write(b)
if e.err != nil {
return
}
- _, e.err = e.w.Write(e.footer[0:4]);
+ _, e.err = e.w.Write(e.footer[0:4])
}
func (e *encoder) writeIHDR() {
- writeUint32(e.tmp[0:4], uint32(e.m.Width()));
- writeUint32(e.tmp[4:8], uint32(e.m.Height()));
- e.tmp[8] = 8; // bit depth
- e.tmp[9] = e.colorType;
- e.tmp[10] = 0; // default compression method
- e.tmp[11] = 0; // default filter method
- e.tmp[12] = 0; // non-interlaced
- e.writeChunk(e.tmp[0:13], "IHDR");
+ writeUint32(e.tmp[0:4], uint32(e.m.Width()))
+ writeUint32(e.tmp[4:8], uint32(e.m.Height()))
+ e.tmp[8] = 8 // bit depth
+ e.tmp[9] = e.colorType
+ e.tmp[10] = 0 // default compression method
+ e.tmp[11] = 0 // default filter method
+ e.tmp[12] = 0 // non-interlaced
+ e.writeChunk(e.tmp[0:13], "IHDR")
}
func (e *encoder) writePLTE(p image.PalettedColorModel) {
if len(p) < 1 || len(p) > 256 {
- e.err = FormatError("bad palette length: " + strconv.Itoa(len(p)));
- return;
+ e.err = FormatError("bad palette length: " + strconv.Itoa(len(p)))
+ return
}
for i := 0; i < len(p); i++ {
- r, g, b, a := p[i].RGBA();
+ r, g, b, a := p[i].RGBA()
if a != 0xffffffff {
- e.err = UnsupportedError("non-opaque palette color");
- return;
+ e.err = UnsupportedError("non-opaque palette color")
+ return
}
- e.tmp[3*i+0] = uint8(r >> 24);
- e.tmp[3*i+1] = uint8(g >> 24);
- e.tmp[3*i+2] = uint8(b >> 24);
+ e.tmp[3*i+0] = uint8(r >> 24)
+ e.tmp[3*i+1] = uint8(g >> 24)
+ e.tmp[3*i+2] = uint8(b >> 24)
}
- e.writeChunk(e.tmp[0:3*len(p)], "PLTE");
+ e.writeChunk(e.tmp[0:3*len(p)], "PLTE")
}
// An encoder is an io.Writer that satisfies writes by writing PNG IDAT chunks,
@@ -123,11 +123,11 @@ func (e *encoder) writePLTE(p image.PalettedColorModel) {
// occur on a separate go-routine than the e.writeIDATs call, and care should be
// taken that e's state (such as its tmp buffer) is not modified concurrently.
func (e *encoder) Write(b []byte) (int, os.Error) {
- e.writeChunk(b, "IDAT");
+ e.writeChunk(b, "IDAT")
if e.err != nil {
return 0, e.err
}
- return len(b), nil;
+ return len(b), nil
}
// Chooses the filter to use for encoding the current row, and applies it.
@@ -137,108 +137,108 @@ func filter(cr [][]byte, pr []byte, bpp int) int {
// This is the same heuristic that libpng uses, although the filters are attempted in order of
// estimated most likely to be minimal (ftUp, ftPaeth, ftNone, ftSub, ftAverage), rather than
// in their enumeration order (ftNone, ftSub, ftUp, ftAverage, ftPaeth).
- cdat0 := cr[0][1:];
- cdat1 := cr[1][1:];
- cdat2 := cr[2][1:];
- cdat3 := cr[3][1:];
- cdat4 := cr[4][1:];
- pdat := pr[1:];
- n := len(cdat0);
+ cdat0 := cr[0][1:]
+ cdat1 := cr[1][1:]
+ cdat2 := cr[2][1:]
+ cdat3 := cr[3][1:]
+ cdat4 := cr[4][1:]
+ pdat := pr[1:]
+ n := len(cdat0)
// The up filter.
- sum := 0;
+ sum := 0
for i := 0; i < n; i++ {
- cdat2[i] = cdat0[i] - pdat[i];
- sum += abs8(cdat2[i]);
+ cdat2[i] = cdat0[i] - pdat[i]
+ sum += abs8(cdat2[i])
}
- best := sum;
- filter := ftUp;
+ best := sum
+ filter := ftUp
// The Paeth filter.
- sum = 0;
+ sum = 0
for i := 0; i < bpp; i++ {
- cdat4[i] = cdat0[i] - paeth(0, pdat[i], 0);
- sum += abs8(cdat4[i]);
+ cdat4[i] = cdat0[i] - paeth(0, pdat[i], 0)
+ sum += abs8(cdat4[i])
}
for i := bpp; i < n; i++ {
- cdat4[i] = cdat0[i] - paeth(cdat0[i-bpp], pdat[i], pdat[i-bpp]);
- sum += abs8(cdat4[i]);
+ cdat4[i] = cdat0[i] - paeth(cdat0[i-bpp], pdat[i], pdat[i-bpp])
+ sum += abs8(cdat4[i])
if sum >= best {
break
}
}
if sum < best {
- best = sum;
- filter = ftPaeth;
+ best = sum
+ filter = ftPaeth
}
// The none filter.
- sum = 0;
+ sum = 0
for i := 0; i < n; i++ {
- sum += abs8(cdat0[i]);
+ sum += abs8(cdat0[i])
if sum >= best {
break
}
}
if sum < best {
- best = sum;
- filter = ftNone;
+ best = sum
+ filter = ftNone
}
// The sub filter.
- sum = 0;
+ sum = 0
for i := 0; i < bpp; i++ {
- cdat1[i] = cdat0[i];
- sum += abs8(cdat1[i]);
+ cdat1[i] = cdat0[i]
+ sum += abs8(cdat1[i])
}
for i := bpp; i < n; i++ {
- cdat1[i] = cdat0[i] - cdat0[i-bpp];
- sum += abs8(cdat1[i]);
+ cdat1[i] = cdat0[i] - cdat0[i-bpp]
+ sum += abs8(cdat1[i])
if sum >= best {
break
}
}
if sum < best {
- best = sum;
- filter = ftSub;
+ best = sum
+ filter = ftSub
}
// The average filter.
- sum = 0;
+ sum = 0
for i := 0; i < bpp; i++ {
- cdat3[i] = cdat0[i] - pdat[i]/2;
- sum += abs8(cdat3[i]);
+ cdat3[i] = cdat0[i] - pdat[i]/2
+ sum += abs8(cdat3[i])
}
for i := bpp; i < n; i++ {
- cdat3[i] = cdat0[i] - uint8((int(cdat0[i-bpp])+int(pdat[i]))/2);
- sum += abs8(cdat3[i]);
+ cdat3[i] = cdat0[i] - uint8((int(cdat0[i-bpp])+int(pdat[i]))/2)
+ sum += abs8(cdat3[i])
if sum >= best {
break
}
}
if sum < best {
- best = sum;
- filter = ftAverage;
+ best = sum
+ filter = ftAverage
}
- return filter;
+ return filter
}
func writeImage(w io.Writer, m image.Image, ct uint8) os.Error {
- zw, err := zlib.NewDeflater(w);
+ zw, err := zlib.NewDeflater(w)
if err != nil {
return err
}
- defer zw.Close();
+ defer zw.Close()
- bpp := 0; // Bytes per pixel.
- var paletted *image.Paletted;
+ bpp := 0 // Bytes per pixel.
+ var paletted *image.Paletted
switch ct {
case ctTrueColor:
bpp = 3
case ctPaletted:
- bpp = 1;
- paletted = m.(*image.Paletted);
+ bpp = 1
+ paletted = m.(*image.Paletted)
case ctTrueColorAlpha:
bpp = 4
}
@@ -247,12 +247,12 @@ func writeImage(w io.Writer, m image.Image, ct uint8) os.Error {
// cr[ft], for non-zero filter types ft, are buffers for transforming cr[0] under the
// other PNG filter types. These buffers are allocated once and re-used for each row.
// The +1 is for the per-row filter type, which is at cr[*][0].
- var cr [nFilter][]uint8;
+ var cr [nFilter][]uint8
for i := 0; i < len(cr); i++ {
- cr[i] = make([]uint8, 1+bpp*m.Width());
- cr[i][0] = uint8(i);
+ cr[i] = make([]uint8, 1+bpp*m.Width())
+ cr[i][0] = uint8(i)
}
- pr := make([]uint8, 1+bpp*m.Width());
+ pr := make([]uint8, 1+bpp*m.Width())
for y := 0; y < m.Height(); y++ {
// Convert from colors to bytes.
@@ -260,10 +260,10 @@ func writeImage(w io.Writer, m image.Image, ct uint8) os.Error {
case ctTrueColor:
for x := 0; x < m.Width(); x++ {
// We have previously verified that the alpha value is fully opaque.
- r, g, b, _ := m.At(x, y).RGBA();
- cr[0][3*x+1] = uint8(r >> 24);
- cr[0][3*x+2] = uint8(g >> 24);
- cr[0][3*x+3] = uint8(b >> 24);
+ r, g, b, _ := m.At(x, y).RGBA()
+ cr[0][3*x+1] = uint8(r >> 24)
+ cr[0][3*x+2] = uint8(g >> 24)
+ cr[0][3*x+3] = uint8(b >> 24)
}
case ctPaletted:
for x := 0; x < m.Width(); x++ {
@@ -272,27 +272,27 @@ func writeImage(w io.Writer, m image.Image, ct uint8) os.Error {
case ctTrueColorAlpha:
// Convert from image.Image (which is alpha-premultiplied) to PNG's non-alpha-premultiplied.
for x := 0; x < m.Width(); x++ {
- c := image.NRGBAColorModel.Convert(m.At(x, y)).(image.NRGBAColor);
- cr[0][4*x+1] = c.R;
- cr[0][4*x+2] = c.G;
- cr[0][4*x+3] = c.B;
- cr[0][4*x+4] = c.A;
+ c := image.NRGBAColorModel.Convert(m.At(x, y)).(image.NRGBAColor)
+ cr[0][4*x+1] = c.R
+ cr[0][4*x+2] = c.G
+ cr[0][4*x+3] = c.B
+ cr[0][4*x+4] = c.A
}
}
// Apply the filter.
- f := filter(cr[0:nFilter], pr, bpp);
+ f := filter(cr[0:nFilter], pr, bpp)
// Write the compressed bytes.
- _, err = zw.Write(cr[f]);
+ _, err = zw.Write(cr[f])
if err != nil {
return err
}
// The current row for y is the previous row for y+1.
- pr, cr[0] = cr[0], pr;
+ pr, cr[0] = cr[0], pr
}
- return nil;
+ return nil
}
// Write the actual image data to one or more IDAT chunks.
@@ -300,19 +300,19 @@ func (e *encoder) writeIDATs() {
if e.err != nil {
return
}
- var bw *bufio.Writer;
- bw, e.err = bufio.NewWriterSize(e, 1<<15);
+ var bw *bufio.Writer
+ bw, e.err = bufio.NewWriterSize(e, 1<<15)
if e.err != nil {
return
}
- e.err = writeImage(bw, e.m, e.colorType);
+ e.err = writeImage(bw, e.m, e.colorType)
if e.err != nil {
return
}
- e.err = bw.Flush();
+ e.err = bw.Flush()
}
-func (e *encoder) writeIEND() { e.writeChunk(e.tmp[0:0], "IEND") }
+func (e *encoder) writeIEND() { e.writeChunk(e.tmp[0:0], "IEND") }
// Encode writes the Image m to w in PNG format. Any Image may be encoded, but
// images that are not image.NRGBA might be encoded lossily.
@@ -320,28 +320,28 @@ func Encode(w io.Writer, m image.Image) os.Error {
// Obviously, negative widths and heights are invalid. Furthermore, the PNG
// spec section 11.2.2 says that zero is invalid. Excessively large images are
// also rejected.
- mw, mh := int64(m.Width()), int64(m.Height());
+ mw, mh := int64(m.Width()), int64(m.Height())
if mw <= 0 || mh <= 0 || mw >= 1<<32 || mh >= 1<<32 {
return FormatError("invalid image size: " + strconv.Itoa64(mw) + "x" + strconv.Itoa64(mw))
}
- var e encoder;
- e.w = w;
- e.m = m;
- e.colorType = uint8(ctTrueColorAlpha);
- pal, _ := m.(*image.Paletted);
+ var e encoder
+ e.w = w
+ e.m = m
+ e.colorType = uint8(ctTrueColorAlpha)
+ pal, _ := m.(*image.Paletted)
if pal != nil {
e.colorType = ctPaletted
} else if opaque(m) {
e.colorType = ctTrueColor
}
- _, e.err = io.WriteString(w, pngHeader);
- e.writeIHDR();
+ _, e.err = io.WriteString(w, pngHeader)
+ e.writeIHDR()
if pal != nil {
e.writePLTE(pal.Palette)
}
- e.writeIDATs();
- e.writeIEND();
- return e.err;
+ e.writeIDATs()
+ e.writeIEND()
+ return e.err
}
diff --git a/src/pkg/image/png/writer_test.go b/src/pkg/image/png/writer_test.go
index db50a9872..a61e1c95a 100644
--- a/src/pkg/image/png/writer_test.go
+++ b/src/pkg/image/png/writer_test.go
@@ -5,11 +5,11 @@
package png
import (
- "fmt";
- "image";
- "io";
- "os";
- "testing";
+ "fmt"
+ "image"
+ "io"
+ "os"
+ "testing"
)
func diff(m0, m1 image.Image) os.Error {
@@ -18,52 +18,52 @@ func diff(m0, m1 image.Image) os.Error {
}
for y := 0; y < m0.Height(); y++ {
for x := 0; x < m0.Width(); x++ {
- r0, g0, b0, a0 := m0.At(x, y).RGBA();
- r1, g1, b1, a1 := m1.At(x, y).RGBA();
+ r0, g0, b0, a0 := m0.At(x, y).RGBA()
+ r1, g1, b1, a1 := m1.At(x, y).RGBA()
if r0 != r1 || g0 != g1 || b0 != b1 || a0 != a1 {
return os.NewError(fmt.Sprintf("colors differ at (%d, %d): %v vs %v", x, y, m0.At(x, y), m1.At(x, y)))
}
}
}
- return nil;
+ return nil
}
func TestWriter(t *testing.T) {
// The filenames variable is declared in reader_test.go.
for _, fn := range filenames {
- qfn := "testdata/pngsuite/" + fn + ".png";
+ qfn := "testdata/pngsuite/" + fn + ".png"
// Read the image.
- m0, err := readPng(qfn);
+ m0, err := readPng(qfn)
if err != nil {
- t.Error(fn, err);
- continue;
+ t.Error(fn, err)
+ continue
}
// Read the image again, and push it through a pipe that encodes at the write end, and decodes at the read end.
- pr, pw := io.Pipe();
- defer pr.Close();
+ pr, pw := io.Pipe()
+ defer pr.Close()
go func() {
- defer pw.Close();
- m1, err := readPng(qfn);
+ defer pw.Close()
+ m1, err := readPng(qfn)
if err != nil {
- t.Error(fn, err);
- return;
+ t.Error(fn, err)
+ return
}
- err = Encode(pw, m1);
+ err = Encode(pw, m1)
if err != nil {
- t.Error(fn, err);
- return;
+ t.Error(fn, err)
+ return
}
- }();
- m2, err := Decode(pr);
+ }()
+ m2, err := Decode(pr)
if err != nil {
- t.Error(fn, err);
- continue;
+ t.Error(fn, err)
+ continue
}
// Compare the two.
- err = diff(m0, m2);
+ err = diff(m0, m2)
if err != nil {
- t.Error(fn, err);
- continue;
+ t.Error(fn, err)
+ continue
}
}
}
diff --git a/src/pkg/io/io.go b/src/pkg/io/io.go
index 68c5ccc24..5d18476f5 100644
--- a/src/pkg/io/io.go
+++ b/src/pkg/io/io.go
@@ -9,13 +9,13 @@
package io
import (
- "os";
- "strings";
+ "os"
+ "strings"
)
// Error represents an unexpected I/O behavior.
type Error struct {
- os.ErrorString;
+ os.ErrorString
}
// ErrShortWrite means that a write accepted fewer bytes than requested
@@ -39,7 +39,7 @@ var ErrUnexpectedEOF os.Error = &Error{"unexpected EOF"}
// Read may return a non-zero number of bytes with a non-nil err.
// In particular, a Read that exhausts the input may return n > 0, os.EOF.
type Reader interface {
- Read(p []byte) (n int, err os.Error);
+ Read(p []byte) (n int, err os.Error)
}
// Writer is the interface that wraps the basic Write method.
@@ -49,12 +49,12 @@ type Reader interface {
// and any error encountered that caused the write to stop early.
// Write must return a non-nil error if it returns n < len(p).
type Writer interface {
- Write(p []byte) (n int, err os.Error);
+ Write(p []byte) (n int, err os.Error)
}
// Closer is the interface that wraps the basic Close method.
type Closer interface {
- Close() os.Error;
+ Close() os.Error
}
// Seeker is the interface that wraps the basic Seek method.
@@ -65,61 +65,61 @@ type Closer interface {
// relative to the end. Seek returns the new offset and an Error, if
// any.
type Seeker interface {
- Seek(offset int64, whence int) (ret int64, err os.Error);
+ Seek(offset int64, whence int) (ret int64, err os.Error)
}
// ReadWriter is the interface that groups the basic Read and Write methods.
type ReadWriter interface {
- Reader;
- Writer;
+ Reader
+ Writer
}
// ReadCloser is the interface that groups the basic Read and Close methods.
type ReadCloser interface {
- Reader;
- Closer;
+ Reader
+ Closer
}
// WriteCloser is the interface that groups the basic Write and Close methods.
type WriteCloser interface {
- Writer;
- Closer;
+ Writer
+ Closer
}
// ReadWriteCloser is the interface that groups the basic Read, Write and Close methods.
type ReadWriteCloser interface {
- Reader;
- Writer;
- Closer;
+ Reader
+ Writer
+ Closer
}
// ReadSeeker is the interface that groups the basic Read and Seek methods.
type ReadSeeker interface {
- Reader;
- Seeker;
+ Reader
+ Seeker
}
// WriteSeeker is the interface that groups the basic Write and Seek methods.
type WriteSeeker interface {
- Writer;
- Seeker;
+ Writer
+ Seeker
}
// ReadWriteSeeker is the interface that groups the basic Read, Write and Seek methods.
type ReadWriteSeeker interface {
- Reader;
- Writer;
- Seeker;
+ Reader
+ Writer
+ Seeker
}
// ReaderFrom is the interface that wraps the ReadFrom method.
type ReaderFrom interface {
- ReadFrom(r Reader) (n int64, err os.Error);
+ ReadFrom(r Reader) (n int64, err os.Error)
}
// WriterTo is the interface that wraps the WriteTo method.
type WriterTo interface {
- WriteTo(w Writer) (n int64, err os.Error);
+ WriteTo(w Writer) (n int64, err os.Error)
}
// ReaderAt is the interface that wraps the basic ReadAt method.
@@ -137,7 +137,7 @@ type WriterTo interface {
// ReadAt may return a non-zero number of bytes with a non-nil err.
// In particular, a ReadAt that exhausts the input may return n > 0, os.EOF.
type ReaderAt interface {
- ReadAt(p []byte, off int64) (n int, err os.Error);
+ ReadAt(p []byte, off int64) (n int, err os.Error)
}
// WriterAt is the interface that wraps the basic WriteAt method.
@@ -147,7 +147,7 @@ type ReaderAt interface {
// and any error encountered that caused the write to stop early.
// WriteAt must return a non-nil error if it returns n < len(p).
type WriterAt interface {
- WriteAt(p []byte, off int64) (n int, err os.Error);
+ WriteAt(p []byte, off int64) (n int, err os.Error)
}
// WriteString writes the contents of the string s to w, which accepts an array of bytes.
@@ -161,9 +161,9 @@ func WriteString(w Writer, s string) (n int, err os.Error) {
// If an EOF happens after reading fewer than min bytes,
// ReadAtLeast returns ErrUnexpectedEOF.
func ReadAtLeast(r Reader, buf []byte, min int) (n int, err os.Error) {
- n = 0;
+ n = 0
for n < min {
- nn, e := r.Read(buf[n:]);
+ nn, e := r.Read(buf[n:])
if nn > 0 {
n += nn
}
@@ -171,10 +171,10 @@ func ReadAtLeast(r Reader, buf []byte, min int) (n int, err os.Error) {
if e == os.EOF && n > 0 {
e = ErrUnexpectedEOF
}
- return n, e;
+ return n, e
}
}
- return n, nil;
+ return n, nil
}
// ReadFull reads exactly len(buf) bytes from r into buf.
@@ -197,33 +197,33 @@ func Copyn(dst Writer, src Reader, n int64) (written int64, err os.Error) {
if rt, ok := dst.(ReaderFrom); ok {
return rt.ReadFrom(LimitReader(src, n))
}
- buf := make([]byte, 32*1024);
+ buf := make([]byte, 32*1024)
for written < n {
- l := len(buf);
+ l := len(buf)
if d := n - written; d < int64(l) {
l = int(d)
}
- nr, er := src.Read(buf[0:l]);
+ nr, er := src.Read(buf[0:l])
if nr > 0 {
- nw, ew := dst.Write(buf[0:nr]);
+ nw, ew := dst.Write(buf[0:nr])
if nw > 0 {
written += int64(nw)
}
if ew != nil {
- err = ew;
- break;
+ err = ew
+ break
}
if nr != nw {
- err = ErrShortWrite;
- break;
+ err = ErrShortWrite
+ break
}
}
if er != nil {
- err = er;
- break;
+ err = er
+ break
}
}
- return written, err;
+ return written, err
}
// Copy copies from src to dst until either EOF is reached
@@ -244,41 +244,41 @@ func Copy(dst Writer, src Reader) (written int64, err os.Error) {
if wt, ok := src.(WriterTo); ok {
return wt.WriteTo(dst)
}
- buf := make([]byte, 32*1024);
+ buf := make([]byte, 32*1024)
for {
- nr, er := src.Read(buf);
+ nr, er := src.Read(buf)
if nr > 0 {
- nw, ew := dst.Write(buf[0:nr]);
+ nw, ew := dst.Write(buf[0:nr])
if nw > 0 {
written += int64(nw)
}
if ew != nil {
- err = ew;
- break;
+ err = ew
+ break
}
if nr != nw {
- err = ErrShortWrite;
- break;
+ err = ErrShortWrite
+ break
}
}
if er == os.EOF {
break
}
if er != nil {
- err = er;
- break;
+ err = er
+ break
}
}
- return written, err;
+ return written, err
}
// LimitReader returns a Reader that reads from r
// but stops with os.EOF after n bytes.
-func LimitReader(r Reader, n int64) Reader { return &limitedReader{r, n} }
+func LimitReader(r Reader, n int64) Reader { return &limitedReader{r, n} }
type limitedReader struct {
- r Reader;
- n int64;
+ r Reader
+ n int64
}
func (l *limitedReader) Read(p []byte) (n int, err os.Error) {
@@ -288,9 +288,9 @@ func (l *limitedReader) Read(p []byte) (n int, err os.Error) {
if int64(len(p)) > l.n {
p = p[0:l.n]
}
- n, err = l.r.Read(p);
- l.n -= int64(n);
- return;
+ n, err = l.r.Read(p)
+ l.n -= int64(n)
+ return
}
// NewSectionReader returns a SectionReader that reads from r
@@ -302,10 +302,10 @@ func NewSectionReader(r ReaderAt, off int64, n int64) *SectionReader {
// SectionReader implements Read, Seek, and ReadAt on a section
// of an underlying ReaderAt.
type SectionReader struct {
- r ReaderAt;
- base int64;
- off int64;
- limit int64;
+ r ReaderAt
+ base int64
+ off int64
+ limit int64
}
func (s *SectionReader) Read(p []byte) (n int, err os.Error) {
@@ -315,9 +315,9 @@ func (s *SectionReader) Read(p []byte) (n int, err os.Error) {
if max := s.limit - s.off; int64(len(p)) > max {
p = p[0:max]
}
- n, err = s.r.ReadAt(p, s.off);
- s.off += int64(n);
- return;
+ n, err = s.r.ReadAt(p, s.off)
+ s.off += int64(n)
+ return
}
func (s *SectionReader) Seek(offset int64, whence int) (ret int64, err os.Error) {
@@ -334,20 +334,20 @@ func (s *SectionReader) Seek(offset int64, whence int) (ret int64, err os.Error)
if offset < s.off || offset > s.limit {
return 0, os.EINVAL
}
- s.off = offset;
- return offset - s.base, nil;
+ s.off = offset
+ return offset - s.base, nil
}
func (s *SectionReader) ReadAt(p []byte, off int64) (n int, err os.Error) {
if off < 0 || off >= s.limit-s.base {
return 0, os.EOF
}
- off += s.base;
+ off += s.base
if max := s.limit - off; int64(len(p)) > max {
p = p[0:max]
}
- return s.r.ReadAt(p, off);
+ return s.r.ReadAt(p, off)
}
// Size returns the size of the section in bytes.
-func (s *SectionReader) Size() int64 { return s.limit - s.base }
+func (s *SectionReader) Size() int64 { return s.limit - s.base }
diff --git a/src/pkg/io/io_test.go b/src/pkg/io/io_test.go
index 571712031..4ad1e5951 100644
--- a/src/pkg/io/io_test.go
+++ b/src/pkg/io/io_test.go
@@ -5,75 +5,75 @@
package io_test
import (
- "bytes";
- . "io";
- "testing";
+ "bytes"
+ . "io"
+ "testing"
)
// An version of bytes.Buffer without ReadFrom and WriteTo
type Buffer struct {
- bytes.Buffer;
- ReaderFrom; // conflicts with and hides bytes.Buffer's ReaderFrom.
- WriterTo; // conflicts with and hides bytes.Buffer's WriterTo.
+ bytes.Buffer
+ ReaderFrom // conflicts with and hides bytes.Buffer's ReaderFrom.
+ WriterTo // conflicts with and hides bytes.Buffer's WriterTo.
}
// Simple tests, primarily to verify the ReadFrom and WriteTo callouts inside Copy and Copyn.
func TestCopy(t *testing.T) {
- rb := new(Buffer);
- wb := new(Buffer);
- rb.WriteString("hello, world.");
- Copy(wb, rb);
+ rb := new(Buffer)
+ wb := new(Buffer)
+ rb.WriteString("hello, world.")
+ Copy(wb, rb)
if wb.String() != "hello, world." {
t.Errorf("Copy did not work properly")
}
}
func TestCopyReadFrom(t *testing.T) {
- rb := new(Buffer);
- wb := new(bytes.Buffer); // implements ReadFrom.
- rb.WriteString("hello, world.");
- Copy(wb, rb);
+ rb := new(Buffer)
+ wb := new(bytes.Buffer) // implements ReadFrom.
+ rb.WriteString("hello, world.")
+ Copy(wb, rb)
if wb.String() != "hello, world." {
t.Errorf("Copy did not work properly")
}
}
func TestCopyWriteTo(t *testing.T) {
- rb := new(bytes.Buffer); // implements WriteTo.
- wb := new(Buffer);
- rb.WriteString("hello, world.");
- Copy(wb, rb);
+ rb := new(bytes.Buffer) // implements WriteTo.
+ wb := new(Buffer)
+ rb.WriteString("hello, world.")
+ Copy(wb, rb)
if wb.String() != "hello, world." {
t.Errorf("Copy did not work properly")
}
}
func TestCopyn(t *testing.T) {
- rb := new(Buffer);
- wb := new(Buffer);
- rb.WriteString("hello, world.");
- Copyn(wb, rb, 5);
+ rb := new(Buffer)
+ wb := new(Buffer)
+ rb.WriteString("hello, world.")
+ Copyn(wb, rb, 5)
if wb.String() != "hello" {
t.Errorf("Copyn did not work properly")
}
}
func TestCopynReadFrom(t *testing.T) {
- rb := new(Buffer);
- wb := new(bytes.Buffer); // implements ReadFrom.
- rb.WriteString("hello");
- Copyn(wb, rb, 5);
+ rb := new(Buffer)
+ wb := new(bytes.Buffer) // implements ReadFrom.
+ rb.WriteString("hello")
+ Copyn(wb, rb, 5)
if wb.String() != "hello" {
t.Errorf("Copyn did not work properly")
}
}
func TestCopynWriteTo(t *testing.T) {
- rb := new(bytes.Buffer); // implements WriteTo.
- wb := new(Buffer);
- rb.WriteString("hello, world.");
- Copyn(wb, rb, 5);
+ rb := new(bytes.Buffer) // implements WriteTo.
+ wb := new(Buffer)
+ rb.WriteString("hello, world.")
+ Copyn(wb, rb, 5)
if wb.String() != "hello" {
t.Errorf("Copyn did not work properly")
}
diff --git a/src/pkg/io/ioutil/ioutil.go b/src/pkg/io/ioutil/ioutil.go
index c322f49c2..65f457b24 100644
--- a/src/pkg/io/ioutil/ioutil.go
+++ b/src/pkg/io/ioutil/ioutil.go
@@ -7,84 +7,84 @@
package ioutil
import (
- "bytes";
- "io";
- "os";
- "sort";
+ "bytes"
+ "io"
+ "os"
+ "sort"
)
// ReadAll reads from r until an error or EOF and returns the data it read.
func ReadAll(r io.Reader) ([]byte, os.Error) {
- var buf bytes.Buffer;
- _, err := io.Copy(&buf, r);
- return buf.Bytes(), err;
+ var buf bytes.Buffer
+ _, err := io.Copy(&buf, r)
+ return buf.Bytes(), err
}
// ReadFile reads the file named by filename and returns the contents.
func ReadFile(filename string) ([]byte, os.Error) {
- f, err := os.Open(filename, os.O_RDONLY, 0);
+ f, err := os.Open(filename, os.O_RDONLY, 0)
if err != nil {
return nil, err
}
- defer f.Close();
+ defer f.Close()
// It's a good but not certain bet that Stat will tell us exactly how much to
// read, so let's try it but be prepared for the answer to be wrong.
- dir, err := f.Stat();
- var n uint64;
- if err != nil && dir.Size < 2e9 { // Don't preallocate a huge buffer, just in case.
+ dir, err := f.Stat()
+ var n uint64
+ if err != nil && dir.Size < 2e9 { // Don't preallocate a huge buffer, just in case.
n = dir.Size
}
// Add a little extra in case Size is zero, and to avoid another allocation after
// Read has filled the buffer.
- n += bytes.MinRead;
+ n += bytes.MinRead
// Pre-allocate the correct size of buffer, then set its size to zero. The
// Buffer will read into the allocated space cheaply. If the size was wrong,
// we'll either waste some space off the end or reallocate as needed, but
// in the overwhelmingly common case we'll get it just right.
- buf := bytes.NewBuffer(make([]byte, 0, n));
- _, err = buf.ReadFrom(f);
- return buf.Bytes(), err;
+ buf := bytes.NewBuffer(make([]byte, 0, n))
+ _, err = buf.ReadFrom(f)
+ return buf.Bytes(), err
}
// WriteFile writes data to a file named by filename.
// If the file does not exist, WriteFile creates it with permissions perm;
// otherwise WriteFile truncates it before writing.
func WriteFile(filename string, data []byte, perm int) os.Error {
- f, err := os.Open(filename, os.O_WRONLY|os.O_CREAT|os.O_TRUNC, perm);
+ f, err := os.Open(filename, os.O_WRONLY|os.O_CREAT|os.O_TRUNC, perm)
if err != nil {
return err
}
- n, err := f.Write(data);
- f.Close();
+ n, err := f.Write(data)
+ f.Close()
if err == nil && n < len(data) {
err = io.ErrShortWrite
}
- return err;
+ return err
}
// A dirList implements sort.Interface.
type dirList []*os.Dir
-func (d dirList) Len() int { return len(d) }
-func (d dirList) Less(i, j int) bool { return d[i].Name < d[j].Name }
-func (d dirList) Swap(i, j int) { d[i], d[j] = d[j], d[i] }
+func (d dirList) Len() int { return len(d) }
+func (d dirList) Less(i, j int) bool { return d[i].Name < d[j].Name }
+func (d dirList) Swap(i, j int) { d[i], d[j] = d[j], d[i] }
// ReadDir reads the directory named by dirname and returns
// a list of sorted directory entries.
func ReadDir(dirname string) ([]*os.Dir, os.Error) {
- f, err := os.Open(dirname, os.O_RDONLY, 0);
+ f, err := os.Open(dirname, os.O_RDONLY, 0)
if err != nil {
return nil, err
}
- list, err := f.Readdir(-1);
- f.Close();
+ list, err := f.Readdir(-1)
+ f.Close()
if err != nil {
return nil, err
}
- dirs := make(dirList, len(list));
+ dirs := make(dirList, len(list))
for i := range list {
dirs[i] = &list[i]
}
- sort.Sort(dirs);
- return dirs, nil;
+ sort.Sort(dirs)
+ return dirs, nil
}
diff --git a/src/pkg/io/ioutil/ioutil_test.go b/src/pkg/io/ioutil/ioutil_test.go
index aa57c6560..1deffe83e 100644
--- a/src/pkg/io/ioutil/ioutil_test.go
+++ b/src/pkg/io/ioutil/ioutil_test.go
@@ -5,14 +5,14 @@
package ioutil_test
import (
- . "io/ioutil";
- "os";
- "strings";
- "testing";
+ . "io/ioutil"
+ "os"
+ "strings"
+ "testing"
)
func checkSize(t *testing.T, path string, size uint64) {
- dir, err := os.Stat(path);
+ dir, err := os.Stat(path)
if err != nil {
t.Fatalf("Stat %q (looking for size %d): %s", path, size, err)
}
@@ -22,32 +22,32 @@ func checkSize(t *testing.T, path string, size uint64) {
}
func TestReadFile(t *testing.T) {
- filename := "rumpelstilzchen";
- contents, err := ReadFile(filename);
+ filename := "rumpelstilzchen"
+ contents, err := ReadFile(filename)
if err == nil {
t.Fatalf("ReadFile %s: error expected, none found", filename)
}
- filename = "ioutil_test.go";
- contents, err = ReadFile(filename);
+ filename = "ioutil_test.go"
+ contents, err = ReadFile(filename)
if err != nil {
t.Fatalf("ReadFile %s: %v", filename, err)
}
- checkSize(t, filename, uint64(len(contents)));
+ checkSize(t, filename, uint64(len(contents)))
}
func TestWriteFile(t *testing.T) {
- filename := "_obj/rumpelstilzchen";
+ filename := "_obj/rumpelstilzchen"
data := "Programming today is a race between software engineers striving to " +
"build bigger and better idiot-proof programs, and the Universe trying " +
- "to produce bigger and better idiots. So far, the Universe is winning.";
+ "to produce bigger and better idiots. So far, the Universe is winning."
if err := WriteFile(filename, strings.Bytes(data), 0644); err != nil {
t.Fatalf("WriteFile %s: %v", filename, err)
}
- contents, err := ReadFile(filename);
+ contents, err := ReadFile(filename)
if err != nil {
t.Fatalf("ReadFile %s: %v", filename, err)
}
@@ -57,25 +57,25 @@ func TestWriteFile(t *testing.T) {
}
// cleanup
- os.Remove(filename); // ignore error
+ os.Remove(filename) // ignore error
}
func TestReadDir(t *testing.T) {
- dirname := "rumpelstilzchen";
- _, err := ReadDir(dirname);
+ dirname := "rumpelstilzchen"
+ _, err := ReadDir(dirname)
if err == nil {
t.Fatalf("ReadDir %s: error expected, none found", dirname)
}
- dirname = ".";
- list, err := ReadDir(dirname);
+ dirname = "."
+ list, err := ReadDir(dirname)
if err != nil {
t.Fatalf("ReadDir %s: %v", dirname, err)
}
- foundTest := false;
- foundObj := false;
+ foundTest := false
+ foundObj := false
for _, dir := range list {
switch {
case dir.IsRegular() && dir.Name == "ioutil_test.go":
diff --git a/src/pkg/io/pipe.go b/src/pkg/io/pipe.go
index a12d937dd..8f821a9c6 100644
--- a/src/pkg/io/pipe.go
+++ b/src/pkg/io/pipe.go
@@ -8,25 +8,25 @@
package io
import (
- "os";
- "sync";
+ "os"
+ "sync"
)
type pipeReturn struct {
- n int;
- err os.Error;
+ n int
+ err os.Error
}
// Shared pipe structure.
type pipe struct {
- rclosed bool; // Read end closed?
- rerr os.Error; // Error supplied to CloseReader
- wclosed bool; // Write end closed?
- werr os.Error; // Error supplied to CloseWriter
- wpend []byte; // Written data waiting to be read.
- wtot int; // Bytes consumed so far in current write.
- cr chan []byte; // Write sends data here...
- cw chan pipeReturn; // ... and reads the n, err back from here.
+ rclosed bool // Read end closed?
+ rerr os.Error // Error supplied to CloseReader
+ wclosed bool // Write end closed?
+ werr os.Error // Error supplied to CloseWriter
+ wpend []byte // Written data waiting to be read.
+ wtot int // Bytes consumed so far in current write.
+ cr chan []byte // Write sends data here...
+ cw chan pipeReturn // ... and reads the n, err back from here.
}
func (p *pipe) Read(data []byte) (n int, err os.Error) {
@@ -42,28 +42,28 @@ func (p *pipe) Read(data []byte) (n int, err os.Error) {
if p.wpend == nil {
return 0, p.werr
}
- p.wtot = 0;
+ p.wtot = 0
}
// Read from current write block.
- n = len(data);
+ n = len(data)
if n > len(p.wpend) {
n = len(p.wpend)
}
for i := 0; i < n; i++ {
data[i] = p.wpend[i]
}
- p.wtot += n;
- p.wpend = p.wpend[n:];
+ p.wtot += n
+ p.wpend = p.wpend[n:]
// If write block is done, finish the write.
if len(p.wpend) == 0 {
- p.wpend = nil;
- p.cw <- pipeReturn{p.wtot, nil};
- p.wtot = 0;
+ p.wpend = nil
+ p.cw <- pipeReturn{p.wtot, nil}
+ p.wtot = 0
}
- return n, nil;
+ return n, nil
}
func (p *pipe) Write(data []byte) (n int, err os.Error) {
@@ -75,11 +75,11 @@ func (p *pipe) Write(data []byte) (n int, err os.Error) {
}
// Send data to reader.
- p.cr <- data;
+ p.cr <- data
// Wait for reader to finish copying it.
- res := <-p.cw;
- return res.n, res.err;
+ res := <-p.cw
+ return res.n, res.err
}
func (p *pipe) CloseReader(rerr os.Error) os.Error {
@@ -88,18 +88,18 @@ func (p *pipe) CloseReader(rerr os.Error) os.Error {
}
// Stop any future writes.
- p.rclosed = true;
+ p.rclosed = true
if rerr == nil {
rerr = os.EPIPE
}
- p.rerr = rerr;
+ p.rerr = rerr
// Stop the current write.
if !p.wclosed {
p.cw <- pipeReturn{p.wtot, rerr}
}
- return nil;
+ return nil
}
func (p *pipe) CloseWriter(werr os.Error) os.Error {
@@ -111,15 +111,15 @@ func (p *pipe) CloseWriter(werr os.Error) os.Error {
}
// Stop any future reads.
- p.wclosed = true;
- p.werr = werr;
+ p.wclosed = true
+ p.werr = werr
// Stop the current read.
if !p.rclosed {
p.cr <- nil
}
- return nil;
+ return nil
}
// Read/write halves of the pipe.
@@ -132,8 +132,8 @@ func (p *pipe) CloseWriter(werr os.Error) os.Error {
// A PipeReader is the read half of a pipe.
type PipeReader struct {
- lock sync.Mutex;
- p *pipe;
+ lock sync.Mutex
+ p *pipe
}
// Read implements the standard Read interface:
@@ -142,36 +142,36 @@ type PipeReader struct {
// If the write end is closed with an error, that error is
// returned as err; otherwise err is nil.
func (r *PipeReader) Read(data []byte) (n int, err os.Error) {
- r.lock.Lock();
- defer r.lock.Unlock();
+ r.lock.Lock()
+ defer r.lock.Unlock()
- return r.p.Read(data);
+ return r.p.Read(data)
}
// Close closes the reader; subsequent writes to the
// write half of the pipe will return the error os.EPIPE.
func (r *PipeReader) Close() os.Error {
- r.lock.Lock();
- defer r.lock.Unlock();
+ r.lock.Lock()
+ defer r.lock.Unlock()
- return r.p.CloseReader(nil);
+ return r.p.CloseReader(nil)
}
// CloseWithError closes the reader; subsequent writes
// to the write half of the pipe will return the error rerr.
func (r *PipeReader) CloseWithError(rerr os.Error) os.Error {
- r.lock.Lock();
- defer r.lock.Unlock();
+ r.lock.Lock()
+ defer r.lock.Unlock()
- return r.p.CloseReader(rerr);
+ return r.p.CloseReader(rerr)
}
-func (r *PipeReader) finish() { r.Close() }
+func (r *PipeReader) finish() { r.Close() }
// Write half of pipe.
type PipeWriter struct {
- lock sync.Mutex;
- p *pipe;
+ lock sync.Mutex
+ p *pipe
}
// Write implements the standard Write interface:
@@ -180,31 +180,31 @@ type PipeWriter struct {
// If the read end is closed with an error, that err is
// returned as err; otherwise err is os.EPIPE.
func (w *PipeWriter) Write(data []byte) (n int, err os.Error) {
- w.lock.Lock();
- defer w.lock.Unlock();
+ w.lock.Lock()
+ defer w.lock.Unlock()
- return w.p.Write(data);
+ return w.p.Write(data)
}
// Close closes the writer; subsequent reads from the
// read half of the pipe will return no bytes and a nil error.
func (w *PipeWriter) Close() os.Error {
- w.lock.Lock();
- defer w.lock.Unlock();
+ w.lock.Lock()
+ defer w.lock.Unlock()
- return w.p.CloseWriter(nil);
+ return w.p.CloseWriter(nil)
}
// CloseWithError closes the writer; subsequent reads from the
// read half of the pipe will return no bytes and the error werr.
func (w *PipeWriter) CloseWithError(werr os.Error) os.Error {
- w.lock.Lock();
- defer w.lock.Unlock();
+ w.lock.Lock()
+ defer w.lock.Unlock()
- return w.p.CloseWriter(werr);
+ return w.p.CloseWriter(werr)
}
-func (w *PipeWriter) finish() { w.Close() }
+func (w *PipeWriter) finish() { w.Close() }
// Pipe creates a synchronous in-memory pipe.
// It can be used to connect code expecting an io.Reader
@@ -212,12 +212,12 @@ func (w *PipeWriter) finish() { w.Close() }
// Reads on one end are matched with writes on the other,
// copying data directly between the two; there is no internal buffering.
func Pipe() (*PipeReader, *PipeWriter) {
- p := new(pipe);
- p.cr = make(chan []byte, 1);
- p.cw = make(chan pipeReturn, 1);
- r := new(PipeReader);
- r.p = p;
- w := new(PipeWriter);
- w.p = p;
- return r, w;
+ p := new(pipe)
+ p.cr = make(chan []byte, 1)
+ p.cw = make(chan pipeReturn, 1)
+ r := new(PipeReader)
+ r.p = p
+ w := new(PipeWriter)
+ w.p = p
+ return r, w
}
diff --git a/src/pkg/io/pipe_test.go b/src/pkg/io/pipe_test.go
index df83c3ade..793bed459 100644
--- a/src/pkg/io/pipe_test.go
+++ b/src/pkg/io/pipe_test.go
@@ -5,118 +5,118 @@
package io_test
import (
- "fmt";
- . "io";
- "os";
- "strings";
- "testing";
- "time";
+ "fmt"
+ . "io"
+ "os"
+ "strings"
+ "testing"
+ "time"
)
func checkWrite(t *testing.T, w Writer, data []byte, c chan int) {
- n, err := w.Write(data);
+ n, err := w.Write(data)
if err != nil {
t.Errorf("write: %v", err)
}
if n != len(data) {
t.Errorf("short write: %d != %d", n, len(data))
}
- c <- 0;
+ c <- 0
}
// Test a single read/write pair.
func TestPipe1(t *testing.T) {
- c := make(chan int);
- r, w := Pipe();
- var buf = make([]byte, 64);
- go checkWrite(t, w, strings.Bytes("hello, world"), c);
- n, err := r.Read(buf);
+ c := make(chan int)
+ r, w := Pipe()
+ var buf = make([]byte, 64)
+ go checkWrite(t, w, strings.Bytes("hello, world"), c)
+ n, err := r.Read(buf)
if err != nil {
t.Errorf("read: %v", err)
} else if n != 12 || string(buf[0:12]) != "hello, world" {
t.Errorf("bad read: got %q", buf[0:n])
}
- <-c;
- r.Close();
- w.Close();
+ <-c
+ r.Close()
+ w.Close()
}
func reader(t *testing.T, r Reader, c chan int) {
- var buf = make([]byte, 64);
+ var buf = make([]byte, 64)
for {
- n, err := r.Read(buf);
+ n, err := r.Read(buf)
if err == os.EOF {
- c <- 0;
- break;
+ c <- 0
+ break
}
if err != nil {
t.Errorf("read: %v", err)
}
- c <- n;
+ c <- n
}
}
// Test a sequence of read/write pairs.
func TestPipe2(t *testing.T) {
- c := make(chan int);
- r, w := Pipe();
- go reader(t, r, c);
- var buf = make([]byte, 64);
+ c := make(chan int)
+ r, w := Pipe()
+ go reader(t, r, c)
+ var buf = make([]byte, 64)
for i := 0; i < 5; i++ {
- p := buf[0 : 5+i*10];
- n, err := w.Write(p);
+ p := buf[0 : 5+i*10]
+ n, err := w.Write(p)
if n != len(p) {
t.Errorf("wrote %d, got %d", len(p), n)
}
if err != nil {
t.Errorf("write: %v", err)
}
- nn := <-c;
+ nn := <-c
if nn != n {
t.Errorf("wrote %d, read got %d", n, nn)
}
}
- w.Close();
- nn := <-c;
+ w.Close()
+ nn := <-c
if nn != 0 {
t.Errorf("final read got %d", nn)
}
}
type pipeReturn struct {
- n int;
- err os.Error;
+ n int
+ err os.Error
}
// Test a large write that requires multiple reads to satisfy.
func writer(w WriteCloser, buf []byte, c chan pipeReturn) {
- n, err := w.Write(buf);
- w.Close();
- c <- pipeReturn{n, err};
+ n, err := w.Write(buf)
+ w.Close()
+ c <- pipeReturn{n, err}
}
func TestPipe3(t *testing.T) {
- c := make(chan pipeReturn);
- r, w := Pipe();
- var wdat = make([]byte, 128);
+ c := make(chan pipeReturn)
+ r, w := Pipe()
+ var wdat = make([]byte, 128)
for i := 0; i < len(wdat); i++ {
wdat[i] = byte(i)
}
- go writer(w, wdat, c);
- var rdat = make([]byte, 1024);
- tot := 0;
+ go writer(w, wdat, c)
+ var rdat = make([]byte, 1024)
+ tot := 0
for n := 1; n <= 256; n *= 2 {
- nn, err := r.Read(rdat[tot : tot+n]);
+ nn, err := r.Read(rdat[tot : tot+n])
if err != nil && err != os.EOF {
t.Fatalf("read: %v", err)
}
// only final two reads should be short - 1 byte, then 0
- expect := n;
+ expect := n
if n == 128 {
expect = 1
} else if n == 256 {
- expect = 0;
+ expect = 0
if err != os.EOF {
t.Fatalf("read at end: %v", err)
}
@@ -124,9 +124,9 @@ func TestPipe3(t *testing.T) {
if nn != expect {
t.Fatalf("read %d, expected %d, got %d", n, expect, nn)
}
- tot += nn;
+ tot += nn
}
- pr := <-c;
+ pr := <-c
if pr.n != 128 || pr.err != nil {
t.Fatalf("write 128: %d, %v", pr.n, pr.err)
}
@@ -143,14 +143,14 @@ func TestPipe3(t *testing.T) {
// Test read after/before writer close.
type closer interface {
- CloseWithError(os.Error) os.Error;
- Close() os.Error;
+ CloseWithError(os.Error) os.Error
+ Close() os.Error
}
type pipeTest struct {
- async bool;
- err os.Error;
- closeWithError bool;
+ async bool
+ err os.Error
+ closeWithError bool
}
func (p pipeTest) String() string {
@@ -167,8 +167,8 @@ var pipeTests = []pipeTest{
}
func delayClose(t *testing.T, cl closer, ch chan int, tt pipeTest) {
- time.Sleep(1e6); // 1 ms
- var err os.Error;
+ time.Sleep(1e6) // 1 ms
+ var err os.Error
if tt.closeWithError {
err = cl.CloseWithError(tt.err)
} else {
@@ -177,22 +177,22 @@ func delayClose(t *testing.T, cl closer, ch chan int, tt pipeTest) {
if err != nil {
t.Errorf("delayClose: %v", err)
}
- ch <- 0;
+ ch <- 0
}
func TestPipeReadClose(t *testing.T) {
for _, tt := range pipeTests {
- c := make(chan int, 1);
- r, w := Pipe();
+ c := make(chan int, 1)
+ r, w := Pipe()
if tt.async {
go delayClose(t, w, c, tt)
} else {
delayClose(t, w, c, tt)
}
- var buf = make([]byte, 64);
- n, err := r.Read(buf);
- <-c;
- want := tt.err;
+ var buf = make([]byte, 64)
+ n, err := r.Read(buf)
+ <-c
+ want := tt.err
if want == nil {
want = os.EOF
}
@@ -212,16 +212,16 @@ func TestPipeReadClose(t *testing.T) {
func TestPipeWriteClose(t *testing.T) {
for _, tt := range pipeTests {
- c := make(chan int, 1);
- r, w := Pipe();
+ c := make(chan int, 1)
+ r, w := Pipe()
if tt.async {
go delayClose(t, r, c, tt)
} else {
delayClose(t, r, c, tt)
}
- n, err := WriteString(w, "hello, world");
- <-c;
- expect := tt.err;
+ n, err := WriteString(w, "hello, world")
+ <-c
+ expect := tt.err
if expect == nil {
expect = os.EPIPE
}
diff --git a/src/pkg/json/decode.go b/src/pkg/json/decode.go
index 386ca0016..c2dd93eca 100644
--- a/src/pkg/json/decode.go
+++ b/src/pkg/json/decode.go
@@ -8,8 +8,8 @@
package json
import (
- "container/vector";
- "os";
+ "container/vector"
+ "os"
)
// Decode a JSON string
@@ -23,75 +23,75 @@ import (
// If Decode encounters a syntax error, it returns with err set to an
// instance of ParseError. See ParseError documentation for details.
func Decode(s string) (data interface{}, err os.Error) {
- jb := newDecoder(nil, nil);
- ok, errPos, errTok := Parse(s, jb);
+ jb := newDecoder(nil, nil)
+ ok, errPos, errTok := Parse(s, jb)
if ok {
data = jb.Data()
} else {
err = &ParseError{Index: errPos, Token: errTok}
}
- return;
+ return
}
type decoder struct {
// A value being constructed.
- value interface{};
+ value interface{}
// Container entity to flush into. Can be either vector.Vector or
// map[string]interface{}.
- container interface{};
+ container interface{}
// The index into the container interface. Either int or string.
- index interface{};
+ index interface{}
}
func newDecoder(container interface{}, key interface{}) *decoder {
return &decoder{container: container, index: key}
}
-func (j *decoder) Int64(i int64) { j.value = float64(i) }
+func (j *decoder) Int64(i int64) { j.value = float64(i) }
-func (j *decoder) Uint64(i uint64) { j.value = float64(i) }
+func (j *decoder) Uint64(i uint64) { j.value = float64(i) }
-func (j *decoder) Float64(f float64) { j.value = float64(f) }
+func (j *decoder) Float64(f float64) { j.value = float64(f) }
-func (j *decoder) String(s string) { j.value = s }
+func (j *decoder) String(s string) { j.value = s }
-func (j *decoder) Bool(b bool) { j.value = b }
+func (j *decoder) Bool(b bool) { j.value = b }
-func (j *decoder) Null() { j.value = nil }
+func (j *decoder) Null() { j.value = nil }
-func (j *decoder) Array() { j.value = new(vector.Vector) }
+func (j *decoder) Array() { j.value = new(vector.Vector) }
-func (j *decoder) Map() { j.value = make(map[string]interface{}) }
+func (j *decoder) Map() { j.value = make(map[string]interface{}) }
func (j *decoder) Elem(i int) Builder {
- v, ok := j.value.(*vector.Vector);
+ v, ok := j.value.(*vector.Vector)
if !ok {
- v = new(vector.Vector);
- j.value = v;
+ v = new(vector.Vector)
+ j.value = v
}
if v.Len() <= i {
v.Resize(i+1, (i+1)*2)
}
- return newDecoder(v, i);
+ return newDecoder(v, i)
}
func (j *decoder) Key(s string) Builder {
- m, ok := j.value.(map[string]interface{});
+ m, ok := j.value.(map[string]interface{})
if !ok {
- m = make(map[string]interface{});
- j.value = m;
+ m = make(map[string]interface{})
+ j.value = m
}
- return newDecoder(m, s);
+ return newDecoder(m, s)
}
func (j *decoder) Flush() {
switch c := j.container.(type) {
case *vector.Vector:
- index := j.index.(int);
- c.Set(index, j.Data());
+ index := j.index.(int)
+ c.Set(index, j.Data())
case map[string]interface{}:
- index := j.index.(string);
- c[index] = j.Data();
+ index := j.index.(string)
+ c[index] = j.Data()
}
}
@@ -101,5 +101,5 @@ func (j *decoder) Data() interface{} {
case *vector.Vector:
return v.Data()
}
- return j.value;
+ return j.value
}
diff --git a/src/pkg/json/decode_test.go b/src/pkg/json/decode_test.go
index 1b429b0ee..b712d6558 100644
--- a/src/pkg/json/decode_test.go
+++ b/src/pkg/json/decode_test.go
@@ -5,73 +5,73 @@
package json
import (
- "container/vector";
- "reflect";
- "testing";
+ "container/vector"
+ "reflect"
+ "testing"
)
func TestDecodeInt64(t *testing.T) {
- nb := newDecoder(nil, nil);
- nb.Int64(-15);
- assertResult(t, nb.Data(), float64(-15));
+ nb := newDecoder(nil, nil)
+ nb.Int64(-15)
+ assertResult(t, nb.Data(), float64(-15))
}
func TestDecodeUint64(t *testing.T) {
- nb := newDecoder(nil, nil);
- nb.Uint64(15);
- assertResult(t, nb.Data(), float64(15));
+ nb := newDecoder(nil, nil)
+ nb.Uint64(15)
+ assertResult(t, nb.Data(), float64(15))
}
func TestDecodeFloat64(t *testing.T) {
- nb := newDecoder(nil, nil);
- nb.Float64(3.14159);
- assertResult(t, nb.Data(), float64(3.14159));
+ nb := newDecoder(nil, nil)
+ nb.Float64(3.14159)
+ assertResult(t, nb.Data(), float64(3.14159))
}
func TestDecodeString(t *testing.T) {
- nb := newDecoder(nil, nil);
- nb.String("Some string");
- assertResult(t, nb.Data(), "Some string");
+ nb := newDecoder(nil, nil)
+ nb.String("Some string")
+ assertResult(t, nb.Data(), "Some string")
}
func TestDecodeBool(t *testing.T) {
- nb := newDecoder(nil, nil);
- nb.Bool(true);
- assertResult(t, nb.Data(), true);
+ nb := newDecoder(nil, nil)
+ nb.Bool(true)
+ assertResult(t, nb.Data(), true)
}
func TestDecodeNull(t *testing.T) {
- nb := newDecoder(nil, nil);
- nb.Null();
- assertResult(t, nb.Data(), nil);
+ nb := newDecoder(nil, nil)
+ nb.Null()
+ assertResult(t, nb.Data(), nil)
}
func TestDecodeEmptyArray(t *testing.T) {
- nb := newDecoder(nil, nil);
- nb.Array();
- assertResult(t, nb.Data(), []interface{}{});
+ nb := newDecoder(nil, nil)
+ nb.Array()
+ assertResult(t, nb.Data(), []interface{}{})
}
func TestDecodeEmptyMap(t *testing.T) {
- nb := newDecoder(nil, nil);
- nb.Map();
- assertResult(t, nb.Data(), map[string]interface{}{});
+ nb := newDecoder(nil, nil)
+ nb.Map()
+ assertResult(t, nb.Data(), map[string]interface{}{})
}
func TestDecodeFlushElem(t *testing.T) {
- testVec := new(vector.Vector).Resize(2, 2);
- nb := newDecoder(testVec, 1);
- nb.Float64(3.14159);
- nb.Flush();
- assertResult(t, testVec.Data(), []interface{}{nil, float64(3.14159)});
+ testVec := new(vector.Vector).Resize(2, 2)
+ nb := newDecoder(testVec, 1)
+ nb.Float64(3.14159)
+ nb.Flush()
+ assertResult(t, testVec.Data(), []interface{}{nil, float64(3.14159)})
}
func TestDecodeFlushKey(t *testing.T) {
- testMap := make(map[string]interface{});
- nb := newDecoder(testMap, "key");
- nb.Float64(3.14159);
- nb.Flush();
- assertResult(t, testMap, map[string]interface{}{"key": float64(3.14159)});
+ testMap := make(map[string]interface{})
+ nb := newDecoder(testMap, "key")
+ nb.Float64(3.14159)
+ nb.Flush()
+ assertResult(t, testMap, map[string]interface{}{"key": float64(3.14159)})
}
// Elem() and Key() are hard to test in isolation because all they do
@@ -80,21 +80,21 @@ func TestDecodeFlushKey(t *testing.T) {
// Array(), String(), and Flush().
func TestDecodeElem(t *testing.T) {
- nb := newDecoder(nil, nil);
- nb.Array();
- var b Builder = nb.Elem(0);
- b.String("0");
- b.Flush();
- assertResult(t, nb.Data(), []interface{}{"0"});
+ nb := newDecoder(nil, nil)
+ nb.Array()
+ var b Builder = nb.Elem(0)
+ b.String("0")
+ b.Flush()
+ assertResult(t, nb.Data(), []interface{}{"0"})
}
func TestDecodeKey(t *testing.T) {
- nb := newDecoder(nil, nil);
- nb.Map();
- var b Builder = nb.Key("a");
- b.String("0");
- b.Flush();
- assertResult(t, nb.Data(), map[string]interface{}{"a": "0"});
+ nb := newDecoder(nil, nil)
+ nb.Map()
+ var b Builder = nb.Key("a")
+ b.String("0")
+ b.Flush()
+ assertResult(t, nb.Data(), map[string]interface{}{"a": "0"})
}
func assertResult(t *testing.T, results, expected interface{}) {
@@ -104,8 +104,8 @@ func assertResult(t *testing.T, results, expected interface{}) {
}
type decodeTest struct {
- s string;
- r interface{};
+ s string
+ r interface{}
}
var tests = []decodeTest{
diff --git a/src/pkg/json/error.go b/src/pkg/json/error.go
index aa5b962ae..c5f31b02d 100644
--- a/src/pkg/json/error.go
+++ b/src/pkg/json/error.go
@@ -9,8 +9,8 @@ import "fmt"
// ParseError aggregates information about a JSON parse error. It is
// compatible with the os.Error interface.
type ParseError struct {
- Index int; // A byte index in JSON string where the error occurred
- Token string; // An offending token
+ Index int // A byte index in JSON string where the error occurred
+ Token string // An offending token
}
// Produce a string representation of this ParseError.
diff --git a/src/pkg/json/parse.go b/src/pkg/json/parse.go
index f9c472977..f7eb0a61b 100644
--- a/src/pkg/json/parse.go
+++ b/src/pkg/json/parse.go
@@ -11,9 +11,9 @@
package json
import (
- "bytes";
- "strconv";
- "utf8";
+ "bytes"
+ "strconv"
+ "utf8"
)
// Strings
@@ -23,12 +23,12 @@ import (
// Have also seen \' and embedded newlines.
func _UnHex(p string, r, l int) (v int, ok bool) {
- v = 0;
+ v = 0
for i := r; i < l; i++ {
if i >= len(p) {
return 0, false
}
- v *= 16;
+ v *= 16
switch {
case '0' <= p[i] && p[i] <= '9':
v += int(p[i] - '0')
@@ -40,15 +40,15 @@ func _UnHex(p string, r, l int) (v int, ok bool) {
return 0, false
}
}
- return v, true;
+ return v, true
}
func _ToHex(b []byte, rune int) {
- const hexDigits = "0123456789abcdef";
- b[0] = hexDigits[rune>>12&0xf];
- b[1] = hexDigits[rune>>8&0xf];
- b[2] = hexDigits[rune>>4&0xf];
- b[3] = hexDigits[rune&0xf];
+ const hexDigits = "0123456789abcdef"
+ b[0] = hexDigits[rune>>12&0xf]
+ b[1] = hexDigits[rune>>8&0xf]
+ b[2] = hexDigits[rune>>4&0xf]
+ b[3] = hexDigits[rune&0xf]
}
// Unquote unquotes the JSON-quoted string s,
@@ -58,12 +58,12 @@ func Unquote(s string) (t string, ok bool) {
if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' {
return
}
- b := make([]byte, len(s));
- w := 0;
+ b := make([]byte, len(s))
+ w := 0
for r := 1; r < len(s)-1; {
switch {
case s[r] == '\\':
- r++;
+ r++
if r >= len(s)-1 {
return
}
@@ -71,147 +71,147 @@ func Unquote(s string) (t string, ok bool) {
default:
return
case '"', '\\', '/', '\'':
- b[w] = s[r];
- r++;
- w++;
+ b[w] = s[r]
+ r++
+ w++
case 'b':
- b[w] = '\b';
- r++;
- w++;
+ b[w] = '\b'
+ r++
+ w++
case 'f':
- b[w] = '\f';
- r++;
- w++;
+ b[w] = '\f'
+ r++
+ w++
case 'n':
- b[w] = '\n';
- r++;
- w++;
+ b[w] = '\n'
+ r++
+ w++
case 'r':
- b[w] = '\r';
- r++;
- w++;
+ b[w] = '\r'
+ r++
+ w++
case 't':
- b[w] = '\t';
- r++;
- w++;
+ b[w] = '\t'
+ r++
+ w++
case 'u':
- r++;
- rune, ok := _UnHex(s, r, r+4);
+ r++
+ rune, ok := _UnHex(s, r, r+4)
if !ok {
return
}
- r += 4;
- w += utf8.EncodeRune(rune, b[w:]);
+ r += 4
+ w += utf8.EncodeRune(rune, b[w:])
}
// Control characters are invalid, but we've seen raw \n.
case s[r] < ' ' && s[r] != '\n':
if s[r] == '\n' {
- b[w] = '\n';
- r++;
- w++;
- break;
+ b[w] = '\n'
+ r++
+ w++
+ break
}
- return;
+ return
// ASCII
case s[r] < utf8.RuneSelf:
- b[w] = s[r];
- r++;
- w++;
+ b[w] = s[r]
+ r++
+ w++
// Coerce to well-formed UTF-8.
default:
- rune, size := utf8.DecodeRuneInString(s[r:]);
- r += size;
- w += utf8.EncodeRune(rune, b[w:]);
+ rune, size := utf8.DecodeRuneInString(s[r:])
+ r += size
+ w += utf8.EncodeRune(rune, b[w:])
}
}
- return string(b[0:w]), true;
+ return string(b[0:w]), true
}
// Quote quotes the raw string s using JSON syntax,
// so that Unquote(Quote(s)) = s, true.
func Quote(s string) string {
- chr := make([]byte, 6);
- chr0 := chr[0:1];
- b := new(bytes.Buffer);
- chr[0] = '"';
- b.Write(chr0);
+ chr := make([]byte, 6)
+ chr0 := chr[0:1]
+ b := new(bytes.Buffer)
+ chr[0] = '"'
+ b.Write(chr0)
for _, rune := range s {
switch {
case rune == '"' || rune == '\\':
- chr[0] = '\\';
- chr[1] = byte(rune);
- b.Write(chr[0:2]);
+ chr[0] = '\\'
+ chr[1] = byte(rune)
+ b.Write(chr[0:2])
case rune == '\b':
- chr[0] = '\\';
- chr[1] = 'b';
- b.Write(chr[0:2]);
+ chr[0] = '\\'
+ chr[1] = 'b'
+ b.Write(chr[0:2])
case rune == '\f':
- chr[0] = '\\';
- chr[1] = 'f';
- b.Write(chr[0:2]);
+ chr[0] = '\\'
+ chr[1] = 'f'
+ b.Write(chr[0:2])
case rune == '\n':
- chr[0] = '\\';
- chr[1] = 'n';
- b.Write(chr[0:2]);
+ chr[0] = '\\'
+ chr[1] = 'n'
+ b.Write(chr[0:2])
case rune == '\r':
- chr[0] = '\\';
- chr[1] = 'r';
- b.Write(chr[0:2]);
+ chr[0] = '\\'
+ chr[1] = 'r'
+ b.Write(chr[0:2])
case rune == '\t':
- chr[0] = '\\';
- chr[1] = 't';
- b.Write(chr[0:2]);
+ chr[0] = '\\'
+ chr[1] = 't'
+ b.Write(chr[0:2])
case 0x20 <= rune && rune < utf8.RuneSelf:
- chr[0] = byte(rune);
- b.Write(chr0);
+ chr[0] = byte(rune)
+ b.Write(chr0)
default:
- chr[0] = '\\';
- chr[1] = 'u';
- _ToHex(chr[2:6], rune);
- b.Write(chr);
+ chr[0] = '\\'
+ chr[1] = 'u'
+ _ToHex(chr[2:6], rune)
+ b.Write(chr)
}
}
- chr[0] = '"';
- b.Write(chr0);
- return b.String();
+ chr[0] = '"'
+ b.Write(chr0)
+ return b.String()
}
// _Lexer
type _Lexer struct {
- s string;
- i int;
- kind int;
- token string;
+ s string
+ i int
+ kind int
+ token string
}
func punct(c byte) bool {
return c == '"' || c == '[' || c == ']' || c == ':' || c == '{' || c == '}' || c == ','
}
-func white(c byte) bool { return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '\v' }
+func white(c byte) bool { return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '\v' }
func skipwhite(p string, i int) int {
for i < len(p) && white(p[i]) {
i++
}
- return i;
+ return i
}
func skiptoken(p string, i int) int {
for i < len(p) && !punct(p[i]) && !white(p[i]) {
i++
}
- return i;
+ return i
}
func skipstring(p string, i int) int {
@@ -223,50 +223,50 @@ func skipstring(p string, i int) int {
if i >= len(p) {
return i
}
- return i + 1;
+ return i + 1
}
func (t *_Lexer) Next() {
- i, s := t.i, t.s;
- i = skipwhite(s, i);
+ i, s := t.i, t.s
+ i = skipwhite(s, i)
if i >= len(s) {
- t.kind = 0;
- t.token = "";
- t.i = len(s);
- return;
+ t.kind = 0
+ t.token = ""
+ t.i = len(s)
+ return
}
- c := s[i];
+ c := s[i]
switch {
case c == '-' || '0' <= c && c <= '9':
- j := skiptoken(s, i);
- t.kind = '1';
- t.token = s[i:j];
- i = j;
+ j := skiptoken(s, i)
+ t.kind = '1'
+ t.token = s[i:j]
+ i = j
case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z':
- j := skiptoken(s, i);
- t.kind = 'a';
- t.token = s[i:j];
- i = j;
+ j := skiptoken(s, i)
+ t.kind = 'a'
+ t.token = s[i:j]
+ i = j
case c == '"':
- j := skipstring(s, i);
- t.kind = '"';
- t.token = s[i:j];
- i = j;
+ j := skipstring(s, i)
+ t.kind = '"'
+ t.token = s[i:j]
+ i = j
case c == '[', c == ']', c == ':', c == '{', c == '}', c == ',':
- t.kind = int(c);
- t.token = s[i : i+1];
- i++;
+ t.kind = int(c)
+ t.token = s[i : i+1]
+ i++
default:
- t.kind = '?';
- t.token = s[i : i+1];
+ t.kind = '?'
+ t.token = s[i : i+1]
}
- t.i = i;
+ t.i = i
}
@@ -297,25 +297,25 @@ type _Value interface{}
// eventual representation returned by the parser.
type Builder interface {
// Set value
- Int64(i int64);
- Uint64(i uint64);
- Float64(f float64);
- String(s string);
- Bool(b bool);
- Null();
- Array();
- Map();
+ Int64(i int64)
+ Uint64(i uint64)
+ Float64(f float64)
+ String(s string)
+ Bool(b bool)
+ Null()
+ Array()
+ Map()
// Create sub-Builders
- Elem(i int) Builder;
- Key(s string) Builder;
+ Elem(i int) Builder
+ Key(s string) Builder
// Flush changes to parent Builder if necessary.
- Flush();
+ Flush()
}
func parse(lex *_Lexer, build Builder) bool {
- ok := false;
+ ok := false
Switch:
switch lex.kind {
case 0:
@@ -323,93 +323,93 @@ Switch:
case '1':
// If the number is exactly an integer, use that.
if i, err := strconv.Atoi64(lex.token); err == nil {
- build.Int64(i);
- ok = true;
+ build.Int64(i)
+ ok = true
} else if i, err := strconv.Atoui64(lex.token); err == nil {
- build.Uint64(i);
- ok = true;
+ build.Uint64(i)
+ ok = true
} else
// Fall back to floating point.
if f, err := strconv.Atof64(lex.token); err == nil {
- build.Float64(f);
- ok = true;
+ build.Float64(f)
+ ok = true
}
case 'a':
switch lex.token {
case "true":
- build.Bool(true);
- ok = true;
+ build.Bool(true)
+ ok = true
case "false":
- build.Bool(false);
- ok = true;
+ build.Bool(false)
+ ok = true
case "null":
- build.Null();
- ok = true;
+ build.Null()
+ ok = true
}
case '"':
if str, ok1 := Unquote(lex.token); ok1 {
- build.String(str);
- ok = true;
+ build.String(str)
+ ok = true
}
case '[':
// array
- build.Array();
- lex.Next();
- n := 0;
+ build.Array()
+ lex.Next()
+ n := 0
for lex.kind != ']' {
if n > 0 {
if lex.kind != ',' {
break Switch
}
- lex.Next();
+ lex.Next()
}
if !parse(lex, build.Elem(n)) {
break Switch
}
- n++;
+ n++
}
- ok = true;
+ ok = true
case '{':
// map
- lex.Next();
- build.Map();
- n := 0;
+ lex.Next()
+ build.Map()
+ n := 0
for lex.kind != '}' {
if n > 0 {
if lex.kind != ',' {
break Switch
}
- lex.Next();
+ lex.Next()
}
if lex.kind != '"' {
break Switch
}
- key, ok := Unquote(lex.token);
+ key, ok := Unquote(lex.token)
if !ok {
break Switch
}
- lex.Next();
+ lex.Next()
if lex.kind != ':' {
break Switch
}
- lex.Next();
+ lex.Next()
if !parse(lex, build.Key(key)) {
break Switch
}
- n++;
+ n++
}
- ok = true;
+ ok = true
}
if ok {
lex.Next()
}
- build.Flush();
- return ok;
+ build.Flush()
+ return ok
}
// Parse parses the JSON syntax string s and makes calls to
@@ -419,13 +419,13 @@ Switch:
// to the byte index in s where a syntax error occurred,
// and errtok set to the offending token.
func Parse(s string, builder Builder) (ok bool, errindx int, errtok string) {
- lex := new(_Lexer);
- lex.s = s;
- lex.Next();
+ lex := new(_Lexer)
+ lex.s = s
+ lex.Next()
if parse(lex, builder) {
- if lex.kind == 0 { // EOF
+ if lex.kind == 0 { // EOF
return true, 0, ""
}
}
- return false, lex.i, lex.token;
+ return false, lex.i, lex.token
}
diff --git a/src/pkg/json/struct.go b/src/pkg/json/struct.go
index d34939cbd..4f2a1782c 100644
--- a/src/pkg/json/struct.go
+++ b/src/pkg/json/struct.go
@@ -8,19 +8,19 @@
package json
import (
- "fmt";
- "io";
- "os";
- "reflect";
- "strings";
+ "fmt"
+ "io"
+ "os"
+ "reflect"
+ "strings"
)
type structBuilder struct {
- val reflect.Value;
+ val reflect.Value
// if map_ != nil, write val to map_[key] on each change
- map_ *reflect.MapValue;
- key reflect.Value;
+ map_ *reflect.MapValue
+ key reflect.Value
}
var nobuilder *structBuilder
@@ -30,7 +30,7 @@ func isfloat(v reflect.Value) bool {
case *reflect.FloatValue, *reflect.Float32Value, *reflect.Float64Value:
return true
}
- return false;
+ return false
}
func setfloat(v reflect.Value, f float64) {
@@ -84,7 +84,7 @@ func (b *structBuilder) Int64(i int64) {
if b == nil {
return
}
- v := b.val;
+ v := b.val
if isfloat(v) {
setfloat(v, float64(i))
} else {
@@ -96,7 +96,7 @@ func (b *structBuilder) Uint64(i uint64) {
if b == nil {
return
}
- v := b.val;
+ v := b.val
if isfloat(v) {
setfloat(v, float64(i))
} else {
@@ -108,7 +108,7 @@ func (b *structBuilder) Float64(f float64) {
if b == nil {
return
}
- v := b.val;
+ v := b.val
if isfloat(v) {
setfloat(v, f)
} else {
@@ -116,7 +116,7 @@ func (b *structBuilder) Float64(f float64) {
}
}
-func (b *structBuilder) Null() {}
+func (b *structBuilder) Null() {}
func (b *structBuilder) String(s string) {
if b == nil {
@@ -158,16 +158,16 @@ func (b *structBuilder) Elem(i int) Builder {
}
case *reflect.SliceValue:
if i >= v.Cap() {
- n := v.Cap();
+ n := v.Cap()
if n < 8 {
n = 8
}
for n <= i {
n *= 2
}
- nv := reflect.MakeSlice(v.Type().(*reflect.SliceType), v.Len(), n);
- reflect.ArrayCopy(nv, v);
- v.Set(nv);
+ nv := reflect.MakeSlice(v.Type().(*reflect.SliceType), v.Len(), n)
+ reflect.ArrayCopy(nv, v)
+ v.Set(nv)
}
if v.Len() <= i && i < v.Cap() {
v.SetLen(i + 1)
@@ -176,7 +176,7 @@ func (b *structBuilder) Elem(i int) Builder {
return &structBuilder{val: v.Elem(i)}
}
}
- return nobuilder;
+ return nobuilder
}
func (b *structBuilder) Map() {
@@ -185,11 +185,11 @@ func (b *structBuilder) Map() {
}
if v, ok := b.val.(*reflect.PtrValue); ok && v.IsNil() {
if v.IsNil() {
- v.PointTo(reflect.MakeZero(v.Type().(*reflect.PtrType).Elem()));
- b.Flush();
+ v.PointTo(reflect.MakeZero(v.Type().(*reflect.PtrType).Elem()))
+ b.Flush()
}
- b.map_ = nil;
- b.val = v.Elem();
+ b.map_ = nil
+ b.val = v.Elem()
}
if v, ok := b.val.(*reflect.MapValue); ok && v.IsNil() {
v.Set(reflect.MakeMap(v.Type().(*reflect.MapType)))
@@ -202,28 +202,28 @@ func (b *structBuilder) Key(k string) Builder {
}
switch v := reflect.Indirect(b.val).(type) {
case *reflect.StructValue:
- t := v.Type().(*reflect.StructType);
+ t := v.Type().(*reflect.StructType)
// Case-insensitive field lookup.
- k = strings.ToLower(k);
+ k = strings.ToLower(k)
for i := 0; i < t.NumField(); i++ {
if strings.ToLower(t.Field(i).Name) == k {
return &structBuilder{val: v.Field(i)}
}
}
case *reflect.MapValue:
- t := v.Type().(*reflect.MapType);
+ t := v.Type().(*reflect.MapType)
if t.Key() != reflect.Typeof(k) {
break
}
- key := reflect.NewValue(k);
- elem := v.Elem(key);
+ key := reflect.NewValue(k)
+ elem := v.Elem(key)
if elem == nil {
- v.SetElem(key, reflect.MakeZero(t.Elem()));
- elem = v.Elem(key);
+ v.SetElem(key, reflect.MakeZero(t.Elem()))
+ elem = v.Elem(key)
}
- return &structBuilder{val: elem, map_: v, key: key};
+ return &structBuilder{val: elem, map_: v, key: key}
}
- return nobuilder;
+ return nobuilder
}
// Unmarshal parses the JSON syntax string s and fills in
@@ -289,8 +289,8 @@ func (b *structBuilder) Key(k string) Builder {
// On a syntax error, it returns with ok set to false and errtok
// set to the offending token.
func Unmarshal(s string, val interface{}) (ok bool, errtok string) {
- v := reflect.NewValue(val);
- var b *structBuilder;
+ v := reflect.NewValue(val)
+ var b *structBuilder
// If val is a pointer to a slice, we append to the slice.
if ptr, ok := v.(*reflect.PtrValue); ok {
@@ -303,22 +303,22 @@ func Unmarshal(s string, val interface{}) (ok bool, errtok string) {
b = &structBuilder{val: v}
}
- ok, _, errtok = Parse(s, b);
+ ok, _, errtok = Parse(s, b)
if !ok {
return false, errtok
}
- return true, "";
+ return true, ""
}
type MarshalError struct {
- T reflect.Type;
+ T reflect.Type
}
func (e *MarshalError) String() string {
return "json cannot encode value of type " + e.T.String()
}
func writeArrayOrSlice(w io.Writer, val reflect.ArrayOrSliceValue) os.Error {
- fmt.Fprint(w, "[");
+ fmt.Fprint(w, "[")
for i := 0; i < val.Len(); i++ {
if err := writeValue(w, val.Elem(i)); err != nil {
@@ -330,20 +330,20 @@ func writeArrayOrSlice(w io.Writer, val reflect.ArrayOrSliceValue) os.Error {
}
}
- fmt.Fprint(w, "]");
- return nil;
+ fmt.Fprint(w, "]")
+ return nil
}
func writeMap(w io.Writer, val *reflect.MapValue) os.Error {
- key := val.Type().(*reflect.MapType).Key();
+ key := val.Type().(*reflect.MapType).Key()
if _, ok := key.(*reflect.StringType); !ok {
return &MarshalError{val.Type()}
}
- keys := val.Keys();
- fmt.Fprint(w, "{");
+ keys := val.Keys()
+ fmt.Fprint(w, "{")
for i := 0; i < len(keys); i++ {
- fmt.Fprintf(w, "%q:", keys[i].(*reflect.StringValue).Get());
+ fmt.Fprintf(w, "%q:", keys[i].(*reflect.StringValue).Get())
if err := writeValue(w, val.Elem(keys[i])); err != nil {
return err
@@ -354,32 +354,32 @@ func writeMap(w io.Writer, val *reflect.MapValue) os.Error {
}
}
- fmt.Fprint(w, "}");
- return nil;
+ fmt.Fprint(w, "}")
+ return nil
}
func writeStruct(w io.Writer, val *reflect.StructValue) os.Error {
- fmt.Fprint(w, "{");
+ fmt.Fprint(w, "{")
- typ := val.Type().(*reflect.StructType);
+ typ := val.Type().(*reflect.StructType)
for i := 0; i < val.NumField(); i++ {
- fieldValue := val.Field(i);
- fmt.Fprintf(w, "%q:", typ.Field(i).Name);
- writeValue(w, fieldValue);
+ fieldValue := val.Field(i)
+ fmt.Fprintf(w, "%q:", typ.Field(i).Name)
+ writeValue(w, fieldValue)
if i < val.NumField()-1 {
fmt.Fprint(w, ",")
}
}
- fmt.Fprint(w, "}");
- return nil;
+ fmt.Fprint(w, "}")
+ return nil
}
func writeValue(w io.Writer, val reflect.Value) (err os.Error) {
if val == nil {
- fmt.Fprint(w, "null");
- return;
+ fmt.Fprint(w, "null")
+ return
}
switch v := val.(type) {
@@ -404,10 +404,10 @@ func writeValue(w io.Writer, val reflect.Value) (err os.Error) {
err = &MarshalError{val.Type()}
}
default:
- value := val.(reflect.Value);
- fmt.Fprint(w, value.Interface());
+ value := val.(reflect.Value)
+ fmt.Fprint(w, value.Interface())
}
- return;
+ return
}
func Marshal(w io.Writer, val interface{}) os.Error {
diff --git a/src/pkg/json/struct_test.go b/src/pkg/json/struct_test.go
index 1511bc45c..9a928f7d0 100644
--- a/src/pkg/json/struct_test.go
+++ b/src/pkg/json/struct_test.go
@@ -5,34 +5,34 @@
package json
import (
- "bytes";
- "reflect";
- "strconv";
- "testing";
+ "bytes"
+ "reflect"
+ "strconv"
+ "testing"
)
type myStruct struct {
- T bool;
- F bool;
- S string;
- I8 int8;
- I16 int16;
- I32 int32;
- I64 int64;
- U8 uint8;
- U16 uint16;
- U32 uint32;
- U64 uint64;
- I int;
- U uint;
- Fl float;
- Fl32 float32;
- Fl64 float64;
- A []string;
- My *myStruct;
- Map map[string][]int;
- MapStruct map[string]myStruct;
- MapPtrStruct map[string]*myStruct;
+ T bool
+ F bool
+ S string
+ I8 int8
+ I16 int16
+ I32 int32
+ I64 int64
+ U8 uint8
+ U16 uint16
+ U32 uint32
+ U64 uint64
+ I int
+ U uint
+ Fl float
+ Fl32 float32
+ Fl64 float64
+ A []string
+ My *myStruct
+ Map map[string][]int
+ MapStruct map[string]myStruct
+ MapPtrStruct map[string]*myStruct
}
const encoded = `{"t":true,"f":false,"s":"abc","i8":1,"i16":2,"i32":3,"i64":4,` +
@@ -69,58 +69,58 @@ func check(t *testing.T, ok bool, name string, v interface{}) {
const whiteSpaceEncoded = " \t{\n\"s\"\r:\"string\"\v}"
func TestUnmarshalWhitespace(t *testing.T) {
- var m myStruct;
- ok, errtok := Unmarshal(whiteSpaceEncoded, &m);
+ var m myStruct
+ ok, errtok := Unmarshal(whiteSpaceEncoded, &m)
if !ok {
t.Fatalf("Unmarshal failed near %s", errtok)
}
- check(t, m.S == "string", "string", m.S);
+ check(t, m.S == "string", "string", m.S)
}
func TestUnmarshal(t *testing.T) {
- var m myStruct;
- m.F = true;
- ok, errtok := Unmarshal(encoded, &m);
+ var m myStruct
+ m.F = true
+ ok, errtok := Unmarshal(encoded, &m)
if !ok {
t.Fatalf("Unmarshal failed near %s", errtok)
}
- check(t, m.T == true, "t", m.T);
- check(t, m.F == false, "f", m.F);
- check(t, m.S == "abc", "s", m.S);
- check(t, m.I8 == 1, "i8", m.I8);
- check(t, m.I16 == 2, "i16", m.I16);
- check(t, m.I32 == 3, "i32", m.I32);
- check(t, m.I64 == 4, "i64", m.I64);
- check(t, m.U8 == 5, "u8", m.U8);
- check(t, m.U16 == 6, "u16", m.U16);
- check(t, m.U32 == 7, "u32", m.U32);
- check(t, m.U64 == 8, "u64", m.U64);
- check(t, m.I == -9, "i", m.I);
- check(t, m.U == 10, "u", m.U);
- check(t, m.Fl == 11.5, "fl", m.Fl);
- check(t, m.Fl32 == 12.25, "fl32", m.Fl32);
- check(t, m.Fl64 == 13.75, "fl64", m.Fl64);
- check(t, m.A != nil, "a", m.A);
+ check(t, m.T == true, "t", m.T)
+ check(t, m.F == false, "f", m.F)
+ check(t, m.S == "abc", "s", m.S)
+ check(t, m.I8 == 1, "i8", m.I8)
+ check(t, m.I16 == 2, "i16", m.I16)
+ check(t, m.I32 == 3, "i32", m.I32)
+ check(t, m.I64 == 4, "i64", m.I64)
+ check(t, m.U8 == 5, "u8", m.U8)
+ check(t, m.U16 == 6, "u16", m.U16)
+ check(t, m.U32 == 7, "u32", m.U32)
+ check(t, m.U64 == 8, "u64", m.U64)
+ check(t, m.I == -9, "i", m.I)
+ check(t, m.U == 10, "u", m.U)
+ check(t, m.Fl == 11.5, "fl", m.Fl)
+ check(t, m.Fl32 == 12.25, "fl32", m.Fl32)
+ check(t, m.Fl64 == 13.75, "fl64", m.Fl64)
+ check(t, m.A != nil, "a", m.A)
if m.A != nil {
- check(t, m.A[0] == "x", "a[0]", m.A[0]);
- check(t, m.A[1] == "y", "a[1]", m.A[1]);
- check(t, m.A[2] == "z", "a[2]", m.A[2]);
+ check(t, m.A[0] == "x", "a[0]", m.A[0])
+ check(t, m.A[1] == "y", "a[1]", m.A[1])
+ check(t, m.A[2] == "z", "a[2]", m.A[2])
}
- check(t, m.My != nil, "my", m.My);
+ check(t, m.My != nil, "my", m.My)
if m.My != nil {
check(t, m.My.S == "subguy", "my.s", m.My.S)
}
- check(t, reflect.DeepEqual(m.Map, decodedMap), "map", m.Map);
- check(t, reflect.DeepEqual(m.MapStruct, decodedMapStruct), "mapstruct", m.MapStruct);
- check(t, reflect.DeepEqual(m.MapPtrStruct, decodedMapPtrStruct), "mapptrstruct", m.MapPtrStruct);
+ check(t, reflect.DeepEqual(m.Map, decodedMap), "map", m.Map)
+ check(t, reflect.DeepEqual(m.MapStruct, decodedMapStruct), "mapstruct", m.MapStruct)
+ check(t, reflect.DeepEqual(m.MapPtrStruct, decodedMapPtrStruct), "mapptrstruct", m.MapPtrStruct)
}
type Issue147Text struct {
- Text string;
+ Text string
}
type Issue147 struct {
- Test []Issue147Text;
+ Test []Issue147Text
}
const issue147Input = `{"test": [{"text":"0"},{"text":"1"},{"text":"2"},
@@ -135,8 +135,8 @@ const issue147Input = `{"test": [{"text":"0"},{"text":"1"},{"text":"2"},
{"text":"27"},{"text":"28"},{"text":"29"}]}`
func TestIssue147(t *testing.T) {
- var timeline Issue147;
- Unmarshal(issue147Input, &timeline);
+ var timeline Issue147
+ Unmarshal(issue147Input, &timeline)
if len(timeline.Test) != 30 {
t.Errorf("wrong length: got %d want 30", len(timeline.Test))
@@ -150,14 +150,14 @@ func TestIssue147(t *testing.T) {
}
type Issue114 struct {
- Text string;
+ Text string
}
const issue114Input = `[{"text" : "0"}, {"text" : "1"}, {"text" : "2"}, {"text" : "3"}]`
func TestIssue114(t *testing.T) {
- var items []Issue114;
- Unmarshal(issue114Input, &items);
+ var items []Issue114
+ Unmarshal(issue114Input, &items)
if len(items) != 4 {
t.Errorf("wrong length: got %d want 4", len(items))
@@ -171,8 +171,8 @@ func TestIssue114(t *testing.T) {
}
type marshalTest struct {
- val interface{};
- out string;
+ val interface{}
+ out string
}
var marshalTests = []marshalTest{
@@ -195,8 +195,8 @@ var marshalTests = []marshalTest{
marshalTest{struct{ a int }{1}, `{"a":1}`},
marshalTest{struct{ a interface{} }{nil}, `{"a":null}`},
marshalTest{struct {
- a int;
- b string;
+ a int
+ b string
}{1, "hello"},
`{"a":1,"b":"hello"}`,
},
@@ -205,14 +205,14 @@ var marshalTests = []marshalTest{
func TestMarshal(t *testing.T) {
for _, tt := range marshalTests {
- var buf bytes.Buffer;
+ var buf bytes.Buffer
- err := Marshal(&buf, tt.val);
+ err := Marshal(&buf, tt.val)
if err != nil {
t.Fatalf("Marshal(%T): %s", tt.val, err)
}
- s := buf.String();
+ s := buf.String()
if s != tt.out {
t.Errorf("Marshal(%T) = %q, want %q\n", tt.val, tt.out, s)
}
@@ -220,8 +220,8 @@ func TestMarshal(t *testing.T) {
}
type marshalErrorTest struct {
- val interface{};
- error string;
+ val interface{}
+ error string
}
type MTE string
@@ -233,9 +233,9 @@ var marshalErrorTests = []marshalErrorTest{
func TestMarshalError(t *testing.T) {
for _, tt := range marshalErrorTests {
- var buf bytes.Buffer;
+ var buf bytes.Buffer
- err := Marshal(&buf, tt.val);
+ err := Marshal(&buf, tt.val)
if err == nil {
t.Fatalf("Marshal(%T): no error, want error %s", tt.val, tt.error)
diff --git a/src/pkg/log/log.go b/src/pkg/log/log.go
index 2beb99c3d..ac996a38d 100644
--- a/src/pkg/log/log.go
+++ b/src/pkg/log/log.go
@@ -12,37 +12,37 @@
package log
import (
- "fmt";
- "io";
- "runtime";
- "os";
- "time";
+ "fmt"
+ "io"
+ "runtime"
+ "os"
+ "time"
)
// These flags define the properties of the Logger and the output they produce.
const (
// Flags
- Lok = iota;
- Lexit; // terminate execution when written
- Lcrash; // crash (panic) when written
+ Lok = iota
+ Lexit // terminate execution when written
+ Lcrash // crash (panic) when written
// Bits or'ed together to control what's printed. There is no control over the
// order they appear (the order listed here) or the format they present (as
// described in the comments). A colon appears after these items:
// 2009/0123 01:23:23.123123 /a/b/c/d.go:23: message
- Ldate = 1 << iota; // the date: 2009/0123
- Ltime; // the time: 01:23:23
- Lmicroseconds; // microsecond resolution: 01:23:23.123123. assumes Ltime.
- Llongfile; // full file name and line number: /a/b/c/d.go:23
- Lshortfile; // final file name element and line number: d.go:23. overrides Llongfile
- lAllBits = Ldate | Ltime | Lmicroseconds | Llongfile | Lshortfile;
+ Ldate = 1 << iota // the date: 2009/0123
+ Ltime // the time: 01:23:23
+ Lmicroseconds // microsecond resolution: 01:23:23.123123. assumes Ltime.
+ Llongfile // full file name and line number: /a/b/c/d.go:23
+ Lshortfile // final file name element and line number: d.go:23. overrides Llongfile
+ lAllBits = Ldate | Ltime | Lmicroseconds | Llongfile | Lshortfile
)
// Logger represents an active logging object.
type Logger struct {
- out0 io.Writer; // first destination for output
- out1 io.Writer; // second destination for output; may be nil
- prefix string; // prefix to write at beginning of each line
- flag int; // properties
+ out0 io.Writer // first destination for output
+ out1 io.Writer // second destination for output; may be nil
+ prefix string // prefix to write at beginning of each line
+ flag int // properties
}
// New creates a new Logger. The out0 and out1 variables set the
@@ -54,87 +54,87 @@ func New(out0, out1 io.Writer, prefix string, flag int) *Logger {
}
var (
- stdout = New(os.Stdout, nil, "", Lok|Ldate|Ltime);
- stderr = New(os.Stderr, nil, "", Lok|Ldate|Ltime);
- exit = New(os.Stderr, nil, "", Lexit|Ldate|Ltime);
- crash = New(os.Stderr, nil, "", Lcrash|Ldate|Ltime);
+ stdout = New(os.Stdout, nil, "", Lok|Ldate|Ltime)
+ stderr = New(os.Stderr, nil, "", Lok|Ldate|Ltime)
+ exit = New(os.Stderr, nil, "", Lexit|Ldate|Ltime)
+ crash = New(os.Stderr, nil, "", Lcrash|Ldate|Ltime)
)
-var shortnames = make(map[string]string) // cache of short names to avoid allocation.
+var shortnames = make(map[string]string) // cache of short names to avoid allocation.
// Cheap integer to fixed-width decimal ASCII. Use a negative width to avoid zero-padding
func itoa(i int, wid int) string {
- var u uint = uint(i);
+ var u uint = uint(i)
if u == 0 && wid <= 1 {
return "0"
}
// Assemble decimal in reverse order.
- var b [32]byte;
- bp := len(b);
+ var b [32]byte
+ bp := len(b)
for ; u > 0 || wid > 0; u /= 10 {
- bp--;
- wid--;
- b[bp] = byte(u%10) + '0';
+ bp--
+ wid--
+ b[bp] = byte(u%10) + '0'
}
- return string(b[bp:]);
+ return string(b[bp:])
}
func (l *Logger) formatHeader(ns int64, calldepth int) string {
- h := l.prefix;
+ h := l.prefix
if l.flag&(Ldate|Ltime|Lmicroseconds) != 0 {
- t := time.SecondsToLocalTime(ns / 1e9);
+ t := time.SecondsToLocalTime(ns / 1e9)
if l.flag&(Ldate) != 0 {
h += itoa(int(t.Year), 4) + "/" + itoa(t.Month, 2) + "/" + itoa(t.Day, 2) + " "
}
if l.flag&(Ltime|Lmicroseconds) != 0 {
- h += itoa(t.Hour, 2) + ":" + itoa(t.Minute, 2) + ":" + itoa(t.Second, 2);
+ h += itoa(t.Hour, 2) + ":" + itoa(t.Minute, 2) + ":" + itoa(t.Second, 2)
if l.flag&Lmicroseconds != 0 {
h += "." + itoa(int(ns%1e9)/1e3, 6)
}
- h += " ";
+ h += " "
}
}
if l.flag&(Lshortfile|Llongfile) != 0 {
- _, file, line, ok := runtime.Caller(calldepth);
+ _, file, line, ok := runtime.Caller(calldepth)
if ok {
if l.flag&Lshortfile != 0 {
- short, ok := shortnames[file];
+ short, ok := shortnames[file]
if !ok {
- short = file;
+ short = file
for i := len(file) - 1; i > 0; i-- {
if file[i] == '/' {
- short = file[i+1:];
- break;
+ short = file[i+1:]
+ break
}
}
- shortnames[file] = short;
+ shortnames[file] = short
}
- file = short;
+ file = short
}
} else {
- file = "???";
- line = 0;
+ file = "???"
+ line = 0
}
- h += file + ":" + itoa(line, -1) + ": ";
+ h += file + ":" + itoa(line, -1) + ": "
}
- return h;
+ return h
}
// Output writes the output for a logging event. The string s contains the text to print after
// the time stamp; calldepth is used to recover the PC. It is provided for generality, although
// at the moment on all pre-defined paths it will be 2.
func (l *Logger) Output(calldepth int, s string) os.Error {
- now := time.Nanoseconds(); // get this early.
- newline := "\n";
+ now := time.Nanoseconds() // get this early.
+ newline := "\n"
if len(s) > 0 && s[len(s)-1] == '\n' {
newline = ""
}
- s = l.formatHeader(now, calldepth+1) + s + newline;
- _, err := io.WriteString(l.out0, s);
+ s = l.formatHeader(now, calldepth+1) + s + newline
+ _, err := io.WriteString(l.out0, s)
if l.out1 != nil {
- _, err1 := io.WriteString(l.out1, s);
+ _, err1 := io.WriteString(l.out1, s)
if err == nil && err1 != nil {
err = err1
}
@@ -145,35 +145,35 @@ func (l *Logger) Output(calldepth int, s string) os.Error {
case Lexit:
os.Exit(1)
}
- return err;
+ return err
}
// Logf is analogous to Printf() for a Logger.
-func (l *Logger) Logf(format string, v ...) { l.Output(2, fmt.Sprintf(format, v)) }
+func (l *Logger) Logf(format string, v ...) { l.Output(2, fmt.Sprintf(format, v)) }
// Log is analogous to Print() for a Logger.
-func (l *Logger) Log(v ...) { l.Output(2, fmt.Sprintln(v)) }
+func (l *Logger) Log(v ...) { l.Output(2, fmt.Sprintln(v)) }
// Stdout is a helper function for easy logging to stdout. It is analogous to Print().
-func Stdout(v ...) { stdout.Output(2, fmt.Sprint(v)) }
+func Stdout(v ...) { stdout.Output(2, fmt.Sprint(v)) }
// Stderr is a helper function for easy logging to stderr. It is analogous to Fprint(os.Stderr).
-func Stderr(v ...) { stderr.Output(2, fmt.Sprintln(v)) }
+func Stderr(v ...) { stderr.Output(2, fmt.Sprintln(v)) }
// Stdoutf is a helper functions for easy formatted logging to stdout. It is analogous to Printf().
-func Stdoutf(format string, v ...) { stdout.Output(2, fmt.Sprintf(format, v)) }
+func Stdoutf(format string, v ...) { stdout.Output(2, fmt.Sprintf(format, v)) }
// Stderrf is a helper function for easy formatted logging to stderr. It is analogous to Fprintf(os.Stderr).
-func Stderrf(format string, v ...) { stderr.Output(2, fmt.Sprintf(format, v)) }
+func Stderrf(format string, v ...) { stderr.Output(2, fmt.Sprintf(format, v)) }
// Exit is equivalent to Stderr() followed by a call to os.Exit(1).
-func Exit(v ...) { exit.Output(2, fmt.Sprintln(v)) }
+func Exit(v ...) { exit.Output(2, fmt.Sprintln(v)) }
// Exitf is equivalent to Stderrf() followed by a call to os.Exit(1).
-func Exitf(format string, v ...) { exit.Output(2, fmt.Sprintf(format, v)) }
+func Exitf(format string, v ...) { exit.Output(2, fmt.Sprintf(format, v)) }
// Crash is equivalent to Stderr() followed by a call to panic().
-func Crash(v ...) { crash.Output(2, fmt.Sprintln(v)) }
+func Crash(v ...) { crash.Output(2, fmt.Sprintln(v)) }
// Crashf is equivalent to Stderrf() followed by a call to panic().
-func Crashf(format string, v ...) { crash.Output(2, fmt.Sprintf(format, v)) }
+func Crashf(format string, v ...) { crash.Output(2, fmt.Sprintf(format, v)) }
diff --git a/src/pkg/log/log_test.go b/src/pkg/log/log_test.go
index caef8b134..fd0b36c6e 100644
--- a/src/pkg/log/log_test.go
+++ b/src/pkg/log/log_test.go
@@ -7,25 +7,25 @@ package log
// These tests are too simple.
import (
- "bufio";
- "os";
- "regexp";
- "testing";
+ "bufio"
+ "os"
+ "regexp"
+ "testing"
)
const (
- Rdate = `[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]`;
- Rtime = `[0-9][0-9]:[0-9][0-9]:[0-9][0-9]`;
- Rmicroseconds = `\.[0-9][0-9][0-9][0-9][0-9][0-9]`;
- Rline = `[0-9]+:`;
- Rlongfile = `.*/[A-Za-z0-9_\-]+\.go:` + Rline;
- Rshortfile = `[A-Za-z0-9_\-]+\.go:` + Rline;
+ Rdate = `[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]`
+ Rtime = `[0-9][0-9]:[0-9][0-9]:[0-9][0-9]`
+ Rmicroseconds = `\.[0-9][0-9][0-9][0-9][0-9][0-9]`
+ Rline = `[0-9]+:`
+ Rlongfile = `.*/[A-Za-z0-9_\-]+\.go:` + Rline
+ Rshortfile = `[A-Za-z0-9_\-]+\.go:` + Rline
)
type tester struct {
- flag int;
- prefix string;
- pattern string; // regexp that log output must match; we add ^ and expected_text$ always
+ flag int
+ prefix string
+ pattern string // regexp that log output must match; we add ^ and expected_text$ always
}
var tests = []tester{
@@ -35,10 +35,10 @@ var tests = []tester{
tester{Lok | Ldate, "", Rdate + " "},
tester{Lok | Ltime, "", Rtime + " "},
tester{Lok | Ltime | Lmicroseconds, "", Rtime + Rmicroseconds + " "},
- tester{Lok | Lmicroseconds, "", Rtime + Rmicroseconds + " "}, // microsec implies time
+ tester{Lok | Lmicroseconds, "", Rtime + Rmicroseconds + " "}, // microsec implies time
tester{Lok | Llongfile, "", Rlongfile + " "},
tester{Lok | Lshortfile, "", Rshortfile + " "},
- tester{Lok | Llongfile | Lshortfile, "", Rshortfile + " "}, // shortfile overrides longfile
+ tester{Lok | Llongfile | Lshortfile, "", Rshortfile + " "}, // shortfile overrides longfile
// everything at once:
tester{Lok | Ldate | Ltime | Lmicroseconds | Llongfile, "XXX", "XXX" + Rdate + " " + Rtime + Rmicroseconds + " " + Rlongfile + " "},
tester{Lok | Ldate | Ltime | Lmicroseconds | Lshortfile, "XXX", "XXX" + Rdate + " " + Rtime + Rmicroseconds + " " + Rshortfile + " "},
@@ -46,26 +46,26 @@ var tests = []tester{
// Test using Log("hello", 23, "world") or using Logf("hello %d world", 23)
func testLog(t *testing.T, flag int, prefix string, pattern string, useLogf bool) {
- r, w, err1 := os.Pipe();
+ r, w, err1 := os.Pipe()
if err1 != nil {
t.Fatal("pipe", err1)
}
- defer r.Close();
- defer w.Close();
- buf := bufio.NewReader(r);
- l := New(w, nil, prefix, flag);
+ defer r.Close()
+ defer w.Close()
+ buf := bufio.NewReader(r)
+ l := New(w, nil, prefix, flag)
if useLogf {
l.Logf("hello %d world", 23)
} else {
l.Log("hello", 23, "world")
}
- line, err3 := buf.ReadString('\n');
+ line, err3 := buf.ReadString('\n')
if err3 != nil {
t.Fatal("log error", err3)
}
- line = line[0 : len(line)-1];
- pattern = "^" + pattern + "hello 23 world$";
- matched, err4 := regexp.MatchString(pattern, line);
+ line = line[0 : len(line)-1]
+ pattern = "^" + pattern + "hello 23 world$"
+ matched, err4 := regexp.MatchString(pattern, line)
if err4 != nil {
t.Fatal("pattern did not compile:", err4)
}
@@ -76,7 +76,7 @@ func testLog(t *testing.T, flag int, prefix string, pattern string, useLogf bool
func TestAllLog(t *testing.T) {
for _, testcase := range tests {
- testLog(t, testcase.flag, testcase.prefix, testcase.pattern, false);
- testLog(t, testcase.flag, testcase.prefix, testcase.pattern, true);
+ testLog(t, testcase.flag, testcase.prefix, testcase.pattern, false)
+ testLog(t, testcase.flag, testcase.prefix, testcase.pattern, true)
}
}
diff --git a/src/pkg/malloc/malloc.go b/src/pkg/malloc/malloc.go
index ba15f04ab..c66b6237d 100644
--- a/src/pkg/malloc/malloc.go
+++ b/src/pkg/malloc/malloc.go
@@ -12,14 +12,14 @@
package malloc
type Stats struct {
- Alloc uint64;
- Sys uint64;
- Stacks uint64;
- InusePages uint64;
- NextGC uint64;
- Lookups uint64;
- Mallocs uint64;
- EnableGC bool;
+ Alloc uint64
+ Sys uint64
+ Stacks uint64
+ InusePages uint64
+ NextGC uint64
+ Lookups uint64
+ Mallocs uint64
+ EnableGC bool
}
func Alloc(uintptr) *byte
diff --git a/src/pkg/math/all_test.go b/src/pkg/math/all_test.go
index 60ce6de24..6feddac93 100644
--- a/src/pkg/math/all_test.go
+++ b/src/pkg/math/all_test.go
@@ -5,9 +5,9 @@
package math_test
import (
- "fmt";
- . "math";
- "testing";
+ "fmt"
+ . "math"
+ "testing"
)
var vf = []float64{
@@ -156,22 +156,22 @@ var tanh = []float64{
}
func tolerance(a, b, e float64) bool {
- d := a - b;
+ d := a - b
if d < 0 {
d = -d
}
if a != 0 {
- e = e * a;
+ e = e * a
if e < 0 {
e = -e
}
}
- return d < e;
+ return d < e
}
-func kindaclose(a, b float64) bool { return tolerance(a, b, 1e-8) }
-func close(a, b float64) bool { return tolerance(a, b, 1e-14) }
-func veryclose(a, b float64) bool { return tolerance(a, b, 4e-16) }
+func kindaclose(a, b float64) bool { return tolerance(a, b, 1e-8) }
+func close(a, b float64) bool { return tolerance(a, b, 1e-14) }
+func veryclose(a, b float64) bool { return tolerance(a, b, 4e-16) }
func TestAsin(t *testing.T) {
for i := 0; i < len(vf); i++ {
@@ -207,7 +207,7 @@ func TestFloor(t *testing.T) {
func TestLog(t *testing.T) {
for i := 0; i < len(vf); i++ {
- a := Fabs(vf[i]);
+ a := Fabs(vf[i])
if f := Log(a); log[i] != f {
t.Errorf("Log(%g) = %g, want %g\n", a, f, log[i])
}
@@ -243,7 +243,7 @@ func TestSinh(t *testing.T) {
func TestSqrt(t *testing.T) {
for i := 0; i < len(vf); i++ {
- a := Fabs(vf[i]);
+ a := Fabs(vf[i])
if f := Sqrt(a); !veryclose(sqrt[i], f) {
t.Errorf("Sqrt(%g) = %g, want %g\n", a, f, floor[i])
}
@@ -268,7 +268,7 @@ func TestTanh(t *testing.T) {
func TestHypot(t *testing.T) {
for i := 0; i < len(vf); i++ {
- a := Fabs(tanh[i] * Sqrt(2));
+ a := Fabs(tanh[i] * Sqrt(2))
if f := Hypot(tanh[i], tanh[i]); !veryclose(a, f) {
t.Errorf("Hypot(%g, %g) = %g, want %g\n", tanh[i], tanh[i], f, a)
}
@@ -278,10 +278,10 @@ func TestHypot(t *testing.T) {
// Check that math functions of high angle values
// return similar results to low angle values
func TestLargeSin(t *testing.T) {
- large := float64(100000 * Pi);
+ large := float64(100000 * Pi)
for i := 0; i < len(vf); i++ {
- f1 := Sin(vf[i]);
- f2 := Sin(vf[i] + large);
+ f1 := Sin(vf[i])
+ f2 := Sin(vf[i] + large)
if !kindaclose(f1, f2) {
t.Errorf("Sin(%g) = %g, want %g\n", vf[i]+large, f1, f2)
}
@@ -289,10 +289,10 @@ func TestLargeSin(t *testing.T) {
}
func TestLargeCos(t *testing.T) {
- large := float64(100000 * Pi);
+ large := float64(100000 * Pi)
for i := 0; i < len(vf); i++ {
- f1 := Cos(vf[i]);
- f2 := Cos(vf[i] + large);
+ f1 := Cos(vf[i])
+ f2 := Cos(vf[i] + large)
if !kindaclose(f1, f2) {
t.Errorf("Cos(%g) = %g, want %g\n", vf[i]+large, f1, f2)
}
@@ -301,10 +301,10 @@ func TestLargeCos(t *testing.T) {
func TestLargeTan(t *testing.T) {
- large := float64(100000 * Pi);
+ large := float64(100000 * Pi)
for i := 0; i < len(vf); i++ {
- f1 := Tan(vf[i]);
- f2 := Tan(vf[i] + large);
+ f1 := Tan(vf[i])
+ f2 := Tan(vf[i] + large)
if !kindaclose(f1, f2) {
t.Errorf("Tan(%g) = %g, want %g\n", vf[i]+large, f1, f2)
}
@@ -316,9 +316,9 @@ func TestLargeTan(t *testing.T) {
// http://code.google.com/p/go/issues/detail?id=201
type floatTest struct {
- val interface{};
- name string;
- str string;
+ val interface{}
+ name string
+ str string
}
var floatTests = []floatTest{
@@ -330,7 +330,7 @@ var floatTests = []floatTest{
func TestFloatMinMax(t *testing.T) {
for _, tt := range floatTests {
- s := fmt.Sprint(tt.val);
+ s := fmt.Sprint(tt.val)
if s != tt.str {
t.Errorf("Sprint(%v) = %s, want %s", tt.name, s, tt.str)
}
diff --git a/src/pkg/math/asin.go b/src/pkg/math/asin.go
index 3ba36abf5..a138aac06 100644
--- a/src/pkg/math/asin.go
+++ b/src/pkg/math/asin.go
@@ -14,16 +14,16 @@ package math
// Asin returns the arc sine of x.
func Asin(x float64) float64 {
- sign := false;
+ sign := false
if x < 0 {
- x = -x;
- sign = true;
+ x = -x
+ sign = true
}
if x > 1 {
return NaN()
}
- temp := Sqrt(1 - x*x);
+ temp := Sqrt(1 - x*x)
if x > 0.7 {
temp = Pi/2 - Atan(temp/x)
} else {
@@ -33,7 +33,7 @@ func Asin(x float64) float64 {
if sign {
temp = -temp
}
- return temp;
+ return temp
}
// Acos returns the arc cosine of x.
@@ -41,5 +41,5 @@ func Acos(x float64) float64 {
if x > 1 || x < -1 {
return NaN()
}
- return Pi/2 - Asin(x);
+ return Pi/2 - Asin(x)
}
diff --git a/src/pkg/math/atan.go b/src/pkg/math/atan.go
index 4f0ad9bf0..c811a39d9 100644
--- a/src/pkg/math/atan.go
+++ b/src/pkg/math/atan.go
@@ -20,21 +20,21 @@ package math
*/
func xatan(arg float64) float64 {
const (
- P4 = .161536412982230228262e2;
- P3 = .26842548195503973794141e3;
- P2 = .11530293515404850115428136e4;
- P1 = .178040631643319697105464587e4;
- P0 = .89678597403663861959987488e3;
- Q4 = .5895697050844462222791e2;
- Q3 = .536265374031215315104235e3;
- Q2 = .16667838148816337184521798e4;
- Q1 = .207933497444540981287275926e4;
- Q0 = .89678597403663861962481162e3;
+ P4 = .161536412982230228262e2
+ P3 = .26842548195503973794141e3
+ P2 = .11530293515404850115428136e4
+ P1 = .178040631643319697105464587e4
+ P0 = .89678597403663861959987488e3
+ Q4 = .5895697050844462222791e2
+ Q3 = .536265374031215315104235e3
+ Q2 = .16667838148816337184521798e4
+ Q1 = .207933497444540981287275926e4
+ Q0 = .89678597403663861962481162e3
)
- sq := arg * arg;
- value := ((((P4*sq+P3)*sq+P2)*sq+P1)*sq + P0);
- value = value / (((((sq+Q4)*sq+Q3)*sq+Q2)*sq+Q1)*sq + Q0);
- return value * arg;
+ sq := arg * arg
+ value := ((((P4*sq+P3)*sq+P2)*sq+P1)*sq + P0)
+ value = value / (((((sq+Q4)*sq+Q3)*sq+Q2)*sq+Q1)*sq + Q0)
+ return value * arg
}
/*
@@ -48,7 +48,7 @@ func satan(arg float64) float64 {
if arg > Sqrt2+1 {
return Pi/2 - xatan(1/arg)
}
- return Pi/4 + xatan((arg-1)/(arg+1));
+ return Pi/4 + xatan((arg-1)/(arg+1))
}
/*
@@ -61,5 +61,5 @@ func Atan(x float64) float64 {
if x > 0 {
return satan(x)
}
- return -satan(-x);
+ return -satan(-x)
}
diff --git a/src/pkg/math/atan2.go b/src/pkg/math/atan2.go
index 26d3a1d68..80a28b15b 100644
--- a/src/pkg/math/atan2.go
+++ b/src/pkg/math/atan2.go
@@ -13,14 +13,14 @@ func Atan2(y, x float64) float64 {
if y >= 0 {
return Pi / 2
}
- return -Pi / 2;
+ return -Pi / 2
}
- q := Atan(y / x);
+ q := Atan(y / x)
if x < 0 {
if q <= 0 {
return q + Pi
}
- return q - Pi;
+ return q - Pi
}
- return q;
+ return q
}
diff --git a/src/pkg/math/bits.go b/src/pkg/math/bits.go
index 5372c6806..65eabfd60 100644
--- a/src/pkg/math/bits.go
+++ b/src/pkg/math/bits.go
@@ -5,32 +5,32 @@
package math
const (
- uvnan = 0x7FF0000000000001;
- uvinf = 0x7FF0000000000000;
- uvneginf = 0xFFF0000000000000;
- mask = 0x7FF;
- shift = 64 - 11 - 1;
- bias = 1022;
+ uvnan = 0x7FF0000000000001
+ uvinf = 0x7FF0000000000000
+ uvneginf = 0xFFF0000000000000
+ mask = 0x7FF
+ shift = 64 - 11 - 1
+ bias = 1022
)
// Inf returns positive infinity if sign >= 0, negative infinity if sign < 0.
func Inf(sign int) float64 {
- var v uint64;
+ var v uint64
if sign >= 0 {
v = uvinf
} else {
v = uvneginf
}
- return Float64frombits(v);
+ return Float64frombits(v)
}
// NaN returns an IEEE 754 ``not-a-number'' value.
-func NaN() float64 { return Float64frombits(uvnan) }
+func NaN() float64 { return Float64frombits(uvnan) }
// IsNaN returns whether f is an IEEE 754 ``not-a-number'' value.
func IsNaN(f float64) (is bool) {
- x := Float64bits(f);
- return uint32(x>>shift)&mask == mask && x != uvinf && x != uvneginf;
+ x := Float64bits(f)
+ return uint32(x>>shift)&mask == mask && x != uvinf && x != uvneginf
}
// IsInf returns whether f is an infinity, according to sign.
@@ -38,8 +38,8 @@ func IsNaN(f float64) (is bool) {
// If sign < 0, IsInf returns whether f is negative infinity.
// If sign == 0, IsInf returns whether f is either infinity.
func IsInf(f float64, sign int) bool {
- x := Float64bits(f);
- return sign >= 0 && x == uvinf || sign <= 0 && x == uvneginf;
+ x := Float64bits(f)
+ return sign >= 0 && x == uvinf || sign <= 0 && x == uvneginf
}
// Frexp breaks f into a normalized fraction
@@ -50,31 +50,31 @@ func Frexp(f float64) (frac float64, exp int) {
if f == 0 {
return
}
- x := Float64bits(f);
- exp = int((x>>shift)&mask) - bias;
- x &^= mask << shift;
- x |= bias << shift;
- frac = Float64frombits(x);
- return;
+ x := Float64bits(f)
+ exp = int((x>>shift)&mask) - bias
+ x &^= mask << shift
+ x |= bias << shift
+ frac = Float64frombits(x)
+ return
}
// Ldexp is the inverse of Frexp.
// It returns frac × 2<sup>exp</sup>.
func Ldexp(frac float64, exp int) float64 {
- x := Float64bits(frac);
- exp += int(x>>shift) & mask;
+ x := Float64bits(frac)
+ exp += int(x>>shift) & mask
if exp <= 0 {
- return 0 // underflow
+ return 0 // underflow
}
- if exp >= mask { // overflow
+ if exp >= mask { // overflow
if frac < 0 {
return Inf(-1)
}
- return Inf(1);
+ return Inf(1)
}
- x &^= mask << shift;
- x |= uint64(exp) << shift;
- return Float64frombits(x);
+ x &^= mask << shift
+ x |= uint64(exp) << shift
+ return Float64frombits(x)
}
// Modf returns integer and fractional floating-point numbers
@@ -83,20 +83,20 @@ func Ldexp(frac float64, exp int) float64 {
func Modf(f float64) (int float64, frac float64) {
if f < 1 {
if f < 0 {
- int, frac = Modf(-f);
- return -int, -frac;
+ int, frac = Modf(-f)
+ return -int, -frac
}
- return 0, f;
+ return 0, f
}
- x := Float64bits(f);
- e := uint(x>>shift)&mask - bias;
+ x := Float64bits(f)
+ e := uint(x>>shift)&mask - bias
// Keep the top 11+e bits, the integer part; clear the rest.
if e < 64-11 {
x &^= 1<<(64-11-e) - 1
}
- int = Float64frombits(x);
- frac = f - int;
- return;
+ int = Float64frombits(x)
+ frac = f - int
+ return
}
diff --git a/src/pkg/math/const.go b/src/pkg/math/const.go
index 68ecefaa9..965a440be 100644
--- a/src/pkg/math/const.go
+++ b/src/pkg/math/const.go
@@ -8,46 +8,46 @@ package math
// Mathematical constants.
// Reference: http://www.research.att.com/~njas/sequences/Axxxxxx
const (
- E = 2.71828182845904523536028747135266249775724709369995957496696763; // A001113
- Pi = 3.14159265358979323846264338327950288419716939937510582097494459; // A000796
- Phi = 1.61803398874989484820458683436563811772030917980576286213544862; // A001622
-
- Sqrt2 = 1.41421356237309504880168872420969807856967187537694807317667974; // A002193
- SqrtE = 1.64872127070012814684865078781416357165377610071014801157507931; // A019774
- SqrtPi = 1.77245385090551602729816748334114518279754945612238712821380779; // A002161
- SqrtPhi = 1.27201964951406896425242246173749149171560804184009624861664038; // A139339
-
- Ln2 = 0.693147180559945309417232121458176568075500134360255254120680009; // A002162
- Log2E = 1 / Ln2;
- Ln10 = 2.30258509299404568401799145468436420760110148862877297603332790; // A002392
- Log10E = 1 / Ln10;
+ E = 2.71828182845904523536028747135266249775724709369995957496696763 // A001113
+ Pi = 3.14159265358979323846264338327950288419716939937510582097494459 // A000796
+ Phi = 1.61803398874989484820458683436563811772030917980576286213544862 // A001622
+
+ Sqrt2 = 1.41421356237309504880168872420969807856967187537694807317667974 // A002193
+ SqrtE = 1.64872127070012814684865078781416357165377610071014801157507931 // A019774
+ SqrtPi = 1.77245385090551602729816748334114518279754945612238712821380779 // A002161
+ SqrtPhi = 1.27201964951406896425242246173749149171560804184009624861664038 // A139339
+
+ Ln2 = 0.693147180559945309417232121458176568075500134360255254120680009 // A002162
+ Log2E = 1 / Ln2
+ Ln10 = 2.30258509299404568401799145468436420760110148862877297603332790 // A002392
+ Log10E = 1 / Ln10
)
// Floating-point limit values.
// Max is the largest finite value representable by the type.
// Min is the smallest nonzero value representable by the type.
const (
- MaxFloat32 = 3.40282346638528859811704183484516925440e+38; /* 2^127 * (2^24 - 1) / 2^23 */
- MinFloat32 = 1.401298464324817070923729583289916131280e-45; /* 1 / 2^(127 - 1 + 23) */
+ MaxFloat32 = 3.40282346638528859811704183484516925440e+38 /* 2^127 * (2^24 - 1) / 2^23 */
+ MinFloat32 = 1.401298464324817070923729583289916131280e-45 /* 1 / 2^(127 - 1 + 23) */
- MaxFloat64 = 1.797693134862315708145274237317043567981e+308; /* 2^1023 * (2^53 - 1) / 2^52 */
- MinFloat64 = 4.940656458412465441765687928682213723651e-324; /* 1 / 2^(1023 - 1 + 52) */
+ MaxFloat64 = 1.797693134862315708145274237317043567981e+308 /* 2^1023 * (2^53 - 1) / 2^52 */
+ MinFloat64 = 4.940656458412465441765687928682213723651e-324 /* 1 / 2^(1023 - 1 + 52) */
)
// Integer limit values.
const (
- MaxInt8 = 1<<7 - 1;
- MinInt8 = -1 << 7;
- MaxInt16 = 1<<15 - 1;
- MinInt16 = -1 << 15;
- MaxInt32 = 1<<31 - 1;
- MinInt32 = -1 << 31;
- MaxInt64 = 1<<63 - 1;
- MinInt64 = -1 << 63;
- MaxUint8 = 1<<8 - 1;
- MaxUint16 = 1<<16 - 1;
- MaxUint32 = 1<<32 - 1;
- MaxUint64 = 1<<64 - 1;
+ MaxInt8 = 1<<7 - 1
+ MinInt8 = -1 << 7
+ MaxInt16 = 1<<15 - 1
+ MinInt16 = -1 << 15
+ MaxInt32 = 1<<31 - 1
+ MinInt32 = -1 << 31
+ MaxInt64 = 1<<63 - 1
+ MinInt64 = -1 << 63
+ MaxUint8 = 1<<8 - 1
+ MaxUint16 = 1<<16 - 1
+ MaxUint32 = 1<<32 - 1
+ MaxUint64 = 1<<64 - 1
)
// BUG(rsc): The manual should define the special cases for all of these functions.
diff --git a/src/pkg/math/exp.go b/src/pkg/math/exp.go
index cdee0d70a..9ad2b3877 100644
--- a/src/pkg/math/exp.go
+++ b/src/pkg/math/exp.go
@@ -90,18 +90,18 @@ package math
// Very small values underflow to 1.
func Exp(x float64) float64 {
const (
- Ln2Hi = 6.93147180369123816490e-01;
- Ln2Lo = 1.90821492927058770002e-10;
- Log2e = 1.44269504088896338700e+00;
- P1 = 1.66666666666666019037e-01; /* 0x3FC55555; 0x5555553E */
- P2 = -2.77777777770155933842e-03; /* 0xBF66C16C; 0x16BEBD93 */
- P3 = 6.61375632143793436117e-05; /* 0x3F11566A; 0xAF25DE2C */
- P4 = -1.65339022054652515390e-06; /* 0xBEBBBD41; 0xC5D26BF1 */
- P5 = 4.13813679705723846039e-08; /* 0x3E663769; 0x72BEA4D0 */
+ Ln2Hi = 6.93147180369123816490e-01
+ Ln2Lo = 1.90821492927058770002e-10
+ Log2e = 1.44269504088896338700e+00
+ P1 = 1.66666666666666019037e-01 /* 0x3FC55555; 0x5555553E */
+ P2 = -2.77777777770155933842e-03 /* 0xBF66C16C; 0x16BEBD93 */
+ P3 = 6.61375632143793436117e-05 /* 0x3F11566A; 0xAF25DE2C */
+ P4 = -1.65339022054652515390e-06 /* 0xBEBBBD41; 0xC5D26BF1 */
+ P5 = 4.13813679705723846039e-08 /* 0x3E663769; 0x72BEA4D0 */
- Overflow = 7.09782712893383973096e+02;
- Underflow = -7.45133219101941108420e+02;
- NearZero = 1.0 / (1 << 28); // 2^-28
+ Overflow = 7.09782712893383973096e+02
+ Underflow = -7.45133219101941108420e+02
+ NearZero = 1.0 / (1 << 28) // 2^-28
)
// special cases
@@ -119,21 +119,21 @@ func Exp(x float64) float64 {
}
// reduce; computed as r = hi - lo for extra precision.
- var k int;
+ var k int
switch {
case x < 0:
k = int(Log2e*x - 0.5)
case x > 0:
k = int(Log2e*x + 0.5)
}
- hi := x - float64(k)*Ln2Hi;
- lo := float64(k) * Ln2Lo;
- r := hi - lo;
+ hi := x - float64(k)*Ln2Hi
+ lo := float64(k) * Ln2Lo
+ r := hi - lo
// compute
- t := r * r;
- c := r - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
- y := 1 - ((lo - (r*c)/(2-c)) - hi);
+ t := r * r
+ c := r - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))))
+ y := 1 - ((lo - (r*c)/(2-c)) - hi)
// TODO(rsc): make sure Ldexp can handle boundary k
- return Ldexp(y, k);
+ return Ldexp(y, k)
}
diff --git a/src/pkg/math/fabs.go b/src/pkg/math/fabs.go
index 752133e0c..ca78f3b59 100644
--- a/src/pkg/math/fabs.go
+++ b/src/pkg/math/fabs.go
@@ -9,5 +9,5 @@ func Fabs(x float64) float64 {
if x < 0 {
return -x
}
- return x;
+ return x
}
diff --git a/src/pkg/math/floor.go b/src/pkg/math/floor.go
index 96532acbd..2acf1e042 100644
--- a/src/pkg/math/floor.go
+++ b/src/pkg/math/floor.go
@@ -8,15 +8,15 @@ package math
// Floor returns the greatest integer value less than or equal to x.
func Floor(x float64) float64 {
if x < 0 {
- d, fract := Modf(-x);
+ d, fract := Modf(-x)
if fract != 0.0 {
d = d + 1
}
- return -d;
+ return -d
}
- d, _ := Modf(x);
- return d;
+ d, _ := Modf(x)
+ return d
}
// Ceil returns the least integer value greater than or equal to x.
-func Ceil(x float64) float64 { return -Floor(-x) }
+func Ceil(x float64) float64 { return -Floor(-x) }
diff --git a/src/pkg/math/fmod.go b/src/pkg/math/fmod.go
index 9539b2ac1..d88ad5359 100644
--- a/src/pkg/math/fmod.go
+++ b/src/pkg/math/fmod.go
@@ -18,23 +18,23 @@ func Fmod(x, y float64) float64 {
y = -y
}
- yfr, yexp := Frexp(y);
- sign := false;
- r := x;
+ yfr, yexp := Frexp(y)
+ sign := false
+ r := x
if x < 0 {
- r = -x;
- sign = true;
+ r = -x
+ sign = true
}
for r >= y {
- rfr, rexp := Frexp(r);
+ rfr, rexp := Frexp(r)
if rfr < yfr {
rexp = rexp - 1
}
- r = r - Ldexp(y, rexp-yexp);
+ r = r - Ldexp(y, rexp-yexp)
}
if sign {
r = -r
}
- return r;
+ return r
}
diff --git a/src/pkg/math/hypot.go b/src/pkg/math/hypot.go
index 9585da4c5..4370c2295 100644
--- a/src/pkg/math/hypot.go
+++ b/src/pkg/math/hypot.go
@@ -30,20 +30,20 @@ func Hypot(p, q float64) float64 {
return 0
}
- pfac := p;
- q = q / p;
- r := q;
- p = 1;
+ pfac := p
+ q = q / p
+ r := q
+ p = 1
for {
- r = r * r;
- s := r + 4;
+ r = r * r
+ s := r + 4
if s == 4 {
return p * pfac
}
- r = r / s;
- p = p + 2*r*p;
- q = q * r;
- r = q / p;
+ r = r / s
+ p = p + 2*r*p
+ q = q * r
+ r = q / p
}
- panic("unreachable");
+ panic("unreachable")
}
diff --git a/src/pkg/math/log.go b/src/pkg/math/log.go
index e92650131..0564689f4 100644
--- a/src/pkg/math/log.go
+++ b/src/pkg/math/log.go
@@ -76,15 +76,15 @@ package math
// Log(NaN) = NaN
func Log(x float64) float64 {
const (
- Ln2Hi = 6.93147180369123816490e-01; /* 3fe62e42 fee00000 */
- Ln2Lo = 1.90821492927058770002e-10; /* 3dea39ef 35793c76 */
- L1 = 6.666666666666735130e-01; /* 3FE55555 55555593 */
- L2 = 3.999999999940941908e-01; /* 3FD99999 9997FA04 */
- L3 = 2.857142874366239149e-01; /* 3FD24924 94229359 */
- L4 = 2.222219843214978396e-01; /* 3FCC71C5 1D8E78AF */
- L5 = 1.818357216161805012e-01; /* 3FC74664 96CB03DE */
- L6 = 1.531383769920937332e-01; /* 3FC39A09 D078C69F */
- L7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
+ Ln2Hi = 6.93147180369123816490e-01 /* 3fe62e42 fee00000 */
+ Ln2Lo = 1.90821492927058770002e-10 /* 3dea39ef 35793c76 */
+ L1 = 6.666666666666735130e-01 /* 3FE55555 55555593 */
+ L2 = 3.999999999940941908e-01 /* 3FD99999 9997FA04 */
+ L3 = 2.857142874366239149e-01 /* 3FD24924 94229359 */
+ L4 = 2.222219843214978396e-01 /* 3FCC71C5 1D8E78AF */
+ L5 = 1.818357216161805012e-01 /* 3FC74664 96CB03DE */
+ L6 = 1.531383769920937332e-01 /* 3FC39A09 D078C69F */
+ L7 = 1.479819860511658591e-01 /* 3FC2F112 DF3E5244 */
)
// special cases
@@ -98,23 +98,23 @@ func Log(x float64) float64 {
}
// reduce
- f1, ki := Frexp(x);
+ f1, ki := Frexp(x)
if f1 < Sqrt2/2 {
- f1 *= 2;
- ki--;
+ f1 *= 2
+ ki--
}
- f := f1 - 1;
- k := float64(ki);
+ f := f1 - 1
+ k := float64(ki)
// compute
- s := f / (2 + f);
- s2 := s * s;
- s4 := s2 * s2;
- t1 := s2 * (L1 + s4*(L3+s4*(L5+s4*L7)));
- t2 := s4 * (L2 + s4*(L4+s4*L6));
- R := t1 + t2;
- hfsq := 0.5 * f * f;
- return k*Ln2Hi - ((hfsq - (s*(hfsq+R) + k*Ln2Lo)) - f);
+ s := f / (2 + f)
+ s2 := s * s
+ s4 := s2 * s2
+ t1 := s2 * (L1 + s4*(L3+s4*(L5+s4*L7)))
+ t2 := s4 * (L2 + s4*(L4+s4*L6))
+ R := t1 + t2
+ hfsq := 0.5 * f * f
+ return k*Ln2Hi - ((hfsq - (s*(hfsq+R) + k*Ln2Lo)) - f)
}
// Log10 returns the decimal logarithm of x.
@@ -123,5 +123,5 @@ func Log10(x float64) float64 {
if x <= 0 {
return NaN()
}
- return Log(x) * (1 / Ln10);
+ return Log(x) * (1 / Ln10)
}
diff --git a/src/pkg/math/pow.go b/src/pkg/math/pow.go
index c91dc44ec..42a968d39 100644
--- a/src/pkg/math/pow.go
+++ b/src/pkg/math/pow.go
@@ -23,13 +23,13 @@ func Pow(x, y float64) float64 {
return 1 / Sqrt(x)
}
- absy := y;
- flip := false;
+ absy := y
+ flip := false
if absy < 0 {
- absy = -absy;
- flip = true;
+ absy = -absy
+ flip = true
}
- yi, yf := Modf(absy);
+ yi, yf := Modf(absy)
if yf != 0 && x < 0 {
return NaN()
}
@@ -38,33 +38,33 @@ func Pow(x, y float64) float64 {
}
// ans = a1 * 2^ae (= 1 for now).
- a1 := float64(1);
- ae := 0;
+ a1 := float64(1)
+ ae := 0
// ans *= x^yf
if yf != 0 {
if yf > 0.5 {
- yf--;
- yi++;
+ yf--
+ yi++
}
- a1 = Exp(yf * Log(x));
+ a1 = Exp(yf * Log(x))
}
// ans *= x^yi
// by multiplying in successive squarings
// of x according to bits of yi.
// accumulate powers of two into exp.
- x1, xe := Frexp(x);
+ x1, xe := Frexp(x)
for i := int64(yi); i != 0; i >>= 1 {
if i&1 == 1 {
- a1 *= x1;
- ae += xe;
+ a1 *= x1
+ ae += xe
}
- x1 *= x1;
- xe <<= 1;
+ x1 *= x1
+ xe <<= 1
if x1 < .5 {
- x1 += x1;
- xe--;
+ x1 += x1
+ xe--
}
}
@@ -72,8 +72,8 @@ func Pow(x, y float64) float64 {
// if flip { ans = 1 / ans }
// but in the opposite order
if flip {
- a1 = 1 / a1;
- ae = -ae;
+ a1 = 1 / a1
+ ae = -ae
}
- return Ldexp(a1, ae);
+ return Ldexp(a1, ae)
}
diff --git a/src/pkg/math/pow10.go b/src/pkg/math/pow10.go
index edba40a7b..99b318e78 100644
--- a/src/pkg/math/pow10.go
+++ b/src/pkg/math/pow10.go
@@ -23,15 +23,15 @@ func Pow10(e int) float64 {
if e < len(pow10tab) {
return pow10tab[e]
}
- m := e / 2;
- return Pow10(m) * Pow10(e-m);
+ m := e / 2
+ return Pow10(m) * Pow10(e-m)
}
func init() {
- pow10tab[0] = 1.0e0;
- pow10tab[1] = 1.0e1;
+ pow10tab[0] = 1.0e0
+ pow10tab[1] = 1.0e1
for i := 2; i < len(pow10tab); i++ {
- m := i / 2;
- pow10tab[i] = pow10tab[m] * pow10tab[i-m];
+ m := i / 2
+ pow10tab[i] = pow10tab[m] * pow10tab[i-m]
}
}
diff --git a/src/pkg/math/sin.go b/src/pkg/math/sin.go
index 25f676355..e17daf688 100644
--- a/src/pkg/math/sin.go
+++ b/src/pkg/math/sin.go
@@ -8,32 +8,32 @@ package math
func sinus(x float64, quad int) float64 {
// Coefficients are #3370 from Hart & Cheney (18.80D).
const (
- P0 = .1357884097877375669092680e8;
- P1 = -.4942908100902844161158627e7;
- P2 = .4401030535375266501944918e6;
- P3 = -.1384727249982452873054457e5;
- P4 = .1459688406665768722226959e3;
- Q0 = .8644558652922534429915149e7;
- Q1 = .4081792252343299749395779e6;
- Q2 = .9463096101538208180571257e4;
- Q3 = .1326534908786136358911494e3;
+ P0 = .1357884097877375669092680e8
+ P1 = -.4942908100902844161158627e7
+ P2 = .4401030535375266501944918e6
+ P3 = -.1384727249982452873054457e5
+ P4 = .1459688406665768722226959e3
+ Q0 = .8644558652922534429915149e7
+ Q1 = .4081792252343299749395779e6
+ Q2 = .9463096101538208180571257e4
+ Q3 = .1326534908786136358911494e3
)
if x < 0 {
- x = -x;
- quad = quad + 2;
+ x = -x
+ quad = quad + 2
}
- x = x * (2 / Pi); /* underflow? */
- var y float64;
+ x = x * (2 / Pi) /* underflow? */
+ var y float64
if x > 32764 {
- var e float64;
- e, y = Modf(x);
- e = e + float64(quad);
- f, _ := Modf(0.25 * e);
- quad = int(e - 4*f);
+ var e float64
+ e, y = Modf(x)
+ e = e + float64(quad)
+ f, _ := Modf(0.25 * e)
+ quad = int(e - 4*f)
} else {
- k := int32(x);
- y = x - float64(k);
- quad = (quad + int(k)) & 3;
+ k := int32(x)
+ y = x - float64(k)
+ quad = (quad + int(k)) & 3
}
if quad&1 != 0 {
@@ -43,10 +43,10 @@ func sinus(x float64, quad int) float64 {
y = -y
}
- yy := y * y;
- temp1 := ((((P4*yy+P3)*yy+P2)*yy+P1)*yy + P0) * y;
- temp2 := ((((yy+Q3)*yy+Q2)*yy+Q1)*yy + Q0);
- return temp1 / temp2;
+ yy := y * y
+ temp1 := ((((P4*yy+P3)*yy+P2)*yy+P1)*yy + P0) * y
+ temp2 := ((((yy+Q3)*yy+Q2)*yy+Q1)*yy + Q0)
+ return temp1 / temp2
}
// Cos returns the cosine of x.
@@ -54,8 +54,8 @@ func Cos(x float64) float64 {
if x < 0 {
x = -x
}
- return sinus(x, 1);
+ return sinus(x, 1)
}
// Sin returns the sine of x.
-func Sin(x float64) float64 { return sinus(x, 0) }
+func Sin(x float64) float64 { return sinus(x, 0) }
diff --git a/src/pkg/math/sinh.go b/src/pkg/math/sinh.go
index 968b89b6d..8d70cd3dd 100644
--- a/src/pkg/math/sinh.go
+++ b/src/pkg/math/sinh.go
@@ -21,22 +21,22 @@ package math
func Sinh(x float64) float64 {
// The coefficients are #2029 from Hart & Cheney. (20.36D)
const (
- P0 = -0.6307673640497716991184787251e+6;
- P1 = -0.8991272022039509355398013511e+5;
- P2 = -0.2894211355989563807284660366e+4;
- P3 = -0.2630563213397497062819489e+2;
- Q0 = -0.6307673640497716991212077277e+6;
- Q1 = 0.1521517378790019070696485176e+5;
- Q2 = -0.173678953558233699533450911e+3;
+ P0 = -0.6307673640497716991184787251e+6
+ P1 = -0.8991272022039509355398013511e+5
+ P2 = -0.2894211355989563807284660366e+4
+ P3 = -0.2630563213397497062819489e+2
+ Q0 = -0.6307673640497716991212077277e+6
+ Q1 = 0.1521517378790019070696485176e+5
+ Q2 = -0.173678953558233699533450911e+3
)
- sign := false;
+ sign := false
if x < 0 {
- x = -x;
- sign = true;
+ x = -x
+ sign = true
}
- var temp float64;
+ var temp float64
switch true {
case x > 21:
temp = Exp(x) / 2
@@ -45,15 +45,15 @@ func Sinh(x float64) float64 {
temp = (Exp(x) - Exp(-x)) / 2
default:
- sq := x * x;
- temp = (((P3*sq+P2)*sq+P1)*sq + P0) * x;
- temp = temp / (((sq+Q2)*sq+Q1)*sq + Q0);
+ sq := x * x
+ temp = (((P3*sq+P2)*sq+P1)*sq + P0) * x
+ temp = temp / (((sq+Q2)*sq+Q1)*sq + Q0)
}
if sign {
temp = -temp
}
- return temp;
+ return temp
}
// Cosh returns the hyperbolic cosine of x.
@@ -64,5 +64,5 @@ func Cosh(x float64) float64 {
if x > 21 {
return Exp(x) / 2
}
- return (Exp(x) + Exp(-x)) / 2;
+ return (Exp(x) + Exp(-x)) / 2
}
diff --git a/src/pkg/math/sqrt.go b/src/pkg/math/sqrt.go
index 63f458b4b..1e2209f2a 100644
--- a/src/pkg/math/sqrt.go
+++ b/src/pkg/math/sqrt.go
@@ -27,39 +27,39 @@ func Sqrt(x float64) float64 {
if x < 0 {
return NaN()
}
- return 0;
+ return 0
}
- y, exp := Frexp(x);
+ y, exp := Frexp(x)
for y < 0.5 {
- y = y * 2;
- exp = exp - 1;
+ y = y * 2
+ exp = exp - 1
}
if exp&1 != 0 {
- y = y * 2;
- exp = exp - 1;
+ y = y * 2
+ exp = exp - 1
}
- temp := 0.5 * (1 + y);
+ temp := 0.5 * (1 + y)
for exp > 60 {
- temp = temp * float64(1<<30);
- exp = exp - 60;
+ temp = temp * float64(1<<30)
+ exp = exp - 60
}
for exp < -60 {
- temp = temp / float64(1<<30);
- exp = exp + 60;
+ temp = temp / float64(1<<30)
+ exp = exp + 60
}
if exp >= 0 {
- exp = 1 << uint(exp/2);
- temp = temp * float64(exp);
+ exp = 1 << uint(exp/2)
+ temp = temp * float64(exp)
} else {
- exp = 1 << uint(-exp/2);
- temp = temp / float64(exp);
+ exp = 1 << uint(-exp/2)
+ temp = temp / float64(exp)
}
for i := 0; i <= 4; i++ {
temp = 0.5 * (temp + x/temp)
}
- return temp;
+ return temp
}
diff --git a/src/pkg/math/tan.go b/src/pkg/math/tan.go
index 09ade2da9..05ba232a7 100644
--- a/src/pkg/math/tan.go
+++ b/src/pkg/math/tan.go
@@ -13,53 +13,53 @@ package math
func Tan(x float64) float64 {
// Coefficients are #4285 from Hart & Cheney. (19.74D)
const (
- P0 = -.1306820264754825668269611177e+5;
- P1 = .1055970901714953193602353981e+4;
- P2 = -.1550685653483266376941705728e+2;
- P3 = .3422554387241003435328470489e-1;
- P4 = .3386638642677172096076369e-4;
- Q0 = -.1663895238947119001851464661e+5;
- Q1 = .4765751362916483698926655581e+4;
- Q2 = -.1555033164031709966900124574e+3;
+ P0 = -.1306820264754825668269611177e+5
+ P1 = .1055970901714953193602353981e+4
+ P2 = -.1550685653483266376941705728e+2
+ P3 = .3422554387241003435328470489e-1
+ P4 = .3386638642677172096076369e-4
+ Q0 = -.1663895238947119001851464661e+5
+ Q1 = .4765751362916483698926655581e+4
+ Q2 = -.1555033164031709966900124574e+3
)
- flag := false;
- sign := false;
+ flag := false
+ sign := false
if x < 0 {
- x = -x;
- sign = true;
+ x = -x
+ sign = true
}
- x = x * (4 / Pi); /* overflow? */
- var e float64;
- e, x = Modf(x);
- i := int32(e);
+ x = x * (4 / Pi) /* overflow? */
+ var e float64
+ e, x = Modf(x)
+ i := int32(e)
switch i & 3 {
case 1:
- x = 1 - x;
- flag = true;
+ x = 1 - x
+ flag = true
case 2:
- sign = !sign;
- flag = true;
+ sign = !sign
+ flag = true
case 3:
- x = 1 - x;
- sign = !sign;
+ x = 1 - x
+ sign = !sign
}
- xsq := x * x;
- temp := ((((P4*xsq+P3)*xsq+P2)*xsq+P1)*xsq + P0) * x;
- temp = temp / (((xsq+Q2)*xsq+Q1)*xsq + Q0);
+ xsq := x * x
+ temp := ((((P4*xsq+P3)*xsq+P2)*xsq+P1)*xsq + P0) * x
+ temp = temp / (((xsq+Q2)*xsq+Q1)*xsq + Q0)
if flag {
if temp == 0 {
panic(NaN())
}
- temp = 1 / temp;
+ temp = 1 / temp
}
if sign {
temp = -temp
}
- return temp;
+ return temp
}
diff --git a/src/pkg/math/tanh.go b/src/pkg/math/tanh.go
index 93c68a6e4..144c08530 100644
--- a/src/pkg/math/tanh.go
+++ b/src/pkg/math/tanh.go
@@ -16,14 +16,14 @@ package math
// Tanh computes the hyperbolic tangent of x.
func Tanh(x float64) float64 {
if x < 0 {
- x = -x;
+ x = -x
if x > 21 {
return -1
}
- return -Sinh(x) / Cosh(x);
+ return -Sinh(x) / Cosh(x)
}
if x > 21 {
return 1
}
- return Sinh(x) / Cosh(x);
+ return Sinh(x) / Cosh(x)
}
diff --git a/src/pkg/math/unsafe.go b/src/pkg/math/unsafe.go
index 182b2e13b..5ae67420f 100644
--- a/src/pkg/math/unsafe.go
+++ b/src/pkg/math/unsafe.go
@@ -7,15 +7,15 @@ package math
import "unsafe"
// Float32bits returns the IEEE 754 binary representation of f.
-func Float32bits(f float32) uint32 { return *(*uint32)(unsafe.Pointer(&f)) }
+func Float32bits(f float32) uint32 { return *(*uint32)(unsafe.Pointer(&f)) }
// Float32frombits returns the floating point number corresponding
// to the IEEE 754 binary representation b.
-func Float32frombits(b uint32) float32 { return *(*float32)(unsafe.Pointer(&b)) }
+func Float32frombits(b uint32) float32 { return *(*float32)(unsafe.Pointer(&b)) }
// Float64bits returns the IEEE 754 binary representation of f.
-func Float64bits(f float64) uint64 { return *(*uint64)(unsafe.Pointer(&f)) }
+func Float64bits(f float64) uint64 { return *(*uint64)(unsafe.Pointer(&f)) }
// Float64frombits returns the floating point number corresponding
// the IEEE 754 binary representation b.
-func Float64frombits(b uint64) float64 { return *(*float64)(unsafe.Pointer(&b)) }
+func Float64frombits(b uint64) float64 { return *(*float64)(unsafe.Pointer(&b)) }
diff --git a/src/pkg/net/dialgoogle_test.go b/src/pkg/net/dialgoogle_test.go
index 932dd8cda..dfcc8f01e 100644
--- a/src/pkg/net/dialgoogle_test.go
+++ b/src/pkg/net/dialgoogle_test.go
@@ -5,11 +5,11 @@
package net
import (
- "flag";
- "io";
- "strings";
- "syscall";
- "testing";
+ "flag"
+ "io"
+ "strings"
+ "syscall"
+ "testing"
)
// If an IPv6 tunnel is running (see go/stubl), we can try dialing a real IPv6 address.
@@ -18,26 +18,26 @@ var ipv6 = flag.Bool("ipv6", false, "assume ipv6 tunnel is present")
// fd is already connected to the destination, port 80.
// Run an HTTP request to fetch the appropriate page.
func fetchGoogle(t *testing.T, fd Conn, network, addr string) {
- req := strings.Bytes("GET /intl/en/privacy.html HTTP/1.0\r\nHost: www.google.com\r\n\r\n");
- n, err := fd.Write(req);
+ req := strings.Bytes("GET /intl/en/privacy.html HTTP/1.0\r\nHost: www.google.com\r\n\r\n")
+ n, err := fd.Write(req)
- buf := make([]byte, 1000);
- n, err = io.ReadFull(fd, buf);
+ buf := make([]byte, 1000)
+ n, err = io.ReadFull(fd, buf)
if n < 1000 {
- t.Errorf("fetchGoogle: short HTTP read from %s %s - %v", network, addr, err);
- return;
+ t.Errorf("fetchGoogle: short HTTP read from %s %s - %v", network, addr, err)
+ return
}
}
func doDial(t *testing.T, network, addr string) {
- fd, err := Dial(network, "", addr);
+ fd, err := Dial(network, "", addr)
if err != nil {
- t.Errorf("Dial(%q, %q, %q) = _, %v", network, "", addr, err);
- return;
+ t.Errorf("Dial(%q, %q, %q) = _, %v", network, "", addr, err)
+ return
}
- fetchGoogle(t, fd, network, addr);
- fd.Close();
+ fetchGoogle(t, fd, network, addr)
+ fd.Close()
}
var googleaddrs = []string{
@@ -51,7 +51,7 @@ var googleaddrs = []string{
"[0:0:0:0:0000:ffff:74.125.19.99]:80",
"[0:0:0:0:000000:ffff:74.125.19.99]:80",
"[0:0:0:0:0:ffff::74.125.19.99]:80",
- "[2001:4860:0:2001::68]:80", // ipv6.google.com; removed if ipv6 flag not set
+ "[2001:4860:0:2001::68]:80", // ipv6.google.com; removed if ipv6 flag not set
}
func TestDialGoogle(t *testing.T) {
@@ -61,22 +61,22 @@ func TestDialGoogle(t *testing.T) {
}
for i := 0; i < len(googleaddrs); i++ {
- addr := googleaddrs[i];
+ addr := googleaddrs[i]
if addr == "" {
continue
}
- t.Logf("-- %s --", addr);
- doDial(t, "tcp", addr);
+ t.Logf("-- %s --", addr)
+ doDial(t, "tcp", addr)
if addr[0] != '[' {
- doDial(t, "tcp4", addr);
+ doDial(t, "tcp4", addr)
if !preferIPv4 {
// make sure preferIPv4 flag works.
- preferIPv4 = true;
- syscall.SocketDisableIPv6 = true;
- doDial(t, "tcp4", addr);
- syscall.SocketDisableIPv6 = false;
- preferIPv4 = false;
+ preferIPv4 = true
+ syscall.SocketDisableIPv6 = true
+ doDial(t, "tcp4", addr)
+ syscall.SocketDisableIPv6 = false
+ preferIPv4 = false
}
}
diff --git a/src/pkg/net/dnsclient.go b/src/pkg/net/dnsclient.go
index 064e1017b..439cae806 100644
--- a/src/pkg/net/dnsclient.go
+++ b/src/pkg/net/dnsclient.go
@@ -15,24 +15,24 @@
package net
import (
- "once";
- "os";
+ "once"
+ "os"
)
// DNSError represents a DNS lookup error.
type DNSError struct {
- Error string; // description of the error
- Name string; // name looked for
- Server string; // server used
+ Error string // description of the error
+ Name string // name looked for
+ Server string // server used
}
func (e *DNSError) String() string {
- s := "lookup " + e.Name;
+ s := "lookup " + e.Name
if e.Server != "" {
s += " on " + e.Server
}
- s += ": " + e.Error;
- return s;
+ s += ": " + e.Error
+ return s
}
const noSuchHost = "no such host"
@@ -43,53 +43,53 @@ func _Exchange(cfg *_DNS_Config, c Conn, name string) (m *_DNS_Msg, err os.Error
if len(name) >= 256 {
return nil, &DNSError{"name too long", name, ""}
}
- out := new(_DNS_Msg);
- out.id = 0x1234;
+ out := new(_DNS_Msg)
+ out.id = 0x1234
out.question = []_DNS_Question{
_DNS_Question{name, _DNS_TypeA, _DNS_ClassINET},
- };
- out.recursion_desired = true;
- msg, ok := out.Pack();
+ }
+ out.recursion_desired = true
+ msg, ok := out.Pack()
if !ok {
return nil, &DNSError{"internal error - cannot pack message", name, ""}
}
for attempt := 0; attempt < cfg.attempts; attempt++ {
- n, err := c.Write(msg);
+ n, err := c.Write(msg)
if err != nil {
return nil, err
}
- c.SetReadTimeout(1e9); // nanoseconds
+ c.SetReadTimeout(1e9) // nanoseconds
- buf := make([]byte, 2000); // More than enough.
- n, err = c.Read(buf);
+ buf := make([]byte, 2000) // More than enough.
+ n, err = c.Read(buf)
if isEAGAIN(err) {
- err = nil;
- continue;
+ err = nil
+ continue
}
if err != nil {
return nil, err
}
- buf = buf[0:n];
- in := new(_DNS_Msg);
+ buf = buf[0:n]
+ in := new(_DNS_Msg)
if !in.Unpack(buf) || in.id != out.id {
continue
}
- return in, nil;
+ return in, nil
}
- var server string;
+ var server string
if a := c.RemoteAddr(); a != nil {
server = a.String()
}
- return nil, &DNSError{"no answer from server", name, server};
+ return nil, &DNSError{"no answer from server", name, server}
}
// Find answer for name in dns message.
// On return, if err == nil, addrs != nil.
func answer(name, server string, dns *_DNS_Msg) (addrs []string, err *DNSError) {
- addrs = make([]string, 0, len(dns.answer));
+ addrs = make([]string, 0, len(dns.answer))
if dns.rcode == _DNS_RcodeNameError && dns.recursion_available {
return nil, &DNSError{noSuchHost, name, ""}
@@ -109,31 +109,31 @@ func answer(name, server string, dns *_DNS_Msg) (addrs []string, err *DNSError)
// all the answers we need in this one packet.
Cname:
for cnameloop := 0; cnameloop < 10; cnameloop++ {
- addrs = addrs[0:0];
+ addrs = addrs[0:0]
for i := 0; i < len(dns.answer); i++ {
- rr := dns.answer[i];
- h := rr.Header();
+ rr := dns.answer[i]
+ h := rr.Header()
if h.Class == _DNS_ClassINET && h.Name == name {
switch h.Rrtype {
case _DNS_TypeA:
- n := len(addrs);
- a := rr.(*_DNS_RR_A).A;
- addrs = addrs[0 : n+1];
- addrs[n] = IPv4(byte(a>>24), byte(a>>16), byte(a>>8), byte(a)).String();
+ n := len(addrs)
+ a := rr.(*_DNS_RR_A).A
+ addrs = addrs[0 : n+1]
+ addrs[n] = IPv4(byte(a>>24), byte(a>>16), byte(a>>8), byte(a)).String()
case _DNS_TypeCNAME:
// redirect to cname
- name = rr.(*_DNS_RR_CNAME).Cname;
- continue Cname;
+ name = rr.(*_DNS_RR_CNAME).Cname
+ continue Cname
}
}
}
if len(addrs) == 0 {
return nil, &DNSError{noSuchHost, name, server}
}
- return addrs, nil;
+ return addrs, nil
}
- return nil, &DNSError{"too many redirects", name, server};
+ return nil, &DNSError{"too many redirects", name, server}
}
// Do a lookup for a single name, which must be rooted
@@ -149,36 +149,36 @@ func tryOneName(cfg *_DNS_Config, name string) (addrs []string, err os.Error) {
// The DNS config parser has already checked that
// all the cfg.servers[i] are IP addresses, which
// Dial will use without a DNS lookup.
- server := cfg.servers[i] + ":53";
- c, cerr := Dial("udp", "", server);
+ server := cfg.servers[i] + ":53"
+ c, cerr := Dial("udp", "", server)
if cerr != nil {
- err = cerr;
- continue;
+ err = cerr
+ continue
}
- msg, merr := _Exchange(cfg, c, name);
- c.Close();
+ msg, merr := _Exchange(cfg, c, name)
+ c.Close()
if merr != nil {
- err = merr;
- continue;
+ err = merr
+ continue
}
- var dnserr *DNSError;
- addrs, dnserr = answer(name, server, msg);
+ var dnserr *DNSError
+ addrs, dnserr = answer(name, server, msg)
if dnserr != nil {
err = dnserr
} else {
- err = nil // nil os.Error, not nil *DNSError
+ err = nil // nil os.Error, not nil *DNSError
}
if dnserr == nil || dnserr.Error == noSuchHost {
break
}
}
- return;
+ return
}
var cfg *_DNS_Config
var dnserr os.Error
-func loadConfig() { cfg, dnserr = _DNS_ReadConfig() }
+func loadConfig() { cfg, dnserr = _DNS_ReadConfig() }
func isDomainName(s string) bool {
// Requirements on DNS name:
@@ -192,14 +192,14 @@ func isDomainName(s string) bool {
if len(s) == 0 {
return false
}
- if s[len(s)-1] != '.' { // simplify checking loop: make name end in dot
+ if s[len(s)-1] != '.' { // simplify checking loop: make name end in dot
s += "."
}
- last := byte('.');
- ok := false; // ok once we've seen a letter
+ last := byte('.')
+ ok := false // ok once we've seen a letter
for i := 0; i < len(s); i++ {
- c := s[i];
+ c := s[i]
switch {
default:
return false
@@ -218,10 +218,10 @@ func isDomainName(s string) bool {
return false
}
}
- last = c;
+ last = c
}
- return ok;
+ return ok
}
// LookupHost looks up the host name using the local DNS resolver.
@@ -231,25 +231,25 @@ func LookupHost(name string) (cname string, addrs []string, err os.Error) {
if !isDomainName(name) {
return name, nil, &DNSError{"invalid domain name", name, ""}
}
- once.Do(loadConfig);
+ once.Do(loadConfig)
if dnserr != nil || cfg == nil {
- err = dnserr;
- return;
+ err = dnserr
+ return
}
// If name is rooted (trailing dot) or has enough dots,
// try it by itself first.
- rooted := len(name) > 0 && name[len(name)-1] == '.';
+ rooted := len(name) > 0 && name[len(name)-1] == '.'
if rooted || count(name, '.') >= cfg.ndots {
- rname := name;
+ rname := name
if !rooted {
rname += "."
}
// Can try as ordinary name.
- addrs, err = tryOneName(cfg, rname);
+ addrs, err = tryOneName(cfg, rname)
if err == nil {
- cname = rname;
- return;
+ cname = rname
+ return
}
}
if rooted {
@@ -258,26 +258,26 @@ func LookupHost(name string) (cname string, addrs []string, err os.Error) {
// Otherwise, try suffixes.
for i := 0; i < len(cfg.search); i++ {
- rname := name + "." + cfg.search[i];
+ rname := name + "." + cfg.search[i]
if rname[len(rname)-1] != '.' {
rname += "."
}
- addrs, err = tryOneName(cfg, rname);
+ addrs, err = tryOneName(cfg, rname)
if err == nil {
- cname = rname;
- return;
+ cname = rname
+ return
}
}
// Last ditch effort: try unsuffixed.
- rname := name;
+ rname := name
if !rooted {
rname += "."
}
- addrs, err = tryOneName(cfg, rname);
+ addrs, err = tryOneName(cfg, rname)
if err == nil {
- cname = rname;
- return;
+ cname = rname
+ return
}
- return;
+ return
}
diff --git a/src/pkg/net/dnsconfig.go b/src/pkg/net/dnsconfig.go
index 243a4b431..b2153e07d 100644
--- a/src/pkg/net/dnsconfig.go
+++ b/src/pkg/net/dnsconfig.go
@@ -9,12 +9,12 @@ package net
import "os"
type _DNS_Config struct {
- servers []string; // servers to use
- search []string; // suffixes to append to local name
- ndots int; // number of dots in name to trigger absolute lookup
- timeout int; // seconds before giving up on packet
- attempts int; // lost packets before giving up on server
- rotate bool; // round robin among servers
+ servers []string // servers to use
+ search []string // suffixes to append to local name
+ ndots int // number of dots in name to trigger absolute lookup
+ timeout int // seconds before giving up on packet
+ attempts int // lost packets before giving up on server
+ rotate bool // round robin among servers
}
var _DNS_configError os.Error
@@ -24,81 +24,81 @@ var _DNS_configError os.Error
// of the host name to get the default search domain.
// We assume it's in resolv.conf anyway.
func _DNS_ReadConfig() (*_DNS_Config, os.Error) {
- file, err := open("/etc/resolv.conf");
+ file, err := open("/etc/resolv.conf")
if err != nil {
return nil, err
}
- conf := new(_DNS_Config);
- conf.servers = make([]string, 3)[0:0]; // small, but the standard limit
- conf.search = make([]string, 0);
- conf.ndots = 1;
- conf.timeout = 1;
- conf.attempts = 1;
- conf.rotate = false;
+ conf := new(_DNS_Config)
+ conf.servers = make([]string, 3)[0:0] // small, but the standard limit
+ conf.search = make([]string, 0)
+ conf.ndots = 1
+ conf.timeout = 1
+ conf.attempts = 1
+ conf.rotate = false
for line, ok := file.readLine(); ok; line, ok = file.readLine() {
- f := getFields(line);
+ f := getFields(line)
if len(f) < 1 {
continue
}
switch f[0] {
- case "nameserver": // add one name server
- a := conf.servers;
- n := len(a);
+ case "nameserver": // add one name server
+ a := conf.servers
+ n := len(a)
if len(f) > 1 && n < cap(a) {
// One more check: make sure server name is
// just an IP address. Otherwise we need DNS
// to look it up.
- name := f[1];
+ name := f[1]
if len(ParseIP(name)) != 0 {
- a = a[0 : n+1];
- a[n] = name;
- conf.servers = a;
+ a = a[0 : n+1]
+ a[n] = name
+ conf.servers = a
}
}
- case "domain": // set search path to just this domain
+ case "domain": // set search path to just this domain
if len(f) > 1 {
- conf.search = make([]string, 1);
- conf.search[0] = f[1];
+ conf.search = make([]string, 1)
+ conf.search[0] = f[1]
} else {
conf.search = make([]string, 0)
}
- case "search": // set search path to given servers
- conf.search = make([]string, len(f)-1);
+ case "search": // set search path to given servers
+ conf.search = make([]string, len(f)-1)
for i := 0; i < len(conf.search); i++ {
conf.search[i] = f[i+1]
}
- case "options": // magic options
+ case "options": // magic options
for i := 1; i < len(f); i++ {
- s := f[i];
+ s := f[i]
switch {
case len(s) >= 6 && s[0:6] == "ndots:":
- n, _, _ := dtoi(s, 6);
+ n, _, _ := dtoi(s, 6)
if n < 1 {
n = 1
}
- conf.ndots = n;
+ conf.ndots = n
case len(s) >= 8 && s[0:8] == "timeout:":
- n, _, _ := dtoi(s, 8);
+ n, _, _ := dtoi(s, 8)
if n < 1 {
n = 1
}
- conf.timeout = n;
+ conf.timeout = n
case len(s) >= 8 && s[0:9] == "attempts:":
- n, _, _ := dtoi(s, 9);
+ n, _, _ := dtoi(s, 9)
if n < 1 {
n = 1
}
- conf.attempts = n;
+ conf.attempts = n
case s == "rotate":
conf.rotate = true
}
}
}
}
- file.close();
+ file.close()
- return conf, nil;
+ return conf, nil
}
diff --git a/src/pkg/net/dnsmsg.go b/src/pkg/net/dnsmsg.go
index 2bcb88206..01bb49078 100644
--- a/src/pkg/net/dnsmsg.go
+++ b/src/pkg/net/dnsmsg.go
@@ -24,9 +24,9 @@
package net
import (
- "fmt";
- "os";
- "reflect";
+ "fmt"
+ "os"
+ "reflect"
)
// Packet formats
@@ -34,77 +34,77 @@ import (
// Wire constants.
const (
// valid _DNS_RR_Header.Rrtype and _DNS_Question.qtype
- _DNS_TypeA = 1;
- _DNS_TypeNS = 2;
- _DNS_TypeMD = 3;
- _DNS_TypeMF = 4;
- _DNS_TypeCNAME = 5;
- _DNS_TypeSOA = 6;
- _DNS_TypeMB = 7;
- _DNS_TypeMG = 8;
- _DNS_TypeMR = 9;
- _DNS_TypeNULL = 10;
- _DNS_TypeWKS = 11;
- _DNS_TypePTR = 12;
- _DNS_TypeHINFO = 13;
- _DNS_TypeMINFO = 14;
- _DNS_TypeMX = 15;
- _DNS_TypeTXT = 16;
+ _DNS_TypeA = 1
+ _DNS_TypeNS = 2
+ _DNS_TypeMD = 3
+ _DNS_TypeMF = 4
+ _DNS_TypeCNAME = 5
+ _DNS_TypeSOA = 6
+ _DNS_TypeMB = 7
+ _DNS_TypeMG = 8
+ _DNS_TypeMR = 9
+ _DNS_TypeNULL = 10
+ _DNS_TypeWKS = 11
+ _DNS_TypePTR = 12
+ _DNS_TypeHINFO = 13
+ _DNS_TypeMINFO = 14
+ _DNS_TypeMX = 15
+ _DNS_TypeTXT = 16
// valid _DNS_Question.qtype only
- _DNS_TypeAXFR = 252;
- _DNS_TypeMAILB = 253;
- _DNS_TypeMAILA = 254;
- _DNS_TypeALL = 255;
+ _DNS_TypeAXFR = 252
+ _DNS_TypeMAILB = 253
+ _DNS_TypeMAILA = 254
+ _DNS_TypeALL = 255
// valid _DNS_Question.qclass
- _DNS_ClassINET = 1;
- _DNS_ClassCSNET = 2;
- _DNS_ClassCHAOS = 3;
- _DNS_ClassHESIOD = 4;
- _DNS_ClassANY = 255;
+ _DNS_ClassINET = 1
+ _DNS_ClassCSNET = 2
+ _DNS_ClassCHAOS = 3
+ _DNS_ClassHESIOD = 4
+ _DNS_ClassANY = 255
// _DNS_Msg.rcode
- _DNS_RcodeSuccess = 0;
- _DNS_RcodeFormatError = 1;
- _DNS_RcodeServerFailure = 2;
- _DNS_RcodeNameError = 3;
- _DNS_RcodeNotImplemented = 4;
- _DNS_RcodeRefused = 5;
+ _DNS_RcodeSuccess = 0
+ _DNS_RcodeFormatError = 1
+ _DNS_RcodeServerFailure = 2
+ _DNS_RcodeNameError = 3
+ _DNS_RcodeNotImplemented = 4
+ _DNS_RcodeRefused = 5
)
// The wire format for the DNS packet header.
type __DNS_Header struct {
- Id uint16;
- Bits uint16;
- Qdcount, Ancount, Nscount, Arcount uint16;
+ Id uint16
+ Bits uint16
+ Qdcount, Ancount, Nscount, Arcount uint16
}
const (
// __DNS_Header.Bits
- _QR = 1 << 15; // query/response (response=1)
- _AA = 1 << 10; // authoritative
- _TC = 1 << 9; // truncated
- _RD = 1 << 8; // recursion desired
- _RA = 1 << 7; // recursion available
+ _QR = 1 << 15 // query/response (response=1)
+ _AA = 1 << 10 // authoritative
+ _TC = 1 << 9 // truncated
+ _RD = 1 << 8 // recursion desired
+ _RA = 1 << 7 // recursion available
)
// DNS queries.
type _DNS_Question struct {
- Name string "domain-name"; // "domain-name" specifies encoding; see packers below
- Qtype uint16;
- Qclass uint16;
+ Name string "domain-name" // "domain-name" specifies encoding; see packers below
+ Qtype uint16
+ Qclass uint16
}
// DNS responses (resource records).
// There are many types of messages,
// but they all share the same header.
type _DNS_RR_Header struct {
- Name string "domain-name";
- Rrtype uint16;
- Class uint16;
- Ttl uint32;
- Rdlength uint16; // length of data after header
+ Name string "domain-name"
+ Rrtype uint16
+ Class uint16
+ Ttl uint32
+ Rdlength uint16 // length of data after header
}
func (h *_DNS_RR_Header) Header() *_DNS_RR_Header {
@@ -112,15 +112,15 @@ func (h *_DNS_RR_Header) Header() *_DNS_RR_Header {
}
type _DNS_RR interface {
- Header() *_DNS_RR_Header;
+ Header() *_DNS_RR_Header
}
// Specific DNS RR formats for each query type.
type _DNS_RR_CNAME struct {
- Hdr _DNS_RR_Header;
- Cname string "domain-name";
+ Hdr _DNS_RR_Header
+ Cname string "domain-name"
}
func (rr *_DNS_RR_CNAME) Header() *_DNS_RR_Header {
@@ -128,9 +128,9 @@ func (rr *_DNS_RR_CNAME) Header() *_DNS_RR_Header {
}
type _DNS_RR_HINFO struct {
- Hdr _DNS_RR_Header;
- Cpu string;
- Os string;
+ Hdr _DNS_RR_Header
+ Cpu string
+ Os string
}
func (rr *_DNS_RR_HINFO) Header() *_DNS_RR_Header {
@@ -138,8 +138,8 @@ func (rr *_DNS_RR_HINFO) Header() *_DNS_RR_Header {
}
type _DNS_RR_MB struct {
- Hdr _DNS_RR_Header;
- Mb string "domain-name";
+ Hdr _DNS_RR_Header
+ Mb string "domain-name"
}
func (rr *_DNS_RR_MB) Header() *_DNS_RR_Header {
@@ -147,8 +147,8 @@ func (rr *_DNS_RR_MB) Header() *_DNS_RR_Header {
}
type _DNS_RR_MG struct {
- Hdr _DNS_RR_Header;
- Mg string "domain-name";
+ Hdr _DNS_RR_Header
+ Mg string "domain-name"
}
func (rr *_DNS_RR_MG) Header() *_DNS_RR_Header {
@@ -156,9 +156,9 @@ func (rr *_DNS_RR_MG) Header() *_DNS_RR_Header {
}
type _DNS_RR_MINFO struct {
- Hdr _DNS_RR_Header;
- Rmail string "domain-name";
- Email string "domain-name";
+ Hdr _DNS_RR_Header
+ Rmail string "domain-name"
+ Email string "domain-name"
}
func (rr *_DNS_RR_MINFO) Header() *_DNS_RR_Header {
@@ -166,8 +166,8 @@ func (rr *_DNS_RR_MINFO) Header() *_DNS_RR_Header {
}
type _DNS_RR_MR struct {
- Hdr _DNS_RR_Header;
- Mr string "domain-name";
+ Hdr _DNS_RR_Header
+ Mr string "domain-name"
}
func (rr *_DNS_RR_MR) Header() *_DNS_RR_Header {
@@ -175,9 +175,9 @@ func (rr *_DNS_RR_MR) Header() *_DNS_RR_Header {
}
type _DNS_RR_MX struct {
- Hdr _DNS_RR_Header;
- Pref uint16;
- Mx string "domain-name";
+ Hdr _DNS_RR_Header
+ Pref uint16
+ Mx string "domain-name"
}
func (rr *_DNS_RR_MX) Header() *_DNS_RR_Header {
@@ -185,8 +185,8 @@ func (rr *_DNS_RR_MX) Header() *_DNS_RR_Header {
}
type _DNS_RR_NS struct {
- Hdr _DNS_RR_Header;
- Ns string "domain-name";
+ Hdr _DNS_RR_Header
+ Ns string "domain-name"
}
func (rr *_DNS_RR_NS) Header() *_DNS_RR_Header {
@@ -194,8 +194,8 @@ func (rr *_DNS_RR_NS) Header() *_DNS_RR_Header {
}
type _DNS_RR_PTR struct {
- Hdr _DNS_RR_Header;
- Ptr string "domain-name";
+ Hdr _DNS_RR_Header
+ Ptr string "domain-name"
}
func (rr *_DNS_RR_PTR) Header() *_DNS_RR_Header {
@@ -203,14 +203,14 @@ func (rr *_DNS_RR_PTR) Header() *_DNS_RR_Header {
}
type _DNS_RR_SOA struct {
- Hdr _DNS_RR_Header;
- Ns string "domain-name";
- Mbox string "domain-name";
- Serial uint32;
- Refresh uint32;
- Retry uint32;
- Expire uint32;
- Minttl uint32;
+ Hdr _DNS_RR_Header
+ Ns string "domain-name"
+ Mbox string "domain-name"
+ Serial uint32
+ Refresh uint32
+ Retry uint32
+ Expire uint32
+ Minttl uint32
}
func (rr *_DNS_RR_SOA) Header() *_DNS_RR_Header {
@@ -218,8 +218,8 @@ func (rr *_DNS_RR_SOA) Header() *_DNS_RR_Header {
}
type _DNS_RR_TXT struct {
- Hdr _DNS_RR_Header;
- Txt string; // not domain name
+ Hdr _DNS_RR_Header
+ Txt string // not domain name
}
func (rr *_DNS_RR_TXT) Header() *_DNS_RR_Header {
@@ -227,11 +227,11 @@ func (rr *_DNS_RR_TXT) Header() *_DNS_RR_Header {
}
type _DNS_RR_A struct {
- Hdr _DNS_RR_Header;
- A uint32 "ipv4";
+ Hdr _DNS_RR_Header
+ A uint32 "ipv4"
}
-func (rr *_DNS_RR_A) Header() *_DNS_RR_Header { return &rr.Hdr }
+func (rr *_DNS_RR_A) Header() *_DNS_RR_Header { return &rr.Hdr }
// Packing and unpacking.
@@ -271,30 +271,30 @@ func packDomainName(s string, msg []byte, off int) (off1 int, ok bool) {
// We trade each dot byte for a length byte.
// There is also a trailing zero.
// Check that we have all the space we need.
- tot := len(s) + 1;
+ tot := len(s) + 1
if off+tot > len(msg) {
return len(msg), false
}
// Emit sequence of counted strings, chopping at dots.
- begin := 0;
+ begin := 0
for i := 0; i < len(s); i++ {
if s[i] == '.' {
- if i-begin >= 1<<6 { // top two bits of length must be clear
+ if i-begin >= 1<<6 { // top two bits of length must be clear
return len(msg), false
}
- msg[off] = byte(i - begin);
- off++;
+ msg[off] = byte(i - begin)
+ off++
for j := begin; j < i; j++ {
- msg[off] = s[j];
- off++;
+ msg[off] = s[j]
+ off++
}
- begin = i + 1;
+ begin = i + 1
}
}
- msg[off] = 0;
- off++;
- return off, true;
+ msg[off] = 0
+ off++
+ return off, true
}
// Unpack a domain name.
@@ -311,15 +311,15 @@ func packDomainName(s string, msg []byte, off int) (off1 int, ok bool) {
// In theory, the pointers are only allowed to jump backward.
// We let them jump anywhere and stop jumping after a while.
func unpackDomainName(msg []byte, off int) (s string, off1 int, ok bool) {
- s = "";
- ptr := 0; // number of pointers followed
+ s = ""
+ ptr := 0 // number of pointers followed
Loop:
for {
if off >= len(msg) {
return "", len(msg), false
}
- c := int(msg[off]);
- off++;
+ c := int(msg[off])
+ off++
switch c & 0xC0 {
case 0x00:
if c == 0x00 {
@@ -330,8 +330,8 @@ Loop:
if off+c > len(msg) {
return "", len(msg), false
}
- s += string(msg[off:off+c]) + ".";
- off += c;
+ s += string(msg[off:off+c]) + "."
+ off += c
case 0xC0:
// pointer to somewhere else in msg.
// remember location after first ptr,
@@ -341,15 +341,15 @@ Loop:
if off >= len(msg) {
return "", len(msg), false
}
- c1 := msg[off];
- off++;
+ c1 := msg[off]
+ off++
if ptr == 0 {
off1 = off
}
if ptr++; ptr > 10 {
return "", len(msg), false
}
- off = (c^0xC0)<<8 | int(c1);
+ off = (c^0xC0)<<8 | int(c1)
default:
// 0x80 and 0x40 are reserved
return "", len(msg), false
@@ -358,7 +358,7 @@ Loop:
if ptr == 0 {
off1 = off
}
- return s, off1, true;
+ return s, off1, true
}
// TODO(rsc): Move into generic library?
@@ -366,41 +366,41 @@ Loop:
// and other (often anonymous) structs.
func packStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, ok bool) {
for i := 0; i < val.NumField(); i++ {
- f := val.Type().(*reflect.StructType).Field(i);
+ f := val.Type().(*reflect.StructType).Field(i)
switch fv := val.Field(i).(type) {
default:
- fmt.Fprintf(os.Stderr, "net: dns: unknown packing type %v", f.Type);
- return len(msg), false;
+ fmt.Fprintf(os.Stderr, "net: dns: unknown packing type %v", f.Type)
+ return len(msg), false
case *reflect.StructValue:
off, ok = packStructValue(fv, msg, off)
case *reflect.Uint16Value:
- i := fv.Get();
+ i := fv.Get()
if off+2 > len(msg) {
return len(msg), false
}
- msg[off] = byte(i >> 8);
- msg[off+1] = byte(i);
- off += 2;
+ msg[off] = byte(i >> 8)
+ msg[off+1] = byte(i)
+ off += 2
case *reflect.Uint32Value:
- i := fv.Get();
+ i := fv.Get()
if off+4 > len(msg) {
return len(msg), false
}
- msg[off] = byte(i >> 24);
- msg[off+1] = byte(i >> 16);
- msg[off+2] = byte(i >> 8);
- msg[off+4] = byte(i);
- off += 4;
+ msg[off] = byte(i >> 24)
+ msg[off+1] = byte(i >> 16)
+ msg[off+2] = byte(i >> 8)
+ msg[off+4] = byte(i)
+ off += 4
case *reflect.StringValue:
// There are multiple string encodings.
// The tag distinguishes ordinary strings from domain names.
- s := fv.Get();
+ s := fv.Get()
switch f.Tag {
default:
- fmt.Fprintf(os.Stderr, "net: dns: unknown string tag %v", f.Tag);
- return len(msg), false;
+ fmt.Fprintf(os.Stderr, "net: dns: unknown string tag %v", f.Tag)
+ return len(msg), false
case "domain-name":
- off, ok = packDomainName(s, msg, off);
+ off, ok = packDomainName(s, msg, off)
if !ok {
return len(msg), false
}
@@ -409,16 +409,16 @@ func packStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, o
if len(s) > 255 || off+1+len(s) > len(msg) {
return len(msg), false
}
- msg[off] = byte(len(s));
- off++;
+ msg[off] = byte(len(s))
+ off++
for i := 0; i < len(s); i++ {
msg[off+i] = s[i]
}
- off += len(s);
+ off += len(s)
}
}
}
- return off, true;
+ return off, true
}
func structValue(any interface{}) *reflect.StructValue {
@@ -426,8 +426,8 @@ func structValue(any interface{}) *reflect.StructValue {
}
func packStruct(any interface{}, msg []byte, off int) (off1 int, ok bool) {
- off, ok = packStructValue(structValue(any), msg, off);
- return off, ok;
+ off, ok = packStructValue(structValue(any), msg, off)
+ return off, ok
}
// TODO(rsc): Move into generic library?
@@ -435,35 +435,35 @@ func packStruct(any interface{}, msg []byte, off int) (off1 int, ok bool) {
// Same restrictions as packStructValue.
func unpackStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, ok bool) {
for i := 0; i < val.NumField(); i++ {
- f := val.Type().(*reflect.StructType).Field(i);
+ f := val.Type().(*reflect.StructType).Field(i)
switch fv := val.Field(i).(type) {
default:
- fmt.Fprintf(os.Stderr, "net: dns: unknown packing type %v", f.Type);
- return len(msg), false;
+ fmt.Fprintf(os.Stderr, "net: dns: unknown packing type %v", f.Type)
+ return len(msg), false
case *reflect.StructValue:
off, ok = unpackStructValue(fv, msg, off)
case *reflect.Uint16Value:
if off+2 > len(msg) {
return len(msg), false
}
- i := uint16(msg[off])<<8 | uint16(msg[off+1]);
- fv.Set(i);
- off += 2;
+ i := uint16(msg[off])<<8 | uint16(msg[off+1])
+ fv.Set(i)
+ off += 2
case *reflect.Uint32Value:
if off+4 > len(msg) {
return len(msg), false
}
- i := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3]);
- fv.Set(i);
- off += 4;
+ i := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3])
+ fv.Set(i)
+ off += 4
case *reflect.StringValue:
- var s string;
+ var s string
switch f.Tag {
default:
- fmt.Fprintf(os.Stderr, "net: dns: unknown string tag %v", f.Tag);
- return len(msg), false;
+ fmt.Fprintf(os.Stderr, "net: dns: unknown string tag %v", f.Tag)
+ return len(msg), false
case "domain-name":
- s, off, ok = unpackDomainName(msg, off);
+ s, off, ok = unpackDomainName(msg, off)
if !ok {
return len(msg), false
}
@@ -471,24 +471,24 @@ func unpackStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int,
if off >= len(msg) || off+1+int(msg[off]) > len(msg) {
return len(msg), false
}
- n := int(msg[off]);
- off++;
- b := make([]byte, n);
+ n := int(msg[off])
+ off++
+ b := make([]byte, n)
for i := 0; i < n; i++ {
b[i] = msg[off+i]
}
- off += n;
- s = string(b);
+ off += n
+ s = string(b)
}
- fv.Set(s);
+ fv.Set(s)
}
}
- return off, true;
+ return off, true
}
func unpackStruct(any interface{}, msg []byte, off int) (off1 int, ok bool) {
- off, ok = unpackStructValue(structValue(any), msg, off);
- return off, ok;
+ off, ok = unpackStructValue(structValue(any), msg, off)
+ return off, ok
}
// Generic struct printer.
@@ -496,72 +496,72 @@ func unpackStruct(any interface{}, msg []byte, off int) (off1 int, ok bool) {
// but does look for an "ipv4" tag on uint32 variables,
// printing them as IP addresses.
func printStructValue(val *reflect.StructValue) string {
- s := "{";
+ s := "{"
for i := 0; i < val.NumField(); i++ {
if i > 0 {
s += ", "
}
- f := val.Type().(*reflect.StructType).Field(i);
+ f := val.Type().(*reflect.StructType).Field(i)
if !f.Anonymous {
s += f.Name + "="
}
- fval := val.Field(i);
+ fval := val.Field(i)
if fv, ok := fval.(*reflect.StructValue); ok {
s += printStructValue(fv)
} else if fv, ok := fval.(*reflect.Uint32Value); ok && f.Tag == "ipv4" {
- i := fv.Get();
- s += IPv4(byte(i>>24), byte(i>>16), byte(i>>8), byte(i)).String();
+ i := fv.Get()
+ s += IPv4(byte(i>>24), byte(i>>16), byte(i>>8), byte(i)).String()
} else {
s += fmt.Sprint(fval.Interface())
}
}
- s += "}";
- return s;
+ s += "}"
+ return s
}
-func printStruct(any interface{}) string { return printStructValue(structValue(any)) }
+func printStruct(any interface{}) string { return printStructValue(structValue(any)) }
// Resource record packer.
func packRR(rr _DNS_RR, msg []byte, off int) (off2 int, ok bool) {
- var off1 int;
+ var off1 int
// pack twice, once to find end of header
// and again to find end of packet.
// a bit inefficient but this doesn't need to be fast.
// off1 is end of header
// off2 is end of rr
- off1, ok = packStruct(rr.Header(), msg, off);
- off2, ok = packStruct(rr, msg, off);
+ off1, ok = packStruct(rr.Header(), msg, off)
+ off2, ok = packStruct(rr, msg, off)
if !ok {
return len(msg), false
}
// pack a third time; redo header with correct data length
- rr.Header().Rdlength = uint16(off2 - off1);
- packStruct(rr.Header(), msg, off);
- return off2, true;
+ rr.Header().Rdlength = uint16(off2 - off1)
+ packStruct(rr.Header(), msg, off)
+ return off2, true
}
// Resource record unpacker.
func unpackRR(msg []byte, off int) (rr _DNS_RR, off1 int, ok bool) {
// unpack just the header, to find the rr type and length
- var h _DNS_RR_Header;
- off0 := off;
+ var h _DNS_RR_Header
+ off0 := off
if off, ok = unpackStruct(&h, msg, off); !ok {
return nil, len(msg), false
}
- end := off + int(h.Rdlength);
+ end := off + int(h.Rdlength)
// make an rr of that type and re-unpack.
// again inefficient but doesn't need to be fast.
- mk, known := rr_mk[int(h.Rrtype)];
+ mk, known := rr_mk[int(h.Rrtype)]
if !known {
return &h, end, true
}
- rr = mk();
- off, ok = unpackStruct(rr, msg, off0);
+ rr = mk()
+ off, ok = unpackStruct(rr, msg, off0)
if off != end {
return &h, end, true
}
- return rr, off, ok;
+ return rr, off, ok
}
// Usable representation of a DNS packet.
@@ -569,31 +569,31 @@ func unpackRR(msg []byte, off int) (rr _DNS_RR, off1 int, ok bool) {
// A manually-unpacked version of (id, bits).
// This is in its own struct for easy printing.
type __DNS_Msg_Top struct {
- id uint16;
- response bool;
- opcode int;
- authoritative bool;
- truncated bool;
- recursion_desired bool;
- recursion_available bool;
- rcode int;
+ id uint16
+ response bool
+ opcode int
+ authoritative bool
+ truncated bool
+ recursion_desired bool
+ recursion_available bool
+ rcode int
}
type _DNS_Msg struct {
- __DNS_Msg_Top;
- question []_DNS_Question;
- answer []_DNS_RR;
- ns []_DNS_RR;
- extra []_DNS_RR;
+ __DNS_Msg_Top
+ question []_DNS_Question
+ answer []_DNS_RR
+ ns []_DNS_RR
+ extra []_DNS_RR
}
func (dns *_DNS_Msg) Pack() (msg []byte, ok bool) {
- var dh __DNS_Header;
+ var dh __DNS_Header
// Convert convenient _DNS_Msg into wire-like __DNS_Header.
- dh.Id = dns.id;
- dh.Bits = uint16(dns.opcode)<<11 | uint16(dns.rcode);
+ dh.Id = dns.id
+ dh.Bits = uint16(dns.opcode)<<11 | uint16(dns.rcode)
if dns.recursion_available {
dh.Bits |= _RA
}
@@ -611,24 +611,24 @@ func (dns *_DNS_Msg) Pack() (msg []byte, ok bool) {
}
// Prepare variable sized arrays.
- question := dns.question;
- answer := dns.answer;
- ns := dns.ns;
- extra := dns.extra;
+ question := dns.question
+ answer := dns.answer
+ ns := dns.ns
+ extra := dns.extra
- dh.Qdcount = uint16(len(question));
- dh.Ancount = uint16(len(answer));
- dh.Nscount = uint16(len(ns));
- dh.Arcount = uint16(len(extra));
+ dh.Qdcount = uint16(len(question))
+ dh.Ancount = uint16(len(answer))
+ dh.Nscount = uint16(len(ns))
+ dh.Arcount = uint16(len(extra))
// Could work harder to calculate message size,
// but this is far more than we need and not
// big enough to hurt the allocator.
- msg = make([]byte, 2000);
+ msg = make([]byte, 2000)
// Pack it in: header and then the pieces.
- off := 0;
- off, ok = packStruct(&dh, msg, off);
+ off := 0
+ off, ok = packStruct(&dh, msg, off)
for i := 0; i < len(question); i++ {
off, ok = packStruct(&question[i], msg, off)
}
@@ -644,31 +644,31 @@ func (dns *_DNS_Msg) Pack() (msg []byte, ok bool) {
if !ok {
return nil, false
}
- return msg[0:off], true;
+ return msg[0:off], true
}
func (dns *_DNS_Msg) Unpack(msg []byte) bool {
// Header.
- var dh __DNS_Header;
- off := 0;
- var ok bool;
+ var dh __DNS_Header
+ off := 0
+ var ok bool
if off, ok = unpackStruct(&dh, msg, off); !ok {
return false
}
- dns.id = dh.Id;
- dns.response = (dh.Bits & _QR) != 0;
- dns.opcode = int(dh.Bits>>11) & 0xF;
- dns.authoritative = (dh.Bits & _AA) != 0;
- dns.truncated = (dh.Bits & _TC) != 0;
- dns.recursion_desired = (dh.Bits & _RD) != 0;
- dns.recursion_available = (dh.Bits & _RA) != 0;
- dns.rcode = int(dh.Bits & 0xF);
+ dns.id = dh.Id
+ dns.response = (dh.Bits & _QR) != 0
+ dns.opcode = int(dh.Bits>>11) & 0xF
+ dns.authoritative = (dh.Bits & _AA) != 0
+ dns.truncated = (dh.Bits & _TC) != 0
+ dns.recursion_desired = (dh.Bits & _RD) != 0
+ dns.recursion_available = (dh.Bits & _RA) != 0
+ dns.rcode = int(dh.Bits & 0xF)
// Arrays.
- dns.question = make([]_DNS_Question, dh.Qdcount);
- dns.answer = make([]_DNS_RR, dh.Ancount);
- dns.ns = make([]_DNS_RR, dh.Nscount);
- dns.extra = make([]_DNS_RR, dh.Arcount);
+ dns.question = make([]_DNS_Question, dh.Qdcount)
+ dns.answer = make([]_DNS_RR, dh.Ancount)
+ dns.ns = make([]_DNS_RR, dh.Nscount)
+ dns.extra = make([]_DNS_RR, dh.Arcount)
for i := 0; i < len(dns.question); i++ {
off, ok = unpackStruct(&dns.question[i], msg, off)
@@ -688,34 +688,34 @@ func (dns *_DNS_Msg) Unpack(msg []byte) bool {
// if off != len(msg) {
// println("extra bytes in dns packet", off, "<", len(msg));
// }
- return true;
+ return true
}
func (dns *_DNS_Msg) String() string {
- s := "DNS: " + printStruct(&dns.__DNS_Msg_Top) + "\n";
+ s := "DNS: " + printStruct(&dns.__DNS_Msg_Top) + "\n"
if len(dns.question) > 0 {
- s += "-- Questions\n";
+ s += "-- Questions\n"
for i := 0; i < len(dns.question); i++ {
s += printStruct(&dns.question[i]) + "\n"
}
}
if len(dns.answer) > 0 {
- s += "-- Answers\n";
+ s += "-- Answers\n"
for i := 0; i < len(dns.answer); i++ {
s += printStruct(dns.answer[i]) + "\n"
}
}
if len(dns.ns) > 0 {
- s += "-- Name servers\n";
+ s += "-- Name servers\n"
for i := 0; i < len(dns.ns); i++ {
s += printStruct(dns.ns[i]) + "\n"
}
}
if len(dns.extra) > 0 {
- s += "-- Extra\n";
+ s += "-- Extra\n"
for i := 0; i < len(dns.extra); i++ {
s += printStruct(dns.extra[i]) + "\n"
}
}
- return s;
+ return s
}
diff --git a/src/pkg/net/fd.go b/src/pkg/net/fd.go
index 733f957e5..743bcfa47 100644
--- a/src/pkg/net/fd.go
+++ b/src/pkg/net/fd.go
@@ -7,40 +7,40 @@
package net
import (
- "once";
- "os";
- "sync";
- "syscall";
+ "once"
+ "os"
+ "sync"
+ "syscall"
)
// Network file descriptor.
type netFD struct {
// locking/lifetime of sysfd
- sysmu sync.Mutex;
- sysref int;
- closing bool;
+ sysmu sync.Mutex
+ sysref int
+ closing bool
// immutable until Close
- sysfd int;
- family int;
- proto int;
- sysfile *os.File;
- cr chan *netFD;
- cw chan *netFD;
- net string;
- laddr Addr;
- raddr Addr;
+ sysfd int
+ family int
+ proto int
+ sysfile *os.File
+ cr chan *netFD
+ cw chan *netFD
+ net string
+ laddr Addr
+ raddr Addr
// owned by client
- rdeadline_delta int64;
- rdeadline int64;
- rio sync.Mutex;
- wdeadline_delta int64;
- wdeadline int64;
- wio sync.Mutex;
+ rdeadline_delta int64
+ rdeadline int64
+ rio sync.Mutex
+ wdeadline_delta int64
+ wdeadline int64
+ wio sync.Mutex
// owned by fd wait server
- ncr, ncw int;
+ ncr, ncw int
}
// A pollServer helps FDs determine when to retry a non-blocking
@@ -78,28 +78,28 @@ type netFD struct {
// will the fd be closed.
type pollServer struct {
- cr, cw chan *netFD; // buffered >= 1
- pr, pw *os.File;
- pending map[int]*netFD;
- poll *pollster; // low-level OS hooks
- deadline int64; // next deadline (nsec since 1970)
+ cr, cw chan *netFD // buffered >= 1
+ pr, pw *os.File
+ pending map[int]*netFD
+ poll *pollster // low-level OS hooks
+ deadline int64 // next deadline (nsec since 1970)
}
func newPollServer() (s *pollServer, err os.Error) {
- s = new(pollServer);
- s.cr = make(chan *netFD, 1);
- s.cw = make(chan *netFD, 1);
+ s = new(pollServer)
+ s.cr = make(chan *netFD, 1)
+ s.cw = make(chan *netFD, 1)
if s.pr, s.pw, err = os.Pipe(); err != nil {
return nil, err
}
- var e int;
+ var e int
if e = syscall.SetNonblock(s.pr.Fd(), true); e != 0 {
Errno:
- err = &os.PathError{"setnonblock", s.pr.Name(), os.Errno(e)};
+ err = &os.PathError{"setnonblock", s.pr.Name(), os.Errno(e)}
Error:
- s.pr.Close();
- s.pw.Close();
- return nil, err;
+ s.pr.Close()
+ s.pw.Close()
+ return nil, err
}
if e = syscall.SetNonblock(s.pw.Fd(), true); e != 0 {
goto Errno
@@ -108,16 +108,16 @@ func newPollServer() (s *pollServer, err os.Error) {
goto Error
}
if err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil {
- s.poll.Close();
- goto Error;
+ s.poll.Close()
+ goto Error
}
- s.pending = make(map[int]*netFD);
- go s.Run();
- return s, nil;
+ s.pending = make(map[int]*netFD)
+ go s.Run()
+ return s, nil
}
func (s *pollServer) AddFD(fd *netFD, mode int) {
- intfd := fd.sysfd;
+ intfd := fd.sysfd
if intfd < 0 {
// fd closed underfoot
if mode == 'r' {
@@ -125,74 +125,74 @@ func (s *pollServer) AddFD(fd *netFD, mode int) {
} else {
fd.cw <- fd
}
- return;
+ return
}
if err := s.poll.AddFD(intfd, mode, false); err != nil {
- panicln("pollServer AddFD ", intfd, ": ", err.String(), "\n");
- return;
+ panicln("pollServer AddFD ", intfd, ": ", err.String(), "\n")
+ return
}
- var t int64;
- key := intfd << 1;
+ var t int64
+ key := intfd << 1
if mode == 'r' {
- fd.ncr++;
- t = fd.rdeadline;
+ fd.ncr++
+ t = fd.rdeadline
} else {
- fd.ncw++;
- key++;
- t = fd.wdeadline;
+ fd.ncw++
+ key++
+ t = fd.wdeadline
}
- s.pending[key] = fd;
+ s.pending[key] = fd
if t > 0 && (s.deadline == 0 || t < s.deadline) {
s.deadline = t
}
}
func (s *pollServer) LookupFD(fd int, mode int) *netFD {
- key := fd << 1;
+ key := fd << 1
if mode == 'w' {
key++
}
- netfd, ok := s.pending[key];
+ netfd, ok := s.pending[key]
if !ok {
return nil
}
- s.pending[key] = nil, false;
- return netfd;
+ s.pending[key] = nil, false
+ return netfd
}
func (s *pollServer) WakeFD(fd *netFD, mode int) {
if mode == 'r' {
for fd.ncr > 0 {
- fd.ncr--;
- fd.cr <- fd;
+ fd.ncr--
+ fd.cr <- fd
}
} else {
for fd.ncw > 0 {
- fd.ncw--;
- fd.cw <- fd;
+ fd.ncw--
+ fd.cw <- fd
}
}
}
func (s *pollServer) Now() int64 {
- sec, nsec, err := os.Time();
+ sec, nsec, err := os.Time()
if err != nil {
panic("net: os.Time: ", err.String())
}
- nsec += sec * 1e9;
- return nsec;
+ nsec += sec * 1e9
+ return nsec
}
func (s *pollServer) CheckDeadlines() {
- now := s.Now();
+ now := s.Now()
// TODO(rsc): This will need to be handled more efficiently,
// probably with a heap indexed by wakeup time.
- var next_deadline int64;
+ var next_deadline int64
for key, fd := range s.pending {
- var t int64;
- var mode int;
+ var t int64
+ var mode int
if key&1 == 0 {
mode = 'r'
} else {
@@ -205,43 +205,43 @@ func (s *pollServer) CheckDeadlines() {
}
if t > 0 {
if t <= now {
- s.pending[key] = nil, false;
+ s.pending[key] = nil, false
if mode == 'r' {
- s.poll.DelFD(fd.sysfd, mode);
- fd.rdeadline = -1;
+ s.poll.DelFD(fd.sysfd, mode)
+ fd.rdeadline = -1
} else {
- s.poll.DelFD(fd.sysfd, mode);
- fd.wdeadline = -1;
+ s.poll.DelFD(fd.sysfd, mode)
+ fd.wdeadline = -1
}
- s.WakeFD(fd, mode);
+ s.WakeFD(fd, mode)
} else if next_deadline == 0 || t < next_deadline {
next_deadline = t
}
}
}
- s.deadline = next_deadline;
+ s.deadline = next_deadline
}
func (s *pollServer) Run() {
- var scratch [100]byte;
+ var scratch [100]byte
for {
- var t = s.deadline;
+ var t = s.deadline
if t > 0 {
- t = t - s.Now();
+ t = t - s.Now()
if t < 0 {
- s.CheckDeadlines();
- continue;
+ s.CheckDeadlines()
+ continue
}
}
- fd, mode, err := s.poll.WaitFD(t);
+ fd, mode, err := s.poll.WaitFD(t)
if err != nil {
- print("pollServer WaitFD: ", err.String(), "\n");
- return;
+ print("pollServer WaitFD: ", err.String(), "\n")
+ return
}
if fd < 0 {
// Timeout happened.
- s.CheckDeadlines();
- continue;
+ s.CheckDeadlines()
+ continue
}
if fd == s.pr.Fd() {
// Drain our wakeup pipe.
@@ -256,30 +256,30 @@ func (s *pollServer) Run() {
s.AddFD(fd, 'w')
}
} else {
- netfd := s.LookupFD(fd, mode);
+ netfd := s.LookupFD(fd, mode)
if netfd == nil {
- print("pollServer: unexpected wakeup for fd=", netfd, " mode=", string(mode), "\n");
- continue;
+ print("pollServer: unexpected wakeup for fd=", netfd, " mode=", string(mode), "\n")
+ continue
}
- s.WakeFD(netfd, mode);
+ s.WakeFD(netfd, mode)
}
}
}
var wakeupbuf [1]byte
-func (s *pollServer) Wakeup() { s.pw.Write(&wakeupbuf) }
+func (s *pollServer) Wakeup() { s.pw.Write(&wakeupbuf) }
func (s *pollServer) WaitRead(fd *netFD) {
- s.cr <- fd;
- s.Wakeup();
- <-fd.cr;
+ s.cr <- fd
+ s.Wakeup()
+ <-fd.cr
}
func (s *pollServer) WaitWrite(fd *netFD) {
- s.cw <- fd;
- s.Wakeup();
- <-fd.cw;
+ s.cw <- fd
+ s.Wakeup()
+ <-fd.cw
}
// Network FD methods.
@@ -288,15 +288,15 @@ func (s *pollServer) WaitWrite(fd *netFD) {
var pollserver *pollServer
func startServer() {
- p, err := newPollServer();
+ p, err := newPollServer()
if err != nil {
print("Start pollServer: ", err.String(), "\n")
}
- pollserver = p;
+ pollserver = p
}
func newFD(fd, family, proto int, net string, laddr, raddr Addr) (f *netFD, err os.Error) {
- once.Do(startServer);
+ once.Do(startServer)
if e := syscall.SetNonblock(fd, true); e != 0 {
return nil, &OpError{"setnonblock", net, laddr, os.Errno(e)}
}
@@ -307,50 +307,50 @@ func newFD(fd, family, proto int, net string, laddr, raddr Addr) (f *netFD, err
net: net,
laddr: laddr,
raddr: raddr,
- };
- var ls, rs string;
+ }
+ var ls, rs string
if laddr != nil {
ls = laddr.String()
}
if raddr != nil {
rs = raddr.String()
}
- f.sysfile = os.NewFile(fd, net+":"+ls+"->"+rs);
- f.cr = make(chan *netFD, 1);
- f.cw = make(chan *netFD, 1);
- return f, nil;
+ f.sysfile = os.NewFile(fd, net+":"+ls+"->"+rs)
+ f.cr = make(chan *netFD, 1)
+ f.cw = make(chan *netFD, 1)
+ return f, nil
}
// Add a reference to this fd.
func (fd *netFD) incref() {
- fd.sysmu.Lock();
- fd.sysref++;
- fd.sysmu.Unlock();
+ fd.sysmu.Lock()
+ fd.sysref++
+ fd.sysmu.Unlock()
}
// Remove a reference to this FD and close if we've been asked to do so (and
// there are no references left.
func (fd *netFD) decref() {
- fd.sysmu.Lock();
- fd.sysref--;
+ fd.sysmu.Lock()
+ fd.sysref--
if fd.closing && fd.sysref == 0 && fd.sysfd >= 0 {
// In case the user has set linger, switch to blocking mode so
// the close blocks. As long as this doesn't happen often, we
// can handle the extra OS processes. Otherwise we'll need to
// use the pollserver for Close too. Sigh.
- syscall.SetNonblock(fd.sysfd, false);
- fd.sysfile.Close();
- fd.sysfile = nil;
- fd.sysfd = -1;
+ syscall.SetNonblock(fd.sysfd, false)
+ fd.sysfile.Close()
+ fd.sysfile = nil
+ fd.sysfd = -1
}
- fd.sysmu.Unlock();
+ fd.sysmu.Unlock()
}
func isEAGAIN(e os.Error) bool {
if e1, ok := e.(*os.PathError); ok {
return e1.Error == os.EAGAIN
}
- return e == os.EAGAIN;
+ return e == os.EAGAIN
}
func (fd *netFD) Close() os.Error {
@@ -358,89 +358,89 @@ func (fd *netFD) Close() os.Error {
return os.EINVAL
}
- fd.incref();
- syscall.Shutdown(fd.sysfd, syscall.SHUT_RDWR);
- fd.closing = true;
- fd.decref();
- return nil;
+ fd.incref()
+ syscall.Shutdown(fd.sysfd, syscall.SHUT_RDWR)
+ fd.closing = true
+ fd.decref()
+ return nil
}
func (fd *netFD) Read(p []byte) (n int, err os.Error) {
if fd == nil || fd.sysfile == nil {
return 0, os.EINVAL
}
- fd.rio.Lock();
- defer fd.rio.Unlock();
- fd.incref();
- defer fd.decref();
+ fd.rio.Lock()
+ defer fd.rio.Unlock()
+ fd.incref()
+ defer fd.decref()
if fd.rdeadline_delta > 0 {
fd.rdeadline = pollserver.Now() + fd.rdeadline_delta
} else {
fd.rdeadline = 0
}
for {
- n, err = fd.sysfile.Read(p);
+ n, err = fd.sysfile.Read(p)
if isEAGAIN(err) && fd.rdeadline >= 0 {
- pollserver.WaitRead(fd);
- continue;
+ pollserver.WaitRead(fd)
+ continue
}
- break;
+ break
}
if fd.proto == syscall.SOCK_DGRAM && err == os.EOF {
// 0 in datagram protocol just means 0-length packet
err = nil
}
- return;
+ return
}
func (fd *netFD) ReadFrom(p []byte) (n int, sa syscall.Sockaddr, err os.Error) {
if fd == nil || fd.sysfile == nil {
return 0, nil, os.EINVAL
}
- fd.rio.Lock();
- defer fd.rio.Unlock();
- fd.incref();
- defer fd.decref();
+ fd.rio.Lock()
+ defer fd.rio.Unlock()
+ fd.incref()
+ defer fd.decref()
if fd.rdeadline_delta > 0 {
fd.rdeadline = pollserver.Now() + fd.rdeadline_delta
} else {
fd.rdeadline = 0
}
for {
- var errno int;
- n, sa, errno = syscall.Recvfrom(fd.sysfd, p, 0);
+ var errno int
+ n, sa, errno = syscall.Recvfrom(fd.sysfd, p, 0)
if errno == syscall.EAGAIN && fd.rdeadline >= 0 {
- pollserver.WaitRead(fd);
- continue;
+ pollserver.WaitRead(fd)
+ continue
}
if errno != 0 {
- n = 0;
- err = &os.PathError{"recvfrom", fd.sysfile.Name(), os.Errno(errno)};
+ n = 0
+ err = &os.PathError{"recvfrom", fd.sysfile.Name(), os.Errno(errno)}
}
- break;
+ break
}
- return;
+ return
}
func (fd *netFD) Write(p []byte) (n int, err os.Error) {
if fd == nil || fd.sysfile == nil {
return 0, os.EINVAL
}
- fd.wio.Lock();
- defer fd.wio.Unlock();
- fd.incref();
- defer fd.decref();
+ fd.wio.Lock()
+ defer fd.wio.Unlock()
+ fd.incref()
+ defer fd.decref()
if fd.wdeadline_delta > 0 {
fd.wdeadline = pollserver.Now() + fd.wdeadline_delta
} else {
fd.wdeadline = 0
}
- err = nil;
- nn := 0;
- first := true; // force at least one Write, to send 0-length datagram packets
+ err = nil
+ nn := 0
+ first := true // force at least one Write, to send 0-length datagram packets
for nn < len(p) || first {
- first = false;
- n, err = fd.sysfile.Write(p[nn:]);
+ first = false
+ n, err = fd.sysfile.Write(p[nn:])
if n > 0 {
nn += n
}
@@ -448,45 +448,45 @@ func (fd *netFD) Write(p []byte) (n int, err os.Error) {
break
}
if isEAGAIN(err) && fd.wdeadline >= 0 {
- pollserver.WaitWrite(fd);
- continue;
+ pollserver.WaitWrite(fd)
+ continue
}
if n == 0 || err != nil {
break
}
}
- return nn, err;
+ return nn, err
}
func (fd *netFD) WriteTo(p []byte, sa syscall.Sockaddr) (n int, err os.Error) {
if fd == nil || fd.sysfile == nil {
return 0, os.EINVAL
}
- fd.wio.Lock();
- defer fd.wio.Unlock();
- fd.incref();
- defer fd.decref();
+ fd.wio.Lock()
+ defer fd.wio.Unlock()
+ fd.incref()
+ defer fd.decref()
if fd.wdeadline_delta > 0 {
fd.wdeadline = pollserver.Now() + fd.wdeadline_delta
} else {
fd.wdeadline = 0
}
- err = nil;
+ err = nil
for {
- errno := syscall.Sendto(fd.sysfd, p, 0, sa);
+ errno := syscall.Sendto(fd.sysfd, p, 0, sa)
if errno == syscall.EAGAIN && fd.wdeadline >= 0 {
- pollserver.WaitWrite(fd);
- continue;
+ pollserver.WaitWrite(fd)
+ continue
}
if errno != 0 {
err = &os.PathError{"sendto", fd.sysfile.Name(), os.Errno(errno)}
}
- break;
+ break
}
if err == nil {
n = len(p)
}
- return;
+ return
}
func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (nfd *netFD, err os.Error) {
@@ -494,34 +494,34 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (nfd *netFD, err os.
return nil, os.EINVAL
}
- fd.incref();
- defer fd.decref();
+ fd.incref()
+ defer fd.decref()
// See ../syscall/exec.go for description of ForkLock.
// It is okay to hold the lock across syscall.Accept
// because we have put fd.sysfd into non-blocking mode.
- syscall.ForkLock.RLock();
- var s, e int;
- var sa syscall.Sockaddr;
+ syscall.ForkLock.RLock()
+ var s, e int
+ var sa syscall.Sockaddr
for {
- s, sa, e = syscall.Accept(fd.sysfd);
+ s, sa, e = syscall.Accept(fd.sysfd)
if e != syscall.EAGAIN {
break
}
- syscall.ForkLock.RUnlock();
- pollserver.WaitRead(fd);
- syscall.ForkLock.RLock();
+ syscall.ForkLock.RUnlock()
+ pollserver.WaitRead(fd)
+ syscall.ForkLock.RLock()
}
if e != 0 {
- syscall.ForkLock.RUnlock();
- return nil, &OpError{"accept", fd.net, fd.laddr, os.Errno(e)};
+ syscall.ForkLock.RUnlock()
+ return nil, &OpError{"accept", fd.net, fd.laddr, os.Errno(e)}
}
- syscall.CloseOnExec(s);
- syscall.ForkLock.RUnlock();
+ syscall.CloseOnExec(s)
+ syscall.ForkLock.RUnlock()
if nfd, err = newFD(s, fd.family, fd.proto, fd.net, fd.laddr, toAddr(sa)); err != nil {
- syscall.Close(s);
- return nil, err;
+ syscall.Close(s)
+ return nil, err
}
- return nfd, nil;
+ return nfd, nil
}
diff --git a/src/pkg/net/fd_darwin.go b/src/pkg/net/fd_darwin.go
index 74818581a..a33504f6e 100644
--- a/src/pkg/net/fd_darwin.go
+++ b/src/pkg/net/fd_darwin.go
@@ -7,46 +7,46 @@
package net
import (
- "os";
- "syscall";
+ "os"
+ "syscall"
)
type pollster struct {
- kq int;
- eventbuf [10]syscall.Kevent_t;
- events []syscall.Kevent_t;
+ kq int
+ eventbuf [10]syscall.Kevent_t
+ events []syscall.Kevent_t
}
func newpollster() (p *pollster, err os.Error) {
- p = new(pollster);
- var e int;
+ p = new(pollster)
+ var e int
if p.kq, e = syscall.Kqueue(); e != 0 {
return nil, os.NewSyscallError("kqueue", e)
}
- p.events = p.eventbuf[0:0];
- return p, nil;
+ p.events = p.eventbuf[0:0]
+ return p, nil
}
func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
- var kmode int;
+ var kmode int
if mode == 'r' {
kmode = syscall.EVFILT_READ
} else {
kmode = syscall.EVFILT_WRITE
}
- var events [1]syscall.Kevent_t;
- ev := &events[0];
+ var events [1]syscall.Kevent_t
+ ev := &events[0]
// EV_ADD - add event to kqueue list
// EV_RECEIPT - generate fake EV_ERROR as result of add,
// rather than waiting for real event
// EV_ONESHOT - delete the event the first time it triggers
- flags := syscall.EV_ADD | syscall.EV_RECEIPT;
+ flags := syscall.EV_ADD | syscall.EV_RECEIPT
if !repeat {
flags |= syscall.EV_ONESHOT
}
- syscall.SetKevent(ev, fd, kmode, flags);
+ syscall.SetKevent(ev, fd, kmode, flags)
- n, e := syscall.Kevent(p.kq, &events, &events, nil);
+ n, e := syscall.Kevent(p.kq, &events, &events, nil)
if e != 0 {
return os.NewSyscallError("kevent", e)
}
@@ -56,55 +56,55 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
if ev.Data != 0 {
return os.Errno(int(ev.Data))
}
- return nil;
+ return nil
}
func (p *pollster) DelFD(fd int, mode int) {
- var kmode int;
+ var kmode int
if mode == 'r' {
kmode = syscall.EVFILT_READ
} else {
kmode = syscall.EVFILT_WRITE
}
- var events [1]syscall.Kevent_t;
- ev := &events[0];
+ var events [1]syscall.Kevent_t
+ ev := &events[0]
// EV_DELETE - delete event from kqueue list
// EV_RECEIPT - generate fake EV_ERROR as result of add,
// rather than waiting for real event
- syscall.SetKevent(ev, fd, kmode, syscall.EV_DELETE|syscall.EV_RECEIPT);
- syscall.Kevent(p.kq, &events, &events, nil);
+ syscall.SetKevent(ev, fd, kmode, syscall.EV_DELETE|syscall.EV_RECEIPT)
+ syscall.Kevent(p.kq, &events, &events, nil)
}
func (p *pollster) WaitFD(nsec int64) (fd int, mode int, err os.Error) {
- var t *syscall.Timespec;
+ var t *syscall.Timespec
for len(p.events) == 0 {
if nsec > 0 {
if t == nil {
t = new(syscall.Timespec)
}
- *t = syscall.NsecToTimespec(nsec);
+ *t = syscall.NsecToTimespec(nsec)
}
- nn, e := syscall.Kevent(p.kq, nil, &p.eventbuf, t);
+ nn, e := syscall.Kevent(p.kq, nil, &p.eventbuf, t)
if e != 0 {
if e == syscall.EINTR {
continue
}
- return -1, 0, os.NewSyscallError("kevent", e);
+ return -1, 0, os.NewSyscallError("kevent", e)
}
if nn == 0 {
return -1, 0, nil
}
- p.events = p.eventbuf[0:nn];
+ p.events = p.eventbuf[0:nn]
}
- ev := &p.events[0];
- p.events = p.events[1:];
- fd = int(ev.Ident);
+ ev := &p.events[0]
+ p.events = p.events[1:]
+ fd = int(ev.Ident)
if ev.Filter == syscall.EVFILT_READ {
mode = 'r'
} else {
mode = 'w'
}
- return fd, mode, nil;
+ return fd, mode, nil
}
-func (p *pollster) Close() os.Error { return os.NewSyscallError("close", syscall.Close(p.kq)) }
+func (p *pollster) Close() os.Error { return os.NewSyscallError("close", syscall.Close(p.kq)) }
diff --git a/src/pkg/net/fd_freebsd.go b/src/pkg/net/fd_freebsd.go
index 12a64014a..01a3c8d72 100644
--- a/src/pkg/net/fd_freebsd.go
+++ b/src/pkg/net/fd_freebsd.go
@@ -7,44 +7,44 @@
package net
import (
- "os";
- "syscall";
+ "os"
+ "syscall"
)
type pollster struct {
- kq int;
- eventbuf [10]syscall.Kevent_t;
- events []syscall.Kevent_t;
+ kq int
+ eventbuf [10]syscall.Kevent_t
+ events []syscall.Kevent_t
}
func newpollster() (p *pollster, err os.Error) {
- p = new(pollster);
- var e int;
+ p = new(pollster)
+ var e int
if p.kq, e = syscall.Kqueue(); e != 0 {
return nil, os.NewSyscallError("kqueue", e)
}
- p.events = p.eventbuf[0:0];
- return p, nil;
+ p.events = p.eventbuf[0:0]
+ return p, nil
}
func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
- var kmode int;
+ var kmode int
if mode == 'r' {
kmode = syscall.EVFILT_READ
} else {
kmode = syscall.EVFILT_WRITE
}
- var events [1]syscall.Kevent_t;
- ev := &events[0];
+ var events [1]syscall.Kevent_t
+ ev := &events[0]
// EV_ADD - add event to kqueue list
// EV_ONESHOT - delete the event the first time it triggers
- flags := syscall.EV_ADD;
+ flags := syscall.EV_ADD
if !repeat {
flags |= syscall.EV_ONESHOT
}
- syscall.SetKevent(ev, fd, kmode, flags);
+ syscall.SetKevent(ev, fd, kmode, flags)
- n, e := syscall.Kevent(p.kq, &events, nil, nil);
+ n, e := syscall.Kevent(p.kq, &events, nil, nil)
if e != 0 {
return os.NewSyscallError("kevent", e)
}
@@ -54,53 +54,53 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
if ev.Data != 0 {
return os.Errno(int(ev.Data))
}
- return nil;
+ return nil
}
func (p *pollster) DelFD(fd int, mode int) {
- var kmode int;
+ var kmode int
if mode == 'r' {
kmode = syscall.EVFILT_READ
} else {
kmode = syscall.EVFILT_WRITE
}
- var events [1]syscall.Kevent_t;
- ev := &events[0];
+ var events [1]syscall.Kevent_t
+ ev := &events[0]
// EV_DELETE - delete event from kqueue list
- syscall.SetKevent(ev, fd, kmode, syscall.EV_DELETE);
- syscall.Kevent(p.kq, &events, nil, nil);
+ syscall.SetKevent(ev, fd, kmode, syscall.EV_DELETE)
+ syscall.Kevent(p.kq, &events, nil, nil)
}
func (p *pollster) WaitFD(nsec int64) (fd int, mode int, err os.Error) {
- var t *syscall.Timespec;
+ var t *syscall.Timespec
for len(p.events) == 0 {
if nsec > 0 {
if t == nil {
t = new(syscall.Timespec)
}
- *t = syscall.NsecToTimespec(nsec);
+ *t = syscall.NsecToTimespec(nsec)
}
- nn, e := syscall.Kevent(p.kq, nil, &p.eventbuf, t);
+ nn, e := syscall.Kevent(p.kq, nil, &p.eventbuf, t)
if e != 0 {
if e == syscall.EINTR {
continue
}
- return -1, 0, os.NewSyscallError("kevent", e);
+ return -1, 0, os.NewSyscallError("kevent", e)
}
if nn == 0 {
return -1, 0, nil
}
- p.events = p.eventbuf[0:nn];
+ p.events = p.eventbuf[0:nn]
}
- ev := &p.events[0];
- p.events = p.events[1:];
- fd = int(ev.Ident);
+ ev := &p.events[0]
+ p.events = p.events[1:]
+ fd = int(ev.Ident)
if ev.Filter == syscall.EVFILT_READ {
mode = 'r'
} else {
mode = 'w'
}
- return fd, mode, nil;
+ return fd, mode, nil
}
-func (p *pollster) Close() os.Error { return os.NewSyscallError("close", syscall.Close(p.kq)) }
+func (p *pollster) Close() os.Error { return os.NewSyscallError("close", syscall.Close(p.kq)) }
diff --git a/src/pkg/net/fd_linux.go b/src/pkg/net/fd_linux.go
index 83d66ac89..5024eec02 100644
--- a/src/pkg/net/fd_linux.go
+++ b/src/pkg/net/fd_linux.go
@@ -7,25 +7,25 @@
package net
import (
- "os";
- "syscall";
+ "os"
+ "syscall"
)
const (
- readFlags = syscall.EPOLLIN | syscall.EPOLLRDHUP;
- writeFlags = syscall.EPOLLOUT;
+ readFlags = syscall.EPOLLIN | syscall.EPOLLRDHUP
+ writeFlags = syscall.EPOLLOUT
)
type pollster struct {
- epfd int;
+ epfd int
// Events we're already waiting for
- events map[int]uint32;
+ events map[int]uint32
}
func newpollster() (p *pollster, err os.Error) {
- p = new(pollster);
- var e int;
+ p = new(pollster)
+ var e int
// The arg to epoll_create is a hint to the kernel
// about the number of FDs we will care about.
@@ -33,15 +33,15 @@ func newpollster() (p *pollster, err os.Error) {
if p.epfd, e = syscall.EpollCreate(16); e != 0 {
return nil, os.NewSyscallError("epoll_create", e)
}
- p.events = make(map[int]uint32);
- return p, nil;
+ p.events = make(map[int]uint32)
+ return p, nil
}
func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
- var ev syscall.EpollEvent;
- var already bool;
- ev.Fd = int32(fd);
- ev.Events, already = p.events[fd];
+ var ev syscall.EpollEvent
+ var already bool
+ ev.Fd = int32(fd)
+ ev.Events, already = p.events[fd]
if !repeat {
ev.Events |= syscall.EPOLLONESHOT
}
@@ -51,7 +51,7 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
ev.Events |= writeFlags
}
- var op int;
+ var op int
if already {
op = syscall.EPOLL_CTL_MOD
} else {
@@ -60,15 +60,15 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
if e := syscall.EpollCtl(p.epfd, op, fd, &ev); e != 0 {
return os.NewSyscallError("epoll_ctl", e)
}
- p.events[fd] = ev.Events;
- return nil;
+ p.events[fd] = ev.Events
+ return nil
}
func (p *pollster) StopWaiting(fd int, bits uint) {
- events, already := p.events[fd];
+ events, already := p.events[fd]
if !already {
- print("Epoll unexpected fd=", fd, "\n");
- return;
+ print("Epoll unexpected fd=", fd, "\n")
+ return
}
// If syscall.EPOLLONESHOT is not set, the wait
@@ -80,20 +80,20 @@ func (p *pollster) StopWaiting(fd int, bits uint) {
// Disable the given bits.
// If we're still waiting for other events, modify the fd
// event in the kernel. Otherwise, delete it.
- events &= ^uint32(bits);
+ events &= ^uint32(bits)
if int32(events)&^syscall.EPOLLONESHOT != 0 {
- var ev syscall.EpollEvent;
- ev.Fd = int32(fd);
- ev.Events = events;
+ var ev syscall.EpollEvent
+ ev.Fd = int32(fd)
+ ev.Events = events
if e := syscall.EpollCtl(p.epfd, syscall.EPOLL_CTL_MOD, fd, &ev); e != 0 {
print("Epoll modify fd=", fd, ": ", os.Errno(e).String(), "\n")
}
- p.events[fd] = events;
+ p.events[fd] = events
} else {
if e := syscall.EpollCtl(p.epfd, syscall.EPOLL_CTL_DEL, fd, nil); e != 0 {
print("Epoll delete fd=", fd, ": ", os.Errno(e).String(), "\n")
}
- p.events[fd] = 0, false;
+ p.events[fd] = 0, false
}
}
@@ -107,13 +107,13 @@ func (p *pollster) DelFD(fd int, mode int) {
func (p *pollster) WaitFD(nsec int64) (fd int, mode int, err os.Error) {
// Get an event.
- var evarray [1]syscall.EpollEvent;
- ev := &evarray[0];
- var msec int = -1;
+ var evarray [1]syscall.EpollEvent
+ ev := &evarray[0]
+ var msec int = -1
if nsec > 0 {
msec = int((nsec + 1e6 - 1) / 1e6)
}
- n, e := syscall.EpollWait(p.epfd, &evarray, msec);
+ n, e := syscall.EpollWait(p.epfd, &evarray, msec)
for e == syscall.EAGAIN || e == syscall.EINTR {
n, e = syscall.EpollWait(p.epfd, &evarray, msec)
}
@@ -123,25 +123,25 @@ func (p *pollster) WaitFD(nsec int64) (fd int, mode int, err os.Error) {
if n == 0 {
return -1, 0, nil
}
- fd = int(ev.Fd);
+ fd = int(ev.Fd)
if ev.Events&writeFlags != 0 {
- p.StopWaiting(fd, writeFlags);
- return fd, 'w', nil;
+ p.StopWaiting(fd, writeFlags)
+ return fd, 'w', nil
}
if ev.Events&readFlags != 0 {
- p.StopWaiting(fd, readFlags);
- return fd, 'r', nil;
+ p.StopWaiting(fd, readFlags)
+ return fd, 'r', nil
}
// Other events are error conditions - wake whoever is waiting.
- events, _ := p.events[fd];
+ events, _ := p.events[fd]
if events&writeFlags != 0 {
- p.StopWaiting(fd, writeFlags);
- return fd, 'w', nil;
+ p.StopWaiting(fd, writeFlags)
+ return fd, 'w', nil
}
- p.StopWaiting(fd, readFlags);
- return fd, 'r', nil;
+ p.StopWaiting(fd, readFlags)
+ return fd, 'r', nil
}
func (p *pollster) Close() os.Error {
diff --git a/src/pkg/net/fd_nacl.go b/src/pkg/net/fd_nacl.go
index 22700fbed..d21db8b3a 100644
--- a/src/pkg/net/fd_nacl.go
+++ b/src/pkg/net/fd_nacl.go
@@ -5,8 +5,8 @@
package net
import (
- "os";
- "syscall";
+ "os"
+ "syscall"
)
type pollster struct{}
@@ -16,18 +16,18 @@ func newpollster() (p *pollster, err os.Error) {
}
func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
- _, err := newpollster();
- return err;
+ _, err := newpollster()
+ return err
}
func (p *pollster) StopWaiting(fd int, bits uint) {
}
-func (p *pollster) DelFD(fd int, mode int) {}
+func (p *pollster) DelFD(fd int, mode int) {}
func (p *pollster) WaitFD(nsec int64) (fd int, mode int, err os.Error) {
- _, err = newpollster();
- return;
+ _, err = newpollster()
+ return
}
-func (p *pollster) Close() os.Error { return nil }
+func (p *pollster) Close() os.Error { return nil }
diff --git a/src/pkg/net/ip.go b/src/pkg/net/ip.go
index db1552890..e090d3aa6 100644
--- a/src/pkg/net/ip.go
+++ b/src/pkg/net/ip.go
@@ -14,8 +14,8 @@ package net
// IP address lengths (bytes).
const (
- IPv4len = 4;
- IPv6len = 16;
+ IPv4len = 4
+ IPv6len = 16
)
// An IP is a single IP address, an array of bytes.
@@ -38,30 +38,30 @@ type IPMask []byte
// IPv4 returns the IP address (in 16-byte form) of the
// IPv4 address a.b.c.d.
func IPv4(a, b, c, d byte) IP {
- p := make(IP, IPv6len);
+ p := make(IP, IPv6len)
for i := 0; i < 10; i++ {
p[i] = 0
}
- p[10] = 0xff;
- p[11] = 0xff;
- p[12] = a;
- p[13] = b;
- p[14] = c;
- p[15] = d;
- return p;
+ p[10] = 0xff
+ p[11] = 0xff
+ p[12] = a
+ p[13] = b
+ p[14] = c
+ p[15] = d
+ return p
}
// Well-known IPv4 addresses
var (
- IPv4bcast = IPv4(255, 255, 255, 255); // broadcast
- IPv4allsys = IPv4(224, 0, 0, 1); // all systems
- IPv4allrouter = IPv4(224, 0, 0, 2); // all routers
- IPv4zero = IPv4(0, 0, 0, 0); // all zeros
+ IPv4bcast = IPv4(255, 255, 255, 255) // broadcast
+ IPv4allsys = IPv4(224, 0, 0, 1) // all systems
+ IPv4allrouter = IPv4(224, 0, 0, 2) // all routers
+ IPv4zero = IPv4(0, 0, 0, 0) // all zeros
)
// Well-known IPv6 addresses
var (
- IPzero = make(IP, IPv6len); // all zeros
+ IPzero = make(IP, IPv6len) // all zeros
)
// Is p all zeros?
@@ -71,7 +71,7 @@ func isZeros(p IP) bool {
return false
}
}
- return true;
+ return true
}
// To4 converts the IPv4 address ip to a 4-byte representation.
@@ -86,7 +86,7 @@ func (ip IP) To4() IP {
ip[11] == 0xff {
return ip[12:16]
}
- return nil;
+ return nil
}
// To16 converts the IP address ip to a 16-byte representation.
@@ -98,14 +98,14 @@ func (ip IP) To16() IP {
if len(ip) == IPv6len {
return ip
}
- return nil;
+ return nil
}
// Default route masks for IPv4.
var (
- classAMask = IPMask(IPv4(0xff, 0, 0, 0));
- classBMask = IPMask(IPv4(0xff, 0xff, 0, 0));
- classCMask = IPMask(IPv4(0xff, 0xff, 0xff, 0));
+ classAMask = IPMask(IPv4(0xff, 0, 0, 0))
+ classBMask = IPMask(IPv4(0xff, 0xff, 0, 0))
+ classCMask = IPMask(IPv4(0xff, 0xff, 0xff, 0))
)
// DefaultMask returns the default IP mask for the IP address ip.
@@ -123,20 +123,20 @@ func (ip IP) DefaultMask() IPMask {
default:
return classCMask
}
- return nil; // not reached
+ return nil // not reached
}
// Mask returns the result of masking the IP address ip with mask.
func (ip IP) Mask(mask IPMask) IP {
- n := len(ip);
+ n := len(ip)
if n != len(mask) {
return nil
}
- out := make(IP, n);
+ out := make(IP, n)
for i := 0; i < n; i++ {
out[i] = ip[i] & mask[i]
}
- return out;
+ return out
}
// Convert i to decimal string.
@@ -146,14 +146,14 @@ func itod(i uint) string {
}
// Assemble decimal in reverse order.
- var b [32]byte;
- bp := len(b);
+ var b [32]byte
+ bp := len(b)
for ; i > 0; i /= 10 {
- bp--;
- b[bp] = byte(i%10) + '0';
+ bp--
+ b[bp] = byte(i%10) + '0'
}
- return string(b[bp:]);
+ return string(b[bp:])
}
// Convert i to hexadecimal string.
@@ -163,14 +163,14 @@ func itox(i uint) string {
}
// Assemble hexadecimal in reverse order.
- var b [32]byte;
- bp := len(b);
+ var b [32]byte
+ bp := len(b)
for ; i > 0; i /= 16 {
- bp--;
- b[bp] = "0123456789abcdef"[byte(i%16)];
+ bp--
+ b[bp] = "0123456789abcdef"[byte(i%16)]
}
- return string(b[bp:]);
+ return string(b[bp:])
}
// String returns the string form of the IP address ip.
@@ -178,7 +178,7 @@ func itox(i uint) string {
// is dotted decimal ("74.125.19.99"). Otherwise the representation
// is IPv6 ("2001:4860:0:2001::68").
func (ip IP) String() string {
- p := ip;
+ p := ip
if len(ip) == 0 {
return ""
@@ -196,50 +196,50 @@ func (ip IP) String() string {
}
// Find longest run of zeros.
- e0 := -1;
- e1 := -1;
+ e0 := -1
+ e1 := -1
for i := 0; i < 16; i += 2 {
- j := i;
+ j := i
for j < 16 && p[j] == 0 && p[j+1] == 0 {
j += 2
}
if j > i && j-i > e1-e0 {
- e0 = i;
- e1 = j;
+ e0 = i
+ e1 = j
}
}
// Print with possible :: in place of run of zeros
- var s string;
+ var s string
for i := 0; i < 16; i += 2 {
if i == e0 {
- s += "::";
- i = e1;
+ s += "::"
+ i = e1
if i >= 16 {
break
}
} else if i > 0 {
s += ":"
}
- s += itox((uint(p[i]) << 8) | uint(p[i+1]));
+ s += itox((uint(p[i]) << 8) | uint(p[i+1]))
}
- return s;
+ return s
}
// If mask is a sequence of 1 bits followed by 0 bits,
// return the number of 1 bits.
func simpleMaskLength(mask IPMask) int {
- var i int;
+ var i int
for i = 0; i < len(mask); i++ {
if mask[i] != 0xFF {
break
}
}
- n := 8 * i;
- v := mask[i];
+ n := 8 * i
+ v := mask[i]
for v&0x80 != 0 {
- n++;
- v <<= 1;
+ n++
+ v <<= 1
}
if v != 0 {
return -1
@@ -249,7 +249,7 @@ func simpleMaskLength(mask IPMask) int {
return -1
}
}
- return n;
+ return n
}
// String returns the string representation of mask.
@@ -260,44 +260,44 @@ func simpleMaskLength(mask IPMask) int {
func (mask IPMask) String() string {
switch len(mask) {
case 4:
- n := simpleMaskLength(mask);
+ n := simpleMaskLength(mask)
if n >= 0 {
return itod(uint(n + (IPv6len-IPv4len)*8))
}
case 16:
- n := simpleMaskLength(mask);
+ n := simpleMaskLength(mask)
if n >= 0 {
return itod(uint(n))
}
}
- return IP(mask).String();
+ return IP(mask).String()
}
// Parse IPv4 address (d.d.d.d).
func parseIPv4(s string) IP {
- var p [IPv4len]byte;
- i := 0;
+ var p [IPv4len]byte
+ i := 0
for j := 0; j < IPv4len; j++ {
if j > 0 {
if s[i] != '.' {
return nil
}
- i++;
+ i++
}
var (
- n int;
- ok bool;
+ n int
+ ok bool
)
- n, i, ok = dtoi(s, i);
+ n, i, ok = dtoi(s, i)
if !ok || n > 0xFF {
return nil
}
- p[j] = byte(n);
+ p[j] = byte(n)
}
if i != len(s) {
return nil
}
- return IPv4(p[0], p[1], p[2], p[3]);
+ return IPv4(p[0], p[1], p[2], p[3])
}
// Parse IPv6 address. Many forms.
@@ -309,14 +309,14 @@ func parseIPv4(s string) IP {
// * The last 32 bits can be in IPv4 form.
// Thus, ::ffff:1.2.3.4 is the IPv4 address 1.2.3.4.
func parseIPv6(s string) IP {
- p := make(IP, 16);
- ellipsis := -1; // position of ellipsis in p
- i := 0; // index in string s
+ p := make(IP, 16)
+ ellipsis := -1 // position of ellipsis in p
+ i := 0 // index in string s
// Might have leading ellipsis
if len(s) >= 2 && s[0] == ':' && s[1] == ':' {
- ellipsis = 0;
- i = 2;
+ ellipsis = 0
+ i = 2
// Might be only ellipsis
if i == len(s) {
return p
@@ -324,10 +324,10 @@ func parseIPv6(s string) IP {
}
// Loop, parsing hex numbers followed by colon.
- j := 0;
-L: for j < IPv6len {
+ j := 0
+L: for j < IPv6len {
// Hex number.
- n, i1, ok := xtoi(s, i);
+ n, i1, ok := xtoi(s, i)
if !ok || n > 0xFFFF {
return nil
}
@@ -342,26 +342,26 @@ L: for j < IPv6len {
// Not enough room.
return nil
}
- p4 := parseIPv4(s[i:]);
+ p4 := parseIPv4(s[i:])
if p4 == nil {
return nil
}
- p[j] = p4[12];
- p[j+1] = p4[13];
- p[j+2] = p4[14];
- p[j+3] = p4[15];
- i = len(s);
- j += 4;
- break;
+ p[j] = p4[12]
+ p[j+1] = p4[13]
+ p[j+2] = p4[14]
+ p[j+3] = p4[15]
+ i = len(s)
+ j += 4
+ break
}
// Save this 16-bit chunk.
- p[j] = byte(n >> 8);
- p[j+1] = byte(n);
- j += 2;
+ p[j] = byte(n >> 8)
+ p[j+1] = byte(n)
+ j += 2
// Stop at end of string.
- i = i1;
+ i = i1
if i == len(s) {
break
}
@@ -370,15 +370,15 @@ L: for j < IPv6len {
if s[i] != ':' && i+1 == len(s) {
return nil
}
- i++;
+ i++
// Look for ellipsis.
if s[i] == ':' {
- if ellipsis >= 0 { // already have one
+ if ellipsis >= 0 { // already have one
return nil
}
- ellipsis = j;
- if i++; i == len(s) { // can be at end
+ ellipsis = j
+ if i++; i == len(s) { // can be at end
break
}
}
@@ -394,7 +394,7 @@ L: for j < IPv6len {
if ellipsis < 0 {
return nil
}
- n := IPv6len - j;
+ n := IPv6len - j
for k := j - 1; k >= ellipsis; k-- {
p[k+n] = p[k]
}
@@ -402,7 +402,7 @@ L: for j < IPv6len {
p[k] = 0
}
}
- return p;
+ return p
}
// ParseIP parses s as an IP address, returning the result.
@@ -411,9 +411,9 @@ L: for j < IPv6len {
// If s is not a valid textual representation of an IP address,
// ParseIP returns nil.
func ParseIP(s string) IP {
- p := parseIPv4(s);
+ p := parseIPv4(s)
if p != nil {
return p
}
- return parseIPv6(s);
+ return parseIPv6(s)
}
diff --git a/src/pkg/net/ip_test.go b/src/pkg/net/ip_test.go
index 7cca831b5..0ea1d9260 100644
--- a/src/pkg/net/ip_test.go
+++ b/src/pkg/net/ip_test.go
@@ -5,7 +5,7 @@
package net
import (
- "testing";
+ "testing"
)
func isEqual(a, b IP) bool {
@@ -20,12 +20,12 @@ func isEqual(a, b IP) bool {
return false
}
}
- return true;
+ return true
}
type parseIPTest struct {
- in string;
- out IP;
+ in string
+ out IP
}
var parseiptests = []parseIPTest{
@@ -44,7 +44,7 @@ var parseiptests = []parseIPTest{
func TestParseIP(t *testing.T) {
for i := 0; i < len(parseiptests); i++ {
- tt := parseiptests[i];
+ tt := parseiptests[i]
if out := ParseIP(tt.in); !isEqual(out, tt.out) {
t.Errorf("ParseIP(%#q) = %v, want %v", tt.in, out, tt.out)
}
diff --git a/src/pkg/net/ipsock.go b/src/pkg/net/ipsock.go
index f61d22ac9..879bae33e 100644
--- a/src/pkg/net/ipsock.go
+++ b/src/pkg/net/ipsock.go
@@ -7,8 +7,8 @@
package net
import (
- "os";
- "syscall";
+ "os"
+ "syscall"
)
// Should we try to use the IPv4 socket interface if we're
@@ -22,11 +22,11 @@ func kernelSupportsIPv6() bool {
if syscall.OS == "freebsd" {
return false
}
- fd, e := syscall.Socket(syscall.AF_INET6, syscall.SOCK_STREAM, syscall.IPPROTO_TCP);
+ fd, e := syscall.Socket(syscall.AF_INET6, syscall.SOCK_STREAM, syscall.IPPROTO_TCP)
if fd >= 0 {
syscall.Close(fd)
}
- return e == 0;
+ return e == 0
}
var preferIPv4 = !kernelSupportsIPv6()
@@ -34,22 +34,22 @@ var preferIPv4 = !kernelSupportsIPv6()
// TODO(rsc): if syscall.OS == "linux", we're supposd to read
// /proc/sys/net/core/somaxconn,
// to take advantage of kernels that have raised the limit.
-func listenBacklog() int { return syscall.SOMAXCONN }
+func listenBacklog() int { return syscall.SOMAXCONN }
// Internet sockets (TCP, UDP)
// A sockaddr represents a TCP or UDP network address that can
// be converted into a syscall.Sockaddr.
type sockaddr interface {
- Addr;
- sockaddr(family int) (syscall.Sockaddr, os.Error);
- family() int;
+ Addr
+ sockaddr(family int) (syscall.Sockaddr, os.Error)
+ family() int
}
func internetSocket(net string, laddr, raddr sockaddr, proto int, mode string, toAddr func(syscall.Sockaddr) Addr) (fd *netFD, err os.Error) {
// Figure out IP version.
// If network has a suffix like "tcp4", obey it.
- family := syscall.AF_INET6;
+ family := syscall.AF_INET6
switch net[len(net)-1] {
case '4':
family = syscall.AF_INET
@@ -65,7 +65,7 @@ func internetSocket(net string, laddr, raddr sockaddr, proto int, mode string, t
}
}
- var la, ra syscall.Sockaddr;
+ var la, ra syscall.Sockaddr
if laddr != nil {
if la, err = laddr.sockaddr(family); err != nil {
goto Error
@@ -76,25 +76,25 @@ func internetSocket(net string, laddr, raddr sockaddr, proto int, mode string, t
goto Error
}
}
- fd, err = socket(net, family, proto, 0, la, ra, toAddr);
+ fd, err = socket(net, family, proto, 0, la, ra, toAddr)
if err != nil {
goto Error
}
- return fd, nil;
+ return fd, nil
Error:
- addr := raddr;
+ addr := raddr
if mode == "listen" {
addr = laddr
}
- return nil, &OpError{mode, net, addr, err};
+ return nil, &OpError{mode, net, addr, err}
}
func getip(fd int, remote bool) (ip []byte, port int, ok bool) {
// No attempt at error reporting because
// there are no possible errors, and the
// caller won't report them anyway.
- var sa syscall.Sockaddr;
+ var sa syscall.Sockaddr
if remote {
sa, _ = syscall.Getpeername(fd)
} else {
@@ -106,7 +106,7 @@ func getip(fd int, remote bool) (ip []byte, port int, ok bool) {
case *syscall.SockaddrInet6:
return &sa.Addr, sa.Port, true
}
- return;
+ return
}
func ipToSockaddr(family int, ip IP, port int) (syscall.Sockaddr, os.Error) {
@@ -118,12 +118,12 @@ func ipToSockaddr(family int, ip IP, port int) (syscall.Sockaddr, os.Error) {
if ip = ip.To4(); ip == nil {
return nil, os.EINVAL
}
- s := new(syscall.SockaddrInet4);
+ s := new(syscall.SockaddrInet4)
for i := 0; i < IPv4len; i++ {
s.Addr[i] = ip[i]
}
- s.Port = port;
- return s, nil;
+ s.Port = port
+ return s, nil
case syscall.AF_INET6:
if len(ip) == 0 {
ip = IPzero
@@ -137,27 +137,27 @@ func ipToSockaddr(family int, ip IP, port int) (syscall.Sockaddr, os.Error) {
if ip = ip.To16(); ip == nil {
return nil, os.EINVAL
}
- s := new(syscall.SockaddrInet6);
+ s := new(syscall.SockaddrInet6)
for i := 0; i < IPv6len; i++ {
s.Addr[i] = ip[i]
}
- s.Port = port;
- return s, nil;
+ s.Port = port
+ return s, nil
}
- return nil, os.EINVAL;
+ return nil, os.EINVAL
}
// Split "host:port" into "host" and "port".
// Host cannot contain colons unless it is bracketed.
func splitHostPort(hostport string) (host, port string, err os.Error) {
// The port starts after the last colon.
- i := last(hostport, ':');
+ i := last(hostport, ':')
if i < 0 {
- err = &AddrError{"missing port in address", hostport};
- return;
+ err = &AddrError{"missing port in address", hostport}
+ return
}
- host, port = hostport[0:i], hostport[i+1:];
+ host, port = hostport[0:i], hostport[i+1:]
// Can put brackets around host ...
if len(host) > 0 && host[0] == '[' && host[len(host)-1] == ']' {
@@ -165,11 +165,11 @@ func splitHostPort(hostport string) (host, port string, err os.Error) {
} else {
// ... but if there are no brackets, no colons.
if byteIndex(host, ':') >= 0 {
- err = &AddrError{"too many colons in address", hostport};
- return;
+ err = &AddrError{"too many colons in address", hostport}
+ return
}
}
- return;
+ return
}
// Join "host" and "port" into "host:port".
@@ -179,50 +179,50 @@ func joinHostPort(host, port string) string {
if byteIndex(host, ':') >= 0 {
return "[" + host + "]:" + port
}
- return host + ":" + port;
+ return host + ":" + port
}
// Convert "host:port" into IP address and port.
func hostPortToIP(net, hostport string) (ip IP, iport int, err os.Error) {
- host, port, err := splitHostPort(hostport);
+ host, port, err := splitHostPort(hostport)
if err != nil {
goto Error
}
- var addr IP;
+ var addr IP
if host != "" {
// Try as an IP address.
- addr = ParseIP(host);
+ addr = ParseIP(host)
if addr == nil {
// Not an IP address. Try as a DNS name.
- _, addrs, err1 := LookupHost(host);
+ _, addrs, err1 := LookupHost(host)
if err1 != nil {
- err = err1;
- goto Error;
+ err = err1
+ goto Error
}
- addr = ParseIP(addrs[0]);
+ addr = ParseIP(addrs[0])
if addr == nil {
// should not happen
- err = &AddrError{"LookupHost returned invalid address", addrs[0]};
- goto Error;
+ err = &AddrError{"LookupHost returned invalid address", addrs[0]}
+ goto Error
}
}
}
- p, i, ok := dtoi(port, 0);
+ p, i, ok := dtoi(port, 0)
if !ok || i != len(port) {
- p, err = LookupPort(net, port);
+ p, err = LookupPort(net, port)
if err != nil {
goto Error
}
}
if p < 0 || p > 0xFFFF {
- err = &AddrError{"invalid port", port};
- goto Error;
+ err = &AddrError{"invalid port", port}
+ goto Error
}
- return addr, p, nil;
+ return addr, p, nil
Error:
- return nil, 0, err;
+ return nil, 0, err
}
diff --git a/src/pkg/net/net.go b/src/pkg/net/net.go
index c72f5c1fd..5e6ba8c20 100644
--- a/src/pkg/net/net.go
+++ b/src/pkg/net/net.go
@@ -15,8 +15,8 @@ import "os"
// Addr represents a network end point address.
type Addr interface {
- Network() string; // name of the network
- String() string; // string form of address
+ Network() string // name of the network
+ String() string // string form of address
}
// Conn is a generic stream-oriented network connection.
@@ -24,37 +24,37 @@ type Conn interface {
// Read reads data from the connection.
// Read can be made to time out and return err == os.EAGAIN
// after a fixed time limit; see SetTimeout and SetReadTimeout.
- Read(b []byte) (n int, err os.Error);
+ Read(b []byte) (n int, err os.Error)
// Write writes data to the connection.
// Write can be made to time out and return err == os.EAGAIN
// after a fixed time limit; see SetTimeout and SetReadTimeout.
- Write(b []byte) (n int, err os.Error);
+ Write(b []byte) (n int, err os.Error)
// Close closes the connection.
- Close() os.Error;
+ Close() os.Error
// LocalAddr returns the local network address.
- LocalAddr() Addr;
+ LocalAddr() Addr
// RemoteAddr returns the remote network address.
- RemoteAddr() Addr;
+ RemoteAddr() Addr
// SetTimeout sets the read and write deadlines associated
// with the connection.
- SetTimeout(nsec int64) os.Error;
+ SetTimeout(nsec int64) os.Error
// SetReadTimeout sets the time (in nanoseconds) that
// Read will wait for data before returning os.EAGAIN.
// Setting nsec == 0 (the default) disables the deadline.
- SetReadTimeout(nsec int64) os.Error;
+ SetReadTimeout(nsec int64) os.Error
// SetWriteTimeout sets the time (in nanoseconds) that
// Write will wait to send its data before returning os.EAGAIN.
// Setting nsec == 0 (the default) disables the deadline.
// Even if write times out, it may return n > 0, indicating that
// some of the data was successfully written.
- SetWriteTimeout(nsec int64) os.Error;
+ SetWriteTimeout(nsec int64) os.Error
}
// PacketConn is a generic packet-oriented network connection.
@@ -65,43 +65,43 @@ type PacketConn interface {
// was on the packet.
// ReadFrom can be made to time out and return err == os.EAGAIN
// after a fixed time limit; see SetTimeout and SetReadTimeout.
- ReadFrom(b []byte) (n int, addr Addr, err os.Error);
+ ReadFrom(b []byte) (n int, addr Addr, err os.Error)
// WriteTo writes a packet with payload b to addr.
// WriteTo can be made to time out and return err == os.EAGAIN
// after a fixed time limit; see SetTimeout and SetWriteTimeout.
// On packet-oriented connections, write timeouts are rare.
- WriteTo(b []byte, addr Addr) (n int, err os.Error);
+ WriteTo(b []byte, addr Addr) (n int, err os.Error)
// Close closes the connection.
- Close() os.Error;
+ Close() os.Error
// LocalAddr returns the local network address.
- LocalAddr() Addr;
+ LocalAddr() Addr
// SetTimeout sets the read and write deadlines associated
// with the connection.
- SetTimeout(nsec int64) os.Error;
+ SetTimeout(nsec int64) os.Error
// SetReadTimeout sets the time (in nanoseconds) that
// Read will wait for data before returning os.EAGAIN.
// Setting nsec == 0 (the default) disables the deadline.
- SetReadTimeout(nsec int64) os.Error;
+ SetReadTimeout(nsec int64) os.Error
// SetWriteTimeout sets the time (in nanoseconds) that
// Write will wait to send its data before returning os.EAGAIN.
// Setting nsec == 0 (the default) disables the deadline.
// Even if write times out, it may return n > 0, indicating that
// some of the data was successfully written.
- SetWriteTimeout(nsec int64) os.Error;
+ SetWriteTimeout(nsec int64) os.Error
}
// A Listener is a generic network listener for stream-oriented protocols.
// Accept waits for the next connection and Close closes the connection.
type Listener interface {
- Accept() (c Conn, err os.Error);
- Close() os.Error;
- Addr() Addr; // Listener's network address
+ Accept() (c Conn, err os.Error)
+ Close() os.Error
+ Addr() Addr // Listener's network address
}
// Dial connects to the remote address raddr on the network net.
@@ -123,7 +123,7 @@ type Listener interface {
func Dial(net, laddr, raddr string) (c Conn, err os.Error) {
switch net {
case "tcp", "tcp4", "tcp6":
- var la, ra *TCPAddr;
+ var la, ra *TCPAddr
if laddr != "" {
if la, err = ResolveTCPAddr(laddr); err != nil {
goto Error
@@ -134,9 +134,9 @@ func Dial(net, laddr, raddr string) (c Conn, err os.Error) {
goto Error
}
}
- return DialTCP(net, la, ra);
+ return DialTCP(net, la, ra)
case "udp", "udp4", "upd6":
- var la, ra *UDPAddr;
+ var la, ra *UDPAddr
if laddr != "" {
if la, err = ResolveUDPAddr(laddr); err != nil {
goto Error
@@ -147,9 +147,9 @@ func Dial(net, laddr, raddr string) (c Conn, err os.Error) {
goto Error
}
}
- return DialUDP(net, la, ra);
+ return DialUDP(net, la, ra)
case "unix", "unixgram":
- var la, ra *UnixAddr;
+ var la, ra *UnixAddr
if raddr != "" {
if ra, err = ResolveUnixAddr(net, raddr); err != nil {
goto Error
@@ -160,11 +160,11 @@ func Dial(net, laddr, raddr string) (c Conn, err os.Error) {
goto Error
}
}
- return DialUnix(net, la, ra);
+ return DialUnix(net, la, ra)
}
- err = UnknownNetworkError(net);
+ err = UnknownNetworkError(net)
Error:
- return nil, &OpError{"dial", net + " " + raddr, nil, err};
+ return nil, &OpError{"dial", net + " " + raddr, nil, err}
}
// Listen announces on the local network address laddr.
@@ -173,31 +173,31 @@ Error:
func Listen(net, laddr string) (l Listener, err os.Error) {
switch net {
case "tcp", "tcp4", "tcp6":
- var la *TCPAddr;
+ var la *TCPAddr
if laddr != "" {
if la, err = ResolveTCPAddr(laddr); err != nil {
return nil, err
}
}
- l, err := ListenTCP(net, la);
+ l, err := ListenTCP(net, la)
if err != nil {
return nil, err
}
- return l, nil;
+ return l, nil
case "unix":
- var la *UnixAddr;
+ var la *UnixAddr
if laddr != "" {
if la, err = ResolveUnixAddr(net, laddr); err != nil {
return nil, err
}
}
- l, err := ListenUnix(net, la);
+ l, err := ListenUnix(net, la)
if err != nil {
return nil, err
}
- return l, nil;
+ return l, nil
}
- return nil, UnknownNetworkError(net);
+ return nil, UnknownNetworkError(net)
}
// ListenPacket announces on the local network address laddr.
@@ -206,67 +206,67 @@ func Listen(net, laddr string) (l Listener, err os.Error) {
func ListenPacket(net, laddr string) (c PacketConn, err os.Error) {
switch net {
case "udp", "udp4", "udp6":
- var la *UDPAddr;
+ var la *UDPAddr
if laddr != "" {
if la, err = ResolveUDPAddr(laddr); err != nil {
return nil, err
}
}
- c, err := ListenUDP(net, la);
+ c, err := ListenUDP(net, la)
if err != nil {
return nil, err
}
- return c, nil;
+ return c, nil
case "unixgram":
- var la *UnixAddr;
+ var la *UnixAddr
if laddr != "" {
if la, err = ResolveUnixAddr(net, laddr); err != nil {
return nil, err
}
}
- c, err := DialUnix(net, la, nil);
+ c, err := DialUnix(net, la, nil)
if err != nil {
return nil, err
}
- return c, nil;
+ return c, nil
}
- return nil, UnknownNetworkError(net);
+ return nil, UnknownNetworkError(net)
}
var errMissingAddress = os.ErrorString("missing address")
type OpError struct {
- Op string;
- Net string;
- Addr Addr;
- Error os.Error;
+ Op string
+ Net string
+ Addr Addr
+ Error os.Error
}
func (e *OpError) String() string {
- s := e.Op;
+ s := e.Op
if e.Net != "" {
s += " " + e.Net
}
if e.Addr != nil {
s += " " + e.Addr.String()
}
- s += ": " + e.Error.String();
- return s;
+ s += ": " + e.Error.String()
+ return s
}
type AddrError struct {
- Error string;
- Addr string;
+ Error string
+ Addr string
}
func (e *AddrError) String() string {
- s := e.Error;
+ s := e.Error
if e.Addr != "" {
s += " " + e.Addr
}
- return s;
+ return s
}
type UnknownNetworkError string
-func (e UnknownNetworkError) String() string { return "unknown network " + string(e) }
+func (e UnknownNetworkError) String() string { return "unknown network " + string(e) }
diff --git a/src/pkg/net/net_test.go b/src/pkg/net/net_test.go
index 43c10f1d0..72f7303ea 100644
--- a/src/pkg/net/net_test.go
+++ b/src/pkg/net/net_test.go
@@ -5,18 +5,18 @@
package net
import (
- "flag";
- "regexp";
- "testing";
+ "flag"
+ "regexp"
+ "testing"
)
var runErrorTest = flag.Bool("run_error_test", false, "let TestDialError check for dns errors")
type DialErrorTest struct {
- Net string;
- Laddr string;
- Raddr string;
- Pattern string;
+ Net string
+ Laddr string
+ Raddr string
+ Pattern string
}
var dialErrorTests = []DialErrorTest{
@@ -56,20 +56,20 @@ var dialErrorTests = []DialErrorTest{
func TestDialError(t *testing.T) {
if !*runErrorTest {
- t.Logf("test disabled; use --run_error_test to enable");
- return;
+ t.Logf("test disabled; use --run_error_test to enable")
+ return
}
for i, tt := range dialErrorTests {
- c, e := Dial(tt.Net, tt.Laddr, tt.Raddr);
+ c, e := Dial(tt.Net, tt.Laddr, tt.Raddr)
if c != nil {
c.Close()
}
if e == nil {
- t.Errorf("#%d: nil error, want match for %#q", i, tt.Pattern);
- continue;
+ t.Errorf("#%d: nil error, want match for %#q", i, tt.Pattern)
+ continue
}
- s := e.String();
- match, _ := regexp.MatchString(tt.Pattern, s);
+ s := e.String()
+ match, _ := regexp.MatchString(tt.Pattern, s)
if !match {
t.Errorf("#%d: %q, want match for %#q", i, s, tt.Pattern)
}
diff --git a/src/pkg/net/parse.go b/src/pkg/net/parse.go
index c93f8335c..a7dcb35f0 100644
--- a/src/pkg/net/parse.go
+++ b/src/pkg/net/parse.go
@@ -8,34 +8,34 @@
package net
import (
- "io";
- "os";
+ "io"
+ "os"
)
type file struct {
- file *os.File;
- data []byte;
+ file *os.File
+ data []byte
}
-func (f *file) close() { f.file.Close() }
+func (f *file) close() { f.file.Close() }
func (f *file) getLineFromData() (s string, ok bool) {
- data := f.data;
+ data := f.data
for i := 0; i < len(data); i++ {
if data[i] == '\n' {
- s = string(data[0:i]);
- ok = true;
+ s = string(data[0:i])
+ ok = true
// move data
- i++;
- n := len(data) - i;
+ i++
+ n := len(data) - i
for j := 0; j < n; j++ {
data[j] = data[i+j]
}
- f.data = data[0:n];
- return;
+ f.data = data[0:n]
+ return
}
}
- return;
+ return
}
func (f *file) readLine() (s string, ok bool) {
@@ -43,22 +43,22 @@ func (f *file) readLine() (s string, ok bool) {
return
}
if len(f.data) < cap(f.data) {
- ln := len(f.data);
- n, _ := io.ReadFull(f.file, f.data[ln:cap(f.data)]);
+ ln := len(f.data)
+ n, _ := io.ReadFull(f.file, f.data[ln:cap(f.data)])
if n >= 0 {
f.data = f.data[0 : ln+n]
}
}
- s, ok = f.getLineFromData();
- return;
+ s, ok = f.getLineFromData()
+ return
}
func open(name string) (*file, os.Error) {
- fd, err := os.Open(name, os.O_RDONLY, 0);
+ fd, err := os.Open(name, os.O_RDONLY, 0)
if err != nil {
return nil, err
}
- return &file{fd, make([]byte, 1024)[0:0]}, nil;
+ return &file{fd, make([]byte, 1024)[0:0]}, nil
}
func byteIndex(s string, c byte) int {
@@ -67,42 +67,42 @@ func byteIndex(s string, c byte) int {
return i
}
}
- return -1;
+ return -1
}
// Count occurrences in s of any bytes in t.
func countAnyByte(s string, t string) int {
- n := 0;
+ n := 0
for i := 0; i < len(s); i++ {
if byteIndex(t, s[i]) >= 0 {
n++
}
}
- return n;
+ return n
}
// Split s at any bytes in t.
func splitAtBytes(s string, t string) []string {
- a := make([]string, 1+countAnyByte(s, t));
- n := 0;
- last := 0;
+ a := make([]string, 1+countAnyByte(s, t))
+ n := 0
+ last := 0
for i := 0; i < len(s); i++ {
if byteIndex(t, s[i]) >= 0 {
if last < i {
- a[n] = string(s[last:i]);
- n++;
+ a[n] = string(s[last:i])
+ n++
}
- last = i + 1;
+ last = i + 1
}
}
if last < len(s) {
- a[n] = string(s[last:]);
- n++;
+ a[n] = string(s[last:])
+ n++
}
- return a[0:n];
+ return a[0:n]
}
-func getFields(s string) []string { return splitAtBytes(s, " \r\t\n") }
+func getFields(s string) []string { return splitAtBytes(s, " \r\t\n") }
// Bigger than we need, not too big to worry about overflow
const big = 0xFFFFFF
@@ -110,9 +110,9 @@ const big = 0xFFFFFF
// Decimal to integer starting at &s[i0].
// Returns number, new offset, success.
func dtoi(s string, i0 int) (n int, i int, ok bool) {
- n = 0;
+ n = 0
for i = i0; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
- n = n*10 + int(s[i]-'0');
+ n = n*10 + int(s[i]-'0')
if n >= big {
return 0, i, false
}
@@ -120,23 +120,23 @@ func dtoi(s string, i0 int) (n int, i int, ok bool) {
if i == i0 {
return 0, i, false
}
- return n, i, true;
+ return n, i, true
}
// Hexadecimal to integer starting at &s[i0].
// Returns number, new offset, success.
func xtoi(s string, i0 int) (n int, i int, ok bool) {
- n = 0;
+ n = 0
for i = i0; i < len(s); i++ {
if '0' <= s[i] && s[i] <= '9' {
- n *= 16;
- n += int(s[i] - '0');
+ n *= 16
+ n += int(s[i] - '0')
} else if 'a' <= s[i] && s[i] <= 'f' {
- n *= 16;
- n += int(s[i]-'a') + 10;
+ n *= 16
+ n += int(s[i]-'a') + 10
} else if 'A' <= s[i] && s[i] <= 'F' {
- n *= 16;
- n += int(s[i]-'A') + 10;
+ n *= 16
+ n += int(s[i]-'A') + 10
} else {
break
}
@@ -147,49 +147,49 @@ func xtoi(s string, i0 int) (n int, i int, ok bool) {
if i == i0 {
return 0, i, false
}
- return n, i, true;
+ return n, i, true
}
// Integer to decimal.
func itoa(i int) string {
- var buf [30]byte;
- n := len(buf);
- neg := false;
+ var buf [30]byte
+ n := len(buf)
+ neg := false
if i < 0 {
- i = -i;
- neg = true;
+ i = -i
+ neg = true
}
- ui := uint(i);
+ ui := uint(i)
for ui > 0 || n == len(buf) {
- n--;
- buf[n] = byte('0' + ui%10);
- ui /= 10;
+ n--
+ buf[n] = byte('0' + ui%10)
+ ui /= 10
}
if neg {
- n--;
- buf[n] = '-';
+ n--
+ buf[n] = '-'
}
- return string(buf[n:]);
+ return string(buf[n:])
}
// Number of occurrences of b in s.
func count(s string, b byte) int {
- n := 0;
+ n := 0
for i := 0; i < len(s); i++ {
if s[i] == b {
n++
}
}
- return n;
+ return n
}
// Index of rightmost occurrence of b in s.
func last(s string, b byte) int {
- i := len(s);
+ i := len(s)
for i--; i >= 0; i-- {
if s[i] == b {
break
}
}
- return i;
+ return i
}
diff --git a/src/pkg/net/parse_test.go b/src/pkg/net/parse_test.go
index 29b0fc0ce..d011c0076 100644
--- a/src/pkg/net/parse_test.go
+++ b/src/pkg/net/parse_test.go
@@ -5,34 +5,34 @@
package net
import (
- "bufio";
- "os";
- "testing";
+ "bufio"
+ "os"
+ "testing"
)
func TestReadLine(t *testing.T) {
- filename := "/etc/services"; // a nice big file
+ filename := "/etc/services" // a nice big file
- fd, err := os.Open(filename, os.O_RDONLY, 0);
+ fd, err := os.Open(filename, os.O_RDONLY, 0)
if err != nil {
t.Fatalf("open %s: %v", filename, err)
}
- br := bufio.NewReader(fd);
+ br := bufio.NewReader(fd)
- var file *file;
- file, err = open(filename);
+ var file *file
+ file, err = open(filename)
if file == nil {
t.Fatalf("net.open(%s) = nil", filename)
}
- lineno := 1;
- byteno := 0;
+ lineno := 1
+ byteno := 0
for {
- bline, berr := br.ReadString('\n');
+ bline, berr := br.ReadString('\n')
if n := len(bline); n > 0 {
bline = bline[0 : n-1]
}
- line, ok := file.readLine();
+ line, ok := file.readLine()
if (berr != nil) != !ok || bline != line {
t.Fatalf("%s:%d (#%d)\nbufio => %q, %v\nnet => %q, %v",
filename, lineno, byteno, bline, berr, line, ok)
@@ -40,7 +40,7 @@ func TestReadLine(t *testing.T) {
if !ok {
break
}
- lineno++;
- byteno += len(line) + 1;
+ lineno++
+ byteno += len(line) + 1
}
}
diff --git a/src/pkg/net/port.go b/src/pkg/net/port.go
index b496f5308..5f182d0d1 100644
--- a/src/pkg/net/port.go
+++ b/src/pkg/net/port.go
@@ -7,49 +7,49 @@
package net
import (
- "once";
- "os";
+ "once"
+ "os"
)
var services map[string]map[string]int
var servicesError os.Error
func readServices() {
- services = make(map[string]map[string]int);
- var file *file;
- file, servicesError = open("/etc/services");
+ services = make(map[string]map[string]int)
+ var file *file
+ file, servicesError = open("/etc/services")
for line, ok := file.readLine(); ok; line, ok = file.readLine() {
// "http 80/tcp www www-http # World Wide Web HTTP"
if i := byteIndex(line, '#'); i >= 0 {
line = line[0:i]
}
- f := getFields(line);
+ f := getFields(line)
if len(f) < 2 {
continue
}
- portnet := f[1]; // "tcp/80"
- port, j, ok := dtoi(portnet, 0);
+ portnet := f[1] // "tcp/80"
+ port, j, ok := dtoi(portnet, 0)
if !ok || port <= 0 || j >= len(portnet) || portnet[j] != '/' {
continue
}
- netw := portnet[j+1:]; // "tcp"
- m, ok1 := services[netw];
+ netw := portnet[j+1:] // "tcp"
+ m, ok1 := services[netw]
if !ok1 {
- m = make(map[string]int);
- services[netw] = m;
+ m = make(map[string]int)
+ services[netw] = m
}
for i := 0; i < len(f); i++ {
- if i != 1 { // f[1] was port/net
+ if i != 1 { // f[1] was port/net
m[f[i]] = port
}
}
}
- file.close();
+ file.close()
}
// LookupPort looks up the port for the given network and service.
func LookupPort(network, service string) (port int, err os.Error) {
- once.Do(readServices);
+ once.Do(readServices)
switch network {
case "tcp4", "tcp6":
@@ -63,5 +63,5 @@ func LookupPort(network, service string) (port int, err os.Error) {
return
}
}
- return 0, &AddrError{"unknown port", network + "/" + service};
+ return 0, &AddrError{"unknown port", network + "/" + service}
}
diff --git a/src/pkg/net/port_test.go b/src/pkg/net/port_test.go
index 9a58d3731..4eb53dc93 100644
--- a/src/pkg/net/port_test.go
+++ b/src/pkg/net/port_test.go
@@ -5,14 +5,14 @@
package net
import (
- "testing";
+ "testing"
)
type portTest struct {
- netw string;
- name string;
- port int;
- ok bool;
+ netw string
+ name string
+ port int
+ ok bool
}
var porttests = []portTest{
@@ -49,7 +49,7 @@ var porttests = []portTest{
func TestLookupPort(t *testing.T) {
for i := 0; i < len(porttests); i++ {
- tt := porttests[i];
+ tt := porttests[i]
if port, err := LookupPort(tt.netw, tt.name); port != tt.port || (err == nil) != tt.ok {
t.Errorf("LookupPort(%q, %q) = %v, %s; want %v",
tt.netw, tt.name, port, err, tt.port)
diff --git a/src/pkg/net/server_test.go b/src/pkg/net/server_test.go
index 404108106..3b8f1c935 100644
--- a/src/pkg/net/server_test.go
+++ b/src/pkg/net/server_test.go
@@ -5,12 +5,12 @@
package net
import (
- "flag";
- "io";
- "os";
- "strings";
- "syscall";
- "testing";
+ "flag"
+ "io"
+ "os"
+ "strings"
+ "syscall"
+ "testing"
)
// Do not test empty datagrams by default.
@@ -20,97 +20,97 @@ import (
var testEmptyDatagrams = flag.Bool("empty_datagrams", false, "whether to test empty datagrams")
func runEcho(fd io.ReadWriter, done chan<- int) {
- var buf [1024]byte;
+ var buf [1024]byte
for {
- n, err := fd.Read(&buf);
+ n, err := fd.Read(&buf)
if err != nil || n == 0 {
break
}
- fd.Write(buf[0:n]);
+ fd.Write(buf[0:n])
}
- done <- 1;
+ done <- 1
}
func runServe(t *testing.T, network, addr string, listening chan<- string, done chan<- int) {
- l, err := Listen(network, addr);
+ l, err := Listen(network, addr)
if err != nil {
t.Fatalf("net.Listen(%q, %q) = _, %v", network, addr, err)
}
- listening <- l.Addr().String();
+ listening <- l.Addr().String()
for {
- fd, err := l.Accept();
+ fd, err := l.Accept()
if err != nil {
break
}
- echodone := make(chan int);
- go runEcho(fd, echodone);
- <-echodone; // make sure Echo stops
- l.Close();
+ echodone := make(chan int)
+ go runEcho(fd, echodone)
+ <-echodone // make sure Echo stops
+ l.Close()
}
- done <- 1;
+ done <- 1
}
func connect(t *testing.T, network, addr string, isEmpty bool) {
- var laddr string;
+ var laddr string
if network == "unixgram" {
laddr = addr + ".local"
}
- fd, err := Dial(network, laddr, addr);
+ fd, err := Dial(network, laddr, addr)
if err != nil {
t.Fatalf("net.Dial(%q, %q, %q) = _, %v", network, laddr, addr, err)
}
- fd.SetReadTimeout(1e9); // 1s
+ fd.SetReadTimeout(1e9) // 1s
- var b []byte;
+ var b []byte
if !isEmpty {
b = strings.Bytes("hello, world\n")
}
- var b1 [100]byte;
+ var b1 [100]byte
- n, err := fd.Write(b);
+ n, err := fd.Write(b)
if n != len(b) {
t.Fatalf("fd.Write(%q) = %d, %v", b, n, err)
}
- n, err = fd.Read(&b1);
+ n, err = fd.Read(&b1)
if n != len(b) || err != nil {
t.Fatalf("fd.Read() = %d, %v (want %d, nil)", n, err, len(b))
}
- fd.Close();
+ fd.Close()
}
func doTest(t *testing.T, network, listenaddr, dialaddr string) {
- t.Logf("Test %s %s %s\n", network, listenaddr, dialaddr);
- listening := make(chan string);
- done := make(chan int);
+ t.Logf("Test %s %s %s\n", network, listenaddr, dialaddr)
+ listening := make(chan string)
+ done := make(chan int)
if network == "tcp" {
- listenaddr += ":0" // any available port
+ listenaddr += ":0" // any available port
}
- go runServe(t, network, listenaddr, listening, done);
- addr := <-listening; // wait for server to start
+ go runServe(t, network, listenaddr, listening, done)
+ addr := <-listening // wait for server to start
if network == "tcp" {
dialaddr += addr[strings.LastIndex(addr, ":"):]
}
- connect(t, network, dialaddr, false);
- <-done; // make sure server stopped
+ connect(t, network, dialaddr, false)
+ <-done // make sure server stopped
}
func TestTCPServer(t *testing.T) {
- doTest(t, "tcp", "0.0.0.0", "127.0.0.1");
- doTest(t, "tcp", "", "127.0.0.1");
+ doTest(t, "tcp", "0.0.0.0", "127.0.0.1")
+ doTest(t, "tcp", "", "127.0.0.1")
if kernelSupportsIPv6() {
- doTest(t, "tcp", "[::]", "[::ffff:127.0.0.1]");
- doTest(t, "tcp", "[::]", "127.0.0.1");
- doTest(t, "tcp", "0.0.0.0", "[::ffff:127.0.0.1]");
+ doTest(t, "tcp", "[::]", "[::ffff:127.0.0.1]")
+ doTest(t, "tcp", "[::]", "127.0.0.1")
+ doTest(t, "tcp", "0.0.0.0", "[::ffff:127.0.0.1]")
}
}
func TestUnixServer(t *testing.T) {
- os.Remove("/tmp/gotest.net");
- doTest(t, "unix", "/tmp/gotest.net", "/tmp/gotest.net");
- os.Remove("/tmp/gotest.net");
+ os.Remove("/tmp/gotest.net")
+ doTest(t, "unix", "/tmp/gotest.net", "/tmp/gotest.net")
+ os.Remove("/tmp/gotest.net")
if syscall.OS == "linux" {
// Test abstract unix domain socket, a Linux-ism
doTest(t, "unix", "@gotest/net", "@gotest/net")
@@ -118,20 +118,20 @@ func TestUnixServer(t *testing.T) {
}
func runPacket(t *testing.T, network, addr string, listening chan<- string, done chan<- int) {
- c, err := ListenPacket(network, addr);
+ c, err := ListenPacket(network, addr)
if err != nil {
t.Fatalf("net.ListenPacket(%q, %q) = _, %v", network, addr, err)
}
- listening <- c.LocalAddr().String();
- c.SetReadTimeout(10e6); // 10ms
- var buf [1000]byte;
+ listening <- c.LocalAddr().String()
+ c.SetReadTimeout(10e6) // 10ms
+ var buf [1000]byte
for {
- n, addr, err := c.ReadFrom(&buf);
+ n, addr, err := c.ReadFrom(&buf)
if isEAGAIN(err) {
if done <- 1 {
break
}
- continue;
+ continue
}
if err != nil {
break
@@ -140,46 +140,46 @@ func runPacket(t *testing.T, network, addr string, listening chan<- string, done
t.Fatalf("WriteTo %v: %v", addr, err)
}
}
- c.Close();
- done <- 1;
+ c.Close()
+ done <- 1
}
func doTestPacket(t *testing.T, network, listenaddr, dialaddr string, isEmpty bool) {
- t.Logf("TestPacket %s %s %s\n", network, listenaddr, dialaddr);
- listening := make(chan string);
- done := make(chan int);
+ t.Logf("TestPacket %s %s %s\n", network, listenaddr, dialaddr)
+ listening := make(chan string)
+ done := make(chan int)
if network == "udp" {
- listenaddr += ":0" // any available port
+ listenaddr += ":0" // any available port
}
- go runPacket(t, network, listenaddr, listening, done);
- addr := <-listening; // wait for server to start
+ go runPacket(t, network, listenaddr, listening, done)
+ addr := <-listening // wait for server to start
if network == "udp" {
dialaddr += addr[strings.LastIndex(addr, ":"):]
}
- connect(t, network, dialaddr, isEmpty);
- <-done; // tell server to stop
- <-done; // wait for stop
+ connect(t, network, dialaddr, isEmpty)
+ <-done // tell server to stop
+ <-done // wait for stop
}
func TestUDPServer(t *testing.T) {
for _, isEmpty := range []bool{false, *testEmptyDatagrams} {
- doTestPacket(t, "udp", "0.0.0.0", "127.0.0.1", isEmpty);
- doTestPacket(t, "udp", "", "127.0.0.1", isEmpty);
+ doTestPacket(t, "udp", "0.0.0.0", "127.0.0.1", isEmpty)
+ doTestPacket(t, "udp", "", "127.0.0.1", isEmpty)
if kernelSupportsIPv6() {
- doTestPacket(t, "udp", "[::]", "[::ffff:127.0.0.1]", isEmpty);
- doTestPacket(t, "udp", "[::]", "127.0.0.1", isEmpty);
- doTestPacket(t, "udp", "0.0.0.0", "[::ffff:127.0.0.1]", isEmpty);
+ doTestPacket(t, "udp", "[::]", "[::ffff:127.0.0.1]", isEmpty)
+ doTestPacket(t, "udp", "[::]", "127.0.0.1", isEmpty)
+ doTestPacket(t, "udp", "0.0.0.0", "[::ffff:127.0.0.1]", isEmpty)
}
}
}
func TestUnixDatagramServer(t *testing.T) {
for _, isEmpty := range []bool{false, *testEmptyDatagrams} {
- os.Remove("/tmp/gotest1.net");
- os.Remove("/tmp/gotest1.net.local");
- doTestPacket(t, "unixgram", "/tmp/gotest1.net", "/tmp/gotest1.net", isEmpty);
- os.Remove("/tmp/gotest1.net");
- os.Remove("/tmp/gotest1.net.local");
+ os.Remove("/tmp/gotest1.net")
+ os.Remove("/tmp/gotest1.net.local")
+ doTestPacket(t, "unixgram", "/tmp/gotest1.net", "/tmp/gotest1.net", isEmpty)
+ os.Remove("/tmp/gotest1.net")
+ os.Remove("/tmp/gotest1.net.local")
if syscall.OS == "linux" {
// Test abstract unix domain socket, a Linux-ism
doTestPacket(t, "unixgram", "@gotest1/net", "@gotest1/net", isEmpty)
diff --git a/src/pkg/net/sock.go b/src/pkg/net/sock.go
index 336c96866..dbb87d36f 100644
--- a/src/pkg/net/sock.go
+++ b/src/pkg/net/sock.go
@@ -7,9 +7,9 @@
package net
import (
- "os";
- "reflect";
- "syscall";
+ "os"
+ "reflect"
+ "syscall"
)
// Boolean to int.
@@ -17,52 +17,52 @@ func boolint(b bool) int {
if b {
return 1
}
- return 0;
+ return 0
}
// Generic socket creation.
func socket(net string, f, p, t int, la, ra syscall.Sockaddr, toAddr func(syscall.Sockaddr) Addr) (fd *netFD, err os.Error) {
// See ../syscall/exec.go for description of ForkLock.
- syscall.ForkLock.RLock();
- s, e := syscall.Socket(f, p, t);
+ syscall.ForkLock.RLock()
+ s, e := syscall.Socket(f, p, t)
if e != 0 {
- syscall.ForkLock.RUnlock();
- return nil, os.Errno(e);
+ syscall.ForkLock.RUnlock()
+ return nil, os.Errno(e)
}
- syscall.CloseOnExec(s);
- syscall.ForkLock.RUnlock();
+ syscall.CloseOnExec(s)
+ syscall.ForkLock.RUnlock()
// Allow reuse of recently-used addresses.
- syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1);
+ syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
if la != nil {
- e = syscall.Bind(s, la);
+ e = syscall.Bind(s, la)
if e != 0 {
- syscall.Close(s);
- return nil, os.Errno(e);
+ syscall.Close(s)
+ return nil, os.Errno(e)
}
}
if ra != nil {
- e = syscall.Connect(s, ra);
+ e = syscall.Connect(s, ra)
if e != 0 {
- syscall.Close(s);
- return nil, os.Errno(e);
+ syscall.Close(s)
+ return nil, os.Errno(e)
}
}
- sa, _ := syscall.Getsockname(s);
- laddr := toAddr(sa);
- sa, _ = syscall.Getpeername(s);
- raddr := toAddr(sa);
+ sa, _ := syscall.Getsockname(s)
+ laddr := toAddr(sa)
+ sa, _ = syscall.Getpeername(s)
+ raddr := toAddr(sa)
- fd, err = newFD(s, f, p, net, laddr, raddr);
+ fd, err = newFD(s, f, p, net, laddr, raddr)
if err != nil {
- syscall.Close(s);
- return nil, err;
+ syscall.Close(s)
+ return nil, err
}
- return fd, nil;
+ return fd, nil
}
func setsockoptInt(fd, level, opt int, value int) os.Error {
@@ -70,43 +70,43 @@ func setsockoptInt(fd, level, opt int, value int) os.Error {
}
func setsockoptNsec(fd, level, opt int, nsec int64) os.Error {
- var tv = syscall.NsecToTimeval(nsec);
- return os.NewSyscallError("setsockopt", syscall.SetsockoptTimeval(fd, level, opt, &tv));
+ var tv = syscall.NsecToTimeval(nsec)
+ return os.NewSyscallError("setsockopt", syscall.SetsockoptTimeval(fd, level, opt, &tv))
}
func setReadBuffer(fd *netFD, bytes int) os.Error {
- fd.incref();
- defer fd.decref();
- return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes);
+ fd.incref()
+ defer fd.decref()
+ return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes)
}
func setWriteBuffer(fd *netFD, bytes int) os.Error {
- fd.incref();
- defer fd.decref();
- return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes);
+ fd.incref()
+ defer fd.decref()
+ return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes)
}
func setReadTimeout(fd *netFD, nsec int64) os.Error {
- fd.rdeadline_delta = nsec;
- return nil;
+ fd.rdeadline_delta = nsec
+ return nil
}
func setWriteTimeout(fd *netFD, nsec int64) os.Error {
- fd.wdeadline_delta = nsec;
- return nil;
+ fd.wdeadline_delta = nsec
+ return nil
}
func setTimeout(fd *netFD, nsec int64) os.Error {
if e := setReadTimeout(fd, nsec); e != nil {
return e
}
- return setWriteTimeout(fd, nsec);
+ return setWriteTimeout(fd, nsec)
}
func setReuseAddr(fd *netFD, reuse bool) os.Error {
- fd.incref();
- defer fd.decref();
- return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, boolint(reuse));
+ fd.incref()
+ defer fd.decref()
+ return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, boolint(reuse))
}
func bindToDevice(fd *netFD, dev string) os.Error {
@@ -115,34 +115,34 @@ func bindToDevice(fd *netFD, dev string) os.Error {
}
func setDontRoute(fd *netFD, dontroute bool) os.Error {
- fd.incref();
- defer fd.decref();
- return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_DONTROUTE, boolint(dontroute));
+ fd.incref()
+ defer fd.decref()
+ return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_DONTROUTE, boolint(dontroute))
}
func setKeepAlive(fd *netFD, keepalive bool) os.Error {
- fd.incref();
- defer fd.decref();
- return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive));
+ fd.incref()
+ defer fd.decref()
+ return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive))
}
func setLinger(fd *netFD, sec int) os.Error {
- var l syscall.Linger;
+ var l syscall.Linger
if sec >= 0 {
- l.Onoff = 1;
- l.Linger = int32(sec);
+ l.Onoff = 1
+ l.Linger = int32(sec)
} else {
- l.Onoff = 0;
- l.Linger = 0;
+ l.Onoff = 0
+ l.Linger = 0
}
- fd.incref();
- defer fd.decref();
- e := syscall.SetsockoptLinger(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_LINGER, &l);
- return os.NewSyscallError("setsockopt", e);
+ fd.incref()
+ defer fd.decref()
+ e := syscall.SetsockoptLinger(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_LINGER, &l)
+ return os.NewSyscallError("setsockopt", e)
}
type UnknownSocketError struct {
- sa syscall.Sockaddr;
+ sa syscall.Sockaddr
}
func (e *UnknownSocketError) String() string {
@@ -159,5 +159,5 @@ func sockaddrToString(sa syscall.Sockaddr) (name string, err os.Error) {
return a.Name, nil
}
- return "", &UnknownSocketError{sa};
+ return "", &UnknownSocketError{sa}
}
diff --git a/src/pkg/net/tcpsock.go b/src/pkg/net/tcpsock.go
index 680ed3021..cb9e29afc 100644
--- a/src/pkg/net/tcpsock.go
+++ b/src/pkg/net/tcpsock.go
@@ -7,8 +7,8 @@
package net
import (
- "os";
- "syscall";
+ "os"
+ "syscall"
)
func sockaddrToTCP(sa syscall.Sockaddr) Addr {
@@ -18,19 +18,19 @@ func sockaddrToTCP(sa syscall.Sockaddr) Addr {
case *syscall.SockaddrInet6:
return &TCPAddr{&sa.Addr, sa.Port}
}
- return nil;
+ return nil
}
// TCPAddr represents the address of a TCP end point.
type TCPAddr struct {
- IP IP;
- Port int;
+ IP IP
+ Port int
}
// Network returns the address's network name, "tcp".
-func (a *TCPAddr) Network() string { return "tcp" }
+func (a *TCPAddr) Network() string { return "tcp" }
-func (a *TCPAddr) String() string { return joinHostPort(a.IP.String(), itoa(a.Port)) }
+func (a *TCPAddr) String() string { return joinHostPort(a.IP.String(), itoa(a.Port)) }
func (a *TCPAddr) family() int {
if a == nil || len(a.IP) <= 4 {
@@ -39,7 +39,7 @@ func (a *TCPAddr) family() int {
if ip := a.IP.To4(); ip != nil {
return syscall.AF_INET
}
- return syscall.AF_INET6;
+ return syscall.AF_INET6
}
func (a *TCPAddr) sockaddr(family int) (syscall.Sockaddr, os.Error) {
@@ -47,10 +47,10 @@ func (a *TCPAddr) sockaddr(family int) (syscall.Sockaddr, os.Error) {
}
func (a *TCPAddr) toAddr() sockaddr {
- if a == nil { // nil *TCPAddr
- return nil // nil interface
+ if a == nil { // nil *TCPAddr
+ return nil // nil interface
}
- return a;
+ return a
}
// ResolveTCPAddr parses addr as a TCP address of the form
@@ -58,26 +58,26 @@ func (a *TCPAddr) toAddr() sockaddr {
// numeric addresses. A literal IPv6 host address must be
// enclosed in square brackets, as in "[::]:80".
func ResolveTCPAddr(addr string) (*TCPAddr, os.Error) {
- ip, port, err := hostPortToIP("tcp", addr);
+ ip, port, err := hostPortToIP("tcp", addr)
if err != nil {
return nil, err
}
- return &TCPAddr{ip, port}, nil;
+ return &TCPAddr{ip, port}, nil
}
// TCPConn is an implementation of the Conn interface
// for TCP network connections.
type TCPConn struct {
- fd *netFD;
+ fd *netFD
}
func newTCPConn(fd *netFD) *TCPConn {
- c := &TCPConn{fd};
- setsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1);
- return c;
+ c := &TCPConn{fd}
+ setsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1)
+ return c
}
-func (c *TCPConn) ok() bool { return c != nil && c.fd != nil }
+func (c *TCPConn) ok() bool { return c != nil && c.fd != nil }
// Implementation of the Conn interface - see Conn for documentation.
@@ -89,7 +89,7 @@ func (c *TCPConn) Read(b []byte) (n int, err os.Error) {
if !c.ok() {
return 0, os.EINVAL
}
- return c.fd.Read(b);
+ return c.fd.Read(b)
}
// Write writes data to the TCP connection.
@@ -100,7 +100,7 @@ func (c *TCPConn) Write(b []byte) (n int, err os.Error) {
if !c.ok() {
return 0, os.EINVAL
}
- return c.fd.Write(b);
+ return c.fd.Write(b)
}
// Close closes the TCP connection.
@@ -108,9 +108,9 @@ func (c *TCPConn) Close() os.Error {
if !c.ok() {
return os.EINVAL
}
- err := c.fd.Close();
- c.fd = nil;
- return err;
+ err := c.fd.Close()
+ c.fd = nil
+ return err
}
// LocalAddr returns the local network address, a *TCPAddr.
@@ -118,7 +118,7 @@ func (c *TCPConn) LocalAddr() Addr {
if !c.ok() {
return nil
}
- return c.fd.laddr;
+ return c.fd.laddr
}
// RemoteAddr returns the remote network address, a *TCPAddr.
@@ -126,7 +126,7 @@ func (c *TCPConn) RemoteAddr() Addr {
if !c.ok() {
return nil
}
- return c.fd.raddr;
+ return c.fd.raddr
}
// SetTimeout sets the read and write deadlines associated
@@ -135,7 +135,7 @@ func (c *TCPConn) SetTimeout(nsec int64) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setTimeout(c.fd, nsec);
+ return setTimeout(c.fd, nsec)
}
// SetReadTimeout sets the time (in nanoseconds) that
@@ -145,7 +145,7 @@ func (c *TCPConn) SetReadTimeout(nsec int64) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setReadTimeout(c.fd, nsec);
+ return setReadTimeout(c.fd, nsec)
}
// SetWriteTimeout sets the time (in nanoseconds) that
@@ -157,7 +157,7 @@ func (c *TCPConn) SetWriteTimeout(nsec int64) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setWriteTimeout(c.fd, nsec);
+ return setWriteTimeout(c.fd, nsec)
}
// SetReadBuffer sets the size of the operating system's
@@ -166,7 +166,7 @@ func (c *TCPConn) SetReadBuffer(bytes int) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setReadBuffer(c.fd, bytes);
+ return setReadBuffer(c.fd, bytes)
}
// SetWriteBuffer sets the size of the operating system's
@@ -175,7 +175,7 @@ func (c *TCPConn) SetWriteBuffer(bytes int) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setWriteBuffer(c.fd, bytes);
+ return setWriteBuffer(c.fd, bytes)
}
// SetLinger sets the behavior of Close() on a connection
@@ -193,7 +193,7 @@ func (c *TCPConn) SetLinger(sec int) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setLinger(c.fd, sec);
+ return setLinger(c.fd, sec)
}
// SetKeepAlive sets whether the operating system should send
@@ -202,7 +202,7 @@ func (c *TCPConn) SetKeepAlive(keepalive bool) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setKeepAlive(c.fd, keepalive);
+ return setKeepAlive(c.fd, keepalive)
}
// DialTCP is like Dial but can only connect to TCP networks
@@ -211,18 +211,18 @@ func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err os.Error) {
if raddr == nil {
return nil, &OpError{"dial", "tcp", nil, errMissingAddress}
}
- fd, e := internetSocket(net, laddr.toAddr(), raddr.toAddr(), syscall.SOCK_STREAM, "dial", sockaddrToTCP);
+ fd, e := internetSocket(net, laddr.toAddr(), raddr.toAddr(), syscall.SOCK_STREAM, "dial", sockaddrToTCP)
if e != nil {
return nil, e
}
- return newTCPConn(fd), nil;
+ return newTCPConn(fd), nil
}
// TCPListener is a TCP network listener.
// Clients should typically use variables of type Listener
// instead of assuming TCP.
type TCPListener struct {
- fd *netFD;
+ fd *netFD
}
// ListenTCP announces on the TCP address laddr and returns a TCP listener.
@@ -230,18 +230,18 @@ type TCPListener struct {
// If laddr has a port of 0, it means to listen on some available port.
// The caller can use l.Addr() to retrieve the chosen address.
func ListenTCP(net string, laddr *TCPAddr) (l *TCPListener, err os.Error) {
- fd, err := internetSocket(net, laddr.toAddr(), nil, syscall.SOCK_STREAM, "listen", sockaddrToTCP);
+ fd, err := internetSocket(net, laddr.toAddr(), nil, syscall.SOCK_STREAM, "listen", sockaddrToTCP)
if err != nil {
return nil, err
}
- errno := syscall.Listen(fd.sysfd, listenBacklog());
+ errno := syscall.Listen(fd.sysfd, listenBacklog())
if errno != 0 {
- syscall.Close(fd.sysfd);
- return nil, &OpError{"listen", "tcp", laddr, os.Errno(errno)};
+ syscall.Close(fd.sysfd)
+ return nil, &OpError{"listen", "tcp", laddr, os.Errno(errno)}
}
- l = new(TCPListener);
- l.fd = fd;
- return l, nil;
+ l = new(TCPListener)
+ l.fd = fd
+ return l, nil
}
// AcceptTCP accepts the next incoming call and returns the new connection
@@ -250,21 +250,21 @@ func (l *TCPListener) AcceptTCP() (c *TCPConn, err os.Error) {
if l == nil || l.fd == nil || l.fd.sysfd < 0 {
return nil, os.EINVAL
}
- fd, err := l.fd.accept(sockaddrToTCP);
+ fd, err := l.fd.accept(sockaddrToTCP)
if err != nil {
return nil, err
}
- return newTCPConn(fd), nil;
+ return newTCPConn(fd), nil
}
// Accept implements the Accept method in the Listener interface;
// it waits for the next call and returns a generic Conn.
func (l *TCPListener) Accept() (c Conn, err os.Error) {
- c1, err := l.AcceptTCP();
+ c1, err := l.AcceptTCP()
if err != nil {
return nil, err
}
- return c1, nil;
+ return c1, nil
}
// Close stops listening on the TCP address.
@@ -273,8 +273,8 @@ func (l *TCPListener) Close() os.Error {
if l == nil || l.fd == nil {
return os.EINVAL
}
- return l.fd.Close();
+ return l.fd.Close()
}
// Addr returns the listener's network address, a *TCPAddr.
-func (l *TCPListener) Addr() Addr { return l.fd.laddr }
+func (l *TCPListener) Addr() Addr { return l.fd.laddr }
diff --git a/src/pkg/net/timeout_test.go b/src/pkg/net/timeout_test.go
index c1ba39942..f5ec5730f 100644
--- a/src/pkg/net/timeout_test.go
+++ b/src/pkg/net/timeout_test.go
@@ -5,29 +5,29 @@
package net
import (
- "os";
- "testing";
- "time";
+ "os"
+ "testing"
+ "time"
)
func testTimeout(t *testing.T, network, addr string, readFrom bool) {
- fd, err := Dial(network, "", addr);
- defer fd.Close();
+ fd, err := Dial(network, "", addr)
+ defer fd.Close()
if err != nil {
t.Errorf("dial %s %s failed: %v", network, addr, err)
}
- t0 := time.Nanoseconds();
- fd.SetReadTimeout(1e8); // 100ms
- var b [100]byte;
- var n int;
- var err1 os.Error;
+ t0 := time.Nanoseconds()
+ fd.SetReadTimeout(1e8) // 100ms
+ var b [100]byte
+ var n int
+ var err1 os.Error
if readFrom {
n, _, err1 = fd.(PacketConn).ReadFrom(&b)
} else {
n, err1 = fd.Read(&b)
}
- t1 := time.Nanoseconds();
- what := "Read";
+ t1 := time.Nanoseconds()
+ what := "Read"
if readFrom {
what = "ReadFrom"
}
@@ -40,8 +40,8 @@ func testTimeout(t *testing.T, network, addr string, readFrom bool) {
}
func TestTimeoutUDP(t *testing.T) {
- testTimeout(t, "udp", "127.0.0.1:53", false);
- testTimeout(t, "udp", "127.0.0.1:53", true);
+ testTimeout(t, "udp", "127.0.0.1:53", false)
+ testTimeout(t, "udp", "127.0.0.1:53", true)
}
func TestTimeoutTCP(t *testing.T) {
diff --git a/src/pkg/net/udpsock.go b/src/pkg/net/udpsock.go
index d74a38078..1891f2f8c 100644
--- a/src/pkg/net/udpsock.go
+++ b/src/pkg/net/udpsock.go
@@ -7,8 +7,8 @@
package net
import (
- "os";
- "syscall";
+ "os"
+ "syscall"
)
func sockaddrToUDP(sa syscall.Sockaddr) Addr {
@@ -18,19 +18,19 @@ func sockaddrToUDP(sa syscall.Sockaddr) Addr {
case *syscall.SockaddrInet6:
return &UDPAddr{&sa.Addr, sa.Port}
}
- return nil;
+ return nil
}
// UDPAddr represents the address of a UDP end point.
type UDPAddr struct {
- IP IP;
- Port int;
+ IP IP
+ Port int
}
// Network returns the address's network name, "udp".
-func (a *UDPAddr) Network() string { return "udp" }
+func (a *UDPAddr) Network() string { return "udp" }
-func (a *UDPAddr) String() string { return joinHostPort(a.IP.String(), itoa(a.Port)) }
+func (a *UDPAddr) String() string { return joinHostPort(a.IP.String(), itoa(a.Port)) }
func (a *UDPAddr) family() int {
if a == nil || len(a.IP) <= 4 {
@@ -39,7 +39,7 @@ func (a *UDPAddr) family() int {
if ip := a.IP.To4(); ip != nil {
return syscall.AF_INET
}
- return syscall.AF_INET6;
+ return syscall.AF_INET6
}
func (a *UDPAddr) sockaddr(family int) (syscall.Sockaddr, os.Error) {
@@ -47,10 +47,10 @@ func (a *UDPAddr) sockaddr(family int) (syscall.Sockaddr, os.Error) {
}
func (a *UDPAddr) toAddr() sockaddr {
- if a == nil { // nil *UDPAddr
- return nil // nil interface
+ if a == nil { // nil *UDPAddr
+ return nil // nil interface
}
- return a;
+ return a
}
// ResolveUDPAddr parses addr as a UDP address of the form
@@ -58,26 +58,26 @@ func (a *UDPAddr) toAddr() sockaddr {
// numeric addresses. A literal IPv6 host address must be
// enclosed in square brackets, as in "[::]:80".
func ResolveUDPAddr(addr string) (*UDPAddr, os.Error) {
- ip, port, err := hostPortToIP("udp", addr);
+ ip, port, err := hostPortToIP("udp", addr)
if err != nil {
return nil, err
}
- return &UDPAddr{ip, port}, nil;
+ return &UDPAddr{ip, port}, nil
}
// UDPConn is the implementation of the Conn and PacketConn
// interfaces for UDP network connections.
type UDPConn struct {
- fd *netFD;
+ fd *netFD
}
func newUDPConn(fd *netFD) *UDPConn {
- c := &UDPConn{fd};
- setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1);
- return c;
+ c := &UDPConn{fd}
+ setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1)
+ return c
}
-func (c *UDPConn) ok() bool { return c != nil && c.fd != nil }
+func (c *UDPConn) ok() bool { return c != nil && c.fd != nil }
// Implementation of the Conn interface - see Conn for documentation.
@@ -91,7 +91,7 @@ func (c *UDPConn) Read(b []byte) (n int, err os.Error) {
if !c.ok() {
return 0, os.EINVAL
}
- return c.fd.Read(b);
+ return c.fd.Read(b)
}
// Write writes data to the connection as a single UDP packet.
@@ -102,7 +102,7 @@ func (c *UDPConn) Write(b []byte) (n int, err os.Error) {
if !c.ok() {
return 0, os.EINVAL
}
- return c.fd.Write(b);
+ return c.fd.Write(b)
}
// Close closes the UDP connection.
@@ -110,9 +110,9 @@ func (c *UDPConn) Close() os.Error {
if !c.ok() {
return os.EINVAL
}
- err := c.fd.Close();
- c.fd = nil;
- return err;
+ err := c.fd.Close()
+ c.fd = nil
+ return err
}
// LocalAddr returns the local network address.
@@ -120,7 +120,7 @@ func (c *UDPConn) LocalAddr() Addr {
if !c.ok() {
return nil
}
- return c.fd.laddr;
+ return c.fd.laddr
}
// RemoteAddr returns the remote network address, a *UDPAddr.
@@ -128,7 +128,7 @@ func (c *UDPConn) RemoteAddr() Addr {
if !c.ok() {
return nil
}
- return c.fd.raddr;
+ return c.fd.raddr
}
// SetTimeout sets the read and write deadlines associated
@@ -137,7 +137,7 @@ func (c *UDPConn) SetTimeout(nsec int64) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setTimeout(c.fd, nsec);
+ return setTimeout(c.fd, nsec)
}
// SetReadTimeout sets the time (in nanoseconds) that
@@ -147,7 +147,7 @@ func (c *UDPConn) SetReadTimeout(nsec int64) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setReadTimeout(c.fd, nsec);
+ return setReadTimeout(c.fd, nsec)
}
// SetWriteTimeout sets the time (in nanoseconds) that
@@ -159,7 +159,7 @@ func (c *UDPConn) SetWriteTimeout(nsec int64) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setWriteTimeout(c.fd, nsec);
+ return setWriteTimeout(c.fd, nsec)
}
// SetReadBuffer sets the size of the operating system's
@@ -168,7 +168,7 @@ func (c *UDPConn) SetReadBuffer(bytes int) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setReadBuffer(c.fd, bytes);
+ return setReadBuffer(c.fd, bytes)
}
// SetWriteBuffer sets the size of the operating system's
@@ -177,7 +177,7 @@ func (c *UDPConn) SetWriteBuffer(bytes int) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setWriteBuffer(c.fd, bytes);
+ return setWriteBuffer(c.fd, bytes)
}
// UDP-specific methods.
@@ -192,14 +192,14 @@ func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err os.Error) {
if !c.ok() {
return 0, nil, os.EINVAL
}
- n, sa, err := c.fd.ReadFrom(b);
+ n, sa, err := c.fd.ReadFrom(b)
switch sa := sa.(type) {
case *syscall.SockaddrInet4:
addr = &UDPAddr{&sa.Addr, sa.Port}
case *syscall.SockaddrInet6:
addr = &UDPAddr{&sa.Addr, sa.Port}
}
- return;
+ return
}
// ReadFrom reads a UDP packet from c, copying the payload into b.
@@ -212,8 +212,8 @@ func (c *UDPConn) ReadFrom(b []byte) (n int, addr Addr, err os.Error) {
if !c.ok() {
return 0, nil, os.EINVAL
}
- n, uaddr, err := c.ReadFromUDP(b);
- return n, uaddr.toAddr(), err;
+ n, uaddr, err := c.ReadFromUDP(b)
+ return n, uaddr.toAddr(), err
}
// WriteToUDP writes a UDP packet to addr via c, copying the payload from b.
@@ -225,11 +225,11 @@ func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (n int, err os.Error) {
if !c.ok() {
return 0, os.EINVAL
}
- sa, err := addr.sockaddr(c.fd.family);
+ sa, err := addr.sockaddr(c.fd.family)
if err != nil {
return 0, err
}
- return c.fd.WriteTo(b, sa);
+ return c.fd.WriteTo(b, sa)
}
// WriteTo writes a UDP packet with payload b to addr via c.
@@ -241,11 +241,11 @@ func (c *UDPConn) WriteTo(b []byte, addr Addr) (n int, err os.Error) {
if !c.ok() {
return 0, os.EINVAL
}
- a, ok := addr.(*UDPAddr);
+ a, ok := addr.(*UDPAddr)
if !ok {
return 0, &OpError{"writeto", "udp", addr, os.EINVAL}
}
- return c.WriteToUDP(b, a);
+ return c.WriteToUDP(b, a)
}
// DialUDP connects to the remote address raddr on the network net,
@@ -260,11 +260,11 @@ func DialUDP(net string, laddr, raddr *UDPAddr) (c *UDPConn, err os.Error) {
if raddr == nil {
return nil, &OpError{"dial", "udp", nil, errMissingAddress}
}
- fd, e := internetSocket(net, laddr.toAddr(), raddr.toAddr(), syscall.SOCK_DGRAM, "dial", sockaddrToUDP);
+ fd, e := internetSocket(net, laddr.toAddr(), raddr.toAddr(), syscall.SOCK_DGRAM, "dial", sockaddrToUDP)
if e != nil {
return nil, e
}
- return newUDPConn(fd), nil;
+ return newUDPConn(fd), nil
}
// ListenUDP listens for incoming UDP packets addressed to the
@@ -280,9 +280,9 @@ func ListenUDP(net string, laddr *UDPAddr) (c *UDPConn, err os.Error) {
if laddr == nil {
return nil, &OpError{"listen", "udp", nil, errMissingAddress}
}
- fd, e := internetSocket(net, laddr.toAddr(), nil, syscall.SOCK_DGRAM, "dial", sockaddrToUDP);
+ fd, e := internetSocket(net, laddr.toAddr(), nil, syscall.SOCK_DGRAM, "dial", sockaddrToUDP)
if e != nil {
return nil, e
}
- return newUDPConn(fd), nil;
+ return newUDPConn(fd), nil
}
diff --git a/src/pkg/net/unixsock.go b/src/pkg/net/unixsock.go
index 4ac3be54a..8f642210f 100644
--- a/src/pkg/net/unixsock.go
+++ b/src/pkg/net/unixsock.go
@@ -7,12 +7,12 @@
package net
import (
- "os";
- "syscall";
+ "os"
+ "syscall"
)
func unixSocket(net string, laddr, raddr *UnixAddr, mode string) (fd *netFD, err os.Error) {
- var proto int;
+ var proto int
switch net {
default:
return nil, UnknownNetworkError(net)
@@ -22,7 +22,7 @@ func unixSocket(net string, laddr, raddr *UnixAddr, mode string) (fd *netFD, err
proto = syscall.SOCK_DGRAM
}
- var la, ra syscall.Sockaddr;
+ var la, ra syscall.Sockaddr
switch mode {
default:
panic("unixSocket", mode)
@@ -41,48 +41,48 @@ func unixSocket(net string, laddr, raddr *UnixAddr, mode string) (fd *netFD, err
if laddr == nil {
return nil, &OpError{mode, net, nil, errMissingAddress}
}
- la = &syscall.SockaddrUnix{Name: laddr.Name};
+ la = &syscall.SockaddrUnix{Name: laddr.Name}
if raddr != nil {
return nil, &OpError{mode, net, raddr, &AddrError{"unexpected remote address", raddr.String()}}
}
}
- f := sockaddrToUnix;
+ f := sockaddrToUnix
if proto != syscall.SOCK_STREAM {
f = sockaddrToUnixgram
}
- fd, err = socket(net, syscall.AF_UNIX, proto, 0, la, ra, f);
+ fd, err = socket(net, syscall.AF_UNIX, proto, 0, la, ra, f)
if err != nil {
goto Error
}
- return fd, nil;
+ return fd, nil
Error:
- addr := raddr;
+ addr := raddr
if mode == "listen" {
addr = laddr
}
- return nil, &OpError{mode, net, addr, err};
+ return nil, &OpError{mode, net, addr, err}
}
// UnixAddr represents the address of a Unix domain socket end point.
type UnixAddr struct {
- Name string;
- Datagram bool;
+ Name string
+ Datagram bool
}
func sockaddrToUnix(sa syscall.Sockaddr) Addr {
if s, ok := sa.(*syscall.SockaddrUnix); ok {
return &UnixAddr{s.Name, false}
}
- return nil;
+ return nil
}
func sockaddrToUnixgram(sa syscall.Sockaddr) Addr {
if s, ok := sa.(*syscall.SockaddrUnix); ok {
return &UnixAddr{s.Name, true}
}
- return nil;
+ return nil
}
// Network returns the address's network name, "unix" or "unixgram".
@@ -90,27 +90,27 @@ func (a *UnixAddr) Network() string {
if a == nil || !a.Datagram {
return "unix"
}
- return "unixgram";
+ return "unixgram"
}
func (a *UnixAddr) String() string {
if a == nil {
return "<nil>"
}
- return a.Name;
+ return a.Name
}
func (a *UnixAddr) toAddr() Addr {
- if a == nil { // nil *UnixAddr
- return nil // nil interface
+ if a == nil { // nil *UnixAddr
+ return nil // nil interface
}
- return a;
+ return a
}
// ResolveUnixAddr parses addr as a Unix domain socket address.
// The string net gives the network name, "unix" or "unixgram".
func ResolveUnixAddr(net, addr string) (*UnixAddr, os.Error) {
- var datagram bool;
+ var datagram bool
switch net {
case "unix":
case "unixgram":
@@ -118,18 +118,18 @@ func ResolveUnixAddr(net, addr string) (*UnixAddr, os.Error) {
default:
return nil, UnknownNetworkError(net)
}
- return &UnixAddr{addr, datagram}, nil;
+ return &UnixAddr{addr, datagram}, nil
}
// UnixConn is an implementation of the Conn interface
// for connections to Unix domain sockets.
type UnixConn struct {
- fd *netFD;
+ fd *netFD
}
-func newUnixConn(fd *netFD) *UnixConn { return &UnixConn{fd} }
+func newUnixConn(fd *netFD) *UnixConn { return &UnixConn{fd} }
-func (c *UnixConn) ok() bool { return c != nil && c.fd != nil }
+func (c *UnixConn) ok() bool { return c != nil && c.fd != nil }
// Implementation of the Conn interface - see Conn for documentation.
@@ -141,7 +141,7 @@ func (c *UnixConn) Read(b []byte) (n int, err os.Error) {
if !c.ok() {
return 0, os.EINVAL
}
- return c.fd.Read(b);
+ return c.fd.Read(b)
}
// Write writes data to the Unix domain connection.
@@ -152,7 +152,7 @@ func (c *UnixConn) Write(b []byte) (n int, err os.Error) {
if !c.ok() {
return 0, os.EINVAL
}
- return c.fd.Write(b);
+ return c.fd.Write(b)
}
// Close closes the Unix domain connection.
@@ -160,9 +160,9 @@ func (c *UnixConn) Close() os.Error {
if !c.ok() {
return os.EINVAL
}
- err := c.fd.Close();
- c.fd = nil;
- return err;
+ err := c.fd.Close()
+ c.fd = nil
+ return err
}
// LocalAddr returns the local network address, a *UnixAddr.
@@ -171,7 +171,7 @@ func (c *UnixConn) LocalAddr() Addr {
if !c.ok() {
return nil
}
- return c.fd.laddr;
+ return c.fd.laddr
}
// RemoteAddr returns the remote network address, a *UnixAddr.
@@ -181,7 +181,7 @@ func (c *UnixConn) RemoteAddr() Addr {
if !c.ok() {
return nil
}
- return c.fd.raddr;
+ return c.fd.raddr
}
// SetTimeout sets the read and write deadlines associated
@@ -190,7 +190,7 @@ func (c *UnixConn) SetTimeout(nsec int64) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setTimeout(c.fd, nsec);
+ return setTimeout(c.fd, nsec)
}
// SetReadTimeout sets the time (in nanoseconds) that
@@ -200,7 +200,7 @@ func (c *UnixConn) SetReadTimeout(nsec int64) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setReadTimeout(c.fd, nsec);
+ return setReadTimeout(c.fd, nsec)
}
// SetWriteTimeout sets the time (in nanoseconds) that
@@ -212,7 +212,7 @@ func (c *UnixConn) SetWriteTimeout(nsec int64) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setWriteTimeout(c.fd, nsec);
+ return setWriteTimeout(c.fd, nsec)
}
// SetReadBuffer sets the size of the operating system's
@@ -221,7 +221,7 @@ func (c *UnixConn) SetReadBuffer(bytes int) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setReadBuffer(c.fd, bytes);
+ return setReadBuffer(c.fd, bytes)
}
// SetWriteBuffer sets the size of the operating system's
@@ -230,7 +230,7 @@ func (c *UnixConn) SetWriteBuffer(bytes int) os.Error {
if !c.ok() {
return os.EINVAL
}
- return setWriteBuffer(c.fd, bytes);
+ return setWriteBuffer(c.fd, bytes)
}
// ReadFromUnix reads a packet from c, copying the payload into b.
@@ -243,12 +243,12 @@ func (c *UnixConn) ReadFromUnix(b []byte) (n int, addr *UnixAddr, err os.Error)
if !c.ok() {
return 0, nil, os.EINVAL
}
- n, sa, err := c.fd.ReadFrom(b);
+ n, sa, err := c.fd.ReadFrom(b)
switch sa := sa.(type) {
case *syscall.SockaddrUnix:
addr = &UnixAddr{sa.Name, c.fd.proto == syscall.SOCK_DGRAM}
}
- return;
+ return
}
// ReadFrom reads a packet from c, copying the payload into b.
@@ -261,8 +261,8 @@ func (c *UnixConn) ReadFrom(b []byte) (n int, addr Addr, err os.Error) {
if !c.ok() {
return 0, nil, os.EINVAL
}
- n, uaddr, err := c.ReadFromUnix(b);
- return n, uaddr.toAddr(), err;
+ n, uaddr, err := c.ReadFromUnix(b)
+ return n, uaddr.toAddr(), err
}
// WriteToUnix writes a packet to addr via c, copying the payload from b.
@@ -277,8 +277,8 @@ func (c *UnixConn) WriteToUnix(b []byte, addr *UnixAddr) (n int, err os.Error) {
if addr.Datagram != (c.fd.proto == syscall.SOCK_DGRAM) {
return 0, os.EAFNOSUPPORT
}
- sa := &syscall.SockaddrUnix{Name: addr.Name};
- return c.fd.WriteTo(b, sa);
+ sa := &syscall.SockaddrUnix{Name: addr.Name}
+ return c.fd.WriteTo(b, sa)
}
// WriteTo writes a packet to addr via c, copying the payload from b.
@@ -290,30 +290,30 @@ func (c *UnixConn) WriteTo(b []byte, addr Addr) (n int, err os.Error) {
if !c.ok() {
return 0, os.EINVAL
}
- a, ok := addr.(*UnixAddr);
+ a, ok := addr.(*UnixAddr)
if !ok {
return 0, &OpError{"writeto", "unix", addr, os.EINVAL}
}
- return c.WriteToUnix(b, a);
+ return c.WriteToUnix(b, a)
}
// DialUDP connects to the remote address raddr on the network net,
// which must be "unix" or "unixdgram". If laddr is not nil, it is used
// as the local address for the connection.
func DialUnix(net string, laddr, raddr *UnixAddr) (c *UnixConn, err os.Error) {
- fd, e := unixSocket(net, laddr, raddr, "dial");
+ fd, e := unixSocket(net, laddr, raddr, "dial")
if e != nil {
return nil, e
}
- return newUnixConn(fd), nil;
+ return newUnixConn(fd), nil
}
// UnixListener is a Unix domain socket listener.
// Clients should typically use variables of type Listener
// instead of assuming Unix domain sockets.
type UnixListener struct {
- fd *netFD;
- path string;
+ fd *netFD
+ path string
}
// ListenUnix announces on the Unix domain socket laddr and returns a Unix listener.
@@ -323,21 +323,21 @@ func ListenUnix(net string, laddr *UnixAddr) (l *UnixListener, err os.Error) {
return nil, UnknownNetworkError(net)
}
if laddr != nil {
- laddr = &UnixAddr{laddr.Name, net == "unixgram"} // make our own copy
+ laddr = &UnixAddr{laddr.Name, net == "unixgram"} // make our own copy
}
- fd, e := unixSocket(net, laddr, nil, "listen");
+ fd, e := unixSocket(net, laddr, nil, "listen")
if e != nil {
if pe, ok := e.(*os.PathError); ok {
e = pe.Error
}
- return nil, e;
+ return nil, e
}
- e1 := syscall.Listen(fd.sysfd, 8); // listenBacklog());
+ e1 := syscall.Listen(fd.sysfd, 8) // listenBacklog());
if e1 != 0 {
- syscall.Close(fd.sysfd);
- return nil, &OpError{"listen", "unix", laddr, os.Errno(e1)};
+ syscall.Close(fd.sysfd)
+ return nil, &OpError{"listen", "unix", laddr, os.Errno(e1)}
}
- return &UnixListener{fd, laddr.Name}, nil;
+ return &UnixListener{fd, laddr.Name}, nil
}
// AcceptUnix accepts the next incoming call and returns the new connection
@@ -346,22 +346,22 @@ func (l *UnixListener) AcceptUnix() (c *UnixConn, err os.Error) {
if l == nil || l.fd == nil {
return nil, os.EINVAL
}
- fd, e := l.fd.accept(sockaddrToUnix);
+ fd, e := l.fd.accept(sockaddrToUnix)
if e != nil {
return nil, e
}
- c = newUnixConn(fd);
- return c, nil;
+ c = newUnixConn(fd)
+ return c, nil
}
// Accept implements the Accept method in the Listener interface;
// it waits for the next call and returns a generic Conn.
func (l *UnixListener) Accept() (c Conn, err os.Error) {
- c1, err := l.AcceptUnix();
+ c1, err := l.AcceptUnix()
if err != nil {
return nil, err
}
- return c1, nil;
+ return c1, nil
}
// Close stops listening on the Unix address.
@@ -384,13 +384,13 @@ func (l *UnixListener) Close() os.Error {
if l.path[0] != '@' {
syscall.Unlink(l.path)
}
- err := l.fd.Close();
- l.fd = nil;
- return err;
+ err := l.fd.Close()
+ l.fd = nil
+ return err
}
// Addr returns the listener's network address.
-func (l *UnixListener) Addr() Addr { return l.fd.laddr }
+func (l *UnixListener) Addr() Addr { return l.fd.laddr }
// ListenUnixgram listens for incoming Unix datagram packets addressed to the
// local address laddr. The returned connection c's ReadFrom
@@ -405,9 +405,9 @@ func ListenUnixgram(net string, laddr *UnixAddr) (c *UDPConn, err os.Error) {
if laddr == nil {
return nil, &OpError{"listen", "unixgram", nil, errMissingAddress}
}
- fd, e := unixSocket(net, laddr, nil, "listen");
+ fd, e := unixSocket(net, laddr, nil, "listen")
if e != nil {
return nil, e
}
- return newUDPConn(fd), nil;
+ return newUDPConn(fd), nil
}