;;;; Cyclone Scheme
;;;; https://github.com/justinethier/cyclone
;;;;
;;;; Copyright (c) 2014-2016, Justin Ethier
;;;; All rights reserved.
;;;;
;;;; This module contains the process-context r7rs.
;;;;
(define-library (scheme process-context)
  (export 
    command-line
    ;exit - not needed because already defined as a primitive, at least for now
    emergency-exit
    get-environment-variable
    get-environment-variables
  )
  (begin
    (define emergency-exit exit)
    (define-c command-line
      "(void *data, int argc, closure _, object k)"
      ;; TODO: consolidate with Cyc_command_line_arguments from runtime.c
      " int i;
        object lis = NULL;
        for (i = _cyc_argc; i > 0; i--) {
          object ps = alloca(sizeof(string_type));
          object pl = alloca(sizeof(pair_type));
          make_utf8_string(data, s, _cyc_argv[i - 1]);
          memcpy(ps, &s, sizeof(string_type));
          ((list)pl)->hdr.mark = gc_color_red;
          ((list)pl)->hdr.grayed = 0;
          ((list)pl)->tag = pair_tag;
          ((list)pl)->pair_car = ps;
          ((list)pl)->pair_cdr = lis;
          lis = pl;
        }
        return_closcall1(data, k, lis); ")
    (define-c get-environment-variable
      "(void *data, int argc, closure _, object k, object env_var)"
      ;; TODO: consolidate with Cyc_command_line_arguments from runtime.c
      " 
        const char *v = NULL;
        Cyc_check_str(data, env_var);
        v = getenv(string_str(env_var));
        if (v == NULL) {
          return_closcall1(data, k, boolean_f);
        } else {
          make_utf8_string(data, str, v);
          return_closcall1(data, k, &str);
        }
      ")
    (define-c get-environment-variables
      "(void *data, int argc, closure _, object k)"
      "pack_env_variables(data, k); 
      ")
  ))