Rewrite expression code.
[pspp-builds.git] / src / html.c
index f0b4f5fdfb0f5698de0030bd30371b7e2715cfba..608de8a2d9c2f2ebc487a0cb4b39394d18f2792e 100644 (file)
@@ -40,6 +40,7 @@
 #include "som.h"
 #include "tab.h"
 #include "version.h"
+#include "mkfile.h"
 
 /* Prototypes. */
 static int postopen (struct file_ext *);
@@ -122,6 +123,22 @@ html_close_driver (struct outp_driver *this)
   return 1;
 }
 
+
+/* Link the image contained in FILENAME to the 
+   HTML stream in file F. */
+static int
+link_image (struct file_ext *f, char *filename)
+{
+  fprintf (f->file,
+          "<IMG SRC=\"%s\"/>", filename);
+
+  if (ferror (f->file))
+    return 0;
+
+  return 1;
+}
+
+
 /* Generic option types. */
 enum
 {
@@ -156,7 +173,7 @@ html_option (struct outp_driver *this, const char *key, const struct string *val
       break;
     case 1:
       free (x->file.filename);
-      x->file.filename = xstrdup (ds_value (val));
+      x->file.filename = xstrdup (ds_c_str (val));
       break;
     case string_arg:
       {
@@ -172,7 +189,7 @@ html_option (struct outp_driver *this, const char *key, const struct string *val
          }
        if (*dest)
          free (*dest);
-       *dest = xstrdup (ds_value (val));
+       *dest = xstrdup (ds_c_str (val));
       }
       break;
     default:
@@ -392,7 +409,7 @@ html_close_page (struct outp_driver *this)
 static void output_tab_table (struct outp_driver *, struct tab_table *);
 
 static void
-html_submit (struct outp_driver *this, struct som_table *s)
+html_submit (struct outp_driver *this, struct som_entity *s)
 {
   extern struct som_table_class tab_table_class;
   struct html_driver_ext *x = this->ext;
@@ -404,10 +421,21 @@ html_submit (struct outp_driver *this, struct som_table *s)
       return;
     }
 
-  if (s->class == &tab_table_class)
-    output_tab_table (this, (struct tab_table *) s->ext);
-  else
-    assert (0);
+  assert ( s->class == &tab_table_class ) ;
+
+  switch (s->type) 
+    {
+    case SOM_TABLE:
+      output_tab_table ( this, (struct tab_table *) s->ext);
+      break;
+    case SOM_CHART:
+      link_image( &x->file, ((struct chart *)s->ext)->filename);
+      break;
+    default:
+      assert(0);
+      break;
+    }
+
 }
 
 /* Write string S of length LEN to file F, escaping characters as
@@ -454,7 +482,7 @@ output_tab_table (struct outp_driver *this, struct tab_table *t)
     {
       fputs ("<P>", x->file.file);
       if (!ls_empty_p (t->cc))
-       escape_string (x->file.file, ls_value (t->cc), ls_length (t->cc));
+       escape_string (x->file.file, ls_c_str (t->cc), ls_length (t->cc));
       fputs ("</P>\n", x->file.file);
       
       return;
@@ -465,7 +493,7 @@ output_tab_table (struct outp_driver *this, struct tab_table *t)
   if (!ls_empty_p (&t->title))
     {
       fprintf (x->file.file, "  <TR>\n    <TH COLSPAN=%d>", t->nc);
-      escape_string (x->file.file, ls_value (&t->title),
+      escape_string (x->file.file, ls_c_str (&t->title),
                     ls_length (&t->title));
       fputs ("</TH>\n  </TR>\n", x->file.file);
     }
@@ -481,7 +509,7 @@ output_tab_table (struct outp_driver *this, struct tab_table *t)
        fputs ("  <TR>\n", x->file.file);
        for (c = 0; c < t->nc; c++, ct++)
          {
-            struct len_string *cc;
+            struct fixed_string *cc;
            int tag;
            char header[128];
            char *cp;
@@ -490,7 +518,7 @@ output_tab_table (struct outp_driver *this, struct tab_table *t)
             cc = t->cc + c + r * t->nc;
            if (*ct & TAB_JOIN) 
               {
-                j = (struct tab_joined_cell *) ls_value (cc);
+                j = (struct tab_joined_cell *) ls_c_str (cc);
                 cc = &j->contents;
                 if (j->x1 != c || j->y1 != r)
                   continue; 
@@ -533,7 +561,7 @@ output_tab_table (struct outp_driver *this, struct tab_table *t)
            
            if ( ! (*ct & TAB_EMPTY)  ) 
              {
-               char *s = ls_value (cc);
+               char *s = ls_c_str (cc);
                size_t l = ls_length (cc);
 
                while (l && isspace ((unsigned char) *s))
@@ -554,6 +582,36 @@ output_tab_table (struct outp_driver *this, struct tab_table *t)
   fputs ("</TABLE>\n\n", x->file.file);
 }
 
+
+void html_initialise_chart(struct outp_class *c, struct chart *ch);
+void html_finalise_chart(struct outp_class *c, struct chart *ch);
+
+
+void
+html_initialise_chart(struct outp_class *c UNUSED, struct chart *ch)
+{
+
+  FILE  *fp;
+
+  make_unique_file_stream(&fp, &ch->filename);
+
+#ifdef NO_CHARTS
+  ch->lp = 0;
+#else
+  ch->pl_params = pl_newplparams();
+  ch->lp = pl_newpl_r ("png", 0, fp, stderr, ch->pl_params);
+#endif
+
+}
+
+void 
+html_finalise_chart(struct outp_class *c UNUSED, struct chart *ch)
+{
+  free(ch->filename);
+}
+
+
+
 /* HTML driver class. */
 struct outp_class html_class =
 {
@@ -593,6 +651,10 @@ struct outp_class html_class =
   NULL,
   NULL,
   NULL,
+
+  html_initialise_chart,
+  html_finalise_chart
+
 };
 
 #endif /* !NO_HTML */