On Sun, Aug 5, 2018 at 12:29 PM nicolas_boiteux via golang-nuts <
golang-nuts@googlegroups.com> wrote:

> it returns :
>
> .\armago_x64.go:19: cannot convert p (type **_Ctype_char) to type uintptr

Ok, this time bit more tested

jnml@4670:~/tmp> cat main.c
#include <stdio.h>

int main(int argc, char **argv) {
char **p;
for (p = argv; *p != 0; p++) {
printf("%s\n", *p);
}
}
jnml@4670:~/tmp> ccgo main.c && ./a.out abc def ghi
./a.out
abc
def
ghi
jnml@4670:~/tmp> ccgo -o main.go main.c
jnml@4670:~/tmp> cat main.go
// Code generated by 'ccgo -o main.go main.c', DO NOT EDIT.

// +build linux,amd64

package main

import (
"math"
"os"
"unsafe"

"github.com/cznic/crt"
)

const (
null = uintptr(0)
)

var (
_ = math.Pi
_ = os.DevNull
_ = unsafe.Pointer(null)

nz32 float32
nz64 float64
)

func init() { nz32 = -nz32 }
func init() { nz64 = -nz64 }

func alloca(p *[]uintptr, n int) uintptr   { r := crt.MustMalloc(n); *p =
append(*p, r); return r }
func preinc(p *uintptr, n uintptr) uintptr { *p += n; return *p }

func main() {
psz := unsafe.Sizeof(uintptr(0))
argv := crt.MustCalloc((len(os.Args) + 1) * int(psz))
p := argv
for _, v := range os.Args {
*(*uintptr)(unsafe.Pointer(p)) = crt.CString(v)
p += psz
}
a := os.Environ()
env := crt.MustCalloc((len(a) + 1) * int(psz))
p = env
for _, v := range a {
*(*uintptr)(unsafe.Pointer(p)) = crt.CString(v)
p += psz
}
*(*uintptr)(unsafe.Pointer(Xenviron)) = env
X_start(crt.NewTLS(), int32(len(os.Args)), argv)
}

// linking main.o

// X__ccgo_va_end *void, escapes: true, builtin.h:36:6
var X__ccgo_va_end = bss + 0

// X__ccgo_va_start *void, escapes: true, builtin.h:37:6
var X__ccgo_va_start = bss + 8

// Xmain is defined at main.c:3:5
func Xmain(tls crt.TLS, _argc int32, _argv uintptr /* **int8 */) (r int32) {
var _p uintptr // **int8

_p = _argv
_1:
if (*(*uintptr)(unsafe.Pointer(_p))) == 0 {
goto _3
}

crt.Xprintf(tls, ts+0 /* "%s\n" */, *(*uintptr)(unsafe.Pointer(_p)))
_p += 8
goto _1

_3:
return r
}

// linking crt0.o

// X__stdfiles [3]uintptr, escapes: true, crt0.c:3:15
var X__stdfiles = bss + 16

// Xenviron **int8, escapes: true, crt0.c:4:6
var Xenviron = bss + 40

// Xstdin *void, escapes: true, crt0.c:5:6
var Xstdin = bss + 48 // pointer to void

func init() { *(*uintptr)(unsafe.Pointer(Xstdin)) = X__stdfiles }

// Xstdout *void, escapes: true, crt0.c:5:31
var Xstdout = bss + 56 // pointer to void

func init() { *(*uintptr)(unsafe.Pointer(Xstdout)) = X__stdfiles + 8 }

// Xstderr *void, escapes: true, crt0.c:5:57
var Xstderr = bss + 64 // pointer to void

func init() { *(*uintptr)(unsafe.Pointer(Xstderr)) = X__stdfiles + 16 }

// X_start is defined at crt0.c:7:6
func X_start(tls crt.TLS, _argc int32, _argv uintptr /* **int8 */) {
crt.X__register_stdfiles(tls, *(*uintptr)(unsafe.Pointer(Xstdin)),
*(*uintptr)(unsafe.Pointer(Xstdout)), *(*uintptr)(unsafe.Pointer(Xstderr)),
Xenviron)
crt.X__builtin_exit(tls, Xmain(tls, _argc, _argv))
}

func init() { *(*uintptr)(unsafe.Pointer(Xstdin)) = X__stdfiles }

func init() { *(*uintptr)(unsafe.Pointer(Xstdout)) = X__stdfiles + 8 }

func init() { *(*uintptr)(unsafe.Pointer(Xstderr)) = X__stdfiles + 16 }

var (
bss     = crt.BSS(&bssInit[0])
bssInit [72]byte
ts      = crt.TS("%s\n\x00")
)
jnml@4670:~/tmp>

I hope you can extract the code for your case from the above mechanically
produced Go code. Note that ccgo uses untrptrs instead of normal pointers
but that should be an easy adjustment, I hope.

-- 

-j

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to