]> git.mxchange.org Git - simgear.git/blobdiff - simgear/nasal/vector.c
Nasal: allow ghost as 'me' for 'call'
[simgear.git] / simgear / nasal / vector.c
index ba0ff6b6412d47b9634a501493e20b6a68258dfd..fc160f0e48d1be2ac3c687924aad5d1a71e24e96 100644 (file)
@@ -13,10 +13,10 @@ static struct VecRec* newvecrec(struct VecRec* old)
     return vr;
 }
 
-static void vecrealloc(struct naVec* v)
+static void resize(struct naVec* v)
 {
     struct VecRec* vr = newvecrec(v->rec);
-    naGC_swapfree((void**)&(v->rec), vr);
+    naGC_swapfree((void*)&(v->rec), vr);
 }
 
 void naVec_gcclean(struct naVec* v)
@@ -28,7 +28,7 @@ void naVec_gcclean(struct naVec* v)
 naRef naVec_get(naRef v, int i)
 {
     if(IS_VEC(v)) {
-        struct VecRec* r = v.ref.ptr.vec->rec;
+        struct VecRec* r = PTR(v).vec->rec;
         if(r) {
             if(i < 0) i += r->size;
             if(i >= 0 && i < r->size) return r->array[i];
@@ -40,7 +40,7 @@ naRef naVec_get(naRef v, int i)
 void naVec_set(naRef vec, int i, naRef o)
 {
     if(IS_VEC(vec)) {
-        struct VecRec* r = vec.ref.ptr.vec->rec;
+        struct VecRec* r = PTR(vec).vec->rec;
         if(r && i >= r->size) return;
         r->array[i] = o;
     }
@@ -49,7 +49,7 @@ void naVec_set(naRef vec, int i, naRef o)
 int naVec_size(naRef v)
 {
     if(IS_VEC(v)) {
-        struct VecRec* r = v.ref.ptr.vec->rec;
+        struct VecRec* r = PTR(v).vec->rec;
         return r ? r->size : 0;
     }
     return 0;
@@ -58,10 +58,10 @@ int naVec_size(naRef v)
 int naVec_append(naRef vec, naRef o)
 {
     if(IS_VEC(vec)) {
-        struct VecRec* r = vec.ref.ptr.vec->rec;
+        struct VecRec* r = PTR(vec).vec->rec;
         while(!r || r->size >= r->alloced) {
-            vecrealloc(vec.ref.ptr.vec);
-            r = vec.ref.ptr.vec->rec;
+            resize(PTR(vec).vec);
+            r = PTR(vec).vec->rec;
         }
         r->array[r->size] = o;
         return r->size++;
@@ -69,29 +69,54 @@ int naVec_append(naRef vec, naRef o)
     return 0;
 }
 
-void naVec_setsize(naRef vec, int sz)
+//------------------------------------------------------------------------------
+void naVec_setsize(naContext c, naRef vec, int sz)
 {
+    if (sz < 0)
+        naRuntimeError(c, "size cannot be negative");
+    else
+    {
+        int i;
+        struct VecRec* v = PTR(vec).vec->rec;
+        struct VecRec* nv = naAlloc(sizeof(struct VecRec) + sizeof(naRef) * sz);
+        nv->size = sz;
+        nv->alloced = sz;
+        for(i=0; i<sz; i++)
+            nv->array[i] = (v && i < v->size) ? v->array[i] : naNil();
+        naGC_swapfree((void*)&(PTR(vec).vec->rec), nv);
+    }
+}
+
+//------------------------------------------------------------------------------
+naRef naVec_removefirst(naRef vec)
+{
+    naRef o;
     int i;
-    struct VecRec* v = vec.ref.ptr.vec->rec;
-    struct VecRec* nv = naAlloc(sizeof(struct VecRec) + sizeof(naRef) * sz);
-    nv->size = sz;
-    nv->alloced = sz;
-    for(i=0; i<sz; i++)
-        nv->array[i] = (v && i < v->size) ? v->array[i] : naNil();
-    naFree(v);
-    vec.ref.ptr.vec->rec = nv;
+    if(IS_VEC(vec)) {
+        struct VecRec* v = PTR(vec).vec->rec;
+        if(!v || v->size == 0) return naNil();
+        o = v->array[0];
+        for (i=1; i<v->size; i++)
+            v->array[i-1] = v->array[i];
+        v->size--;
+        if(v->size < (v->alloced >> 1))
+            resize(PTR(vec).vec);
+        return o;
+    }
+    return naNil();
 }
 
+//------------------------------------------------------------------------------
 naRef naVec_removelast(naRef vec)
 {
     naRef o;
     if(IS_VEC(vec)) {
-        struct VecRec* v = vec.ref.ptr.vec->rec;
+        struct VecRec* v = PTR(vec).vec->rec;
         if(!v || v->size == 0) return naNil();
         o = v->array[v->size - 1];
         v->size--;
         if(v->size < (v->alloced >> 1))
-            vecrealloc(vec.ref.ptr.vec);
+            resize(PTR(vec).vec);
         return o;
     }
     return naNil();