123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- package tac
- /* Concatenate files in "stdout" reversed. */
- import(
- "os"
- "io"
- "fmt"
- "bufio"
- "surdeus.su/core/cli/mtool"
- )
- func reverse(a []string) chan string {
- ret := make(chan string)
- go func() {
- l := len(a)
- for i, _ := range a {
- ret <- a[l-1-i]
- }
- close(ret)
- }()
- return ret
- }
- func tac(p string) error {
- f, e := os.Open(p)
- if e != nil {
- return e
- }
- defer f.Close()
- ftac(f)
- return nil
- }
- func ftac(f *os.File) error {
- r := bufio.NewReader(f)
- var lines []string
- for {
- line, e := r.ReadString('\n')
- if e == io.EOF {
- break
- }
- lines = append(lines, line)
- }
- for l := range reverse(lines) {
- fmt.Print(l)
- }
- return nil
- }
- func Run(flagSet *mtool.Flags) {
- flagSet.Parse()
- args := flagSet.Args()
- if len(args)>0 {
- for _, p := range args {
- e := tac(p)
- if e != nil {
- fmt.Fprintf(os.Stderr, "%s.\n", e)
- }
- }
- } else {
- ftac(os.Stdin)
- }
- }
|