summaryrefslogtreecommitdiffstats
path: root/syslog.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-02-28 23:15:10 -0800
committerKaz Kylheku <kaz@kylheku.com>2014-02-28 23:15:10 -0800
commit94750af472e12acf3a5970c98e4dab6feada2e84 (patch)
tree0f91686515e864ea184cc866c980ddc979783b0c /syslog.c
parent8c634953700bdf3199b68e8ccf2eff4132ca81d5 (diff)
downloadtxr-94750af472e12acf3a5970c98e4dab6feada2e84.tar.gz
txr-94750af472e12acf3a5970c98e4dab6feada2e84.tar.bz2
txr-94750af472e12acf3a5970c98e4dab6feada2e84.zip
Change in the design of how special variables work, to fix the broken
re-binding. C code now has to go through the dynamic environment lookup to access things like *random-state*, or *stdout*. As part of this, I'm moving some intrinsic variable and function initializations out of eval.c and into their respective modules. Macros are are used to make global variables look like ordinary C variables. This is very similar to the errno trick in POSIX threads implementations. * eval.c (looup_var, lookup_var_l): Restructured to eliminate silly goto, the cobjp handling is gone. (reg_fun, reg_var): Internal function becomes external. reg_var registers a simple cons cell binding now, without any C pointer tricks to real C global variables. (c_var_mark): Static function removed. (c_var_ops): Static struct removed. (eval_init): Numerous initializations for streams, syslog, rand, signals and others moved to their respective modules. The new symbol variables user_package_s, keyword_package_s and system_package_s are interned here, and the variables are created in a special way. * eval.h (reg_var, reg_fun): Declared. * gc.c (prot1): Added assert that the loc pointer isn't null. This happened, and blew up during garbage collection. * lib.c (system_package, keyword_package, user_package): Variables removed these become macros. (system_package_var, keyword_package_var, user_package_var): New global variables. (system_package_s, keyword_package_s, user_package_s): New symbol globals. (get_user_package, get_system_package, get_keyword_package): New functions. (obj_init): Protect new variables. Initialization order of modules tweaked: the modules sig_init, stream_init, and rand_init are moved after eval_init because they register variables. * lib.h (keyword_package, system_pckage, user_package): Variables turned into macros. (system_package_var, keyword_package_var, user_package_var): Declared. (system_package_s, keyword_package_s, user_package_s): Declared. (get_user_package, get_system_package, get_keyword_package): Declared. * rand.c (struct random_state): Renamed to struct rand_state to avoid clash with new random_state macro. (random_state): Global variable removed. (random_state_s): New symbol global. (make_state, rand32, make_random_state, random_fixnum, random): Follow rename of struct random_state.
Diffstat (limited to 'syslog.c')
-rw-r--r--syslog.c58
1 files changed, 24 insertions, 34 deletions
diff --git a/syslog.c b/syslog.c
index d252f2f9..3d8670ce 100644
--- a/syslog.c
+++ b/syslog.c
@@ -40,53 +40,43 @@
#include "signal.h"
#include "unwind.h"
#include "utf8.h"
+#include "eval.h"
#include "syslog.h"
-val log_pid_v, log_cons_v, log_ndelay_v;
-val log_odelay_v, log_nowait_v, log_perror_v;
-
-val log_user_v, log_daemon_v, log_auth_v, log_authpriv_v;
-
-val log_emerg_v, log_alert_v, log_crit_v, log_err_v;
-val log_warning_v, log_notice_v, log_info_v, log_debug_v;
-
val prio_k;
-val std_log;
-
void syslog_init(void)
{
- prot1(&std_log);
-
- log_pid_v = num(LOG_PID);
- log_cons_v = num(LOG_CONS);
- log_ndelay_v = num(LOG_NDELAY);
-
- log_odelay_v = num(LOG_ODELAY);
- log_nowait_v = num(LOG_NOWAIT);
+ reg_var(intern(lit("log-pid"), user_package), num_fast(LOG_PID));
+ reg_var(intern(lit("log-cons"), user_package), num_fast(LOG_CONS));
+ reg_var(intern(lit("log-ndelay"), user_package), num_fast(LOG_NDELAY));
+ reg_var(intern(lit("log-odelay"), user_package), num_fast(LOG_ODELAY));
+ reg_var(intern(lit("log-nowait"), user_package), num_fast(LOG_NOWAIT));
#ifdef LOG_PERROR
- log_perror_v = num(LOG_PERROR);
+ reg_var(intern(lit("log-perror"), user_package), num_fast(LOG_PERROR));
#endif
-
- log_user_v = num(LOG_USER);
- log_daemon_v = num(LOG_DAEMON);
- log_auth_v = num(LOG_AUTH);
+ reg_var(intern(lit("log-user"), user_package), num_fast(LOG_USER));
+ reg_var(intern(lit("log-daemon"), user_package), num_fast(LOG_DAEMON));
+ reg_var(intern(lit("log-auth"), user_package), num_fast(LOG_AUTH));
#ifdef LOG_AUTHPRIV
- log_authpriv_v = num(LOG_AUTHPRIV);
+ reg_var(intern(lit("log-authpriv"), user_package), num_fast(LOG_AUTHPRIV));
#endif
-
- log_emerg_v = num(LOG_EMERG);
- log_alert_v = num(LOG_ALERT);
- log_crit_v = num(LOG_CRIT);
- log_err_v = num(LOG_ERR);
- log_warning_v = num(LOG_WARNING);
- log_notice_v = num(LOG_NOTICE);
- log_info_v = num(LOG_INFO);
- log_debug_v = num(LOG_DEBUG);
+ reg_var(intern(lit("log-emerg"), user_package), num_fast(LOG_EMERG));
+ reg_var(intern(lit("log-alert"), user_package), num_fast(LOG_ALERT));
+ reg_var(intern(lit("log-crit"), user_package), num_fast(LOG_CRIT));
+ reg_var(intern(lit("log-err"), user_package), num_fast(LOG_ERR));
+ reg_var(intern(lit("log-warning"), user_package), num_fast(LOG_WARNING));
+ reg_var(intern(lit("log-notice"), user_package), num_fast(LOG_NOTICE));
+ reg_var(intern(lit("log-info"), user_package), num_fast(LOG_INFO));
+ reg_var(intern(lit("log-debug"), user_package), num_fast(LOG_DEBUG));
+ reg_fun(intern(lit("openlog"), user_package), func_n3o(openlog_wrap, 1));
+ reg_fun(intern(lit("closelog"), user_package), func_n0(closelog_wrap));
+ reg_fun(intern(lit("setlogmask"), user_package), func_n1(setlogmask_wrap));
+ reg_fun(intern(lit("syslog"), user_package), func_n2v(syslog_wrap));
prio_k = intern(lit("prio"), keyword_package);
- std_log = make_syslog_stream(log_info_v);
+ reg_var(intern(lit("*stdlog*"), user_package), make_syslog_stream(num_fast(LOG_INFO)));
}
val openlog_wrap(val wident, val optmask, val facility)