summaryrefslogtreecommitdiff
path: root/xs.h
diff options
context:
space:
mode:
authorGravatar default2022-10-07 13:48:53 +0200
committerGravatar default2022-10-07 13:48:53 +0200
commita4cf695e60e0d4f79638cb1f37f78b524411efcf (patch)
tree3db5747f1f75e67bf5785c18b6753bfa80d6a9fa /xs.h
parentDon't indent entry children beyond 4. (diff)
downloadpenes-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.h47
1 files changed, 25 insertions, 22 deletions
diff --git a/xs.h b/xs.h
index 079b1f2..0537c33 100644
--- a/xs.h
+++ b/xs.h
@@ -43,6 +43,7 @@ xstype xs_type(const char *data);
43int xs_size(const char *data); 43int xs_size(const char *data);
44int xs_is_null(char *data); 44int xs_is_null(char *data);
45d_char *xs_dup(const char *data); 45d_char *xs_dup(const char *data);
46void *xs_realloc(void *ptr, size_t size);
46d_char *xs_expand(d_char *data, int offset, int size); 47d_char *xs_expand(d_char *data, int offset, int size);
47d_char *xs_collapse(d_char *data, int offset, int size); 48d_char *xs_collapse(d_char *data, int offset, int size);
48d_char *xs_insert_m(d_char *data, int offset, const char *mem, int size); 49d_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
210void *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
209d_char *xs_expand(d_char *data, int offset, int size) 223d_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)
688d_char *xs_val_new(xstype t) 691d_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)
699d_char *xs_number_new(float f) 702d_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));