initial import of the C runtime

This commit is contained in:
kr.angelov
2012-01-20 13:41:10 +00:00
parent b972835712
commit 2eee382a62
94 changed files with 14344 additions and 1277 deletions

59
src/runtime/c/gu/intern.c Normal file
View File

@@ -0,0 +1,59 @@
#include "intern.h"
struct GuIntern {
GuPool* str_pool;
GuMap* map;
};
GuIntern*
gu_new_intern(GuPool* str_pool, GuPool* pool)
{
GuIntern* intern = gu_new(GuIntern, pool);
intern->str_pool = str_pool;
intern->map = gu_new_set(const char*, gu_str_hasher, pool);
return intern;
}
const char*
gu_intern_str(GuIntern* intern, const char* cstr)
{
const char* const* strp = gu_map_find_key(intern->map, &cstr);
if (strp) {
return *strp;
}
const char* str = gu_strdup(cstr, intern->str_pool);
gu_map_insert(intern->map, &str);
return str;
}
struct GuSymTable {
GuPool* sym_pool;
GuMap* map;
};
GuSymTable*
gu_new_symtable(GuPool* sym_pool, GuPool* pool)
{
GuSymTable* tab = gu_new(GuSymTable, pool);
tab->sym_pool = sym_pool;
tab->map = gu_new_set(GuSymbol, gu_string_hasher, pool);
return tab;
}
GuSymbol
gu_symtable_intern(GuSymTable* tab, GuString string)
{
if (gu_string_is_stable(string)) {
return string;
}
const GuSymbol* symp = gu_map_find_key(tab->map, &string);
if (symp) {
return *symp;
}
GuSymbol sym = gu_string_copy(string, tab->sym_pool);
gu_map_insert(tab->map, &sym);
return sym;
}