This repository has been archived by the owner on Apr 23, 2020. It is now read-only.
/
generator.go
80 lines (71 loc) · 1.62 KB
/
generator.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
76
77
78
79
80
package main
/*
#include <girepository.h>
*/
import "C"
import (
"bytes"
"go/format"
"io"
"log"
"os"
"path/filepath"
"strings"
)
type Generator struct {
Lib string
OutDir string
CPrefix string
FuncsWriter io.Writer
currentFunctionName string
}
func Gen(lib, outDir string, includes []string) {
generator := &Generator{
Lib: lib,
OutDir: outDir,
}
filePrefix := strings.ToLower(lib) + "_"
// open girepository
repo := C.g_irepository_get_default()
var gerr *C.GError
C.g_irepository_require(repo, toGStr(lib), nil, 0, &gerr)
if gerr != nil {
log.Fatal(fromGStr(gerr.message))
}
generator.CPrefix = fromGStr(C.g_irepository_get_c_prefix(repo, toGStr(lib)))
// functions output file
funcsWriter := new(bytes.Buffer)
generator.FuncsWriter = funcsWriter
w(funcsWriter, "package %s\n", strings.ToLower(lib))
for _, include := range includes {
w(funcsWriter, "//#include <%s>\n", include)
}
w(funcsWriter, "import \"C\"\n")
defer func() {
out, err := os.Create(filepath.Join(outDir, filePrefix+"functions.go"))
if err != nil {
log.Fatal(err)
}
src, err := format.Source(funcsWriter.Bytes())
if err != nil {
p("%s\n", funcsWriter.Bytes())
out.Write(funcsWriter.Bytes())
out.Close()
log.Fatal(err)
}
out.Write(src)
out.Close()
}()
// iterate infos
nInfos := C.g_irepository_get_n_infos(repo, toGStr(lib))
for i := C.gint(0); i < nInfos; i++ {
baseInfo := C.g_irepository_get_info(repo, toGStr(lib), i)
t := C.g_base_info_get_type(baseInfo)
switch t {
// function
case C.GI_INFO_TYPE_FUNCTION:
info := asFunctionInfo(baseInfo)
generator.GenFunction(info)
}
}
}