Fully implement arbitrary delimiters on DATA LIST, extending the half
[pspp-builds.git] / src / output.c
index 8cf5bafa287ff7ef4bd75b8dee42c2b925224288..e33172e21d39c50e4bb54f309d02beb0a9faa2f2 100644 (file)
    02111-1307, USA. */
 
 #include <config.h>
-#include <assert.h>
+#include "output.h"
+#include "error.h"
 #include <stdlib.h>
 #include <stdio.h>
 #include <errno.h>
 #include <ctype.h>
 #include "alloc.h"
-#include "approx.h"
+#include "devind.h"
 #include "error.h"
 #include "filename.h"
+#include "htmlP.h"
 #include "lexer.h"
 #include "misc.h"
-#include "output.h"
 #include "settings.h"
 #include "str.h"
 
@@ -73,7 +74,7 @@ char *outp_subtitle;
 
 /* A set of OUTP_DEV_* bits indicating the devices that are
    disabled. */
-int disabled_devices;
+static int disabled_devices;
 
 static void destroy_driver (struct outp_driver *);
 static void configure_driver (char *);
@@ -194,7 +195,7 @@ expand_name (char *bp, char *ep)
 
 /* Looks for a macro with key KEY, and returns the corresponding value
    if found, or NULL if not. */
-const char *
+static const char *
 find_defn_value (const char *key)
 {
   static char buf[INT_DIGITS + 1];
@@ -205,12 +206,12 @@ find_defn_value (const char *key)
       return d->value;
   if (!strcmp (key, "viewwidth"))
     {
-      sprintf (buf, "%d", set_viewwidth);
+      sprintf (buf, "%d", get_viewwidth());
       return buf;
     }
   else if (!strcmp (key, "viewlength"))
     {
-      sprintf (buf, "%d", set_viewlength);
+      sprintf (buf, "%d", get_viewlength());
       return buf;
     }
   else
@@ -226,9 +227,8 @@ outp_init (void)
   extern struct outp_class postscript_class;
   extern struct outp_class epsf_class;
 #endif
-#if !NO_HTML
   extern struct outp_class html_class;
-#endif
+  extern struct outp_class devind_class;
 
   char def[] = "default";
 
@@ -239,6 +239,7 @@ outp_init (void)
   add_class (&epsf_class);
   add_class (&postscript_class);
 #endif
+  add_class (&devind_class);
   add_class (&ascii_class);
 
   add_name (def, &def[strlen (def)], OUTP_S_INIT_FILE);
@@ -287,6 +288,8 @@ outp_read_devices (void)
   where.line_number = 0;
   err_push_file_locator (&where);
 
+  ds_init (&line, 128);
+
   if (init_fn == NULL)
     {
       msg (IE, _("Cannot find output initialization file.  Use `-vv' to view "
@@ -302,7 +305,6 @@ outp_read_devices (void)
       goto exit;
     }
 
-  ds_init (NULL, &line, 128);
   for (;;)
     {
       char *cp;
@@ -313,7 +315,7 @@ outp_read_devices (void)
            msg (ME, _("Reading %s: %s."), init_fn, strerror (errno));
          break;
        }
-      for (cp = ds_value (&line); isspace ((unsigned char) *cp); cp++);
+      for (cp = ds_c_str (&line); isspace ((unsigned char) *cp); cp++);
       if (!strncmp ("define", cp, 6) && isspace ((unsigned char) cp[6]))
        outp_configure_macro (&cp[7]);
       else if (*cp)
@@ -422,7 +424,7 @@ outp_configure_macro (char *bp)
 
 /* Destroys all the drivers in driver list *DL and sets *DL to
    NULL. */
-void
+static void
 destroy_list (struct outp_driver ** dl)
 {
   struct outp_driver *d, *next;
@@ -453,7 +455,7 @@ outp_done (void)
 void
 outp_list_classes (void)
 {
-  int width = set_viewwidth;
+  int width = get_viewwidth();
   struct outp_driver_class_list *c;
 
   printf (_("Driver classes:\n\t"));
@@ -463,7 +465,7 @@ outp_list_classes (void)
       if ((int) strlen (c->class->name) + 1 > width)
        {
          printf ("\n\t");
-         width = set_viewwidth - 8;
+         width = get_viewwidth() - 8;
        }
       else
        putc (' ', stdout);
@@ -509,7 +511,7 @@ tokener (void)
          while (*prog && *prog != quote)
            {
              if (*prog != '\\')
-               ds_putchar (&op_tokstr, *prog++);
+               ds_putc (&op_tokstr, *prog++);
              else
                {
                  int c;
@@ -586,15 +588,16 @@ tokener (void)
                      break;
                    default:
                      msg (IS, _("Syntax error in string constant."));
+                      continue;
                    }
-                 ds_putchar (&op_tokstr, (unsigned char) c);
+                 ds_putc (&op_tokstr, (unsigned char) c);
                }
            }
          prog++;
        }
       else
        while (*prog && !isspace ((unsigned char) *prog) && *prog != '=')
-         ds_putchar (&op_tokstr, *prog++);
+         ds_putc (&op_tokstr, *prog++);
       op_token = 'a';
     }
 
@@ -609,7 +612,7 @@ parse_options (char *s, struct outp_driver * d)
   prog = s;
   op_token = -1;
 
-  ds_init (NULL, &op_tokstr, 64);
+  ds_init (&op_tokstr, 64);
   while (tokener ())
     {
       char key[65];
@@ -621,7 +624,7 @@ parse_options (char *s, struct outp_driver * d)
        }
 
       ds_truncate (&op_tokstr, 64);
-      strcpy (key, ds_value (&op_tokstr));
+      strcpy (key, ds_c_str (&op_tokstr));
 
       tokener ();
       if (op_token != '=')
@@ -956,7 +959,7 @@ outp_evaluate_dimension (char *dimen, char **tail)
       if (c <= 0.0 || ptail == s)
        goto lossage;
       s = ptail;
-      if (approx_eq (c, 0.0))
+      if (c == 0.0)
        goto lossage;
       if (value > 0)
        value += b / c;
@@ -968,7 +971,7 @@ outp_evaluate_dimension (char *dimen, char **tail)
       double b;
       s = &ptail[1];
       b = strtod (s, &ptail);
-      if (approx_le (b, 0.0) || ptail == s)
+      if (b <= 0.0 || ptail == s)
        goto lossage;
       s = ptail;
       value /= b;
@@ -1027,7 +1030,7 @@ outp_evaluate_dimension (char *dimen, char **tail)
       ptail += 2;
       value *= factor;
     }
-  if (approx_lt (value, 0.0))
+  if (value <= 0.0)
     goto lossage;
   if (tail)
     *tail = ptail;
@@ -1147,6 +1150,7 @@ outp_get_paper_size (char *size, int *h, int *v)
   where.filename = pprsz_fn;
   where.line_number = 0;
   err_push_file_locator (&where);
+  ds_init (&line, 128);
 
   if (pprsz_fn == NULL)
     {
@@ -1162,7 +1166,6 @@ outp_get_paper_size (char *size, int *h, int *v)
       goto exit;
     }
 
-  ds_init (NULL, &line, 128);
   for (;;)
     {
       char *cp, *bp, *ep;
@@ -1173,7 +1176,7 @@ outp_get_paper_size (char *size, int *h, int *v)
            msg (ME, _("Reading %s: %s."), pprsz_fn, strerror (errno));
          break;
        }
-      for (cp = ds_value (&line); isspace ((unsigned char) *cp); cp++);
+      for (cp = ds_c_str (&line); isspace ((unsigned char) *cp); cp++);
       if (*cp == 0)
        continue;
       if (*cp != '"')