From 61935bd866acb18902199bc4bc4cdd1760aa1ffc Mon Sep 17 00:00:00 2001 From: Lassi Kortela Date: Sun, 2 Aug 2020 23:23:15 +0300 Subject: [PATCH] Add preliminaty process-state-as-bytevectors code --- c/env.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++--- c/libraries.c | 15 ++++++++++-- c/scheme.h | 9 +++++-- 3 files changed, 84 insertions(+), 8 deletions(-) diff --git a/c/env.c b/c/env.c index 331e1ae..33277ef 100644 --- a/c/env.c +++ b/c/env.c @@ -10,6 +10,9 @@ #include #include +#include // TODO: Unix only +extern char **environ; // TODO: Unix only + #include "scheme.h" #define BITSIZEOF(t) (sizeof(t) * CHAR_BIT) @@ -359,17 +362,74 @@ value_t builtin_command_line(value_t *args, uint32_t nargs) return fl_cons(cmdname, cmdargs); } -value_t builtin_os_command_line(value_t *args, uint32_t nargs) +// + +value_t builtin_os_current_directory_as_bytevector(value_t *args, + uint32_t nargs) { (void)args; - argcount("os-command-line", nargs, 0); + argcount("os-current-directory-as-bytevector", nargs, 0); + return string_from_cstr(getcwd(NULL, 0)); +} + +value_t builtin_os_environment_variable_as_bytevector(value_t *args, + uint32_t nargs) +{ + argcount("os-environment-variable-as-bytevector", nargs, 1); + char *name = tostring(args[0], "os-environment-variable-as-bytevector"); + const char *value = getenv(name); + return value ? string_from_cstr(value) : FL_F; +} + +value_t builtin_os_environment_variables_as_bytevectors(value_t *args, + uint32_t nargs) +{ + char **varp; + const char *var; + const char *sep; + value_t head, tail, newtail; + + (void)args; + argcount("os-environment-variables-as-bytevectors", nargs, 0); + head = tail = newtail = FL_NIL; + fl_gc_handle(&head); + fl_gc_handle(&tail); + fl_gc_handle(&newtail); + head = tail = fl_cons(FL_NIL, FL_NIL); + for (varp = environ; (var = *varp); varp++) { + if ((sep = strchr(var, '='))) { + newtail = fl_cons(string_from_cstrn(var, sep - var), + string_from_cstr(sep + 1)); + } else { + newtail = fl_cons(string_from_cstr(var), FL_NIL); + } + newtail = fl_cons(newtail, FL_NIL); + cdr_(tail) = newtail; + tail = newtail; + } + fl_free_gc_handles(3); + return cdr_(head); +} + +value_t builtin_os_command_line_as_bytevector(value_t *args, uint32_t nargs) +{ + (void)args; + argcount("os-command-line-as-bytevector", nargs, 0); + return FL_F; +} + +value_t builtin_os_command_line_as_bytevectors(value_t *args, uint32_t nargs) +{ + (void)args; + argcount("os-command-line-as-bytevectors", nargs, 0); return os_command_line; } -value_t builtin_os_executable_file(value_t *args, uint32_t nargs) +value_t builtin_os_executable_file_as_bytevector(value_t *args, + uint32_t nargs) { (void)args; - argcount("os-executable-file", nargs, 0); + argcount("os-executable-file-as-bytevector", nargs, 0); char buf[512]; char *exe = get_exename(buf, sizeof(buf)); return exe ? string_from_cstr(exe) : FL_F; diff --git a/c/libraries.c b/c/libraries.c index 37ee2e2..969841a 100644 --- a/c/libraries.c +++ b/c/libraries.c @@ -68,8 +68,6 @@ static struct builtin_procedure builtin_procedures[] = { { "command-name", builtin_command_name, UP_2019 }, { "command-args", builtin_command_args, UP_2019 }, { "command-line", builtin_command_line, UP_2019 }, - { "os-command-line", builtin_os_command_line, UP_2019 }, - { "os-executable-file", builtin_os_executable_file, UP_2019 }, { "string?", fl_stringp, SRFI_13 | R7RS_BASE | UP_2019 }, { "string-reverse", fl_string_reverse, SRFI_13 | UP_2019 }, @@ -109,6 +107,19 @@ static struct builtin_procedure builtin_procedures[] = { { "set-environment-variable", builtin_set_environment_variable, R7RS_PROCESS_CONTEXT | UP_2019 }, + { "os-current-directory-as-bytevector", + builtin_os_current_directory_as_bytevector, UP_2019 }, + { "os-environment-variable-as-bytevector", + builtin_os_environment_variable_as_bytevector, UP_2019 }, + { "os-environment-variables-as-bytevectors", + builtin_os_environment_variables_as_bytevectors, UP_2019 }, + { "os-command-line-as-bytevector", builtin_os_command_line_as_bytevector, + UP_2019 }, + { "os-command-line-as-bytevectors", + builtin_os_command_line_as_bytevectors, UP_2019 }, + { "os-executable-file-as-bytevector", + builtin_os_executable_file_as_bytevector, UP_2019 }, + { "ascii-codepoint?", builtin_ascii_codepoint_p, SRFI_175 | UP_2019 }, //{ "ascii-bytevector?", builtin_ascii_bytevector_p, SRFI_175 | UP_2019 }, { "ascii-char?", builtin_ascii_char_p, SRFI_175 | UP_2019 }, diff --git a/c/scheme.h b/c/scheme.h index af6d9ba..140904f 100644 --- a/c/scheme.h +++ b/c/scheme.h @@ -1015,8 +1015,13 @@ value_t builtin_script_directory(value_t *args, uint32_t nargs); value_t builtin_command_name(value_t *args, uint32_t nargs); value_t builtin_command_args(value_t *args, uint32_t nargs); value_t builtin_command_line(value_t *args, uint32_t nargs); -value_t builtin_os_command_line(value_t *args, uint32_t nargs); -value_t builtin_os_executable_file(value_t *args, uint32_t nargs); + +value_t builtin_os_current_directory_as_bytevector(value_t *args, uint32_t nargs); +value_t builtin_os_environment_variable_as_bytevector(value_t *args, uint32_t nargs); +value_t builtin_os_environment_variables_as_bytevectors(value_t *args, uint32_t nargs); +value_t builtin_os_command_line_as_bytevector(value_t *args, uint32_t nargs); +value_t builtin_os_command_line_as_bytevectors(value_t *args, uint32_t nargs); +value_t builtin_os_executable_file_as_bytevector(value_t *args, uint32_t nargs); // env_*.c