Skip to content

Commit 07294eb

Browse files
authored
Merge pull request #1 from luoliwoshang/gogensig
[wip]:gogensig
2 parents 49e4aae + d72797f commit 07294eb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+10918
-4
lines changed

cmd/gogensig/cmp/cmp.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package cmp
2+
3+
import (
4+
"bufio"
5+
"bytes"
6+
"strings"
7+
"unicode"
8+
9+
"github.com/google/go-cmp/cmp"
10+
)
11+
12+
func skipSpace(data []byte, from int) int {
13+
dataBuf := bytes.NewBuffer(data[from:])
14+
index := from
15+
for {
16+
rn, sz, err := dataBuf.ReadRune()
17+
if err != nil {
18+
break
19+
}
20+
if !unicode.IsSpace(rn) {
21+
break
22+
}
23+
index = index + sz
24+
}
25+
return index
26+
}
27+
28+
func SplitLineIgnoreSpace(s string) []string {
29+
buf := bytes.NewBufferString(s)
30+
scan := bufio.NewScanner(buf)
31+
results := make([]string, 0)
32+
for scan.Scan() {
33+
lineText := scan.Text()
34+
lineTextBuf := bytes.NewBufferString(lineText)
35+
lineTextScan := bufio.NewScanner(lineTextBuf)
36+
lineTextScan.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
37+
if atEOF && len(data) == 0 {
38+
return 0, nil, nil
39+
}
40+
if i := bytes.IndexAny(data, " \t"); i >= 0 {
41+
ii := skipSpace(data, i+1)
42+
return ii, data[0:i], nil
43+
}
44+
if atEOF {
45+
return len(data), data, nil
46+
}
47+
return 0, nil, nil
48+
})
49+
50+
strBuilder := strings.Builder{}
51+
writeSpace := false
52+
total := 0
53+
for lineTextScan.Scan() {
54+
word := lineTextScan.Text()
55+
if writeSpace {
56+
strBuilder.WriteRune(' ')
57+
}
58+
n, err := strBuilder.WriteString(word)
59+
if err != nil {
60+
break
61+
}
62+
total += n
63+
writeSpace = total > 0
64+
}
65+
if total > 0 {
66+
results = append(results, strBuilder.String())
67+
}
68+
}
69+
return results
70+
}
71+
72+
func EqualStringIgnoreSpace(s1 string, s2 string) (bool, string) {
73+
arr1 := SplitLineIgnoreSpace(s1)
74+
arr2 := SplitLineIgnoreSpace(s2)
75+
if !cmp.Equal(arr1, arr2) {
76+
return false, cmp.Diff(arr1, arr2)
77+
}
78+
return true, ""
79+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
file FILE
2+
err Err
3+
4+
stdio
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
[{
2+
"mangle": "_ZN9INIReader12ValueHandlerEPvPKcS2_S2_",
3+
"c++": "INIReader::ValueHandler(void*, char const*, char const*, char const*)",
4+
"go": "(*Reader).ValueHandler"
5+
}, {
6+
"mangle": "_ZN9INIReader7MakeKeyERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_",
7+
"c++": "INIReader::MakeKey(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)",
8+
"go": "(*Reader).MakeKey"
9+
}, {
10+
"mangle": "_ZN9INIReaderC1EPKcm",
11+
"c++": "INIReader::INIReader(char const*, unsigned long)",
12+
"go": "(*Reader).Init__1"
13+
}, {
14+
"mangle": "_ZN9INIReaderC1ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE",
15+
"c++": "INIReader::INIReader(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)",
16+
"go": "(*Reader).Init"
17+
}, {
18+
"mangle": "_ZNK9INIReader10GetBooleanERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_b",
19+
"c++": "INIReader::GetBoolean(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, bool) const",
20+
"go": "(*Reader).GetBoolean"
21+
}, {
22+
"mangle": "_ZNK9INIReader10GetIntegerERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_l",
23+
"c++": "INIReader::GetInteger(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, long) const",
24+
"go": "(*Reader).GetInteger"
25+
}, {
26+
"mangle": "_ZNK9INIReader10HasSectionERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE",
27+
"c++": "INIReader::HasSection(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const",
28+
"go": "(*Reader).HasSection"
29+
}, {
30+
"mangle": "_ZNK9INIReader10ParseErrorEv",
31+
"c++": "INIReader::ParseError() const",
32+
"go": "(*Reader).ParseError"
33+
}, {
34+
"mangle": "_ZNK9INIReader11GetUnsignedERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_m",
35+
"c++": "INIReader::GetUnsigned(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, unsigned long) const",
36+
"go": "(*Reader).GetUnsigned"
37+
}, {
38+
"mangle": "_ZNK9INIReader12GetInteger64ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_x",
39+
"c++": "INIReader::GetInteger64(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, long long) const",
40+
"go": "(*Reader).GetInteger64"
41+
}, {
42+
"mangle": "_ZNK9INIReader13GetUnsigned64ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_y",
43+
"c++": "INIReader::GetUnsigned64(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, unsigned long long) const",
44+
"go": "(*Reader).GetUnsigned64"
45+
}, {
46+
"mangle": "_ZNK9INIReader3GetERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_",
47+
"c++": "INIReader::Get(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const",
48+
"go": "(*Reader).Get"
49+
}, {
50+
"mangle": "_ZNK9INIReader7GetRealERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_d",
51+
"c++": "INIReader::GetReal(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, double) const",
52+
"go": "(*Reader).GetReal"
53+
}, {
54+
"mangle": "_ZNK9INIReader8HasValueERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_",
55+
"c++": "INIReader::HasValue(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const",
56+
"go": "(*Reader).HasValue"
57+
}, {
58+
"mangle": "_ZNK9INIReader9GetStringERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_",
59+
"c++": "INIReader::GetString(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const",
60+
"go": "(*Reader).GetString"
61+
}]
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
[{
2+
: "_ZN9INIReader12ValueHandlerEPvPKcS2_S2_",
3+
"c++": "INIReader::ValueHandler(void*, char const*, char const*, char const*)",
4+
"go": "(*Reader).ValueHandler"
5+
}, {
6+
"mangle": "_ZN9INIReader7MakeKeyERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_",
7+
"c++": "INIReader::MakeKey(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)",
8+
"go": "(*Reader).MakeKey"
9+
}, {
10+
"mangle": "_ZN9INIReaderC1EPKcm",
11+
"c++": "INIReader::INIReader(char const*, unsigned long)",
12+
"go": "(*Reader).Init__1"
13+
}, {
14+
"mangle": "_ZN9INIReaderC1ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE",
15+
"c++": "INIReader::INIReader(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&)",
16+
"go": "(*Reader).Init"
17+
}, {
18+
"mangle": "_ZNK9INIReader10GetBooleanERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_b",
19+
"c++": "INIReader::GetBoolean(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, bool) const",
20+
"go": "(*Reader).GetBoolean"
21+
}, {
22+
"mangle": "_ZNK9INIReader10GetIntegerERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_l",
23+
"c++": "INIReader::GetInteger(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, long) const",
24+
"go": "(*Reader).GetInteger"
25+
}, {
26+
"mangle": "_ZNK9INIReader10HasSectionERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE",
27+
"c++": "INIReader::HasSection(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const",
28+
"go": "(*Reader).HasSection"
29+
}, {
30+
"mangle": "_ZNK9INIReader10ParseErrorEv",
31+
"c++": "INIReader::ParseError() const",
32+
"go": "(*Reader).ParseError"
33+
}, {
34+
"mangle": "_ZNK9INIReader11GetUnsignedERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_m",
35+
"c++": "INIReader::GetUnsigned(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, unsigned long) const",
36+
"go": "(*Reader).GetUnsigned"
37+
}, {
38+
"mangle": "_ZNK9INIReader12GetInteger64ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_x",
39+
"c++": "INIReader::GetInteger64(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, long long) const",
40+
"go": "(*Reader).GetInteger64"
41+
}, {
42+
"mangle": "_ZNK9INIReader13GetUnsigned64ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_y",
43+
"c++": "INIReader::GetUnsigned64(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, unsigned long long) const",
44+
"go": "(*Reader).GetUnsigned64"
45+
}, {
46+
"mangle": "_ZNK9INIReader3GetERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_",
47+
"c++": "INIReader::Get(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const",
48+
"go": "(*Reader).Get"
49+
}, {
50+
"mangle": "_ZNK9INIReader7GetRealERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_d",
51+
"c++": "INIReader::GetReal(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, double) const",
52+
"go": "(*Reader).GetReal"
53+
}, {
54+
"mangle": "_ZNK9INIReader8HasValueERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_",
55+
"c++": "INIReader::HasValue(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const",
56+
"go": "(*Reader).HasValue"
57+
}, {
58+
"mangle": "_ZNK9INIReader9GetStringERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES8_S8_",
59+
"c++": "INIReader::GetString(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const",
60+
"go": "(*Reader).GetString"
61+
}]

cmd/gogensig/config/conf.go

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package config
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"fmt"
7+
"io"
8+
"os"
9+
"os/exec"
10+
"path/filepath"
11+
"sort"
12+
"strings"
13+
14+
"github.com/goplus/llcppg/cmd/gogensig/unmarshal"
15+
cppgtypes "github.com/goplus/llcppg/types"
16+
)
17+
18+
// llcppg.cfg
19+
func GetCppgCfgFromPath(filePath string) (*cppgtypes.Config, error) {
20+
bytes, err := ReadFile(filePath)
21+
if err != nil {
22+
return nil, err
23+
}
24+
conf := &cppgtypes.Config{}
25+
err = json.Unmarshal(bytes, &conf)
26+
if err != nil {
27+
return nil, err
28+
}
29+
return conf, nil
30+
}
31+
32+
// llcppg.pub
33+
func GetPubFromPath(filePath string) (map[string]string, error) {
34+
return ReadPubFile(filePath)
35+
}
36+
37+
func GetCppgSigfetchFromByte(data []byte) (unmarshal.FileSet, error) {
38+
return unmarshal.UnmarshalFileSet(data)
39+
}
40+
41+
func SigfetchExtract(file string, isTemp bool, isCPP bool, dir string) ([]byte, error) {
42+
args := []string{"--extract", file}
43+
44+
if isTemp {
45+
args = append(args, "-temp=true")
46+
}
47+
48+
if isCPP {
49+
args = append(args, "-cpp=true")
50+
} else {
51+
args = append(args, "-cpp=false")
52+
}
53+
54+
return executeSigfetch(args, dir)
55+
}
56+
57+
func SigfetchConfig(configFile string, dir string) ([]byte, error) {
58+
args := []string{configFile}
59+
return executeSigfetch(args, dir)
60+
}
61+
62+
func executeSigfetch(args []string, dir string) ([]byte, error) {
63+
cmd := exec.Command("llcppsigfetch", args...)
64+
if dir != "" {
65+
cmd.Dir = dir
66+
}
67+
68+
var out bytes.Buffer
69+
var stderr bytes.Buffer
70+
cmd.Stdout = &out
71+
cmd.Stderr = &stderr
72+
73+
err := cmd.Run()
74+
if err != nil {
75+
return nil, fmt.Errorf("error running llcppsigfetch: %v\nStderr: %s\nArgs: %s", err, stderr.String(), strings.Join(args, " "))
76+
}
77+
78+
return out.Bytes(), nil
79+
}
80+
81+
func ReadFile(filePath string) ([]byte, error) {
82+
jsonFile, err := os.Open(filePath)
83+
if err != nil {
84+
return nil, err
85+
}
86+
defer jsonFile.Close()
87+
return io.ReadAll(jsonFile)
88+
}
89+
90+
func ReadPubFile(pubfile string) (ret map[string]string, err error) {
91+
b, err := os.ReadFile(pubfile)
92+
if err != nil {
93+
if os.IsNotExist(err) {
94+
return make(map[string]string), nil
95+
}
96+
return
97+
}
98+
99+
text := string(b)
100+
lines := strings.Split(text, "\n")
101+
ret = make(map[string]string, len(lines))
102+
for i, line := range lines {
103+
flds := strings.Fields(line)
104+
goName := ""
105+
switch len(flds) {
106+
case 1:
107+
case 2:
108+
goName = flds[1]
109+
case 0:
110+
continue
111+
default:
112+
err = fmt.Errorf("%s:%d: too many fields", pubfile, i+1)
113+
return
114+
}
115+
ret[flds[0]] = goName
116+
}
117+
return
118+
}
119+
120+
func WritePubFile(file string, public map[string]string) (err error) {
121+
if len(public) == 0 {
122+
return
123+
}
124+
f, err := os.Create(file)
125+
if err != nil {
126+
return
127+
}
128+
defer f.Close()
129+
ret := make([]string, 0, len(public))
130+
for name, goName := range public {
131+
if goName == "" {
132+
ret = append(ret, name)
133+
} else {
134+
ret = append(ret, name+" "+goName)
135+
}
136+
}
137+
sort.Strings(ret)
138+
_, err = f.WriteString(strings.Join(ret, "\n"))
139+
return
140+
}
141+
142+
func RunCommand(dir, cmdName string, args ...string) error {
143+
execCmd := exec.Command(cmdName, args...)
144+
execCmd.Stdout = os.Stdout
145+
execCmd.Stderr = os.Stderr
146+
execCmd.Dir = dir
147+
return execCmd.Run()
148+
}
149+
150+
func CreateJSONFile(filename string, data interface{}) (string, error) {
151+
filePath := filepath.Join(os.TempDir(), filename)
152+
file, err := os.Create(filePath)
153+
if err != nil {
154+
return "", err
155+
}
156+
defer file.Close()
157+
encoder := json.NewEncoder(file)
158+
encoder.SetIndent("", " ")
159+
return filePath, encoder.Encode(data)
160+
}

0 commit comments

Comments
 (0)