summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-04-18 10:47:14 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-04-18 10:47:14 -0700
commite21f19001551eddbb8d27acea1327590ce124461 (patch)
tree20d20e1f3ed7deca262fcd0c2bd366af88715c81
parentc765b773e63b2099a050fef21b5e7f06296af2ec (diff)
downloadtxr-e21f19001551eddbb8d27acea1327590ce124461.tar.gz
txr-e21f19001551eddbb8d27acea1327590ce124461.tar.bz2
txr-e21f19001551eddbb8d27acea1327590ce124461.zip
Adding getenv, setenv and unsetenv.
* lib.c (setenv, unsetenv): Changed static functions to external. Moved them out of the #if !HAVE_TIMEGM block. * lib.h (setenv, unsetenv): Declared. * sysif.c (getenv_wrap, setenv_wrap, unsetenv_wrap): New functions. (sysif_init): Registered getenv, setenv and unsetenv. * txr.1: Documented getenv, setenv and unsetenv. * tl.vim, txr.vim: Regenerated.
-rw-r--r--ChangeLog16
-rw-r--r--lib.c13
-rw-r--r--lib.h4
-rw-r--r--sysif.c31
-rw-r--r--tl.vim256
-rw-r--r--txr.166
-rw-r--r--txr.vim256
7 files changed, 380 insertions, 262 deletions
diff --git a/ChangeLog b/ChangeLog
index ab9270b2..7aeac2b3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@
2015-04-18 Kaz Kylheku <kaz@kylheku.com>
+ Adding getenv, setenv and unsetenv.
+
+ * lib.c (setenv, unsetenv): Changed static functions to external.
+ Moved them out of the #if !HAVE_TIMEGM block.
+
+ * lib.h (setenv, unsetenv): Declared.
+
+ * sysif.c (getenv_wrap, setenv_wrap, unsetenv_wrap): New functions.
+ (sysif_init): Registered getenv, setenv and unsetenv.
+
+ * txr.1: Documented getenv, setenv and unsetenv.
+
+ * tl.vim, txr.vim: Regenerated.
+
+2015-04-18 Kaz Kylheku <kaz@kylheku.com>
+
Fix quasistring regression introduced in TXR 81.
* parser.y (expand_meta): This function must recognize
diff --git a/lib.c b/lib.c
index 80f1a179..d7503294 100644
--- a/lib.c
+++ b/lib.c
@@ -7173,11 +7173,9 @@ val make_time(val year, val month, val day,
return make_time_impl(mktime, year, month, day, hour, minute, second, isdst);
}
-#if !HAVE_TIMEGM
-
#if !HAVE_SETENV
-static void
-setenv(const char *name, const char *value, int overwrite)
+
+void setenv(const char *name, const char *value, int overwrite)
{
int len = strlen(name)+1+strlen(value)+1;
char *str = (char *) chk_malloc(len);
@@ -7186,13 +7184,16 @@ setenv(const char *name, const char *value, int overwrite)
putenv(str);
}
-static void
-unsetenv(const char *name)
+void unsetenv(const char *name)
{
setenv(name, "", 1);
}
+
#endif
+
+#if !HAVE_TIMEGM
+
static time_t timegm_hack(struct tm *tm)
{
time_t ret;
diff --git a/lib.h b/lib.h
index 5657bf85..052b46a8 100644
--- a/lib.h
+++ b/lib.h
@@ -848,6 +848,10 @@ val obj_print(val obj, val stream);
val obj_pprint(val obj, val stream);
val tostring(val obj);
val tostringp(val obj);
+#if !HAVE_SETENV
+void setenv(const char *name, const char *value, int overwrite);
+void unsetenv(const char *name);
+#endif
val time_sec(void);
val time_sec_usec(void);
val time_string_local(val time, val format);
diff --git a/sysif.c b/sysif.c
index 8f659ced..880e4a47 100644
--- a/sysif.c
+++ b/sysif.c
@@ -572,6 +572,34 @@ static val pipe_wrap(void)
#endif
+static val getenv_wrap(val name)
+{
+ char *nameu8 = utf8_dup_to(c_str(name));
+ char *lookup = getenv(nameu8);
+ val result = lookup ? string_utf8(lookup) : nil;
+ free(nameu8);
+ return result;
+}
+
+static val setenv_wrap(val name, val value, val overwrite)
+{
+ char *nameu8 = utf8_dup_to(c_str(name));
+ char *valu8 = utf8_dup_to(c_str(value));
+ setenv(nameu8, valu8, default_arg(overwrite, t) != nil);
+ free(valu8);
+ free(nameu8);
+ return value;
+}
+
+static val unsetenv_wrap(val name)
+{
+ char *nameu8 = utf8_dup_to(c_str(name));
+ unsetenv(nameu8);
+ free(nameu8);
+ return name;
+}
+
+
void sysif_init(void)
{
reg_fun(intern(lit("errno"), user_package), func_n1o(errno_wrap, 0));
@@ -733,4 +761,7 @@ void sysif_init(void)
#if HAVE_PIPE
reg_fun(intern(lit("pipe"), user_package), func_n0(pipe_wrap));
#endif
+ reg_fun(intern(lit("getenv"), user_package), func_n1(getenv_wrap));
+ reg_fun(intern(lit("setenv"), user_package), func_n3o(setenv_wrap, 2));
+ reg_fun(intern(lit("unsetenv"), user_package), func_n1(unsetenv_wrap));
}
diff --git a/tl.vim b/tl.vim
index c8bd952a..76e8fdb3 100644
--- a/tl.vim
+++ b/tl.vim
@@ -73,134 +73,134 @@ syn keyword txl_keyword contained func-get-form func-set-env functionp gcd
syn keyword txl_keyword contained gen generate gensym gequal
syn keyword txl_keyword contained get-byte get-char get-error get-error-str
syn keyword txl_keyword contained get-hash-userdata get-line get-lines get-list-from-stream
-syn keyword txl_keyword contained get-sig-handler get-string get-string-from-stream gethash
-syn keyword txl_keyword contained getitimer getpid getppid giterate
-syn keyword txl_keyword contained glob glob-altdirfunc glob-brace glob-err
-syn keyword txl_keyword contained glob-mark glob-nocheck glob-noescape glob-nomagic
-syn keyword txl_keyword contained glob-nosort glob-onlydir glob-period glob-tilde
-syn keyword txl_keyword contained glob-tilde-check greater group-by gun
-syn keyword txl_keyword contained hash hash-alist hash-construct hash-count
-syn keyword txl_keyword contained hash-diff hash-eql hash-equal hash-isec
-syn keyword txl_keyword contained hash-keys hash-pairs hash-uni hash-update
-syn keyword txl_keyword contained hash-update-1 hash-values hashp html-decode
-syn keyword txl_keyword contained html-encode iapply identity ido
-syn keyword txl_keyword contained if iff iffi iflet
-syn keyword txl_keyword contained ignerr in inc inhash
-syn keyword txl_keyword contained int-flo int-str integerp intern
-syn keyword txl_keyword contained interp-fun-p interpose ip ipf
-syn keyword txl_keyword contained isqrt itimer-prov itimer-real itimer-virtual
-syn keyword txl_keyword contained juxt keep-if keep-if* keywordp
-syn keyword txl_keyword contained kill labels lambda last
-syn keyword txl_keyword contained lazy-str lazy-str-force lazy-str-force-upto lazy-str-get-trailing-list
-syn keyword txl_keyword contained lazy-stream-cons lazy-stringp lbind lcm
-syn keyword txl_keyword contained lcons-fun lconsp 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 lequal
-syn keyword txl_keyword contained less let let* lexical-fun-p
-syn keyword txl_keyword contained lexical-lisp1-binding lexical-var-p link lisp-parse
-syn keyword txl_keyword contained list list* list-str list-vector
-syn keyword txl_keyword contained listp log log-alert log-auth
-syn keyword txl_keyword contained log-authpriv log-cons log-crit log-daemon
-syn keyword txl_keyword contained log-debug log-emerg log-err log-info
-syn keyword txl_keyword contained log-ndelay log-notice log-nowait log-odelay
-syn keyword txl_keyword contained log-perror log-pid log-user log-warning
-syn keyword txl_keyword contained log10 log2 logand logior
-syn keyword txl_keyword contained lognot logtest logtrunc logxor
-syn keyword txl_keyword contained macro-form-p macro-time macroexpand macroexpand-1
-syn keyword txl_keyword contained macrolet major make-catenated-stream make-env
-syn keyword txl_keyword contained make-hash make-lazy-cons make-like make-package
-syn keyword txl_keyword contained make-random-state make-similar-hash make-string-byte-input-stream make-string-input-stream
-syn keyword txl_keyword contained make-string-output-stream make-strlist-output-stream make-sym make-time
-syn keyword txl_keyword contained make-time-utc make-trie makedev mapcar
-syn keyword txl_keyword contained mapcar* mapdo mapf maphash
-syn keyword txl_keyword contained mappend mappend* mask match-fun
-syn keyword txl_keyword contained match-regex match-regex-right match-regst match-regst-right
-syn keyword txl_keyword contained match-str match-str-tree max member
-syn keyword txl_keyword contained member-if memq memql memqual
-syn keyword txl_keyword contained merge min minor minusp
-syn keyword txl_keyword contained mkdir mknod mkstring mod
-syn keyword txl_keyword contained multi multi-sort n-choose-k n-perm-k
-syn keyword txl_keyword contained nconc nilf none not
-syn keyword txl_keyword contained notf nreverse null nullify
-syn keyword txl_keyword contained num-chr num-str numberp oand
-syn keyword txl_keyword contained oddp op open-command open-directory
-syn keyword txl_keyword contained open-file open-fileno open-files open-files*
-syn keyword txl_keyword contained open-pipe open-process open-tail openlog
-syn keyword txl_keyword contained opip or orf packagep
-syn keyword txl_keyword contained pad partition partition* partition-by
-syn keyword txl_keyword contained perm pipe plusp pop
-syn keyword txl_keyword contained pos pos-if pos-max pos-min
-syn keyword txl_keyword contained posq posql posqual pppred
-syn keyword txl_keyword contained ppred pprinl pprint pprof
-syn keyword txl_keyword contained pred prinl print prof
-syn keyword txl_keyword contained prog1 progn prop proper-listp
-syn keyword txl_keyword contained push pushhash put-byte put-char
-syn keyword txl_keyword contained put-line put-lines put-string put-strings
-syn keyword txl_keyword contained pwd qquote quasi quasilist
-syn keyword txl_keyword contained quote rand random random-fixnum
-syn keyword txl_keyword contained random-state-p range range* range-regex
-syn keyword txl_keyword contained rcomb read readlink real-time-stream-p
-syn keyword txl_keyword contained reduce-left reduce-right ref refset
-syn keyword txl_keyword contained regex-compile regex-parse regexp regsub
-syn keyword txl_keyword contained rehome-sym remhash remove-if remove-if*
-syn keyword txl_keyword contained remove-path remq remq* remql
-syn keyword txl_keyword contained remql* remqual remqual* rename-path
-syn keyword txl_keyword contained repeat replace replace-list replace-str
-syn keyword txl_keyword contained replace-vec rest ret retf
-syn keyword txl_keyword contained return return-from reverse rlcp
-syn keyword txl_keyword contained rperm rplaca rplacd run
-syn keyword txl_keyword contained s-ifblk s-ifchr s-ifdir s-ififo
-syn keyword txl_keyword contained s-iflnk s-ifmt s-ifreg s-ifsock
-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
-syn keyword txl_keyword contained search-regex search-regst search-str search-str-tree
-syn keyword txl_keyword contained second seek-stream select seqp
-syn keyword txl_keyword contained set set-diff set-hash-userdata set-sig-handler
-syn keyword txl_keyword contained sethash setitimer setlogmask sh
-syn keyword txl_keyword contained sig-abrt sig-alrm sig-bus sig-check
-syn keyword txl_keyword contained sig-chld sig-cont sig-fpe sig-hup
-syn keyword txl_keyword contained sig-ill sig-int sig-io sig-iot
-syn keyword txl_keyword contained sig-kill sig-lost sig-pipe sig-poll
-syn keyword txl_keyword contained sig-prof sig-pwr sig-quit sig-segv
-syn keyword txl_keyword contained sig-stkflt sig-stop sig-sys sig-term
-syn keyword txl_keyword contained sig-trap sig-tstp sig-ttin sig-ttou
-syn keyword txl_keyword contained sig-urg sig-usr1 sig-usr2 sig-vtalrm
-syn keyword txl_keyword contained sig-winch sig-xcpu sig-xfsz sign-extend
-syn keyword txl_keyword contained sin sixth size-vec some
-syn keyword txl_keyword contained sort sort-group source-loc source-loc-str
-syn keyword txl_keyword contained span-str splice split-str split-str-set
-syn keyword txl_keyword contained sqrt sssucc ssucc stat
-syn keyword txl_keyword contained stdlib str< str<= str=
-syn keyword txl_keyword contained str> str>= stream-get-prop stream-set-prop
-syn keyword txl_keyword contained streamp string-extend string-lt stringp
-syn keyword txl_keyword contained sub sub-list sub-str sub-vec
-syn keyword txl_keyword contained succ symacrolet symbol-function symbol-name
-syn keyword txl_keyword contained symbol-package symbol-value symbolp symlink
-syn keyword txl_keyword contained sys-qquote sys-splice sys-unquote syslog
-syn keyword txl_keyword contained tan tb tc tf
-syn keyword txl_keyword contained third throw throwf time
-syn keyword txl_keyword contained time-fields-local time-fields-utc time-string-local time-string-utc
-syn keyword txl_keyword contained time-usec tofloat toint tok-str
-syn keyword txl_keyword contained tok-where tostring tostringp tprint
-syn keyword txl_keyword contained transpose tree-bind tree-case tree-find
-syn keyword txl_keyword contained trie-add trie-compress trie-lookup-begin trie-lookup-feed-char
-syn keyword txl_keyword contained trie-value-at trim-str true trunc
-syn keyword txl_keyword contained trunc-rem tuples txr-case txr-if
-syn keyword txl_keyword contained txr-when typeof unget-byte unget-char
-syn keyword txl_keyword contained uniq unique unless unquote
-syn keyword txl_keyword contained until until* upcase-str update
-syn keyword txl_keyword contained url-decode url-encode usleep uw-protect
-syn keyword txl_keyword contained vec vec-push vec-set-length vecref
-syn keyword txl_keyword contained vector vector-list vectorp w-continued
-syn keyword txl_keyword contained w-coredump w-exitstatus w-ifcontinued w-ifexited
-syn keyword txl_keyword contained w-ifsignaled w-ifstopped w-nohang w-stopsig
-syn keyword txl_keyword contained w-termsig w-untraced wait weave
-syn keyword txl_keyword contained when whenlet where while
-syn keyword txl_keyword contained while* whilet width with-saved-vars
-syn keyword txl_keyword contained wrap wrap* zap zerop
-syn keyword txl_keyword contained zip
+syn keyword txl_keyword contained get-sig-handler get-string get-string-from-stream getenv
+syn keyword txl_keyword contained gethash getitimer getpid getppid
+syn keyword txl_keyword contained giterate glob glob-altdirfunc glob-brace
+syn keyword txl_keyword contained glob-err glob-mark glob-nocheck glob-noescape
+syn keyword txl_keyword contained glob-nomagic glob-nosort glob-onlydir glob-period
+syn keyword txl_keyword contained glob-tilde glob-tilde-check greater group-by
+syn keyword txl_keyword contained gun 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-update hash-update-1 hash-values hashp
+syn keyword txl_keyword contained html-decode html-encode iapply identity
+syn keyword txl_keyword contained ido if iff iffi
+syn keyword txl_keyword contained iflet ignerr in inc
+syn keyword txl_keyword contained inhash int-flo int-str integerp
+syn keyword txl_keyword contained intern interp-fun-p interpose ip
+syn keyword txl_keyword contained ipf isqrt itimer-prov itimer-real
+syn keyword txl_keyword contained itimer-virtual juxt keep-if keep-if*
+syn keyword txl_keyword contained keywordp kill labels lambda
+syn keyword txl_keyword contained last lazy-str lazy-str-force lazy-str-force-upto
+syn keyword txl_keyword contained lazy-str-get-trailing-list lazy-stream-cons lazy-stringp lbind
+syn keyword txl_keyword contained lcm lcons-fun lconsp ldiff
+syn keyword txl_keyword contained length length-list length-str length-str-<
+syn keyword txl_keyword contained length-str-<= length-str-> length-str->= length-vec
+syn keyword txl_keyword contained lequal less let let*
+syn keyword txl_keyword contained lexical-fun-p lexical-lisp1-binding lexical-var-p link
+syn keyword txl_keyword contained lisp-parse list list* list-str
+syn keyword txl_keyword contained list-vector listp log log-alert
+syn keyword txl_keyword contained log-auth log-authpriv 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 log10 log2 logand
+syn keyword txl_keyword contained logior lognot logtest logtrunc
+syn keyword txl_keyword contained logxor macro-form-p macro-time macroexpand
+syn keyword txl_keyword contained macroexpand-1 macrolet major make-catenated-stream
+syn keyword txl_keyword contained make-env make-hash make-lazy-cons make-like
+syn keyword txl_keyword contained make-package make-random-state make-similar-hash make-string-byte-input-stream
+syn keyword txl_keyword contained make-string-input-stream make-string-output-stream make-strlist-output-stream make-sym
+syn keyword txl_keyword contained make-time make-time-utc make-trie makedev
+syn keyword txl_keyword contained mapcar mapcar* mapdo mapf
+syn keyword txl_keyword contained maphash mappend mappend* mask
+syn keyword txl_keyword contained match-fun match-regex match-regex-right match-regst
+syn keyword txl_keyword contained match-regst-right match-str match-str-tree max
+syn keyword txl_keyword contained member member-if memq memql
+syn keyword txl_keyword contained memqual merge min minor
+syn keyword txl_keyword contained minusp mkdir mknod mkstring
+syn keyword txl_keyword contained mod multi multi-sort n-choose-k
+syn keyword txl_keyword contained n-perm-k nconc nilf none
+syn keyword txl_keyword contained not notf nreverse null
+syn keyword txl_keyword contained nullify num-chr num-str numberp
+syn keyword txl_keyword contained oand oddp op open-command
+syn keyword txl_keyword contained open-directory open-file open-fileno open-files
+syn keyword txl_keyword contained open-files* open-pipe open-process open-tail
+syn keyword txl_keyword contained openlog opip or orf
+syn keyword txl_keyword contained packagep pad partition partition*
+syn keyword txl_keyword contained partition-by perm pipe plusp
+syn keyword txl_keyword contained pop pos pos-if pos-max
+syn keyword txl_keyword contained pos-min posq posql posqual
+syn keyword txl_keyword contained pppred ppred pprinl pprint
+syn keyword txl_keyword contained pprof pred prinl print
+syn keyword txl_keyword contained prof prog1 progn prop
+syn keyword txl_keyword contained proper-listp push pushhash put-byte
+syn keyword txl_keyword contained put-char put-line put-lines put-string
+syn keyword txl_keyword contained put-strings pwd qquote quasi
+syn keyword txl_keyword contained quasilist quote rand random
+syn keyword txl_keyword contained random-fixnum random-state-p range range*
+syn keyword txl_keyword contained range-regex rcomb read readlink
+syn keyword txl_keyword contained real-time-stream-p reduce-left reduce-right ref
+syn keyword txl_keyword contained refset regex-compile regex-parse regexp
+syn keyword txl_keyword contained regsub rehome-sym remhash remove-if
+syn keyword txl_keyword contained remove-if* remove-path remq remq*
+syn keyword txl_keyword contained remql remql* remqual remqual*
+syn keyword txl_keyword contained rename-path repeat replace replace-list
+syn keyword txl_keyword contained replace-str replace-vec rest ret
+syn keyword txl_keyword contained retf return return-from reverse
+syn keyword txl_keyword contained rlcp rperm rplaca rplacd
+syn keyword txl_keyword contained run 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-ifsock s-irgrp s-iroth s-irusr
+syn keyword txl_keyword contained s-irwxg s-irwxo s-irwxu s-isgid
+syn keyword txl_keyword contained s-isuid s-isvtx s-iwgrp s-iwoth
+syn keyword txl_keyword contained s-iwusr s-ixgrp s-ixoth s-ixusr
+syn keyword txl_keyword contained search search-regex search-regst search-str
+syn keyword txl_keyword contained search-str-tree second seek-stream select
+syn keyword txl_keyword contained seqp set set-diff set-hash-userdata
+syn keyword txl_keyword contained set-sig-handler setenv sethash setitimer
+syn keyword txl_keyword contained setlogmask sh sig-abrt sig-alrm
+syn keyword txl_keyword contained sig-bus sig-check sig-chld sig-cont
+syn keyword txl_keyword contained sig-fpe sig-hup sig-ill sig-int
+syn keyword txl_keyword contained sig-io sig-iot sig-kill sig-lost
+syn keyword txl_keyword contained sig-pipe sig-poll sig-prof sig-pwr
+syn keyword txl_keyword contained sig-quit sig-segv sig-stkflt sig-stop
+syn keyword txl_keyword contained sig-sys sig-term sig-trap sig-tstp
+syn keyword txl_keyword contained sig-ttin sig-ttou sig-urg sig-usr1
+syn keyword txl_keyword contained sig-usr2 sig-vtalrm sig-winch sig-xcpu
+syn keyword txl_keyword contained sig-xfsz sign-extend sin sixth
+syn keyword txl_keyword contained size-vec some sort sort-group
+syn keyword txl_keyword contained source-loc source-loc-str span-str splice
+syn keyword txl_keyword contained split-str split-str-set sqrt sssucc
+syn keyword txl_keyword contained ssucc stat stdlib str<
+syn keyword txl_keyword contained str<= str= str> str>=
+syn keyword txl_keyword contained stream-get-prop stream-set-prop streamp string-extend
+syn keyword txl_keyword contained string-lt stringp sub sub-list
+syn keyword txl_keyword contained sub-str sub-vec succ symacrolet
+syn keyword txl_keyword contained symbol-function symbol-name symbol-package symbol-value
+syn keyword txl_keyword contained symbolp symlink sys-qquote sys-splice
+syn keyword txl_keyword contained sys-unquote syslog tan tb
+syn keyword txl_keyword contained tc tf third throw
+syn keyword txl_keyword contained throwf time time-fields-local time-fields-utc
+syn keyword txl_keyword contained time-string-local time-string-utc time-usec tofloat
+syn keyword txl_keyword contained toint tok-str tok-where tostring
+syn keyword txl_keyword contained tostringp tprint transpose tree-bind
+syn keyword txl_keyword contained tree-case tree-find trie-add trie-compress
+syn keyword txl_keyword contained trie-lookup-begin trie-lookup-feed-char trie-value-at trim-str
+syn keyword txl_keyword contained true trunc trunc-rem tuples
+syn keyword txl_keyword contained txr-case txr-if txr-when typeof
+syn keyword txl_keyword contained unget-byte unget-char uniq unique
+syn keyword txl_keyword contained unless unquote unsetenv until
+syn keyword txl_keyword contained until* upcase-str update url-decode
+syn keyword txl_keyword contained url-encode usleep uw-protect vec
+syn keyword txl_keyword contained vec-push vec-set-length vecref vector
+syn keyword txl_keyword contained vector-list vectorp w-continued w-coredump
+syn keyword txl_keyword contained w-exitstatus w-ifcontinued w-ifexited w-ifsignaled
+syn keyword txl_keyword contained w-ifstopped w-nohang w-stopsig w-termsig
+syn keyword txl_keyword contained w-untraced wait weave when
+syn keyword txl_keyword contained whenlet where while while*
+syn keyword txl_keyword contained whilet width with-saved-vars wrap
+syn keyword txl_keyword contained wrap* zap zerop zip
syn match txr_metanum "@[0-9]\+"
syn match txr_nested_error "[^\t `]\+" contained
diff --git a/txr.1 b/txr.1
index 8c4ccc07..d7c665e9 100644
--- a/txr.1
+++ b/txr.1
@@ -24106,6 +24106,11 @@ on the output (since the UTC zone by definition doesn't have daylight
savings time).
.SS* Environment Variables and Command Line
+
+Note that environment variable names, their values, and command line
+arguments are all regarded as being externally encoded in UTF-8. \*(TX performs
+the encoding and decoding automatically.
+
.coNP Special variables @ *args* and @ *args-full*
.desc
The
@@ -24160,6 +24165,67 @@ function constructs and returns an
hash. The hash is
populated with the environment variables, represented as key-value pairs.
+.coNP Functions @, getenv @, setenv and @ unsetenv
+.synb
+.mets (getenv << name )
+.mets (setenv < name < value <> [ overwrite-p ])
+.mets (unsetenv << name )
+.syne
+.desc
+These functions provide access to, as well as manipulation of, environment
+variables. Of these three,
+.code setenv
+and
+.code unsetenv
+might not be available on some platforms, or
+.code unsetenv
+might be be present in a simulated form which sets the variable
+.meta name
+to the empty string rather than deleting it.
+
+The
+.code getenv
+function searches the environment for the environment variable whose name
+is
+.metn name .
+If the variable is found, its value is returned. Otherwise
+.code nil
+is returned.
+
+The
+.code setenv
+function creates or modifies the environment variable indicated by
+.metn name .
+The
+.meta value
+string argument specifies the new value for the variable.
+
+If the
+.meta overwrite-p
+argument is specified, and is true,
+then the variable is overwritten if it already exists.
+If the argument is false, then the variable is not modified if it
+already exists. If the argument is not specified, it defaults
+to the value
+.metn t,
+effectively giving rise to a two-argument form of
+.code setenv
+which creates or overwrites environment variables.
+
+The
+.code setenv
+function unconditionally returns
+.meta value
+regardless of whether or not it overwrites an existing variable.
+
+The
+.code unsetenv
+function removes the enviornment variable
+specified by
+.metn name ,
+if it exists. On some platforms, it instead sets the environment variable
+to the empty string.
+
.SS* System Programming
.coNP Function @ errno
.synb
diff --git a/txr.vim b/txr.vim
index 12d3d1b6..dbbfb760 100644
--- a/txr.vim
+++ b/txr.vim
@@ -73,134 +73,134 @@ syn keyword txl_keyword contained func-get-form func-set-env functionp gcd
syn keyword txl_keyword contained gen generate gensym gequal
syn keyword txl_keyword contained get-byte get-char get-error get-error-str
syn keyword txl_keyword contained get-hash-userdata get-line get-lines get-list-from-stream
-syn keyword txl_keyword contained get-sig-handler get-string get-string-from-stream gethash
-syn keyword txl_keyword contained getitimer getpid getppid giterate
-syn keyword txl_keyword contained glob glob-altdirfunc glob-brace glob-err
-syn keyword txl_keyword contained glob-mark glob-nocheck glob-noescape glob-nomagic
-syn keyword txl_keyword contained glob-nosort glob-onlydir glob-period glob-tilde
-syn keyword txl_keyword contained glob-tilde-check greater group-by gun
-syn keyword txl_keyword contained hash hash-alist hash-construct hash-count
-syn keyword txl_keyword contained hash-diff hash-eql hash-equal hash-isec
-syn keyword txl_keyword contained hash-keys hash-pairs hash-uni hash-update
-syn keyword txl_keyword contained hash-update-1 hash-values hashp html-decode
-syn keyword txl_keyword contained html-encode iapply identity ido
-syn keyword txl_keyword contained if iff iffi iflet
-syn keyword txl_keyword contained ignerr in inc inhash
-syn keyword txl_keyword contained int-flo int-str integerp intern
-syn keyword txl_keyword contained interp-fun-p interpose ip ipf
-syn keyword txl_keyword contained isqrt itimer-prov itimer-real itimer-virtual
-syn keyword txl_keyword contained juxt keep-if keep-if* keywordp
-syn keyword txl_keyword contained kill labels lambda last
-syn keyword txl_keyword contained lazy-str lazy-str-force lazy-str-force-upto lazy-str-get-trailing-list
-syn keyword txl_keyword contained lazy-stream-cons lazy-stringp lbind lcm
-syn keyword txl_keyword contained lcons-fun lconsp 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 lequal
-syn keyword txl_keyword contained less let let* lexical-fun-p
-syn keyword txl_keyword contained lexical-lisp1-binding lexical-var-p link lisp-parse
-syn keyword txl_keyword contained list list* list-str list-vector
-syn keyword txl_keyword contained listp log log-alert log-auth
-syn keyword txl_keyword contained log-authpriv log-cons log-crit log-daemon
-syn keyword txl_keyword contained log-debug log-emerg log-err log-info
-syn keyword txl_keyword contained log-ndelay log-notice log-nowait log-odelay
-syn keyword txl_keyword contained log-perror log-pid log-user log-warning
-syn keyword txl_keyword contained log10 log2 logand logior
-syn keyword txl_keyword contained lognot logtest logtrunc logxor
-syn keyword txl_keyword contained macro-form-p macro-time macroexpand macroexpand-1
-syn keyword txl_keyword contained macrolet major make-catenated-stream make-env
-syn keyword txl_keyword contained make-hash make-lazy-cons make-like make-package
-syn keyword txl_keyword contained make-random-state make-similar-hash make-string-byte-input-stream make-string-input-stream
-syn keyword txl_keyword contained make-string-output-stream make-strlist-output-stream make-sym make-time
-syn keyword txl_keyword contained make-time-utc make-trie makedev mapcar
-syn keyword txl_keyword contained mapcar* mapdo mapf maphash
-syn keyword txl_keyword contained mappend mappend* mask match-fun
-syn keyword txl_keyword contained match-regex match-regex-right match-regst match-regst-right
-syn keyword txl_keyword contained match-str match-str-tree max member
-syn keyword txl_keyword contained member-if memq memql memqual
-syn keyword txl_keyword contained merge min minor minusp
-syn keyword txl_keyword contained mkdir mknod mkstring mod
-syn keyword txl_keyword contained multi multi-sort n-choose-k n-perm-k
-syn keyword txl_keyword contained nconc nilf none not
-syn keyword txl_keyword contained notf nreverse null nullify
-syn keyword txl_keyword contained num-chr num-str numberp oand
-syn keyword txl_keyword contained oddp op open-command open-directory
-syn keyword txl_keyword contained open-file open-fileno open-files open-files*
-syn keyword txl_keyword contained open-pipe open-process open-tail openlog
-syn keyword txl_keyword contained opip or orf packagep
-syn keyword txl_keyword contained pad partition partition* partition-by
-syn keyword txl_keyword contained perm pipe plusp pop
-syn keyword txl_keyword contained pos pos-if pos-max pos-min
-syn keyword txl_keyword contained posq posql posqual pppred
-syn keyword txl_keyword contained ppred pprinl pprint pprof
-syn keyword txl_keyword contained pred prinl print prof
-syn keyword txl_keyword contained prog1 progn prop proper-listp
-syn keyword txl_keyword contained push pushhash put-byte put-char
-syn keyword txl_keyword contained put-line put-lines put-string put-strings
-syn keyword txl_keyword contained pwd qquote quasi quasilist
-syn keyword txl_keyword contained quote rand random random-fixnum
-syn keyword txl_keyword contained random-state-p range range* range-regex
-syn keyword txl_keyword contained rcomb read readlink real-time-stream-p
-syn keyword txl_keyword contained reduce-left reduce-right ref refset
-syn keyword txl_keyword contained regex-compile regex-parse regexp regsub
-syn keyword txl_keyword contained rehome-sym remhash remove-if remove-if*
-syn keyword txl_keyword contained remove-path remq remq* remql
-syn keyword txl_keyword contained remql* remqual remqual* rename-path
-syn keyword txl_keyword contained repeat replace replace-list replace-str
-syn keyword txl_keyword contained replace-vec rest ret retf
-syn keyword txl_keyword contained return return-from reverse rlcp
-syn keyword txl_keyword contained rperm rplaca rplacd run
-syn keyword txl_keyword contained s-ifblk s-ifchr s-ifdir s-ififo
-syn keyword txl_keyword contained s-iflnk s-ifmt s-ifreg s-ifsock
-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
-syn keyword txl_keyword contained search-regex search-regst search-str search-str-tree
-syn keyword txl_keyword contained second seek-stream select seqp
-syn keyword txl_keyword contained set set-diff set-hash-userdata set-sig-handler
-syn keyword txl_keyword contained sethash setitimer setlogmask sh
-syn keyword txl_keyword contained sig-abrt sig-alrm sig-bus sig-check
-syn keyword txl_keyword contained sig-chld sig-cont sig-fpe sig-hup
-syn keyword txl_keyword contained sig-ill sig-int sig-io sig-iot
-syn keyword txl_keyword contained sig-kill sig-lost sig-pipe sig-poll
-syn keyword txl_keyword contained sig-prof sig-pwr sig-quit sig-segv
-syn keyword txl_keyword contained sig-stkflt sig-stop sig-sys sig-term
-syn keyword txl_keyword contained sig-trap sig-tstp sig-ttin sig-ttou
-syn keyword txl_keyword contained sig-urg sig-usr1 sig-usr2 sig-vtalrm
-syn keyword txl_keyword contained sig-winch sig-xcpu sig-xfsz sign-extend
-syn keyword txl_keyword contained sin sixth size-vec some
-syn keyword txl_keyword contained sort sort-group source-loc source-loc-str
-syn keyword txl_keyword contained span-str splice split-str split-str-set
-syn keyword txl_keyword contained sqrt sssucc ssucc stat
-syn keyword txl_keyword contained stdlib str< str<= str=
-syn keyword txl_keyword contained str> str>= stream-get-prop stream-set-prop
-syn keyword txl_keyword contained streamp string-extend string-lt stringp
-syn keyword txl_keyword contained sub sub-list sub-str sub-vec
-syn keyword txl_keyword contained succ symacrolet symbol-function symbol-name
-syn keyword txl_keyword contained symbol-package symbol-value symbolp symlink
-syn keyword txl_keyword contained sys-qquote sys-splice sys-unquote syslog
-syn keyword txl_keyword contained tan tb tc tf
-syn keyword txl_keyword contained third throw throwf time
-syn keyword txl_keyword contained time-fields-local time-fields-utc time-string-local time-string-utc
-syn keyword txl_keyword contained time-usec tofloat toint tok-str
-syn keyword txl_keyword contained tok-where tostring tostringp tprint
-syn keyword txl_keyword contained transpose tree-bind tree-case tree-find
-syn keyword txl_keyword contained trie-add trie-compress trie-lookup-begin trie-lookup-feed-char
-syn keyword txl_keyword contained trie-value-at trim-str true trunc
-syn keyword txl_keyword contained trunc-rem tuples txr-case txr-if
-syn keyword txl_keyword contained txr-when typeof unget-byte unget-char
-syn keyword txl_keyword contained uniq unique unless unquote
-syn keyword txl_keyword contained until until* upcase-str update
-syn keyword txl_keyword contained url-decode url-encode usleep uw-protect
-syn keyword txl_keyword contained vec vec-push vec-set-length vecref
-syn keyword txl_keyword contained vector vector-list vectorp w-continued
-syn keyword txl_keyword contained w-coredump w-exitstatus w-ifcontinued w-ifexited
-syn keyword txl_keyword contained w-ifsignaled w-ifstopped w-nohang w-stopsig
-syn keyword txl_keyword contained w-termsig w-untraced wait weave
-syn keyword txl_keyword contained when whenlet where while
-syn keyword txl_keyword contained while* whilet width with-saved-vars
-syn keyword txl_keyword contained wrap wrap* zap zerop
-syn keyword txl_keyword contained zip
+syn keyword txl_keyword contained get-sig-handler get-string get-string-from-stream getenv
+syn keyword txl_keyword contained gethash getitimer getpid getppid
+syn keyword txl_keyword contained giterate glob glob-altdirfunc glob-brace
+syn keyword txl_keyword contained glob-err glob-mark glob-nocheck glob-noescape
+syn keyword txl_keyword contained glob-nomagic glob-nosort glob-onlydir glob-period
+syn keyword txl_keyword contained glob-tilde glob-tilde-check greater group-by
+syn keyword txl_keyword contained gun 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-update hash-update-1 hash-values hashp
+syn keyword txl_keyword contained html-decode html-encode iapply identity
+syn keyword txl_keyword contained ido if iff iffi
+syn keyword txl_keyword contained iflet ignerr in inc
+syn keyword txl_keyword contained inhash int-flo int-str integerp
+syn keyword txl_keyword contained intern interp-fun-p interpose ip
+syn keyword txl_keyword contained ipf isqrt itimer-prov itimer-real
+syn keyword txl_keyword contained itimer-virtual juxt keep-if keep-if*
+syn keyword txl_keyword contained keywordp kill labels lambda
+syn keyword txl_keyword contained last lazy-str lazy-str-force lazy-str-force-upto
+syn keyword txl_keyword contained lazy-str-get-trailing-list lazy-stream-cons lazy-stringp lbind
+syn keyword txl_keyword contained lcm lcons-fun lconsp ldiff
+syn keyword txl_keyword contained length length-list length-str length-str-<
+syn keyword txl_keyword contained length-str-<= length-str-> length-str->= length-vec
+syn keyword txl_keyword contained lequal less let let*
+syn keyword txl_keyword contained lexical-fun-p lexical-lisp1-binding lexical-var-p link
+syn keyword txl_keyword contained lisp-parse list list* list-str
+syn keyword txl_keyword contained list-vector listp log log-alert
+syn keyword txl_keyword contained log-auth log-authpriv 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 log10 log2 logand
+syn keyword txl_keyword contained logior lognot logtest logtrunc
+syn keyword txl_keyword contained logxor macro-form-p macro-time macroexpand
+syn keyword txl_keyword contained macroexpand-1 macrolet major make-catenated-stream
+syn keyword txl_keyword contained make-env make-hash make-lazy-cons make-like
+syn keyword txl_keyword contained make-package make-random-state make-similar-hash make-string-byte-input-stream
+syn keyword txl_keyword contained make-string-input-stream make-string-output-stream make-strlist-output-stream make-sym
+syn keyword txl_keyword contained make-time make-time-utc make-trie makedev
+syn keyword txl_keyword contained mapcar mapcar* mapdo mapf
+syn keyword txl_keyword contained maphash mappend mappend* mask
+syn keyword txl_keyword contained match-fun match-regex match-regex-right match-regst
+syn keyword txl_keyword contained match-regst-right match-str match-str-tree max
+syn keyword txl_keyword contained member member-if memq memql
+syn keyword txl_keyword contained memqual merge min minor
+syn keyword txl_keyword contained minusp mkdir mknod mkstring
+syn keyword txl_keyword contained mod multi multi-sort n-choose-k
+syn keyword txl_keyword contained n-perm-k nconc nilf none
+syn keyword txl_keyword contained not notf nreverse null
+syn keyword txl_keyword contained nullify num-chr num-str numberp
+syn keyword txl_keyword contained oand oddp op open-command
+syn keyword txl_keyword contained open-directory open-file open-fileno open-files
+syn keyword txl_keyword contained open-files* open-pipe open-process open-tail
+syn keyword txl_keyword contained openlog opip or orf
+syn keyword txl_keyword contained packagep pad partition partition*
+syn keyword txl_keyword contained partition-by perm pipe plusp
+syn keyword txl_keyword contained pop pos pos-if pos-max
+syn keyword txl_keyword contained pos-min posq posql posqual
+syn keyword txl_keyword contained pppred ppred pprinl pprint
+syn keyword txl_keyword contained pprof pred prinl print
+syn keyword txl_keyword contained prof prog1 progn prop
+syn keyword txl_keyword contained proper-listp push pushhash put-byte
+syn keyword txl_keyword contained put-char put-line put-lines put-string
+syn keyword txl_keyword contained put-strings pwd qquote quasi
+syn keyword txl_keyword contained quasilist quote rand random
+syn keyword txl_keyword contained random-fixnum random-state-p range range*
+syn keyword txl_keyword contained range-regex rcomb read readlink
+syn keyword txl_keyword contained real-time-stream-p reduce-left reduce-right ref
+syn keyword txl_keyword contained refset regex-compile regex-parse regexp
+syn keyword txl_keyword contained regsub rehome-sym remhash remove-if
+syn keyword txl_keyword contained remove-if* remove-path remq remq*
+syn keyword txl_keyword contained remql remql* remqual remqual*
+syn keyword txl_keyword contained rename-path repeat replace replace-list
+syn keyword txl_keyword contained replace-str replace-vec rest ret
+syn keyword txl_keyword contained retf return return-from reverse
+syn keyword txl_keyword contained rlcp rperm rplaca rplacd
+syn keyword txl_keyword contained run 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-ifsock s-irgrp s-iroth s-irusr
+syn keyword txl_keyword contained s-irwxg s-irwxo s-irwxu s-isgid
+syn keyword txl_keyword contained s-isuid s-isvtx s-iwgrp s-iwoth
+syn keyword txl_keyword contained s-iwusr s-ixgrp s-ixoth s-ixusr
+syn keyword txl_keyword contained search search-regex search-regst search-str
+syn keyword txl_keyword contained search-str-tree second seek-stream select
+syn keyword txl_keyword contained seqp set set-diff set-hash-userdata
+syn keyword txl_keyword contained set-sig-handler setenv sethash setitimer
+syn keyword txl_keyword contained setlogmask sh sig-abrt sig-alrm
+syn keyword txl_keyword contained sig-bus sig-check sig-chld sig-cont
+syn keyword txl_keyword contained sig-fpe sig-hup sig-ill sig-int
+syn keyword txl_keyword contained sig-io sig-iot sig-kill sig-lost
+syn keyword txl_keyword contained sig-pipe sig-poll sig-prof sig-pwr
+syn keyword txl_keyword contained sig-quit sig-segv sig-stkflt sig-stop
+syn keyword txl_keyword contained sig-sys sig-term sig-trap sig-tstp
+syn keyword txl_keyword contained sig-ttin sig-ttou sig-urg sig-usr1
+syn keyword txl_keyword contained sig-usr2 sig-vtalrm sig-winch sig-xcpu
+syn keyword txl_keyword contained sig-xfsz sign-extend sin sixth
+syn keyword txl_keyword contained size-vec some sort sort-group
+syn keyword txl_keyword contained source-loc source-loc-str span-str splice
+syn keyword txl_keyword contained split-str split-str-set sqrt sssucc
+syn keyword txl_keyword contained ssucc stat stdlib str<
+syn keyword txl_keyword contained str<= str= str> str>=
+syn keyword txl_keyword contained stream-get-prop stream-set-prop streamp string-extend
+syn keyword txl_keyword contained string-lt stringp sub sub-list
+syn keyword txl_keyword contained sub-str sub-vec succ symacrolet
+syn keyword txl_keyword contained symbol-function symbol-name symbol-package symbol-value
+syn keyword txl_keyword contained symbolp symlink sys-qquote sys-splice
+syn keyword txl_keyword contained sys-unquote syslog tan tb
+syn keyword txl_keyword contained tc tf third throw
+syn keyword txl_keyword contained throwf time time-fields-local time-fields-utc
+syn keyword txl_keyword contained time-string-local time-string-utc time-usec tofloat
+syn keyword txl_keyword contained toint tok-str tok-where tostring
+syn keyword txl_keyword contained tostringp tprint transpose tree-bind
+syn keyword txl_keyword contained tree-case tree-find trie-add trie-compress
+syn keyword txl_keyword contained trie-lookup-begin trie-lookup-feed-char trie-value-at trim-str
+syn keyword txl_keyword contained true trunc trunc-rem tuples
+syn keyword txl_keyword contained txr-case txr-if txr-when typeof
+syn keyword txl_keyword contained unget-byte unget-char uniq unique
+syn keyword txl_keyword contained unless unquote unsetenv until
+syn keyword txl_keyword contained until* upcase-str update url-decode
+syn keyword txl_keyword contained url-encode usleep uw-protect vec
+syn keyword txl_keyword contained vec-push vec-set-length vecref vector
+syn keyword txl_keyword contained vector-list vectorp w-continued w-coredump
+syn keyword txl_keyword contained w-exitstatus w-ifcontinued w-ifexited w-ifsignaled
+syn keyword txl_keyword contained w-ifstopped w-nohang w-stopsig w-termsig
+syn keyword txl_keyword contained w-untraced wait weave when
+syn keyword txl_keyword contained whenlet where while while*
+syn keyword txl_keyword contained whilet width with-saved-vars wrap
+syn keyword txl_keyword contained wrap* zap zerop zip
syn keyword txr_keyword contained accept all and assert
syn keyword txr_keyword contained bind block cases cat