start work on new interpreter
This commit is contained in:
parent
7efa99d064
commit
2ac2f85512
15 changed files with 780 additions and 30 deletions
33
next/core/string.c
Normal file
33
next/core/string.c
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
#include <growl.h>
|
||||
#include <string.h>
|
||||
|
||||
Growl growl_make_string(GrowlVM *vm, size_t len) {
|
||||
size_t size = sizeof(GrowlObjectHeader) + sizeof(GrowlString) + len;
|
||||
GrowlObjectHeader *hdr = growl_gc_alloc(vm, size);
|
||||
hdr->type = GROWL_STRING;
|
||||
GrowlString *str = (GrowlString *)(hdr + 1);
|
||||
str->len = len;
|
||||
memset(str->data, 0, len);
|
||||
return GROWL_BOX(hdr);
|
||||
}
|
||||
|
||||
Growl growl_wrap_string(GrowlVM *vm, const char *cstr) {
|
||||
size_t len = strlen(cstr);
|
||||
size_t size = sizeof(GrowlObjectHeader) + sizeof(GrowlString) + len + 1;
|
||||
GrowlObjectHeader *hdr = growl_gc_alloc(vm, size);
|
||||
hdr->type = GROWL_STRING;
|
||||
GrowlString *str = (GrowlString *)(hdr + 1);
|
||||
str->len = len;
|
||||
memcpy(str->data, cstr, len);
|
||||
str->data[len] = 0;
|
||||
return GROWL_BOX(hdr);
|
||||
}
|
||||
|
||||
GrowlString *growl_unwrap_string(Growl obj) {
|
||||
if (obj == 0 || GROWL_IMM(obj))
|
||||
return NULL;
|
||||
GrowlObjectHeader *hdr = GROWL_UNBOX(obj);
|
||||
if (hdr->type != GROWL_STRING)
|
||||
return NULL;
|
||||
return (GrowlString *)(hdr + 1);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue