FILE *file; /* Associated file. */
size_t pos; /* Offset in line of current character. */
unsigned eof_cnt; /* # of attempts to advance past EOF. */
+ struct lexer *lexer; /* The lexer reading the file */
};
/* Closes reader R opened by dfm_open_reader(). */
file between BEGIN FILE and END FILE. Returns a reader if
successful, or a null pointer otherwise. */
struct dfm_reader *
-dfm_open_reader (struct file_handle *fh)
+dfm_open_reader (struct file_handle *fh, struct lexer *lexer)
{
struct dfm_reader *r;
void **rp;
r = xmalloc (sizeof *r);
r->fh = fh;
+ r->lexer = lexer ;
ds_init_empty (&r->line);
ds_init_empty (&r->scratch);
r->flags = DFM_ADVANCE;
{
r->flags |= DFM_SAW_BEGIN_DATA;
- while (token == '.')
- lex_get ();
- if (!lex_force_match_id ("BEGIN") || !lex_force_match_id ("DATA"))
+ while (lex_token (r->lexer) == '.')
+ lex_get (r->lexer);
+ if (!lex_force_match_id (r->lexer, "BEGIN") || !lex_force_match_id (r->lexer, "DATA"))
return false;
getl_set_prompt_style (GETL_PROMPT_DATA);
}
- if (!getl_read_line (NULL))
+ if (!lex_get_line_raw (r->lexer))
{
msg (SE, _("Unexpected end-of-file while reading data in BEGIN "
"DATA. This probably indicates "
return false;
}
- if (ds_length (&getl_buf) >= 8
- && !strncasecmp (ds_cstr (&getl_buf), "end data", 8))
+ if (ds_length (lex_entire_line_ds (r->lexer) ) >= 8
+ && !strncasecmp (lex_entire_line (r->lexer), "end data", 8))
{
- lex_set_prog (ds_end (&getl_buf));
+ lex_discard_line (r->lexer);
return false;
}
- ds_assign_string (&r->line, &getl_buf);
+ ds_assign_string (&r->line, lex_entire_line_ds (r->lexer) );
+
return true;
}
{
r->flags &= ~DFM_ADVANCE;
- if (r->eof_cnt == 0 && read_record (r))
+ if (r->eof_cnt == 0 && read_record (r) )
{
r->pos = 0;
return 0;
/* Perform BEGIN DATA...END DATA as a procedure in itself. */
int
-cmd_begin_data (void)
+cmd_begin_data (struct lexer *lexer, struct dataset *ds)
{
struct dfm_reader *r;
bool ok;
}
/* Open inline file. */
- r = dfm_open_reader (fh_inline_file ());
+ r = dfm_open_reader (fh_inline_file (), lexer);
r->flags |= DFM_SAW_BEGIN_DATA;
/* Input procedure reads from inline file. */
getl_set_prompt_style (GETL_PROMPT_DATA);
- ok = procedure (NULL, NULL);
+ ok = procedure (ds, NULL, NULL);
dfm_close_reader (r);