forked from airbusgeo/godal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcgo_helpers.go
79 lines (70 loc) · 1.81 KB
/
cgo_helpers.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
// Copyright 2021 Airbus Defence and Space
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package godal
//#include <stdlib.h>
import "C"
import "unsafe"
func cIntArray(in []int) *C.int {
ret := make([]C.int, len(in))
for i := range in {
ret[i] = C.int(in[i])
}
return (*C.int)(unsafe.Pointer(&ret[0]))
}
func cDoubleArray(in []float64) *C.double {
ret := make([]C.double, len(in))
for i := range in {
ret[i] = C.double(in[i])
}
return (*C.double)(unsafe.Pointer(&ret[0]))
}
type cStringArray []*C.char
func (ca cStringArray) free() {
for _, str := range ca {
C.free(unsafe.Pointer(str))
}
}
func (ca cStringArray) cPointer() **C.char {
if len(ca) <= 1 { //nil terminated, must be at least len==2 to be not empty
return nil
}
return (**C.char)(unsafe.Pointer(&ca[0]))
}
func sliceToCStringArray(in []string) cStringArray {
if len(in) > 0 {
arr := make([]*C.char, len(in)+1)
for i := range in {
arr[i] = C.CString(in[i])
}
arr[len(in)] = nil
return arr
}
return nil
}
func cStringArrayToSlice(in **C.char) []string {
if in == nil {
return nil
}
//https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices
cStrs := (*[1 << 30]*C.char)(unsafe.Pointer(in))
i := 0
ret := []string{}
for {
if cStrs[i] == nil {
return ret
}
ret = append(ret, C.GoString(cStrs[i]))
i++
}
}