]> git.sur5r.net Git - openldap/blobdiff - contrib/slapd-modules/comp_match/componentlib.c
Merge remote-tracking branch 'origin/mdb.master'
[openldap] / contrib / slapd-modules / comp_match / componentlib.c
index 013d309f71672a29a79ae7a726485e5ee8e91579..93141b3bc88cccd5b78e44a4282dcb3476e23e51 100644 (file)
@@ -16,8 +16,9 @@
 #include "lutil.h"
 #include <ldap.h>
 #include "slap.h"
-
 #include "component.h"
+
+#include "componentlib.h"
 #include "asn.h"
 #include <asn-gser.h>
 #include <stdlib.h>
@@ -66,9 +67,12 @@ FreeComponentBits ( ComponentBits* v ) {
 int
 GEncComponentBits ( GenBuf *b, ComponentBits *in )
 {
-    if ( !in )
-       return (-1);
-    return GEncAsnBitsContent ( b, &in->value );
+       GAsnBits bits = {0};
+
+       bits.value = in->value;
+       if ( !in )
+               return (-1);
+       return GEncAsnBitsContent ( b, &bits);
 }
 
 
@@ -98,23 +102,8 @@ GDecComponentBits ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int
                return LDAP_DECODING_ERROR;
        }
        k->value = result.value;
+       k->comp_desc = get_component_description (BASICTYPE_BITSTRING);
 
-       k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc ) {
-               if ( k ) CompFree( mem_op,  k );
-               return LDAP_DECODING_ERROR;
-       }
-       k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentBits;
-       k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentBits;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentBits;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-       k->comp_desc->cd_extract_i = NULL;
-       k->comp_desc->cd_type = ASN_BASIC;
-       k->comp_desc->cd_type_id = BASICTYPE_BITSTRING;
-       k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentBits;
-       /* Real Decoding code need to be followed */
        return LDAP_SUCCESS;
 }
 
@@ -158,21 +147,7 @@ BDecComponentBits ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
        }
 
        k->value = result;
-
-        k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree( mem_op,  k );
-               return LDAP_DECODING_ERROR;
-       }
-        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentBits;
-        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentBits;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentBits;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-        k->comp_desc->cd_extract_i = NULL;
-        k->comp_desc->cd_type = ASN_BASIC;
-        k->comp_desc->cd_type_id = BASICTYPE_BITSTRING;
-        k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentBits;
+       k->comp_desc = get_component_description (BASICTYPE_BITSTRING);
  
        return LDAP_SUCCESS;
 }
@@ -180,12 +155,16 @@ BDecComponentBits ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
 /*
  * Component GSER BMPString Encoder
  */
