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_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_executable(libabacus src/main.c)
|
||||||
add_subdirectory(external/liblex)
|
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