mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-07-10 22:47:33 +02:00
adding srfi-98
This commit is contained in:
parent
671b983214
commit
cca25351fe
3 changed files with 53 additions and 2 deletions
5
Makefile
5
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
|
||||
|
|
5
lib/srfi/98.module
Normal file
5
lib/srfi/98.module
Normal file
|
@ -0,0 +1,5 @@
|
|||
|
||||
(define-module (srfi 98)
|
||||
(export get-environment-variable get-environment-variables)
|
||||
(include "srfi/98/env.so"))
|
||||
|
45
lib/srfi/98/env.c
Normal file
45
lib/srfi/98/env.c
Normal file
|
@ -0,0 +1,45 @@
|
|||
|
||||
#ifdef __APPLE__
|
||||
#include <crt_externs.h>
|
||||
#define environ (*_NSGetEnviron())
|
||||
#else
|
||||
extern char **environ;
|
||||
#endif
|
||||
|
||||
#include <chibi/eval.h>
|
||||
|
||||
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;
|
||||
}
|
||||
|
Loading…
Add table
Reference in a new issue