Begin the implementation of a type.
This commit is contained in:
parent
c5fa68fdf5
commit
35fc0e7fd1
|
@ -8,7 +8,7 @@ project(libabacus)
|
|||
|
||||
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)
|
||||
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/type.c)
|
||||
add_executable(libabacus src/main.c)
|
||||
add_subdirectory(external/liblex)
|
||||
|
||||
|
|
40
include/type.h
Normal file
40
include/type.h
Normal file
|
@ -0,0 +1,40 @@
|
|||
#ifndef LIBABACUS_TYPE_H
|
||||
#define LIBABACUS_TYPE_H
|
||||
|
||||
#include "vec.h"
|
||||
#include "result.h"
|
||||
#include "refcount.h"
|
||||
#include "parsetype.h"
|
||||
#include "table.h"
|
||||
|
||||
/**
|
||||
* A type in libabacus.
|
||||
*/
|
||||
struct libab_type_s {
|
||||
/**
|
||||
* The name of the type.
|
||||
* This is also a unique identifier,
|
||||
* used to compare types.
|
||||
*/
|
||||
char* name;
|
||||
};
|
||||
|
||||
typedef struct libab_type_s libab_type;
|
||||
|
||||
/**
|
||||
* Creates a new instance of a type, with no type parameters, and
|
||||
* the given name.
|
||||
* @param ref the reference to populate with the new type.
|
||||
* @param name the name to use.
|
||||
* @return the result of the creation function, which can fail.
|
||||
*/
|
||||
libab_result libab_type_create(libab_ref* ref, const char* name);
|
||||
/**
|
||||
* Constructs a new instance of a type from the given parsetype.
|
||||
* @param ref the reference to populate with the new type.
|
||||
* @param type the parse type to load.
|
||||
* @param table the table to use for looking up types.
|
||||
*/
|
||||
libab_result libab_type_from_parsetype(libab_ref* ref, libab_parsetype* type, libab_table* table);
|
||||
|
||||
#endif
|
28
src/type.c
Normal file
28
src/type.c
Normal file
|
@ -0,0 +1,28 @@
|
|||
#include "type.h"
|
||||
#include "util.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
void _libab_type_free(void* type) {
|
||||
free(((libab_type*) type)->name);
|
||||
}
|
||||
|
||||
libab_result libab_type_create(libab_ref* ref, const char* name) {
|
||||
libab_type* type;
|
||||
libab_result result = LIBAB_SUCCESS;
|
||||
if((type = malloc(sizeof(*type)))) {
|
||||
result = libab_copy_string(&type->name, name);
|
||||
} else {
|
||||
result = LIBAB_MALLOC;
|
||||
}
|
||||
|
||||
if(result == LIBAB_SUCCESS) {
|
||||
result = libab_ref_new(ref, type, _libab_type_free);
|
||||
if(result != LIBAB_SUCCESS) free(type->name);
|
||||
}
|
||||
|
||||
if(result != LIBAB_SUCCESS) {
|
||||
free(type);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
Loading…
Reference in New Issue
Block a user