123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- package al
- import "C"
- import "unsafe"
- import "runtime"
- import "fmt"
- func malloc(size int) unsafe.Pointer {
- return (unsafe.Pointer(C.calloc(C.size_t(size), C.size_t(1))))
- }
- func free(ptr unsafe.Pointer) {
- C.free(ptr)
- }
- func cstrNew(size int) *C.char {
- return (*C.char)(malloc((size)))
- }
- func cstrFree(self *C.char) {
- free(unsafe.Pointer(self))
- }
- func cstr(self string) *C.char {
- return C.CString(self)
- }
- func gostr(cstr *C.char) string {
- return C.GoString(cstr)
- }
- func cintptr(ptr *int) *C.int {
- return (*C.int)(unsafe.Pointer(ptr))
- }
- func i2b(res int) bool {
- if res != 0 {
- return true
- }
- return false
- }
- func b2i(res bool) int {
- if res {
- return 1
- }
- return 0
- }
- type Destroyer interface {
- Destroy()
- }
- func SelfDestruct(self Destroyer) {
- if self == nil {
- return
- }
- clean := func(me Destroyer) {
- fmt.Printf("Finalizing %#v.\n", me)
- me.Destroy()
- }
- runtime.SetFinalizer(self, clean)
- }
- func cf(f float32) C.float {
- return C.float(f)
- }
- func ci(f int) C.int {
- return C.int(f)
- }
- func cd(f float64) C.double {
- return C.double(f)
- }
- func cui16(f int) C.uint16_t {
- return C.uint16_t(f)
- }
- func GoStrings(argc C.int, argv **C.char) []string {
- length := int(argc)
- tmpslice := (*[1 << 30]*C.char)(unsafe.Pointer(argv))[:length:length]
- gostrings := make([]string, length)
- for i, s := range tmpslice {
- gostrings[i] = C.GoString(s)
- }
- return gostrings
- }
- func CStrings(args []string) (argc C.int, argv **C.char) {
- length := len(args)
- argv = (**C.char)(malloc(length * int(unsafe.Sizeof(*argv))))
- tmpslice := (*[1 << 30]*C.char)(unsafe.Pointer(argv))[:length:length]
- for i, s := range args {
- tmpslice[i] = cstr(s)
- }
- argc = C.int(length)
- return argc, argv
- }
- func CStringsFree(argc C.int, argv **C.char) {
- length := int(argc)
- tmpslice := (*[1 << 30]*C.char)(unsafe.Pointer(argv))[:length:length]
- for _, s := range tmpslice {
- cstrFree(s)
- }
- free(unsafe.Pointer(argv))
- }
|