static short *llreplace(short *buf, int *max, int *len, TYP *to, TYP *tn) { char type[512]; short formattedtype[512]; short searchfor[256]; int slen; int flen; int i; // if (to->type != bt_class) // return buf ; slen = strlen(to->sp->name); for (i = 0; i < slen; i++) searchfor[i] = to->sp->name[i]; if (prm_cmangle && searchfor[0] == '_') { memcpy(searchfor, searchfor + 1, slen *sizeof(short)); slen--; } if (to->type != bt_class) { if (scalarnonfloat(to)) { if (to->type == bt_char || to->type == bt_unsignedchar) { #ifdef CC68K sprintf(type, "'%c'", tn->sp->value.i + 3); #else sprintf(type, "'%c'", tn->sp->value.i); #endif } else sprintf(type, "%d", tn->sp->value.i); } else sprintf(type, "%f", tn->sp->value.i); flen = strlen(type); for (i = 0; i < flen; i++) formattedtype[i] = type[i]; } else if (tn->type == bt_string) { flen = tn->size; for (i = 0; i < flen; i++) formattedtype[i] = ((char*)tn->lst.head)[i]; } else { typenum(type, tn); flen = strlen(type); for (i = 1; i < flen - 1; i++) formattedtype[i - 1] = type[i]; flen -= 2; } return doreplace(buf, max, len, searchfor, formattedtype, slen, flen, FALSE) ; }
void typeToString(char *buf, TYPE *typ) { *buf = 0; while (typ) { typ = typenum(buf, typ); buf = buf + strlen(buf); if (typ) *buf++ = ','; } *buf = 0; }
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; }