| // 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"; |
| "io"; |
| "flag"; |
| "fmt"; |
| "tabwriter"; |
| ) |
| |
| |
| var ( |
| tabwidth = flag.Int("tabwidth", 4, "tab width"); |
| usetabs = flag.Bool("usetabs", false, "align with tabs instead of blanks"); |
| ) |
| |
| |
| func error(format string, params ...) { |
| fmt.Printf(format, params); |
| sys.Exit(1); |
| } |
| |
| |
| func untab(name string, src *os.File, dst *tabwriter.Writer) { |
| n, err := io.Copy(src, dst); |
| if err != nil { |
| error("error while processing %s (%v)", name, err); |
| } |
| //dst.Flush(); |
| } |
| |
| |
| func main() { |
| flag.Parse(); |
| padchar := byte(' '); |
| if *usetabs { |
| padchar = '\t'; |
| } |
| dst := tabwriter.NewWriter(os.Stdout, *tabwidth, 1, padchar, 0); |
| 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); |
| } |
| } |