- int
- GEncComponentBMPString ( GenBuf *b, ComponentBMPString *in )
- {
-    if ( !in || in->value.octetLen <= 0 ) return (-1);
-    return GEncBMPStringContent ( b, &in->value );
- }
+int
+GEncComponentBMPString ( GenBuf *b, ComponentBMPString *in )
+{
+       GBMPString t = {0};
+
+       if ( !in || in->value.octetLen <= 0 )
+               return (-1);
+       t.value = in->value;
+       return GEncBMPStringContent ( b, &t );
+}
 
 /*
  * Component GSER BMPString Decoder
@@ -216,21 +195,7 @@ GDecComponentBMPString ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded,
        }
 
        k->value = result.value;
-
-       k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-       k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentBMPString;
-       k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentBMPString;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentBMPString;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-       k->comp_desc->cd_extract_i = NULL;
-       k->comp_desc->cd_type = ASN_BASIC;
-       k->comp_desc->cd_type_id = BASICTYPE_BMP_STR;
-       k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentBMPString;
+       k->comp_desc = get_component_description (BASICTYPE_BMP_STR);
  
        return LDAP_SUCCESS;
 
@@ -276,21 +241,7 @@ BDecComponentBMPString ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void
        }
 
        k->value = result;
-
-        k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentBMPString;
-        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentBMPString;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentBMPString;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-        k->comp_desc->cd_extract_i = NULL;
-        k->comp_desc->cd_type = ASN_BASIC;
-        k->comp_desc->cd_type_id = BASICTYPE_BMP_STR;
-        k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentBMPString;
+       k->comp_desc = get_component_description (BASICTYPE_BMP_STR);
  
        return LDAP_SUCCESS;
 
@@ -302,9 +253,11 @@ BDecComponentBMPString ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void
 int
 GEncComponentUTF8String ( GenBuf *b, ComponentUTF8String *in )
 {
-    if ( !in || in->value.octetLen <= 0 )
-        return (-1);
-    return GEncUTF8StringContent ( b, &in->value );
+       GUTF8String t = {0};
+       if ( !in || in->value.octetLen <= 0 )
+               return (-1);
+       t.value = in->value;
+       return GEncUTF8StringContent ( b, &t );
 }
 
 /*
@@ -336,21 +289,7 @@ GDecComponentUTF8String ( void* mem_op, GenBuf *b, void *v,
        }
        
        k->value = result.value;
-
-       k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree( mem_op,  k );
-               return LDAP_DECODING_ERROR;
-       }
-       k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentUTF8String;
-       k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentUTF8String;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentUTF8String;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-       k->comp_desc->cd_extract_i = NULL;
-       k->comp_desc->cd_type = ASN_BASIC;
-       k->comp_desc->cd_type_id = BASICTYPE_UTF8_STR;
-       k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentUTF8String;
+       k->comp_desc = get_component_description (BASICTYPE_UTF8_STR);
  
        return LDAP_SUCCESS;
 }
@@ -394,21 +333,9 @@ BDecComponentUTF8String ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len,
        }
 
        k->value = result;
+       k->comp_desc = get_component_description (BASICTYPE_UTF8_STR);
 
-        k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentUTF8String;
-        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentUTF8String;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentUTF8String;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-        k->comp_desc->cd_extract_i = NULL;
-        k->comp_desc->cd_type = ASN_BASIC;
-        k->comp_desc->cd_type_id = BASICTYPE_UTF8_STR;
-        k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentUTF8String;
+       return LDAP_SUCCESS;
 }
 
 /*
@@ -417,9 +344,12 @@ BDecComponentUTF8String ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len,
 int
 GEncComponentTeletexString ( GenBuf *b, ComponentTeletexString *in )
 {
-    if ( !in || in->value.octetLen <= 0 )
-        return (-1);
-    return GEncTeletexStringContent ( b, &in->value );
+       GTeletexString t = {0};
+
+       if ( !in || in->value.octetLen <= 0 )
+               return (-1);
+       t.value = in->value;
+       return GEncTeletexStringContent ( b, &t );
 }
 
 /*
@@ -451,21 +381,7 @@ GDecComponentTeletexString  ( void* mem_op, GenBuf *b, void *v,
        }
 
        k->value = result.value;
-
-       k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-       k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentTeletexString;
-       k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentTeletexString;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentTeletexString;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-       k->comp_desc->cd_extract_i = NULL;
-       k->comp_desc->cd_type = ASN_BASIC;
-       k->comp_desc->cd_type_id = BASICTYPE_VIDEOTEX_STR;
-       k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentTeletexString;
+       k->comp_desc = get_component_description (BASICTYPE_VIDEOTEX_STR);
  
        return LDAP_SUCCESS;
 }
@@ -499,9 +415,12 @@ MatchingComponentBool(char* oid, ComponentSyntaxInfo* csi_attr,
 int
 GEncComponentBool ( GenBuf *b, ComponentBool *in )
 {
-    if ( !in )
-        return (-1);
-    return GEncAsnBoolContent ( b, &in->value );
+       GAsnBool t = {0};
+
+       if ( !in )
+               return (-1);
+       t.value = in->value;
+       return GEncAsnBoolContent ( b, &t );
 }
 
 /*
@@ -530,21 +449,7 @@ GDecComponentBool ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int
        }
 
        k->value = result.value;
-
-       k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-       k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentBool;
-       k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentBool;
-       k->comp_desc->cd_free = (comp_free_func*)NULL;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-       k->comp_desc->cd_extract_i = NULL;
-       k->comp_desc->cd_type = ASN_BASIC;
-       k->comp_desc->cd_type_id = BASICTYPE_BOOLEAN;
-       k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentBool;
+       k->comp_desc = get_component_description (BASICTYPE_BOOLEAN);
  
         return LDAP_SUCCESS;
 }
@@ -587,22 +492,8 @@ BDecComponentBool ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
        }
 
        k->value = result;
+       k->comp_desc = get_component_description (BASICTYPE_BOOLEAN);
 
-        k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentBool;
-        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentBool;
-       k->comp_desc->cd_free = (comp_free_func*)NULL;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-        k->comp_desc->cd_extract_i = NULL;
-        k->comp_desc->cd_type = ASN_BASIC;
-        k->comp_desc->cd_type_id = BASICTYPE_BOOLEAN;
-        k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentBool;
         return LDAP_SUCCESS;
 }
 
@@ -635,9 +526,12 @@ MatchingComponentEnum ( char* oid, ComponentSyntaxInfo *csi_attr,
 int
 GEncComponentEnum ( GenBuf *b, ComponentEnum *in )
 {
-    if ( !in )
-       return (-1);
-    return GEncAsnEnumContent ( b, &in->value );
+       GAsnEnum t = {0};
+
+       if ( !in )
+               return (-1);
+       t.value = in->value;
+       return GEncAsnEnumContent ( b, &t );
 }
 
 /*
@@ -674,11 +568,10 @@ GDecComponentEnum ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int
                if ( k ) CompFree ( mem_op, k );
                return LDAP_DECODING_ERROR;
        }
+       k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentEnum;
        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentEnum;
        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentEnum;
        k->comp_desc->cd_free = (comp_free_func*)NULL;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
        k->comp_desc->cd_extract_i = NULL;
        k->comp_desc->cd_type = ASN_BASIC;
        k->comp_desc->cd_type_id = BASICTYPE_ENUMERATED;
@@ -732,11 +625,10 @@ BDecComponentEnum ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
                if ( k  ) CompFree ( mem_op, k );
                return LDAP_DECODING_ERROR;
        }
+       k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentEnum;
         k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentEnum;
         k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentEnum;
        k->comp_desc->cd_free = (comp_free_func*)NULL;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
         k->comp_desc->cd_extract_i = NULL;
         k->comp_desc->cd_type = ASN_BASIC;
         k->comp_desc->cd_type_id = BASICTYPE_ENUMERATED;
@@ -751,8 +643,10 @@ BDecComponentEnum ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
 int
 GEncComponentIA5Stirng ( GenBuf *b, ComponentIA5String* in )
 {
-    if ( !in || in->value.octetLen <= 0 ) return (-1);
-    return GEncIA5StringContent( b, &in->value );
+       GIA5String t = {0};
+       t.value = in->value;
+       if ( !in || in->value.octetLen <= 0 ) return (-1);
+       return GEncIA5StringContent( b, &t );
 }
 
 /*
@@ -800,11 +694,10 @@ BDecComponentIA5String ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void
                if ( k ) CompFree ( mem_op, k );
                return LDAP_DECODING_ERROR;
        }
+       k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentIA5String;
         k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentIA5String;
         k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentIA5String;
        k->comp_desc->cd_free = (comp_free_func*)FreeComponentIA5String;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
         k->comp_desc->cd_extract_i = NULL;
         k->comp_desc->cd_type = ASN_BASIC;
         k->comp_desc->cd_type_id = BASICTYPE_IA5_STR;
@@ -843,8 +736,12 @@ function*/
 int
 GEncComponentInt ( GenBuf *b, ComponentInt* in )
 {
-    if ( !in ) return (-1);
-    return GEncAsnIntContent ( b, &in->value );
+       GAsnInt t = {0};
+
+       if ( !in )
+               return (-1);
+       t.value = in->value;
+       return GEncAsnIntContent ( b, &t );
 }
 
 /*
@@ -873,21 +770,7 @@ GDecComponentInt( void* mem_op, GenBuf * b, void *v, AsnLen *bytesDecoded, int m
                return LDAP_DECODING_ERROR;
        }
        k->value = result.value;
-
-       k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-       k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentInt;
-       k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentInt;
-       k->comp_desc->cd_free = (comp_free_func*)NULL;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-       k->comp_desc->cd_extract_i = NULL;
-       k->comp_desc->cd_type = ASN_BASIC;
-       k->comp_desc->cd_type_id = BASICTYPE_INTEGER;
-       k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentInt;
+       k->comp_desc = get_component_description (BASICTYPE_INTEGER );
 
         return LDAP_SUCCESS;
 }
@@ -927,20 +810,7 @@ BDecComponentInt ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
        }
        k->value = result;
 
-        k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentInt;
-        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentInt;
-       k->comp_desc->cd_free = (comp_free_func*)NULL;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-        k->comp_desc->cd_extract_i = NULL;
-        k->comp_desc->cd_type = ASN_BASIC;
-        k->comp_desc->cd_type_id = BASICTYPE_INTEGER;
-        k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentInt;
+       k->comp_desc = get_component_description (BASICTYPE_INTEGER );
         
         return LDAP_SUCCESS;
 }
@@ -972,8 +842,12 @@ MatchingComponentNull ( char *oid, ComponentSyntaxInfo *csi_attr,
 int
 GEncComponentNull ( GenBuf *b, ComponentNull *in )
 {
-    if ( !in ) return (-1);
-    return GEncAsnNullContent ( b, &in->value );
+       GAsnNull t = {0};
+
+       if ( !in )
+               return (-1);
+       t.value = in->value;
+       return GEncAsnNullContent ( b, &t );
 }
 
 /*
@@ -1008,11 +882,10 @@ GDecComponentNull ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int
                if ( k ) CompFree ( mem_op, k );
                return LDAP_DECODING_ERROR;
        }
+       k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentNull;
        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentNull;
        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentNull;
        k->comp_desc->cd_free = (comp_free_func*)FreeComponentNull;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
        k->comp_desc->cd_extract_i = NULL;
        k->comp_desc->cd_type = ASN_BASIC;
        k->comp_desc->cd_type_id = BASICTYPE_NULL;
@@ -1067,11 +940,10 @@ BDecComponentNull ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
                if ( k ) CompFree ( mem_op, k );
                return LDAP_DECODING_ERROR;
        }
+       k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentNull;
        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentNull;
        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentNull;
        k->comp_desc->cd_free = (comp_free_func*)FreeComponentNull;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
        k->comp_desc->cd_extract_i = NULL;
        k->comp_desc->cd_type = ASN_BASIC;
        k->comp_desc->cd_type_id = BASICTYPE_NULL;
@@ -1122,11 +994,10 @@ BDecComponentNumericString ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len,
                if ( k ) CompFree ( mem_op, k );
                return LDAP_DECODING_ERROR;
        }
+       k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentNumericString;
         k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentNumericString;
         k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentNumericString;
        k->comp_desc->cd_free = (comp_free_func*)FreeComponentNumericString;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
         k->comp_desc->cd_extract_i = NULL;
         k->comp_desc->cd_type = ASN_BASIC;
         k->comp_desc->cd_type_id = BASICTYPE_NUMERIC_STR;
@@ -1176,9 +1047,12 @@ MatchingComponentOcts ( char* oid, ComponentSyntaxInfo* csi_attr,
 int
 GEncComponentOcts ( GenBuf* b, ComponentOcts *in )
 {
-    if ( !in || in->value.octetLen <= 0 )
-        return (-1);
-    return GEncAsnOctsContent ( b, &in->value );
+       GAsnOcts t = {0};
+       if ( !in || in->value.octetLen <= 0 )
+               return (-1);
+
+       t.value = in->value;
+       return GEncAsnOctsContent ( b, &t );
 }
 
 /*
@@ -1213,11 +1087,10 @@ GDecComponentOcts ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int
                if ( k ) CompFree ( mem_op, k );
                return LDAP_DECODING_ERROR;
        }
+       k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentOcts;
        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentOcts;
        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentOcts;
        k->comp_desc->cd_free = (comp_free_func*)FreeComponentOcts;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
        k->comp_desc->cd_extract_i = NULL;
        k->comp_desc->cd_type = ASN_BASIC;
        k->comp_desc->cd_type_id = BASICTYPE_OCTETSTRING;
@@ -1270,11 +1143,10 @@ BDecComponentOcts ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
                if ( k ) CompFree ( mem_op, k );
                return LDAP_DECODING_ERROR;
        }
+       k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentOcts;
         k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentOcts;
         k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentOcts;
        k->comp_desc->cd_free = (comp_free_func*)FreeComponentOcts;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
         k->comp_desc->cd_extract_i = NULL;
         k->comp_desc->cd_type = ASN_BASIC;
         k->comp_desc->cd_type_id = BASICTYPE_OCTETSTRING;
@@ -1313,8 +1185,12 @@ MatchingComponentOid ( char *oid, ComponentSyntaxInfo *csi_attr ,
  */
 GEncComponentOid ( GenBuf *b, ComponentOid *in )
 {
-    if ( !in || in->value.octetLen <= 0 ) return (-1);
-    return GEncAsnOidContent( b, &in->value );
+       GAsnOid t = {0};
+
+       if ( !in || in->value.octetLen <= 0 )
+               return (-1);
+       t.value = in->value;
+       return GEncAsnOidContent( b, (GAsnOcts*)&t );
 }
 
 /*
@@ -1339,7 +1215,7 @@ GDecAsnDescOidContent ( void* mem_op, GenBuf *b, GAsnOid *result, AsnLen *bytesD
        peek_head = ad_type->sat_atype.at_oid;
        strLen = strlen ( peek_head );
 
-       result->value.octs = EncodeComponentOid ( mem_op, peek_head , &strLen );
+       result->value.octs = (char*)EncodeComponentOid ( mem_op, peek_head , &strLen );
        result->value.octetLen = strLen;
        return LDAP_SUCCESS;
 }
@@ -1393,21 +1269,7 @@ GDecComponentOid ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int m
                }
        }
        k->value = result.value;
-
-       k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-       k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentOid;
-       k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentOid;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentOid;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-       k->comp_desc->cd_extract_i = NULL;
-       k->comp_desc->cd_type = ASN_BASIC;
-       k->comp_desc->cd_type_id = BASICTYPE_OID;
-       k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentOid;
+       k->comp_desc = get_component_description (BASICTYPE_OID);
 
        return LDAP_SUCCESS;
 }
@@ -1451,20 +1313,8 @@ BDecComponentOid ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
        }
        k->value = result;
 
-        k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentOid;
-        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentOid;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentOid;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-        k->comp_desc->cd_extract_i = NULL;
-        k->comp_desc->cd_type = ASN_BASIC;
-        k->comp_desc->cd_type_id = BASICTYPE_OID;
-        k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentOid;
+       k->comp_desc = get_component_description (BASICTYPE_OID);
+
        return LDAP_SUCCESS;
 }
 
@@ -1508,23 +1358,57 @@ BDecComponentPrintableString( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len,
        }
        k->value = result;
 
-       k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
+       k->comp_desc = get_component_description (BASICTYPE_PRINTABLE_STR);
+
+       return LDAP_SUCCESS;
+}
+
+/*
+ * Component BER Decoder : TeletexString
+ */
+
+int
+BDecComponentTeletexStringTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode )
+{
+       return BDecComponentTeletexString ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
+}
+
+int
+BDecComponentTeletexString( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v, AsnLen *bytesDecoded, int mode )
+{
+        char* peek_head;
+        int i, strLen, rc;
+        void* component_values;
+        ComponentTeletexString* k, **k2;
+       AsnOid result;
+                                                                          
+        k = (ComponentTeletexString*) v;
+                                                                          
+        if ( mode & DEC_ALLOC_MODE_0 ) {
+                k2 = (ComponentTeletexString**) v;
+                *k2 = (ComponentTeletexString*) CompAlloc( mem_op, sizeof( ComponentTeletexString ) );
+               if ( !*k2 ) return LDAP_DECODING_ERROR;
+                k = *k2;
+        }
+
+       if ( mode & CALL_TAG_DECODER ) {
+               mode = mode & CALL_CONTENT_DECODER;
+               rc = BDecTeletexString ( mem_op, b, &result, bytesDecoded );
+       } else {
+               rc = BDecTeletexStringContent ( mem_op, b, tagId, len, &result, bytesDecoded );
+       }
+       if ( rc < 0 ) {
                if ( k ) CompFree ( mem_op, k );
                return LDAP_DECODING_ERROR;
        }
-       k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentPrintableString;
-       k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentPrintableString;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentPrintableString;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-       k->comp_desc->cd_extract_i = NULL;
-       k->comp_desc->cd_type = ASN_BASIC;
-       k->comp_desc->cd_type_id = BASICTYPE_PRINTABLE_STR;
-       k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentPrintableString;
+       k->value = result;
+
+       k->comp_desc = get_component_description (BASICTYPE_T61_STR);
+
        return LDAP_SUCCESS;
 }
 
