Browse Source

Return the object from table/array manipulation

mingodad 7 years ago
parent
commit
8b40e1904c
1 changed files with 65 additions and 9 deletions
  1. 65 9
      SquiLu/squirrel/sqbaselib.cpp

+ 65 - 9
SquiLu/squirrel/sqbaselib.cpp

@@ -708,10 +708,9 @@ static SQRESULT obj_delegate_weakref(HSQUIRRELVM v)
 
 static SQRESULT obj_clear(HSQUIRRELVM v)
 {
-	return sq_clear(v,-1);
+	return SQ_SUCCEEDED(sq_clear(v,-1)) ? 1 : SQ_ERROR;
 }
 
-
 static SQRESULT number_delegate_tochar(HSQUIRRELVM v)
 {
 	SQObject &o=stack_get(v,1);
@@ -745,7 +744,7 @@ static SQRESULT container_rawexists(HSQUIRRELVM v)
 
 static SQRESULT container_rawset(HSQUIRRELVM v)
 {
-	return sq_rawset(v,-3);
+	return SQ_SUCCEEDED(sq_rawset(v,-3)) ? 1 : SQ_ERROR;
 }
 
 static SQRESULT container_rawget(HSQUIRRELVM v)
@@ -813,18 +812,19 @@ SQRegFunction SQSharedState::_table_default_delegate_funcz[]={
 
 static SQRESULT array_append(HSQUIRRELVM v)
 {
-	return sq_arrayappend(v,-2);
+	return SQ_SUCCEEDED(sq_arrayappend(v,-2)) ? 1 : SQ_ERROR;
 }
 
 static SQRESULT array_extend(HSQUIRRELVM v)
 {
 	_array(stack_get(v,1))->Extend(_array(stack_get(v,2)));
-	return 0;
+	sq_pop(v,1);
+	return 1;
 }
 
 static SQRESULT array_reverse(HSQUIRRELVM v)
 {
-	return sq_arrayreverse(v,-1);
+	return SQ_SUCCEEDED(sq_arrayreverse(v,-1)) ? 1 : SQ_ERROR;
 }
 
 static SQRESULT array_pop(HSQUIRRELVM v)
@@ -849,7 +849,8 @@ static SQRESULT array_insert(HSQUIRRELVM v)
 	SQObject &val=stack_get(v,3);
 	if(!_array(o)->Insert(tointeger(idx),val))
 		return sq_throwerror(v,_SC("index out of range"));
-	return 0;
+	sq_pop(v,2);
+	return 1;
 }
 
 static SQRESULT array_set(HSQUIRRELVM v)
@@ -900,6 +901,8 @@ static inline SQRESULT array_resize_base(HSQUIRRELVM v, e_array_op_type opType)
             if(sq_gettop(v) > 2)
                 fill = stack_get(v, 3);
             _array(o)->Resize(tointeger(nsize),fill);
+            sq_settop(v, 1);
+            return 1;
         }
 		return SQ_OK;
 	}
@@ -958,7 +961,8 @@ static SQRESULT array_apply(HSQUIRRELVM v)
 	SQObject &o = stack_get(v,1);
 	if(SQ_FAILED(__map_array(_array(o),_array(o),v)))
 		return SQ_ERROR;
-	return 0;
+	sq_pop(v,1);
+	return 1;
 }
 
 static SQRESULT array_reduce(HSQUIRRELVM v)
@@ -1159,7 +1163,8 @@ static SQRESULT array_sort(HSQUIRRELVM v)
 			return SQ_ERROR;
 
 	}
-	return 0;
+	sq_settop(v,1);
+	return 1;
 }
 
 static SQRESULT array_slice(HSQUIRRELVM v)
@@ -1210,6 +1215,7 @@ static SQRESULT array_concat0 (HSQUIRRELVM v, int allowAll) {
       sq_pushstring(v, "", 0);
       return 1;
   }
+
   SQBlob blob(0, 8192);
 
   for (int i=opt_first; i <= opt_last; ++i) {
@@ -1950,6 +1956,55 @@ static SQRESULT string_getdelegate(HSQUIRRELVM v)
 	return SQ_SUCCEEDED(sq_getdefaultdelegate(v,OT_STRING))?1:SQ_ERROR;
 }
 
+// Based on utf8_check.c by Markus Kuhn, 2005
+// https://www.cl.cam.ac.uk/~mgk25/ucs/utf8_check.c
+// Optimized for predominantly 7-bit content by Alex Hultman, 2016
+// Licensed as Zlib, like the rest of this project
+static bool isValidUtf8(const unsigned char *s, size_t length)
+{
+    for (const unsigned char *e = s + length; s != e; ) {
+        if (s + 4 <= e && ((*(SQUnsignedInteger32 *) s) & 0x80808080) == 0) {
+            s += 4;
+        } else {
+            while (!(*s & 0x80)) {
+                if (++s == e) {
+                    return true;
+                }
+            }
+
+            if ((s[0] & 0x60) == 0x40) {
+                if (s + 1 >= e || (s[1] & 0xc0) != 0x80 || (s[0] & 0xfe) == 0xc0) {
+                    return false;
+                }
+                s += 2;
+            } else if ((s[0] & 0xf0) == 0xe0) {
+                if (s + 2 >= e || (s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80 ||
+                        (s[0] == 0xe0 && (s[1] & 0xe0) == 0x80) || (s[0] == 0xed && (s[1] & 0xe0) == 0xa0)) {
+                    return false;
+                }
+                s += 3;
+            } else if ((s[0] & 0xf8) == 0xf0) {
+                if (s + 3 >= e || (s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80 || (s[3] & 0xc0) != 0x80 ||
+                        (s[0] == 0xf0 && (s[1] & 0xf0) == 0x80) || (s[0] == 0xf4 && s[1] > 0x8f) || s[0] > 0xf4) {
+                    return false;
+                }
+                s += 4;
+            } else {
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+static SQRESULT string_isvalidutf8(HSQUIRRELVM v) {
+    SQ_FUNC_VARS_NO_TOP(v);
+    SQ_GET_STRING(v, 1, src);
+
+    sq_pushbool(v, isValidUtf8((const unsigned char*)src, src_size));
+    return 1;
+}
+
 //DAD end
 
 static void __strip_l(const SQChar *str,const SQChar **start)
@@ -2386,6 +2441,7 @@ SQRegFunction SQSharedState::_string_default_delegate_funcz[]={
 	{_SC("edit_distance"),string_edit_distance,-2, _SC("ssi")},
 	{_SC("mod_97_10"),string_mod_97_10,1, _SC("s")},
 	{_SC("iso88959_to_utf8"),string_iso88959_to_utf8,1, _SC("s")},
+	{_SC("isvalidutf8"),string_isvalidutf8,1, _SC("s")},
 #ifdef SQ_SUBLATIN
 	{_SC("sl_len"),string_sl_len,1, _SC("s")},
 	{_SC("sl_lower"),string_sl_lower,1, _SC("s")},