projects
/
pspp
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
5c6fb3b
)
macro: Move nesting_countdown into macro_expander.
author
Ben Pfaff
<blp@cs.stanford.edu>
Sun, 4 Jul 2021 21:24:08 +0000
(14:24 -0700)
committer
Ben Pfaff
<blp@cs.stanford.edu>
Sun, 4 Jul 2021 21:24:08 +0000
(14:24 -0700)
src/language/lexer/macro.c
patch
|
blob
|
history
diff --git
a/src/language/lexer/macro.c
b/src/language/lexer/macro.c
index 0a5dfb86cca615c7612336aba2deac7ca0289afd..82e71bb93ec0eb85bd6dbe37767ded850f8a6a26 100644
(file)
--- a/
src/language/lexer/macro.c
+++ b/
src/language/lexer/macro.c
@@
-872,6
+872,7
@@
struct macro_expander
enum segmenter_mode segmenter_mode;
struct stringi_map *vars;
bool *expand;
enum segmenter_mode segmenter_mode;
struct stringi_map *vars;
bool *expand;
+ int nesting_countdown;
};
/* Each argument to a macro function is one of:
};
/* Each argument to a macro function is one of:
@@
-892,15
+893,13
@@
struct parse_macro_function_ctx
{
const struct macro_token *input;
size_t n_input;
{
const struct macro_token *input;
size_t n_input;
- int nesting_countdown;
const struct macro_expander *me;
const struct macro_expansion_stack *stack;
bool *expand;
};
static void
const struct macro_expander *me;
const struct macro_expansion_stack *stack;
bool *expand;
};
static void
-macro_expand (const struct macro_tokens *, int nesting_countdown,
- const struct macro_expander *,
+macro_expand (const struct macro_tokens *, const struct macro_expander *,
const struct macro_expansion_stack *stack,
bool *break_, struct macro_tokens *exp);
const struct macro_expansion_stack *stack,
bool *break_, struct macro_tokens *exp);
@@
-972,7
+971,6
@@
parse_function_arg (struct parse_macro_function_ctx *ctx,
struct parse_macro_function_ctx subctx = {
.input = &ctx->input[i],
.n_input = ctx->n_input - i,
struct parse_macro_function_ctx subctx = {
.input = &ctx->input[i],
.n_input = ctx->n_input - i,
- .nesting_countdown = ctx->nesting_countdown,
.me = ctx->me,
.stack = ctx->stack,
};
.me = ctx->me,
.stack = ctx->stack,
};
@@
-1247,7
+1245,7
@@
expand_macro_function (struct parse_macro_function_ctx *ctx,
macro_tokens_from_string__ (&mts, ss_cstr (args.strings[0]),
ctx->me->segmenter_mode, ctx->stack);
struct macro_tokens exp = { .n = 0 };
macro_tokens_from_string__ (&mts, ss_cstr (args.strings[0]),
ctx->me->segmenter_mode, ctx->stack);
struct macro_tokens exp = { .n = 0 };
- macro_expand (&mts, ctx->
nesting_countdown - 1, ctx->
me,
+ macro_expand (&mts, ctx->me,
&(struct macro_expansion_stack) {
.name = "!EVAL",
.next = ctx->stack,
&(struct macro_expansion_stack) {
.name = "!EVAL",
.next = ctx->stack,
@@
-1272,7
+1270,6
@@
expand_macro_function (struct parse_macro_function_ctx *ctx,
struct expr_context
{
struct expr_context
{
- int nesting_countdown;
const struct macro_expander *me;
const struct macro_expansion_stack *stack;
};
const struct macro_expander *me;
const struct macro_expansion_stack *stack;
};
@@
-1316,7
+1313,6
@@
macro_evaluate_literal (const struct expr_context *ctx,
struct parse_macro_function_ctx fctx = {
.input = p,
.n_input = end - p,
struct parse_macro_function_ctx fctx = {
.input = p,
.n_input = end - p,
- .nesting_countdown = ctx->nesting_countdown,
.me = ctx->me,
.stack = ctx->stack,
};
.me = ctx->me,
.stack = ctx->stack,
};
@@
-1512,12
+1508,10
@@
macro_evaluate_or (const struct expr_context *ctx,
static char *
macro_evaluate_expression (const struct macro_token **tokens, size_t n_tokens,
static char *
macro_evaluate_expression (const struct macro_token **tokens, size_t n_tokens,
- int nesting_countdown,
const struct macro_expander *me,
const struct macro_expansion_stack *stack)
{
const struct expr_context ctx = {
const struct macro_expander *me,
const struct macro_expansion_stack *stack)
{
const struct expr_context ctx = {
- .nesting_countdown = nesting_countdown,
.me = me,
.stack = stack,
};
.me = me,
.stack = stack,
};
@@
-1526,13
+1520,11
@@
macro_evaluate_expression (const struct macro_token **tokens, size_t n_tokens,
static bool
macro_evaluate_number (const struct macro_token **tokens, size_t n_tokens,
static bool
macro_evaluate_number (const struct macro_token **tokens, size_t n_tokens,
- int nesting_countdown,
const struct macro_expander *me,
const struct macro_expansion_stack *stack,
double *number)
{
const struct macro_expander *me,
const struct macro_expansion_stack *stack,
double *number)
{
- char *s = macro_evaluate_expression (tokens, n_tokens, nesting_countdown,
- me, stack);
+ char *s = macro_evaluate_expression (tokens, n_tokens, me, stack);
if (!s)
return false;
if (!s)
return false;
@@
-1579,7
+1571,7
@@
find_ifend_clause (const struct macro_token *p, const struct macro_token *end)
static size_t
macro_expand_if (const struct macro_token *tokens, size_t n_tokens,
static size_t
macro_expand_if (const struct macro_token *tokens, size_t n_tokens,
-
int nesting_countdown,
const struct macro_expander *me,
+ const struct macro_expander *me,
const struct macro_expansion_stack *stack,
bool *break_, struct macro_tokens *exp)
{
const struct macro_expansion_stack *stack,
bool *break_, struct macro_tokens *exp)
{
@@
-1590,8
+1582,7
@@
macro_expand_if (const struct macro_token *tokens, size_t n_tokens,
return 0;
p++;
return 0;
p++;
- char *result = macro_evaluate_expression (&p, end - p, nesting_countdown,
- me, stack);
+ char *result = macro_evaluate_expression (&p, end - p, me, stack);
if (!result)
return 0;
bool b = strcmp (result, "0");
if (!result)
return 0;
bool b = strcmp (result, "0");
@@
-1658,8
+1649,7
@@
macro_expand_if (const struct macro_token *tokens, size_t n_tokens,
.mts = CONST_CAST (struct macro_token *, start),
.n = n,
};
.mts = CONST_CAST (struct macro_token *, start),
.n = n,
};
- macro_expand (&mts, nesting_countdown, me,
- &(struct macro_expansion_stack) {
+ macro_expand (&mts, me, &(struct macro_expansion_stack) {
.name = "!IF",
.next = stack,
},
.name = "!IF",
.next = stack,
},
@@
-1670,7
+1660,7
@@
macro_expand_if (const struct macro_token *tokens, size_t n_tokens,
static size_t
macro_parse_let (const struct macro_token *tokens, size_t n_tokens,
static size_t
macro_parse_let (const struct macro_token *tokens, size_t n_tokens,
-
int nesting_countdown,
const struct macro_expander *me,
+ const struct macro_expander *me,
const struct macro_expansion_stack *stack)
{
const struct macro_token *p = tokens;
const struct macro_expansion_stack *stack)
{
const struct macro_token *p = tokens;
@@
-1706,8
+1696,7
@@
macro_parse_let (const struct macro_token *tokens, size_t n_tokens,
}
p++;
}
p++;
- char *value = macro_evaluate_expression (&p, end - p, nesting_countdown,
- me, stack);
+ char *value = macro_evaluate_expression (&p, end - p, me, stack);
if (!value)
return 0;
if (!value)
return 0;
@@
-1740,7
+1729,7
@@
find_doend (const struct macro_expansion_stack *stack,
static size_t
macro_expand_do (const struct macro_token *tokens, size_t n_tokens,
static size_t
macro_expand_do (const struct macro_token *tokens, size_t n_tokens,
-
int nesting_countdown,
const struct macro_expander *me,
+ const struct macro_expander *me,
const struct macro_expansion_stack *stack,
struct macro_tokens *exp)
{
const struct macro_expansion_stack *stack,
struct macro_tokens *exp)
{
@@
-1775,8
+1764,7
@@
macro_expand_do (const struct macro_token *tokens, size_t n_tokens,
&& ss_equals_case (p->token.string, ss_cstr ("!IN")))
{
p++;
&& ss_equals_case (p->token.string, ss_cstr ("!IN")))
{
p++;
- char *list = macro_evaluate_expression (&p, end - p, nesting_countdown,
- me, &next_stack);
+ char *list = macro_evaluate_expression (&p, end - p, me, &next_stack);
if (!list)
return 0;
if (!list)
return 0;
@@
-1811,8
+1799,7
@@
macro_expand_do (const struct macro_token *tokens, size_t n_tokens,
ss_xstrdup (items.mts[i].representation));
bool break_ = false;
ss_xstrdup (items.mts[i].representation));
bool break_ = false;
- macro_expand (&inner, nesting_countdown,
- me, &next_stack, &break_, exp);
+ macro_expand (&inner, me, &next_stack, &break_, exp);
if (break_)
break;
}
if (break_)
break;
}
@@
-1822,8
+1809,7
@@
macro_expand_do (const struct macro_token *tokens, size_t n_tokens,
{
p++;
double first;
{
p++;
double first;
- if (!macro_evaluate_number (&p, end - p, nesting_countdown,
- me, &next_stack, &first))
+ if (!macro_evaluate_number (&p, end - p, me, &next_stack, &first))
return 0;
if (p >= end || p->token.type != T_MACRO_ID
return 0;
if (p >= end || p->token.type != T_MACRO_ID
@@
-1836,8
+1822,7
@@
macro_expand_do (const struct macro_token *tokens, size_t n_tokens,
p++;
double last;
p++;
double last;
- if (!macro_evaluate_number (&p, end - p, nesting_countdown,
- me, &next_stack, &last))
+ if (!macro_evaluate_number (&p, end - p, me, &next_stack, &last))
return 0;
double by = 1.0;
return 0;
double by = 1.0;
@@
-1845,8
+1830,7
@@
macro_expand_do (const struct macro_token *tokens, size_t n_tokens,
&& ss_equals_case (p->token.string, ss_cstr ("!BY")))
{
p++;
&& ss_equals_case (p->token.string, ss_cstr ("!BY")))
{
p++;
- if (!macro_evaluate_number (&p, end - p, nesting_countdown,
- me, &next_stack, &by))
+ if (!macro_evaluate_number (&p, end - p, me, &next_stack, &by))
return 0;
if (by == 0.0)
return 0;
if (by == 0.0)
@@
-1887,8
+1871,7
@@
macro_expand_do (const struct macro_token *tokens, size_t n_tokens,
xstrdup (index_s));
bool break_ = false;
xstrdup (index_s));
bool break_ = false;
- macro_expand (&inner, nesting_countdown,
- me, &next_stack, &break_, exp);
+ macro_expand (&inner, me, &next_stack, &break_, exp);
if (break_)
break;
}
if (break_)
break;
}
@@
-1905,12
+1888,12
@@
macro_expand_do (const struct macro_token *tokens, size_t n_tokens,
}
static void
}
static void
-macro_expand (const struct macro_tokens *mts,
int nesting_countdown,
+macro_expand (const struct macro_tokens *mts,
const struct macro_expander *me,
const struct macro_expansion_stack *stack,
bool *break_, struct macro_tokens *exp)
{
const struct macro_expander *me,
const struct macro_expansion_stack *stack,
bool *break_, struct macro_tokens *exp)
{
- if (nesting_countdown <= 0)
+ if (
me->
nesting_countdown <= 0)
{
macro_error (stack, NULL, _("Maximum nesting level %d exceeded. "
"(Use SET MNEST to change the limit.)"),
{
macro_error (stack, NULL, _("Maximum nesting level %d exceeded. "
"(Use SET MNEST to change the limit.)"),
@@
-1941,9
+1924,9
@@
macro_expand (const struct macro_tokens *mts, int nesting_countdown,
.segmenter_mode = me->segmenter_mode,
.expand = me->expand,
.vars = &vars,
.segmenter_mode = me->segmenter_mode,
.expand = me->expand,
.vars = &vars,
+ .nesting_countdown = me->nesting_countdown,
};
};
- macro_expand (arg, nesting_countdown, &subme,
- &(struct macro_expansion_stack) {
+ macro_expand (arg, &subme, &(struct macro_expansion_stack) {
.name = param->name,
.next = stack,
}, break_, exp);
.name = param->name,
.next = stack,
}, break_, exp);
@@
-1974,8
+1957,9
@@
macro_expand (const struct macro_tokens *mts, int nesting_countdown,
.segmenter_mode = me->segmenter_mode,
.expand = me->expand,
.vars = &vars,
.segmenter_mode = me->segmenter_mode,
.expand = me->expand,
.vars = &vars,
+ .nesting_countdown = me->nesting_countdown,
};
};
- macro_expand (arg,
nesting_countdown,
&subme,
+ macro_expand (arg, &subme,
&(struct macro_expansion_stack) {
.name = "!*",
.next = stack,
&(struct macro_expansion_stack) {
.name = "!*",
.next = stack,
@@
-1990,8
+1974,7
@@
macro_expand (const struct macro_tokens *mts, int nesting_countdown,
continue;
}
continue;
}
- size_t n = macro_expand_if (&mts->mts[i], mts->n - i,
- nesting_countdown, me, stack,
+ size_t n = macro_expand_if (&mts->mts[i], mts->n - i, me, stack,
break_, exp);
if (n > 0)
{
break_, exp);
if (n > 0)
{
@@
-2035,9
+2018,10
@@
macro_expand (const struct macro_tokens *mts, int nesting_countdown,
.segmenter_mode = me->segmenter_mode,
.expand = me->expand,
.vars = &vars,
.segmenter_mode = me->segmenter_mode,
.expand = me->expand,
.vars = &vars,
+ .nesting_countdown = me->nesting_countdown - 1,
};
};
- macro_expand (&submc->macro->body,
nesting_countdown - 1
,
- &
subme, &
(struct macro_expansion_stack) {
+ macro_expand (&submc->macro->body,
&subme
,
+ &(struct macro_expansion_stack) {
.name = submc->macro->name,
.file_name = submc->macro->file_name,
.first_line = submc->macro->first_line,
.name = submc->macro->name,
.file_name = submc->macro->file_name,
.first_line = submc->macro->first_line,
@@
-2072,7
+2056,6
@@
macro_expand (const struct macro_tokens *mts, int nesting_countdown,
struct parse_macro_function_ctx ctx = {
.input = &mts->mts[i],
.n_input = mts->n - i,
struct parse_macro_function_ctx ctx = {
.input = &mts->mts[i],
.n_input = mts->n - i,
- .nesting_countdown = nesting_countdown,
.me = me,
.stack = stack,
};
.me = me,
.stack = stack,
};
@@
-2089,17
+2072,14
@@
macro_expand (const struct macro_tokens *mts, int nesting_countdown,
continue;
}
continue;
}
- size_t n = macro_parse_let (&mts->mts[i], mts->n - i,
- nesting_countdown,
- me, stack);
+ size_t n = macro_parse_let (&mts->mts[i], mts->n - i, me, stack);
if (n > 0)
{
i += n - 1;
continue;
}
if (n > 0)
{
i += n - 1;
continue;
}
- n = macro_expand_do (&mts->mts[i], mts->n - i, nesting_countdown, me,
- stack, exp);
+ n = macro_expand_do (&mts->mts[i], mts->n - i, me, stack, exp);
if (n > 0)
{
i += n - 1;
if (n > 0)
{
i += n - 1;
@@
-2130,6
+2110,7
@@
macro_call_expand (struct macro_call *mc, enum segmenter_mode segmenter_mode,
.segmenter_mode = segmenter_mode,
.expand = &expand,
.vars = &vars,
.segmenter_mode = segmenter_mode,
.expand = &expand,
.vars = &vars,
+ .nesting_countdown = settings_get_mnest (),
};
struct macro_expansion_stack stack = {
};
struct macro_expansion_stack stack = {
@@
-2138,8
+2119,7
@@
macro_call_expand (struct macro_call *mc, enum segmenter_mode segmenter_mode,
.first_line = mc->macro->first_line,
.last_line = mc->macro->last_line,
};
.first_line = mc->macro->first_line,
.last_line = mc->macro->last_line,
};
- macro_expand (&mc->macro->body, settings_get_mnest (),
- &me, &stack, NULL, exp);
+ macro_expand (&mc->macro->body, &me, &stack, NULL, exp);
stringi_map_destroy (&vars);
}
stringi_map_destroy (&vars);
}