-/* PSPP - computes sample statistics.
- Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
- Written by Ben Pfaff <blp@gnu.org>.
+/* PSPP - a program for statistical analysis.
+ Copyright (C) 1997-9, 2000, 2007 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 the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
+ 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
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <config.h>
#include "output.h"
/* A list of driver classes. */
struct outp_driver_class_list
{
- struct outp_class *class;
+ const struct outp_class *class;
struct outp_driver_class_list *next;
};
-struct outp_driver_class_list *outp_class_list;
-struct outp_driver *outp_driver_list;
+static struct outp_driver_class_list *outp_class_list;
+static struct outp_driver *outp_driver_list;
char *outp_title;
char *outp_subtitle;
static int disabled_devices;
static void destroy_driver (struct outp_driver *);
-static void configure_driver_line (struct substring);
static void configure_driver (const struct substring, const struct substring,
const struct substring, const struct substring);
/* Add a class to the class list. */
static void
-add_class (struct outp_class *class)
+add_class (const struct outp_class *class)
{
struct outp_driver_class_list *new_list = xmalloc (sizeof *new_list);
outp_configure_vec = n;
}
-/* Checks that outp_configure_vec is empty, bitches & clears it if it
- isn't. */
+/* Checks that outp_configure_vec is empty, complains and clears
+ it if it isn't. */
static void
check_configure_vec (void)
{
{
extern struct outp_class ascii_class;
extern struct outp_class postscript_class;
- extern struct outp_class html_class;
char def[] = "default";
}
static void
-init_default_drivers (void)
+init_default_drivers (void)
{
error (0, 0, _("using default output driver configuration"));
configure_driver (ss_cstr ("list"),
init_fn = fn_search_path (fn_getenv_default ("STAT_OUTPUT_INIT_FILE",
"devices"),
fn_getenv_default ("STAT_OUTPUT_INIT_PATH",
- config_path),
- NULL);
+ config_path));
ds_init_empty (&line);
struct outp_names *n = search_names (cp, ep);
if (n)
{
- configure_driver_line (ds_ss (&line));
+ outp_configure_driver_line (ds_ss (&line));
delete_name (n);
}
}
ds_destroy (&line);
delete_macros ();
- if (result)
+ if (result)
{
- if (outp_driver_list == NULL)
- error (0, 0, _("no active output drivers"));
+ if (outp_driver_list == NULL)
+ error (0, 0, _("no active output drivers"));
}
else
error (0, 0, _("error reading device definition file"));
free (d);
return;
}
-
+
if (*ep == '=')
ep++;
while (isspace ((unsigned char) *ep))
void
outp_done (void)
{
- struct outp_driver_class_list *n = outp_class_list ;
+ struct outp_driver_class_list *n = outp_class_list ;
destroy_list (&outp_driver_list);
- while (n)
+ while (n)
{
struct outp_driver_class_list *next = n->next;
free(n);
free (outp_title);
outp_title = NULL;
-
+
free (outp_subtitle);
outp_subtitle = NULL;
}
struct string *token)
{
int c;
-
+
ds_clear (token);
c = ss_get_char (s);
if (c == EOF)
c = ss_get_char (s);
if (c == quote)
break;
- else if (c == EOF)
+ else if (c == EOF)
{
error (0, 0,
_("reached end of options inside quoted string "
case '7':
out = c - '0';
while (ss_first (*s) >= '0' && ss_first (*s) <= '7')
- out = c * 8 + (ss_get_char (s) - '0');
+ out = out * 8 + (ss_get_char (s) - '0');
break;
case 'x':
case 'X':
}
}
}
- else
+ else
{
for (;;)
{
ss_advance (s, 1);
}
}
-
+
return 1;
}
ss_ltrim (&left, ss_cstr (CC_SPACES));
if (ss_is_empty (left))
break;
-
+
if (!get_option_token (&left, driver->name, &key))
break;
ok = callback (driver, ds_cstr (&key), &value);
}
while (ok);
-
+
ds_destroy (&key);
ds_destroy (&value);
(int) ss_length (class_name), ss_data (class_name));
return;
}
-
+
/* Parse device type. */
device = 0;
while (ss_tokenize (device_type, ss_cstr (CC_SPACES), &save_idx, &token))
d->class = c->class;
d->name = ss_xstrdup (driver_name);
d->page_open = false;
- d->device = OUTP_DEV_NONE;
+ d->device = device;
d->cp_x = d->cp_y = 0;
d->ext = NULL;
d->prc = NULL;
DRIVERNAME:CLASSNAME:DEVICETYPE:OPTIONS
Adds a driver to outp_driver_list pursuant to the specification
provided. */
-static void
-configure_driver_line (struct substring line_)
+void
+outp_configure_driver_line (struct substring line_)
{
struct string line = DS_EMPTY_INITIALIZER;
struct substring tokens[4];
fn_interp_vars (line_, find_defn_value, &line);
save_idx = 0;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
{
struct substring *token = &tokens[i];
ds_separate (&line, ss_cstr (i < 3 ? ":" : ""), &save_idx, token);
code and stores subcategory in *SUBCAT on success. Returns -1
on failure. */
int
-outp_match_keyword (const char *s, struct outp_option *tab, int *subcat)
+outp_match_keyword (const char *s, const struct outp_option *tab, int *subcat)
{
for (; tab->keyword != NULL; tab++)
if (!strcmp (s, tab->keyword))
error (0, 0, _("trailing garbage `%s' on paper size `%s'"), tail, size);
return false;
}
-
+
return true;
}
error (0, 0, _("paper size name cannot be empty"));
return 0;
}
-
+
ep++;
if (*ep)
*ep = 0;
pprsz_fn = fn_search_path (fn_getenv_default ("STAT_OUTPUT_PAPERSIZE_FILE",
"papersize"),
fn_getenv_default ("STAT_OUTPUT_INIT_PATH",
- config_path),
- NULL);
+ config_path));
ds_init_empty (&line);
if (!result)
error (0, 0, _("error reading paper size definition file"));
-
+
return result;
}
return d;
}
-/* Enables (if ENABLE is nonzero) or disables (if ENABLE is zero) the
+/* Enables (if ENABLE is true) or disables (if ENABLE is false) the
device(s) given in mask DEVICE. */
void
-outp_enable_device (int enable, int device)
+outp_enable_device (bool enable, int device)
{
if (enable)
disabled_devices &= ~device;
/* Opens a page on driver D (if one is not open). */
void
-outp_open_page (struct outp_driver *d)
+outp_open_page (struct outp_driver *d)
{
- if (!d->page_open)
+ if (!d->page_open)
{
d->cp_x = d->cp_y = 0;
/* Closes the page on driver D (if one is open). */
void
-outp_close_page (struct outp_driver *d)
+outp_close_page (struct outp_driver *d)
{
- if (d->page_open)
+ if (d->page_open)
{
if (d->class->close_page != NULL)
d->class->close_page (d);
outp_open_page (d);
}
+/* Flushes output to screen devices, so that the user can see
+ output that doesn't fill up an entire page. */
+void
+outp_flush (struct outp_driver *d)
+{
+ if (d->device & OUTP_DEV_SCREEN && d->class->flush != NULL)
+ {
+ outp_close_page (d);
+ d->class->flush (d);
+ }
+}
+
/* Returns the width of string S, in device units, when output on
device D. */
int
{
struct outp_text text;
int width;
-
+
text.font = font;
text.justification = OUTP_LEFT;
text.string = ss_cstr (s);