projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
case: Introduce new functions for numbers and substrings in cases.
[pspp]
/
src
/
language
/
control
/
loop.c
diff --git
a/src/language/control/loop.c
b/src/language/control/loop.c
index e91d9438f39c131836141ee2be53d47c970d2904..156e647ea0e617ac16446a8c8a38d84814b47071 100644
(file)
--- a/
src/language/control/loop.c
+++ b/
src/language/control/loop.c
@@
-61,7
+61,7
@@
struct loop_trns
/* Iteration limit. */
int max_pass_count; /* Maximum number of passes (-1=unlimited). */
/* Iteration limit. */
int max_pass_count; /* Maximum number of passes (-1=unlimited). */
- int pass; /* Number of passes thr
u
the loop so far. */
+ int pass; /* Number of passes thr
ough
the loop so far. */
/* a=a TO b [BY c]. */
struct variable *index_var; /* Index variable. */
/* a=a TO b [BY c]. */
struct variable *index_var; /* Index variable. */
@@
-177,10
+177,7
@@
close_loop (void *loop_)
/* If there's nothing else limiting the number of loops, use
MXLOOPS as a limit. */
/* If there's nothing else limiting the number of loops, use
MXLOOPS as a limit. */
- if (loop->max_pass_count == -1
- && loop->index_var == NULL
- && loop->loop_condition == NULL
- && loop->end_loop_condition == NULL)
+ if (loop->max_pass_count == -1 && loop->index_var == NULL)
loop->max_pass_count = settings_get_mxloops ();
}
loop->max_pass_count = settings_get_mxloops ();
}
@@
-197,7
+194,7
@@
parse_if_clause (struct lexer *lexer,
return false;
}
return false;
}
- *condition = expr_parse_
pool (lexer, loop->pool, loop->ds, EXPR_BOOLEAN
);
+ *condition = expr_parse_
bool (lexer, loop->pool, loop->ds
);
return *condition != NULL;
}
return *condition != NULL;
}
@@
-235,8
+232,7
@@
parse_index_clause (struct dataset *ds, struct lexer *lexer,
if (!lex_force_match (lexer, T_EQUALS))
return false;
if (!lex_force_match (lexer, T_EQUALS))
return false;
- loop->first_expr = expr_parse_pool (lexer, loop->pool,
- loop->ds, EXPR_NUMBER);
+ loop->first_expr = expr_parse (lexer, loop->pool, loop->ds, VAL_NUMERIC);
if (loop->first_expr == NULL)
return false;
if (loop->first_expr == NULL)
return false;
@@
-255,13
+251,13
@@
parse_index_clause (struct dataset *ds, struct lexer *lexer,
lex_sbc_only_once (e == &loop->last_expr ? "TO" : "BY");
return false;
}
lex_sbc_only_once (e == &loop->last_expr ? "TO" : "BY");
return false;
}
- *e = expr_parse
_pool (lexer, loop->pool, loop->ds, EXPR_NUMBER
);
+ *e = expr_parse
(lexer, loop->pool, loop->ds, VAL_NUMERIC
);
if (*e == NULL)
return false;
}
if (loop->last_expr == NULL)
{
if (*e == NULL)
return false;
}
if (loop->last_expr == NULL)
{
- lex_sbc_missing (
lexer,
"TO");
+ lex_sbc_missing ("TO");
return false;
}
if (loop->by_expr == NULL)
return false;
}
if (loop->by_expr == NULL)
@@
-319,7
+315,7
@@
loop_trns_proc (void *loop_, struct ccase **c, casenumber case_num)
/* Even if the loop is never entered, set the index
variable to the initial value. */
*c = case_unshare (*c);
/* Even if the loop is never entered, set the index
variable to the initial value. */
*c = case_unshare (*c);
-
case_data_rw (*c, loop->index_var)->f
= loop->cur;
+
*case_num_rw (*c, loop->index_var)
= loop->cur;
/* Throw out pathological cases. */
if (!isfinite (loop->cur) || !isfinite (loop->by)
/* Throw out pathological cases. */
if (!isfinite (loop->cur) || !isfinite (loop->by)
@@
-367,12
+363,8
@@
end_loop_trns_proc (void *loop_, struct ccase **c, casenumber case_num UNUSED)
goto break_out;
/* MXLOOPS limiter. */
goto break_out;
/* MXLOOPS limiter. */
- if (loop->max_pass_count >= 0)
- {
- if (loop->pass >= loop->max_pass_count)
- goto break_out;
- loop->pass++;
- }
+ if (loop->max_pass_count >= 0 && ++loop->pass >= loop->max_pass_count)
+ goto break_out;
/* Indexing clause limiter: counting downward. */
if (loop->index_var != NULL)
/* Indexing clause limiter: counting downward. */
if (loop->index_var != NULL)
@@
-382,7
+374,7
@@
end_loop_trns_proc (void *loop_, struct ccase **c, casenumber case_num UNUSED)
|| (loop->by < 0.0 && loop->cur < loop->last))
goto break_out;
*c = case_unshare (*c);
|| (loop->by < 0.0 && loop->cur < loop->last))
goto break_out;
*c = case_unshare (*c);
-
case_data_rw (*c, loop->index_var)->f
= loop->cur;
+
*case_num_rw (*c, loop->index_var)
= loop->cur;
}
if (loop->loop_condition != NULL
}
if (loop->loop_condition != NULL