github.com/jflude/taocp@v0.0.0-20240210234939-99f2a91af3c2/mix/printer.go (about) 1 package mix 2 3 import ( 4 "io" 5 "strings" 6 ) 7 8 type Printer struct { 9 wc io.WriteCloser 10 } 11 12 // see https://en.wikipedia.org/wiki/IBM_1403 13 func NewPrinter(wc io.WriteCloser) (*Printer, error) { 14 return &Printer{wc}, nil 15 } 16 17 func (*Printer) Name() string { 18 return "PRINTER" 19 } 20 21 func (*Printer) BlockSize() int { 22 return 24 23 } 24 25 func (*Printer) Read([]Word) (int64, error) { 26 return 0, ErrInvalidCommand 27 } 28 29 func (p *Printer) Write(block []Word) (int64, error) { 30 return 100000, trimWrite(p.wc, block) 31 } 32 33 func (p *Printer) Control(m int) (int64, error) { 34 if m != 0 { 35 return 0, ErrInvalidCommand 36 } 37 _, err := p.wc.Write([]byte("\014")) // form feed 38 return 1000000, err 39 } 40 41 func (p *Printer) Close() error { 42 return p.wc.Close() 43 } 44 45 func trimWrite(w io.Writer, block []Word) error { 46 line := strings.TrimRight(ConvertToUTF8(block), " ") + "\n" 47 _, err := io.WriteString(w, line) 48 return err 49 }