From cca25351feb6a972bad62d8aabca611006777882 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Mon, 23 Nov 2009 02:42:03 +0900 Subject: [PATCH] adding srfi-98 --- Makefile | 5 +++-- lib/srfi/98.module | 5 +++++ lib/srfi/98/env.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 lib/srfi/98.module create mode 100644 lib/srfi/98/env.c diff --git a/Makefile b/Makefile index e14d865a..e62212b5 100644 --- a/Makefile +++ b/Makefile @@ -50,7 +50,7 @@ endif all: chibi-scheme$(EXE) libs -libs: lib/srfi/69/hash$(SO) +libs: lib/srfi/69/hash$(SO) lib/srfi/98/env$(SO) ifeq ($(USE_BOEHM),1) GCLDFLAGS := -lgc @@ -92,11 +92,12 @@ chibi-scheme$(EXE): main.o libchibi-scheme$(SO) chibi-scheme-static$(EXE): main.o eval.o sexp.o $(CC) $(XCFLAGS) $(STATICFLAGS) -o $@ $^ $(XLDFLAGS) -lib/srfi/69/hash$(SO): lib/srfi/69/hash.c $(INCLUDES) +lib/srfi/%$(SO): lib/srfi/%.c $(INCLUDES) $(CC) $(CLIBFLAGS) $(XCPPFLAGS) $(XCFLAGS) -o $@ $< -L. -lchibi-scheme clean: rm -f *.o *.i *.s *.8 + find lib -name \*.$(SO) -exec rm -f '{}' \; cleaner: clean rm -f chibi-scheme$(EXE) chibi-scheme-static$(EXE) *$(SO) *.a diff --git a/lib/srfi/98.module b/lib/srfi/98.module new file mode 100644 index 00000000..55dfb45b --- /dev/null +++ b/lib/srfi/98.module @@ -0,0 +1,5 @@ + +(define-module (srfi 98) + (export get-environment-variable get-environment-variables) + (include "srfi/98/env.so")) + diff --git a/lib/srfi/98/env.c b/lib/srfi/98/env.c new file mode 100644 index 00000000..4a180421 --- /dev/null +++ b/lib/srfi/98/env.c @@ -0,0 +1,45 @@ + +#ifdef __APPLE__ +#include +#define environ (*_NSGetEnviron()) +#else +extern char **environ; +#endif + +#include + +sexp sexp_get_environment_variable (sexp ctx, sexp str) { + char *cstr; + if (! sexp_stringp(str)) + return sexp_type_exception(ctx, "get-environment-variable: not a string", str); + cstr = getenv(sexp_string_data(str)); + return cstr ? sexp_c_string(ctx, cstr, -1) : SEXP_FALSE; +} + +sexp sexp_get_environment_variables (sexp ctx) { + int i; + char **env, *cname, *cval; + sexp_gc_var3(res, name, val); + sexp_gc_preserve3(ctx, res, name, val); + res = SEXP_NULL; + env = environ; + for (i=0; env[i]; i++) { + cname = env[i]; + cval = strchr(cname, '='); + if (cval) { + name = sexp_c_string(ctx, cname, cval-cname); + val = sexp_c_string(ctx, cval+1, -1); + val = sexp_cons(ctx, name, val); + res = sexp_cons(ctx, val, res); + } + } + sexp_gc_release3(ctx); + return res; +} + +sexp sexp_init_library (sexp ctx, sexp env) { + sexp_define_foreign(ctx, env, "get-environment-variable", 1, sexp_get_environment_variable); + sexp_define_foreign(ctx, env, "get-environment-variables", 0, sexp_get_environment_variables); + return SEXP_VOID; +} +