void kiwi_str_redup(char **ptr, const char *from, const char *s) { int sl = strlen(s)+1; if (sl == 0 || sl > 1024) panic("strdup size"); if (*ptr) kiwi_free(from, (void*) *ptr); *ptr = strdup(s); #ifdef MALLOC_DEBUG mt_enter(from, (void*) *ptr, sl); #endif }
// encoded snprintf() int esnprintf(char *str, size_t slen, const char *fmt, ...) { va_list ap; va_start(ap, fmt); int rv = vsnprintf(str, slen, fmt, ap); va_end(ap); size_t slen2 = strlen(str) * ENCODE_EXPANSION_FACTOR; // c -> %xx char *str2 = (char *) kiwi_malloc("eprintf", slen2); mg_url_encode(str, str2, slen2-1); slen2 = strlen(str2); check(slen2 <= slen); strcpy(str, str2); kiwi_free("eprintf", str2); return slen2; }
static void switch_dx_list(dx_t *_dx_list, int _dx_list_len) { qsort(_dx_list, _dx_list_len, sizeof(dx_t), qsort_floatcomp); // switch to new list dx_t *prev_dx_list = dx.list; int prev_dx_list_len = dx.len; dx.list = _dx_list; dx.len = _dx_list_len; dx.hidden_used = false; // release previous if (prev_dx_list) { int i; dx_t *dxp; for (i=0, dxp = prev_dx_list; i < prev_dx_list_len; i++, dxp++) { // previous allocators better have used malloc(), strdup() et al for these and not kiwi_malloc() if (dxp->ident) free((void *) dxp->ident); if (dxp->notes) free((void *) dxp->notes); } } kiwi_free("dx_list", prev_dx_list); }