+
+void data1_chop_text(data1_handle dh, NMEM m, data1_node *n)
+{
+ for (; n; n = n->next)
+ {
+ if (n->which == DATA1N_data)
+ {
+
+ int sz = n->u.data.len;
+ const char *ndata = n->u.data.data;
+ int off = 0;
+
+ for (off = 0; off < sz; off++)
+ if (!d1_isspace(ndata[off]))
+ break;
+ sz = sz - off;
+ ndata += off;
+
+ while (sz && d1_isspace(ndata[sz - 1]))
+ sz--;
+
+ n->u.data.data = nmem_malloc(m, sz);
+ n->u.data.len = sz;
+ memcpy(n->u.data.data, ndata, sz);
+
+ }
+ data1_chop_text(dh, m, n->child);
+ }
+}
+
+void data1_concat_text(data1_handle dh, NMEM m, data1_node *n)
+{
+ for (; n; n = n->next)
+ {
+ if (n->which == DATA1N_data && n->next &&
+ n->next->which == DATA1N_data)
+ {
+ int sz = 0;
+ int off = 0;
+ char *ndata;
+ data1_node *np;
+ for (np = n; np && np->which == DATA1N_data; np=np->next)
+ sz += np->u.data.len;
+ ndata = nmem_malloc(m, sz);
+ for (np = n; np && np->which == DATA1N_data; np=np->next)
+ {
+ memcpy(ndata+off, np->u.data.data, np->u.data.len);
+ off += np->u.data.len;
+ }
+ n->u.data.data = ndata;
+ n->u.data.len = sz;
+ n->next = np;
+ if (!np && n->parent)
+ n->parent->last_child = n;
+
+ }
+ data1_concat_text(dh, m, n->child);
+ }
+}
+
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+