X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fhtml.c;h=caaaacb7318c4d42b85eed3109442184d285b72f;hb=d8749acaf878dccf9e4527c27d06d06eb5e03091;hp=7451efdc381d47ee4da21300a418604621b4d8a6;hpb=8444d8d47de5e5f8d076b6f43f73c2c29494031e;p=pspp diff --git a/src/output/html.c b/src/output/html.c index 7451efdc38..caaaacb731 100644 --- a/src/output/html.c +++ b/src/output/html.c @@ -1,6 +1,5 @@ /* PSPP - computes sample statistics. Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. - Written by Ben Pfaff . This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -20,7 +19,6 @@ #include #include "chart.h" #include "htmlP.h" -#include #include #include #include @@ -28,9 +26,9 @@ #include #include +#include #include -#include -#include +#include #include "error.h" #include "getline.h" #include "getlogin_r.h" @@ -38,7 +36,8 @@ #include "manager.h" #include "table.h" #include -#include + +#include "size_max.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -52,13 +51,15 @@ static void print_title_tag (FILE *file, const char *name, 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); @@ -85,10 +86,12 @@ html_open_driver (struct outp_driver *this, const char *options) 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; } @@ -145,9 +148,10 @@ enum }; /* 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}, }; @@ -166,11 +170,26 @@ handle_option (struct outp_driver *this, 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; @@ -192,10 +211,10 @@ html_submit (struct outp_driver *this, struct som_entity *s) 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 (); } } @@ -235,7 +254,7 @@ escape_string (FILE *file, 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; @@ -246,15 +265,15 @@ html_put_cell_contents (struct outp_driver *this, if (opts & TAB_FIX) { fputs ("", x->file); - escape_string (x->file, ls_c_str (text), ls_length (text), " "); + escape_string (x->file, ss_data (text), ss_length (text), " "); fputs ("", 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) @@ -271,7 +290,7 @@ output_tab_table (struct outp_driver *this, struct tab_table *t) if (t->nr == 1 && t->nc == 1) { fputs ("

", x->file); - html_put_cell_contents (this, t->ct[0], t->cc); + html_put_cell_contents (this, t->ct[0], *t->cc); fputs ("

\n", x->file); return; @@ -279,11 +298,10 @@ output_tab_table (struct outp_driver *this, struct tab_table *t) fputs ("\n", x->file); - if (!ls_empty_p (&t->title)) + if (t->title != NULL) { fprintf (x->file, " \n", x->file); } @@ -298,14 +316,14 @@ output_tab_table (struct outp_driver *this, struct tab_table *t) fputs (" \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; @@ -329,7 +347,7 @@ output_tab_table (struct outp_driver *this, struct tab_table *t) putc ('>', x->file); /* Output cell contents. */ - html_put_cell_contents (this, *ct, cc); + html_put_cell_contents (this, *ct, *cc); /* Output or . */ fprintf (x->file, "\n", tag); @@ -342,32 +360,47 @@ output_tab_table (struct outp_driver *this, struct tab_table *t) } 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, + (int) 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,
"); - escape_string (x->file, ls_c_str (&t->title), ls_length (&t->title), - " "); + escape_string (x->file, t->title, strlen (t->title), " "); fputs ("