]> Cypherpunks repositories - gostls13.git/commitdiff
- untab app (snapshot - not quite complete)
authorRobert Griesemer <gri@golang.org>
Wed, 19 Nov 2008 02:44:17 +0000 (18:44 -0800)
committerRobert Griesemer <gri@golang.org>
Wed, 19 Nov 2008 02:44:17 +0000 (18:44 -0800)
R=r
OCL=19558
CL=19558

usr/gri/pretty/Makefile
usr/gri/pretty/tabwriter.go
usr/gri/pretty/untab.go [new file with mode: 0644]

index 462ab5f5565912d02258872a50d9dc4353986d45..835654652e72efe8f60f4db5ad5e6cb4c9a9e2d9 100644 (file)
@@ -5,6 +5,11 @@
 G=6g
 L=6l
 
+all: untab pretty
+
+untab: untab.6
+       $(L) -o untab untab.6
+       
 pretty: pretty.6
        $(L) -o pretty pretty.6
 
@@ -34,6 +39,7 @@ platform.6:    utils.6
 
 printer.6:      scanner.6 ast.6 tabwriter.6
 
+untab.6:       tabwriter.6
 
 %.6:   %.go
        $(G) $(F) $<
index fa3331da450f43d37066f22948cc9b62cf343661..e97eea9c4b2698583d877eb6da0441d1c24872a2 100644 (file)
@@ -85,7 +85,7 @@ func (b *ByteArray) Append(s *[]byte) {
 // 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;
@@ -232,26 +232,25 @@ func (b *TabWriter) Tab() {
 
 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();
 }
 
@@ -278,7 +277,7 @@ func (b *TabWriter) Write(buf *[]byte) (i int, err *OS.Error) {
 }
 
 
-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;
diff --git a/usr/gri/pretty/untab.go b/usr/gri/pretty/untab.go
new file mode 100644 (file)
index 0000000..48f1bcf
--- /dev/null
@@ -0,0 +1,53 @@
+// 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);
+       }
+}