New source grs1disp.c
[yaz-moved-to-github.git] / retrieval / d1_write.c
index cba4ae9..b884248 100644 (file)
@@ -3,7 +3,7 @@
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
- * $Id: d1_write.c,v 1.16 2002-07-29 20:04:08 adam Exp $
+ * $Id: d1_write.c,v 1.19 2002-10-08 20:14:44 adam Exp $
  */
 
 #include <string.h>
@@ -42,17 +42,18 @@ static void wrbuf_write_cdata(WRBUF b, const char *msg, int len)
         case '"':
             wrbuf_puts (b, "&quot;");
             break;
+        case '\'':
+            wrbuf_puts (b, "&apos;");
+            break;
         case '>':
             wrbuf_puts (b, "&gt;");
             break;
         case '<':
             wrbuf_puts (b, "&lt;");
             break;
-#if 0
         case '&':
             wrbuf_puts (b, "&amp;");
             break;
-#endif
         default:
             wrbuf_putc(b, msg[i]);
         }
@@ -64,6 +65,28 @@ static void wrbuf_put_cdata(WRBUF b, const char *msg)
     wrbuf_write_cdata (b, msg, strlen(msg));
 }
 
+static void wrbuf_put_xattr(WRBUF b, data1_xattr *p)
+{
+    for (; p; p = p->next)
+    {
+        wrbuf_putc (b, ' ');
+        if (p->what == DATA1I_xmltext)
+            wrbuf_puts (b, p->name);
+        else
+            wrbuf_put_cdata (b, p->name);
+        if (p->value)
+        {
+            wrbuf_putc (b, '=');
+            wrbuf_putc (b, '"');
+            if (p->what == DATA1I_text)
+                wrbuf_put_cdata (b, p->value);
+            else
+                wrbuf_puts (b, p->value);
+            wrbuf_putc (b, '"');
+        }
+    }
+}
+
 static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col,
                         int pretty_format)
 {
@@ -81,15 +104,7 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col,
                 indent (b, col);
            wrbuf_puts (b, "<?");
             wrbuf_put_cdata (b, c->u.preprocess.target);
-            for (p = c->u.preprocess.attributes; p; p = p->next)
-            {
-                wrbuf_putc (b, ' ');
-                wrbuf_put_cdata (b, p->name);
-                wrbuf_putc (b, '=');
-                wrbuf_putc (b, '"');
-                wrbuf_put_cdata (b, p->value);
-                wrbuf_putc (b, '"');
-            }
+            wrbuf_put_xattr (b, c->u.preprocess.attributes);
             if (c->child)
                 wrbuf_puts(b, " ");
             if (nodetoidsgml(c, select, b, (col > 40) ? 40 : col+2,
@@ -99,7 +114,7 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col,
         }
         else if (c->which == DATA1N_tag)
        {
-           if (select && c->u.tag.node_selected)
+           if (select && !c->u.tag.node_selected)
                continue;
             tag = c->u.tag.tag;
            if (!data1_matchstr(tag, "wellknown")) /* skip wellknown */
@@ -115,15 +130,7 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col,
                     indent (b, col);
                wrbuf_puts (b, "<");    
                wrbuf_put_cdata (b, tag);
-               for (p = c->u.tag.attributes; p; p = p->next)
-               {
-                   wrbuf_putc (b, ' ');
-                   wrbuf_put_cdata (b, p->name);
-                   wrbuf_putc (b, '=');
-                   wrbuf_putc (b, '"');
-                   wrbuf_put_cdata (b, p->value);
-                   wrbuf_putc (b, '"');
-               }
+                wrbuf_put_xattr (b, c->u.tag.attributes);
                wrbuf_puts(b, ">");
                 if (pretty_format)
                     wrbuf_puts(b, "\n");
@@ -152,6 +159,9 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col,
                 wrbuf_puts (b, "<!--");
            switch (c->u.data.what)
            {
+            case DATA1I_xmltext:
+               wrbuf_write(b, c->u.data.data, c->u.data.len);
+                break;
            case DATA1I_text:
                 if (!pretty_format || c->u.data.formatted_text)
                 {