Initial revision
authorThorsten Glaser <tg@mirbsd.org>
Wed, 27 Jul 2011 19:10:49 +0000 (19:10 +0000)
committerThorsten Glaser <tg@mirbsd.org>
Wed, 27 Jul 2011 19:10:49 +0000 (19:10 +0000)
145 files changed:
COPYING [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
HINTS [new file with mode: 0644]
INFO [new file with mode: 0644]
LIST [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
TODO [new file with mode: 0644]
acinclude.m4 [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
autoconf.h.in [new file with mode: 0644]
autogen.sh [new file with mode: 0644]
b.c [new file with mode: 0644]
b.h [new file with mode: 0644]
blocks.c [new file with mode: 0644]
blocks.h [new file with mode: 0644]
builtin.c [new file with mode: 0644]
builtin.h [new file with mode: 0644]
builtins.c [new file with mode: 0644]
bw.c [new file with mode: 0644]
bw.h [new file with mode: 0644]
charmap.c [new file with mode: 0644]
charmap.h [new file with mode: 0644]
charmaps/klingon.in [new file with mode: 0644]
cmd.c [new file with mode: 0644]
cmd.h [new file with mode: 0644]
config.guess [new file with mode: 0644]
config.h [new file with mode: 0644]
config.sub [new file with mode: 0644]
configure [new file with mode: 0644]
configure.ac [new file with mode: 0644]
depcomp [new file with mode: 0644]
dir.c [new file with mode: 0644]
docs/help-system.html [new file with mode: 0644]
hash.c [new file with mode: 0644]
hash.h [new file with mode: 0644]
help.c [new file with mode: 0644]
help.h [new file with mode: 0644]
i18n.c [new file with mode: 0644]
i18n.h [new file with mode: 0644]
install-sh [new file with mode: 0644]
jmacsrc.in [new file with mode: 0644]
joe.1.in [new file with mode: 0644]
joe.txt [new file with mode: 0644]
joerc.in [new file with mode: 0644]
jpicorc.in [new file with mode: 0644]
jstarrc.in [new file with mode: 0644]
jupprc [new file with mode: 0644]
kbd.c [new file with mode: 0644]
kbd.h [new file with mode: 0644]
macro.c [new file with mode: 0644]
macro.h [new file with mode: 0644]
main.c [new file with mode: 0644]
main.h [new file with mode: 0644]
menu.c [new file with mode: 0644]
menu.h [new file with mode: 0644]
missing [new file with mode: 0644]
mkinstalldirs [new file with mode: 0644]
path.c [new file with mode: 0644]
path.h [new file with mode: 0644]
poshist.c [new file with mode: 0644]
poshist.h [new file with mode: 0644]
pw.c [new file with mode: 0644]
pw.h [new file with mode: 0644]
queue.c [new file with mode: 0644]
queue.h [new file with mode: 0644]
qw.c [new file with mode: 0644]
qw.h [new file with mode: 0644]
rc.c [new file with mode: 0644]
rc.h [new file with mode: 0644]
regex.c [new file with mode: 0644]
regex.h [new file with mode: 0644]
rjoerc.in [new file with mode: 0644]
scrn.c [new file with mode: 0644]
scrn.h [new file with mode: 0644]
selinux.c [new file with mode: 0644]
strlfun.c [new file with mode: 0644]
syntax.c [new file with mode: 0644]
syntax.h [new file with mode: 0644]
syntax/asm.jsf.in [new file with mode: 0644]
syntax/c.jsf.in [new file with mode: 0644]
syntax/conf.jsf.in [new file with mode: 0644]
syntax/csh.jsf.in [new file with mode: 0644]
syntax/diff.jsf.in [new file with mode: 0644]
syntax/fortran.jsf.in [new file with mode: 0644]
syntax/html.jsf.in [new file with mode: 0644]
syntax/java.jsf.in [new file with mode: 0644]
syntax/lisp.jsf.in [new file with mode: 0644]
syntax/mail.jsf.in [new file with mode: 0644]
syntax/mason.jsf.in [new file with mode: 0644]
syntax/pascal.jsf.in [new file with mode: 0644]
syntax/perl.jsf.in [new file with mode: 0644]
syntax/php.jsf.in [new file with mode: 0644]
syntax/python.jsf.in [new file with mode: 0644]
syntax/sh.jsf.in [new file with mode: 0644]
syntax/tcl.jsf.in [new file with mode: 0644]
syntax/verilog.jsf.in [new file with mode: 0644]
syntax/vhdl.jsf.in [new file with mode: 0644]
syntax/xml.jsf.in [new file with mode: 0644]
tab.c [new file with mode: 0644]
tab.h [new file with mode: 0644]
termcap.c [new file with mode: 0644]
termcap.h [new file with mode: 0644]
termidx.c [new file with mode: 0644]
tty.c [new file with mode: 0644]
tty.h [new file with mode: 0644]
tw.c [new file with mode: 0644]
tw.h [new file with mode: 0644]
types.h [new file with mode: 0644]
ublock.c [new file with mode: 0644]
ublock.h [new file with mode: 0644]
uedit.c [new file with mode: 0644]
uedit.h [new file with mode: 0644]
uerror.c [new file with mode: 0644]
uerror.h [new file with mode: 0644]
ufile.c [new file with mode: 0644]
ufile.h [new file with mode: 0644]
uformat.c [new file with mode: 0644]
uformat.h [new file with mode: 0644]
uisrch.c [new file with mode: 0644]
uisrch.h [new file with mode: 0644]
umath.c [new file with mode: 0644]
umath.h [new file with mode: 0644]
undo.c [new file with mode: 0644]
undo.h [new file with mode: 0644]
usearch.c [new file with mode: 0644]
usearch.h [new file with mode: 0644]
ushell.c [new file with mode: 0644]
ushell.h [new file with mode: 0644]
utag.c [new file with mode: 0644]
utag.h [new file with mode: 0644]
utf8.c [new file with mode: 0644]
utf8.h [new file with mode: 0644]
utils.c [new file with mode: 0644]
utils.h [new file with mode: 0644]
va.c [new file with mode: 0644]
va.h [new file with mode: 0644]
vfile.c [new file with mode: 0644]
vfile.h [new file with mode: 0644]
vs.c [new file with mode: 0644]
vs.h [new file with mode: 0644]
w.c [new file with mode: 0644]
w.h [new file with mode: 0644]

diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..1be0f25
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,249 @@
+                    GNU GENERAL PUBLIC LICENSE
+                     Version 1, February 1989
+
+ Copyright (C) 1989 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The license agreements of most software companies try to keep users
+at the mercy of those companies.  By contrast, our 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.  The
+General Public License applies to the Free Software Foundation's
+software and to any other program whose authors commit to using it.
+You can use it for your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Specifically, the General Public License is designed to make
+sure that you have the freedom to give away or sell copies of free
+software, 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 a 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 tell them 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.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement 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 work containing the
+Program or a portion of it, either verbatim or with modifications.  Each
+licensee is addressed as "you".
+
+  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
+General Public License and to the absence of any warranty; and give any
+other recipients of the Program a copy of this General Public License
+along with the Program.  You may charge a fee for the physical act of
+transferring a copy.
+
+  2. You may modify your copy or copies of the Program or any portion of
+it, and copy and distribute such modifications under the terms of Paragraph
+1 above, provided that you also do the following:
+
+    a) cause the modified files to carry prominent notices stating that
+    you changed the files and the date of any change; and
+
+    b) cause the whole of any work that you distribute or publish, that
+    in whole or in part contains the Program or any part thereof, either
+    with or without modifications, to be licensed at no charge to all
+    third parties under the terms of this General Public License (except
+    that you may choose to grant warranty protection to some or all
+    third parties, at your option).
+
+    c) If the modified program normally reads commands interactively when
+    run, you must cause it, when started running for such interactive use
+    in the simplest and most usual 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 General
+    Public License.
+
+    d) 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.
+
+Mere aggregation of another independent work with the Program (or its
+derivative) on a volume of a storage or distribution medium does not bring
+the other work under the scope of these terms.
+\f
+  3. You may copy and distribute the Program (or a portion or derivative of
+it, under Paragraph 2) in object code or executable form under the terms of
+Paragraphs 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
+    Paragraphs 1 and 2 above; or,
+
+    b) accompany it with a written offer, valid for at least three
+    years, to give any third party free (except for a nominal charge
+    for the cost of distribution) a complete machine-readable copy of the
+    corresponding source code, to be distributed under the terms of
+    Paragraphs 1 and 2 above; or,
+
+    c) accompany it with the information you received as to where the
+    corresponding source code may be obtained.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form alone.)
+
+Source code for a work means the preferred form of the work for making
+modifications to it.  For an executable file, complete source code means
+all the source code for all modules it contains; but, as a special
+exception, it need not include source code for modules which are standard
+libraries that accompany the operating system on which the executable
+file runs, or for standard header files or definitions files that
+accompany that operating system.
+
+  4. You may not copy, modify, sublicense, distribute or transfer the
+Program except as expressly provided under this General Public License.
+Any attempt otherwise to copy, modify, sublicense, distribute or transfer
+the Program is void, and will automatically terminate your rights to use
+the Program under this License.  However, parties who have received
+copies, or rights to use copies, from you under this General Public
+License will not have their licenses terminated so long as such parties
+remain in full compliance.
+
+  5. By copying, distributing or modifying 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.
+
+  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.
+\f
+  7. 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 the 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
+the license, you may choose any version ever published by the Free Software
+Foundation.
+
+  8. 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
+
+  9. 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.
+
+  10. 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
+\f
+        Appendix: 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 humanity, 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 a brief idea of what it does.>
+    Copyright (C) 19yy  <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 1, 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., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 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) 19xx 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 a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  program `Gnomovision' (a program to direct compilers to make passes
+  at assemblers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..b27ee3f
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,1453 @@
+Wed Nov 10 2004  Thorsten Glaser <tg@mirbsd.org>
+
+       Use anonCVS or CVSweb by the MirOS Project to retrieve changes
+       for MirJupp. I don't closely follow GNU coding standards.
+
+       cf. http://cvs.mirbsd.de/src/share/doc/legal/LICENCE-GNU?rev=HEAD
+
+Sat May 29 2004  Joe Allen <jhallen@world.std.com>
+
+       Use 'aspell' if it exists.
+       Set Home, End, Insert, Del key bindings, assuming termcap
+       entry is wrong.
+
+Fri May 28 2004  Joe Allen <jhallen@world.std.com>
+
+       Status line updates even if you keep typing.
+
+Fri May 28 2004  Joe Allen <jhallen@world.std.com>
+
+       Now it will use sprintf if snprintf does not exist.
+       Can now build on IRIX 6.2
+
+Thu May 27 2004  Joe Allen <jhallen@world.std.com>
+
+       Fix segfault due to bad management of 'pieces' in rc/setopt().
+
+Thu May 27 2004  Joe Allen <jhallen@world.std.com>
+
+       Added asm.jsf.in.
+
+
+Thu May 27 2004  Joe Allen <jhallen@world.std.com>
+
+       Added diff.jsf.in.
+       Added improved xml.jsf.in
+
+Wed May 26 2004  Joe Allen <jhallen@world.std.com>
+
+       Fix lockup problem: do not allow querysave in
+       prompt windows.
+
+Tue May 25 2004  Joe Allen <jhallen@world.std.com>
+
+       Character set aliases now appear in ^T E tab
+       completion.
+
+Mon May 24 2004  Joe Allen <jhallen@world.std.com>
+
+       Fix bg_reg -> bg_red.
+
+       Now we understand aliases for character maps, like latin1 ->
+       iso-8859-1 and 8859-1 -> iso-8859-1.
+
+Mon May 24 2004  Joe Allen <jhallen@world.std.com>
+
+       Smart indent and backspace now work even if cursor
+       is not right at indentation point.  Also autoindent
+       does not happen if cursor is on a space or tab character.
+
+       Jmacs: ^W (cut) now works if mark is after point.  (Added -autoswap
+       mode).  Also: preserve mark and point positions during block
+       operations.
+
+Wed May 19 2004  Joe Allen <jhallen@world.std.com>
+
+       Allow options after strings in syntax files.
+
+Wed May 19 2004  Joe Allen <jhallen@world.std.com>
+
+       More fixes for Cygwin: shell windows now
+       work properly.
+
+Tue May 18 2004  Joe Allen <jhallen@world.std.com>
+
+       Changed ESC y to yank in joerc.  Left ESC ^Y
+       as yankpop.
+
+       Added "spring" escape sequence for help text.
+
+Mon May 17 2004  Joe Allen <jhallen@world.std.com>
+
+       Fix backspace handling in shell windows.
+       Ring bell when we get ^G.
+
+Sun May 16 2004  Joe Allen <jhallen@world.std.com>
+
+       Fix -syntax and -encoding on command line.
+
+       Check for "pty.h" when openpty is used.
+
+Sun May 16 2004  Joe Allen <jhallen@world.std.com>
+
+       Fix mason bug.
+       Change ^K ^M back to move block.
+       ^K H in jstar mode is "nmark".
+
+Fri May 14 2004  Joe Allen <jhallen@world.std.com>
+
+       Mason highlighter
+
+Fri May 14 2004  Joe Allen <jhallen@world.std.com>
+
+       Many jpicorc.in improvements.
+
+Thu May 13 2004  Joe Allen <jhallen@world.std.com>
+
+       Improve exit messages.
+
+       Improve 'lose' which is for jmacs.
+
+       Improve ^X for jpico.
+
+       Got rid of "end of processs" message in shell windows.
+
+       Shell windows can now be orphaned and duplicated (process
+       is associated with B instead of BW).
+
+       Shell window input taken from cmd.c instead of in
+       actual edit functions.
+
+       Improved 'lose' again- now it fill in windows with any
+       orphaned buffers it can find.
+
+Thu May 13 2004  Joe Allen <jhallen@world.std.com>
+
+       Small compile fix.
+
+Wed May 12 2004  Joe Allen <jhallen@world.std.com>
+
+       Compile now uses shell window (so you can hit ^C during the
+       compile.
+
+       Shell window termination code fix: now all of the output always
+       makes it to the window.
+
+       Added query save loop to save all modified files before build.
+
+       Added scratch buffers: they are ignored during ^K X, ^C and
+       querysave.
+
+       ^X ^C is now much more like emacs.
+
+       Fixed annoying occasional screen update glitch: it was caused
+       by SIGALRM causing dropped output in Linux (doesn't happen on
+       SUN).  So now we arm SIGALRM only when waiting for input.  (SIGALRM
+       is used to keep the clock updated).
+
+Wed May 12 2004  Joe Allen <jhallen@world.std.com>
+
+       Applied Olexiy Avramchenko's <olexiy@irtech.cn.ua> patch
+       on configure.ac.  Also added mail.jsf.in to Makefile.am
+
+       Applied Yura Kalinichenko's <yuk@iceb.vinnitsa.com> "openpty"
+       patch.
+
+Tue May 11 2004  Joe Allen <jhallen@world.std.com>
+
+       Added "upper" and "lower" functions (no longer
+       depend on "tr" command).
+
+       Fix jmacs transpose word command.
+
+Tue May 11 2004  Joe Allen <jhallen@world.std.com>
+
+       Fix marking mode so only window with cursor is
+       effected.
+
+       Ctrl-space clears selection when cursor is in
+       selection, otherwise it starts a new one.
+
+       ^K E prompts to load original file from disk.
+
+Tue May 11 2004  Joe Allen <jhallen@world.std.com>
+       * b.c ufile.c :
+
+       Update file date on save.
+       Improve Ctrl-<space> marking.
+
+Mon May 10 2004  Joe Allen <jhallen@world.std.com>
+       * ufile.c b.c :
+
+       Warns if file changed on save.
+
+       Add 'beep' function and updated jmacsrc.in
+
+Mon May 10 2004  Joe Allen <jhallen@world.std.com>
+       * usearch.c, uisrch.c:
+
+       Added '-wrap' flag.  Search wraps when set.
+
+Mon May 10 2004  Joe Allen <jhallen@world.std.com>
+       * *rc.in :
+
+       More globs: .cpp, .hpp, .c++, .h++
+
+Mon May 10 2004  Joe Allen <jhallen@world.std.com>
+       * b.c tw.c :
+
+       New status line escape sequence: %x shows current context (function
+       cursor is in).
+
+       More globs in *rc.in files.
+
+       csh.jsf lisp.jsf
+
+Sun May  9 02:30:41 EDT 2004
+       * sh.jsf.in :
+
+       Improved shell script highlighter.
+       Fix spelling errors in joe.1.in
+
+Sat May  8 2004  Joe Allen <jhallen@world.std.com>
+       * usearch.c :
+
+       Fixed bug in tab completion in text windows.
+       Change tab completion key to ^K <return>
+
+Fri May  7 22:37:49 EDT 2004
+       * usearch.c :
+
+       Tab completion at search prompt.
+
+       ESC-Tab completes within text windows.
+
+Fri May  7 16:02:21 EDT 2004
+       * usearch.c, uisrch.c :
+
+       Added case insensitive by default option.
+
+Fri May  7 2004  Joe Allen <jhallen@world.std.com>
+       * main.c, menu.c, pw.c, qw.c, rc.c, tab.c :
+
+       joe a b c, now windows are in order a, b, c.
+
+       TAB completion now works on last path in prompt window:
+       for example '!ls foo', tab will complete the foo.
+
+       Added menu_explorer option.  When set: menu stays up when
+       a directory is seleted.  When clear: directory is added
+       to path and menu is closed.
+
+       Menus are now 40% of window size (or smaller if they are
+       not filled).
+
+       Cursor is now position after selected menu entry.
+
+Thu May  6 2004  Joe Allen <jhallen@world.std.com>
+       * umenu.c :
+
+       TAB key now cycles through menu entries.  This is useful
+       for tab completion: just keep hitting tab until you see the
+       file you want, then hit enter.
+
+       TAB completion is more "bash"-like: if you complete a directory
+       name a menu does not appear, the directory just gets added to the
+       prompt.
+
+Thu May  6 2004  Joe Allen <jhallen@world.std.com>
+       * ublock.c :
+
+       Added "select" function for Ctrl-arrow selecting.
+       Ctrl-space drops anchor and sets marking mode.
+
+Thu May  6 2004  Joe Allen <jhallen@world.std.com>
+       * uerror.c :
+
+       Improve error parser: require ':' on error lines.
+       Make macro 'compile' for error parsing.
+       'compile' macro always uses same buffer.
+       ^X ` in jmacs goes to next error.
+
+Thu May  6 2004  Joe Allen <jhallen@world.std.com>
+       * uedit.c :
+
+       Smart tab looks back 10 lines to determine indentation.
+
+Wed May  5 2004  Joe Allen <jhallen@world.std.com>
+       * charmap.c :
+
+       Now parses charmap files.
+
+Wed May  5 2004  Joe Allen <jhallen@world.std.com>
+       * bw.c charmap.c main.c qw.c qw.h regex.c regex.h 
+       syntax.c types.h uisrch.c usearch.c utf8.c utf8.h:
+
+       Regex search now works properly with UTF-8 chars.
+       Incremental search now works with UTF-8.
+
+Wed May  5 2004  Joe Allen <jhallen@world.std.com>
+       * utils.c, c.jsf.in:
+
+       Fix c++ keywords.
+       Fix parse_ident, which was breaking fortran highlighter.
+
+Tue May  4 2004  Joe Allen <jhallen@world.std.com>
+       * rc.c, selinux.c, syntax.c, ufile.c:
+
+       Applied new Selinux patch.
+
+       Checks ~/.joe/syntax for syntax files.
+
+Tue May  4 2004  Joe Allen <jhallen@world.std.com>
+       * bw.c, charmap.c, main.c:
+
+       Print locale on startup line.
+
+       Print encoding for ^K <space>.
+
+       Change koi8-T to koi8-t.
+
+Tue May  4 2004  Joe Allen <jhallen@world.std.com>
+       * ChangeLog TODO b.c bw.c charmap.c charmap.h cmd.c help.c 
+       i18n.c i18n.h joerc.in jpicorc.in jstarrc.in macro.c main.c 
+       menu.c pw.c pw.h rc.c regex.c rjoerc.in scrn.c scrn.h syntax.c 
+       types.h ublock.c uedit.c uerror.c ufile.c uformat.c umath.c 
+       usearch.c ushell.c utag.c utf8.c utils.c utils.h w.c:
+
+       Everything about character set is now contained in struct charmap.
+
+       Deprecate ^T U.  Now use ^T E to select file encoding.
+
+Mon May  3 2004  Joe Allen <jhallen@world.std.com>
+       * :
+
+       Clean up pass: use internal ctype function everywhere.
+
+       Also: ^T E sets file encoding.
+
+Mon Mai  3 2004  Joe Allen <jhallen@world.std.com>
+       * utils.c, utils.h, utf8.c, syntax.c, configure.ac, Makefile.am,
+       charmap.c, charmap.h:
+
+       No longer use iconv().  Not 100% sure I'm going to leave it this
+       way.  Maybe optionally use iconv().
+
+Mon May  3 2004  Joe Allen <jhallen@world.std.com>
+       *:
+
+       Eliminate --pedantic warnings.
+
+Mon May  3 2004  Joe Allen <jhallen@world.std.com>
+       * bw.c, i18n.c, i18n.h, b.c, configure.ac, regex.c, scrn.c, Makefile.am :
+
+       Fix highlighter when there are utf-8 characters in file.
+
+       No longer depend on wctype.h (working towards not depending on
+       iconv()).
+
+Sun May  2 2004  Joe Allen <jhallen@world.std.com>
+       * Makefile.am, configure.ac, *rc.in:
+
+       Fix mutt mode: need -wordwrap, not -autoindent.
+
+       Fix configure.ac and Makefile.am to link -liconv if
+       necessary.
+
+Sat May 30 2004  Joe Allen <jhallen@world.std.com>
+       * syntax.c :
+
+       Fix segfault problem with load_dfa.
+
+Fri Apr 30 2004  Joe Allen <jhallen@world.std.com>
+       *:
+
+       Improve Fortran again.
+
+       Added '-indentfirst' option to control
+       how smarthome works.
+
+       Now syntax files are loaded as needed.
+
+       New version of automake and autoconf.
+
+       Print UTF-8 (c) if terminal is utf-8.
+
+Thu Apr 29 2004  Joe Allen <jhallen@world.std.com>
+       *:
+
+       Improve Fortran syntax file.
+       Improve Perl syntax file.
+
+
+Wed Apr 28 2004  Joe Allen <jhallen@world.std.com>
+       *:
+
+       Improve C and Java syntax files.
+
+Wed Apr 28 2004  Joe Allen <jhallen@world.std.com>
+       * syntax.c :
+
+       More syntax files: tcl
+
+       Now 'noeat' implies 'recolor=-1', which reduces debug time
+       for syntax definition files.
+
+Tue Apr 27 2004  Joe Allen <jhallen@world.std.com>
+       *:
+
+       More syntax files: html, pascal, vhdl, fortran, java, xml.
+
+       Allow comment lines in syntax file string lists.
+
+Mon Apr 26 2004  Joe Allen <jhallen@world.std.com>
+       *  Makefile.am bw.c configure.ac *rc.in utf8.c syntax/perl.jsf.in
+       syntax/verilog.jsf.in:
+
+       Forgot .pm files for perl.
+
+       Update colors for perl and verilog.
+
+       Added mail.jsf: works nicely with mutt
+
+       Oops- was displaying characters between 0xA0 - 0xBF as
+       control characters in UTF-8.
+
+Mon Apr 26 2004  Joe Allen <jhallen@world.std.com>
+       * uedit.c ublock.c :
+
+       Smart backspace now always fixes the indentation.
+
+       Indent left and right always fix indentation.
+
+Mon Apr 26 2004  Joe Allen <jhallen@world.std.com>
+       * bw.c tty.c uedit.c utf8.c *rc.in:
+
+       Fix rtarw: was not fixing xcol.
+
+       TAB key now does smart indenting.
+
+       smart home goes to real home first, then indentation point.
+
+Sun Apr 25 2004  Joe Allen <jhallen@world.std.com>
+       * b.c bw.c scrn.c uedit.c utf8.c utf8.h:
+
+       Better handling of iconv() conversion errors.
+
+       Better handling of error UTF-8 sequences.
+
+Sat Apr 24 2004  Joe Allen <jhallen@world.std.com>
+       * utf8.c, utf8.h, scrn.c, bw.c :
+
+       Fixed utf8 encoder for characters between 0x10000 and 0x1FFFF.
+
+       Print <XXXX> for unicode control characters.
+
+Fri Apr 23 2004  Joe Allen <jhallen@world.std.com>
+
+       Added -guess_crlf and -guess_indent options.
+
+       Update *rc files.
+
+       Updated documentation.
+
+Thu Apr 22 2004  Joe Allen <jhallen@world.std.com>
+       * cmd.c, pw.c, pw.h, rc.c, syntax.c, syntax.h, types.h, uedit.c,
+       utils.c, utils.h, syntax/c.jsf.in:
+
+       Fixed uopen() ^] for overtype mode.
+
+       Added 'istrings' option in syntax files for ignoring case
+       in strings.
+
+       Added ^T Y- allows you to select syntax during run time (tab
+       completion works too!)
+
+       Added ^T P- picture mode: can move and type anywhere on the screen,
+       good for drawing ASCII art.
+
+Thu Apr 22 2004  Joe Allen <jhallen@world.std.com>
+       * uedit.c:
+
+       Tab key only inserts when past end of line in overtype mode.
+
+
+Thu Apr 22 2004  Joe Allen <jhallen@world.std.com>
+       * uedit.c:
+
+       Fixed bugs where overtype and wordwrap modes were interacting.
+       Hope this doesn't cause new bugs...
+
+Thu Apr 22 2004  Joe Allen <jhallen@world.std.com>
+       * uedit.c:
+
+       Now, enter does not insert new line when in overtype mode (unless at
+       end of file).  Somebody asked for this.
+
+Wed Apr 21 2004  Joe Allen <jhallen@world.std.com>
+       * b.c, b.h, joerc.in, rc.c, types.h, ublock.c, uedit.c:
+
+       Added -purify option which fixes indentation
+       if necessary for ^K, ^K. and smart backspace.
+
+Wed Apr 21 2004  Joe Allen <jhallen@world.std.com>
+       * ublock.c :
+
+       ^K , and ^K . now have improved purity checking
+       and automatic block selection.
+
+Wed Apr 21 2004  Joe Allen <jhallen@world.std.com>
+       * rc.c, uedit.c, types.h, joerc.in:
+
+       Added 'smartbacks' option.
+
+Wed Apr 21 2004  Joe Allen <jhallen@world.std.com>
+       * uedit.c, b.c:
+
+       Backspace is now smart when 'smarthome' is set.
+
+Wed Apr 21 2004  Joe Allen <jhallen@world.std.com>
+       * uedit.c :
+
+       Fix new bug caused by previous bug fix :-)
+
+
+Tue Apr 20 2004  Joe Allen <jhallen@world.std.com>
+       * uedit.c :
+
+       Fix bug where double wide characters typed at end of line was
+       screwing up (was assuming that they were one character wide in
+       the utypebw optimization logic).
+
+
+Tue Apr 20 2004  Joe Allen <jhallen@world.std.com>
+       * cmd.c, joerc.in, rc.c, types.h, uedit.c, uedit.h:
+
+       Applied David Phillips' smart home key patch.
+
+       Changed  ` u to ` x.
+
+Sun Apr 18 2004  Joe Allen <jhallen@world.std.com>
+       * syntax.c, uedit.c:
+
+       Added ` u to insert unicode characters in hex.
+
+       Fixed typeing of unicode (utypebw() optimization bug).
+
+       Fixed editor hang when syntax hightlighter hits unicode characters.
+
+Sat Apr 17 2004  Joe Allen <jhallen@world.std.com>
+       * bw.c menu.c qw.c scrn.c scrn.h utf8.h w.c w.h:
+
+       Allow UTF-8 in menu entries.
+
+       Clear up genfield() and genfmt() stuff.  Now control characters in
+       file names are properly displayed.
+
+       When UTF-8 character decodes to 127 - 159, 0 - 31, display it
+       as a control character.
+
+Sat Apr 17 2004  Joe Allen <jhallen@world.std.com>
+       * w.c:
+
+       Oops: fixed status line.
+
+Fri Apr 16 2004  Joe Allen <jhallen@world.std.com>
+       * ChangeLog TODO cmd.c macro.c pw.c pw.h rc.c regex.c ublock.c 
+       uedit.c ufile.c umath.c usearch.c ushell.c utag.c utf8.c w.c 
+       w.h:
+
+       UTF-8 now supported in file names and prompts.
+
+       Search should be partially working.  \+ with
+       a UTF-8 character following is broken and
+       \[ ] only works for bytes.
+
+Fri Apr 16 2004  Joe Allen <jhallen@world.std.com>
+       * b.c, bw.c, rc.c, rc.h, tw.c, types.h, utf8.c:
+
+       Fixed bug where '-syntax' on command line had
+       no effect.
+
+       Now if terminal is UTF-8, the default file type
+       is assumed to be UTF-8.
+
+Thu Apr 15 2004  Joe Allen <jhallen@world.std.com>
+       * utf8.c:
+
+       Added preprocessor directives to utf8.c to check
+       for locale support.  Needs more work: should check
+       for iconv() support.
+
+       Fix bug which happened when no locale env vars set.
+
+Thu Apr 15 2004  Joe Allen <jhallen@world.std.com>
+       * Makefile.am, configure.ac, main.c, scrn.c, uedit.c,
+       ufile.c, utf8.c, utf8.h:
+
+       First attempt at character set conversion iconv().
+       Now the file's coding can be different from the terminal's
+       coding.  Needs error checking...
+
+       Also, applied secure linux patch from RedHat.
+
+Thu Apr 15 2004  Joe Allen <jhallen@world.std.com>
+       * bw.c, help.c, main.c, menu.c, rc.c, scrn.c, scrn.h,
+       syntax.c, syntax.h, uedit.c, w.c:
+
+       Fix syntax definition file loader so that you don't
+       get seg faults when you refer to a state which doesn't
+       exist.
+
+       Fix outatr() to work with non-UTF-8 character sets again.
+       Need to start thinking about iconv().
+
+       Mess with option strings to make ^T look nicer.
+
+       Got rid of yellow selection bar from ^T.
+
+Wed Apr 14 2004  Joe Allen <jhallen@world.std.com>
+       * b.c b.h macro.c main.c rc.c uedit.c uerror.c uformat.c utag.c
+       utils.c utils.h:
+
+       Fix many edit fuctions for UTF-8.  Now we use
+       iswalnum() when in UTF-8 mode.  Paragraph format
+       works.
+
+       Search is still broken.
+
+Tue Apr 13 2004  Joe Allen <jhallen@world.std.com>
+       * bw.c, syntax.c, syntax.h, syntax/php.jsf.in,
+       syntax/c.jsf.in:
+
+       Added '-NNN' syntax to .jsf files.  Allows you
+       to specify number of lines back to start parsing
+       when we don't have the syntax highlighting state.
+
+Tue Apr 13 2004  Joe Allen <jhallen@world.std.com>
+
+       Moved syntax file to syntax/ subdirectory.  They
+       still don't get installed in a subdirectory :-(
+
+Tue Apr 13 2004  Joe Allen <jhallen@world.std.com>
+       * scrn.c, rc.c, joerc.in:
+
+       Added -assume_color global option.  Need to update
+       other *rc files.
+
+Mon Apr 12 2004  Joe Allen <jhallen@world.std.com>
+       * Makefile.am b.c b.h bw.c scrn.c uedit.c utf8.c utf8.h:
+
+       Input of UTF-8 is now working.  For example, you
+       can cut and paste in an xterm.
+
+       Placed UTF-8 encoder and decoder in separate file.
+
+Mon Apr 12 2004  Joe Allen <jhallen@world.std.com>
+       * bw.c:
+
+       If a double-wide character hits right column, display '>' instead of
+       the character.  If a double-wide character is one column to the left
+       of the screen, display '<' instead of the character.
+
+
+Mon Apr 12 2004  Joe Allen <jhallen@world.std.com>
+       * almost all of them...:
+
+       Added -notite global option: when set, prevents screen from
+       being restored on exit.
+
+       Added -usetabs global option: when set, uses tabs for cursor
+       position update (which was the default before).  Now we don't
+       use tabs by default.
+
+        Completed change to 'unsigned char *' and elimination of
+        MAXINT.  What a mess.  No warnings with gcc -pedantic.
+
+       Fix UTF-8 bugs where cursor was not correct on scrolled screen.
+
+Fri Apr  9 2004  Joe Allen <jhallen@world.std.com>
+       * b.c, b.h, bw.c, types.h:
+
+       Fix lockup bug with down arrow on last line (utf-8).
+
+       Type change: chars will be banned.  Unsigned char * and
+       int will be used for characters.
+
+Fri Apr  9 2004  Joe Allen <jhallen@world.std.com>
+       * Makefile.am, b.c, b.h, bw.c, help.c, main.c, menu.c, rc.c,
+       scrn.c, scrn.h, types.h, uedit.c, w.c, wcwidth.c:
+
+       Initial check-in of UTF-8 support.  Use ^T U to enable UTF-8.
+       JOE is likely to have many bugs at this point.
+
+Thu Apr  8 2004  Joe Allen <jhallen@world.std.com>
+       * bw.c, b.c, joerc.in, rc.c, rc.h, tw.c, types.h:
+
+       Fix screen update bug introduced with Apr 7th change.
+
+       Option settings now can be based on file contents as well as
+       file name.
+
+       Added syntax indicator for status line.
+
+Thu Apr  8 2004  Joe Allen <jhallen@world.std.com>
+       * syntax.c, syntax.h:
+
+       Clean up syntax.c: use hash table for keywords, use subroutine for
+       allocating new states.
+
+
+Wed Apr  7 2004  Joe ALlen <jhallen@world.std.com>
+       * scrn.c, bw.c:
+
+       Fix highlighting bug: pointer was not always at start of line.
+
+       Assume terminal supports color if it looks like an ansi terminal
+       (this should really be an option).
+
+Tue Apr  6 2004  Joe Allen <jhallen@world.std.com>
+       * Makefile.am, bw.c, configure.ac, joerc.in, rc.c, scrn.c,
+       scrn.h, syntax.c, syntax.h, c.jsf.in, perl.jsf.in, verilog.jsf.in:
+
+       Clean up meaning of default color.
+
+       Allow syntax to be specified in joerc file: "-syntax perl"
+
+       Add class definitions to syntax files.
+
+       Add perl and verilog definitions (they need work).
+
+       Change joerc to assume files with . in their name do not want word
+       wrap enabled (except for .txt).
+
+Thu Apr  1 2004  Joe Allen <jhallen@world.std.com>
+       * scrn.c:
+       Fix color handling for terminals which do not use my defaults :-)
+       Basically we revert to the default text color, use ESC [ 0 m, not
+       ESC [ 37 m and ESC [ 40 m.
+
+Tue Mar 30 2004  Joe Allen <jhallen@world.std.com>
+       * uedit.c, syntax.c, syntax.h, types.h, bw.c:
+       Next steps for syntax highlighting: 
+               Now there is a real parser, so syntax files
+               can be defined (although, it only loads
+               the C language c.jsf for now).
+
+               The line length limit has been eliminated.
+
+               It should be faster for large files: we start
+               parsing only 50 lines back when you hit PgUp,
+               not from the start of file each time.
+
+               Todo: update other windows, allow files of
+               other types to be highlighted, create user interface
+               to allow region names to be assigned colors, create
+               more syntax files.  Possibly create program to
+               convert regex NFA to joe DFA syntax file format.
+
+Wed Mar 24 2004  Joe Allen <jhallen@world.std.com>
+       * uedit.c:
+       Fix bug where hitting ^Z on first word of file caused joe to lock up
+
+
+Wed Mar 24 2004  Joe Allen <jhallen@world.std.com>
+       * lots of file:
+       First steps at syntax highlighting!
+       This version has support for C only (and the parser is a big hack),
+       and only if all lines in the file are less than 1K.
+       Turn it on with ^T H
+       Todo: some more speed enhancements, a real parser to handle many
+       file types, eliminate long line hack, update other windows during
+       typing, eliminate some cycle saving hacks when highlighting is on.
+
+Mon Mar 22 2004  Joe Allen <jhallen@world.std.com>
+       * jmacsrc.in:
+       Added ^X [ and ^X ].
+
+Sat Mar 20 2004  Joe Allen <jhallen@world.std.com>
+       * menu.c, menu.h, joerc.in, jstarrc.in, jmacsrc.in, rjoerc.in,
+       jpicorc.in, cmd.c:
+       File selection menu is now four lines instead of one line.  This
+       needs a little more work: user should be able to set how many
+       lines it should be in each context.
+
+Sat Mar 20 2004  Joe Allen <jhallen@world.std.com>
+       * usearch.c:
+       After every search we reset window left offset to 0 and then make
+       the minimal left-right scroll necessary to get entire found text
+       completely on the screen.
+
+Sat Mar 20 2004  Joe Allen <jhallen@world.std.com>
+       * uerror.c:
+       Slight improvement in compiler error parser.
+
+Sat Mar 20 2004  Joe Allen <jhallen@world.std.com>
+       Fix shell window again: instead of running bash if there is no
+       SHELL variable defined, we just print a message.
+       Also noticed that session leader stuff in Cygwin is broken: if you
+       suspend joe the subshell breaks.
+
+Sat Mar 20 2004  Joe Allen <jhallen@world.std.com>
+       * tty.c, ushell.c:
+       Fix shell window for Cygwin:
+       The problem was that the SHELL environment variable is not defined.
+       So now, if it's not defined we assume /usr/bin/bash.
+       Also, we have to use /dev/ptmx for Cygwin.
+       There is still a problem: have to refresh the screen after shell
+       starts.
+
+Fri Mar 19 2004  Joe Allen <jhallen@world.std.com>
+       * tty.c:
+       Fix shell window for SunOS 5.8
+
+Thu Mar 18 2004  Joe Allen <jhallen@world.std.com>
+       * usearch.c, regex.c, regex.h:
+       Allow full escape sequences in replacement strings
+       fixes bug #828156
+
+Thu Mar 18 2004  Joe Allen <jhallen@world.std.com>
+       * b.c:
+       Automatically detect MS-DOS files (files with ^M^J terminated lines)
+
+Thu Mar 18 2004  Joe Allen <jhallen@world.std.com>
+       * tw.c, uedit.c, tty.c:
+       Fix ^C and ^D in shell windows (for linux at least)
+
+Mon Jan 19 2004  Marek 'Marx' Grac <xgrac@fi.muni.cz>
+       * utag.c:
+       Correct file position by using tags file generated from ctags 5.5.2
+
+Wed Jul  9 2003  John Morrissey <jwm@horde.net>
+       * configure.ac:
+       look for snprintf() in libdb too (fixes compilation on OSF1)
+
+Fri Jun 20 2003  Anil Madhavapeddy <anil@recoil.org>
+       * usearch.c:
+       fix boundary to snprintf()
+
+Mon Jun 16 2003  Vitezslav Samel <samel@mail.cz>
+       * uedit.c
+       u_goto_prev()/u_goto_next() fix take two: skip over spaces
+       (return of joe-2.8 behaviour)
+
+Sun Jun  1 2003  Vitezslav Samel <samel@mail.cz>
+       * cmd.c, tab.c, uisrch.c:
+       don't beep when not asked
+       (suggestion by Marc Joosen <marcj@historia.et.tudelft.nl>)
+
+Sun Jun  1 2003  Vitezslav Samel <samel@mail.cz>
+       * configure.ac, ublock.c:
+       NEW FEATURE: when filtering block put JOE_FILENAME= with the right
+       filename into the environment (only when putenv() is available);
+       patch by Marc Joosen <marcj@historia.et.tudelft.nl>
+
+Sat May 31 2003  Vitezslav Samel <samel@mail.cz>
+       * uedit.c:
+       make u_goto_prev()/u_goto_next() act like ubackw()/u_word_delete()
+       when moving cursor, i.e. operate on the same class of characters
+
+Sat May 31 2003  Vitezslav Samel <samel@mail.cz>
+       * configure.ac:
+       change version number to include _CVS suffix
+
+Mon May  5 2003  Vitezslav Samel <samel@mail.cz>
+       *** Release joe-2.9.8 ***
+
+       * NEWS, configure.ac, main.c:
+       update NEWS; bump up version; update copyright year
+       
+Sat May  3 2003  Vitezslav Samel <samel@mail.cz>
+       * README:
+       delete untrue statements and mention the new build system;
+       this file needs some more work
+
+Sat Mar 22 2003  Vitezslav Samel <samel@mail.cz>
+       * jstarrc.in, rc.c:
+       fix typos (patch by Jesse McGrew)
+
+Sat Mar 22 2003  Vitezslav Samel <samel@mail.cz>
+       * cmd.c:
+       fix memleak in docmd() (patch by Jesse McGrew)
+
+Sat Mar 22 2003  Vitezslav Samel <samel@mail.cz>
+       * path.c:
+       use O_EXCL when creating temporary file
+
+Sun Mar  2 2003  Vitezslav Samel <samel@mail.cz>
+       * bw.c, cmd.c, hash.c, kbd.c, macro.c, main.c, menu.c, path.c,
+       poshist.c, pw.c, qw.c, rc.c, regex.c, scrn.c, tab.c, termcap.c, tty.c,
+       tw.c, ublock.c, uedit.c, uerror.c, ufile.c, uisrch.c, umath.c, undo.c,
+       usearch.c, ushell.c, utag.c, vfile.c, vs.c, w.c:
+       change 0 to NULL where we're talking about pointers
+
+Sun Mar  2 2003  Vitezslav Samel <samel@mail.cz>
+       * vs.c, vs.h:
+       make vsrm() and slen() of type sELEMENT *
+
+Sat Feb 22 2003  Vitezslav Samel <samel@mail.cz>
+       * configure.ac:
+       remove AC_FUNC_MALLOC check; this fixes problem with compilation
+       on alpha; we should check for size == 0 in joe_malloc()
+
+Wed Feb 19 2003  Vitezslav Samel <samel@mail.cz>
+       * b.c, b.h, cmd.c, cmd.h, help.c, kbd.c, kbd.h, macro.c, macro.h,
+       main.c, rc.c, rc.h, regex.c, uisrch.c:
+       change type of variables holding string to unsigned char *
+
+Wed Feb 19 2003  Vitezslav Samel <samel@mail.cz>
+       * b.c, tw.c:
+       change type of variables holding time values to time_t
+
+Sat Feb 15 2003  Vitezslav Samel <samel@mail.cz>
+       * b.c, b.h, bw.c, config.h, macro.c, regex.c, tty.c, ublock.c, uedit.c,
+       uerror.c, uformat.c, uisrch.c, usearch.c, utag.c, utils.c, utils.h,
+       vfile.c, vfile.h:
+       fix segafults in isalpha(): replace MAXINT with NO_MORE_DATA symbol
+       which has value of EOF (-1); that value is permitted to pass into
+       isalpha() type functions
+
+Sun Jan  5 2003  Vitezslav Samel <samel@mail.cz>
+       * configure.ac:
+       newer versions (>= 2.54) of autoconf need AC_PROG_EGREP to prevent
+       lockup when running configure; this change require autoconf-2.54
+       at least to properly build joe from CVS
+
+Wed Jan  1 2003  Vitezslav Samel <samel@mail.cz>
+       * rc.c:
+       eliminate "expr, expr" to make sources more readable;
+       change "magic number" to the sizeof()
+
+Wed Jan  1 2003  Vitezslav Samel <samel@mail.cz>
+       * b.c:
+       pisbow() should match the beginning of file and piseow() should match
+       the end of file
+
+Sat Dec  7 2002  Vitezslav Samel <samel@mail.cz>
+       * kbd.c:
+       don't expect all archs have "char == signed char" by default
+
+Sat Dec  7 2002  Vitezslav Samel <samel@mail.cz>
+       * blocks.c, vfile.c:
+       64bit arch fixes: don't expect pointer fits into int (now we assume
+       it fits into unsigned long)
+
+Sat Dec  7 2002  Vitezslav Samel <samel@mail.cz>
+       * types.h, usearch.c:
+       rename restrict() and restrict member of struct search to make
+       joe compile under HPUX with HP C compiler
+
+Mon Aug  5 2002  Vitezslav Samel <samel@mail.cz>
+       *** SECURITY ***
+       * ufile.c:
+       drop suid and sgid bits (if set) when creating backup files
+
+Sat Jul 27 2002  Vitezslav Samel <samel@mail.cz>
+       * jmacsrc.in, jpicorc.in, jstarrc.in:
+       use .@7 terminfo entry for "End" key
+
+Wed Jun 26 2002  Vitezslav Samel <samel@mail.cz>
+       * bw.c, rc.c, rc.h, w.c:
+       rename getcontext() to kmap_getcontext() to prevent conflict with glibc
+       (from Debian patches)
+
+Mon Jun 17 2002  Vitezslav Samel <samel@mail.cz>
+       * ublock.c:
+       insert braces to make if() block evident
+
+Sun Jun  9 2002  Vitezslav Samel <samel@mail.cz>
+       * b.c, bw.c, cmd.c, hash.c, kbd.c, macro.c, main.c, rc.c, regex.c,
+       termcap.c, tty.c, ublock.c, umath.c, vfile.c:
+       change "expr, expr" to "expr; expr" where appropriate to make sources
+       more readable (should have no impact on code) (take 2)
+
+Sun Jun  9 2002  Vitezslav Samel <samel@mail.cz>
+       * hash.c, hash.h:
+       move hnext() definition into hash.c
+
+Sun Jun  9 2002  Vitezslav Samel <samel@mail.cz>
+       * bw.c, rc.c, termcap.c, ufile.c, usearch.c:
+       kill some warnings when compiled with -Wall
+
+Sat Jun  8 2002  Vitezslav Samel <samel@mail.cz>
+       * cmd.c:
+       unwrap array elements in initialization of cmds[]
+
+Sat Jun  8 2002  Vitezslav Samel <samel@mail.cz>
+       * va.c, va.h:
+       change aELEMENT #define to typedef
+
+Sat Jun  8 2002  Vitezslav Samel <samel@mail.cz>
+       * ufile.c:
+       change write() to joe_write() to avoid partly copied files
+
+Sat Jun  8 2002  Vitezslav Samel <samel@mail.cz>
+       * termcap.c:
+       strcmp() can return values other than -1/0/+1
+
+Sat Jun  8 2002  Vitezslav Samel <samel@mail.cz>
+       * b.c, bw.c, macro.c, path.c, pw.c, queue.h, rc.c, regex.c, scrn.c,
+       scrn.h, tab.c, termcap.c, termidx.c, tty.c, tw.c, ublock.c, uedit.c,
+       uerror.c, ufile.c, uformat.c, undo.c, usearch.c, ushell.c, vfile.c,
+       vs.c, w.c:
+       change "expr, expr" to "expr; expr" where appropriate to make sources
+       more readable (should have no impact on code)
+
+Tue Jun  4 2002  Vitezslav Samel <samel@mail.cz>
+       * scrn.c:
+       don't clear screen when nonzero skiptop is given (part 2)
+
+Mon Jun  3 2002  Vitezslav Samel <samel@mail.cz>
+       * scrn.c:
+       don't clear screen when nonzero skiptop is given
+
+Sat Jun  1 2002  Vitezslav Samel <samel@mail.cz>
+       * configure.ac, utils.c:
+       kill warnings when compilling with -Wundef
+
+Tue May 21 2002  Vitezslav Samel <samel@mail.cz>
+       * poshist.c, scrn.c, uformat.c:
+       include some headers which are needed to compile without warnings about
+       implicit function declarations
+
+Sun May  5 2002  Vitezslav Samel <samel@mail.cz>
+       * NEWS:
+       change wrong version for the last entry
+
+Sun May  5 2002  Vitezslav Samel <samel@mail.cz>
+       * configure.ac:
+       solaris compile fix; check for snprintf - if not available, kick out
+
+Sun Mar 10 2002  Vitezslav Samel <samel@mail.cz>
+       * uformat.c:
+       remove deadlock when reformating paragraph (badly converted whitel()
+       to isspace() from removed zstr.c in joe-2.9.2)
+
+Wed Jan 30 2002  Vitezslav Samel <samel@mail.cz>
+       * b.c:
+       use GCHAR macro - clean up the source
+
+Wed Jan 30 2002  Vitezslav Samel <samel@mail.cz>
+       * b.c:
+       change 0 to NULL when used as pointer
+
+Wed Jan 30 2002  Vitezslav Samel <samel@mail.cz>
+       * b.c:
+       change "expr, expr" to "expr; expr"
+
+Wed Jan 30 2002  Vitezslav Samel <samel@mail.cz>
+       * b.c, b.h, types.h:
+       cosmetic cleanup: add comments - this patch doesn't touch code
+
+Fri Jan 25 2002  Vitezslav Samel <samel@mail.cz>
+       * termcap.c:
+       strcmp() can return values other than -1/0/+1 (fix supplied by
+       Schermann Gabor <gaborsch@mailbox.hu>)
+
+Sat Jan 19 2002  Vitezslav Samel <samel@mail.cz>
+       * ublock.c:
+       don't use markb and markk after they are freed (fixes segfault)
+
+Sun Jan 13 2002  Vitezslav Samel <samel@mail.cz>
+       * regex.c:
+       fix char escaping in \+ case
+
+Sat Jan 12 2002  Vitezslav Samel <samel@mail.cz>
+       * help.c, types.h:
+       get back context help (vanished in cleaning patch to help by marx_sk)
+       (context help is now only used in search prompt window)
+
+Tue Jan  8 2002  Vitezslav Samel <samel@mail.cz>
+       * vs.c, vs.h:
+       change sELEMENT #define to typedef
+
+Mon Jan  7 2002  Vitezslav Samel <samel@mail.cz>
+       * acinclude.m4, configure.ac, tty.c, umath.c, ushell.c, utils.c,
+       utils.h:
+       cleanup signals handling (sigaction() / sigvec() / signal())
+
+Sun Jan  6 2002  Vitezslav Samel <samel@mail.cz>
+       * cmd.c:
+       correct "negated macro" for nbuf/pbuf macros
+
+Fri Dec 14 2001  Vitezslav Samel <samel@mail.cz>
+       *** Release joe-2.9.8-pre1 ***
+
+Fri Dec 14 2001  Vitezslav Samel <samel@mail.cz>
+       * configure.ac, NEWS:
+       prepare for -pre release; bump up version to 2.9.8-pre1
+
+Fri Dec 14 2001  Vitezslav Samel <samel@mail.cz>
+       * Makefile.am:
+       add types.h into distribution package
+
+Wed Dec 12 2001  Vitezslav Samel <samel@mail.cz>
+       * acinclude.m4, configure.ac:
+       use our own joe_SETPGRP macro (autoconf's is broken for *BSD)
+
+Tue Dec 11 2001  Vitezslav Samel <samel@mail.cz>
+       * configure.ac, path.c:
+       include <limits.h> if available to get PATH_MAX
+
+Sun Dec 09 2001  Vitezslav Samel <samel@mail.cz>
+       * b.c, bw.c, cmd.c, hash.c, help.c, kbd.c, macro.c, menu.c, pw.c,
+       queue.c, qw.c, rc.c, scrn.c, tab.c, termcap.c, tty.c, tw.c, ufile.c,
+       uformat.c, uisrch.c, umath.c, undo.c, usearch.c, utils.c, utils.h,
+       va.c, vfile.c, vs.c, w.c:
+       prepare memory allocation functions (change (m|re|c)alloc() and free()
+       into joe_(m|re|c)alloc() and joe_free()) in the utils.c for further
+       checking
+
+Sun Dec 09 2001  Vitezslav Samel <samel@mail.cz>
+       * b.c, cmd.c, dir.c, hash.c, hash.h, pw.c, pw.h, rc.c, tab.c, tab.h,
+       uedit.c, uedit.h, ufile.c, uisrch.c, uisrch.h, umath.c, umath.h, undo.c,
+       ushell.c, utag.c, w.c:
+       change function declaration "void a(P * p)" to "void a(P *p)" (when
+       using GNU indent we must use -Ttype to achieve this behaviour)
+
+Sat Dec 08 2001  Vitezslav Samel <samel@mail.cz>
+       * bw.c, scrn.c, scrn.h, uedit.c, w.c:
+       change xlat macro into xlat(int *, char *) function;
+       change indentation of xlat[ac] tables
+
+Sat Dec 08 2001  Vitezslav Samel <samel@mail.cz>
+       * joerc.in:
+       turn off asis (setlocale(LC_CTYPE) takes care of it);
+       turn off baudrate (leave optimizations of terminal baudrate on the user)
+
+Sat Dec 08 2001  Vitezslav Samel <samel@mail.cz>
+       * configure.ac, tty.c:
+       make joe compilable (not only) on cygwin - check if siginterrupt() is
+       available on this host
+
+Sat Dec 08 2001  Vitezslav Samel <samel@mail.cz>
+       * ublock.c:
+       remove feature: exchange points of start and end of the block when
+       checking validity of block pointers
+
+Sat Dec 08 2001  Vitezslav Samel <samel@mail.cz>
+       * rc.c:
+       change indentation of initialization of pdefault, fdefault
+       and glopts arrays; add comments to [pf]default struct members
+
+Sat Dec 01 2001  Vitezslav Samel <samel@mail.cz>
+       * configure.ac, path.c, path.h, tty.c, tty.h:
+       move pwd() into path.c; check in autoconf if we have at least one
+       of getcwd() / getwd()
+
+Sat Dec 01 2001  Vitezslav Samel <samel@mail.cz>
+       * b.c, configure.ac, tty.c, tty.h, tw.c, uedit.c, utils.c, utils.h,
+       vfile.c:
+       move jread() / jwrite() into utils.c and rename them to joe_read() /
+       joe_write(); add checking of size_t and ssize_t into configure scripts
+
+Sat Dec 01 2001  Vitezslav Samel <samel@mail.cz>
+       * joerc.in:
+       use .@7 terminfo entry for "End" key
+
+Sat Dec 01 2001  Vitezslav Samel <samel@mail.cz>
+       * joerc.in:
+       use "Ctrl-K H for help" in -rmsg (F1 doesn't work in all cases)
+
+Sat Dec 01 2001  Vitezslav Samel <samel@mail.cz>
+       * blocks.c, help.c, macro.c, main.c, path.c, rc.c, regex.c, scrn.c,
+       termcap.c, tw.c, ublock.c, uedit.c, usearch.c, vs.c, w.c:
+       change indentation of cases in the switch() statement
+
+Sat Dec 01 2001  Vitezslav Samel <samel@mail.cz>
+       * b.c, bw.c, main.c, path.c, rc.c, regex.c, scrn.c, termcap.c,
+       termidx.c, tty.c, tw.c, ublock.c, uedit.c, uerror.c, uformat.c, undo.c,
+       utag.c, vfile.c, vs.c, w.c:
+       change indentation of do {} while(); cycles
+
+Wed Nov 28 2001  Vitezslav Samel <samel@mail.cz>
+       * b.c, b.h, blocks.c, blocks.h, bw.c, bw.h, cmd.c, cmd.h, dir.c,
+       help.c, help.h, kbd.c, kbd.h, macro.c, macro.h, main.c, main.h, menu.c,
+       menu.h, path.c, path.h, poshist.c, poshist.h, pw.c, pw.h, queue.h,
+       qw.c, qw.h, rc.c, rc.h, regex.c, scrn.c, scrn.h, tab.c, tab.h,
+       termcap.c, tty.h, tw.c, tw.h, types.h, ublock.c, ublock.h, uedit.c,
+       uerror.c, ufile.c, ufile.h, uformat.c, uformat.h, uisrch.c, uisrch.h,
+       umath.c, umath.h, undo.c, undo.h, usearch.c, usearch.h, ushell.c,
+       ushell.h, utag.c, utag.h, utils.c, utils.h, va.c, va.h, vfile.c,
+       vfile.h, vs.c, vs.h, w.c, w.h: include only headers which are
+       necessary and since the headers now don't depend on each other,
+       include them in alphabetic order
+
+Thu Nov 22 2001  Marek 'Marx' Grac <xgrac@fi.muni.cz>
+       * *.h, *.c: almost all definitions are in types.h (except those from
+       vs.h, va.h). 
+
+Thu Nov 22 2001  Marek 'marx' Grac <xgrac@fi.muni.cz>
+       * uedit.c: correction of last change
+
+Tue Nov 20 2001  Marek 'marx' Grac <xgrac@fi.muni.cz>
+       * w.h, w.c, usearch.c, ufile.c, macro.c, uerror.c, umath.c:
+       MSGBUFSIZE was renamed to JOE_MSGBUFSIZE, because MSGBUFSIZE is
+       defined on BSD like systems.
+
+Mon Nov 12 2001  Vitezslav Samel <samel@mail.cz>
+       * Makefile.am, deleted chain.asm, kbdhdl.c, kbdhdl.h, msscrn.c,
+       mstty.c, termcap, terminfo: delete unused files from distribution
+
+Mon Nov 12 2001  Peter Breitenlohner <peb@mppmu.mpg.de>
+       * Makefile.am: make joe installable into another root dir
+       with "make DESTDIR=/path/ install"
+
+Sun Nov 11 2001  Vitezslav Samel <samel@mail.cz>
+       * ufile.c: comment out unused functions (nask2()/uask2())
+
+Sun Nov 11 2001  Vitezslav Samel <samel@mail.cz>
+       * uedit.c: correct typo: utype(bw, c) --> utypebw(bw,c)
+       I'm not 100% sure about this, but "works for me here"(tm)
+
+Sun Nov 11 2001  Vitezslav Samel <samel@mail.cz>
+       * termcap.c, termcap.h: correct prototype to the output routine
+       the CAP structure (and setcap()/getcap() etc.)
+
+Sun Nov 11 2001  Vitezslav Samel <samel@mail.cz>
+       * regex.c, regex.h: change regex pointer to be 'unsigned char *regex'
+       This kills some warnings during build.
+
+Sun Nov 11 2001  Vitezslav Samel <samel@mail.cz>
+       * cmd.c, menu.c, menu.h, rc.c, tab.c, ufile.c: use mkmenu(W *, ...)
+       instead of mkmenu(BASE *, ...).
+       This kills some warnings during build.
+
+Sun Nov 11 2001  Vitezslav Samel <samel@mail.cz>
+       * tw.c, w.h: non-code clean up
+
+Sun Nov 11 2001  Vitezslav Samel <samel@mail.cz>
+       * macro.c, qw.c, qw.h, tw.c, uedit.c, uisrch.c, usearch.c, ushell.c:
+       use mkqw(W *, ...) instead of mkqw(BASE *, ...) (same applies to
+       mkqwna() and mkqwnsr()).
+       This kills a lot of warnings during build.
+
+Sun Nov 11 2001  Vitezslav Samel <samel@mail.cz>
+       * bw.c, cmd.c, macro.c, main.c, rc.c, tab.c, tw.c, ublock.c, uedit.c,
+       uerror.c, ufile.c, umath.c, undo.c, usearch.c, ushell.c, utag.c, w.c,
+       w.h: use msgnw[t](W *, char *) instead of msgnw[t](BASE *, char *).
+       This kills a lot of warnings during build.
+
+Sun Nov 11 2001  Vitezslav Samel <samel@mail.cz>
+       * b.c, blocks.c, blocks.h, scrn.c, termcap.c, undo.c, vfile.c, vs.c:
+       use mfwrd() and mbkwd() only as internal functions to mmove().
+       This kills some of the remaining warnings during build.
+
+Wed Nov 07 2001  Vitezslav Samel <samel@mail.cz>
+       *** Release joe-2.9.7 ***
+
+Wed Nov 07 2001  Vitezslav Samel <samel@mail.cz>
+       * configure.ac: bump up version number
+
+Wed Nov 07 2001  Vitezslav Samel <samel@mail.cz>
+       * NEWS: update - prepare for release
+
+Wed Nov 07 2001  Vitezslav Samel <samel@mail.cz>
+       * Makefile.am, deleted conf.c: conf.c not used anymore
+
+Wed Nov 07 2001 Vitezslav Samel <samel@mail.cz>
+       * Makefile.am: add README.cvs and docs/help-system.html
+       to EXTRA_DIST variable
+
+Wed Nov 07 2001  Marek 'Marx' Grac <xgrac@fi.muni.cz>
+       * docs/help-system.html: updated
+
+Tue Nov 06 2001  Vitezslav Samel <samel@mail.cz>
+       * new file README.cvs: documentation file on how to access joe sources
+       via CVS
+
+Sun Nov 04 2001  Vitezslav Samel <samel@mail.cz>
+       * ufile.c: kill infinite loop when saving unmodified file
+       (sourceforge.net BUG #478290)
+
+Sun Nov 04 2001  Vitezslav Samel <samel@mail.cz>
+       * ufile.c: remove "feature" added in 2.9.7-pre1 so the user is always
+       asked of the filename saved (sourceforge.net BUG #449489)
+
+Wed Oct 31 2001  Vitezslav Samel <samel@mail.cz>
+       * bw.h, tty.c, configure.ac: make use of pid_t type
+
+Mon Oct 29 2001  Vitezslav Samel <samel@mail.cz>
+       *** Release joe-2.9.7-pre3 ***
+
+Mon Oct 29 2001  Vitezslav Samel <samel@mail.cz>
+       * autoconf.ac: bump pre-version number
+
+Sun Oct 28 2001  Vitezslav Samel <samel@mail.cz>
+       * autoconf.ac: remove optimizing flags from CFLAGS
+       I'm aware of too much bugreports (in other projects) due to buggy code
+       generated by over-optimized gcc (default '-O2 -g' is O.K. for most
+       instalations - advanced user can change it by setting CFLAGS before
+       running configure, he surely knows, what is he doing ;-))
+
+Sun Oct 28 2001  Vitezslav Samel <samel@mail.cz>
+       * Makefile.am, joe.spec: joe.spec deleted - I don't think it belongs
+       to tar.gz package
+       (to make it proper .rpm package there's more to be done - this is
+       work of .rpm packager - he can insert a lot of useful but for joe
+       unnecesary files - think of icons on the desktop etc.)
+
+Sun Oct 28 2001  Vitezslav Samel <samel@mail.cz>
+       * autoconf.ac: add AC_CANONICAL_(BUILD|HOST) to make
+       "automake -a -c" copy necessary config.guess and config.sub files
+
+Sun Oct 28 2001  Vitezslav Samel <samel@mail.cz>
+       * files generated by automake package: use automake-1.5 to make joe
+       compile on mips-sgi-irix6.5 with non-GNU make again
+
+Sun Oct 28 2001  Jeff Downs <heydowns@users.sourceforge.net>
+       * uedit.c: don't change windows when setting mark (using Esc Esc)
+       in multiwindow mode (SourceForge bug #462875)
+
+Thu Oct 25 2001  Vitezslav Samel <samel@mail.cz>
+       * kbd.c, scrn.c, termcap.h, tty.c, tty.h, va.c, va.h, w.c:
+       clean up warnings raised up by strict prototypes
+
+Mon Oct 22 2001  Vitezslav Samel <samel@mail.cz>
+       * configure.ac, utils.c, utils.h and new file acinclude.m4:
+       makes the wordwrap work correctly again (SourceForge bugs #418871,
+       #471964)
+
+Mon Oct 22 2001  Vitezslav Samel <samel@mail.cz>
+       * all *.c and *.h files, autoconf.ac: use strict prototypes
+       if applicable (fairly huge change)
+
+Sat Oct 20 2001  Sebastian Wenzler <s_wenzler@users.sourceforge.net>
+       * Makefile.am: when symlinking rjoe etc. to joe use links without
+       absolute path (SourceForge bug #471898)
+
+Wed Oct 10 2001  Vitezslav Samel <samel@mail.cz>
+       *** Release joe-2.9.7-pre2 ***
+
+Wed Oct 10 2001  Vitezslav Samel <samel@mail.cz>
+       * config.h, b.c, bw.c, hash.c, help.c, kbd.c, macro.c, main.c,
+       menu.c, path.c, pw.c, queue.c, qw.c, rc.c, tab.c, tw.c, ufile.c,
+       uformat.c, uisrch.c, undo.c, usearch.c, ushell.c, vs.c, w.c:
+       include <time.h> and <stdlib.h> only in those files which need them
+
+Wed Oct 10 2001  Vitezslav Samel <samel@mail.cz>
+       * configure.ac, main.c: autoconf.ac will be the only place where
+       to change version number; use VERSION #define from automake macro
+       when printing version
+
+Wed Oct 10 2001  Vitezslav Samel <samel@mail.cz>
+       * blocks.c, config.h: cleanup blocks.c; remove cases when AUTOINC
+       is enabled (AUTOINC case is IMHO slower then the other code - and
+       AUTOINC wasn't enabled by default in config.h); change indenting
+       of code in the body of switch() to something more readable
+
+Wed Sep 20 2001  Vitezslav Samel <samel@mail.cz>
+       * help.c: use unsigned int for lengths; remove local copy of filename;
+       replace "magic numbers" with sizeof(buf); rename members of struct
+       help (it's always clear where it belongs; change indentation of
+       switch(); remove goto's (we have continue ;-))
+
+Wed Sep 20 2001  Vitezslav Samel <samel@mail.cz>
+       *** SECURITY ***
+       * configure.ac, path.c: use mkstemp() if available; use <paths.h> if
+       available; this patch changes name of temporary file
+       to joe.tmp.XXXXXX (XXXXXX are unique chars)
+
+Wed Sep 20 2001  Vitezslav Samel <samel@mail.cz>
+       * configure.ac, path.c: use autoconf's way of finding which of
+       struct direct / struct dirent are available; clean up handling
+       of MS-DOS drive letters in the paths
+
+Wed Sep 20 2001  Vitezslav Samel <samel@mail.cz>
+       * tty.c: use full definitions of functions (maskit(), unmaskit(),
+       pauseit()) - it removes some compile warnings
+
+Wed Sep 20 2001  Vitezslav Samel <samel@mail.cz>
+       * tty.c: cleanup SA_INTERRUPT/SV_INTERRUPT handling
+
+Wed Sep 20 2001  Vitezslav Samel <samel@mail.cz>
+       * main.h: add prototype of edupd()
+
+Wed Sep 20 2001  Vitezslav Samel <samel@mail.cz>
+       * uedit.c: use jread()/jwrite() which retry when interrupted
+       by a signal
+
+Wed Sep 20 2001  Vitezslav Samel <samel@mail.cz>
+       * macro.c, uformat.c: include "utils.h" instead of <ctype.h> to have
+       isblank() defined
+
+Wed Sep 19 2001  Vitezslav Samel <samel@mail.cz>
+       * config.h, configure.ac, tty.c: use autoconf's way of detecting which
+       termio()/termios() functions are available; use HAVE_GETWD/HAVE_GETCWD
+       macros instead of TTYPOSIX/TTYSV #defines
+
+Wed Sep 19 2001  Vitezslav Samel <samel@mail.cz>
+       * configure.ac, tty.c: use autoconf's method of finding which header
+       to include to have TIOCGWINSZ defined
+
+Wed Sep 19 2001  Vitezslav Samel <samel@mail.cz>
+       * tty.c: replace ugly "method" of detecting setitimer() with
+       HAVE_SETITIMER macro from autoconf
+
+Wed Sep 19 2001  Vitezslav Samel <samel@mail.cz>
+       * config.h, tty.c: remove improperly used HZ #define
+
+Wed Sep 19 2001  Vitezslav Samel <samel@mail.cz>
+       * tty.h, vfile.c: add prototypes of jread() / jwrite()
+
+Wed Sep 19 2001  Vitezslav Samel <samel@mail.cz>
+       * b.c, tty.c, umath.c: various systems use different signal handler
+       prototypes - make use of RETSIGTYPE macro from autoconf
+
+Wed Sep 19 2001  Vitezslav Samel <samel@mail.cz>
+       * configure.ac, tty.c: various systems use different setpgrp()
+       prototypes - make use of SETPGRP_VOID macro from autoconf
+
+Fri Sep 14 2001  Alexandre P. Nunes <alex@PolesApart.dhs.org>
+       * configure, configure.ac, missing, Makefile.am, Makefile.in,
+       aclocal.m4, autoconf.h.in, config.h, *rc files, b.c, main.c,
+       path.c, tty.c: use recent automake and autoconf configuration
+       system (at the moment we're using automake-1.4-p4, autoconf-2.52)
+
+Thu Jul 20 2001  Marek 'Marx' Grac <xgrac@fi.muni.cz>
+       *** Release joe-2.9.7-pre1 ***
+
+Thu Jul 19 2001  Marek 'Marx' Grac <xgrac@fi.muni.cz>
+       * help.c, help.h, main.c: help system was rebuilt
+       
+Thu Jul 19 2001  Vitezslav Samel <samel@mail.cz>
+       * joe.1, ufile.c: new feature 'backup suffix', when the system 
+       environment SIMPLE_BACKUP_SUFFIX is set then it is used instead of ~.
+       Inspired by patch program.
+       
+Thu Jul 19 2001  Vitezslav Samel <samel@mail.cz>
+       * lot of files: patch which removes a lot of warnings.
+       
+Wed Jul 04 2001  Marek 'Marx' Grac <xgrac@fi.muni.cz>
+
+       * b.c, main.c, path.c, path.h, rc.c, ufile.c: Function 'ossep'
+       was completly removed because it was not possible to access
+       files like test\ in UNIX like systems.
+       
+Wed Jul 04 2001  Marek 'Marx' Grac <xgrac@fi.muni.cz>
+
+       * ufile.c: Several minor changes.
+       
+Wed Jul 04 2001  Marek 'Marx' Grac <xgrac@fi.muni.cz>
+
+       * ufile.c: Problem with freezing when saving unmodified file 
+       is solved. But it is possible that this patch is only partial   
+
+Wed Jul 04 2001  Marek 'Marx' Grac <xgrac@fi.muni.cz>
+
+       * ufile.c: Modified flag is now properly set. It can look
+       awful but pre-first undo record has modified flag set on.
+
+Wed Jul 03 2001  Marek 'Marx' Grac <xgrac@fi.muni.cz>
+
+       * joe-2.9.7pre0.tgz: version 2.9.7pre0 was released
+
+Wed Jul 02 2001  Marek 'Marx' Grac <xgrac@fi.muni.cz>
+
+       * lot of files: I get last version without wordwrap bug (2.9.6pre1) and
+       applied almost all patches which are mentioned in NEWS file. Problem
+       with ${sysconfdir}/joerc is probably still actual, because I was not
+       able to find patch :(
+
+______________________________________________________________________
+$MirOS: contrib/code/jupp/ChangeLog,v 1.6 2008/05/13 16:17:41 tg Exp $
diff --git a/HINTS b/HINTS
new file mode 100644 (file)
index 0000000..1e089c9
--- /dev/null
+++ b/HINTS
@@ -0,0 +1,120 @@
+This documentation should go elsewhere, but I haven't gotten around to it
+yet.
+
+GCC
+---
+
+Using -fomit-frame-pointer may miscompile code at least in gcc 3.4.6, see
+http://article.gmane.org/gmane.os.miros.cvs/11607 for details.
+
+Disable the following warnings; the code doesn't cope with it:
+-Wno-pointer-sign
+-Wno-unused-parameter
+-Wno-missing-field-initializers
+-Wno-old-style-definition -Wno-strict-prototypes
+-Wno-cast-qual
+-Wno-missing-prototypes -Wno-missing-declarations
+
+UTF-8
+-----
+
+JOE now handles two classes of character sets: UTF-8 and byte coded (like
+ISO-8859-1).  It can not yet handle other major classes such as UTF-16 or
+GB2312. There are other restrictions: character sets must use LF (0x0A) or
+CR-LF (0x0D - 0x0A) as line terminators, space must be 0x20 and tab must be
+0x09. Basically, the files must be UNIX or MS-DOS compatible text files.
+
+This means EBCDIC will not work properly (but you would need to handle fixed
+record length lines anyway) and character sets which use CR terminated lines
+(MACs) will not yet work.
+
+The terminal and the file can have different encodings.  JOE will translate
+between the two.  Currently, one of the two must be UTF-8 for translation to
+work.
+
+The character set for the terminal and the default character set assumed for
+files is determined by the 'LC_ALL' environment variable (and if that's not
+set, LC_CTYPE and LANG are also checked).
+
+For example, if LC_ALL is set to:
+
+       de_DE
+
+Then the character set will be ISO-8859-1.
+
+If LC_ALL is set to:
+
+       de_DE.UTF-8
+
+The character set will UTF-8.
+
+Hit ^T E to change the coding for the file.  Hit <tab> <tab> at this prompt
+to get a list of available codings.  There are a number of built-in
+character sets, plus you can install character sets in the ~/.joe/charmaps
+and /usr/local/etc/joe/charmaps directories.
+
+Check: /usr/share/i18n/charmaps for example character set files.  Only
+byte oriented character sets will work.  Also, the file should not be
+gzipped (all of the charmap file in /usr/share/i18n/charmaps on my computer
+were compressed).  The parser is very bad, so basically the file has to look
+exactly like the example one in /usr/local/etc/joe/charmaps.
+
+You can hit ^K <space> to see the current character set.
+
+You can hit ` x to enter a Unicode character if the file coding is UTF-8.
+
+Programming
+-----------
+
+       Try ^K , and ^K .  These keys select the current block (based on
+indentation) and shift it left or right by the -istep and -indentc.
+
+Selecting blocks
+----------------
+
+       The "classic" way is to hit ^K B at the beginning and ^K K at the
+end.  These set pointers called markb and markk.  Once these are set you
+can jump to markb with ^[ b and jump to markk with ^[ k.
+
+       New way no.1: hit Ctrl-space to start selecting, move the cursor,
+then hit Ctrl-space to complete the block.  Hit Ctrl-space in the block to
+cancel it.  Hit Ctrl-space outside of the block to start selecting a new
+one.  This uses the "toggle_marking" function.  Also any block command will
+complete the block.
+
+       New way no.2: hit Ctrl-rtarw to start selecting rightward.  Each
+time you hit Ctrl-rtarw, the block is extended one more to the right.  This
+uses a simple macro: "begin_marking,rtarw,toggle_marking".  Unfortunately,
+there is no standard way to get the keysequence given by the terminal
+emulator when you hit Ctrl-rtarw.  Instead you have to determine this
+sequence yourself and enter it directly in the joerc file.  Some examples
+are given for xterm and gnome-terminal.  Hit ` rtarw to have the sequence
+shown on your screen.  Note that Putty uses ^[ ^[ [ C which will not appear
+with ` rtarw (also ^[ ^[ is set book mark, so you need to unbind it to do
+this in Putty).
+
+       Also you can hit Ctrl-delete to cut and Ctrl-insert to paste if the
+sequence for these keys are known.
+
+Hex edit mode
+-------------
+
+When this mode is selected (either put -hex on the command line, or look for
+"Hex edit mode" after hitting ^T), the buffer is displayed as a hex dump,
+but all of the editing commands operate the same way.  It is most useful to
+select overtype mode in conjunction with hex dump (hit ^T T).  Then typing
+will not insert.
+
+- To enter the hex byte 0xF8 type ` x F 8
+
+- You can use ^KC to copy a block as usual.  If overtype mode is selected,
+  the block will overwrite the destination data without changing the size of
+  the file.  Otherwise it inserts. 
+
+- Hit ESC x byte <Enter>, to jump to a particular byte offset.  Hex values
+  can be entered into this prompt like this: 0x2000.
+
+- Search, incremental search, and search & replace all operate as usual.
+
+__________________________________________________________________
+$MirOS: contrib/code/jupp/HINTS,v 1.5 2011/07/16 21:57:55 tg Exp $
diff --git a/INFO b/INFO
new file mode 100644 (file)
index 0000000..4aaefb7
--- /dev/null
+++ b/INFO
@@ -0,0 +1,182 @@
+$MirOS: contrib/code/jupp/INFO,v 1.9 2008/05/13 16:17:42 tg Exp $
+-----------------------------------------------------------------
+
+                                    Jupp
+                            Joe's Own Editor 3.1
+
+                  A Free ASCII-Text Screen Editor for UNIX
+                          by Joseph Allen (<= 2.8)
+                         Marek 'Marx' Grac (=> 2.9)
+                        by Joseph Allen again (=>3.0)
+                 by Thorsten "mirabilos" Glaser (jupp mods)
+
+Get it from:
+       http://mirbsd.de/jupp
+       http://sourceforge.net/projects/joe-editor
+
+If you have questions, problems or suggestions,
+       Use sourceforge: mailing list, bug tracker, discussion groups.
+
+       JOE is the professional freeware ASCII text screen editor for UNIX.
+It makes full use of the power and versatility of UNIX, but lacks the steep
+learning curve and basic nonsense you have to deal with in every other UNIX
+editor. JOE has the feel of most IBM PC text editors: The key-sequences are
+reminiscent of WordStar and Turbo-C.  JOE is much more powerful than those
+editors, however.  JOE has all of the features a UNIX user should expect:
+full use of termcap/terminfo, excellent screen update optimizations (JOE is
+fully usable at 2400 baud), simple installation, and all of the
+UNIX-integration features of VI.
+
+       JOE's initialization file determines much of JOE's personality and
+the name of the initialization file is simply the name of the editor
+executable followed by "rc".  JOE comes with four "rc" files in addition to
+the basic "joerc", which allow it to emulate these editors:
+
+       JPICO   - An enhanced version of the Pine mailer system's PICO
+                 editor.
+
+       JSTAR   - A complete imitation of WordStar including many "JOE"
+                 extensions.
+
+       RJOE    - A restricted version of JOE which allowed you to edit
+                 only the files specified on the command line.
+
+       JMACS   - A GNU-EMACS imitation which is about one order of
+                 magnitude smaller than real GNU-EMACS.
+
+       JUPP    - A modern editor for programmers with WordStar-like bindings
+
+Features:
+
+       JOE has a well thought-out user-interface with great attention to
+detail.  The Page Up and Page Down functions do not move the cursor relative
+to the edges of the screen.  Left and Right arrow keys work at the beginning
+and ends of lines.  The cursor can move past the ends of lines without
+jumping, but also without inserting or deleting extra spaces at the ends of
+lines. Control characters and characters above 127 can be displayed and
+entered- even ^Q and ^S.  The cursor's row and column number can be
+displayed in the status line.
+
+       The key layout is made to reduce terminal incompatibility nonsense.
+^Q and ^S are not used and both ^H and DEL are mapped to backspace.  Case
+does not matter in key sequences- ^K E, ^K e, and ^K ^E are each mapped to
+the same function.  The arrow keys and PageUp, PageDown, Home, End, Insert
+and Delete keypad keys are read from the termcap entry and are assigned to
+the proper functions.  A simple initialization file, similar to Semware's
+Q-EDIT, allows key-bindings, simple macros and help windows to be defined.
+
+       JOE has full termcap/terminfo support and will work on any terminal.
+JOE has the best screen update optimization algorithm available.  It uses
+VT100-style scrolling regions the way they are supposed to be used (I.E.,
+without building insert and delete line functions out of them) and has a
+powerful line shifting (insert/delete character) algorithm which works even
+if text goes past the ends of lines.  JOE has deferred screen update to
+handle typeahead and uses the baud rate reported by 'stty' to ensure that
+deferral is not bypassed by tty buffering.
+
+       JOE has multiple windows and lacks the confusing notion of a named
+buffers.  You just have files and windows.  When there are more windows than
+can fit on the screen, the Goto-Next-Window function scrolls through them.
+The same file can have multiple windows opened on it.
+
+       JOE has VI-style unix integration.  You can filter a highlighted
+block through a UNIX command.  Also, each place in joe which accepts a file
+name (including the command line) will also accept:
+
+               !command                to pipe into or out of a command
+               >>filename              to append to a file
+               filename,start,size     to edit a portion of a file/device
+               -                       to use stdin or stdout
+
+       File names on the command line may be preceded by +nnn to start
+editing at a specified line.
+
+       JOE has shell windows.  You can run a shell in a window and any
+output from commands run in the shell gets stored in a buffer.
+
+       JOE has an orthogonal event-driven design.  Each prompt is actually
+a normal edit buffer containing a history of all of the responses entered
+for that prompt.  You can use all of the normal edit commands to create file
+names and search strings.  You can use the up arrow key (or search backwards
+and any other appropriate edit command) to go back through the history of
+previous responses.  Prompts are reentrant- meaning that edit commands which
+require prompts can still be used inside of prompts.
+
+       JOE has TAB-completion and file selection menus.  If you hit tab in
+a file name prompt, the name is either completed or a menu of possible
+matches appears.
+
+       JOE stores edit files in a doubly linked list of gap buffers which
+can spill into a temporary file.  You can edit files of any size up to the
+amount of free disk space and there are no line-length restrictions.  Since
+the buffering system is block-based, JOE will incur only a minimum of
+swapping on heavily loaded systems.
+
+       When you ask for help, one of six small help reference cards appears
+on the screen and remains while you continue to use the editor.  Here is the
+first help card:
+
+CURSOR           GO TO            BLOCK      DELETE   MISC         EXIT
+^B left ^F right ^U  prev. screen ^KB begin  ^D char. ^KJ reformat ^KX save
+^P up   ^N down  ^V  next screen  ^KK end    ^Y line  ^T  options  ^C  abort
+^Z previous word ^A  beg. of line ^KM move   ^W >word ^@  insert   ^KZ shell
+^X next word     ^E  end of line  ^KC copy   ^O word< ^R  retype   FILE
+SEARCH           ^KU top of file  ^KW file   ^J >line SPELL        ^KE new
+^KF find text    ^KV end of file  ^KY delete ^_ undo  ^[N word     ^KR insert
+^L  find next    ^KL to line No.  ^K/ filter ^^ redo  ^[L file     ^KD save
+
+       JOE has a powerful set of editing commands suitable for editing both
+text files and programs:
+
+               - UTF-8 support
+
+               - Syntax highlighting
+
+               - search and replace system, including powerful regular
+                 expressions (including matching of balanced C expressions).
+
+               - tags file search
+
+               - paragraph format
+
+               - undo and redo
+
+               - position history allows you to get back to previous
+                 editing contexts and allows you to quickly flip between
+                 editing contexts
+
+               - multiple keyboard macros
+
+               - block move/copy/delete/filter
+
+               - rectangle (columnar) mode
+
+               - overtype/insert modes
+
+               - indent/unindent
+
+               - goto matching ( [ {
+
+               - auto-indent mode
+
+       Plus many options can be set:
+
+               - can have EMACS-style cursor re-centering on scrolls
+
+               - characters between 128-255 can be shown as-is for
+                 non-English character sets
+
+               - Final newline can be forced on end of file
+
+               - Can start with a help screen on
+
+               - Left/Right margin settings
+
+               - Tab width
+
+               - Indentation step and fill character
+
+/*  jhallen@world.std.com */                              /* Joseph H. Allen */
+int a[1817];main(z,p,q,r){for(p=80;q+p-80;p-=2*a[p])for(z=9;z--;)q=3&(r=time(0)
++r*57)/7,q=q?q-1?q-2?1-p%79?-1:0:p%79-77?1:0:p<1659?79:0:p>158?-79:0,q?!a[p+q*2
+]?a[p+=a[p+=q]=q]=q:0:0;for(;q++-1817;)printf(q%79?"%c":"%c\n"," #"[!a[q-1]]);}
diff --git a/LIST b/LIST
new file mode 100644 (file)
index 0000000..f55a674
--- /dev/null
+++ b/LIST
@@ -0,0 +1,234 @@
+$MirOS: contrib/code/jupp/LIST,v 1.4 2009/08/02 15:24:57 tg Exp $
+-----------------------------------------------------------------
+
+Joe commands grouped by function
+
+Background programs
+-------------------
+bknd           Run a shell in a window
+killproc       Kill program in current window
+run            Run a unix command in a window
+
+Blocks
+------
+blkcpy         Copy marked block to cursor
+blkdel         Delete marked block
+blkmove                Move marked block to cursor
+blksave                Save marked block into a file
+copy           Copy block to kill-ring
+drop           Set markb.  If it was already set, eliminate it.
+dropon          Set markb.  If it was already set, eliminate it.  Turn on marking mode.
+
+toggle_marking If we're in a block: clear markb and markk.
+               If marking is off: set markb and turn on marking.
+               If marking is on: set markk (swap if necessary with markb)
+               and turn marking off.
+
+begin_marking  If we're on an edge of a block: set markb to other edge and
+               turn on marking mode.  Otherwise set markb to cursor and
+               turn on marking mode.
+
+select          Set markb.  If it was already set, do nothing.
+filt           Filter block or file through a unix command
+markb          Set beginning of block mark
+markk          Set end of block mark
+markl          Mark current line
+nmark          Eliminate markb and markk
+picokill       Delete line or block
+pop            Restore markb and markk values from stack
+psh            Push markb and markk values onto a stack
+swap           Switch cursor with markb
+tomarkb                Move cursor to markb
+tomarkbk       Move cursor to markb or markk
+tomarkk                Move cursor to markk
+yank           Insert top of kill ring
+yankpop                Scroll through kill ring
+yapp           Append next kill to top of kill ring
+upper          Convert everything in block to uppercase
+lower          Convert everything in block to lowercase
+
+Buffers
+-------
+bufed          Buffer menu
+edit           Load file into window: asks to reload if buffer exists
+switch         Load file into window: always uses buffer if it exists
+scratch                Load a scratch buffer into current window
+nbuf           Load next buffer into current window
+pbuf           Load previous buffer into current window
+
+Cursor Motion
+-------------
+bof            Move cursor to beginning of file
+bol            Move cursor to beginning of line (always)
+bop            Move to beginning of a paragraph
+bos            Move to beginning of screen
+bkwdc          Search backwards for a character
+byte           Move cursor to specific byte offset into the file.
+col            Move cursor to specific column number.
+dnarw          Move cursor down one line
+eof            Move cursor to end of file
+eol            Move cursor to end of line
+eop            Move cursor to end of paragraph
+fwrdc          Search forward for matching character
+gomark         Move cursor to a bookmark
+home           Move cursor to beginning of line
+line           Move cursor to specified line
+ltarw          Move cursor left
+nedge          Move cursor to next edge
+nextpos                Move cursor to next position in cursor position history
+nextword       Move cursor to end of next word
+pedge          Move cursor to previous edge
+prevpos                Move cursor to previous position in cursor position history
+prevword       Move cursor to beginning of previous word
+rtarw          Move cursor right
+setmark                Set a bookmark
+tomatch                Move cursor to matching delimiter
+tos            Move cursor to top of screen
+uparw          Move cursor up
+
+Deletion
+--------
+backs          Backspace
+backw          Backspace a word
+delbol         Delete to beginning of line
+delch          Delete character under cursor
+deleol         Delete to end of line
+dellin         Delete entire line
+delw           Delete word to right
+
+Error parsing
+-------------
+nxterr         Goto next parsed error
+parserr                Parse errors in current file
+prverr         Go to previous parsed error
+
+Exit
+----
+cancel         Like abort, but doesn't return failure: useful in macros
+               to escape out of a prompt.
+
+abort          Abort current buffer/window.  Prompt if it is changed.
+
+abortbuf       Like above, but just fail if it would have to prompt because
+               it's the last window on a modified buffer.
+
+ask            Prompt to save current file: user says yes return, user says
+               no: run 'abort'.  Use in a macro: "ask,query,exsave"
+
+exsave         Save file and exit
+
+lose           emacs kill buffer.  The buffer is deleted- any windows with
+               it get a replacement scratch buffer.
+
+querysave      Prompt to save each modified buffer
+               Use in a macro: "querysave,query,killjoe"
+
+killjoe                Exit joe immediately without checking for modified buffers
+
+Files
+-----
+save           Save file
+insf           Insert a file
+
+Formatting
+----------
+center         Center line
+fmtblk         Format all paragraphs in a block
+format         Format current paragraph
+lindent                Indent to the left
+rindent                Indent to the right
+
+Help
+----
+help           Turn help on or off
+hnext          Switch to next help screen
+hprev          Switch to previous help screen
+
+Inserting
+---------
+ctrl           Type next key
+finish         Complete word in text window
+insc           Insert a space
+open           Insert newline
+quote          Insert a control character
+quote8         Insert a meta character
+rtn            Return key
+type           Insert typed character
+
+Macros
+------
+macros         Insert keyboard macros into current file
+play           Execute a macro
+query          Macro query
+record         Record a macro
+stop           Stop recording macro
+
+Menu
+----
+backsmenu      Undo in file completion menu
+bofmenu                Move to beginning of menu
+bolmenu                Move to beginning of line in a menu
+dnarwmenu      Move down one line in a menu
+eolmenu                Move cursor to end of line in a menu
+eofmenu                Move cursor to end of menu
+ltarwmenu      Move cursor left in a menu
+rtarwmenu      Move cursor right in menu
+uparwmenu      Move cursor up in menu
+
+Misc
+----
+beep           Beep
+execmd         Execute a joe command
+math           Calculator
+mode           Mode prompt
+msg            Display a message
+notmod         Clear the modified flag
+retype         Refresh screen
+shell          Suspend process or execute a sub-shell
+stat           Display cursor position
+tag            Tags file search
+txt            Insert text
+
+Prompts
+-------
+complete       Complete a file-name in a prompt
+
+Repeat
+------
+arg            Prompt for repeat argument
+uarg           Universal argument
+
+Scrolling
+---------
+crawll         Pan screen left
+crawlr         Pan screen right
+dnslide                Scroll screen down 1 line
+pgdn           Scroll screen down
+pgup           Scroll screen up
+upslide                Scroll up one line
+
+Search and replace
+------------------
+ffirst         Find text
+fnext          Repeat previous search
+isrch          Incremental search forward
+qrepl          Search and replace
+rfirst         Search backwards for text
+rsrch          Reverse incremental search
+
+Windows
+-------
+explode                Display one window or display all windows
+dupw           Duplicate current window
+groww          Increase size of window
+nextw          Move cursor to next window
+prevw          Go to previous window
+shrinkw                Shrink window
+splitw         Split window into two
+tw0            Eliminate this window
+tw1            Show only one window
+
+Undo
+----
+redo           Re-execute the latest undone change
+undo           Undo last change
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..2e1b66c
--- /dev/null
@@ -0,0 +1,78 @@
+# $MirOS: contrib/code/jupp/Makefile.am,v 1.7 2009/10/18 16:23:59 tg Exp $
+
+AUTOMAKE_OPTIONS = foreign
+
+EXTRA_DIST = COPYING INFO LIST NEWS README README.cvs TODO docs/help-system.html \
+       joerc.in jmacsrc.in jstarrc.in rjoerc.in jpicorc.in jupprc \
+       joe.1.in dir.c syntax/c.jsf.in syntax/perl.jsf.in syntax/verilog.jsf.in \
+       syntax/conf.jsf.in syntax/python.jsf.in syntax/php.jsf.in syntax/sh.jsf.in \
+       syntax/pascal.jsf.in syntax/html.jsf.in syntax/vhdl.jsf.in syntax/fortran.jsf.in \
+       syntax/java.jsf.in syntax/xml.jsf.in syntax/tcl.jsf.in charmaps/klingon.in docs HINTS \
+       syntax/lisp.jsf.in syntax/csh.jsf.in syntax/mail.jsf.in syntax/mason.jsf.in \
+       syntax/diff.jsf.in syntax/asm.jsf.in
+
+JOE_ALIASES = jmacs jpico jstar jupp rjoe
+
+sysconfjoesubdir = /joe
+sysconf_joedir = $(sysconfdir)$(sysconfjoesubdir)
+sysconf_joe_DATA = joerc jmacsrc jstarrc rjoerc jpicorc jupprc
+
+sysconf_syntaxdir = $(sysconf_joedir)/syntax
+sysconf_syntax_DATA = syntax/c.jsf syntax/perl.jsf syntax/verilog.jsf \
+       syntax/conf.jsf syntax/python.jsf syntax/php.jsf syntax/sh.jsf \
+       syntax/mail.jsf syntax/pascal.jsf syntax/html.jsf syntax/vhdl.jsf \
+       syntax/fortran.jsf syntax/java.jsf syntax/xml.jsf syntax/tcl.jsf \
+       syntax/lisp.jsf syntax/csh.jsf syntax/mason.jsf syntax/diff.jsf \
+       syntax/asm.jsf
+
+sysconf_charmapsdir = $(sysconf_joedir)/charmaps
+sysconf_charmaps_DATA = charmaps/klingon
+
+man_MANS = joe.1
+noinst_HEADERS = b.h blocks.h bw.h cmd.h config.h hash.h help.h kbd.h \
+       macro.h main.h menu.h path.h poshist.h pw.h queue.h qw.h rc.h regex.h \
+       scrn.h tab.h termcap.h tty.h tw.h types.h ublock.h uedit.h uerror.h \
+       ufile.h uformat.h uisrch.h umath.h undo.h usearch.h ushell.h utag.h \
+       utils.h va.h vfile.h vs.h w.h utf8.h syntax.h i18n.h charmap.h builtin.h
+
+
+bin_PROGRAMS = joe
+if WANT_TERMIDX
+bin_PROGRAMS += termidx
+endif
+
+INCLUDES = -DJOERC="\"$(sysconf_joedir)/\""
+
+# joe_LDADD = @REQRD_LIBS@
+
+joe_SOURCES = b.c blocks.c bw.c cmd.c hash.c help.c kbd.c macro.c main.c menu.c \
+       path.c poshist.c pw.c queue.c qw.c rc.c regex.c scrn.c tab.c termcap.c \
+       tty.c tw.c ublock.c uedit.c uerror.c ufile.c uformat.c uisrch.c umath.c \
+       undo.c usearch.c ushell.c utag.c va.c vfile.c vs.c w.c utils.c syntax.c \
+       utf8.c selinux.c i18n.c charmap.c strlfun.c builtin.c builtins.c
+
+termidx_SOURCES = termidx.c
+
+install-exec-hook:
+       cd $(DESTDIR)$(bindir) && for i in $(JOE_ALIASES); do \
+               rm -f $$i; \
+               $(LN_S) joe $$i; \
+       done
+
+install-man: install-man1-symlinks
+install-man1-symlinks: install-man1
+       cd $(DESTDIR)$(man1dir) && for i in $(JOE_ALIASES); do \
+               rm -f $$i.1; \
+               $(LN_S) joe.1 $$i.1; \
+       done
+
+uninstall-local:
+       for i in $(JOE_ALIASES); do \
+               rm -f $(DESTDIR)$(bindir)/$$i $(DESTDIR)$(man1dir)/$$i.1; \
+       done
+
+distclean-local:
+       rm -f *~
+       rm -f stamp-h.in charmaps/klingon syntax/asm.jsf syntax/c.jsf syntax/conf.jsf syntax/csh.jsf syntax/diff.jsf syntax/fortran.jsf syntax/html.jsf syntax/java.jsf syntax/lisp.jsf syntax/mail.jsf syntax/mason.jsf syntax/pascal.jsf syntax/perl.jsf syntax/php.jsf syntax/python.jsf syntax/sh.jsf syntax/tcl.jsf syntax/verilog.jsf syntax/vhdl.jsf syntax/xml.jsf
+
+.PHONY: termcap
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..2686b93
--- /dev/null
@@ -0,0 +1,902 @@
+# Makefile.in generated by automake 1.9.6-MirPorts-5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# $MirOS: contrib/code/jupp/Makefile.in,v 1.10 2010/04/08 15:46:35 tg Exp $
+# $miros: contrib/code/jupp/Makefile.am,v 1.7 2009/10/18 16:23:59 tg Exp $
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(SHELL) $(install_sh) -c -m 644
+install_sh_PROGRAM = $(SHELL) $(install_sh) -c
+install_sh_SCRIPT = $(SHELL) $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+bin_PROGRAMS = joe$(EXEEXT) $(am__EXEEXT_1)
+@WANT_TERMIDX_TRUE@am__append_1 = termidx
+DIST_COMMON = README $(am__configure_deps) $(noinst_HEADERS) \
+       $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+       $(srcdir)/autoconf.h.in $(srcdir)/jmacsrc.in \
+       $(srcdir)/joe.1.in $(srcdir)/joerc.in $(srcdir)/jpicorc.in \
+       $(srcdir)/jstarrc.in $(srcdir)/rjoerc.in \
+       $(top_srcdir)/charmaps/klingon.in $(top_srcdir)/configure \
+       $(top_srcdir)/syntax/asm.jsf.in $(top_srcdir)/syntax/c.jsf.in \
+       $(top_srcdir)/syntax/conf.jsf.in \
+       $(top_srcdir)/syntax/csh.jsf.in \
+       $(top_srcdir)/syntax/diff.jsf.in \
+       $(top_srcdir)/syntax/fortran.jsf.in \
+       $(top_srcdir)/syntax/html.jsf.in \
+       $(top_srcdir)/syntax/java.jsf.in \
+       $(top_srcdir)/syntax/lisp.jsf.in \
+       $(top_srcdir)/syntax/mail.jsf.in \
+       $(top_srcdir)/syntax/mason.jsf.in \
+       $(top_srcdir)/syntax/pascal.jsf.in \
+       $(top_srcdir)/syntax/perl.jsf.in \
+       $(top_srcdir)/syntax/php.jsf.in \
+       $(top_srcdir)/syntax/python.jsf.in \
+       $(top_srcdir)/syntax/sh.jsf.in $(top_srcdir)/syntax/tcl.jsf.in \
+       $(top_srcdir)/syntax/verilog.jsf.in \
+       $(top_srcdir)/syntax/vhdl.jsf.in \
+       $(top_srcdir)/syntax/xml.jsf.in COPYING ChangeLog NEWS TODO \
+       config.guess config.sub depcomp install-sh missing \
+       mkinstalldirs
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = autoconf.h
+CONFIG_CLEAN_FILES = joe.1 joerc jmacsrc jstarrc rjoerc jpicorc \
+       syntax/c.jsf syntax/perl.jsf syntax/verilog.jsf syntax/sh.jsf \
+       syntax/python.jsf syntax/conf.jsf syntax/php.jsf \
+       syntax/mail.jsf syntax/pascal.jsf syntax/html.jsf \
+       syntax/vhdl.jsf syntax/fortran.jsf syntax/java.jsf \
+       syntax/xml.jsf syntax/tcl.jsf charmaps/klingon syntax/lisp.jsf \
+       syntax/csh.jsf syntax/mason.jsf syntax/diff.jsf syntax/asm.jsf
+@WANT_TERMIDX_TRUE@am__EXEEXT_1 = termidx$(EXEEXT)
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \
+       "$(DESTDIR)$(sysconf_charmapsdir)" \
+       "$(DESTDIR)$(sysconf_joedir)" "$(DESTDIR)$(sysconf_syntaxdir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_joe_OBJECTS = b.$(OBJEXT) blocks.$(OBJEXT) bw.$(OBJEXT) \
+       cmd.$(OBJEXT) hash.$(OBJEXT) help.$(OBJEXT) kbd.$(OBJEXT) \
+       macro.$(OBJEXT) main.$(OBJEXT) menu.$(OBJEXT) path.$(OBJEXT) \
+       poshist.$(OBJEXT) pw.$(OBJEXT) queue.$(OBJEXT) qw.$(OBJEXT) \
+       rc.$(OBJEXT) regex.$(OBJEXT) scrn.$(OBJEXT) tab.$(OBJEXT) \
+       termcap.$(OBJEXT) tty.$(OBJEXT) tw.$(OBJEXT) ublock.$(OBJEXT) \
+       uedit.$(OBJEXT) uerror.$(OBJEXT) ufile.$(OBJEXT) \
+       uformat.$(OBJEXT) uisrch.$(OBJEXT) umath.$(OBJEXT) \
+       undo.$(OBJEXT) usearch.$(OBJEXT) ushell.$(OBJEXT) \
+       utag.$(OBJEXT) va.$(OBJEXT) vfile.$(OBJEXT) vs.$(OBJEXT) \
+       w.$(OBJEXT) utils.$(OBJEXT) syntax.$(OBJEXT) utf8.$(OBJEXT) \
+       selinux.$(OBJEXT) i18n.$(OBJEXT) charmap.$(OBJEXT) \
+       strlfun.$(OBJEXT) builtin.$(OBJEXT) builtins.$(OBJEXT)
+joe_OBJECTS = $(am_joe_OBJECTS)
+joe_LDADD = $(LDADD)
+am_termidx_OBJECTS = termidx.$(OBJEXT)
+termidx_OBJECTS = $(am_termidx_OBJECTS)
+termidx_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(joe_SOURCES) $(termidx_SOURCES)
+DIST_SOURCES = $(joe_SOURCES) $(termidx_SOURCES)
+man1dir = $(mandir)/man1
+INSTALL_MAN_AM = install-man
+NROFF = nroff
+MANS = $(man_MANS)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+sysconf_charmapsDATA_INSTALL = $(INSTALL_DATA)
+sysconf_joeDATA_INSTALL = $(INSTALL_DATA)
+sysconf_syntaxDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(sysconf_charmaps_DATA) $(sysconf_joe_DATA) \
+       $(sysconf_syntax_DATA)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d $(distdir) \
+    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SPELL = @SPELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WANT_TERMIDX_FALSE = @WANT_TERMIDX_FALSE@
+WANT_TERMIDX_TRUE = @WANT_TERMIDX_TRUE@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+AUTOMAKE_OPTIONS = foreign
+EXTRA_DIST = COPYING INFO LIST NEWS README README.cvs TODO docs/help-system.html \
+       joerc.in jmacsrc.in jstarrc.in rjoerc.in jpicorc.in jupprc \
+       joe.1.in dir.c syntax/c.jsf.in syntax/perl.jsf.in syntax/verilog.jsf.in \
+       syntax/conf.jsf.in syntax/python.jsf.in syntax/php.jsf.in syntax/sh.jsf.in \
+       syntax/pascal.jsf.in syntax/html.jsf.in syntax/vhdl.jsf.in syntax/fortran.jsf.in \
+       syntax/java.jsf.in syntax/xml.jsf.in syntax/tcl.jsf.in charmaps/klingon.in docs HINTS \
+       syntax/lisp.jsf.in syntax/csh.jsf.in syntax/mail.jsf.in syntax/mason.jsf.in \
+       syntax/diff.jsf.in syntax/asm.jsf.in
+
+JOE_ALIASES = jmacs jpico jstar jupp rjoe
+sysconfjoesubdir = /joe
+sysconf_joedir = $(sysconfdir)$(sysconfjoesubdir)
+sysconf_joe_DATA = joerc jmacsrc jstarrc rjoerc jpicorc jupprc
+sysconf_syntaxdir = $(sysconf_joedir)/syntax
+sysconf_syntax_DATA = syntax/c.jsf syntax/perl.jsf syntax/verilog.jsf \
+       syntax/conf.jsf syntax/python.jsf syntax/php.jsf syntax/sh.jsf \
+       syntax/mail.jsf syntax/pascal.jsf syntax/html.jsf syntax/vhdl.jsf \
+       syntax/fortran.jsf syntax/java.jsf syntax/xml.jsf syntax/tcl.jsf \
+       syntax/lisp.jsf syntax/csh.jsf syntax/mason.jsf syntax/diff.jsf \
+       syntax/asm.jsf
+
+sysconf_charmapsdir = $(sysconf_joedir)/charmaps
+sysconf_charmaps_DATA = charmaps/klingon
+man_MANS = joe.1
+noinst_HEADERS = b.h blocks.h bw.h cmd.h config.h hash.h help.h kbd.h \
+       macro.h main.h menu.h path.h poshist.h pw.h queue.h qw.h rc.h regex.h \
+       scrn.h tab.h termcap.h tty.h tw.h types.h ublock.h uedit.h uerror.h \
+       ufile.h uformat.h uisrch.h umath.h undo.h usearch.h ushell.h utag.h \
+       utils.h va.h vfile.h vs.h w.h utf8.h syntax.h i18n.h charmap.h builtin.h
+
+INCLUDES = -DJOERC="\"$(sysconf_joedir)/\""
+
+# joe_LDADD = @REQRD_LIBS@
+joe_SOURCES = b.c blocks.c bw.c cmd.c hash.c help.c kbd.c macro.c main.c menu.c \
+       path.c poshist.c pw.c queue.c qw.c rc.c regex.c scrn.c tab.c termcap.c \
+       tty.c tw.c ublock.c uedit.c uerror.c ufile.c uformat.c uisrch.c umath.c \
+       undo.c usearch.c ushell.c utag.c va.c vfile.c vs.c w.c utils.c syntax.c \
+       utf8.c selinux.c i18n.c charmap.c strlfun.c builtin.c builtins.c
+
+termidx_SOURCES = termidx.c
+all: autoconf.h
+       $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+am--refresh:
+       @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+             cd $(srcdir) && $(AUTOMAKE) --foreign  \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --foreign  Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           echo ' $(SHELL) ./config.status'; \
+           $(SHELL) ./config.status;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+autoconf.h: stamp-h1
+       @if test ! -f $@; then \
+         rm -f stamp-h1; \
+         $(MAKE) stamp-h1; \
+       else :; fi
+
+stamp-h1: $(srcdir)/autoconf.h.in $(top_builddir)/config.status
+       @rm -f stamp-h1
+       cd $(top_builddir) && $(SHELL) ./config.status autoconf.h
+$(srcdir)/autoconf.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
+       cd $(top_srcdir) && $(AUTOHEADER)
+       rm -f stamp-h1
+       touch $@
+
+distclean-hdr:
+       -rm -f autoconf.h stamp-h1
+joe.1: $(top_builddir)/config.status $(srcdir)/joe.1.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+joerc: $(top_builddir)/config.status $(srcdir)/joerc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+jmacsrc: $(top_builddir)/config.status $(srcdir)/jmacsrc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+jstarrc: $(top_builddir)/config.status $(srcdir)/jstarrc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+rjoerc: $(top_builddir)/config.status $(srcdir)/rjoerc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+jpicorc: $(top_builddir)/config.status $(srcdir)/jpicorc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/c.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/c.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/perl.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/perl.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/verilog.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/verilog.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/sh.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/sh.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/python.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/python.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/conf.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/conf.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/php.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/php.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/mail.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/mail.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/pascal.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/pascal.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/html.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/html.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/vhdl.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/vhdl.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/fortran.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/fortran.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/java.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/java.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/xml.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/xml.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/tcl.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/tcl.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+charmaps/klingon: $(top_builddir)/config.status $(top_srcdir)/charmaps/klingon.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/lisp.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/lisp.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/csh.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/csh.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/mason.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/mason.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/diff.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/diff.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+syntax/asm.jsf: $(top_builddir)/config.status $(top_srcdir)/syntax/asm.jsf.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+install-binPROGRAMS:
+       @$(NORMAL_INSTALL)
+       test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+         if test -f $$p \
+         ; then \
+           f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+          echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+          $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+         else :; fi; \
+       done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+         echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+         rm -f "$(DESTDIR)$(bindir)/$$f"; \
+       done
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+joe$(EXEEXT): $(joe_OBJECTS) $(joe_DEPENDENCIES) 
+       @rm -f joe$(EXEEXT)
+       $(LINK) $(joe_LDFLAGS) $(joe_OBJECTS) $(joe_LDADD) $(LIBS)
+termidx$(EXEEXT): $(termidx_OBJECTS) $(termidx_DEPENDENCIES) 
+       @rm -f termidx$(EXEEXT)
+       $(LINK) $(termidx_LDFLAGS) $(termidx_OBJECTS) $(termidx_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/b.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blocks.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/builtin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/builtins.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bw.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/charmap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/help.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/i18n.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kbd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/macro.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/menu.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/path.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poshist.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pw.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queue.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qw.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrn.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/selinux.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strlfun.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/syntax.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tab.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/termcap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/termidx.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tty.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tw.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ublock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uedit.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uerror.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ufile.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uformat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uisrch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/umath.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/undo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usearch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ushell.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utag.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf8.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/va.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vfile.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/w.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+install-man1:
+       @$(NORMAL_INSTALL)
+       test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+       @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+       l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+       for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+         else file=$$i; fi; \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         case "$$ext" in \
+           1*) ;; \
+           *) ext='1' ;; \
+         esac; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed -e 's/^.*\///'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+         $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+       done
+uninstall-man1:
+       @$(NORMAL_UNINSTALL)
+       @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+       l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+       for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         case "$$ext" in \
+           1*) ;; \
+           *) ext='1' ;; \
+         esac; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed -e 's/^.*\///'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+         rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+       done
+install-sysconf_charmapsDATA:
+       @$(NORMAL_INSTALL)
+       test -z "$(sysconf_charmapsdir)" || $(mkdir_p) "$(DESTDIR)$(sysconf_charmapsdir)"
+       @list='$(sysconf_charmaps_DATA)'; for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         f=$(am__strip_dir) \
+         echo " $(sysconf_charmapsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(sysconf_charmapsdir)/$$f'"; \
+         $(sysconf_charmapsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(sysconf_charmapsdir)/$$f"; \
+       done
+
+uninstall-sysconf_charmapsDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(sysconf_charmaps_DATA)'; for p in $$list; do \
+         f=$(am__strip_dir) \
+         echo " rm -f '$(DESTDIR)$(sysconf_charmapsdir)/$$f'"; \
+         rm -f "$(DESTDIR)$(sysconf_charmapsdir)/$$f"; \
+       done
+install-sysconf_joeDATA:
+       @$(NORMAL_INSTALL)
+       test -z "$(sysconf_joedir)" || $(mkdir_p) "$(DESTDIR)$(sysconf_joedir)"
+       @list='$(sysconf_joe_DATA)'; for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         f=$(am__strip_dir) \
+         echo " $(sysconf_joeDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(sysconf_joedir)/$$f'"; \
+         $(sysconf_joeDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(sysconf_joedir)/$$f"; \
+       done
+
+uninstall-sysconf_joeDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(sysconf_joe_DATA)'; for p in $$list; do \
+         f=$(am__strip_dir) \
+         echo " rm -f '$(DESTDIR)$(sysconf_joedir)/$$f'"; \
+         rm -f "$(DESTDIR)$(sysconf_joedir)/$$f"; \
+       done
+install-sysconf_syntaxDATA:
+       @$(NORMAL_INSTALL)
+       test -z "$(sysconf_syntaxdir)" || $(mkdir_p) "$(DESTDIR)$(sysconf_syntaxdir)"
+       @list='$(sysconf_syntax_DATA)'; for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         f=$(am__strip_dir) \
+         echo " $(sysconf_syntaxDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(sysconf_syntaxdir)/$$f'"; \
+         $(sysconf_syntaxDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(sysconf_syntaxdir)/$$f"; \
+       done
+
+uninstall-sysconf_syntaxDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(sysconf_syntax_DATA)'; for p in $$list; do \
+         f=$(am__strip_dir) \
+         echo " rm -f '$(DESTDIR)$(sysconf_syntaxdir)/$$f'"; \
+         rm -f "$(DESTDIR)$(sysconf_syntaxdir)/$$f"; \
+       done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES) autoconf.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS) autoconf.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES) autoconf.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS) autoconf.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       $(am__remove_distdir)
+       mkdir $(distdir)
+       $(mkdir_p) $(distdir)/. $(distdir)/charmaps $(distdir)/docs $(distdir)/syntax
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+       -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+         ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+       || chmod -R a+r $(distdir)
+dist-gzip: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__remove_distdir)
+
+dist-bzip2: distdir
+       tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+       $(am__remove_distdir)
+
+dist-tarZ: distdir
+       tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+       $(am__remove_distdir)
+
+dist-shar: distdir
+       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       $(am__remove_distdir)
+
+dist-zip: distdir
+       -rm -f $(distdir).zip
+       zip -rq $(distdir).zip $(distdir)
+       $(am__remove_distdir)
+
+dist dist-all: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       case '$(DIST_ARCHIVES)' in \
+       *.tar.gz*) \
+         GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+       *.tar.bz2*) \
+         bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+       *.tar.Z*) \
+         uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+       *.shar.gz*) \
+         GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+       *.zip*) \
+         unzip $(distdir).zip ;;\
+       esac
+       chmod -R a-w $(distdir); chmod a+w $(distdir)
+       mkdir $(distdir)/_build
+       mkdir $(distdir)/_inst
+       chmod a-w $(distdir)
+       dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+         && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+         && cd $(distdir)/_build \
+         && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+           $(DISTCHECK_CONFIGURE_FLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+         && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+               distuninstallcheck \
+         && chmod -R a-w "$$dc_install_base" \
+         && ({ \
+              (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+                   distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+             } || { rm -rf "$$dc_destdir"; exit 1; }) \
+         && rm -rf "$$dc_destdir" \
+         && $(MAKE) $(AM_MAKEFLAGS) dist \
+         && rm -rf $(DIST_ARCHIVES) \
+         && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+       $(am__remove_distdir)
+       @(echo "$(distdir) archives ready for distribution: "; \
+         list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+         sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+       @cd $(distuninstallcheck_dir) \
+       && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+          || { echo "ERROR: files left after uninstall:" ; \
+               if test -n "$(DESTDIR)"; then \
+                 echo "  (check DESTDIR support)"; \
+               fi ; \
+               $(distuninstallcheck_listfiles) ; \
+               exit 1; } >&2
+distcleancheck: distclean
+       @if test '$(srcdir)' = . ; then \
+         echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+         exit 1 ; \
+       fi
+       @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+         || { echo "ERROR: files left in build directory after distclean:" ; \
+              $(distcleancheck_listfiles) ; \
+              exit 1; } >&2
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) autoconf.h
+installdirs:
+       for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(sysconf_charmapsdir)" "$(DESTDIR)$(sysconf_joedir)" "$(DESTDIR)$(sysconf_syntaxdir)"; do \
+         test -z "$$dir" || $(mkdir_p) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am:
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-hdr distclean-local distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: $(INSTALL_MAN_AM) install-sysconf_charmapsDATA \
+       install-sysconf_joeDATA install-sysconf_syntaxDATA
+
+install-exec-am: install-binPROGRAMS
+       @$(NORMAL_INSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) install-exec-hook
+
+install-info: install-info-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf $(top_srcdir)/autom4te.cache
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-local \
+       uninstall-man uninstall-sysconf_charmapsDATA \
+       uninstall-sysconf_joeDATA uninstall-sysconf_syntaxDATA
+
+uninstall-man: uninstall-man1
+
+.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
+       clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \
+       dist-gzip dist-shar dist-tarZ dist-zip distcheck distclean \
+       distclean-compile distclean-generic distclean-hdr \
+       distclean-local distclean-tags distcleancheck distdir \
+       distuninstallcheck dvi dvi-am html html-am info info-am \
+       install install-am install-binPROGRAMS install-data \
+       install-data-am install-exec install-exec-am install-exec-hook \
+       install-info install-info-am install-man install-man1 \
+       install-strip install-sysconf_charmapsDATA \
+       install-sysconf_joeDATA install-sysconf_syntaxDATA \
+       installcheck installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-binPROGRAMS uninstall-info-am \
+       uninstall-local uninstall-man uninstall-man1 \
+       uninstall-sysconf_charmapsDATA uninstall-sysconf_joeDATA \
+       uninstall-sysconf_syntaxDATA
+
+
+install-exec-hook:
+       cd $(DESTDIR)$(bindir) && for i in $(JOE_ALIASES); do \
+               rm -f $$i; \
+               $(LN_S) joe $$i; \
+       done
+
+install-man: install-man1-symlinks
+install-man1-symlinks: install-man1
+       cd $(DESTDIR)$(man1dir) && for i in $(JOE_ALIASES); do \
+               rm -f $$i.1; \
+               $(LN_S) joe.1 $$i.1; \
+       done
+
+uninstall-local:
+       for i in $(JOE_ALIASES); do \
+               rm -f $(DESTDIR)$(bindir)/$$i $(DESTDIR)$(man1dir)/$$i.1; \
+       done
+
+distclean-local:
+       rm -f *~
+       rm -f stamp-h.in charmaps/klingon syntax/asm.jsf syntax/c.jsf syntax/conf.jsf syntax/csh.jsf syntax/diff.jsf syntax/fortran.jsf syntax/html.jsf syntax/java.jsf syntax/lisp.jsf syntax/mail.jsf syntax/mason.jsf syntax/pascal.jsf syntax/perl.jsf syntax/php.jsf syntax/python.jsf syntax/sh.jsf syntax/tcl.jsf syntax/verilog.jsf syntax/vhdl.jsf syntax/xml.jsf
+
+.PHONY: termcap
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..5a8df71
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,434 @@
+$MirOS: contrib/code/jupp/NEWS,v 1.37 2011/07/27 18:43:11 tg Exp $
+------------------------------------------------------------------
+
+JOE 3.1jupp17
+
+- Skip restoring the terminal after exiting jupp
+- Improve syntax highlighting for shell
+- Fix restoring context after losing sync for diff
+- Improve diff detection
+
+JOE 3.1jupp16
+
+- Better match for Python files for *rc (except jupprc, which had it already)
+- Improve jupprc file; split between three versions (2.8/DOS 3.7/*nix 3.1jupp)
+- The jupprc file now has a character map (ASCII / 8-bit table)
+- Clean up some compiler warnings; check for strlcpy/strlcat prototypes
+
+JOE 3.1jupp15
+
+- Update COPYING file from MirOS master (refreshed from FSF master)
+- Refresh wcwidth code from Unicode 6.0.0
+  XXX maybe use MirBSD libc code for {to,is}wc* too, extended beyond BMP
+- Better error messages when parsing syntax and rc files
+- Ignore syntax keywords from joe-3.7 diff.jsf that are not yet implemented
+- Update strlfun.c with an even more portable variant from MirBSD/kern
+- Port to Minix 3 by request of Alby <alb348@gmail.com>
+- Display help hint in initial status line (unless -nonotice)
+
+JOE 3.1jupp14
+
+- Update diff syntax file from joe-current
+- New option (L)ast in search-and-replace
+- Backport some bugfixes from joe-current
+- Let execmd cmd accept macros, not just commands
+- Let macros cmd escape backslash correctly
+- Flag --disable-getpwnam to link statically with eglibc
+- Compiler warning cleanup
+
+JOE 3.1jupp12
+
+- Fix compiler warnings
+- Fix the manpage wrt. UTF-8 hyphen/dash/minus
+- Add missing headers on some platforms
+- Add support for Debian libbsd
+- Add way to disable warnings wrt. Anil Madhavapeddy's bounds checker
+- Unbreak SELinux support
+- Fix `x## for 80‥FF in !UTF-8 mode
+- Use the inverse/underlined U+FFFD for some more occurences of
+  undisplayable (control) characters and incomplete multibyte
+  sequences; fix displaying these at end of line
+- Ensure C0/C1 control characters are never sent to a UTF-8
+  terminal, even from !UTF-8 documents
+- Add built-in (minimal) jupprc file, for standalone EXEs
+- Backport hex editing mode; improve it, use uppercase
+- Implement `r## in UTF-8 mode (same as `x## in !UTF-8 mode)
+  and `u (interactive) in !UTF-8 mode (same as `x in UTF-8 mode)
+- Add new Makefile variable sysconfjoesubdir=/joe (to override
+  the /joe in /etc/joe/jupprc for example)
+- Update config.guess and config.sub
+- Provide a real ANSI (cp1252) codepage
+- Fix build on AIX with xlC, Solaris with SUNWcc
+
+JOE 3.1jupp11
+
+- Split into two separate lines of *active* development:
+  * JUPP for DOS (joe 2.8 plus some jupp patches and jupprc)
+  * JUPP for Unix (joe 3.1 with all jupp patches and a diverging,
+    more featureful jupprc than joe 3.1jupp10 had)
+- Use some joe 3.x features in jupprc: assume_color, guess_crlf,
+  guess_indent, purify, smartbacks; some are disabled by default
+  though (autoindent, smarthome, smarthome+indentfirst)
+- Enable syntax highlighting by default in jupprc, by popular
+  demand, even if I still loathe it personally, like Rob Pike
+- Add language/syntax selection into jupprc, with Python settings
+  adhering to the most common coding standards
+- The termidx binary can now be disabled by a configure option
+- Manual page symbolic links are installed alongside the manpages
+
+JOE 3.1jupp10
+
+- Build fixes for Darwin
+- Fix: smartbacks could not be used without autoindent
+
+JOE 3.1jupp9
+
+- Build fixes for AIX, gcc (thanks Adam "replaced" Hoka), any OEs
+  without mksh installed
+- Synchronise external files with upstream, licence cleanup
+- Remove CR (DOS line endings) on ^K] as well in jupprc
+
+JOE 3.1jupp8
+
+- Bugfix (maybe) for backspace deleting more than it should
+  when smart backspaces or auto-indent are off
+- In UTF-8 mode, display illegal characters as reversed (inverse)
+  underlined U+FFFD REPLACEMENT CHARACTER, one per octet (if these
+  form a valid part of an invalid multibyte sequence, the first
+  valid octets are not necessarily individually selectable)
+- In UTF-8 mode, don't display the decimal ASCII value of a wide
+  character; display the correct UCS-2 hex value (or <-2> for an
+  invalid sequence or the 8-bit hex value of the octet for an
+  invalid octet or invalid one-octet multibyte sequence) instead
+- Upgrade to latest MirOS licence template
+
+JOE 3.1jupp7
+
+- Bugfix in bundled strlcat() implementation
+- Bugfix (off-by-one array bounds) in from_uni()
+- New option "vispace" to make spaces and tabs visible, like in
+  Microsoft® Works®. Works best with Unicode.
+- "noxon" and "baud" are now menu entries; these two and
+  "keepup" have been moved to the top so they can be switched
+  quickly if you're in an ssh situation
+- Disable funny behaviour of keys in menus, fixes POLS
+- Reduce memory usage a little
+- In the options menu, if "return" is hit instead of entering a value,
+  and it is not a string, it's handled sensitively: numbers keep their
+  value, syntax gets unset, and encoding gets reset to the fdefault map.
+- Nicely format the options menu (as columns); print values for the
+  syntax and encoding options as well in the oversight, use ellipsis for
+  strings which aren't displayed otherwise
+- Spelling fixes in the options menu
+- Honour internationalisation framework of MirOS #9-current and newer
+
+JOE 3.1jupp6
+
+- No code changes, only documentation and upstream sync
+
+JOE 3.1jupp4
+
+- Keyboard fixes in "jupprc"
+
+- Add "ESC q" as alias for "^Q" in "jupprc"
+
+- Update some files from upstream
+
+JOE 3.1jupp3
+
+- Fixed using new GNU Autotools
+
+- Updated "jupprc"
+
+JOE 3.1jupp2
+
+- Fixed string functions
+
+- Added "jupp" flavour
+
+- No tab completion in search and replace ask windows
+
+- UTF-8 works on LOCALE-less OSses (various BSDs)
+
+JOE 3.1
+
+- Regex and incremental search (jmacs ^S) now work for UTF-8
+
+- More and improved syntax highlighting files, including Mason
+
+- Use ^T E to set character set of file (hit <tab> <tab> at the
+  prompt for a list of available character sets).
+
+- Can install custom "i18n" style byte oriented character set
+  definition files.
+
+- No longer depends on iconv() (easier to compile)
+
+- Fix bug where right arrow was not doing right thing on last line
+
+- Fix UTF-8 codes between 0x10000 - 0x1FFFF
+
+- Now prints <XXXX> for unicode control characters
+
+- Improved smart home, indent, etc.
+
+- TAB completion is now more "bash"-like
+
+- When multiple files are given on command line, they end up in
+  same order on the screen in JOE (before they were shuffled).
+
+- Menu size is now variable (40% of window size or smaller if
+  it's not filled).
+
+- Added -icase option for case insensitive search by default.
+
+- Added -wrap option, which makes searches wrap
+
+- Added status line sequence %x: shows current context (function
+  name if you're editing C).
+
+- Added tab completion at search prompts and ESC-Enter for tab
+  completion within text windows.
+
+- Warn if file changed on save.
+
+- Added Ctrl-space block selection method
+
+- Added Ctrl-arrow key block selection method
+
+- ^K E asks if you want to load original version of the file
+
+- jmacs bugs fixes: upperase word, transpose words, ^X ^C is
+  more emacs-like., ^X k and ^X ^V more like emacs.
+
+- Much improved compile system ^[ c
+
+- Much improved jpico
+
+- aspell support.
+
+JOE 3.0 (23 APR 2004)
+- UTF-8
+- Syntax highlighting
+- Fixed ^C and ^D in shell windows
+- Auto detect CR-LF (MS-DOS) files
+- Fixed (or improved, anyway) shell windows for Cygwin
+- During search & replace, the scroll found text on to screen
+- File selection window is now 4 lines instead of 1
+- David Phillips "smart home" key.
+- Enhanced ^K , and ^K .
+- Enhanced overtype mode
+- Added picture drawing mode (can hit right arrow at ends of lines)
+- Auto detect preferred indentation character TAB or SPACE
+
+Overview of changes in JOE 2.9.8 (5 May 2003)
+- fixed signal handling
+- return of the context help
+- fixed segfault when moving rectangular block
+- code clean up
+- killed deadlock when reformatting paragraph
+- fixed skiptop handling
+- SECURITY: drop suid and sgid bits when creating backup files
+- fixed segfaults in isalpha()-like functions
+
+Overview of changes in JOE 2.9.8-pre1 (14 Dec 2001)
+- BUGFIX: don't exchange start and end point of the block in some cases
+- defaulting to turn off -asis (locales take care of this; if joe doesn't
+  print characters with 8th bit set properly, check if you have properly
+  installed and set locales or simply turn on -asis option in joerc)
+- fix to make joe compilable on *BSD
+- fix to make joe compilable on systems without siginterrupt()
+- added "support" for End key
+- code cleanup: warnings removal (some still remaining, working on it)
+
+Overview of changes in JOE 2.9.7 (7 Nov 2001)
+- BUGFIX: always save (even not-modified) file
+- BUGFIX: solve problem with freezing after saving unmodified file
+- small documentation update
+
+Overview of Changes in JOE 2.9.7-pre3 (29 Oct 2001)
+- BUGFIX: wordwrap bug fixed (again and I'm sure forever)
+- BUGFIX: don't change window when setting mark in multiwindow mode
+- BUGFIX: use automake-1.5 to make joe compile on irix-6.5 with non-GNU make
+- continuing code clean up: this code adds strict prototypes which raises
+  a lot of warnings (they seem harmless) - we're working on their removal
+
+Overview of Changes in JOE 2.9.7-pre2 (10 Oct 2001)
+- use automake and autoconf for configuration system (for now versions
+  automake-1.4-p4 and autoconf-2.52)
+- a lot of warnings of compiler were removed
+- SECURITY:: use mkstemp() for temporary files if available
+- code clean up
+
+Overview of Changes in JOE 2.9.7pre1 (19 Jul 2001)
+- help system was slightly modified
+- a lot of warnings of compiler were removed
+- BUGFIX:: problem with freezing when save was solved (at least partially)
+- BUGFIX:: undo after save of file (again same patch)
+- FEATURE:: suffix of backup copy from SIMPLE_BACKUP_SUFFIX environment
+  variable
+
+Overview of Changes in JOE 2.9.7pre0 (02 Jul 2001)
+- major BUGFIX:: wordwrap problem
+- BUGFIX:: indentation
+??* JOE can be compiled on Windows platform again
+??* BUGFIX:: problem with ${sysconfdir}/joerc was solved
+
+Overview of Changes in JOE 2.9.6 (13 Apr 2001)
+
+- BUGFIX:: resizing window
+- JOE can be compiled on Windows platform again
+* BUGFIX:: problem with ${sysconfdir}/joerc was solved
+- BUGFIX:: security patch for sprintf
+- BUGFIX:: partially solved problem on Solaris with SegFault
+- BUGFIX:: patch joe-2.8-security (slightly changed)
+- BUGFIX:: patch joe-2.8-port
+- BUGFIX:: patch joe-2.8-mips
+- BUGFIX:: patch joe-2.8-vsmk
+- BUGFIX:: patch joe2.8-time
+- *rc files where moved from $(prefix)/lib to $(prefix)/etc or $sysconfdir
+- Makefile.in (and Makefile) was rewritten
+   - special prefix for package (more in Makefile.in)
+   - use of system independent 'mkinstalldirs'
+   - rc files are not rewritten
+- TEST FEATURE:: added autoconf support
+               program can be installed by ./configure; make; make install
+- BUGFIX (v2.9.4):: go to previous word problem solved
+- JOE can be compiled without locale.h again
+- BUGFIX:: patch joe2.8-axphack.patch
+- BUGFIX:: patch joe2.8-resize2.patch
+- BUGFIX:: fixed problem with :include in rc files
+- BUGFIX (v2.9.5):: portability problem with is_blank on nonGNU systems
+
+Overview of Changes in JOE 2.9.5 (28 Mar 2001)
+
+- new BUG:: can't be compiled on non-GNU systems (is_blank()) fixed in v2.9.6
+- BUGFIX:: Fixed problem with resizing.
+- SECURITY:: .[joe|rjoe|jpico|..]rc in actual directory is ignored
+             because in this file can be defined which program run.
+
+Overview of Changes in JOE 2.9.4 (27 Mar 2001)
+
+- new BUG:: go to previous word; goes one character before this word
+            fixed in v2.9.6
+- FEATURE:: locale (LC_CTYPE) is accepted when skipping/deleting/... words
+
+Overview of Changes in JOE 2.9  (22 Mar 2001)
+
+- version 2.8 with patches from RedHat/Suse
+
+Overview of Changes in JOE 2.8
+
+- Fixed problem with TERMPATH string
+- Added stupid two-letter names to termcap file
+- Improved jmacs help and command set
+- Improved README file
+
+Overview of Changes in JOE 2.7
+
+- putenv() was not portable
+- utime was not portable
+- special utime handling for NeXT
+- forgot to \\ the \s in the default termcap entry
+- changed some key defaults in jpicorc
+- add IXOFF in termio/termios list
+- left margin limit was incorrect
+- allow '.' and '/' in file names for error parsing
+- Needed ptem.h and stream.h for SCO_UNIX window size structure (?)
+- wordwrap no longer propogates indent prefix
+- paragraph format was broken for tab indented paragraphs
+- pipe through shell now goes through stderr too
+- added '-crlf' option
+- looks for termcap file in JOERC/termcap
+
+Overview of Changes in JOE 2.6
+
+- Fixed stupid bug in termcap.c which prevented terminfo from working
+- ESC h was missing from jpicorc
+- Changes suggested by Dan Nelson:
+   - backup files now attempt to have same permissions and times as original
+   - Stat command now ands chars with 255 (don't know why this worked on my system
+     without this...)
+   - Maybe change shell invocation name- have to check this more
+
+Overview of Changes in JOE 2.5
+
+- No longer use ^[ O, ^[ A, ^[ B, ^[ C, or ^[ D for anything because they
+  interfere with arrow keys.
+- Couldn't create new files because of bug in readonly setting
+- fwrdc/bkwdc were crashing the editor except when called from wordstar
+- 'tr' command was not called in a portable way in jmacs
+- 'tr' was causing problems with the spell-check macros as well
+- filter region was not working: had to add 'query' in ^[ | macro
+- Changed incremental search so that whatever key the command is bound to
+  can be used to repeat the search (used to only be able to use ^S)
+
+Overview of Changes in JOE 2.4
+
+- Closing message was incorrect when exit macros (macros where the last
+  command is abortbuf) were used.
+- SuperPico rc file added
+- Write block now writes the entire file if no block is set
+- Added pico kill function for pico emulation
+  (tried to do this with 'psh,markk,blkdel' where blkdel deletes lines if
+   no block is set, but it didn't group the deletes right in the yank
+   buffer)
+- Filter block would leave the marks set
+- Fixed ^@ in joe mode
+- Fixed help screen glitches in wordstar mode
+- If joe can't make a backup file it now prompts for you to save anyway
+- Eliminated IDLEOUT compile option.  Now is the user gives - on the
+  command line, joe uses /dev/tty.
+- Added %o %O %a %A %X and %R status line messages
+- Starts out in read only mode if loaded file can not be written to
+- If joe can't find the termcap/terminfo entry, it instead uses the default
+- termcap routines are now included even if you use terminfo.  If your
+  terminal can't be found in the terminfo database, it will look in
+  the termcap database too.
+- The JOETERM environment variable can be used to bypass the TERM
+  environment variable setting.
+
+Overview of Changes in JOE 2.3
+
+- Search & Replace bugs fixed
+   - replace would mess up the end mark of a marked block
+   - a search would trash ^KB if only ^KB was set
+   - regex problem with \*
+- Was using TCSANOW in posix driver.  Should have been using TCSADRAIN
+- Format paragraph now correctly formats quoted news articles
+- Attempted fix for SCO
+- Fix for coherent
+- Fix for old IRIX/SGI
+- Fixed bug where if you used search & replace in a macro, and exiting the
+  search & replace loop with right arrow key, then when you played the macro
+  you got an extra ^[ in the input queue
+- Added file hooks
+- Added function to insert current keyboard macro into current file
+- Added range checks to numeric option settings
+- Restricted joe rc file added
+- Added ':def' feature for rc files
+
+Overview of Changes in JOE 2.2
+
+- First attempt at MS-DOS version of joe
+   - Direct screen write
+   - Modifications for dos file/drive names
+   - Use TEMP variable to figure out where to store temporary file
+   - Smaller virtual memory page size
+   - Backslashes in file name problem
+   - CR before an LF looks like an LF
+- Backward search ignore-case was not working
+- Scalable window height was not working fully
+- Spaces in file-names gave a problem with backup file creation
+- TILDE option is not available in all versions of BSD
+- Allow : as seperate for termcap filename list
+- Next error / Prev. error was not tracking right
+- tabs not displayed right in nxterr/prverr messages
+- Block moves where the cursor was to the right of the block was broken
+
+Overview of Changes in JOE 2.1
+
+- rc file wasn't giving correct error messages for missing options
+- the '-nobackups' options was mispelled: '- nobackups'
+- editor was crashing because of problem in undo
+- update bypass in utype has a problem when wordwrapping and scrolling
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..e1b56c1
--- /dev/null
+++ b/README
@@ -0,0 +1,424 @@
+This is Joe's Own Editor.  See the INFO file if you don't know what this is.
+
+=-=-=-=-=-=-=-=-=-=-=-=
+Installation procedure
+=-=-=-=-=-=-=-=-=-=-=-=
+
+  Joe uses automake and autoconf suites to build itself. Type:
+
+       ./configure
+       make
+
+At this point you can try JOE without fully installing it by typing "./joe".
+However, you need to copy a few files into your home directory first:
+
+       # This is required for JOE to start:
+       cp joerc ~/.joerc
+
+       # The following are needed if you want syntax highlighting to work:
+       mkdir ~/.joe
+       mkdir ~/.joe/syntax
+       cp syntax/*.jsf ~/.joe/syntax
+
+Otherwise you need to do a real install, which generally requires root
+privileges:
+
+       su root
+       make install
+
+This will copy the executables to /usr/local/bin and runtime files to
+/usr/local/etc.  After installation, you can then try it by typing "joe".
+
+=-=-=-=-=-=-=-=-=-=-=-=
+Verify the installation
+=-=-=-=-=-=-=-=-=-=-=-=
+
+A number of features should be tested:
+
+Shell windows:
+--------------
+
+Please test the installation by trying the shell command: ^K '  A shell
+prompt should appear in the window and you should be able to type "ls".  If
+not, two things could be broken:
+
+   JOE could not open a pseudo terminal (pty), which is unfortunately one of
+the two most incompatible parts of the UNIX API.  Take a look at tty.c-
+there are several methods for opening the pty: mess with the "#ifdefs" until
+you find a method which works (and send a bug report for your operating
+system).
+
+   The SHELL environment variable is not set or exported (Cygwin has this
+problem).  Put:
+
+       export SHELL=/bin/bash
+    or  setenv SHELL /bin/bash
+
+   In you .profile or .cshrc file and send mail to the Cygwin mailing list
+so that they fix this problem.
+
+Process groups:
+---------------
+
+Once you have a shell window open, try to suspend JOE: ^K Z.  Then resume
+it: "fg".  The shell window should still be active.  If not, your operating
+system is not handling process groups properly.  Look for the setsid() or
+setprgp() system calls in tty.c (this is the other most incompatible part of
+the UNIX API).  Currently process groups appear to be broken in Cygwin (so
+if you suspend JOE, any shells get killed).
+
+Resize windows:
+---------------
+
+Try resizing the terminal emulator window: JOE should resize itself to
+properly fit.  If this doesn't work, either ttgtsz() (in tty.c) is not
+reading the size properly, or the SIGWINCH signal is not being received
+by JOE (the handler is winchd() in tty.c).
+
+Baud rate:
+----------
+
+JOE cares about the baud rate as reported by "stty":
+
+       38400 or above:         Joe does not issue scrolling commands
+
+       9600 - 19200:           Joe issues scrolling commands, but does
+                               not delay.
+
+       0 - 4800:               Joe defeats output buffering by sleeping
+                               after every chunk of data is sent to the
+                               screen, by the amount of time that the data
+                               should take to get there as determined by
+                               the baud rate.  This allows typeahead to
+                               interrupt the screen update process: If you
+                               hit Page Down 100 times, only the final
+                               contents of the screen get sent to the
+                               terminal, otherwise you have to wait for all
+                               100 pages to get to the screen before you
+                               can do anything.
+
+Sleeping should really be used at 9600 baud, but too many systems use 9600
+as the default speed for terminal emulators.  If you are using a real serial
+link to a real terminal, you may want to adjust these thresholds: search for
+"9600" in tty.c.
+
+Padding:
+--------
+
+Ideally either terminals can keep up with the baud rate or they backpressure
+the computer using hardware flow control (RTS and CTS pins on RS-232
+connector).
+
+If not, there are two options, both bad:
+
+Use XON/XOFF (^S/^Q) flow control: this works, but ^S causes the screen to
+freeze, which freaks out new users, plus ^S is the search key in "jmacs".
+
+Use padding: the termcap database indicates how long each command should
+take.  If padding is enabled, JOE will send enough NUL characters after each
+command to account for this time.  You need set the DOPADDING environment
+variable or use the -dopadding option.
+
+You should just buy a modern terminal :-)
+
+=-=-=-=-=-=-=-=-=-=-=-=-=-
+Common ./configure options
+=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+Here are some common ./configure options:
+
+  To have "make intall" install JOE into your home directory:
+
+       ./configure --prefix=$HOME
+
+       The executables will end up in $HOME/bin and the runtime
+       files will end up in $HOME/etc.  You need to have $HOME/bin in
+       your path for this to work.
+
+
+  For other install options:
+
+       ./configure --help
+
+
+  To force JOE to use /etc/termcap file using its built-in termcap file parser
+  (which is useful if you want to compile JOE so that it doesn't depend on any
+  libraries other than libc):
+
+       ./configure --disable-curses --disable-termcap
+
+  (--disable-termcap prevents JOE from using the termcap emulation functions
+   in the -ltermcap library.  --disable-curses prevents JOE from using the
+   termcap emulation functions in the -lcurses library).
+
+  Otherwise, JOE tries to use the terminfo database via termcap
+  emulation routines: see man tgetent, tgetstr, tgoto, etc.  (JOE has its
+  own implementation of "curses", so curses is not required except to get
+  access to the terminfo database).
+
+  Note that even if you don't have an /etc/termcap file, JOE will run: it
+  will assume that the terminal is "ANSI" (but you need to compile it this
+  way for it to be able to use the builtin ANSI termcap entry).
+
+
+=-=-=
+Usage
+=-=-=
+
+USAGE: joe filename [filename ...]
+
+  Optionally precede each filename with +nnn to start at specified line number.
+
+  Options:
+
+ -mid          Cursor is recentered when scrolling is necessary
+ -marking      Text between ^KB and cursor is highlighted (use with -lightoff)
+ -asis         Characters 128 - 255 shown as-is
+ -force                Force final newline when files are saved
+ -nobackups    If you don't want backup files to be created
+ -lightoff     Turn off highlighting after block copy or move
+ -exask                ^KX always confirms file name
+ -beep         Beep on errors and when cursor goes past extremes
+ -nosta                Disable top-most status line
+ -keepup       %k and %c status line escape sequences updated frequently
+ -pg nnn       No. lines to keep for PgUp/PgDn
+ -csmode       ^KF after a previous search does a ^L instead
+ -backpath path Directory to store backup files
+ -nonotice     Disable copyright notice
+ -noxon                Attempt to turn off ^S/^Q processing
+ -orphan       Put extra files given on command line in orphaned buffers
+               instead of in windows
+ -dopadding    Output pad characters (for when there is no tty handshaking)
+ -lines nnn    Set no. screen lines
+ -baud nnn     Set baud rate for terminal optimizations
+ -columns nnn  Set no. screen columns
+ -help         Start with help on
+ -skiptop nnn  Don't use top nnn lines of the screen
+
+  Options before each file name:
+
+ -wordwrap             Wordwrap
+ -autoindent           Auto indent
+ -overwrite            Overtype mode
+ -lmargin nnn          Left margin
+ -rmargin nnn          Right margin
+ -tab nnn              Tab width
+ -indentc nnn          Indentation character (32 for space, 9 for tab)
+ -istep nnn            Number of indentation columns
+ -french               One space after '.', '?' and '!' for wordwrap
+                       and paragraph reformat instead of two.  Joe
+                       does not change the spacing you give, but
+                       sometimes it must put spacing in itself.  This
+                       selects how much is inserted.
+ -spaces               TAB inserts spaces instead of tabs.
+ -linums               Enable line numbers on each line
+ -rdonly               File is read-only
+ -crlf                 File is uses CR-LF at ends of lines (MS-DOS files)
+
+       These options can also be set in the joerc file.  The NOXON, LINES,
+COLUMNS, DOPADDING and BAUD options can also be set with environment
+variables.
+
+       The JOETERM environment variable can be set to override the TERM
+environment variable.
+
+** IMPORTANT **
+
+The baud rate must be correctly set or either typeahead will not interrupt
+the screen update and scrolling wont be used or there will be annoying
+delays in the screen update.  If you can't set the baud rate correctly with
+'stty', give a numeric value in the environment variable 'BAUD' or to the
+command line options '-baud'.
+
+The baud rate '38400' or 'extb' means infinite to joe.  Use it for X windows
+and hardware console ttys.  No delays will be generated and scrolling will
+not be used.
+
+The baud rate '19200' or 'exta' means that joe will use scrolling, but will
+not delay.
+
+Use the LINES and COLUMNS environment variables or the -lines and -columns
+command line options if you need the terminal size to be different than
+whatever the termcap entry or stty reports.
+
+Since most people use terminal emulators, JOE does not send out pad
+characters.  If you're using a real terminal and the padding matters, set
+the environment variable DOPADDING or give the command line option
+-dopadding.
+
+If you want joe to try to disable ^S/^Q processing, set the environment
+variable NOXON or command line option -noxon.
+
+A termcap file is included with JOE.  You might consider updating your own
+termcap file with the entries in it, particularly if you use ANSI/VT100ish
+terminals.  JOE understands some capabilities which are not usually supplied
+in normal termcap (see below).
+
+                                 VARIATIONS
+                                 =-=-=-=-=-
+
+Termcap/Terminfo
+=-=-=-=-=-=-=-=-
+
+       JOE prefers to use the termcap terminal capability database.  It
+attempts to find this file in:
+
+       $HOME/.termcap          Personal .termcap in your home directory
+       /usr/local/lib/termcap  Joe's termcap file
+       /etc/termcap            Normal system termcap file
+
+       Joe copies its own termcap file to /usr/local/lib/termcap (or
+wherever the system-wide joerc file is going to go) when 'make install' is
+run.
+
+       Termcap is better than terminfo because it is a more open standard.
+Programs can directly access the termcap database and future versions of
+terminfo may require programs to use curses.  The only argument in
+terminfo's favor is that it is faster than termcap.  To fix this problem,
+JOE will use a termcap index file if it exists and if it is up to date.
+
+       This is the procedure to make the termcap index file:
+
+               make termidx
+               ./termidx </etc/termcap >/etc/termcap.idx
+
+       The /etc/termcap.idx is a text file which you can look at if you're
+curious.
+
+       JOE supports the GNU extensions to the termcap language and also
+understands several new capabilities:
+
+               AL DL IC DC RI LE UP DO SF SR
+
+                       Versions of the standard capabilities which accept
+                       an argument.  For example, RI with and argument of
+                       7 should move the cursor 7 positions to the right.
+
+               rr
+
+                       Set this flag if the cursor is restricted to move
+                       only within the scrolling regions.  This is an optional
+                       mode on vt220s and several clones assume that this
+                       mode is always on.
+
+               cV
+
+                       Like the 'cv' capability, but the cursor goes to the
+                       beginning of the specified line.  Like 'ESC [ n H' in
+                       ansi/vt100.
+
+JPICO
+=-=-=
+
+If you want JPICO to act more like real pico when you hit ^X (I.E., to have
+it ask before saving), change the line:
+
+exsave         ^X              Exit
+
+to:
+
+ask,query,lose,query,abortbuf  ^X      Exit
+
+BROKEN TERMINALS
+=-=-=-=-=-=-=-=-
+"Joe does not update the screen correctly in Procomm"
+"My Xenix console does not scroll correctly"
+
+Old versions of Procomm, many other DOS comm programs and nearly every
+PC-UNIX console (with the exception of Linux) does not emulate VT100s
+properly.  There are usually one or more problems:
+
+       1) Tabs are destructive
+
+       2) Tabs are destructive when inverse mode is set
+
+       3) Scrolling regions are not supported
+
+       4) Cursor positioning is scrolling region relative instead of
+          screen relative.
+
+       5) Some other program set the tab-stops to something other than
+          one tab stop every 8 columns.
+
+       6) The erase commands (ESC [ J and ESC [ K) fill with inverse
+          video blanks instead of plain blanks when inverse mode is set.
+
+       7) Backspace is destructive
+
+Procomm 2.3 works fine- but make sure you have DEC VT100 selected, not 'ANSI
+BBS' and also that backspace (BS) is set to 'non-destructive'.  If you must
+use an old version of Procomm, try using the 'ansisys' or 'nansisys' termcap
+entry.  Unix consoles usually do not have scrolling regions, but instead
+have insert and delete line commands.  The 'fansi' entry and ones derived
+from it will work correctly.  These termcap entries are provided in the
+termcap file which came with joe.  If at all possible have your sysadmin
+install these entries in '/etc/termcap'.  Even if your system normally uses
+the terminfo database, you can copy Joe's termcap file into
+/etc/termcap.
+
+"I don't have root access and can't update the system's termcap file.  How
+ do I get only Joe to use a different termcap entry?"
+
+"My system uses terminfo.  How do I get only Joe to use a different termcap
+ entry?"
+
+What you should do is copy the termcap file which is provided with joe into
+'.termcap' of your home directory.  Now suppose you want Joe to use the
+'fansi' termcap entry:
+
+If you use csh or tcsh, place this in your .cshrc file:
+
+       setenv JOETERM fansi
+
+If you use sh, ksh or bash, place this in your .profile file:
+
+       JOETERM=fansi; export JOETERM
+
+"I don't have root access and can't update the system's termcap file.  How
+ do I get all of my programs to use one of Joe's termcap entries?"
+
+Again, copy termcap into '.termcap' in your home directory, but set the
+environment variables like this:
+
+       setenv TERMCAP $HOME/.termcap
+       setenv TERM fansi
+
+"My system uses terminfo... how do I get all of my programs to use one of
+ Joe's termcap entries?"
+
+First, compile joe for terminfo.  You then have to 'tic' the terminfo
+version of joe's termcap file into your account.  These are the commands for
+doing this:
+
+       1)      cd
+       2)      mkdir .info
+       3)      setenv TERMINFO $HOME/.info
+
+               (or
+
+               TERMINFO=$HOME/.info; export TERMINFO
+
+               if you use bash, sh or ksh)
+
+       4)      tic joe/terminfo
+
+Then put the 'setenv TERMINFO $HOME/.info' line into your .login file or
+'TERMINFO=$HOME/.info; export TERMINFO' in your .profile.  Now all of your
+programs should look up the 'TERM' in your own personal terminfo database.
+
+USING JOE IN A SHELL SCRIPT
+=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+Joe used to use /dev/tty to access the terminal.  This caused a problem with
+idle-session killers (they would kill joe because the real tty device was
+not being accessed for a long time), so now joe only uses /dev/tty if you
+need to pipe a file into joe, as in:  echo "hi" | joe -
+
+If you want to use joe in a shell script which has its stdin/stdout
+redirected, but you don't need to do 'joe -', you should simply redirect
+joe's stdin/stdout to /dev/tty:
+
+       joe filename  </dev/tty >/dev/tty
+
+___________________________________________________________________
+$MirOS: contrib/code/jupp/README,v 1.3 2008/05/13 16:17:42 tg Exp $
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..fa787a8
--- /dev/null
+++ b/TODO
@@ -0,0 +1,651 @@
+Do something with these keys:
+
+-------
+ssh 3.2
+-------
+Arrow: \e[C \e[D \e[A \e[B
+Home: \e[2~ (uhg!)
+End: \e[4~
+Pgup: \e[5~
+Pgdn: \e[6~
+Ins: \e[2~
+Del: \7f
+F1: \e[11~
+F2: \e[12~
+F3: \e[13~
+F4: \e[14~
+F5: \e[15~
+F6: \e[17~
+F7: \e[18~
+F8: \e[19~
+F9: \e[20~
+F10: \e[21~
+F11: \e[23~
+F12: \e[24~
+
+Ctrl-arrow: -
+Alt-arrow: - (can set Alt=ESC mode, but doesn't work with arrow keys)
+Shift-arrow: -
+
+-----
+PuTTY
+-----
+
+Arrow: \e[C \e[D \e[A \e[B
+Home: \e[1~
+End: \e[4~
+Pgup: \e[5~
+Pgdn: \e[6~
+Ins: \e[2~
+Del: \e[3~
+F1: \e[11~
+F2: \e[12~
+F3: \e[13~
+F4: \e[14~
+F5: \e[15~
+F6: \e[17~
+F7: \e[18~
+F8: \e[19~
+F9: \e[20~
+F10: \e[21~
+F11: \e[23~
+F12: \e[24~
+
+Ctrl-arrow: \eOC \eOD \eOA \eOB
+Ctrl-home: -
+Ctrl-end: -
+Ctrl-pgup: putty scroll back
+Ctrl-pgdn: putty scroll fwrd
+Ctrl-ins: -
+Ctrl-del: -
+
+Alt-arrow: \e\e[C \e\e[D \e\e[A \e\e[B
+Alt-pgup: \e\e[5~
+Alt-pgdn: \e\e[6~
+Alt-home: \e\e[1~
+Alt-end: \e\e[4~
+Alt-ins: \e\e[2~
+Alt-del: \e\e[3~
+
+Shift-arrow: \e[C \e[D \e[A \e[B
+Shift-home: \e[1~
+Shift-end: \e[4~
+Shift-pgup: putty scroll back
+Shift-pgdn: putty scroll fwrd
+Shift-ins: \13
+Shift-del: \e[3~
+
+-----
+XTerm
+-----
+
+Arrow: \e[C \e[D \e[A \e[B
+Home: \e[H
+End: \e[F
+PgUp: \e[5~
+PgDn: \e[6~
+Ins: \e[2~
+Del: \e[3~
+F1: \eOP
+F2: \eOQ
+F3: \eOR
+F4: \eOS
+F5: \e[15~
+F6: \e[17~
+F7: \e[18~
+F8: \e[19~
+F9: \e[20~
+F10: \e[21~
+F11: \e[23~
+F12: \e[24~
+
+Ctrl-arrow: \e[1;5C \e[1;5D \e[1;5A \e[1;5B
+Ctrl-home: \e[1;5H
+Ctrl-end: \e[1;5F
+Ctrl-pgup: \e[5;5~
+Ctrl-pgdn: \e[6;5~
+Ctrl-ins: \e[2;5~
+Ctrl-del: \e[3;5~
+
+Shift-arrow: \e[1;2C \e[1;2D \e[1;2A \e[1;2B
+Shift-home: \e[1;2H
+Shift-end: \e[1;2F
+Shift-pgup: -
+Shift-pgdn: -
+Shift-ins: \bttp://www.gush-shalom.org/archives/kurdi_eng.html
+Shift-del: \e[3;2~
+
+Shift-ctrl-arrow: \e[1;6C \e[1;6D \e[1;6A \e[1;6B
+
+Alt-ctrl-arrow: \e[1;7C \e[1;7D \e[1;7A \e[1;7B
+
+Alt-shift-arrow: \e[1;4C \e[1;4D \e[1;4A \e[1;4B
+
+Alt-shift-ctrl-arrow: \e[1;8C \e[1;8D \e[1;8A \e[1;8B
+
+Alt-arrow: \e[1;3C \e[1;3D \e[1;3A \e[1;3B
+Alt-home: \e[1;3H
+Alt-end: \e[1;3F
+Alt-pgup: \e[5;3~
+Alt-pgdn: \e[6;3~
+Alt-ins: \e[2;3~
+Alt-del: \e[3;3~
+
+----
+rxvt
+----
+Arrow: \e[C \e[D \e[A \e[B
+Home: \e[7~
+End: \e[8~
+Pgup: \e[5~
+Pgdn: \e[6~
+Ins: \e[2~
+Del: \e[3~
+
+F1: \e[11~
+F2: \e[12~
+F3: \e[13~
+F4: \e[14~
+F5: \e[15~
+F6: \e[17~
+F7: \e[18~
+F8: \e[19~
+F9: \e[20~
+F10: \e[21~
+F11: \e[23~
+F12: \e[24~
+
+Ctrl-arrow: \eOc \eOd \eOa \eOb
+Ctrl-home: \e[7^
+Ctrl-end: \e[8^
+Ctrl-pgup: \e[5^
+Ctrl-pgdn: \e[6^
+Ctrl-ins: \e[2^
+Ctrl-del: \e[3^
+
+Shift-arrow: \e[c \e[d \e[a \e[b
+
+Shift-ctrl-arrow: \e[c \e[b \e[a \e[b
+
+Alt-ctrl-arrow: \e\eOc \e\eOd \e\eOa \e\eOb
+
+Alt-shift-arrow: \e\e[c \e\e[d \e\e[a \e\e[b
+
+Alt-arrow: \e\e[C \e\e[D \e\e[A \e\e[B
+
+--------------
+gnome-terminal
+--------------
+
+Arrows: \e[C \e[D \e[A \e[B
+Home: \eOH
+End: \eOF
+PgUp: \e[5~
+PgDn: \e[6~
+Ins: \e[2~
+Del: \e[3~
+F1: -
+F2: \eOQ
+F3: \eOR
+F4: \eOS
+F5: \e[15~~
+F6: \e[17~~
+F7: \e[18~~
+F8: \e[19~
+F9: \e[20~
+F10: -
+F11: \e[23~
+F12: \e[24~
+
+Ctrl-arrow: \e[5C \e[5D \e[5A \e[5B
+Ctrl-home: \eOH
+Ctrl-end: \eOF
+Ctrl-pgup: -
+Ctrl-pgdn: -
+Ctrl-ins: \e[2;5~
+Ctrl-del: \e[3;5~
+
+Shift-arrows: \e[2C \e[2D \e[2A \e[2B
+Shift-home: -
+Shift-end: -
+Shift-pgup: -
+Shift-pgdn: -
+Shift-ins: -
+Shift-del: \e[3;2~
+
+Alt-arrows: \e[3C \e[3D \e[3A \e[3B
+Alt-home: \eOH
+Alt-end: \eOF
+Alt-PgUp: \e[5;3~
+Alt-PgDn: \e[6;3~
+Alt-Insert: \e[2;3~
+Alt-Delete: \e[3;3~
+
+Ctrl-Alt-arrows: - (window manager takes)
+Ctrl-Shift-arrows: \e[6C \e[6D \e[6A \e[6B
+Ctrl-Shift-Alt-arrows: \e[8C \e[8D \e[8A \e[8B
+
+-------
+konsole
+-------
+Arrows: \e[C \e[D \e[A \e[B
+Home: \e[H
+End: \e[F
+PgUp: \e[5~
+PgDn: \e[6~
+Ins: \e[2~
+Del: \e[3~
+F1: \eOP
+F2: \eOQ
+F3: \eOR
+F4: \eOS
+F5: \e[15~
+F6: \e[17~
+F7: \e[18~
+F8: \e[19~
+F9: \e[20~
+F10: \e[21~
+F11: \e[23~
+F12: \e[24~
+
+Ctrl-arrows: \e[C \e[D \e[A \e[B
+Ctrl-home: \e[H
+Ctrl-end: \e[F
+Ctrl-PgUp: \e[5~
+Ctrl-PgDn: \e[6~
+Ctrl-ins: \e[2~
+Ctrl-del: \e[3~
+
+Shift-arrows: -
+Shift-home: \e[2H
+Shift-end: \e[2F
+Shift-PgUp: -
+Shift-PgDn: -
+Shift-Ins: -
+Shift-Del: \e[3;2~
+
+Alt-arrows: \e\e[C \e\e[D \e\e[A  \e\e[B
+Alt-home: \e\e[H
+Alt-end: \e\e[F
+Alt-PgUp: \e\e[5~
+Alt-PgDn: \e\e[6~
+Alt-Ins: \e\e[2~
+Alt-Del: \e\e[3~
+
+-------------
+linux console
+-------------
+Arrows: \e[C \e[D \e[A \e[B
+Home: \e[1~
+End: \e[4~
+PgUp: \e[5~
+PgDn: \e[6~
+Ins: \e[2~
+Del: \e[3~
+F1: \e[[A
+F2: \e[[B
+F3: \e[[C
+F4: \e[[D
+F5: \e[[E
+F6: \e[17~
+F7: \e[18~
+F8: \e[19~
+F9: \e[20~
+F10: \e[21~
+F11: \e[23~
+F12: \e[24~
+
+Ctrl-arrows: \e[C \e[D \e[A \e[B
+Ctrl-home: \e[1~
+Ctrl-end: \e[4~
+Ctrl-pgup: \e[5~
+Ctrl-pgdn: \e[6~
+Ctrl-ins: \e[2~
+Ctrl-del: \e[3~
+
+Shift-arrows: \e[C
+Shift-home: \e[1~
+
+Alt-arrows: - (switches console)
+Alt-home: \e[1~
+
+--------------
+cygwin console
+--------------
+Arrows: \e[C \e[D \e[A \e[B
+Home: \e[1~
+End: \e[4~
+PgUp: \e[5~
+PgDn: \e[6~
+Ins: \e[2~
+Del: \e[3~
+F1: \e[[A
+F2: \e[[B
+F3: \e[[C
+F4: \e[[D
+F5: \e[[E
+F6: \e[17~
+F7: \e[18~
+F8: \e[19~
+F9: \e[20~
+F10: \e[21~
+F11: \e[23~
+F12: \e[24~
+
+Ctrl-arrows: -
+Shift-arrows: -
+
+Alt-enything: prefixed with ESC
+
+-----------------------
+jstar missing sequences
+-----------------------
+^O options (supposed to be set tab width)
+^P print
+^U undo (supossed to be unerase)
+^^ autoindent on/off
+^\ meta (supposed to be refresh screen)
+ESC =  insert math result
+ESC $  insert math result money formatted
+ESC #  insert math equation
+ESC m  Memorandum
+ESC s  isearch fwrd (supposed to be Sincerely)
+ESC c  compile (supposed to be center line)
+^Q U   align paragraph (don't know what this does)
+^Q ^Q  repeat next command once every second
+^Q O   spell check entered word
+^Q W   scroll up- repeat once every second
+^Q Z   scroll down- repeat once every second
+^Q Ins  it does something...
+^Q Home  scroll up repeating
+^Q End   scroll down repeating
+^K M     math
+^K F     run dos comment
+^K N     column mode on
+^K I     column replace mode on
+^K O     copy file
+^K E     rename file
+^K J     erase file
+^K L     change drive
+^K uparw  rename file
+^K dnarw  save and exit
+^K ltarw  save
+^K rtarw  ^K D save
+^K Ins    move
+^K Home   quit
+^K End    quit
+^K '      to markk
+-----------------------
+
+-----------------
+notepad/cua mode?
+-----------------
+^A     select all
+^F     find
+^G     goto line
+^H     replace
+^J     return
+^N     new blank file
+^O     edit file (asks to save current)
+^P     print
+^S     save
+^V     paste
+^Z     undo
+^X     cut
+^C     copy
+F3     find next
+F5     date/time
+
+- shell window intercept should be smarter.  hit ^K ^H- the ^H is going to the
+  shell window.
+
+- do not use ^[^[ for anything.  it prevents Alt-arrow
+  from being useful.
+
+- search should automatically use 'k' mode if block is
+  selected.  Cursor should jump to top of block when done.  Jump
+  back to start mode?
+
+
+
+- save all files without asking thing for quick compile
+
+- better parsing of compile messages
+
+
+
+- continued search mode for jpico?
+
+- smarter highlighter- need char and string storage.
+
+- make ^K F prompt with previous text (PICO)?
+
+^K X leads to segfault?
+
+if I use ^K C to move search string into search prompt, it says not found
+even though it found it.
+
+options are screwed up: we copy window to buffer (to get buffer options
+to the buffer).  But if we have multiple windows, buffer options will have
+stale data.
+
+we are missing many query and prompt window abort handlers, which cause
+small memory leaks.
+
+- update help screens: some things have changed (emacs is more like emacs).
+
+
+Fix for next release highlight:
+
+  other windows why
+  lose state during page down?
+  perl highlighter
+  more syntax files
+
+  byte to byte conversions?
+  UTF-8 decoder right at input instead of in qw and utype?
+
+ Update man page.
+
+ Reload modified files (or current window)
+
+  don't use -notite by default.
+
+Watch loaded file for changes
+
+Save all history buffers and keyboard macros in ~/.joe_state file?
+
+  Update documentation.
+
+shift/alt/ctrl arrow key stuff.
+
+regex: character classes? a-z matches any letter?
+
+  parse *rc file only once?
+
+  different symbol for 'joe' directory
+
+  can't load terminfo- should switch to termcap or provide compiled
+  ANSI terminfo built in.
+
+  gettext patch
+
+
+New features:
+-----------------------
+
+  move *rc files to .joe directory?
+
+  check all instances of 'chars': use unicode to locale symbols instead.
+  EBCDIC ?
+    - we assume '\n' is line terminator.
+    - there are many references to '\t' and ' '.
+    - EBCDIC used to be fixed record length (80 columns) anyway.
+
+Math: hex, octal more functions. (-lm?)
+
+Perl compatible regex search.
+
+Improvements for regular text
+-----------------------------
+mode where wordwrap wraps rest of paragraph?
+
+mode where all editing wraps rest of paragraph?
+
+Improvements for programming
+----------------------------
+
+Jump to definition (tags does this)
+
+Show list of references
+
+Diff mode (need vertical window)
+
+Tie in with CVS
+
+Refactoring
+
+Syntax Highlighting:
+--------------------
+
+UTF-8 syntax files?
+
+Support for more languages:
+
+ Paragraph reformat mode for TeX files.
+
+ ^G Matching for verilog begin ... end, html tags, etc.
+
+ Reformat paragraph should reformat C function if we're editing C.
+
+File loading/storing:
+
+ Should have switch buffers in current window as more fundamental joe key
+ sequence (it's ^[ u and ^[ v for now).
+
+ Unnamed buffers should be in bufed list (was fixed in the lost joe 2.9)
+
+Jmacs/Jstar/Jpico:
+
+ search and replace 'fred' to 'foo':
+    find 'Fred', gets 'Foo'.
+
+ Rectangle mode for emacs yank system
+
+ Overtype mode works for yank
+
+ ESC args should work differently in emacs
+
+ many negative args do not work properly
+
+ exiting options and i-search with ESC is not pretty
+ (it isn't in emacs either)
+
+Shell windows:
+
+ Better environment settings for shell windows.
+
+Documentation:
+
+ Include documentation for joe hackers.  I wrote a lot of this
+ some time, I need to find it.
+
+ joe should open tty earlier in startup sequence because ^Y
+ is suspend character on sun.
+
+UTF-8/Internationalization
+--------------------------
+
+- right-left mode for Hebrew/Arabic?
+
+  There is no good way to do this.  For all rtol, you could use a reversed
+xterm.  For mixed, you need tags to indicate direction.
+
+
+UI for changing colors in the editor (or at least dark/light mode)
+
+More colors: UI for using 256 color xterms.
+
+
+ Lock files being edited?
+  one person gets write lock
+
+
+ Don't understand:  optionally break hardlinks on save?  what is "tla"?
+
+ Use memory mapped files to fast load large files.  Have to not
+ count no. lines in each buffer on startup.
+
+
+ Emulate other editors?  Brief, EDT?
+
+
+Prompts:
+
+ Sort should be column wise, not row wise?
+
+ HTML-style thing for option selection?
+
+
+
+Terminal handling:
+
+ Emit ESC c to reset terminal on startup?
+
+ Look into clearing right-most column.
+
+Macros:
+
+ Interactive macros during file load are broken.  Think about multiple
+ stack hack (otherwise template based C++ callbacks).
+
+
+Mouse:
+
+ ` and autoindent mode are a problem for drag and drop.
+ any way we can distinguish normal typing from a drop?
+ modify xterm...
+
+ mouse mode: mouse can position cursor.  Would be good for
+ jcua...
+
+Major new modes:
+
+ Hex edit mode
+
+ Fixed record length mode
+
+
+Major code improvements:
+
+ Vertical windows (optionally lock-stepped).
+
+
+Major new features:
+
+ Folding
+
+
+Options
+
+ Fix it so all options appear in ^T.  Maybe make hook function
+ to handle major changes.  Need this for major mode change for
+ hex edit mode.
+
+Other requests:
+
+ -cleanup (delete extra lines and extra spaces at ends of lines).
+
+ -show no. utf characters, not no. bytes
+
+
+┌───────────┐
+│ jupp TODO │
+└───────────┘
+
+• merge syntax handling code from joe-3.7+
+• make -Wcast-qual clean
+• …
+
+_________________________________________________________________
+$MirOS: contrib/code/jupp/TODO,v 1.7 2011/07/16 21:57:55 tg Exp $
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644 (file)
index 0000000..0b4ed7d
--- /dev/null
@@ -0,0 +1,109 @@
+dnl $MirOS: contrib/code/jupp/acinclude.m4,v 1.3 2008/05/13 13:08:20 tg Exp $
+dnl
+dnl ------------------
+dnl Check for properly working isblank()
+dnl ------------------
+AC_DEFUN([joe_ISBLANK],
+       [AC_CACHE_CHECK([whether isblank() works correctly with side effect expressions],
+               [joe_cv_isblank],
+               [AC_TRY_RUN([
+#include <ctype.h>
+int main() {
+  int a = 0;
+  isblank(a++);
+  exit(a != 1);
+}
+                       ],
+                       [joe_cv_isblank=yes],
+                       [joe_cv_isblank=no],
+                       [joe_cv_isblank=no])
+               ])
+       if test "$joe_cv_isblank" = yes; then
+               AC_DEFINE([HAVE_WORKING_ISBLANK], 1, [Define if isblank() works with expressions with side effects])
+       fi
+])
+
+dnl ------------------
+dnl Check if setpgrp must have two arguments
+dnl autoconf-own macro is damaged for *BSD systems
+dnl ------------------
+AC_DEFUN([joe_SETPGRP],
+       [AC_CACHE_CHECK([whether setpgrp() takes no arguments],
+               [joe_cv_setpgrp_void],
+               [AC_TRY_RUN([
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+int main() {
+       /* exit succesfully if setpgrp() takes two args (*BSD systems) */
+       exit(setpgrp(0, 0) != 0);
+}],
+                       [joe_cv_setpgrp_void=no],
+                       [joe_cv_setpgrp_void=yes],
+                       [joe_cv_setpgrp_void=yes])
+               ])
+       if test "$joe_cv_setpgrp_void" = yes; then
+               AC_DEFINE([SETPGRP_VOID], 1, [Define if setpgrp() takes no arguments])
+       fi
+])
+
+dnl ------------------
+dnl Check to see if signal handlers must be reinstalled when invoked
+dnl ------------------
+AC_DEFUN([joe_REINSTALL_SIGHANDLERS],
+       [AC_CACHE_CHECK([whether sighandlers must be reinstalled],
+               [joe_cv_reinstall_sighandlers],
+               [AC_TRY_RUN([
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#ifndef HAVE_SIGHANDLER_T
+typedef RETSIGTYPE (*sighandler_t)(int);
+#endif
+
+int nsigint;
+
+void set_signal(int signum, sighandler_t handler) {
+#if HAVE_SIGACTION
+        struct sigaction sact;
+
+        sact.sa_handler = handler;
+       sact.sa_flags = 0;
+       sigemptyset(&sact.sa_mask);
+        sigaction(signum, &sact, NULL);
+#elif HAVE_SIGVEC
+        struct sigvec svec;
+
+        svec.sv_handler = handler;
+       svec.sv_flags = 0;
+       sigemptyset(&svec.sv_mask);
+        sigvec(signum, &svec, NULL);
+#else
+        signal(signum, handler);
+#endif
+}
+
+RETSIGTYPE sigint(int s) {
+       nsigint++;
+}
+
+int main() {
+       nsigint = 0;
+       set_signal(SIGINT, sigint);
+       kill((int)getpid(), SIGINT);
+       kill((int)getpid(), SIGINT);
+       /* exit succesfully if don't have to reinstall sighandler when invoked */
+       exit(nsigint != 2);
+}],
+                       [joe_cv_reinstall_sighandlers=no],
+                       [joe_cv_reinstall_sighandlers=yes],
+                       [joe_cv_reinstall_sighandlers=yes])
+               ])
+       if test "$joe_cv_reinstall_sighandlers" = yes; then
+               AC_DEFINE([NEED_TO_REINSTALL_SIGNAL], 1, [Define if we have to reinstall signal handler when invoked])
+       fi
+])
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..a867219
--- /dev/null
@@ -0,0 +1,892 @@
+# generated automatically by aclocal 1.9.6-MirPorts-5 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+        [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+                            [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode is disabled by default
+  AC_ARG_ENABLE(maintainer-mode,
+[  --enable-maintainer-mode  enable make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer],
+      USE_MAINTAINER_MODE=$enableval,
+      USE_MAINTAINER_MODE=no)
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST(MAINT)dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes.                 -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([acinclude.m4])
diff --git a/autoconf.h.in b/autoconf.h.in
new file mode 100644 (file)
index 0000000..e23a205
--- /dev/null
@@ -0,0 +1,321 @@
+/* autoconf.h.in.  Generated from configure.ac by autoheader 2.61-MirPorts-1.  */
+
+/* Define to 1 if `TIOCGWINSZ' requires <sys/ioctl.h>. */
+#undef GWINSZ_IN_SYS_IOCTL
+
+/* Define to 1 if you have the `alarm' function. */
+#undef HAVE_ALARM
+
+/* Define to 1 if you have the <bsd/string.h> header file. */
+#undef HAVE_BSD_STRING_H
+
+/* Define to 1 if you have the declaration of `strlcat', and to 0 if you
+   don't. */
+#undef HAVE_DECL_STRLCAT
+
+/* Define to 1 if you have the declaration of `strlcpy', and to 0 if you
+   don't. */
+#undef HAVE_DECL_STRLCPY
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <errno.h> header file. */
+#undef HAVE_ERRNO_H
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define if GCC has Anil's bounds checker */
+#undef HAVE_GCC_ATTRIBUTE_BOUNDED
+
+/* Define to 1 if you have the `getcwd' function. */
+#undef HAVE_GETCWD
+
+/* Define to 1 if you have the `getwd' function. */
+#undef HAVE_GETWD
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `isblank' function. */
+#undef HAVE_ISBLANK
+
+/* Define to 1 if you have the <langinfo.h> header file. */
+#undef HAVE_LANGINFO_H
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* If we have BSD function login_tty() */
+#undef HAVE_LOGIN_TTY
+
+/* Define to 1 if `lstat' has the bug that it succeeds when given the
+   zero-length file name argument. */
+#undef HAVE_LSTAT_EMPTY_STRING_BUG
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mkdir' function. */
+#undef HAVE_MKDIR
+
+/* Define to 1 if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the `nl_langinfo' function. */
+#undef HAVE_NL_LANGINFO
+
+/* If we have BSD function openpty() */
+#undef HAVE_OPENPTY
+
+/* Define to 1 if you have the <paths.h> header file. */
+#undef HAVE_PATHS_H
+
+/* We have <termios.h> and maybe <sys/termios.h> */
+#undef HAVE_POSIX_TERMIOS
+
+/* Define to 1 if you have the <pty.h> header file. */
+#undef HAVE_PTY_H
+
+/* Define to 1 if you have the `putenv' function. */
+#undef HAVE_PUTENV
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define to 1 if you have the <selinux/context.h> header file. */
+#undef HAVE_SELINUX_CONTEXT_H
+
+/* We have SELinux functions */
+#undef HAVE_SELINUX_FUN
+
+/* We have SELinux headers */
+#undef HAVE_SELINUX_HDR
+
+/* Define to 1 if you have the <selinux/selinux.h> header file. */
+#undef HAVE_SELINUX_SELINUX_H
+
+/* Define to 1 if you have the `setitimer' function. */
+#undef HAVE_SETITIMER
+
+/* Define to 1 if you have the `setlocale' function. */
+#undef HAVE_SETLOCALE
+
+/* Define to 1 if you have the `setpgid' function. */
+#undef HAVE_SETPGID
+
+/* Define to 1 if you have the <sgtty.h> header file. */
+#undef HAVE_SGTTY_H
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define if you have the `sighandler_t' type. */
+#undef HAVE_SIGHANDLER_T
+
+/* Define to 1 if you have the `siginterrupt' function. */
+#undef HAVE_SIGINTERRUPT
+
+/* Define to 1 if you have the <signal.h> header file. */
+#undef HAVE_SIGNAL_H
+
+/* Define to 1 if you have the `sigprocmask' function. */
+#undef HAVE_SIGPROCMASK
+
+/* Define to 1 if you have the `sigvec' function. */
+#undef HAVE_SIGVEC
+
+/* If we have snprintf */
+#undef HAVE_SNPRINTF
+
+/* Define to 1 if `stat' has the bug that it succeeds when given the
+   zero-length file name argument. */
+#undef HAVE_STAT_EMPTY_STRING_BUG
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strchr' function. */
+#undef HAVE_STRCHR
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strlcat' function. */
+#undef HAVE_STRLCAT
+
+/* Define to 1 if you have the `strlcpy' function. */
+#undef HAVE_STRLCPY
+
+/* We have <termio.h> and <sys/termio.h> */
+#undef HAVE_SYSV_TERMIO
+
+/* Define to 1 if you have the <sys/dirent.h> header file. */
+#undef HAVE_SYS_DIRENT_H
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#undef HAVE_SYS_IOCTL_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/termios.h> header file. */
+#undef HAVE_SYS_TERMIOS_H
+
+/* Define to 1 if you have the <sys/termio.h> header file. */
+#undef HAVE_SYS_TERMIO_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the <termios.h> header file. */
+#undef HAVE_TERMIOS_H
+
+/* Define to 1 if you have the <termio.h> header file. */
+#undef HAVE_TERMIO_H
+
+/* Define to 1 if you have the <time.h> header file. */
+#undef HAVE_TIME_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <util.h> header file. */
+#undef HAVE_UTIL_H
+
+/* Define to 1 if you have the `utime' function. */
+#undef HAVE_UTIME
+
+/* Define to 1 if you have the <utime.h> header file. */
+#undef HAVE_UTIME_H
+
+/* Define to 1 if you have the <utmp.h> header file. */
+#undef HAVE_UTMP_H
+
+/* Define if isblank() works with expressions with side effects */
+#undef HAVE_WORKING_ISBLANK
+
+/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
+   slash. */
+#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
+
+/* Define if we have to reinstall signal handler when invoked */
+#undef NEED_TO_REINSTALL_SIGNAL
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if the C compiler supports function prototypes. */
+#undef PROTOTYPES
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* Define if setpgrp() takes no arguments */
+#undef SETPGRP_VOID
+
+/* The size of `char', as computed by sizeof. */
+#undef SIZEOF_CHAR
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `long long', as computed by sizeof. */
+#undef SIZEOF_LONG_LONG
+
+/* The size of `off_t', as computed by sizeof. */
+#undef SIZEOF_OFF_T
+
+/* The size of `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of `void *', as computed by sizeof. */
+#undef SIZEOF_VOID_P
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* If we have newer terminfo/termcap capabilities */
+#undef TERMINFO
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Version number of package */
+#undef VERSION
+
+/* Check to see if we can use strict prototypes */
+#ifndef PARAMS
+#  ifdef PROTOTYPES
+#    define PARAMS(protos) protos
+#  else
+#    define PARAMS(protos) ()
+#  endif
+#endif
+
+/* Define like PROTOTYPES; this can be used by system headers. */
+#undef __PROTOTYPES
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_t
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef ssize_t
diff --git a/autogen.sh b/autogen.sh
new file mode 100644 (file)
index 0000000..6ab8294
--- /dev/null
@@ -0,0 +1,69 @@
+#!/bin/mksh
+# $MirOS: contrib/code/jupp/autogen.sh,v 1.13 2009/03/29 13:04:11 tg Exp $
+#-
+# Copyright (c) 2004, 2005, 2006, 2008
+#      Thorsten Glaser <tg@mirbsd.de>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un-
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person's immediate fault when using the work as intended.
+
+if [[ -z $AUTOCONF_VERSION ]]; then
+       export AUTOCONF_VERSION=2.61
+       print -u2 Warning: AUTOCONF_VERSION unset, using $AUTOCONF_VERSION!
+fi
+
+if [[ -z $AUTOMAKE_VERSION ]]; then
+       export AUTOMAKE_VERSION=1.9
+       print -u2 Warning: AUTOMAKE_VERSION unset, using $AUTOMAKE_VERSION!
+fi
+
+[[ -n $GNUSYSTEM_AUX_DIR ]] || GNUSYSTEM_AUX_DIR=/usr/src/gnu/share
+
+export AUTOCONF_VERSION AUTOMAKE_VERSION GNUSYSTEM_AUX_DIR
+
+AM_FLAGS=
+
+for f in $files ChangeLog ltmain.sh; do
+       [[ -e $f ]] && continue
+       ln -s /dev/null $f
+done
+
+for f in libtool.m4 m4salt.inc m4sugar.inc; do
+       [[ -s $f ]] || ln -sf "$GNUSYSTEM_AUX_DIR/$f" .
+done
+
+set -e
+set -x
+ACLOCAL_AMFLAGS=
+[[ -e Makefile.am ]] && ACLOCAL_AMFLAGS=$(grep '^[:space:]*ACLOCAL_AMFLAGS' \
+    Makefile.am | cut -d '=' -f 2)
+aclocal -I . $ACLOCAL_AMFLAGS
+f=configure.ac
+[[ ! -e $f ]] && f=configure.in
+[[ -n $NO_AUTOHEADER ]] || if fgrep -q \
+    -e AC_CONFIG_HEADER -e AM_CONFIG_HEADER $f; then
+       autoheader
+fi
+set +e
+integer rv=0
+[[ ! -e Makefile.am ]] || automake --foreign -a $AM_FLAGS || rv=$?
+if autoconf; then
+       chmod 664 configure
+else
+       (( rv = rv ? rv : 1 ))
+fi
+rm -rf autom4te.cache
+find . -type l -print0 | xargs -0 rm
+exit $rv
diff --git a/b.c b/b.c
new file mode 100644 (file)
index 0000000..758b850
--- /dev/null
+++ b/b.c
@@ -0,0 +1,2616 @@
+/* $MirOS: contrib/code/jupp/b.c,v 1.9 2011/07/16 21:57:55 tg Exp $ */
+/*
+ *     Editor engine
+ *     Copyright
+ *             (C) 1992 Joseph H. Allen
+ *
+ *     This file is part of JOE (Joe's Own Editor)
+ */
+#include "config.h"
+#include "types.h"
+
+#include <unistd.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+
+#include "b.h"
+#include "blocks.h"
+#include "main.h"
+#include "path.h"
+#include "queue.h"
+#include "rc.h"
+#include "scrn.h"
+#include "uerror.h"
+#include "undo.h"
+#include "utils.h"
+#include "va.h"
+#include "vfile.h"
+#include "vs.h"
+#include "utf8.h"
+#include "charmap.h"
+#include "w.h"
+
+unsigned char stdbuf[stdsiz];
+
+int guesscrlf = 0;
+int guessindent = 0;
+
+int error;
+int force = 0;
+VFILE *vmem;
+
+unsigned char *msgs[] = {
+       US "No error",
+       US "New File",
+       US "Error reading file",
+       US "Error seeking file",
+       US "Error opening file",
+       US "Error writing file",
+       US "File on disk is newer"
+};
+
+/* Get size of gap (amount of free space) */
+#define GGAPSZ(hdr) ((hdr)->ehole - (hdr)->hole)
+
+/* Get number of characters in gap buffer */
+#define GSIZE(hdr) (SEGSIZ - GGAPSZ(hdr))
+
+/* Get char from buffer (with jumping around the gap) */
+#define GCHAR(p) ((p)->ofst >= (p)->hdr->hole ? (p)->ptr[(p)->ofst + GGAPSZ((p)->hdr)] \
+                                             : (p)->ptr[(p)->ofst])
+
+/* Set position of gap */
+static void gstgap(H *hdr, unsigned char *ptr, int ofst)
+{
+       if (ofst > hdr->hole) {
+               mmove(ptr + hdr->hole, ptr + hdr->ehole, ofst - hdr->hole);
+               vchanged(ptr);
+       } else if (ofst < hdr->hole) {
+               mmove(ptr + hdr->ehole - (hdr->hole - ofst), ptr + ofst, hdr->hole - ofst);
+               vchanged(ptr);
+       }
+       hdr->ehole = ofst + hdr->ehole - hdr->hole;
+       hdr->hole = ofst;
+}
+
+/* Insert a block */
+static void ginsm(H *hdr, unsigned char *ptr, int ofst, unsigned char *blk, int size)
+{
+       if (ofst != hdr->hole)
+               gstgap(hdr, ptr, ofst);
+       mmove(ptr + hdr->hole, blk, size);
+       hdr->hole += size;
+       vchanged(ptr);
+}
+
+/* Read block */
+static void grmem(H *hdr, unsigned char *ptr, int ofst, unsigned char *blk, int size)
+{
+       if (ofst < hdr->hole)
+               if (size > hdr->hole - ofst) {
+                       mmove(blk, ptr + ofst, hdr->hole - ofst);
+                       mmove(blk + hdr->hole - ofst, ptr + hdr->ehole, size - (hdr->hole - ofst));
+               } else
+                       mmove(blk, ptr + ofst, size);
+       else
+               mmove(blk, ptr + ofst + hdr->ehole - hdr->hole, size);
+}
+
+
+static H nhdrs = { {&nhdrs, &nhdrs} };
+static H ohdrs = { {&ohdrs, &ohdrs} };
+
+/* Header allocation */
+static H *halloc(void)
+{
+       H *h;
+
+       if (qempty(H, link, &ohdrs)) {
+               h = (H *) alitem(&nhdrs, sizeof(H));
+               h->seg = my_valloc(vmem, (long) SEGSIZ);
+       } else
+               h = deque_f(H, link, ohdrs.link.next);
+       h->hole = 0;
+       h->ehole = SEGSIZ;
+       h->nlines = 0;
+       izque(H, link, h);
+       return h;
+}
+
+static void hfree(H *h)
+{
+       enquef(H, link, &ohdrs, h);
+}
+
+static void hfreechn(H *h)
+{
+       splicef(H, link, &ohdrs, h);
+}
+
+
+static P frptrs = { {&frptrs, &frptrs} };
+
+/* Pointer allocation */
+static P *palloc(void)
+{
+       return alitem(&frptrs, sizeof(P));
+}
+
+static void pfree(P *p)
+{
+       enquef(P, link, &frptrs, p);
+}
+
+/* Doubly linked list of buffers and free buffer structures */
+static B bufs = { {&bufs, &bufs} };
+static B frebufs = { {&frebufs, &frebufs} };
+
+B *bnext(void)
+{
+       B *b;
+
+       do {
+               b = bufs.link.prev;
+               deque(B, link, &bufs);
+               enqueb(B, link, b, &bufs);
+       } while (b->internal);
+       return b;
+}
+
+B *bprev(void)
+{
+       B *b;
+
+       do {
+               b = bufs.link.next;
+               deque(B, link, &bufs);
+               enquef(B, link, b, &bufs);
+       } while (b->internal);
+       return b;
+}
+
+/* Make a buffer out of a chain */
+static B *bmkchn(H *chn, B *prop, long amnt, long nlines)
+{
+       B *b = alitem(&frebufs, sizeof(B));
+
+       b->undo = undomk(b);
+       if (prop)
+               b->o = prop->o;
+       else
+               b->o = pdefault;
+       mset(b->marks, 0, sizeof(b->marks));
+       b->rdonly = 0;
+       b->orphan = 0;
+       b->oldcur = NULL;
+       b->oldtop = NULL;
+       b->backup = 1;
+       b->internal = 1;
+       b->scratch = 0;
+       b->changed = 0;
+       b->count = 1;
+       b->name = NULL;
+       b->er = -3;
+       b->bof = palloc();
+       izque(P, link, b->bof);
+       b->bof->end = 0;
+       b->bof->b = b;
+       b->bof->owner = NULL;
+       b->bof->hdr = chn;
+       b->bof->ptr = vlock(vmem, b->bof->hdr->seg);
+       b->bof->ofst = 0;
+       b->bof->byte = 0;
+       b->bof->line = 0;
+       b->bof->col = 0;
+       b->bof->xcol = 0;
+       b->bof->valcol = 1;
+       b->eof = pdup(b->bof);
+       b->eof->end = 1;
+       vunlock(b->eof->ptr);
+       b->eof->hdr = chn->link.prev;
+       b->eof->ptr = vlock(vmem, b->eof->hdr->seg);
+       b->eof->ofst = GSIZE(b->eof->hdr);
+       b->eof->byte = amnt;
+       b->eof->line = nlines;
+       b->eof->valcol = 0;
+       b->pid = 0;
+       b->out = -1;
+       enquef(B, link, &bufs, b);
+       pcoalesce(b->bof);
+       pcoalesce(b->eof);
+       return b;
+}
+
+/* Create an empty buffer */
+B *bmk(B *prop)
+{
+       return bmkchn(halloc(), prop, 0L, 0L);
+}
+
+
+extern B *errbuf;
+
+/* Eliminate a buffer */
+void brm(B *b)
+{
+       if (b && !--b->count) {
+               if (b->changed)
+                       abrerr(b->name);
+               if (b == errbuf)
+                       errbuf = NULL;
+               if (b->undo)
+                       undorm(b->undo);
+               hfreechn(b->eof->hdr);
+               while (!qempty(P, link, b->bof))
+                       prm(b->bof->link.next);
+               prm(b->bof);
+               if (b->name)
+                       joe_free(b->name);
+               demote(B, link, &frebufs, b);
+       }
+}
+
+P *poffline(P *p)
+{
+       if (p->ptr) {
+               vunlock(p->ptr);
+               p->ptr = NULL;
+       }
+       return p;
+}
+
+P *ponline(P *p)
+{
+       if (!p->ptr)
+               p->ptr = vlock(vmem, p->hdr->seg);
+       return p;
+}
+
+B *boffline(B *b)
+{
+       P *p = b->bof;
+
+       do {
+               poffline(p);
+       } while ((p = p->link.next) != b->bof);
+       return b;
+}
+
+B *bonline(B *b)
+{
+       P *p = b->bof;
+
+       do {
+               ponline(p);
+       } while ((p = p->link.next) != b->bof);
+       return b;
+}
+
+P *pdup(P *p)
+{
+       P *n = palloc();
+
+       n->end = 0;
+       n->ptr = NULL;
+       n->owner = NULL;
+       enquef(P, link, p, n);
+       return pset(n, p);
+}
+
+P *pdupown(P *p, P **o)
+{
+       P *n = palloc();
+
+       n->end = 0;
+       n->ptr = NULL;
+       n->owner = o;
+       enquef(P, link, p, n);
+       pset(n, p);
+       if (*o)
+               prm(*o);
+       *o = n;
+       return n;
+}
+
+void prm(P *p)
+{
+       if (!p)
+               return;
+       if (p->owner)
+               *p->owner = NULL;
+       if (p->ptr)
+               vunlock(p->ptr);
+       pfree(deque_f(P, link, p));
+}
+
+P *pset(P *n, P *p)
+{
+       if (n != p) {
+               n->b = p->b;
+               n->ofst = p->ofst;
+               n->hdr = p->hdr;
+               if (n->ptr)
+                       vunlock(n->ptr);
+               if (p->ptr) {
+                       n->ptr = p->ptr;
+                       vupcount(n->ptr);
+               } else
+                       n->ptr = vlock(vmem, n->hdr->seg);
+               n->byte = p->byte;
+               n->line = p->line;
+               n->col = p->col;
+               n->valcol = p->valcol;
+       }
+       return n;
+}
+
+P *p_goto_bof(P *p)
+{
+       return pset(p, p->b->bof);
+}
+
+P *p_goto_eof(P *p)
+{
+       return pset(p, p->b->eof);
+}
+
+/* is p at the beginning of file? */
+int pisbof(P *p)
+{
+       return p->hdr == p->b->bof->hdr && !p->ofst;
+}
+
+/* is p at the end of file? */
+int piseof(P *p)
+{
+       return p->ofst == GSIZE(p->hdr);
+}
+
+/* is p at the end of line? */
+int piseol(P *p)
+{
+       int c;
+
+       if (piseof(p))
+               return 1;
+       c = brc(p);
+       if (c == '\n')
+               return 1;
+       if (p->b->o.crlf)
+               if (c == '\r') {
+                       P *q = pdup(p);
+
+                       pfwrd(q, 1L);
+                       if (pgetb(q) == '\n') {
+                               prm(q);
+                               return 1;
+                       } else
+                               prm(q);
+               }
+       return 0;
+}
+
+/* is p at the beginning of line? */
+int pisbol(P *p)
+{
+       int c;
+
+       if (pisbof(p))
+               return 1;
+       c = prgetb(p);
+       pgetb(p);
+       return c == '\n';
+}
+
+/* is p at the beginning of word? */
+int pisbow(P *p)
+{
+       P *q = pdup(p);
+       int c = brc(p);
+       int d = prgetc(q);
+
+       prm(q);
+       if (joe_isalnum_(p->b->o.charmap,c) && (!joe_isalnum_(p->b->o.charmap,d) || pisbof(p)))
+               return 1;
+       else
+               return 0;
+}
+
+/* is p at the end of word? */
+int piseow(P *p)
+{
+       P *q = pdup(p);
+       int d = brc(q);
+       int c = prgetc(q);
+
+       prm(q);
+       if (joe_isalnum_(p->b->o.charmap,c) && (!joe_isalnum_(p->b->o.charmap,d) || piseof(p)))
+               return 1;
+       else
+               return 0;
+}
+
+/* is p on the blank line (ie. full of spaces/tabs)? */
+int pisblank(P *p)
+{
+       P *q = pdup(p);
+
+       p_goto_bol(q);
+       while (joe_isblank(p->b->o.charmap,brc(q)))
+               pgetb(q);
+       if (piseol(q)) {
+               prm(q);
+               return 1;
+       } else {
+               prm(q);
+               return 0;
+       }
+}
+
+/* is p at end of line or spaces followed by end of line? */
+int piseolblank(P *p)
+{
+       P *q = pdup(p);
+
+       while (joe_isblank(p->b->o.charmap,brc(q)))
+               pgetb(q);
+       if (piseol(q)) {
+               prm(q);
+               return 1;
+       } else {
+               prm(q);
+               return 0;
+       }
+}
+
+/* return column of first nonblank character */
+long pisindent(P *p)
+{
+       P *q = pdup(p);
+       long col;
+
+       p_goto_bol(q);
+       while (joe_isblank(p->b->o.charmap,brc(q)))
+               pgetc(q);
+       col = q->col;
+       prm(q);
+       return col;
+}
+
+/* return true if all characters to left of cursor match c */
+
+int pispure(P *p,int c)
+{
+       P *q = pdup(p);
+       p_goto_bol(q);
+       while (q->byte!=p->byte)
+               if (pgetc(q)!=c) {
+                       prm(q);
+                       return 0;
+                }
+       prm(q);
+       return 1;
+}
+
+int pnext(P *p)
+{
+       if (p->hdr == p->b->eof->hdr) {
+               p->ofst = GSIZE(p->hdr);
+               return 0;
+       }
+       p->hdr = p->hdr->link.next;
+       p->ofst = 0;
+       vunlock(p->ptr);
+       p->ptr = vlock(vmem, p->hdr->seg);
+       return 1;
+}
+
+int pprev(P *p)
+{
+       if (p->hdr == p->b->bof->hdr) {
+               p->ofst = 0;
+               return 0;
+       }
+       p->hdr = p->hdr->link.prev;
+       p->ofst = GSIZE(p->hdr);
+       vunlock(p->ptr);
+       p->ptr = vlock(vmem, p->hdr->seg);
+       return 1;
+}
+
+/* return current byte and move p to the next byte.  column will be unchanged. */
+int pgetb(P *p)
+{
+       unsigned char c;
+
+       if (p->ofst == GSIZE(p->hdr))
+               return NO_MORE_DATA;
+       c = GCHAR(p);
+       if (++p->ofst == GSIZE(p->hdr))
+               pnext(p);
+       ++p->byte;
+       if (c == '\n') {
+               ++(p->line);
+               p->col = 0;
+               p->valcol = 1;
+       } else if (p->b->o.crlf && c == '\r') {
+               if (brc(p) == '\n')
+                       return pgetb(p);
+               else
+                       p->valcol = 0;
+       } else {
+               p->valcol = 0;
+       }
+       return c;
+}
+
+/* return current character and move p to the next character.  column will be updated if it was valid. */
+int pgetc(P *p)
+{
+       if (p->b->o.charmap->type) {
+               int val, c, d, n, wid;
+               /* int m, oc; */
+
+               val = p->valcol;        /* Remember if column number was valid */
+               c = pgetb(p);           /* Get first byte */
+               /* oc = c; */
+
+               if (c==NO_MORE_DATA)
+                       return c;
+
+               if ((c&0xE0)==0xC0) { /* Two bytes */
+                       n = 1;
+                       c &= 0x1F;
+               } else if ((c&0xF0)==0xE0) { /* Three bytes */
+                       n = 2;
+                       c &= 0x0F;
+               } else if ((c&0xF8)==0xF0) { /* Four bytes */
+                       n = 3;
+                       c &= 0x07;
+               } else if ((c&0xFC)==0xF8) { /* Five bytes */
+                       n = 4;
+                       c &= 0x03;
+               } else if ((c&0xFE)==0xFC) { /* Six bytes */
+                       n = 5;
+                       c &= 0x01;
+               } else if ((c&0x80)==0x00) { /* One byte */
+                       n = 0;
+               } else { /* 128-191, 254, 255: Not a valid UTF-8 start character */
+                       n = 0;
+                       c = 0x1000FFFE;
+                       /* c -= 384; */
+               }
+
+               /* m = n; */
+
+               if (n) {
+                       while (n) {
+                               d = brc(p);
+                               if (d == NO_MORE_DATA || (d&0xC0)!=0x80)
+                                       break;
+                               pgetb(p);
+                               c = ((c<<6)|(d&0x3F));
+                               --n;
+                       }
+                       if (n) { /* FIXME: there was a bad UTF-8 sequence */
+                               /* How to represent this? */
+                               /* pbkwd(p,m-n);
+                               c = oc - 384; */
+                               c = d == NO_MORE_DATA ? 0x1000FFFF : 0x1000FFFE;
+                               wid = 1;
+                       } else if (val)
+                               wid = joe_wcwidth(1,c);
+               } else {
+                       wid = 1;
+               }
+
+               if (val) { /* Update column no. if it was valid to start with */
+                       p->valcol = 1;
+                       if (c=='\t')
+                               p->col += (p->b->o.tab) - (p->col) % (p->b->o.tab);
+                       else if (c=='\n')
+                               p->col = 0;
+                       else
+                               p->col += wid;
+               }
+
+               return c;
+       } else {
+               unsigned char c;
+
+               if (p->ofst == GSIZE(p->hdr))
+                       return NO_MORE_DATA;
+               c = GCHAR(p);
+               if (++p->ofst == GSIZE(p->hdr))
+                       pnext(p);
+               ++p->byte;
+
+               if (c == '\n') {
+                       ++(p->line);
+                       p->col = 0;
+                       p->valcol = 1;
+               } else if (p->b->o.crlf && c == '\r') {
+                       if (brc(p) == '\n')
+                               return pgetc(p);
+                       else
+                               ++p->col;
+               } else {
+                       if (c == '\t')
+                               p->col += (p->b->o.tab) - (p->col) % (p->b->o.tab);
+                       else
+                               ++(p->col);
+               }
+               return c;
+       }
+}
+
+/* move p n characters forward */
+P *pfwrd(P *p, long n)
+{
+       if (!n)
+               return p;
+       p->valcol = 0;
+       do {
+               if (p->ofst == GSIZE(p->hdr))
+                       do {
+                               if (!p->ofst) {
+                                       p->byte += GSIZE(p->hdr);
+                                       n -= GSIZE(p->hdr);
+                                       p->line += p->hdr->nlines;
+                               }
+                               if (!pnext(p))
+                                       return NULL;
+                       } while (n > GSIZE(p->hdr));
+               if (GCHAR(p) == '\n')
+                       ++p->line;
+               ++p->byte;
+               ++p->ofst;
+       } while (--n);
+       if (p->ofst == GSIZE(p->hdr))
+               pnext(p);
+       return p;
+}
+
+/* move p to the previous byte: does not take into account -crlf mode */
+static int prgetb1(P *p)
+{
+       unsigned char c;
+
+       if (!p->ofst)
+               if (!pprev(p))
+                       return NO_MORE_DATA;
+       --p->ofst;
+       c = GCHAR(p);
+       --p->byte;
+       p->valcol = 0;
+       if (c == '\n')
+               --p->line;
+       return c;
+}
+
+/* move p to the previous byte */
+int prgetb(P *p)
+{
+       int c = prgetb1(p);
+
+       if (p->b->o.crlf && c == '\n') {
+               c = prgetb1(p);
+               if (c == '\r')
+                       return '\n';
+               if (c != NO_MORE_DATA)
+                       pgetb(p);
+               c = '\n';
+       }
+       return c;
+}
+
+/* move p to the previous character (try to keep col updated) */
+int prgetc(P *p)
+{
+       if (p->b->o.charmap->type) {
+
+               if (pisbol(p))
+                       return prgetb(p);
+               else {
+                       P *q = pdup(p);
+                       P *r;
+                       p_goto_bol(q);
+                       r = pdup(q);
+                       while (q->byte<p->byte) {
+                               pset(r, q);
+                               pgetc(q);
+                       }
+                       pset(p,r);
+                       prm(r);
+                       prm(q);
+                       return brch(p);
+               }
+
+#if 0
+               int d = 0;
+               int c;
+               int n = 0;
+               int val = p->valcol;
+               for(;;) {
+                       c = prgetb(p);
+                       if (c == NO_MORE_DATA)
+                               return NO_MORE_DATA;
+                       else if ((c&0xC0)==0x80) {
+                               d |= ((c&0x3F)<<n);
+                               n += 6;
+                       } else if ((c&0x80)==0x00) { /* One char */
+                               d = c;
+                               break;
+                       } else if ((c&0xE0)==0xC0) { /* Two chars */
+                               d |= ((c&0x1F)<<n);
+                               break;
+                       } else if ((c&0xF0)==0xE0) { /* Three chars */
+                               d |= ((c&0x0F)<<n);
+                               break;
+                       } else if ((c&0xF8)==0xF0) { /* Four chars */
+                               d |= ((c&0x07)<<n);
+                               break;
+                       } else if ((c&0xFC)==0xF8) { /* Five chars */
+                               d |= ((c&0x03)<<n);
+                               break;
+                       } else if ((c&0xFE)==0xFC) { /* Six chars */
+                               d |= ((c&0x01)<<n);
+                               break;
+                       } else { /* FIXME: Invalid (0xFE or 0xFF found) */
+                               break;
+                       }
+               }
+
+               if (val && c!='\t' && c!='\n') {
+                       p->valcol = 1;
+                       p->col -= joe_wcwidth(1,d);
+               }
+               
+               return d;
+#endif
+       }
+       else {
+               return prgetb(p);
+       }
+}
+
+/* move p n characters backwards */
+P *pbkwd(P *p, long n)
+{
+       if (!n)
+               return p;
+       p->valcol = 0;
+       do {
+               if (!p->ofst)
+                       do {
+                               if (p->ofst) {
+                                       p->byte -= p->ofst;
+                                       n -= p->ofst;
+                                       p->line -= p->hdr->nlines;
+                               }
+                               if (!pprev(p))
+                                       return NULL;
+                       } while (n > GSIZE(p->hdr));
+               --p->ofst;
+               --p->byte;
+               if (GCHAR(p) == '\n')
+                       --p->line;
+       } while (--n);
+       return p;
+}
+
+/* move p n characters forwards/backwards according to loc */
+P *pgoto(P *p, long loc)
+{
+       if (loc > p->byte)
+               pfwrd(p, loc - p->byte);
+       else if (loc < p->byte)
+               pbkwd(p, p->byte - loc);
+       return p;
+}
+
+/* make p->col valid */
+P *pfcol(P *p)
+{
+       long pos = p->byte;
+
+       p_goto_bol(p);
+       while (p->byte < pos)
+               pgetc(p);
+       return p;
+}
+
+/* move p to the beginning of line */
+P *p_goto_bol(P *p)
+{
+       if (pprevl(p))
+               pgetb(p);
+       p->col = 0;
+       p->valcol = 1;
+       return p;
+}
+
+/* move p to the indentation point */
+P *p_goto_indent(P *p, int c)
+{
+       int d;
+       p_goto_bol(p);
+       while ((d=brc(p)), d==c || ((c==' ' || c=='\t') && (d==' ' || d=='\t')))
+               pgetc(p);
+       return p;
+}
+
+/* move p to the end of line */
+P *p_goto_eol(P *p)
+{
+       if (p->b->o.crlf || p->b->o.charmap->type)
+               while (!piseol(p))
+                       pgetc(p);
+       else
+               while (p->ofst != GSIZE(p->hdr)) {
+                       unsigned char c;
+
+                       c = GCHAR(p);
+                       if (c == '\n')
+                               break;
+                       else {
+                               ++p->byte;
+                               ++p->ofst;
+                               if (c == '\t')
+                                       p->col += p->b->o.tab - p->col % p->b->o.tab;
+                               else
+                                       ++p->col;
+                               if (p->ofst == GSIZE(p->hdr))
+                                       pnext(p);
+                       }
+               }
+       return p;
+}
+
+/* move p to the beginning of next line */
+P *pnextl(P *p)
+{
+       int c;
+
+       do {
+               if (p->ofst == GSIZE(p->hdr))
+                       do {
+                               p->byte += GSIZE(p->hdr) - p->ofst;
+                               if (!pnext(p))
+                                       return NULL;
+                       } while (!p->hdr->nlines);
+               c = GCHAR(p);
+               ++p->byte;
+               ++p->ofst;
+       } while (c != '\n');
+       ++p->line;
+       p->col = 0;
+       p->valcol = 1;
+       if (p->ofst == GSIZE(p->hdr))
+               pnext(p);
+       return p;
+}
+
+/* move p to the end of previous line */
+P *pprevl(P *p)
+{
+       int c;
+
+       p->valcol = 0;
+       do {
+               if (!p->ofst)
+                       do {
+                               p->byte -= p->ofst;
+                               if (!pprev(p))
+                                       return NULL;
+                       } while (!p->hdr->nlines);
+               --p->ofst;
+               --p->byte;
+               c = GCHAR(p);
+       } while (c != '\n');
+       --p->line;
+       if (p->b->o.crlf && c == '\n') {
+               int k = prgetb1(p);
+
+               if (k != '\r' && k != NO_MORE_DATA)
+                       pgetb(p);
+       }
+       return p;
+}
+
+/* move p to the given 'line' line */
+P *pline(P *p, long line)
+{
+       if (line > p->b->eof->line) {
+               pset(p, p->b->eof);
+               return p;
+       }
+       if (line < labs(p->line - line))
+               pset(p, p->b->bof);
+       if (labs(p->b->eof->line - line) < labs(p->line - line))
+               pset(p, p->b->eof);
+       if (p->line == line) {
+               p_goto_bol(p);
+               return p;
+       }
+       while (line > p->line)
+               pnextl(p);
+       if (line < p->line) {
+               while (line < p->line)
+                       pprevl(p);
+               p_goto_bol(p);
+       }
+       return p;
+}
+
+/* move p to the given 'goalcol' column */
+/* lands at exact column or on character which would cause us to go past goalcol */
+P *pcol(P *p, long goalcol)
+{
+       p_goto_bol(p);
+       if(p->b->o.charmap->type) {
+               do {
+                       int c;
+                       int wid;
+
+                       c = brch(p);
+
+                       if (c == NO_MORE_DATA)
+                               break;
+
+                       if (c == '\n')
+                               break;
+
+                       if (p->b->o.crlf && c == '\r' && piseol(p))
+                               break;
+
+                       if (c == '\t')
+                               wid = p->b->o.tab - p->col % p->b->o.tab;
+                       else
+                               wid = joe_wcwidth(1,c);
+
+                       if (p->col + wid > goalcol)
+                               break;
+
+                       pgetc(p);
+               } while (p->col != goalcol);
+       } else {
+               do {
+                       unsigned char c;
+                       int wid;
+
+                       if (p->ofst == GSIZE(p->hdr))
+                               break;
+                       c = GCHAR(p);
+                       if (c == '\n')
+                               break;
+                       if (p->b->o.crlf && c == '\r' && piseol(p))
+                               break;
+                       if (c == '\t')
+                               wid = p->b->o.tab - p->col % p->b->o.tab;
+                       else
+                               wid = 1;
+                       if (p->col + wid > goalcol)
+                               break;
+                       if (++p->ofst == GSIZE(p->hdr))
+                               pnext(p);
+                       ++p->byte;
+                       p->col += wid;
+               } while (p->col != goalcol);
+       }
+       return p;
+}
+
+/* Move to goal column, then skip backwards to just after first non-whitespace character */
+P *pcolwse(P *p, long goalcol)
+{
+       int c;
+
+       pcol(p, goalcol);
+       do {
+               c = prgetc(p);
+       } while (c == ' ' || c == '\t');
+       if (c != NO_MORE_DATA)
+               pgetc(p);
+       return p;
+}
+
+/* Move p to goalcol: stops after first character which equals or exceeds goal col (unlike
+   pcol() which will stops before character which would exceed goal col) */
+P *pcoli(P *p, long goalcol)
+{
+       p_goto_bol(p);
+       if (p->b->o.charmap->type) {
+               while (p->col < goalcol) {
+                       int c;
+                       c = brc(p);
+
+                       if (c == NO_MORE_DATA)
+                               break;
+
+                       if (c == '\n')
+                               break;
+
+                       if (p->b->o.crlf && c=='\r' && piseol(p))
+                               break;
+
+                       pgetc(p);
+               }
+       } else {
+               while (p->col < goalcol) {
+                       unsigned char c;
+
+                       if (p->ofst == GSIZE(p->hdr))
+                               break;
+                       c = GCHAR(p);
+                       if (c == '\n')
+                               break;
+
+                       if (p->b->o.crlf && c == '\r' && piseol(p))
+                               break;
+
+                       if (c == '\t')
+                               p->col += p->b->o.tab - p->col % p->b->o.tab;
+                       else
+                               ++p->col;
+                       if (++p->ofst == GSIZE(p->hdr))
+                               pnext(p);
+                       ++p->byte;
+               }
+       }
+       return p;
+}
+
+/* fill space between curent column and 'to' column with tabs/spaces */
+void pfill(P *p, long to, int usetabs)
+{
+       if (usetabs=='\t')
+               while (piscol(p) < to)
+                       if (p->col + p->b->o.tab - p->col % p->b->o.tab <= to) {
+                               binsc(p, '\t');
+                               pgetc(p);
+                       } else {
+                               binsc(p, ' ');
+                               pgetc(p);
+                       }
+       else
+               while (piscol(p) < to) {
+                       binsc(p, usetabs);
+                       pgetc(p);
+               }
+}
+
+/* delete sequence of whitespaces - backwards */
+void pbackws(P *p)
+{
+       int c;
+       P *q = pdup(p);
+
+       do {
+               c = prgetc(q);
+       } while (c == ' ' || c == '\t');
+       if (c != NO_MORE_DATA)
+               pgetc(q);
+       bdel(q, p);
+       prm(q);
+}
+
+static int frgetc(P *p)
+{
+       if (!p->ofst)
+               pprev(p);
+       --p->ofst;
+       return GCHAR(p);
+}
+
+static void ffwrd(P *p, int n)
+{
+       while (n > GSIZE(p->hdr) - p->ofst) {
+               n -= GSIZE(p->hdr) - p->ofst;
+               if (!pnext(p))
+                       return;
+       }
+       if ((p->ofst += n) == GSIZE(p->hdr))
+               pnext(p);
+}
+
+/* forward find pattern 's' in text pointed by 'p' (Boyer-Moore algorithm) */
+static P *ffind(P *p, unsigned char *s, int len)
+{
+       long amnt = p->b->eof->byte - p->byte;
+       int x;
+       unsigned char table[256], c;
+
+       if (len > amnt)
+               return NULL;
+       if (!len)
+               return p;
+       p->valcol = 0;
+       mset(table, 255, 256);
+       for (x = 0; x != len - 1; ++x)
+               table[s[x]] = x;
+       ffwrd(p, len);
+       amnt -= len;
+       x = len;
+       do {
+               if ((c = frgetc(p)) != s[--x]) {
+                       if (table[c] == 255) {
+                               ffwrd(p, len + 1);
+                               amnt -= x + 1;
+                       } else if (x <= table[c]) {
+                               ffwrd(p, len - x + 1);
+                               --amnt;
+                       } else {
+                               ffwrd(p, len - table[c]);
+                               amnt -= x - table[c];
+                       }
+                       if (amnt < 0)
+                               return NULL;
+                       else
+                               x = len;
+               }
+       } while (x);
+       return p;
+}
+
+/* forward find (case insensitive) pattern 's' in text pointed by 'p' (Boyer-Moore algorithm) */
+static P *fifind(P *p, unsigned char *s, int len)
+{
+       long amnt = p->b->eof->byte - p->byte;
+       int x;
+       struct charmap *map = p->b->o.charmap;
+       unsigned char table[256], c;
+
+       if (len > amnt)
+               return NULL;
+       if (!len)
+               return p;
+       p->valcol = 0;
+       mset(table, 255, 256);
+       for (x = 0; x != len - 1; ++x)
+               table[s[x]] = x;
+       ffwrd(p, len);
+       amnt -= len;
+       x = len;
+       do {
+               if ((c = joe_tolower(map,frgetc(p))) != s[--x]) {
+                       if (table[c] == 255) {
+                               ffwrd(p, len + 1);
+                               amnt -= x + 1;
+                       } else if (x <= table[c]) {
+                               ffwrd(p, len - x + 1);
+                               --amnt;
+                       } else {
+                               ffwrd(p, len - table[c]);
+                               amnt -= x - table[c];
+                       }
+                       if (amnt < 0)
+                               return NULL;
+                       else
+                               x = len;
+               }
+       } while (x);
+       return p;
+}
+
+/* move cursor p to q's position and set p's col, line, ofst, byte etc. accordingly */
+/* same as rgetto() but p is before q */
+static P *getto(P *p, P *q)
+{
+       while (p->hdr != q->hdr || p->ofst != q->ofst) {
+               if (GCHAR(p) == '\n')
+                       ++p->line;
+               ++p->byte;
+               ++p->ofst;
+               if (p->ofst == GSIZE(p->hdr))
+                       pnext(p);
+               while (!p->ofst && p->hdr != q->hdr) {
+                       p->byte += GSIZE(p->hdr);
+                       p->line += p->hdr->nlines;
+                       pnext(p);
+               }
+       }
+       return p;
+}
+
+/* find forward substring s in text pointed by p and set p after found substring */
+P *pfind(P *p, unsigned char *s, int len)
+{
+       P *q = pdup(p);
+
+       if (ffind(q, s, len)) {
+               getto(p, q);
+               prm(q);
+               return p;
+       } else {
+               prm(q);
+               return NULL;
+       }
+}
+
+/* same as pfind() but case insensitive */
+P *pifind(P *p, unsigned char *s, int len)
+{
+       P *q = pdup(p);
+
+       if (fifind(q, s, len)) {
+               getto(p, q);
+               prm(q);
+               return p;
+       } else {
+               prm(q);
+               return NULL;
+       }
+}
+
+static void fbkwd(P *p, int n)
+{
+       while (n > p->ofst) {
+               n -= p->ofst;
+               if (!pprev(p))
+                       return;
+       }
+       if (p->ofst >= n)
+               p->ofst -= n;
+       else
+               p->ofst = 0;
+}
+
+static int fpgetc(P *p)
+{
+       int c;
+
+       if (p->ofst == GSIZE(p->hdr))
+               return NO_MORE_DATA;
+       c = GCHAR(p);
+       if (++p->ofst == GSIZE(p->hdr))
+               pnext(p);
+       return c;
+}
+
+/* backward find pattern 's' in text pointed by 'p' (Boyer-Moore algorithm) */
+static P *frfind(P *p, unsigned char *s, int len)
+{
+       long amnt = p->byte;
+       int x;
+       unsigned char table[256], c;
+
+       if (len > p->b->eof->byte - p->byte) {
+               x = len - (p->b->eof->byte - p->byte);
+               if (amnt < x)
+                       return NULL;
+               amnt -= x;
+               fbkwd(p, x);
+       }
+       if (!len)
+               return p;
+       p->valcol = 0;
+       mset(table, 255, 256);
+       for (x = len; --x; table[s[x]] = len - x - 1) ;
+       x = 0;
+       do {
+               if ((c = fpgetc(p)) != s[x++]) {
+                       if (table[c] == 255) {
+                               fbkwd(p, len + 1);
+                               amnt -= len - x + 1;
+                       } else if (len - table[c] <= x) {
+                               fbkwd(p, x + 1);
+                               --amnt;
+                       } else {
+                               fbkwd(p, len - table[c]);
+                               amnt -= len - table[c] - x;
+                       }
+                       if (amnt < 0)
+                               return NULL;
+                       else
+                               x = 0;
+               }
+       } while (x != len);
+       fbkwd(p, len);
+       return p;
+}
+
+/* backward find (case insensitive) pattern 's' in text pointed by 'p' (Boyer-Moore algorithm) */
+static P *frifind(P *p, unsigned char *s, int len)
+{
+       long amnt = p->byte;
+       int x;
+       unsigned char table[256], c;
+       struct charmap *map = p->b->o.charmap;
+
+       if (len > p->b->eof->byte - p->byte) {
+               x = len - (p->b->eof->byte - p->byte);
+               if (amnt < x)
+                       return NULL;
+               amnt -= x;
+               fbkwd(p, x);
+       }
+       if (!len)
+               return p;
+       p->valcol = 0;
+       mset(table, 255, 256);
+       for (x = len; --x; table[s[x]] = len - x - 1) ;
+       x = 0;
+       do {
+               if ((c = joe_tolower(map,fpgetc(p))) != s[x++]) {
+                       if (table[c] == 255) {
+                               fbkwd(p, len + 1);
+                               amnt -= len - x + 1;
+                       } else if (len - table[c] <= x) {
+                               fbkwd(p, x + 1);
+                               --amnt;
+                       } else {
+                               fbkwd(p, len - table[c]);
+                               amnt -= len - table[c] - x;
+                       }
+                       if (amnt < 0)
+                               return NULL;
+                       else
+                               x = 0;
+               }
+       } while (x != len);
+       fbkwd(p, len);
+       return p;
+}
+
+/* move cursor p to q's position and set p's col, line, ofst, byte etc. accordingly */
+/* same as getto() but q is before p */
+static P *rgetto(P *p, P *q)
+{
+       while (p->hdr != q->hdr || p->ofst != q->ofst) {
+               if (!p->ofst)
+                       do {
+                               if (p->ofst) {
+                                       p->byte -= p->ofst;
+                                       p->line -= p->hdr->nlines;
+                               }
+                               pprev(p);
+                       } while (p->hdr != q->hdr);
+               --p->ofst;
+               --p->byte;
+               if (GCHAR(p) == '\n')
+                       --p->line;
+       }
+       return p;
+}
+
+/* find backward substring s in text pointed by p and set p on the first of found substring */
+P *prfind(P *p, unsigned char *s, int len)
+{
+       P *q = pdup(p);
+
+       if (frfind(q, s, len)) {
+               rgetto(p, q);
+               prm(q);
+               return p;
+       } else {
+               prm(q);
+               return NULL;
+       }
+}
+
+/* same as prfind() but case insensitive */
+P *prifind(P *p, unsigned char *s, int len)
+{
+       P *q = pdup(p);
+
+       if (frifind(q, s, len)) {
+               rgetto(p, q);
+               prm(q);
+               return p;
+       } else {
+               prm(q);
+               return NULL;
+       }
+}
+
+/* copy text between 'from' and 'to' into new buffer */
+B *bcpy(P *from, P *to)
+{
+       H anchor, *l;
+       unsigned char *ptr;
+       P *q;
+
+       if (from->byte >= to->byte)
+               return bmk(from->b);
+
+       q = pdup(from);
+       izque(H, link, &anchor);
+
+       if (q->hdr == to->hdr) {
+               l = halloc();
+               ptr = vlock(vmem, l->seg);
+               if (q->ofst != q->hdr->hole)
+                       gstgap(q->hdr, q->ptr, q->ofst);
+               l->nlines = mcnt(q->ptr + q->hdr->ehole, '\n', l->hole = to->ofst - q->ofst);
+               mmove(ptr, q->ptr + q->hdr->ehole, l->hole);
+               vchanged(ptr);
+               vunlock(ptr);
+               enqueb(H, link, &anchor, l);
+       } else {
+               l = halloc();
+               ptr = vlock(vmem, l->seg);
+               if (q->ofst != q->hdr->hole)
+                       gstgap(q->hdr, q->ptr, q->ofst);
+               l->nlines = mcnt(q->ptr + q->hdr->ehole, '\n', l->hole = SEGSIZ - q->hdr->ehole);
+               mmove(ptr, q->ptr + q->hdr->ehole, l->hole);
+               vchanged(ptr);
+               vunlock(ptr);
+               enqueb(H, link, &anchor, l);
+               pnext(q);
+               while (q->hdr != to->hdr) {
+                       l = halloc();
+                       ptr = vlock(vmem, l->seg);
+                       l->nlines = q->hdr->nlines;
+                       mmove(ptr, q->ptr, q->hdr->hole);
+                       mmove(ptr + q->hdr->hole, q->ptr + q->hdr->ehole, SEGSIZ - q->hdr->ehole);
+                       l->hole = GSIZE(q->hdr);
+                       vchanged(ptr);
+                       vunlock(ptr);
+                       enqueb(H, link, &anchor, l);
+                       pnext(q);
+               }
+               if (to->ofst) {
+                       l = halloc();
+                       ptr = vlock(vmem, l->seg);
+                       if (to->ofst != to->hdr->hole)
+                               gstgap(to->hdr, to->ptr, to->ofst);
+                       l->nlines = mcnt(to->ptr, '\n', to->ofst);
+                       mmove(ptr, to->ptr, l->hole = to->ofst);
+                       vchanged(ptr);
+                       vunlock(ptr);
+                       enqueb(H, link, &anchor, l);
+               }
+       }
+
+       l = anchor.link.next;
+       deque(H, link, &anchor);
+       prm(q);
+
+       return bmkchn(l, from->b, to->byte - from->byte, to->line - from->line);
+}
+
+/* Coalesce small blocks into a single larger one */
+void pcoalesce(P *p)
+{
+       if (p->hdr != p->b->eof->hdr && GSIZE(p->hdr) + GSIZE(p->hdr->link.next) <= SEGSIZ - SEGSIZ / 4) {
+               H *hdr = p->hdr->link.next;
+               unsigned char *ptr = vlock(vmem, hdr->seg);
+               int osize = GSIZE(p->hdr);
+               int size = GSIZE(hdr);
+               P *q;
+
+               gstgap(hdr, ptr, size);
+               ginsm(p->hdr, p->ptr, GSIZE(p->hdr), ptr, size);
+               p->hdr->nlines += hdr->nlines;
+               vunlock(ptr);
+               hfree(deque_f(H, link, hdr));
+               for (q = p->link.next; q != p; q = q->link.next)
+                       if (q->hdr == hdr) {
+                               q->hdr = p->hdr;
+                               if (q->ptr) {
+                                       vunlock(q->ptr);
+                                       q->ptr = vlock(vmem, q->hdr->seg);
+                               }
+                               q->ofst += osize;
+                       }
+       }
+       if (p->hdr != p->b->bof->hdr && GSIZE(p->hdr) + GSIZE(p->hdr->link.prev) <= SEGSIZ - SEGSIZ / 4) {
+               H *hdr = p->hdr->link.prev;
+               unsigned char *ptr = vlock(vmem, hdr->seg);
+               int size = GSIZE(hdr);
+               P *q;
+
+               gstgap(hdr, ptr, size);
+               ginsm(p->hdr, p->ptr, 0, ptr, size);
+               p->hdr->nlines += hdr->nlines;
+               vunlock(ptr);
+               hfree(deque_f(H, link, hdr));
+               p->ofst += size;
+               for (q = p->link.next; q != p; q = q->link.next)
+                       if (q->hdr == hdr) {
+                               q->hdr = p->hdr;
+                               if (q->ptr)
+                                       vunlock(q->ptr);
+                               q->ptr = vlock(vmem, q->hdr->seg);
+                       } else if (q->hdr == p->hdr)
+                               q->ofst += size;
+       }
+}
+
+/* Delete the text between two pointers from a buffer and return it in a new
+ * buffer.
+ *
+ * This routine calls these functions:
+ *  gstgap     - to position gaps
+ *  halloc     - to allocate new header/segment pairs
+ *  vlock      - virtual memory routines
+ *  vunlock
+ *  vchanged
+ *  vupcount
+ *  mcnt       - to count NLs
+ *  snip       - queue routines
+ *  enqueb
+ *  splicef
+ *  scrdel     - to tell screen update to scroll when NLs are deleted
+ *  bmkchn     - to make a buffer out of a chain
+ */
+
+/* This is only to be used for bdel() */
+static B *bcut(P *from, P *to)
+{
+       H *h,                   /* The deleted text */
+       *i;
+       unsigned char *ptr;
+       P *p;
+       long nlines;            /* No. EOLs to delete */
+       long amnt;              /* No. bytes to delete */
+       int toamnt;             /* Amount to delete from segment in 'to' */
+       int bofmove = 0;        /* Set if bof got deleted */
+
+       if (!(amnt = to->byte - from->byte))
+               return NULL;    /* ...nothing to delete */
+
+       nlines = to->line - from->line;
+
+       if (from->hdr == to->hdr) {     /* Delete is within a single segment */
+               /* Move gap to deletion point */
+               if (from->ofst != from->hdr->hole)
+                       gstgap(from->hdr, from->ptr, from->ofst);
+
+               /* Store the deleted text */
+               h = halloc();
+               ptr = vlock(vmem, h->seg);
+               mmove(ptr, from->ptr + from->hdr->ehole, (int) amnt);
+               h->hole = amnt;
+               h->nlines = nlines;
+               vchanged(ptr);
+               vunlock(ptr);
+
+               /* Delete */
+               from->hdr->ehole += amnt;
+               from->hdr->nlines -= nlines;
+
+               toamnt = amnt;
+       } else {                /* Delete crosses segments */
+               H *a;
+
+               if ((toamnt = to->ofst) != 0) {
+                       /* Delete beginning of to */
+                       /* Move gap to deletion point */
+                       /* To could be deleted if it's at the end of the file */
+                       if (to->ofst != to->hdr->hole)
+                               gstgap(to->hdr, to->ptr, to->ofst);
+
+                       /* Save deleted text */
+                       i = halloc();
+                       ptr = vlock(vmem, i->seg);
+                       mmove(ptr, to->ptr, to->hdr->hole);
+                       i->hole = to->hdr->hole;
+                       i->nlines = mcnt(to->ptr, '\n', to->hdr->hole);
+                       vchanged(ptr);
+                       vunlock(ptr);
+
+                       /* Delete */
+                       to->hdr->nlines -= i->nlines;
+                       to->hdr->hole = 0;
+               } else
+                       i = 0;
+
+               /* Delete end of from */
+               if (!from->ofst) {
+                       /* ... unless from needs to be deleted too */
+                       a = from->hdr->link.prev;
+                       h = NULL;
+                       if (a == from->b->eof->hdr)
+                               bofmove = 1;
+               } else {
+                       a = from->hdr;
+                       /* Move gap to deletion point */
+                       if (from->ofst != from->hdr->hole)
+                               gstgap(from->hdr, from->ptr, from->ofst);
+
+                       /* Save deleted text */
+                       h = halloc();
+                       ptr = vlock(vmem, h->seg);
+                       mmove(ptr, from->ptr + from->hdr->ehole, SEGSIZ - from->hdr->ehole);
+                       h->hole = SEGSIZ - from->hdr->ehole;
+                       h->nlines = mcnt(ptr, '\n', h->hole);
+                       vchanged(ptr);
+                       vunlock(ptr);
+
+                       /* Delete */
+                       from->hdr->nlines -= h->nlines;
+                       from->hdr->ehole = SEGSIZ;
+               }
+
+               /* Make from point to header/segment of to */
+               from->hdr = to->hdr;
+               vunlock(from->ptr);
+               from->ptr = to->ptr;
+               vupcount(to->ptr);
+               from->ofst = 0;
+
+               /* Delete headers/segments between a and to->hdr (if there are any) */
+               if (a->link.next != to->hdr)
+                       if (!h) {
+                               h = snip(H, link, a->link.next, to->hdr->link.prev);
+                               if (i)
+                                       enqueb(H, link, h, i);
+                       } else {
+                               splicef(H, link, h, snip(H, link, a->link.next, to->hdr->link.prev));
+                               if (i)
+                                       enqueb(H, link, h, i);
+               } else if (!h)
+                       h = i;
+               else if (i)
+                       enqueb(H, link, h, i);
+       }
+
+       /* If to is empty, then it must have been at the end of the file.  If
+          the file did not become empty, delete to */
+       if (!GSIZE(to->hdr) && from->byte) {
+               H *ph = from->hdr->link.prev;
+
+               hfree(deque_f(H, link, from->hdr));
+               vunlock(from->ptr);
+               from->hdr = ph;
+               from->ptr = vlock(vmem, from->hdr->seg);
+               from->ofst = GSIZE(ph);
+               vunlock(from->b->eof->ptr);
+               from->b->eof->ptr = from->ptr;
+               vupcount(from->ptr);
+               from->b->eof->hdr = from->hdr;
+               from->b->eof->ofst = from->ofst;
+       }
+
+       /* The deletion is now done */
+
+       /* Scroll if necessary */
+
+       if (bofmove)
+               pset(from->b->bof, from);
+       if (nlines && !pisbol(from)) {
+               scrdel(from->b, from->line, nlines, 1);
+               delerr(from->b->name, from->line, nlines);
+       } else {
+               scrdel(from->b, from->line, nlines, 0);
+               delerr(from->b->name, from->line, nlines);
+       }
+
+       /* Fix pointers */
+
+       for (p = from->link.next; p != from; p = p->link.next)
+               if (p->line == from->line && p->byte > from->byte)
+                       p->valcol = 0;
+       for (p = from->link.next; p != from; p = p->link.next) {
+               if (p->byte >= from->byte) {
+                       if (p->byte <= from->byte + amnt) {
+                               if (p->ptr) {
+                                       pset(p, from);
+                               } else {
+                                       poffline(pset(p, from));
+                               }
+                       } else {
+                               if (p->hdr == to->hdr)
+                                       p->ofst -= toamnt;
+                               p->byte -= amnt;
+                               p->line -= nlines;
+                       }
+               }
+       }
+
+       pcoalesce(from);
+
+       /* Make buffer out of deleted text and return it */
+       return bmkchn(h, from->b, amnt, nlines);
+}
+
+void bdel(P *from, P *to)
+{
+       if (to->byte - from->byte) {
+               B *b = bcut(from, to);
+
+               if (from->b->undo)
+                       undodel(from->b->undo, from->byte, b);
+               else
+                       brm(b);
+               from->b->changed = 1;
+       }
+}
+
+/* Split a block at p's ofst */
+/* p is placed in the new block such that it points to the same text but with
+ * p->ofst==0
+ */
+static void bsplit(P *p)
+{
+       if (p->ofst) {
+               H *hdr;
+               unsigned char *ptr;
+               P *pp;
+
+               hdr = halloc();
+               ptr = vlock(vmem, hdr->seg);
+
+               if (p->ofst != p->hdr->hole)
+                       gstgap(p->hdr, p->ptr, p->ofst);
+               mmove(ptr, p->ptr + p->hdr->ehole, SEGSIZ - p->hdr->ehole);
+               hdr->hole = SEGSIZ - p->hdr->ehole;
+               hdr->nlines = mcnt(ptr, '\n', hdr->hole);
+               p->hdr->nlines -= hdr->nlines;
+               vchanged(ptr);
+               p->hdr->ehole = SEGSIZ;
+
+               enquef(H, link, p->hdr, hdr);
+
+               vunlock(p->ptr);
+
+               for (pp = p->link.next; pp != p; pp = pp->link.next)
+                       if (pp->hdr == p->hdr && pp->ofst >= p->ofst) {
+                               pp->hdr = hdr;
+                               if (pp->ptr) {
+                                       vunlock(pp->ptr);
+                                       pp->ptr = ptr;
+                                       vupcount(ptr);
+                               }
+                               pp->ofst -= p->ofst;
+                       }
+
+               p->ptr = ptr;
+               p->hdr = hdr;
+               p->ofst = 0;
+       }
+}
+
+/* Make a chain out of a block of memory (the block must not be empty) */
+static H *bldchn(unsigned char *blk, int size, long *nlines)
+{
+       H anchor, *l;
+
+       *nlines = 0;
+       izque(H, link, &anchor);
+       do {
+               unsigned char *ptr;
+               int amnt;
+
+               ptr = vlock(vmem, (l = halloc())->seg);
+               if (size > SEGSIZ)
+                       amnt = SEGSIZ;
+               else
+                       amnt = size;
+               mmove(ptr, blk, amnt);
+               l->hole = amnt;
+               l->ehole = SEGSIZ;
+               (*nlines) += (l->nlines = mcnt(ptr, '\n', amnt));
+               vchanged(ptr);
+               vunlock(ptr);
+               enqueb(H, link, &anchor, l);
+               blk += amnt;
+               size -= amnt;
+       } while (size);
+       l = anchor.link.next;
+       deque(H, link, &anchor);
+       return l;
+}
+
+/* Insert a chain into a buffer (this does not update pointers) */
+static void inschn(P *p, H *a)
+{
+       if (!p->b->eof->byte) { /* P's buffer is empty: replace the empty segment in p with a */
+               hfree(p->hdr);
+               p->hdr = a;
+               vunlock(p->ptr);
+               p->ptr = vlock(vmem, a->seg);
+               pset(p->b->bof, p);
+
+               p->b->eof->hdr = a->link.prev;
+               vunlock(p->b->eof->ptr);
+               p->b->eof->ptr = vlock(vmem, p->b->eof->hdr->seg);
+               p->b->eof->ofst = GSIZE(p->b->eof->hdr);
+       } else if (piseof(p)) { /* We're at the end of the file: append a to the file */
+               p->b->eof->hdr = a->link.prev;
+               spliceb(H, link, p->b->bof->hdr, a);
+               vunlock(p->b->eof->ptr);
+               p->b->eof->ptr = vlock(vmem, p->b->eof->hdr->seg);
+               p->b->eof->ofst = GSIZE(p->b->eof->hdr);
+               p->hdr = a;
+               vunlock(p->ptr);
+               p->ptr = vlock(vmem, p->hdr->seg);
+               p->ofst = 0;
+       } else if (pisbof(p)) { /* We're at the beginning of the file: insert chain and set bof pointer */
+               p->hdr = spliceb_f(H, link, p->hdr, a);
+               vunlock(p->ptr);
+               p->ptr = vlock(vmem, a->seg);
+               pset(p->b->bof, p);
+       } else {                /* We're in the middle of the file: split and insert */
+               bsplit(p);
+               p->hdr = spliceb_f(H, link, p->hdr, a);
+               vunlock(p->ptr);
+               p->ptr = vlock(vmem, a->seg);
+       }
+}
+
+static void fixupins(P *p, long amnt, long nlines, H *hdr, int hdramnt)
+{
+       P *pp;
+
+       if (nlines && !pisbol(p))
+               scrins(p->b, p->line, nlines, 1);
+       else
+               scrins(p->b, p->line, nlines, 0);
+       inserr(p->b->name, p->line, nlines, pisbol(p)); /* FIXME: last arg ??? */
+
+       for (pp = p->link.next; pp != p; pp = pp->link.next)
+               if (pp->line == p->line && (pp->byte > p->byte || (pp->end && pp->byte == p->byte)))
+                       pp->valcol = 0;
+       for (pp = p->link.next; pp != p; pp = pp->link.next)
+               if (pp->byte == p->byte && !pp->end)
+                       if (pp->ptr)
+                               pset(pp, p);
+                       else
+                               poffline(pset(pp, p));
+               else if (pp->byte > p->byte || (pp->end && pp->byte == p->byte)) {
+                       pp->byte += amnt;
+                       pp->line += nlines;
+                       if (pp->hdr == hdr)
+                               pp->ofst += hdramnt;
+               }
+       if (p->b->undo)
+               undoins(p->b->undo, p, amnt);
+       p->b->changed = 1;
+}
+
+/* Insert a buffer at pointer position (the buffer goes away) */
+P *binsb(P *p, B *b)
+{
+       if (b->eof->byte) {
+               P *q = pdup(p);
+
+               inschn(q, b->bof->hdr);
+               b->eof->hdr = halloc();
+               fixupins(q, b->eof->byte, b->eof->line, NULL, 0);
+               pcoalesce(q);
+               prm(q);
+       }
+       brm(b);
+       return p;
+}
+
+/* insert memory block 'blk' at 'p' */
+P *binsm(P *p, unsigned char *blk, int amnt)
+{
+       long nlines;
+       H *h = NULL;
+       int hdramnt = 0;
+       P *q;
+
+       if (!amnt)
+               return p;
+       q = pdup(p);
+       if (amnt <= GGAPSZ(q->hdr)) {
+               h = q->hdr;
+               hdramnt = amnt;
+               ginsm(q->hdr, q->ptr, q->ofst, blk, amnt);
+               q->hdr->nlines += (nlines = mcnt(blk, '\n', amnt));
+       } else if (!q->ofst && q->hdr != q->b->bof->hdr && amnt <= GGAPSZ(q->hdr->link.prev)) {
+               pprev(q);
+               ginsm(q->hdr, q->ptr, q->ofst, blk, amnt);
+               q->hdr->nlines += (nlines = mcnt(blk, '\n', amnt));
+       } else {
+               H *a = bldchn(blk, amnt, &nlines);
+
+               inschn(q, a);
+       }
+       fixupins(q, (long) amnt, nlines, h, hdramnt);
+       pcoalesce(q);
+       prm(q);
+       return p;
+}
+
+/* insert byte 'c' at 'p' */
+P *binsbyte(P *p, unsigned char c)
+{
+       if (p->b->o.crlf && c == '\n')
+               return binsm(p, US "\r\n", 2);
+       else
+               return binsm(p, &c, 1);
+}
+
+/* UTF-8 encode a character and insert it */
+P *binsc(P *p, int c)
+{
+       if (c>127 && p->b->o.charmap->type) {
+               unsigned char buf[8];
+               int len = utf8_encode(buf,c);
+               return binsm(p,buf,len);
+       } else {
+               unsigned char ch = c;
+               if (p->b->o.crlf && c == '\n')
+                       return binsm(p, US "\r\n", 2);
+               else
+                       return binsm(p, &ch, 1);
+       }
+}
+
+/* insert zero-terminated string 's' at 'p' */
+P *binss(P *p, unsigned char *s)
+{
+       return binsm(p, s, strlen((char *)s));
+}
+
+/* Read 'size' bytes from file or stream.  Stops and returns amnt. read
+ * when requested size has been read or when end of file condition occurs.
+ * Returns with -2 in error for read error or 0 in error for success.
+ */
+static int bkread(int fi, unsigned char *buff, int size)
+{
+       int a, b;
+
+       if (!size) {
+               error = 0;
+               return 0;
+       }
+       for (a = b = 0; (a < size) && ((b = joe_read(fi, buff + a, size - a)) > 0); a += b) ;
+       if (b < 0)
+               error = -2;
+       else
+               error = 0;
+       return a;
+}
+
+/* Read up to 'max' bytes from a file into a buffer */
+/* Returns with 0 in error or -2 in error for read error */
+B *bread(int fi, long int max)
+{
+       H anchor, *l;
+       long lines = 0, total = 0;
+       int amnt;
+       unsigned char *seg;
+
+       izque(H, link, &anchor);
+       error = 0;
+       while (seg = vlock(vmem, (l = halloc())->seg), !error && (amnt = bkread(fi, seg, max >= SEGSIZ ? SEGSIZ : (int) max))) {
+               total += amnt;
+               max -= amnt;
+               l->hole = amnt;
+               lines += (l->nlines = mcnt(seg, '\n', amnt));
+               vchanged(seg);
+               vunlock(seg);
+               enqueb(H, link, &anchor, l);
+       }
+       hfree(l);
+       vunlock(seg);
+       if (!total)
+               return bmk(NULL);
+       l = anchor.link.next;
+       deque(H, link, &anchor);
+       return bmkchn(l, NULL, total, lines);
+}
+
+/* Parse file name.
+ *
+ * Removes ',xxx,yyy' from end of name and puts their value into skip and amnt
+ * Replaces ~user/ with directory of given user unless -DJOE_NOPWNAM
+ * Replaces ~/ with $HOME
+ *
+ * Returns new variable length string.
+ */
+unsigned char *parsens(unsigned char *s, long int *skip, long int *amnt)
+{
+       unsigned char *n = vsncpy(NULL, 0, sz(s));
+       int x;
+
+       *skip = 0;
+       *amnt = MAXLONG;
+       for (x = sLEN(n) - 1; x > 0 && ((n[x] >= '0' && n[x] <= '9') || n[x] == 'x' || n[x] == 'X'); --x) ;
+       if (n[x] == ',') {
+               n[x] = 0;
+               if (n[x + 1] == 'x' || n[x + 1] == 'X')
+                       sscanf((char *)(n + x + 2), "%lx", skip);
+               else if (n[x + 1] == '0' && (n[x + 2] == 'x' || n[x + 2] == 'X'))
+                       sscanf((char *)(n + x + 3), "%lx", skip);
+               else if (n[x + 1] == '0')
+                       sscanf((char *)(n + x + 1), "%lo", skip);
+               else
+                       sscanf((char *)(n + x + 1), "%ld", skip);
+               for (--x; x > 0 && ((n[x] >= '0' && n[x] <= '9') || n[x] == 'x' || n[x] == 'X'); --x) ;
+               if (n[x] == ',') {
+                       n[x] = 0;
+                       *amnt = *skip;
+                       if (n[x + 1] == 'x' || n[x + 1] == 'X')
+                               sscanf((char *)(n + x + 2), "%lx", skip);
+                       else if (n[x + 1] == '0' && (n[x + 2] == 'x' || n[x + 2] == 'X'))
+                               sscanf((char *)(n + x + 3), "%lx", skip);
+                       else if (n[x + 1] == '0')
+                               sscanf((char *)(n + x + 1), "%lo", skip);
+                       else
+                               sscanf((char *)(n + x + 1), "%ld", skip);
+               }
+       }
+#ifndef __MSDOS__
+       if (n[0] == '~') {
+               for (x = 1; n[x] && n[x] != '/'; ++x) ;
+               if (n[x] == '/') {
+                       if (x == 1) {
+                               unsigned char *z;
+
+                               s = (unsigned char *)getenv("HOME");
+                               z = vsncpy(NULL, 0, sz(s));
+                               z = vsncpy(z, sLEN(z), sz(n + x));
+                               vsrm(n);
+                               n = z;
+#ifndef JOE_NOPWNAM
+                       } else {
+                               struct passwd *passwd;
+
+                               n[x] = 0;
+                               passwd = getpwnam((char *)(n + 1));
+                               n[x] = '/';
+                               if (passwd) {
+                                       unsigned char *z = vsncpy(NULL, 0,
+                                                        sz((unsigned char *)(passwd->pw_dir)));
+
+                                       z = vsncpy(z, sLEN(z), sz(n + x));
+                                       vsrm(n);
+                                       n = z;
+                               }
+#endif
+                       }
+               }
+       }
+#endif
+       return n;
+}
+
+/* Load file into new buffer and return the new buffer */
+/* Returns with error set to 0 for success,
+ * -1 for new file (file doesn't exist)
+ * -2 for read error
+ * -3 for seek error
+ * -4 for open error
+ */
+B *bload(unsigned char *s)
+{
+       unsigned char buffer[SEGSIZ];
+       FILE *fi;
+       B *b = NULL;
+       long skip, amnt;
+       unsigned char *n;
+       int nowrite = 0;
+       P *p;
+       int x;
+       long mod_time = 0;
+       struct stat sbuf;
+
+       if (!s || !s[0]) {
+               error = -1;
+               b = bmk(NULL);
+               setopt(b,US "");
+               b->rdonly = b->o.readonly;
+               b->er = error;
+               return b;
+       }
+
+       n = parsens(s, &skip, &amnt);
+
+       /* Open file or stream */
+#ifndef __MSDOS__
+       if (n[0] == '!') {
+               nescape(maint->t);
+               ttclsn();
+               fi = popen((char *)(n + 1), "r");
+       } else
+#endif
+       if (!strcmp(n, "-"))
+               fi = stdin;
+       else {
+               fi = fopen((char *)n, "r+");
+               if (!fi)
+                       nowrite = 1;
+               else
+                       fclose(fi);
+               fi = fopen((char *)n, "r");
+               if (!fi)
+                       nowrite = 0;
+               if (fi) {
+                       fstat(fileno(fi),&sbuf);
+                       mod_time = sbuf.st_mtime;
+               }
+       }
+       joesep(n);
+
+       /* Abort if couldn't open */
+       if (!fi) {
+               if (errno == ENOENT)
+                       error = -1;
+               else
+                       error = -4;
+               b = bmk(NULL);
+               setopt(b,n);
+               b->rdonly = b->o.readonly;
+               goto opnerr;
+       }
+
+       /* Skip data if we need to */
+       if (skip && lseek(fileno(fi), skip, 0) < 0) {
+               int r;
+
+               while (skip > SEGSIZ) {
+                       r = bkread(fileno(fi), buffer, SEGSIZ);
+                       if (r != SEGSIZ || error) {
+                               error = -3;
+                               goto err;
+                       }
+                       skip -= SEGSIZ;
+               }
+               skip -= bkread(fileno(fi), buffer, (int) skip);
+               if (skip || error) {
+                       error = -3;
+                       goto err;
+               }
+       }
+
+       /* Read from stream into new buffer */
+       b = bread(fileno(fi), amnt);
+       b->mod_time = mod_time;
+       setopt(b,n);
+       b->rdonly = b->o.readonly;
+
+       /* Close stream */
+err:
+#ifndef __MSDOS__
+       if (s[0] == '!')
+               pclose(fi);
+       else
+#endif
+       if (strcmp(n, "-"))
+               fclose(fi);
+
+opnerr:
+       if (s[0] == '!') {
+               ttopnn();
+               nreturn(maint->t);
+       }
+
+       /* Set name */
+       b->name = joesep((unsigned char *)strdup(s));
+
+       /* Set flags */
+       if (error || s[0] == '!' || skip || amnt != MAXLONG) {
+               b->backup = 1;
+               b->changed = 0;
+       } else if (!strcmp(n, "-")) {
+               b->backup = 1;
+               b->changed = 1;
+       } else {
+               b->backup = 0;
+               b->changed = 0;
+       }
+       if (nowrite)
+               b->rdonly = b->o.readonly = 1;
+
+       /* If first line has CR-LF, assume MS-DOS file */
+       if (guesscrlf) {
+               p=pdup(b->bof);
+               b->o.crlf = 0;
+               for(x=0;x!=1024;++x) {
+                       int c = pgetc(p);
+                       if(c == '\r') {
+                               b->o.crlf = 1;
+                               break;
+                               }
+                       if(c == '\n') {
+                               b->o.crlf = 0;
+                               break;
+                               }
+                       if(c == NO_MORE_DATA)
+                               break;
+               }
+               prm(p);
+       }
+
+       /* Search backwards through file: if first indented line
+          is indented with a tab, assume indentc is tab */
+       if (guessindent) {
+               p=pdup(b->eof);
+               for (x=0; x!=20; ++x) {
+                       p_goto_bol(p);
+                       if (pisindent(p)) {
+                               if (brc(p)=='\t') {
+                                       b->o.indentc = '\t';
+                                       b->o.istep = 1;
+                               } else {
+                                       b->o.indentc = ' ';
+                                       b->o.istep = 2;
+                               }
+                               break;
+                       }
+                       if (prgetc(p)==NO_MORE_DATA)
+                               break;
+               }
+               prm(p);
+       }
+
+       /* Eliminate parsed name */
+       vsrm(n);
+
+       b->er = error;
+       return b;
+}
+
+/* Find already loaded buffer or load file into new buffer */
+B *bfind(unsigned char *s)
+{
+       B *b;
+
+       if (!s || !s[0]) {
+               error = -1;
+               b = bmk(NULL);
+               setopt(b,US "");
+               b->rdonly = b->o.readonly;
+               b->internal = 0;
+               b->er = error;
+               return b;
+       }
+       for (b = bufs.link.next; b != &bufs; b = b->link.next)
+               if (b->name && !strcmp(s, b->name)) {
+                       if (!b->orphan)
+                               ++b->count;
+                       else
+                               b->orphan = 0;
+                       error = 0;
+                       b->internal = 0;
+                       return b;
+               }
+       b = bload(s);
+       b->internal = 0;
+       return b;
+}
+
+/* Find already loaded buffer or load file into new buffer */
+B *bfind_scratch(unsigned char *s)
+{
+       B *b;
+
+       if (!s || !s[0]) {
+               error = -1;
+               b = bmk(NULL);
+               setopt(b,US "");
+               b->rdonly = b->o.readonly;
+               b->internal = 0;
+               b->er = error;
+               return b;
+       }
+       for (b = bufs.link.next; b != &bufs; b = b->link.next)
+               if (b->name && !strcmp(s, b->name)) {
+                       if (!b->orphan)
+                               ++b->count;
+                       else
+                               b->orphan = 0;
+                       error = 0;
+                       b->internal = 0;
+                       return b;
+               }
+       b = bmk(NULL);
+       error = -1;
+       setopt(b,s);
+       b->internal = 0;
+       b->rdonly = b->o.readonly;
+       b->er = error;
+       b->name = (unsigned char *)strdup((char *)s);
+       b->scratch = 1;
+       return b;
+}
+
+B *bfind_reload(unsigned char *s)
+{
+       B *b;
+       b = bload(s);
+       b->internal = 0;
+       return b;
+}
+
+B *bcheck_loaded(unsigned char *s)
+{
+       B *b;
+
+       if (!s || !s[0]) {
+               return NULL;
+       }
+       for (b = bufs.link.next; b != &bufs; b = b->link.next)
+               if (b->name && !strcmp(s, b->name)) {
+                       return b;
+               }
+
+       return NULL;
+}
+
+unsigned char **getbufs(void)
+{
+       unsigned char **s = vamk(16);
+       B *b;
+
+       for (b = bufs.link.next; b != &bufs; b = b->link.next)
+               if (b->name)
+                       s = vaadd(s, vsncpy(NULL, 0, sz(b->name)));
+       return s;
+}
+
+/* Find an orphaned buffer */
+B *borphan(void)
+{
+       B *b;
+
+       for (b = bufs.link.next; b != &bufs; b = b->link.next)
+               if (b->orphan) {
+                       b->orphan = 0;
+                       return b;
+               }
+       return NULL;
+}
+
+/* Write 'size' bytes from file beginning at 'p' to open file 'fd'.
+ * Returns error.
+ * error is set to -5 for write error or 0 for success.
+ * Don't attempt to write past the end of the file
+ */
+int bsavefd(P *p, int fd, long int size)
+{
+       P *np = pdup(p);
+       int amnt;
+
+       while (size > (amnt = GSIZE(np->hdr) - np->ofst)) {
+               if (np->ofst < np->hdr->hole) {
+                       if (joe_write(fd, np->ptr + np->ofst, np->hdr->hole - np->ofst) < 0)
+                               goto err;
+                       if (joe_write(fd, np->ptr + np->hdr->ehole, SEGSIZ - np->hdr->ehole) < 0)
+                               goto err;
+               } else if (joe_write(fd, np->ptr + np->ofst + GGAPSZ(np->hdr), amnt) < 0)
+                       goto err;
+               size -= amnt;
+               pnext(np);
+       }
+       if (size) {
+               if (np->ofst < np->hdr->hole) {
+                       if (size > np->hdr->hole - np->ofst) {
+                               if (joe_write(fd, np->ptr + np->ofst, np->hdr->hole - np->ofst) < 0)
+                                       goto err;
+                               if (joe_write(fd, np->ptr + np->hdr->ehole, (int) size - np->hdr->hole + np->ofst) < 0)
+                                       goto err;
+                       } else {
+                               if (joe_write(fd, np->ptr + np->ofst, (int) size) < 0)
+                                       goto err;
+                       }
+               } else {
+                       if (joe_write(fd, np->ptr + np->ofst + GGAPSZ(np->hdr), (int) size) < 0)
+                               goto err;
+               }
+       }
+       prm(np);
+       return error = 0;
+err:
+       prm(np);
+       return error = 5;
+}
+
+/* Save 'size' bytes beginning at 'p' in file 's' */
+
+/* If flag is set, update original time of file if it makes
+ * sense to do so (it's a normal file, we're saving with
+ * same name as buffer or is about to get this name).
+ */
+
+int bsave(P *p, unsigned char *s, long int size, int flag)
+{
+       FILE *f;
+       long skip, amnt;
+       struct stat sbuf;
+       int norm = 0;
+
+       s = parsens(s, &skip, &amnt);
+
+       if (amnt < size)
+               size = amnt;
+
+#ifndef __MSDOS__
+       if (s[0] == '!') {
+               nescape(maint->t);
+               ttclsn();
+               f = popen((char *)(s + 1), "w");
+       } else
+#endif
+       if (s[0] == '>' && s[1] == '>')
+               f = fopen((char *)(s + 2), "a");
+       else if (!strcmp(s, "-")) {
+               nescape(maint->t);
+               ttclsn();
+               f = stdout;
+       } else if (skip || amnt != MAXLONG)
+               f = fopen((char *)s, "r+");
+       else {
+               f = fopen((char *)s, "w");
+               norm = 1;
+       }
+       joesep(s);
+
+       if (!f) {
+               error = -4;
+               goto opnerr;
+       }
+       fflush(f);
+
+       if (skip && lseek(fileno(f), skip, 0) < 0) {
+               error = -3;
+               goto err;
+       }
+
+       bsavefd(p, fileno(f), size);
+
+       if (!error && force && size && !skip && amnt == MAXLONG) {