Skip to content

Commit 86e8fad

Browse files
committed
Impl strings2Chars, Strings2Chars
1 parent ed12dcb commit 86e8fad

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

ruby/wrapper.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,48 @@ func char2String(char *C.char) string {
5757
return unsafe.String((*byte)(unsafe.Pointer(char)), C.strlen(char))
5858
}
5959

60+
// Strings2Chars convert from Go strings to **[Char]
61+
//
62+
// 2nd return value is a function to free pointer.
63+
// To prevent memory leaks, this function MUST always be called with `defer` when calling this function.
64+
//
65+
// Example
66+
//
67+
// chars, clean := ruby.Strings2Chars([]string{"ABCD"})
68+
// defer clean()
69+
func Strings2Chars(strs []string) (**Char, func()) {
70+
chars, clean := strings2Chars(strs)
71+
return (**Char)(unsafe.Pointer(chars)), clean
72+
}
73+
74+
// strings2Chars convert from Go strings to `**C.char`. (for internal use within package)
75+
//
76+
// 2nd return value is a function to free pointer.
77+
// To prevent memory leaks, this function MUST always be called with `defer` when calling this function.
78+
//
79+
// Example
80+
//
81+
// chars, clean := strings2Chars([]string{"ABCD"})
82+
// defer clean()
83+
func strings2Chars(strs []string) (**C.char, func()) {
84+
chars := make([]*C.char, len(strs))
85+
var cleanChars []func()
86+
87+
for i, str := range strs {
88+
char, clean := string2Char(str)
89+
chars[i] = char
90+
cleanChars = append(cleanChars, clean)
91+
}
92+
93+
clean := func() {
94+
for _, cleanChar := range cleanChars {
95+
cleanChar()
96+
}
97+
}
98+
99+
return (**C.char)(unsafe.Pointer(&chars[0])), clean
100+
}
101+
60102
// Value2String convert from [VALUE] to Go string
61103
func Value2String(str VALUE) string {
62104
return value2String(C.VALUE(str))

0 commit comments

Comments
 (0)