Back to index

avfs  1.0.1
ne_alloc.c
Go to the documentation of this file.
00001 /* 
00002    Replacement memory allocation handling etc.
00003    Copyright (C) 1999-2001, Joe Orton <joe@light.plus.com>
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License as published by the Free Software Foundation; either
00008    version 2 of the License, or (at your option) any later version.
00009    
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public
00016    License along with this library; if not, write to the Free
00017    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
00018    MA 02111-1307, USA
00019 
00020 */
00021 
00022 #include "config.h"
00023 
00024 #ifdef HAVE_STRING_H
00025 #include <string.h>
00026 #endif
00027 
00028 #ifdef HAVE_STDLIB_H
00029 #include <stdlib.h>
00030 #endif
00031 
00032 #include "ne_alloc.h"
00033 
00034 static void (*oom)(void);
00035 
00036 #define DO_MALLOC(ptr, len) do {          \
00037     ptr = malloc(len);                           \
00038     if (!ptr) {                                  \
00039        if (oom != NULL)                   \
00040            oom();                         \
00041        abort();                           \
00042     }                                     \
00043 } while(0);
00044 
00045 void ne_oom_callback(void (*callback)(void))
00046 {
00047     oom = callback;
00048 }
00049 
00050 void *ne_malloc(size_t len) 
00051 {
00052     void *ptr;
00053     DO_MALLOC(ptr, len);
00054     return ptr;
00055 }
00056 
00057 void *ne_calloc(size_t len) 
00058 {
00059     void *ptr;
00060     DO_MALLOC(ptr, len);
00061     return memset(ptr, 0, len);
00062 }
00063 
00064 void *ne_realloc(void *ptr, size_t len)
00065 {
00066     void *ret = realloc(ptr, len);
00067     if (!ret) {
00068        if (oom)
00069            oom();
00070        abort();
00071     }
00072     return ret;
00073 }
00074 
00075 char *ne_strdup(const char *s) 
00076 {
00077     char *ret;
00078     DO_MALLOC(ret, strlen(s) + 1);
00079     return strcpy(ret, s);
00080 }
00081 
00082 char *ne_strndup(const char *s, size_t n)
00083 {
00084     char *new;
00085     DO_MALLOC(new, n);
00086     new[n] = '\0';
00087     memcpy(new, s, n);
00088     return new;
00089 }