X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Finpt-pgm.c;h=f07e119a40808859f376d1f65d5157dbccdceed4;hb=fd0958dc7caa5806b82b9757e2b937c5b7def369;hp=0581249a841e6edd4ba8a15257a2ab2a29979ed3;hpb=c646c399bf8c942a5e33abaa6c12336429c09f24;p=pspp diff --git a/src/language/data-io/inpt-pgm.c b/src/language/data-io/inpt-pgm.c index 0581249a84..f07e119a40 100644 --- a/src/language/data-io/inpt-pgm.c +++ b/src/language/data-io/inpt-pgm.c @@ -28,6 +28,8 @@ #include #include #include +#include +#include #include #include #include @@ -35,12 +37,12 @@ #include #include #include +#include #include #include #include #include #include -#include #include "gettext.h" #define _(msgid) gettext (msgid) @@ -64,6 +66,8 @@ enum value_init_type struct input_program_pgm { + struct trns_chain *trns_chain; + size_t case_nr; /* Incremented by END CASE transformation. */ write_case_func *write_case;/* Called by END CASE. */ write_case_data wc_data; /* Aux data used by END CASE. */ @@ -93,36 +97,35 @@ in_input_program (void) /* Emits an END CASE transformation for INP. */ static void -emit_END_CASE (struct input_program_pgm *inp) +emit_END_CASE (struct dataset *ds, struct input_program_pgm *inp) { - add_transformation (end_case_trns_proc, NULL, inp); + add_transformation (ds, end_case_trns_proc, NULL, inp); } int -cmd_input_program (void) +cmd_input_program (struct dataset *ds) { struct input_program_pgm *inp; size_t i; bool saw_END_CASE = false; - discard_variables (); + discard_variables (ds); if (token != '.') return lex_end_of_command (); inp = xmalloc (sizeof *inp); + inp->trns_chain = NULL; inp->init = NULL; inside_input_program = true; for (;;) { - enum cmd_result result; - lex_get (); - result = cmd_parse (CMD_STATE_INPUT_PROGRAM); + enum cmd_result result = cmd_parse (ds, CMD_STATE_INPUT_PROGRAM); if (result == CMD_END_INPUT_PROGRAM) break; else if (result == CMD_END_CASE) { - emit_END_CASE (inp); + emit_END_CASE (ds, inp); saw_END_CASE = true; } else if (cmd_result_is_failure (result) && result != CMD_FAILURE) @@ -130,35 +133,34 @@ cmd_input_program (void) if (result == CMD_EOF) msg (SE, _("Unexpected end-of-file within INPUT PROGRAM.")); inside_input_program = false; - discard_variables (); + discard_variables (ds); destroy_input_program (inp); return result; } } if (!saw_END_CASE) - emit_END_CASE (inp); + emit_END_CASE (ds, inp); inside_input_program = false; - if (dict_get_next_value_idx (default_dict) == 0) + if (dict_get_next_value_idx (dataset_dict (ds)) == 0) { msg (SE, _("Input program did not create any variables.")); - discard_variables (); + discard_variables (ds); destroy_input_program (inp); return CMD_FAILURE; } - /* Mark the boundary between INPUT PROGRAM transformations and - ordinary transformations. */ - f_trns = n_trns; + inp->trns_chain = proc_capture_transformations (ds); + trns_chain_finalize (inp->trns_chain); /* Figure out how to initialize each input case. */ - inp->init_cnt = dict_get_next_value_idx (default_dict); + inp->init_cnt = dict_get_next_value_idx (dataset_dict (ds)); inp->init = xnmalloc (inp->init_cnt, sizeof *inp->init); for (i = 0; i < inp->init_cnt; i++) inp->init[i] = -1; - for (i = 0; i < dict_get_var_cnt (default_dict); i++) + for (i = 0; i < dict_get_var_cnt (dataset_dict (ds)); i++) { - struct variable *var = dict_get_var (default_dict, i); + struct variable *var = dict_get_var (dataset_dict (ds), i); enum value_init_type value_init; size_t j; @@ -170,16 +172,16 @@ cmd_input_program (void) } for (i = 0; i < inp->init_cnt; i++) assert (inp->init[i] != -1); - inp->case_size = dict_get_case_size (default_dict); + inp->case_size = dict_get_case_size (dataset_dict (ds)); - /* Create vfm_source. */ - vfm_source = create_case_source (&input_program_source_class, inp); + proc_set_source (ds, + create_case_source (&input_program_source_class, inp)); return CMD_SUCCESS; } int -cmd_end_input_program (void) +cmd_end_input_program (struct dataset *ds UNUSED) { assert (in_input_program ()); return CMD_END_INPUT_PROGRAM; @@ -205,7 +207,7 @@ init_case (const struct input_program_pgm *inp, struct ccase *c) memset (case_data_rw (c, i)->s, ' ', sizeof case_data_rw (c, i)->s); break; default: - assert (0); + NOT_REACHED (); } } @@ -229,7 +231,7 @@ clear_case (const struct input_program_pgm *inp, struct ccase *c) memset (case_data_rw (c, i)->s, ' ', sizeof case_data_rw (c, i)->s); break; default: - assert (0); + NOT_REACHED (); } } @@ -248,38 +250,12 @@ input_program_source_read (struct case_source *source, inp->wc_data = wc_data; for (init_case (inp, c); ; clear_case (inp, c)) { - int i; - - /* Perform transformations on `blank' case. */ - for (i = 0; i < f_trns; ) - { - int code; - - code = t_trns[i].proc (t_trns[i].private, c, inp->case_nr); - switch (code) - { - case TRNS_CONTINUE: - i++; - break; - - case TRNS_DROP_CASE: - break; - - case TRNS_ERROR: - return false; - - case TRNS_NEXT_CASE: - goto next_case; - - case TRNS_END_FILE: - return true; - - default: - i = code; - break; - } - } - next_case: ; + enum trns_result result = trns_chain_execute (inp->trns_chain, c, + &inp->case_nr); + if (result == TRNS_ERROR) + return false; + else if (result == TRNS_END_FILE) + return true; } } @@ -288,6 +264,7 @@ destroy_input_program (struct input_program_pgm *pgm) { if (pgm != NULL) { + trns_chain_destroy (pgm->trns_chain); free (pgm->init); free (pgm); } @@ -311,7 +288,7 @@ static const struct case_source_class input_program_source_class = }; int -cmd_end_case (void) +cmd_end_case (struct dataset *ds UNUSED) { assert (in_input_program ()); if (token == '.') @@ -321,7 +298,7 @@ cmd_end_case (void) /* Sends the current case as the source's output. */ int -end_case_trns_proc (void *inp_, struct ccase *c, int case_nr UNUSED) +end_case_trns_proc (void *inp_, struct ccase *c, casenumber case_nr UNUSED) { struct input_program_pgm *inp = inp_; @@ -342,7 +319,7 @@ struct reread_trns /* Parses REREAD command. */ int -cmd_reread (void) +cmd_reread (struct dataset *ds) { struct file_handle *fh; /* File to be re-read. */ struct expression *e; /* Expression for column to set. */ @@ -363,7 +340,7 @@ cmd_reread (void) return CMD_CASCADING_FAILURE; } - e = expr_parse (default_dict, EXPR_NUMBER); + e = expr_parse (ds, EXPR_NUMBER); if (!e) return CMD_CASCADING_FAILURE; } @@ -376,7 +353,6 @@ cmd_reread (void) expr_free (e); return CMD_CASCADING_FAILURE; } - lex_get (); } else { @@ -388,14 +364,14 @@ cmd_reread (void) t = xmalloc (sizeof *t); t->reader = dfm_open_reader (fh); t->column = e; - add_transformation (reread_trns_proc, reread_trns_free, t); + add_transformation (ds, reread_trns_proc, reread_trns_free, t); return CMD_SUCCESS; } /* Executes a REREAD transformation. */ static int -reread_trns_proc (void *t_, struct ccase *c, int case_num) +reread_trns_proc (void *t_, struct ccase *c, casenumber case_num) { struct reread_trns *t = t_; @@ -429,11 +405,11 @@ reread_trns_free (void *t_) /* Parses END FILE command. */ int -cmd_end_file (void) +cmd_end_file (struct dataset *ds) { assert (in_input_program ()); - add_transformation (end_file_trns_proc, NULL, NULL); + add_transformation (ds, end_file_trns_proc, NULL, NULL); return lex_end_of_command (); } @@ -441,7 +417,7 @@ cmd_end_file (void) /* Executes an END FILE transformation. */ static int end_file_trns_proc (void *trns_ UNUSED, struct ccase *c UNUSED, - int case_num UNUSED) + casenumber case_num UNUSED) { return TRNS_END_FILE; }