diff options
Diffstat (limited to 'lib/mem.c')
-rw-r--r-- | lib/mem.c | 81 |
1 files changed, 14 insertions, 67 deletions
@@ -13,87 +13,34 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <graypam.h> -jmp_buf gray_pam_jmp; - -void -gray_raise(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - _pam_vlog(LOG_ERR, fmt, ap); - va_end(ap); - longjmp(gray_pam_jmp, 1); -} - -void * -gray_malloc(size_t size) -{ - void *p = malloc(size); - if (!p) - gray_raise("Not enough memory"); - return p; -} - -void * -gray_zalloc(size_t size) -{ - void *p = malloc(size); - if (!p) - gray_raise("Not enough memory"); - memset(p, 0, size); - return p; -} - -void * -gray_calloc(size_t count, size_t size) -{ - return gray_zalloc(count * size); -} - -void * -gray_realloc(void *ptr, size_t size) -{ - ptr = realloc(ptr, size); - if (!ptr) - gray_raise("Not enough memory"); - return ptr; -} - void * gray_2nrealloc(void *ptr, size_t *pcount, size_t elsiz) { size_t count = *pcount; if (!ptr) { - if (!count) - count = *pcount = 16; - return gray_calloc(count, elsiz); + if (!count) { + count = 64 / elsiz; + count += !count; + } + } else { + if ((size_t)-1 / 2 / elsiz <= count) { + errno = ENOMEM; + return NULL; + } + count += (count + 1) / 2; } - if ((size_t)-1 / 2 / elsiz <= count) - gray_raise("Not enough memory"); - count *= 2; - *pcount = count; - return gray_realloc(ptr, count * elsiz); -} - - -char * -gray_strdup(const char *str) -{ - char *p; - - if (!str) - return NULL; - p = gray_malloc(strlen(str) + 1); - return strcpy(p, str); + ptr = realloc(ptr, count * elsiz); + if (ptr) + *pcount = count; + return ptr; } - void gray_pam_delete(char *x) { PAM_OVERWRITE(x); free(x); |