Node:Allocation in an Obstack, Next:Freeing Obstack Objects, Previous:Preparing for Obstacks, Up:Obstacks
The most direct way to allocate an object in an obstack is with
obstack_alloc, which is invoked almost like malloc.
| void * obstack_alloc (struct obstack *obstack-ptr, int size) | Function | 
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   | 
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:
| void * obstack_copy (struct obstack *obstack-ptr, void *address, int size) | Function | 
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. 
 | 
| void * obstack_copy0 (struct obstack *obstack-ptr, void *address, int size) | Function | 
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 (see Basic Allocation).