github.com/jflude/taocp@v0.0.0-20240210234939-99f2a91af3c2/cmd/mixal/main.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"flag"
     7  	"io"
     8  	"log"
     9  	"os"
    10  	"strings"
    11  
    12  	"github.com/jflude/taocp/mixal"
    13  )
    14  
    15  func main() {
    16  	log.SetFlags(0)
    17  	if err := run(); err != nil {
    18  		log.Fatalln("error:", err)
    19  	}
    20  }
    21  
    22  func run() (err error) {
    23  	var interrupts bool
    24  	if env, ok := os.LookupEnv("MIX_ENABLE_INTERRUPTS"); ok {
    25  		env = strings.ToLower(env)
    26  		interrupts = (env[0] == '1' || env[0] == 'y' || env == "true")
    27  	}
    28  	flag.BoolVar(&interrupts, "int", interrupts, "enable interrupts")
    29  	flag.Parse()
    30  	if flag.NArg() != 1 {
    31  		err = errors.New("mixal [-int] INPUT-FILE")
    32  		return
    33  	}
    34  	var in io.ReadCloser
    35  	if flag.Arg(0) == "-" {
    36  		in = os.Stdin
    37  	} else {
    38  		if in, err = os.Open(flag.Arg(0)); err != nil {
    39  			return
    40  		}
    41  		defer func() {
    42  			if err2 := in.Close(); err2 != nil {
    43  				if err == nil {
    44  					err = err2
    45  				} else {
    46  					log.Println("error:", err2)
    47  				}
    48  			}
    49  		}()
    50  	}
    51  	var buf bytes.Buffer
    52  	if err = mixal.Assemble(in, &buf, interrupts); err != nil {
    53  		return
    54  	}
    55  	out, err := os.Create("reader.mix")
    56  	if err != nil {
    57  		return
    58  	}
    59  	defer func() {
    60  		if err2 := out.Close(); err2 != nil {
    61  			if err == nil {
    62  				err = err2
    63  			} else {
    64  				log.Println("error:", err2)
    65  			}
    66  		}
    67  	}()
    68  	_, err = io.Copy(out, &buf)
    69  	return
    70  }