roza/lib/tysy.c

104 lines
1.8 KiB
C
Raw Normal View History

2023-12-09 17:24:41 +00:00
#include "tysy.h"
void tysy_init(tysy_t* tysy)
{
assert(tysy);
tysy->size = 0;
// num
{
2023-12-09 21:59:24 +00:00
type_t* ty = malloc(sizeof(type_t));
type_init(ty, TYPE_NUM);
tysy_register_new_type(tysy, "num", ty);
}
// bool
{
type_t* ty = malloc(sizeof(type_t));
type_init(ty, TYPE_BOOL);
tysy_register_new_type(tysy, "bool", ty);
2023-12-09 17:24:41 +00:00
}
2023-12-10 03:49:28 +00:00
// str
{
type_t* ty = malloc(sizeof(type_t));
type_init(ty, TYPE_STR);
tysy_register_new_type(tysy, "str", ty);
}
2023-12-09 17:24:41 +00:00
}
void tysy_free(tysy_t* tysy)
{
assert(tysy);
for (size_t i=0; i<tysy->size; i++)
{
type_free(tysy->types[i]);
free(tysy->types[i]);
free(tysy->names[i]);
}
tysy->size = 0;
}
void tysy_register_new_type(tysy_t* tysy, char* name, type_t* type)
{
assert(tysy);
assert(name);
assert(type);
assert(tysy->size + 1 < RZ_MAX_TYPES);
tysy->types[tysy->size] = type;
tysy->names[tysy->size] = strdup(name);
tysy->size++;
}
type_t* tysy_try_find_type(tysy_t* tysy, char* name)
{
assert(tysy);
assert(name);
for (size_t i=0; i<tysy->size; i++)
{
if (strcmp(name, tysy->names[i]) == 0)
{
return tysy->types[i];
}
}
return NULL;
}
value_t* tysy_new_num(tysy_t* tysy, double value)
{
assert(tysy);
value_t* val = malloc(sizeof(value_t));
value_init(val, tysy_try_find_type(tysy, "num"));
val->value.num = value;
return val;
}
2023-12-09 21:59:24 +00:00
value_t* tysy_new_bool(tysy_t* tysy, int value)
{
assert(tysy);
value_t* val = malloc(sizeof(value_t));
value_init(val, tysy_try_find_type(tysy, "bool"));
val->value.bool = value;
return val;
}
2023-12-10 03:49:28 +00:00
value_t* tysy_new_str(tysy_t* tysy, char* value)
{
assert(tysy);
value_t* val = malloc(sizeof(value_t));
value_init(val, tysy_try_find_type(tysy, "str"));
val->value.str = strdup(value);
return val;
}