83 |
/* DATA LIST private data structure. */ |
/* DATA LIST private data structure. */ |
84 |
struct data_list_pgm |
struct data_list_pgm |
85 |
{ |
{ |
|
struct trns_header h; |
|
|
|
|
86 |
struct dls_var_spec *first, *last; /* Variable parsing specifications. */ |
struct dls_var_spec *first, *last; /* Variable parsing specifications. */ |
87 |
struct dfm_reader *reader; /* Data file reader. */ |
struct dfm_reader *reader; /* Data file reader. */ |
88 |
|
|
268 |
goto error; |
goto error; |
269 |
|
|
270 |
if (vfm_source != NULL) |
if (vfm_source != NULL) |
271 |
{ |
add_transformation (data_list_trns_proc, data_list_trns_free, dls); |
|
dls->h.proc = data_list_trns_proc; |
|
|
dls->h.free = data_list_trns_free; |
|
|
add_transformation (&dls->h); |
|
|
} |
|
272 |
else |
else |
273 |
vfm_source = create_case_source (&data_list_source_class, dls); |
vfm_source = create_case_source (&data_list_source_class, dls); |
274 |
|
|
275 |
return CMD_SUCCESS; |
return CMD_SUCCESS; |
276 |
|
|
277 |
error: |
error: |
278 |
destroy_dls_var_spec (dls->first); |
data_list_trns_free (dls); |
|
free (dls->delims); |
|
|
free (dls); |
|
279 |
return CMD_FAILURE; |
return CMD_FAILURE; |
280 |
} |
} |
281 |
|
|
1225 |
} |
} |
1226 |
} |
} |
1227 |
|
|
1228 |
/* Destroys DATA LIST transformation PGM. */ |
/* Destroys DATA LIST transformation DLS. */ |
1229 |
static void |
static void |
1230 |
data_list_trns_free (struct trns_header *pgm) |
data_list_trns_free (void *dls_) |
1231 |
{ |
{ |
1232 |
struct data_list_pgm *dls = (struct data_list_pgm *) pgm; |
struct data_list_pgm *dls = dls_; |
1233 |
free (dls->delims); |
free (dls->delims); |
1234 |
destroy_dls_var_spec (dls->first); |
destroy_dls_var_spec (dls->first); |
1235 |
dfm_close_reader (dls->reader); |
dfm_close_reader (dls->reader); |
1236 |
|
free (dls); |
1237 |
} |
} |
1238 |
|
|
1239 |
/* Handle DATA LIST transformation T, parsing data into C. */ |
/* Handle DATA LIST transformation DLS, parsing data into C. */ |
1240 |
static int |
static int |
1241 |
data_list_trns_proc (struct trns_header *t, struct ccase *c, |
data_list_trns_proc (void *dls_, struct ccase *c, int case_num UNUSED) |
|
int case_num UNUSED) |
|
1242 |
{ |
{ |
1243 |
struct data_list_pgm *dls = (struct data_list_pgm *) t; |
struct data_list_pgm *dls = dls_; |
1244 |
data_list_read_func *read_func; |
data_list_read_func *read_func; |
1245 |
int retval; |
int retval; |
1246 |
|
|
1307 |
data_list_source_destroy (struct case_source *source) |
data_list_source_destroy (struct case_source *source) |
1308 |
{ |
{ |
1309 |
data_list_trns_free (source->aux); |
data_list_trns_free (source->aux); |
|
free (source->aux); |
|
1310 |
} |
} |
1311 |
|
|
1312 |
const struct case_source_class data_list_source_class = |
const struct case_source_class data_list_source_class = |
1329 |
/* REPEATING DATA private data structure. */ |
/* REPEATING DATA private data structure. */ |
1330 |
struct repeating_data_trns |
struct repeating_data_trns |
1331 |
{ |
{ |
|
struct trns_header h; |
|
1332 |
struct dls_var_spec *first, *last; /* Variable parsing specifications. */ |
struct dls_var_spec *first, *last; /* Variable parsing specifications. */ |
1333 |
struct dfm_reader *reader; /* Input file, never NULL. */ |
struct dfm_reader *reader; /* Input file, never NULL. */ |
1334 |
|
|
1442 |
msg (SE, _("%s subcommand given multiple times."),"OCCURS"); |
msg (SE, _("%s subcommand given multiple times."),"OCCURS"); |
1443 |
goto error; |
goto error; |
1444 |
} |
} |
1445 |
saw_occurs |= 2; |
saw_occurs = true; |
1446 |
|
|
1447 |
if (!parse_num_or_var (&rpd->occurs, "OCCURS")) |
if (!parse_num_or_var (&rpd->occurs, "OCCURS")) |
1448 |
goto error; |
goto error; |
1450 |
else if (lex_match_id ("LENGTH")) |
else if (lex_match_id ("LENGTH")) |
1451 |
{ |
{ |
1452 |
lex_match ('='); |
lex_match ('='); |
1453 |
if (saw_length & 4) |
if (saw_length) |
1454 |
{ |
{ |
1455 |
msg (SE, _("%s subcommand given multiple times."),"LENGTH"); |
msg (SE, _("%s subcommand given multiple times."),"LENGTH"); |
1456 |
goto error; |
goto error; |
1457 |
} |
} |
1458 |
saw_length |= 4; |
saw_length = true; |
1459 |
|
|
1460 |
if (!parse_num_or_var (&rpd->length, "LENGTH")) |
if (!parse_num_or_var (&rpd->length, "LENGTH")) |
1461 |
goto error; |
goto error; |
1463 |
else if (lex_match_id ("CONTINUED")) |
else if (lex_match_id ("CONTINUED")) |
1464 |
{ |
{ |
1465 |
lex_match ('='); |
lex_match ('='); |
1466 |
if (saw_continued & 8) |
if (saw_continued) |
1467 |
{ |
{ |
1468 |
msg (SE, _("%s subcommand given multiple times."),"CONTINUED"); |
msg (SE, _("%s subcommand given multiple times."),"CONTINUED"); |
1469 |
goto error; |
goto error; |
1470 |
} |
} |
1471 |
saw_continued |= 8; |
saw_continued = true; |
1472 |
|
|
1473 |
if (!lex_match ('/')) |
if (!lex_match ('/')) |
1474 |
{ |
{ |
1497 |
else if (lex_match_id ("ID")) |
else if (lex_match_id ("ID")) |
1498 |
{ |
{ |
1499 |
lex_match ('='); |
lex_match ('='); |
1500 |
if (saw_id & 16) |
if (saw_id) |
1501 |
{ |
{ |
1502 |
msg (SE, _("%s subcommand given multiple times."),"ID"); |
msg (SE, _("%s subcommand given multiple times."),"ID"); |
1503 |
goto error; |
goto error; |
1504 |
} |
} |
1505 |
saw_id |= 16; |
saw_id = true; |
1506 |
|
|
1507 |
if (!lex_force_int ()) |
if (!lex_force_int ()) |
1508 |
goto error; |
goto error; |
1628 |
if (table) |
if (table) |
1629 |
dump_fixed_table (rpd->first, fh, rpd->last->rec); |
dump_fixed_table (rpd->first, fh, rpd->last->rec); |
1630 |
|
|
1631 |
rpd->h.proc = repeating_data_trns_proc; |
add_transformation (repeating_data_trns_proc, repeating_data_trns_free, rpd); |
|
rpd->h.free = repeating_data_trns_free; |
|
|
add_transformation (&rpd->h); |
|
1632 |
|
|
1633 |
return lex_end_of_command (); |
return lex_end_of_command (); |
1634 |
|
|
1635 |
error: |
error: |
1636 |
destroy_dls_var_spec (rpd->first); |
repeating_data_trns_free (rpd); |
|
free (rpd->id_value); |
|
1637 |
return CMD_FAILURE; |
return CMD_FAILURE; |
1638 |
} |
} |
1639 |
|
|
1643 |
static void |
static void |
1644 |
find_variable_input_spec (struct variable *v, struct fmt_spec *spec) |
find_variable_input_spec (struct variable *v, struct fmt_spec *spec) |
1645 |
{ |
{ |
1646 |
int i; |
size_t i; |
1647 |
|
|
1648 |
for (i = 0; i < n_trns; i++) |
for (i = 0; i < n_trns; i++) |
1649 |
{ |
{ |
1650 |
struct data_list_pgm *pgm = (struct data_list_pgm *) t_trns[i]; |
struct transformation *trns = &t_trns[i]; |
1651 |
|
|
1652 |
if (pgm->h.proc == data_list_trns_proc) |
if (trns->proc == data_list_trns_proc) |
1653 |
{ |
{ |
1654 |
|
struct data_list_pgm *pgm = trns->private; |
1655 |
struct dls_var_spec *iter; |
struct dls_var_spec *iter; |
1656 |
|
|
1657 |
for (iter = pgm->first; iter; iter = iter->next) |
for (iter = pgm->first; iter; iter = iter->next) |
1888 |
DATA structure. Returns -1 on success, -2 on end of file or |
DATA structure. Returns -1 on success, -2 on end of file or |
1889 |
on failure. */ |
on failure. */ |
1890 |
int |
int |
1891 |
repeating_data_trns_proc (struct trns_header *trns, struct ccase *c, |
repeating_data_trns_proc (void *trns_, struct ccase *c, int case_num UNUSED) |
|
int case_num UNUSED) |
|
1892 |
{ |
{ |
1893 |
struct repeating_data_trns *t = (struct repeating_data_trns *) trns; |
struct repeating_data_trns *t = trns_; |
1894 |
|
|
1895 |
struct fixed_string line; /* Current record. */ |
struct fixed_string line; /* Current record. */ |
1896 |
|
|
2042 |
|
|
2043 |
/* Frees a REPEATING DATA transformation. */ |
/* Frees a REPEATING DATA transformation. */ |
2044 |
void |
void |
2045 |
repeating_data_trns_free (struct trns_header *rpd_) |
repeating_data_trns_free (void *rpd_) |
2046 |
{ |
{ |
2047 |
struct repeating_data_trns *rpd = (struct repeating_data_trns *) rpd_; |
struct repeating_data_trns *rpd = rpd_; |
2048 |
|
|
2049 |
destroy_dls_var_spec (rpd->first); |
destroy_dls_var_spec (rpd->first); |
2050 |
dfm_close_reader (rpd->reader); |
dfm_close_reader (rpd->reader); |
2051 |
free (rpd->id_value); |
free (rpd->id_value); |
2052 |
|
free (rpd); |
2053 |
} |
} |
2054 |
|
|
2055 |
/* Lets repeating_data_trns_proc() know how to write the cases |
/* Lets repeating_data_trns_proc() know how to write the cases |
2056 |
that it composes. Not elegant. */ |
that it composes. Not elegant. */ |
2057 |
void |
void |
2058 |
repeating_data_set_write_case (struct trns_header *trns, |
repeating_data_set_write_case (struct transformation *trns_, |
2059 |
write_case_func *write_case, |
write_case_func *write_case, |
2060 |
write_case_data wc_data) |
write_case_data wc_data) |
2061 |
{ |
{ |
2062 |
struct repeating_data_trns *t = (struct repeating_data_trns *) trns; |
struct repeating_data_trns *t = trns_->private; |
2063 |
|
|
2064 |
assert (trns->proc == repeating_data_trns_proc); |
assert (trns_->proc == repeating_data_trns_proc); |
2065 |
t->write_case = write_case; |
t->write_case = write_case; |
2066 |
t->wc_data = wc_data; |
t->wc_data = wc_data; |
2067 |
} |
} |