changed ccl_pr_tree to print as a qpn query instead of some infix notation
[yaz-moved-to-github.git] / retrieval / d1_write.c
index 4d4b7b3..1e80c6b 100644 (file)
@@ -1,36 +1,9 @@
 /*
- * Copyright (c) 1995-1999, Index Data.
+ * Copyright (c) 1995-2002, Index Data.
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
- * $Log: d1_write.c,v $
- * Revision 1.8  1999-11-30 13:47:12  adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.7  1999/10/21 12:06:29  adam
- * Retrieval module no longer uses ctype.h - functions.
- *
- * Revision 1.6  1999/07/06 12:16:00  adam
- * Improved layout generated record in SGML/XML format.
- *
- * Revision 1.5  1998/06/05 08:57:43  adam
- * Fixed problem with function wordlen.
- *
- * Revision 1.4  1998/05/18 13:07:08  adam
- * Changed the way attribute sets are handled by the retriaval module.
- * Extended Explain conversion / schema.
- * Modified server and client to work with ASN.1 compiled protocol handlers.
- *
- * Revision 1.3  1997/09/17 12:10:39  adam
- * YAZ version 1.4.
- *
- * Revision 1.2  1995/12/13 17:14:27  quinn
- * *** empty log message ***
- *
- * Revision 1.1  1995/12/13  15:38:43  quinn
- * Added SGML-output filter.
- *
- *
+ * $Id: d1_write.c,v 1.14 2002-07-05 12:42:52 adam Exp $
  */
 
 #include <string.h>
@@ -40,6 +13,8 @@
 
 #define IDSGML_MARGIN 75
 
+#define PRETTY_FORMAT 0
+
 static int wordlen(char *b, int max)
 {
     int l = 0;
@@ -58,14 +33,36 @@ 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;
-           if (c->u.tag.element && c->u.tag.element->tag)
-               tag = c->u.tag.element->tag->names->name; /* first name */
-           else
-               tag = c->u.tag.tag; /* local string tag */
+            tag = c->u.tag.tag;
            if (!data1_matchstr(tag, "wellknown")) /* skip wellknown */
            {
                if (nodetoidsgml(c, select, b, col) < 0)
@@ -73,65 +70,125 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col)
            }
            else
            {
-               sprintf(line, "%*s<%s>\n", col, "", tag);
-               wrbuf_write(b, line, strlen(line));
+               data1_xattr *p;
+
+#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)
+               {
+                   wrbuf_putc (b, ' ');
+                   wrbuf_puts (b, p->name);
+                   wrbuf_putc (b, '=');
+                   wrbuf_putc (b, '"');
+                   wrbuf_puts (b, p->value);
+                   wrbuf_putc (b, '"');
+               }
+               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)
+       else if (c->which == DATA1N_data || c->which == DATA1N_comment)
        {
            char *p = c->u.data.data;
            int l = c->u.data.len;
            int first = 1;
            int lcol = col;
 
-           sprintf(line, "%*s", col, "");
-           wrbuf_write(b, line, strlen(line));
+#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);
+            }
            switch (c->u.data.what)
            {
            case DATA1I_text:
-               while (l)
-               {
-                   int wlen;
-                   
-                   while (l && d1_isspace(*p))
-                       p++, l--;
-                   if (!l)
-                       break;
-                   /* break if we'll cross margin and word is not too long */
-                   if (lcol + (wlen = wordlen(p, l)) > IDSGML_MARGIN && wlen <
-                       IDSGML_MARGIN)
-                   {
-                       sprintf(line, "\n%*s", col, "");
-                       lcol = col;
-                       wrbuf_write(b, line, strlen(line));
-                       first = 1;
-                   }
-                   if (!first)
-                   {
-                       wrbuf_putc(b, ' ');
-                       lcol++;
-                   }
-                   while (l && !d1_isspace(*p))
-                   {
-                       wrbuf_putc(b, *p);
-                       p++;
-                       l--;
-                       lcol++;
-                   }
-                   first = 0;
-               }
-               wrbuf_write(b, "\n", 1);
+#if PRETTY_FORMAT
+                if (c->u.data.formatted_text)
+                {
+                    wrbuf_write (b, p, l);
+                }
+                else
+                {
+                    while (l)
+                    {
+                        int wlen;
+                        
+                        while (l && d1_isspace(*p))
+                            p++, l--;
+                        if (!l)
+                            break;
+                        /* break if we cross margin and word is not too long */
+                        if (lcol + (wlen = wordlen(p, l)) > IDSGML_MARGIN &&
+                            wlen < IDSGML_MARGIN)
+                        {
+                            sprintf(line, "\n%*s", col, "");
+                            lcol = col;
+                            wrbuf_write(b, line, strlen(line));
+                            first = 1;
+                        }
+                        if (!first)
+                        {
+                            wrbuf_putc(b, ' ');
+                            lcol++;
+                        }
+                        while (l && !d1_isspace(*p))
+                        {
+                            wrbuf_putc(b, *p);
+                            p++;
+                            l--;
+                            lcol++;
+                        }
+                        first = 0;
+                    }
+                    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_puts(b, "-->");
+#if PRETTY_FORMAT
+                wrbuf_puts(b, "\n");
+#endif
+            }
        }
     }
     return 0;
@@ -140,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);
 }