X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Fsave.c;h=88f3c75ee59a23d66a628995843d3b6dbaf23f27;hb=e5a05f16e98783e2785107059de22a44f51c18ea;hp=d12593ffca59ad841412a8cf9db1a37125183cf8;hpb=2dd6b5accbbf92ee440e8a3b41ade942e7e41f29;p=pspp diff --git a/src/language/data-io/save.c b/src/language/data-io/save.c index d12593ffca..88f3c75ee5 100644 --- a/src/language/data-io/save.c +++ b/src/language/data-io/save.c @@ -99,8 +99,7 @@ struct output_trns struct casewriter *writer; /* Writer. */ }; -static trns_proc_func output_trns_proc; -static trns_free_func output_trns_free; +static const struct trns_class output_trns_class; static struct casewriter *parse_write_command (struct lexer *, struct dataset *, enum writer_type, @@ -140,7 +139,7 @@ parse_output_trns (struct lexer *lexer, struct dataset *ds, enum writer_type wri return CMD_CASCADING_FAILURE; } - add_transformation (ds, output_trns_proc, output_trns_free, t); + add_transformation (ds, &output_trns_class, t); return CMD_SUCCESS; } @@ -238,8 +237,7 @@ parse_write_command (struct lexer *lexer, struct dataset *ds, cw = true; else { - lex_error_expecting (lexer, "READONLY", "WRITEABLE", - NULL_SENTINEL); + lex_error_expecting (lexer, "READONLY", "WRITEABLE"); goto error; } sysfile_opts.create_writeable = porfile_opts.create_writeable = cw; @@ -253,7 +251,7 @@ parse_write_command (struct lexer *lexer, struct dataset *ds, *retain_unselected = false; else { - lex_error_expecting (lexer, "RETAIN", "DELETE", NULL_SENTINEL); + lex_error_expecting (lexer, "RETAIN", "DELETE"); goto error; } } @@ -270,7 +268,7 @@ parse_write_command (struct lexer *lexer, struct dataset *ds, && lex_match_id (lexer, "VERSION")) { lex_match (lexer, T_EQUALS); - if (!lex_force_int (lexer)) + if (!lex_force_int_range (lexer, "VERSION", 2, 3)) goto error; sysfile_opts.version = lex_integer (lexer); lex_get (lexer); @@ -284,19 +282,19 @@ parse_write_command (struct lexer *lexer, struct dataset *ds, porfile_opts.type = PFM_TAPE; else { - lex_error_expecting (lexer, "COMM", "TAPE", NULL_SENTINEL); + lex_error_expecting (lexer, "COMM", "TAPE"); goto error; } } else if (writer_type == PORFILE_WRITER && lex_match_id (lexer, "DIGITS")) { lex_match (lexer, T_EQUALS); - if (!lex_force_int (lexer)) + if (!lex_force_int_range (lexer, "DIGITS", 1, INT_MAX)) goto error; porfile_opts.digits = lex_integer (lexer); lex_get (lexer); } - else if (!parse_dict_trim (lexer, dict)) + else if (!parse_dict_trim (lexer, dict, false)) goto error; if (!lex_match (lexer, T_SLASH)) @@ -365,7 +363,7 @@ parse_write_command (struct lexer *lexer, struct dataset *ds, } /* Writes case *C to the system file specified on XSAVE or XEXPORT. */ -static int +static enum trns_result output_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED) { struct output_trns *t = trns_; @@ -383,3 +381,9 @@ output_trns_free (void *trns_) free (t); return ok; } + +static const struct trns_class output_trns_class = { + .name = "XSAVE/XEXPORT", + .execute = output_trns_proc, + .destroy = output_trns_free, +};