modernc.org/knuth@v0.0.4/cmd/gogftodvi/main.go (about)

     1  // Copyright 2023 The Knuth Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Command gftodvi is the GFtoDVI program by Tomas Rokicki, transpiled to Go.
     6  //
     7  //	http://mirrors.ctan.org/systems/knuth/dist/mfware/gftodvi.web
     8  //
     9  // For more details about the original Pascal program and its usage please see
    10  // the modernc.org/knuth/gftodvi package.
    11  package main // modernc.org/knuth/cmd/gogftodvi
    12  
    13  import (
    14  	"flag"
    15  	"fmt"
    16  	"io"
    17  	"os"
    18  	"path/filepath"
    19  	"strings"
    20  
    21  	"modernc.org/knuth"
    22  	"modernc.org/knuth/gftodvi"
    23  )
    24  
    25  func fail(rc int, s string, args ...interface{}) {
    26  	fmt.Fprintf(os.Stderr, s, args...)
    27  	os.Exit(rc)
    28  }
    29  
    30  // program GF_to_DVI( output);
    31  
    32  // Main executes the gftodvi program using the supplied arguments.
    33  func main() {
    34  	sep := string(os.PathListSeparator)
    35  	oTexfonts := flag.String("texfonts", "", fmt.Sprintf("a list of search paths separated by %q", sep))
    36  	flag.Parse()
    37  	nArg := flag.NArg()
    38  	if nArg < 1 || nArg > 2 {
    39  		fail(2, "expected 1 or 2 arguments: gf_file [dvi_file]\n")
    40  	}
    41  
    42  	gfFile, err := os.Open(flag.Arg(0))
    43  	if err != nil {
    44  		fail(1, "%s\n", err)
    45  	}
    46  
    47  	defer gfFile.Close()
    48  
    49  	var dviFile *os.File
    50  	switch {
    51  	case nArg == 1:
    52  		base := filepath.Base(flag.Arg(0))
    53  		if dviFile, err = os.Create(base[:len(base)-len(filepath.Ext(base))] + ".dvi"); err != nil {
    54  			fail(1, "creating dvi_file: %v", err)
    55  		}
    56  	default:
    57  		if dviFile, err = os.Create(flag.Arg(1)); err != nil {
    58  			fail(1, "creating dvi_file: %v", err)
    59  		}
    60  	}
    61  
    62  	defer func() {
    63  		if err := dviFile.Close(); err != nil {
    64  			fail(1, "closing dvi_file: %v", err)
    65  		}
    66  	}()
    67  
    68  	var fontPaths []string
    69  	if s := *oTexfonts; s != "" {
    70  		fontPaths = strings.Split(s, sep)
    71  	}
    72  	if err = gftodvi.Main(gfFile, dviFile, os.Stdout, os.Stderr,
    73  		func(fileName string) (r io.Reader, err error) { return knuth.Open(fileName, fontPaths) },
    74  	); err != nil {
    75  		fail(1, "FAIL: %s\n", err)
    76  	}
    77  }