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 <assert.h>
+#include <config.h>
+#include "error.h"
#include <stdlib.h>
#include "alloc.h"
#include "command.h"
#include "tab.h"
#include "var.h"
-#include "debug-print.h"
-
/* Describes what to do when an output field is encountered. */
enum
{
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. */
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);
static void alloc_line (void);
-
-#if DEBUGGING
-void debug_print (void);
-#endif
\f
/* Basic parsing. */
int
cmd_print (void)
{
- lex_match_id ("PRINT");
return internal_cmd_print (PRT_PRINT);
}
int
cmd_print_eject (void)
{
- lex_match_id ("EJECT");
return internal_cmd_print (PRT_PRINT | PRT_EJECT);
}
int
cmd_write (void)
{
- lex_match_id ("WRITE");
return internal_cmd_print (PRT_WRITE);
}
prt.handle = NULL;
prt.options = f;
prt.spec = NULL;
-#if !PAGED_STACK
prt.line = NULL;
-#endif
next = NULL;
nrec = 0;
if (!parse_specs ())
goto lossage;
+ if (prt.handle != NULL && !dfm_open_for_writing (prt.handle))
+ goto lossage;
+
/* Output the variable table if requested. */
if (table)
dump_table ();
memcpy (trns, &prt, sizeof *trns);
add_transformation ((struct trns_header *) trns);
-#if 0 && DEBUGGING
- debug_print ();
-#endif
-
return CMD_SUCCESS;
lossage:
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)
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 */
dump_table (void)
{
struct prt_out_spec *spec;
- const char *filename;
struct tab_table *t;
int recno;
int nspec;
assert (0);
}
- filename = fh_handle_name (prt.handle);
- tab_title (t, 1, (prt.handle != NULL
- ? _("Writing %3d records to file %s.")
- : _("Writing %3d records to the listing file.")),
- recno, filename);
+ if (prt.handle != NULL)
+ tab_title (t, 1, _("Writing %d record(s) to file %s."),
+ recno, handle_get_filename (prt.handle));
+ else
+ tab_title (t, 1, _("Writing %d record(s) to the listing file."), recno);
tab_submit (t);
- fh_handle_name (NULL);
}
/* 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)
{
pot_w = i->fc + 1;
break;
case PRT_ERROR:
+ default:
assert (0);
- break;
+ abort ();
}
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;
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;
else
{
if ((t->options & PRT_CMD_MASK) == PRT_PRINT
- || t->handle->mode != FH_MD_BINARY)
+ || handle_get_mode (t->handle) != MODE_BINARY)
{
/* PORTME: Line ends. */
-#if __MSDOS__
+#ifdef __MSDOS__
buf[len++] = '\r';
#endif
buf[len++] = '\n';
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;
n = i->next;
free (i);
}
-#if !PAGED_STACK
free (((struct print_trns *) t)->line);
-#endif
}
\f
/* PRINT SPACE. */
}
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)
struct file_handle *handle;
struct expression *e;
- lex_match_id ("SPACE");
if (lex_match_id ("OUTFILE"))
{
lex_match ('=');
- if (token == T_ID)
- handle = fh_get_handle_by_name (tokid);
- else if (token == T_STRING)
- handle = fh_get_handle_by_filename (tokid);
- else
- {
- msg (SE, _("A file name or handle was expected in the "
- "OUTFILE subcommand."));
- return CMD_FAILURE;
- }
-
- if (!handle)
+ handle = fh_parse_file_handle ();
+ if (handle == NULL)
return CMD_FAILURE;
lex_get ();
}
if (token != '.')
{
- e = expr_parse (PXP_NUMERIC);
+ e = expr_parse (EXPR_NUMERIC);
if (token != '.')
{
expr_free (e);
else
e = NULL;
+ if (handle != NULL && !dfm_open_for_writing (handle))
+ {
+ expr_free (e);
+ return CMD_FAILURE;
+ }
+
t = xmalloc (sizeof *t);
t->h.proc = print_space_trns_proc;
if (e)
}
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;
{
union value v;
- expr_evaluate (t->e, c, &v);
+ expr_evaluate (t->e, c, case_num, &v);
n = v.f;
if (n < 0)
{
char buf[LINE_END_WIDTH];
/* PORTME: Line ends. */
-#if __MSDOS__
+#ifdef __MSDOS__
buf[0] = '\r';
buf[1] = '\n';
#else
{
expr_free (((struct print_space_trns *) trns)->e);
}
-\f
-/* Debugging code. */
-
-#if 0 && DEBUGGING
-void
-debug_print (void)
-{
- struct prt_out_spec *p;
-
- if (prt.handle == NULL)
- {
- printf ("PRINT");
- if (prt.eject)
- printf (" EJECT");
- }
- else
- printf ("WRITE OUTFILE=%s", handle_name (prt.handle));
- printf (" MAX_WIDTH=%d", prt.max_width);
- printf (" /");
- for (p = prt.spec; p; p = p->next)
- switch (p->type)
- {
- case PRT_ERROR:
- printf (_("<ERROR>"));
- break;
- case PRT_NEWLINE:
- printf ("\n /");
- break;
- case PRT_CONST:
- printf (" \"%s\" %d-%d", p->u.c, p->fc + 1, p->fc + strlen (p->u.c));
- break;
- case PRT_VAR:
- printf (" %s %d %d-%d (%s)", p->u.v.v->name, p->u.v.v->fv, p->fc + 1,
- p->fc + p->u.v.v->print.w, fmt_to_string (&p->u.v.v->print));
- break;
- case PRT_SPACE:
- printf (" \" \" %d", p->fc + 1);
- break;
- }
- printf (".\n");
-}
-#endif /* DEBUGGING */