Add an implementation of base types.
These will hold information about a type such as (possibly) the interfaces it implements and the parameters it accepts.
This commit is contained in:
		
							parent
							
								
									0cfc1df02c
								
							
						
					
					
						commit
						d146b71e56
					
				@ -8,7 +8,7 @@ project(libabacus)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
add_compile_options(-pedantic -Wall)
 | 
					add_compile_options(-pedantic -Wall)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_library(abacus STATIC src/lexer.c src/util.c src/table.c src/parser.c src/libabacus.c src/tree.c src/debug.c src/parsetype.c src/reserved.c src/trie.c src/refcount.c src/ref_vec.c src/ref_trie.c)
 | 
					add_library(abacus STATIC src/lexer.c src/util.c src/table.c src/parser.c src/libabacus.c src/tree.c src/debug.c src/parsetype.c src/reserved.c src/trie.c src/refcount.c src/ref_vec.c src/ref_trie.c src/basetype.c)
 | 
				
			||||||
add_executable(libabacus src/main.c)
 | 
					add_executable(libabacus src/main.c)
 | 
				
			||||||
add_subdirectory(external/liblex)
 | 
					add_subdirectory(external/liblex)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										65
									
								
								include/basetype.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								include/basetype.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,65 @@
 | 
				
			|||||||
 | 
					#ifndef LIBABACUS_BASETYPE_H
 | 
				
			||||||
 | 
					#define LIBABACUS_BASETYPE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "vec.h"
 | 
				
			||||||
 | 
					#include "result.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * An enum that represents the various
 | 
				
			||||||
 | 
					 * types of the basetype parameters.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					enum libab_basetype_variant_e {
 | 
				
			||||||
 | 
					    BT_EMPTY,
 | 
				
			||||||
 | 
					    BT_NAME,
 | 
				
			||||||
 | 
					    BT_LIST
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A struct that holds information about the basetype
 | 
				
			||||||
 | 
					 * parameter, such as a type name or a "..." (called a list).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					struct libab_basetype_param_s {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The variant of this type parameter.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    enum libab_basetype_variant_e variant;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The name of the parameter, if one is appropriate.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    const char* name;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A struct that holds all the information about a base type.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					struct libab_basetype_s {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The function used to free the value.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void (*free_function)(void*);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The parameters of the type. This is a constant array, and
 | 
				
			||||||
 | 
					     * doesn't need memory allocation.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    const struct libab_basetype_param_s* params;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The size of the param aray.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    int count;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum libab_basetype_variant_e libab_basetype_variant;
 | 
				
			||||||
 | 
					typedef struct libab_basetype_param_s libab_basetype_param;
 | 
				
			||||||
 | 
					typedef struct libab_basetype_s libab_basetype;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Initializes a base type, including all the parameters that it needs
 | 
				
			||||||
 | 
					 * to take.
 | 
				
			||||||
 | 
					 * @param basetype the type that is being initialized.
 | 
				
			||||||
 | 
					 * @param n the number of type parameters it has.
 | 
				
			||||||
 | 
					 * @param params the parameters this basetype accepts.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void libab_basetype_init(libab_basetype* basetype, int n, 
 | 
				
			||||||
 | 
					        const libab_basetype_param params[]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/basetype.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/basetype.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					#include "basetype.h"
 | 
				
			||||||
 | 
					#include "util.h"
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void libab_basetype_init(libab_basetype* basetype,
 | 
				
			||||||
 | 
					        int n, const libab_basetype_param params[]) {
 | 
				
			||||||
 | 
					    basetype->params = params;
 | 
				
			||||||
 | 
					    basetype->count = n;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user