Add a unit type.
This commit is contained in:
parent
b7cc17d394
commit
969e457fba
|
@ -51,6 +51,10 @@ struct libab_s {
|
||||||
* The function list type instance.
|
* The function list type instance.
|
||||||
*/
|
*/
|
||||||
libab_ref type_function_list;
|
libab_ref type_function_list;
|
||||||
|
/**
|
||||||
|
* The unit type instance.
|
||||||
|
*/
|
||||||
|
libab_ref type_unit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal; the number basetype. This cannot be a static
|
* Internal; the number basetype. This cannot be a static
|
||||||
|
@ -152,6 +156,12 @@ libab_basetype* libab_get_basetype_function(libab* ab);
|
||||||
* @return the function list basetype.
|
* @return the function list basetype.
|
||||||
*/
|
*/
|
||||||
libab_basetype* libab_get_basetype_function_list(libab* ab);
|
libab_basetype* libab_get_basetype_function_list(libab* ab);
|
||||||
|
/**
|
||||||
|
* Finds and returns the built-in libabacus unit type.
|
||||||
|
* @param ab the ab instance for which to return a type.
|
||||||
|
* @return the unit basetype.
|
||||||
|
*/
|
||||||
|
libab_basetype* libab_get_basetype_unit(libab* ab);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the type of a number in this libabacus instance.
|
* Get the type of a number in this libabacus instance.
|
||||||
|
@ -165,6 +175,12 @@ void libab_get_type_num(libab* ab, libab_ref* into);
|
||||||
* @param into the ference to store the type into.
|
* @param into the ference to store the type into.
|
||||||
*/
|
*/
|
||||||
void libab_get_type_function_list(libab* ab, libab_ref* into);
|
void libab_get_type_function_list(libab* ab, libab_ref* into);
|
||||||
|
/**
|
||||||
|
* Get the type of the unit in this libabacus instance.
|
||||||
|
* @param ab the instance to get the type for.
|
||||||
|
* @param into the reference to store the type into.
|
||||||
|
*/
|
||||||
|
void libab_get_type_unit(libab* ab, libab_ref* into);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the given string of code.
|
* Executes the given string of code.
|
||||||
|
|
|
@ -23,6 +23,12 @@ static libab_basetype_param _basetype_function_params[] = {{BT_LIST, NULL}};
|
||||||
static libab_basetype _basetype_function = {_free_function,
|
static libab_basetype _basetype_function = {_free_function,
|
||||||
_basetype_function_params, 1};
|
_basetype_function_params, 1};
|
||||||
|
|
||||||
|
void _free_unit(void* unit) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static libab_basetype _basetype_unit = { _free_unit, NULL, 0 };
|
||||||
|
|
||||||
libab_result _prepare_types(libab* ab, void (*free_function)(void*));
|
libab_result _prepare_types(libab* ab, void (*free_function)(void*));
|
||||||
|
|
||||||
libab_result libab_init(libab* ab, void* (*parse_function)(const char*),
|
libab_result libab_init(libab* ab, void* (*parse_function)(const char*),
|
||||||
|
@ -34,11 +40,15 @@ libab_result libab_init(libab* ab, void* (*parse_function)(const char*),
|
||||||
libab_ref_null(&null_ref);
|
libab_ref_null(&null_ref);
|
||||||
libab_ref_null(&ab->type_num);
|
libab_ref_null(&ab->type_num);
|
||||||
libab_ref_null(&ab->type_function_list);
|
libab_ref_null(&ab->type_function_list);
|
||||||
|
libab_ref_null(&ab->type_unit);
|
||||||
|
|
||||||
ab->impl.parse_num = parse_function;
|
ab->impl.parse_num = parse_function;
|
||||||
result = libab_create_table(&ab->table, &null_ref);
|
result = libab_create_table(&ab->table, &null_ref);
|
||||||
|
|
||||||
if (result == LIBAB_SUCCESS) {
|
if (result == LIBAB_SUCCESS) {
|
||||||
|
libab_ref_free(&ab->type_num);
|
||||||
|
libab_ref_free(&ab->type_function_list);
|
||||||
|
libab_ref_free(&ab->type_unit);
|
||||||
result = _prepare_types(ab, free_function);
|
result = _prepare_types(ab, free_function);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,6 +68,7 @@ libab_result libab_init(libab* ab, void* (*parse_function)(const char*),
|
||||||
libab_ref_free(&ab->table);
|
libab_ref_free(&ab->table);
|
||||||
libab_ref_free(&ab->type_num);
|
libab_ref_free(&ab->type_num);
|
||||||
libab_ref_free(&ab->type_function_list);
|
libab_ref_free(&ab->type_function_list);
|
||||||
|
libab_ref_free(&ab->type_unit);
|
||||||
|
|
||||||
if (parser_initialized) {
|
if (parser_initialized) {
|
||||||
libab_parser_free(&ab->parser);
|
libab_parser_free(&ab->parser);
|
||||||
|
@ -277,6 +288,7 @@ libab_result _prepare_types(libab* ab, void (*free_function)(void*)) {
|
||||||
|
|
||||||
libab_ref_null(&ab->type_num);
|
libab_ref_null(&ab->type_num);
|
||||||
libab_ref_null(&ab->type_function_list);
|
libab_ref_null(&ab->type_function_list);
|
||||||
|
libab_ref_null(&ab->type_unit);
|
||||||
|
|
||||||
if (result == LIBAB_SUCCESS) {
|
if (result == LIBAB_SUCCESS) {
|
||||||
libab_ref_free(&ab->type_num);
|
libab_ref_free(&ab->type_num);
|
||||||
|
@ -290,6 +302,11 @@ libab_result _prepare_types(libab* ab, void (*free_function)(void*)) {
|
||||||
&ab->type_function_list, 0);
|
&ab->type_function_list, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
libab_ref_free(&ab->type_unit);
|
||||||
|
result = libab_instantiate_basetype(&_basetype_unit, &ab->type_unit, 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (result == LIBAB_SUCCESS) {
|
if (result == LIBAB_SUCCESS) {
|
||||||
result = libab_register_basetype(ab, "num", &ab->basetype_num);
|
result = libab_register_basetype(ab, "num", &ab->basetype_num);
|
||||||
}
|
}
|
||||||
|
@ -303,11 +320,17 @@ libab_result _prepare_types(libab* ab, void (*free_function)(void*)) {
|
||||||
&_basetype_function_list);
|
&_basetype_function_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (result == LIBAB_SUCCESS) {
|
||||||
|
result = libab_register_basetype(ab, "unit", &_basetype_unit);
|
||||||
|
}
|
||||||
|
|
||||||
if (result != LIBAB_SUCCESS) {
|
if (result != LIBAB_SUCCESS) {
|
||||||
libab_ref_free(&ab->type_num);
|
libab_ref_free(&ab->type_num);
|
||||||
libab_ref_free(&ab->type_function_list);
|
libab_ref_free(&ab->type_function_list);
|
||||||
|
libab_ref_free(&ab->type_unit);
|
||||||
libab_ref_null(&ab->type_num);
|
libab_ref_null(&ab->type_num);
|
||||||
libab_ref_null(&ab->type_function_list);
|
libab_ref_null(&ab->type_function_list);
|
||||||
|
libab_ref_null(&ab->type_unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -340,6 +363,10 @@ libab_basetype* libab_get_basetype_function_list(libab* ab) {
|
||||||
return &_basetype_function_list;
|
return &_basetype_function_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
libab_basetype* libab_get_basetype_unit(libab* ab) {
|
||||||
|
return &_basetype_unit;
|
||||||
|
}
|
||||||
|
|
||||||
void libab_get_type_num(libab* ab, libab_ref* into) {
|
void libab_get_type_num(libab* ab, libab_ref* into) {
|
||||||
libab_ref_copy(&ab->type_num, into);
|
libab_ref_copy(&ab->type_num, into);
|
||||||
}
|
}
|
||||||
|
@ -348,6 +375,10 @@ void libab_get_type_function_list(libab* ab, libab_ref* into) {
|
||||||
libab_ref_copy(&ab->type_function_list, into);
|
libab_ref_copy(&ab->type_function_list, into);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void libab_get_type_unit(libab* ab, libab_ref* into) {
|
||||||
|
libab_ref_copy(&ab->type_unit, into);
|
||||||
|
}
|
||||||
|
|
||||||
libab_result libab_run(libab* ab, const char* string, libab_ref* value) {
|
libab_result libab_run(libab* ab, const char* string, libab_ref* value) {
|
||||||
libab_result result = LIBAB_SUCCESS;
|
libab_result result = LIBAB_SUCCESS;
|
||||||
ll tokens;
|
ll tokens;
|
||||||
|
@ -406,6 +437,7 @@ libab_result libab_free(libab* ab) {
|
||||||
libab_ref_free(&ab->table);
|
libab_ref_free(&ab->table);
|
||||||
libab_ref_free(&ab->type_num);
|
libab_ref_free(&ab->type_num);
|
||||||
libab_ref_free(&ab->type_function_list);
|
libab_ref_free(&ab->type_function_list);
|
||||||
|
libab_ref_free(&ab->type_unit);
|
||||||
libab_parser_free(&ab->parser);
|
libab_parser_free(&ab->parser);
|
||||||
libab_interpreter_free(&ab->intr);
|
libab_interpreter_free(&ab->intr);
|
||||||
return libab_lexer_free(&ab->lexer);
|
return libab_lexer_free(&ab->lexer);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user