diff options
| -rw-r--r-- | xs.h | 35 | ||||
| -rw-r--r-- | xs_unicode.h | 10 | ||||
| -rw-r--r-- | xs_version.h | 2 |
3 files changed, 22 insertions, 25 deletions
| @@ -54,6 +54,7 @@ void _xs_destroy(char **var); | |||
| 54 | xstype xs_type(const xs_val *data); | 54 | xstype xs_type(const xs_val *data); |
| 55 | int xs_size(const xs_val *data); | 55 | int xs_size(const xs_val *data); |
| 56 | int xs_is_null(const xs_val *data); | 56 | int xs_is_null(const xs_val *data); |
| 57 | int xs_cmp(const xs_val *v1, const xs_val *v2); | ||
| 57 | xs_val *xs_dup(const xs_val *data); | 58 | xs_val *xs_dup(const xs_val *data); |
| 58 | xs_val *xs_expand(xs_val *data, int offset, int size); | 59 | xs_val *xs_expand(xs_val *data, int offset, int size); |
| 59 | xs_val *xs_collapse(xs_val *data, int offset, int size); | 60 | xs_val *xs_collapse(xs_val *data, int offset, int size); |
| @@ -91,7 +92,6 @@ int xs_list_len(const xs_list *list); | |||
| 91 | xs_val *xs_list_get(const xs_list *list, int num); | 92 | xs_val *xs_list_get(const xs_list *list, int num); |
| 92 | xs_list *xs_list_del(xs_list *list, int num); | 93 | xs_list *xs_list_del(xs_list *list, int num); |
| 93 | xs_list *xs_list_insert(xs_list *list, int num, const xs_val *data); | 94 | xs_list *xs_list_insert(xs_list *list, int num, const xs_val *data); |
| 94 | xs_list *xs_list_insert_sorted(xs_list *list, const char *str); | ||
| 95 | xs_list *xs_list_set(xs_list *list, int num, const xs_val *data); | 95 | xs_list *xs_list_set(xs_list *list, int num, const xs_val *data); |
| 96 | xs_list *xs_list_dequeue(xs_list *list, xs_val **data, int last); | 96 | xs_list *xs_list_dequeue(xs_list *list, xs_val **data, int last); |
| 97 | #define xs_list_pop(list, data) xs_list_dequeue(list, data, 1) | 97 | #define xs_list_pop(list, data) xs_list_dequeue(list, data, 1) |
| @@ -350,6 +350,17 @@ int xs_is_null(const xs_val *data) | |||
| 350 | } | 350 | } |
| 351 | 351 | ||
| 352 | 352 | ||
| 353 | int xs_cmp(const xs_val *v1, const xs_val *v2) | ||
| 354 | /* compares two values */ | ||
| 355 | { | ||
| 356 | int s1 = xs_size(v1); | ||
| 357 | int s2 = xs_size(v2); | ||
| 358 | int d = s1 - s2; | ||
| 359 | |||
| 360 | return d == 0 ? memcmp(v1, v2, s1) : d; | ||
| 361 | } | ||
| 362 | |||
| 363 | |||
| 353 | xs_val *xs_dup(const xs_val *data) | 364 | xs_val *xs_dup(const xs_val *data) |
| 354 | /* creates a duplicate of data */ | 365 | /* creates a duplicate of data */ |
| 355 | { | 366 | { |
| @@ -767,28 +778,6 @@ xs_list *xs_list_insert(xs_list *list, int num, const xs_val *data) | |||
| 767 | } | 778 | } |
| 768 | 779 | ||
| 769 | 780 | ||
| 770 | xs_list *xs_list_insert_sorted(xs_list *list, const xs_str *str) | ||
| 771 | /* inserts a string in the list in its ordered position */ | ||
| 772 | { | ||
| 773 | XS_ASSERT_TYPE(list, XSTYPE_LIST); | ||
| 774 | XS_ASSERT_TYPE(str, XSTYPE_STRING); | ||
| 775 | |||
| 776 | char *p, *v; | ||
| 777 | int offset = xs_size(list); | ||
| 778 | |||
| 779 | p = list; | ||
| 780 | while (xs_list_iter(&p, &v)) { | ||
| 781 | /* if this element is greater or equal, insert here */ | ||
| 782 | if (strcmp(v, str) >= 0) { | ||
| 783 | offset = v - list; | ||
| 784 | break; | ||
| 785 | } | ||
| 786 | } | ||
| 787 | |||
| 788 | return _xs_list_write_litem(list, offset - 1, str, xs_size(str)); | ||
| 789 | } | ||
| 790 | |||
| 791 | |||
| 792 | xs_list *xs_list_set(xs_list *list, int num, const xs_val *data) | 781 | xs_list *xs_list_set(xs_list *list, int num, const xs_val *data) |
| 793 | /* sets the element at #num position */ | 782 | /* sets the element at #num position */ |
| 794 | { | 783 | { |
diff --git a/xs_unicode.h b/xs_unicode.h index 036c843..47e1101 100644 --- a/xs_unicode.h +++ b/xs_unicode.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #define _XS_UNICODE_H | 5 | #define _XS_UNICODE_H |
| 6 | 6 | ||
| 7 | int _xs_utf8_enc(char buf[4], unsigned int cpoint); | 7 | int _xs_utf8_enc(char buf[4], unsigned int cpoint); |
| 8 | int xs_is_utf8_cont_byte(char c); | ||
| 8 | unsigned int xs_utf8_dec(char **str); | 9 | unsigned int xs_utf8_dec(char **str); |
| 9 | int xs_unicode_width(unsigned int cpoint); | 10 | int xs_unicode_width(unsigned int cpoint); |
| 10 | int xs_is_surrogate(unsigned int cpoint); | 11 | int xs_is_surrogate(unsigned int cpoint); |
| @@ -58,6 +59,13 @@ int _xs_utf8_enc(char buf[4], unsigned int cpoint) | |||
| 58 | } | 59 | } |
| 59 | 60 | ||
| 60 | 61 | ||
| 62 | int xs_is_utf8_cont_byte(char c) | ||
| 63 | /* returns true if c is an utf8 continuation byte */ | ||
| 64 | { | ||
| 65 | return ((c & 0xc0) == 0x80); | ||
| 66 | } | ||
| 67 | |||
| 68 | |||
| 61 | unsigned int xs_utf8_dec(char **str) | 69 | unsigned int xs_utf8_dec(char **str) |
| 62 | /* decodes an utf-8 char inside str and updates the pointer */ | 70 | /* decodes an utf-8 char inside str and updates the pointer */ |
| 63 | { | 71 | { |
| @@ -86,7 +94,7 @@ unsigned int xs_utf8_dec(char **str) | |||
| 86 | } | 94 | } |
| 87 | 95 | ||
| 88 | /* process the continuation bytes */ | 96 | /* process the continuation bytes */ |
| 89 | while (cb > 0 && *p && (*p & 0xc0) == 0x80) | 97 | while (cb > 0 && *p && xs_is_utf8_cont_byte(*p)) |
| 90 | cpoint |= (*p++ & 0x3f) << (--cb * 6); | 98 | cpoint |= (*p++ & 0x3f) << (--cb * 6); |
| 91 | 99 | ||
| 92 | /* incomplete or broken? */ | 100 | /* incomplete or broken? */ |
diff --git a/xs_version.h b/xs_version.h index c592d93..781e4ba 100644 --- a/xs_version.h +++ b/xs_version.h | |||
| @@ -1 +1 @@ | |||
| /* 72caf9fc60c0b90f39a3c62b238d1c9663d109bc 2024-01-07T09:26:08+01:00 */ | /* e277e59e0ccbe2111aaf884c85ccadeebabd5281 2024-01-30T13:56:36+01:00 */ | ||