/
gen.go
75 lines (62 loc) · 1.41 KB
/
gen.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright (c) 2018-2019, Sylabs Inc. All rights reserved.
// This software is licensed under a 3-clause BSD license. Please consult the
// LICENSE.md file distributed with the sources of this project regarding your
// rights to use or distribute this software.
package main
import (
"bufio"
"bytes"
"fmt"
"io/ioutil"
"os"
"strings"
"text/template"
)
func parseLine(s string) (d Define) {
d = Define{
Words: strings.Fields(s),
}
return
}
// Define is a struct that contains one line of configuration words.
type Define struct {
Words []string
}
// WriteLine writes a line of configuration.
func (d Define) WriteLine() (s string) {
s = "const " + d.Words[1] + " = " + d.Words[2]
if len(d.Words) > 3 {
}
for _, w := range d.Words[3:] {
s += " + " + w
}
return s
}
var confgenTemplate = template.Must(template.New("").Parse(`// Code generated by go generate; DO NOT EDIT.
package buildcfg
{{ range $i, $d := . }}
{{$d.WriteLine -}}
{{end}}
`))
func main() {
outFile, err := os.Create("config.go")
if err != nil {
fmt.Println(err)
return
}
defer outFile.Close()
inFile, err := ioutil.ReadFile(os.Args[1])
if err != nil {
fmt.Println(err)
return
}
header := []Define{}
s := bufio.NewScanner(bytes.NewReader(inFile))
for s.Scan() {
d := parseLine(s.Text())
if len(d.Words) > 2 && d.Words[0] == "#define" {
header = append(header, d)
}
}
confgenTemplate.Execute(outFile, header)
}