modernc.org/knuth@v0.0.4/mf/generate.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  //go:build ignore
     6  // +build ignore
     7  
     8  package main
     9  
    10  import (
    11  	"fmt"
    12  	"os"
    13  	"path/filepath"
    14  
    15  	"modernc.org/knuth"
    16  	"modernc.org/knuth/web"
    17  )
    18  
    19  func fail(s string, args ...interface{}) {
    20  	fmt.Fprintf(os.Stderr, s, args...)
    21  	os.Exit(1)
    22  }
    23  
    24  func main() {
    25  	prod()
    26  	test()
    27  }
    28  
    29  func prod() {
    30  	const (
    31  		base = "mf"
    32  
    33  		chFn   = base + ".ch"
    34  		goFn   = base + ".go"
    35  		pasFn  = base + ".pas"
    36  		poolFn = base + ".pool"
    37  		webFn  = base + ".web"
    38  	)
    39  
    40  	dest, err := os.Create(filepath.FromSlash(goFn))
    41  	if err != nil {
    42  		fail("creating %s: %v\n", goFn, err)
    43  	}
    44  
    45  	defer func() {
    46  		if err = dest.Close(); err != nil {
    47  			fail("closing %s: %v\n", goFn, err)
    48  		}
    49  	}()
    50  
    51  	pas, err := os.Create(filepath.FromSlash(pasFn))
    52  	if err != nil {
    53  		fail("creating %s: %v\n", pasFn, err)
    54  	}
    55  
    56  	defer func() {
    57  		if err = pas.Close(); err != nil {
    58  			fail("closing %s: %v\n", pasFn, err)
    59  		}
    60  	}()
    61  
    62  	pool, err := os.Create(filepath.FromSlash(poolFn))
    63  	if err != nil {
    64  		fail("creating %s: %v\n", poolFn, err)
    65  	}
    66  
    67  	defer func() {
    68  		if err = pool.Close(); err != nil {
    69  			fail("closing %s: %v\n", poolFn, err)
    70  		}
    71  	}()
    72  
    73  	webSrc, err := os.ReadFile(filepath.FromSlash(webFn))
    74  	if err != nil {
    75  		fail("reading %v: %v\n", webFn, err)
    76  	}
    77  
    78  	chSrc, err := os.ReadFile(filepath.FromSlash(chFn))
    79  	if err != nil {
    80  		fail("reading %v: %v\n", chFn, err)
    81  	}
    82  
    83  	src, err := knuth.NewChanger(
    84  		knuth.NewRuneSource(webFn, webSrc, knuth.Unicode),
    85  		knuth.NewRuneSource(chFn, chSrc, knuth.Unicode),
    86  	)
    87  	if err != nil {
    88  		fail("processing %s and %s: %v\n", webFn, chFn, err)
    89  	}
    90  
    91  	if err := web.Go(dest, pas, pool, src, base); err != nil {
    92  		fail("generate: %v\n", err)
    93  	}
    94  }
    95  
    96  func test() {
    97  	if err := os.Chdir(filepath.FromSlash("internal/trap/")); err != nil {
    98  		fail("cannot chdir: %v", err)
    99  	}
   100  
   101  	const (
   102  		base = "mf"
   103  
   104  		chFn   = base + ".ch"
   105  		goFn   = base + ".go"
   106  		pasFn  = base + ".pas"
   107  		poolFn = base + ".pool"
   108  		webFn  = "../../" + base + ".web"
   109  	)
   110  
   111  	dest, err := os.Create(filepath.FromSlash(goFn))
   112  	if err != nil {
   113  		fail("creating %s: %v\n", goFn, err)
   114  	}
   115  
   116  	defer func() {
   117  		if err = dest.Close(); err != nil {
   118  			fail("closing %s: %v\n", goFn, err)
   119  		}
   120  	}()
   121  
   122  	pas, err := os.Create(filepath.FromSlash(pasFn))
   123  	if err != nil {
   124  		fail("creating %s: %v\n", pasFn, err)
   125  	}
   126  
   127  	defer func() {
   128  		if err = pas.Close(); err != nil {
   129  			fail("closing %s: %v\n", pasFn, err)
   130  		}
   131  	}()
   132  
   133  	pool, err := os.Create(filepath.FromSlash(poolFn))
   134  	if err != nil {
   135  		fail("creating %s: %v\n", poolFn, err)
   136  	}
   137  
   138  	defer func() {
   139  		if err = pool.Close(); err != nil {
   140  			fail("closing %s: %v\n", poolFn, err)
   141  		}
   142  	}()
   143  
   144  	webSrc, err := os.ReadFile(filepath.FromSlash(webFn))
   145  	if err != nil {
   146  		fail("reading %v: %v\n", webFn, err)
   147  	}
   148  
   149  	chSrc, err := os.ReadFile(filepath.FromSlash(chFn))
   150  	if err != nil {
   151  		fail("reading %v: %v\n", chFn, err)
   152  	}
   153  
   154  	src, err := knuth.NewChanger(
   155  		knuth.NewRuneSource(webFn, webSrc, knuth.Unicode),
   156  		knuth.NewRuneSource(chFn, chSrc, knuth.Unicode),
   157  	)
   158  	if err != nil {
   159  		fail("processing %s and %s: %v\n", webFn, chFn, err)
   160  	}
   161  
   162  	if err := web.Go(dest, pas, pool, src, "trap"); err != nil {
   163  		fail("generate: %v\n", err)
   164  	}
   165  }