Пример #1
0
QueryData genProcessEnvs(QueryContext& context) {
  QueryData results;

  proc_t* proc_info;
  PROCTAB* proc = openproc(PROC_SELECTS);

  // Populate proc struc for each process.

  while ((proc_info = readproc(proc, NULL))) {
    auto env = proc_env(proc_info);
    for (auto itr = env.begin(); itr != env.end(); ++itr) {
      Row r;
      r["pid"] = INTEGER(proc_info->tid);
      r["name"] = proc_name(proc_info);
      r["path"] = proc_link(proc_info);
      r["key"] = itr->first;
      r["value"] = itr->second;
      results.push_back(r);
    }

    standard_freeproc(proc_info);
  }

  closeproc(proc);

  return results;
}
Пример #2
0
LISP_OBJ_PTR make_lambda(ENVIRONMENT_PTR env, LISP_OBJ_PTR args) {
  // this code is a bit wet, we should combine with the define function
  LISP_OBJ_PTR fun, params;
  params = car(args);
  fun = alloc_obj();
  form(fun) = PROCEDURE_FORM;
  proc_type(fun) = DERIVED;
  proc_env(fun) = env;
  proc_reqparams(fun) = params;
  proc_optparams(fun) = nil_ptr;
  proc_restparams(fun) = nil_ptr;
  proc_body(fun) = cdr(args);

  return fun;
}
Пример #3
0
LISP_OBJ_PTR define(ENVIRONMENT_PTR env, LISP_OBJ_PTR args) {
  char *var;
  LISP_OBJ_PTR to_def = car(args);
  LISP_OBJ_PTR val;
  LISP_OBJ_PTR fun, params, req_params, opt_params, rest_params;
  ENVIRONMENT_PTR fun_env;

  BOOLEAN optional = FALSE, rest = FALSE;
  switch(form(to_def)) {
  case SYMBOL_FORM:
    var = symbol_value(to_def);
    val = cadr(args);
    enter_symbol(env, var, val);
    return to_def;
  case CONS_FORM:
    var = symbol_value(car(to_def));
    val = cdr(args);
    params = cdr(to_def);
    req_params = params;
    opt_params = nil_ptr;
    rest_params = nil_ptr;
    // edge case
    if (is_pair(params) && !strcmp(symbol_value(car(params)), "&optional")) {
      req_params = nil_ptr;
      optional = TRUE;
      // giving this a try
      opt_params = cdr(params);
      cdr(params) = nil_ptr;
      params = opt_params;
    }
    else if (is_pair(params) && !strcmp(symbol_value(car(params)), "&rest")) {
      req_params = nil_ptr;
      rest = TRUE;
      rest_params = cadr(params);
    }
    while (params != nil_ptr && !optional && !rest) {
      if (is_pair(cdr(params)) && !strcmp(symbol_value(cadr(params)), "&optional")) {
        optional = TRUE;
        opt_params = cddr(params);
        cdr(params) = nil_ptr;
        params = opt_params;
        break;
      } else if (is_pair(cdr(params)) && !strcmp(symbol_value(cadr(params)), "&rest")) {
        rest = TRUE;
        rest_params = caddr(params);
        cdr(params) = nil_ptr;
        params = rest_params;
        break;
      }
      params = cdr(params);
    }
    while (optional && params != nil_ptr && !rest) {
      if (is_pair(cdr(params)) && !strcmp(symbol_value(cadr(params)), "&rest")) {
        rest = TRUE;
        rest_params = caddr(params);
        cdr(params) = nil_ptr;
        params = rest_params;
        break;
      }
      params = cdr(params);
    }
    fun = alloc_obj();
    form(fun) = PROCEDURE_FORM;
    proc_type(fun) = DERIVED;
    proc_env(fun) = env;
    proc_reqparams(fun) = req_params;
    proc_optparams(fun) = opt_params;
    proc_restparams(fun) = rest_params;
    proc_body(fun) = val;
    enter_symbol(env, var, fun);
    return car(to_def);
  }
}