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  }