]> Cypherpunks repositories - gostls13.git/commitdiff
Step 1 of the Big Error Shift: make os.Error an interface and replace *os.Errors...
authorRob Pike <r@golang.org>
Fri, 17 Apr 2009 07:08:24 +0000 (00:08 -0700)
committerRob Pike <r@golang.org>
Fri, 17 Apr 2009 07:08:24 +0000 (00:08 -0700)
lib/template updated to use new setup; its clients also updated.

Step 2 will make os's error support internally much cleaner.

R=rsc
OCL=27586
CL=27586

57 files changed:
doc/progs/cat_rot13.go
doc/progs/file.go
src/cmd/gobuild/Makefile
src/cmd/gobuild/gobuild.go
src/cmd/gobuild/util.go
src/cmd/gotest/gotest
src/lib/bufio.go
src/lib/bufio_test.go
src/lib/exec.go
src/lib/fmt/print.go
src/lib/hash/adler32.go
src/lib/hash/crc32.go
src/lib/hash/md5.go
src/lib/hash/sha1.go
src/lib/http/request.go
src/lib/http/server.go
src/lib/http/url.go
src/lib/http/url_test.go
src/lib/io/bytebuffer.go
src/lib/io/io.go
src/lib/io/pipe.go
src/lib/json/generic.go
src/lib/net/dnsclient.go
src/lib/net/dnsconfig.go
src/lib/net/fd.go
src/lib/net/fd_darwin.go
src/lib/net/fd_linux.go
src/lib/net/net.go
src/lib/net/net_darwin.go
src/lib/net/net_linux.go
src/lib/net/parse.go
src/lib/net/port.go
src/lib/os/dir_amd64_darwin.go
src/lib/os/dir_amd64_linux.go
src/lib/os/env.go
src/lib/os/error.go
src/lib/os/exec.go
src/lib/os/file.go
src/lib/os/time.go
src/lib/regexp/all_test.go
src/lib/regexp/regexp.go
src/lib/strconv/atof.go
src/lib/strconv/atof_test.go
src/lib/strconv/atoi.go
src/lib/strconv/atoi_test.go
src/lib/strconv/quote.go
src/lib/tabwriter/tabwriter.go
src/lib/tabwriter/tabwriter_test.go
src/lib/template/template.go
src/lib/template/template_test.go
src/lib/time/sleep.go
src/lib/time/zoneinfo.go
src/lib/xml.go
test/chan/goroutines.go
usr/gri/pretty/astprinter.go
usr/gri/pretty/godoc.go
usr/gri/pretty/platform.go

index aba8b4c7fb06afed270d1396a824d867b80505d8..7411a7bedc9638f87f02d3ed23a1cd39afebae43 100644 (file)
@@ -24,7 +24,7 @@ func rot13(b byte) byte {
 }
 
 type reader interface {
-       Read(b []byte) (ret int, err *os.Error);
+       Read(b []byte) (ret int, err os.Error);
        String() string;
 }
 
@@ -36,7 +36,7 @@ func newRotate13(source reader) *rotate13 {
        return &rotate13{source}
 }
 
