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. | ||||
|      */ | ||||
|     libab_ref type_function_list; | ||||
|     /**
 | ||||
|      * The unit type instance. | ||||
|      */ | ||||
|     libab_ref type_unit; | ||||
| 
 | ||||
|     /**
 | ||||
|      * 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. | ||||
|  */ | ||||
| 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. | ||||
| @ -165,6 +175,12 @@ void libab_get_type_num(libab* ab, libab_ref* into); | ||||
|  * @param into the ference to store the type 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. | ||||
|  | ||||
| @ -23,6 +23,12 @@ static libab_basetype_param _basetype_function_params[] = {{BT_LIST, NULL}}; | ||||
| static libab_basetype _basetype_function = {_free_function, | ||||
|                                             _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 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(&ab->type_num); | ||||
|     libab_ref_null(&ab->type_function_list); | ||||
|     libab_ref_null(&ab->type_unit); | ||||
| 
 | ||||
|     ab->impl.parse_num = parse_function; | ||||
|     result = libab_create_table(&ab->table, &null_ref); | ||||
| 
 | ||||
|     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); | ||||
|     } | ||||
| 
 | ||||
| @ -58,6 +68,7 @@ libab_result libab_init(libab* ab, void* (*parse_function)(const char*), | ||||
|         libab_ref_free(&ab->table); | ||||
|         libab_ref_free(&ab->type_num); | ||||
|         libab_ref_free(&ab->type_function_list); | ||||
|         libab_ref_free(&ab->type_unit); | ||||
| 
 | ||||
|         if (parser_initialized) { | ||||
|             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_function_list); | ||||
|     libab_ref_null(&ab->type_unit); | ||||
| 
 | ||||
|     if (result == LIBAB_SUCCESS) { | ||||
|         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); | ||||
|     } | ||||
| 
 | ||||
|     if(result == LIBAB_SUCCESS) { | ||||
|         libab_ref_free(&ab->type_unit); | ||||
|         result = libab_instantiate_basetype(&_basetype_unit, &ab->type_unit, 0); | ||||
|     } | ||||
| 
 | ||||
|     if (result == LIBAB_SUCCESS) { | ||||
|         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); | ||||
|     } | ||||
| 
 | ||||
|     if (result == LIBAB_SUCCESS) { | ||||
|         result = libab_register_basetype(ab, "unit", &_basetype_unit); | ||||
|     } | ||||
| 
 | ||||
|     if (result != LIBAB_SUCCESS) { | ||||
|         libab_ref_free(&ab->type_num); | ||||
|         libab_ref_free(&ab->type_function_list); | ||||
|         libab_ref_free(&ab->type_unit); | ||||
|         libab_ref_null(&ab->type_num); | ||||
|         libab_ref_null(&ab->type_function_list); | ||||
|         libab_ref_null(&ab->type_unit); | ||||
|     } | ||||
| 
 | ||||
|     return result; | ||||
| @ -340,6 +363,10 @@ libab_basetype* libab_get_basetype_function_list(libab* ab) { | ||||
|     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) { | ||||
|     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); | ||||
| } | ||||
| 
 | ||||
| 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 result = LIBAB_SUCCESS; | ||||
|     ll tokens; | ||||
| @ -406,6 +437,7 @@ libab_result libab_free(libab* ab) { | ||||
|     libab_ref_free(&ab->table); | ||||
|     libab_ref_free(&ab->type_num); | ||||
|     libab_ref_free(&ab->type_function_list); | ||||
|     libab_ref_free(&ab->type_unit); | ||||
|     libab_parser_free(&ab->parser); | ||||
|     libab_interpreter_free(&ab->intr); | ||||
|     return libab_lexer_free(&ab->lexer); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user