github.com/searKing/golang/go@v1.2.74/unsafe/translator.go (about)

     1  // Copyright 2020 The searKing Author. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package unsafe
     6  
     7  // #include <stdlib.h>
     8  //enum {
     9  //	sizeofPtr = sizeof(void*),
    10  //};
    11  import "C"
    12  import (
    13  	"reflect"
    14  	"unsafe"
    15  )
    16  
    17  // CStringArray You can write as this directly.
    18  //	// []string -> [](*C.char)
    19  // 	var strs []string
    20  //	cCharArray := make([]*C.char, 0, len(strs))
    21  //	for _, s := range strs {
    22  //		char := (*C.char)(unsafe.Pointer(C.CString(s)))
    23  //		cCharArray = append(cCharArray, char)
    24  //		defer C.free(unsafe.Pointer(char)) //ι‡Šζ”Ύε†…ε­˜
    25  //	}
    26  //	var cstr **C.char
    27  // 	var cstrSize C.int
    28  //	cstr = (**C.char)(unsafe.Pointer(&cCharArray[0]))
    29  //	cstrSize =  C.int(len(strs))
    30  func CStringArray(strs ...string) (**C.char, C.int) {
    31  	// []string -> [](*C.char)
    32  	totalLen := len(strs) * C.sizeofPtr
    33  	for _, s := range strs {
    34  		totalLen += len(s)
    35  	}
    36  	cCharArrayBuf := C.malloc(C.size_t(totalLen))
    37  	cCharArray := make([]*C.char, 0, len(strs))
    38  	for _, s := range strs {
    39  		cCharArray = append(cCharArray, (*C.char)(unsafe.Pointer(C.CString(s))))
    40  	}
    41  	//return (**C.char)(unsafe.Pointer(&cCharArray[0])), C.int(len(strs))
    42  	return (**C.char)(unsafe.Pointer(cCharArrayBuf)), C.int(len(strs))
    43  }
    44  
    45  // GoStringArray char** -> []string
    46  func GoStringArray(strArray unsafe.Pointer, n int) []string {
    47  	// char** -> [](C.*char)
    48  	cCharArray := make([]*C.char, n)
    49  	header := (*reflect.SliceHeader)(unsafe.Pointer(&cCharArray))
    50  	header.Cap = n
    51  	header.Len = n
    52  	header.Data = uintptr(strArray)
    53  
    54  	// [](C.*char) -> []string
    55  	strs := make([]string, 0, n)
    56  	for _, s := range cCharArray {
    57  		strs = append(strs, C.GoString(s))
    58  	}
    59  	return strs
    60  }
    61  
    62  //// []unsafe.Pointer -> ** unsafe.Pointer
    63  //func CPointerArray(strs []unsafe.Pointer) (*unsafe.Pointer, C.int) {
    64  //	return (*unsafe.Pointer)(unsafe.Pointer(&strs[0])), C.int(len(strs))
    65  //}
    66  //
    67  //// char** -> []interface{}
    68  //func GoPointerArray(pointerArray *unsafe.Pointer, n int) []unsafe.Pointer {
    69  //	cPointerArray := make([]unsafe.Pointer, n)
    70  //	header := (*reflect.SliceHeader)(unsafe.Pointer(&cPointerArray))
    71  //	header.Cap = n
    72  //	header.Len = n
    73  //	header.Data = uintptr(unsafe.Pointer(pointerArray))
    74  //	return cPointerArray
    75  //}
    76  //
    77  //func CAnyArray(strs []interface{}) (*unsafe.Pointer, C.int) {
    78  //	return (*unsafe.Pointer)(unsafe.Pointer(&strs[0])), C.int(len(strs))
    79  //}
    80  //
    81  //// char** -> []interface{}
    82  //func GoAnyArray(anyArray *unsafe.Pointer, n int) []interface{} {
    83  //	cAnyArray := make([]interface{}, n)
    84  //	header := (*reflect.SliceHeader)(unsafe.Pointer(&cAnyArray))
    85  //	header.Cap = n
    86  //	header.Len = n
    87  //	header.Data = uintptr(unsafe.Pointer(anyArray))
    88  //	return cAnyArray
    89  //}