commit 2ee6bdc

default  ·  2023-02-06 10:09:11 +0000 UTC
parent 66d974a
Backport from xs.
2 files changed,  +53, -9
M xs.h
M xs.h
+52, -8
  1@@ -15,7 +15,7 @@
  2 
  3 typedef enum {
  4     XSTYPE_STRING = 0x02,       /* C string (\0 delimited) (NOT STORED) */
  5-    XSTYPE_NUMBER = 0x17,       /* C string (\0 delimited) */
  6+    XSTYPE_NUMBER = 0x17,       /* double in spirit, stored as a C string (\0 delimited) */
  7     XSTYPE_NULL   = 0x18,       /* Special NULL value */
  8     XSTYPE_TRUE   = 0x06,       /* Boolean */
  9     XSTYPE_FALSE  = 0x15,       /* Boolean */
 10@@ -23,7 +23,8 @@ typedef enum {
 11     XSTYPE_LITEM  = 0x1f,       /* Element of a list (any type) */
 12     XSTYPE_DICT   = 0x1c,       /* Sequence of DITEMs up to EOM (with 24bit size) */
 13     XSTYPE_DITEM  = 0x1e,       /* Element of a dict (STRING key + any type) */
 14-    XSTYPE_EOM    = 0x19        /* End of Multiple (LIST or DICT) */
 15+    XSTYPE_EOM    = 0x19,       /* End of Multiple (LIST or DICT) */
 16+    XSTYPE_DATA   = 0x10        /* A block of anonymous data */
 17 } xstype;
 18 
 19 
 20@@ -36,6 +37,7 @@ typedef char xs_str;
 21 typedef char xs_list;
 22 typedef char xs_dict;
 23 typedef char xs_number;
 24+typedef char xs_data;
 25 
 26 /* auto-destroyable strings */
 27 #define xs __attribute__ ((__cleanup__ (_xs_destroy))) xs_val
 28@@ -105,6 +107,10 @@ xs_number *xs_number_new(double f);
 29 double xs_number_get(const xs_number *v);
 30 const char *xs_number_str(const xs_number *v);
 31 
 32+xs_data *xs_data_new(const void *data, int size);
 33+int xs_data_size(const xs_data *value);
 34+void xs_data_get(const xs_data *value, void *data);
 35+
 36 void *xs_memmem(const char *haystack, int h_size, const char *needle, int n_size);
 37 
 38 
 39@@ -222,6 +228,7 @@ xstype xs_type(const xs_val *data)
 40     case XSTYPE_DITEM:
 41     case XSTYPE_NUMBER:
 42     case XSTYPE_EOM:
 43+    case XSTYPE_DATA:
 44         t = data[0];
 45         break;
 46     default:
 47@@ -268,11 +275,8 @@ int xs_size(const xs_val *data)
 48         break;
 49 
 50     case XSTYPE_LIST:
 51-        len = _xs_get_24b(data + 1);
 52-
 53-        break;
 54-
 55     case XSTYPE_DICT:
 56+    case XSTYPE_DATA:
 57         len = _xs_get_24b(data + 1);
 58 
 59         break;
 60@@ -341,7 +345,9 @@ xs_val *xs_expand(xs_val *data, int offset, int size)
 61     if (data != NULL)
 62         memmove(data + offset + size, data + offset, sz - offset);
 63 
 64-    if (xs_type(data) == XSTYPE_LIST || xs_type(data) == XSTYPE_DICT)
 65+    if (xs_type(data) == XSTYPE_LIST ||
 66+        xs_type(data) == XSTYPE_DICT ||
 67+        xs_type(data) == XSTYPE_DATA)
 68         _xs_put_24b(data + 1, sz + size);
 69 
 70     return data;
 71@@ -364,7 +370,9 @@ xs_val *xs_collapse(xs_val *data, int offset, int size)
 72     for (n = offset; n < sz; n++)
 73         data[n] = data[n + size];
 74 
 75-    if (xs_type(data) == XSTYPE_LIST || xs_type(data) == XSTYPE_DICT)
 76+    if (xs_type(data) == XSTYPE_LIST ||
 77+        xs_type(data) == XSTYPE_DICT ||
 78+        xs_type(data) == XSTYPE_DATA)
 79         _xs_put_24b(data + 1, sz);
 80 
 81     return xs_realloc(data, _xs_blk_size(sz));
 82@@ -1030,6 +1038,42 @@ const char *xs_number_str(const xs_number *v)
 83 }
 84 
 85 
 86+/* raw data blocks */
 87+
 88+xs_data *xs_data_new(const void *data, int size)
 89+/* returns a new raw data value */
 90+{
 91+    xs_data *v;
 92+
 93+    /* add the overhead (data type + 24bit size) */
 94+    size += 4;
 95+
 96+    v = xs_realloc(NULL, _xs_blk_size(size));
 97+    v[0] = XSTYPE_DATA;
 98+
 99+    _xs_put_24b(v + 1, size);
100+
101+    memcpy(&v[4], data, size);
102+
103+    return v;
104+}
105+
106+
107+int xs_data_size(const xs_data *value)
108+/* returns the size of the data stored inside value */
109+{
110+    return _xs_get_24b(value + 1) - 4;
111+}
112+
113+
114+void xs_data_get(const xs_data *value, void *data)
115+/* copies the raw data stored inside value into data */
116+{
117+    int size = _xs_get_24b(value + 1) - 4;
118+    memcpy(data, &value[4], size);
119+}
120+
121+
122 void *xs_memmem(const char *haystack, int h_size, const char *needle, int n_size)
123 /* clone of memmem */
124 {
+1, -1
1@@ -1 +1 @@
2-/* 452a86b01d695705a3f61a9b26208855c11118b1 */
3+/* 79e4ff3403fbbd78f57482122a2478c9453483a8 */