-func (r13 *rotate13) Read(b []byte) (ret int, err *os.Error) {
+func (r13 *rotate13) Read(b []byte) (ret int, err os.Error) {
        r, e := r13.source.Read(b);
        for i := 0; i < r; i++ {
                b[i] = rot13(b[i])
index e2ecf920961c2986fdf9479e689016640f4387ae..0f9a4a9f8b3d01abf3e38fcfb7d037d8f6640e00 100644 (file)
@@ -27,12 +27,12 @@ var (
        Stderr = newFile(2, "/dev/stderr");
 )
 
-func Open(name string, mode int64, perm int64) (file *File, err *os.Error) {
+func Open(name string, mode int64, perm int64) (file *File, err os.Error) {
        r, e := syscall.Open(name, mode, perm);
        return newFile(r, name), os.ErrnoToError(e)
 }
 
-func (file *File) Close() *os.Error {
+func (file *File) Close() os.Error {
        if file == nil {
                return os.EINVAL
        }
@@ -41,7 +41,7 @@ func (file *File) Close() *os.Error {
        return nil
 }
 
-func (file *File) Read(b []byte) (ret int, err *os.Error) {
+func (file *File) Read(b []byte) (ret int, err os.Error) {
        if file == nil {
                return -1, os.EINVAL
        }
@@ -49,7 +49,7 @@ func (file *File) Read(b []byte) (ret int, err *os.Error) {
        return int(r), os.ErrnoToError(e)
 }
 
-func (file *File) Write(b []byte) (ret int, err *os.Error) {
+func (file *File) Write(b []byte) (ret int, err os.Error) {
        if file == nil {
                return -1, os.EINVAL
        }
index 42c2a072b79c10533441364471b6c22ce2eb1633..8c0eb523b065f1a20f0de537b9a3e51c441c1a23 100644 (file)
@@ -5,7 +5,7 @@
 # sadly, not auto-generated
 
 O=6
-OS=568vq
+OS=568vqo
 GC=$(O)g
 CC=$(O)c -FVw
 AS=$(O)a
index 7622494aa0f21fedb86f4cc3b4da271f51d05543..9324e98ff4a9fc336d175c456774dfb088456658 100644 (file)
@@ -307,7 +307,7 @@ func Main() {
 
        filenames := flag.Args();
        if len(filenames) == 0 {
-               var err *os.Error;
+               var err os.Error;
                filenames, err= SourceFiles(".");
                if err != nil {
                        fatal("reading .: ", err.String());
@@ -317,7 +317,7 @@ func Main() {
        state := ScanFiles(filenames);
        state.Build();
        if *writeMakefile {
-               t, err, line := template.Parse(makefileTemplate, makefileMap);
+               t, err := template.Parse(makefileTemplate, makefileMap);
                if err != nil {
                        fatal("template.Parse: ", err.String());
                }
index 8f69f39b45c8ab44bad12aea8c2f559d88df1201..34351cea82769be2529aa40d762d8bbe69df34fe 100644 (file)
@@ -38,7 +38,7 @@ func fatal(args ...) {
 }
 
 func init() {
-       var err *os.Error;
+       var err os.Error;
        goarch, err = os.Getenv("GOARCH");
        goos, err = os.Getenv("GOOS");
 
@@ -183,7 +183,7 @@ func (s MakeString) String() string {
 var ParseError = os.NewError("parse errors");
 
 // TODO(rsc): Should this be in the AST library?
-func LitString(p []*ast.StringLit) (string, *os.Error) {
+func LitString(p []*ast.StringLit) (string, os.Error) {
        s := "";
        for i, lit := range p {
                t, err := strconv.Unquote(string(lit.Value));
@@ -195,7 +195,7 @@ func LitString(p []*ast.StringLit) (string, *os.Error) {
        return s, nil;
 }
 
-func PackageImports(file string) (pkg string, imports []string, err1 *os.Error) {
+func PackageImports(file string) (pkg string, imports []string, err1 os.Error) {
        f, err := os.Open(file, os.O_RDONLY, 0);
        if err != nil {
                return "", nil, err
@@ -224,7 +224,7 @@ func PackageImports(file string) (pkg string, imports []string, err1 *os.Error)
        return prog.Name.Value, imp, nil;
 }
 
-func SourceFiles(dir string) ([]string, *os.Error) {
+func SourceFiles(dir string) ([]string, os.Error) {
        f, err := os.Open(dir, os.O_RDONLY, 0);
        if err != nil {
                return nil, err;
index 0c025e3b3468af023dee07a502268c0285af52dc..2cb08c5290d3954d0a62496055f69a32bb9efeb7 100755 (executable)
@@ -12,6 +12,7 @@ O=6
 GC=${GC:-${O}g}
 GL=${GL:-${O}l}
 export GC GL
+GC="$GC -I _obj"
 
 gofiles=""
 loop=true
index d2387916a804f20cd8ff7c3f78e7678ece3454aa..23f55999382e3a60d3e076313d7c9a4d5e96f201 100644 (file)
@@ -49,7 +49,7 @@ type BufRead struct {
        buf []byte;
        rd io.Read;
        r, w int;
-       err *os.Error;
+       err os.Error;
        lastbyte int;
 }
 
@@ -57,7 +57,7 @@ type BufRead struct {
 // which must be greater than zero.  If the argument io.Read is already a
 // BufRead with large enough size, it returns the underlying BufRead.
 // It returns the BufRead and any error.
-func NewBufReadSize(rd io.Read, size int) (*BufRead, *os.Error) {
+func NewBufReadSize(rd io.Read, size int) (*BufRead, os.Error) {
        if size <= 0 {
                return nil, BadBufSize
        }
@@ -84,7 +84,7 @@ func NewBufRead(rd io.Read) *BufRead {
 }
 
 //.fill reads a new chunk into the buffer.
-func (b *BufRead) fill() *os.Error {
+func (b *BufRead) fill() os.Error {
        if b.err != nil {
                return b.err
        }
@@ -113,7 +113,7 @@ func (b *BufRead) fill() *os.Error {
 // If nn < len(p), also returns an error explaining
 // why the read is short.  At EOF, the count will be
 // zero and err will be io.ErrEOF.
-func (b *BufRead) Read(p []byte) (nn int, err *os.Error) {
+func (b *BufRead) Read(p []byte) (nn int, err os.Error) {
        nn = 0;
        for len(p) > 0 {
                n := len(p);
@@ -157,7 +157,7 @@ func (b *BufRead) Read(p []byte) (nn int, err *os.Error) {
 
 // ReadByte reads and returns a single byte.
 // If no byte is available, returns an error.
-func (b *BufRead) ReadByte() (c byte, err *os.Error) {
+func (b *BufRead) ReadByte() (c byte, err os.Error) {
        if b.w == b.r {
                b.fill();
                if b.err != nil {
@@ -174,7 +174,7 @@ func (b *BufRead) ReadByte() (c byte, err *os.Error) {
 }
 
 // UnreadByte unreads the last byte.  Only one byte may be unread at a given time.
-func (b *BufRead) UnreadByte() *os.Error {
+func (b *BufRead) UnreadByte() os.Error {
        if b.err != nil {
                return b.err
        }
@@ -195,7 +195,7 @@ func (b *BufRead) UnreadByte() *os.Error {
 
 // ReadRune reads a single UTF-8 encoded Unicode character and returns the
 // rune and its size in bytes.
-func (b *BufRead) ReadRune() (rune int, size int, err *os.Error) {
+func (b *BufRead) ReadRune() (rune int, size int, err os.Error) {
        for b.r + utf8.UTFMax > b.w && !utf8.FullRune(b.buf[b.r:b.w]) {
                n := b.w - b.r;
                b.fill();
@@ -241,7 +241,7 @@ func (b *BufRead) Buffered() int {
 // Fails if the line doesn't fit in the buffer.
 // For internal or advanced use only; most uses should
 // call ReadLineString or ReadLineBytes instead.
-func (b *BufRead) ReadLineSlice(delim byte) (line []byte, err *os.Error) {
+func (b *BufRead) ReadLineSlice(delim byte) (line []byte, err os.Error) {
        if b.err != nil {
                return nil, b.err
        }
@@ -288,7 +288,7 @@ func (b *BufRead) ReadLineSlice(delim byte) (line []byte, err *os.Error) {
 // If an error happens, returns the data (without a delimiter)
 // and the error.  (It can't leave the data in the buffer because
 // it might have read more than the buffer size.)
-func (b *BufRead) ReadLineBytes(delim byte) (line []byte, err *os.Error) {
+func (b *BufRead) ReadLineBytes(delim byte) (line []byte, err os.Error) {
        if b.err != nil {
                return nil, b.err
        }
@@ -301,7 +301,7 @@ func (b *BufRead) ReadLineBytes(delim byte) (line []byte, err *os.Error) {
        err = nil;
 
        for {
-               var e *os.Error;
+               var e os.Error;
                frag, e = b.ReadLineSlice(delim);
                if e == nil {   // got final fragment
                        break
@@ -364,7 +364,7 @@ func (b *BufRead) ReadLineBytes(delim byte) (line []byte, err *os.Error) {
 // ReadLineString reads until the first occurrence of delim in the input,
 // returning a new string containing the line.
 // If savedelim, keep delim in the result; otherwise drop it.
-func (b *BufRead) ReadLineString(delim byte, savedelim bool) (line string, err *os.Error) {
+func (b *BufRead) ReadLineString(delim byte, savedelim bool) (line string, err os.Error) {
        bytes, e := b.ReadLineBytes(delim);
        if e != nil {
                return string(bytes), e
@@ -380,7 +380,7 @@ func (b *BufRead) ReadLineString(delim byte, savedelim bool) (line string, err *
 
 // BufWrite implements buffering for an io.Write object.
 type BufWrite struct {
-       err *os.Error;
+       err os.Error;
        buf []byte;
        n int;
        wr io.Write;
@@ -390,7 +390,7 @@ type BufWrite struct {
 // which must be greater than zero. If the argument io.Write is already a
 // BufWrite with large enough size, it returns the underlying BufWrite.
 // It returns the BufWrite and any error.
-func NewBufWriteSize(wr io.Write, size int) (*BufWrite, *os.Error) {
+func NewBufWriteSize(wr io.Write, size int) (*BufWrite, os.Error) {
        if size <= 0 {
                return nil, BadBufSize
        }
@@ -416,7 +416,7 @@ func NewBufWrite(wr io.Write) *BufWrite {
 }
 
 // Flush writes any buffered data to the underlying io.Write.
-func (b *BufWrite) Flush() *os.Error {
+func (b *BufWrite) Flush() os.Error {
        if b.err != nil {
                return b.err
        }
@@ -454,7 +454,7 @@ func (b *BufWrite) Buffered() int {
 // It returns the number of bytes written.
 // If nn < len(p), also returns an error explaining
 // why the write is short.
-func (b *BufWrite) Write(p []byte) (nn int, err *os.Error) {
+func (b *BufWrite) Write(p []byte) (nn int, err os.Error) {
        if b.err != nil {
                return 0, b.err
        }
@@ -490,7 +490,7 @@ func (b *BufWrite) Write(p []byte) (nn int, err *os.Error) {
 }
 
 // WriteByte writes a single byte.
-func (b *BufWrite) WriteByte(c byte) *os.Error {
+func (b *BufWrite) WriteByte(c byte) os.Error {
        if b.err != nil {
                return b.err
        }
index d8c77c153c2801731c11b67b5cf9ca476155ae26..00ab4a414290b74df2a7d8e046b8ac3a5e3d6ed6 100644 (file)
@@ -30,7 +30,7 @@ func newByteReader(p []byte) io.Read {
        return b
 }
 
-func (b *byteReader) Read(p []byte) (int, *os.Error) {
+func (b *byteReader) Read(p []byte) (int, os.Error) {
        n := len(p);
        if n > len(b.p) {
                n = len(b.p)
@@ -52,7 +52,7 @@ func newHalfByteReader(p []byte) io.Read {
        return b
 }
 
-func (b *halfByteReader) Read(p []byte) (int, *os.Error) {
+func (b *halfByteReader) Read(p []byte) (int, os.Error) {
        n := len(p)/2;
        if n == 0 && len(p) > 0 {
                n = 1
@@ -76,7 +76,7 @@ func newRot13Reader(r io.Read) *rot13Reader {
        return r13
 }
 
-func (r13 *rot13Reader) Read(p []byte) (int, *os.Error) {
+func (r13 *rot13Reader) Read(p []byte) (int, os.Error) {
        n, e := r13.r.Read(p);
        if e != nil {
                return n, e
@@ -218,7 +218,7 @@ func TestBufRead(t *testing.T) {
 }
 
 type writeBuffer interface {
-       Write(p []byte) (int, *os.Error);
+       Write(p []byte) (int, os.Error);
        GetBytes() []byte
 }
 
@@ -232,7 +232,7 @@ func newByteWriter() writeBuffer {
        return new(byteWriter)
 }
 
-func (w *byteWriter) Write(p []byte) (int, *os.Error) {
+func (w *byteWriter) Write(p []byte) (int, os.Error) {
        if w.p == nil {
                w.p = make([]byte, len(p)+100)
        } else if w.n + len(p) >= len(w.p) {
@@ -262,7 +262,7 @@ func newHalfByteWriter() writeBuffer {
        return w
 }
 
-func (w *halfByteWriter) Write(p []byte) (int, *os.Error) {
+func (w *halfByteWriter) Write(p []byte) (int, os.Error) {
        n := (len(p)+1) / 2;
        // BUG return w.bw.Write(p[0:n])
        r, e := w.bw.Write(p[0:n]);
index 6808b95542e685209ea4424263ca74a36778653d..c13bad3e07ba5ffb0ff8c048901e1451ee2f944a 100644 (file)
@@ -32,7 +32,7 @@ type Cmd struct {
 
 // Given mode (DevNull, etc), return file for child
 // and file to record in Cmd structure.
-func modeToFiles(mode, fd int) (*os.File, *os.File, *os.Error) {
+func modeToFiles(mode, fd int) (*os.File, *os.File, os.Error) {
        switch mode {
        case DevNull:
                rw := os.O_WRONLY;
@@ -78,7 +78,7 @@ func modeToFiles(mode, fd int) (*os.File, *os.File, *os.Error) {
 // If a parameter is Pipe, then the corresponding field (Stdin, Stdout, Stderr)
 // of the returned Cmd is the other end of the pipe.
 // Otherwise the field in Cmd is nil.
-func Run(argv0 string, argv, envv []string, stdin, stdout, stderr int) (p *Cmd, err *os.Error)
+func Run(argv0 string, argv, envv []string, stdin, stdout, stderr int) (p *Cmd, err os.Error)
 {
        p = new(Cmd);
        var fd [3]*os.File;
@@ -139,7 +139,7 @@ Error:
 // Setting options to 0 waits for p to exit;
 // other options cause Wait to return for other
 // process events; see package os for details.
-func (p *Cmd) Wait(options uint64) (*os.Waitmsg, *os.Error) {
+func (p *Cmd) Wait(options uint64) (*os.Waitmsg, os.Error) {
        if p.Pid < 0 {
                return nil, os.EINVAL;
        }
@@ -153,7 +153,7 @@ func (p *Cmd) Wait(options uint64) (*os.Waitmsg, *os.Error) {
 // Close waits for the running command p to exit,
 // if it hasn't already, and then closes the non-nil file descriptors
 // p.Stdin, p.Stdout, and p.Stderr.
-func (p *Cmd) Close() *os.Error {
+func (p *Cmd) Close() os.Error {
        if p.Pid >= 0 {
                // Loop on interrupt, but
                // ignore other errors -- maybe
@@ -165,7 +165,7 @@ func (p *Cmd) Close() *os.Error {
        }
 
        // Close the FDs that are still open.
-       var err *os.Error;
+       var err os.Error;
        if p.Stdin != nil && p.Stdin.Fd() >= 0 {
                if err1 := p.Stdin.Close(); err1 != nil {
                        err = err1;
@@ -197,7 +197,7 @@ func canExec(file string) bool{
 // If file contains a slash, it is tried directly and the PATH is not consulted.
 //
 // TODO(rsc): Does LookPath belong in os instead?
-func LookPath(file string) (string, *os.Error) {
+func LookPath(file string) (string, os.Error) {
        // NOTE(rsc): I wish we could use the Plan 9 behavior here
        // (only bypass the path if file begins with / or ./ or ../)
        // but that would not match all the Unix shells.
index bb5a24034fb4853ac957e0e81a35cadeaf1ce367..d52dcfc10af37e6311f18f27dc0d09a72a400ece 100644 (file)
@@ -31,7 +31,7 @@ import (
 // the flags and options for the operand's format specifier.
 type Formatter interface {
        // Write is the function to call to emit formatted output to be printed.
-       Write(b []byte) (ret int, err *os.Error);
+       Write(b []byte) (ret int, err os.Error);
        // Width returns the value of the width option and whether it has been set.
        Width() (wid int, ok bool);
        // Precision returns the value of the precision option and whether it has been set.
@@ -138,7 +138,7 @@ func (p *pp) add(c int) {
 
 // Implement Write so we can call fprintf on a P, for
 // recursive use in custom verbs.
-func (p *pp) Write(b []byte) (ret int, err *os.Error) {
+func (p *pp) Write(b []byte) (ret int, err os.Error) {
        p.addbytes(b, 0, len(b));
        return len(b), nil;
 }
@@ -149,7 +149,7 @@ func (p *pp) doprint(v reflect.StructValue, addspace, addnewline bool);
 // These routines end in 'f' and take a format string.
 
 // Fprintf formats according to a format specifier and writes to w.
-func Fprintf(w io.Write, format string, a ...) (n int, error *os.Error) {
+func Fprintf(w io.Write, format string, a ...) (n int, error os.Error) {
        v := reflect.NewValue(a).(reflect.StructValue);
        p := newPrinter();
        p.doprintf(format, v);
@@ -158,7 +158,7 @@ func Fprintf(w io.Write, format string, a ...) (n int, error *os.Error) {
 }
 
 // Printf formats according to a format specifier and writes to standard output.
-func Printf(format string, v ...) (n int, errno *os.Error) {
+func Printf(format string, v ...) (n int, errno os.Error) {
        n, errno = Fprintf(os.Stdout, format, v);
        return n, errno;
 }
@@ -176,7 +176,7 @@ func Sprintf(format string, a ...) string {
 
 // Fprint formats using the default formats for its operands and writes to w.
 // Spaces are added between operands when neither is a string.
-func Fprint(w io.Write, a ...) (n int, error *os.Error) {
+func Fprint(w io.Write, a ...) (n int, error os.Error) {
        v := reflect.NewValue(a).(reflect.StructValue);
        p := newPrinter();
        p.doprint(v, false, false);
@@ -186,7 +186,7 @@ func Fprint(w io.Write, a ...) (n int, error *os.Error) {
 
 // Print formats using the default formats for its operands and writes to standard output.
 // Spaces are added between operands when neither is a string.
-func Print(v ...) (n int, errno *os.Error) {
+func Print(v ...) (n int, errno os.Error) {
        n, errno = Fprint(os.Stdout, v);
        return n, errno;
 }
@@ -207,7 +207,7 @@ func Sprint(a ...) string {
 
 // Fprintln formats using the default formats for its operands and writes to w.
 // Spaces are always added between operands and a newline is appended.
-func Fprintln(w io.Write, a ...) (n int, error *os.Error) {
+func Fprintln(w io.Write, a ...) (n int, error os.Error) {
        v := reflect.NewValue(a).(reflect.StructValue);
        p := newPrinter();
        p.doprint(v, true, true);
@@ -217,7 +217,7 @@ func Fprintln(w io.Write, a ...) (n int, error *os.Error) {
 
 // Println formats using the default formats for its operands and writes to standard output.
 // Spaces are always added between operands and a newline is appended.
-func Println(v ...) (n int, errno *os.Error) {
+func Println(v ...) (n int, errno os.Error) {
        n, errno = Fprintln(os.Stdout, v);
        return n, errno;
 }
index 2964153831ef6e18f36b87fd1833024f69446c3d..2b3bd6f85a9614dcf6d3a994335a94ea4ea356b9 100644 (file)
@@ -31,7 +31,7 @@ func NewDigest() *Digest {
 
 // Write updates the Digest with the incremental checksum generated by p.
 // It returns the number of bytes written; err is always nil.
-func (d *Digest) Write(p []byte) (nn int, err *os.Error) {
+func (d *Digest) Write(p []byte) (nn int, err os.Error) {
        a, b := d.a, d.b;
        for i := 0; i < len(p); i++ {
                a += uint32(p[i]);
index eb1dff3ba35faad52f5895f085fe2eaecd96d39b..57fa6af816debc4f35694ef739c3e481d9cd8d2b 100644 (file)
@@ -69,7 +69,7 @@ func NewIEEEDigest() *Digest {
 
 // Write updates the Digest with the incremental checksum generated by p.
 // It returns the number of bytes written; err is always nil.
-func (d *Digest) Write(p []byte) (n int, err *os.Error) {
+func (d *Digest) Write(p []byte) (n int, err os.Error) {
        crc := d.crc ^ 0xFFFFFFFF;
        tab := d.tab;
        for i := 0; i < len(p); i++ {
index d9fc6157dc5e6dbe8728008ae0a3148821b23d85..de8d34d33fb6a015620b386975093638896c1908 100644 (file)
@@ -38,7 +38,7 @@ func _Block(dig *Digest, p []byte) int
 
 // Write updates the Digest with the incremental checksum generated by p.
 // It returns the number of bytes written; err is always nil.
-func (d *Digest) Write(p []byte) (nn int, err *os.Error) {
+func (d *Digest) Write(p []byte) (nn int, err os.Error) {
        nn = len(p);
        d.len += uint64(nn);
        if d.nx > 0 {
index 788eda860ecc1385ca98c36db77acbe84ad6c99f..2b83eb9b0ca2086968889761e346fd741256bffb 100644 (file)
@@ -40,7 +40,7 @@ func _Block(dig *Digest, p []byte) int
 
 // Write updates the Digest with the incremental checksum generated by p.
 // It returns the number of bytes written; err is always nil.
-func (d *Digest) Write(p []byte) (nn int, err *os.Error) {
+func (d *Digest) Write(p []byte) (nn int, err os.Error) {
        nn = len(p);
        d.len += uint64(nn);
        if d.nx > 0 {
index a2720ff01b1a5ee9cd996be8e9b83244bec224a0..59592add537183d04ef2d5cc66ac75a8a53a0134 100644 (file)
@@ -100,7 +100,7 @@ func (r *Request) ProtoAtLeast(major, minor int) bool {
 // Give up if the line exceeds maxLineLength.
 // The returned bytes are a pointer into storage in
 // the bufio, so they are only valid until the next bufio read.
-func readLineBytes(b *bufio.BufRead) (p []byte, err *os.Error) {
+func readLineBytes(b *bufio.BufRead) (p []byte, err os.Error) {
        if p, err = b.ReadLineSlice('\n'); err != nil {
                return nil, err
        }
@@ -119,7 +119,7 @@ func readLineBytes(b *bufio.BufRead) (p []byte, err *os.Error) {
 }
 
 // readLineBytes, but convert the bytes into a string.
-func readLine(b *bufio.BufRead) (s string, err *os.Error) {
+func readLine(b *bufio.BufRead) (s string, err os.Error) {
        p, e := readLineBytes(b);
        if e != nil {
                return "", e
@@ -131,7 +131,7 @@ func readLine(b *bufio.BufRead) (s string, err *os.Error) {
 // A key/value has the form Key: Value\r\n
 // and the Value can continue on multiple lines if each continuation line
 // starts with a space.
-func readKeyValue(b *bufio.BufRead) (key, value string, err *os.Error) {
+func readKeyValue(b *bufio.BufRead) (key, value string, err os.Error) {
        line, e := readLineBytes(b);
        if e != nil {
                return "", "", e
@@ -266,7 +266,7 @@ func CanonicalHeaderKey(s string) string {
 }
 
 // ReadRequest reads and parses a request from b.
-func ReadRequest(b *bufio.BufRead) (req *Request, err *os.Error) {
+func ReadRequest(b *bufio.BufRead) (req *Request, err os.Error) {
        req = new(Request);
 
        // First line: GET /index.html HTTP/1.0
index 267e9e41e4ab252c363cb43c7edb7b7aece5a1c5..3595a515dcb6e8f9440386ac55542835bc08edb9 100644 (file)
@@ -56,7 +56,7 @@ type Conn struct {
 }
 
 // Create new connection from rwc.
-func newConn(rwc io.ReadWriteClose, raddr string, handler Handler) (c *Conn, err *os.Error) {
+func newConn(rwc io.ReadWriteClose, raddr string, handler Handler) (c *Conn, err os.Error) {
        c = new(Conn);
        c.RemoteAddr = raddr;
        c.handler = handler;
@@ -70,7 +70,7 @@ func newConn(rwc io.ReadWriteClose, raddr string, handler Handler) (c *Conn, err
 func (c *Conn) SetHeader(hdr, val string)
 
 // Read next request from connection.
-func (c *Conn) readRequest() (req *Request, err *os.Error) {
+func (c *Conn) readRequest() (req *Request, err os.Error) {
        if c.hijacked {
                return nil, ErrHijacked
        }
@@ -156,7 +156,7 @@ func (c *Conn) WriteHeader(code int) {
 // Write writes the data to the connection as part of an HTTP reply.
 // If WriteHeader has not yet been called, Write calls WriteHeader(http.StatusOK)
 // before writing the data.
-func (c *Conn) Write(data []byte) (n int, err *os.Error) {
+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
@@ -228,7 +228,7 @@ func (c *Conn) serve() {
 // will not do anything else with the connection.
 // It becomes the caller's responsibility to manage
 // and close the connection.
-func (c *Conn) Hijack() (rwc io.ReadWriteClose, buf *bufio.BufReadWrite, err *os.Error) {
+func (c *Conn) Hijack() (rwc io.ReadWriteClose, buf *bufio.BufReadWrite, err os.Error) {
        if c.hijacked {
                return nil, nil, ErrHijacked;
        }
@@ -448,7 +448,7 @@ func Handle(pattern string, handler Handler) {
 // creating a new service thread for each.  The service threads
 // read requests and then call handler to reply to them.
 // Handler is typically nil, in which case the DefaultServeMux is used.
-func Serve(l net.Listener, handler Handler) *os.Error {
+func Serve(l net.Listener, handler Handler) os.Error {
        if handler == nil {
                handler = DefaultServeMux;
        }
@@ -492,7 +492,7 @@ func Serve(l net.Listener, handler Handler) *os.Error {
 //                     panic("ListenAndServe: ", err.String())
 //             }
 //     }
-func ListenAndServe(addr string, handler Handler) *os.Error {
+func ListenAndServe(addr string, handler Handler) os.Error {
        l, e := net.Listen("tcp", addr);
        if e != nil {
                return e
index d92a3baa621c3e25e8044655f20ffff3b9050b16..62699c13d772bc2e4f8d54ddfb27ab2fd78d15f7 100644 (file)
@@ -45,7 +45,7 @@ func unhex(c byte) byte {
 // converting %AB into the byte 0xAB.
 // It returns a BadURL error if any % is not followed
 // by two hexadecimal digits.
-func URLUnescape(s string) (string, *os.Error) {
+func URLUnescape(s string) (string, os.Error) {
        // Count %, check that they're well-formed.
        n := 0;
        for i := 0; i < len(s); {
@@ -98,7 +98,7 @@ type URL struct {
 // Maybe rawurl is of the form scheme:path.
 // (Scheme must be [a-zA-Z][a-zA-Z0-9+-.]*)
 // If so, return scheme, path; else return "", rawurl.
-func getscheme(rawurl string) (scheme, path string, err *os.Error) {
+func getscheme(rawurl string) (scheme, path string, err os.Error) {
        for i := 0; i < len(rawurl); i++ {
                c := rawurl[i];
                switch {
@@ -139,7 +139,7 @@ func split(s string, c byte, cutc bool) (string, string) {
 // ParseURL parses rawurl into a URL structure.
 // The string rawurl is assumed not to have a #fragment suffix.
 // (Web browsers strip #fragment before sending the URL to a web server.)
-func ParseURL(rawurl string) (url *URL, err *os.Error) {
+func ParseURL(rawurl string) (url *URL, err os.Error) {
        if rawurl == "" {
                return nil, BadURL
        }
@@ -184,7 +184,7 @@ func ParseURL(rawurl string) (url *URL, err *os.Error) {
 }
 
 // ParseURLReference is like ParseURL but allows a trailing #fragment.
-func ParseURLReference(rawurlref string) (url *URL, err *os.Error) {
+func ParseURLReference(rawurlref string) (url *URL, err os.Error) {
        // Cut off #frag.
        rawurl, frag := split(rawurlref, '#', true);
        if url, err = ParseURL(rawurl); err != nil {
index 50263f69ae8255b388ade890f4aac09a4230a9b4..f5a7069aeab911242fca9cc8a5afd9238bab75f6 100644 (file)
@@ -126,7 +126,7 @@ func ufmt(u *URL) string {
                u.Host, u.Path, u.Query, u.Fragment);
 }
 
-func DoTest(t *testing.T, parse func(string) (*URL, *os.Error), name string, tests []URLTest) {
+func DoTest(t *testing.T, parse func(string) (*URL, os.Error), name string, tests []URLTest) {
        for i, tt := range tests {
                u, err := parse(tt.in);
                if err != nil {
@@ -150,7 +150,7 @@ func TestParseURLReference(t *testing.T) {
        DoTest(t, ParseURLReference, "ParseURLReference", urlfragtests);
 }
 
-func DoTestString(t *testing.T, parse func(string) (*URL, *os.Error), name string, tests []URLTest) {
+func DoTestString(t *testing.T, parse func(string) (*URL, os.Error), name string, tests []URLTest) {
        for i, tt := range tests {
                u, err := parse(tt.in);
                if err != nil {
index 440f265c538f1cb00b7af3dcbf8474a4ae4c9982..9c78e8566f491f57db03e6d530d077d881b78a69 100644 (file)
@@ -40,7 +40,7 @@ func (b *ByteBuffer) Reset() {
 
 // Write appends the contents of p to the buffer.  The return
 // value is the length of p; err is always nil.
-func (b *ByteBuffer) Write(p []byte) (n int, err *os.Error) {
+func (b *ByteBuffer) Write(p []byte) (n int, err os.Error) {
        plen := len(p);
        if len(b.buf) == 0 {
                b.cap = plen + 1024;
@@ -60,7 +60,7 @@ func (b *ByteBuffer) Write(p []byte) (n int, err *os.Error) {
 
 // Read reads the next len(p) bytes from the buffer or until the buffer
 // is drained.  The return value is the number of bytes read; err is always nil.
-func (b *ByteBuffer) Read(p []byte) (n int, err *os.Error) {
+func (b *ByteBuffer) Read(p []byte) (n int, err os.Error) {
        plen := len(p);
        if len(b.buf) == 0 {
                return 0, nil
index 73406668fb9c1b1b451902723dc5eb085be5f96b..2c116687b9cad8dc07a04c0ad65016093f1cf8b5 100644 (file)
@@ -18,17 +18,17 @@ var ErrEOF = os.NewError("EOF")
 
 // Read is the interface that wraps the basic Read method.
 type Read interface {
-       Read(p []byte) (n int, err *os.Error);
+       Read(p []byte) (n int, err os.Error);
 }
 
 // Write is the interface that wraps the basic Write method.
 type Write interface {
-       Write(p []byte) (n int, err *os.Error);
+       Write(p []byte) (n int, err os.Error);
 }
 
 // Close is the interface that wraps the basic Close method.
 type Close interface {
-       Close() *os.Error;
+       Close() os.Error;
 }
 
 // ReadWrite is the interface that groups the basic Read and Write methods.
@@ -66,12 +66,12 @@ func StringBytes(s string) []byte {
 }
 
 // WriteString writes the contents of the string s to w, which accepts an array of bytes.
-func WriteString(w Write, s string) (n int, err *os.Error) {
+func WriteString(w Write, s string) (n int, err os.Error) {
        return w.Write(StringBytes(s))
 }
 
 // Readn reads r until the buffer buf is full, or until EOF or error.
-func Readn(r Read, buf []byte) (n int, err *os.Error) {
+func Readn(r Read, buf []byte) (n int, err os.Error) {
        n = 0;
        for n < len(buf) {
                nn, e := r.Read(buf[n:len(buf)]);
@@ -94,7 +94,7 @@ type fullRead struct {
        r       Read;
 }
 
-func (fr *fullRead) Read(p []byte) (n int, err *os.Error) {
+func (fr *fullRead) Read(p []byte) (n int, err os.Error) {
        n, err = Readn(fr.r, p);
        return n, err
 }
@@ -111,7 +111,7 @@ func MakeFullReader(r Read) Read {
 
 // Copy n copies n bytes (or until EOF is reached) from src to dst.
 // It returns the number of bytes copied and the error, if any.
-func Copyn(src Read, dst Write, n int64) (written int64, err *os.Error) {
+func Copyn(src Read, dst Write, n int64) (written int64, err os.Error) {
        buf := make([]byte, 32*1024);
        for written < n {
                l := len(buf);
@@ -147,7 +147,7 @@ func Copyn(src Read, dst Write, n int64) (written int64, err *os.Error) {
 
 // Copy copies from src to dst until EOF is reached.
 // It returns the number of bytes copied and the error, if any.
-func Copy(src Read, dst Write) (written int64, err *os.Error) {
+func Copy(src Read, dst Write) (written int64, err os.Error) {
        buf := make([]byte, 32*1024);
        for {
                nr, er := src.Read(buf);
index 427717b09a4be8d0cffa40d11fff55a0d7a83503..446ec69bb4bbad3ef12fc62ac7743145f9a77c26 100644 (file)
@@ -15,7 +15,7 @@ import (
 
 type pipeReturn struct {
        n int;
-       err *os.Error;
+       err os.Error;
 }
 
 // Shared pipe structure.
@@ -28,7 +28,7 @@ type pipe struct {
        cw chan pipeReturn;     // ... and reads the n, err back from here.
 }
 
-func (p *pipe) Read(data []byte) (n int, err *os.Error) {
+func (p *pipe) Read(data []byte) (n int, err os.Error) {
        if p == nil || p.rclosed {
                return 0, os.EINVAL;
        }
@@ -65,7 +65,7 @@ func (p *pipe) Read(data []byte) (n int, err *os.Error) {
        return n, nil;
 }
 
-func (p *pipe) Write(data []byte) (n int, err *os.Error) {
+func (p *pipe) Write(data []byte) (n int, err os.Error) {
        if p == nil || p.wclosed {
                return 0, os.EINVAL;
        }
@@ -81,7 +81,7 @@ func (p *pipe) Write(data []byte) (n int, err *os.Error) {
        return res.n, res.err;
 }
 
-func (p *pipe) CloseReader() *os.Error {
+func (p *pipe) CloseReader() os.Error {
        if p == nil || p.rclosed {
                return os.EINVAL;
        }
@@ -97,7 +97,7 @@ func (p *pipe) CloseReader() *os.Error {
        return nil;
 }
 
-func (p *pipe) CloseWriter() *os.Error {
+func (p *pipe) CloseWriter() os.Error {
        if p == nil || p.wclosed {
                return os.EINVAL;
        }
@@ -127,14 +127,14 @@ type pipeRead struct {
        p *pipe;
 }
 
-func (r *pipeRead) Read(data []byte) (n int, err *os.Error) {
+func (r *pipeRead) Read(data []byte) (n int, err os.Error) {
        r.lock.Lock();
        defer r.lock.Unlock();
 
        return r.p.Read(data);
 }
 
-func (r *pipeRead) Close() *os.Error {
+func (r *pipeRead) Close() os.Error {
        r.lock.Lock();
        defer r.lock.Unlock();
 
@@ -151,14 +151,14 @@ type pipeWrite struct {
        p *pipe;
 }
 
-func (w *pipeWrite) Write(data []byte) (n int, err *os.Error) {
+func (w *pipeWrite) Write(data []byte) (n int, err os.Error) {
        w.lock.Lock();
        defer w.lock.Unlock();
 
        return w.p.Write(data);
 }
 
-func (w *pipeWrite) Close() *os.Error {
+func (w *pipeWrite) Close() os.Error {
        w.lock.Lock();
        defer w.lock.Unlock();
 
index 8801f7631cf162d35d0589c0fd15dec32343fa56..4393e4d0804a871973dc8557d698f6d1db80e905 100644 (file)
@@ -327,4 +327,4 @@ func StringToJson(s string) (json Json, ok bool, errtok string) {
        return j, true, ""
 }
 
-// BUG(rsc): StringToJson should return an *os.Error instead of a bool.
+// BUG(rsc): StringToJson should return an os.Error instead of a bool.
index c0a4177315a9770f508fcfad23916de836e45b63..afae7cfb401ab8b441ea1dfd6cdb6073e48a8c8c 100644 (file)
@@ -41,7 +41,7 @@ var (
 
 // Send a request on the connection and hope for a reply.
 // Up to cfg.attempts attempts.
-func _Exchange(cfg *_DNS_Config, c Conn, name string) (m *_DNS_Msg, err *os.Error) {
+func _Exchange(cfg *_DNS_Config, c Conn, name string) (m *_DNS_Msg, err os.Error) {
        if len(name) >= 256 {
                return nil, DNS_NameTooLong
        }
@@ -86,7 +86,7 @@ func _Exchange(cfg *_DNS_Config, c Conn, name string) (m *_DNS_Msg, err *os.Erro
 // Find answer for name in dns message.
 // On return, if err == nil, addrs != nil.
 // TODO(rsc): Maybe return []IP instead?
-func answer(name string, dns *_DNS_Msg) (addrs []string, err *os.Error) {
+func answer(name string, dns *_DNS_Msg) (addrs []string, err os.Error) {
        addrs = make([]string, 0, len(dns.answer));
 
        if dns.rcode == _DNS_RcodeNameError && dns.authoritative {
@@ -137,7 +137,7 @@ Cname:
 
 // Do a lookup for a single name, which must be rooted
 // (otherwise answer will not find the answers).
-func tryOneName(cfg *_DNS_Config, name string) (addrs []string, err *os.Error) {
+func tryOneName(cfg *_DNS_Config, name string) (addrs []string, err os.Error) {
        err = DNS_NoServers;
        for i := 0; i < len(cfg.servers); i++ {
                // Calling Dial here is scary -- we have to be sure
@@ -168,7 +168,7 @@ func tryOneName(cfg *_DNS_Config, name string) (addrs []string, err *os.Error) {
 }
 
 var cfg *_DNS_Config
-var dnserr *os.Error
+var dnserr os.Error
 
 func loadConfig() {
        cfg, dnserr = _DNS_ReadConfig();
@@ -177,7 +177,7 @@ func loadConfig() {
 // LookupHost looks up the host name using the local DNS resolver.
 // It returns the canonical name for the host and an array of that
 // host's addresses.
-func LookupHost(name string) (cname string, addrs []string, err *os.Error)
+func LookupHost(name string) (cname string, addrs []string, err os.Error)
 {
        // TODO(rsc): Pick out obvious non-DNS names to avoid
        // sending stupid requests to the server?
index 385d07b6ae730aa204262e769ee4273b93d1314c..e56d964f2d8aa9b950aaa3da143c2a5a40f8ef59 100644 (file)
@@ -22,16 +22,16 @@ type _DNS_Config struct {
        rotate bool;    // round robin among servers
 }
 
-var _DNS_configError *os.Error;
+var _DNS_configError os.Error;
 
 // See resolv.conf(5) on a Linux machine.
 // TODO(rsc): Supposed to call uname() and chop the beginning
 // 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) {
+func _DNS_ReadConfig() (*_DNS_Config, os.Error) {
        // TODO(rsc): 6g won't let me say file, err :=
        var file *file;
-       var err *os.Error;
+       var err os.Error;
        file, err = open("/etc/resolv.conf");
        if err != nil {
                return nil, err
index 8b26efed503e1bec285d7c93a5094f33997429f8..b386728ff694ff6921de91ccda57c7da64de450b 100644 (file)
@@ -38,7 +38,7 @@ type netFD struct {
 }
 
 // Make reads and writes on fd return EAGAIN instead of blocking.
-func setNonblock(fd int64) *os.Error {
+func setNonblock(fd int64) os.Error {
        flags, e := syscall.Fcntl(fd, syscall.F_GETFL, 0);
        if e != 0 {
                return os.ErrnoToError(e)
@@ -97,7 +97,7 @@ type pollServer struct {
 }
 func (s *pollServer) Run();
 
-func newPollServer() (s *pollServer, err *os.Error) {
+func newPollServer() (s *pollServer, err os.Error) {
        s = new(pollServer);
        s.cr = make(chan *netFD, 1);
        s.cw = make(chan *netFD, 1);
@@ -318,7 +318,7 @@ func _StartServer() {
        pollserver = p
 }
 
-func newFD(fd int64, net, laddr, raddr string) (f *netFD, err *os.Error) {
+func newFD(fd int64, net, laddr, raddr string) (f *netFD, err os.Error) {
        if pollserver == nil {
                once.Do(_StartServer);
        }
@@ -336,7 +336,7 @@ func newFD(fd int64, net, laddr, raddr string) (f *netFD, err *os.Error) {
        return f, nil
 }
 
-func (fd *netFD) Close() *os.Error {
+func (fd *netFD) Close() os.Error {
        if fd == nil || fd.file == nil {
                return os.EINVAL
        }
@@ -355,7 +355,7 @@ func (fd *netFD) Close() *os.Error {
        return e
 }
 
-func (fd *netFD) Read(p []byte) (n int, err *os.Error) {
+func (fd *netFD) Read(p []byte) (n int, err os.Error) {
        if fd == nil || fd.file == nil {
                return -1, os.EINVAL
        }
@@ -374,7 +374,7 @@ func (fd *netFD) Read(p []byte) (n int, err *os.Error) {
        return n, err
 }
 
-func (fd *netFD) Write(p []byte) (n int, err *os.Error) {
+func (fd *netFD) Write(p []byte) (n int, err os.Error) {
        if fd == nil || fd.file == nil {
                return -1, os.EINVAL
        }
@@ -406,9 +406,9 @@ func (fd *netFD) Write(p []byte) (n int, err *os.Error) {
        return nn, err
 }
 
-func sockaddrToHostPort(sa *syscall.Sockaddr) (hostport string, err *os.Error)
+func sockaddrToHostPort(sa *syscall.Sockaddr) (hostport string, err os.Error)
 
-func (fd *netFD) Accept(sa *syscall.Sockaddr) (nfd *netFD, err *os.Error) {
+func (fd *netFD) Accept(sa *syscall.Sockaddr) (nfd *netFD, err os.Error) {
        if fd == nil || fd.file == nil {
                return nil, os.EINVAL
        }
index c543755b97fc5ca326ab4276dc7db4ad0d8f4c74..b4392d00e1e2dfd29afbaf9440bc7519e29fbb56 100644 (file)
@@ -18,7 +18,7 @@ type pollster struct {
        events []syscall.Kevent_t;
 }
 
-func newpollster() (p *pollster, err *os.Error) {
+func newpollster() (p *pollster, err os.Error) {
        p = new(pollster);
        var e int64;
        if p.kq, e = syscall.Kqueue(); e != 0 {
@@ -28,7 +28,7 @@ func newpollster() (p *pollster, err *os.Error) {
        return p, nil
 }
 
-func (p *pollster) AddFD(fd int64, mode int, repeat bool) *os.Error {
+func (p *pollster) AddFD(fd int64, mode int, repeat bool) os.Error {
        var kmode int16;
        if mode == 'r' {
                kmode = syscall.EVFILT_READ
@@ -81,7 +81,7 @@ func (p *pollster) DelFD(fd int64, mode int) {
        syscall.Kevent(p.kq, &events, &events, nil);
 }
 
-func (p *pollster) WaitFD(nsec int64) (fd int64, mode int, err *os.Error) {
+func (p *pollster) WaitFD(nsec int64) (fd int64, mode int, err os.Error) {
        var t *syscall.Timespec;
        for len(p.events) == 0 {
                if nsec > 0 {
@@ -114,7 +114,7 @@ func (p *pollster) WaitFD(nsec int64) (fd int64, mode int, err *os.Error) {
        return fd, mode, nil
 }
 
-func (p *pollster) Close() *os.Error {
+func (p *pollster) Close() os.Error {
        r, e := syscall.Close(p.kq);
        return os.ErrnoToError(e)
 }
index ecdf1da841d11c6ffcbf60d88a12ab90e5e05b7f..78a1670e1f9a4c670d58b129e26661c97109b16a 100644 (file)
@@ -24,7 +24,7 @@ type pollster struct {
        events map[int64] uint32;
 }
 
-func newpollster() (p *pollster, err *os.Error) {
+func newpollster() (p *pollster, err os.Error) {
        p = new(pollster);
        var e int64;
 
@@ -38,7 +38,7 @@ func newpollster() (p *pollster, err *os.Error) {
        return p, nil
 }
 
-func (p *pollster) AddFD(fd int64, mode int, repeat bool) *os.Error {
+func (p *pollster) AddFD(fd int64, mode int, repeat bool) os.Error {
        var ev syscall.EpollEvent;
        var already bool;
        ev.Fd = int32(fd);
@@ -106,7 +106,7 @@ func (p *pollster) DelFD(fd int64, mode int) {
        }
 }
 
-func (p *pollster) WaitFD(nsec int64) (fd int64, mode int, err *os.Error) {
+func (p *pollster) WaitFD(nsec int64) (fd int64, mode int, err os.Error) {
        // Get an event.
        var evarray [1]syscall.EpollEvent;
        ev := &evarray[0];
@@ -145,7 +145,7 @@ func (p *pollster) WaitFD(nsec int64) (fd int64, mode int, err *os.Error) {
        return fd, 'r', nil;
 }
 
-func (p *pollster) Close() *os.Error {
+func (p *pollster) Close() os.Error {
        r, e := syscall.Close(p.epfd);
        return os.ErrnoToError(e);
 }
index c63972a887f10324a568a50a1b94c7bbde2d8af4..737af520b6048cf2a2d398f4ddea3f616556519d 100644 (file)
@@ -19,11 +19,11 @@ var (
        UnknownSocketFamily = os.NewError("unknown socket family");
 )
 
-func LookupHost(name string) (cname string, addrs []string, err *os.Error)
+func LookupHost(name string) (cname string, addrs []string, err os.Error)
 
 // 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) {
+func splitHostPort(hostport string) (host, port string, err os.Error) {
        // The port starts after the last colon.
        var i int;
        for i = len(hostport)-1; i >= 0; i-- {
@@ -63,7 +63,7 @@ func joinHostPort(host, port string) string {
 // Convert "host:port" into IP address and port.
 // For now, host and port must be numeric literals.
 // Eventually, we'll have name resolution.
-func hostPortToIP(net, hostport, mode string) (ip []byte, iport int, err *os.Error) {
+func hostPortToIP(net, hostport, mode string) (ip []byte, iport int, err os.Error) {
        var host, port string;
        host, port, err = splitHostPort(hostport);
        if err != nil {
@@ -114,7 +114,7 @@ func hostPortToIP(net, hostport, mode string) (ip []byte, iport int, err *os.Err
 }
 
 // Convert socket address into "host:port".
-func sockaddrToHostPort(sa *syscall.Sockaddr) (hostport string, err *os.Error) {
+func sockaddrToHostPort(sa *syscall.Sockaddr) (hostport string, err os.Error) {
        switch sa.Family {
        case syscall.AF_INET, syscall.AF_INET6:
                addr, port, e := sockaddrToIP(sa);
@@ -139,7 +139,7 @@ func boolint(b bool) int {
 
 // Generic socket creation.
 func socket(net, laddr, raddr string, f, p, t int64, la, ra *syscall.Sockaddr)
-       (fd *netFD, err *os.Error)
+       (fd *netFD, err os.Error)
 {
        // See ../syscall/exec.go for description of ForkLock.
        syscall.ForkLock.RLock();
@@ -201,17 +201,17 @@ func (c *connBase) sysFD() int64 {
        return c.fd.fd;
 }
 
-func (c *connBase) Read(b []byte) (n int, err *os.Error) {
+func (c *connBase) Read(b []byte) (n int, err os.Error) {
        n, err = c.fd.Read(b);
        return n, err
 }
 
-func (c *connBase) Write(b []byte) (n int, err *os.Error) {
+func (c *connBase) Write(b []byte) (n int, err os.Error) {
        n, err = c.fd.Write(b);
        return n, err
 }
 
-func (c *connBase) ReadFrom(b []byte) (n int, raddr string, err *os.Error) {
+func (c *connBase) ReadFrom(b []byte) (n int, raddr string, err os.Error) {
        if c == nil {
                return -1, "", os.EINVAL
        }
@@ -219,7 +219,7 @@ func (c *connBase) ReadFrom(b []byte) (n int, raddr string, err *os.Error) {
        return n, c.raddr, err
 }
 
-func (c *connBase) WriteTo(raddr string, b []byte) (n int, err *os.Error) {
+func (c *connBase) WriteTo(raddr string, b []byte) (n int, err os.Error) {
        if c == nil {
                return -1, os.EINVAL
        }
@@ -230,7 +230,7 @@ func (c *connBase) WriteTo(raddr string, b []byte) (n int, err *os.Error) {
        return n, err
 }
 
-func (c *connBase) Close() *os.Error {
+func (c *connBase) Close() os.Error {
        if c == nil {
                return os.EINVAL
        }
@@ -238,57 +238,57 @@ func (c *connBase) Close() *os.Error {
 }
 
 
-func setsockopt_int(fd, level, opt int64, value int) *os.Error {
+func setsockopt_int(fd, level, opt int64, value int) os.Error {
        return os.ErrnoToError(syscall.Setsockopt_int(fd, level, opt, value));
 }
 
-func setsockopt_tv(fd, level, opt int64, nsec int64) *os.Error {
+func setsockopt_tv(fd, level, opt int64, nsec int64) os.Error {
        return os.ErrnoToError(syscall.Setsockopt_tv(fd, level, opt, nsec));
 }
 
-func (c *connBase) SetReadBuffer(bytes int) *os.Error {
+func (c *connBase) SetReadBuffer(bytes int) os.Error {
        return setsockopt_int(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes);
 }
 
-func (c *connBase) SetWriteBuffer(bytes int) *os.Error {
+func (c *connBase) SetWriteBuffer(bytes int) os.Error {
        return setsockopt_int(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes);
 }
 
-func (c *connBase) SetReadTimeout(nsec int64) *os.Error {
+func (c *connBase) SetReadTimeout(nsec int64) os.Error {
        c.fd.rdeadline_delta = nsec;
        return nil;
 }
 
-func (c *connBase) SetWriteTimeout(nsec int64) *os.Error {
+func (c *connBase) SetWriteTimeout(nsec int64) os.Error {
        c.fd.wdeadline_delta = nsec;
        return nil;
 }
 
-func (c *connBase) SetTimeout(nsec int64) *os.Error {
+func (c *connBase) SetTimeout(nsec int64) os.Error {
        if e := c.SetReadTimeout(nsec); e != nil {
                return e
        }
        return c.SetWriteTimeout(nsec)
 }
 
-func (c *connBase) SetReuseAddr(reuse bool) *os.Error {
+func (c *connBase) SetReuseAddr(reuse bool) os.Error {
        return setsockopt_int(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, boolint(reuse));
 }
 
-func (c *connBase) BindToDevice(dev string) *os.Error {
+func (c *connBase) BindToDevice(dev string) os.Error {
        // TODO(rsc): call setsockopt with null-terminated string pointer
        return os.EINVAL
 }
 
-func (c *connBase) SetDontRoute(dontroute bool) *os.Error {
+func (c *connBase) SetDontRoute(dontroute bool) os.Error {
        return setsockopt_int(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_DONTROUTE, boolint(dontroute));
 }
 
-func (c *connBase) SetKeepAlive(keepalive bool) *os.Error {
+func (c *connBase) SetKeepAlive(keepalive bool) os.Error {
        return setsockopt_int(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive));
 }
 
-func (c *connBase) SetLinger(sec int) *os.Error {
+func (c *connBase) SetLinger(sec int) os.Error {
        e := syscall.Setsockopt_linger(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_LINGER, sec);
        return os.ErrnoToError(e);
 }
@@ -305,12 +305,12 @@ func (c *connBase) SetLinger(sec int) *os.Error {
 const preferIPv4 = false
 
 func internetSocket(net, laddr, raddr string, proto int64, mode string)
-       (fd *netFD, err *os.Error)
+       (fd *netFD, err os.Error)
 {
        // Parse addresses (unless they are empty).
        var lip, rip IP;
        var lport, rport int;
-       var lerr, rerr *os.Error;
+       var lerr, rerr os.Error;
 
        if laddr != "" {
                lip, lport, lerr = hostPortToIP(net, laddr, mode);
@@ -343,7 +343,7 @@ func internetSocket(net, laddr, raddr string, proto int64, mode string)
                }
        }
 
-       var cvt func(addr []byte, port int) (sa *syscall.Sockaddr, err *os.Error);
+       var cvt func(addr []byte, port int) (sa *syscall.Sockaddr, err os.Error);
        var family int64;
        if vers == 4 {
                cvt = v4ToSockaddr;
@@ -378,7 +378,7 @@ type ConnTCP struct {
        connBase
 }
 
-func (c *ConnTCP) SetNoDelay(nodelay bool) *os.Error {
+func (c *ConnTCP) SetNoDelay(nodelay bool) os.Error {
        if c == nil {
                return os.EINVAL
        }
@@ -393,7 +393,7 @@ func newConnTCP(fd *netFD, raddr string) *ConnTCP {
        return c
 }
 
-func DialTCP(net, laddr, raddr string) (c *ConnTCP, err *os.Error) {
+func DialTCP(net, laddr, raddr string) (c *ConnTCP, err os.Error) {
        if raddr == "" {
                return nil, MissingAddress
        }
@@ -420,7 +420,7 @@ func newConnUDP(fd *netFD, raddr string) *ConnUDP {
        return c
 }
 
-func DialUDP(net, laddr, raddr string) (c *ConnUDP, err *os.Error) {
+func DialUDP(net, laddr, raddr string) (c *ConnUDP, err os.Error) {
        if raddr == "" {
                return nil, MissingAddress
        }
@@ -441,48 +441,48 @@ type Conn interface {
        // Read blocks until data is ready from the connection
        // and then reads into b.  It returns the number
        // of bytes read, or 0 if the connection has been closed.
-       Read(b []byte) (n int, err *os.Error);
+       Read(b []byte) (n int, err os.Error);
 
        // Write writes the data in b to the connection.
-       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;
 
        // For packet-based protocols such as UDP,
        // ReadFrom reads the next packet from the network,
        // returning the number of bytes read and the remote
        // address that sent them.
-       ReadFrom(b []byte) (n int, addr string, err *os.Error);
+       ReadFrom(b []byte) (n int, addr string, err os.Error);
 
        // For packet-based protocols such as UDP,
        // WriteTo writes the byte buffer b to the network
        // as a single payload, sending it to the target address.
-       WriteTo(addr string, b []byte) (n int, err *os.Error);
+       WriteTo(addr string, b []byte) (n int, err os.Error);
 
        // SetReadBuffer sets the size of the operating system's
        // receive buffer associated with the connection.
-       SetReadBuffer(bytes int) *os.Error;
+       SetReadBuffer(bytes int) os.Error;
 
        // SetReadBuffer sets the size of the operating system's
        // transmit buffer associated with the connection.
-       SetWriteBuffer(bytes int) *os.Error;
+       SetWriteBuffer(bytes int) os.Error;
 
        // 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;
 
        // SetLinger sets the behavior of Close() on a connection
        // which still has data waiting to be sent or to be acknowledged.
@@ -495,22 +495,22 @@ type Conn interface {
        //
        // If sec > 0, Close blocks for at most sec seconds waiting for
        // data to be sent and acknowledged.
-       SetLinger(sec int) *os.Error;
+       SetLinger(sec int) os.Error;
 
        // SetReuseAddr sets whether it is okay to reuse addresses
        // from recent connections that were not properly closed.
-       SetReuseAddr(reuseaddr bool) *os.Error;
+       SetReuseAddr(reuseaddr bool) os.Error;
 
        // SetDontRoute sets whether outgoing messages should
        // bypass the system routing tables.
-       SetDontRoute(dontroute bool) *os.Error;
+       SetDontRoute(dontroute bool) os.Error;
 
        // SetKeepAlive sets whether the operating system should send
        // keepalive messages on the connection.
-       SetKeepAlive(keepalive bool) *os.Error;
+       SetKeepAlive(keepalive bool) os.Error;
 
        // BindToDevice binds a connection to a particular network device.
-       BindToDevice(dev string) *os.Error;
+       BindToDevice(dev string) os.Error;
 }
 
 // Dial connects to the remote address raddr on the network net.
@@ -528,7 +528,7 @@ type Conn interface {
 //     Dial("tcp", "", "google.com:80")
 //     Dial("tcp", "", "[de:ad:be:ef::ca:fe]:80")
 //     Dial("tcp", "127.0.0.1:123", "127.0.0.1:88")
-func Dial(net, laddr, raddr string) (c Conn, err *os.Error) {
+func Dial(net, laddr, raddr string) (c Conn, err os.Error) {
        switch net {
        case "tcp", "tcp4", "tcp6":
                c, err := DialTCP(net, laddr, raddr);
@@ -557,8 +557,8 @@ func Dial(net, laddr, raddr string) (c Conn, err *os.Error) {
 // A Listener is a generic network listener.
 // Accept waits for the next connection and Close closes the connection.
 type Listener interface {
-       Accept() (c Conn, raddr string, err *os.Error);
-       Close() *os.Error;
+       Accept() (c Conn, raddr string, err os.Error);
+       Close() os.Error;
 }
 
 // ListenerTCP is a TCP network listener.
@@ -571,7 +571,7 @@ type ListenerTCP struct {
 
 // ListenTCP announces on the TCP address laddr and returns a TCP listener.
 // Net must be "tcp", "tcp4", or "tcp6".
-func ListenTCP(net, laddr string) (l *ListenerTCP, err *os.Error) {
+func ListenTCP(net, laddr string) (l *ListenerTCP, err os.Error) {
        fd, e := internetSocket(net, laddr, "", syscall.SOCK_STREAM, "listen");
        if e != nil {
                return nil, e
@@ -588,7 +588,7 @@ func ListenTCP(net, laddr string) (l *ListenerTCP, err *os.Error) {
 
 // AcceptTCP accepts the next incoming call and returns the new connection
 // and the remote address.
-func (l *ListenerTCP) AcceptTCP() (c *ConnTCP, raddr string, err *os.Error) {
+func (l *ListenerTCP) AcceptTCP() (c *ConnTCP, raddr string, err os.Error) {
        if l == nil || l.fd == nil || l.fd.fd < 0 {
                return nil, "", os.EINVAL
        }
@@ -607,7 +607,7 @@ func (l *ListenerTCP) AcceptTCP() (c *ConnTCP, raddr string, err *os.Error) {
 
 // Accept implements the accept method in the Listener interface;
 // it waits for the next call and returns a generic Conn.
-func (l *ListenerTCP) Accept() (c Conn, raddr string, err *os.Error) {
+func (l *ListenerTCP) Accept() (c Conn, raddr string, err os.Error) {
        c1, r1, e1 := l.AcceptTCP();
        if e1 != nil {
                return nil, "", e1
@@ -617,7 +617,7 @@ func (l *ListenerTCP) Accept() (c Conn, raddr string, err *os.Error) {
 
 // Close stops listening on the TCP address.
 // Already Accepted connections are not closed.
-func (l *ListenerTCP) Close() *os.Error {
+func (l *ListenerTCP) Close() os.Error {
        if l == nil || l.fd == nil {
                return os.EINVAL
        }
@@ -626,7 +626,7 @@ func (l *ListenerTCP) Close() *os.Error {
 
 // Listen announces on the local network address laddr.
 // The network string net must be "tcp", "tcp4", or "tcp6".
-func Listen(net, laddr string) (l Listener, err *os.Error) {
+func Listen(net, laddr string) (l Listener, err os.Error) {
        switch net {
        case "tcp", "tcp4", "tcp6":
                l, err := ListenTCP(net, laddr);
index 78a705af959b172fa7a52a9871c61782f08277e8..7e85f089b5601011fed925ffa9668e128d738ed4 100644 (file)
@@ -11,7 +11,7 @@ import (
        "unsafe";
 )
 
-func v4ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
+func v4ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err os.Error) {
        p = p.To4();
        if p == nil || port < 0 || port > 0xFFFF {
                return nil, os.EINVAL
@@ -27,7 +27,7 @@ func v4ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
        return (*syscall.Sockaddr)(unsafe.Pointer(sa)), nil
 }
 
-func v6ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
+func v6ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err os.Error) {
        p = p.To16();
        if p == nil || port < 0 || port > 0xFFFF {
                return nil, os.EINVAL
@@ -44,7 +44,7 @@ func v6ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
 }
 
 
-func sockaddrToIP(sa1 *syscall.Sockaddr) (p IP, port int, err *os.Error) {
+func sockaddrToIP(sa1 *syscall.Sockaddr) (p IP, port int, err os.Error) {
        switch sa1.Family {
        case syscall.AF_INET:
                sa := (*syscall.SockaddrInet4)(unsafe.Pointer(sa1));
index ddc13d3472cd0b50c0b4e3f7f405c43972bb5b04..b6bfe7646c16d2014fcfd39ca93ee26f4d1f1293 100644 (file)
@@ -11,7 +11,7 @@ import (
        "unsafe";
 )
 
-func v4ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
+func v4ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err os.Error) {
        p = p.To4();
        if p == nil || port < 0 || port > 0xFFFF {
                return nil, os.EINVAL
@@ -26,7 +26,7 @@ func v4ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
        return (*syscall.Sockaddr)(unsafe.Pointer(sa)), nil
 }
 
-func v6ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
+func v6ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err os.Error) {
        p = p.To16();
        if p == nil || port < 0 || port > 0xFFFF {
                return nil, os.EINVAL
@@ -49,7 +49,7 @@ func v6ToSockaddr(p IP, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
        return (*syscall.Sockaddr)(unsafe.Pointer(sa)), nil
 }
 
-func sockaddrToIP(sa1 *syscall.Sockaddr) (p IP, port int, err *os.Error) {
+func sockaddrToIP(sa1 *syscall.Sockaddr) (p IP, port int, err os.Error) {
        switch sa1.Family {
        case syscall.AF_INET:
                sa := (*syscall.SockaddrInet4)(unsafe.Pointer(sa1));
index 194f412908e3b137ec64d2e356ab761f55a18774..72aeff072b9246046f5e4d1e6cdb8b0af9040735 100644 (file)
@@ -55,7 +55,7 @@ func (f *file) readLine() (s string, ok bool) {
        return
 }
 
-func open(name string) (*file, *os.Error) {
+func open(name string) (*file, os.Error) {
        fd, err := os.Open(name, os.O_RDONLY, 0);
        if err != nil {
                return nil, err;
index cc7f39914872e7f915d6203a55896d1519c8d00a..073af658a406f081cfe97033f6b54003af6f4423 100644 (file)
@@ -19,7 +19,7 @@ import (
 var ErrNoService = os.NewError("unknown network service");
 
 var services map[string] map[string] int
-var servicesError *os.Error
+var servicesError os.Error
 
 func readServices() {
        services = make(map[string] map[string] int);
@@ -55,7 +55,7 @@ func readServices() {
 }
 
 // LookupPort looks up the port for the given network and service.
-func LookupPort(network, service string) (port int, err *os.Error) {
+func LookupPort(network, service string) (port int, err os.Error) {
        once.Do(readServices);
 
        switch network {
index 51f17c015c8ec3e35e022a94fa90088326832fff..681a710d1b9cc752541195a2efa9f38688951405 100644 (file)
@@ -15,7 +15,7 @@ const (
 )
 
 // Negative count means read until EOF.
-func readdirnames(file *File, count int) (names []string, err *os.Error) {
+func readdirnames(file *File, count int) (names []string, err Error) {
        // If this file has no dirinfo, create one.
        if file.dirinfo == nil {
                file.dirinfo = new(dirInfo);
@@ -36,7 +36,7 @@ func readdirnames(file *File, count int) (names []string, err *os.Error) {
                        // Final argument is (basep *int64) and the syscall doesn't take nil.
                        d.nbuf, errno = syscall.Getdirentries(file.fd, &d.buf[0], int64(len(d.buf)), new(int64));
                        if d.nbuf < 0 {
-                               return names, os.ErrnoToError(errno)
+                               return names, ErrnoToError(errno)
                        }
                        if d.nbuf == 0 {
                                break   // EOF
index 582e4f632d6ce92710f937a12518a6db5bebc802..67eae30ff3f191e9dbc08cfc795e44ee3a60122c 100644 (file)
@@ -24,7 +24,7 @@ func clen(n []byte) int {
 }
 
 // Negative count means read until EOF.
-func readdirnames(file *File, count int) (names []string, err *os.Error) {
+func readdirnames(file *File, count int) (names []string, err Error) {
        // If this file has no dirinfo, create one.
        if file.dirinfo == nil {
                file.dirinfo = new(dirInfo);
@@ -45,7 +45,7 @@ func readdirnames(file *File, count int) (names []string, err *os.Error) {
                        dbuf := (*syscall.Dirent)(unsafe.Pointer(&d.buf[0]));
                        d.nbuf, errno = syscall.Getdents(file.fd, dbuf, int64(len(d.buf)));
                        if d.nbuf < 0 {
-                               return names, os.ErrnoToError(errno)
+                               return names, ErrnoToError(errno)
                        }
                        if d.nbuf == 0 {
                                break   // EOF
index 69af22382fd3623f914ce13131e70c0081f05adc..e7df309e03dbfe4390ccfb5c62ec2574efbf0155 100644 (file)
@@ -31,7 +31,7 @@ func copyenv() {
 
 // Getenv retrieves the value of the environment variable named by the key.
 // It returns the value and an error, if any.
-func Getenv(key string) (value string, err *Error) {
+func Getenv(key string) (value string, err Error) {
        once.Do(copyenv);
 
        if len(key) == 0 {
@@ -46,7 +46,7 @@ func Getenv(key string) (value string, err *Error) {
 
 // Setenv sets the value of the environment variable named by the key.
 // It returns an Error, if any.
-func Setenv(key, value string) *Error {
+func Setenv(key, value string) Error {
        once.Do(copyenv);
 
        if len(key) == 0 {
index 18d010ce0a08bfcea1265decfeabb99d3746cc06..69565d6a5865b1587c6825cf253b8c0e59f6a705 100644 (file)
@@ -6,31 +6,43 @@ package os
 
 import syscall "syscall"
 
-// Error is a structure wrapping a string describing an error.
+// An Error can represent any printable error condition.
+type Error interface {
+       String() string
+}
+
+// A helper type that can be embedded or wrapped to simplify satisfying
+// Error.
+type ErrorString string
+func (e *ErrorString) String() string {
+       return *e
+}
+
+// _Error is a structure wrapping a string describing an error.
 // Errors are singleton structures, created by NewError, so their addresses can
 // be compared to test for equality. A nil Error pointer means ``no error''.
 // Use the String() method to get the contents; it handles the nil case.
 // The Error type is intended for use by any package that wishes to define
 // error strings.
-type Error struct {
+type _Error struct {
        s string
 }
 
 // Indexed by errno.
 // If we worry about syscall speed (only relevant on failure), we could
 // make it an array, but it's probably not important.
-var errorTab = make(map[int64] *Error);
+var errorTab = make(map[int64] Error);
 
 // Table of all known errors in system.  Use the same error string twice,
-// get the same *os.Error.
-var errorStringTab = make(map[string] *Error);
+// get the same *os._Error.
+var errorStringTab = make(map[string] Error);
 
 // These functions contain a race if two goroutines add identical
 // errors simultaneously but the consequences are unimportant.
 
 // NewError allocates an Error object, but if s has been seen before,
-// shares the Error associated with that message.
-func NewError(s string) *Error {
+// shares the _Error associated with that message.
+func NewError(s string) Error {
        if s == "" {
                return nil
        }
@@ -38,14 +50,14 @@ func NewError(s string) *Error {
        if ok {
                return err
        }
-       err = &Error{s};
+       err = &_Error{s};
        errorStringTab[s] = err;
        return err;
 }
 
-// ErrnoToError calls NewError to create an Error object for the string
+// ErrnoToError calls NewError to create an _Error object for the string
 // associated with Unix error code errno.
-func ErrnoToError(errno int64) *Error {
+func ErrnoToError(errno int64) Error {
        if errno == 0 {
                return nil
        }
@@ -61,6 +73,11 @@ func ErrnoToError(errno int64) *Error {
 
 // Commonly known Unix errors.
 var (
+       // TODO(r):
+       // 1. these become type ENONE struct { ErrorString }
+       // 2. create private instances of each type: var eNONE ENONE(ErrnoToString(syscall.ENONE));
+       // 3. put them in a table
+       // 4. ErrnoToError uses the table. its error case ECATCHALL("%d")
        ENONE = ErrnoToError(syscall.ENONE);
        EPERM = ErrnoToError(syscall.EPERM);
        ENOENT = ErrnoToError(syscall.ENOENT);
@@ -99,10 +116,10 @@ var (
        EAGAIN = ErrnoToError(syscall.EAGAIN);
 )
 
-// String returns the string associated with the Error.
-func (e *Error) String() string {
+// String returns the string associated with the _Error.
+func (e *_Error) String() string {
        if e == nil {
-               return "No Error"
+               return "No _Error"
        }
        return e.s
 }
index f987f7aa1f903ec7d76e1c7b9815476f6bbd2e90..6c0b35578583705d24fb596d6a364163000aa8d3 100644 (file)
@@ -16,7 +16,7 @@ import (
 // descriptor 0 (standard input), fd[1] descriptor 1, and so on.  A nil entry
 // will cause the child to have no open file descriptor with that index.
 func ForkExec(argv0 string, argv []string, envv []string, fd []*File)
-       (pid int, err *Error)
+       (pid int, err Error)
 {
        // Create array of integer (system) fds.
        intfd := make([]int64, len(fd));
@@ -36,7 +36,7 @@ func ForkExec(argv0 string, argv []string, envv []string, fd []*File)
 // named by argv0, with arguments argv and environment envv.
 // If successful, Exec never returns.  If it fails, it returns an Error.
 // ForkExec is almost always a better way to execute a program.
-func Exec(argv0 string, argv []string, envv []string) *Error {
+func Exec(argv0 string, argv []string, envv []string) Error {
        if envv == nil {
                envv = Environ();
        }
@@ -69,7 +69,7 @@ const (
 // Wait waits for process pid to exit or stop, and then returns a
 // Waitmsg describing its status and an Error, if any. The options
 // (WNOHANG etc.) affect the behavior of the Wait call.
-func Wait(pid int, options uint64) (w *Waitmsg, err *Error) {
+func Wait(pid int, options uint64) (w *Waitmsg, err Error) {
        var status syscall.WaitStatus;
        var rusage *syscall.Rusage;
        if options & WRUSAGE != 0 {
index fa066eb7120699784e4f682e7e440c07c26664d1..d7ea573fc55dae06e39691a86787957421386ae4 100644 (file)
@@ -70,7 +70,7 @@ const (
 // Open opens the named file with specified flag (O_RDONLY etc.) and perm, (0666 etc.)
 // if applicable.  If successful, methods on the returned File can be used for I/O.
 // It returns the File and an Error, if any.
-func Open(name string, flag int, perm int) (file *File, err *Error) {
+func Open(name string, flag int, perm int) (file *File, err Error) {
        r, e := syscall.Open(name, int64(flag | syscall.O_CLOEXEC), int64(perm));
        if e != 0 {
                return nil, ErrnoToError(e);
@@ -87,7 +87,7 @@ func Open(name string, flag int, perm int) (file *File, err *Error) {
 
 // Close closes the File, rendering it unusable for I/O.
 // It returns an Error, if any.
-func (file *File) Close() *Error {
+func (file *File) Close() Error {
        if file == nil {
                return EINVAL
        }
@@ -100,7 +100,7 @@ func (file *File) Close() *Error {
 // It returns the number of bytes read and an Error, if any.
 // EOF is signaled by a zero count with a nil Error.
 // TODO(r): Add Pread, Pwrite (maybe ReadAt, WriteAt).
-func (file *File) Read(b []byte) (ret int, err *Error) {
+func (file *File) Read(b []byte) (ret int, err Error) {
        if file == nil {
                return 0, EINVAL
        }
@@ -117,7 +117,7 @@ func (file *File) Read(b []byte) (ret int, err *Error) {
 // Write writes len(b) bytes to the File.
 // It returns the number of bytes written and an Error, if any.
 // If the byte count differs from len(b), it usually implies an error occurred.
-func (file *File) Write(b []byte) (ret int, err *Error) {
+func (file *File) Write(b []byte) (ret int, err Error) {
        if file == nil {
                return 0, EINVAL
        }
@@ -135,7 +135,7 @@ func (file *File) Write(b []byte) (ret int, err *Error) {
 // according to whence: 0 means relative to the origin of the file, 1 means
 // relative to the current offset, and 2 means relative to the end.
 // It returns the new offset and an Error, if any.
-func (file *File) Seek(offset int64, whence int) (ret int64, err *Error) {
+func (file *File) Seek(offset int64, whence int) (ret int64, err Error) {
        r, e := syscall.Seek(file.fd, offset, int64(whence));
        if e != 0 {
                return -1, ErrnoToError(e)
@@ -148,7 +148,7 @@ func (file *File) Seek(offset int64, whence int) (ret int64, err *Error) {
 
 // WriteString is like Write, but writes the contents of string s rather than
 // an array of bytes.
-func (file *File) WriteString(s string) (ret int, err *Error) {
+func (file *File) WriteString(s string) (ret int, err Error) {
        if file == nil {
                return 0, EINVAL
        }
@@ -161,7 +161,7 @@ func (file *File) WriteString(s string) (ret int, err *Error) {
 
 // Pipe returns a connected pair of Files; reads from r return bytes written to w.
 // It returns the files and an Error, if any.
-func Pipe() (r *File, w *File, err *Error) {
+func Pipe() (r *File, w *File, err Error) {
        var p [2]int64;
 
        // See ../syscall/exec.go for description of lock.
@@ -180,7 +180,7 @@ func Pipe() (r *File, w *File, err *Error) {
 
 // Mkdir creates a new directory with the specified name and permission bits.
 // It returns an error, if any.
-func Mkdir(name string, perm int) *Error {
+func Mkdir(name string, perm int) Error {
        r, e := syscall.Mkdir(name, int64(perm));
        return ErrnoToError(e)
 }
@@ -189,7 +189,7 @@ func Mkdir(name string, perm int) *Error {
 // is a symbolic link, it returns information about the file the link
 // references.
 // It returns the Dir and an error, if any.
-func Stat(name string) (dir *Dir, err *Error) {
+func Stat(name string) (dir *Dir, err Error) {
        stat := new(syscall.Stat_t);
        r, e := syscall.Stat(name, stat);
        if e != 0 {
@@ -200,7 +200,7 @@ func Stat(name string) (dir *Dir, err *Error) {
 
 // Stat returns the Dir structure describing file.
 // It returns the Dir and an error, if any.
-func (file *File) Stat() (dir *Dir, err *Error) {
+func (file *File) Stat() (dir *Dir, err Error) {
        stat := new(syscall.Stat_t);
        r, e := syscall.Fstat(file.fd, stat);
        if e != 0 {
@@ -212,7 +212,7 @@ func (file *File) Stat() (dir *Dir, err *Error) {
 // Lstat returns the Dir structure describing the named file. If the file
 // is a symbolic link, it returns information about the link itself.
 // It returns the Dir and an error, if any.
-func Lstat(name string) (dir *Dir, err *Error) {
+func Lstat(name string) (dir *Dir, err Error) {
        stat := new(syscall.Stat_t);
        r, e := syscall.Lstat(name, stat);
        if e != 0 {
@@ -223,14 +223,14 @@ func Lstat(name string) (dir *Dir, err *Error) {
 
 // Readdirnames has a non-portable implemenation so its code is separated into an
 // operating-system-dependent file.
-func readdirnames(file *File, count int) (names []string, err *os.Error)
+func readdirnames(file *File, count int) (names []string, err Error)
 
 // Readdirnames reads the contents of the directory associated with file and
 // returns an array of up to count names, in directory order.  Subsequent
 // calls on the same file will yield further names.
 // A negative count means to read until EOF.
 // It returns the array and an Error, if any.
-func (file *File) Readdirnames(count int) (names []string, err *os.Error) {
+func (file *File) Readdirnames(count int) (names []string, err Error) {
        return readdirnames(file, count);
 }
 
@@ -239,7 +239,7 @@ func (file *File) Readdirnames(count int) (names []string, err *os.Error) {
 // calls on the same file will yield further Dirs.
 // A negative count means to read until EOF.
 // It returns the array and an Error, if any.
-func (file *File) Readdir(count int) (dirs []Dir, err *os.Error) {
+func (file *File) Readdir(count int) (dirs []Dir, err Error) {
        dirname := file.name;
        if dirname == "" {
                dirname = ".";
@@ -262,13 +262,13 @@ func (file *File) Readdir(count int) (dirs []Dir, err *os.Error) {
 }
 
 // Chdir changes the current working directory to the named directory.
-func Chdir(dir string) *os.Error {
+func Chdir(dir string) Error {
        r, e := syscall.Chdir(dir);
        return ErrnoToError(e);
 }
 
 // Remove removes the named file or directory.
-func Remove(name string) *os.Error {
+func Remove(name string) Error {
        // System call interface forces us to know
        // whether name is a file or directory.
        // Try both: it is cheaper on average than
index 9847d80bbfe0608654957c8665b4346c66abc511..7e268a0c7f273d536d95be11e43579a600f37dcb 100644 (file)
@@ -14,7 +14,7 @@ import (
 // fractional nanoseconds, plus an Error if any. The current
 // time is thus 1e9*sec+nsec, in nanoseconds.  The zero of
 // time is the Unix epoch.
-func Time() (sec int64, nsec int64, err *Error) {
+func Time() (sec int64, nsec int64, err Error) {
        var errno int64;
        sec, nsec, errno = syscall.Gettimeofday();
        if errno != 0 {
index 1a5285eb73d7337d28dc76516885008a024cc359..a9f275893ad95054a9f81799d43474479f80fc7d 100644 (file)
@@ -32,7 +32,7 @@ var good_re = []string{
 // TODO: nice to do this with a map
 type stringError struct {
        re      string;
-       err     *os.Error;
+       err     os.Error;
 }
 var bad_re = []stringError{
        stringError{ `*`,               regexp.ErrBareClosure },
@@ -85,7 +85,7 @@ var matches = []tester {
        tester{ `a*(|(b))c*`,   "aacc", vec{0,4, 2,2, -1,-1} },
 }
 
-func compileTest(t *testing.T, expr string, error *os.Error) *regexp.Regexp {
+func compileTest(t *testing.T, expr string, error os.Error) *regexp.Regexp {
        re, err := regexp.Compile(expr);
        if err != error {
                t.Error("compiling `", expr, "`; unexpected error: ", err.String());
index 3ec3ff83acdc02a6e6cdbe7f7fda8b181f7f3b33..135dcc368a98163af5ce157db26a75f14afbc4d6 100644 (file)
@@ -70,7 +70,7 @@ func (c *common) setIndex(i int) { c._index = i }
 type Regexp struct {
        expr    string; // the original expression
        ch      chan<- *Regexp; // reply channel when we're done
-       error   *os.Error;      // compile- or run-time error; nil if OK
+       error   os.Error;       // compile- or run-time error; nil if OK
        inst    *vector.Vector;
        start   instr;
        nbra    int;    // number of brackets in expression, for subexpressions
@@ -233,7 +233,7 @@ func (nop *_Nop) kind() int { return _NOP }
 func (nop *_Nop) print() { print("nop") }
 
 // report error and exit compiling/executing goroutine
-func (re *Regexp) setError(err *os.Error) {
+func (re *Regexp) setError(err os.Error) {
        re.error = err;
        re.ch <- re;
        sys.Goexit();
@@ -586,7 +586,7 @@ func compiler(str string, ch chan *Regexp) {
 
 // Compile parses a regular expression and returns, if successful, a Regexp
 // object that can be used to match against text.
-func Compile(str string) (regexp *Regexp, error *os.Error) {
+func Compile(str string) (regexp *Regexp, error os.Error) {
        // Compile in a separate goroutine and wait for the result.
        ch := make(chan *Regexp);
        go compiler(str, ch);
@@ -754,7 +754,7 @@ func (re *Regexp) MatchStrings(s string) (a []string) {
 // Match checks whether a textual regular expression
 // matches a substring.  More complicated queries need
 // to use Compile and the full Regexp interface.
-func Match(pattern string, s string) (matched bool, error *os.Error) {
+func Match(pattern string, s string) (matched bool, error os.Error) {
        re, err := Compile(pattern);
        if err != nil {
                return false, err
index ec94b7c741b7e9cba9eb5f6837909f469b1037de..c257b2a33e615bda52001dbb7143a08ad6317ae5 100644 (file)
@@ -321,7 +321,7 @@ func decimalAtof32(neg bool, d *decimal, trunc bool) (f float32, ok bool) {
 // If s is syntactically well-formed but is more than 1/2 ULP
 // away from the largest floating point number of the given size,
 // Atof32 returns f = Â±Inf, err = os.ERANGE.
-func Atof32(s string) (f float32, err *os.Error) {
+func Atof32(s string) (f float32, err os.Error) {
        neg, d, trunc, ok := stringToDecimal(s);
        if !ok {
                return 0, os.EINVAL;
@@ -342,7 +342,7 @@ func Atof32(s string) (f float32, err *os.Error) {
 // Atof64 converts the string s to a 64-bit floating-point number.
 // Except for the type of its result, its definition is the same as that
 // of Atof32.
-func Atof64(s string) (f float64, err *os.Error) {
+func Atof64(s string) (f float64, err os.Error) {
        neg, d, trunc, ok := stringToDecimal(s);
        if !ok {
                return 0, os.EINVAL;
@@ -361,7 +361,7 @@ func Atof64(s string) (f float64, err *os.Error) {
 }
 
 // Atof is like Atof32 or Atof64, depending on the size of float.
-func Atof(s string) (f float, err *os.Error) {
+func Atof(s string) (f float, err os.Error) {
        if FloatSize == 32 {
                f1, err1 := Atof32(s);
                return float(f1), err1;
index 7f1f0a13123fa00493da90f63d9aeff859d026ae..6782f274a2700c4cb1e83a67f94dabfe21a22490 100644 (file)
@@ -13,7 +13,7 @@ import (
 type atofTest struct {
        in string;
        out string;
-       err *os.Error;
+       err os.Error;
 }
 
 var atoftests = []atofTest {
index 467c37737c27cd746ca6ef6bd1ffacac37f9875d..a5d896a05eb1561a5bcc7a30a717d10f5e8522b3 100644 (file)
@@ -29,7 +29,7 @@ func cutoff64(base int) uint64 {
 // range or s is empty or contains invalid digits.
 // It returns err == os.ERANGE if the value corresponding
 // to s cannot be represented by a uint64.
-func Btoui64(s string, b int) (n uint64, err *os.Error) {
+func Btoui64(s string, b int) (n uint64, err os.Error) {
        if b < 2 || b > 36 || len(s) < 1 {
                return 0, os.EINVAL;
        }
@@ -77,7 +77,7 @@ func Btoui64(s string, b int) (n uint64, err *os.Error) {
 //
 // Atoui64 returns err == os.EINVAL if s is empty or contains invalid digits.
 // It returns err == os.ERANGE if s cannot be represented by a uint64.
-func Atoui64(s string) (n uint64, err *os.Error) {
+func Atoui64(s string) (n uint64, err os.Error) {
        // Empty string bad.
        if len(s) == 0 {
                return 0, os.EINVAL
@@ -99,7 +99,7 @@ func Atoui64(s string) (n uint64, err *os.Error) {
 
 // Atoi64 is like Atoui64 but allows signed numbers and
 // returns its result in an int64.
-func Atoi64(s string) (i int64, err *os.Error) {
+func Atoi64(s string) (i int64, err os.Error) {
        // Empty string bad.
        if len(s) == 0 {
                return 0, os.EINVAL
@@ -134,7 +134,7 @@ func Atoi64(s string) (i int64, err *os.Error) {
 }
 
 // Atoui is like Atoui64 but returns its result as a uint.
-func Atoui(s string) (i uint, err *os.Error) {
+func Atoui(s string) (i uint, err os.Error) {
        i1, e1 := Atoui64(s);
        if e1 != nil && e1 != os.ERANGE {
                return 0, e1
@@ -149,7 +149,7 @@ func Atoui(s string) (i uint, err *os.Error) {
 }
 
 // Atoi is like Atoi64 but returns its result as an int.
-func Atoi(s string) (i int, err *os.Error) {
+func Atoi(s string) (i int, err os.Error) {
        i1, e1 := Atoi64(s);
        if e1 != nil && e1 != os.ERANGE {
                return 0, e1
index 3940ebc782ab1ab45375b652f8a83c54545d35b6..e4a9f955d99c13cd293c147c475e97ec8fc6b77e 100644 (file)
@@ -14,7 +14,7 @@ import (
 type atoui64Test struct {
        in string;
        out uint64;
-       err *os.Error;
+       err os.Error;
 }
 
 var atoui64tests = []atoui64Test {
@@ -41,7 +41,7 @@ var atoui64tests = []atoui64Test {
 type atoi64Test struct {
        in string;
        out int64;
-       err *os.Error;
+       err os.Error;
 }
 
 var atoi64test = []atoi64Test {
@@ -71,7 +71,7 @@ var atoi64test = []atoi64Test {
 type atoui32Test struct {
        in string;
        out uint32;
-       err *os.Error;
+       err os.Error;
 }
 
 var atoui32tests = []atoui32Test {
@@ -91,7 +91,7 @@ var atoui32tests = []atoui32Test {
 type atoi32Test struct {
        in string;
        out int32;
-       err *os.Error;
+       err os.Error;
 }
 
 var atoi32tests = []atoi32Test {
index c06204013b9083984e504399cfff8a4e01b345ad..4fcec9a5eab58c6f42eecab1c3062ab959cd2378 100644 (file)
@@ -97,7 +97,7 @@ func unhex(b byte) (v int, ok bool) {
        return;
 }
 
-func unquoteChar(s string, i int, q byte) (t string, ii int, err *os.Error) {
+func unquoteChar(s string, i int, q byte) (t string, ii int, err os.Error) {
        err = os.EINVAL;  // assume error for easy return
 
        // easy cases
@@ -190,7 +190,7 @@ func unquoteChar(s string, i int, q byte) (t string, ii int, err *os.Error) {
 // that s quotes.  (If s is single-quoted, it would be a Go
 // character literal; Unquote returns the corresponding
 // one-character string.)
-func Unquote(s string) (t string, err *os.Error) {
+func Unquote(s string) (t string, err os.Error) {
        err = os.EINVAL;  // assume error for easy return
        n := len(s);
        if n < 2 || s[0] != s[n-1] {
@@ -207,7 +207,7 @@ func Unquote(s string) (t string, err *os.Error) {
                t := "";
                q := s[0];
                var c string;
-               var err *os.Error;
+               var err os.Error;
                for i := 1; i < n-1; {
                        c, i, err = unquoteChar(s, i, q);
                        if err != nil {
index b15d4de18ded8a874ad9dafb3abc92d18b00500a..9a5c37c321823d81e3be5fc1c4bb6663e3a5ac77 100644 (file)
@@ -222,7 +222,7 @@ func (b *Writer) dump() {
 }
 
 
-func (b *Writer) write0(buf []byte) *os.Error {
+func (b *Writer) write0(buf []byte) os.Error {
        n, err := b.output.Write(buf);
        if n != len(buf) && err == nil {
                err = os.EIO;
@@ -233,7 +233,7 @@ func (b *Writer) write0(buf []byte) *os.Error {
 
 var newline = []byte{'\n'}
 
-func (b *Writer) writePadding(textw, cellw int) (err *os.Error) {
+func (b *Writer) writePadding(textw, cellw int) (err os.Error) {
        if b.padbytes[0] == '\t' {
                // make cell width a multiple of cellwidth
                cellw = ((cellw + b.cellwidth - 1) / b.cellwidth) * b.cellwidth;
@@ -262,7 +262,7 @@ exit:
 }
 
 
-func (b *Writer) writeLines(pos0 int, line0, line1 int) (pos int, err *os.Error) {
+func (b *Writer) writeLines(pos0 int, line0, line1 int) (pos int, err os.Error) {
        pos = pos0;
        for i := line0; i < line1; i++ {
                line_size, line_width := b.line(i);
@@ -319,7 +319,7 @@ exit:
 }
 
 
-func (b *Writer) format(pos0 int, line0, line1 int) (pos int, err *os.Error) {
+func (b *Writer) format(pos0 int, line0, line1 int) (pos int, err os.Error) {
        pos = pos0;
        column := b.widths.Len();
        last := line0;
@@ -373,7 +373,7 @@ exit:
 // Flush should be called after the last call to Write to ensure
 // that any data buffered in the Writer is written to output.
 //
-func (b *Writer) Flush() *os.Error {
+func (b *Writer) Flush() os.Error {
        dummy, err := b.format(0, 0, b.lines_size.Len());
        // reset (even in the presence of errors)
        b.buf.clear();
@@ -411,7 +411,7 @@ func (b *Writer) append(buf []byte) {
 // The only errors returned are ones encountered
 // while writing to the underlying output stream.
 //
-func (b *Writer) Write(buf []byte) (written int, err *os.Error) {
+func (b *Writer) Write(buf []byte) (written int, err os.Error) {
        i0, n := 0, len(buf);
 
        // split text into cells
index 560eb97ae11a6238309b1dc0e0ce98f90b04d94e..b4cc610a0ad7edaefe5a4260bab2221f4b8f9562 100644 (file)
@@ -27,7 +27,7 @@ func (b *buffer) clear() {
 }
 
 
-func (b *buffer) Write(buf []byte) (written int, err *os.Error) {
+func (b *buffer) Write(buf []byte) (written int, err os.Error) {
        n := len(b.a);
        m := len(buf);
        if n + m <= cap(b.a) {
index 327d8194b83bc3ed851eaee98c460481e3513afa..36ff60937a4de791de1cedf2982c06123a543b9b 100644 (file)
@@ -66,19 +66,9 @@ import (
        "template";
 )
 
-// Errors returned during parsing and execution.
-var ErrUnmatchedRDelim = os.NewError("unmatched closing delimiter")
-var ErrUnmatchedLDelim = os.NewError("unmatched opening delimiter")
-var ErrBadDirective = os.NewError("unrecognized directive name")
-var ErrEmptyDirective = os.NewError("empty directive")
-var ErrFields = os.NewError("incorrect fields for directive")
-var ErrSyntax = os.NewError("directive out of place")
-var ErrNoEnd = os.NewError("section does not have .end")
-var ErrNoVar = os.NewError("variable name not in struct");
-var ErrBadType = os.NewError("unsupported type for variable");
-var ErrNotStruct = os.NewError("driver must be a struct")
-var ErrNoFormatter = os.NewError("unknown formatter")
-var ErrBadDelims = os.NewError("invalid delimiter strings")
+// Errors returned during parsing. TODO: different error model for execution?
+
+type ParseError struct { os.ErrorString }
 
 // All the literals are aces.
 var lbrace = []byte{ '{' }
@@ -112,15 +102,14 @@ var builtins = FormatterMap {
 // State for executing a Template
 type state struct {
        parent  *state; // parent in hierarchy
-       errorchan       chan *os.Error; // for erroring out
+       errorchan       chan os.Error;  // for erroring out
        data    reflect.Value;  // the driver data for this section etc.
        wr      io.Write;       // where to send output
 }
 
 // Report error and stop generation.
-func (st *state) error(err *os.Error, args ...) {
-       fmt.Fprintf(os.Stderr, "template: %v%s\n", err, fmt.Sprint(args));
-       st.errorchan <- err;
+func (st *state) parseError(line int, err string, args ...) {
+       st.errorchan <- ParseError{fmt.Sprintf("line %d: %s", line, fmt.Sprintf(err, args))};
        sys.Goexit();
 }
 
@@ -217,7 +206,7 @@ Loop:
                        i = j - 1;
                case equal(t.buf, i, t.rdelim):
                        if !sawLeft {
-                               st.error(ErrUnmatchedRDelim)
+                               st.parseError(*t.linenum, "unmatched closing delimiter")
                        }
                        sawLeft = false;
                        i += len(t.rdelim);
@@ -227,7 +216,7 @@ Loop:
                }
        }
        if sawLeft {
-               st.error(ErrUnmatchedLDelim)
+               st.parseError(*t.linenum, "unmatched opening delimiter")
        }
        item := t.buf[start:i];
        if special && trim_white {
@@ -281,10 +270,10 @@ func (t *Template) analyze(item []byte, st *state) (tok int, w []string) {
                return
        }
        if !equal(item, len(item)-len(t.rdelim), t.rdelim) {    // doesn't end with right delimiter
-               st.error(ErrUnmatchedLDelim)  // should not happen anyway
+               st.parseError(*t.linenum, "unmatched opening delimiter")  // should not happen anyway
        }
        if len(item) <= len(t.ldelim)+len(t.rdelim) {   // no contents
-               st.error(ErrEmptyDirective)
+               st.parseError(*t.linenum, "empty directive")
        }
        // Comment
        if item[len(t.ldelim)] == '#' {
@@ -294,10 +283,7 @@ func (t *Template) analyze(item []byte, st *state) (tok int, w []string) {
        // Split into words
        w = words(item[len(t.ldelim): len(item)-len(t.rdelim)]);  // drop final delimiter
        if len(w) == 0 {
-               st.error(ErrBadDirective)
-       }
-       if len(w[0]) == 0 {
-               st.error(ErrEmptyDirective)
+               st.parseError(*t.linenum, "empty directive")
        }
        if len(w) == 1 && w[0][0] != '.' {
                tok = Variable;
@@ -315,24 +301,24 @@ func (t *Template) analyze(item []byte, st *state) (tok int, w []string) {
                return;
        case ".section":
                if len(w) != 2 {
-                       st.error(ErrFields, ": ", string(item))
+                       st.parseError(*t.linenum, "incorrect fields for .section: %s", item)
                }
                tok = Section;
                return;
        case ".repeated":
                if len(w) != 3 || w[1] != "section" {
-                       st.error(ErrFields, ": ", string(item))
+                       st.parseError(*t.linenum, "incorrect fields for .repeated: %s", item)
                }
                tok = Repeated;
                return;
        case ".alternates":
                if len(w) != 2 || w[1] != "with" {
-                       st.error(ErrFields, ": ", string(item))
+                       st.parseError(*t.linenum, "incorrect fields for .alternates: %s", item)
                }
                tok = Alternates;
                return;
        }
-       st.error(ErrBadDirective, ": ", string(item));
+       st.parseError(*t.linenum, "bad directive: %s", item);
        return
 }
 
@@ -375,18 +361,19 @@ func empty(v reflect.Value, indirect_ok bool) bool {
 // Execute a ".repeated" section
 func (t *Template) executeRepeated(w []string, st *state) {
        if w[1] != "section" {
-               st.error(ErrSyntax, `: .repeated must have "section"`)
+               st.parseError(*t.linenum, `.repeated must have "section"`)
        }
 
        // Find driver array/struct for this section.  It must be in the current struct.
        field := st.findVar(w[2]);
        if field == nil {
-               st.error(ErrNoVar, ": .repeated ", w[2], " in ", reflect.Indirect(st.data).Type());
+               st.parseError(*t.linenum, ".repeated: cannot find %s in %s", w[2], reflect.Indirect(st.data).Type());
        }
+       field = reflect.Indirect(field);
 
        // Must be an array/slice
        if field != nil && field.Kind() != reflect.ArrayKind {
-               st.error(ErrBadType, " in .repeated: ", w[2], " ", field.Type().String());
+               st.parseError(*t.linenum, ".repeated: %s has bad type %s", w[2], field.Type());
        }
        // Scan repeated section, remembering slice of text we must execute.
        nesting := 0;
@@ -396,7 +383,7 @@ Loop:
        for {
                item := t.nextItem(st);
                if len(item) ==  0 {
-                       st.error(ErrNoEnd)
+                       st.parseError(*t.linenum, "missing .end")
                }
                tok, s := t.analyze(item, st);
                switch tok {
@@ -430,7 +417,7 @@ func (t *Template) executeSection(w []string, st *state) {
        // Find driver data for this section.  It must be in the current struct.
        field := st.findVar(w[1]);
        if field == nil {
-               st.error(ErrNoVar, ": .section ", w[1], " in ", reflect.Indirect(st.data).Type());
+               st.parseError(*t.linenum, ".section: cannot find %s in %s", w[1], reflect.Indirect(st.data).Type());
        }
        // Scan section, remembering slice of text we must execute.
        orFound := false;
@@ -442,7 +429,7 @@ Loop:
        for {
                item := t.nextItem(st);
                if len(item) ==  0 {
-                       st.error(ErrNoEnd)
+                       st.parseError(*t.linenum, "missing .end")
                }
                tok, s := t.analyze(item, st);
                switch tok {
@@ -458,7 +445,7 @@ Loop:
                                break
                        }
                        if orFound {
-                               st.error(ErrSyntax, ": .or");
+                               st.parseError(*t.linenum, "unexpected .or");
                        }
                        orFound = true;
                        if !accumulate {
@@ -491,7 +478,7 @@ func (t *Template) varValue(name string, st *state) reflect.Value {
        field := st.findVar(name);
        if field == nil {
                if st.parent == nil {
-                       st.error(ErrNoVar, ": ", name)
+                       st.parseError(*t.linenum, "name not found: %s", name)
                }
                return t.varValue(name, st.parent);
        }
@@ -521,7 +508,7 @@ func (t *Template) writeVariable(st *state, name_formatter string) {
                fn(st.wr, val, formatter);
                return;
        }
-       st.error(ErrNoFormatter, ": ", formatter);
+       st.parseError(*t.linenum, "unknown formatter: %s", formatter);
        panic("notreached");
 }
 
@@ -553,7 +540,7 @@ func (t *Template) execute(st *state) {
                case Variable:
                        t.writeVariable(st, w[0]);
                case Or, End, Alternates:
-                       st.error(ErrSyntax, ": ", string(item));
+                       st.parseError(*t.linenum, "unexpected %s", w[0]);
                case Section:
                        t.executeSection(w, st);
                case Repeated:
@@ -568,7 +555,7 @@ func (t *Template) doParse() {
        // stub for now
 }
 
-// A valid delimeter must contain no white space and be non-empty.
+// A valid delimiter must contain no white space and be non-empty.
 func validDelim(d []byte) bool {
        if len(d) == 0 {
                return false
@@ -581,32 +568,29 @@ func validDelim(d []byte) bool {
        return true;
 }
 
-// Parse initializes a Template by parsing its definition.  The string s contains
-// the template text.  If any errors occur, it returns the error and line number
-// in the text of the erroneous construct.
-func (t *Template) Parse(s string) (err *os.Error, eline int) {
+// Parse initializes a Template by parsing its definition.  The string
+// s contains the template text.  If any errors occur, Parse returns
+// the error.
+func (t *Template) Parse(s string) (err os.Error) {
        if !validDelim(t.ldelim) || !validDelim(t.rdelim) {
-               return ErrBadDelims, 0
+               return ParseError{fmt.Sprintf("bad delimiter strings %q %q", t.ldelim, t.rdelim)}
        }
        t.init(io.StringBytes(s));
-       ch := make(chan *os.Error);
+       ch := make(chan os.Error);
        go func() {
                t.doParse();
                ch <- nil;      // clean return;
        }();
        err = <-ch;
-       if err != nil {
-               return err, *t.linenum
-       }
        return
 }
 
 // Execute executes a parsed template on the specified data object,
 // generating output to wr.
-func (t *Template) Execute(data interface{}, wr io.Write) *os.Error {
+func (t *Template) Execute(data interface{}, wr io.Write) os.Error {
        // Extract the driver data.
        val := reflect.NewValue(data);
-       ch := make(chan *os.Error);
+       ch := make(chan os.Error);
        go func() {
                t.p = 0;
                t.execute(&state{nil, ch, val, wr});
@@ -625,23 +609,23 @@ func New(fmap FormatterMap) *Template {
        return t;
 }
 
-// SetDelims sets the left and right delimiters for operations in the template.
-// They are validated during parsing.  They could be validated here but it's
-// better to keep the routine simple.  The delimiters are very rarely invalid
-// and Parse has the necessary error-handling interface already.
+// SetDelims sets the left and right delimiters for operations in the
+// template.  They are validated during parsing.  They could be
+// validated here but it's better to keep the routine simple.  The
+// delimiters are very rarely invalid and Parse has the necessary
+// error-handling interface already.
 func (t *Template) SetDelims(left, right string) {
        t.ldelim = io.StringBytes(left);
        t.rdelim = io.StringBytes(right);
 }
 
 // Parse creates a Template with default parameters (such as {} for
-// metacharacters).  The string s contains the template text while the
-// formatter map fmap, which may be nil, defines auxiliary functions
+// metacharacters).  The string s contains the template text while
+// the formatter map fmap, which may be nil, defines auxiliary functions
 // for formatting variables.  The template is returned. If any errors
-// occur, err will be non-nil and eline will be  the line number in the
-// text of the erroneous construct.
-func Parse(s string, fmap FormatterMap) (t *Template, err *os.Error, eline int) {
+// occur, err will be non-nil.
+func Parse(s string, fmap FormatterMap) (t *Template, err os.Error) {
        t = New(fmap);
-       err, eline = t.Parse(s);
+       err = t.Parse(s);
        return
 }
index aab0c9cc6e0a3c55e33c04dd8918d27f91ef57de..cec7f0941d006bcdec1fba81d15c09b3f4f1cf0f 100644 (file)
@@ -194,9 +194,9 @@ func TestAll(t *testing.T) {
        var buf io.ByteBuffer;
        for i, test := range tests {
                buf.Reset();
-               tmpl, err, line := Parse(test.in, formatters);
+               tmpl, err := Parse(test.in, formatters);
                if err != nil {
-                       t.Error("unexpected parse error:", err, "line", line);
+                       t.Error("unexpected parse error:", err);
                        continue;
                }
                err = tmpl.Execute(s, &buf);
@@ -210,7 +210,7 @@ func TestAll(t *testing.T) {
 }
 
 func TestStringDriverType(t *testing.T) {
-       tmpl, err, line := Parse("template: {@}", nil);
+       tmpl, err := Parse("template: {@}", nil);
        if err != nil {
                t.Error("unexpected parse error:", err)
        }
@@ -226,7 +226,7 @@ func TestStringDriverType(t *testing.T) {
 }
 
 func TestTwice(t *testing.T) {
-       tmpl, err, line := Parse("template: {@}", nil);
+       tmpl, err := Parse("template: {@}", nil);
        if err != nil {
                t.Error("unexpected parse error:", err)
        }
@@ -265,7 +265,7 @@ func TestCustomDelims(t *testing.T) {
                                ldelim + "@" + rdelim +
                                ldelim + ".meta-left" + rdelim +
                                ldelim + ".meta-right" + rdelim;
-                       err, line := tmpl.Parse(text);
+                       err := tmpl.Parse(text);
                        if err != nil {
                                if i == 0 || j == 0 {   // expected
                                        continue
index 8451c6d80171e850fcebb9129abe6debdf984250..f1f0d11ae17857010c7bb2357c80c184bdd9825d 100644 (file)
@@ -12,7 +12,7 @@ import (
 
 // Sleep pauses the current goroutine for ns nanoseconds.
 // It returns os.EINTR if interrupted.
-func Sleep(ns int64) *os.Error {
+func Sleep(ns int64) os.Error {
        var tv syscall.Timeval;
        syscall.Nstotimeval(ns, &tv);
        r1, r2, err := syscall.Syscall6(syscall.SYS_SELECT, 0, 0, 0, 0,
index 8790f0ecd11161ddb021a622a2bc9b41b36d7ddf..0eda397c69d05a61bda511aaa6fadba2f99ac4af 100644 (file)
@@ -88,7 +88,7 @@ type zonetime struct {
        isstd, isutc bool;      // ignored - no idea what these mean
 }
 
-func parseinfo(bytes []byte) (zt []zonetime, err *os.Error) {
+func parseinfo(bytes []byte) (zt []zonetime, err os.Error) {
        d := data{bytes, false};
 
        // 4-byte magic "TZif"
@@ -203,7 +203,7 @@ func parseinfo(bytes []byte) (zt []zonetime, err *os.Error) {
        return zt, nil
 }
 
-func readfile(name string, max int) (p []byte, err *os.Error) {
+func readfile(name string, max int) (p []byte, err os.Error) {
        f, e := os.Open(name, os.O_RDONLY, 0);
        if e != nil {
                return nil, e;
@@ -220,7 +220,7 @@ func readfile(name string, max int) (p []byte, err *os.Error) {
        return p[0:n], nil;
 }
 
-func readinfofile(name string) (tx []zonetime, err *os.Error) {
+func readinfofile(name string) (tx []zonetime, err os.Error) {
        buf, e := readfile(name, maxFileSize);
        if e != nil {
                return nil, e
@@ -230,7 +230,7 @@ func readinfofile(name string) (tx []zonetime, err *os.Error) {
 }
 
 var zones []zonetime
-var zoneerr *os.Error
+var zoneerr os.Error
 
 func setupZone() {
        // consult $TZ to find the time zone to use.
@@ -252,7 +252,7 @@ func setupZone() {
        }
 }
 
-func lookupTimezone(sec int64) (zone string, offset int, err *os.Error) {
+func lookupTimezone(sec int64) (zone string, offset int, err os.Error) {
        once.Do(setupZone);
        if zoneerr != nil || len(zones) == 0 {
                return "UTC", 0, zoneerr
index 3b4277878b55a2475970419dcd851413176c6db5..bd944337e98bf460372500e60c24820dfe77b336 100644 (file)
@@ -175,26 +175,26 @@ type Builder interface {
        //      <name attr.name=attr.value attr1.name=attr1.value ... />
        // xmlns and xmlns:foo attributes are handled internally
        // and not passed through to StartElement.
-       StartElement(name Name, attr []Attr) *os.Error;
+       StartElement(name Name, attr []Attr) os.Error;
 
        // Called when an element ends.
        //      </name>
        //      <name ... />
-       EndElement(name Name) *os.Error;
+       EndElement(name Name) os.Error;
 
        // Called for non-empty character data string inside element.
        // Can be called multiple times between elements.
        //      text
        //      <![CDATA[text]]>
-       Text(text []byte) *os.Error;
+       Text(text []byte) os.Error;
 
        // Called when a comment is found in the XML.
        //      <!-- text -->
-       Comment(text []byte) *os.Error;
+       Comment(text []byte) os.Error;
 
        // Called for a processing instruction
        // <?target text?>
-       ProcInst(target string, text []byte) *os.Error;
+       ProcInst(target string, text []byte) os.Error;
 }
 
 // Default builder.  Implements no-op Builder methods.
@@ -203,28 +203,28 @@ type Builder interface {
 type BaseBuilder struct {
 }
 
-func (b *BaseBuilder) StartElement(name Name, attr []Attr) *os.Error {
+func (b *BaseBuilder) StartElement(name Name, attr []Attr) os.Error {
        return nil;
 }
 
-func (b *BaseBuilder) EndElement(name Name) *os.Error {
+func (b *BaseBuilder) EndElement(name Name) os.Error {
        return nil;
 }
 
-func (b *BaseBuilder) Text(text []byte) *os.Error {
+func (b *BaseBuilder) Text(text []byte) os.Error {
        return nil;
 }
 
-func (b *BaseBuilder) Comment(text []byte) *os.Error {
+func (b *BaseBuilder) Comment(text []byte) os.Error {
        return nil;
 }
 
-func (b *BaseBuilder) ProcInst(target string, text []byte) *os.Error {
+func (b *BaseBuilder) ProcInst(target string, text []byte) os.Error {
        return nil;
 }
 
 // XML Parser.  Calls Builder methods as it parses.
-func Parse(r io.Read, b Builder) *os.Error {
+func Parse(r io.Read, b Builder) os.Error {
        return os.NewError("unimplemented");
 }
 
@@ -252,12 +252,12 @@ type Token struct {
        Attr []Attr;            // attributes (TokenStartElement)
        Target string;          // target (TokenProcessingInstruction)
        Text []byte;            // text (TokenCharData, TokenComment, etc.)
-       Err *os.Error;          // error (TokenEnd)
+       Err os.Error;           // error (TokenEnd)
 }
 
 type ChanBuilder chan Token;
 
-func (c ChanBuilder) StartElement(name Name, attr []Attr) *os.Error {
+func (c ChanBuilder) StartElement(name Name, attr []Attr) os.Error {
        var t Token;
        t.Kind = TokenStartElement;
        t.Name = name;
@@ -266,7 +266,7 @@ func (c ChanBuilder) StartElement(name Name, attr []Attr) *os.Error {
        return nil;
 }
 
-func (c ChanBuilder) EndElement(name Name) *os.Error {
+func (c ChanBuilder) EndElement(name Name) os.Error {
        var t Token;
        t.Kind = TokenEndElement;
        t.Name = name;
@@ -274,7 +274,7 @@ func (c ChanBuilder) EndElement(name Name) *os.Error {
        return nil;
 }
 
-func (c ChanBuilder) Text(text []byte) *os.Error {
+func (c ChanBuilder) Text(text []byte) os.Error {
        var t Token;
        t.Kind = TokenText;
        t.Text = text;
@@ -282,7 +282,7 @@ func (c ChanBuilder) Text(text []byte) *os.Error {
        return nil;
 }
 
-func (c ChanBuilder) Comment(text []byte) *os.Error {
+func (c ChanBuilder) Comment(text []byte) os.Error {
        var t Token;
        t.Kind = TokenComment;
        t.Text = text;
@@ -290,7 +290,7 @@ func (c ChanBuilder) Comment(text []byte) *os.Error {
        return nil;
 }
 
-func (c ChanBuilder) ProcInst(target string, text []byte) *os.Error {
+func (c ChanBuilder) ProcInst(target string, text []byte) os.Error {
        var t Token;
        t.Kind = TokenProcInst;
        t.Target = target;
index 8c7f9ad69663127361439d464a0e45993653ce2f..c1b7143566f2f50bbc7b6f3ad175081ab0b8f699 100644 (file)
@@ -21,7 +21,7 @@ func f(left, right chan int) {
 func main() {
        var n = 10000;
        if len(sys.Args) > 1 {
-               var err *os.Error;
+               var err os.Error;
                n, err = strconv.Atoi(sys.Args[1]);
                if err != nil {
                        print("bad arg\n");
index 4f32c23048980c712428d12f15357caf4a2496e0..70662e5f76cefadfa86b3b7c04bba11a0a37c59c 100644 (file)
@@ -450,7 +450,7 @@ func (P *Printer) Error(pos token.Position, tok token.Token, msg string) {
 
 // An astPrinter implements io.Write.
 // TODO this is not yet used.
-func (P *Printer) Write(p []byte) (n int, err *os.Error) {
+func (P *Printer) Write(p []byte) (n int, err os.Error) {
        // TODO
        // - no string conversion every time
        // - return proper results
index 2eb56a3d6554b9c9b0420c88d8cc30ff5eef7b1f..300081ec64cb4b14e0b9101367253db0a4181644 100644 (file)
@@ -85,7 +85,7 @@ const (
 )
 
 func init() {
-       var err *os.Error;
+       var err os.Error;
        goroot, err = os.Getenv("GOROOT");
        if err != nil {
                goroot = "/home/r/go-build/go";
@@ -118,7 +118,7 @@ func makeTabwriter(writer io.Write) *tabwriter.Writer {
 
 
 // TODO(rsc): this belongs in a library somewhere, maybe os
-func ReadFile(name string) ([]byte, *os.Error) {
+func ReadFile(name string) ([]byte, os.Error) {
        f, err := os.Open(name, os.O_RDONLY, 0);
        if err != nil {
                return nil, err;
@@ -321,9 +321,9 @@ func ReadTemplate(name string) *template.Template {
        if err != nil {
                log.Exitf("ReadFile %s: %v", name, err);
        }
-       t, err1, line := template.Parse(string(data), fmap);
+       t, err1 := template.Parse(string(data), fmap);
        if err1 != nil {
-               log.Exitf("%s:%d: %v", name, line, err);
+               log.Exitf("%s: %v", name, err);
        }
        return t;
 }
index 90b9d5ebb960311fd8153cc7a70ee85bfffdda5f..25f7a7bba85e55e219945c929f6c0b9ecc054c97 100644 (file)
@@ -19,7 +19,7 @@ var
        USER string;
 
 func init() {
-       var e *OS.Error;
+       var e OS.Error;
 
        GOARCH, e = OS.Getenv("GOARCH");
        GOOS, e = OS.Getenv("GOOS");
@@ -37,7 +37,7 @@ const (
        Obj_file_ext = ".7";
 )
 
-func readfile(filename string) ([]byte, *OS.Error) {
+func readfile(filename string) ([]byte, OS.Error) {
        f, err := OS.Open(filename, OS.O_RDONLY, 0);
        if err != nil {
                return []byte{}, err;
@@ -51,7 +51,7 @@ func readfile(filename string) ([]byte, *OS.Error) {
        return buf[0:n], err1;
 }
 
-func writefile(name, data string) *OS.Error {
+func writefile(name, data string) OS.Error {
        fd, err := OS.Open(name, OS.O_WRONLY, 0);
        if err != nil {
                return err;