You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
#include <config.h>
-#include <assert.h>
+#include "do-ifP.h"
+#include "error.h"
#include <stdlib.h>
#include "alloc.h"
#include "command.h"
#include "error.h"
-#include "expr.h"
+#include "expressions/public.h"
#include "lexer.h"
#include "str.h"
#include "var.h"
#include "debug-print.h"
-#if DEBUGGING
-#include <stdio.h>
-#endif
-
/* *INDENT-OFF* */
/* Description of DO IF transformations:
*/
/* *INDENT-ON* */
-#include "do-ifP.h"
-
static struct do_if_trns *parse_do_if (void);
static void add_ELSE_IF (struct do_if_trns *);
-static int goto_trns_proc (struct trns_header *, struct ccase *);
-static int do_if_trns_proc (struct trns_header *, struct ccase *);
-static void do_if_trns_free (struct trns_header *);
+static trns_proc_func goto_trns_proc, do_if_trns_proc;
+static trns_free_func do_if_trns_free;
/* Parse DO IF. */
int
{
struct do_if_trns *t;
- lex_match_id ("ELSE");
-
/* Check that we're in a pleasing situation. */
if (!ctl_stack || ctl_stack->type != CST_DO_IF)
{
/* List iterator. */
struct do_if_trns *iter;
- lex_match_id ("IF");
-
/* Check that we're in a pleasing situation. */
if (!ctl_stack || ctl_stack->type != CST_DO_IF)
{
struct do_if_trns *t;
struct expression *e;
- lex_match_id ("IF");
-
- e = expr_parse (PXP_BOOLEAN);
+ e = expr_parse (default_dict, EXPR_BOOLEAN);
if (!e)
return NULL;
if (token != '.')
/* Executes a goto transformation. */
static int
-goto_trns_proc (struct trns_header * t, struct ccase * c unused)
+goto_trns_proc (struct trns_header * t, struct ccase * c UNUSED,
+ int case_num UNUSED)
{
return ((struct goto_trns *) t)->dest;
}
static int
-do_if_trns_proc (struct trns_header * trns, struct ccase * c)
+do_if_trns_proc (struct trns_header * trns, struct ccase * c,
+ int case_num UNUSED)
{
struct do_if_trns *t = (struct do_if_trns *) trns;
- union value bool;
+ double boolean;
- expr_evaluate (t->cond, c, &bool);
- if (bool.f == 1.0)
+ boolean = expr_evaluate_num (t->cond, c, case_num);
+ if (boolean == 1.0)
{
debug_printf ((_("DO IF %d: true\n"), t->h.index));
return -1;
}
- else if (bool.f == 0.0)
+ else if (boolean == 0.0)
{
debug_printf ((_("DO IF %d: false\n"), t->h.index));
return t->false_jump;