| Function silc_asn1_decode
 
 SYNOPSIS
 
    SilcBool silc_asn1_decode(SilcAsn1 asn1, SilcBuffer src, ...);
DESCRIPTION
    Decodes the ASN.1 encoded buffer `src' by the ASN.1 types sent
    as argument.  The ASN.1 types sent as argument must be found from
    the `src' for this function to decode successfully.
    The memory allocated for the results are allocated from `asn1' and
    they become invalid if `asn1' becomes invalid.  Next (second) call
    to this function does NOT invalidate the previous results.  However,
    third call to this function does invalidate the results of the first
    call but not second.  On the other hand, fourth call invalidates
    the results of the second call but not third, fifth call invalidates
    the results of the third call but not fourth, and so on.  This allows
    efficient decoding, when silc_asn1_decode must be called multiple times
    to decode all data, without new memory allocations.  However, caller
    must be cautios and understand that the every second call invalidates
    the results of every second previous results.
    If the SILC_ASN1_OPTS macro with SILC_ASN1_ALLOC option is given then
    all results are dynamically allocated and caller must free them by
    itself. Alternatively if SILC_ASN1_ACCUMUL is given then memory is
    accumulated from `asn1' for results and they are freed only when the
    silc_asn1_free or silc_asn1_uninit is called.  Next calls to the
    silc_asn1_decode will NOT invalidate the old results, but will
    accumulate more memory for new results.  If the SILC_ASN1_OPTS is not
    given at all then the default allocation method (decribed above)
    applies.
    If caller needs to store the results even after `asn1' becomes invalid
    then call must either use SILC_ASN1_ALLOC option or duplicate the
    results by itself.
EXAMPLE
    SilcBool bool_val, foo;
    unsigned char *string, string2;
    SilcUInt32 string_len, string2_len;
    silc_asn1_decode(asn1, tree,
                     SILC_ASN1_SEQUENCE,
                       SILC_ASN1_BOOLEAN(&bool_val),
                       SILC_ASN1_OCTET_STRING(&string, &string_len),
                       SILC_ASN1_SEQUENCE_T(0, 2),
                         SILC_ASN1_BOOLEAN_T(SILC_ASN1_EXPLICIT, 100, &foo),
                       SILC_ASN1_END,
                       SILC_ASN1_OCTET_STRING_T(0, 1, &str2, &str2_len),
                     SILC_ASN1_END, SILC_ASN1_END);
 
 
 
 |