Begin the implementation of a type.

This commit is contained in:
Danila Fedorin 2018-03-31 15:54:59 -07:00
parent c5fa68fdf5
commit 35fc0e7fd1
3 changed files with 69 additions and 1 deletions

View File

@ -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
View 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
View 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;
}