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)
{
naRef h = naVec_get(args, 0);
{ "keys", keys },
{ "append", append },
{ "pop", pop },
+ { "setsize", setsize },
+ { "subvec", subvec },
{ "delete", delete },
{ "int", intf },
{ "num", num },
void naVec_set(naRef vec, int i, naRef o);
int naVec_append(naRef vec, naRef o);
naRef naVec_removelast(naRef vec);
+void naVec_setsize(naRef vec, int sz);
// Hash utilities:
int naHash_size(naRef h);
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 o;