02111-1307, USA. */
#include <config.h>
-#include <assert.h>
+#include "error.h"
#include <stdlib.h>
#include "alloc.h"
#include "command.h"
DATA LIST. */
struct record_type *recs_head; /* List of record types. */
struct record_type *recs_tail; /* Last in list of record types. */
+ size_t case_size; /* Case size in bytes. */
};
static int parse_col_spec (struct col_spec *, const char *);
fty->had_rec_type = 0;
fty->recs_head = fty->recs_tail = NULL;
- lex_match_id ("TYPE");
if (lex_match_id ("MIXED"))
fty->type = FTY_MIXED;
else if (lex_match_id ("GROUPED"))
}
}
+ if (!dfm_open_for_reading (fty->handle))
+ goto error;
default_handle = fty->handle;
- vfm_source = create_case_source (&file_type_source_class, fty);
create_col_var (&fty->record);
if (fty->case_sbc.name[0])
create_col_var (&fty->case_sbc);
+ vfm_source = create_case_source (&file_type_source_class, default_dict, fty);
return CMD_SUCCESS;
}
}
- lex_match_id ("RECORD");
- lex_match_id ("TYPE");
-
/* Parse record type values. */
if (lex_match_id ("OTHER"))
rct->flags |= RCT_OTHER;
if (!lex_force_string ())
goto error;
rct->v[rct->nv].c = xmalloc (fty->record.nc + 1);
- st_bare_pad_copy (rct->v[rct->nv].c, ds_value (&tokstr),
+ st_bare_pad_copy (rct->v[rct->nv].c, ds_c_str (&tokstr),
fty->record.nc + 1);
}
else
return CMD_FAILURE;
}
fty = vfm_source->aux;
-
- lex_match_id ("TYPE");
+ fty->case_size = dict_get_case_size (default_dict);
if (fty->recs_tail)
{
static void read_from_file_type_grouped(void);
static void read_from_file_type_nested(void); */
-/* Reads any number of cases into temp_case and calls write_case() for
- each one. Compare data-list.c:read_from_data_list. */
+/* Reads any number of cases into case C and calls write_case()
+ for each one. Compare data-list.c:read_from_data_list. */
static void
file_type_source_read (struct case_source *source,
+ struct ccase *c,
write_case_func *write_case UNUSED,
write_case_data wc_data UNUSED)
{
struct file_type_pgm *fty = source->aux;
- char *line;
- int len;
-
struct fmt_spec format;
dfm_push (fty->handle);
format.type = fty->record.fmt;
format.w = fty->record.nc;
format.d = 0;
- while (NULL != (line = dfm_get_record (fty->handle, &len)))
+ while (!dfm_eof (fty->handle))
{
+ struct len_string line;
struct record_type *iter;
union value v;
int i;
+ dfm_expand_tabs (fty->handle);
+ dfm_get_record (fty->handle, &line);
if (formats[fty->record.fmt].cat & FCAT_STRING)
{
struct data_in di;
- v.c = temp_case->data[fty->record.v->fv].s;
+ v.c = c->data[fty->record.v->fv].s;
- data_in_finite_line (&di, line, len,
+ data_in_finite_line (&di, ls_c_str (&line), ls_length (&line),
fty->record.fc, fty->record.fc + fty->record.nc);
di.v = (union value *) v.c;
di.flags = 0;
{
struct data_in di;
- data_in_finite_line (&di, line, len,
+ data_in_finite_line (&di, ls_c_str (&line), ls_length (&line),
fty->record.fc, fty->record.fc + fty->record.nc);
di.v = &v;
di.flags = 0;
di.format = format;
data_in (&di);
- memcpy (&temp_case->data[fty->record.v->fv].f, &v.f, sizeof v.f);
+ memcpy (&c->data[fty->record.v->fv].f, &v.f, sizeof v.f);
for (iter = fty->recs_head; iter; iter = iter->next)
{
if (iter->flags & RCT_OTHER)
if (fty->wild)
msg (SW, _("Unknown record type %g."), v.f);
}
- dfm_fwd_record (fty->handle);
+ dfm_forward_record (fty->handle);
continue;
found:
/* Arrive here if there is a matching record_type, which is in
iter. */
- dfm_fwd_record (fty->handle);
+ dfm_forward_record (fty->handle);
}
/* switch(fty->type)