| 
0
 | 
     1 package main
 | 
| 
 | 
     2 
 | 
| 
 | 
     3 import (
 | 
| 
 | 
     4     "bufio"
 | 
| 
 | 
     5     "flag"
 | 
| 
 | 
     6     "fmt"
 | 
| 
 | 
     7     "os"
 | 
| 
 | 
     8 )
 | 
| 
 | 
     9 
 | 
| 
 | 
    10 func main() {
 | 
| 
 | 
    11     flag.Parse()
 | 
| 
 | 
    12 
 | 
| 
 | 
    13     files := flag.Args()
 | 
| 
 | 
    14 
 | 
| 
 | 
    15     var lines []string
 | 
| 
 | 
    16 
 | 
| 
 | 
    17     // Input
 | 
| 
 | 
    18     if len( files ) == 0 {
 | 
| 
 | 
    19         lines = ReverseLines( os.Stdin, nil )
 | 
| 
 | 
    20     } else {
 | 
| 
 | 
    21         for _, arg := range files {
 | 
| 
 | 
    22             f, err := os.Open( arg )
 | 
| 
 | 
    23             if err != nil {
 | 
| 
 | 
    24                 fmt.Fprintf( os.Stderr, "tac : %v\n", err )
 | 
| 
 | 
    25                 continue
 | 
| 
 | 
    26             }
 | 
| 
 | 
    27             l := ReverseLines( f, nil )
 | 
| 
 | 
    28             f.Close()
 | 
| 
 | 
    29             lines = append( lines, l... )
 | 
| 
 | 
    30         }
 | 
| 
 | 
    31     }
 | 
| 
 | 
    32 
 | 
| 
 | 
    33     // Output
 | 
| 
 | 
    34     for _, line := range lines {
 | 
| 
 | 
    35         fmt.Println( line )
 | 
| 
 | 
    36     }
 | 
| 
 | 
    37 }
 | 
| 
 | 
    38 
 | 
| 
 | 
    39 func ReverseLines( f *os.File, l []string ) []string {
 | 
| 
 | 
    40     input := bufio.NewScanner( f )
 | 
| 
 | 
    41     for input.Scan() {
 | 
| 
 | 
    42         l = append( l, input.Text() )
 | 
| 
 | 
    43     }
 | 
| 
 | 
    44     for i, j := 0, len(l) - 1; i < j; i, j = i + 1, j - 1 {
 | 
| 
 | 
    45         l[i], l[j] = l[j], l[i]
 | 
| 
 | 
    46     }
 | 
| 
 | 
    47     return l
 | 
| 
 | 
    48 }
 | 
| 
 | 
    49 
 |