| SILC_STR_FUNC
 
 NAME
 
    #define SILC_STR_FUNC() ...
DESCRIPTION
    SilcBuffer formatting.
    Formatting:    SILC_STR_FUNC(function, void *value, void *context)
    Unformatting:  SILC_STR_FUNC(function, void **value, void *context)
    This type can be used to call the `function' of the type
    SilcBufferFormatFunc or SilcBufferUnformatFunc to encode or decode
    the `value'.  In encoding the `value' will be passed to the `function'
    and can be encoded into the buffer.  The buffer will be passed as
    well to the `function' at the location where SILC_STR_FUNC is placed
    in formatting.  The `context' delivers caller specific context to
    the `function'
    In unformatting the `function' will decode the encoded type and
    return it to `value' pointer.  The decoding function should decide
    itself whether to allocate or not the decoded value.
    The `function' does not have to encode anything and passing `value'
    as NULL is allowed.  The `function' could for example modify the
    existing buffer.
EXAMPLE
    // Encode payload, encrypt and compute MAC.
    silc_buffer_format(buf,
                       SILC_STR_FUNC(foo_encode_id, id, ctx),
                       SILC_STR_UI_SHORT(len),
                       SILC_STR_DATA(data, len),
                       SILC_STR_FUNC(foo_buf_encrypt, NULL, key),
                       SILC_STR_FUNC(foo_buf_hmac, NULL, hmac),
                       SILC_STR_DATA(iv, iv_len);
                       SILC_STR_END);
    // Check MAC, decrypt and decode payload
    silc_buffer_unformat(buf,
                         SILC_STR_FUNC(foo_buf_hmac, NULL, hmac),
                         SILC_STR_FUNC(foo_buf_decrypt, NULL, key),
                         SILC_STR_FUNC(foo_decode_id, &id, ctx),
                         SILC_STR_UI_SHORT(&len),
                         SILC_STR_END);
 
 
 
 |