int _gnutls_x509_get_dn(ASN1_TYPE asn1_struct, const char *asn1_rdn_name, gnutls_datum_t * dn, unsigned flags) { gnutls_buffer_st out_str; int i, k1, result; _gnutls_buffer_init(&out_str); result = asn1_number_of_elements(asn1_struct, asn1_rdn_name, &k1); if (result != ASN1_SUCCESS) { if (result == ASN1_ELEMENT_NOT_FOUND || result == ASN1_VALUE_NOT_FOUND) { result = gnutls_assert_val(GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE); } else { gnutls_assert(); result = _gnutls_asn2err(result); } goto cleanup; } if (k1 == 0) { gnutls_assert(); result = GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE; goto cleanup; } if (flags & GNUTLS_X509_DN_FLAG_COMPAT) { for (i=0;i<k1;i++) { result = append_elements(asn1_struct, asn1_rdn_name, &out_str, i+1, (i==(k1-1))?1:0); if (result < 0) { gnutls_assert(); goto cleanup; } } } else { while (k1 > 0) { result = append_elements(asn1_struct, asn1_rdn_name, &out_str, k1, k1==1?1:0); if (result < 0) { gnutls_assert(); goto cleanup; } k1--; } } return _gnutls_buffer_to_datum(&out_str, dn, 1); cleanup: _gnutls_buffer_clear(&out_str); return result; }
static guint append_elements (GtkRBTree *tree, guint depth, guint elements_per_depth, gboolean check, guint height) { GtkRBNode *node; guint i; g_assert (depth > 0); node = NULL; depth--; for (i = 0; i < elements_per_depth; i++) { node = _gtk_rbtree_insert_after (tree, node, ++height, TRUE); if (depth) { node->children = _gtk_rbtree_new (); node->children->parent_tree = tree; node->children->parent_node = node; height = append_elements (node->children, depth, elements_per_depth, check, height); } if (check) _gtk_rbtree_test (tree); } return height; }
static GtkRBTree * create_rbtree (guint depth, guint elements_per_depth, gboolean check) { GtkRBTree *tree; tree = _gtk_rbtree_new (); append_elements (tree, depth, elements_per_depth, check, 0); _gtk_rbtree_test (tree); return tree; }