|
@@ -31,6 +31,10 @@
|
|
|
#include "os/keyboard.h"
|
|
|
#include <stdio.h>
|
|
|
|
|
|
+
|
|
|
+#define ENCODE_MASK 0xFF
|
|
|
+#define ENCODE_FLAG_64 1<<16
|
|
|
+
|
|
|
Error decode_variant(Variant& r_variant,const uint8_t *p_buffer, int p_len,int *r_len) {
|
|
|
|
|
|
const uint8_t * buf=p_buffer;
|
|
@@ -44,14 +48,14 @@ Error decode_variant(Variant& r_variant,const uint8_t *p_buffer, int p_len,int *
|
|
|
|
|
|
uint32_t type=decode_uint32(buf);
|
|
|
|
|
|
- ERR_FAIL_COND_V(type>=Variant::VARIANT_MAX,ERR_INVALID_DATA);
|
|
|
+ ERR_FAIL_COND_V((type&ENCODE_MASK)>=Variant::VARIANT_MAX,ERR_INVALID_DATA);
|
|
|
|
|
|
buf+=4;
|
|
|
len-=4;
|
|
|
if (r_len)
|
|
|
*r_len=4;
|
|
|
|
|
|
- switch(type) {
|
|
|
+ switch(type&ENCODE_MASK) {
|
|
|
|
|
|
case Variant::NIL: {
|
|
|
|
|
@@ -68,19 +72,35 @@ Error decode_variant(Variant& r_variant,const uint8_t *p_buffer, int p_len,int *
|
|
|
case Variant::INT: {
|
|
|
|
|
|
ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
|
|
|
- int val = decode_uint32(buf);
|
|
|
- r_variant=val;
|
|
|
- if (r_len)
|
|
|
- (*r_len)+=4;
|
|
|
+ if (type&ENCODE_FLAG_64) {
|
|
|
+ int64_t val = decode_uint64(buf);
|
|
|
+ r_variant=val;
|
|
|
+ if (r_len)
|
|
|
+ (*r_len)+=8;
|
|
|
+
|
|
|
+ } else {
|
|
|
+ int32_t val = decode_uint32(buf);
|
|
|
+ r_variant=val;
|
|
|
+ if (r_len)
|
|
|
+ (*r_len)+=4;
|
|
|
+ }
|
|
|
|
|
|
} break;
|
|
|
case Variant::REAL: {
|
|
|
|
|
|
ERR_FAIL_COND_V(len<(int)4,ERR_INVALID_DATA);
|
|
|
- float val = decode_float(buf);
|
|
|
- r_variant=val;
|
|
|
- if (r_len)
|
|
|
- (*r_len)+=4;
|
|
|
+
|
|
|
+ if (type&ENCODE_FLAG_64) {
|
|
|
+ double val = decode_double(buf);
|
|
|
+ r_variant=val;
|
|
|
+ if (r_len)
|
|
|
+ (*r_len)+=8;
|
|
|
+ } else {
|
|
|
+ float val = decode_float(buf);
|
|
|
+ r_variant=val;
|
|
|
+ if (r_len)
|
|
|
+ (*r_len)+=4;
|
|
|
+ }
|
|
|
|
|
|
} break;
|
|
|
case Variant::STRING: {
|
|
@@ -796,8 +816,28 @@ Error encode_variant(const Variant& p_variant, uint8_t *r_buffer, int &r_len) {
|
|
|
|
|
|
r_len=0;
|
|
|
|
|
|
+ uint32_t flags=0;
|
|
|
+
|
|
|
+ switch(p_variant.get_type()) {
|
|
|
+
|
|
|
+ case Variant::INT: {
|
|
|
+ int64_t val = p_variant;
|
|
|
+ if (val>0x7FFFFFFF || val < -0x80000000) {
|
|
|
+ flags|=ENCODE_FLAG_64;
|
|
|
+ }
|
|
|
+ } break;
|
|
|
+ case Variant::REAL: {
|
|
|
+
|
|
|
+ double d = p_variant;
|
|
|
+ float f = d;
|
|
|
+ if (double(f)!=d) {
|
|
|
+ flags|=ENCODE_FLAG_64; //always encode real as double
|
|
|
+ }
|
|
|
+ } break;
|
|
|
+ }
|
|
|
+
|
|
|
if (buf) {
|
|
|
- encode_uint32(p_variant.get_type(),buf);
|
|
|
+ encode_uint32(p_variant.get_type()|flags,buf);
|
|
|
buf+=4;
|
|
|
}
|
|
|
r_len+=4;
|
|
@@ -819,20 +859,42 @@ Error encode_variant(const Variant& p_variant, uint8_t *r_buffer, int &r_len) {
|
|
|
} break;
|
|
|
case Variant::INT: {
|
|
|
|
|
|
- if (buf) {
|
|
|
- encode_uint32(p_variant.operator int(),buf);
|
|
|
- }
|
|
|
+ int64_t val = p_variant;
|
|
|
+ if (val>0x7FFFFFFF || val < -0x80000000) {
|
|
|
+ //64 bits
|
|
|
+ if (buf) {
|
|
|
+ encode_uint64(val,buf);
|
|
|
+ }
|
|
|
|
|
|
- r_len+=4;
|
|
|
+ r_len+=8;
|
|
|
+ } else {
|
|
|
+ if (buf) {
|
|
|
+ encode_uint32(int32_t(val),buf);
|
|
|
+ }
|
|
|
|
|
|
+ r_len+=4;
|
|
|
+ }
|
|
|
} break;
|
|
|
case Variant::REAL: {
|
|
|
|
|
|
- if (buf) {
|
|
|
- encode_float(p_variant.operator float(),buf);
|
|
|
+ double d = p_variant;
|
|
|
+ float f = d;
|
|
|
+ if (double(f)!=d) {
|
|
|
+ if (buf) {
|
|
|
+ encode_double(p_variant.operator double(),buf);
|
|
|
+ }
|
|
|
+
|
|
|
+ r_len+=8;
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if (buf) {
|
|
|
+ encode_double(p_variant.operator float(),buf);
|
|
|
+ }
|
|
|
+
|
|
|
+ r_len+=4;
|
|
|
}
|
|
|
|
|
|
- r_len+=4;
|
|
|
|
|
|
} break;
|
|
|
case Variant::NODE_PATH: {
|