@define printtype(t){ @local i, fld, flds, sz, off; if(issu(t)){ printf("%s %s {\n", suekind(t), suetag(t)); flds = fields(t); for(i = 0; i < length(flds); i++){ @local ft, id; fld = vecref(flds, i); off = fieldoff(fld); ft = fieldtype(fld); id = fieldid(fld); if(isnil(off)){ printf("\t"); printf("\t%t;\n", fld); }else if(isbitfield(ft)){ printf("\t@@(8*0x%x+%x)", off, bitfieldpos(ft)); printf("\t%t %s : %d\n", bitfieldcontainer(ft), id, bitfieldwidth(ft)); }else{ printf("\t@0x%x", off); printf("\t%t;\n", fld); } } sz = susize(t); if(!isnil(sz)) printf("\t@0x%x;\n", sz); printf("};\n"); }else if(istypedef(t)) printf("typedef %t %s;\n", typedeftype(t), typedefid(t)); else if(isenum(t)){ @local ens; printf("%s %s {\n", suekind(t), suetag(t)); ens = enumconsts(t); for(i = 0; i < length(ens); i++){ @local en; en = vecref(ens, i); printf("\t%s = %d,\n", vecref(en, 0), vecref(en, 1)); } printf("};\n"); } }; @define foo(){ @local ns, vec, i, dom, p; ns = @names c32le { struct foo { @0x00 void *x; @0x28; }; @0x100 struct foo x; @0x200 void p; }; vec = tabvals(ns.enumtype()); vec = sort(vec, typenamecmp); for(i = 0; i < length(vec); i++) printtype(vecref(vec, i)); dom = mkdom(ns, mknas()); p = &dom`x; printf("sizeof(p->x) = %d\n", sizeof(p->x)); printf("typeof(p->x) = %t\n", @typeof(p->x)); p = &dom`p; printf("sizeof(p) = %d\n", sizeof(p)); printf("typeof(p) = %t\n", @typeof(p)); printf("typeof(*p) = %t\n", @typeof(*p)); }; foo();