ADDED GPL Index: GPL ================================================================== --- GPL +++ GPL @@ -0,0 +1,345 @@ +GNU GENERAL PUBLIC LICENSE + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to +share and change it. By contrast, the GNU General Public License is intended +to guarantee your freedom to share and change free software--to make sure +the software is free for all its users. This General Public License applies +to most of the Free Software Foundation's software and to any other program +whose authors commit to using it. (Some other Free Software Foundation +software is covered by the GNU Library General Public License instead.) You +can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom +to distribute copies of free software (and charge for this service if you +wish), that you receive source code or can get it if you want it, that you +can change the software or use pieces of it in new free programs; and that +you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to +deny you these rights or to ask you to surrender the rights. These +restrictions translate to certain responsibilities for you if you distribute +copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or +for a fee, you must give the recipients all the rights that you have. You +must make sure that they, too, receive or can get the source code. And you +must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If +the software is modified by someone else and passed on, we want its +recipients to know that what they have is not the original, so that any +problems introduced by others will not reflect on the original authors' +reputations. + +Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program +proprietary. To prevent this, we have made it clear that any patent must be +licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms +of this General Public License. The "Program", below, refers to any such +program or work, and a "work based on the Program" means either the Program +or any derivative work under copyright law: that is to say, a work +containing the Program or a portion of it, either verbatim or with +modifications and/or translated into another language. (Hereinafter, +translation is included without limitation in the term "modification".) Each +licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered +by this License; they are outside its scope. The act of running the Program +is not restricted, and the output from the Program is covered only if its +contents constitute a work based on the Program (independent of having been +made by running the Program). Whether that is true depends on what the +Program does. + +1. You may copy and distribute verbatim copies of the Program's source code +as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this +License and to the absence of any warranty; and give any other recipients of +the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you +may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, +thus forming a work based on the Program, and copy and distribute such +modifications or work under the terms of Section 1 above, provided that you +also meet all of these conditions: + + * a) You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. + + * b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any part + thereof, to be licensed as a whole at no charge to all third parties + under the terms of this License. + + * c) If the modified program normally reads commands interactively when + run, you must cause it, when started running for such interactive use + in the most ordinary way, to print or display an announcement including + an appropriate copyright notice and a notice that there is no warranty + (or else, saying that you provide a warranty) and that users may + redistribute the program under these conditions, and telling the user + how to view a copy of this License. (Exception: if the Program itself + is interactive but does not normally print such an announcement, your + work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be +reasonably considered independent and separate works in themselves, then +this License, and its terms, do not apply to those sections when you +distribute them as separate works. But when you distribute the same sections +as part of a whole which is a work based on the Program, the distribution of +the whole must be on the terms of this License, whose permissions for other +licensees extend to the entire whole, and thus to each and every part +regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise +the right to control the distribution of derivative or collective works +based on the Program. + +In addition, mere aggregation of another work not based on the Program with +the Program (or with a work based on the Program) on a volume of a storage +or distribution medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 +and 2 above provided that you also do one of the following: + + * a) Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 + above on a medium customarily used for software interchange; or, + + * b) Accompany it with a written offer, valid for at least three years, + to give any third party, for a charge no more than your cost of + physically performing source distribution, a complete machine-readable + copy of the corresponding source code, to be distributed under the + terms of Sections 1 and 2 above on a medium customarily used for + software interchange; or, + + * c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed only + for noncommercial distribution and only if you received the program in + object code or executable form with such an offer, in accord with + Subsection b above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all +the source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and +installation of the executable. However, as a special exception, the source +code distributed need not include anything that is normally distributed (in +either source or binary form) with the major components (compiler, kernel, +and so on) of the operating system on which the executable runs, unless that +component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to +copy from a designated place, then offering equivalent access to copy the +source code from the same place counts as distribution of the source code, +even though third parties are not compelled to copy the source along with +the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, +modify, sublicense or distribute the Program is void, and will automatically +terminate your rights under this License. However, parties who have received +copies, or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed +it. However, nothing else grants you permission to modify or distribute the +Program or its derivative works. These actions are prohibited by law if you +do not accept this License. Therefore, by modifying or distributing the +Program (or any work based on the Program), you indicate your acceptance of +this License to do so, and all its terms and conditions for copying, +distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these terms +and conditions. You may not impose any further restrictions on the +recipients' exercise of the rights granted herein. You are not responsible +for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot distribute so +as to satisfy simultaneously your obligations under this License and any +other pertinent obligations, then as a consequence you may not distribute +the Program at all. For example, if a patent license would not permit +royalty-free redistribution of the Program by all those who receive copies +directly or indirectly through you, then the only way you could satisfy both +it and this License would be to refrain entirely from distribution of the +Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents +or other property right claims or to contest validity of any such claims; +this section has the sole purpose of protecting the integrity of the free +software distribution system, which is implemented by public license +practices. Many people have made generous contributions to the wide range of +software distributed through that system in reliance on consistent +application of that system; it is up to the author/donor to decide if he or +she is willing to distribute software through any other system and a +licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original +copyright holder who places the Program under this License may add an +explicit geographical distribution limitation excluding those countries, so +that distribution is permitted only in or among countries not thus excluded. +In such case, this License incorporates the limitation as if written in the +body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of +the General Public License from time to time. Such new versions will be +similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software +Foundation, write to the Free Software Foundation; we sometimes make +exceptions for this. Our decision will be guided by the two goals of +preserving the free status of all derivatives of our free software and of +promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO +THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM +PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO +LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR +THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively convey the +exclusion of warranty; and each file should have at least the "copyright" +line and a pointer to where the full notice is found. + +one line to give the program's name and an idea of what it does. +Copyright (C) yyyy name of author + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when +it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) yyyy name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details +type `show w'. This is free software, and you are welcome +to redistribute it under certain conditions; type `show c' +for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may be +called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright +interest in the program `Gnomovision' +(which makes passes at compilers) written +by James Hacker. + +signature of Ty Coon, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General Public +License instead of this License. + ------------------------------------------------------------------------ +Return to GNU's home page. + +FSF & GNU inquiries & questions to gnu@gnu.org. Other ways to contact the +FSF. + +Comments on these web pages to webmasters@www.gnu.org, send other questions +to gnu@gnu.org. + +Copyright notice above. +Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +02111, USA Index: Makefile.in ================================================================== --- Makefile.in +++ Makefile.in @@ -1,9 +1,9 @@ # -*- make -*- # # FILE: "/home/joze/src/tclreadline/Makefile.in" -# LAST MODIFIED: "Sun Feb 28 17:48:01 1999 (joze)" +# LAST MODIFIED: "Sun Feb 28 17:54:34 1999 (joze)" # (C) 1998, 1999 by Johannes Zellner # Johannes.Zellner@physik.uni-karlsruhe.de # $Id$ # --- # @@ -173,11 +173,11 @@ MISC = README GPL MAN = tclreadline.n -CIFLAGS = -t-"gnu readline for tcl" -m"ci after porting this to configure" +CIFLAGS = -t-"gnu readline for tcl" -m"before initial relase" .PHONY: clean distclean ctags tcltags vimtags tags ci co .SUFFIXES: .c .o .so .sl .tcl @@ -252,15 +252,15 @@ vimtags tags: vimtags -ci: $(SOURCES) - ci -r"0.1" -l $(CIFLAGS) $(SOURCES) +ci: $(SOURCES) $(MISC) + ci -l $(CIFLAGS) $^ -co: $(SOURCES) - co -l $(SOURCES) +co: $(SOURCES) $(MISC) + co -l $^ distribution: $(SOURCES) configure $(AUXILIARY) $(MISC) - mkdir tclreadline-$(VERSION) - mkdir tclreadline-$(VERSION)/aux - cp $(SOURCES) $(MISC) configure tclreadline-$(VERSION) ADDED README Index: README ================================================================== --- README +++ README @@ -0,0 +1,63 @@ + +tclreadline + +$Id$ + +1. Introduction +--------------- + +This directory contains the sources and documentation for tclreadline, +which builds a connection between tcl and the gnu readline. +The information here corresponds to release 0.7 (initial developers release). + +2. Documentation +---------------- + +The "doc" subdirectory in this release contains the reference manual entries +for tclreadline. If you only want to use tclreadline as a tool for interactive +script development, you don't have to read this manual page at all. Simply +change your .tclshrc according to the next section. + +3. Compiling and installing tclreadline +------------------------------- + +This release will probably only build under UNIX (Linux). + +Before trying to compile tclreadline you should do the following things: + + (a) Make sure you have tcl 8.0 or higher. I've tested tclreadline + with tcl 8.0.3 and 8.0.4. tclreadline relies on a proper tcl + installation: + It uses the tclConfig.sh file, which should reside somewhere + in /usr/local/lib/ or /usr/local/lib/tcl8.0/... + + /* ================================================================== + + FILE: "/home/joze/src/tclreadline/README" + LAST MODIFIED: "Sun Feb 28 15:04:28 1999 (joze)" + (C) 1998, 1999 by Johannes Zellner + Johannes.Zellner@physik.uni-karlsruhe.de + $Id$ + --- + + tclreadline -- gnu readline for tcl + Copyright (C) 1999 Johannes Zellner + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Johannes.Zellner@physik.uni-karlsruhe.de + http://krisal.physik.uni-karlsruhe.de/~joze + + ================================================================== */ Index: tclreadline.c ================================================================== --- tclreadline.c +++ tclreadline.c @@ -1,19 +1,44 @@ -/* - * FILE: "/home/joze/tmp/tclreadline/tclreadline.c" - * LAST MODIFIED: "Sat Oct 03 03:06:54 1998 (joze)" - * (c) 1998 by Johannes Zellner - * Johannes.Zellner@physik.uni-karlsruhe.de - * $Id$ - */ + + /* ================================================================== + FILE: "/home/joze/src/tclreadline/tclreadline.c" + LAST MODIFIED: "Sun Feb 28 15:01:31 1999 (joze)" + (C) 1998, 1999 by Johannes Zellner + Johannes.Zellner@physik.uni-karlsruhe.de + $Id$ + --- + + tclreadline -- gnu readline for tcl + Copyright (C) 1999 Johannes Zellner + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Johannes.Zellner@physik.uni-karlsruhe.de + http://krisal.physik.uni-karlsruhe.de/~joze + ================================================================== */ + #include #include #include #include #include #include + +#include #define MALLOC(size) Tcl_Alloc ((int) size) #define FREE(ptr) if (ptr) Tcl_Free ((char *) ptr) #define _CMD_SET (1 << 0) @@ -50,13 +75,10 @@ STRIPRIGHT (ptr); \ } while (0) - /* -extern char *rl_readline_name = "tclreadline"; - */ /* * forward declarations. */ @@ -76,10 +98,16 @@ static int line_complete = 0; static char *line = (char *) NULL; + +/* + * Script to set the tclreadline library path in the + * variable global "tclreadline_library" + */ + int TclReadlineCmd (clientData, interp, argc, argv) ClientData clientData; /* Main window associated with interpreter */ Tcl_Interp *interp; /* Current interpreter */ @@ -155,10 +183,18 @@ goto BAD_COMMAND; else if (TclReadlineKnownCommands (argv[2], (int) 0, _CMD_SET)) Tcl_AppendResult (interp, "unable to add command \"", argv[2], "\"\n", (char *) NULL); } + else if (c == 'c' && strncmp (argv[1], "complete", length) == 0) { + if (argc != 3) + goto BAD_COMMAND; + else if (Tcl_CommandComplete (argv[2])) + Tcl_AppendResult (interp, "1", (char *) NULL); + else + Tcl_AppendResult (interp, "0", (char *) NULL); + } else goto BAD_COMMAND; return TCL_OK; @@ -165,11 +201,11 @@ BAD_COMMAND: Tcl_AppendResult (interp, "wrong # args: should be \"readline option ?arg ...?\"", (char *) NULL); - return TCL_ERROR; + return (TCL_ERROR); } void TclReadlineDataAvailableHandler (ClientData clientData, int mask) { @@ -192,23 +228,22 @@ return (Tclreadline_Init (interp)); } int Tclreadline_Init (Tcl_Interp *interp) { + Tcl_CreateCommand (interp, "::tclreadline::readline", TclReadlineCmd, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); return (Tcl_PkgProvide (interp, "tclreadline", TCLREADLINE_VERSION)); } char *TclReadlineInitialize (char *historyfile) { + rl_readline_name = "tclreadline"; using_history (); - /* - rl_event_hook = TclReadlineEventHook; - */ /* * try to read historyfile in home * directory. If this failes, this * is *not* an error. ADDED tclreadline.h.in Index: tclreadline.h.in ================================================================== --- tclreadline.h.in +++ tclreadline.h.in @@ -0,0 +1,34 @@ + + /* ================================================================== + + FILE: "/home/joze/src/tclreadline/tclreadline.h.in" + LAST MODIFIED: "Sun Feb 28 15:04:08 1999 (joze)" + (C) 1998, 1999 by Johannes Zellner + Johannes.Zellner@physik.uni-karlsruhe.de + $Id$ + --- + + tclreadline -- gnu readline for tcl + Copyright (C) 1999 Johannes Zellner + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Johannes.Zellner@physik.uni-karlsruhe.de + http://krisal.physik.uni-karlsruhe.de/~joze + + ================================================================== */ + +static char *TCLREADLINE_VERSION = "@TCLREADLINE_VERSION@"; + ADDED tclreadline.n.in Index: tclreadline.n.in ================================================================== --- tclreadline.n.in +++ tclreadline.n.in @@ -0,0 +1,194 @@ +.TH tclreadline 1 "@TCLREADLINE_VERSION@" "Johannes Zellner" + +.\" FILE: "/home/joze/src/tclreadline/tclreadline.n.in" +.\" LAST MODIFIED: "Sun Feb 28 17:46:54 1999 (joze)" +.\" (C) 1999 by Johannes Zellner +.\" Johannes.Zellner@physik.uni-karlsruhe.de +.\" $Id$ +.\" --- +.\" +.\" tclreadline -- display 2-D data of arbitrary format +.\" Copyright (C) 1999 Johannes Zellner +.\" +.\" This program is free software; you can redistribute it and/or +.\" modify it under the terms of the GNU General Public License +.\" as published by the Free Software Foundation; either version 2 +.\" of the License, or (at your option) any later version. +.\" +.\" This program is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +.\" GNU General Public License for more details. +.\" +.\" You should have received a copy of the GNU General Public License +.\" along with this program; if not, write to the Free Software +.\" Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.\" +.\" Johannes.Zellner@physik.uni-karlsruhe.de +.\" http://krisal.physik.uni-karlsruhe.de/~joze + + +.SH NAME +tclreadline \- gnu readline for the tcl scripting language + + +.SH SYNOPSIS +.TP 6 +\fB::tclreadline::readline\fP \fIcommand\fP [\fIoptions\fP] + + +.SH DESCRIPTION + +The \fBtclreadline\fP package makes the gnu readline available +to the scripting language tcl. The package is thought primarily +for developers, who want to use the line editing and history expansion +capabilities of the gnu readline while interactively developing +tcl scripts. The tclreadline can also be used for tcl scripts +which want to use a shell like input interface. In this case the +\fB::tclreadline::read\fP command has to be called explicitly. This +command will print a prompt and return the line which was typed +by the user. + +.PP + +The advantage of \fBtclreadline\fP is that it uses the callback +handler mechanism of the gnu readline while it processes tcl +events. This way X events from a wish gui will processed as +well as events from the \fPtclreadline\fP line interface. + + +.\".SH SOURCE FILES + + +.SH COMMANDS + +If you want to use \fBtclreadline\fP as a line interface +for developing tcl scripts, you probably don't have to read +this section. + +.PP +The following list will give all commands, which are currently +implemented in the shared lib (e.g. libtclreadline0.7.so). +Additional commands were introduced in a startup script +\fBtclreadlineSetup.tcl\fP, which lives in the tclreadline +installation directory. +(typically something like /usr/local/lib/tclreadline ..) +These commands are primarily for internal use and not documented here. + +Note that all commands reside in the namespace \fB::tclreadline::\fP. + + +.TP 5 +\fB::tclreadline::readline add\fP \fIstring\fP +adds a string to the completer. If the string contains white +spaces, each of the words will be completed consecutively when +hitting . Example: + + ::tclreadline::readline add "button pathName ?options?" + +typing but will complete to button. Hitting again +will complete to "button pathName". ... + +.TP 5 +\fB::tclreadline::readline complete\fP \fIstring\fP +returns 1 if \fIstring\fP is a complete tcl command and 0 otherwise. + +.TP 5 +\fB::tclreadline::readline initialize\fP \fIhistoryfile\fP +initialize the tclreadline interface and read the history from +the \fIhistoryfile\fP. On succes an empty string is returned. +This command has to be called before any other tclreadline commands. + + +.TP 5 +\fB::tclreadline::readline read\fP \fIprompt\fP +prints the \fIprompt\fP to stdout and enters the tclreadline event +loop. Both readline and X events are processed. Returns the +(eventually history-expanded) input string. + + +.TP 5 +\fB::tclreadline::readline write\fP \fIhistoryfile\fP +writes the history to the \fIhistoryfile\fP. This command is called +automatically from the internal routine ::tclreadline::Exit. + + +.\".SH "EXAMPLES" + + +.\".SH "ENVIRONMENT VARIABLES" + +.SH VARIABLES + +The global variable \fBtclreadline_version\fP holds the version number +of the tclreadline package. + +.SH FILES + +the \fB.tclshrc\fP file in the HOME directory, which +is read on tclsh startup. Alternatively, the name of this initialization +file might be \fB.wishrc\fP ... depending on what interpreter you use. +These files should typically contain something like + +.EQ + if {$tcl_interactive} { + package require tclreadline + ::tclreadline::Loop + } +.EN + +which will enter the tclreadline main loop. + +.PP +the \fB.tclsh-history\fP file in the HOME directory. On startup +commands will be read from this file. On exit, the readline history +is written to this file. Note that if you abort tclsh with +no history is written. For the future it is planned to set up a signal +handler, which will write the history on before exiting. + +.PP +the \fB.inputrc\fP file in the users HOME directory. This file +is used normally for all programs which use the gnu readline (e.g. bash). +The `global' readline settings there will be valid also for +\fBtclreadline\fP. Additionally the .inputrc might hold conditional +settings for the implementation name \fBtclreadline\fP. Example of +some lines in your .inputrc: + +.EQ + $if tclreadline + "\C-xp": "puts $env(PATH)" + $endif +.EN + +For further documentation pleas refer to the gnu readline documentation. + +.SH BUGS +probably. + + +.SH "SEE ALSO" +The official \fBtclreadline\fP web site at: + +.PP +.RS 4 +http://krisal.physik.uni-karlsruhe.de/tclreadline/index.html +.RE + + +.SH AUTHOR(S) +Johannes Zellner +.br + +.br +If you want to be listed here, you have to contribute to the code :-) +(see below). + + +.SH HISTORY +This version of \fBtclreadline\fP is still a development version. +Pretty a lot of features and ideas are not implemented yet. The +reason for this is the lack of time and manpower. +So you are welcome to modify and contribute to the code. +If you have suggestions, please let me know. + + Index: tclreadlineConfig.sh.in ================================================================== --- tclreadlineConfig.sh.in +++ tclreadlineConfig.sh.in @@ -1,13 +1,35 @@ - -# ================================================================== -# FILE: "/home/joze/tmp/tclreadline/tclreadlineConfig.sh.in" -# LAST MODIFIED: "Sat Oct 03 00:01:19 1998 (joze)" -# (c) 1998 by Johannes Zellner +# -*- sh -*- +# +# FILE: "/home/joze/src/tclreadline/tclreadlineConfig.sh.in" +# LAST MODIFIED: "Sun Feb 28 15:27:46 1999 (joze)" +# (C) 1998, 1999 by Johannes Zellner # Johannes.Zellner@physik.uni-karlsruhe.de # $Id$ -# ================================================================== +# --- +# +# tclreadline -- gnu readline for tcl +# Copyright (C) 1999 Johannes Zellner +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Johannes.Zellner@physik.uni-karlsruhe.de +# http://krisal.physik.uni-karlsruhe.de/~joze +# +# ================================================================== # # This shell script (for sh) is generated automatically by tclreadline's # configure script. It will create shell variables for most of # the configuration options discovered by the configure script. # This script is intended to be included by the configure scripts Index: tclreadlineInit.tcl.in ================================================================== --- tclreadlineInit.tcl.in +++ tclreadlineInit.tcl.in @@ -1,23 +1,53 @@ #!/usr/local/bin/tclsh -# ================================================================== -# FILE: "/home/joze/tmp/tclreadline/tclreadlineInit.tcl.in" -# LAST MODIFIED: "Sat Oct 03 02:31:48 1998 (joze)" -# (c) 1998 by Johannes Zellner +# +# FILE: "/home/joze/src/tclreadline/tclreadlineInit.tcl.in" +# LAST MODIFIED: "Sun Feb 28 15:28:36 1999 (joze)" +# (C) 1998, 1999 by Johannes Zellner # Johannes.Zellner@physik.uni-karlsruhe.de # $Id$ -# ================================================================== +# --- +# +# tclreadline -- gnu readline for tcl +# Copyright (C) 1999 Johannes Zellner +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Johannes.Zellner@physik.uni-karlsruhe.de +# http://krisal.physik.uni-karlsruhe.de/~joze +# +# ================================================================== package provide tclreadline @TCLREADLINE_VERSION@ namespace eval tclreadline:: { - - proc Init {} { - catch {load @TERMCAP_LOAD_PATH@} - catch {load @READLINE_LOAD_PATH@} - if {[catch {load @TCLREADLINE_LIB_FILE@} msg]} { - puts stderr $msg - exit 2 - } - } - -} + namespace export Init +} + +proc ::tclreadline::Init {} { + + global tclreadline_version + global tclreadline_library + + set tclreadline_version @TCLREADLINE_VERSION@ + set tclreadline_library @TCLREADLINE_LIBRARY@ + + catch {load @TERMCAP_LOAD_PATH@} + catch {load @READLINE_LOAD_PATH@} + if [catch {load @TCLREADLINE_LIBRARY@/@TCLREADLINE_LIB_FILE@} msg] { + puts stderr $msg + exit 2 + } +} + ADDED tclreadlineSetup.tcl.in Index: tclreadlineSetup.tcl.in ================================================================== --- tclreadlineSetup.tcl.in +++ tclreadlineSetup.tcl.in @@ -0,0 +1,443 @@ +#!/usr/local/bin/tclsh +# +# FILE: "/home/joze/src/tclreadline/tclreadlineSetup.tcl" +# LAST MODIFIED: "Sun Feb 28 17:43:42 1999 (joze)" +# (C) 1998, 1999 by Johannes Zellner +# Johannes.Zellner@physik.uni-karlsruhe.de +# $Id$ +# --- +# +# tclreadline -- gnu readline for tcl +# Copyright (C) 1999 Johannes Zellner +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Johannes.Zellner@physik.uni-karlsruhe.de +# http://krisal.physik.uni-karlsruhe.de/~joze +# +# ================================================================== + +package provide tclreadline @TCLREADLINE_VERSION@ + +proc unknown args { + + global auto_noexec auto_noload env unknown_pending tcl_interactive + global errorCode errorInfo + + # Save the values of errorCode and errorInfo variables, since they + # may get modified if caught errors occur below. The variables will + # be restored just before re-executing the missing command. + + set savedErrorCode $errorCode + set savedErrorInfo $errorInfo + set name [lindex $args 0] + if ![info exists auto_noload] { + # + # Make sure we're not trying to load the same proc twice. + # + if [info exists unknown_pending($name)] { + return -code error "self-referential recursion in \"unknown\" for command \"$name\""; + } + set unknown_pending($name) pending; + set ret [catch {auto_load $name [uplevel 1 {namespace current}]} msg] + unset unknown_pending($name); + if {$ret != 0} { + return -code $ret -errorcode $errorCode \ + "error while autoloading \"$name\": $msg" + } + if ![array size unknown_pending] { + unset unknown_pending + } + if $msg { + set errorCode $savedErrorCode + set errorInfo $savedErrorInfo + set code [catch {uplevel 1 $args} msg] + if {$code == 1} { + # + # Strip the last five lines off the error stack (they're + # from the "uplevel" command). + # + + set new [split $errorInfo \n] + set new [join [lrange $new 0 [expr [llength $new] - 6]] \n] + return -code error -errorcode $errorCode \ + -errorinfo $new $msg + } else { + return -code $code $msg + } + } + } + + # REMOVED THE [info script] TEST (joze, SEP 98) + if {([info level] == 1) \ + && [info exists tcl_interactive] && $tcl_interactive} { + if ![info exists auto_noexec] { + set new [auto_execok $name] + if {$new != ""} { + set errorCode $savedErrorCode + set errorInfo $savedErrorInfo + set redir "" + if {[info commands console] == ""} { + set redir ">&@stdout <@stdin" + } + # LOOK FOR GLOB STUFF IN $ARGS (joze, SEP 98) + return [uplevel eval exec $redir $new \ + [::tclreadline::Glob [lrange $args 1 end]]] + } + } + set errorCode $savedErrorCode + set errorInfo $savedErrorInfo + if {$name == "!!"} { + set newcmd [history event] + } elseif {[regexp {^!(.+)$} $name dummy event]} { + set newcmd [history event $event] + } elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $name dummy old new]} { + set newcmd [history event -1] + catch {regsub -all -- $old $newcmd $new newcmd} + } + if [info exists newcmd] { + tclLog $newcmd + history change $newcmd 0 + return [uplevel $newcmd] + } + + set ret [catch {set cmds [info commands $name*]} msg] + if {[string compare $name "::"] == 0} { + set name "" + } + if {$ret != 0} { + return -code $ret -errorcode $errorCode \ + "error in unknown while checking if \"$name\" is a unique command abbreviation: $msg" + } + if {[llength $cmds] == 1} { + return [uplevel [lreplace $args 0 0 $cmds]] + } + if {[llength $cmds] != 0} { + if {$name == ""} { + return -code error "empty command name \"\"" + } else { + return -code error \ + "ambiguous command name \"$name\": [lsort $cmds]" + } + } + } + return -code error "invalid command name \"$name\"" +} + +namespace eval tclreadline:: { + namespace export Setup Glob Loop InitCmds InitTclCmds InitTkCmds Print +} + + +proc ::tclreadline::Setup {} { + + + uplevel #0 { + + if {[info commands ::tclreadline::readline] == ""} { + ::tclreadline::Init + } + + if {[catch {set a [::tclreadline::prompt1]}] \ + && [info nameofexecutable] != ""} { + + namespace eval ::tclreadline { + variable prompt_string + set base [file tail [info nameofexecutable]] + + if {$base == "tclsh" && [info exists tcl_version]} { + set prompt_string \ + "\[0;91m$base$tcl_version\[0m" + } elseif {$base == "wish" && [info exists tk_version]} { + set prompt_string "\[0;94m$base$tk_version\[0m" + } else { + set prompt_string "\[0;91m$base\[0m" + } + + } + + proc ::tclreadline::prompt1 {} { + variable prompt_string + global env + set pwd [pwd] + + if [info exists env(HOME)] { + regsub $env(HOME) $pwd "~" pwd + } + return "$prompt_string \[$pwd\]" + } + } + + proc ls {args} { + if {[exec uname -s] == "Linux"} { + eval exec ls --color -FC [::tclreadline::Glob $args] + } else { + eval exec ls -FC [::tclreadline::Glob $args] + } + } + + if {[info procs cd] == ""} { + catch {rename ::tclreadline::Cd ""} + rename cd ::tclreadline::Cd + proc cd {args} { + if {[catch {eval ::tclreadline::Cd $args} message]} { + puts stderr "$message" + } + ls + } + } + + if {[info procs exit] == ""} { + + catch {rename ::tclreadline::Exit ""} + rename exit ::tclreadline::Exit + + proc exit {args} { + + catch { + ::tclreadline::readline write \ + [::tclreadline::HistoryFileGet] + } + + if [catch "eval ::tclreadline::Exit $args" message] { + puts stderr "error:" + puts stderr "$message" + } + # NOTREACHED + } + } + + } + + + + global pi + set pi 3.1415926535897931 + set tcl_precision 17 + + + + global env + variable historyfile + + + if [info exists env(HOME)] { + set historyfile $env(HOME)/.tclsh-history + } else { + set historyfile .tclsh-history + } + set msg [::tclreadline::readline initialize $historyfile] + if {$msg != ""} { + puts stderr "$msg" + } + + ::tclreadline::InitCmds + + rename ::tclreadline::Setup "" +} + +proc ::tclreadline::HistoryFileGet {} { + variable historyfile + return $historyfile +} + +proc ::tclreadline::Glob {string} { + + set commandstring "" + foreach name $string { + set replace [glob -nocomplain -- $name] + if {$replace == ""} { + lappend commandstring $name + } else { + lappend commandstring $replace + } + } + return $commandstring +} + + + +proc ::tclreadline::Loop {} { + + ::tclreadline::Setup + + uplevel #0 { + + while {1} { + + if [info exists tcl_prompt2] { + set ::tclreadline::prompt2 $tcl_prompt2 + } else { + set ::tclreadline::prompt2 ">" + } + + if {[namespace eval ::tclreadline {[info procs prompt1]}] != ""} { + set ::tclreadline::LINE [::tclreadline::readline read \ + [::tclreadline::prompt1]] + } else { + set ::tclreadline::LINE [::tclreadline::readline read %] + } + + while {![::tclreadline::readline complete $::tclreadline::LINE]} { + append ::tclreadline::LINE ";" + append ::tclreadline::LINE [::tclreadline::readline read \ + ${::tclreadline::prompt2}] + } + + + if [catch { + set result [eval $::tclreadline::LINE] + if {$result != "" && [::tclreadline::Print]} { + puts $result + } + set result "" + } msg] { + puts stderr $msg + } + + } + } +} + +proc ::tclreadline::Print {args} { + variable PRINT + if ![info exists PRINT] { + set ::tclreadline::PRINT yes + } + if [regexp -nocase \(true\|yes\|1\) $args] { + set ::tclreadline::PRINT yes + } elseif [regexp -nocase \(false\|no\|0\) $args] { + set ::tclreadline::PRINT no + } + return $PRINT +} + +proc ::tclreadline::InitCmds {} { + global tcl_version tk_version + if {[info exists tcl_version]} { + ::tclreadline::InitTclCmds + } + if {[info exists tk_version]} { + ::tclreadline::InitTkCmds + } + rename tclreadline::InitCmds "" +} + +proc ::tclreadline::InitTclCmds {} { +::tclreadline::readline add "after option ?arg arg ...?" +::tclreadline::readline add "append varName ?value value ...?" +::tclreadline::readline add "array option arrayName ?arg ...?" +::tclreadline::readline add "binary option ?arg arg ...?" +::tclreadline::readline add "catch command ?varName?" +::tclreadline::readline add "clock option ?arg ...?" +::tclreadline::readline add "close channelId" +::tclreadline::readline add "eof channelId" +::tclreadline::readline add "error message ?errorInfo? ?errorCode?" +::tclreadline::readline add "eval arg ?arg ...?" +::tclreadline::readline add "exec ?switches? arg ?arg ...?" +::tclreadline::readline add "expr arg ?arg ...?" +::tclreadline::readline add "fblocked channelId" +::tclreadline::readline add "fconfigure channelId ?optionName? ?value? ?optionName value?..." +::tclreadline::readline add "fcopy input output ?-size size? ?-command callback?" +::tclreadline::readline add "file option ?arg ...?" +::tclreadline::readline add "fileevent channelId event ?script?" +::tclreadline::readline add "flush channelId" +::tclreadline::readline add "for start test next command" +::tclreadline::readline add "foreach varList list ?varList list ...? command" +::tclreadline::readline add "format formatString ?arg arg ...?" +::tclreadline::readline add "gets channelId ?varName?" +::tclreadline::readline add "glob ?switches? name ?name ...?" +::tclreadline::readline add "global varName ?varName ...?" +::tclreadline::readline add "incr varName ?increment?" +::tclreadline::readline add "info option ?arg arg ...?" +::tclreadline::readline add "interp cmd ?arg ...?" +::tclreadline::readline add "join list ?joinString?" +::tclreadline::readline add "lappend varName ?value value ...?" +::tclreadline::readline add "lindex list index" +::tclreadline::readline add "linsert list index element ?element ...?" +::tclreadline::readline add "llength list" +::tclreadline::readline add "load fileName ?packageName? ?interp?" +::tclreadline::readline add "lrange list first last" +::tclreadline::readline add "lreplace list first last ?element element ...?" +::tclreadline::readline add "lsearch ?mode? list pattern" +::tclreadline::readline add "lsort ?options? list" +::tclreadline::readline add "namespace subcommand ?arg ...?" +::tclreadline::readline add "open fileName ?access? ?permissions?" +::tclreadline::readline add "package option ?arg arg ...?" +::tclreadline::readline add "proc name args body" +::tclreadline::readline add "puts ?-nonewline? ?channelId? string" +::tclreadline::readline add "read ?-nonewline? channelId" +::tclreadline::readline add "regexp ?switches? exp string ?matchVar? ?subMatchVar subMatchVar ...?" +::tclreadline::readline add "regsub ?switches? exp string subSpec varName" +::tclreadline::readline add "rename oldName newName" +::tclreadline::readline add "scan string format ?varName varName ...?" +::tclreadline::readline add "seek channelId offset ?origin?" +::tclreadline::readline add "set varName ?newValue?" +::tclreadline::readline add "socket ?-myaddr addr? ?-myport myport? ?-async? host port" +::tclreadline::readline add "socket -server command ?-myaddr addr? port" +::tclreadline::readline add "source fileName" +::tclreadline::readline add "split string ?splitChars?" +::tclreadline::readline add "string option arg ?arg ...?" +::tclreadline::readline add "subst ?-nobackslashes? ?-nocommands? ?-novariables? string" +::tclreadline::readline add "switch ?switches? string pattern body ... ?default body?" +::tclreadline::readline add "tell channelId" +::tclreadline::readline add "time command ?count?" +::tclreadline::readline add "trace option \[arg arg ...\]" +::tclreadline::readline add "unset varName ?varName ...?" +::tclreadline::readline add "uplevel ?level? command ?arg ...?" +::tclreadline::readline add "upvar ?level? otherVar localVar ?otherVar localVar ...?" +::tclreadline::readline add "vwait name" +::tclreadline::readline add "while test command" +rename tclreadline::InitTclCmds "" + +} + +proc ::tclreadline::InitTkCmds {} { +::tclreadline::readline add "bind window ?pattern? ?command?" +::tclreadline::readline add "bindtags window ?tags?" +::tclreadline::readline add "button pathName ?options?" +::tclreadline::readline add "canvas pathName ?options?" +::tclreadline::readline add "checkbutton pathName ?options?" +::tclreadline::readline add "clipboard option ?arg arg ...?" +::tclreadline::readline add "entry pathName ?options?" +::tclreadline::readline add "event option ?arg1?" +::tclreadline::readline add "font option ?arg?" +::tclreadline::readline add "frame pathName ?options?" +::tclreadline::readline add "grab option ?arg arg ...?" +::tclreadline::readline add "grid option arg ?arg ...?" +::tclreadline::readline add "image option ?args?" +::tclreadline::readline add "label pathName ?options?" +::tclreadline::readline add "listbox pathName ?options?" +::tclreadline::readline add "lower window ?belowThis?" +::tclreadline::readline add "menu pathName ?options?" +::tclreadline::readline add "menubutton pathName ?options?" +::tclreadline::readline add "message pathName ?options?" +::tclreadline::readline add "option cmd arg ?arg ...?" +::tclreadline::readline add "pack option arg ?arg ...?" +::tclreadline::readline add "radiobutton pathName ?options?" +::tclreadline::readline add "raise window ?aboveThis?" +::tclreadline::readline add "scale pathName ?options?" +::tclreadline::readline add "scrollbar pathName ?options?" +::tclreadline::readline add "selection option ?arg arg ...?" +::tclreadline::readline add "send ?options? interpName arg ?arg ...?" +::tclreadline::readline add "text pathName ?options?" +::tclreadline::readline add "tk option ?arg?" +::tclreadline::readline add "tkwait variable|visibility|window name" +::tclreadline::readline add "toplevel pathName ?options?" +::tclreadline::readline add "winfo option ?arg?" +::tclreadline::readline add "wm option window ?arg ...?" +rename tclreadline::InitTkCmds "" +} +