X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fhtml.c;h=dfa524a7cfd5f60cd6120023283d1106c635c35a;hb=b7cbf7cfbfa9de06ac8017c88b602477654c79a9;hp=76e152ae151c904b247daa0ebf8e8c9e947c65c2;hpb=6b40f1315cf46ca2417c10ce08bcf62941bdd305;p=pspp-builds.git diff --git a/src/output/html.c b/src/output/html.c index 76e152ae..dfa524a7 100644 --- a/src/output/html.c +++ b/src/output/html.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,17 +24,18 @@ #include #include -#include #include #include #include -#include "error.h" -#include "getline.h" -#include "output.h" -#include "manager.h" -#include "table.h" +#include +#include +#include +#include #include +#include "error.h" +#include "xalloc.h" + #include "gettext.h" #define _(msgid) gettext (msgid) @@ -47,23 +48,25 @@ static void escape_string (FILE *file, const char *text, size_t length, const char *space); -static bool handle_option (struct outp_driver *this, +static bool handle_option (void *this, const char *key, const struct string *val); static void print_title_tag (FILE *file, const char *name, const char *content); static bool -html_open_driver (struct outp_driver *this, struct substring options) +html_open_driver (const char *name, int types, struct substring options) { + struct outp_driver *this; struct html_driver_ext *x; + this = outp_allocate_driver (&html_class, name, types); 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; + x->chart_cnt = 1; - outp_parse_options (options, handle_option, this); + outp_parse_options (name, options, handle_option, this); x->file = fn_open (x->file_name, "w"); if (x->file == NULL) @@ -89,11 +92,12 @@ html_open_driver (struct outp_driver *this, struct substring options) print_title_tag (x->file, "H1", outp_title); print_title_tag (x->file, "H2", outp_subtitle); + outp_register_driver (this); return true; error: - free (x->chart_file_name); this->class->close_driver (this); + outp_free_driver (this); return false; } @@ -134,14 +138,6 @@ html_close_driver (struct outp_driver *this) return ok; } -/* Link the image contained in FILE_NAME to the - HTML stream in FILE. */ -static void -link_image (FILE *file, char *file_name) -{ - fprintf (file, "", file_name); - } - /* Generic option types. */ enum { @@ -158,9 +154,9 @@ static const struct outp_option option_tab[] = }; static bool -handle_option (struct outp_driver *this, - const char *key, const struct string *val) +handle_option (void *this_, const char *key, const struct string *val) { + struct outp_driver *this = this_; struct html_driver_ext *x = this->ext; int subcat; @@ -200,11 +196,21 @@ handle_option (struct outp_driver *this, static void output_tab_table (struct outp_driver *, struct tab_table *); +static void +html_output_chart (struct outp_driver *this, const struct chart *chart) +{ + struct html_driver_ext *x = this->ext; + char *file_name; + + file_name = chart_draw_png (chart, x->chart_file_name, x->chart_cnt++); + fprintf (x->file, "", file_name); + free (file_name); +} + static void 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; assert (s->class == &tab_table_class ) ; @@ -213,9 +219,6 @@ html_submit (struct outp_driver *this, struct som_entity *s) case SOM_TABLE: output_tab_table ( this, (struct tab_table *) s->ext); break; - case SOM_CHART: - link_image (x->file, ((struct chart *)s->ext)->file_name); - break; default: NOT_REACHED (); } @@ -290,7 +293,7 @@ output_tab_table (struct outp_driver *this, struct tab_table *t) { struct html_driver_ext *x = this->ext; - if (t->nr == 1 && t->nc == 1) + if (tab_nr (t) == 1 && tab_nc (t) == 1) { fputs ("

", x->file); html_put_cell_contents (this, t->ct[0], *t->cc); @@ -312,18 +315,18 @@ output_tab_table (struct outp_driver *this, struct tab_table *t) int r; unsigned char *ct = t->ct; - for (r = 0; r < t->nr; r++) + for (r = 0; r < tab_nr (t); r++) { int c; fputs (" \n", x->file); - for (c = 0; c < t->nc; c++, ct++) + for (c = 0; c < tab_nc (t); c++, ct++) { struct substring *cc; const char *tag; struct tab_joined_cell *j = NULL; - cc = t->cc + c + r * t->nc; + cc = t->cc + c + r * tab_nc (t); if (*ct & TAB_JOIN) { j = (struct tab_joined_cell *) ss_data (*cc); @@ -333,8 +336,8 @@ output_tab_table (struct outp_driver *this, struct tab_table *t) } /* Output or tag. */ - tag = (r < t->t || r >= t->nr - t->b - || c < t->l || c >= t->nc - t->r) ? "TH" : "TD"; + tag = (r < tab_t (t) || r >= tab_nr (t) - tab_b (t) + || c < tab_l (t) || c >= tab_nc (t) - tab_r (t)) ? "TH" : "TD"; fprintf (x->file, " <%s ALIGN=%s", tag, (*ct & TAB_ALIGN_MASK) == TAB_LEFT ? "LEFT" @@ -362,19 +365,6 @@ output_tab_table (struct outp_driver *this, struct tab_table *t) fputs ("\n\n", x->file); } -static void -html_initialise_chart (struct outp_driver *this UNUSED, struct chart *ch) -{ - struct html_driver_ext *x = this->ext; - chart_init_separate (ch, "png", x->chart_file_name, ++x->chart_cnt); -} - -static void -html_finalise_chart(struct outp_driver *d UNUSED, struct chart *ch) -{ - chart_finalise_separate (ch); -} - /* HTML driver class. */ @@ -390,11 +380,11 @@ const struct outp_class html_class = NULL, NULL, + html_output_chart, + html_submit, NULL, NULL, NULL, - html_initialise_chart, - html_finalise_chart };