diff options
| -rw-r--r-- | xs.h | 69 | ||||
| -rw-r--r-- | xs_curl.h | 4 | ||||
| -rw-r--r-- | xs_encdec.h | 6 | ||||
| -rw-r--r-- | xs_httpd.h | 6 | ||||
| -rw-r--r-- | xs_json.h | 22 | ||||
| -rw-r--r-- | xs_openssl.h | 4 | ||||
| -rw-r--r-- | xs_set.h | 8 | ||||
| -rw-r--r-- | xs_version.h | 2 |
8 files changed, 70 insertions, 51 deletions
| @@ -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 | ||
| 37 | void *xs_free(void *ptr); | ||
| 38 | void *_xs_realloc(void *ptr, size_t size, const char *file, int line); | ||
| 39 | #define xs_realloc(ptr, size) _xs_realloc(ptr, size, __FILE__, __LINE__) | ||
| 37 | int _xs_blk_size(int sz); | 40 | int _xs_blk_size(int sz); |
| 38 | void _xs_destroy(char **var); | 41 | void _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); | |||
| 41 | int xs_size(const char *data); | 44 | int xs_size(const char *data); |
| 42 | int xs_is_null(const char *data); | 45 | int xs_is_null(const char *data); |
| 43 | d_char *xs_dup(const char *data); | 46 | d_char *xs_dup(const char *data); |
| 44 | void *xs_realloc(void *ptr, size_t size); | ||
| 45 | d_char *xs_expand(d_char *data, int offset, int size); | 47 | d_char *xs_expand(d_char *data, int offset, int size); |
| 46 | d_char *xs_collapse(d_char *data, int offset, int size); | 48 | d_char *xs_collapse(d_char *data, int offset, int size); |
| 47 | 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); |
| @@ -80,19 +82,56 @@ d_char *xs_number_new(double f); | |||
| 80 | double xs_number_get(const char *v); | 82 | double xs_number_get(const char *v); |
| 81 | const char *xs_number_str(const char *v); | 83 | const char *xs_number_str(const char *v); |
| 82 | 84 | ||
| 83 | extern int _xs_debug; | ||
| 84 | |||
| 85 | 85 | ||
| 86 | #ifdef XS_IMPLEMENTATION | 86 | #ifdef XS_IMPLEMENTATION |
| 87 | 87 | ||
| 88 | int _xs_debug = 0; | 88 | void *_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 | |||
| 113 | void *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 | ||
| 90 | void _xs_destroy(char **var) | 128 | void _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 | ||
| 225 | void *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 | |||
| 238 | d_char *xs_expand(d_char *data, int offset, int size) | 264 | d_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 | ||
| @@ -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; |
| @@ -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 | } |
| @@ -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 | } |
| @@ -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) | |||
| 35 | void xs_set_free(xs_set *s) | 37 | void 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 */ | ||