summaryrefslogtreecommitdiff
path: root/libguile/values.c
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2012-01-18 17:52:43 -0500
committerMark H Weaver <mhw@netris.org>2012-01-18 18:01:48 -0500
commit1ceeca0a76809248aa974685756e0f05c7f64200 (patch)
tree558633a5b8f7fc66388f35609d1dfa537a749c88 /libguile/values.c
parentf0007cade095c5a2878ebbb8ea8c9b40810e4509 (diff)
downloadguile-1ceeca0a76809248aa974685756e0f05c7f64200.tar.gz
Add `scm_c_value_ref' to allow access to multiple returned values from C
Based on a patch by Julian Graham <julian@member.fsf.org> * libguile/values.c, libguile/values.h (scm_c_value_ref): New function. * doc/ref/api-control.texi (Multiple Values): Add documentation. * test-suite/standalone/test-scm-values.c: New test program. * test-suite/standalone/Makefile.am: Add test-scm-values test.
Diffstat (limited to 'libguile/values.c')
-rw-r--r--libguile/values.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/libguile/values.c b/libguile/values.c
index ab7773141..9c9e5ff6d 100644
--- a/libguile/values.c
+++ b/libguile/values.c
@@ -67,6 +67,31 @@ print_values (SCM obj, SCM pwps)
return SCM_UNSPECIFIED;
}
+SCM
+scm_c_value_ref (SCM obj, size_t idx)
+{
+ if (SCM_LIKELY (SCM_VALUESP (obj)))
+ {
+ SCM values = scm_struct_ref (obj, SCM_INUM0);
+ size_t i = idx;
+ while (SCM_LIKELY (scm_is_pair (values)))
+ {
+ if (i == 0)
+ return SCM_CAR (values);
+ values = SCM_CDR (values);
+ i--;
+ }
+ }
+ else if (idx == 0)
+ return obj;
+
+ scm_error (scm_out_of_range_key,
+ "scm_c_value_ref",
+ "Too few values in ~S to access index ~S",
+ scm_list_2 (obj, scm_from_unsigned_integer (idx)),
+ scm_list_1 (scm_from_unsigned_integer (idx)));
+}
+
SCM_DEFINE (scm_values, "values", 0, 0, 1,
(SCM args),
"Delivers all of its arguments to its continuation. Except for\n"