func zeroFor(targ *cc.Type) *cc.Expr { if targ != nil { k := targ.Def().Kind switch k { case c2go.String: return &cc.Expr{Op: cc.String, Texts: []string{`""`}} case c2go.Slice, cc.Ptr: return &cc.Expr{Op: cc.Name, Text: "nil"} case cc.Struct, cc.Array: return &cc.Expr{Op: cc.CastInit, Type: targ, Init: &cc.Init{}} case c2go.Bool: return &cc.Expr{Op: cc.Name, Text: "false"} } if c2go.Int8 <= k && k <= c2go.Float64 { return &cc.Expr{Op: cc.Number, Text: "0"} } return &cc.Expr{Op: cc.Number, Text: "0 /*" + targ.String() + "*/"} } return &cc.Expr{Op: cc.Number, Text: "0 /*untyped*/"} }
func (p *Printer) printType(t *cc.Type) { if t == nil { p.Print("<nil type>") return } // Shouldn't happen but handle in case it does. p.Print(t.Comments.Before) defer p.Print(t.Comments.Suffix, t.Comments.After) if t == cc.BoolType { p.Print("bool") return } if typemap[t.Kind] != "" { p.Print(typemap[t.Kind]) return } switch t.Kind { default: p.Print("C.", t.String()) // hope for the best case Slice: p.Print("[]", t.Base) case String: p.Print("string") case cc.Struct: if len(t.Decls) == 0 { p.Print("struct{}") break } p.Print("struct {", Indent) p.printStructBody(t) p.Print(Unindent, Newline, "}") case cc.Enum: if t.Tag != "" { p.Print(t.Tag) } else { p.Print("int") } case cc.TypedefType: if t.Base != nil && typemap[t.Base.Kind] != "" && strings.ToLower(t.Name) == t.Name { p.Print(typemap[t.Base.Kind]) return } if t.TypeDecl != nil && t.TypeDecl.GoPackage != "" && p.Package != "" && t.TypeDecl.GoPackage != p.Package { p.Print(path.Base(t.TypeDecl.GoPackage) + "." + t.Name) break } p.Print(t.Name) case cc.Ptr: if t.Base.Is(cc.Func) { p.Print(t.Base) return } if t.Base.Is(cc.Void) { p.Print("*[0]byte") return } p.Print("*", t.Base) case cc.Func: p.Print("func(") for i, arg := range t.Decls { if i > 0 { p.Print(", ") } if arg.Name == "..." { p.Print("...interface{}") continue } if arg.Name == "" && arg.Type.Is(cc.Void) { continue } p.Print(arg.Type) } p.Print(")") if !t.Base.Is(cc.Void) { p.Print(" ", t.Base) } case cc.Array: if t.Width == nil { p.Print("[XXX]", t.Base) return } p.Print("[", t.Width, "]", t.Base) } }