Added setsize() and subvec() library functions
This commit is contained in:
@@ -46,6 +46,33 @@ static naRef pop(naContext c, naRef args)
|
|||||||
return naVec_removelast(v);
|
return naVec_removelast(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static naRef setsize(naContext c, naRef args)
|
||||||
|
{
|
||||||
|
naRef v = naVec_get(args, 0);
|
||||||
|
int sz = (int)naNumValue(naVec_get(args, 1)).num;
|
||||||
|
if(!naIsVector(v)) return naNil();
|
||||||
|
naVec_setsize(v, sz);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static naRef subvec(naContext c, naRef args)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
naRef nlen, result, v = naVec_get(args, 0);
|
||||||
|
int len = 0, start = (int)naNumValue(naVec_get(args, 1)).num;
|
||||||
|
nlen = naNumValue(naVec_get(args, 2));
|
||||||
|
if(!naIsNil(nlen))
|
||||||
|
len = (int)naNumValue(naVec_get(args, 2)).num;
|
||||||
|
if(!naIsVector(v) || start < 0 || start >= naVec_size(v) || len < 0)
|
||||||
|
return naNil();
|
||||||
|
if(len == 0 || len > naVec_size(v) - start) len = naVec_size(v) - start;
|
||||||
|
result = naNewVector(c);
|
||||||
|
naVec_setsize(result, len);
|
||||||
|
for(i=0; i<len; i++)
|
||||||
|
naVec_set(result, i, naVec_get(v, start + i));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static naRef delete(naContext c, naRef args)
|
static naRef delete(naContext c, naRef args)
|
||||||
{
|
{
|
||||||
naRef h = naVec_get(args, 0);
|
naRef h = naVec_get(args, 0);
|
||||||
@@ -129,6 +156,8 @@ static struct func funcs[] = {
|
|||||||
{ "keys", keys },
|
{ "keys", keys },
|
||||||
{ "append", append },
|
{ "append", append },
|
||||||
{ "pop", pop },
|
{ "pop", pop },
|
||||||
|
{ "setsize", setsize },
|
||||||
|
{ "subvec", subvec },
|
||||||
{ "delete", delete },
|
{ "delete", delete },
|
||||||
{ "int", intf },
|
{ "int", intf },
|
||||||
{ "num", num },
|
{ "num", num },
|
||||||
|
|||||||
@@ -163,6 +163,7 @@ naRef naVec_get(naRef v, int i);
|
|||||||
void naVec_set(naRef vec, int i, naRef o);
|
void naVec_set(naRef vec, int i, naRef o);
|
||||||
int naVec_append(naRef vec, naRef o);
|
int naVec_append(naRef vec, naRef o);
|
||||||
naRef naVec_removelast(naRef vec);
|
naRef naVec_removelast(naRef vec);
|
||||||
|
void naVec_setsize(naRef vec, int sz);
|
||||||
|
|
||||||
// Hash utilities:
|
// Hash utilities:
|
||||||
int naHash_size(naRef h);
|
int naHash_size(naRef h);
|
||||||
|
|||||||
@@ -58,6 +58,19 @@ int naVec_append(naRef vec, naRef o)
|
|||||||
return v->size++;
|
return v->size++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void naVec_setsize(naRef vec, int sz)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct naVec* v = vec.ref.ptr.vec;
|
||||||
|
naRef* na = naAlloc(sizeof(naRef) * sz);
|
||||||
|
for(i=0; i<sz; i++)
|
||||||
|
na[i] = (i < v->size) ? v->array[i] : naNil();
|
||||||
|
naFree(v->array);
|
||||||
|
v->array = na;
|
||||||
|
v->size = sz;
|
||||||
|
v->alloced = sz;
|
||||||
|
}
|
||||||
|
|
||||||
naRef naVec_removelast(naRef vec)
|
naRef naVec_removelast(naRef vec)
|
||||||
{
|
{
|
||||||
naRef o;
|
naRef o;
|
||||||
|
|||||||
Reference in New Issue
Block a user