diff options
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("“"); - rdquo = strings.Bytes("”"); + ldquo = strings.Bytes("“") + rdquo = strings.Bytes("”") ) // Escape comment text for HTML. // Also, turn `` into “ and '' into ”. 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("""); // shorter than """ - esc_apos = strings.Bytes("'"); // shorter than "'" - esc_amp = strings.Bytes("&"); - esc_lt = strings.Bytes("<"); - esc_gt = strings.Bytes(">"); + 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(""") // shorter than """ + esc_apos = strings.Bytes("'") // shorter than "'" + esc_amp = strings.Bytes("&") + esc_lt = strings.Bytes("<") + esc_gt = strings.Bytes(">") ) @@ -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 } |
