X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fcontrol%2Fdo-if.c;h=83de0e39a31a73574bfe0fa0b781dafc96eafbf0;hb=7559bde1ff007c0ac0230fba30ae6c416148e171;hp=2e1e0abf5f4deb412db249189cb489b298f72e0d;hpb=24d4c143974d0cf3258fe2d355695e820c4ff24e;p=pspp diff --git a/src/language/control/do-if.c b/src/language/control/do-if.c index 2e1e0abf5f..83de0e39a3 100644 --- a/src/language/control/do-if.c +++ b/src/language/control/do-if.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2009-2012 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,19 +18,19 @@ #include -#include "control-stack.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "data/case.h" +#include "data/dataset.h" +#include "data/transformations.h" +#include "data/value.h" +#include "language/command.h" +#include "language/control/control-stack.h" +#include "language/expressions/public.h" +#include "language/lexer/lexer.h" +#include "libpspp/compiler.h" +#include "libpspp/message.h" +#include "libpspp/str.h" + +#include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -121,29 +121,32 @@ cmd_else_if (struct lexer *lexer, struct dataset *ds) /* Parse ELSE. */ int -cmd_else (struct lexer *lexer, struct dataset *ds) +cmd_else (struct lexer *lexer UNUSED, struct dataset *ds) { struct do_if_trns *do_if = ctl_stack_top (&do_if_class); - assert (ds == do_if->ds); + if (do_if == NULL || !must_not_have_else (do_if)) return CMD_CASCADING_FAILURE; + + assert (ds == do_if->ds); + add_else (do_if); - return lex_end_of_command (lexer); + return CMD_SUCCESS; } /* Parse END IF. */ int -cmd_end_if (struct lexer *lexer, struct dataset *ds) +cmd_end_if (struct lexer *lexer UNUSED, struct dataset *ds) { struct do_if_trns *do_if = ctl_stack_top (&do_if_class); - assert (ds == do_if->ds); if (do_if == NULL) return CMD_CASCADING_FAILURE; + assert (ds == do_if->ds); ctl_stack_pop (do_if); - return lex_end_of_command (lexer); + return CMD_SUCCESS; } /* Closes out DO_IF, by adding a sentinel ELSE clause if @@ -174,7 +177,7 @@ must_not_have_else (struct do_if_trns *do_if) { if (has_else (do_if)) { - msg (SE, _("This command may not follow ELSE in DO IF...END IF.")); + msg (SE, _("This command may not follow %s in %s ... %s."), "ELSE", "DO IF", "END IF"); return false; } else @@ -204,7 +207,7 @@ parse_clause (struct lexer *lexer, struct do_if_trns *do_if, struct dataset *ds) add_clause (do_if, condition); - return lex_end_of_command (lexer); + return CMD_SUCCESS; } /* Adds a clause to DO_IF that tests for the given CONDITION and, @@ -240,7 +243,7 @@ do_if_finalize_func (void *do_if_ UNUSED) Checks each clause and jumps to the appropriate transformation. */ static int -do_if_trns_proc (void *do_if_, struct ccase *c, casenumber case_num UNUSED) +do_if_trns_proc (void *do_if_, struct ccase **c, casenumber case_num UNUSED) { struct do_if_trns *do_if = do_if_; struct clause *clause; @@ -250,7 +253,7 @@ do_if_trns_proc (void *do_if_, struct ccase *c, casenumber case_num UNUSED) { if (clause->condition != NULL) { - double boolean = expr_evaluate_num (clause->condition, c, case_num); + double boolean = expr_evaluate_num (clause->condition, *c, case_num); if (boolean == 1.0) return clause->target_index; else if (boolean == SYSMIS) @@ -279,7 +282,8 @@ do_if_trns_free (void *do_if_) /* Breaks out of a DO IF construct. */ static int -break_trns_proc (void *do_if_, struct ccase *c UNUSED, casenumber case_num UNUSED) +break_trns_proc (void *do_if_, struct ccase **c UNUSED, + casenumber case_num UNUSED) { struct do_if_trns *do_if = do_if_;