mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
make a (rudimentary) ByteBuffer and put it in package "io".
fix up protocol buffers to use it. R=rsc DELTA=1232 (612 added, 572 deleted, 48 changed) OCL=19964 CL=19981
This commit is contained in:
parent
a5433369aa
commit
5f9254c11a
4 changed files with 152 additions and 6 deletions
|
|
@ -11,6 +11,7 @@ DIRS=\
|
||||||
fmt\
|
fmt\
|
||||||
hash\
|
hash\
|
||||||
http\
|
http\
|
||||||
|
io\
|
||||||
math\
|
math\
|
||||||
net\
|
net\
|
||||||
os\
|
os\
|
||||||
|
|
@ -25,7 +26,6 @@ FILES=\
|
||||||
bufio\
|
bufio\
|
||||||
vector\
|
vector\
|
||||||
flag\
|
flag\
|
||||||
io\
|
|
||||||
once\
|
once\
|
||||||
rand\
|
rand\
|
||||||
sort\
|
sort\
|
||||||
|
|
@ -81,19 +81,19 @@ test: test.files
|
||||||
# TODO: dependencies - should auto-generate
|
# TODO: dependencies - should auto-generate
|
||||||
|
|
||||||
bignum.6: fmt.dirinstall
|
bignum.6: fmt.dirinstall
|
||||||
bufio.6: io.install os.dirinstall
|
bufio.6: io.dirinstall os.dirinstall
|
||||||
flag.6: fmt.dirinstall
|
flag.6: fmt.dirinstall
|
||||||
io.6: os.dirinstall syscall.dirinstall
|
|
||||||
testing.6: flag.install fmt.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
|
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
|
net.dirinstall: once.install os.dirinstall strconv.dirinstall
|
||||||
os.dirinstall: syscall.dirinstall
|
os.dirinstall: syscall.dirinstall
|
||||||
regexp.dirinstall: os.dirinstall
|
regexp.dirinstall: os.dirinstall
|
||||||
reflect.dirinstall: strconv.dirinstall
|
reflect.dirinstall: strconv.dirinstall
|
||||||
strconv.dirinstall: os.dirinstall utf8.install
|
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
|
time.dirinstall: once.install os.dirinstall
|
||||||
|
|
||||||
|
|
|
||||||
56
src/lib/io/Makefile
Normal file
56
src/lib/io/Makefile
Normal file
|
|
@ -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
|
||||||
|
|
||||||
90
src/lib/io/bytebuffer.go
Normal file
90
src/lib/io/bytebuffer.go
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue