User defined pipe and redirection operators: Difference between revisions

→‎{{header|Go}}: Use builtin io.TeeReader; don't special-case CloseWithError(io.EOF)
(→‎{{header|ALGOL 68}}: PROC and OP details)
(→‎{{header|Go}}: Use builtin io.TeeReader; don't special-case CloseWithError(io.EOF))
Line 194:
import (
"bufio"
"bytes"
"fmt"
"io"
Line 205 ⟶ 204:
// fake file system
var fs = make(map[string]string)
 
type file struct{ name string }
 
func (f file) Write(p []byte) (int, error) {
fs[f.name] += string(bp)
return prlen(p), nil
}
 
// role of > operator
func toName(name string, src io.Reader) {
bio.Copy(file{name}, _ := ioutil.ReadAll(src)
fs[name] = string(b)
}
 
// role of < operator
func fromName(name string) io.Reader {
return bytesstrings.NewBufferStringNewReader(fs[name])
}
 
func tee(in io.Reader, name string) io.Reader {
pr, pw :=return io.PipeTeeReader(in, file{name})
go func() {
b := make([]byte, 512)
for {
readN, readErr := in.Read(b)
if readN > 0 {
writeN, writeErr := pw.Write(b[:readN])
fs[name] += string(b[:writeN])
if writeErr != nil {
return
}
}
switch readErr {
case nil:
continue
case io.EOF:
pw.Close()
default:
pw.CloseWithError(readErr)
}
return
}
}()
return pr
}
 
Line 319 ⟶ 301:
io.WriteString(pw, "\n")
}
break
}
pw.CloseWithError(readErr)
Line 369 ⟶ 350:
}
writeLines(0, rn)
switch pw.CloseWithError(readErr {)
if readErr == io.EOF {
pw.Close()
} else {
pw.CloseWithError(readErr)
}
}()
return pr
Line 382 ⟶ 359:
go func() {
b, err := ioutil.ReadAll(in)
if err != nil {
pw.CloseWithError(err)
return
}
if len(b) > 0 {
if b[len(b)-1] == '\n' {
Line 398 ⟶ 371:
}
}
pw.CloseCloseWithError(err)
}()
return pr
Anonymous user