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\
|
||||
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
|
||||
|
||||
|
|
|
|||
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