diff options
| author | 2022-10-07 13:48:53 +0200 | |
|---|---|---|
| committer | 2022-10-07 13:48:53 +0200 | |
| commit | a4cf695e60e0d4f79638cb1f37f78b524411efcf (patch) | |
| tree | 3db5747f1f75e67bf5785c18b6753bfa80d6a9fa /xs.h | |
| parent | Don't indent entry children beyond 4. (diff) | |
| download | penes-snac2-a4cf695e60e0d4f79638cb1f37f78b524411efcf.tar.gz penes-snac2-a4cf695e60e0d4f79638cb1f37f78b524411efcf.tar.xz penes-snac2-a4cf695e60e0d4f79638cb1f37f78b524411efcf.zip | |
Backport from xs.
Diffstat (limited to 'xs.h')
| -rw-r--r-- | xs.h | 47 |
1 files changed, 25 insertions, 22 deletions
| @@ -43,6 +43,7 @@ xstype xs_type(const char *data); | |||
| 43 | int xs_size(const char *data); | 43 | int xs_size(const char *data); |
| 44 | int xs_is_null(char *data); | 44 | int xs_is_null(char *data); |
| 45 | d_char *xs_dup(const char *data); | 45 | d_char *xs_dup(const char *data); |
| 46 | void *xs_realloc(void *ptr, size_t size); | ||
| 46 | d_char *xs_expand(d_char *data, int offset, int size); | 47 | d_char *xs_expand(d_char *data, int offset, int size); |
| 47 | d_char *xs_collapse(d_char *data, int offset, int size); | 48 | d_char *xs_collapse(d_char *data, int offset, int size); |
| 48 | d_char *xs_insert_m(d_char *data, int offset, const char *mem, int size); | 49 | d_char *xs_insert_m(d_char *data, int offset, const char *mem, int size); |
| @@ -198,7 +199,7 @@ d_char *xs_dup(const char *data) | |||
| 198 | /* creates a duplicate of data */ | 199 | /* creates a duplicate of data */ |
| 199 | { | 200 | { |
| 200 | int sz = xs_size(data); | 201 | int sz = xs_size(data); |
| 201 | d_char *s = malloc(_xs_blk_size(sz)); | 202 | d_char *s = xs_realloc(NULL, _xs_blk_size(sz)); |
| 202 | 203 | ||
| 203 | memcpy(s, data, sz); | 204 | memcpy(s, data, sz); |
| 204 | 205 | ||
| @@ -206,29 +207,31 @@ d_char *xs_dup(const char *data) | |||
| 206 | } | 207 | } |
| 207 | 208 | ||
| 208 | 209 | ||
| 210 | void *xs_realloc(void *ptr, size_t size) | ||
| 211 | { | ||
| 212 | d_char *ndata = realloc(ptr, size); | ||
| 213 | |||
| 214 | if (ndata == NULL) { | ||
| 215 | fprintf(stderr, "**OUT OF MEMORY**\n"); | ||
| 216 | abort(); | ||
| 217 | } | ||
| 218 | |||
| 219 | return ndata; | ||
| 220 | } | ||
| 221 | |||
| 222 | |||
| 209 | d_char *xs_expand(d_char *data, int offset, int size) | 223 | d_char *xs_expand(d_char *data, int offset, int size) |
| 210 | /* opens a hole in data */ | 224 | /* opens a hole in data */ |
| 211 | { | 225 | { |
| 212 | int sz = xs_size(data); | 226 | int sz = xs_size(data); |
| 213 | int n; | ||
| 214 | 227 | ||
| 215 | /* open room */ | 228 | /* open room */ |
| 216 | if (sz == 0 || _xs_blk_size(sz) != _xs_blk_size(sz + size)) { | 229 | if (sz == 0 || _xs_blk_size(sz) != _xs_blk_size(sz + size)) |
| 217 | d_char *ndata; | 230 | data = xs_realloc(data, _xs_blk_size(sz + size)); |
| 218 | |||
| 219 | ndata = realloc(data, _xs_blk_size(sz + size)); | ||
| 220 | |||
| 221 | if (ndata == NULL) { | ||
| 222 | fprintf(stderr, "**OUT OF MEMORY**"); | ||
| 223 | abort(); | ||
| 224 | } | ||
| 225 | else | ||
| 226 | data = ndata; | ||
| 227 | } | ||
| 228 | 231 | ||
| 229 | /* move up the rest of the data */ | 232 | /* move up the rest of the data */ |
| 230 | for (n = sz + size - 1; n >= offset + size; n--) | 233 | if (data != NULL) |
| 231 | data[n] = data[n - size]; | 234 | memmove(data + offset + size, data + offset, sz - offset); |
| 232 | 235 | ||
| 233 | return data; | 236 | return data; |
| 234 | } | 237 | } |
| @@ -250,7 +253,7 @@ d_char *xs_collapse(d_char *data, int offset, int size) | |||
| 250 | for (n = offset; n < sz; n++) | 253 | for (n = offset; n < sz; n++) |
| 251 | data[n] = data[n + size]; | 254 | data[n] = data[n + size]; |
| 252 | 255 | ||
| 253 | return realloc(data, _xs_blk_size(sz)); | 256 | return xs_realloc(data, _xs_blk_size(sz)); |
| 254 | } | 257 | } |
| 255 | 258 | ||
| 256 | 259 | ||
| @@ -311,7 +314,7 @@ d_char *xs_fmt(const char *fmt, ...) | |||
| 311 | s = calloc(n, 1); | 314 | s = calloc(n, 1); |
| 312 | 315 | ||
| 313 | va_start(ap, fmt); | 316 | va_start(ap, fmt); |
| 314 | n = vsnprintf(s, n, fmt, ap); | 317 | vsnprintf(s, n, fmt, ap); |
| 315 | va_end(ap); | 318 | va_end(ap); |
| 316 | } | 319 | } |
| 317 | 320 | ||
| @@ -398,7 +401,7 @@ d_char *xs_list_new(void) | |||
| 398 | { | 401 | { |
| 399 | d_char *list; | 402 | d_char *list; |
| 400 | 403 | ||
| 401 | list = malloc(_xs_blk_size(2)); | 404 | list = xs_realloc(NULL, _xs_blk_size(2)); |
| 402 | list[0] = XSTYPE_LIST; | 405 | list[0] = XSTYPE_LIST; |
| 403 | list[1] = XSTYPE_EOL; | 406 | list[1] = XSTYPE_EOL; |
| 404 | 407 | ||
| @@ -573,7 +576,7 @@ d_char *xs_dict_new(void) | |||
| 573 | { | 576 | { |
| 574 | d_char *dict; | 577 | d_char *dict; |
| 575 | 578 | ||
| 576 | dict = malloc(_xs_blk_size(2)); | 579 | dict = xs_realloc(NULL, _xs_blk_size(2)); |
| 577 | dict[0] = XSTYPE_DICT; | 580 | dict[0] = XSTYPE_DICT; |
| 578 | dict[1] = XSTYPE_EOD; | 581 | dict[1] = XSTYPE_EOD; |
| 579 | 582 | ||
| @@ -688,7 +691,7 @@ d_char *xs_dict_set(d_char *dict, const char *key, const char *data) | |||
| 688 | d_char *xs_val_new(xstype t) | 691 | d_char *xs_val_new(xstype t) |
| 689 | /* adds a new special value */ | 692 | /* adds a new special value */ |
| 690 | { | 693 | { |
| 691 | d_char *v = malloc(_xs_blk_size(1)); | 694 | d_char *v = xs_realloc(NULL, _xs_blk_size(1)); |
| 692 | 695 | ||
| 693 | v[0] = t; | 696 | v[0] = t; |
| 694 | 697 | ||
| @@ -699,7 +702,7 @@ d_char *xs_val_new(xstype t) | |||
| 699 | d_char *xs_number_new(float f) | 702 | d_char *xs_number_new(float f) |
| 700 | /* adds a new number value */ | 703 | /* adds a new number value */ |
| 701 | { | 704 | { |
| 702 | d_char *v = malloc(_xs_blk_size(1 + sizeof(float))); | 705 | d_char *v = xs_realloc(NULL, _xs_blk_size(1 + sizeof(float))); |
| 703 | 706 | ||
| 704 | v[0] = XSTYPE_NUMBER; | 707 | v[0] = XSTYPE_NUMBER; |
| 705 | memcpy(&v[1], &f, sizeof(float)); | 708 | memcpy(&v[1], &f, sizeof(float)); |