Copyright © 2001 - 2007 SILC Project
SILC Project Website
SILC Toolkit Reference Manual
Index

SILC Toolkit Reference Manual
SILC Crypto Library
    Introduction to SILC RNG
    SILC RNG Interface
    SILC Cipher API
    SILC PKCS API
    SILC Public Key API
    SILC PKCS #1 API
    SILC Hash Interface
    SILC HMAC Interface
SILC Core Library
    SILC Authentication Interface
    SILC Message Interface
    SILC Channel Interface
    SILC Command Interface
    SILC Notify Interface
    SILC Status Types
    SILC Modes
    SILC ID Interface
    SILC Argument Interface
    SILC Attributes Interface
    Packet Engine Interface
    SILC Public Key Payload Interface
SILC Key Exchange Library
    SILC SKE Interface
    SILC Connection Authentication Interface
SILC VCard Library
    SILC VCard Interface
SILC Math Library
    SILC MP Interface
    SILC Math Interface
SILC Client Library
    Using SILC Client Library Tutorial
    Arguments for command_reply Client Operation
    SilcStatus Error Arguments in command_reply Client Operation
    Arguments for notify Client Operation
    Unicode and UTF-8 Strings in Client Library
    Client Library Interface Reference
    Client Entry Interface Reference
SILC ASN.1 Library
    SILC ASN.1 Interface
    SILC BER interface
SILC HTTP Library
    SILC HTTP Server Interface
    SILC HTTP PHP Translator
SILC Utility Library
    Basic Types and Definitions
    Data Buffer Interface
    Data Buffer Format Interface
    Hash Table Interface
    Memory Allocation Interface
    Data Stack (memory pool) Interface
    Finite State Machine Interface
    Thread Interface
    Mutual Exclusion Lock Interface
    Condition Variable Interface
    Atomic Operations Interface
    Network (TCP and UDP) Interface
    Scheduler Interface
    Asynchronous Operation Interface
    Abstract Stream Interface
    Socket Stream Interface
    File Descriptor Stream Interface
    File Utility Functions
    String Utility Interface
    Snprintf Interface
    UTF-8 String Interface
    Stringprep Interface
    Utility Functions
    List Interface
    Dynamic List Interface
    MIME Interface
    Time Utility Functions
    Logging Interface
    Config File Interface
SILC Key Repository Library
    SILC SKR Interface
SILC Application Utility Library
    SILC Application Utilities
    SILC ID Cache Interface
SILC SFTP Library
    SILC SFTP Interface
    SFTP Filesystems Interface

Resource Links
SILC Project Website
SILC Protocol Documentation
SILC White Paper
SILC FAQs





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);
      ...
    }






SilcStack Interface
SilcStack
SilcStackFrame
silc_stack_alloc
silc_stack_free
silc_stack_push
silc_stack_pop




Copyright © 2001 - 2007 SILC Project
SILC Project Website
SILC Toolkit Reference Manual
Index