|
|
1.1 ! root 1: /* alloc.c ! 2: Allocate within a memory block. ! 3: ! 4: Copyright (C) 1992 Ian Lance Taylor ! 5: ! 6: This file is part of the Taylor UUCP uuconf library. ! 7: ! 8: This library is free software; you can redistribute it and/or ! 9: modify it under the terms of the GNU Library General Public License ! 10: as published by the Free Software Foundation; either version 2 of ! 11: the License, or (at your option) any later version. ! 12: ! 13: This library is distributed in the hope that it will be useful, but ! 14: WITHOUT ANY WARRANTY; without even the implied warranty of ! 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 16: Library General Public License for more details. ! 17: ! 18: You should have received a copy of the GNU Library General Public ! 19: License along with this library; if not, write to the Free Software ! 20: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 21: ! 22: The author of the program may be contacted at [email protected] or ! 23: c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254. ! 24: */ ! 25: ! 26: #include "uucnfi.h" ! 27: ! 28: #if USE_RCS_ID ! 29: const char _uuconf_alloc_rcsid[] = "$Id: alloc.c,v 1.1 93/07/30 08:06:59 bin Exp Locker: bin $"; ! 30: #endif ! 31: ! 32: #include "alloc.h" ! 33: ! 34: /* Allocate some memory out of a memory block. If the memory block is ! 35: NULL, this just calls malloc; this is convenient for a number of ! 36: routines. If this fails, uuconf_errno will be set, and the calling ! 37: routine may return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO. */ ! 38: ! 39: pointer ! 40: uuconf_malloc (pblock, c) ! 41: pointer pblock; ! 42: size_t c; ! 43: { ! 44: struct sblock *q = (struct sblock *) pblock; ! 45: pointer pret; ! 46: ! 47: if (c == 0) ! 48: return NULL; ! 49: ! 50: if (q == NULL) ! 51: return malloc (c); ! 52: ! 53: /* Make sure that c is aligned to a double boundary. */ ! 54: c = ((c + sizeof (double) - 1) / sizeof (double)) * sizeof (double); ! 55: ! 56: while (q->ifree + c > CALLOC_SIZE) ! 57: { ! 58: if (q->qnext != NULL) ! 59: q = q->qnext; ! 60: else ! 61: { ! 62: if (c > CALLOC_SIZE) ! 63: q->qnext = (struct sblock *) malloc (sizeof (struct sblock) ! 64: + c - CALLOC_SIZE); ! 65: else ! 66: q->qnext = (struct sblock *) malloc (sizeof (struct sblock)); ! 67: if (q->qnext == NULL) ! 68: return NULL; ! 69: q = q->qnext; ! 70: q->qnext = NULL; ! 71: q->ifree = 0; ! 72: q->qadded = NULL; ! 73: break; ! 74: } ! 75: } ! 76: ! 77: pret = q->u.ab + q->ifree; ! 78: q->ifree += c; ! 79: q->plast = pret; ! 80: ! 81: return pret; ! 82: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.