summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xs.h69
-rw-r--r--xs_curl.h4
-rw-r--r--xs_encdec.h6
-rw-r--r--xs_httpd.h6
-rw-r--r--xs_json.h22
-rw-r--r--xs_openssl.h4
-rw-r--r--xs_set.h8
-rw-r--r--xs_version.h2
8 files changed, 70 insertions, 51 deletions
diff --git a/xs.h b/xs.h
index d30b26f..6f3a0ed 100644
--- a/xs.h
+++ b/xs.h
@@ -34,6 +34,9 @@ typedef char d_char;
34/* auto-destroyable strings */ 34/* auto-destroyable strings */
35#define xs __attribute__ ((__cleanup__ (_xs_destroy))) d_char 35#define xs __attribute__ ((__cleanup__ (_xs_destroy))) d_char
36 36
37void *xs_free(void *ptr);
38void *_xs_realloc(void *ptr, size_t size, const char *file, int line);
39#define xs_realloc(ptr, size) _xs_realloc(ptr, size, __FILE__, __LINE__)
37int _xs_blk_size(int sz); 40int _xs_blk_size(int sz);
38void _xs_destroy(char **var); 41void _xs_destroy(char **var);
39#define xs_debug() raise(SIGTRAP) 42#define xs_debug() raise(SIGTRAP)
@@ -41,7 +44,6 @@ xstype xs_type(const char *data);
41int xs_size(const char *data); 44int xs_size(const char *data);
42int xs_is_null(const char *data); 45int xs_is_null(const char *data);
43d_char *xs_dup(const char *data); 46d_char *xs_dup(const char *data);
44void *xs_realloc(void *ptr, size_t size);
45d_char *xs_expand(d_char *data, int offset, int size); 47d_char *xs_expand(d_char *data, int offset, int size);
46d_char *xs_collapse(d_char *data, int offset, int size); 48d_char *xs_collapse(d_char *data, int offset, int size);
47d_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);
@@ -80,19 +82,56 @@ d_char *xs_number_new(double f);
80double xs_number_get(const char *v); 82double xs_number_get(const char *v);
81const char *xs_number_str(const char *v); 83const char *xs_number_str(const char *v);
82 84
83extern int _xs_debug;
84
85 85
86#ifdef XS_IMPLEMENTATION 86#ifdef XS_IMPLEMENTATION
87 87
88int _xs_debug = 0; 88void *_xs_realloc(void *ptr, size_t size, const char *file, int line)
89{
90 d_char *ndata = realloc(ptr, size);
91
92 if (ndata == NULL) {
93 fprintf(stderr, "**OUT OF MEMORY**\n");
94 abort();
95 }
96
97#ifdef XS_DEBUG
98 if (ndata != ptr) {
99 FILE *f = fopen("xs_memory.out", "a");
100
101 if (ptr != NULL)
102 fprintf(f, "%p b\n", ptr);
103
104 fprintf(f, "%p a %ld %s %d\n", ndata, size, file, line);
105 fclose(f);
106 }
107#endif
108
109 return ndata;
110}
111
112
113void *xs_free(void *ptr)
114{
115#ifdef XS_DEBUG
116 if (ptr != NULL) {
117 FILE *f = fopen("xs_memory.out", "a");
118 fprintf(f, "%p b\n", ptr);
119 fclose(f);
120 }
121#endif
122
123 free(ptr);
124 return NULL;
125}
126
89 127
90void _xs_destroy(char **var) 128void _xs_destroy(char **var)
91{ 129{
130/*
92 if (_xs_debug) 131 if (_xs_debug)
93 printf("_xs_destroy %p\n", var); 132 printf("_xs_destroy %p\n", var);
94 133*/
95 free(*var); 134 xs_free(*var);
96} 135}
97 136
98 137
@@ -222,19 +261,6 @@ d_char *xs_dup(const char *data)
222} 261}
223 262
224 263
225void *xs_realloc(void *ptr, size_t size)
226{
227 d_char *ndata = realloc(ptr, size);
228
229 if (ndata == NULL) {
230 fprintf(stderr, "**OUT OF MEMORY**\n");
231 abort();
232 }
233
234 return ndata;
235}
236
237
238d_char *xs_expand(d_char *data, int offset, int size) 264d_char *xs_expand(d_char *data, int offset, int size)
239/* opens a hole in data */ 265/* opens a hole in data */
240{ 266{
@@ -325,11 +351,10 @@ d_char *xs_fmt(const char *fmt, ...)
325 va_end(ap); 351 va_end(ap);
326 352
327 if (n > 0) { 353 if (n > 0) {
328 n = _xs_blk_size(n + 1); 354 s = xs_realloc(NULL, _xs_blk_size(n + 1));
329 s = calloc(n, 1);
330 355
331 va_start(ap, fmt); 356 va_start(ap, fmt);
332 vsnprintf(s, n, fmt, ap); 357 vsnprintf(s, n + 1, fmt, ap);
333 va_end(ap); 358 va_end(ap);
334 } 359 }
335 360
diff --git a/xs_curl.h b/xs_curl.h
index 0dd1afc..5223a4e 100644
--- a/xs_curl.h
+++ b/xs_curl.h
@@ -54,7 +54,7 @@ static int _data_callback(void *buffer, size_t size,
54 54
55 /* open space */ 55 /* open space */
56 pd->size += sz; 56 pd->size += sz;
57 pd->data = realloc(pd->data, pd->size + 1); 57 pd->data = xs_realloc(pd->data, pd->size + 1);
58 58
59 /* copy data */ 59 /* copy data */
60 memcpy(pd->data + pd->offset, buffer, sz); 60 memcpy(pd->data + pd->offset, buffer, sz);
@@ -166,7 +166,7 @@ d_char *xs_http_request(char *method, char *url, d_char *headers,
166 ipd.data[ipd.size] = '\0'; 166 ipd.data[ipd.size] = '\0';
167 } 167 }
168 else 168 else
169 free(ipd.data); 169 xs_free(ipd.data);
170 170
171 return response; 171 return response;
172} 172}
diff --git a/xs_encdec.h b/xs_encdec.h
index b093eca..334f995 100644
--- a/xs_encdec.h
+++ b/xs_encdec.h
@@ -50,8 +50,7 @@ d_char *xs_hex_dec(const char *hex, int *size)
50 int i; 50 int i;
51 if (sscanf(&hex[n], "%02x", &i) == 0) { 51 if (sscanf(&hex[n], "%02x", &i) == 0) {
52 /* decoding error */ 52 /* decoding error */
53 free(s); 53 return xs_free(s);
54 return NULL;
55 } 54 }
56 else 55 else
57 *p = i; 56 *p = i;
@@ -137,8 +136,7 @@ d_char *xs_base64_dec(const char *data, int *size)
137 136
138 if (ss == NULL) { 137 if (ss == NULL) {
139 /* not a base64 char */ 138 /* not a base64 char */
140 free(s); 139 return xs_free(s);
141 return NULL;
142 } 140 }
143 141
144 cs[n] = ss - b64_tbl; 142 cs[n] = ss - b64_tbl;
diff --git a/xs_httpd.h b/xs_httpd.h
index 2fb5057..09dce0d 100644
--- a/xs_httpd.h
+++ b/xs_httpd.h
@@ -252,10 +252,8 @@ d_char *xs_httpd_request(FILE *f, d_char **payload, int *p_size)
252 req = xs_dict_append(req, "q_vars", q_vars); 252 req = xs_dict_append(req, "q_vars", q_vars);
253 req = xs_dict_append(req, "p_vars", p_vars); 253 req = xs_dict_append(req, "p_vars", p_vars);
254 254
255 if (errno) { 255 if (errno)
256 free(req); 256 req = xs_free(req);
257 req = NULL;
258 }
259 257
260 return req; 258 return req;
261} 259}
diff --git a/xs_json.h b/xs_json.h
index 13c3ebb..d992494 100644
--- a/xs_json.h
+++ b/xs_json.h
@@ -368,7 +368,7 @@ d_char *_xs_json_loads_array(const char **json, js_type *t)
368 l = xs_list_append(l, v); 368 l = xs_list_append(l, v);
369 369
370 while (*t == JS_INCOMPLETE) { 370 while (*t == JS_INCOMPLETE) {
371 free(_xs_json_loads_lexer(&s, &tt)); 371 xs_free(_xs_json_loads_lexer(&s, &tt));
372 372
373 if (tt == JS_CBRACK) 373 if (tt == JS_CBRACK)
374 *t = JS_ARRAY; 374 *t = JS_ARRAY;
@@ -392,10 +392,8 @@ d_char *_xs_json_loads_array(const char **json, js_type *t)
392 *t = JS_ERROR; 392 *t = JS_ERROR;
393 } 393 }
394 394
395 if (*t == JS_ERROR) { 395 if (*t == JS_ERROR)
396 free(l); 396 l = xs_free(l);
397 l = NULL;
398 }
399 397
400 *json = s; 398 *json = s;
401 399
@@ -421,7 +419,7 @@ d_char *_xs_json_loads_object(const char **json, js_type *t)
421 *t = JS_OBJECT; 419 *t = JS_OBJECT;
422 else 420 else
423 if (tt == JS_STRING) { 421 if (tt == JS_STRING) {
424 free(_xs_json_loads_lexer(&s, &tt)); 422 xs_free(_xs_json_loads_lexer(&s, &tt));
425 423
426 if (tt == JS_COLON) { 424 if (tt == JS_COLON) {
427 xs *v1; 425 xs *v1;
@@ -433,7 +431,7 @@ d_char *_xs_json_loads_object(const char **json, js_type *t)
433 d = xs_dict_append(d, k1, v1); 431 d = xs_dict_append(d, k1, v1);
434 432
435 while (*t == JS_INCOMPLETE) { 433 while (*t == JS_INCOMPLETE) {
436 free(_xs_json_loads_lexer(&s, &tt)); 434 xs_free(_xs_json_loads_lexer(&s, &tt));
437 435
438 if (tt == JS_CCURLY) 436 if (tt == JS_CCURLY)
439 *t = JS_OBJECT; 437 *t = JS_OBJECT;
@@ -442,7 +440,7 @@ d_char *_xs_json_loads_object(const char **json, js_type *t)
442 xs *k = _xs_json_loads_lexer(&s, &tt); 440 xs *k = _xs_json_loads_lexer(&s, &tt);
443 441
444 if (tt == JS_STRING) { 442 if (tt == JS_STRING) {
445 free(_xs_json_loads_lexer(&s, &tt)); 443 xs_free(_xs_json_loads_lexer(&s, &tt));
446 444
447 if (tt == JS_COLON) { 445 if (tt == JS_COLON) {
448 xs *v; 446 xs *v;
@@ -474,10 +472,8 @@ d_char *_xs_json_loads_object(const char **json, js_type *t)
474 else 472 else
475 *t = JS_ERROR; 473 *t = JS_ERROR;
476 474
477 if (*t == JS_ERROR) { 475 if (*t == JS_ERROR)
478 free(d); 476 d = xs_free(d);
479 d = NULL;
480 }
481 477
482 *json = s; 478 *json = s;
483 479
@@ -491,7 +487,7 @@ d_char *xs_json_loads(const char *json)
491 d_char *v = NULL; 487 d_char *v = NULL;
492 js_type t; 488 js_type t;
493 489
494 free(_xs_json_loads_lexer(&json, &t)); 490 xs_free(_xs_json_loads_lexer(&json, &t));
495 491
496 if (t == JS_OBRACK) 492 if (t == JS_OBRACK)
497 v = _xs_json_loads_array(&json, &t); 493 v = _xs_json_loads_array(&json, &t);
diff --git a/xs_openssl.h b/xs_openssl.h
index 0652637..5e3d03c 100644
--- a/xs_openssl.h
+++ b/xs_openssl.h
@@ -140,7 +140,7 @@ d_char *xs_rsa_sign(const char *secret, const char *mem, int size)
140 140
141 BIO_free(b); 141 BIO_free(b);
142 RSA_free(rsa); 142 RSA_free(rsa);
143 free(sig); 143 xs_free(sig);
144 144
145 return signature; 145 return signature;
146} 146}
@@ -211,7 +211,7 @@ d_char *xs_evp_sign(const char *secret, const char *mem, int size)
211 EVP_MD_CTX_free(mdctx); 211 EVP_MD_CTX_free(mdctx);
212 EVP_PKEY_free(pkey); 212 EVP_PKEY_free(pkey);
213 BIO_free(b); 213 BIO_free(b);
214 free(sig); 214 xs_free(sig);
215 215
216 return signature; 216 return signature;
217} 217}
diff --git a/xs_set.h b/xs_set.h
index 2beb454..0d76bed 100644
--- a/xs_set.h
+++ b/xs_set.h
@@ -22,7 +22,9 @@ xs_set *xs_set_new(int elems)
22/* creates a new set with a maximum of size hashed data */ 22/* creates a new set with a maximum of size hashed data */
23{ 23{
24 int sz = sizeof(struct _xs_set) + sizeof(int) * elems; 24 int sz = sizeof(struct _xs_set) + sizeof(int) * elems;
25 xs_set *s = calloc(sz, 1); 25 xs_set *s = xs_realloc(NULL, sz);
26
27 memset(s, '\0', sz);
26 28
27 /* initialize */ 29 /* initialize */
28 s->elems = elems; 30 s->elems = elems;
@@ -35,8 +37,8 @@ xs_set *xs_set_new(int elems)
35void xs_set_free(xs_set *s) 37void xs_set_free(xs_set *s)
36/* frees a set */ 38/* frees a set */
37{ 39{
38 free(s->list); 40 xs_free(s->list);
39 free(s); 41 xs_free(s);
40} 42}
41 43
42 44
diff --git a/xs_version.h b/xs_version.h
index 300ab44..fc3a46e 100644
--- a/xs_version.h
+++ b/xs_version.h
@@ -1 +1 @@
/* 9f90d5958755ec33c6c4946427f71de37af7500e */ /* 223ebe7a241f24ba043b32cb30d0428ac0d1dd5f */