X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fnasal%2Fvector.c;h=fc160f0e48d1be2ac3c687924aad5d1a71e24e96;hb=ac2e80dc07a122923e52e4a0a05369e326847bb7;hp=ba0ff6b6412d47b9634a501493e20b6a68258dfd;hpb=a807e66d4a40fc722e84a2fb99cb4d7b3d6223e1;p=simgear.git diff --git a/simgear/nasal/vector.c b/simgear/nasal/vector.c index ba0ff6b6..fc160f0e 100644 --- a/simgear/nasal/vector.c +++ b/simgear/nasal/vector.c @@ -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; iarray[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; iarray[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; isize; 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();