diff options
Diffstat (limited to 'xpa/xalloc.c')
-rw-r--r-- | xpa/xalloc.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/xpa/xalloc.c b/xpa/xalloc.c new file mode 100644 index 0000000..18234db --- /dev/null +++ b/xpa/xalloc.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2004-2009 Smithsonian Astrophysical Observatory + */ + +/* + * + * xalloc -- safe memory allocation with error checking + * + */ + +/* this module is compiled within a funtools filter and must not require + the header files */ +#ifdef FILTER_PTYPE +#define ANSI_FUNC 1 +#else +#include <xalloc.h> +#endif + +#define XALLOC_ERROR "ERROR: can't allocate memory (xalloc)\n" + +#if XALLOC_SETJMP + +static jmp_buf *xalloc_envptr=NULL; + +#ifdef ANSI_FUNC +void xalloc_savejmp(jmp_buf *env) +#else +void xalloc_savejmp(env) + jmp_buf *env; +#endif +{ + xalloc_envptr = env; +} +#endif + + +#ifdef ANSI_FUNC +static void _xalloc_error(void) +#else +static void _xalloc_error() +#endif +{ + write(1, XALLOC_ERROR, strlen(XALLOC_ERROR)); +#if XALLOC_SETJMP + if( xalloc_envptr ) + longjmp(*xalloc_envptr, XALLOC_SETJMP); + else +#endif + exit(1); +} + +#ifdef ANSI_FUNC +void *xmalloc(size_t n) +#else +void *xmalloc(n) + size_t n; +#endif +{ + void *p; + + if( !(p = (void *)malloc(n)) ) + _xalloc_error(); + return p; +} + +#ifdef ANSI_FUNC +void *xcalloc (size_t n, size_t s) +#else +void *xcalloc (n, s) + size_t n, s; +#endif +{ + void *p; + + if( !(p = (void *)calloc(n, s)) ) + _xalloc_error(); + return p; +} + +#ifdef ANSI_FUNC +void *xrealloc (void *p, size_t n) +#else +void *xrealloc (p, n) + void *p; + size_t n; +#endif +{ + if( !p ) + return xmalloc(n); + if( !(p = (void *)realloc(p, n)) ) + _xalloc_error(); + return p; +} + +#ifdef ANSI_FUNC +void xfree (void *p) +#else +void xfree (p) + void *p; +#endif +{ + if( p ) + free(p); +} + +#ifdef ANSI_FUNC +char *xstrdup (char *s) +#else +char *xstrdup (s) + char *s; +#endif +{ + if( s ) + return((char *)strcpy((char *)xmalloc((size_t)strlen(s)+1), s)); + else + return NULL; +} |