| /////////////////////////////////////////////////////////////////////////////// |
| // |
| /// \file alloc.c |
| /// \brief Memory allocation functions |
| // |
| // Copyright (C) 2007 Lasse Collin |
| // |
| // This program is free software; you can redistribute it and/or |
| // modify it under the terms of the GNU Lesser General Public |
| // License as published by the Free Software Foundation; either |
| // version 2.1 of the License, or (at your option) any later version. |
| // |
| // This program is distributed in the hope that it will be useful, |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| // Lesser General Public License for more details. |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| #include "private.h" |
| |
| |
| /// Called when memory allocation fails. Prints and error message and |
| /// quits the application. |
| static void lzma_attribute((noreturn)) |
| xerror(void) |
| { |
| errmsg(V_ERROR, "%s", strerror(errno)); |
| my_exit(ERROR); |
| } |
| |
| |
| extern void * |
| xmalloc(size_t size) |
| { |
| if (size < 1) { |
| errno = EINVAL; |
| xerror(); |
| } |
| |
| void *p = malloc(size); |
| if (p == NULL) |
| xerror(); |
| |
| return p; |
| } |
| |
| |
| /* |
| extern void * |
| xrealloc(void *ptr, size_t size) |
| { |
| if (size < 1) { |
| errno = EINVAL; |
| xerror(); |
| } |
| |
| ptr = realloc(ptr, size); |
| if (ptr == NULL) |
| xerror(); |
| |
| return ptr; |
| } |
| */ |
| |
| |
| extern char * |
| xstrdup(const char *src) |
| { |
| if (src == NULL) { |
| errno = EINVAL; |
| xerror(); |
| } |
| |
| const size_t size = strlen(src) + 1; |
| char *dest = malloc(size); |
| if (dest == NULL) |
| xerror(); |
| |
| memcpy(dest, src, size); |
| |
| return dest; |
| } |
| |
| |
| extern void |
| xstrcpy(char **dest, const char *src) |
| { |
| size_t len = strlen(src) + 1; |
| |
| *dest = realloc(*dest, len); |
| if (*dest == NULL) |
| xerror(); |
| |
| memcpy(*dest, src, len + 1); |
| |
| return; |
| } |
| |
| |
| extern void * |
| allocator(void *opaque lzma_attribute((unused)), |
| size_t nmemb lzma_attribute((unused)), size_t size) |
| { |
| return xmalloc(size); |
| } |