diff options
-rw-r--r-- | src/lib/Makefile | 12 | ||||
-rw-r--r-- | src/lib/io/Makefile | 56 | ||||
-rw-r--r-- | src/lib/io/bytebuffer.go | 90 | ||||
-rw-r--r-- | src/lib/io/io.go (renamed from src/lib/io.go) | 0 |
4 files changed, 152 insertions, 6 deletions
diff --git a/src/lib/Makefile b/src/lib/Makefile index bd65bf0db..e1054e8c9 100644 --- a/src/lib/Makefile +++ b/src/lib/Makefile @@ -11,6 +11,7 @@ DIRS=\ fmt\ hash\ http\ + io\ math\ net\ os\ @@ -25,7 +26,6 @@ FILES=\ bufio\ vector\ flag\ - io\ once\ rand\ sort\ @@ -81,19 +81,19 @@ test: test.files # TODO: dependencies - should auto-generate bignum.6: fmt.dirinstall -bufio.6: io.install os.dirinstall +bufio.6: io.dirinstall os.dirinstall flag.6: fmt.dirinstall -io.6: os.dirinstall syscall.dirinstall testing.6: flag.install fmt.dirinstall -fmt.dirinstall: io.install reflect.dirinstall strconv.dirinstall +fmt.dirinstall: io.dirinstall reflect.dirinstall strconv.dirinstall hash.dirinstall: os.dirinstall -http.dirinstall: bufio.install io.install net.dirinstall os.dirinstall strings.install +http.dirinstall: bufio.install io.dirinstall net.dirinstall os.dirinstall strings.install +io.dirinstall: os.dirinstall syscall.dirinstall net.dirinstall: once.install os.dirinstall strconv.dirinstall os.dirinstall: syscall.dirinstall regexp.dirinstall: os.dirinstall reflect.dirinstall: strconv.dirinstall strconv.dirinstall: os.dirinstall utf8.install -tabwriter.dirinstall: os.dirinstall io.install container/array.dirinstall +tabwriter.dirinstall: os.dirinstall io.dirinstall container/array.dirinstall time.dirinstall: once.install os.dirinstall diff --git a/src/lib/io/Makefile b/src/lib/io/Makefile new file mode 100644 index 000000000..39640d164 --- /dev/null +++ b/src/lib/io/Makefile @@ -0,0 +1,56 @@ +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# DO NOT EDIT. Automatically generated by gobuild. +# gobuild -m >Makefile +O=6 +GC=$(O)g +CC=$(O)c -w +AS=$(O)a +AR=$(O)ar + +default: packages + +clean: + rm -f *.$O *.a $O.out + +test: packages + gotest + +coverage: packages + gotest + 6cov -g `pwd` | grep -v '_test\.go:' + +%.$O: %.go + $(GC) $*.go + +%.$O: %.c + $(CC) $*.c + +%.$O: %.s + $(AS) $*.s + +O1=\ + io.$O\ + bytebuffer.$O\ + +io.a: a1 + +a1: $(O1) + $(AR) grc io.a io.$O bytebuffer.$O + rm -f $(O1) + +newpkg: clean + $(AR) grc io.a + +$(O1): newpkg + +nuke: clean + rm -f $(GOROOT)/pkg/io.a + +packages: io.a + +install: packages + cp io.a $(GOROOT)/pkg/io.a + diff --git a/src/lib/io/bytebuffer.go b/src/lib/io/bytebuffer.go new file mode 100644 index 000000000..903536717 --- /dev/null +++ b/src/lib/io/bytebuffer.go @@ -0,0 +1,90 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package io + +// Byte buffer for marshaling nested messages. + +import ( + "io"; + "os"; +) + +// A simple implementation of the io.Read and io.Write interfaces. +// A newly allocated ByteBuffer is ready to use. + +// TODO(r): Do better memory management. + +func bytecopy(dst *[]byte, doff int, src *[]byte, soff int, count int) { + for i := 0; i < count; i++ { + dst[doff] = src[soff]; + doff++; + soff++; + } +} + +export type ByteBuffer struct { + buf *[]byte; + off int; // Read from here + len int; // Write to here + cap int; +} + +func (b *ByteBuffer) Reset() { + b.off = 0; + b.len = 0; +} + +func (b *ByteBuffer) Write(p *[]byte) (n int, err *os.Error) { + plen := len(p); + if b.buf == nil { + b.cap = plen + 1024; + b.buf = new([]byte, b.cap); + b.len = 0; + } + if b.len + len(p) > b.cap { + b.cap = 2*(b.cap + plen); + nb := new([]byte, b.cap); + bytecopy(nb, 0, b.buf, 0, b.len); + b.buf = nb; + } + bytecopy(b.buf, b.len, p, 0, plen); + b.len += plen; + return plen, nil; +} + +func (b *ByteBuffer) Read(p *[]byte) (n int, err *os.Error) { + plen := len(p); + if b.buf == nil { + return 0, nil + } + if b.off == b.len { // empty buffer + b.Reset(); + return 0, nil + } + if plen > b.len - b.off { + plen = b.len - b.off + } + bytecopy(p, 0, b.buf, b.off, plen); + b.off += plen; + return plen, nil; +} + +func (b *ByteBuffer) Len() int { + return b.len +} + +func (b *ByteBuffer) Data() *[]byte { + return b.buf[b.off:b.len] +} + + +export func NewByteBufferFromArray(buf *[]byte) *ByteBuffer { + b := new(ByteBuffer); + b.buf = buf; + b.off = 0; + b.len = len(buf); + b.cap = len(buf); + return b; +} diff --git a/src/lib/io.go b/src/lib/io/io.go index 9ae926441..9ae926441 100644 --- a/src/lib/io.go +++ b/src/lib/io/io.go |