+ if (parent->which != DATA1N_variant)
+ {
+ res = data1_mk_node (dh, m);
+ res->which = DATA1N_variant;
+ res->u.variant.type = 0;
+ res->u.variant.value = 0;
+ }
+ else
+ {
+ /*
+ * now determine if one of our ancestor triples is of
+ * same type. If so, we break here.
+ */
+ int i;
+ for (i = level-1; d1_stack[i]->which==DATA1N_variant; --i)
+ if (d1_stack[i]->u.variant.type == tp)
+ {
+ level = i;
+ break;
+ }
+ res = data1_mk_node (dh, m);
+ res->which = DATA1N_variant;
+ res->u.variant.type = tp;
+ res->u.variant.value =
+ data1_insert_string (dh, res, m, args + val_offset);
+ }
+ }
+ else /* tag.. acquire our element in the abstract syntax */
+ {
+ data1_node *partag = get_parent_tag (dh, parent);
+ data1_element *elem, *e = 0;
+ int localtag = 0;
+
+ if (parent->which == DATA1N_variant)
+ return 0;
+ if (partag)
+ if (!(e = partag->u.tag.element))
+ localtag = 1; /* our parent is a local tag */
+
+ elem = data1_getelementbytagname(dh, absyn, e, tag);
+ res = data1_mk_node (dh, m);
+ res->which = DATA1N_tag;
+ res->u.tag.tag = data1_insert_string (dh, res, m, tag);
+ res->u.tag.element = elem;
+ res->u.tag.node_selected = 0;
+ res->u.tag.make_variantlist = 0;
+ res->u.tag.no_data_requested = 0;
+ res->u.tag.get_bytes = -1;
+ }
+ if (parent)
+ {
+ parent->last_child = res;