summaryrefslogtreecommitdiff
path: root/egg/egg-asn1x.c
diff options
context:
space:
mode:
authorStef Walter <stef@memberwebs.com>2009-12-23 16:13:21 +0000
committerStef Walter <stef@memberwebs.com>2010-06-24 02:56:54 +0000
commitb84a2339803d99c6025956a66d06ce8c4252e7fb (patch)
treee484ab357f64ba154c69f99be9c8dfafd79e3435 /egg/egg-asn1x.c
parentd052e00b2c79177ca88e0a3cc83d39f6a486086d (diff)
downloadgnome-keyring-b84a2339803d99c6025956a66d06ce8c4252e7fb.tar.gz
[egg] Handle identifier joins that are more than one level deep.
Diffstat (limited to 'egg/egg-asn1x.c')
-rw-r--r--egg/egg-asn1x.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/egg/egg-asn1x.c b/egg/egg-asn1x.c
index 407a1425..62a30a3c 100644
--- a/egg/egg-asn1x.c
+++ b/egg/egg-asn1x.c
@@ -779,7 +779,7 @@ egg_asn1x_decode (GNode *asn, gconstpointer data, gsize n_data)
}
static void
-move_each_child (GNode *child, gpointer data)
+join_each_child (GNode *child, gpointer data)
{
GNode *node = data;
g_node_unlink (child);
@@ -787,22 +787,31 @@ move_each_child (GNode *child, gpointer data)
}
static gboolean
-traverse_and_create_identifier (GNode *node, gpointer data)
+traverse_and_create_joins (GNode *node, gpointer data)
{
const ASN1_ARRAY_TYPE *defs = data;
- Anode *an, *ans;
- GNode *seq;
+ Anode *an, *anj;
+ GNode *join = NULL;
+ const gchar *identifier;
- if (anode_def_type (node) == TYPE_IDENTIFIER) {
- seq = egg_asn1x_create (defs, anode_def_value (node));
- g_return_val_if_fail (seq, TRUE);
+ /* A while, because the stuff we join, could also be an identifier */
+ while (anode_def_type (node) == TYPE_IDENTIFIER) {
an = node->data;
- ans = seq->data;
- an->join = ans->def;
- g_node_children_foreach (seq, G_TRAVERSE_ALL, move_each_child, node);
- egg_asn1x_destroy (seq);
+ identifier = an->join ? an->join->value : an->def->value;
+ g_return_val_if_fail (identifier, TRUE);
+ egg_asn1x_destroy (join);
+ join = egg_asn1x_create (defs, identifier);
+ g_return_val_if_fail (join, TRUE);
+ anj = join->data;
+ an->join = anj->def;
}
+ if (join) {
+ g_node_children_foreach (join, G_TRAVERSE_ALL, join_each_child, node);
+ egg_asn1x_destroy (join);
+ }
+
+ /* Continue traversal */
return FALSE;
}
@@ -861,7 +870,7 @@ egg_asn1x_create (const ASN1_ARRAY_TYPE *defs, const gchar *identifier)
/* Load up sub identifiers */
g_node_traverse (root, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
- traverse_and_create_identifier, (gpointer)defs);
+ traverse_and_create_joins, (gpointer)defs);
return root;
}