/* * Copyright (c) 2008 Patrick McHardy * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Development of this code funded by Astaro AG (http://www.astaro.com/) */ #include #include #include #include #include #include #include #include void __noreturn __memory_allocation_error(const char *filename, uint32_t line) { fprintf(stderr, "%s:%u: Memory allocation failure\n", filename, line); exit(NFT_EXIT_NOMEM); } void xfree(const void *ptr) { free((void *)ptr); } void *xmalloc(size_t size) { void *ptr; ptr = malloc(size); if (ptr == NULL) memory_allocation_error(); return ptr; } void *xmalloc_array(size_t nmemb, size_t size) { assert(size != 0); assert(nmemb != 0); if (nmemb > SIZE_MAX / size) memory_allocation_error(); return xmalloc(nmemb * size); } void *xrealloc(void *ptr, size_t size) { ptr = realloc(ptr, size); if (ptr == NULL && size != 0) memory_allocation_error(); return ptr; } void *xzalloc(size_t size) { void *ptr; ptr = xmalloc(size); memset(ptr, 0, size); return ptr; } char *xstrdup(const char *s) { char *res; assert(s != NULL); res = strdup(s); if (res == NULL) memory_allocation_error(); return res; } void xstrunescape(const char *in, char *out) { unsigned int i, k = 0; for (i = 0; i < strlen(in); i++) { if (in[i] == '\\') continue; out[k++] = in[i]; } out[k++] = '\0'; }