+ return data1_add_insert_taggeddata (dh, at, tagname, m, 0);
+}
+
+data1_node *data1_insert_taggeddata (data1_handle dh, data1_node *root,
+ data1_node *at, const char *tagname,
+ NMEM m)
+{
+ return data1_add_insert_taggeddata (dh, at, tagname, m, 0);
+}
+
+data1_node *data1_add_taggeddata (data1_handle dh, data1_node *root,
+ data1_node *at, const char *tagname,
+ NMEM m)
+{
+ return data1_add_insert_taggeddata (dh, at, tagname, m, 1);
+}
+
+data1_node *data1_mk_tag_data_int (data1_handle dh, data1_node *at,
+ const char *tag, int num,
+ NMEM nmem)
+{
+ data1_node *node_data;
+
+ node_data = data1_mk_tag_data (dh, at, tag, nmem);
+ if (!node_data)
+ return 0;
+ node_data->u.data.what = DATA1I_num;
+ node_data->u.data.data = node_data->lbuf;
+ sprintf (node_data->u.data.data, "%d", num);
+ node_data->u.data.len = strlen (node_data->u.data.data);
+ return node_data;
+}
+
+data1_node *data1_mk_tag_data_oid (data1_handle dh, data1_node *at,
+ const char *tag, Odr_oid *oid,
+ NMEM nmem)
+{
+ data1_node *node_data;
+ char str[128], *p = str;
+ Odr_oid *ii;
+
+ node_data = data1_mk_tag_data (dh, at, tag, nmem);
+ if (!node_data)
+ return 0;
+
+ for (ii = oid; *ii >= 0; ii++)
+ {
+ if (ii != oid)
+ *p++ = '.';
+ sprintf (p, "%d", *ii);
+ p += strlen (p);
+ }
+ node_data->u.data.what = DATA1I_oid;
+ node_data->u.data.len = strlen (str);
+ node_data->u.data.data = data1_insert_string (dh, node_data, nmem, str);
+ return node_data;
+}
+
+
+data1_node *data1_mk_tag_data_text (data1_handle dh, data1_node *at,
+ const char *tag, const char *str,
+ NMEM nmem)
+{
+ data1_node *node_data;
+
+ node_data = data1_mk_tag_data (dh, at, tag, nmem);
+ if (!node_data)
+ return 0;
+ node_data->u.data.what = DATA1I_text;
+ node_data->u.data.len = strlen (str);
+ node_data->u.data.data = data1_insert_string (dh, node_data, nmem, str);
+ return node_data;
+}
+
+
+data1_node *data1_mk_tag_data_text_uni (data1_handle dh, data1_node *at,
+ const char *tag, const char *str,
+ NMEM nmem)
+{
+ data1_node *node = data1_search_tag (dh, at->child, tag);
+ if (!node)
+ return data1_mk_tag_data_text (dh, at, tag, str, nmem);
+ else
+ {
+ data1_node *node_data = node->child;
+ node_data->u.data.what = DATA1I_text;
+ node_data->u.data.len = strlen (str);
+ node_data->u.data.data = data1_insert_string (dh, node_data,
+ nmem, str);
+ node_data->child = node_data->last_child = 0;
+ return node_data;
+ }
+}
+
+
+data1_xattr *data1_read_xattr (data1_handle dh, NMEM m,
+ int (*get_byte)(void *fh), void *fh,
+ WRBUF wrbuf, int *ch)
+{
+ data1_xattr *p_first = 0;
+ data1_xattr **pp = &p_first;
+ int c = *ch;
+ for (;;)
+ {
+ data1_xattr *p;
+ int len;
+ while (c && d1_isspace(c))
+ c = (*get_byte)(fh);
+ if (!c || c == '>' || c == '/')
+ break;
+ *pp = p = (data1_xattr *) nmem_malloc (m, sizeof(*p));
+ p->next = 0;
+ pp = &p->next;
+ p->value = 0;
+
+ wrbuf_rewind(wrbuf);
+ while (c && c != '=' && c != '>' && c != '/' && !d1_isspace(c))
+ {
+ wrbuf_putc (wrbuf, c);
+ c = (*get_byte)(fh);
+ }
+ wrbuf_putc (wrbuf, '\0');
+ len = wrbuf_len(wrbuf);
+ p->name = (char*) nmem_malloc (m, len);
+ strcpy (p->name, wrbuf_buf(wrbuf));
+ if (c == '=')
+ {
+ c = (*get_byte)(fh);
+ if (c == '"')
+ {
+ c = (*get_byte)(fh);
+ wrbuf_rewind(wrbuf);
+ while (c && c != '"')
+ {
+ wrbuf_putc (wrbuf, c);
+ c = (*get_byte)(fh);
+ }
+ if (c)
+ c = (*get_byte)(fh);
+ }
+ else
+ {
+ wrbuf_rewind(wrbuf);
+ while (c && c != '>' && c != '/')
+ {
+ wrbuf_putc (wrbuf, c);
+ c = (*get_byte)(fh);
+ }
+ }
+ wrbuf_putc (wrbuf, '\0');
+ len = wrbuf_len(wrbuf);
+ p->value = (char*) nmem_malloc (m, len);
+ strcpy (p->value, wrbuf_buf(wrbuf));
+ }
+ }
+ *ch = c;
+ return p_first;