- gofmt'ing of some stragglers, now with correct comment indentation

in special cases
- re-gofmt'ing of some files that are now improved

R=r, rsc
http://go/go-review/1023003
This commit is contained in:
Robert Griesemer 2009-11-05 17:02:55 -08:00
parent 6c13f8f10e
commit 8cd2e76404
4 changed files with 155 additions and 153 deletions

View File

@ -26,12 +26,12 @@ import (
// A Sym represents a single symbol table entry.
type Sym struct {
Value uint64;
Type byte;
Name string;
GoType uint64;
Value uint64;
Type byte;
Name string;
GoType uint64;
// If this symbol if a function symbol, the corresponding Func
Func *Func;
Func *Func;
}
// Static returns whether this symbol is static (not visible outside its file).
@ -56,33 +56,33 @@ func (s *Sym) ReceiverName() string {
if l == -1 || r == -1 || l == r {
return "";
}
return s.Name[l+1:r];
return s.Name[l+1 : r];
}
// BaseName returns the symbol name without the package or receiver name.
func (s *Sym) BaseName() string {
if i := strings.LastIndex(s.Name, "."); i != -1 {
return s.Name[i+1:len(s.Name)];
return s.Name[i+1 : len(s.Name)];
}
return s.Name;
}
// A Func collects information about a single function.
type Func struct {
Entry uint64;
Entry uint64;
*Sym;
End uint64;
Params []*Sym;
Locals []*Sym;
FrameSize int;
LineTable *LineTable;
Obj *Obj;
End uint64;
Params []*Sym;
Locals []*Sym;
FrameSize int;
LineTable *LineTable;
Obj *Obj;
}
// An Obj represents a single object file.
type Obj struct {
Funcs []Func;
Paths []Sym;
Funcs []Func;
Paths []Sym;
}
/*
@ -93,18 +93,18 @@ type Obj struct {
// symbols decoded from the program and provides methods to translate
// between symbols, names, and addresses.
type Table struct {
Syms []Sym;
Funcs []Func;
Files map[string] *Obj;
Objs []Obj;
// textEnd uint64;
Syms []Sym;
Funcs []Func;
Files map[string]*Obj;
Objs []Obj;
// textEnd uint64;
}
type sym struct {
value uint32;
gotype uint32;
typ byte;
name []byte;
value uint32;
gotype uint32;
typ byte;
name []byte;
}
func walksymtab(data []byte, fn func(sym) os.Error) os.Error {
@ -114,7 +114,7 @@ func walksymtab(data []byte, fn func(sym) os.Error) os.Error {
s.value = binary.BigEndian.Uint32(p[0:4]);
typ := p[4];
if typ&0x80 == 0 {
return &DecodingError{len(data) - len(p) + 4, "bad symbol type", typ};
return &DecodingError{len(data)-len(p)+4, "bad symbol type", typ};
}
typ &^= 0x80;
s.typ = typ;
@ -129,7 +129,7 @@ func walksymtab(data []byte, fn func(sym) os.Error) os.Error {
}
switch typ {
case 'z', 'Z':
p = p[i+nnul:len(p)];
p = p[i+nnul : len(p)];
for i = 0; i+2 <= len(p); i += 2 {
if p[i] == 0 && p[i+1] == 0 {
nnul = 2;
@ -142,8 +142,8 @@ func walksymtab(data []byte, fn func(sym) os.Error) os.Error {
}
s.name = p[0:i];
i += nnul;
s.gotype = binary.BigEndian.Uint32(p[i:i+4]);
p = p[i+4:len(p)];
s.gotype = binary.BigEndian.Uint32(p[i : i+4]);
p = p[i+4 : len(p)];
fn(s);
}
return nil;
@ -153,7 +153,10 @@ func walksymtab(data []byte, fn func(sym) os.Error) os.Error {
// returning an in-memory representation.
func NewTable(symtab []byte, pcln *LineTable) (*Table, os.Error) {
var n int;
err := walksymtab(symtab, func(s sym) os.Error { n++; return nil });
err := walksymtab(symtab, func(s sym) os.Error {
n++;
return nil;
});
if err != nil {
return nil, err;
}
@ -166,7 +169,7 @@ func NewTable(symtab []byte, pcln *LineTable) (*Table, os.Error) {
lasttyp := uint8(0);
err = walksymtab(symtab, func(s sym) os.Error {
n := len(t.Syms);
t.Syms = t.Syms[0:n+1];
t.Syms = t.Syms[0 : n+1];
ts := &t.Syms[n];
ts.Type = s.typ;
ts.Value = uint64(s.value);
@ -190,7 +193,7 @@ func NewTable(symtab []byte, pcln *LineTable) (*Table, os.Error) {
nz++;
}
for i := 0; i < len(s.name); i += 2 {
eltIdx := binary.BigEndian.Uint16(s.name[i:i+2]);
eltIdx := binary.BigEndian.Uint16(s.name[i : i+2]);
elt, ok := fname[eltIdx];
if !ok {
return &DecodingError{-1, "bad filename code", eltIdx};
@ -208,7 +211,7 @@ func NewTable(symtab []byte, pcln *LineTable) (*Table, os.Error) {
fname[uint16(s.value)] = ts.Name;
}
lasttyp = s.typ;
return nil
return nil;
});
if err != nil {
return nil, err;
@ -216,7 +219,7 @@ func NewTable(symtab []byte, pcln *LineTable) (*Table, os.Error) {
t.Funcs = make([]Func, 0, nf);
t.Objs = make([]Obj, 0, nz);
t.Files = make(map[string] *Obj);
t.Files = make(map[string]*Obj);
// Count text symbols and attach frame sizes, parameters, and
// locals to them. Also, find object file boundaries.
@ -234,7 +237,7 @@ func NewTable(symtab []byte, pcln *LineTable) (*Table, os.Error) {
// Start new object
n := len(t.Objs);
t.Objs = t.Objs[0:n+1];
t.Objs = t.Objs[0 : n+1];
obj = &t.Objs[n];
// Count & copy path symbols
@ -286,7 +289,7 @@ func NewTable(symtab []byte, pcln *LineTable) (*Table, os.Error) {
// Fill in the function symbol
n := len(t.Funcs);
t.Funcs = t.Funcs[0:n+1];
t.Funcs = t.Funcs[0 : n+1];
fn := &t.Funcs[n];
sym.Func = fn;
fn.Params = make([]*Sym, 0, np);
@ -305,11 +308,11 @@ func NewTable(symtab []byte, pcln *LineTable) (*Table, os.Error) {
fn.FrameSize = int(s.Value);
case 'p':
n := len(fn.Params);
fn.Params = fn.Params[0:n+1];
fn.Params = fn.Params[0 : n+1];
fn.Params[n] = s;
case 'a':
n := len(fn.Locals);
fn.Locals = fn.Locals[0:n+1];
fn.Locals = fn.Locals[0 : n+1];
fn.Locals[n] = s;
}
}
@ -335,7 +338,7 @@ func (t *Table) PCToFunc(pc uint64) *Func {
case fn.Entry <= pc && pc < fn.End:
return fn;
default:
funcs = funcs[m+1:len(funcs)];
funcs = funcs[m+1 : len(funcs)];
}
}
return nil;
@ -345,7 +348,7 @@ func (t *Table) PCToFunc(pc uint64) *Func {
// If there is no information, it returns fn == nil.
func (t *Table) PCToLine(pc uint64) (file string, line int, fn *Func) {
if fn = t.PCToFunc(pc); fn == nil {
return
return;
}
file, line = fn.Obj.lineFromAline(fn.LineTable.PCToLine(pc));
return;
@ -423,11 +426,11 @@ func (t *Table) SymByAddr(addr uint64) *Sym {
func (o *Obj) lineFromAline(aline int) (string, int) {
type stackEnt struct {
path string;
start int;
offset int;
prev *stackEnt;
};
path string;
start int;
offset int;
prev *stackEnt;
}
noPath := &stackEnt{"", 0, 0, nil};
tos := noPath;
@ -485,14 +488,14 @@ func (o *Obj) alineFromLine(path string, line int) (int, os.Error) {
val := int(s.Value);
switch {
case depth == 1 && val >= line:
return line - 1, nil;
return line-1, nil;
case s.Name == "":
depth--;
if depth == 0 {
break pathloop;
} else if depth == 1 {
line += val - incstart;
line += val-incstart;
}
default:
@ -523,8 +526,8 @@ func (e UnknownFileError) String() string {
// counter, either because the line is beyond the bounds of the file
// or because there is no code on the given line.
type UnknownLineError struct {
File string;
Line int;
File string;
Line int;
}
func (e *UnknownLineError) String() string {
@ -534,9 +537,9 @@ func (e *UnknownLineError) String() string {
// DecodingError represents an error during the decoding of
// the symbol table.
type DecodingError struct {
off int;
msg string;
val interface{};
off int;
msg string;
val interface{};
}
func (e *DecodingError) String() string {
@ -547,4 +550,3 @@ func (e *DecodingError) String() string {
msg += fmt.Sprintf(" at byte %#x", e.off);
return msg;
}

View File

@ -38,8 +38,8 @@ import (
type (
// An Expression node represents a production expression.
Expression interface {
// Pos is the position of the first character of the syntactic construct
Pos() token.Position;
// Pos is the position of the first character of the syntactic construct
Pos() token.Position;
};
// An Alternative node represents a non-empty list of alternative expressions.

View File

@ -88,7 +88,7 @@ func (dec *Decoder) Decode(e interface{}) os.Error {
// Is it a new type?
if id < 0 { // 0 is the error state, handled above
// If the id is negative, we have a type.
// If the id is negative, we have a type.
dec.recvType(-id);
if dec.state.err != nil {
break;

View File

@ -68,23 +68,23 @@ import (
// Errors returned during parsing and execution. Users may extract the information and reformat
// if they desire.
type Error struct {
Line int;
Msg string;
Line int;
Msg string;
}
func (e *Error) String() string {
return fmt.Sprintf("line %d: %s", e.Line, e.Msg)
return fmt.Sprintf("line %d: %s", e.Line, e.Msg);
}
// Most of the literals are aces.
var lbrace = []byte{ '{' }
var rbrace = []byte{ '}' }
var space = []byte{ ' ' }
var tab = []byte{ '\t' }
var lbrace = []byte{'{'}
var rbrace = []byte{'}'}
var space = []byte{' '}
var tab = []byte{'\t'}
// The various types of "tokens", which are plain text or (usually) brace-delimited descriptors
const (
tokAlternates = iota;
tokAlternates = iota;
tokComment;
tokEnd;
tokLiteral;
@ -97,13 +97,13 @@ const (
// FormatterMap is the type describing the mapping from formatter
// names to the functions that implement them.
type FormatterMap map[string] func(io.Writer, interface{}, string)
type FormatterMap map[string]func(io.Writer, interface{}, string)
// Built-in formatters.
var builtins = FormatterMap {
"html" : HtmlFormatter,
"str" : StringFormatter,
"" : StringFormatter,
var builtins = FormatterMap{
"html": HtmlFormatter,
"str": StringFormatter,
"": StringFormatter,
}
// The parsed state of a template is a vector of xxxElement structs.
@ -111,7 +111,7 @@ var builtins = FormatterMap {
// Plain text.
type textElement struct {
text []byte;
text []byte;
}
// A literal such as .meta-left or .meta-right
@ -121,14 +121,14 @@ type literalElement struct {
// A variable to be evaluated
type variableElement struct {
linenum int;
name string;
linenum int;
name string;
formatter string; // TODO(r): implement pipelines
}
// A .section block, possibly with a .or
type sectionElement struct {
linenum int; // of .section itself
linenum int; // of .section itself
field string; // cursor field for this block
start int; // first element
or int; // first element of .or block
@ -137,9 +137,9 @@ type sectionElement struct {
// A .repeated block, possibly with a .or and a .alternates
type repeatedElement struct {
sectionElement; // It has the same structure...
sectionElement; // It has the same structure...
altstart int; // ... except for alternates
altend int;
altend int;
}
// Template is the type that represents a template definition.
@ -147,11 +147,11 @@ type repeatedElement struct {
type Template struct {
fmap FormatterMap; // formatters for variables
// Used during parsing:
ldelim, rdelim []byte; // delimiters; default {}
buf []byte; // input text to process
p int; // position in buf
linenum int; // position in input
error os.Error; // error during parsing (only)
ldelim, rdelim []byte; // delimiters; default {}
buf []byte; // input text to process
p int; // position in buf
linenum int; // position in input
error os.Error; // error during parsing (only)
// Parsed results:
elems *vector.Vector;
}
@ -160,14 +160,14 @@ type Template struct {
// the data item descends into the fields associated with sections, etc.
// Parent is used to walk upwards to find variables higher in the tree.
type state struct {
parent *state; // parent in hierarchy
parent *state; // parent in hierarchy
data reflect.Value; // the driver data for this section etc.
wr io.Writer; // where to send output
errors chan os.Error; // for reporting errors during execute
}
func (parent *state) clone(data reflect.Value) *state {
return &state{parent, data, parent.wr, parent.errors}
return &state{parent, data, parent.wr, parent.errors};
}
// New creates a new template with the specified formatter map (which
@ -197,21 +197,21 @@ func (t *Template) parseError(err string, args ...) {
// Is c a white space character?
func white(c uint8) bool {
return c == ' ' || c == '\t' || c == '\r' || c == '\n'
return c == ' ' || c == '\t' || c == '\r' || c == '\n';
}
// Safely, does s[n:n+len(t)] == t?
func equal(s []byte, n int, t []byte) bool {
b := s[n:len(s)];
if len(t) > len(b) { // not enough space left for a match.
return false
return false;
}
for i , c := range t {
for i, c := range t {
if c != b[i] {
return false
return false;
}
}
return true
return true;
}
// nextItem returns the next item from the input buffer. If the returned
@ -224,7 +224,7 @@ func (t *Template) nextItem() []byte {
sawLeft := false; // are we waiting for an opening delimiter?
special := false; // is this a {.foo} directive, which means trim white space?
// Delete surrounding white space if this {.foo} is the only thing on the line.
trim_white := t.p == 0 || t.buf[t.p-1] == '\n';
trim_white := t.p == 0 || t.buf[t.p - 1] == '\n';
only_white := true; // we have seen only white space so far
var i int;
start := t.p;
@ -237,23 +237,23 @@ Loop:
break Loop;
case white(t.buf[i]):
// white space, do nothing
case !sawLeft && equal(t.buf, i, t.ldelim): // sawLeft checked because delims may be equal
case !sawLeft && equal(t.buf, i, t.ldelim): // sawLeft checked because delims may be equal
// anything interesting already on the line?
if !only_white {
break Loop;
}
// is it a directive or comment?
j := i + len(t.ldelim); // position after delimiter
j := i+len(t.ldelim); // position after delimiter
if j+1 < len(t.buf) && (t.buf[j] == '.' || t.buf[j] == '#') {
special = true;
if trim_white && only_white {
start = i;
}
} else if i > t.p { // have some text accumulated so stop before delimiter
} else if i > t.p { // have some text accumulated so stop before delimiter
break Loop;
}
sawLeft = true;
i = j - 1;
i = j-1;
case equal(t.buf, i, t.rdelim):
if !sawLeft {
t.parseError("unmatched closing delimiter");
@ -277,18 +277,18 @@ Loop:
if t.buf[i] == '\n' {
t.linenum++;
i++;
break // stop after newline
break; // stop after newline
}
}
}
t.p = i;
return item
return item;
}
// Turn a byte array into a white-space-split array of strings.
func words(buf []byte) []string {
s := make([]string, 0, 5);
p := 0; // position in buf
p := 0; // position in buf
// one word per loop
for i := 0; ; i++ {
// skip white space
@ -299,19 +299,19 @@ func words(buf []byte) []string {
for ; p < len(buf) && !white(buf[p]); p++ {
}
if start == p { // no text left
break
break;
}
if i == cap(s) {
ns := make([]string, 2*cap(s));
for j := range s {
ns[j] = s[j]
ns[j] = s[j];
}
s = ns;
}
s = s[0:i+1];
s[i] = string(buf[start:p])
s = s[0 : i+1];
s[i] = string(buf[start:p]);
}
return s
return s;
}
// Analyze an item and return its token type and, if it's an action item, an array of
@ -333,10 +333,10 @@ func (t *Template) analyze(item []byte) (tok int, w []string) {
// Comment
if item[len(t.ldelim)] == '#' {
tok = tokComment;
return
return;
}
// Split into words
w = words(item[len(t.ldelim): len(item)-len(t.rdelim)]); // drop final delimiter
w = words(item[len(t.ldelim) : len(item)-len(t.rdelim)]); // drop final delimiter
if len(w) == 0 {
t.parseError("empty directive");
return;
@ -378,7 +378,7 @@ func (t *Template) analyze(item []byte) (tok int, w []string) {
return;
}
t.parseError("bad directive: %s", item);
return
return;
}
// -- Parsing
@ -390,7 +390,7 @@ func (t *Template) newVariable(name_formatter string) (v *variableElement) {
bar := strings.Index(name_formatter, "|");
if bar >= 0 {
name = name_formatter[0:bar];
formatter = name_formatter[bar+1:len(name_formatter)];
formatter = name_formatter[bar+1 : len(name_formatter)];
}
// Probably ok, so let's build it.
v = &variableElement{t.linenum, name, formatter};
@ -402,15 +402,15 @@ func (t *Template) newVariable(name_formatter string) (v *variableElement) {
// Is it in user-supplied map?
if t.fmap != nil {
if _, ok := t.fmap[formatter]; ok {
return
return;
}
}
// Is it in builtin map?
if _, ok := builtins[formatter]; ok {
return
return;
}
t.parseError("unknown formatter: %s", formatter);
return
return;
}
// Grab the next item. If it's simple, just append it to the template.
@ -418,7 +418,7 @@ func (t *Template) newVariable(name_formatter string) (v *variableElement) {
func (t *Template) parseSimple(item []byte) (done bool, tok int, w []string) {
tok, w = t.analyze(item);
if t.error != nil {
return
return;
}
done = true; // assume for simplicity
switch tok {
@ -446,7 +446,7 @@ func (t *Template) parseSimple(item []byte) (done bool, tok int, w []string) {
t.elems.Push(t.newVariable(w[0]));
return;
}
return false, tok, w
return false, tok, w;
}
// parseRepeated and parseSection are mutually recursive
@ -467,7 +467,7 @@ Loop:
if t.error != nil {
break;
}
if len(item) == 0 {
if len(item) == 0 {
t.parseError("missing .end for .repeated section");
break;
}
@ -476,7 +476,7 @@ Loop:
break;
}
if done {
continue
continue;
}
switch tok {
case tokEnd:
@ -508,10 +508,10 @@ Loop:
}
}
if t.error != nil {
return nil
return nil;
}
if r.altend < 0 {
r.altend = t.elems.Len()
r.altend = t.elems.Len();
}
r.end = t.elems.Len();
return r;
@ -531,7 +531,7 @@ Loop:
if t.error != nil {
break;
}
if len(item) == 0 {
if len(item) == 0 {
t.parseError("missing .end for .section");
break;
}
@ -540,7 +540,7 @@ Loop:
break;
}
if done {
continue
continue;
}
switch tok {
case tokEnd:
@ -562,7 +562,7 @@ Loop:
}
}
if t.error != nil {
return nil
return nil;
}
s.end = t.elems.Len();
return s;
@ -572,14 +572,14 @@ func (t *Template) parse() {
for t.error == nil {
item := t.nextItem();
if t.error != nil {
break
break;
}
if len(item) == 0 {
break
break;
}
done, tok, w := t.parseSimple(item);
if done {
continue
continue;
}
switch tok {
case tokOr, tokEnd, tokAlternates:
@ -604,7 +604,7 @@ func (t *Template) parse() {
// it represents the actual named field.
func (st *state) findVar(s string) reflect.Value {
if s == "@" {
return st.data
return st.data;
}
data := st.data;
elems := strings.Split(s, ".", 0);
@ -612,26 +612,26 @@ func (st *state) findVar(s string) reflect.Value {
// Look up field; data must be a struct.
data = reflect.Indirect(data);
if data == nil {
return nil
return nil;
}
typ, ok := data.Type().(*reflect.StructType);
if !ok {
return nil
return nil;
}
field, ok := typ.FieldByName(elems[i]);
if !ok {
return nil
return nil;
}
data = data.(*reflect.StructValue).FieldByIndex(field.Index);
}
return data
return data;
}
// Is there no data to look at?
func empty(v reflect.Value) bool {
v = reflect.Indirect(v);
if v == nil {
return true
return true;
}
switch v := v.(type) {
case *reflect.BoolValue:
@ -653,7 +653,7 @@ func (t *Template) varValue(name string, st *state) reflect.Value {
field := st.findVar(name);
if field == nil {
if st.parent == nil {
t.execError(st, t.linenum, "name not found: %s", name)
t.execError(st, t.linenum, "name not found: %s", name);
}
return t.varValue(name, st.parent);
}
@ -677,7 +677,7 @@ func (t *Template) writeVariable(v *variableElement, st *state) {
fn(st.wr, val, formatter);
return;
}
t.execError(st, v.linenum, "missing formatter %s for variable %s", formatter, v.name)
t.execError(st, v.linenum, "missing formatter %s for variable %s", formatter, v.name);
}
// Execute element i. Return next index to execute.
@ -701,13 +701,13 @@ func (t *Template) executeElement(i int, st *state) int {
}
e := t.elems.At(i);
t.execError(st, 0, "internal error: bad directive in execute: %v %T\n", reflect.NewValue(e).Interface(), e);
return 0
return 0;
}
// Execute the template.
func (t *Template) execute(start, end int, st *state) {
for i := start; i < end; {
i = t.executeElement(i, st)
i = t.executeElement(i, st);
}
}
@ -723,17 +723,17 @@ func (t *Template) executeSection(s *sectionElement, st *state) {
if !empty(field) {
// Execute the normal block.
if end < 0 {
end = s.end
end = s.end;
}
} else {
// Execute the .or block. If it's missing, do nothing.
start, end = s.or, s.end;
if start < 0 {
return
return;
}
}
for i := start; i < end; {
i = t.executeElement(i, st)
i = t.executeElement(i, st);
}
}
@ -745,15 +745,15 @@ func iter(v reflect.Value) *reflect.ChanValue {
ft := fv.Type().(*reflect.FuncType);
// TODO(rsc): NumIn() should return 0 here, because ft is from a curried FuncValue.
if mth.Name != "Iter" || ft.NumIn() != 1 || ft.NumOut() != 1 {
continue
continue;
}
ct, ok := ft.Out(0).(*reflect.ChanType);
if !ok || ct.Dir() & reflect.RecvDir == 0 {
continue
continue;
}
return fv.Call(nil)[0].(*reflect.ChanValue)
return fv.Call(nil)[0].(*reflect.ChanValue);
}
return nil
return nil;
}
// Execute a .repeated section
@ -766,10 +766,10 @@ func (t *Template) executeRepeated(r *repeatedElement, st *state) {
start, end := r.start, r.or;
if end < 0 {
end = r.end
end = r.end;
}
if r.altstart >= 0 {
end = r.altstart
end = r.altstart;
}
first := true;
@ -780,38 +780,38 @@ func (t *Template) executeRepeated(r *repeatedElement, st *state) {
// .alternates between elements
if !first && r.altstart >= 0 {
for i := r.altstart; i < r.altend; {
i = t.executeElement(i, newst)
i = t.executeElement(i, newst);
}
}
first = false;
for i := start; i < end; {
i = t.executeElement(i, newst)
i = t.executeElement(i, newst);
}
}
} else if ch := iter(field); ch != nil {
for {
e := ch.Recv();
if ch.Closed() {
break
break;
}
newst := st.clone(e);
// .alternates between elements
if !first && r.altstart >= 0 {
for i := r.altstart; i < r.altend; {
i = t.executeElement(i, newst)
i = t.executeElement(i, newst);
}
}
first = false;
for i := start; i < end; {
i = t.executeElement(i, newst)
i = t.executeElement(i, newst);
}
}
} else {
t.execError(st, r.linenum, ".repeated: cannot repeat %s (type %s)",
r.field, field.Type());
r.field, field.Type());
}
if first {
@ -820,21 +820,21 @@ func (t *Template) executeRepeated(r *repeatedElement, st *state) {
if start >= 0 {
newst := st.clone(field);
for i := start; i < end; {
i = t.executeElement(i, newst)
i = t.executeElement(i, newst);
}
}
return
return;
}
}
// A valid delimiter must contain no white space and be non-empty.
func validDelim(d []byte) bool {
if len(d) == 0 {
return false
return false;
}
for _, c := range d {
if white(c) {
return false
return false;
}
}
return true;
@ -847,7 +847,7 @@ func validDelim(d []byte) bool {
// the error.
func (t *Template) Parse(s string) os.Error {
if !validDelim(t.ldelim) || !validDelim(t.rdelim) {
return &Error{1, fmt.Sprintf("bad delimiter strings %q %q", t.ldelim, t.rdelim)}
return &Error{1, fmt.Sprintf("bad delimiter strings %q %q", t.ldelim, t.rdelim)};
}
t.buf = strings.Bytes(s);
t.p = 0;
@ -889,16 +889,16 @@ func Parse(s string, fmap FormatterMap) (t *Template, err os.Error) {
t = New(fmap);
err = t.Parse(s);
if err != nil {
t = nil
t = nil;
}
return
return;
}
// MustParse is like Parse but panics if the template cannot be parsed.
func MustParse(s string, fmap FormatterMap) *Template {
t , err := Parse(s, fmap);
t, err := Parse(s, fmap);
if err != nil {
panic("template parse error: ", err.String());
}
return t
return t;
}