1
2
3
4
5 package main
6
7 import (
8 "./file"
9 "flag"
10 "fmt"
11 "os"
12 )
13
14 func cat(f *file.File) {
15 const NBUF = 512
16 var buf [NBUF]byte
17 for {
18 switch nr, er := f.Read(buf[:]); true {
19 case nr < 0:
20 fmt.Fprintf(os.Stderr, "cat: error reading from %s: %s\n", f.String(), er.String())
21 os.Exit(1)
22 case nr == 0:
23 return
24 case nr > 0:
25 if nw, ew := file.Stdout.Write(buf[0:nr]); nw != nr {
26 fmt.Fprintf(os.Stderr, "cat: error writing from %s: %s\n", f.String(), ew.String())
27 os.Exit(1)
28 }
29 }
30 }
31 }
32
33 func main() {
34 flag.Parse()
35 if flag.NArg() == 0 {
36 cat(file.Stdin)
37 }
38 for i := 0; i < flag.NArg(); i++ {
39 f, err := file.Open(flag.Arg(i))
40 if f == nil {
41 fmt.Fprintf(os.Stderr, "cat: can't open %s: error %s\n", flag.Arg(i), err)
42 os.Exit(1)
43 }
44 cat(f)
45 f.Close()
46 }
47 }