X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Floop.c;h=06936778ef0f990751174373f5b7499a339c4eee;hb=f62700038e9edd7d8002242015a900a15626bceb;hp=7f8aa87559cbfacc32029715426623aa45c988c0;hpb=74a57f26f1458b28a0fddbb9f46004ac8f4d9c30;p=pspp diff --git a/src/loop.c b/src/loop.c index 7f8aa87559..06936778ef 100644 --- a/src/loop.c +++ b/src/loop.c @@ -14,22 +14,27 @@ 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 -#include +#include "error.h" #include "alloc.h" +#include "case.h" #include "command.h" +#include "dictionary.h" #include "do-ifP.h" #include "error.h" -#include "expr.h" +#include "expressions/public.h" #include "lexer.h" #include "misc.h" #include "settings.h" #include "str.h" #include "var.h" +#include "gettext.h" +#define _(msgid) gettext (msgid) + #include "debug-print.h" /* LOOP strategy: @@ -164,7 +169,7 @@ static int internal_cmd_loop (void) { /* Name of indexing variable if applicable. */ - char name[9]; + char name[LONG_NAME_LEN + 1]; /* Create and initialize transformations to facilitate error-handling. */ @@ -198,7 +203,7 @@ internal_cmd_loop (void) assert (token == '='); lex_get (); - one->init = expr_parse (PXP_NUMERIC); + one->init = expr_parse (default_dict, EXPR_NUMBER); if (!one->init) return 0; @@ -207,7 +212,7 @@ internal_cmd_loop (void) expr_free (one->init); return 0; } - one->term = expr_parse (PXP_NUMERIC); + one->term = expr_parse (default_dict, EXPR_NUMBER); if (!one->term) { expr_free (one->init); @@ -216,20 +221,20 @@ internal_cmd_loop (void) if (lex_match (T_BY)) { - one->incr = expr_parse (PXP_NUMERIC); + one->incr = expr_parse (default_dict, EXPR_NUMBER); if (!one->incr) return 0; } } else - name[0] = 0; + name[0] = '\0'; /* Parse IF clause. */ if (lex_match_id ("IF")) { two->flags |= LPC_COND; - two->cond = expr_parse (PXP_BOOLEAN); + two->cond = expr_parse (default_dict, EXPR_BOOLEAN); if (!two->cond) return 0; } @@ -241,7 +246,7 @@ internal_cmd_loop (void) } /* Find variable; create if necessary. */ - if (name[0]) + if (name[0] != '\0') { two->index = dict_lookup_var (default_dict, name); if (!two->index) @@ -259,15 +264,6 @@ internal_cmd_loop (void) add_transformation ((struct trns_header *) one); add_transformation ((struct trns_header *) two); -#if DEBUGGING - printf ("LOOP"); - if (two->flags & LPC_INDEX) - printf ("(INDEX)"); - if (two->flags & LPC_COND) - printf ("(IF)"); - printf ("\n"); -#endif - return 1; } @@ -313,7 +309,7 @@ internal_cmd_end_loop (void) /* Parse the expression if any. */ if (lex_match_id ("IF")) { - thr->cond = expr_parse (PXP_BOOLEAN); + thr->cond = expr_parse (default_dict, EXPR_BOOLEAN); if (!thr->cond) return 0; } @@ -328,13 +324,6 @@ internal_cmd_end_loop (void) /* Pop off the top of stack. */ ctl_stack = ctl_stack->down; -#if DEBUGGING - printf ("END LOOP"); - if (thr->cond) - printf ("(IF)"); - printf ("\n"); -#endif - return 1; } @@ -349,31 +338,31 @@ loop_1_trns_proc (struct trns_header * trns, struct ccase * c, two->pass = -1; if (two->flags & LPC_INDEX) { - union value t1, t2, t3; + double t1, t2, t3; - expr_evaluate (one->init, c, case_num, &t1); + t1 = expr_evaluate_num (one->init, c, case_num); if (one->incr) - expr_evaluate (one->incr, c, case_num, &t2); + t2 = expr_evaluate_num (one->incr, c, case_num); else - t2.f = 1.0; - expr_evaluate (one->term, c, case_num, &t3); + t2 = 1.0; + t3 = expr_evaluate_num (one->term, c, case_num); /* Even if the loop is never entered, force the index variable to assume the initial value. */ - c->data[two->index->fv].f = t1.f; + case_data_rw (c, two->index->fv)->f = t1; /* Throw out various pathological cases. */ - if (!finite (t1.f) || !finite (t2.f) || !finite (t3.f) || t2.f == 0.0) + if (!finite (t1) || !finite (t2) || !finite (t3) || t2 == 0.0) return two->loop_term; debug_printf (("LOOP %s=%g TO %g BY %g.\n", two->index->name, - t1.f, t3.f, t2.f)); - if (t2.f > 0.0) + t1, t3, t2)); + if (t2 > 0.0) { /* Loop counts upward: I=1 TO 5 BY 1. */ two->flags &= ~LPC_RINDEX; /* incr>0 but init>term */ - if (t1.f > t3.f) + if (t1 > t3) return two->loop_term; } else @@ -382,13 +371,13 @@ loop_1_trns_proc (struct trns_header * trns, struct ccase * c, two->flags |= LPC_RINDEX; /* incr<0 but initloop_term; } - two->curr = t1.f; - two->incr = t2.f; - two->term = t3.f; + two->curr = t1; + two->incr = t2; + two->term = t3; } return -1; @@ -428,7 +417,7 @@ loop_2_trns_proc (struct trns_header * trns, struct ccase * c, return two->loop_term; /* Set the current value into the case. */ - c->data[two->index->fv].f = two->curr; + case_data_rw (c, two->index->fv)->f = two->curr; /* Decrement the current value. */ two->curr += two->incr; @@ -441,7 +430,7 @@ loop_2_trns_proc (struct trns_header * trns, struct ccase * c, return two->loop_term; /* Set the current value into the case. */ - c->data[two->index->fv].f = two->curr; + case_data_rw (c, two->index->fv)->f = two->curr; /* Increment the current value. */ two->curr += two->incr; @@ -449,7 +438,7 @@ loop_2_trns_proc (struct trns_header * trns, struct ccase * c, /* Conditional clause limiter. */ if ((two->flags & LPC_COND) - && expr_evaluate (two->cond, c, case_num, NULL) != 1.0) + && expr_evaluate_num (two->cond, c, case_num) != 1.0) return two->loop_term; return -1; @@ -473,7 +462,7 @@ loop_3_trns_proc (struct trns_header * trns, struct ccase * c, /* Note that it breaks out of the loop if the expression is true *or missing*. This is conformant. */ - if (thr->cond && expr_evaluate (two->cond, c, case_num, NULL) != 0.0) + if (thr->cond && expr_evaluate_num (two->cond, c, case_num) != 0.0) return -1; return thr->loop_start;