Eliminate temp_case, and a few other cleanups.
[pspp-builds.git] / src / print.c
index 3f556707cdbb40a8619363db6f8903230de37d8b..17c0eab2376c9ba146af38c28c3448f796e06e21 100644 (file)
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA. */
 
-/* AIX requires this to be the first thing in the file.  */
-#include <config.h>
-#if __GNUC__
-#define alloca __builtin_alloca
-#else
-#if HAVE_ALLOCA_H
-#include <alloca.h>
-#else
-#ifdef _AIX
-#pragma alloca
-#else
-#ifndef alloca                 /* predefined by HP cc +Olibcalls */
-char *alloca ();
-#endif
-#endif
-#endif
-#endif
+/* FIXME: seems like a lot of code duplication with data-list.c. */
 
+#include <config.h>
 #include <assert.h>
 #include <stdlib.h>
 #include "alloc.h"
@@ -97,9 +82,7 @@ struct print_trns
     int options;               /* PRT_* bitmapped field. */
     struct prt_out_spec *spec; /* Output specifications. */
     int max_width;             /* Maximum line width including null. */
-#if !PAGED_STACK
     char *line;                        /* Buffer for sticking lines in. */
-#endif
   };
 
 /* PRT_PRINT or PRT_WRITE. */
@@ -115,8 +98,8 @@ static struct prt_out_spec *next;
 static int nrec;
 
 static int internal_cmd_print (int flags);
-static int print_trns_proc (struct trns_header *, struct ccase *);
-static void print_trns_free (struct trns_header *);
+static trns_proc_func print_trns_proc;
+static trns_free_func print_trns_free;
 static int parse_specs (void);
 static void dump_table (void);
 static void append_var_spec (struct prt_out_spec *spec);
@@ -169,9 +152,7 @@ internal_cmd_print (int f)
   prt.handle = NULL;
   prt.options = f;
   prt.spec = NULL;
-#if !PAGED_STACK
   prt.line = NULL;
-#endif
   next = NULL;
   nrec = 0;
 
@@ -453,7 +434,7 @@ fail:
 static int
 parse_variable_argument (void)
 {
-  if (!parse_variables (NULL, &fx.v, &fx.nv, PV_DUPLICATE))
+  if (!parse_variables (default_dict, &fx.v, &fx.nv, PV_DUPLICATE))
     return 0;
 
   if (token == T_NUM)
@@ -738,7 +719,7 @@ dump_fmt_list (struct fmt_list * f)
 static struct fmt_list *
 fixed_parse_fortran (void)
 {
-  struct fmt_list *head;
+  struct fmt_list *head = NULL;
   struct fmt_list *fl = NULL;
 
   lex_get ();                  /* skip opening parenthesis */
@@ -870,15 +851,14 @@ dump_table (void)
 }
 
 /* PORTME: The number of characters in a line terminator. */
-#if __MSDOS__ 
+#ifdef __MSDOS__ 
 #define LINE_END_WIDTH 2       /* \r\n */
 #else
 #define LINE_END_WIDTH 1       /* \n */
 #endif
 
 /* Calculates the maximum possible line width and allocates a buffer
-   big enough to contain it, if necessary (otherwise sets max_width).
-   (The action taken depends on compiler & OS as detected by pref.h.) */
+   big enough to contain it */
 static void
 alloc_line (void)
 {
@@ -908,23 +888,22 @@ alloc_line (void)
          pot_w = i->fc + 1;
          break;
        case PRT_ERROR:
+        default:
          assert (0);
-         break;
        }
       if (pot_w > w)
        w = pot_w;
     }
   prt.max_width = w + LINE_END_WIDTH + 1;
-#if !PAGED_STACK
   prt.line = xmalloc (prt.max_width);
-#endif
 }
 \f
 /* Transformation. */
 
 /* Performs the transformation inside print_trns T on case C. */
 static int
-print_trns_proc (struct trns_header * trns, struct ccase * c)
+print_trns_proc (struct trns_header * trns, struct ccase * c,
+                 int case_num UNUSED)
 {
   /* Transformation. */
   struct print_trns *t = (struct print_trns *) trns;
@@ -933,15 +912,7 @@ print_trns_proc (struct trns_header * trns, struct ccase * c)
   struct prt_out_spec *i;
 
   /* Line buffer. */
-#if PAGED_STACK
-#if __GNUC__ && !__STRICT_ANSI__
-  char buf[t->max_width];
-#else /* !__GNUC__ */
-  char *buf = alloca (t->max_width);
-#endif /* !__GNUC__ */
-#else /* !PAGED_STACK */
   char *buf = t->line;
-#endif /* !PAGED_STACK */
 
   /* Length of the line in buf. */
   int len = 0;
@@ -969,7 +940,7 @@ print_trns_proc (struct trns_header * trns, struct ccase * c)
                || t->handle->mode != FH_MD_BINARY)
              {
                /* PORTME: Line ends. */
-#if __MSDOS__
+#ifdef __MSDOS__
                buf[len++] = '\r';
 #endif
                buf[len++] = '\n';
@@ -990,14 +961,7 @@ print_trns_proc (struct trns_header * trns, struct ccase * c)
        break;
 
       case PRT_VAR:
-       if (i->u.v.v->type == NUMERIC)
-         data_out (&buf[i->fc], &i->u.v.f, &c->data[i->u.v.v->fv]);
-       else
-         {
-           union value t;
-           t.c = c->data[i->u.v.v->fv].s;
-           data_out (&buf[i->fc], &i->u.v.f, &t);
-         }
+        data_out (&buf[i->fc], &i->u.v.f, &c->data[i->u.v.v->fv]);
        len = i->fc + i->u.v.f.w;
        break;
 
@@ -1039,9 +1003,7 @@ print_trns_free (struct trns_header * t)
       n = i->next;
       free (i);
     }
-#if !PAGED_STACK
   free (((struct print_trns *) t)->line);
-#endif
 }
 \f
 /* PRINT SPACE. */
@@ -1056,8 +1018,8 @@ struct print_space_trns
 }
 print_space_trns;
 
-static int print_space_trns_proc (struct trns_header *, struct ccase *);
-static void print_space_trns_free (struct trns_header *);
+static trns_proc_func print_space_trns_proc;
+static trns_free_func print_space_trns_free;
 
 int
 cmd_print_space (void)
@@ -1116,7 +1078,8 @@ cmd_print_space (void)
 }
 
 static int
-print_space_trns_proc (struct trns_header * trns, struct ccase * c)
+print_space_trns_proc (struct trns_header * trns, struct ccase * c,
+                       int case_num UNUSED)
 {
   struct print_space_trns *t = (struct print_space_trns *) trns;
   int n;
@@ -1125,7 +1088,7 @@ print_space_trns_proc (struct trns_header * trns, struct ccase * c)
     {
       union value v;
 
-      expr_evaluate (t->e, c, &v);
+      expr_evaluate (t->e, c, case_num, &v);
       n = v.f;
       if (n < 0)
        {
@@ -1147,7 +1110,7 @@ print_space_trns_proc (struct trns_header * trns, struct ccase * c)
       char buf[LINE_END_WIDTH];
 
       /* PORTME: Line ends. */
-#if __MSDOS__
+#ifdef __MSDOS__
       buf[0] = '\r';
       buf[1] = '\n';
 #else