]> git.mxchange.org Git - simgear.git/commitdiff
Added setsize() and subvec() library functions
authorandy <andy>
Fri, 5 Dec 2003 01:49:02 +0000 (01:49 +0000)
committerandy <andy>
Fri, 5 Dec 2003 01:49:02 +0000 (01:49 +0000)
simgear/nasal/lib.c
simgear/nasal/nasal.h
simgear/nasal/vector.c

index b050aa708499fab98dad4429a30b7d76ff75104f..f9768d52dc070c205bd4843fcc9a96fca44bc276 100644 (file)
@@ -46,6 +46,33 @@ static naRef pop(naContext c, naRef args)
     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);
@@ -129,6 +156,8 @@ static struct func funcs[] = {
     { "keys", keys }, 
     { "append", append }, 
     { "pop", pop }, 
+    { "setsize", setsize }, 
+    { "subvec", subvec }, 
     { "delete", delete }, 
     { "int", intf },
     { "num", num },
index da10dabddc50fc80837a9e224395cfd246fc7f87..85fff9661e4a82c519ae5b2bc042109c7c00e4a1 100644 (file)
@@ -163,6 +163,7 @@ naRef naVec_get(naRef v, int i);
 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);
index db98b3e45793c51e38c542a1cd9fa0482d4f2019..b9e03e6d68c3357b0f9e96d54667d40f8b5ba2c2 100644 (file)
@@ -58,6 +58,19 @@ int naVec_append(naRef vec, naRef o)
     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;