commit c60a4d9

default  ·  2022-12-06 18:12:26 +0000 UTC
parent 345f644
Backport from xs.
2 files changed,  +41, -20
M xs.h
M xs.h
+40, -19
  1@@ -200,11 +200,30 @@ xstype xs_type(const char *data)
  2 }
  3 
  4 
  5+void _xs_put_24b(char *ptr, int i)
  6+/* writes i as a 24 bit value */
  7+{
  8+    unsigned char *p = (unsigned char *)ptr;
  9+
 10+    p[0] = (i >> 16) & 0xff;
 11+    p[1] = (i >> 8) & 0xff;
 12+    p[2] = i & 0xff;
 13+}
 14+
 15+
 16+int _xs_get_24b(const char *ptr)
 17+/* reads a 24 bit value */
 18+{
 19+    unsigned char *p = (unsigned char *)ptr;
 20+
 21+    return (p[0] << 16) | (p[1] << 8) | p[2];
 22+}
 23+
 24+
 25 int xs_size(const char *data)
 26 /* returns the size of data in bytes */
 27 {
 28     int len = 0;
 29-    int c = 0;
 30     const char *p;
 31 
 32     if (data == NULL)
 33@@ -216,20 +235,12 @@ int xs_size(const char *data)
 34         break;
 35 
 36     case XSTYPE_LIST:
 37-        /* look for a balanced EOL */
 38-        do {
 39-            c += data[len] == XSTYPE_LIST ? 1 : data[len] == XSTYPE_EOL ? -1 : 0;
 40-            len++;
 41-        } while (c);
 42+        len = _xs_get_24b(data + 1);
 43 
 44         break;
 45 
 46     case XSTYPE_DICT:
 47-        /* look for a balanced EOD */
 48-        do {
 49-            c += data[len] == XSTYPE_DICT ? 1 : data[len] == XSTYPE_EOD ? -1 : 0;
 50-            len++;
 51-        } while (c);
 52+        len = _xs_get_24b(data + 1);
 53 
 54         break;
 55 
 56@@ -297,6 +308,9 @@ d_char *xs_expand(d_char *data, int offset, int size)
 57     if (data != NULL)
 58         memmove(data + offset + size, data + offset, sz - offset);
 59 
 60+    if (xs_type(data) == XSTYPE_LIST || xs_type(data) == XSTYPE_DICT)
 61+        _xs_put_24b(data + 1, sz + size);
 62+
 63     return data;
 64 }
 65 
 66@@ -317,6 +331,9 @@ d_char *xs_collapse(d_char *data, int offset, int size)
 67     for (n = offset; n < sz; n++)
 68         data[n] = data[n + size];
 69 
 70+    if (xs_type(data) == XSTYPE_LIST || xs_type(data) == XSTYPE_DICT)
 71+        _xs_put_24b(data + 1, sz);
 72+
 73     return xs_realloc(data, _xs_blk_size(sz));
 74 }
 75 
 76@@ -464,9 +481,11 @@ d_char *xs_list_new(void)
 77 {
 78     d_char *list;
 79 
 80-    list = xs_realloc(NULL, _xs_blk_size(2));
 81+    list = xs_realloc(NULL, _xs_blk_size(5));
 82     list[0] = XSTYPE_LIST;
 83-    list[1] = XSTYPE_EOL;
 84+    list[4] = XSTYPE_EOL;
 85+
 86+    _xs_put_24b(list + 1, 5);
 87 
 88     return list;
 89 }
 90@@ -502,9 +521,9 @@ int xs_list_iter(char **list, char **value)
 91 
 92     p = *list;
 93 
 94-    /* skip a possible start of the list */
 95+    /* skip the start of the list */
 96     if (*p == XSTYPE_LIST)
 97-        p++;
 98+        p += 4;
 99 
100     /* an element? */
101     if (*p == XSTYPE_LITEM) {
102@@ -709,9 +728,11 @@ d_char *xs_dict_new(void)
103 {
104     d_char *dict;
105 
106-    dict = xs_realloc(NULL, _xs_blk_size(2));
107+    dict = xs_realloc(NULL, _xs_blk_size(5));
108     dict[0] = XSTYPE_DICT;
109-    dict[1] = XSTYPE_EOD;
110+    dict[4] = XSTYPE_EOD;
111+
112+    _xs_put_24b(dict + 1, 5);
113 
114     return dict;
115 }
116@@ -743,9 +764,9 @@ int xs_dict_iter(char **dict, char **key, char **value)
117 
118     p = *dict;
119 
120-    /* skip a possible start of the list */
121+    /* skip the start of the list */
122     if (*p == XSTYPE_DICT)
123-        p++;
124+        p += 4;
125 
126     /* an element? */
127     if (*p == XSTYPE_DITEM) {
+1, -1
1@@ -1 +1 @@
2-/* c18371e1f1d3de0f872354f93024a736caebea4d */
3+/* a4ce4b2c0c9cd7c40aedd31eb352e3b979de3a17 */