summaryrefslogtreecommitdiff
path: root/doc/progs/cat_rot13.go
diff options
context:
space:
mode:
Diffstat (limited to 'doc/progs/cat_rot13.go')
-rw-r--r--doc/progs/cat_rot13.go90
1 files changed, 90 insertions, 0 deletions
diff --git a/doc/progs/cat_rot13.go b/doc/progs/cat_rot13.go
new file mode 100644
index 000000000..0eefe7cfc
--- /dev/null
+++ b/doc/progs/cat_rot13.go
@@ -0,0 +1,90 @@
+// 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 (
+ "./file"
+ "flag"
+ "fmt"
+ "os"
+)
+
+var rot13Flag = flag.Bool("rot13", false, "rot13 the input")
+
+func rot13(b byte) byte {
+ if 'a' <= b && b <= 'z' {
+ b = 'a' + ((b-'a')+13)%26
+ }
+ if 'A' <= b && b <= 'Z' {
+ b = 'A' + ((b-'A')+13)%26
+ }
+ return b
+}
+
+type reader interface {
+ Read(b []byte) (ret int, err os.Error)
+ String() string
+}
+
+type rotate13 struct {
+ source reader
+}
+
+func newRotate13(source reader) *rotate13 {
+ return &rotate13{source}
+}
+
+func (r13 *rotate13) Read(b []byte) (ret int, err os.Error) {
+ r, e := r13.source.Read(b)
+ for i := 0; i < r; i++ {
+ b[i] = rot13(b[i])
+ }
+ return r, e
+}
+
+func (r13 *rotate13) String() string {
+ return r13.source.String()
+}
+// end of rotate13 implementation
+
+func cat(r reader) {
+ const NBUF = 512
+ var buf [NBUF]byte
+
+ if *rot13Flag {
+ r = newRotate13(r)
+ }
+ for {
+ switch nr, er := r.Read(buf[:]); {
+ case nr < 0:
+ fmt.Fprintf(os.Stderr, "cat: error reading from %s: %s\n", r.String(), er.String())
+ os.Exit(1)
+ case nr == 0: // EOF
+ return
+ case nr > 0:
+ nw, ew := file.Stdout.Write(buf[0:nr])
+ if nw != nr {
+ fmt.Fprintf(os.Stderr, "cat: error writing from %s: %s\n", r.String(), ew.String())
+ os.Exit(1)
+ }
+ }
+ }
+}
+
+func main() {
+ flag.Parse() // Scans the arg list and sets up flags
+ if flag.NArg() == 0 {
+ cat(file.Stdin)
+ }
+ for i := 0; i < flag.NArg(); i++ {
+ f, err := file.Open(flag.Arg(i))
+ if f == nil {
+ fmt.Fprintf(os.Stderr, "cat: can't open %s: error %s\n", flag.Arg(i), err)
+ os.Exit(1)
+ }
+ cat(f)
+ f.Close()
+ }
+}