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; }
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; }
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); } }