size_t DisplayTypeDecl(FILE *fp, TypeDecl *typeDecl, int indent) { Type *type; size_t len = 0; size_t i; bool padtype = typeDecl->declList.size() ? true : false; DisplayTags(fp, typeDecl->tagList); DisplayWhitespace(fp, &typeDecl->tagRef); if(typeDecl->typeAlias) fprintf(fp, "typedef "); len += RecurseDisplayType(fp, typeDecl, typeDecl->baseType, indent, padtype && typeDecl->nested); // display each variable-decl for(i = 0; i < typeDecl->declList.size(); i++) { len += fprintf(fp, " "); type = typeDecl->declList[i]; Type *restore = BreakLink(type, typeDecl->baseType); type = InvertType(type); len += RecurseDisplayType(fp, typeDecl, type, indent, false); if(i < typeDecl->declList.size() - 1) len += fprintf(fp, ","); type = InvertType(type); RestoreLink(restore, typeDecl->baseType); } return len; }
void RenderType(TCHAR *buf, int len, Type *type) { stringprint sbuf(buf, len); Type *restore = 0; Type *tptr; for(tptr = type; tptr; tptr = tptr->link) { if(tptr->ty == typeTYPEDEF) { tptr = tptr->link; restore = BreakLink(type, tptr); break; } } type = InvertType(type); RecurseRenderType(sbuf, type); type = InvertType(type); if(restore) RestoreLink(restore, tptr); }