diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-02-28 23:15:10 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-02-28 23:15:10 -0800 |
commit | 94750af472e12acf3a5970c98e4dab6feada2e84 (patch) | |
tree | 0f91686515e864ea184cc866c980ddc979783b0c /syslog.c | |
parent | 8c634953700bdf3199b68e8ccf2eff4132ca81d5 (diff) | |
download | txr-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.c | 58 |
1 files changed, 24 insertions, 34 deletions
@@ -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) |