+
 /*
  * Matching function : Real
  */
@@ -1554,9 +1438,11 @@ MatchingComponentReal (char* oid, ComponentSyntaxInfo *csi_attr,
 int
 GEncComponentReal ( GenBuf *b, ComponentReal *in )
 {
-    if ( !in )
-       return (-1);
-    return GEncAsnRealContent ( b, &in->value );
+       GAsnReal t = {0};
+       if ( !in )
+               return (-1);
+       t.value = in->value;
+       return GEncAsnRealContent ( b, &t );
 }
 
 /*
@@ -1585,21 +1471,7 @@ GDecComponentReal ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int
                return LDAP_DECODING_ERROR;
        }
        k->value = result.value;
-
-       k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-       k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentReal;
-       k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentReal;
-       k->comp_desc->cd_free = (comp_free_func*)NULL;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-       k->comp_desc->cd_extract_i = NULL;
-       k->comp_desc->cd_type = ASN_BASIC;
-       k->comp_desc->cd_type_id = BASICTYPE_REAL;
-       k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentReal;
+       k->comp_desc = get_component_description (BASICTYPE_REAL);
 
         return LDAP_SUCCESS;
 }
@@ -1641,21 +1513,7 @@ BDecComponentReal ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
                return LDAP_DECODING_ERROR;
        }
        k->value = result;
-
-        k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentReal;
-        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentReal;
-       k->comp_desc->cd_free = (comp_free_func*)NULL;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-        k->comp_desc->cd_extract_i = NULL;
-        k->comp_desc->cd_type = ASN_BASIC;
-        k->comp_desc->cd_type_id = BASICTYPE_REAL;
-        k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentReal;
+       k->comp_desc = get_component_description (BASICTYPE_REAL);
 
         return LDAP_SUCCESS;
 }
@@ -1693,9 +1551,12 @@ MatchingComponentRelativeOid ( char* oid, ComponentSyntaxInfo *csi_attr,
 int
 GEncComponentRelativeOid ( GenBuf *b, ComponentRelativeOid *in )
 {
-    if ( !in || in->value.octetLen <= 0 )
-       return (-1);
-    return GEncAsnRelativeOidContent ( b , &in->value );
+       GAsnRelativeOid t = {0};
+
+       if ( !in || in->value.octetLen <= 0 )
+               return (-1);
+       t.value = in->value;
+       return GEncAsnRelativeOidContent ( b , (GAsnOcts*)&t );
 }
 
 /*
@@ -1724,22 +1585,8 @@ GDecComponentRelativeOid ( void* mem_op, GenBuf *b,void *v, AsnLen *bytesDecoded
                return LDAP_DECODING_ERROR;
        }
        k->value = result.value;
+       k->comp_desc = get_component_description (BASICTYPE_OID);
 
-       k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-       k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentRelativeOid;
-       k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentRelativeOid;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentRelativeOid;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-       k->comp_desc->cd_extract_i = NULL;
-       k->comp_desc->cd_type = ASN_BASIC;
-       k->comp_desc->cd_type_id = BASICTYPE_OID;
-       k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentRelativeOid;
-       
        return LDAP_SUCCESS;
 }
 
@@ -1780,21 +1627,8 @@ BDecComponentRelativeOid ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, vo
                return LDAP_DECODING_ERROR;
        }
        k->value = result;
+       k->comp_desc = get_component_description (BASICTYPE_OID);
 
-        k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentRelativeOid;
-        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentRelativeOid;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentRelativeOid;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-        k->comp_desc->cd_extract_i = NULL;
-        k->comp_desc->cd_type = ASN_BASIC;
-        k->comp_desc->cd_type_id = BASICTYPE_RELATIVE_OID;
-        k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentRelativeOid;
        return LDAP_SUCCESS;
 }
 
@@ -1804,9 +1638,11 @@ BDecComponentRelativeOid ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, vo
 int
 GEncComponentUniversalString ( GenBuf *b, ComponentUniversalString *in )
 {
-    if ( !in || in->value.octetLen <= 0 )
-       return (-1);
-    return GEncUniversalStringContent( b, &in->value );
+       GUniversalString t = {0};
+       if ( !in || in->value.octetLen <= 0 )
+               return (-1);
+       t.value = in->value;
+       return GEncUniversalStringContent( b, &t );
 }
 
 /*
@@ -1863,21 +1699,8 @@ BDecComponentUniversalString ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len
                return LDAP_DECODING_ERROR;
        }
        k->value = result;
+       k->comp_desc = get_component_description (BASICTYPE_UNIVERSAL_STR);
 
-        k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentUniversalString;
-        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentUniversalString;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentUniversalString;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-        k->comp_desc->cd_extract_i = NULL;
-        k->comp_desc->cd_type = ASN_BASIC;
-        k->comp_desc->cd_type_id = BASICTYPE_UNIVERSAL_STR;
-        k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentUniversalString;
        return LDAP_SUCCESS;
 }
 
@@ -1914,28 +1737,46 @@ BDecComponentVisibleString ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len,
                rc = BDecVisibleStringContent ( mem_op, b, tagId, len, &result, bytesDecoded );
        }
        k->value = result;
+       k->comp_desc = get_component_description (BASICTYPE_VISIBLE_STR);
 
-        k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
-       if ( !k->comp_desc )  {
-               if ( k ) CompFree ( mem_op, k );
-               return LDAP_DECODING_ERROR;
-       }
-        k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentVisibleString;
-        k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentVisibleString;
-       k->comp_desc->cd_free = (comp_free_func*)FreeComponentVisibleString;
-       k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-       k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
-        k->comp_desc->cd_extract_i = NULL;
-        k->comp_desc->cd_type = ASN_BASIC;
-        k->comp_desc->cd_type_id = BASICTYPE_VISIBLE_STR;
-        k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentVisibleString;
        return LDAP_SUCCESS;
 }
 
 /*
  * Routines for handling an ANY DEFINED Type
  */
-void
+
+/* Check if the <select> type CR and the OID of the given ANY type */
+int
+CheckSelectTypeCorrect ( void* mem_op, ComponentAnyInfo* cai, struct berval* select ) {
+       int strLen;
+       AttributeType* ad_type;
+       char* oid;
+       char* result;
+
+       if ( IsNumericOid ( select->bv_val , select->bv_len ) ) {
+               oid = select->bv_val;
+               strLen = select->bv_len;
+       } else {
+               ad_type = at_bvfind( select );
+
+               if ( !ad_type )
+                       return LDAP_DECODING_ERROR;
+
+               oid = ad_type->sat_atype.at_oid;
+               strLen = strlen ( oid );
+       }
+       result = EncodeComponentOid ( mem_op, oid , &strLen );
+       if ( !result || strLen <= 0 ) return (-1);
+
+       if ( cai->oid.octetLen == strLen &&
+               strncmp ( cai->oid.octs, result, strLen ) == 0 )
+               return (1);
+       else
+               return (-1);
+}
+
+int
 SetAnyTypeByComponentOid ( ComponentAny *v, ComponentOid *id ) {
        Hash hash;
        void *anyInfo;
@@ -1953,6 +1794,7 @@ SetAnyTypeByComponentOid ( ComponentAny *v, ComponentOid *id ) {
         * Yet-to-be-Implemented
         */
        }
+       return LDAP_SUCCESS;
 }
 
 void
@@ -1970,16 +1812,20 @@ SetAnyTypeByComponentInt( ComponentAny *v, ComponentInt id) {
 int
 GEncComponentAny ( GenBuf *b, ComponentAny *in )
 {
-    if ( in->cai != NULL  && in->cai->Encode != NULL )
-        return in->cai->Encode(b, &in->value );
-    else return (-1);
+       if ( in->cai != NULL  && in->cai->Encode != NULL )
+               return in->cai->Encode(b, &in->value );
+       else
+               return (-1);
 }
 
 int
-BDecComponentAny ( void* mem_op, GenBuf *b, ComponentAny *result, AsnLen *bytesDecoded, int mode) {
+BEncComponentAny ( void* mem_op, GenBuf *b, ComponentAny *result, AsnLen *bytesDecoded, int mode)
+{
         ComponentAny *k, **k2;
                                                                           
         k = (ComponentAny*) result;
+
+       if ( !k ) return (-1);
                                                                           
         if ( mode & DEC_ALLOC_MODE_0 ) {
                 k2 = (ComponentAny**) result;
@@ -1998,11 +1844,50 @@ BDecComponentAny ( void* mem_op, GenBuf *b, ComponentAny *result, AsnLen *bytesD
                        if ( k ) CompFree ( mem_op, k );
                        return LDAP_DECODING_ERROR;
                }
+               k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentAny;
+               k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentAny;
+               k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentAny;
+               k->comp_desc->cd_free = (comp_free_func*)FreeComponentAny;
+               k->comp_desc->cd_extract_i = NULL;
+               k->comp_desc->cd_type = ASN_BASIC;
+               k->comp_desc->cd_type_id = BASICTYPE_ANY;
+               k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentAny;
+               return LDAP_SUCCESS;
+       }
+       else {
+               Asn1Error ("ERROR - Component ANY Decode routine is NULL\n");
+               return 0;
+       }
+}
+
+int
+BDecComponentAny ( void* mem_op, GenBuf *b, ComponentAny *result, AsnLen *bytesDecoded, int mode) {
+       int rc;
+        ComponentAny *k, **k2;
+                                                                          
+        k = (ComponentAny*) result;
+
+       if ( !k ) return (-1);
+                                                                          
+        if ( mode & DEC_ALLOC_MODE_0 ) {
+                k2 = (ComponentAny**) result;
+                *k2 = (ComponentAny*) CompAlloc( mem_op, sizeof( ComponentAny ) );
+               if ( !*k2 ) return LDAP_DECODING_ERROR;
+                k = *k2;
+        }
+       
+       if ((result->cai != NULL) && (result->cai->BER_Decode != NULL)) {
+               result->cai->BER_Decode ( mem_op, b, (ComponentSyntaxInfo*)&result->value, (int*)bytesDecoded, DEC_ALLOC_MODE_0 );
+
+               k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
+               if ( !k->comp_desc )  {
+                       if ( k ) CompFree ( mem_op, k );
+                       return LDAP_DECODING_ERROR;
+               }
+               k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentAny;
                k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentAny;
                k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentAny;
                k->comp_desc->cd_free = (comp_free_func*)FreeComponentAny;
-               k->comp_desc->cd_pretty = (slap_syntax_transform_func*)NULL;
-               k->comp_desc->cd_validate = (slap_syntax_validate_func*)NULL;
                k->comp_desc->cd_extract_i = NULL;
                k->comp_desc->cd_type = ASN_BASIC;
                k->comp_desc->cd_type_id = BASICTYPE_ANY;
@@ -2036,6 +1921,7 @@ GDecComponentAny ( void* mem_op, GenBuf *b, ComponentAny *result, AsnLen *bytesD
                        if ( k ) CompFree ( mem_op, k );
                        return LDAP_DECODING_ERROR;
                }
+               k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentAny;
                k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentAny;
                k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentAny;
                k->comp_desc->cd_free = (comp_free_func*)FreeComponentAny;
@@ -2134,6 +2020,112 @@ InstallAnyByComponentInt (int anyId, ComponentInt intId, unsigned int size,
                Insert(anyIntHashTblG, a, h);
 }
 
+
+/*
+ * OID and its corresponding decoder can be registerd with this func.
+ * If contained types constrained by <select> are used,
+ * their OID and decoder MUST be registered, otherwise it will return no entry.
+ * An open type(ANY type) also need be registered.
+ */
+void
+InstallOidDecoderMapping ( char* ch_oid, EncodeFcn encode, gser_decoder_func* G_decode, ber_tag_decoder_func* B_decode, ExtractFcn extract, MatchFcn match ) {
+       AsnOid oid;
+       int strLen;
+       void* mem_op;
+
+       strLen = strlen( ch_oid );
+       if( strLen <= 0 ) return;
+       mem_op = comp_nibble_memory_allocator ( 128, 16 );
+       oid.octs = EncodeComponentOid ( mem_op, ch_oid, &strLen );
+       oid.octetLen = strLen;
+       if( strLen <= 0 ) return;
+       
+
+       InstallAnyByComponentOid ( 0, &oid, 0, encode, G_decode, B_decode,
+                                               extract, match, NULL, NULL);
+       comp_nibble_memory_free(mem_op);
+}
+
+/*
+ * Look up Oid-decoder mapping table by berval have either
+ * oid or description
+ */
+OidDecoderMapping*
+RetrieveOidDecoderMappingbyBV( struct berval* in ) {
+       if ( IsNumericOid ( in->bv_val, in->bv_len ) )
+               return RetrieveOidDecoderMappingbyOid( in->bv_val, in->bv_len );
+       else
+               return RetrieveOidDecoderMappingbyDesc( in->bv_val, in->bv_len );
+}
+
+/*
+ * Look up Oid-decoder mapping table by dotted OID
+ */
+OidDecoderMapping*
+RetrieveOidDecoderMappingbyOid( char* ch_oid, int oid_len ) {
+       Hash hash;
+       void *anyInfo;
+       AsnOid oid;
+       int strLen;
+       void* mem_op;
+
+       mem_op = comp_nibble_memory_allocator ( 128, 16 );
+       oid.octs = EncodeComponentOid ( mem_op, ch_oid, &oid_len);
+       oid.octetLen = oid_len;
+       if( oid_len <= 0 ) {
+               comp_nibble_memory_free( mem_op );
+               return NULL;
+       }
+       
+       /* use encoded oid as hash string */
+       hash = MakeHash ( oid.octs, oid.octetLen);
+       comp_nibble_memory_free( mem_op );
+       if (CheckForAndReturnValue (anyOidHashTblG, hash, &anyInfo))
+               return (OidDecoderMapping*) anyInfo;
+       else
+               return (OidDecoderMapping*) NULL;
+
+}
+
+/*
+ * Look up Oid-decoder mapping table by description
+ */
+OidDecoderMapping*
+RetrieveOidDecoderMappingbyDesc( char* desc, int desc_len ) {
+       Hash hash;
+       void *anyInfo;
+       AsnOid oid;
+       AttributeType* ad_type;
+       struct berval bv;
+       void* mem_op;
+
+       bv.bv_val = desc;
+       bv.bv_len = desc_len;
+       ad_type = at_bvfind( &bv );
+
+       oid.octs = ad_type->sat_atype.at_oid;
+       oid.octetLen = strlen ( oid.octs );
+
+       if ( !ad_type )
+               return (OidDecoderMapping*) NULL;
+
+       mem_op = comp_nibble_memory_allocator ( 128, 16 );
+
+       oid.octs = EncodeComponentOid ( mem_op, oid.octs , (int*)&oid.octetLen );
+       if( oid.octetLen <= 0 ) {
+               comp_nibble_memory_free( mem_op );
+               return (OidDecoderMapping*) NULL;
+       }
+       
+       /* use encoded oid as hash string */
+       hash = MakeHash ( oid.octs, oid.octetLen);
+       comp_nibble_memory_free( mem_op );
+       if (CheckForAndReturnValue (anyOidHashTblG, hash, &anyInfo))
+               return (OidDecoderMapping*) anyInfo;
+       else
+               return (OidDecoderMapping*) NULL;
+
+}
 void
 InstallAnyByComponentOid (int anyId, AsnOid *oid, unsigned int size,
                        EncodeFcn encode, gser_decoder_func* G_decode,
@@ -2145,8 +2137,11 @@ InstallAnyByComponentOid (int anyId, AsnOid *oid, unsigned int size,
 
        a = (ComponentAnyInfo*) malloc (sizeof (ComponentAnyInfo));
        a->anyId = anyId;
-       a->oid.octs = NULL;
-       a->oid.octetLen = 0;
+       if ( oid ) {
+               a->oid.octs = malloc( oid->octetLen );
+               memcpy ( a->oid.octs, oid->octs, oid->octetLen );
+               a->oid.octetLen = oid->octetLen;
+       }
        a->size = size;
        a->Encode = encode;
        a->GSER_Decode = G_decode;
@@ -2177,9 +2172,9 @@ AsnLen *bytesDecoded _AND_
 int mode) {
        tag = BDecTag ( b, bytesDecoded );
        elmtLen = BDecLen ( b, bytesDecoded );
+       if ( elmtLen <= 0 ) return (-1);
        if ( tag != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE) ) {
-               printf("Invliad Tag\n");
-               exit (1);
+               return (-1);
        }
                
        return (*decoder)( mem_op, b, tag, elmtLen, (ComponentSyntaxInfo*)v,(int*)bytesDecoded, mode );
@@ -2209,9 +2204,8 @@ int mode) {
  * LDAP Encodings : cn=sang,o=ibm,c=us 
  */
 
-int
-increment_bv_mem ( struct berval* in ) {
-       int new_size = in->bv_len + INCREMENT_SIZE;
+increment_bv_mem_by_size ( struct berval* in, int size ) {
+       int new_size = in->bv_len + size;
        in->bv_val = realloc( in->bv_val, new_size );
        in->bv_len = new_size;
 }
@@ -2242,7 +2236,7 @@ ConvertBER2Desc( char* in, int size, struct berval* out, int* pos ) {
 
        /*check if the buffer can store the first/second arc and two dots*/
        if ( out->bv_len < *pos + 2 + 1 + rc )
-               increment_bv_mem ( out );
+               increment_bv_mem_by_size ( out, INCREMENT_SIZE );
 
        if ( firstArcNum == 1)
                out->bv_val[*pos] = '1';
@@ -2266,7 +2260,7 @@ ConvertBER2Desc( char* in, int size, struct berval* out, int* pos ) {
                rc = intToAscii ( arcNum, buf );
 
                if ( out->bv_len < *pos + rc + 1 )
-                       increment_bv_mem ( out );
+                       increment_bv_mem_by_size ( out, INCREMENT_SIZE );
 
                memcpy( out->bv_val + *pos, buf, rc );
                *pos += rc;
@@ -2300,14 +2294,14 @@ ConvertComponentAttributeTypeAndValue2RFC2253 ( irAttributeTypeAndValue* in, str
        rc = ConvertBER2Desc( in->type.value.octs, in->type.value.octetLen, out, pos );
        if ( rc != LDAP_SUCCESS ) return rc;
        if ( out->bv_len < *pos + 1/*for '='*/  )
-               increment_bv_mem ( out );
+               increment_bv_mem_by_size ( out, INCREMENT_SIZE );
        /*Between type and value, put '='*/
        out->bv_val[*pos] = '=';
        (*pos)++;
 
        /*Assume it is string*/         
        if ( out->bv_len < *pos + value_size )
-               increment_bv_mem ( out );
+               increment_bv_mem_by_size ( out, INCREMENT_SIZE );
        memcpy( out->bv_val + *pos, value_ptr, value_size );
        out->bv_len += value_size;
        *pos += value_size;
@@ -2326,10 +2320,10 @@ ConvertRelativeDistinguishedName2RFC2253 ( irRelativeDistinguishedName* in, stru
                rc = ConvertComponentAttributeTypeAndValue2RFC2253( attr_typeNvalue, out, pos );
                if ( rc != LDAP_SUCCESS ) return LDAP_INVALID_SYNTAX;
 
-               if ( out->bv_len < pos + 1/*for '+'*/  )
-                       increment_bv_mem ( out );
+               if ( out->bv_len < *pos + 1/*for '+'*/  )
+                       increment_bv_mem_by_size ( out, INCREMENT_SIZE );
                /*between multivalued RDNs, put comma*/
-               out->bv_val[*pos++] = '+';
+               out->bv_val[(*pos)++] = '+';
        }
        (*pos)--;/*remove the last '+'*/
        return LDAP_SUCCESS;
@@ -2363,13 +2357,13 @@ ConvertRDNSequence2RFC2253( irRDNSequence *in, struct berval* out ) {
                if ( rc != LDAP_SUCCESS ) return LDAP_INVALID_SYNTAX;
 
                if ( out->bv_len < pos + 1/*for ','*/ )
-                       increment_bv_mem ( out );
+                       increment_bv_mem_by_size ( out, INCREMENT_SIZE );
                /*Between RDN, put comma*/
                out->bv_val[pos++] = ',';
        }
        pos--;/*remove the last '+'*/
        out->bv_val[pos] = '\0';
-       out->bv_len = pos;
+       out->bv_len =pos;
        return LDAP_SUCCESS;
 }