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 }