@@ -57,6 +57,48 @@ func char2String(char *C.char) string {
57
57
return unsafe .String ((* byte )(unsafe .Pointer (char )), C .strlen (char ))
58
58
}
59
59
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
+
60
102
// Value2String convert from [VALUE] to Go string
61
103
func Value2String (str VALUE ) string {
62
104
return value2String (C .VALUE (str ))
0 commit comments