summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Version 75.txr-75Kaz Kylheku2014-01-166-110/+159
|
* * lib.c (obj_print, obj_pprint): Convert the internal representationKaz Kylheku2014-01-152-0/+18
| | | | | of @sym and @(expr ...) syntax back to these notations instead of leaving them as (sys:var sym) and (sys:expr expr ...).
* * arith.c: Revised error messages to refer to Lisp names insteadKaz Kylheku2014-01-154-26/+28
| | | | | | | | | | of C names of functions, or otherwise clarified them. * filter.c: Likewise. * lib.c: Likewise. * match.c: Likewise.
* * eval.c (append_each_s, append_each_star_s): New symbol variables.Kaz Kylheku2014-01-153-15/+45
| | | | | | | | (op_each, expand): Support append-each and append-each*. (eval_init): Initialize new symbol variables, and register new operators. * txr.1: Document append-each and append-each*.
* * arith.c (atang2): New function.Kaz Kylheku2014-01-154-2/+12
| | | | | | | | * eval.c (eval_init): Register as atang2 as a atan2 intrinsic. * lib.h (atang2): Declared. * txr.1: Documented atan2.
* * txr.1: Wrote missing documentation for throw, throwf and error.Kaz Kylheku2014-01-142-0/+27
|
* Clarifications about unget-char and unget-byte.Kaz Kylheku2014-01-141-0/+15
|
* * stream.c (stdio_seek): After a successful seek, discard the characterKaz Kylheku2014-01-142-0/+6
| | | | that may have been put back with unget_char.
* * eval.c (bind_args): Implemented default values for optionalKaz Kylheku2014-01-143-3/+29
| | | | | | | arguments. (op_defun): Permit the syntax. * txr.1: Documented.
* Support for pushing back bytes and characters into streams.Kaz Kylheku2014-01-136-1/+185
| | | | | | | | | | | | | | | | | | | | | | | | * stream.c (null_ops, stdio_ops, tail_ops, pipe_ops, string_in_ops, byte_in_ops, string_out_ops, strlist_out_ops, dir_ops, cat_stream_ops): Structure definition updated with new initializers for two new virtuals. (stdio_handle): New member, unget_c. (snarf_line, stdio_get_char): Handle pushed-back character in h->unget_c. (stdio_unget_char, stdio_unget_byte, string_in_unget_char, byte_in_unget_byte): New static functions. (make_stdio_stream_common): Initialize unget_c member. (unget_char, unget_byte): New functions. * stream.h (struct strm_ops): New virtuals: unget_char and unget_byte. (unget_char, unget_byte): New functions declared. * syslog.c (syslog_strm_ops): Two new initializers. * eval.c (eval_init): Registered unget_char and unget_byte as intrinsics. * txr.1: Documented.
* * stream.c (put_byte): Bugfix: was checking whether the put_charKaz Kylheku2014-01-132-1/+6
| | | | virtual function is not null, rather than put_byte.
* Bugfix in regex char ranges affecting ranges whose upper endKaz Kylheku2014-01-132-4/+21
| | | | | | | | | | | | | corresponds to the high bit of a bitmap cell: for instance the character \x7f when the cell size is 32 bits. * regex.c (BITCELL_ALL1): Unused macro removed. (BITCELL_BIT): New macro to replace occurrences of a repeated expression. (CHAR_SET_INDEX, CHAR_SET_BIT): Updated to use BITCELL_BIT. (L0_fill_range): Bugfix: the mask1 calculation was producing all-zero in the condition bt1 == BITCELL_BIT; it should produce an all-ones mask.
* Version 74txr-74Kaz Kylheku2014-01-137-59/+98
| | | | | | | | | | * txr.c (version): Bumped. * txr.1: Bumped version and set date. * configure (txr_ver): Bumped. * RELNOTES, txr.vim, dep.mk: Updated.
* * debug.h (debug_check): Fix broken build when debugger is disabled:Kaz Kylheku2014-01-132-1/+7
| | | | the debug-disabled stub function needs six arguments.
* Mac OSX Upkeep.Kaz Kylheku2014-01-132-9/+23
| | | | | | | | | * configure: (need_svid_source, need_bsd_source): Variables removed. (need_darwin_c_source): New variable. Detect Apple environment and add -D_DARWIN_C_SOURCE, which is needed to reveal some functions in headers. * signal.c (sig_init): Wrap #ifdefs around SIGPOLL; it is not defined on Darwin.
* Some bignum-related optimizationsKaz Kylheku2014-01-122-0/+23
| | | | | * arith.c (plus, minus, mul, trunc): Optimize cases where bignum is opposite 1 or 0.
* * arith.c (rising_product): New static function.Kaz Kylheku2014-01-115-0/+83
| | | | | | | | | | (n_choose_k, n_perm_k): New functions. * arith.h (n_choose_k, n_perm_k): Declared. * eval.c (eval_init): New functions interned. * txr.1: Documented.
* * arith.c (to_float): Print function name as ~a rather than ~s,Kaz Kylheku2014-01-115-1/+85
| | | | | | | | | | | | so it doesn't have quotes around it. (cum_norm_dist): New function. * arith.h (cum_norm_dist): Declared. * eval.c: Include arith.h. (eval_init): Register cum_norm_dist as intrinsic. * txr.1: Documented cum-norm-dist.
* * configure: Detect platforms which don't reveal declarationsKaz Kylheku2014-01-106-18/+38
| | | | | | | | | | | | | | in C headers which are extensions to standard C, like popen or fileno, in response to standard feature selection macros like -D_POSIX_SOURCE. MinGW and Cygwin are offenders. These platforms hide the declarations when gcc is in -ansi mode, by testing for __STRICT_ANSI__. Turns out, however, that -U__STRICT_ANSI__ on the gcc command line strips this away, causing the declarations to be revealed. * lib.c, parser.l, stream.c, utf8.c: Removed the declarations which compensated for the above problem. Yippee! Fuck you, stupid Cygwin troglodytes, and the MinGW horse you rode in on. http://cygwin.com/ml/cygwin/2011-10/msg00131.html
* * eval.c (eval_init): Renaming lisp-parse to read; lisp-parseKaz Kylheku2014-01-104-10/+24
| | | | | | | | is retained as an obsolescent synonym. All arguments become optional. * parser.l (lisp_parse): Handle nil source. * txr.1: Updated.
* * configure (lang_flags): Let us switch from using _XOPEN_SOURCE=2Kaz Kylheku2014-01-103-17/+87
| | | | | | | | | | | | | | | | | | | to _POSIX_C_SOURCE=199309L and _BSD_SOURCE. In the .exe suffix test, try harder to redirect ls's output. Test for fork stuff now needs <sys/types.h> evidently; <unistd.h> does not necessarily pid_t, even though it defines functions that return and accept pid_t! The timegm test no longer needs _SVID_SOURCE since _BSD_SOURCE covers it, and so we end up not using _SVID_SOURCE any more. New tests for usleep and nanosleep. The test for setenv is not conditional on timegm failing. * eval.c: Include <time.h> and conditionally <windows.h>. (usleep_wrap): New function. (eval_init): New usleep_wrap function registered as usleep intrinsic. * lib.c: Only define setenv and unsetenv if we don't have timegm, because only in that situation they are used.
* * match.c (do_txeval): Lift an annoying restriction in the patternKaz Kylheku2014-01-103-3/+20
| | | | | | | | | | language's expression evaluator. Whereas TXR Lisp expressions can be used int the pattern language, preceded by @, it was not possible to evaluate TXR Lisp variables this way. So instead of @var, some clumsy trick had to be used like @(identity var). This is not necessary any more. Code like @(next @*stdin*) will now work. * txr.1: Updated.
* * configure: Generate HAVE_VALGRIND as #define-d to 1, rathernKaz Kylheku2014-01-107-23/+39
| | | | | | | | | | | | | | | than just fdefined. * gc.c: Use #if HAVE_VALGRIND instaed of #ifdef HAVE_VALGRIND, consistently with other HAVE_* config variables. * lib.c: Likewise. * lib.h: Likewise. * txr.c: Likewise. * txr.h: Likewise.
* Fix broken Json parsing test case on MinGW.Kaz Kylheku2014-01-092-4/+17
| | | | | | | | * stream.c (vformat): Fix incorrect code for normalizing exponent fields in the output of sprintf's floating-point conversion. For ~e, the logic would let through a leading zero. For ~a/~s conversion, it was comparing to 0 instead of '0', not squashing leading zeros at all.
* * stream.c: Eliminate useless #else section containing #errorKaz Kylheku2014-01-092-2/+4
|
* Long overdue MinGW port maintenance.Kaz Kylheku2014-01-098-32/+245
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Makefile: Use new EXE variable from config.mk. * configure (exe, have_windows_h): New variables. Handle situations with .exe suffix; on MiGW, the rm command doesn't work on executables if the .exe suffix is not given. New tests for localtime_r and gmtime_r. * lib.c: Supply declarations which are missing on MinGW because we use gcc -ansi, because MinGW doesn't follow established conventions like -D_POSIX_SOURCE. Supply definitions for gmtime_r, localtime_r, setenv and unsetenv. * parser.l: Supply declarations which are missing on MinGW. * signal.h (async_sig_enabled): Declare differently based on HAVE_POSIX_SIGS. Misspelled typedef fixed in the code for !HAVE_POSIX_SIGS that has hitherto not been compiled. (sig_mask): Wrap declaration in #ifdef HAVE_POSIX_SIGS because it relies on sigset_t. * stream.c: Supply declarations which are missing on MinGW. Include <windows.h> if we have it. (sleep): Define for Windows. (statf): Handle missing st_blksize and st_blocks members in struct stat. (stream_init): Handle numerous missing S_* macros. * utf8.c: Supply declarations which are missing on MinGW.
* Version 73txr-73Kaz Kylheku2014-01-085-4/+33
|
* Grammar.Kaz Kylheku2014-01-071-1/+1
|
* The lisp-parse function can now be called multiple timesKaz Kylheku2014-01-074-12/+59
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | on the same stream to extract multiple objects; the requirement that the stream must hold exactly one complete Lisp object with no following material is now lifted. * parser.l (YY_INPUT): Modified the macro so that it reads no more than one character. Though this probably makes the lexer less efficient, it gives us the important property that the lexer does not scan ahead into the input stream, hogging data into its buffer which is then destroyed. This is essential if the lisp-parse function is to support multiple calls to pull objects one by one out of a stream. * parser.y (spec): Use YYACCEPT in the SECRET_ESCAPE_E clause for pulling a single expression out of the token stream. YYACCEPT is a trick for not invoking the $accept : spec . $end production which is implicitly built into the grammar, and which causes a token of lookahead to occur. This allows us to read a full expression without stealing any further token: but only if the grammar is structured right. (exprs): This phrase structure now handles the DOTDOT syntax. There is no such thing as an expr DOTDOT expr expression any more; it is in the list syntax (and not supported in the dot position). (expr): Remove DOTDOT syntax. * txr.1: Updated description of .. syntax, and relaxed the description of lisp-parse since it now allows multiple calls to extract multiple objects.
* * match.c (v_load): Call yylex_destroy after yyparse, so we don'tKaz Kylheku2014-01-072-0/+7
| | | | | have stray scanner state possibly interfering with a subsquent parse job.
* * genvim.txr: Add forgotten until and last keywords.Kaz Kylheku2014-01-063-7/+16
| | | | * txr.vim: Regenerated.
* Merry C++mas!Kaz Kylheku2013-12-253-10/+21
| | | | | | | * configure: Avoid using "new" as identifier in signals test case. * signal.c (set_sig_handler): Fix warning about { 0 } initializer. (sig_mask): Avoid using "new" as identifier.
* Fixing a bug and performance issue.Kaz Kylheku2013-12-203-5/+84
| | | | | | | | | | | | | | | | | | | | | Problem: we are using sigsetjmp but with a jmp_buf structure; it requires sigjmp_buf! Performance issue: sigsetjmp is a dog which makes system calls. Solution: let's roll our own cached version of sigprocmask which only calls the real sigprocmask when the mask changes. Then our extended_setjmp will just use regular setjmp, plus our own custom signal saving and restoring based on the cached version. * signal.c (sig_blocked_cache): New variable. (set_sig_handler): Use our sig_mask instead of sigprocmask. (mem_set_bits, mem_clr_bits): New static functions. (sig_mask): New function. * signal.h (extended_jmp_buf): New member, blocked. (extended_setjmp): save blocked signals by peeking into sig_blocked_cache, and restore using sig_mask. (sig_blocked_cache, sig_mask): Declared.
* Version 72txr-72Kaz Kylheku2013-12-175-4/+47
|
* * stream.c (stdio_seek): Bugfix. Was returning current positionKaz Kylheku2013-12-172-1/+6
| | | | whenever offset is zero, regardless of whence argument.
* * parser.y (yybadtoken): Handle HASH_H.Kaz Kylheku2013-12-172-0/+5
|
* * txr.vim: Regenerated.Kaz Kylheku2013-12-171-64/+64
|
* * eval.c (op_defvar): Fix the semantics to be similar to Common Lisp:Kaz Kylheku2013-12-173-6/+55
| | | | | | no effect if the variable already exists. * txr.1: Documented defvar and lisp-parse.
* * lib.c (intern): fix the previous diagnostic bug once more with moreKaz Kylheku2013-12-164-19/+26
| | | | | | | | | | feeling. * parser.l (grammar): Recognize package prefixes in symbol tokens. Got rid of special rule for handling lone colon. * parser.y (sym_helper): Catch undefined package as a parsing error rather allowing intern function to throw exception.
* Changing the tokenizer to get rid of IDENT, KEYWORD and METAVARKaz Kylheku2013-12-154-56/+105
| | | | | | | | | | | | | | | | | | | | | token categories, replaced by a single one called SYMTOK. Package prefixes are now recognized and processed in tokens. * lib.c (delete_package): Fix problem in no-such-package error case: it would always report nil as the name. (intern): Fix nonsensical error message: in the no-such-package case it would report that the symbol exists already. * parser.l (grammar): Occurences of KEYWORD, METAVAR, and IDENT scrubbed. All rules reporting any of these now return SYMTOK. The main one of these is greatly simplified. * parser.y (sym_helper): New function. (char_from_name): const qualifier inside param's type declaration. (grammar): IDENT, KEYWORD and METAVAR tokens are gone. New token SYMTOK. Grammar refactored around SYMTOK and using the new sym_helper function. (char_from_name): Updated.
* Support for parsing Lisp expression out of strings and streams.Kaz Kylheku2013-12-147-2/+139
| | | | | | | | | | | | | | | | | | | | | | New catenated streams make the Yacc hack possible. * eval.c (eval_init): Register lisp_parse as intrinsic. * parser.h (lisp_parse): Declared. * parser.l: New lexical hack to produce SECRET_ESCAPE_E token. (regex_parse): Move declaration before statements. (lisp_parse): New function. * parser.y (SECRET_ESCAPE_E): New token type. (spec): New production rule for single expression. * stream.c (cat_stream_print, cat_get_line, cat_get_char, cat_get_byte, cat_get_prop): New static functions. (cat_stream_ops): New static function. (make_catenated_stream): New function. * stream.h (make_catenated_stream): Declared.
* New stream property: name. Some streams can reportKaz Kylheku2013-12-134-5/+45
| | | | | | | | | | | | | | | | | their name: some kind of string. * stream.c (name_k): New variable. (null_get_prop): New static function. (null_ops): Wire null_get_prop into ops structure. (stdio_get_prop): Report h->descr as name. (string_in_get_prop): New function. (string_in_ops): Wire string_in_get_prop into ops structure. (stream_init): Initialize name_k. * stream.h (name_k): Declared. * syslog.c (syslog_get_prop): Report "syslog" as stream name.
* * txr.vim: Regenerated.Kaz Kylheku2013-12-131-84/+95
|
* * signal.c (sig_handler): Pass two arguments to signalKaz Kylheku2013-12-133-2/+43
| | | | | | | | | | | | | handler rather than 1. The new argument is the value t, telling the handler that it's asynchronously invoked in a real signal context. If the signal handler returns true, then mark it deferred so that it can re-trigger in a synchronous context. (sig_check): Pass nil as a the second argument to signal handlers, indicating that they are synchronously called, not in a signal handler context. * txr.1: Added documentation.
* * signal.c (set_sig_handler): Disable signals around thisKaz Kylheku2013-12-132-0/+12
| | | | | function because it manipulates the mask of deferred signals which can also be manipulated by an async signal.
* * signal.c (set_sig_handler): Clear the deferred flagKaz Kylheku2013-12-133-1/+122
| | | | | | for a signal that is being set to ignored or default. * txr.1: Documented signals.
* * eval.c (eval_init): Registered vars for signal numbers.Kaz Kylheku2013-12-124-0/+121
| | | | | | | | | | | | * signal.c (sig_hup, sig_int, sig_quit, sig_ill, sig_trap, sig_abrt, sig_bus, val sig_fpe, sig_kill, sig_usr1, sig_segv, sig_usr2, sig_pipe, sig_alrm, val sig_term, sig_chld, sig_cont, sig_stop, sig_tstp, sig_ttin, val sig_ttou, sig_urg, sig_xcpu, sig_xfsz, sigtalrm, sig_prof, val sig_poll, sig_sys, sig_winch, sig_iot, sig_stkflt, sig_io, sig_lost, sig_pwr): New variables. (sig_init): New variables initialized. * signal.h: New variables declared.
* First cut at signal handling support.Kaz Kylheku2013-12-1225-64/+473
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Makefile (OBJS-y): Include signal.o if have_posix_sigs is "y". * configure (have_posix_sigs): New variable, set by detecting POSIX signal stuff. * dep.mk: Regenerated. * arith.c, debug.c, eval.c, filter.c, hash.c, match.c, parser.y, parser.l, rand.c, regex.c, syslog.c, txr.c, utf8.c: Include new signal.h header, now required by unwind, and the <signal.h> system header. * eval.c (exit_wrap): New function. (eval_init): New functions registered as intrinsics: exit_wrap, set_sig_handler, get_sig_handler, sig_check. * gc.c (release): Unused functions removed. * gc.h (release): Declaration removed. * lib.c (init): Call sig_init. * stream.c (set_putc, se_getc, se_fflush): New static functions. (stdio_put_char_callback, stdio_get_char_callback, stdio_put_byte, stdio_flush, stdio_get_byte): Use new functions to enable signals when blocked on I/O. (tail_strategy): Allow signals across sleep. (pipev_close): Allow signals across waitpid. (se_pclose): New static function. (pipe_close): Use new function to enable signals across pclose. * unwind.c (uw_unwind_to_exit_point): use extended_longjmp instead of longjmp. * unwind.h (struct uw_block, struct uw_catch): jb member changes from jmp_buf to extended_jmp_buf. (uw_block_begin, uw_simple_catch_begin, uw_catch_begin): Use extended_setjmp instead of setjmp. * signal.c: New file. * signal.h: New file.
* * configure (config_flags): Variable removed. This was more trouble than itKaz Kylheku2013-12-122-5/+15
| | | | | was worth, and only solved problems caused by not checking that the test program was made all the way to an executable.
* * configure: Fix warnings in test cases for HAVE_FORK_STUFFKaz Kylheku2013-12-123-3/+14
| | | | | | and HAVE_DAEMON. * eval.c: daemon support must be wrapped in #if HAVE_DAEMON