Allocation in an Obstack
........................
The most direct way to allocate an object in an obstack is with
`obstack_alloc', which is invoked almost like `malloc'.
- Function: void * obstack_alloc (struct obstack *OBSTACK-PTR, int
SIZE)
This allocates an uninitialized block of SIZE bytes in an obstack
and returns its address. Here OBSTACK-PTR specifies which obstack
to allocate the block in; it is the address of the `struct obstack'
object which represents the obstack. Each obstack function or
macro requires you to specify an OBSTACK-PTR as the first argument.
This function calls the obstack's `obstack_chunk_alloc' function if
it needs to allocate a new chunk of memory; it calls
`obstack_alloc_failed_handler' if allocation of memory by
`obstack_chunk_alloc' failed.
For example, here is a function that allocates a copy of a string STR
in a specific obstack, which is in the variable `string_obstack':
struct obstack string_obstack;
char *
copystring (char *string)
{
size_t len = strlen (string) + 1;
char *s = (char *) obstack_alloc (&string_obstack, len);
memcpy (s, string, len);
return s;
}
To allocate a block with specified contents, use the function
`obstack_copy', declared like this:
- Function: void * obstack_copy (struct obstack *OBSTACK-PTR, void
*ADDRESS, int SIZE)
This allocates a block and initializes it by copying SIZE bytes of
data starting at ADDRESS. It calls `obstack_alloc_failed_handler'
if allocation of memory by `obstack_chunk_alloc' failed.
- Function: void * obstack_copy0 (struct obstack *OBSTACK-PTR, void
*ADDRESS, int SIZE)
Like `obstack_copy', but appends an extra byte containing a null
character. This extra byte is not counted in the argument SIZE.
The `obstack_copy0' function is convenient for copying a sequence of
characters into an obstack as a null-terminated string. Here is an
example of its use:
char *
obstack_savestring (char *addr, int size)
{
return obstack_copy0 (&myobstack, addr, size);
}
Contrast this with the previous example of `savestring' using `malloc'
(Note:Basic Allocation).