/* PSPP - computes sample statistics.
Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
- Written by Ben Pfaff <blp@gnu.org>.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
#include <config.h>
#include "chart.h"
#include "htmlP.h"
-#include <libpspp/message.h>
#include <errno.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <libpspp/alloc.h>
+#include <libpspp/assertion.h>
#include <libpspp/compiler.h>
-#include <libpspp/message.h>
-#include <data/filename.h>
+#include <data/file-name.h>
#include "error.h"
#include "getline.h"
#include "getlogin_r.h"
#include "manager.h"
#include "table.h"
#include <libpspp/version.h>
-#include <data/make-file.h>
+
+#include "size_max.h"
#include "gettext.h"
#define _(msgid) gettext (msgid)
const char *content);
static bool
-html_open_driver (struct outp_driver *this, const char *options)
+html_open_driver (struct outp_driver *this, struct substring options)
{
struct html_driver_ext *x;
this->ext = x = xmalloc (sizeof *x);
x->file_name = xstrdup ("pspp.html");
+ x->chart_file_name = xstrdup ("pspp-#.png");
x->file = NULL;
+ x->chart_cnt = 0;
outp_parse_options (options, handle_option, this);
fputs (" LINK=\"#1f00ff\" ALINK=\"#ff0000\" VLINK=\"#9900dd\">\n", x->file);
print_title_tag (x->file, "H1", outp_title);
print_title_tag (x->file, "H2", outp_subtitle);
+ free (x->chart_file_name);
return true;
error:
+ free (x->chart_file_name);
this->class->close_driver (this);
return false;
}
};
/* All the options that the HTML driver supports. */
-static struct outp_option option_tab[] =
+static const struct outp_option option_tab[] =
{
{"output-file", string_arg, 0},
+ {"chart-files", string_arg, 1},
{NULL, 0, 0},
};
key);
break;
case string_arg:
- free (x->file_name);
- x->file_name = xstrdup (ds_c_str (val));
+ switch (subcat)
+ {
+ case 0:
+ free (x->file_name);
+ x->file_name = ds_xstrdup (val);
+ break;
+ case 1:
+ if (ds_find_char (val, '#') != SIZE_MAX)
+ {
+ free (x->chart_file_name);
+ x->chart_file_name = ds_xstrdup (val);
+ }
+ error (0, 0, _("`chart-files' value must contain `#'"));
+ break;
+ default:
+ NOT_REACHED ();
+ }
break;
default:
- abort ();
+ NOT_REACHED ();
}
return true;
output_tab_table ( this, (struct tab_table *) s->ext);
break;
case SOM_CHART:
- link_image (x->file, ((struct chart *)s->ext)->filename);
+ link_image (x->file, ((struct chart *)s->ext)->file_name);
break;
default:
- abort ();
+ NOT_REACHED ();
}
}
TEXT. */
void
html_put_cell_contents (struct outp_driver *this,
- unsigned int opts, struct fixed_string *text)
+ unsigned int opts, const struct substring text)
{
struct html_driver_ext *x = this->ext;
if (opts & TAB_FIX)
{
fputs ("<TT>", x->file);
- escape_string (x->file, ls_c_str (text), ls_length (text), " ");
+ escape_string (x->file, ss_data (text), ss_length (text), " ");
fputs ("</TT>", x->file);
}
else
{
- size_t initial_spaces = strspn (ls_c_str (text), " \t");
+ size_t initial_spaces = ss_span (text, ss_cstr (CC_SPACES));
escape_string (x->file,
- ls_c_str (text) + initial_spaces,
- ls_length (text) - initial_spaces,
+ ss_data (text) + initial_spaces,
+ ss_length (text) - initial_spaces,
" ");
}
if (opts & TAB_EMPH)
if (t->nr == 1 && t->nc == 1)
{
fputs ("<P>", x->file);
- html_put_cell_contents (this, t->ct[0], t->cc);
+ html_put_cell_contents (this, t->ct[0], *t->cc);
fputs ("</P>\n", x->file);
return;
fputs ("<TABLE BORDER=1>\n", x->file);
- if (!ls_empty_p (&t->title))
+ if (t->title != NULL)
{
fprintf (x->file, " <CAPTION>");
- escape_string (x->file, ls_c_str (&t->title), ls_length (&t->title),
- " ");
+ escape_string (x->file, t->title, strlen (t->title), " ");
fputs ("</CAPTION>\n", x->file);
}
fputs (" <TR>\n", x->file);
for (c = 0; c < t->nc; c++, ct++)
{
- struct fixed_string *cc;
+ struct substring *cc;
const char *tag;
struct tab_joined_cell *j = NULL;
cc = t->cc + c + r * t->nc;
if (*ct & TAB_JOIN)
{
- j = (struct tab_joined_cell *) ls_c_str (cc);
+ j = (struct tab_joined_cell *) ss_data (*cc);
cc = &j->contents;
if (j->x1 != c || j->y1 != r)
continue;
putc ('>', x->file);
/* Output cell contents. */
- html_put_cell_contents (this, *ct, cc);
+ html_put_cell_contents (this, *ct, *cc);
/* Output </TH> or </TD>. */
fprintf (x->file, "</%s>\n", tag);
}
static void
-html_initialise_chart(struct outp_driver *d UNUSED, struct chart *ch)
+html_initialise_chart (struct outp_driver *this, struct chart *ch)
{
-
- FILE *fp;
-
- make_unique_file_stream(&fp, &ch->filename);
-
#ifdef NO_CHARTS
- ch->lp = 0;
+ ch->lp = NULL;
#else
- ch->pl_params = pl_newplparams();
+ struct html_driver_ext *x = this->ext;
+
+ FILE *fp;
+ int number_pos;
+
+ x->chart_cnt++;
+
+ number_pos = strchr (x->chart_file_name, '#') - x->chart_file_name;
+ ch->file_name = xasprintf ("%.*s%d%s",
+ number_pos, x->chart_file_name,
+ x->chart_cnt,
+ x->chart_file_name + number_pos + 1);
+ fp = fopen (ch->file_name, "wb");
+ if (fp == NULL)
+ {
+ error (0, errno, _("creating \"%s\""), ch->file_name);
+ free (ch->file_name);
+ ch->file_name = NULL;
+ return;
+ }
+
+ ch->pl_params = pl_newplparams ();
ch->lp = pl_newpl_r ("png", 0, fp, stderr, ch->pl_params);
#endif
-
}
static void
html_finalise_chart(struct outp_driver *d UNUSED, struct chart *ch)
{
- free(ch->filename);
+ free(ch->file_name);
}
/* HTML driver class. */
-struct outp_class html_class =
+const struct outp_class html_class =
{
"html",
1,