GRS-1 producer handles XML better
[yaz-moved-to-github.git] / retrieval / d1_write.c
index b93a1e7..1e80c6b 100644 (file)
@@ -3,7 +3,7 @@
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
- * $Id: d1_write.c,v 1.12 2002-05-21 07:43:16 adam Exp $
+ * $Id: d1_write.c,v 1.14 2002-07-05 12:42:52 adam Exp $
  */
 
 #include <string.h>
@@ -13,6 +13,8 @@
 
 #define IDSGML_MARGIN 75
 
+#define PRETTY_FORMAT 0
+
 static int wordlen(char *b, int max)
 {
     int l = 0;
@@ -31,7 +33,32 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col)
     {
        char *tag;
 
-       if (c->which == DATA1N_tag)
+        if (c->which == DATA1N_preprocess)
+        {
+            data1_xattr *p;
+           
+#if PRETTY_FORMAT
+            sprintf (line, "%*s", col, "");
+            wrbuf_puts (b, line);
+#endif
+           wrbuf_puts (b, "<?");
+            wrbuf_puts (b, c->u.preprocess.target);
+            for (p = c->u.preprocess.attributes; p; p = p->next)
+            {
+                wrbuf_putc (b, ' ');
+                wrbuf_puts (b, p->name);
+                wrbuf_putc (b, '=');
+                wrbuf_putc (b, '"');
+                wrbuf_puts (b, p->value);
+                wrbuf_putc (b, '"');
+            }
+            if (c->child)
+                wrbuf_puts(b, " ");
+            if (nodetoidsgml(c, select, b, (col > 40) ? 40 : col+2) < 0)
+                return -1;
+            wrbuf_puts (b, "?>\n");
+        }
+        else if (c->which == DATA1N_tag)
        {
            if (select && c->u.tag.node_selected)
                continue;
@@ -45,8 +72,11 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col)
            {
                data1_xattr *p;
 
-               sprintf (line, "%*s<", col, "");
+#if PRETTY_FORMAT
+               sprintf (line, "%*s", col, "");
                wrbuf_puts (b, line);
+#endif
+               wrbuf_puts (b, "<");    
                wrbuf_puts (b, tag);
                for (p = c->u.tag.attributes; p; p = p->next)
                {
@@ -57,11 +87,22 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col)
                    wrbuf_puts (b, p->value);
                    wrbuf_putc (b, '"');
                }
-               wrbuf_puts(b, ">\n");
+               wrbuf_puts(b, ">");
+#if PRETTY_FORMAT
+               wrbuf_puts(b, "\n");
+#endif
                if (nodetoidsgml(c, select, b, (col > 40) ? 40 : col+2) < 0)
                    return -1;
-               sprintf (line, "%*s</%s>\n", col, "", tag);
-               wrbuf_write(b, line, strlen(line));
+#if PRETTY_FORMAT
+               sprintf (line, "%*s", col);
+               wrbuf_puts(b, line);
+#endif
+               wrbuf_puts(b, "</");
+               wrbuf_puts(b, tag);
+               wrbuf_puts(b, ">");
+#if PRETTY_FORMAT
+               wrbuf_puts (b, "\n");
+#endif
            }
        }
        else if (c->which == DATA1N_data || c->which == DATA1N_comment)
@@ -71,11 +112,13 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col)
            int first = 1;
            int lcol = col;
 
+#if PRETTY_FORMAT
             if (!c->u.data.formatted_text)
             {
                 sprintf(line, "%*s", col, "");
                 wrbuf_write(b, line, strlen(line));
             }
+#endif
             if (c->which == DATA1N_comment)
             {
                 wrbuf_write (b, "<!--", 4);
@@ -83,6 +126,7 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col)
            switch (c->u.data.what)
            {
            case DATA1I_text:
+#if PRETTY_FORMAT
                 if (c->u.data.formatted_text)
                 {
                     wrbuf_write (b, p, l);
@@ -122,16 +166,28 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col)
                     }
                     wrbuf_write(b, "\n", 1);
                 }
+#else
+                wrbuf_write (b, p, l);
+#endif
                break;
            case DATA1I_num:
                wrbuf_write(b, c->u.data.data, c->u.data.len);
+#if PRETTY_FORMAT
+                wrbuf_puts(b, "\n");
+#endif
                break;
            case DATA1I_oid:
                wrbuf_write(b, c->u.data.data, c->u.data.len);
+#if PRETTY_FORMAT
+                wrbuf_puts(b, "\n");
+#endif
            }
             if (c->which == DATA1N_comment)
             {
-                wrbuf_write (b, "-->", 3);
+                wrbuf_puts(b, "-->");
+#if PRETTY_FORMAT
+                wrbuf_puts(b, "\n");
+#endif
             }
        }
     }
@@ -141,16 +197,11 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col)
 char *data1_nodetoidsgml (data1_handle dh, data1_node *n, int select, int *len)
 {
     WRBUF b = data1_get_wrbuf (dh);
-    char line[1024];
     
     wrbuf_rewind(b);
     
-    sprintf(line, "<%s>\n", n->u.root.type);
-    wrbuf_write(b, line, strlen(line));
     if (nodetoidsgml(n, select, b, 0))
        return 0;
-    sprintf(line, "</%s>\n", n->u.root.type);
-    wrbuf_write(b, line, strlen(line));
     *len = wrbuf_len(b);
     return wrbuf_buf(b);
 }