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