The GNU C Library - Allocation in an Obstack

Node: Allocation in an Obstack Next: Freeing Obstack Objects Prev: Preparing for Obstacks Up: Obstacks

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 returns a null pointer if obstack_chunk_alloc returns one. In that case, it has not changed the amount of memory allocated in the obstack. If you supply an obstack_chunk_alloc function that calls exit (see Program Termination) or longjmp (see Non-Local Exits) when out of memory, then obstack_alloc will never return a null pointer.

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, int size)
This allocates a block and initializes it by copying size bytes of data starting at address. It can return a null pointer under the same conditions as obstack_alloc .

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 (see Basic Allocation).


Next: Freeing Obstack Objects Up: Obstacks