diff options
| author | 2022-12-06 19:12:26 +0100 | |
|---|---|---|
| committer | 2022-12-06 19:12:26 +0100 | |
| commit | c60a4d9b0b97ddd19e89079c2016d7709e72bea2 (patch) | |
| tree | 1173be39ba751cb350c42bc15114b93072077b04 | |
| parent | Updated TODO. (diff) | |
| download | penes-snac2-c60a4d9b0b97ddd19e89079c2016d7709e72bea2.tar.gz penes-snac2-c60a4d9b0b97ddd19e89079c2016d7709e72bea2.tar.xz penes-snac2-c60a4d9b0b97ddd19e89079c2016d7709e72bea2.zip | |
Backport from xs.
| -rw-r--r-- | xs.h | 59 | ||||
| -rw-r--r-- | xs_version.h | 2 |
2 files changed, 41 insertions, 20 deletions
| @@ -200,11 +200,30 @@ xstype xs_type(const char *data) | |||
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | 202 | ||
| 203 | void _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 | |||
| 214 | int _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 | |||
| 203 | int xs_size(const char *data) | 223 | int 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 */ | ||