X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Fdata-reader.c;h=7b2690653ae627dd4df881777ab988d3d258bc4e;hb=77555681fa75d9b790bf8ba5f8e2aafa853cc183;hp=1899acfb8396b6aa7d180fa229fc4ae968f525f6;hpb=97d4f38945476834fd7fce612b663f19f2b291f8;p=pspp-builds.git diff --git a/src/language/data-io/data-reader.c b/src/language/data-io/data-reader.c index 1899acfb..7b269065 100644 --- a/src/language/data-io/data-reader.c +++ b/src/language/data-io/data-reader.c @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include #include #include @@ -64,6 +64,7 @@ struct dfm_reader 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(). */ @@ -111,7 +112,7 @@ dfm_close_reader (struct dfm_reader *r) 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; @@ -124,6 +125,7 @@ dfm_open_reader (struct file_handle *fh) r = xmalloc (sizeof *r); r->fh = fh; + r->lexer = lexer ; ds_init_empty (&r->line); ds_init_empty (&r->scratch); r->flags = DFM_ADVANCE; @@ -163,14 +165,14 @@ read_inline_record (struct dfm_reader *r) { 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); + prompt_set_style (PROMPT_DATA); } - if (!getl_read_line (NULL)) + if (!lex_get_line_raw (r->lexer, NULL)) { msg (SE, _("Unexpected end-of-file while reading data in BEGIN " "DATA. This probably indicates " @@ -180,14 +182,15 @@ read_inline_record (struct dfm_reader *r) 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; } @@ -207,6 +210,7 @@ read_file_record (struct dfm_reader *r) fh_get_name (r->fh), strerror (errno)); return false; } + ds_chomp (&r->line, '\n'); } else if (fh_get_mode (r->fh) == FH_MODE_BINARY) { @@ -259,7 +263,7 @@ dfm_eof (struct dfm_reader *r) { 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; @@ -423,7 +427,7 @@ dfm_pop (struct dfm_reader *r) /* 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; @@ -436,12 +440,12 @@ cmd_begin_data (void) } /* 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); + prompt_set_style (PROMPT_DATA); + ok = procedure (ds, NULL, NULL); dfm_close_reader (r);