summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xs.h59
-rw-r--r--xs_version.h2
2 files changed, 41 insertions, 20 deletions
diff --git a/xs.h b/xs.h
index 9cae3dc..63342db 100644
--- a/xs.h
+++ b/xs.h
@@ -200,11 +200,30 @@ xstype xs_type(const char *data)
200} 200}
201 201
202 202
203void _xs_put_24b(char *ptr, int i)
204/* writes i as a 24 bit value */
205{
206 unsigned char *p = (unsigned char *)ptr;
207
208 p[0] = (i >> 16) & 0xff;
209 p[1] = (i >> 8) & 0xff;
210 p[2] = i & 0xff;
211}
212
213
214int _xs_get_24b(const char *ptr)
215/* reads a 24 bit value */
216{
217 unsigned char *p = (unsigned char *)ptr;
218
219 return (p[0] << 16) | (p[1] << 8) | p[2];
220}
221
222
203int xs_size(const char *data) 223int xs_size(const char *data)
204/* returns the size of data in bytes */ 224/* returns the size of data in bytes */
205{ 225{
206 int len = 0; 226 int len = 0;
207 int c = 0;
208 const char *p; 227 const char *p;
209 228
210 if (data == NULL) 229 if (data == NULL)
@@ -216,20 +235,12 @@ int xs_size(const char *data)
216 break; 235 break;
217 236
218 case XSTYPE_LIST: 237 case XSTYPE_LIST:
219 /* look for a balanced EOL */ 238 len = _xs_get_24b(data + 1);
220 do {
221 c += data[len] == XSTYPE_LIST ? 1 : data[len] == XSTYPE_EOL ? -1 : 0;
222 len++;
223 } while (c);
224 239
225 break; 240 break;
226 241
227 case XSTYPE_DICT: 242 case XSTYPE_DICT:
228 /* look for a balanced EOD */ 243 len = _xs_get_24b(data + 1);
229 do {
230 c += data[len] == XSTYPE_DICT ? 1 : data[len] == XSTYPE_EOD ? -1 : 0;
231 len++;
232 } while (c);
233 244
234 break; 245 break;
235 246
@@ -297,6 +308,9 @@ d_char *xs_expand(d_char *data, int offset, int size)
297 if (data != NULL) 308 if (data != NULL)
298 memmove(data + offset + size, data + offset, sz - offset); 309 memmove(data + offset + size, data + offset, sz - offset);
299 310
311 if (xs_type(data) == XSTYPE_LIST || xs_type(data) == XSTYPE_DICT)
312 _xs_put_24b(data + 1, sz + size);
313
300 return data; 314 return data;
301} 315}
302 316
@@ -317,6 +331,9 @@ d_char *xs_collapse(d_char *data, int offset, int size)
317 for (n = offset; n < sz; n++) 331 for (n = offset; n < sz; n++)
318 data[n] = data[n + size]; 332 data[n] = data[n + size];
319 333
334 if (xs_type(data) == XSTYPE_LIST || xs_type(data) == XSTYPE_DICT)
335 _xs_put_24b(data + 1, sz);
336
320 return xs_realloc(data, _xs_blk_size(sz)); 337 return xs_realloc(data, _xs_blk_size(sz));
321} 338}
322 339
@@ -464,9 +481,11 @@ d_char *xs_list_new(void)
464{ 481{
465 d_char *list; 482 d_char *list;
466 483
467 list = xs_realloc(NULL, _xs_blk_size(2)); 484 list = xs_realloc(NULL, _xs_blk_size(5));
468 list[0] = XSTYPE_LIST; 485 list[0] = XSTYPE_LIST;
469 list[1] = XSTYPE_EOL; 486 list[4] = XSTYPE_EOL;
487
488 _xs_put_24b(list + 1, 5);
470 489
471 return list; 490 return list;
472} 491}
@@ -502,9 +521,9 @@ int xs_list_iter(char **list, char **value)
502 521
503 p = *list; 522 p = *list;
504 523
505 /* skip a possible start of the list */ 524 /* skip the start of the list */
506 if (*p == XSTYPE_LIST) 525 if (*p == XSTYPE_LIST)
507 p++; 526 p += 4;
508 527
509 /* an element? */ 528 /* an element? */
510 if (*p == XSTYPE_LITEM) { 529 if (*p == XSTYPE_LITEM) {
@@ -709,9 +728,11 @@ d_char *xs_dict_new(void)
709{ 728{
710 d_char *dict; 729 d_char *dict;
711 730
712 dict = xs_realloc(NULL, _xs_blk_size(2)); 731 dict = xs_realloc(NULL, _xs_blk_size(5));
713 dict[0] = XSTYPE_DICT; 732 dict[0] = XSTYPE_DICT;
714 dict[1] = XSTYPE_EOD; 733 dict[4] = XSTYPE_EOD;
734
735 _xs_put_24b(dict + 1, 5);
715 736
716 return dict; 737 return dict;
717} 738}
@@ -743,9 +764,9 @@ int xs_dict_iter(char **dict, char **key, char **value)
743 764
744 p = *dict; 765 p = *dict;
745 766
746 /* skip a possible start of the list */ 767 /* skip the start of the list */
747 if (*p == XSTYPE_DICT) 768 if (*p == XSTYPE_DICT)
748 p++; 769 p += 4;
749 770
750 /* an element? */ 771 /* an element? */
751 if (*p == XSTYPE_DITEM) { 772 if (*p == XSTYPE_DITEM) {
diff --git a/xs_version.h b/xs_version.h
index baefcba..70bed0e 100644
--- a/xs_version.h
+++ b/xs_version.h
@@ -1 +1 @@
/* c18371e1f1d3de0f872354f93024a736caebea4d */ /* a4ce4b2c0c9cd7c40aedd31eb352e3b979de3a17 */