V new_blob(int size) { V t = make_new_value(T_BLOB, true, sizeof(Blob)); toBlob(t)->size = size; toBlob(t)->data = calloc(size, 1); //TODO: check return value return t; }
V new_pair(V first, V second) { V t = make_new_value(T_PAIR, true, sizeof(V) * 2); toFirst(t) = first; toSecond(t) = second; return t; }
V clone_blob(V blob) { V t = make_new_value(T_BLOB, true, sizeof(Blob)); toBlob(t)->size = toBlob(blob)->size; toBlob(t)->data = malloc(toBlob(blob)->size); //TODO: check return value memcpy(toBlob(t)->data, toBlob(blob)->data, toBlob(blob)->size); return t; }
V new_list(void) { V t = make_new_value(T_LIST, false, sizeof(Stack)); toStack(t)->size = 0; toStack(t)->used = 0; toStack(t)->nodes = NULL; return t; }
V empty_string_to_value(size_t max, utf8 *adr) { V t = make_new_value(T_STR, true, sizeof(NewString) + max); NewString *s = toNewString(t); s->size = max; s->hash = 0; s->length = -1; s->text[max] = '\0'; *adr = s->text; return t; }
V a_to_string(char* str) { size_t size = strlen(str); V t = make_new_value(T_STR, true, sizeof(NewString) + size); NewString *s = toNewString(t); s->size = size; s->hash = 0; s->length = -1; memcpy(s->text, str, size + 1); return t; }
V str_to_string(size_t max, char *str) { V t = make_new_value(T_STR, true, sizeof(NewString) + max); NewString *s = toNewString(t); s->size = max; s->hash = 0; s->length = -1; memcpy(s->text, str, max); s->text[max] = '\0'; return t; }
V create_scope() { if (MAXSCOPE < MAXCACHE) { ValueScope *sc = &SCOPECACHE[MAXSCOPE]; sc->v.buffered = false; sc->v.type = T_SCOPE; sc->v.refs = 1; sc->v.color = Black; sc->sc.index = ++MAXSCOPE; return (V)sc; } else { V val = make_new_value(T_SCOPE, false, sizeof(Scope)); toScope(val)->index = 0; return val; } }
V new_sized_dict(int size) { V t = make_new_value(T_DICT, false, sizeof(HashMap)); hashmap_from_value(t, size); return t; }