diff options
Diffstat (limited to 'tmp.c')
| -rw-r--r-- | tmp.c | 69 |
1 files changed, 69 insertions, 0 deletions
@@ -0,0 +1,69 @@ +#include "tmp.h" +#include "type.h" +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> + +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; +} |
