summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2013-12-10 08:07:33 -0800
committerKaz Kylheku <kaz@kylheku.com>2013-12-10 08:07:33 -0800
commitb698bb706067d911c62385b477684efea6aa983a (patch)
tree09596eeefba83198a549c01d22497a07bc8d97d3
parent434ea4f4ce65a553205f4030a6b98268ff938f0f (diff)
downloadtxr-b698bb706067d911c62385b477684efea6aa983a.tar.gz
txr-b698bb706067d911c62385b477684efea6aa983a.tar.bz2
txr-b698bb706067d911c62385b477684efea6aa983a.zip
syslog support; bitwise logior and logand functions become variadic.
* Makefile: Use -iquote to restrict our #include search paths from being processed for #include <...>. Add syslog.o to OBJS-y if have_syslog is y. * configure (have_syslog): New variable, set by detecting syslog API. * eval.c (eval_init): logand and logior registrations changed to go to variadic versions. New syslog variables and functions registered. * lib.c (logandv, logiorv): New functions. * lib.h (logandv, logiorv): Declared. * txr.c (main): Call syslog_init. * syslog.c: New file. * syslog.h: New file. * txr.1: Updated. * txr.vim: Regenerated.
-rw-r--r--ChangeLog9
-rw-r--r--arith.c13
-rw-r--r--eval.c13
-rw-r--r--lib.h1
-rw-r--r--stream.c21
-rw-r--r--stream.h21
-rw-r--r--syslog.c120
-rw-r--r--syslog.h5
-rw-r--r--txr.1144
-rw-r--r--txr.vim168
10 files changed, 406 insertions, 109 deletions
diff --git a/ChangeLog b/ChangeLog
index d4ee20ce..0274738b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,8 +2,9 @@
syslog support; bitwise logior and logand functions become variadic.
- * Makefile: Use -iquote to restrict our #include search paths from being
- processed for #include <...>. Add syslog.o to OBJS-y if have_syslog is y.
+ * Makefile: Use -iquote to restrict our #include search paths from
+ being processed for #include <...>. Add syslog.o to OBJS-y if
+ have_syslog is y.
* configure (have_syslog): New variable, set by detecting syslog API.
@@ -20,6 +21,10 @@
* syslog.h: New file.
+ * txr.1: Updated.
+
+ * txr.vim: Regenerated.
+
2013-12-07 Kaz Kylheku <kaz@kylheku.com>
Version 71
diff --git a/arith.c b/arith.c
index b1ae1677..a49fdf0c 100644
--- a/arith.c
+++ b/arith.c
@@ -1803,6 +1803,19 @@ bad3:
uw_throwf(error_s, lit("ashift: non-integral operand ~s"), a, nao);
}
+val maskv(val bits)
+{
+ val accum = zero;
+
+ for (; bits; bits = cdr(bits)) {
+ val num = car(bits);
+ val mask = ash(one, num);
+ accum = logior(accum, mask);
+ }
+
+ return accum;
+}
+
void arith_init(void)
{
mp_init(&NUM_MAX_MP);
diff --git a/eval.c b/eval.c
index 052ad450..2184ffc3 100644
--- a/eval.c
+++ b/eval.c
@@ -36,6 +36,9 @@
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
+#ifdef HAVE_SYSLOG
+#include <syslog.h>
+#endif
#include "lib.h"
#include "gc.h"
#include "unwind.h"
@@ -48,7 +51,9 @@
#include "rand.h"
#include "filter.h"
#include "txr.h"
+#ifdef HAVE_SYSLOG
#include "syslog.h"
+#endif
#include "eval.h"
typedef val (*opfun_t)(val, val);
@@ -2307,6 +2312,7 @@ void eval_init(void)
reg_fun(intern(lit("lognot"), user_package), func_n2o(lognot, 1));
reg_fun(intern(lit("logtrunc"), user_package), func_n2(logtrunc));
reg_fun(intern(lit("ash"), user_package), func_n2(ash));
+ reg_fun(intern(lit("mask"), user_package), func_n0v(maskv));
reg_fun(intern(lit("regex-compile"), user_package), func_n2o(regex_compile, 1));
reg_fun(intern(lit("regexp"), user_package), func_n1(regexp));
@@ -2354,6 +2360,9 @@ void eval_init(void)
reg_var(intern(lit("*stdin*"), user_package), &std_input);
reg_var(intern(lit("*stderr*"), user_package), &std_error);
reg_var(intern(lit("*stdnull*"), user_package), &std_null);
+#ifdef HAVE_SYSLOG
+ reg_var(intern(lit("*stdlog*"), user_package), &std_log);
+#endif
reg_fun(intern(lit("format"), user_package), func_n2v(formatv));
reg_fun(intern(lit("print"), user_package), func_n2o(obj_print, 1));
reg_fun(intern(lit("pprint"), user_package), func_n2o(obj_pprint, 1));
@@ -2560,15 +2569,15 @@ void eval_init(void)
reg_fun(intern(lit("errno"), user_package), func_n1o(errno_wrap, 0));
reg_fun(intern(lit("daemon"), user_package), func_n2(daemon_wrap));
- reg_var(intern(lit("s-ixoth"), user_package), &s_ixoth);
-
#if HAVE_SYSLOG
reg_var(intern(lit("log-pid"), user_package), &log_pid_v);
reg_var(intern(lit("log-cons"), user_package), &log_cons_v);
reg_var(intern(lit("log-ndelay"), user_package), &log_ndelay_v);
reg_var(intern(lit("log-odelay"), user_package), &log_odelay_v);
reg_var(intern(lit("log-nowait"), user_package), &log_nowait_v);
+#ifdef LOG_PERROR
reg_var(intern(lit("log-perror"), user_package), &log_perror_v);
+#endif
reg_var(intern(lit("log-user"), user_package), &log_user_v);
reg_var(intern(lit("log-daemon"), user_package), &log_daemon_v);
reg_var(intern(lit("log-auth"), user_package), &log_auth_v);
diff --git a/lib.h b/lib.h
index c12690cc..d8656b07 100644
--- a/lib.h
+++ b/lib.h
@@ -490,6 +490,7 @@ val logtest(val, val);
val lognot(val, val);
val logtrunc(val a, val bits);
val ash(val a, val bits);
+val maskv(val bits);
val string_own(wchar_t *str);
val string(const wchar_t *str);
val string_utf8(const char *str);
diff --git a/stream.c b/stream.c
index e4d4fc91..66dc5c30 100644
--- a/stream.c
+++ b/stream.c
@@ -65,27 +65,6 @@ val s_ifchr, s_ififo, s_isuid, s_isgid, s_isvtx, s_irwxu;
val s_irusr, s_iwusr, s_ixusr, s_irwxg, s_irgrp, s_iwgrp;
val s_ixgrp, s_irwxo, s_iroth, s_iwoth, s_ixoth;
-enum strm_whence {
- strm_start = SEEK_SET,
- strm_cur = SEEK_CUR,
- strm_end = SEEK_SET
-};
-
-struct strm_ops {
- struct cobj_ops cobj_ops;
- val (*put_string)(val, val);
- val (*put_char)(val, val);
- val (*put_byte)(val, int);
- val (*get_line)(val);
- val (*get_char)(val);
- val (*get_byte)(val);
- val (*close)(val, val);
- val (*flush)(val);
- val (*seek)(val, cnum, enum strm_whence);
- val (*get_prop)(val, val ind);
- val (*set_prop)(val, val ind, val);
-};
-
static void common_destroy(val obj)
{
(void) close_stream(obj, nil);
diff --git a/stream.h b/stream.h
index 604a5e78..4b4bd40e 100644
--- a/stream.h
+++ b/stream.h
@@ -24,6 +24,27 @@
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
+enum strm_whence {
+ strm_start = SEEK_SET,
+ strm_cur = SEEK_CUR,
+ strm_end = SEEK_SET
+};
+
+struct strm_ops {
+ struct cobj_ops cobj_ops;
+ val (*put_string)(val, val);
+ val (*put_char)(val, val);
+ val (*put_byte)(val, int);
+ val (*get_line)(val);
+ val (*get_char)(val);
+ val (*get_byte)(val);
+ val (*close)(val, val);
+ val (*flush)(val);
+ val (*seek)(val, cnum, enum strm_whence);
+ val (*get_prop)(val, val ind);
+ val (*set_prop)(val, val ind, val);
+};
+
extern val std_input, std_output, std_debug, std_error, std_null;
extern val output_produced;
diff --git a/syslog.c b/syslog.c
index 6ab5826c..3ae0d137 100644
--- a/syslog.c
+++ b/syslog.c
@@ -49,15 +49,23 @@ val log_user_v, log_daemon_v, log_auth_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);
+#ifdef LOG_PERROR
log_perror_v = num(LOG_PERROR);
+#endif
log_user_v = num(LOG_USER);
log_daemon_v = num(LOG_DAEMON);
@@ -71,6 +79,10 @@ void syslog_init(void)
log_notice_v = num(LOG_NOTICE);
log_info_v = num(LOG_INFO);
log_debug_v = num(LOG_DEBUG);
+
+ prio_k = intern(lit("prio"), keyword_package);
+
+ std_log = make_syslog_stream(log_info_v);
}
val openlog_wrap(val wident, val optmask, val facility)
@@ -99,3 +111,111 @@ val syslog_wrap(val prio, val fmt, val args)
syslog(c_num(prio), "%s", u8text);
return nil;
}
+
+static void syslog_mark(val stream)
+{
+ val stuff = (val) stream->co.handle;
+ gc_mark(stuff);
+}
+
+static val syslog_put_string(val stream, val str)
+{
+ val cell = (val) stream->co.handle;
+ cons_bind (prio, strstream, cell);
+
+ for (;;) {
+ val length = length_str(str);
+ val span_to_newline = compl_span_str(str, lit("\n"));
+
+ if (zerop(length))
+ break;
+
+ put_string(sub_str(str, nil, span_to_newline), strstream);
+
+ if (equal(span_to_newline, length))
+ break;
+
+ str = sub_str(str, plus(span_to_newline, num(1)), nil);
+ syslog_wrap(prio, lit("~a"), list(get_string_from_stream(strstream), nao));
+ strstream = make_string_output_stream();
+ }
+
+ set(*cdr_l(cell), strstream);
+ return t;
+}
+
+static val syslog_put_char(val stream, val ch)
+{
+ val cell = (val) stream->co.handle;
+ cons_bind (prio, strstream, cell);
+
+ if (ch == chr('\n')) {
+ syslog_wrap(prio, lit("~a"), list(get_string_from_stream(strstream), nao));
+ strstream = make_string_output_stream();
+ } else {
+ put_char(ch, strstream);
+ }
+
+ set(*cdr_l(cell), strstream);
+ return t;
+}
+
+static val syslog_put_byte(val stream, int ch)
+{
+ val cell = (val) stream->co.handle;
+ cons_bind (prio, strstream, cell);
+
+ if (ch == '\n') {
+ syslog_wrap(prio, lit("~a"), list(get_string_from_stream(strstream), nao));
+ strstream = make_string_output_stream();
+ } else {
+ put_byte(num(ch), strstream);
+ }
+
+ set(*cdr_l(cell), strstream);
+ return t;
+}
+
+static val syslog_get_prop(val stream, val ind)
+{
+ if (ind == real_time_k) {
+ val cell = (val) stream->co.handle;
+ return car(cell);
+ }
+ return nil;
+}
+
+static val syslog_set_prop(val stream, val ind, val prop)
+{
+ if (ind == prio_k) {
+ val cell = (val) stream->co.handle;
+ set(*car_l(cell), prop);
+ return t;
+ }
+ return nil;
+}
+
+static struct strm_ops syslog_strm_ops = {
+ { cobj_equal_op,
+ cobj_print_op,
+ cobj_destroy_stub_op,
+ syslog_mark,
+ cobj_hash_op },
+ syslog_put_string,
+ syslog_put_char,
+ syslog_put_byte,
+ 0, /* get_line */
+ 0, /* get_char */
+ 0, /* get_byte */
+ 0, /* close */
+ 0, /* flush */
+ 0, /* seek */
+ syslog_get_prop,
+ syslog_set_prop
+};
+
+val make_syslog_stream(val prio)
+{
+ return cobj((mem_t *) cons(prio, make_string_output_stream()),
+ stream_s, &syslog_strm_ops.cobj_ops);
+}
diff --git a/syslog.h b/syslog.h
index 2bc214cc..be530c06 100644
--- a/syslog.h
+++ b/syslog.h
@@ -33,7 +33,12 @@ extern val log_user_v, log_daemon_v, log_auth_v;
extern val log_emerg_v, log_alert_v, log_crit_v, log_err_v;
extern val log_warning_v, log_notice_v, log_info_v, log_debug_v;
+extern val prio_k;
+
+extern val std_log;
+
void syslog_init(void);
val openlog_wrap(val ident, val optmask, val facility);
val setlogmask_wrap(val mask);
val syslog_wrap(val prio, val fmt, val args);
+val make_syslog_stream(val prio);
diff --git a/txr.1 b/txr.1
index 45af8c30..4e0799b4 100644
--- a/txr.1
+++ b/txr.1
@@ -9139,15 +9139,15 @@ a limit on the number of bits.
.TP
Syntax:
- (logand <int1> <int2>)
- (logior <int1> <int2>)
+ (logand . <integers>)
+ (logior . <integers>)
(logxor <int1> <int2>)
.TP
Description:
These operations perform the familiar bitwise and, inclusive or, and exclusive
-or operations respectively. Positive values of <int1> and <int2> are treated as
+or operations respectively. Positive values inputs are treated as
pure binary numbers. Negative inputs are treated as infinite-bit
two's-complement.
@@ -9155,6 +9155,13 @@ For example (logand -2 7) produces 6. This is because -2 is ..111110 in
infinite-bit two's-complement. Or-ing this value with 7 (111) produces
110.
+The logand and logior functions are variadic, and may be called with zero, one,
+two, or more input values. If logand is called with no arguments, it produces
+the value -1 (all bits 1). If logior is called with no arguments it produces
+zero. In the one-argument case, the functions just return their argument value.
+
+
+
.SS Functions logtest
.TP
@@ -9221,6 +9228,36 @@ a right shift does not exhaust the infinite sequence of 1 digits which
extends to the left. Thus if -4 is shifted right it becomes -2 because
the bitwise representations are ...111100 and ...11110.
+.SS Function mask
+
+.TP
+Syntax:
+
+ (mask . <integer-values>)
+
+.TP
+Description:
+
+The mask function takes zero or more integer arguments, and produces an integer
+value which corresponds a bitmask made up of the bit positions specified by the
+integer values.
+
+If mask is called with no arguments, then the return value is zero.
+
+If mask is called with a single argument B then the return value is the same as
+that of the expression (ash 1 <value>): one shifted left by <value> bit
+positions. If <value> is zero, then the result is 1; if <value> is 1, the
+result is 2 and so forth. If <value> is negative, then the result is zero.
+
+If mask is called with two or more arguments, then the result is a bitwise of
+the masks individually computed for each of the values.
+
+In other words, the following equivalences hold:
+
+ (mask) == 0
+ (mask a) == (ash 1 a)
+ (mask a b c ...) == (logior (mask a) (mask b) (mask c) ...)
+
.SH EXCEPTIONS
.SS Functions throw, throwf and error
@@ -10916,6 +10953,107 @@ This is a wrapper for the Unix function daemon of BSD origin.
It returns t if successful, nil otherwise, and the errno
variable is set in that case.
+.SH UNIX SYSLOG
+
+On platforms where a Unix-like syslog API is available, TXR exports this
+interface. TXR programs can configure logging via the openlog function,
+control the loging mask via setlogmask and generate logs vis syslog,
+or using special syslog streams.
+
+.SS Variables log-pid, log-cons, log-ndelay, log-odelay, log-nowait and log-perror
+
+These variables take on the values of the corresponding C preprocessor
+constants from the <syslog.h> header: LOG_PID, LOG_CONS, etc. These
+integer values represent logging options used in the option argument to the
+openlog function.
+
+.SS Variables log-user, log-daemon and log-auth
+
+These variables take on the values of the corresponding C preprocessor
+constants from the <syslog.h> header: LOG_USER, LOG_DAEMON, and LOG_AUTH.
+These are the integer facility codes specified in the openlog function.
+
+.SS Variables log-emerg, log-alert, log-crit, log-err, log-warning, log-notice, log-info and log-debug
+
+These variables take on the values of the corresponding C preprocessor
+constants from the <syslog.h> header: LOG_EMERG, LOG_ALERT, etc.
+These are the integer priority codes specified in the syslog call.
+
+.SS The *stdlog* variable holds a special kind of stream: a syslog stream.
+Each newline-terminated line of text sent to this stream becomes a log
+message. The stream internally maintains a priority value that is applied
+when it generates messages. By default, this value is that of log-info.
+Note that messages generated via the openlog function are not newline
+terminated; this is a convention of the syslog stream. The newline characters
+written to the syslog stream are only used to recognize the message framing,
+and are not sent to syslog.
+
+.SS The openlog function
+
+.TP
+Syntax:
+
+ (openlog <id-string> : <options> <facility>)
+
+.TP
+Description:
+
+The openlog TXR Lisp function is a wrapper for the openlog C function, and the
+arguments have the same semantics. It is not necessary to use openlog in order
+to call the syslog function or to write data to *stdlog*. The call is necessary
+in order to override the default identifying string, to set options, such
+ashaving the PID (process ID) recorded in log messages, and to specify the facility.
+
+The <id-string> argument is manadatory.
+
+The <options> argument is a bitwise mask (see the logior function) of option
+values such as log-pid and log-cons. If it is missing, then a value of 0 is
+used, specifying the absence of any options.
+
+The <facility> argument is one of the values log-user, log-daemon or log-auth.
+If it is missing, then log-user is assumed.
+
+.SS The setlogmask function
+
+.TP
+Syntax:
+
+ (setlogmask <bitmask-integer>)
+
+.TP
+Description:
+
+The setlogmask function interfaces to the corresponding C function, and has the
+same argument and return value semantics. The argument is a mask of priority
+values to enable. The return value is the prior value. Note that if the
+argument is zero, then the function doesn't set the mask to zero; it only
+returns the current value of the mask.
+
+Note that the priority values like log-emerg and log-debug are integer
+enumerations, not bitmasks. These values cannot be combined directly to create
+a bitmask. Rather, the mask function should be used on these values.
+
+.TP
+Example:
+
+ ;; Enable LOG_EMERG and LOG_ALERT messages, suppressing all others
+ (setlogmask (mask log-emerg log-alert))
+
+
+.SS The syslog function
+
+.TP
+Syntax:
+
+ (syslog <priority> <format> . <args>)
+
+.TP
+Description:
+
+This function is the interface to the syslog C function. The printf formatting
+capabilities of the function are not used; it follows the conventions of the
+TXR Lisp format function instead. Note in particular that %m for interpolating
+the value of strerror(errno) is currenly not supported.
.SH WEB PROGRAMMING SUPPORT
diff --git a/txr.vim b/txr.vim
index 4771aa38..185159cb 100644
--- a/txr.vim
+++ b/txr.vim
@@ -33,93 +33,99 @@ syn keyword txr_keyword contained skip some text throw
syn keyword txr_keyword contained trailer try var
syn keyword txl_keyword contained * *keyword-package* *random-state* *self-path*
-syn keyword txl_keyword contained *stddebug* *stderr* *stdin* *stdout*
-syn keyword txl_keyword contained *system-package* *user-package* + -
-syn keyword txl_keyword contained / /= < <=
-syn keyword txl_keyword contained = > >= abs
-syn keyword txl_keyword contained acons acons-new aconsql-new acos
-syn keyword txl_keyword contained alist-nremove alist-remove all and
-syn keyword txl_keyword contained andf append append* apply
-syn keyword txl_keyword contained ash asin assoc assql
-syn keyword txl_keyword contained atan atom bignump block
-syn keyword txl_keyword contained break-str call car cat-str
-syn keyword txl_keyword contained cat-vec catch cdr ceil
-syn keyword txl_keyword contained chain chr-isalnum chr-isalpha chr-isascii
-syn keyword txl_keyword contained chr-iscntrl chr-isdigit chr-isgraph chr-islower
-syn keyword txl_keyword contained chr-isprint chr-ispunct chr-isspace chr-isupper
-syn keyword txl_keyword contained chr-isxdigit chr-num chr-str chr-str-set
-syn keyword txl_keyword contained chr-tolower chr-toupper chrp close-stream
-syn keyword txl_keyword contained collect-each collect-each* compl-span-str cond
-syn keyword txl_keyword contained cons consp copy-alist copy-cons
-syn keyword txl_keyword contained copy-hash copy-list copy-str copy-vec
-syn keyword txl_keyword contained cos count-if countq countql
-syn keyword txl_keyword contained countqual daemon dec defun
-syn keyword txl_keyword contained defvar del delete-package dohash
-syn keyword txl_keyword contained downcase-str dwim each each*
-syn keyword txl_keyword contained eq eql equal errno
-syn keyword txl_keyword contained error eval evenp exp
-syn keyword txl_keyword contained expt exptmod fifth find
-syn keyword txl_keyword contained find-if find-package first fixnump
-syn keyword txl_keyword contained flatten flatten* flip flo-int
-syn keyword txl_keyword contained flo-str floatp floor flush-stream
-syn keyword txl_keyword contained for for* force format
-syn keyword txl_keyword contained fourth fun func-get-env func-get-form
-syn keyword txl_keyword contained functionp gcd generate gensym
-syn keyword txl_keyword contained get-byte get-char get-hash-userdata get-line
-syn keyword txl_keyword contained get-list-from-stream get-string-from-stream gethash hash
-syn keyword txl_keyword contained hash-alist hash-construct hash-count hash-diff
-syn keyword txl_keyword contained hash-eql hash-equal hash-isec hash-keys
-syn keyword txl_keyword contained hash-pairs hash-uni hash-values hashp
-syn keyword txl_keyword contained identity if iff iffi
-syn keyword txl_keyword contained inc int-flo int-str integerp
-syn keyword txl_keyword contained intern interp-fun-p isqrt keep-if
-syn keyword txl_keyword contained keep-if* keywordp lambda lazy-str
-syn keyword txl_keyword contained lazy-str-force lazy-str-force-upto lazy-str-get-trailing-list lazy-stream-cons
-syn keyword txl_keyword contained lazy-stringp lcons-fun ldiff length
-syn keyword txl_keyword contained length-list length-str length-str-< length-str-<=
-syn keyword txl_keyword contained length-str-> length-str->= length-vec let
-syn keyword txl_keyword contained let* list list-str list-vector
-syn keyword txl_keyword contained listp log logand logior
-syn keyword txl_keyword contained lognot logtest logtrunc logxor
-syn keyword txl_keyword contained make-hash make-lazy-cons make-package make-random-state
-syn keyword txl_keyword contained make-similar-hash make-string-byte-input-stream make-string-input-stream make-string-output-stream
-syn keyword txl_keyword contained make-strlist-output-stream make-sym make-time make-time-utc
-syn keyword txl_keyword contained mapcar mapcar* maphash mappend
-syn keyword txl_keyword contained mappend* match-fun match-regex match-str
+syn keyword txl_keyword contained *stddebug* *stderr* *stdin* *stdlog*
+syn keyword txl_keyword contained *stdnull* *stdout* *system-package* *user-package*
+syn keyword txl_keyword contained + - / /=
+syn keyword txl_keyword contained < <= = >
+syn keyword txl_keyword contained >= abs acons acons-new
+syn keyword txl_keyword contained aconsql-new acos alist-nremove alist-remove
+syn keyword txl_keyword contained all and andf append
+syn keyword txl_keyword contained append* apply ash asin
+syn keyword txl_keyword contained assoc assql atan atom
+syn keyword txl_keyword contained bignump block break-str call
+syn keyword txl_keyword contained car cat-str cat-vec catch
+syn keyword txl_keyword contained cdr ceil chain chr-isalnum
+syn keyword txl_keyword contained chr-isalpha chr-isascii chr-iscntrl chr-isdigit
+syn keyword txl_keyword contained chr-isgraph chr-islower chr-isprint chr-ispunct
+syn keyword txl_keyword contained chr-isspace chr-isupper chr-isxdigit chr-num
+syn keyword txl_keyword contained chr-str chr-str-set chr-tolower chr-toupper
+syn keyword txl_keyword contained chrp close-stream collect-each collect-each*
+syn keyword txl_keyword contained compl-span-str cond cons consp
+syn keyword txl_keyword contained copy-alist copy-cons copy-hash copy-list
+syn keyword txl_keyword contained copy-str copy-vec cos count-if
+syn keyword txl_keyword contained countq countql countqual daemon
+syn keyword txl_keyword contained dec defun defvar del
+syn keyword txl_keyword contained delete-package dohash downcase-str dwim
+syn keyword txl_keyword contained each each* eq eql
+syn keyword txl_keyword contained equal errno error eval
+syn keyword txl_keyword contained evenp exp expt exptmod
+syn keyword txl_keyword contained fifth find find-if find-package
+syn keyword txl_keyword contained first fixnump flatten flatten*
+syn keyword txl_keyword contained flip flo-int flo-str floatp
+syn keyword txl_keyword contained floor flush-stream for for*
+syn keyword txl_keyword contained force format fourth fun
+syn keyword txl_keyword contained func-get-env func-get-form functionp gcd
+syn keyword txl_keyword contained generate gensym get-byte get-char
+syn keyword txl_keyword contained get-hash-userdata get-line get-list-from-stream get-string-from-stream
+syn keyword txl_keyword contained gethash hash hash-alist hash-construct
+syn keyword txl_keyword contained hash-count hash-diff hash-eql hash-equal
+syn keyword txl_keyword contained hash-isec hash-keys hash-pairs hash-uni
+syn keyword txl_keyword contained hash-values hashp identity if
+syn keyword txl_keyword contained iff iffi inc int-flo
+syn keyword txl_keyword contained int-str integerp intern interp-fun-p
+syn keyword txl_keyword contained isqrt keep-if keep-if* keywordp
+syn keyword txl_keyword contained lambda lazy-str lazy-str-force lazy-str-force-upto
+syn keyword txl_keyword contained lazy-str-get-trailing-list lazy-stream-cons lazy-stringp lcons-fun
+syn keyword txl_keyword contained ldiff length length-list length-str
+syn keyword txl_keyword contained length-str-< length-str-<= length-str-> length-str->=
+syn keyword txl_keyword contained length-vec let let* list
+syn keyword txl_keyword contained list-str list-vector listp log
+syn keyword txl_keyword contained log-alert log-auth log-cons log-crit
+syn keyword txl_keyword contained log-daemon log-debug log-emerg log-err
+syn keyword txl_keyword contained log-info log-ndelay log-notice log-nowait
+syn keyword txl_keyword contained log-odelay log-perror log-pid log-user
+syn keyword txl_keyword contained log-warning logand logior lognot
+syn keyword txl_keyword contained logtest logtrunc logxor make-hash
+syn keyword txl_keyword contained make-lazy-cons make-package make-random-state make-similar-hash
+syn keyword txl_keyword contained make-string-byte-input-stream make-string-input-stream make-string-output-stream make-strlist-output-stream
+syn keyword txl_keyword contained make-sym make-time make-time-utc mapcar
+syn keyword txl_keyword contained mapcar* maphash mappend mappend*
+syn keyword txl_keyword contained mask match-fun match-regex match-str
syn keyword txl_keyword contained match-str-tree max memq memql
syn keyword txl_keyword contained memqual merge min mkstring
syn keyword txl_keyword contained mod multi-sort none not
syn keyword txl_keyword contained nreverse null num-chr num-str
syn keyword txl_keyword contained numberp oddp open-command open-directory
syn keyword txl_keyword contained open-file open-pipe open-process open-tail
-syn keyword txl_keyword contained or orf packagep pop
-syn keyword txl_keyword contained pprint print prog1 progn
-syn keyword txl_keyword contained prop proper-listp push pushhash
-syn keyword txl_keyword contained put-byte put-char put-line put-string
-syn keyword txl_keyword contained qquote quasi quote rand
-syn keyword txl_keyword contained random random-fixnum random-state-p range
-syn keyword txl_keyword contained range* reduce-left reduce-right ref
-syn keyword txl_keyword contained refset regex-compile regexp regsub
-syn keyword txl_keyword contained rehome-sym remhash remove-if remove-if*
-syn keyword txl_keyword contained remq remq* remql remql*
-syn keyword txl_keyword contained remqual remqual* repeat replace
-syn keyword txl_keyword contained replace-list replace-str replace-vec rest
-syn keyword txl_keyword contained return return-from reverse rplaca
-syn keyword txl_keyword contained rplacd s-ifblk s-ifchr s-ifdir
-syn keyword txl_keyword contained s-ififo s-iflnk s-ifmt s-ifreg
-syn keyword txl_keyword contained s-irgrp s-iroth s-irusr s-irwxg
-syn keyword txl_keyword contained s-irwxo s-irwxu s-isgid s-isuid
-syn keyword txl_keyword contained s-isvtx s-iwgrp s-iwoth s-iwusr
-syn keyword txl_keyword contained s-ixgrp s-ixoth s-ixusr search-regex
-syn keyword txl_keyword contained search-str search-str-tree second seek-stream
-syn keyword txl_keyword contained set set-diff set-hash-userdata sethash
-syn keyword txl_keyword contained sin sixth size-vec some
-syn keyword txl_keyword contained sort source-loc source-loc-str span-str
-syn keyword txl_keyword contained splice split-str split-str-set sqrt
-syn keyword txl_keyword contained stat string-cmp string-extend string-lt
-syn keyword txl_keyword contained stringp sub sub-list sub-str
-syn keyword txl_keyword contained sub-vec symbol-function symbol-name symbol-package
-syn keyword txl_keyword contained symbolp tan third throw
+syn keyword txl_keyword contained openlog or orf packagep
+syn keyword txl_keyword contained pop pprint print prog1
+syn keyword txl_keyword contained progn prop proper-listp push
+syn keyword txl_keyword contained pushhash put-byte put-char put-line
+syn keyword txl_keyword contained put-string qquote quasi quote
+syn keyword txl_keyword contained rand random random-fixnum random-state-p
+syn keyword txl_keyword contained range range* reduce-left reduce-right
+syn keyword txl_keyword contained ref refset regex-compile regex-parse
+syn keyword txl_keyword contained regexp regsub rehome-sym remhash
+syn keyword txl_keyword contained remove-if remove-if* remq remq*
+syn keyword txl_keyword contained remql remql* remqual remqual*
+syn keyword txl_keyword contained repeat replace replace-list replace-str
+syn keyword txl_keyword contained replace-vec rest return return-from
+syn keyword txl_keyword contained reverse rplaca rplacd s-ifblk
+syn keyword txl_keyword contained s-ifchr s-ifdir s-ififo s-iflnk
+syn keyword txl_keyword contained s-ifmt s-ifreg s-irgrp s-iroth
+syn keyword txl_keyword contained s-irusr s-irwxg s-irwxo s-irwxu
+syn keyword txl_keyword contained s-isgid s-isuid s-isvtx s-iwgrp
+syn keyword txl_keyword contained s-iwoth s-iwusr s-ixgrp s-ixoth
+syn keyword txl_keyword contained s-ixusr search-regex search-str search-str-tree
+syn keyword txl_keyword contained second seek-stream set set-diff
+syn keyword txl_keyword contained set-hash-userdata sethash setlogmask sin
+syn keyword txl_keyword contained sixth size-vec some sort
+syn keyword txl_keyword contained source-loc source-loc-str span-str splice
+syn keyword txl_keyword contained split-str split-str-set sqrt stat
+syn keyword txl_keyword contained string-cmp string-extend string-lt stringp
+syn keyword txl_keyword contained sub sub-list sub-str sub-vec
+syn keyword txl_keyword contained symbol-function symbol-name symbol-package symbolp
+syn keyword txl_keyword contained syslog tan third throw
syn keyword txl_keyword contained throwf time time-string-local time-string-utc
syn keyword txl_keyword contained time-usec tok-str tostring tostringp
syn keyword txl_keyword contained tree-find trim-str trunc typeof