summaryrefslogtreecommitdiffstats
path: root/unwind.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2011-10-24 23:35:48 -0400
committerKaz Kylheku <kaz@kylheku.com>2011-10-24 23:35:48 -0400
commit77b9c8f289df7b0ba45668e09cdc040252c681c8 (patch)
treed1d6df2cd1ed2ad82a9aa845cda6c4243f01ce99 /unwind.c
parent23a6fd5129b285d25faa8198e395ac91db0348c4 (diff)
downloadtxr-77b9c8f289df7b0ba45668e09cdc040252c681c8.tar.gz
txr-77b9c8f289df7b0ba45668e09cdc040252c681c8.tar.bz2
txr-77b9c8f289df7b0ba45668e09cdc040252c681c8.zip
* filter.c (function_filter): New function.
(get_filter): Handle (fun ...) syntax. * match.c (v_bind): Establish dynamic environment frame around dest_bind, and stash the bindings there so filters can have access to the bindings. (v_output): Likewise, around do_output calls. (v_fun): New function. (match_files): Function handling broken out into v_fun. (match_funcall): New function. * match.h (match_funcall): Declared. * unwind.c (uw_push_env): Initialize match_context. (uw_get_match_context, uw_set_match_context): New functions. * unwind.h (struct uw_dynamic_env): New member, match_context. (uw_get_match_context, uw_set_match_context): Declared. * txr.1: Documented function filters.
Diffstat (limited to 'unwind.c')
-rw-r--r--unwind.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/unwind.c b/unwind.c
index 143b9033..0d8a48e4 100644
--- a/unwind.c
+++ b/unwind.c
@@ -125,6 +125,7 @@ void uw_push_env(uw_frame_t *fr)
fr->ev.type = UW_ENV;
fr->ev.up_env = prev_env;
fr->ev.func_bindings = nil;
+ fr->ev.match_context = nil;
fr->ev.up = uw_stack;
uw_stack = fr;
uw_env_stack = fr;
@@ -152,6 +153,19 @@ val uw_set_func(val sym, val value)
return value;
}
+val uw_get_match_context(void)
+{
+ uw_frame_t *env = uw_find_env();
+ return env->ev.match_context;
+}
+
+val uw_set_match_context(val context)
+{
+ uw_frame_t *env = uw_find_env();
+ env->ev.match_context = context;
+ return context;
+}
+
void uw_pop_frame(uw_frame_t *fr)
{
assert (fr == uw_stack);