import OS "os"
import TabWriter "tabwriter"
-var tabwith = Flag.Int("tabwidth", 4, nil, "tab width");
-var comments = Flag.Bool("comments", false, nil, "enable printing of comments");
+var (
+ usetabs = Flag.Bool("usetabs", false, nil, "align with tabs instead of blanks");
+ tabwidth = Flag.Int("tabwidth", 4, nil, "tab width");
+ comments = Flag.Bool("comments", false, nil, "enable printing of comments");
+)
// ----------------------------------------------------------------------------
func (P *Printer) Program(p *AST.Program) {
// TODO should initialize all fields?
- P.writer = TabWriter.MakeTabWriter(OS.Stdout, 4);
+ P.writer = TabWriter.MakeTabWriter(OS.Stdout, usetabs.BVal(), int(tabwidth.IVal()));
P.clist = p.comments;
P.cindex = 0;
export type TabWriter struct {
// configuration
writer IO.Write;
+ usetabs bool;
tabwidth int;
// current state
}
-func (b *TabWriter) Init(writer IO.Write, tabwidth int) {
+func (b *TabWriter) Init(writer IO.Write, usetabs bool, tabwidth int) {
b.writer = writer;
+ b.usetabs = usetabs;
b.tabwidth = tabwidth;
b.buf.Init(1024);
}
+var Tabs = &[]byte{'\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t'}
var Blanks = &[]byte{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}
var Newline = &[]byte{'\n'}
-func (b *TabWriter) WriteBlanks(n int) {
- for n >= len(Blanks) {
- m, err := b.writer.Write(Blanks);
- n -= len(Blanks);
+
+func (b *TabWriter) Padding(textwidth, cellwidth int) {
+ n := cellwidth - textwidth;
+ if n < 0 {
+ panic("internal error");
+ }
+ if b.usetabs {
+ if cellwidth % b.tabwidth != 0 {
+ panic("internal error"); // cellwidth should be a multiple of tabwidth
+ }
+ n = (n + b.tabwidth - 1) / b.tabwidth;
+ for n > len(Tabs) {
+ m, err := b.writer.Write(Tabs);
+ n -= len(Tabs);
+ }
+ m, err := b.writer.Write(Tabs[0 : n]);
+ } else {
+ for n > len(Blanks) {
+ m, err := b.writer.Write(Blanks);
+ n -= len(Blanks);
+ }
+ m, err := b.writer.Write(Blanks[0 : n]);
}
- m, err := b.writer.Write(Blanks[0 : n]);
}
}
pos += w;
if j < b.widths.Len() {
- b.WriteBlanks(b.widths.At(j).(int) - w);
+ b.Padding(w, b.widths.At(j).(int));
}
}
m, err := b.writer.Write(Newline);
}
// column block end
+ if b.usetabs {
+ // make width a multiple of the tab width
+ width = ((width + b.tabwidth - 1) / b.tabwidth) * b.tabwidth;
+ }
+
// format and print all columns to the right of this column
// (we know the widths of this column and all columns to the left)
b.widths.Append(width);
}
-export func MakeTabWriter(writer IO.Write, tabwidth int) *TabWriter {
+export func MakeTabWriter(writer IO.Write, usetabs bool, tabwidth int) *TabWriter {
b := new(TabWriter);
- b.Init(writer, tabwidth);
+ b.Init(writer, usetabs, tabwidth);
return b;
}
var (
+ usetabs = Flag.Bool("usetabs", false, nil, "align with tabs instead of blanks");
tabwidth = Flag.Int("tabwidth", 4, nil, "tab width");
)
func main() {
Flag.Parse();
- dst := TabWriter.MakeTabWriter(OS.Stdout, int(tabwidth.IVal()));
+ dst := TabWriter.MakeTabWriter(OS.Stdout, usetabs.BVal(), int(tabwidth.IVal()));
if Flag.NArg() > 0 {
for i := 0; i < Flag.NArg(); i++ {
name := Flag.Arg(i);