Go to the previous, next section.

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, size_t 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.

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)
{
  char *s = (char *) obstack_alloc (&string_obstack,
                                    strlen (string) + 1);
  memcpy (s, string, strlen (string));
  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, size_t size)

This allocates a block and initializes it by copying size bytes of data starting at address.

Function: void * obstack_copy0 (struct obstack *obstack_ptr, void *address, size_t 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, size_t size)
{
  return obstack_copy0 (&myobstack, addr, size);
}

Contrast this with the previous example of savestring using malloc (see section Basic Storage Allocation).

Go to the previous, next section.