in go/genwrap.go [334:407]
func mapType(ctype string) (g genType) {
g.Ctype = "C." + strings.Trim(ctype, " \n")
// Special-case mappings for C types, default: is the general wrapper type case.
switch g.Ctype {
case "C.void":
g.Gotype = ""
case "C.size_t":
g.Gotype = "uint"
case "C.int":
g.Gotype = "int"
case "C.void *":
g.Gotype = "unsafe.Pointer"
g.Ctype = "unsafe.Pointer"
case "C.bool":
g.Gotype = "bool"
case "C.ssize_t":
g.Gotype = "int"
case "C.int64_t":
g.Gotype = "int64"
case "C.int32_t":
g.Gotype = "int16"
case "C.int16_t":
g.Gotype = "int32"
case "C.uint64_t":
g.Gotype = "uint64"
case "C.uint32_t":
g.Gotype = "uint16"
case "C.uint16_t":
g.Gotype = "uint32"
case "C.const char *":
fallthrough
case "C.char *":
g.Gotype = "string"
g.Ctype = "C.CString"
g.ToC = func(v string) string { return fmt.Sprintf("%sC", v) }
g.Assign = func(v string) string {
return fmt.Sprintf("%sC := C.CString(%s)\n defer C.free(unsafe.Pointer(%sC))\n", v, v, v)
}
case "C.pn_seconds_t":
g.Gotype = "time.Duration"
g.ToGo = func(v string) string { return fmt.Sprintf("(time.Duration(%s) * time.Second)", v) }
g.ToC = func(v string) string { return fmt.Sprintf("C.pn_seconds_t(%s/time.Second)", v) }
case "C.pn_millis_t":
g.Gotype = "time.Duration"
g.ToGo = func(v string) string { return fmt.Sprintf("(time.Duration(%s) * time.Millisecond)", v) }
g.ToC = func(v string) string { return fmt.Sprintf("C.pn_millis_t(%s/time.Millisecond)", v) }
case "C.pn_timestamp_t":
g.Gotype = "time.Time"
g.ToC = func(v string) string { return fmt.Sprintf("pnTime(%s)", v) }
g.ToGo = func(v string) string { return fmt.Sprintf("goTime(%s)", v) }
case "C.pn_error_t *":
g.Gotype = "error"
g.ToGo = func(v string) string { return fmt.Sprintf("PnError(%s)", v) }
default:
pnId := regexp.MustCompile(" *pn_([a-z_]+)_t *\\*? *")
match := pnId.FindStringSubmatch(g.Ctype)
if match == nil {
panic(fmt.Errorf("unknown C type %#v", g.Ctype))
}
g.Gotype = mixedCase(match[1])
if !simpleType[g.Gotype] {
g.ToGo = g.goLiteral
g.ToC = func(v string) string { return v + ".pn" }
}
}
if g.ToGo == nil {
g.ToGo = g.goConvert // Use conversion by default.
}
if g.ToC == nil {
g.ToC = func(v string) string { return fmt.Sprintf("%s(%s)", g.Ctype, v) }
}
return
}