]> git.mxchange.org Git - simgear.git/blobdiff - simgear/nasal/lib.c
cppbind.Ghost: register _get called on retrieving unset member.
[simgear.git] / simgear / nasal / lib.c
index 11c8e434ac3b0aadae09f6f0b2d5afd81bfb3bdd..796c3ca3c7008e2e9cc03f583328c87eb94e68f2 100644 (file)
@@ -56,7 +56,7 @@ static naRef f_pop(naContext c, naRef me, int argc, naRef* args)
 static naRef f_setsize(naContext c, naRef me, int argc, naRef* args)
 {
     if(argc < 2 || !naIsVector(args[0])) ARGERR();
-    naVec_setsize(args[0], (int)naNumValue(args[1]).num);
+    naVec_setsize(c, args[0], (int)naNumValue(args[1]).num);
     return args[0];
 }
 
@@ -74,7 +74,7 @@ static naRef f_subvec(naContext c, naRef me, int argc, naRef* args)
     if(naIsNil(nlen) || len > naVec_size(v) - start)
         len = naVec_size(v) - start;
     result = naNewVector(c);
-    naVec_setsize(result, len);
+    naVec_setsize(c, result, len);
     for(i=0; i<len; i++)
         naVec_set(result, i, naVec_get(v, start + i));
     return result;
@@ -146,6 +146,32 @@ static naRef f_substr(naContext c, naRef me, int argc, naRef* args)
     return naStr_substr(naNewString(c), src, start, len);
 }
 
+static naRef f_left(naContext c, naRef me, int argc, naRef* args)
+{
+    int len;
+    naRef src = argc > 0 ? args[0] : naNil();
+    naRef lenr = argc > 1 ? naNumValue(args[1]) : naNil();
+    if(!naIsString(src)) ARGERR();
+    if(!naIsNum(lenr)) ARGERR();
+    len = (int)lenr.num;
+    if(len < 0) len = 0;
+    return naStr_substr(naNewString(c), src, 0, len);
+}
+
+static naRef f_right(naContext c, naRef me, int argc, naRef* args)
+{
+    int len, srclen;
+    naRef src = argc > 0 ? args[0] : naNil();
+    naRef lenr = argc > 1 ? naNumValue(args[1]) : naNil();
+    if(!naIsString(src)) ARGERR();
+    if(!naIsNum(lenr)) ARGERR();
+    srclen = naStr_len(src);
+    len = (int)lenr.num;
+    if (len > srclen) len = srclen;
+    if(len < 0) len = 0;
+    return naStr_substr(naNewString(c), src, srclen - len, len);
+}
+
 static naRef f_chr(naContext c, naRef me, int argc, naRef* args)
 {
     char chr[1];
@@ -226,7 +252,7 @@ static naRef f_call(naContext c, naRef me, int argc, naRef* args)
     callargs = argc > 1 ? args[1] : naNil();
     callme = argc > 2 ? args[2] : naNil(); // Might be nil, that's OK
     callns = argc > 3 ? args[3] : naNil(); // ditto
-    if(!IS_HASH(callme)) callme = naNil();
+    if(!IS_HASH(callme) && !IS_GHOST(callme)) callme = naNil();
     if(!IS_HASH(callns)) callns = naNil();
     if(argc==0 || !IS_FUNC(args[0]) || (!IS_NIL(callargs) && !IS_VEC(callargs)))
         ARGERR();
@@ -533,7 +559,7 @@ static naRef f_sort(naContext c, naRef me, int argc, naRef* args)
     qsort(sd.recs, sd.n, sizeof(sd.recs[0]),
           (int(*)(const void*,const void*))sortcmp);
     out = naNewVector(c);
-    naVec_setsize(out, sd.n);
+    naVec_setsize(c, out, sd.n);
     for(i=0; i<sd.n; i++)
         PTR(out).vec->rec->array[i] = sd.elems[sd.recs[i].i];
     naFree(sd.recs);
@@ -573,6 +599,8 @@ static naCFuncItem funcs[] = {
     { "streq", f_streq },
     { "cmp", f_cmp },
     { "substr", f_substr },
+    { "left", f_left },
+    { "right", f_right },
     { "chr", f_chr },
     { "contains", f_contains },
     { "typeof", f_typeof },