Sfoglia il codice sorgente

Fix sle encode (string lenght encode)

mingodad 9 anni fa
parent
commit
17f8751737
2 ha cambiato i file con 72 aggiunte e 118 eliminazioni
  1. 38 66
      SquiLu-ext/sq_sqlite3.cpp
  2. 34 52
      SquiLu-ourbiz/s/ourbiz/app-base.js

+ 38 - 66
SquiLu-ext/sq_sqlite3.cpp

@@ -1095,15 +1095,11 @@ static SQRESULT sq_sqlite3_stmt_asJsonObject(HSQUIRRELVM v)
 }
 
 #define UNSIGNED(n) n##U
-#define IBYTE1 UNSIGNED(255)
-#define IBYTE2 UNSIGNED(255*255)
-#define IBYTE3 UNSIGNED(255*255*255)
-#define IBYTE4 UNSIGNED(255*255*255*255)
-
-#define SIZE1BYTE 250
-#define SIZE2BYTE 251
-#define SIZE3BYTE 252
-#define SIZE4BYTE 253
+#define IBYTE_MAX UNSIGNED(256)
+#define IBYTE1 UNSIGNED(240)
+#define IBYTE2 UNSIGNED(2287)
+#define IBYTE3 UNSIGNED(67823)
+#define IBYTE4 UNSIGNED(16777215)
 
 #define SLEMARK 254
 #define SLEEND 255
