add system.c
This commit is contained in:
parent
7dbb2c6de4
commit
adab797391
|
@ -17,6 +17,9 @@ typedef struct pic_callinfo {
|
||||||
} pic_callinfo;
|
} pic_callinfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
int argc;
|
||||||
|
char **argv, **envp;
|
||||||
|
|
||||||
pic_value *sp;
|
pic_value *sp;
|
||||||
pic_value *stbase, *stend;
|
pic_value *stbase, *stend;
|
||||||
|
|
||||||
|
@ -56,7 +59,7 @@ void pic_gc_protect(pic_state *, pic_value);
|
||||||
int pic_gc_arena_preserve(pic_state *);
|
int pic_gc_arena_preserve(pic_state *);
|
||||||
void pic_gc_arena_restore(pic_state *, int);
|
void pic_gc_arena_restore(pic_state *, int);
|
||||||
|
|
||||||
pic_state *pic_open();
|
pic_state *pic_open(int argc, char *argv[], char **envp);
|
||||||
void pic_close(pic_state *);
|
void pic_close(pic_state *);
|
||||||
|
|
||||||
void pic_get_args(pic_state *, const char *, ...);
|
void pic_get_args(pic_state *, const char *, ...);
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
void pic_init_port(pic_state *);
|
void pic_init_port(pic_state *);
|
||||||
void pic_init_number(pic_state *);
|
void pic_init_number(pic_state *);
|
||||||
void pic_init_time(pic_state *);
|
void pic_init_time(pic_state *);
|
||||||
|
void pic_init_system(pic_state *);
|
||||||
|
|
||||||
#define DONE pic_gc_arena_restore(pic, ai);
|
#define DONE pic_gc_arena_restore(pic, ai);
|
||||||
|
|
||||||
|
@ -15,4 +16,5 @@ pic_init_core(pic_state *pic)
|
||||||
pic_init_port(pic); DONE;
|
pic_init_port(pic); DONE;
|
||||||
pic_init_number(pic); DONE;
|
pic_init_number(pic); DONE;
|
||||||
pic_init_time(pic); DONE;
|
pic_init_time(pic); DONE;
|
||||||
|
pic_init_system(pic); DONE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,13 +35,18 @@ sym_tbl_new()
|
||||||
void pic_init_core(pic_state *);
|
void pic_init_core(pic_state *);
|
||||||
|
|
||||||
pic_state *
|
pic_state *
|
||||||
pic_open()
|
pic_open(int argc, char *argv[], char **envp)
|
||||||
{
|
{
|
||||||
pic_state *pic;
|
pic_state *pic;
|
||||||
int ai;
|
int ai;
|
||||||
|
|
||||||
pic = (pic_state *)malloc(sizeof(pic_state));
|
pic = (pic_state *)malloc(sizeof(pic_state));
|
||||||
|
|
||||||
|
/* command line */
|
||||||
|
pic->argc = argc;
|
||||||
|
pic->argv = argv;
|
||||||
|
pic->envp = envp;
|
||||||
|
|
||||||
/* prepare VM stack */
|
/* prepare VM stack */
|
||||||
pic->stbase = pic->sp = (pic_value *)malloc(sizeof(pic_value) * PIC_STACK_SIZE);
|
pic->stbase = pic->sp = (pic_value *)malloc(sizeof(pic_value) * PIC_STACK_SIZE);
|
||||||
pic->stend = pic->stbase + PIC_STACK_SIZE;
|
pic->stend = pic->stbase + PIC_STACK_SIZE;
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "picrin.h"
|
||||||
|
#include "picrin/pair.h"
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_system_cmdline(pic_state *pic)
|
||||||
|
{
|
||||||
|
pic_value v = pic_nil_value();
|
||||||
|
int i;
|
||||||
|
|
||||||
|
pic_get_args(pic, "");
|
||||||
|
|
||||||
|
for (i = 0; i < pic->argc; ++i) {
|
||||||
|
int ai = pic_gc_arena_preserve(pic);
|
||||||
|
|
||||||
|
v = pic_cons(pic, pic_str_new_cstr(pic, pic->argv[i]), v);
|
||||||
|
pic_gc_arena_restore(pic, ai);
|
||||||
|
}
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_system_getenv(pic_state *pic)
|
||||||
|
{
|
||||||
|
char *str, *val;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
pic_get_args(pic, "s", &str, &len);
|
||||||
|
|
||||||
|
val = getenv(str);
|
||||||
|
|
||||||
|
return pic_str_new_cstr(pic, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_system_getenvs(pic_state *pic)
|
||||||
|
{
|
||||||
|
char **envp;
|
||||||
|
pic_value data = pic_nil_value();
|
||||||
|
int ai = pic_gc_arena_preserve(pic);
|
||||||
|
|
||||||
|
pic_get_args(pic, "");
|
||||||
|
|
||||||
|
for (envp = pic->envp; *envp; ++envp) {
|
||||||
|
pic_value key, val;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; (*envp)[i] != '='; ++i)
|
||||||
|
;
|
||||||
|
|
||||||
|
key = pic_str_new(pic, *envp, i);
|
||||||
|
val = pic_str_new_cstr(pic, getenv(*envp));
|
||||||
|
|
||||||
|
/* push */
|
||||||
|
data = pic_acons(pic, key, val, data);
|
||||||
|
|
||||||
|
pic_gc_arena_restore(pic, ai);
|
||||||
|
pic_gc_protect(pic, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pic_init_system(pic_state *pic)
|
||||||
|
{
|
||||||
|
pic_defun(pic, "command-line", pic_system_cmdline);
|
||||||
|
pic_defun(pic, "get-environment-variable", pic_system_getenv);
|
||||||
|
pic_defun(pic, "get-environment-variables", pic_system_getenvs);
|
||||||
|
}
|
|
@ -13,7 +13,7 @@
|
||||||
#define LINE_MAX_LENGTH 256
|
#define LINE_MAX_LENGTH 256
|
||||||
|
|
||||||
int
|
int
|
||||||
main()
|
main(int argc, char *argv[], char **envp)
|
||||||
{
|
{
|
||||||
pic_state *pic;
|
pic_state *pic;
|
||||||
char code[CODE_MAX_LENGTH] = "", line[LINE_MAX_LENGTH];
|
char code[CODE_MAX_LENGTH] = "", line[LINE_MAX_LENGTH];
|
||||||
|
@ -28,7 +28,7 @@ main()
|
||||||
int char_index;
|
int char_index;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pic = pic_open();
|
pic = pic_open(argc, argv, envp);
|
||||||
|
|
||||||
ai = pic_gc_arena_preserve(pic);
|
ai = pic_gc_arena_preserve(pic);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue