// of adjacent cells have the same width (by adding padding). For more
// details see: http://nickgravgaard.com/elastictabstops/index.html .
-type TabWriter struct {
+export type TabWriter struct {
// configuration
writer IO.Write;
tabwidth int;
func (b *TabWriter) Newline() {
b.Tab(); // add last cell to current line
-
+
if b.LastLine().Len() == 1 {
// The current line has only one cell which does not have an impact
// on the formatting of the following lines (the last cell per line
// is ignored by Format), thus we can print the TabWriter contents.
if b.widths.Len() != 0 {
- panic();
+ panic("internal error");
}
- //b.Dump();
b.Format(0, 0, b.lines.Len());
if b.widths.Len() != 0 {
- panic();
+ panic("internal error");
}
-
- // reset the TabWriter
+
+ // reset TabWriter
b.width = 0;
b.buf.Clear();
b.lines.Reset();
}
-
+
b.AddLine();
}
}
-export func MakeTabWriter(writer IO.Write, tabwidth int) IO.Write {
+export func MakeTabWriter(writer IO.Write, tabwidth int) *TabWriter {
b := new(TabWriter);
b.Init(writer, tabwidth);
return b;
--- /dev/null
+// 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 main
+
+import (
+ OS "os";
+ IO "io";
+ Flag "flag";
+ Fmt "fmt";
+ TabWriter "tabwriter";
+)
+
+
+var (
+ tabwidth = Flag.Int("tabwidth", 4, nil, "tab width");
+)
+
+
+func Error(fmt string, params ...) {
+ Fmt.printf(fmt, params);
+ sys.exit(1);
+}
+
+
+func Untab(name string, src *OS.FD, dst *TabWriter.TabWriter) {
+ n, err := IO.Copyn(src, dst, 2e9 /* inf */); // TODO use Copy
+ if err != nil {
+ Error("error while processing %s (%v)", name, err);
+ }
+ //dst.Flush();
+}
+
+
+func main() {
+ Flag.Parse();
+ dst := TabWriter.MakeTabWriter(OS.Stdout, int(tabwidth.IVal()));
+ if Flag.NArg() > 0 {
+ for i := 0; i < Flag.NArg(); i++ {
+ name := Flag.Arg(i);
+ src, err := OS.Open(name, OS.O_RDONLY, 0);
+ if err != nil {
+ Error("could not open %s (%v)\n", name, err);
+ }
+ Untab(name, src, dst);
+ src.Close(); // ignore errors
+ }
+ } else {
+ // no files => use stdin
+ Untab("/dev/stdin", OS.Stdin, dst);
+ }
+}