@@ -1121,33 +1117,23 @@ static SQRESULT sle2array(HSQUIRRELVM v, const unsigned char *p, size_t sle_size
     while(*p != SLEEND) //data finished now follow digest
     {
         size = *p++;
-        if(size >= SIZE1BYTE)
+        if(size > IBYTE1)
         {
-            if(size == SIZE1BYTE)
+            if(size <= 248)
             {
-                //data bigger than 250 and less 500 next byte has more info
-                size += *p++;
+                size = (size-241)*IBYTE_MAX + (*p++) + IBYTE1;
             }
-            else if(size == SIZE2BYTE)
+            else if(size == 249)
             {
-                //data bigger than 250 next two bytes has more info
-                size = (*p++ * IBYTE1);
-                size += *p++;
+                size = 2288 + (IBYTE_MAX * (*p++)) + (*p++);
             }
-            else if(size == SIZE3BYTE)
+            else if(size == 250)
             {
-                //data bigger than 250 next three bytes has more info
-                size = (*p++ * IBYTE2);
-                size += (*p++ * IBYTE1);
-                size += *p++;
+                size = ((*p++)<<16) + ((*p++)<<8) + (*p++);
             }
-            else if(size == SIZE4BYTE)
+            else if(size == 251)
             {
-                //data bigger than 250 next four bytes has more info
-                size = (*p++ * IBYTE3);
-                size += (*p++ * IBYTE2);
-                size += (*p++ * IBYTE1);
-                size += *p++;
+                size = ((*p++)<<24) + ((*p++)<<16) + ((*p++)<<8) + (*p++);
             }
             else if(size == SLEMARK)
             {
@@ -1265,53 +1251,42 @@ typedef unsigned char slebuf_t[8];
 
 static int sleSize2buf(slebuf_t sle, size_t size)
 {
-    size_t next_size, tmp_size;
-    if(size < SIZE1BYTE)
+    size_t next_size;
+    if(size <= IBYTE1)
     {
         sle[0] = size;
         return 1;
     }
-    else if(size < (SIZE1BYTE*2))
+    else if(size <= IBYTE2)
     {
-        sle[0] = SIZE1BYTE;
-        next_size = size - 250;
-        sle[1] = next_size;
+        next_size = size - IBYTE1;
+        sle[0] = next_size/IBYTE_MAX + 241;
+        sle[1] = next_size%IBYTE_MAX;
         return 2;
     }
-    else if(size < IBYTE2)
+    else if(size <= IBYTE3)
     {
-        sle[0] = SIZE2BYTE;
-        next_size = size/IBYTE1;
-        sle[1] = next_size;
-        next_size = size%IBYTE1;
-        sle[2] = next_size;
+        sle[0] = 249;
+        next_size = size - 2288;
+        sle[1] = next_size/IBYTE_MAX;
+        sle[2] = next_size%IBYTE_MAX;
         return 3;
     }
-    else if(size < IBYTE3)
+    else if(size <= IBYTE4)
     {
-        sle[0] = SIZE3BYTE;
-        next_size = size/IBYTE2;
-        sle[1] = next_size;
-        tmp_size = size%IBYTE2;
-        next_size = tmp_size/IBYTE1;
-        sle[2] = next_size;
-        next_size = tmp_size%IBYTE1;
-        sle[3] = next_size;
+        sle[0] = 250;
+        sle[1] = size >> 16;
+        sle[2] = size >> 8;
+        sle[3] = size;
         return 4;
     }
-    else if(size < IBYTE4)
-    {
-        sle[0] = SIZE4BYTE;
-        next_size = size/IBYTE3;
-        sle[1] = next_size;
-        tmp_size = size%IBYTE3;
-        next_size = tmp_size/IBYTE2;
-        sle[2] = next_size;
-        tmp_size = tmp_size%IBYTE2;
-        next_size = tmp_size/IBYTE1;
-        sle[3] = next_size;
-        next_size = tmp_size%IBYTE1;
-        sle[5] = next_size;
+    else
+    {
+        sle[0] = 251;
+        sle[1] = size >> 24;
+        sle[2] = size >> 16;
+        sle[3] = size >> 8;
+        sle[4] = size;
         return 5;
     }
     return 0;
@@ -3377,10 +3352,7 @@ extern "C" {
         INT_SLE_CONST(IBYTE2);
         INT_SLE_CONST(IBYTE3);
         INT_SLE_CONST(IBYTE4);
-        INT_SLE_CONST(SIZE1BYTE);
-        INT_SLE_CONST(SIZE2BYTE);
-        INT_SLE_CONST(SIZE3BYTE);
-        INT_SLE_CONST(SIZE4BYTE);
+        INT_SLE_CONST(IBYTE_MAX);
         INT_SLE_CONST(SLEMARK);
         INT_SLE_CONST(SLEEND);
 

+ 34 - 52
SquiLu-ourbiz/s/ourbiz/app-base.js

@@ -1789,15 +1789,6 @@ dad.fillSelectByRecords = function(select, records, addDumy, dummyValue){
 };
 
 dad.StrLenEncoded = function(){
-var IBYTE1 = 255;
-var IBYTE2 = 255*255;
-var IBYTE3 = 255*255*255;
-var IBYTE4 = 255*255*255*255;
-
-var SIZE1BYTE = 250;
-var SIZE2BYTE = 251;
-var SIZE3BYTE = 252;
-var SIZE4BYTE = 253;
 
 var SLEMARK = 254;
 var SLEEND = 255;
@@ -1871,51 +1862,42 @@ this.sle2array = function(strascii, strascii_size, p, result_array)
 {
     if(strascii_size === 0) return 0;
     var size = 0, data_count = 0, data_len = 0;
-	var rec = [];
-	var mycharCodeAt = this.charCodeAt;
+    var rec = [];
+    var mycharCodeAt = this.charCodeAt;
     while((mycharCodeAt(strascii, p) !== SLEEND) || (p >= strascii_size)) //data finished now follow digest
     {
         size = mycharCodeAt(strascii, p++);
-        if(size >= SIZE1BYTE)
-        {
-            if(size === SIZE1BYTE)
-            {
-                //data bigger than 250 and less 500 next byte has more info
-                size += mycharCodeAt(strascii, p++);
-            }
-            else if(size === SIZE2BYTE)
-            {
-                //data bigger than 250 next two bytes has more info
-                size = mycharCodeAt(strascii, p++) * IBYTE1;
-                size += mycharCodeAt(strascii, p++);
-            }
-            else if(size === SIZE3BYTE)
-            {
-                //data bigger than 250 next three bytes has more info
-                size = mycharCodeAt(strascii, p++) * IBYTE2;
-                size += mycharCodeAt(strascii, p++) * IBYTE1;
-                size += mycharCodeAt(strascii, p++);
-            }
-            else if(size === SIZE4BYTE)
-            {
-                //data bigger than 250 next four bytes has more info
-                size = mycharCodeAt(strascii, p++) * IBYTE3;
-                size += mycharCodeAt(strascii, p++) * IBYTE2;
-                size += mycharCodeAt(strascii, p++) * IBYTE1;
-                size += mycharCodeAt(strascii, p++);
-            }
-            else if(size === SLEMARK)
-            {
-                //reserved can be used for multi part data, metadata, digest, ...
-                break;
-            }
-        }
-		if(size > 0) {
-			var segment = strascii.substr(p, size);
-			rec.push(this.utf8toUtf16(segment));
-			//try {rec.push(decodeURIComponent(escape(segment)));} catch(e) {rec.push(segment);}
-		}
-		else rec.push("");
+	if(size <= 240)
+	{
+	}
+	else if(size <= 248)
+	{
+		size = (size-241)*256 + mycharCodeAt(strascii, p++) + 240;
+	}
+	else if(size === 249)
+	{
+		size = 2288 + 256*mycharCodeAt(strascii, p++) + mycharCodeAt(strascii, p++);
+	}
+	else if(size === 250)
+	{
+		size = (mycharCodeAt(strascii, p++)<<16) + (mycharCodeAt(strascii, p++)<<8) +
+			mycharCodeAt(strascii, p++);
+	}
+	else if(size === 251)
+	{
+		size = (mycharCodeAt(strascii, p++)<<24) + (mycharCodeAt(strascii, p++)<<16) +
+			(mycharCodeAt(strascii, p++)<<8) + mycharCodeAt(strascii, p++);
+	}
+	else if(size === SLEMARK)
+	{
+		//reserved can be used for multi part data, metadata, digest, ...
+	}
+	if(size > 0) {
+		var segment = strascii.substr(p, size);
+		rec.push(this.utf8toUtf16(segment));
+		//try {rec.push(decodeURIComponent(escape(segment)));} catch(e) {rec.push(segment);}
+	}
+	else rec.push("");
         p += size;
         data_count++;
         data_len += size;
@@ -1926,7 +1908,7 @@ this.sle2array = function(strascii, strascii_size, p, result_array)
             break;
         }
     }
-	result_array.push(rec);
+    result_array.push(rec);
     return ++p;
 };