Function silc_stack_push
SYNOPSIS
SilcUInt32 silc_stack_push(SilcStack stack, SilcStackFrame *frame);
DESCRIPTION
Push the top of the stack down which becomes the new top of the stack.
For every silc_stack_push call there must be silc_stack_pop call. All
allocations between these two calls will be done from the top of the
stack and all allocated memory is freed after the next silc_stack_pop
is called. This returns so called stack pointer for the new stack
frame, which the caller may use to check that all calls to
silc_stack_pop has been made. This call may do a small memory
allocation in some cases, but usually it does not allocate any memory.
If this returns zero (0) the system is out of memory.
If the `frame' is non-NULL then that SilcStackFrame is used as
stack frame. Usually `frame' is set to NULL by user. Statically
allocated SilcStackFrame should be used when using silc_stack_push
in recursive function and the recursion may become deep. In this
case using statically allocated SilcStackFrame is recommended since
it assures that frames never run out and silc_stack_push never
allocates any memory. If your routine is not recursive then
setting `frame' to NULL is recommended, unless performance is
critical.
This function is used when a routine is doing frequent allocations
from the stack. If the stack is not pushed and later popped all
allocations are made from the stack and the stack eventually runs out
(it gets enlarged by normal memory allocation). By pushing and then
later popping the frequent allocations does not consume the stack.
If `stack' is NULL this call has no effect.
EXAMPLE
All memory allocations in silc_foo_parse_packet will be done in
a fresh stack frame and that data is freed after the parsing is
completed.
silc_stack_push(stack, NULL);
silc_foo_parse_packet(packet, stack);
silc_stack_pop(stack);
Another example with recursion and using statically allocated
SilcStackFrame. After popping the statically allocated frame can
be reused if necessary.
void silc_foo_this_function(SilcStack stack)
{
SilcStackFrame frame;
...
silc_stack_push(stack, &frame);
silc_foo_this_function(stack); // Call recursively
silc_stack_pop(stack);
...
}
|