summaryrefslogtreecommitdiffstats
path: root/share
Commit message (Collapse)AuthorAgeFilesLines
...
* compiler: avoid wasteful substitution via %bin-op%.Kaz Kylheku2020-04-201-1/+1
| | | | | | | | * share/txr/stdlib/compiler.tl (%bin-op%): Specify default value argument to relate so that arguments not found in %nary-ops% will match to nil. Otherwise the code in comp-fun-form rewrites all two-argument function calls through this relation, resulting in a bit of wasted consing.
* compiler: bugfix: constant test in 2 or 3 arg if.Kaz Kylheku2020-04-201-2/+2
| | | | | | | | | | | | | | | | * share/txr/stdlib/compiler.tl (compiler comp-if): The two and three argument cases assume that if the test is a constant expression, the consequent "then" should be unconditionally taken. The correct behavior is to evaluate the constant, which could yield nil. I checked which library code changes after this fix, and found that a number of (defset ...) forms are generating different, shorter code. This is due to (if ',restpar (if (consp ,restpar) ...)) in defset-expander. The intent there was to eliminate the inner if code entirely if respar is nil (there is no rest parameter); due to this bug, the code elimination didn't happen. The behavior is nevertheless correct because the code does nothing if restpar is nil.
* Version 236.txr-236Kaz Kylheku2020-04-181-1/+1
| | | | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise. * txr.vim, tl.vim: Regenerated.
* path-testing functions: accept file descriptor.Kaz Kylheku2020-04-181-4/+3
| | | | | | | * share/txr/stdlib/path-test.tl (do-path-test): Pass all argument types to statfun, except if they are of type stat. * txr.1: Documented.
* New function: touch.Kaz Kylheku2020-04-151-0/+7
| | | | | | | | | * lisplib.c (copy_file_set_entries): Register autoload for touch. * share/txr/stdlib/copy-file.tl (touch): New function. * txr.1: Documented.
* ignwarn: handle warnings with multiple args.Kaz Kylheku2020-04-131-1/+1
| | | | | | * share/txr/stdlib/except.tl (ignwarn): Warnings have more than one argument; the handling lambda must take variable args.
* Version 235.txr-235Kaz Kylheku2020-04-121-1/+1
| | | | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise. * txr.vim, tl.vim: Regenerated.
* path testing functions: accept stream argument.Kaz Kylheku2020-04-091-1/+4
| | | | | | | * share/txr/stdlib/path-test.tl (do-path-test): Check also for the argument being a stream, and pass to statfun. * txr.1: Documentation updated and improved.
* dump-compiled-objects: wrong self name.Kaz Kylheku2020-03-221-1/+1
| | | | | * share/txr/stdlib/compiler.tl (dump-compiled-objects): Fixed incorrect value of self variable.
* compile-file: propagate permissions for hash bang programs.Kaz Kyheku2020-03-101-1/+20
| | | | | | | | | | * share/txr/stdlib/compiler.tl (propagate-perms): New function. (compile-file-conditionally): If the source file is a hash bang script, then call propagate-perms just before closing the streams. * txr.1: Documented the permission propagation.
* Version 233.txr-233Kaz Kylheku2020-03-081-1/+1
| | | | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise. * txr.vim, tl.vim: Regenerated.
* getopts: new feature: cumulative options.Kaz Kyheku2020-03-061-12/+46
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | An option declared as (cumul <type>) indicates that it is of type <type>, and that multiple occurrences of the option produce values that are accumulated into a list. The accumulation is in reverse order: the rightmost occurrence ends up the first in the list. * lisplib.c (getopts_set_entries): Add cumul to list of interned symbols, so that the getopts.tl code isn't mistakenly working with sys:cumul. * share/txr/stdlib/getopts.tl (opt-parsed): New slot, cumul. (opt-desc basic-type p, opt-desc list-type-p, opt-desc cumul-type-p): New methods. (opt-desc check): Rework type validity check using the new methods. (opt-parsed convert-type): Support 'cumul type by instantiating an opt-parsed object for the wrapped type, and stealing its converted argument into the current object, and setting the cumul flag. (opts add-opt, option-base add-opt): Support options that have the cumul flag set by accumulating list values. The code is different due to different amounts of encapsulation. The opts structure stores the raw opt-parsed objects, whereas option-base just takes the decoded values. (opthelp): Parse through the (cumul ...) type syntax, so cumulative options are printed in the help text the same way as if they were non-cumulative. * txr.1: Documented.
* getopts: bugfix in short option processing.Kaz Kyheku2020-03-061-6/+6
| | | | | | | | * share/txr/stdlib/getopts.tl (sys:opt-processor parse-shorts): There is a scoping mixup here with the opts argument shadowed by a same-named lexical variable, causing a referential mixup. Also fixed bad indentation.
* compiler: remove useless consp test.Kaz Kylheku2020-02-131-56/+55
| | | | | * share/txr/stdlib/compiler.tl (compiler compile): If the form isn't an atom, then consp is implied.
* copy-file.tl: mode change.Kaz Kyheku2020-02-121-0/+0
| | | | | | * share/txr/stdlib/copy-file.tl: Remove execute permissions that had been accidentally applied before this file was placed under version control.
* Version 232.txr-232Kaz Kylheku2020-02-091-1/+1
| | | | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise. * txr.vim, tl.vim: Regenerated.
* file-place-buf: bugfix: create file if doesn't exist.Kaz Kylheku2020-02-071-1/+1
| | | | | | | * share/txr/stdlib/getput.tl (file-place-buf): Instead of "r+" mode, use the new "mb" mode which will create the file without truncating it, and open for write mode. Also, bugfix: the "b" option was missing.
* file-put-buf: new argument; also, new file-place-bufKaz Kylheku2020-02-071-1/+9
| | | | | | | | | | | | | Like file-put-buf but doesn't overwrite the file. * lisplib.c (getput_set_entries): New autoload for file-place-buf. * share/txr/stdlib/getput.tl (file-put-buf): New argument for seeking into the file. (file-place-buf): New function. * txr.1: Documented.
* file-get-buf: size limit, seek offset.Kaz Kyheku2020-02-051-12/+21
| | | | | | | | | | * share/txr/stdlib/getput.tl (sys:get-buf-common): Take two more arguments for maximum bytes to read and offset. Read loop simplified with fill-buf-adjust. (file-get-buf, command-get-buf): Take two new arguments, pass though to sys:get-buf-common. * txr.1: Documented.
* New functions chmod-rec and chown-rec.Kaz Kylheku2020-01-311-0/+29
| | | | | | | | | | | * lisplib.c (copy_file_set_entries): Add chown-rec and chmod-rec to list of symbols that trigger auto-load of copy-file.tl. * share/txr/stdlib/copy-file.tl (chmod-rec, chown-rec): Neew functions. * txr.1: Documented.
* copy-file: detect directory before opening.Kaz Kylheku2020-01-301-10/+13
| | | | | | | | * share/txr/stdlib/copy-file.tl (copy-file): Detect that from-path is a directory before attempting to open it. The issue is that the open will succeed for a directory, and only the subsequent read will fail. By that time we have opened created the target file.
* New: file copy, recursive copy, recursive delete.Kaz Kylheku2020-01-291-0/+184
| | | | | | | | | | | | | * lisplib.c (copy_file_instantiate, copy_file_set_entries): New static functions. (lisplib_init): Register auto-load of copy-file.tl via new functions. * share/txr/stdlib/copy-file.tl: New file. * txr.1: New section Unix Filesystem Complex Operations. Here copy-file, copy-files, copy-path-rec and remove-path-rec are documented.
* compiler: bug in catch: frame level mismatch.Kaz Kylheku2020-01-281-2/+2
| | | | | | | | | | | | * share/txr/stdlib/compiler.tl (compiler comp-catch): Compile the try expression and the description in the newly extended environment rather than the original environment. This is necessary because the compiled code for both of these is is placed into the frame level corresponding to the new environment. Other than the level, the only difference between the two environment is that nenv has a couple of gensyms. Thus it is hygienic w.r.t. the try and desc code; the extended environment can safely be used.
* with-resources: support multiple cleanup forms.Kaz Kyheku2020-01-151-5/+5
| | | | | | | | * share/txr/stdlib/with-resources.tl (with-resources): Rearrange tree-case cases to recognize a sequence of cleanup forms and insert into the output accordingly. * txr.1: Documented.
* Version 231.txr-231Kaz Kylheku2020-01-121-1/+1
| | | | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise. * txr.vim, tl.vim: Regenerated.
* Copyright year bump 2020.Kaz Kylheku2019-12-3136-36/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * LICENSE, LICENSE-CYG, METALICENSE, Makefile, alloca.h, args.c, args.h, arith.c, arith.h, buf.c, buf.h, cadr.c, cadr.h, chksum.c, chksum.h, chksums/crc32.c, chksums/crc32.h, combi.c, combi.h, configure, debug.c, debug.h, eval.c, eval.h, ffi.c, ffi.h, filter.c, filter.h, ftw.c, ftw.h, gc.c, gc.h, glob.c, glob.h, hash.c, hash.h, itypes.c, itypes.h, jmp.S, lib.c, lib.h, linenoise/linenoise.c, linenoise/linenoise.h, lisplib.c, lisplib.h, match.c, match.h, parser.c, parser.h, parser.l, parser.y, protsym.c, rand.c, rand.h, regex.c, regex.h, share/txr/stdlib/asm.tl, share/txr/stdlib/awk.tl, share/txr/stdlib/build.tl, share/txr/stdlib/cadr.tl, share/txr/stdlib/compiler.tl, share/txr/stdlib/conv.tl, share/txr/stdlib/debugger.tl, share/txr/stdlib/defset.tl, share/txr/stdlib/doloop.tl, share/txr/stdlib/error.tl, share/txr/stdlib/except.tl, share/txr/stdlib/ffi.tl, share/txr/stdlib/getopts.tl, share/txr/stdlib/getput.tl, share/txr/stdlib/hash.tl, share/txr/stdlib/ifa.tl, share/txr/stdlib/keyparams.tl, share/txr/stdlib/op.tl, share/txr/stdlib/package.tl, share/txr/stdlib/param.tl, share/txr/stdlib/path-test.tl, share/txr/stdlib/place.tl, share/txr/stdlib/pmac.tl, share/txr/stdlib/save-exe.tl, share/txr/stdlib/socket.tl, share/txr/stdlib/stream-wrap.tl, share/txr/stdlib/struct.tl, share/txr/stdlib/tagbody.tl, share/txr/stdlib/termios.tl, share/txr/stdlib/trace.tl, share/txr/stdlib/txr-case.tl, share/txr/stdlib/type.tl, share/txr/stdlib/vm-param.tl, share/txr/stdlib/with-resources.tl, share/txr/stdlib/with-stream.tl, share/txr/stdlib/yield.tl, signal.c, signal.h, socket.c, socket.h, stream.c, stream.h, struct.c, struct.h, strudel.c, strudel.h, sysif.c, sysif.h, syslog.c, syslog.h, termios.c, termios.h, tree.c, tree.h, txr.1, txr.c, txr.h, unwind.c, unwind.h, utf8.c, utf8.h, vm.c, vm.h, vmop.h, win/cleansvg.txr: Extended copyright notices to 2020.
* New function: compile-update-file.Kaz Kylheku2019-12-221-57/+73
| | | | | | | | | | | | | | | | | | | | | | | | | | The new function only compiles a file if the output file doesn't exist or is out of date. In addition, both compile-file now deletes the output file if compilation fails, and has a documented return value. * lisplib.c (compiler_set_entries): Add autoload entry fro compile-update-file. (open-compile-streams): Accepts a third argument: a function to test the input stream against the output path. The output file is opened, and the streams are returned, only if that test function returns true. Also, a third element is returned: the output path. This lets the caller to know what to delete, if the output file must be deleted. (compile-file-conditionally): New internal function, formed from compile-file. Takes an extra argument, the test function to pass to open-compile-streams. Compilation is skipped if open-compile-streams returns nil. Internals reshuffled a bit. If compilation doesn't set the success flag, then the with-resources logic now removes the output file in addition to closing the output stream. Prior to setting the success flag, we flush the output stream. * txr.1: Documented new function, all return values, and deletion of output file on unsuccessful compilation.
* Version 230.txr-230Kaz Kylheku2019-12-201-1/+1
| | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise.
* Version 229.txr-229Kaz Kylheku2019-12-141-1/+1
| | | | | | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise. * txr.vim, tl.vim: Regenerated. * protsym.c: Likewise.
* define-option-struct: use multiple inheritanceKaz Kylheku2019-12-131-14/+22
| | | | | | | | | | | | * share/txr/stdlib/getopts.tl (sys:option-base): New struct type, holding the boiler-plate methods and slots that were generated into the user-defined struct by define-option-struct. (define-option-struct): Inject the required properties by inheritance from sys:option-base, greatly reducing code bloat in the macro. The slot hash and opt-desc-list static slots have to be redefined in the derived structure so that type has its own instance of them.
* OOP: implementing multiple inheritance.Kaz Kylheku2019-12-111-8/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Multiple inheritance is too useful to ignore any longer. * lib.c (subtypep): Perform subtypep calculation between two struct types via the new struct_subtype_p function. It's too complicated now to do with ad hoc code outside of struct.c. * share/txr/stdlib/struct.tl (defstruct): This macro now needs to deal with the super argument being possibly a list of base types instead of a single one. * strut.c (struct struct_type): Member super and super_handle are removed. New member nsupers, supers, and sus. (struct_init): The super function re-registered; it has an optional argument. (call_stinitfun_chain): The compat code here must now access the supertype differently. We don't bother dealing with multiple inheritance in the compat case; programs requesting compatibility with TXR 151 shoudn't be trying to use multiple inheritance. (get_struct_handles, count_super_stslots, get_super_slots, find_super_for_slot): New static functions, to off-load some new complexity from make_struct_type. (make_struct_type): Handle the increased complexity due to multiple inheritance. (super): Takes an additional argument now, to request which supertype to retrieve. Defaults to zero: the first one. (struct_type_destroy): Free the sus array. (struct_type_mark): Mark the supers slot. (call_initfun_chain): Call init functions of all bases, in right-to-left order. (call_postinitfun_chain): Likewise for postinit functions. (call_super_method, call_super_fun, super_method): Use the first base as the supertype. This requirement feels bad; it needs to be revisited. (do_struct_subtype_p): New static function. (struct_subtype_p): New function. (ancestor_with_static_slot): New static function. (method_name): Revised for multiple inheritance; now relies on ancestor_with_static_slot to find the original ancestor that has brought in a method, so we can use that type in the method name. * struct.h (super): Declaration updated. (struct_subtype_p): Declared. * tests/012/oop-mi.expected: New file. * tests/012/oop-mi.tl: New test cases. * txr.1: Revised in order to document multiple inheritance.
* New function: path-dir-empty.Kaz Kylheku2019-12-091-0/+9
| | | | | | | | | | * lisplib.c (path_test_set_entries): Autoload entry for path-dir-empty. * share/txr/stdlib/path-test.tl (path-dir-empty): New function. * txr.1: Documented.
* disassemble: d and t regs in decimal.Kaz Kylheku2019-11-291-2/+2
| | | | | | | | * share/txr/stdlib/asm.tl (operand-to-sym): Use decimal with no leading zeros for t and d registers. Only the v registers use hex, because that helps unravel their level structure. The data table is dumped with decimal numbering, so the d registers being decimal makes it easier to cross-ref.
* getopt: tweak multi-line literals in help textKaz Kylheku2019-11-291-26/+25
| | | | | | | | | * share/txr/stdlib/getopts.tl (opthelp): Use a different line breaking approach for literals: the escaped space is now at the end of the previous line, rather than at the start of the next line, which looks nicer. We don't do this for the option type legend, because that has some instances of leading space alignment, which requires a leading backslash.
* getopts: new define-option-struct macro.Kaz Kylheku2019-11-291-0/+23
| | | | | | | | | | | | This provides more streamlined option processing. * lisplib.c (getopts_set_entries): Add auto-load entry for define-option-struct. * share/txr/stdlib/getopts.tl (define-option-struct): New macro. * txr.1: Documented.
* getopts: rename add method to add-opt.Kaz Kylheku2019-11-291-5/+5
| | | | | | | | | | | | | The reason for this rename is that add is a public symbol in the usr package, thanks to the build macro. This will interfere with an upcoming feature under which options appear directly as struct slots, defined by symbols. If a user defines an --add option using the symbol add, it will clash with the add method. But add-opt will be sys:add-opt. * share/txr/stdlib/getopts.tl (opts add): Rename to add-opt. (sys:opt-processor parse-long, sys:opt-processor parse-shorts): Follow rename.
* getopts: move opts object into opt-processor.Kaz Kylheku2019-11-281-20/+24
| | | | | | | | | | | | | | | | | | | | | | | | | The methods of sys:opt-processor pass down an argument called out which is an opts instance that is created in parse-opts. In this patch, we move that argument into a new slot of the sys:opt-processor object, named opts. We instantiate the opts structure in the getopts function instead. The motivation here is that (meth sys:opt-processor parse-opts) doesn't know which type of opts object it is working with; its user is now responsible for instantiating the object and installing it as the opts slot. * share/txr/stdlib/getopts.tl (sys:opt-processor): New slot, opts. (sys:opt-processor (parse-long, parse-shorts): Drop out argument; refer to me.opts instead of it. (sys:opt-processor parse-opts): Don't instantiate opts object here, and don't pass it to parse-long and parse-shorts which no longer take that argument. Rather, rely on it already being installed into the opts slot. (getopts): Instantiate opts here, and specify it as the opts slot of the sys:opt-processor object also being instantiated here.
* getopts: remove unused opt-processor slot from opts.Kaz Kylheku2019-11-281-3/+2
| | | | | | | | * share/txr/stdlib/getopts.tl (opts): opt-processor slot removed. (sys:opt-processor parse-opts): When instantiating opts, do not initialize the opt-processor slot with a backpointer to self object. It is not referenced anywhere.
* getopts: print types in help without colon.Kaz Kylheku2019-11-281-2/+2
| | | | | | | | * share/txr/stdlib/getopts.tl (opthelp): Use symbol-name to get the string representation of type keywords instead of tostringp, so there is no leading colon. In the type legend, we don't have any colon. For instance --gravity=FLOAT rather than --gravity=:FLOAT.
* getopts: simplify build-hash.Kaz Kylheku2019-11-281-5/+3
| | | | | | share/txr/stdlib/getopts.tl (sys:opt-processor build-hash): Don't construct (list od.long od.short) twice and iterate through it twice; make just one and process it in one pass.
* Version 228.txr-228Kaz Kylheku2019-11-181-1/+1
| | | | | | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise. * txr.vim, tl.vim: Regenerated. * protsym.c: Likewise.
* op: fix wrong compat version value.Kaz Kylheku2019-11-181-1/+1
| | | | | | * share/txr/stdlib/op.tl (sys:op-expand): The compatibility version check should be against 225, not against the not yet existent 255.
* compiler: first use of .? notation.Kaz Kylheku2019-11-061-1/+1
| | | | | * share/txr/stdlib/compiler.tl (sys:env postinit): The the initialization of me.lev becomes more succinct.
* syntax: new .? operator for null-safe object access.Kaz Kylheku2019-11-051-27/+40
| | | | | | | | | | | | | | | | | | | | | | | | | | | * lib.c (obj_print_impl): Render the new syntactic conventions introduced in qref/uref back into the .? syntax. The printers for qref and uref are united into a single implementation to reduce code proliferation. * parser.l (grammar): Produce new tokens OREFDOT and UOREFDOT. * parser.y (OREFDOT, UREFDOT): New terminal symbols. (n_expr): Handle .? syntax via the new OREFDOT and UOREFDOT token via qref_helper and uoref_helper. Logic for the existing referencing dot is moved into the new qref_helper function. (n_dot_expr): Handle .? syntax via uoref_helper. (uoref_helper, qref_helper): New static functions. * share/txr/stdlib/struct.tl (qref): Handle the new case when the expression which gives the object is (t expr). Handle the new case when the first argument after the object has this form, and is followed by more arguments. Both these cases emit the right conditional code. (uref): Handle the leading .? syntax indicated by a leading t by generating a lambda which checks its argument for nil. Transformations to qref handle the other cases. * txr.1: Documentation updated in several places.
* path-tests: bug in path-strictly-private-to-me-p.Kaz Kylheku2019-11-041-1/+1
| | | | | | | | | | * share/txr/stdlib/path-test.tl (path-strictly-private-to-me): Fix mistake in test whether the file is group readable/writable. The wrong flag is used for group readability test, which means that, at that point in the logic, if the file is merely not group writable, we jump to the conclusion that the file is strictly private, when in fact it may be group readable. Reported by user vapnik spaknik.
* path-tests: fix incorrect type tests.Kaz Kylheku2019-11-031-7/+11
| | | | | | | | | | | | | | Reported by user vapnik spaknik, who discovered the path-symlink-p function yielding a false positive on a regular file. The functions in this group are bit testing rather than extracting a bitfield and checking the enumerated value. * share/txr/stdlib/path-test.tl (sys:path-test-type): New function. (path-file-p, path-dir-p, path-symlink-p, path-blkdev-p, path-chrdev-p, path-sock-p, path-pipe-p): Use sys:path-test-type rather than sys:path-test-mode.
* stat: support high resolution time stamps.Kaz Kylheku2019-10-291-1/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | * configure (have_sys_stat): New variable. Set to y when our test detects <sys/stat.h>. New test added for the presence of high resolution time stamps in struct stat. If we have these, we #define HAVE_STAT_NSEC 1 in config.h. * share/txr/stdlib/path-test.tl (path-newer): Compare nanosecond parts of the modification time if the seconds are equal, improving the resolution of the test. * sysif.c (atime_nsec_s, mtime_nsec_s, ctime_nsec_s): New symbol variables. (stat_to_struct): If nanosecond resolution is available, set the new nanosecond slots from the three tv_nsec fields in struct stat. Otherwise, set the new slots to zero. (sysif_init): Initialize the new symbol variables. Add the three new slots to the stat struct. * sysif.c (atime_nsec_s, mtime_nsec_s, ctime_nsec_s): Declared. * txr.1: Documented new atime-nsec, mtime-nsec and ctime-nsec slots of stat structure. Added note to path-newer mentioning high resolution support.
* Version 227.txr-227Kaz Kylheku2019-10-261-1/+1
| | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise.
* Version 226.txr-226Kaz Kylheku2019-10-251-1/+1
| | | | | | | | | | | | * RELNOTES: Updated. * configure, txr.1: Bumped version and date. * share/txr/stdlib/ver.tl: Likewise. * txr.vim, tl.vim: Regenerated. * protsym.c: Likewise.
* stdlib: remove unneeded macros from compiled image.Kaz Kylheku2019-10-243-40/+44
| | | | | | | | | | | | | | | | | | A few macros in the library are local; they are needed only inside functions in the same module. This means they are not referenced by anything once those functions are compiled; we should not be carrying the compiled versions of these macros into the image. We wrap these macro definitions with eval-only, telling the compiler not to emit their compiled version into the output file. * share/txr/stdlib/asm.tl (with-lev-idx, defopcode, defopcode-derived): Wrap macro with eval-only. * share/txr/stdlib/compiler.tl (compile-in-toplevel): Likewise. * share/txr/stdlib/path-test.tl (sys:path-test): Likewise.