#include "tmp.h" #include "type.h" #include #include #include const struct stentry *tmp_create(struct fn *fn, const struct type *t) { static const char fmt[] = "__tmp%zu"; int r = snprintf(NULL, 0, fmt, fn->ntmps); char *s = NULL, *tname = NULL; struct tmp *tmp; if (!(tname = type_name(t))) goto failure; else if (r < 0) { fprintf(stderr, "%s: snprintf(3) failed\n", __func__); goto failure; } else if (!(s = malloc(r + 1))) { perror("malloc(3)"); goto failure; } snprintf(s, r + 1, fmt, fn->ntmps++); if (!(tmp = malloc(sizeof *tmp))) { perror("realloc(3)"); goto failure; } *tmp = (struct tmp) { .tk = { .type = ID, .s = s, .loc.f = "(temporary)" }, .e = { .tk = &tmp->tk, .t = t } }; if (!fn->tmps) fn->tmps = tmp; else for (struct tmp *t = fn->tmps; t ; t = t->next) if (!t->next) { t->next = tmp; break; } fprintf(stderr, "\tcreating temporary variable %s, type %s\n", s, tname); free(tname); return &tmp->e; failure: free(s); free(tname); return NULL; }