mirror of
https://github.com/golang/go.git
synced 2025-05-14 03:44:40 +00:00
- move tabwriter into library
- added preliminary tests (more to do) - renamed type from TabWriter -> Writer - adjusted my code where necessary R=r DELTA=825 (474 added, 346 deleted, 5 changed) OCL=19744 CL=19753
This commit is contained in:
parent
67addd4e11
commit
01b44bbfc8
@ -6,10 +6,8 @@
|
|||||||
|
|
||||||
rm -f $GOROOT/pkg/*
|
rm -f $GOROOT/pkg/*
|
||||||
|
|
||||||
for i in syscall os math fmt net time http reflect regexp
|
for i in syscall math os strconv container/array reflect fmt tabwriter net time http regexp
|
||||||
do
|
do
|
||||||
cd $i
|
(cd $i; make nuke)
|
||||||
make nuke
|
|
||||||
cd ..
|
|
||||||
done
|
done
|
||||||
|
|
||||||
|
@ -38,7 +38,8 @@ builddirs syscall\
|
|||||||
|
|
||||||
buildfiles io.go
|
buildfiles io.go
|
||||||
|
|
||||||
builddirs fmt
|
builddirs fmt\
|
||||||
|
tabwriter\
|
||||||
|
|
||||||
buildfiles flag.go\
|
buildfiles flag.go\
|
||||||
container/vector.go\
|
container/vector.go\
|
||||||
|
55
src/lib/tabwriter/Makefile
Normal file
55
src/lib/tabwriter/Makefile
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
# 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=\
|
||||||
|
tabwriter.$O\
|
||||||
|
|
||||||
|
tabwriter.a: a1
|
||||||
|
|
||||||
|
a1: $(O1)
|
||||||
|
$(AR) grc tabwriter.a tabwriter.$O
|
||||||
|
rm -f $(O1)
|
||||||
|
|
||||||
|
newpkg: clean
|
||||||
|
$(AR) grc tabwriter.a
|
||||||
|
|
||||||
|
$(O1): newpkg
|
||||||
|
|
||||||
|
nuke: clean
|
||||||
|
rm -f $(GOROOT)/pkg/tabwriter.a
|
||||||
|
|
||||||
|
packages: tabwriter.a
|
||||||
|
|
||||||
|
install: packages
|
||||||
|
cp tabwriter.a $(GOROOT)/pkg/tabwriter.a
|
||||||
|
|
@ -61,12 +61,12 @@ func (b *ByteArray) Append(s *[]byte) {
|
|||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Tabwriter is a filter implementing the IO.Write interface. It assumes
|
// Writer is a filter implementing the io.Write interface. It assumes
|
||||||
// that the incoming bytes represent ASCII encoded text consisting of
|
// that the incoming bytes represent ASCII encoded text consisting of
|
||||||
// lines of tab-separated "cells". Cells in adjacent lines constitute
|
// lines of tab-separated "cells". Cells in adjacent lines constitute
|
||||||
// a column. Tabwriter rewrites the incoming text such that all cells
|
// a column. Writer rewrites the incoming text such that all cells in
|
||||||
// in a column have the same width; thus it effectively aligns cells.
|
// a column have the same width; thus it effectively aligns cells. It
|
||||||
// It does this by adding padding where necessary.
|
// does this by adding padding where necessary.
|
||||||
//
|
//
|
||||||
// Formatting can be controlled via parameters:
|
// Formatting can be controlled via parameters:
|
||||||
//
|
//
|
||||||
@ -84,7 +84,7 @@ func (b *ByteArray) Append(s *[]byte) {
|
|||||||
// pendant cell and tab width.
|
// pendant cell and tab width.
|
||||||
|
|
||||||
|
|
||||||
export type TabWriter struct {
|
export type Writer struct {
|
||||||
// TODO should not export any of the fields
|
// TODO should not export any of the fields
|
||||||
// configuration
|
// configuration
|
||||||
writer io.Write;
|
writer io.Write;
|
||||||
@ -100,12 +100,12 @@ export type TabWriter struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (b *TabWriter) AddLine() {
|
func (b *Writer) AddLine() {
|
||||||
b.lines.Push(array.NewIntArray(0));
|
b.lines.Push(array.NewIntArray(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (b *TabWriter) Init(writer io.Write, tabwidth, padding int, usetabs bool) *TabWriter {
|
func (b *Writer) Init(writer io.Write, tabwidth, padding int, usetabs bool) *Writer {
|
||||||
b.writer = writer;
|
b.writer = writer;
|
||||||
b.tabwidth = tabwidth;
|
b.tabwidth = tabwidth;
|
||||||
b.padding = padding;
|
b.padding = padding;
|
||||||
@ -120,18 +120,18 @@ func (b *TabWriter) Init(writer io.Write, tabwidth, padding int, usetabs bool) *
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (b *TabWriter) Line(i int) *array.IntArray {
|
func (b *Writer) Line(i int) *array.IntArray {
|
||||||
return b.lines.At(i).(*array.IntArray);
|
return b.lines.At(i).(*array.IntArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (b *TabWriter) LastLine() *array.IntArray {
|
func (b *Writer) LastLine() *array.IntArray {
|
||||||
return b.lines.At(b.lines.Len() - 1).(*array.IntArray);
|
return b.lines.At(b.lines.Len() - 1).(*array.IntArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// debugging support
|
// debugging support
|
||||||
func (b *TabWriter) Dump() {
|
func (b *Writer) Dump() {
|
||||||
pos := 0;
|
pos := 0;
|
||||||
for i := 0; i < b.lines.Len(); i++ {
|
for i := 0; i < b.lines.Len(); i++ {
|
||||||
line := b.Line(i);
|
line := b.Line(i);
|
||||||
@ -147,7 +147,7 @@ func (b *TabWriter) Dump() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (b *TabWriter) Write0(buf *[]byte) *os.Error {
|
func (b *Writer) Write0(buf *[]byte) *os.Error {
|
||||||
n, err := b.writer.Write(buf);
|
n, err := b.writer.Write(buf);
|
||||||
if n != len(buf) && err == nil {
|
if n != len(buf) && err == nil {
|
||||||
err = os.EIO;
|
err = os.EIO;
|
||||||
@ -161,7 +161,7 @@ var Blanks = &[]byte{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}
|
|||||||
var Newline = &[]byte{'\n'}
|
var Newline = &[]byte{'\n'}
|
||||||
|
|
||||||
|
|
||||||
func (b *TabWriter) WritePadding(textw, cellw int) (err *os.Error) {
|
func (b *Writer) WritePadding(textw, cellw int) (err *os.Error) {
|
||||||
if b.usetabs {
|
if b.usetabs {
|
||||||
// make cell width a multiple of tabwidth
|
// make cell width a multiple of tabwidth
|
||||||
cellw = ((cellw + b.tabwidth - 1) / b.tabwidth) * b.tabwidth;
|
cellw = ((cellw + b.tabwidth - 1) / b.tabwidth) * b.tabwidth;
|
||||||
@ -192,7 +192,7 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (b *TabWriter) 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;
|
pos = pos0;
|
||||||
for i := line0; i < line1; i++ {
|
for i := line0; i < line1; i++ {
|
||||||
line := b.Line(i);
|
line := b.Line(i);
|
||||||
@ -233,7 +233,7 @@ func utflen(buf *[]byte) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (b *TabWriter) 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;
|
pos = pos0;
|
||||||
column := b.widths.Len();
|
column := b.widths.Len();
|
||||||
last := line0;
|
last := line0;
|
||||||
@ -284,13 +284,13 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (b *TabWriter) Append(buf *[]byte) {
|
func (b *Writer) Append(buf *[]byte) {
|
||||||
b.buf.Append(buf);
|
b.buf.Append(buf);
|
||||||
b.width += len(buf);
|
b.width += len(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* export */ func (b *TabWriter) Flush() *os.Error {
|
/* export */ func (b *Writer) Flush() *os.Error {
|
||||||
dummy, err := b.Format(0, 0, b.lines.Len());
|
dummy, err := b.Format(0, 0, b.lines.Len());
|
||||||
// reset (even in the presence of errors)
|
// reset (even in the presence of errors)
|
||||||
b.buf.Clear();
|
b.buf.Clear();
|
||||||
@ -301,7 +301,7 @@ func (b *TabWriter) Append(buf *[]byte) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* export */ func (b *TabWriter) Write(buf *[]byte) (written int, err *os.Error) {
|
/* export */ func (b *Writer) Write(buf *[]byte) (written int, err *os.Error) {
|
||||||
i0, n := 0, len(buf);
|
i0, n := 0, len(buf);
|
||||||
|
|
||||||
// split text into cells
|
// split text into cells
|
||||||
@ -319,7 +319,7 @@ func (b *TabWriter) Append(buf *[]byte) {
|
|||||||
// The last line has only one cell which does not have an
|
// The last line has only one cell which does not have an
|
||||||
// impact on the formatting of the following lines (the
|
// impact on the formatting of the following lines (the
|
||||||
// last cell per line is ignored by Format), thus we can
|
// last cell per line is ignored by Format), thus we can
|
||||||
// flush the TabWriter contents.
|
// flush the Writer contents.
|
||||||
err = b.Flush();
|
err = b.Flush();
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return i0, err;
|
return i0, err;
|
||||||
@ -338,6 +338,6 @@ func (b *TabWriter) Append(buf *[]byte) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export func New(writer io.Write, tabwidth, padding int, usetabs bool) *TabWriter {
|
export func New(writer io.Write, tabwidth, padding int, usetabs bool) *Writer {
|
||||||
return new(TabWriter).Init(writer, tabwidth, padding, usetabs)
|
return new(Writer).Init(writer, tabwidth, padding, usetabs)
|
||||||
}
|
}
|
81
src/lib/tabwriter/tabwriter_test.go
Normal file
81
src/lib/tabwriter/tabwriter_test.go
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
// 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 tabwriter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os";
|
||||||
|
"io";
|
||||||
|
"tabwriter";
|
||||||
|
"testing";
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
type Buffer struct {
|
||||||
|
a *[]byte;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (b *Buffer) Init(n int) {
|
||||||
|
b.a = new([]byte, n)[0 : 0];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (b *Buffer) Write(buf *[]byte) (written int, err *os.Error) {
|
||||||
|
n := len(b.a);
|
||||||
|
m := len(buf);
|
||||||
|
if n + m <= cap(b.a) {
|
||||||
|
b.a = b.a[0 : n + m];
|
||||||
|
for i := 0; i < m; i++ {
|
||||||
|
b.a[n+i] = buf[i];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
panicln("buffer too small", n, m, cap(b.a));
|
||||||
|
}
|
||||||
|
return len(buf), nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (b *Buffer) String() string {
|
||||||
|
return string(b.a);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func Check(t *testing.T, tabwidth, padding int, usetabs bool, src, expected string) {
|
||||||
|
var b Buffer;
|
||||||
|
b.Init(1000);
|
||||||
|
|
||||||
|
var w tabwriter.Writer;
|
||||||
|
w.Init(&b, tabwidth, padding, usetabs);
|
||||||
|
|
||||||
|
io.WriteString(&w, src);
|
||||||
|
|
||||||
|
res := b.String();
|
||||||
|
if res != expected {
|
||||||
|
t.Errorf("src:\n%s\nfound:\n%s\nexpected:\n%s\n", src, res, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export func Test1(t *testing.T) {
|
||||||
|
Check(
|
||||||
|
t, 8, 1, false,
|
||||||
|
"\n",
|
||||||
|
"\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
Check(
|
||||||
|
t, 8, 1, false,
|
||||||
|
"Hello, world!\n",
|
||||||
|
"Hello, world!\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
Check(
|
||||||
|
t, 8, 1, false,
|
||||||
|
"a\tb\tc\naa\tbbb\tcccc\naaa\tbbbb\n\n",
|
||||||
|
"a b c\n"
|
||||||
|
"aa bbb cccc\n"
|
||||||
|
"aaa bbbb\n\n"
|
||||||
|
);
|
||||||
|
}
|
@ -37,9 +37,7 @@ parser.6: scanner.6 ast.6
|
|||||||
|
|
||||||
platform.6: utils.6
|
platform.6: utils.6
|
||||||
|
|
||||||
printer.6: scanner.6 ast.6 tabwriter.6
|
printer.6: scanner.6 ast.6
|
||||||
|
|
||||||
untab.6: tabwriter.6
|
|
||||||
|
|
||||||
%.6: %.go
|
%.6: %.go
|
||||||
$(G) $(F) $<
|
$(G) $(F) $<
|
||||||
|
@ -25,7 +25,7 @@ func Error(format string, params ...) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func Untab(name string, src *os.FD, dst *tabwriter.TabWriter) {
|
func Untab(name string, src *os.FD, dst *tabwriter.Writer) {
|
||||||
n, err := io.Copy(src, dst);
|
n, err := io.Copy(src, dst);
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Error("error while processing %s (%v)", name, err);
|
Error("error while processing %s (%v)", name, err);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user