Skip to content
Snippets Groups Projects
tac_string_builder.c 1.42 KiB
Newer Older
Clemens Paumgarten's avatar
Clemens Paumgarten committed
#include <stdlib.h>
#include <stdio.h>
FlorianKrull's avatar
FlorianKrull committed
#include "mcc/utils.h"
#include "mcc/tac_string_builder.h"
Clemens Paumgarten's avatar
Clemens Paumgarten committed

char *mcc_tac_new_temporary_string(struct mcc_tac *tac) {
Clemens Paumgarten's avatar
Clemens Paumgarten committed
    // + 2 for character t and for \0 and + 1 in case temporay_count is 0
    size_t num_digits =  (size_t) mcc_get_number_of_digits(tac -> temporary_count) + 1 + 2;
Clemens Paumgarten's avatar
Clemens Paumgarten committed

Clemens Paumgarten's avatar
Clemens Paumgarten committed
    char *t = malloc(num_digits);
Clemens Paumgarten's avatar
Clemens Paumgarten committed

    if (t == NULL) {
        return NULL;
    }

    sprintf(t, "t%d", tac -> temporary_count);

Clemens Paumgarten's avatar
Clemens Paumgarten committed
    tac -> temporary_count += 1;
Clemens Paumgarten's avatar
Clemens Paumgarten committed
    tac -> last_temporary = t;

    return t;
}

char *mcc_tac_new_label_string(struct mcc_tac *tac) {
Clemens Paumgarten's avatar
Clemens Paumgarten committed
    // + 2 for character L and for \0 and + 1 in case temporay_count is 0
Clemens Paumgarten's avatar
Clemens Paumgarten committed
    size_t num_digits = (size_t) mcc_get_number_of_digits(tac -> label_count) + 1 + 2;
Clemens Paumgarten's avatar
Clemens Paumgarten committed

Clemens Paumgarten's avatar
Clemens Paumgarten committed
    char *l = malloc(num_digits);
Clemens Paumgarten's avatar
Clemens Paumgarten committed

Clemens Paumgarten's avatar
Clemens Paumgarten committed
    if (l == NULL) {
Clemens Paumgarten's avatar
Clemens Paumgarten committed
        return NULL;
    }

Clemens Paumgarten's avatar
Clemens Paumgarten committed
    sprintf(l, "L%d", tac -> label_count);
Clemens Paumgarten's avatar
Clemens Paumgarten committed

Clemens Paumgarten's avatar
Clemens Paumgarten committed
    tac -> label_count += 1;
    tac -> last_label = l;
Clemens Paumgarten's avatar
Clemens Paumgarten committed

Clemens Paumgarten's avatar
Clemens Paumgarten committed
    return l;
Clemens Paumgarten's avatar
Clemens Paumgarten committed
}
krf41037's avatar
krf41037 committed
char *concat_strs(char *prefix, char *infix, char *suffix)
{
	size_t p_len = strlen(prefix);
	size_t i_len = strlen(infix);
	size_t s_len = strlen(suffix);

	char *str = malloc(sizeof(char) * (p_len + i_len + s_len + 1));
	strcpy(str, prefix);
	strcpy(str + p_len, infix);
	strcpy(str + p_len + i_len, suffix);
	str[p_len + i_len + s_len] = '\0';

	return str;
}

char *mcc_tac_new_return_function_name(char* function_name) {
krf41037's avatar
krf41037 committed
   return concat_strs("$return_", function_name, "");