Files
mie/mie/type/type.c

70 lines
1.5 KiB
C

#include <mie/dialect/dialect.h>
#include <mie/type/function.h>
#include <mie/type/storage.h>
#include <mie/type/type-definition.h>
#include <mie/type/type.h>
struct mie_type *mie_type_create(struct mie_type_definition *type)
{
if (type->ty_data_size < sizeof(struct mie_type)) {
return NULL;
}
struct mie_type *out = malloc(type->ty_data_size);
if (!out) {
return NULL;
}
memset(out, 0x0, sizeof *out);
out->ty_def = type;
return out;
}
void mie_type_build_id(const struct mie_type *type, struct mie_id_builder *ctx)
{
if (type->ty_def->ty_build_id) {
type->ty_def->ty_build_id(type, ctx);
return;
} else if (type->ty_name) {
mie_id_builder_add(ctx, type->ty_name, strlen(type->ty_name));
} else if (type->ty_def->ty_name) {
mie_id_builder_add(
ctx, type->ty_def->ty_name, strlen(type->ty_def->ty_name));
} else {
const char *placeholder = "<UNNAMED-TYPE>";
const size_t placeholder_len = strlen(placeholder);
mie_id_builder_add(ctx, placeholder, placeholder_len);
}
}
void mie_type_generate_id(const struct mie_type *type, const mie_id *ns, mie_id *out)
{
struct mie_id_builder ctx;
mie_id_builder_begin(&ctx, ns);
mie_type_build_id(type, &ctx);
mie_id_builder_end(&ctx, out);
}
bool mie_type_is(
const struct mie_type *ty, const char *dialect_name, const char *type_name)
{
if (!ty->ty_def) {
return false;
}
if (strcmp(ty->ty_def->ty_name, type_name) != 0) {
return false;
}
if (!ty->ty_def->ty_parent) {
return false;
}
if (strcmp(ty->ty_def->ty_parent->d_name, dialect_name) != 0) {
return false;
}
return true;
}