X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fnasal%2Flib.c;h=796c3ca3c7008e2e9cc03f583328c87eb94e68f2;hb=289777bd99877d8d1ab439744bff5865e426cab4;hp=11c8e434ac3b0aadae09f6f0b2d5afd81bfb3bdd;hpb=dd1ea541ecc4403bcea2ca8c60c03971d1f4338f;p=simgear.git diff --git a/simgear/nasal/lib.c b/simgear/nasal/lib.c index 11c8e434..796c3ca3 100644 --- a/simgear/nasal/lib.c +++ b/simgear/nasal/lib.c @@ -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 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; irec->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 },