From 799c0a7d2992a98a2a3880d86e28cb47f8f5e5cf Mon Sep 17 00:00:00 2001 From: ch <ch> Date: Thu, 29 Mar 1990 02:55:05 +0000 Subject: [PATCH] Initial revision --- ldb/dynbind.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 ldb/dynbind.c diff --git a/ldb/dynbind.c b/ldb/dynbind.c new file mode 100644 index 000000000..4908ee2b0 --- /dev/null +++ b/ldb/dynbind.c @@ -0,0 +1,59 @@ +/* + * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/dynbind.c,v 1.1 1990/03/29 02:55:05 ch Exp $ + * + * Support for dynamic binding from C. + */ + +#include "ldb.h" +#include "lisp.h" +#include "globals.h" + +bind_variable(symbol, value) +lispobj symbol, value; +{ + lispobj old_value; + struct binding *binding; + + old_value = SymbolValue(symbol); + binding = (struct binding *) current_binding_stack_pointer; + current_binding_stack_pointer += (sizeof(binding) / sizeof(lispobj)); + binding->value = old_value; + binding->symbol = symbol; + SetSymbolValue(symbol, value); +} + +unbind() +{ + struct binding *binding; + lispobj symbol; + + binding = ((struct binding *) current_binding_stack_pointer) - 1; + + symbol = binding->symbol; + + SetSymbolValue(symbol, binding->value); + + binding->symbol = 0; + + current_binding_stack_pointer -= (sizeof(binding) / sizeof(lispobj)); +} + +unbind_to_here(bsp) +lispobj *bsp; +{ + while (bsp > current_binding_stack_pointer) { + struct binding *binding; + lispobj symbol; + + binding = ((struct binding *) current_binding_stack_pointer) - 1; + + symbol = binding->symbol; + + if (symbol) { + SetSymbolValue(symbol, binding->value); + binding->symbol = 0; + } + + current_binding_stack_pointer -= (sizeof(binding) / sizeof(lispobj)); + } +} -- GitLab