-
Notifications
You must be signed in to change notification settings - Fork 0
/
file.go
61 lines (46 loc) · 1.06 KB
/
file.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
package main
import (
"os"
"text/template"
_ "embed"
"golang.org/x/tools/go/packages"
)
//go:embed tmpl/main.go.tmpl
var tmplMainGo string
//go:embed tmpl/main.c.tmpl
var tmplMainC string
type mainGoData struct {
PkgImport *packages.Package
PkgName string
FuncName string
}
func createLibFile() (string, string, func()) {
libFile := createEmptyFile(`afl.*.a`)
libHeader := libFile[:len(libFile)-1] + `h`
return libFile, libHeader, func() {
os.Remove(libFile)
os.Remove(libHeader)
}
}
func createTemplate(tmplStr, pattern string, data any) (string, func()) {
tmpl, err := template.New(``).Parse(tmplStr)
panicOnError(err)
tmpFile, err := os.CreateTemp(`.`, pattern)
panicOnError(err)
defer tmpFile.Close()
cleanup := func() { os.Remove(tmpFile.Name()) }
err = tmpl.Execute(tmpFile, data)
if err != nil {
cleanup()
panic(err)
}
return tmpFile.Name(), cleanup
}
func createEmptyFile(pattern string) string {
tmpFile, err := os.CreateTemp(`.`, pattern)
if err == nil {
err = tmpFile.Close()
}
panicOnError(err)
return tmpFile.Name()
}