63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
// Command mc prints in multiple columns.
|
|
//
|
|
// Usage: mc [-] [-N] [file...]
|
|
//
|
|
// Mc splits the input into as many columns as will fit in N
|
|
// print positions. If the output is a tty, the default N is
|
|
// the number of characters in a terminal line; otherwise the
|
|
// default N is 80. Under option - each input line ending in
|
|
// a colon ':' is printed separately.
|
|
package main
|
|
|
|
import (
|
|
"github.com/kr/pty"
|
|
"github.com/kr/text/colwriter"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
func main() {
|
|
var width int
|
|
var flag uint
|
|
args := os.Args[1:]
|
|
for len(args) > 0 && len(args[0]) > 0 && args[0][0] == '-' {
|
|
if len(args[0]) > 1 {
|
|
width, _ = strconv.Atoi(args[0][1:])
|
|
} else {
|
|
flag |= colwriter.BreakOnColon
|
|
}
|
|
args = args[1:]
|
|
}
|
|
if width < 1 {
|
|
_, width, _ = pty.Getsize(os.Stdout)
|
|
}
|
|
if width < 1 {
|
|
width = 80
|
|
}
|
|
|
|
w := colwriter.NewWriter(os.Stdout, width, flag)
|
|
if len(args) > 0 {
|
|
for _, s := range args {
|
|
if f, err := os.Open(s); err == nil {
|
|
copyin(w, f)
|
|
f.Close()
|
|
} else {
|
|
log.Println(err)
|
|
}
|
|
}
|
|
} else {
|
|
copyin(w, os.Stdin)
|
|
}
|
|
}
|
|
|
|
func copyin(w *colwriter.Writer, r io.Reader) {
|
|
if _, err := io.Copy(w, r); err != nil {
|
|
log.Println(err)
|
|
}
|
|
if err := w.Flush(); err != nil {
|
|
log.Println(err)
|
|
}
|
|
}
|