diff --git a/ialloc.c b/ialloc.c index af5ad7b..200d766 100644 --- a/ialloc.c +++ b/ialloc.c @@ -1,37 +1,101 @@ -#ifdef OBJECTID -static char sccsid[] = "%W%"; -#endif +#ifndef lint +#ifndef NOID +static char elsieid[] = "%W%"; +#endif /* !defined NOID */ +#endif /* !defined lint */ /*LINTLIBRARY*/ -#include "stdio.h" +#include "private.h" -#ifndef arg4alloc -#define arg4alloc unsigned -#endif +#ifdef MAL +#define NULLMAL(x) ((x) == NULL || (x) == MAL) +#else /* !defined MAL */ +#define NULLMAL(x) ((x) == NULL) +#endif /* !defined MAL */ -char * allocat(old, new) -char * old; -char * new; +#define nonzero(n) (((n) == 0) ? 1 : (n)) + +char * icalloc P((int nelem, int elsize)); +char * icatalloc P((char * old, const char * new)); +char * icpyalloc P((const char * string)); +char * imalloc P((int n)); +char * irealloc P((char * pointer, int size)); +void ifree P((char * pointer)); + +char * +imalloc(n) +const int n; { - register char * ret; - arg4alloc toalloc; - extern char * calloc(); - extern char * realloc(); - extern char * strcat(); +#ifdef MAL + register char * result; - if (new == NULL) - new = ""; - toalloc = strlen(new) + 1; - ret = (old == NULL) ? calloc(toalloc, sizeof *ret) : - realloc(old, (toalloc + strlen(old)) * sizeof *ret); - if (ret != NULL) - (void) strcat(ret, new); - return ret; + result = malloc((alloc_size_t) nonzero(n)); + return NULLMAL(result) ? NULL : result; +#else /* !defined MAL */ + return malloc((alloc_size_t) nonzero(n)); +#endif /* !defined MAL */ } -char * allocpy(string) -char * string; +char * +icalloc(nelem, elsize) +int nelem; +int elsize; { - return allocat((char *) NULL, string); + if (nelem == 0 || elsize == 0) + nelem = elsize = 1; + return calloc((alloc_size_t) nelem, (alloc_size_t) elsize); +} + +char * +irealloc(pointer, size) +char * const pointer; +const int size; +{ + if (NULLMAL(pointer)) + return imalloc(size); + return realloc((genericptr_t) pointer, (alloc_size_t) nonzero(size)); +} + +char * +icatalloc(old, new) +char * const old; +const char * const new; +{ + register char * result; + register int oldsize, newsize; + + newsize = NULLMAL(new) ? 0 : strlen(new); + if (NULLMAL(old)) + oldsize = 0; + else if (newsize == 0) + return old; + else oldsize = strlen(old); + if ((result = irealloc(old, oldsize + newsize + 1)) != NULL) + if (!NULLMAL(new)) + (void) strcpy(result + oldsize, new); + return result; +} + +char * +icpyalloc(string) +const char * const string; +{ + return icatalloc((char *) NULL, string); +} + +void +ifree(p) +char * const p; +{ + if (!NULLMAL(p)) + (void) free(p); +} + +void +icfree(p) +char * const p; +{ + if (!NULLMAL(p)) + (void) free(p); }