CVS Repository/ src/ gnu/ usr.bin/ binutils/ include/ objalloc.h

Annotated Revision 1.1.1.2 Back
1.1  (niklas 29-May-97)  1
: /* objalloc.h -- routines to allocate memory for objects
   2
:    Copyright 1997 Free Software Foundation, Inc.
   3
:    Written by Ian Lance Taylor, Cygnus Solutions.
   4
: 
   5
: This program is free software; you can redistribute it and/or modify it
   6
: under the terms of the GNU General Public License as published by the
   7
: Free Software Foundation; either version 2, or (at your option) any
   8
: later version.
   9
: 
   10
: This program is distributed in the hope that it will be useful,
   11
: but WITHOUT ANY WARRANTY; without even the implied warranty of
   12
: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   13
: GNU General Public License for more details.
   14
: 
   15
: You should have received a copy of the GNU General Public License
   16
: along with this program; if not, write to the Free Software
1.1.1.2  (espie 12-Sep-00)  17
: Foundation, 59 Temple Place - Suite 330,
   18
: Boston, MA 02111-1307, USA.  */
1.1  (niklas 29-May-97)  19
: 
   20
: #ifndef OBJALLOC_H
   21
: #define OBJALLOC_H
   22
: 
   23
: #include "ansidecl.h"
   24
: 
   25
: /* These routines allocate space for an object.  The assumption is
   26
:    that the object will want to allocate space as it goes along, but
   27
:    will never want to free any particular block.  There is a function
   28
:    to free a block, which also frees all more recently allocated
   29
:    blocks.  There is also a function to free all the allocated space.
   30
: 
   31
:    This is essentially a specialization of obstacks.  The main
   32
:    difference is that a block may not be allocated a bit at a time.
   33
:    Another difference is that these routines are always built on top
   34
:    of malloc, and always pass an malloc failure back to the caller,
   35
:    unlike more recent versions of obstacks.  */
   36
: 
   37
: /* This is what an objalloc structure looks like.  Callers should not
   38
:    refer to these fields, nor should they allocate these structure
   39
:    themselves.  Instead, they should only create them via
   40
:    objalloc_init, and only access them via the functions and macros
   41
:    listed below.  The structure is only defined here so that we can
   42
:    access it via macros.  */
   43
: 
   44
: struct objalloc
   45
: {
   46
:   char *current_ptr;
   47
:   unsigned int current_space;
   48
:   PTR chunks;
   49
: };
   50
: 
   51
: /* Work out the required alignment.  */
   52
: 
   53
: struct objalloc_align { char x; double d; };
   54
: 
   55
: #if defined (__STDC__) && __STDC__
   56
: #ifndef offsetof
   57
: #include <stddef.h>
   58
: #endif
   59
: #define OBJALLOC_ALIGN \
   60
:   ((ptrdiff_t) ((char *) &((struct objalloc_align *) 0)->d - (char *) 0))
   61
: #else
   62
: #define OBJALLOC_ALIGN \
   63
:   ((long) ((char *) &((struct objalloc_align *) 0)->d - (char *) 0))
   64
: #endif
   65
: 
   66
: /* Create an objalloc structure.  Returns NULL if malloc fails.  */
   67
: 
   68
: extern struct objalloc *objalloc_create PARAMS ((void));
   69
: 
   70
: /* Allocate space from an objalloc structure.  Returns NULL if malloc
   71
:    fails.  */
   72
: 
   73
: extern PTR _objalloc_alloc PARAMS ((struct objalloc *, unsigned long));
   74
: 
   75
: /* The macro version of objalloc_alloc.  We only define this if using
   76
:    gcc, because otherwise we would have to evaluate the arguments
   77
:    multiple times, or use a temporary field as obstack.h does.  */
   78
: 
   79
: #if defined (__GNUC__) && defined (__STDC__) && __STDC__
   80
: 
   81
: /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
   82
:    does not implement __extension__.  But that compiler doesn't define
   83
:    __GNUC_MINOR__.  */
   84
: #if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
   85
: #define __extension__
   86
: #endif
   87
: 
   88
: #define objalloc_alloc(o, l)						\
   89
:   __extension__								\
   90
:   ({ struct objalloc *__o = (o);					\
   91
:      unsigned long __len = (l);						\
   92
:      if (__len == 0)							\
   93
:        __len = 1;							\
   94
:      __len = (__len + OBJALLOC_ALIGN - 1) &~ (OBJALLOC_ALIGN - 1);	\
   95
:      (__len <= __o->current_space					\
   96
:       ? (__o->current_ptr += __len,					\
   97
: 	 __o->current_space -= __len,					\
   98
: 	 (PTR) (__o->current_ptr - __len))				\
   99
:       : _objalloc_alloc (__o, __len)); })
   100
: 
   101
: #else /* ! __GNUC__ */
   102
: 
   103
: #define objalloc_alloc(o, l) _objalloc_alloc ((o), (l))
   104
: 
   105
: #endif /* ! __GNUC__ */
   106
: 
   107
: /* Free an entire objalloc structure.  */
   108
: 
   109
: extern void objalloc_free PARAMS ((struct objalloc *));
   110
: 
   111
: /* Free a block allocated by objalloc_alloc.  This also frees all more
   112
:    recently allocated blocks.  */
   113
: 
   114
: extern void objalloc_free_block PARAMS ((struct objalloc *, PTR));
   115
: 
   116
: #endif /* OBJALLOC_H */