}
+/**
+ * asn1_delete_element - Deletes the element of a structure.
+ * @structure: pointer to the structure that contains the element you want to delete.
+ * @element_name: element's name you want to delete.
+ * Description:
+ *
+ * Deletes the element named *element_name inside *structure.
+ *
+ * Returns:
+ *
+ * ASN1_SUCCESS\: everything OK
+ *
+ * ASN1_ELEMENT_NOT_FOUND
+ *
+ **/
+asn1_retCode
+asn1_delete_element(ASN1_TYPE structure,const char *element_name)
+{
+ node_asn *p2,*p3,*source_node;
+
+ source_node=_asn1_find_node(structure,element_name);
+
+ if(source_node==ASN1_TYPE_EMPTY) return ASN1_ELEMENT_NOT_FOUND;
+
+ p2=source_node->right;
+ p3=_asn1_find_left(source_node);
+ if(!p3){
+ p3=_asn1_find_up(source_node);
+ if(p3)
+ _asn1_set_down(p3,p2);
+ else
+ if(source_node->right) source_node->right->left=NULL;
+ }
+ else _asn1_set_right(p3,p2);
+
+ return asn1_delete_structure(&source_node);
+}
+
node_asn *
_asn1_copy_structure3(node_asn *source_node)
#define ACT_ENCODING_LENGTH 18
#define ACT_READ_BIT 19
#define ACT_SET_DER 20
+#define ACT_DELETE_ELEMENT 21
typedef struct{
{ACT_CREATE,"TEST_TREE.KrbError",0,0,ASN1_SUCCESS},
{ACT_DECODING,0,0,0,ASN1_SUCCESS},
{ACT_VISIT,"","",ASN1_PRINT_ALL,ASN1_SUCCESS},
+ {ACT_DELETE_ELEMENT,"pvno","",0,ASN1_SUCCESS},
+ {ACT_DELETE_ELEMENT,"pvno","",0,ASN1_ELEMENT_NOT_FOUND},
{ACT_DELETE,"","",0,ASN1_SUCCESS},
/* Test: CHOICE */
{ACT_CREATE,"TEST_TREE.CertTemplate",0,0,ASN1_SUCCESS},
{ACT_DECODING,0,0,0,ASN1_SUCCESS},
{ACT_VISIT,"","",ASN1_PRINT_ALL,ASN1_SUCCESS},
+ {ACT_DELETE_ELEMENT,"issuer.rdnSequence.?1","",0,ASN1_SUCCESS},
+ {ACT_DELETE_ELEMENT,"issuer.rdnSequence.?1","",0,ASN1_ELEMENT_NOT_FOUND},
+ {ACT_DELETE_ELEMENT,"issuer.rdnSequence.?3","",0,ASN1_SUCCESS},
+ {ACT_DELETE_ELEMENT,"issuer.rdnSequence.?5","",0,ASN1_SUCCESS},
+ {ACT_DELETE_ELEMENT,"issuer.rdnSequence.?7","",0,ASN1_SUCCESS},
+ {ACT_VISIT,"","",ASN1_PRINT_ALL,ASN1_SUCCESS},
{ACT_DELETE,"","",0,ASN1_SUCCESS},
/* Test: Empty sequnces */
case ACT_DELETE:
result=asn1_delete_structure(&asn1_element);
break;
+ case ACT_DELETE_ELEMENT:
+ result=asn1_delete_element(asn1_element,test->par1);
+ break;
case ACT_WRITE:
if((test->par2) && (!strcmp("DER",test->par2)))
result=asn1_write_value(asn1_element,test->par1,der,der_len);
switch(test->action){
case ACT_CREATE:
case ACT_DELETE:
+ case ACT_DELETE_ELEMENT:
case ACT_WRITE:
case ACT_VISIT:
case ACT_ENCODING: