X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata-list.c;h=f4ed8d874d7c2986e530b8dec777225a09fce73f;hb=18febf84744dc7ab4248542c2f88d91c01ef3fa1;hp=a024b263815c5cf39a14959c891cb2360c6dd605;hpb=3a7fba81ceae5b049d0f7d671e9e3c3c43bbf703;p=pspp-builds.git diff --git a/src/data-list.c b/src/data-list.c index a024b263..f4ed8d87 100644 --- a/src/data-list.c +++ b/src/data-list.c @@ -17,24 +17,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* AIX requires this to be the first thing in the file. */ #include -#if __GNUC__ -#define alloca __builtin_alloca -#else -#if HAVE_ALLOCA_H -#include -#else -#ifdef _AIX -#pragma alloca -#else -#ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -#endif -#endif -#endif -#endif - +#include "data-list.h" #include #include #include @@ -179,10 +163,7 @@ cmd_data_list (void) return CMD_FAILURE; dls.end = dict_lookup_var (default_dict, tokid); if (!dls.end) - { - dls.end = dict_create_var (default_dict, tokid, 0); - assert (dls.end != NULL); - } + dls.end = dict_create_var_assert (default_dict, tokid, 0); lex_get (); } else if (token == T_ID) @@ -535,11 +516,13 @@ fixed_parse_compatible (void) { convert_fmt_ItoO (&fx.spec.input, &v->print); v->write = v->print; + if (vfm_source != &input_program_source + && vfm_source != &file_type_source) + v->init = 0; } else { - v = dict_lookup_var (default_dict, fx.name[i]); - assert (v != NULL); + v = dict_lookup_var_assert (default_dict, fx.name[i]); if (!vfm_source) { msg (SE, _("%s is a duplicate variable name."), fx.name[i]); @@ -643,6 +626,10 @@ dump_fmt_list (struct fmt_list *f) return 0; } + if (vfm_source != &input_program_source + && vfm_source != &file_type_source) + v->init = 0; + fx.spec.input = f->f; convert_fmt_ItoO (&fx.spec.input, &v->print); v->write = v->print; @@ -845,6 +832,10 @@ parse_free (void) v->print = v->write = out; + if (vfm_source != &input_program_source + && vfm_source != &file_type_source) + v->init = 0; + strcpy (spec.name, name[i]); spec.fv = v->fv; spec.width = width; @@ -984,14 +975,13 @@ cut_field (char **ret_cp, int *ret_len) static int read_from_data_list_fixed (void); static int read_from_data_list_free (void); static int read_from_data_list_list (void); -static int do_reading (int flag); /* FLAG==0: reads any number of cases into temp_case and calls write_case() for each one, returns garbage. FLAG!=0: reads one case into temp_case and returns -2 on eof, -1 otherwise. Uses dlsp as the relevant parsing description. */ static int -do_reading (int flag) +do_reading (int flag, write_case_func *write_case, write_case_data wc_data) { int (*func) (void); @@ -1047,7 +1037,7 @@ do_reading (int flag) else { while (func () != -2) - if (!write_case ()) + if (!write_case (wc_data)) { debug_printf ((_("abort in write_case()\n"))); break; @@ -1216,19 +1206,19 @@ destroy_dls (struct trns_header *pgm) /* Note that since this is exclusively an input program, C is guaranteed to be temp_case. */ static int -read_one_case (struct trns_header *t, struct ccase *c unused) +read_one_case (struct trns_header *t, struct ccase *c UNUSED) { dlsp = (struct data_list_pgm *) t; - return do_reading (1); + return do_reading (1, NULL, NULL); } /* Reads all the records from the data file and passes them to write_case(). */ static void -data_list_source_read (void) +data_list_source_read (write_case_func *write_case, write_case_data wc_data) { dlsp = &dls; - do_reading (0); + do_reading (0, write_case, wc_data); } /* Destroys the source's internal data. */ @@ -1275,12 +1265,14 @@ struct repeating_data_trns int id_beg, id_end; /* ID subcommand, beginning & end columns. */ struct variable *id_var; /* ID subcommand, DATA LIST variable. */ struct fmt_spec id_spec; /* ID subcommand, input format spec. */ + write_case_func *write_case; + write_case_data wc_data; }; /* Information about the transformation being parsed. */ static struct repeating_data_trns rpd; -static int read_one_set_of_repetitions (struct trns_header *, struct ccase *); +int repeating_data_trns_proc (struct trns_header *, struct ccase *); static int parse_num_or_var (struct rpd_num_or_var *, const char *); static int parse_repeating_data (void); static void find_variable_input_spec (struct variable *v, @@ -1335,7 +1327,7 @@ cmd_repeating_data (void) lex_match ('='); if (seen & 1) { - msg (SE, _("STARTS subcommand given multiple times.")); + msg (SE, _("%s subcommand given multiple times."),"STARTS"); return CMD_FAILURE; } seen |= 1; @@ -1370,7 +1362,7 @@ cmd_repeating_data (void) lex_match ('='); if (seen & 2) { - msg (SE, _("OCCURS subcommand given multiple times.")); + msg (SE, _("%s subcommand given multiple times."),"OCCURS"); return CMD_FAILURE; } seen |= 2; @@ -1383,7 +1375,7 @@ cmd_repeating_data (void) lex_match ('='); if (seen & 4) { - msg (SE, _("LENGTH subcommand given multiple times.")); + msg (SE, _("%s subcommand given multiple times."),"LENGTH"); return CMD_FAILURE; } seen |= 4; @@ -1396,7 +1388,7 @@ cmd_repeating_data (void) lex_match ('='); if (seen & 8) { - msg (SE, _("CONTINUED subcommand given multiple times.")); + msg (SE, _("%s subcommand given multiple times."),"CONTINUED"); return CMD_FAILURE; } seen |= 8; @@ -1429,7 +1421,7 @@ cmd_repeating_data (void) lex_match ('='); if (seen & 16) { - msg (SE, _("ID subcommand given multiple times.")); + msg (SE, _("%s subcommand given multiple times."),"ID"); return CMD_FAILURE; } seen |= 16; @@ -1540,7 +1532,7 @@ cmd_repeating_data (void) { struct repeating_data_trns *new_trns; - rpd.h.proc = read_one_set_of_repetitions; + rpd.h.proc = repeating_data_trns_proc; rpd.h.free = destroy_dls; new_trns = xmalloc (sizeof *new_trns); @@ -1782,7 +1774,7 @@ rpd_parse_record (int beg, int end, int ofs, struct ccase *c, warned = 1; tmsg (SW, RPD_ERR, - _("Variable %s startging in column %d extends " + _("Variable %s starting in column %d extends " "beyond physical record length of %d."), var_spec->v->name, fc, len); } @@ -1804,7 +1796,7 @@ rpd_parse_record (int beg, int end, int ofs, struct ccase *c, cur += ofs; - if (!write_case ()) + if (!t->write_case (t->wc_data)) return 0; } } @@ -1815,8 +1807,8 @@ rpd_parse_record (int beg, int end, int ofs, struct ccase *c, /* Analogous to read_one_case; reads one set of repetitions of the elements in the REPEATING DATA structure. Returns -1 on success, -2 on end of file or on failure. */ -static int -read_one_set_of_repetitions (struct trns_header *trns, struct ccase *c) +int +repeating_data_trns_proc (struct trns_header *trns, struct ccase *c) { dfm_push (dlsp->handle); @@ -1949,3 +1941,19 @@ read_one_set_of_repetitions (struct trns_header *trns, struct ccase *c) transformations. */ return -3; } + +/* This is a kluge. It is only here until I have more time + tocome up with something better. It lets + repeating_data_trns_proc() know how to write the cases that it + composes. */ +void +repeating_data_set_write_case (struct trns_header *trns, + write_case_func *write_case, + write_case_data wc_data) +{ + struct repeating_data_trns *t = (struct repeating_data_trns *) trns; + + assert (trns->proc == repeating_data_trns_proc); + t->write_case = write_case; + t->wc_data = wc_data; +}