void typenumptr(char *buf, TYPE *tp) { char bf[256], *p = bf; p = putpointer(p, tp); tp = enumConst(buf, tp->btp); while (ispointer(tp)) { p = putpointer(p, tp); tp = enumConst(buf, tp->btp); // tp = tp->btp; } typenum(buf, tp); strcat(buf, bf); }
TYPE *typenum(char *buf, TYPE *tp) { SYMBOL *sp; HASHREC *hr; char name[100]; if (tp == NULL) { diag("typenum - NULL type"); return &stdvoid; } tp = enumConst(buf, tp); buf += strlen(buf); switch (tp->type) { case bt_typedef: strcpy(buf, tp->sp->name); break; case bt_aggregate: hr = tp->syms->table[0]; sp = (SYMBOL *)hr->p; if (hr->next || !strcmp(sp->name, tp->sp->name)) // the tail is to prevent a problem when there are a lot of errors { strcpy(buf," (*)(???)"); break; } tp = sp->tp; /* fall through */ case bt_func: case bt_ifunc: typenum(buf, tp->btp); buf = buf + strlen(buf); strcat(buf," (*)("); buf += strlen(buf); if (tp->syms) { hr = tp->syms->table[0]; while (hr) { sp = (SYMBOL *)hr->p; *buf = 0; typenum(buf, sp->tp); buf = buf + strlen(buf); hr = hr->next; if (hr) *buf++ = ','; } } *buf++ = ')'; *buf = 0; break; case bt_float_complex: strcpy(buf, tn_floatcomplex); break; case bt_double_complex: strcpy(buf, tn_doublecomplex); break; case bt_long_double_complex: strcpy(buf, tn_longdoublecomplex); break; case bt_float_imaginary: strcpy(buf, tn_floatimaginary); break; case bt_double_imaginary: strcpy(buf, tn_doubleimaginary); break; case bt_long_double_imaginary: strcpy(buf, tn_longdoubleimaginary); break; case bt_float: strcpy(buf, tn_float); break; case bt_double: strcpy(buf, tn_double); break; case bt_long_double: strcpy(buf, tn_longdouble); break; case bt_unsigned: strcpy(buf, tn_unsigned); buf = buf + strlen(buf); case bt_int: strcpy(buf, tn_int); break; case bt_char16_t: strcpy(buf, tn_char16_t); break; case bt_char32_t: strcpy(buf, tn_char32_t); break; case bt_unsigned_long_long: strcpy(buf, tn_unsigned); buf = buf + strlen(buf); case bt_long_long: strcpy(buf, tn_longlong); break; case bt_unsigned_long: strcpy(buf, tn_unsigned); buf = buf + strlen(buf); case bt_long: strcpy(buf, tn_long); break; case bt_wchar_t: strcpy(buf, tn_wchar_t); break; case bt_unsigned_short: strcpy(buf, tn_unsigned); buf = buf + strlen(buf); case bt_short: strcpy(buf, tn_short); break; case bt_unsigned_char: strcpy(buf, tn_unsigned); buf = buf + strlen(buf); case bt_char: strcpy(buf, tn_char); break; case bt_bool: strcpy(buf, "bool"); break; case bt_bit: strcpy(buf, "bit"); break; case bt_void: strcpy(buf, tn_void); break; case bt_pointer: typenumptr(buf, tp); break; case bt_memberptr: getcls(buf, tp->sp); buf += strlen(buf); strcpy(buf, "::*"); break; case bt_seg: typenum(buf, tp->btp); buf += strlen(buf); strcpy(buf, " _seg *"); break; case bt_lref: typenum(buf, tp->btp); buf += strlen(buf); *buf++ = ' '; *buf++ = '&'; *buf = 0; break; case bt_rref: typenum(buf, tp->btp); buf += strlen(buf); *buf++ = ' '; *buf++ = '&'; *buf++ = '&'; *buf = 0; break; case bt_ellipse: strcpy(buf, tn_ellipse); break; case bt_any: strcpy(buf, "???"); break; case bt_class: /* strcpy(buf, tn_class); */ unmangle(name, tp->sp->errname); strcpy(buf, name); break; case bt_struct: /* strcpy(buf, tn_struct); */ unmangle(name, tp->sp->errname); strcpy(buf, name); break; case bt_union: /* strcpy(buf, tn_union); */ unmangle(name, tp->sp->errname); strcpy(buf, name); break; case bt_enum: /* strcpy(buf, tn_enum); */ unmangle(name, tp->sp->errname); strcpy(buf, name); break; } return 0; }
TYPE *typenum(char *buf, TYPE *tp) { SYMBOL *sp; HASHREC *hr; char name[4096]; if (tp == NULL) { diag("typenum - NULL type"); return &stdvoid; } if (tp->type == bt_derivedfromtemplate) tp = tp->btp; tp = enumConst(buf, tp); if (!tp) return NULL; buf += strlen(buf); switch (tp->type) { case bt_typedef: strcpy(buf, tp->sp->name); break; case bt_aggregate: if (!tp->syms) break; hr = tp->syms->table[0]; sp = (SYMBOL *)hr->p; if (hr->next || !strcmp(sp->name, tp->sp->name)) // the tail is to prevent a problem when there are a lot of errors { strcpy(buf," (*)(\?\?\?)"); break; } tp = sp->tp; /* fall through */ case bt_func: case bt_ifunc: typenum(buf, tp->btp); buf = buf + strlen(buf); if (tp->syms) { hr = tp->syms->table[0]; if (hr && hr->p) { if (((SYMBOL *)hr->p)->thisPtr) { SYMBOL *thisptr = (SYMBOL *)hr->p; *buf++ = ' '; *buf++='('; getcls(buf, basetype (basetype(thisptr->tp)->btp)->sp); strcat(buf, "::*)("); buf += strlen(buf); hr = hr->next; } else { strcat(buf," (*)("); buf += strlen(buf); } } else { strcat(buf," (*)("); buf += strlen(buf); } while (hr) { sp = (SYMBOL *)hr->p; *buf = 0; typenum(buf, sp->tp); buf = buf + strlen(buf); hr = hr->next; if (hr) *buf++ = ','; } } else { strcat(buf," (*)("); buf += strlen(buf); } *buf++ = ')'; *buf = 0; break; case bt_float_complex: strcpy(buf, tn_floatcomplex); break; case bt_double_complex: strcpy(buf, tn_doublecomplex); break; case bt_long_double_complex: strcpy(buf, tn_longdoublecomplex); break; case bt_float_imaginary: strcpy(buf, tn_floatimaginary); break; case bt_double_imaginary: strcpy(buf, tn_doubleimaginary); break; case bt_long_double_imaginary: strcpy(buf, tn_longdoubleimaginary); break; case bt_float: strcpy(buf, tn_float); break; case bt_double: strcpy(buf, tn_double); break; case bt_long_double: strcpy(buf, tn_longdouble); break; case bt_unsigned: strcpy(buf, tn_unsigned); buf = buf + strlen(buf); case bt_int: strcpy(buf, tn_int); break; case bt_char16_t: strcpy(buf, tn_char16_t); break; case bt_char32_t: strcpy(buf, tn_char32_t); break; case bt_unsigned_long_long: strcpy(buf, tn_unsigned); buf = buf + strlen(buf); case bt_long_long: strcpy(buf, tn_longlong); break; case bt_unsigned_long: strcpy(buf, tn_unsigned); buf = buf + strlen(buf); case bt_long: strcpy(buf, tn_long); break; case bt_wchar_t: strcpy(buf, tn_wchar_t); break; case bt_unsigned_short: strcpy(buf, tn_unsigned); buf = buf + strlen(buf); case bt_short: strcpy(buf, tn_short); break; case bt_signed_char: strcpy(buf, tn_signed); buf = buf + strlen(buf); strcpy(buf, tn_char); break; case bt_unsigned_char: strcpy(buf, tn_unsigned); buf = buf + strlen(buf); case bt_char: strcpy(buf, tn_char); break; case bt_bool: strcpy(buf, tn_bool); break; case bt_bit: strcpy(buf, "bit"); break; case bt_void: strcpy(buf, tn_void); break; case bt_pointer: if (tp->nullptrType) { strcpy(buf, "nullptr_t"); } else { typenumptr(buf, tp); } break; case bt_memberptr: if (isfunction(basetype(tp)->btp)) { TYPE *func = basetype(tp)->btp; typenum(buf, basetype(func)->btp); strcat(buf, " ("); buf += strlen(buf); getcls(buf, tp->sp); buf += strlen(buf); strcpy(buf, "::*)("); buf += strlen(buf); if (basetype(func)->syms) { hr = basetype(func)->syms->table[0]; while (hr) { sp = (SYMBOL *)hr->p; *buf = 0; typenum(buf, sp->tp); buf = buf + strlen(buf); hr = hr->next; if (hr) *buf++ = ','; } } *buf++ = ')'; *buf = 0; } else { typenum(buf, tp->btp); strcat(buf, " "); buf += strlen(buf); getcls(buf, tp->sp); buf += strlen(buf); strcpy(buf, "::*"); } break; case bt_seg: typenum(buf, tp->btp); buf += strlen(buf); strcpy(buf, " _seg *"); break; case bt_lref: typenum(buf, tp->btp); buf += strlen(buf); *buf++ = ' '; *buf++ = '&'; *buf = 0; break; case bt_rref: typenum(buf, tp->btp); buf += strlen(buf); *buf++ = ' '; *buf++ = '&'; *buf++ = '&'; *buf = 0; break; case bt_ellipse: strcpy(buf, tn_ellipse); break; case bt_any: strcpy(buf, "???"); break; case bt_class: /* strcpy(buf, tn_class); */ unmangle(name, tp->sp->errname ? tp->sp->errname : tp->sp->name); strcpy(buf, name); break; case bt_struct: /* strcpy(buf, tn_struct); */ unmangle(name, tp->sp->errname ? tp->sp->errname : tp->sp->name); strcpy(buf, name); break; case bt_union: /* strcpy(buf, tn_union); */ unmangle(name, tp->sp->errname ? tp->sp->errname : tp->sp->name); strcpy(buf, name); break; case bt_enum: /* strcpy(buf, tn_enum); */ unmangle(name, tp->sp->errname ? tp->sp->errname : tp->sp->name); strcpy(buf, name); break; case bt_templateselector: { TEMPLATESELECTOR *ts = tp->sp->templateSelector->next; if (ts->sym) { strcpy(buf, ts->sym->name); ts = ts->next; while (ts) { strcat(buf, "::"); strcat(buf, ts->name); ts = ts->next; } } break; } case bt_templatedecltype: RenderExpr(buf, tp->templateDeclType); break; case bt_auto: strcpy(buf, "auto "); break; default: strcpy(buf, "\?\?\?"); } return 0; }