summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChet Ramey <chet.ramey@case.edu>2011-11-23 18:44:58 -0500
committerChet Ramey <chet.ramey@case.edu>2011-11-23 18:44:58 -0500
commitfe34a312c8be645944828402351bd1192972586b (patch)
treeca2a8dae3e43cc5d8ee1d96b6252255eecd866ff
parent06cd36cdc90634c88636a6d09230c573078ead0e (diff)
downloadreadline-fe34a312c8be645944828402351bd1192972586b.tar.gz
Readline-2.1 import
-rw-r--r--COPYING368
-rw-r--r--INSTALL256
-rw-r--r--MANIFEST45
-rw-r--r--Makefile.in447
-rw-r--r--README114
-rw-r--r--acconfig.h10
-rw-r--r--aclocal.m41096
-rw-r--r--bind.c744
-rw-r--r--callback.c149
-rw-r--r--chardefs.h51
-rw-r--r--complete.c1665
-rw-r--r--config.h.in122
-rwxr-xr-xconfigure2592
-rw-r--r--configure.in84
-rw-r--r--display.c582
-rw-r--r--doc/Makefile.in123
-rw-r--r--doc/hist.texinfo13
-rw-r--r--doc/history.dvibin47376 -> 50348 bytes
-rw-r--r--doc/history.html1062
-rw-r--r--doc/history.info175
-rw-r--r--doc/history.ps3571
-rw-r--r--doc/history_toc.html51
-rw-r--r--doc/hstech.texinfo28
-rw-r--r--doc/hsuser.texinfo196
-rw-r--r--doc/readline.01122
-rw-r--r--doc/readline.3886
-rw-r--r--doc/readline.dvibin148692 -> 182704 bytes
-rw-r--r--doc/readline.html3363
-rw-r--r--doc/readline.info2785
-rw-r--r--doc/readline.ps7558
-rw-r--r--doc/readline_toc.html77
-rw-r--r--doc/rlman.texinfo11
-rw-r--r--doc/rltech.texinfo216
-rw-r--r--doc/rluser.texinfo517
-rwxr-xr-xdoc/texi2dvi275
-rwxr-xr-xdoc/texi2html2021
-rw-r--r--doc/texinfo.tex880
-rw-r--r--emacs_keymap.c16
-rw-r--r--examples/Makefile.in37
-rw-r--r--examples/fileman.c45
-rw-r--r--examples/rl.c115
-rw-r--r--examples/rltest.c64
-rw-r--r--funmap.c119
-rw-r--r--histexpand.c1321
-rw-r--r--histfile.c339
-rw-r--r--histlib.h81
-rw-r--r--history.c1982
-rw-r--r--history.h47
-rw-r--r--histsearch.c197
-rw-r--r--input.c449
-rw-r--r--isearch.c190
-rw-r--r--keymaps.c58
-rw-r--r--keymaps.h4
-rw-r--r--kill.c552
-rw-r--r--macro.c277
-rw-r--r--nls.c227
-rw-r--r--parens.c52
-rw-r--r--posixdir.h49
-rw-r--r--posixjmp.h20
-rw-r--r--posixstat.h37
-rw-r--r--readline.c2532
-rw-r--r--readline.h357
-rw-r--r--rlconf.h10
-rw-r--r--rldefs.h168
-rw-r--r--rltty.c195
-rw-r--r--rltty.h73
-rw-r--r--search.c97
-rw-r--r--shell.c129
-rw-r--r--signals.c318
-rwxr-xr-xsupport/config.guess927
-rwxr-xr-xsupport/config.sub944
-rwxr-xr-xsupport/install.sh235
-rwxr-xr-xsupport/mkdirs32
-rwxr-xr-xsupport/mkdist100
-rw-r--r--tcap.h60
-rw-r--r--terminal.c544
-rw-r--r--tilde.c253
-rw-r--r--tilde.h37
-rw-r--r--undo.c260
-rw-r--r--util.c302
-rw-r--r--vi_keymap.c14
-rw-r--r--vi_mode.c491
-rw-r--r--xmalloc.c33
83 files changed, 33639 insertions, 14005 deletions
diff --git a/COPYING b/COPYING
index 1bb82d1..a43ea21 100644
--- a/COPYING
+++ b/COPYING
@@ -1,46 +1,40 @@
-
GNU GENERAL PUBLIC LICENSE
- Version 1, February 1989
+ Version 2, June 1991
- Copyright (C) 1989 Free Software Foundation, Inc.
- 675 Mass Ave, Cambridge, MA 02139, USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
-The Free Software Foundation has exempted Bash from the requirement of
-Paragraph 2c of the General Public License. This is to say, there is
-no requirement for Bash to print a notice when it is started
-interactively in the usual way. We made this exception because users
-and standards expect shells not to print such messages. This
-exception applies to any program that serves as a shell and that is
-based primarily on Bash as opposed to other GNU software.
-
Preamble
- The license agreements of most software companies try to keep users
-at the mercy of those companies. By contrast, our General Public
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. 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.
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
When we speak of free software, we are referring to freedom, not
-price. 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.
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
- For example, if you distribute copies of a such a program, whether
+ For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
-source code. And you must tell them their rights.
+source code. And you must show them these terms so they know their
+rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
@@ -53,122 +47,209 @@ want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
The precise terms and conditions for copying, distribution and
modification follow.
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.
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
- 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
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
- received the program in object code or executable form 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.
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the original
-licensor to copy, distribute or modify the Program subject to these
-terms and conditions. You may not impose any further restrictions on the
-recipients' exercise of the rights granted herein.
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
- 7. The Free Software Foundation may publish revised and/or new versions
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
-Each version is given a distinguishing version number. If the Program
-specifies a version number of the license which applies to it and "any
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
-the license, you may choose any version ever published by the Free Software
+this 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
+ 10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
+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
@@ -176,7 +257,7 @@ of promoting the sharing and reuse of software generally.
NO WARRANTY
- 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
@@ -186,7 +267,7 @@ 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
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
@@ -201,22 +282,21 @@ POSSIBILITY OF SUCH DAMAGES.
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.
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
- To do so, attach the following notices to the program. It is safest to
-attach them to the start of each source file to most effectively convey
-the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
+ 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>
+ 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.
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -232,26 +312,28 @@ 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 version 69, Copyright (C) 19yy 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.
+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:
+necessary. Here is 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.
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
-That's all there is to it!
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/INSTALL b/INSTALL
index 8a7d026..95d84c8 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,146 +1,176 @@
- This is a generic INSTALL file for utilities distributions.
-If this package does not come with, e.g., installable documentation or
-data files, please ignore the references to them below.
+Basic Installation
+==================
+
+ These are generic installation instructions.
The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation, and
-creates the Makefile(s) (one in each subdirectory of the source
-directory). In some packages it creates a C header file containing
-system-dependent definitions. It also creates a file `config.status'
-that you can run in the future to recreate the current configuration.
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
-To compile this package:
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
-1. Configure the package for your system.
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
- Normally, you just `cd' to the directory containing the package's
-source code and type `./configure'. If you're using `csh' on an old
-version of System V, you might need to type `sh configure' instead to
-prevent `csh' from trying to execute `configure' itself.
+Compilers and Options
+=====================
- Running `configure' takes awhile. While it is running, it
-prints some messages that tell what it is doing. If you don't want to
-see any messages, run `configure' with its standard output redirected
-to `/dev/null'; for example, `./configure >/dev/null'.
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
- To compile the package in a different directory from the one
-containing the source code, you must use a version of `make' that
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'. If
-for some reason `configure' is not in the source code directory that
-you are configuring, then it will report that it can't find the source
-code. In that case, run `configure' with the option `--srcdir=DIR',
-where DIR is the directory that contains the source code.
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
By default, `make install' will install the package's files in
`/usr/local/bin', `/usr/local/man', etc. You can specify an
installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PATH'. Alternately, you can do so by consistently
-giving a value for the `prefix' variable when you run `make', e.g.,
- make prefix=/usr/gnu
- make prefix=/usr/gnu install
+option `--prefix=PATH'.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
-give `configure' the option `--exec-prefix=PATH' or set the `make'
-variable `exec_prefix' to PATH, the package will use PATH as the prefix
-for installing programs and libraries. Data files and documentation
-will still use the regular prefix. Normally, all files are installed
-using the same prefix.
-
- Some packages pay attention to `--with-PACKAGE' options to
-`configure', where PACKAGE is something like `gnu-as' or `x' (for the
-X Window System). They may also pay attention to `--enable-FEATURE'
-options, where FEATURE indicates an optional part of the package. The
-README should mention any `--with-' and `--enable-' options that the
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
- `configure' also recognizes the following options:
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
`--help'
Print a summary of the options to `configure', and exit.
`--quiet'
`--silent'
+`-q'
Do not print messages saying which checks are being made.
-`--verbose'
- Print the results of the checks.
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
`--version'
Print the version of Autoconf used to generate the `configure'
script, and exit.
-`--x-includes=DIR'
- X include files are in DIR.
-
-`--x-libraries=DIR'
- X library files are in DIR.
-
- `configure' also accepts and ignores some other options.
-
- On systems that require unusual options for compilation or linking
-that the package's `configure' script does not know about, you can give
-`configure' initial values for variables by setting them in the
-environment. In Bourne-compatible shells, you can do that on the
-command line like this:
-
- CC='gcc -traditional' LIBS=-lposix ./configure
+`configure' also accepts some other, not widely useful, options.
-On systems that have the `env' program, you can do it like this:
-
- env CC='gcc -traditional' LIBS=-lposix ./configure
-
- Here are the `make' variables that you might want to override with
-environment variables when running `configure'.
-
- For these variables, any value given in the environment overrides the
-value that `configure' would choose:
-
- - Variable: CC
- C compiler program. The default is `cc'.
-
- - Variable: INSTALL
- Program to use to install files. The default is `install' if you
- have it, `cp' otherwise.
-
- For these variables, any value given in the environment is added to
-the value that `configure' chooses:
-
- - Variable: DEFS
- Configuration options, in the form `-Dfoo -Dbar...'. Do not use
- this variable in packages that create a configuration header file.
-
- - Variable: LIBS
- Libraries to link with, in the form `-lfoo -lbar...'.
-
- If you need to do unusual things to compile the package, we encourage
-you to figure out how `configure' could check whether to do them, and
-mail diffs or instructions to the address given in the README so we
-can include them in the next release.
-
-2. Type `make' to compile the package. If you want, you can override
-the `make' variables CFLAGS and LDFLAGS like this:
-
- make CFLAGS=-O2 LDFLAGS=-s
-
-3. If the package comes with self-tests and you want to run them,
-type `make check'. If you're not sure whether there are any, try it;
-if `make' responds with something like
- make: *** No way to make target `check'. Stop.
-then the package does not come with self-tests.
-
-4. Type `make install' to install programs, data files, and
-documentation.
-
-5. You can remove the program binaries and object files from the
-source directory by typing `make clean'. To also remove the
-Makefile(s), the header file containing system-dependent definitions
-(if the package uses one), and `config.status' (all the files that
-`configure' created), type `make distclean'.
-
- The file `configure.in' is used to create `configure' by a program
-called `autoconf'. You only need it if you want to regenerate
-`configure' using a newer version of `autoconf'.
diff --git a/MANIFEST b/MANIFEST
index 007a5ca..5e68586 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,10 +1,14 @@
+#
+# Master distribution manifest for the standalone readline distribution
+#
doc d
examples d
+support d
COPYING f
README f
-STANDALONE f
MANIFEST f
INSTALL f
+aclocal.m4 f
acconfig.h f
config.h.in f
configure f
@@ -13,32 +17,54 @@ Makefile.in f
ChangeLog f
ansi_stdlib.h f
chardefs.h f
+history.h f
+histlib.h f
keymaps.h f
-memalloc.h f
+posixdir.h f
+posixjmp.h f
posixstat.h f
-history.h f
+readline.h f
rlconf.h f
rldefs.h f
+rltty.h f
+tcap.h f
tilde.h f
bind.c f
complete.c f
display.c f
emacs_keymap.c f
funmap.c f
-history.c f
+input.c f
isearch.c f
keymaps.c f
+kill.c f
+macro.c f
+nls.c f
parens.c f
readline.c f
-readline.h f
rltty.c f
search.c f
+shell.c f
signals.c f
+terminal.c f
tilde.c f
+undo.c f
+util.c f
vi_keymap.c f
vi_mode.c f
+callback.c f
xmalloc.c f
-doc/Makefile f
+history.c f
+histexpand.c f
+histfile.c f
+histsearch.c f
+support/config.guess f
+support/config.sub f
+support/install.sh f
+support/mkdirs f
+support/mkdist f
+doc/Makefile.in f
+doc/texinfo.tex f
doc/rlman.texinfo f
doc/rltech.texinfo f
doc/rluser.texinfo f
@@ -46,7 +72,12 @@ doc/hist.texinfo f
doc/hstech.texinfo f
doc/hsuser.texinfo f
doc/readline.3 f
-examples/Makefile f
+doc/texi2dvi f
+doc/texi2html f
+examples/Makefile.in f
examples/fileman.c f
examples/manexamp.c f
+examples/rltest.c f
+examples/rl.c f
+examples/histexamp.c f
examples/Inputrc f
diff --git a/Makefile.in b/Makefile.in
index 02888bd..3d2c68f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,3 +1,4 @@
+## -*- text -*- ##
# Master Makefile for the GNU readline library.
# Copyright (C) 1994 Free Software Foundation, Inc.
@@ -14,49 +15,74 @@
# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+RL_LIBRARY_VERSION = @LIBVERSION@
+RL_LIBRARY_NAME = readline
srcdir = @srcdir@
-VPATH = @srcdir@
-
-prefix = /usr/local
-exec_prefix = $(prefix)
-bindir = $(exec_prefix)/bin
-libdir = $(exec_prefix)/lib
-mandir = $(prefix)/man/man1
-
-SHELL = /bin/sh
+VPATH = .:@srcdir@
+top_srcdir = @top_srcdir@
+BUILD_DIR = .
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
+CC = @CC@
+LD = ld # needed when building shared libraries
RANLIB = @RANLIB@
AR = ar
-RM = rm
+RM = rm -f
CP = cp
MV = mv
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+libdir = @libdir@
+mandir = @mandir@
+includedir = @includedir@
+
+infodir = @infodir@
+
+man3dir = $(mandir)/man3
+
+SHELL = /bin/sh
+
+# Programs to make tags files.
+ETAGS = etags -tw
+CTAGS = ctags -tw
+
+CFLAGS = @CFLAGS@
+LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"'
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@ @CFLAGS@
+
DEFS = @DEFS@
-CFLAGS = -g
-LDFLAGS = -g
+LOCAL_DEFS = @LOCAL_DEFS@
# For libraries which include headers from other libraries.
-INCLUDES = -I. -I$(srcdir)
+INCLUDES = -I. -I$(srcdir) -I$(includedir)
-CPPFLAGS = $(DEFS) $(INCLUDES)
+CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(CPPFLAGS) $(INCLUDES) $(LOCAL_CFLAGS) $(CFLAGS)
-PICFLAG= -pic # -fpic for some versions of gcc
+# these two options need tweaking for compiler/OS versions other than gcc
+# and SunOS4
+PICFLAG= -fpic # -pic for some versions of cc
SHLIB_OPTS= -assert pure-text -ldl # -Bshareable for some versions of gcc
-MAJOR= 2
+
+MAJOR= 3
+# shared library systems like SVR4's do not use minor versions
MINOR= .0
.SUFFIXES: .so
+
.c.o:
- $(CC) -c $(CPPFLAGS) $(CFLAGS) $<
+ $(CC) -c $(CCFLAGS) $<
.c.so:
-mv $*.o z$*.o
- $(CC) -c $(PICFLAG) $(CPPFLAGS) $(CFLAGS) $<
+ $(CC) -c $(PICFLAG) $(CCFLAGS) $<
mv $*.o $@
-mv z$*.o $*.o
@@ -67,26 +93,35 @@ SHARED_HISTORY = libhistory.so.$(MAJOR)$(MINOR)
SHARED_LIBS = $(SHARED_READLINE) $(SHARED_HISTORY)
# The C code source files for this library.
-CSOURCES = $(srcdir)readline.c $(srcdir)funmap.c $(srcdir)keymaps.c \
- $(srcdir)vi_mode.c $(srcdir)parens.c $(srcdir)rltty.c \
- $(srcdir)complete.c $(srcdir)bind.c $(srcdir)isearch.c \
- $(srcdir)display.c $(srcdir)signals.c $(srcdir)emacs_keymap.c \
- $(srcdir)vi_keymap.c $(srcdir)history.c $(srcdir)tilde.c \
- $(srcdir)xmalloc.c
+CSOURCES = $(srcdir)/readline.c $(srcdir)/funmap.c $(srcdir)/keymaps.c \
+ $(srcdir)/vi_mode.c $(srcdir)/parens.c $(srcdir)/rltty.c \
+ $(srcdir)/complete.c $(srcdir)/bind.c $(srcdir)/isearch.c \
+ $(srcdir)/display.c $(srcdir)/signals.c $(srcdir)/emacs_keymap.c \
+ $(srcdir)/vi_keymap.c $(srcdir)/util.c $(srcdir)/kill.c \
+ $(srcdir)/undo.c $(srcdir)/macro.c $(srcdir)/input.c \
+ $(srcdir)/callback.c $(srcdir)/terminal.c $(srcdir)/xmalloc.c \
+ $(srcdir)/history.c $(srcdir)/histsearch.c $(srcdir)/histexpand.c \
+ $(srcdir)/histfile.c $(srcdir)/nls.c $(srcdir)/search.c \
+ $(srcdir)/shell.c $(srcdir)/tilde.c
# The header files for this library.
-HSOURCES = readline.h rldefs.h chardefs.h keymaps.h history.h \
- posixstat.h tilde.h rlconf.h
-
-INSTALLED_HEADERS = readline.h chardefs.h keymaps.h history.h tilde.h
+HSOURCES = readline.h rldefs.h chardefs.h keymaps.h history.h histlib.h \
+ posixstat.h posixdir.h posixjmp.h tilde.h rlconf.h rltty.h \
+ ansi_stdlib.h tcap.h
+HISTOBJ = history.o histexpand.o histfile.o histsearch.o shell.o
+TILDEOBJ = tilde.o
OBJECTS = readline.o vi_mode.o funmap.o keymaps.o parens.o search.o \
rltty.o complete.o bind.o isearch.o display.o signals.o \
- history.o tilde.o xmalloc.o
+ util.o kill.o undo.o macro.o input.o callback.o terminal.o \
+ nls.o xmalloc.o $(HISTOBJ) $(TILDEOBJ)
+SHARED_HISTOBJ = history.so histexpand.so histfile.so histsearch.so shell.so
+SHARED_TILDEOBJ = tilde.so
SHARED_OBJ = readline.so vi_mode.so funmap.so keymaps.so parens.so search.so \
rltty.so complete.so bind.so isearch.so display.so signals.so \
- history.so tilde.so xmalloc.so
+ util.so kill.so undo.so macro.so input.so callback.so terminal.so \
+ nls.so xmalloc.so $(SHARED_HISTOBJ) $(SHARED_TILDEOBJ)
# The texinfo files which document this library.
DOCSOURCE = doc/rlman.texinfo doc/rltech.texinfo doc/rluser.texinfo
@@ -94,11 +129,9 @@ DOCOBJECT = doc/readline.dvi
DOCSUPPORT = doc/Makefile
DOCUMENTATION = $(DOCSOURCE) $(DOCOBJECT) $(DOCSUPPORT)
-SUPPORT = Makefile ChangeLog $(DOCSUPPORT) examples/[-a-z.]*
+CREATED_MAKEFILES = Makefile doc/Makefile examples/Makefile
-SOURCES = $(CSOURCES) $(HSOURCES) $(DOCSOURCE)
-
-THINGS_TO_TAR = $(SOURCES) $(SUPPORT)
+INSTALLED_HEADERS = readline.h chardefs.h keymaps.h history.h tilde.h
##########################################################################
@@ -106,100 +139,310 @@ all: libreadline.a libhistory.a
shared: $(SHARED_LIBS)
libreadline.a: $(OBJECTS)
- $(RM) -f $@
- $(AR) cq $@ $(OBJECTS)
- -$(RANLIB) $@
+ $(RM) $@
+ $(AR) cr $@ $(OBJECTS)
+ -test -n "$(RANLIB)" && $(RANLIB) $@
-libhistory.a: history.o
- $(RM) -f $@
- $(AR) cq $@ history.o
- -$(RANLIB) $@
+libhistory.a: $(HISTOBJ) xmalloc.o
+ $(RM) $@
+ $(AR) cr $@ $(HISTOBJ) xmalloc.o
+ -test -n "$(RANLIB)" && $(RANLIB) $@
$(SHARED_READLINE): $(SHARED_OBJ)
- $(RM) -f $@
- ld ${SHLIB_OPTS} -o $@ $(SHARED_OBJ)
+ $(RM) $@
+ $(LD) ${SHLIB_OPTS} -o $@ $(SHARED_OBJ)
+
+$(SHARED_HISTORY): $(SHARED_HISTOBJ) xmalloc.so
+ $(RM) $@
+ $(LD) ${SHLIB_OPTS} -o $@ $(SHARED_HISTOBJ) xmalloc.so
+
+readline: $(OBJECTS) readline.h rldefs.h chardefs.h
+ $(CC) $(CCFLAGS) -o $@ ./examples/rl.c ./libreadline.a -ltermcap
-$(SHARED_HISTORY): history.so
- $(RM) -f $@
- ld ${SHLIB_OPTS} -o $@ history.so
+Makefile makefile: config.status $(srcdir)/Makefile.in
+ CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status
+
+Makefiles makefiles: config.status $(srcdir)/Makefile.in
+ @for mf in $(CREATED_MAKEFILES); do \
+ CONFIG_FILES=$$mf CONFIG_HEADERS= $(SHELL) ./config.status ; \
+ done
+
+config.status: configure
+ $(SHELL) ./config.status --recheck
+
+config.h: stamp-h
+
+stamp-h: config.status $(srcdir)/config.h.in
+ CONFIG_FILES= CONFIG_HEADERS=config.h ./config.status
+ echo > $@
+
+$(srcdir)/configure: $(srcdir)/configure.in ## Comment-me-out in distribution
+ cd $(srcdir) && autoconf ## Comment-me-out in distribution
documentation: force
- [ ! -d doc ] && mkdir doc
- (if [ -d doc ]; then cd doc; $(MAKE) $(MFLAGS); fi)
+ -test -d doc || mkdir doc
+ -( cd doc && $(MAKE) $(MFLAGS) )
force:
install: installdirs libreadline.a
- $(INSTALL_DATA) $(INSTALLED_HEADERS) $(incdir)/readline
+ for f in ${INSTALLED_HEADERS}; do \
+ $(INSTALL_DATA) $(srcdir)/$$f $(includedir)/readline ; \
+ done
-$(MV) $(libdir)/libreadline.a $(libdir)/libreadline.old
$(INSTALL_DATA) libreadline.a $(libdir)/libreadline.a
- -$(RANLIB) -t $(libdir)/libreadline.a
+ -test -n "$(RANLIB)" && -$(RANLIB) -t $(libdir)/libreadline.a
+ -( if test -d doc ; then \
+ cd doc && \
+ ${MAKE} ${MFLAGS} infodir=$(infodir) INSTALL_DATA=$(INSTALL_DATA) $@; \
+ fi )
-installdirs:
- [ ! -d $(incdir)/readline ] && { \
- mkdir $(incdir)/readline && chmod 755 $(incdir)/readline; }
- [ ! -d $(libdir) ] && mkdir $(libdir)
+installdirs: $(srcdir)/support/mkdirs
+ -$(SHELL) $(srcdir)/support/mkdirs $(includedir) \
+ $(includedir)/readline $(libdir) $(infodir) $(man3dir)
uninstall:
- [ -n "$(incdir)" ] && cd $(incdir)/readline && \
- ${RM} -f ${INSTALLED_HEADERS}
- [ -n "$(libdir)" ] && cd $(libdir) && \
- ${RM} -f libreadline.a libreadline.old $(SHARED_LIBS)
-
-clean::
- rm -f $(OBJECTS) *.a $(SHARED_OBJ) $(SHARED_LIBS)
- (if [ -d doc ]; then cd doc; $(MAKE) $(MFLAGS) $@; fi)
-
-readline: readline.h rldefs.h chardefs.h
-readline: $(OBJECTS)
- $(CC) $(CFLAGS) $(CPPFLAGS) $(READLINE_DEFINES) \
- $(LOCAL_INCLUDES) -DTEST -o readline readline.c vi_mode.o funmap.o \
- keymaps.o -ltermcap
-
-info:
-install-info:
-dvi:
-check:
-installcheck:
+ -test -n "$(includedir)" && cd $(includedir)/readline && \
+ ${RM} ${INSTALLED_HEADERS}
+ -test -n "$(libdir)" && cd $(libdir) && \
+ ${RM} libreadline.a libreadline.old $(SHARED_LIBS)
+
+TAGS: force
+ $(ETAGS) $(CSOURCES) $(HSOURCES)
tags: force
- etags $(CSOURCES) $(HSOURCES)
+ $(CTAGS) $(CSOURCES) $(HSOURCES)
-TAGS: force
- ctags -x $(CSOURCES) $(HSOURCES) > $@
+clean: force
+ $(RM) $(OBJECTS) *.a
+ $(RM) $(SHARED_OBJ) $(SHARED_LIBS)
+ -( cd doc && $(MAKE) $(MFLAGS) $@ )
-Makefile: config.status $(srcdir)/Makefile.in
- $(SHELL) config.status
+mostlyclean: clean
+ -( cd doc && $(MAKE) $(MFLAGS) $@ )
-config.status: configure
- $(SHELL) config.status --recheck
+distclean maintainer-clean: clean
+ -( cd doc && $(MAKE) $(MFLAGS) $@ )
+ $(RM) Makefile
+ $(RM) config.status config.h config.cache config.log
+ $(RM) stamp-config stamp-h
+ $(RM) TAGS tags
-configure: configure.in ## Comment-me-out in distribution
- cd $(srcdir); autoconf ## Comment-me-out in distribution
-config.h.in: configure.in ## Comment-me-out in distribution
- cd $(srcdir); autoheader ## Comment-me-out in distribution
+info dvi:
+ -( cd doc && $(MAKE) $(MFLAGS) $@ )
-mostlyclean: clean
+install-info:
+check:
+installcheck:
-distclean realclean: clean
- rm -f Makefile config.status config.h stamp-config
+dist: force
+ @echo Readline distributions are created using $(srcdir)/support/mkdist.
+ @echo Here is a sample of the necessary commands:
+ @echo bash $(srcdir)/support/mkdist -m $(srcdir)/MANIFEST -s $(srcdir) -r $(RL_LIBRARY_NAME)-$(RL_LIBRARY_VERSION)
+ @echo tar cf $(RL_LIBRARY_NAME)-${RL_LIBRARY_VERSION}.tar ${RL_LIBRARY_NAME}-$(RL_LIBRARY_VERSION)
+ @echo gzip $(RL_LIBRARY_NAME)-$(RL_LIBRARY_VERSION).tar
# Tell versions [3.59,3.63) of GNU make not to export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
# Dependencies
-readline.o: readline.c readline.h rldefs.h rlconf.h chardefs.h
-readline.o: keymaps.h history.h
-vi_mode.o: rldefs.h rlconf.h readline.h history.h
-funmap.o: funmap.c readline.h rlconf.h
-keymaps.o: keymaps.c emacs_keymap.c vi_keymap.c keymaps.h chardefs.h rlconf.h
-history.o: history.h memalloc.h
-isearch.o: memalloc.h readline.h history.h
-search.o: memalloc.h readline.h history.h
-display.o: readline.h history.h rldefs.h rlconf.h
-complete.o: readline.h rldefs.h rlconf.h
-rltty.o: rldefs.h rlconf.h readline.h
-bind.o: rldefs.h rlconf.h readline.h history.h
-signals.o: rldefs.h rlconf.h readline.h history.h
-parens.o: readline.h
+bind.o: ansi_stdlib.h posixstat.h
+bind.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+bind.o: readline.h keymaps.h chardefs.h tilde.h
+bind.o: history.h
+callback.o: rlconf.h
+callback.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+callback.o: readline.h keymaps.h chardefs.h tilde.h
+complete.o: ansi_stdlib.h posixdir.h posixstat.h
+complete.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+complete.o: readline.h keymaps.h chardefs.h tilde.h
+display.o: ansi_stdlib.h posixstat.h
+display.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+display.o: tcap.h
+display.o: readline.h keymaps.h chardefs.h tilde.h
+display.o: history.h
+funmap.o: readline.h keymaps.h chardefs.h tilde.h
+funmap.o: rlconf.h ansi_stdlib.h
+funmap.o: ${BUILD_DIR}/config.h
+histexpand.o: ansi_stdlib.h
+histexpand.o: history.h histlib.h
+histexpand.o: ${BUILD_DIR}/config.h
+histfile.o: ansi_stdlib.h
+histfile.o: history.h histlib.h
+histfile.o: ${BUILD_DIR}/config.h
+history.o: ansi_stdlib.h
+history.o: history.h histlib.h
+history.o: ${BUILD_DIR}/config.h
+histsearch.o: ansi_stdlib.h
+histsearch.o: history.h histlib.h
+histsearch.o: ${BUILD_DIR}/config.h
+input.o: ansi_stdlib.h
+input.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+input.o: readline.h keymaps.h chardefs.h tilde.h
+isearch.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+isearch.o: readline.h keymaps.h chardefs.h tilde.h
+isearch.o: ansi_stdlib.h history.h
+keymaps.o: emacs_keymap.c vi_keymap.c
+keymaps.o: keymaps.h chardefs.h rlconf.h ansi_stdlib.h
+keymaps.o: readline.h keymaps.h chardefs.h tilde.h
+keymaps.o: ${BUILD_DIR}/config.h
+kill.o: ansi_stdlib.h
+kill.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+kill.o: readline.h keymaps.h chardefs.h tilde.h
+kill.o: history.h
+macro.o: ansi_stdlib.h
+macro.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+macro.o: readline.h keymaps.h chardefs.h tilde.h
+macro.o: history.h
+nls.o: ansi_stdlib.h
+nls.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+parens.o: rlconf.h
+parens.o: ${BUILD_DIR}/config.h
+parens.o: readline.h keymaps.h chardefs.h tilde.h
+readline.o: readline.h keymaps.h chardefs.h tilde.h
+readline.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+readline.o: history.h
+readline.o: posixstat.h ansi_stdlib.h posixjmp.h
+rltty.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+rltty.o: rltty.h
+rltty.o: readline.h keymaps.h chardefs.h tilde.h
+search.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+search.o: readline.h keymaps.h chardefs.h tilde.h
+search.o: ansi_stdlib.h history.h
+signals.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+signals.o: readline.h keymaps.h chardefs.h tilde.h
+signals.o: history.h
+terminal.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+terminal.o: tcap.h
+terminal.o: readline.h keymaps.h chardefs.h tilde.h
+terminal.o: history.h
+tilde.o: ansi_stdlib.h
+tilde.o: ${BUILD_DIR}/config.h
+tilde.o: tilde.h
+undo.o: ansi_stdlib.h
+undo.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+undo.o: readline.h keymaps.h chardefs.h tilde.h
+undo.o: history.h
+util.o: posixjmp.h ansi_stdlib.h
+util.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+util.o: readline.h keymaps.h chardefs.h tilde.h
+vi_mode.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+vi_mode.o: readline.h keymaps.h chardefs.h tilde.h
+vi_mode.o: history.h ansi_stdlib.h
+xmalloc.o: ${BUILD_DIR}/config.h
+xmalloc.o: ansi_stdlib.h
+
+bind.so: ansi_stdlib.h posixstat.h
+bind.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+bind.so: readline.h keymaps.h chardefs.h tilde.h
+bind.so: history.h
+callback.so: rlconf.h
+callback.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+callback.so: readline.h keymaps.h chardefs.h tilde.h
+complete.so: ansi_stdlib.h posixdir.h posixstat.h
+complete.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+complete.so: readline.h keymaps.h chardefs.h tilde.h
+display.so: ansi_stdlib.h posixstat.h
+display.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+display.so: tcap.h
+display.so: readline.h keymaps.h chardefs.h tilde.h
+display.so: history.h
+funmap.so: readline.h keymaps.h chardefs.h tilde.h
+funmap.so: rlconf.h ansi_stdlib.h
+funmap.so: ${BUILD_DIR}/config.h
+histexpand.so: ansi_stdlib.h
+histexpand.so: history.h histlib.h
+histexpand.so: ${BUILD_DIR}/config.h
+histfile.so: ansi_stdlib.h
+histfile.so: history.h histlib.h
+histfile.so: ${BUILD_DIR}/config.h
+history.so: ansi_stdlib.h
+history.so: history.h histlib.h
+history.so: ${BUILD_DIR}/config.h
+histsearch.so: ansi_stdlib.h
+histsearch.so: history.h histlib.h
+histsearch.so: ${BUILD_DIR}/config.h
+input.so: ansi_stdlib.h
+input.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+input.so: readline.h keymaps.h chardefs.h tilde.h
+isearch.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+isearch.so: readline.h keymaps.h chardefs.h tilde.h
+isearch.so: ansi_stdlib.h history.h
+keymaps.so: emacs_keymap.c vi_keymap.c
+keymaps.so: keymaps.h chardefs.h rlconf.h ansi_stdlib.h
+keymaps.so: readline.h keymaps.h chardefs.h tilde.h
+keymaps.so: ${BUILD_DIR}/config.h
+kill.so: ansi_stdlib.h
+kill.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+kill.so: readline.h keymaps.h chardefs.h tilde.h
+kill.so: history.h
+macro.so: ansi_stdlib.h
+macro.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+macro.so: readline.h keymaps.h chardefs.h tilde.h
+macro.so: history.h
+nls.so: ansi_stdlib.h
+nls.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+parens.so: rlconf.h
+parens.so: ${BUILD_DIR}/config.h
+parens.so: readline.h keymaps.h chardefs.h tilde.h
+readline.so: readline.h keymaps.h chardefs.h tilde.h
+readline.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+readline.so: history.h
+readline.so: posixstat.h ansi_stdlib.h posixjmp.h
+rltty.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+rltty.so: rltty.h
+rltty.so: readline.h keymaps.h chardefs.h tilde.h
+search.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+search.so: readline.h keymaps.h chardefs.h tilde.h
+search.so: ansi_stdlib.h history.h
+signals.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+signals.so: readline.h keymaps.h chardefs.h tilde.h
+signals.so: history.h
+terminal.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+terminal.so: tcap.h
+terminal.so: readline.h keymaps.h chardefs.h tilde.h
+terminal.so: history.h
+tilde.so: ansi_stdlib.h
+tilde.so: ${BUILD_DIR}/config.h
+tilde.so: tilde.h
+undo.so: ansi_stdlib.h
+undo.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+undo.so: readline.h keymaps.h chardefs.h tilde.h
+undo.so: history.h
+util.so: posixjmp.h ansi_stdlib.h
+util.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+util.so: readline.h keymaps.h chardefs.h tilde.h
+vi_mode.so: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+vi_mode.so: readline.h keymaps.h chardefs.h tilde.h
+vi_mode.so: history.h ansi_stdlib.h
+xmalloc.so: ${BUILD_DIR}/config.h
+xmalloc.so: ansi_stdlib.h
+
+readline.so: $(srcdir)/readline.c
+vi_mode.so: $(srcdir)/vi_mode.c
+funmap.so: $(srcdir)/funmap.c
+keymaps.so: $(srcdir)/keymaps.c
+parens.so: $(srcdir)/parens.c
+search.so: $(srcdir)/search.c
+rltty.so: $(srcdir)/rltty.c
+complete.so: $(srcdir)/complete.c
+bind.so: $(srcdir)/bind.c
+isearch.so: $(srcdir)/isearch.c
+display.so: $(srcdir)/display.c
+signals.so: $(srcdir)/signals.c
+util.so: $(srcdir)/util.c
+kill.so: $(srcdir)/kill.c
+undo.so: $(srcdir)/undo.c
+macro.so: $(srcdir)/macro.c
+input.so: $(srcdir)/input.c
+callback.so: $(srcdir)/callback.c
+terminal.so: $(srcdir)/terminal.c
+nls.so: $(srcdir)/nls.c
+xmalloc.so: $(srcdir)/xmalloc.c
+history.so: $(srcdir)/history.c
+histexpand.so: $(srcdir)/histexpand.c
+histfile.so: $(srcdir)/histfile.c
+histsearch.so: $(srcdir)/histsearch.c
+shell.so: $(srcdir)/shell.c
+tilde.so: $(srcdir)/tilde.c
diff --git a/README b/README
index 131471c..e14aee8 100644
--- a/README
+++ b/README
@@ -1,6 +1,112 @@
-This is the distribution of the Gnu Readline library. See the file
-STANDALONE for a description of the #defines that can be passed via
-the makefile to build readline on different systems.
+Introduction
+============
+
+This is the Gnu Readline library, version 2.1.
+
+The Readline library provides a set of functions for use by applications
+that allow users to edit command lines as they are typed in. Both
+Emacs and vi editing modes are available. The Readline library includes
+additional functions to maintain a list of previously-entered command
+lines, to recall and perhaps reedit those lines, and perform csh-like
+history expansion on previous commands.
+
+The history facilites are also placed into a separate library, the
+History library, as part of the build process. The History library
+may be used without Readline in applications which desire its
+capabilities.
+
+The Readline library is free software, distributed under the terms of
+the GNU Public License, version 2. For more information, see the file
+COPYING.
+
+To build the library, try typing `./configure', then `make'. The
+configuration process is automated, so no further intervention should
+be necessary. Readline builds with `gcc' by default if it is
+available. If you want to use `cc' instead, type
+
+ CC=cc ./configure
+
+if you are using a Bourne-style shell. If you are not, the following
+may work:
+
+ env CC=cc ./configure
+
+Read the file INSTALL in this directory for more information about how
+to customize and control the build process.
The file rlconf.h contains defines that enable and disable certain
-readline features.
+Readline features.
+
+Examples
+========
+
+There are several example programs that use Readline features in the
+examples directory. The `rl' program is of particular interest. It
+is a command-line interface to Readline, suitable for use in shell
+scripts in place of `read'.
+
+Shared Libraries
+================
+
+There is skeletal support for building shared versions of the
+Readline and History libraries.
+
+Typing `make shared' will cause shared versions of the Readline and
+History libraries to be built on SunOS 4.1.x. For versions of Unix
+other than SunOS, you will have to make some changes to Makefile.in.
+The relevant variables are:
+
+PICFLAG Options to give to the compiler to produce position-independent
+ code. The value `-fpic' works for most versions of gcc.
+SHLIB_OPTS Options to give to the linker to produce a shared library.
+ The value `-assert pure-text -ldl' works on SunOS 4.1.x.
+ The value `-Bshareable' works for some versions of GNU ld.
+
+MAJOR The major version number of the shared library. You should
+ not need to change this.
+MINOR The minor version number of the shared library. Some systems,
+ such as SVR4 and its descendents (e.g., Solaris, Unixware),
+ do not use minor version numbers. For those systems, this
+ variable should be left unset.
+
+LD The linker. The value of `ld' is correct for SunOS 4.1.x.
+ You may need to change it to `gcc'; make sure to change
+ SHLIB_OPTS if you do so.
+
+Once you have edited Makefile.in, type `make Makefile' to rebuild the
+Makefile, then `make shared' to build the shared libraries.
+
+Documentation
+=============
+
+The documentation for the Readline and History libraries appears in the
+`doc' subdirectory. There are two texinfo files and a Unix-style manual
+page describing the programming facilities available in the Readline
+library. The texinfo files include both user and programmer's manuals.
+
+Reporting Bugs
+==============
+
+Bug reports for Readline should be sent to:
+
+ bug-readline@prep.ai.mit.edu
+
+When reporting a bug, please include the following information:
+
+ * the version number and release status of Readline (e.g., 2.1-release)
+ * the machine and OS that it is running on
+ * a list of the compilation flags or the contents of `config.h', if
+ appropriate
+ * a description of the bug
+ * a recipe for recreating the bug reliably
+ * a fix for the bug if you have one!
+
+If you would like to contact the Readline maintainer directly, send mail
+to bash-maintainers@prep.ai.mit.edu.
+
+Since Readline is developed along with bash, the bug-bash@prep.ai.mit.edu
+mailing list (mirrored to the Usenet newsgroup gnu.bash.bug) often contains
+Readline bug reports and fixes.
+
+Chet Ramey
+chet@po.cwru.edu
diff --git a/acconfig.h b/acconfig.h
index ebf44e9..4f42238 100644
--- a/acconfig.h
+++ b/acconfig.h
@@ -14,12 +14,14 @@
Leave the following blank line there!! Autoheader needs it. */
-/* Define if your system defines TIOCGWINSZ in sys/ioctl.h. */
-#undef GWINSZ_IN_SYS_IOCTL
+/* Definitions pulled in from aclocal.m4. */
+#undef VOID_SIGHANDLER
-#undef HAVE_GETPW_DECLS
+#undef TIOCGWINSZ_IN_SYS_IOCTL
+
+#undef TIOCSTAT_IN_SYS_IOCTL
-#undef NO_SYS_FILE
+#undef HAVE_GETPW_DECLS
/* Leave that blank line there!! Autoheader needs it.
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..b852ac0
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,1096 @@
+dnl
+dnl Bash specific tests
+dnl
+dnl Some derived from PDKSH 5.1.3 autoconf tests
+dnl
+dnl
+dnl Check if dup2() does not clear the close on exec flag
+dnl
+AC_DEFUN(BASH_DUP2_CLOEXEC_CHECK,
+[AC_MSG_CHECKING(if dup2 fails to clear the close-on-exec flag)
+AC_CACHE_VAL(bash_cv_dup2_broken,
+[AC_TRY_RUN([
+#include <sys/types.h>
+#include <fcntl.h>
+main()
+{
+ int fd1, fd2, fl;
+ fd1 = open("/dev/null", 2);
+ if (fcntl(fd1, 2, 1) < 0)
+ exit(1);
+ fd2 = dup2(fd1, 1);
+ if (fd2 < 0)
+ exit(2);
+ fl = fcntl(fd2, 1, 0);
+ /* fl will be 1 if dup2 did not reset the close-on-exec flag. */
+ exit(fl != 1);
+}
+], bash_cv_dup2_broken=yes, bash_cv_dup2_broken=no,
+ AC_MSG_ERROR(cannot check dup2 if cross compiling))
+])
+AC_MSG_RESULT($bash_cv_dup2_broken)
+if test $bash_cv_dup2_broken = yes; then
+AC_DEFINE(DUP2_BROKEN)
+fi
+])
+
+dnl Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7)
+AC_DEFUN(BASH_SIGNAL_CHECK,
+[AC_REQUIRE([AC_TYPE_SIGNAL])
+AC_MSG_CHECKING(for type of signal functions)
+AC_CACHE_VAL(bash_cv_signal_vintage,
+[
+ AC_TRY_LINK([#include <signal.h>],[
+ sigset_t ss;
+ struct sigaction sa;
+ sigemptyset(&ss); sigsuspend(&ss);
+ sigaction(SIGINT, &sa, (struct sigaction *) 0);
+ sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0);
+ ], bash_cv_signal_vintage=posix,
+ [
+ AC_TRY_LINK([#include <signal.h>], [
+ int mask = sigmask(SIGINT);
+ sigsetmask(mask); sigblock(mask); sigpause(mask);
+ ], bash_cv_signal_vintage=4.2bsd,
+ [
+ AC_TRY_LINK([
+ #include <signal.h>
+ RETSIGTYPE foo() { }], [
+ int mask = sigmask(SIGINT);
+ sigset(SIGINT, foo); sigrelse(SIGINT);
+ sighold(SIGINT); sigpause(SIGINT);
+ ], bash_cv_signal_vintage=svr3, bash_cv_signal_vintage=v7
+ )]
+ )]
+)
+])
+AC_MSG_RESULT($bash_cv_signal_vintage)
+if test "$bash_cv_signal_vintage" = posix; then
+AC_DEFINE(HAVE_POSIX_SIGNALS)
+elif test "$bash_cv_signal_vintage" = "4.2bsd"; then
+AC_DEFINE(HAVE_BSD_SIGNALS)
+elif test "$bash_cv_signal_vintage" = svr3; then
+AC_DEFINE(HAVE_USG_SIGHOLD)
+fi
+])
+
+dnl Check if the pgrp of setpgrp() can't be the pid of a zombie process.
+AC_DEFUN(BASH_PGRP_SYNC,
+[AC_REQUIRE([AC_FUNC_GETPGRP])
+AC_MSG_CHECKING(whether pgrps need synchronization)
+AC_CACHE_VAL(bash_cv_pgrp_pipe,
+[AC_TRY_RUN([
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+main()
+{
+# ifdef GETPGRP_VOID
+# define getpgID() getpgrp()
+# else
+# define getpgID() getpgrp(0)
+# define setpgid(x,y) setpgrp(x,y)
+# endif
+ int pid1, pid2, fds[2];
+ int status;
+ char ok;
+
+ switch (pid1 = fork()) {
+ case -1:
+ exit(1);
+ case 0:
+ setpgid(0, getpid());
+ exit(0);
+ }
+ setpgid(pid1, pid1);
+
+ sleep(2); /* let first child die */
+
+ if (pipe(fds) < 0)
+ exit(2);
+
+ switch (pid2 = fork()) {
+ case -1:
+ exit(3);
+ case 0:
+ setpgid(0, pid1);
+ ok = getpgID() == pid1;
+ write(fds[1], &ok, 1);
+ exit(0);
+ }
+ setpgid(pid2, pid1);
+
+ close(fds[1]);
+ if (read(fds[0], &ok, 1) != 1)
+ exit(4);
+ wait(&status);
+ wait(&status);
+ exit(ok ? 0 : 5);
+}
+], bash_cv_pgrp_pipe=no,bash_cv_pgrp_pipe=yes,
+ AC_MSG_ERROR(cannot check pgrp synchronization if cross compiling))
+])
+AC_MSG_RESULT($bash_cv_pgrp_pipe)
+if test $bash_cv_pgrp_pipe = yes; then
+AC_DEFINE(PGRP_PIPE)
+fi
+])
+
+dnl
+dnl check for typedef'd symbols in header files, but allow the caller to
+dnl specify the include files to be checked in addition to the default
+dnl
+dnl BASH_CHECK_TYPE(TYPE, HEADERS, DEFAULT[, VALUE-IF-FOUND])
+AC_DEFUN(BASH_CHECK_TYPE,
+[AC_REQUIRE([AC_HEADER_STDC])dnl
+AC_MSG_CHECKING(for $1)
+AC_CACHE_VAL(bash_cv_type_$1,
+[AC_EGREP_CPP($1, [#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#endif
+$2
+], bash_cv_type_$1=yes, bash_cv_type_$1=no)])
+AC_MSG_RESULT($bash_cv_type_$1)
+ifelse($#, 4, [if test $bash_cv_type_$1 = yes; then
+ AC_DEFINE($4)
+ fi])
+if test $bash_cv_type_$1 = no; then
+ AC_DEFINE($1, $3)
+fi
+])
+
+dnl
+dnl Type of struct rlimit fields: some systems (OSF/1, NetBSD, RISC/os 5.0)
+dnl have a rlim_t, others (4.4BSD based systems) use quad_t, others use
+dnl long and still others use int (HP-UX 9.01, SunOS 4.1.3). To simplify
+dnl matters, this just checks for rlim_t, quad_t, or long.
+dnl
+AC_DEFUN(BASH_RLIMIT_TYPE,
+[AC_MSG_CHECKING(for size and type of struct rlimit fields)
+AC_CACHE_VAL(bash_cv_type_rlimit,
+[AC_TRY_COMPILE([#include <sys/types.h>],
+[rlim_t xxx;], bash_cv_type_rlimit=rlim_t,[
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+main()
+{
+#ifdef HAVE_QUAD_T
+ struct rlimit rl;
+ if (sizeof(rl.rlim_cur) == sizeof(quad_t))
+ exit(0);
+#endif
+ exit(1);
+}], bash_cv_type_rlimit=quad_t, bash_cv_type_rlimit=long,
+ AC_MSG_ERROR(cannot check quad_t if cross compiling))])
+])
+AC_MSG_RESULT($bash_cv_type_rlimit)
+if test $bash_cv_type_rlimit = quad_t; then
+AC_DEFINE(RLIMTYPE, quad_t)
+elif test $bash_cv_type_rlimit = rlim_t; then
+AC_DEFINE(RLIMTYPE, rlim_t)
+fi
+])
+
+dnl
+dnl Check for sys_siglist[] or _sys_siglist[]
+dnl
+AC_DEFUN(BASH_UNDER_SYS_SIGLIST,
+[AC_MSG_CHECKING([for _sys_siglist in system C library])
+AC_CACHE_VAL(bash_cv_under_sys_siglist,
+[AC_TRY_RUN([
+#include <sys/types.h>
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifndef _sys_siglist
+extern char *_sys_siglist[];
+#endif
+main()
+{
+char *msg = _sys_siglist[2];
+exit(msg == 0);
+}],
+bash_cv_under_sys_siglist=yes, bash_cv_under_sys_siglist=no,
+AC_MSG_ERROR(cannot check for _sys_siglist[] if cross compiling))])dnl
+AC_MSG_RESULT($bash_cv_under_sys_siglist)
+if test $bash_cv_under_sys_siglist = yes; then
+AC_DEFINE(HAVE_UNDER_SYS_SIGLIST)
+fi
+])
+
+AC_DEFUN(BASH_SYS_SIGLIST,
+[AC_REQUIRE([AC_DECL_SYS_SIGLIST])
+AC_MSG_CHECKING([for sys_siglist in system C library])
+AC_CACHE_VAL(bash_cv_sys_siglist,
+[AC_TRY_RUN([
+#include <sys/types.h>
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifndef SYS_SIGLIST_DECLARED
+extern char *sys_siglist[];
+#endif
+main()
+{
+char *msg = sys_siglist[2];
+exit(msg == 0);
+}],
+bash_cv_sys_siglist=yes, bash_cv_sys_siglist=no,
+AC_MSG_ERROR(cannot check for sys_siglist if cross compiling))])dnl
+AC_MSG_RESULT($bash_cv_sys_siglist)
+if test $bash_cv_sys_siglist = yes; then
+AC_DEFINE(HAVE_SYS_SIGLIST)
+fi
+])
+
+dnl Check for sys_errlist[] and sys_nerr, check for declaration
+AC_DEFUN(BASH_SYS_ERRLIST,
+[AC_MSG_CHECKING([for sys_errlist and sys_nerr])
+AC_CACHE_VAL(bash_cv_sys_errlist,
+[AC_TRY_LINK([#include <errno.h>],
+[extern char *sys_errlist[];
+ extern int sys_nerr;
+ char *msg = sys_errlist[sys_nerr - 1];],
+ bash_cv_sys_errlist=yes, bash_cv_sys_errlist=no)])dnl
+AC_MSG_RESULT($bash_cv_sys_errlist)
+if test $bash_cv_sys_errlist = yes; then
+AC_DEFINE(HAVE_SYS_ERRLIST)
+fi
+])
+
+dnl Check to see if opendir will open non-directories (not a nice thing)
+AC_DEFUN(BASH_FUNC_OPENDIR_CHECK,
+[AC_REQUIRE([AC_HEADER_DIRENT])dnl
+AC_MSG_CHECKING(if opendir() opens non-directories)
+AC_CACHE_VAL(bash_cv_opendir_not_robust,
+[AC_TRY_RUN([
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+main()
+{
+DIR *dir;
+int fd;
+unlink("/tmp/not_a_directory");
+fd = open("/tmp/not_a_directory", O_WRONLY|O_CREAT, 0666);
+write(fd, "\n", 1);
+close(fd);
+dir = opendir("/tmp/not_a_directory");
+unlink("/tmp/not_a_directory");
+exit (dir == 0);
+}], bash_cv_opendir_not_robust=yes,bash_cv_opendir_not_robust=no,
+ AC_MSG_ERROR(cannot check opendir if cross compiling))])
+AC_MSG_RESULT($bash_cv_opendir_not_robust)
+if test $bash_cv_opendir_not_robust = yes; then
+AC_DEFINE(OPENDIR_NOT_ROBUST)
+fi
+])
+
+dnl
+AC_DEFUN(BASH_TYPE_SIGHANDLER,
+[AC_MSG_CHECKING([whether signal handlers are of type void])
+AC_CACHE_VAL(bash_cv_void_sighandler,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+void (*signal ()) ();],
+[int i;], bash_cv_void_sighandler=yes, bash_cv_void_sighandler=no)])dnl
+AC_MSG_RESULT($bash_cv_void_sighandler)
+if test $bash_cv_void_sighandler = yes; then
+AC_DEFINE(VOID_SIGHANDLER)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_STRSIGNAL,
+[AC_MSG_CHECKING([for the existance of strsignal])
+AC_CACHE_VAL(bash_cv_have_strsignal,
+[AC_TRY_LINK([#include <sys/types.h>
+#include <signal.h>],
+[char *s = (char *)strsignal(2);],
+ bash_cv_have_strsignal=yes, bash_cv_have_strsignal=no)])
+AC_MSG_RESULT($bash_cv_have_strsignal)
+if test $bash_cv_have_strsignal = yes; then
+AC_DEFINE(HAVE_STRSIGNAL)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_LSTAT,
+[dnl Cannot use AC_CHECK_FUNCS(lstat) because Linux defines lstat() as an
+dnl inline function in <sys/stat.h>.
+AC_CACHE_CHECK([for lstat], bash_cv_func_lstat,
+[AC_TRY_LINK([
+#include <sys/types.h>
+#include <sys/stat.h>
+],[ lstat("",(struct stat *)0); ],
+bash_cv_func_lstat=yes, bash_cv_func_lstat=no)])
+if test $bash_cv_func_lstat = yes; then
+ AC_DEFINE(HAVE_LSTAT)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_TERMIOS_LDISC,
+[AC_MSG_CHECKING([for a c_line member of struct termios])
+AC_CACHE_VAL(bash_cv_termios_ldisc,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <termios.h>],[struct termios t; int i; i = t.c_line;],
+ bash_cv_termios_ldisc=yes, bash_cv_termios_ldisc=no)])dnl
+AC_MSG_RESULT($bash_cv_termios_ldisc)
+if test $bash_cv_termios_ldisc = yes; then
+AC_DEFINE(TERMIOS_LDISC)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_TERMIO_LDISC,
+[AC_MSG_CHECKING([for a c_line member of struct termio])
+AC_CACHE_VAL(bash_cv_termio_ldisc,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <termio.h>],[struct termio t; int i; i = t.c_line;],
+ bash_cv_termio_ldisc=yes, bash_cv_termio_ldisc=no)])dnl
+AC_MSG_RESULT($bash_cv_termio_ldisc)
+if test $bash_cv_termio_ldisc = yes; then
+AC_DEFINE(TERMIO_LDISC)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_GETENV,
+[AC_MSG_CHECKING(to see if getenv can be redefined)
+AC_CACHE_VAL(bash_cv_getenv_redef,
+[AC_TRY_RUN([
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifndef __STDC__
+# ifndef const
+# define const
+# endif
+#endif
+char *
+getenv (name)
+#if defined (__linux__) || defined (__bsdi__) || defined (convex)
+ const char *name;
+#else
+ char const *name;
+#endif /* !__linux__ && !__bsdi__ && !convex */
+{
+return "42";
+}
+main()
+{
+char *s;
+/* The next allows this program to run, but does not allow bash to link
+ when it redefines getenv. I'm not really interested in figuring out
+ why not. */
+#if defined (NeXT)
+exit(1);
+#endif
+s = getenv("ABCDE");
+exit(s == 0); /* force optimizer to leave getenv in */
+}
+], bash_cv_getenv_redef=yes, bash_cv_getenv_redef=no,
+AC_MSG_ERROR(cannot check getenv redefinition if cross compiling))])
+AC_MSG_RESULT($bash_cv_getenv_redef)
+if test $bash_cv_getenv_redef = yes; then
+AC_DEFINE(CAN_REDEFINE_GETENV)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_PRINTF,
+[AC_MSG_CHECKING(for declaration of printf in <stdio.h>)
+AC_CACHE_VAL(bash_cv_printf_declared,
+[AC_TRY_RUN([
+#include <stdio.h>
+#ifdef __STDC__
+typedef int (*_bashfunc)(const char *, ...);
+#else
+typedef int (*_bashfunc)();
+#endif
+main()
+{
+_bashfunc pf;
+pf = printf;
+exit(pf == 0);
+}
+],bash_cv_printf_declared=yes, bash_cv_printf_declared=no,
+AC_MSG_ERROR(cannot check printf declaration if cross compiling))])
+AC_MSG_RESULT($bash_cv_printf_declared)
+if test $bash_cv_printf_declared = yes; then
+AC_DEFINE(PRINTF_DECLARED)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_ULIMIT_MAXFDS,
+[AC_MSG_CHECKING(whether ulimit can substitute for getdtablesize)
+AC_CACHE_VAL(bash_cv_ulimit_maxfds,
+[AC_TRY_RUN([
+main()
+{
+long maxfds = ulimit(4, 0L);
+exit (maxfds == -1L);
+}
+],bash_cv_ulimit_maxfds=yes, bash_cv_ulimit_maxfds=no,
+AC_MSG_ERROR(cannot check ulimit if cross compiling))])
+AC_MSG_RESULT($bash_cv_ulimit_maxfds)
+if test $bash_cv_ulimit_maxfds = yes; then
+AC_DEFINE(ULIMIT_MAXFDS)
+fi
+])
+
+AC_DEFUN(BASH_CHECK_LIB_TERMCAP,
+[
+if test "X$bash_cv_termcap_lib" = "X"; then
+_bash_needmsg=yes
+else
+AC_MSG_CHECKING(which library has the termcap functions)
+_bash_needmsg=
+fi
+AC_CACHE_VAL(bash_cv_termcap_lib,
+[AC_CHECK_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap,
+ [AC_CHECK_LIB(curses, tgetent, bash_cv_termcap_lib=libcurses,
+ [AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses,
+ bash_cv_termcap_lib=gnutermcap)])])])
+if test "X$_bash_needmsg" = "Xyes"; then
+AC_MSG_CHECKING(which library has the termcap functions)
+fi
+AC_MSG_RESULT(using $bash_cv_termcap_lib)
+if test $bash_cv_termcap_lib = gnutermcap; then
+LDFLAGS="$LDFLAGS -L./lib/termcap"
+TERMCAP_LIB="./lib/termcap/libtermcap.a"
+TERMCAP_DEP="./lib/termcap/libtermcap.a"
+elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then
+TERMCAP_LIB=-ltermcap
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libncurses; then
+TERMCAP_LIB=-lncurses
+TERMCAP_DEP=
+else
+TERMCAP_LIB=-lcurses
+TERMCAP_DEP=
+fi
+])
+
+AC_DEFUN(BASH_FUNC_GETCWD,
+[AC_MSG_CHECKING([if getcwd() calls popen()])
+AC_CACHE_VAL(bash_cv_getcwd_calls_popen,
+[AC_TRY_RUN([
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifndef __STDC__
+#ifndef const
+#define const
+#endif
+#endif
+
+int popen_called;
+
+FILE *
+popen(command, type)
+ const char *command;
+ const char *type;
+{
+ popen_called = 1;
+ return (FILE *)NULL;
+}
+
+FILE *_popen(command, type)
+ const char *command;
+ const char *type;
+{
+ return (popen (command, type));
+}
+
+int
+pclose(stream)
+FILE *stream;
+{
+ return 0;
+}
+
+int
+_pclose(stream)
+FILE *stream;
+{
+ return 0;
+}
+
+main()
+{
+ char lbuf[32];
+ popen_called = 0;
+ getcwd(lbuf, 32);
+ exit (popen_called);
+}
+], bash_cv_getcwd_calls_popen=no, bash_cv_getcwd_calls_popen=yes,
+AC_MSG_ERROR(cannot check whether getcwd calls popen if cross compiling))])
+AC_MSG_RESULT($bash_cv_getcwd_calls_popen)
+if test $bash_cv_getcwd_calls_popen = yes; then
+AC_DEFINE(GETCWD_BROKEN)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_DIRENT_D_INO,
+[AC_REQUIRE([AC_HEADER_DIRENT])
+AC_MSG_CHECKING(if struct dirent has a d_ino member)
+AC_CACHE_VAL(bash_cv_dirent_has_dino,
+[AC_TRY_COMPILE([
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+],[
+struct dirent d; int z; z = d.d_ino;
+], bash_cv_dirent_has_dino=yes, bash_cv_dirent_has_dino=no)])
+AC_MSG_RESULT($bash_cv_dirent_has_dino)
+if test $bash_cv_dirent_has_dino = yes; then
+AC_DEFINE(STRUCT_DIRENT_HAS_D_INO)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_DIRENT_D_FILENO,
+[AC_REQUIRE([AC_HEADER_DIRENT])
+AC_MSG_CHECKING(if struct dirent has a d_fileno member)
+AC_CACHE_VAL(bash_cv_dirent_has_d_fileno,
+[AC_TRY_COMPILE([
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+],[
+struct dirent d; int z; z = d.d_fileno;
+], bash_cv_dirent_has_d_fileno=yes, bash_cv_dirent_has_d_fileno=no)])
+AC_MSG_RESULT($bash_cv_dirent_has_d_fileno)
+if test $bash_cv_dirent_has_d_fileno = yes; then
+AC_DEFINE(STRUCT_DIRENT_HAS_D_FILENO)
+fi
+])
+
+AC_DEFUN(BASH_REINSTALL_SIGHANDLERS,
+[AC_REQUIRE([AC_TYPE_SIGNAL])
+AC_REQUIRE([BASH_SIGNAL_CHECK])
+AC_MSG_CHECKING([if signal handlers must be reinstalled when invoked])
+AC_CACHE_VAL(bash_cv_must_reinstall_sighandlers,
+[AC_TRY_RUN([
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+typedef RETSIGTYPE sigfunc();
+
+int nsigint;
+
+#ifdef HAVE_POSIX_SIGNALS
+sigfunc *
+set_signal_handler(sig, handler)
+ int sig;
+ sigfunc *handler;
+{
+ struct sigaction act, oact;
+ act.sa_handler = handler;
+ act.sa_flags = 0;
+ sigemptyset (&act.sa_mask);
+ sigemptyset (&oact.sa_mask);
+ sigaction (sig, &act, &oact);
+ return (oact.sa_handler);
+}
+#else
+#define set_signal_handler(s, h) signal(s, h)
+#endif
+
+RETSIGTYPE
+sigint(s)
+int s;
+{
+ nsigint++;
+}
+
+main()
+{
+ nsigint = 0;
+ set_signal_handler(SIGINT, sigint);
+ kill((int)getpid(), SIGINT);
+ kill((int)getpid(), SIGINT);
+ exit(nsigint != 2);
+}
+], bash_cv_must_reinstall_sighandlers=no, bash_cv_must_reinstall_sighandlers=yes,
+AC_MSG_ERROR(cannot check signal handling if cross compiling))])
+AC_MSG_RESULT($bash_cv_must_reinstall_sighandlers)
+if test $bash_cv_must_reinstall_sighandlers = yes; then
+AC_DEFINE(MUST_REINSTALL_SIGHANDLERS)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_SBRK_DECLARED,
+[AC_MSG_CHECKING(for declaration of sbrk in <unistd.h>)
+AC_CACHE_VAL(bash_cv_sbrk_declared,
+[AC_EGREP_HEADER(sbrk, unistd.h,
+ bash_cv_sbrk_declared=yes, bash_cv_sbrk_declared=no)])
+AC_MSG_RESULT($bash_cv_sbrk_declared)
+if test $bash_cv_sbrk_declared = yes; then
+AC_DEFINE(SBRK_DECLARED)
+fi
+])
+
+dnl check that some necessary job control definitions are present
+AC_DEFUN(BASH_JOB_CONTROL_MISSING,
+[AC_REQUIRE([BASH_SIGNAL_CHECK])
+AC_MSG_CHECKING(for presence of necessary job control definitions)
+AC_CACHE_VAL(bash_cv_job_control_missing,
+[AC_TRY_RUN([
+#include <sys/types.h>
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <signal.h>
+
+/* Add more tests in here as appropriate. */
+main()
+{
+/* signal type */
+#if !defined (HAVE_POSIX_SIGNALS) && !defined (HAVE_BSD_SIGNALS)
+exit(1);
+#endif
+
+/* signals and tty control. */
+#if !defined (SIGTSTP) || !defined (SIGSTOP) || !defined (SIGCONT)
+exit (1);
+#endif
+
+/* process control */
+#if !defined (WNOHANG) || !defined (WUNTRACED)
+exit(1);
+#endif
+
+/* Posix systems have tcgetpgrp and waitpid. */
+#if defined (_POSIX_VERSION) && !defined (HAVE_TCGETPGRP)
+exit(1);
+#endif
+
+#if defined (_POSIX_VERSION) && !defined (HAVE_WAITPID)
+exit(1);
+#endif
+
+/* Other systems have TIOCSPGRP/TIOCGPRGP and wait3. */
+#if !defined (_POSIX_VERSION) && !defined (HAVE_WAIT3)
+exit(1);
+#endif
+
+exit(0);
+}],bash_cv_job_control_missing=present, bash_cv_job_control_missing=missing,
+ AC_MSG_ERROR(cannot check job control if cross-compiling))
+])
+AC_MSG_RESULT($bash_cv_job_control_missing)
+if test $bash_cv_job_control_missing = missing; then
+AC_DEFINE(JOB_CONTROL_MISSING)
+fi
+])
+
+dnl check whether named pipes are present
+dnl this requires a previous check for mkfifo, but that is awkward to specify
+AC_DEFUN(BASH_SYS_NAMED_PIPES,
+[AC_MSG_CHECKING(for presence of named pipes)
+AC_CACHE_VAL(bash_cv_sys_named_pipes,
+[AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/* Add more tests in here as appropriate. */
+main()
+{
+int fd;
+
+#if defined (HAVE_MKFIFO)
+exit (0);
+#endif
+
+#if !defined (S_IFIFO) && (defined (_POSIX_VERSION) && !defined (S_ISFIFO))
+exit (1);
+#endif
+
+#if defined (NeXT)
+exit (1);
+#endif
+
+fd = mknod ("/tmp/sh-np-autoconf", 0666 | S_IFIFO, 0);
+if (fd == -1)
+ exit (1);
+close(fd);
+unlink ("/tmp/sh-np-autoconf");
+exit(0);
+}],bash_cv_sys_named_pipes=present, bash_cv_sys_named_pipes=missing,
+ AC_MSG_ERROR(cannot check for named pipes if cross-compiling))
+])
+AC_MSG_RESULT($bash_cv_sys_named_pipes)
+if test $bash_cv_sys_named_pipes = missing; then
+AC_DEFINE(NAMED_PIPES_MISSING)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_POSIX_SETJMP,
+[AC_REQUIRE([BASH_SIGNAL_CHECK])
+AC_MSG_CHECKING(for presence of POSIX-style sigsetjmp/siglongjmp)
+AC_CACHE_VAL(bash_cv_func_sigsetjmp,
+[AC_TRY_RUN([
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/types.h>
+#include <signal.h>
+#include <setjmp.h>
+
+main()
+{
+#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS)
+exit (1);
+#else
+
+int code;
+sigset_t set, oset;
+sigjmp_buf xx;
+
+/* get the mask */
+sigemptyset(&set);
+sigemptyset(&oset);
+sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &set);
+sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset);
+
+/* save it */
+code = sigsetjmp(xx, 1);
+if (code)
+ exit(0); /* could get sigmask and compare to oset here. */
+
+/* change it */
+sigaddset(&set, SIGINT);
+sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL);
+
+/* and siglongjmp */
+siglongjmp(xx, 10);
+exit(1);
+#endif
+}],bash_cv_func_sigsetjmp=present, bash_cv_func_sigsetjmp=missing,
+ AC_MSG_ERROR(cannot check for sigsetjmp/siglongjmp if cross-compiling))
+])
+AC_MSG_RESULT($bash_cv_func_sigsetjmp)
+if test $bash_cv_func_sigsetjmp = present; then
+AC_DEFINE(HAVE_POSIX_SIGSETJMP)
+fi
+])
+
+AC_DEFUN(BASH_HAVE_TIOCGWINSZ,
+[AC_MSG_CHECKING(for TIOCGWINSZ in sys/ioctl.h)
+AC_CACHE_VAL(bash_cv_tiocgwinsz_in_ioctl,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/ioctl.h>], [int x = TIOCGWINSZ;],
+ bash_cv_tiocgwinsz_in_ioctl=yes,bash_cv_tiocgwinsz_in_ioctl=no)])
+AC_MSG_RESULT($bash_cv_tiocgwinsz_in_ioctl)
+if test $bash_cv_tiocgwinsz_in_ioctl = yes; then
+AC_DEFINE(GWINSZ_IN_SYS_IOCTL)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_WINSIZE,
+[AC_MSG_CHECKING(for struct winsize in sys/ioctl.h)
+AC_CACHE_VAL(bash_cv_struct_winsize_in_ioctl,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/ioctl.h>], [struct winsize x;],
+ bash_cv_struct_winsize_in_ioctl=yes,bash_cv_struct_winsize_in_ioctl=no)])
+AC_MSG_RESULT($bash_cv_struct_winsize_in_ioctl)
+if test $bash_cv_struct_winsize_in_ioctl = yes; then
+AC_DEFINE(STRUCT_WINSIZE_IN_SYS_IOCTL)
+fi
+])
+
+AC_DEFUN(BASH_HAVE_TIOCSTAT,
+[AC_MSG_CHECKING(for TIOCSTAT in sys/ioctl.h)
+AC_CACHE_VAL(bash_cv_tiocstat_in_ioctl,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/ioctl.h>], [int x = TIOCSTAT;],
+ bash_cv_tiocstat_in_ioctl=yes,bash_cv_tiocstat_in_ioctl=no)])
+AC_MSG_RESULT($bash_cv_tiocstat_in_ioctl)
+if test $bash_cv_tiocstat_in_ioctl = yes; then
+AC_DEFINE(TIOCSTAT_IN_SYS_IOCTL)
+fi
+])
+
+AC_DEFUN(BASH_HAVE_FIONREAD,
+[AC_MSG_CHECKING(for FIONREAD in sys/ioctl.h)
+AC_CACHE_VAL(bash_cv_fionread_in_ioctl,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/ioctl.h>], [int x = FIONREAD;],
+ bash_cv_fionread_in_ioctl=yes,bash_cv_fionread_in_ioctl=no)])
+AC_MSG_RESULT($bash_cv_fionread_in_ioctl)
+if test $bash_cv_fionread_in_ioctl = yes; then
+AC_DEFINE(FIONREAD_IN_SYS_IOCTL)
+fi
+])
+
+dnl
+dnl See if speed_t is declared in <sys/types.h>. Some versions of linux
+dnl require a definition of speed_t each time <termcap.h> is included,
+dnl but you can only get speed_t if you include <termios.h> (on some
+dnl versions) or <sys/types.h> (on others).
+dnl
+AC_DEFUN(BASH_MISC_SPEED_T,
+[AC_MSG_CHECKING(for speed_t in sys/types.h)
+AC_CACHE_VAL(bash_cv_speed_t_in_sys_types,
+[AC_TRY_COMPILE([#include <sys/types.h>], [speed_t x;],
+ bash_cv_speed_t_in_sys_types=yes,bash_cv_speed_t_in_sys_types=no)])
+AC_MSG_RESULT($bash_cv_speed_t_in_sys_types)
+if test $bash_cv_speed_t_in_sys_types = yes; then
+AC_DEFINE(SPEED_T_IN_SYS_TYPES)
+fi
+])
+
+AC_DEFUN(BASH_CHECK_GETPW_FUNCS,
+[AC_MSG_CHECKING(whether programs are able to redeclare getpw functions)
+AC_CACHE_VAL(bash_cv_can_redecl_getpw,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <pwd.h>
+extern struct passwd *getpwent();], [struct passwd *z; z = getpwent();],
+ bash_cv_can_redecl_getpw=yes,bash_cv_can_redecl_getpw=no)])
+AC_MSG_RESULT($bash_cv_can_redecl_getpw)
+if test $bash_cv_can_redecl_getpw = no; then
+AC_DEFINE(HAVE_GETPW_DECLS)
+fi
+])
+
+AC_DEFUN(BASH_CHECK_DEV_FD,
+[AC_MSG_CHECKING(whether /dev/fd is available)
+AC_CACHE_VAL(bash_cv_dev_fd,
+[if test -d /dev/fd && test -r /dev/fd/0; then
+ bash_cv_dev_fd=standard
+ elif test -d /proc/self/fd && test -r /proc/self/fd/0; then
+ bash_cv_dev_fd=whacky
+ else
+ bash_cv_dev_fd=absent
+ fi
+])
+AC_MSG_RESULT($bash_cv_dev_fd)
+if test $bash_cv_dev_fd = "standard"; then
+ AC_DEFINE(HAVE_DEV_FD)
+ AC_DEFINE(DEV_FD_PREFIX, "/dev/fd/")
+elif test $bash_cv_dev_fd = "whacky"; then
+ AC_DEFINE(HAVE_DEV_FD)
+ AC_DEFINE(DEV_FD_PREFIX, "/proc/self/fd/")
+fi
+])
+
+dnl
+dnl Check for the presence of getpeername (the only networking function
+dnl bash currently requires) in libsocket. If libsocket is present,
+dnl check for libnsl and add it to LIBS if it's there, since most
+dnl systems with libsocket require linking with libnsl as well.
+dnl This should only be called if getpeername was not found in libc.
+dnl
+AC_DEFUN(BASH_CHECK_SOCKLIB,
+[
+if test "X$bash_cv_have_socklib" = "X"; then
+_bash_needmsg=
+else
+AC_MSG_CHECKING(for socket library)
+_bash_needmsg=yes
+fi
+AC_CACHE_VAL(bash_cv_have_socklib,
+[AC_CHECK_LIB(socket, getpeername,
+ bash_cv_have_socklib=yes, bash_cv_have_socklib=no, -lnsl)])
+if test "X$_bash_needmsg" = Xyes; then
+ AC_MSG_RESULT($bash_cv_have_socklib)
+ _bash_needmsg=
+fi
+if test $bash_cv_have_socklib = yes; then
+ # check for libnsl, add it to LIBS if present
+ if test "X$bash_cv_have_libnsl" = "X"; then
+ _bash_needmsg=
+ else
+ AC_MSG_CHECKING(for libnsl)
+ _bash_needmsg=yes
+ fi
+ AC_CACHE_VAL(bash_cv_have_libnsl,
+ [AC_CHECK_LIB(nsl, t_open,
+ bash_cv_have_libnsl=yes, bash_cv_have_libnsl=no)])
+ if test "X$_bash_needmsg" = Xyes; then
+ AC_MSG_RESULT($bash_cv_have_libnsl)
+ _bash_needmsg=
+ fi
+ if test $bash_cv_have_libnsl = yes; then
+ LIBS="-lsocket -lnsl $LIBS"
+ else
+ LIBS="-lsocket $LIBS"
+ fi
+ AC_DEFINE(HAVE_LIBSOCKET)
+ AC_DEFINE(HAVE_GETPEERNAME)
+fi
+])
+
+AC_DEFUN(BASH_DEFAULT_MAIL_DIR,
+[AC_MSG_CHECKING(for default mail directory)
+AC_CACHE_VAL(bash_cv_mail_dir,
+[if test -d /var/mail; then
+ bash_cv_mail_dir=/var/mail
+ elif test -d /usr/mail; then
+ bash_cv_mail_dir=/usr/mail
+ elif test -d /usr/spool/mail; then
+ bash_cv_mail_dir=/usr/spool/mail
+ elif test -d /var/spool/mail; then
+ bash_cv_mail_dir=/var/spool/mail
+ else
+ bash_cv_mail_dir=unknown
+ fi
+])
+AC_MSG_RESULT($bash_cv_mail_dir)
+if test $bash_cv_mail_dir = "/var/mail"; then
+ AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "/var/mail")
+elif test $bash_cv_mail_dir = "/usr/mail"; then
+ AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "/usr/mail")
+elif test $bash_cv_mail_dir = "/var/spool/mail"; then
+ AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "/var/spool/mail")
+elif test $bash_cv_mail_dir = "/usr/spool/mail"; then
+ AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "/usr/spool/mail")
+else
+ AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "unknown")
+fi
+])
+
+dnl
+dnl Check if HPUX needs _KERNEL defined for RLIMIT_* definitions
+dnl
+AC_DEFUN(BASH_KERNEL_RLIMIT_CHECK,
+[AC_MSG_CHECKING([whether $host_os needs _KERNEL for RLIMIT defines])
+AC_CACHE_VAL(bash_cv_kernel_rlimit,
+[AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/resource.h>
+],
+[
+ int f;
+ f = RLIMIT_DATA;
+], bash_cv_kernel_rlimit=no,
+ [AC_TRY_COMPILE([
+ #include <sys/types.h>
+ #define _KERNEL
+ #include <sys/resource.h>
+ #undef _KERNEL
+ ],
+ [
+ int f;
+ f = RLIMIT_DATA;
+ ], bash_cv_kernel_rlimit=yes, bash_cv_kernel_rlimit=no)]
+)])
+AC_MSG_RESULT($bash_cv_kernel_rlimit)
+if test $bash_cv_kernel_rlimit = yes; then
+AC_DEFINE(RLIMIT_NEEDS_KERNEL)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_STRCOLL,
+[
+AC_MSG_CHECKING(whether or not strcoll and strcmp differ)
+AC_CACHE_VAL(bash_cv_func_strcoll_broken,
+[AC_TRY_RUN([
+#include <stdio.h>
+#if defined (HAVE_LOCALE_H)
+#include <locale.h>
+#endif
+
+main(c, v)
+int c;
+char *v[];
+{
+ int r1, r2;
+ char *deflocale, *defcoll;
+
+#ifdef HAVE_SETLOCALE
+ deflocale = setlocale(LC_ALL, "");
+ defcoll = setlocale(LC_COLLATE, "");
+#endif
+
+#ifdef HAVE_STRCOLL
+ /* These two values are taken from tests/glob-test. */
+ r1 = strcoll("abd", "aXd");
+#else
+ r1 = 0;
+#endif
+ r2 = strcmp("abd", "aXd");
+
+ /* These two should both be greater than 0. It is permissible for
+ a system to return different values, as long as the sign is the
+ same. */
+
+ /* Exit with 1 (failure) if these two values are both > 0, since
+ this tests whether strcoll(3) is broken with respect to strcmp(3)
+ in the default locale. */
+ exit (r1 > 0 && r2 > 0);
+}
+], bash_cv_func_strcoll_broken=yes, bash_cv_func_strcoll_broken=no,
+ AC_MSG_ERROR(cannot check strcoll if cross compiling))
+])
+AC_MSG_RESULT($bash_cv_func_strcoll_broken)
+if test $bash_cv_func_strcoll_broken = yes; then
+AC_DEFINE(STRCOLL_BROKEN)
+fi
+])
diff --git a/bind.c b/bind.c
index 8821599..24c8c48 100644
--- a/bind.c
+++ b/bind.c
@@ -21,13 +21,16 @@
675 Mass Ave, Cambridge, MA 02139, USA. */
#define READLINE_LIBRARY
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
-#if !defined (NO_SYS_FILE)
+#if defined (HAVE_SYS_FILE_H)
# include <sys/file.h>
-#endif /* !NO_SYS_FILE */
-#include <signal.h>
+#endif /* HAVE_SYS_FILE_H */
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
@@ -39,8 +42,9 @@
# include "ansi_stdlib.h"
#endif /* HAVE_STDLIB_H */
+#include <signal.h>
#include <errno.h>
-/* Not all systems declare ERRNO in errno.h... and some systems #define it! */
+
#if !defined (errno)
extern int errno;
#endif /* !errno */
@@ -65,6 +69,8 @@ extern int _rl_meta_flag;
extern int _rl_convert_meta_chars_to_ascii;
extern int _rl_output_meta_chars;
extern int _rl_complete_show_all;
+extern int _rl_complete_mark_directories;
+extern int _rl_enable_keypad;
#if defined (PAREN_MATCHING)
extern int rl_blink_matching_paren;
#endif /* PAREN_MATCHING */
@@ -73,36 +79,36 @@ extern int rl_visible_stats;
#endif /* VISIBLE_STATS */
extern int rl_complete_with_tilde_expansion;
extern int rl_completion_query_items;
-#if defined (VI_MODE)
-extern char *rl_vi_comment_begin;
-#endif
+extern int rl_inhibit_completion;
+extern char *_rl_comment_begin;
extern int rl_explicit_arg;
extern int rl_editing_mode;
-extern unsigned short _rl_parsing_conditionalized_out;
+extern unsigned char _rl_parsing_conditionalized_out;
extern Keymap _rl_keymap;
extern char *possible_control_prefixes[], *possible_meta_prefixes[];
+/* Functions imported from funmap.c */
extern char **rl_funmap_names ();
+extern int rl_add_funmap_entry ();
+
+/* Functions imported from util.c */
+extern char *_rl_strindex ();
+
+/* Functions imported from shell.c */
+extern char *get_env_value ();
+
+/* Variables exported by this file. */
+Keymap rl_binding_keymap;
/* Forward declarations */
void rl_set_keymap_from_edit_mode ();
static int glean_key_from_name ();
+static int substring_member_of_array ();
-#if defined (HAVE_STRCASECMP)
-#define stricmp strcasecmp
-#define strnicmp strncasecmp
-#else
-static int stricmp (), strnicmp ();
-#endif
-
-#if defined (STATIC_MALLOC)
-static char *xmalloc (), *xrealloc ();
-#else
extern char *xmalloc (), *xrealloc ();
-#endif /* STATIC_MALLOC */
/* **************************************************************** */
/* */
@@ -113,6 +119,7 @@ extern char *xmalloc (), *xrealloc ();
/* rl_add_defun (char *name, Function *function, int key)
Add NAME to the list of named functions. Make FUNCTION be the function
that gets called. If KEY is not -1, then bind it. */
+int
rl_add_defun (name, function, key)
char *name;
Function *function;
@@ -150,6 +157,7 @@ rl_bind_key (key, function)
_rl_keymap[key].type = ISFUNC;
_rl_keymap[key].function = function;
+ rl_binding_keymap = _rl_keymap;
return (0);
}
@@ -162,8 +170,9 @@ rl_bind_key_in_map (key, function, map)
Keymap map;
{
int result;
- Keymap oldmap = _rl_keymap;
+ Keymap oldmap;
+ oldmap = _rl_keymap;
_rl_keymap = map;
result = rl_bind_key (key, function);
_rl_keymap = oldmap;
@@ -192,17 +201,19 @@ rl_unbind_key_in_map (key, map)
/* Bind the key sequence represented by the string KEYSEQ to
FUNCTION. This makes new keymaps as necessary. The initial
place to do bindings is in MAP. */
+int
rl_set_key (keyseq, function, map)
char *keyseq;
Function *function;
Keymap map;
{
- return (rl_generic_bind (ISFUNC, keyseq, function, map));
+ return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map));
}
/* Bind the key sequence represented by the string KEYSEQ to
the string of characters MACRO. This makes new keymaps as
necessary. The initial place to do bindings is in MAP. */
+int
rl_macro_bind (keyseq, macro, map)
char *keyseq, *macro;
Keymap map;
@@ -226,6 +237,7 @@ rl_macro_bind (keyseq, macro, map)
pointed to by DATA, right now this can be a function (ISFUNC),
a macro (ISMACR), or a keymap (ISKMAP). This makes new keymaps
as necessary. The initial place to do bindings is in MAP. */
+int
rl_generic_bind (type, keyseq, data, map)
int type;
char *keyseq, *data;
@@ -286,6 +298,8 @@ rl_generic_bind (type, keyseq, data, map)
map[ic].function = KEYMAP_TO_FUNCTION (data);
map[ic].type = type;
}
+
+ rl_binding_keymap = map;
}
free (keys);
return 0;
@@ -294,30 +308,30 @@ rl_generic_bind (type, keyseq, data, map)
/* Translate the ASCII representation of SEQ, stuffing the values into ARRAY,
an array of characters. LEN gets the final length of ARRAY. Return
non-zero if there was an error parsing SEQ. */
+int
rl_translate_keyseq (seq, array, len)
char *seq, *array;
int *len;
{
- register int i, c, l = 0;
+ register int i, c, l;
- for (i = 0; c = seq[i]; i++)
+ for (i = l = 0; c = seq[i]; i++)
{
if (c == '\\')
{
c = seq[++i];
- if (!c)
+ if (c == 0)
break;
- if (((c == 'C' || c == 'M') && seq[i + 1] == '-') ||
- (c == 'e'))
+ if (((c == 'C' || c == 'M') && seq[i + 1] == '-') || (c == 'e'))
{
/* Handle special case of backwards define. */
if (strncmp (&seq[i], "C-\\M-", 5) == 0)
{
array[l++] = ESC;
i += 5;
- array[l++] = CTRL (to_upper (seq[i]));
+ array[l++] = CTRL (_rl_to_upper (seq[i]));
if (!seq[i])
i--;
continue;
@@ -327,16 +341,13 @@ rl_translate_keyseq (seq, array, len)
{
case 'M':
i++;
- array[l++] = ESC;
+ array[l++] = ESC; /* XXX */
break;
case 'C':
i += 2;
/* Special hack for C-?... */
- if (seq[i] == '?')
- array[l++] = RUBOUT;
- else
- array[l++] = CTRL (to_upper (seq[i]));
+ array[l++] = (seq[i] == '?') ? RUBOUT : CTRL (_rl_to_upper (seq[i]));
break;
case 'e':
@@ -354,6 +365,99 @@ rl_translate_keyseq (seq, array, len)
return (0);
}
+char *
+rl_untranslate_keyseq (seq)
+ int seq;
+{
+ static char kseq[16];
+ int i, c;
+
+ i = 0;
+ c = seq;
+ if (META_CHAR (c))
+ {
+ kseq[i++] = '\\';
+ kseq[i++] = 'M';
+ kseq[i++] = '-';
+ c = UNMETA (c);
+ }
+ else if (CTRL_CHAR (c))
+ {
+ kseq[i++] = '\\';
+ kseq[i++] = 'C';
+ kseq[i++] = '-';
+ c = _rl_to_lower (UNCTRL (c));
+ }
+ else if (c == RUBOUT)
+ {
+ kseq[i++] = '\\';
+ kseq[i++] = 'C';
+ kseq[i++] = '-';
+ c = '?';
+ }
+
+ if (c == ESC)
+ {
+ kseq[i++] = '\\';
+ c = 'e';
+ }
+ else if (c == '\\' || c == '"')
+ {
+ kseq[i++] = '\\';
+ }
+
+ kseq[i++] = (unsigned char) c;
+ kseq[i] = '\0';
+ return kseq;
+}
+
+static char *
+_rl_untranslate_macro_value (seq)
+ char *seq;
+{
+ char *ret, *r, *s;
+ int c;
+
+ r = ret = xmalloc (7 * strlen (seq) + 1);
+ for (s = seq; *s; s++)
+ {
+ c = *s;
+ if (META_CHAR (c))
+ {
+ *r++ = '\\';
+ *r++ = 'M';
+ *r++ = '-';
+ c = UNMETA (c);
+ }
+ else if (CTRL_CHAR (c) && c != ESC)
+ {
+ *r++ = '\\';
+ *r++ = 'C';
+ *r++ = '-';
+ c = _rl_to_lower (UNCTRL (c));
+ }
+ else if (c == RUBOUT)
+ {
+ *r++ = '\\';
+ *r++ = 'C';
+ *r++ = '-';
+ c = '?';
+ }
+
+ if (c == ESC)
+ {
+ *r++ = '\\';
+ c = 'e';
+ }
+ else if (c == '\\' || c == '"')
+ *r++ = '\\';
+
+ *r++ = (unsigned char)c;
+ }
+ *r = '\0';
+ return ret;
+}
+
/* Return a pointer to the function that STRING represents.
If STRING doesn't have a matching function, then a NULL pointer
is returned. */
@@ -366,7 +470,7 @@ rl_named_function (string)
rl_initialize_funmap ();
for (i = 0; funmap[i]; i++)
- if (stricmp (funmap[i]->name, string) == 0)
+ if (_rl_stricmp (funmap[i]->name, string) == 0)
return (funmap[i]->function);
return ((Function *)NULL);
}
@@ -435,7 +539,12 @@ rl_function_of_keyseq (keyseq, map, type)
/* The last key bindings file read. */
static char *last_readline_init_file = (char *)NULL;
+/* The file we're currently reading key bindings from. */
+static char *current_readline_init_file;
+static int current_readline_init_lineno;
+
/* Re-read the current keybindings file. */
+int
rl_re_read_init_file (count, ignore)
int count, ignore;
{
@@ -462,18 +571,19 @@ rl_read_init_file (filename)
int file;
/* Default the filename. */
- if (!filename)
+ if (filename == 0)
{
filename = last_readline_init_file;
- if (!filename)
- filename = getenv ("INPUTRC");
- if (!filename)
+ if (filename == 0)
+ filename = get_env_value ("INPUTRC");
+ if (filename == 0)
filename = DEFAULT_INPUTRC;
}
- if (!*filename)
+ if (*filename == 0)
filename = DEFAULT_INPUTRC;
+ current_readline_init_file = filename;
openname = tilde_expand (filename);
if ((stat (openname, &finfo) < 0) ||
@@ -503,6 +613,7 @@ rl_read_init_file (filename)
/* Loop over the lines in the file. Lines that start with `#' are
comments; all other lines are commands for readline initialization. */
+ current_readline_init_lineno = 1;
line = buffer;
end = buffer + finfo.st_size;
while (line < end)
@@ -526,11 +637,21 @@ rl_read_init_file (filename)
/* Move to the next line. */
line += i + 1;
+ current_readline_init_lineno++;
}
free (buffer);
return (0);
}
+static void
+_rl_init_file_error (msg)
+ char *msg;
+{
+ fprintf (stderr, "readline: %s: line %d: %s\n", current_readline_init_file,
+ current_readline_init_lineno,
+ msg);
+}
+
/* **************************************************************** */
/* */
/* Parser Directives */
@@ -544,8 +665,8 @@ char *rl_readline_name = "other";
/* Stack of previous values of parsing_conditionalized_out. */
static unsigned char *if_stack = (unsigned char *)NULL;
-static int if_stack_depth = 0;
-static int if_stack_size = 0;
+static int if_stack_depth;
+static int if_stack_size;
/* Push _rl_parsing_conditionalized_out, and set parser state based
on ARGS. */
@@ -579,7 +700,7 @@ parser_if (args)
/* Handle "if term=foo" and "if mode=emacs" constructs. If this
isn't term=foo, or mode=emacs, then check to see if the first
word in ARGS is the same as the value stored in rl_readline_name. */
- if (rl_terminal_name && strnicmp (args, "term=", 5) == 0)
+ if (rl_terminal_name && _rl_strnicmp (args, "term=", 5) == 0)
{
char *tem, *tname;
@@ -593,35 +714,28 @@ parser_if (args)
if someone has a `sun-cmd' and does not want to have bindings
that will be executed if the terminal is a `sun', they can put
`$if term=sun-cmd' into their .inputrc. */
- if ((stricmp (args + 5, tname) == 0) ||
- (stricmp (args + 5, rl_terminal_name) == 0))
- _rl_parsing_conditionalized_out = 0;
- else
- _rl_parsing_conditionalized_out = 1;
-
+ _rl_parsing_conditionalized_out = _rl_stricmp (args + 5, tname) &&
+ _rl_stricmp (args + 5, rl_terminal_name);
free (tname);
}
#if defined (VI_MODE)
- else if (strnicmp (args, "mode=", 5) == 0)
+ else if (_rl_strnicmp (args, "mode=", 5) == 0)
{
int mode;
- if (stricmp (args + 5, "emacs") == 0)
+ if (_rl_stricmp (args + 5, "emacs") == 0)
mode = emacs_mode;
- else if (stricmp (args + 5, "vi") == 0)
+ else if (_rl_stricmp (args + 5, "vi") == 0)
mode = vi_mode;
else
mode = no_mode;
- if (mode == rl_editing_mode)
- _rl_parsing_conditionalized_out = 0;
- else
- _rl_parsing_conditionalized_out = 1;
+ _rl_parsing_conditionalized_out = mode != rl_editing_mode;
}
#endif /* VI_MODE */
/* Check to see if the first word in ARGS is the same as the
value stored in rl_readline_name. */
- else if (stricmp (args, rl_readline_name) == 0)
+ else if (_rl_stricmp (args, rl_readline_name) == 0)
_rl_parsing_conditionalized_out = 0;
else
_rl_parsing_conditionalized_out = 1;
@@ -705,7 +819,7 @@ handle_parser_directive (statement)
/* Lookup the command, and act on it. */
for (i = 0; parser_directives[i].name; i++)
- if (stricmp (directive, parser_directives[i].name) == 0)
+ if (_rl_stricmp (directive, parser_directives[i].name) == 0)
{
(*parser_directives[i].function) (args);
return (0);
@@ -715,12 +829,11 @@ handle_parser_directive (statement)
return (1);
}
-static int substring_member_of_array ();
-
/* Read the binding command from STRING and perform it.
A key binding command looks like: Keyname: function-name\0,
a variable binding command looks like: set variable value.
A new-style keybinding looks like "\C-x\C-x": exchange-point-and-mark. */
+int
rl_parse_and_bind (string)
char *string;
{
@@ -770,6 +883,12 @@ rl_parse_and_bind (string)
if (c == '"')
break;
}
+ /* If we didn't find a closing quote, abort the line. */
+ if (string[i] == '\0')
+ {
+ _rl_init_file_error ("no closing `\"' in key binding");
+ return 1;
+ }
}
/* Advance to the colon (:) or whitespace which separates the two objects. */
@@ -786,7 +905,7 @@ rl_parse_and_bind (string)
string[i++] = '\0';
/* If this is a command to set a variable, then do that. */
- if (stricmp (string, "set") == 0)
+ if (_rl_stricmp (string, "set") == 0)
{
char *var = string + i;
char *value;
@@ -915,7 +1034,7 @@ rl_parse_and_bind (string)
/* Add in control and meta bits. */
if (substring_member_of_array (string, possible_control_prefixes))
- key = CTRL (to_upper (key));
+ key = CTRL (_rl_to_upper (key));
if (substring_member_of_array (string, possible_meta_prefixes))
key = META (key);
@@ -923,18 +1042,18 @@ rl_parse_and_bind (string)
/* Temporary. Handle old-style keyname with macro-binding. */
if (*funname == '\'' || *funname == '"')
{
- char seq[2];
+ unsigned char useq[2];
int fl = strlen (funname);
- seq[0] = key; seq[1] = '\0';
+ useq[0] = key; useq[1] = '\0';
if (fl && funname[fl - 1] == *funname)
funname[fl - 1] = '\0';
- rl_macro_bind (seq, &funname[1], _rl_keymap);
+ rl_macro_bind (useq, &funname[1], _rl_keymap);
}
#if defined (PREFIX_META_HACK)
/* Ugly, but working hack to keep prefix-meta around. */
- else if (stricmp (funname, "prefix-meta") == 0)
+ else if (_rl_stricmp (funname, "prefix-meta") == 0)
{
char seq[2];
@@ -956,22 +1075,27 @@ static struct {
char *name;
int *value;
} boolean_varlist [] = {
- { "horizontal-scroll-mode", &_rl_horizontal_scroll_mode },
- { "mark-modified-lines", &_rl_mark_modified_lines },
- { "meta-flag", &_rl_meta_flag },
#if defined (PAREN_MATCHING)
{ "blink-matching-paren", &rl_blink_matching_paren },
#endif
{ "convert-meta", &_rl_convert_meta_chars_to_ascii },
- { "show-all-if-ambiguous", &_rl_complete_show_all },
+ { "disable-completion", &rl_inhibit_completion },
+ { "enable-keypad", &_rl_enable_keypad },
+ { "expand-tilde", &rl_complete_with_tilde_expansion },
+ { "horizontal-scroll-mode", &_rl_horizontal_scroll_mode },
+ { "input-meta", &_rl_meta_flag },
+ { "mark-directories", &_rl_complete_mark_directories },
+ { "mark-modified-lines", &_rl_mark_modified_lines },
+ { "meta-flag", &_rl_meta_flag },
{ "output-meta", &_rl_output_meta_chars },
+ { "show-all-if-ambiguous", &_rl_complete_show_all },
#if defined (VISIBLE_STATS)
{ "visible-stats", &rl_visible_stats },
#endif /* VISIBLE_STATS */
- { "expand-tilde", &rl_complete_with_tilde_expansion },
{ (char *)NULL, (int *)NULL }
};
+int
rl_variable_bind (name, value)
char *name, *value;
{
@@ -980,15 +1104,12 @@ rl_variable_bind (name, value)
/* Check for simple variables first. */
for (i = 0; boolean_varlist[i].name; i++)
{
- if (stricmp (name, boolean_varlist[i].name) == 0)
+ if (_rl_stricmp (name, boolean_varlist[i].name) == 0)
{
/* A variable is TRUE if the "value" is "on", "1" or "". */
- if ((!*value) ||
- (stricmp (value, "On") == 0) ||
- (value[0] == '1' && value[1] == '\0'))
- *boolean_varlist[i].value = 1;
- else
- *boolean_varlist[i].value = 0;
+ *boolean_varlist[i].value = *value == 0 ||
+ _rl_stricmp (value, "on") == 0 ||
+ (value[0] == '1' && value[1] == '\0');
return 0;
}
}
@@ -996,16 +1117,16 @@ rl_variable_bind (name, value)
/* Not a boolean variable, so check for specials. */
/* Editing mode change? */
- if (stricmp (name, "editing-mode") == 0)
+ if (_rl_stricmp (name, "editing-mode") == 0)
{
- if (strnicmp (value, "vi", 2) == 0)
+ if (_rl_strnicmp (value, "vi", 2) == 0)
{
#if defined (VI_MODE)
_rl_keymap = vi_insertion_keymap;
rl_editing_mode = vi_mode;
#endif /* VI_MODE */
}
- else if (strnicmp (value, "emacs", 5) == 0)
+ else if (_rl_strnicmp (value, "emacs", 5) == 0)
{
_rl_keymap = emacs_standard_keymap;
rl_editing_mode = emacs_mode;
@@ -1013,19 +1134,17 @@ rl_variable_bind (name, value)
}
/* Comment string change? */
- else if (stricmp (name, "comment-begin") == 0)
+ else if (_rl_stricmp (name, "comment-begin") == 0)
{
-#if defined (VI_MODE)
if (*value)
{
- if (rl_vi_comment_begin)
- free (rl_vi_comment_begin);
+ if (_rl_comment_begin)
+ free (_rl_comment_begin);
- rl_vi_comment_begin = savestring (value);
+ _rl_comment_begin = savestring (value);
}
-#endif /* VI_MODE */
}
- else if (stricmp (name, "completion-query-items") == 0)
+ else if (_rl_stricmp (name, "completion-query-items") == 0)
{
int nval = 100;
if (*value)
@@ -1036,31 +1155,31 @@ rl_variable_bind (name, value)
}
rl_completion_query_items = nval;
}
- else if (stricmp (name, "keymap") == 0)
+ else if (_rl_stricmp (name, "keymap") == 0)
{
Keymap kmap;
kmap = rl_get_keymap_by_name (value);
if (kmap)
rl_set_keymap (kmap);
}
- else if (stricmp (name, "bell-style") == 0)
+ else if (_rl_stricmp (name, "bell-style") == 0)
{
if (!*value)
_rl_bell_preference = AUDIBLE_BELL;
else
{
- if (stricmp (value, "none") == 0 || stricmp (value, "off") == 0)
+ if (_rl_stricmp (value, "none") == 0 || _rl_stricmp (value, "off") == 0)
_rl_bell_preference = NO_BELL;
- else if (stricmp (value, "audible") == 0 || stricmp (value, "on") == 0)
+ else if (_rl_stricmp (value, "audible") == 0 || _rl_stricmp (value, "on") == 0)
_rl_bell_preference = AUDIBLE_BELL;
- else if (stricmp (value, "visible") == 0)
+ else if (_rl_stricmp (value, "visible") == 0)
_rl_bell_preference = VISIBLE_BELL;
}
}
- else if (stricmp (name, "prefer-visible-bell") == 0)
+ else if (_rl_stricmp (name, "prefer-visible-bell") == 0)
{
/* Backwards compatibility. */
- if (*value && (stricmp (value, "on") == 0 ||
+ if (*value && (_rl_stricmp (value, "on") == 0 ||
(*value == '1' && !value[1])))
_rl_bell_preference = VISIBLE_BELL;
else
@@ -1100,7 +1219,7 @@ glean_key_from_name (name)
register int i;
for (i = 0; name_key_alist[i].name; i++)
- if (stricmp (name, name_key_alist[i].name) == 0)
+ if (_rl_stricmp (name, name_key_alist[i].name) == 0)
return (name_key_alist[i].value);
return (*(unsigned char *)name); /* XXX was return (*name) */
@@ -1136,6 +1255,17 @@ rl_get_keymap_by_name (name)
return ((Keymap) NULL);
}
+char *
+rl_get_keymap_name (map)
+ Keymap map;
+{
+ register int i;
+ for (i = 0; keymap_names[i].name; i++)
+ if (map == keymap_names[i].map)
+ return (keymap_names[i].name);
+ return ((char *)NULL);
+}
+
void
rl_set_keymap (map)
Keymap map;
@@ -1160,7 +1290,20 @@ rl_set_keymap_from_edit_mode ()
_rl_keymap = vi_insertion_keymap;
#endif /* VI_MODE */
}
-
+
+char *
+rl_get_keymap_name_from_edit_mode ()
+{
+ if (rl_editing_mode == emacs_mode)
+ return "emacs";
+#if defined (VI_MODE)
+ else if (rl_editing_mode == vi_mode)
+ return "vi";
+#endif /* VI_MODE */
+ else
+ return "none";
+}
+
/* **************************************************************** */
/* */
/* Key Binding and Function Information */
@@ -1174,8 +1317,7 @@ rl_set_keymap_from_edit_mode ()
/* Print the names of functions known to Readline. */
void
-rl_list_funmap_names (count, ignore)
- int count, ignore;
+rl_list_funmap_names ()
{
register int i;
char **funmap_names;
@@ -1191,6 +1333,67 @@ rl_list_funmap_names (count, ignore)
free (funmap_names);
}
+static char *
+_rl_get_keyname (key)
+ int key;
+{
+ char *keyname;
+ int i, c;
+
+ keyname = (char *)xmalloc (8);
+
+ c = key;
+ /* Since this is going to be used to write out keysequence-function
+ pairs for possible inclusion in an inputrc file, we don't want to
+ do any special meta processing on KEY. */
+
+#if 0
+ /* We might want to do this, but the old version of the code did not. */
+
+ /* If this is an escape character, we don't want to do any more processing.
+ Just add the special ESC key sequence and return. */
+ if (c == ESC)
+ {
+ keyseq[0] = '\\';
+ keyseq[1] = 'e';
+ keyseq[2] = '\0';
+ return keyseq;
+ }
+#endif
+
+ /* RUBOUT is translated directly into \C-? */
+ if (key == RUBOUT)
+ {
+ keyname[0] = '\\';
+ keyname[1] = 'C';
+ keyname[2] = '-';
+ keyname[3] = '?';
+ keyname[4] = '\0';
+ return keyname;
+ }
+
+ i = 0;
+ /* Now add special prefixes needed for control characters. This can
+ potentially change C. */
+ if (CTRL_CHAR (c))
+ {
+ keyname[i++] = '\\';
+ keyname[i++] = 'C';
+ keyname[i++] = '-';
+ c = _rl_to_lower (UNCTRL (c));
+ }
+
+ /* Now, if the character needs to be quoted with a backslash, do that. */
+ if (c == '\\' || c == '"')
+ keyname[i++] = '\\';
+
+ /* Now add the key, terminate the string, and return it. */
+ keyname[i++] = (char) c;
+ keyname[i] = '\0';
+
+ return keyname;
+}
+
/* Return a NULL terminated array of strings which represent the key
sequences that are used to invoke FUNCTION in MAP. */
char **
@@ -1205,7 +1408,7 @@ rl_invoking_keyseqs_in_map (function, map)
result = (char **)NULL;
result_index = result_size = 0;
- for (key = 0; key < 128; key++)
+ for (key = 0; key < KEYMAP_SIZE; key++)
{
switch (map[key].type)
{
@@ -1217,27 +1420,15 @@ rl_invoking_keyseqs_in_map (function, map)
then add the current KEY to the list of invoking keys. */
if (map[key].function == function)
{
- char *keyname = (char *)xmalloc (5);
+ char *keyname;
- if (CTRL_CHAR (key))
- sprintf (keyname, "\\C-%c", to_lower (UNCTRL (key)));
- else if (key == RUBOUT)
- sprintf (keyname, "\\C-?");
- else if (key == '\\' || key == '"')
- {
- keyname[0] = '\\';
- keyname[1] = (char) key;
- keyname[2] = '\0';
- }
- else
- {
- keyname[0] = (char) key;
- keyname[1] = '\0';
- }
+ keyname = _rl_get_keyname (key);
if (result_index + 2 > result_size)
- result = (char **) xrealloc
- (result, (result_size += 10) * sizeof (char *));
+ {
+ result_size += 10;
+ result = (char **) xrealloc (result, result_size * sizeof (char *));
+ }
result[result_index++] = keyname;
result[result_index] = (char *)NULL;
@@ -1246,53 +1437,56 @@ rl_invoking_keyseqs_in_map (function, map)
case ISKMAP:
{
- char **seqs = (char **)NULL;
+ char **seqs;
+ register int i;
/* Find the list of keyseqs in this map which have FUNCTION as
their target. Add the key sequences found to RESULT. */
if (map[key].function)
seqs =
rl_invoking_keyseqs_in_map (function, FUNCTION_TO_KEYMAP (map, key));
+ else
+ break;
+
+ if (seqs == 0)
+ break;
- if (seqs)
+ for (i = 0; seqs[i]; i++)
{
- register int i;
+ char *keyname = (char *)xmalloc (6 + strlen (seqs[i]));
+
+ if (key == ESC)
+ sprintf (keyname, "\\e");
+ else if (CTRL_CHAR (key))
+ sprintf (keyname, "\\C-%c", _rl_to_lower (UNCTRL (key)));
+ else if (key == RUBOUT)
+ sprintf (keyname, "\\C-?");
+ else if (key == '\\' || key == '"')
+ {
+ keyname[0] = '\\';
+ keyname[1] = (char) key;
+ keyname[2] = '\0';
+ }
+ else
+ {
+ keyname[0] = (char) key;
+ keyname[1] = '\0';
+ }
+
+ strcat (keyname, seqs[i]);
+ free (seqs[i]);
- for (i = 0; seqs[i]; i++)
+ if (result_index + 2 > result_size)
{
- char *keyname = (char *)xmalloc (6 + strlen (seqs[i]));
-
- if (key == ESC)
- sprintf (keyname, "\\e");
- else if (CTRL_CHAR (key))
- sprintf (keyname, "\\C-%c", to_lower (UNCTRL (key)));
- else if (key == RUBOUT)
- sprintf (keyname, "\\C-?");
- else if (key == '\\' || key == '"')
- {
- keyname[0] = '\\';
- keyname[1] = (char) key;
- keyname[2] = '\0';
- }
- else
- {
- keyname[0] = (char) key;
- keyname[1] = '\0';
- }
-
- strcat (keyname, seqs[i]);
- free (seqs[i]);
-
- if (result_index + 2 > result_size)
- result = (char **) xrealloc
- (result, (result_size += 10) * sizeof (char *));
-
- result[result_index++] = keyname;
- result[result_index] = (char *)NULL;
+ result_size += 10;
+ result = (char **) xrealloc (result, result_size * sizeof (char *));
}
- free (seqs);
+ result[result_index++] = keyname;
+ result[result_index] = (char *)NULL;
}
+
+ free (seqs);
}
break;
}
@@ -1309,18 +1503,6 @@ rl_invoking_keyseqs (function)
return (rl_invoking_keyseqs_in_map (function, _rl_keymap));
}
-/* Print all of the current functions and their bindings to
- rl_outstream. If an explicit argument is given, then print
- the output in such a way that it can be read back in. */
-int
-rl_dump_functions (count, key)
- int count, key;
-{
- rl_function_dumper (rl_explicit_arg);
- rl_on_new_line ();
- return (0);
-}
-
/* Print all of the functions and their bindings to rl_outstream. If
PRINT_READABLY is non-zero, then print the output in such a way
that it can be read back in. */
@@ -1391,6 +1573,177 @@ rl_function_dumper (print_readably)
}
}
+/* Print all of the current functions and their bindings to
+ rl_outstream. If an explicit argument is given, then print
+ the output in such a way that it can be read back in. */
+int
+rl_dump_functions (count, key)
+ int count, key;
+{
+ if (rl_dispatching)
+ fprintf (rl_outstream, "\r\n");
+ rl_function_dumper (rl_explicit_arg);
+ rl_on_new_line ();
+ return (0);
+}
+
+static void
+_rl_macro_dumper_internal (print_readably, map, prefix)
+ int print_readably;
+ Keymap map;
+ char *prefix;
+{
+ register int key;
+ char *keyname, *out;
+ int prefix_len;
+
+ for (key = 0; key < KEYMAP_SIZE; key++)
+ {
+ switch (map[key].type)
+ {
+ case ISMACR:
+ keyname = _rl_get_keyname (key);
+#if 0
+ out = (char *)map[key].function;
+#else
+ out = _rl_untranslate_macro_value ((char *)map[key].function);
+#endif
+ if (print_readably)
+ fprintf (rl_outstream, "\"%s%s\": \"%s\"\n", prefix ? prefix : "",
+ keyname,
+ out ? out : "");
+ else
+ fprintf (rl_outstream, "%s%s outputs %s\n", prefix ? prefix : "",
+ keyname,
+ out ? out : "");
+ free (keyname);
+#if 1
+ free (out);
+#endif
+ break;
+ case ISFUNC:
+ break;
+ case ISKMAP:
+ prefix_len = prefix ? strlen (prefix) : 0;
+ if (key == ESC)
+ {
+ keyname = xmalloc (3 + prefix_len);
+ if (prefix)
+ strcpy (keyname, prefix);
+ keyname[prefix_len] = '\\';
+ keyname[prefix_len + 1] = 'e';
+ keyname[prefix_len + 2] = '\0';
+ }
+ else
+ {
+ keyname = _rl_get_keyname (key);
+ if (prefix)
+ {
+ out = xmalloc (strlen (keyname) + prefix_len + 1);
+ strcpy (out, prefix);
+ strcpy (out + prefix_len, keyname);
+ free (keyname);
+ keyname = out;
+ }
+ }
+
+ _rl_macro_dumper_internal (print_readably, FUNCTION_TO_KEYMAP (map, key), keyname);
+ free (keyname);
+ break;
+ }
+ }
+}
+
+void
+rl_macro_dumper (print_readably)
+ int print_readably;
+{
+ _rl_macro_dumper_internal (print_readably, _rl_keymap, (char *)NULL);
+}
+
+int
+rl_dump_macros (count, key)
+ int count, key;
+{
+ if (rl_dispatching)
+ fprintf (rl_outstream, "\r\n");
+ rl_macro_dumper (rl_explicit_arg);
+ rl_on_new_line ();
+ return (0);
+}
+
+void
+rl_variable_dumper (print_readably)
+ int print_readably;
+{
+ int i;
+ char *kname;
+
+ for (i = 0; boolean_varlist[i].name; i++)
+ {
+ if (print_readably)
+ fprintf (rl_outstream, "set %s %s\n", boolean_varlist[i].name,
+ *boolean_varlist[i].value ? "on" : "off");
+ else
+ fprintf (rl_outstream, "%s is set to `%s'\n", boolean_varlist[i].name,
+ *boolean_varlist[i].value ? "on" : "off");
+ }
+
+ /* bell-style */
+ switch (_rl_bell_preference)
+ {
+ case NO_BELL: kname = "none"; break;
+ case VISIBLE_BELL: kname = "visible"; break;
+ case AUDIBLE_BELL:
+ default: kname = "audible"; break;
+ }
+ if (print_readably)
+ fprintf (rl_outstream, "set bell-style %s\n", kname);
+ else
+ fprintf (rl_outstream, "bell-style is set to `%s'\n", kname);
+
+ /* comment-begin */
+ if (print_readably)
+ fprintf (rl_outstream, "set comment-begin %s\n", _rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT);
+ else
+ fprintf (rl_outstream, "comment-begin is set to `%s'\n", _rl_comment_begin ? _rl_comment_begin : "");
+
+ /* completion-query-items */
+ if (print_readably)
+ fprintf (rl_outstream, "set completion-query-items %d\n", rl_completion_query_items);
+ else
+ fprintf (rl_outstream, "completion-query-items is set to `%d'\n", rl_completion_query_items);
+
+ /* editing-mode */
+ if (print_readably)
+ fprintf (rl_outstream, "set editing-mode %s\n", (rl_editing_mode == emacs_mode) ? "emacs" : "vi");
+ else
+ fprintf (rl_outstream, "editing-mode is set to `%s'\n", (rl_editing_mode == emacs_mode) ? "emacs" : "vi");
+
+ /* keymap */
+ kname = rl_get_keymap_name (_rl_keymap);
+ if (kname == 0)
+ kname = rl_get_keymap_name_from_edit_mode ();
+ if (print_readably)
+ fprintf (rl_outstream, "set keymap %s\n", kname ? kname : "none");
+ else
+ fprintf (rl_outstream, "keymap is set to `%s'\n", kname ? kname : "none");
+}
+
+/* Print all of the current variables and their values to
+ rl_outstream. If an explicit argument is given, then print
+ the output in such a way that it can be read back in. */
+int
+rl_dump_variables (count, key)
+ int count, key;
+{
+ if (rl_dispatching)
+ fprintf (rl_outstream, "\r\n");
+ rl_variable_dumper (rl_explicit_arg);
+ rl_on_new_line ();
+ return (0);
+}
+
/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. */
void
_rl_bind_if_unbound (keyseq, default_func)
@@ -1407,14 +1760,6 @@ _rl_bind_if_unbound (keyseq, default_func)
}
}
-/* **************************************************************** */
-/* */
-/* String Utility Functions */
-/* */
-/* **************************************************************** */
-
-static char *strindex ();
-
/* Return non-zero if any members of ARRAY are a substring in STRING. */
static int
substring_member_of_array (string, array)
@@ -1422,66 +1767,9 @@ substring_member_of_array (string, array)
{
while (*array)
{
- if (strindex (string, *array))
+ if (_rl_strindex (string, *array))
return (1);
array++;
}
return (0);
}
-
-#if !defined (HAVE_STRCASECMP)
-/* Whoops, Unix doesn't have strnicmp. */
-
-/* Compare at most COUNT characters from string1 to string2. Case
- doesn't matter. */
-static int
-strnicmp (string1, string2, count)
- char *string1, *string2;
- int count;
-{
- register char ch1, ch2;
-
- while (count)
- {
- ch1 = *string1++;
- ch2 = *string2++;
- if (to_upper(ch1) == to_upper(ch2))
- count--;
- else
- break;
- }
- return (count);
-}
-
-/* strcmp (), but caseless. */
-static int
-stricmp (string1, string2)
- char *string1, *string2;
-{
- register char ch1, ch2;
-
- while (*string1 && *string2)
- {
- ch1 = *string1++;
- ch2 = *string2++;
- if (to_upper(ch1) != to_upper(ch2))
- return (1);
- }
- return (*string1 - *string2);
-}
-#endif /* !HAVE_STRCASECMP */
-
-/* Determine if s2 occurs in s1. If so, return a pointer to the
- match in s1. The compare is case insensitive. */
-static char *
-strindex (s1, s2)
- register char *s1, *s2;
-{
- register int i, l = strlen (s2);
- register int len = strlen (s1);
-
- for (i = 0; (len - i) >= l; i++)
- if (strnicmp (s1 + i, s2, l) == 0)
- return (s1 + i);
- return ((char *)NULL);
-}
diff --git a/callback.c b/callback.c
new file mode 100644
index 0000000..04c5bbd
--- /dev/null
+++ b/callback.c
@@ -0,0 +1,149 @@
+/* callback.c -- functions to use readline as an X `callback' mechanism. */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline Library 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.
+
+ The GNU Readline Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include "rlconf.h"
+
+#if defined (READLINE_CALLBACKS)
+
+#include <sys/types.h>
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "readline.h"
+
+extern void readline_internal_startup ();
+extern char *readline_internal_teardown ();
+extern int readline_internal_char ();
+extern void _rl_init_line_state ();
+
+extern int _rl_meta_flag;
+extern char *rl_prompt;
+extern int rl_visible_prompt_length;
+
+/* **************************************************************** */
+/* */
+/* Callback Readline Functions */
+/* */
+/* **************************************************************** */
+
+/* Allow using readline in situations where a program may have multiple
+ things to handle at once, and dispatches them via select(). Call
+ rl_callback_handler_install() with the prompt and a function to call
+ whenever a complete line of input is ready. The user must then
+ call readline_char() every time some input is available, and
+ readline_char() will call the user's function with the complete text
+ read in at each end of line. The terminal is kept prepped and signals
+ handled all the time, except during calls to the user's function. */
+
+VFunction *rl_linefunc; /* user callback function */
+static int in_handler; /* terminal_prepped and signals set? */
+
+/* Make sure the terminal is set up, initialize readline, and prompt. */
+static void
+_rl_callback_newline ()
+{
+ rl_initialize ();
+
+ if (in_handler == 0)
+ {
+ in_handler = 1;
+
+ (*rl_prep_term_function) (_rl_meta_flag);
+
+#if defined (HANDLE_SIGNALS)
+ rl_set_signals ();
+#endif
+ }
+
+ readline_internal_setup ();
+}
+
+/* Install a readline handler, set up the terminal, and issue the prompt. */
+void
+rl_callback_handler_install (prompt, linefunc)
+ char *prompt;
+ VFunction *linefunc;
+{
+ rl_prompt = prompt;
+ rl_visible_prompt_length = rl_prompt ? rl_expand_prompt (rl_prompt) : 0;
+ rl_linefunc = linefunc;
+ _rl_callback_newline ();
+}
+
+/* Read one character, and dispatch to the handler if it ends the line. */
+void
+rl_callback_read_char ()
+{
+ char *line;
+ int eof;
+
+ if (rl_linefunc == NULL)
+ {
+ fprintf (stderr, "readline: readline_callback_read_char() called with no handler!\r\n");
+ abort ();
+ }
+
+ eof = readline_internal_char ();
+
+ if (rl_done)
+ {
+ line = readline_internal_teardown (eof);
+
+ (*rl_deprep_term_function) ();
+#if defined (HANDLE_SIGNALS)
+ rl_clear_signals ();
+#endif
+ in_handler = 0;
+ (*rl_linefunc) (line);
+
+ /* If the user did not clear out the line, do it for him. */
+ if (rl_line_buffer[0])
+ _rl_init_line_state ();
+
+ /* Redisplay the prompt if readline_handler_{install,remove} not called. */
+ if (in_handler == 0 && rl_linefunc)
+ _rl_callback_newline ();
+ }
+}
+
+/* Remove the handler, and make sure the terminal is in its normal state. */
+void
+rl_callback_handler_remove ()
+{
+ rl_linefunc = NULL;
+ if (in_handler)
+ {
+ in_handler = 0;
+ (*rl_deprep_term_function) ();
+#if defined (HANDLE_SIGNALS)
+ rl_clear_signals ();
+#endif
+ }
+}
+
+#endif
diff --git a/chardefs.h b/chardefs.h
index 8c92811..8e6f0ef 100644
--- a/chardefs.h
+++ b/chardefs.h
@@ -20,16 +20,20 @@
have a copy of the license, write to the Free Software Foundation,
675 Mass Ave, Cambridge, MA 02139, USA. */
-#ifndef _CHARDEFS_H
-#define _CHARDEFS_H
+#ifndef _CHARDEFS_H_
+#define _CHARDEFS_H_
#include <ctype.h>
-#if defined (HAVE_STRING_H)
-# include <string.h>
+#if defined (HAVE_CONFIG_H)
+# if defined (HAVE_STRING_H)
+# include <string.h>
+# else
+# include <strings.h>
+# endif /* HAVE_STRING_H */
#else
-# include <strings.h>
-#endif /* HAVE_STRING_H */
+# include <string.h>
+#endif /* !HAVE_CONFIG_H */
#ifndef whitespace
#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
@@ -47,39 +51,40 @@
#define meta_character_bit 0x080 /* x0000000, must be on. */
#define largest_char 255 /* Largest character value. */
-#define CTRL_CHAR(c) ((c) < control_character_threshold)
+#define CTRL_CHAR(c) ((c) < control_character_threshold && (c) >= 0)
#define META_CHAR(c) ((c) > meta_character_threshold && (c) <= largest_char)
#define CTRL(c) ((c) & control_character_mask)
#define META(c) ((c) | meta_character_bit)
#define UNMETA(c) ((c) & (~meta_character_bit))
-#define UNCTRL(c) to_upper(((c)|control_character_bit))
+#define UNCTRL(c) _rl_to_upper(((c)|control_character_bit))
/* Old versions
-#define lowercase_p(c) (((c) > ('a' - 1) && (c) < ('z' + 1)))
-#define uppercase_p(c) (((c) > ('A' - 1) && (c) < ('Z' + 1)))
-#define digit_p(c) ((c) >= '0' && (c) <= '9')
+#define _rl_lowercase_p(c) (((c) > ('a' - 1) && (c) < ('z' + 1)))
+#define _rl_uppercase_p(c) (((c) > ('A' - 1) && (c) < ('Z' + 1)))
+#define _rl_digit_p(c) ((c) >= '0' && (c) <= '9')
*/
-#define lowercase_p(c) (islower(c))
-#define uppercase_p(c) (isupper(c))
-#define digit_p(x) (isdigit (x))
+#define _rl_lowercase_p(c) (islower(c))
+#define _rl_uppercase_p(c) (isupper(c))
+#define _rl_digit_p(x) (isdigit (x))
-#define pure_alphabetic(c) (lowercase_p(c) || uppercase_p(c))
+#define _rl_pure_alphabetic(c) (_rl_lowercase_p(c) || _rl_uppercase_p(c))
+#define ALPHABETIC(c) (_rl_lowercase_p(c) || _rl_uppercase_p(c) || _rl_digit_p(c))
/* Old versions
-# define to_upper(c) (lowercase_p(c) ? ((c) - 32) : (c))
-# define to_lower(c) (uppercase_p(c) ? ((c) + 32) : (c))
+# define _rl_to_upper(c) (_rl_lowercase_p(c) ? ((c) - 32) : (c))
+# define _rl_to_lower(c) (_rl_uppercase_p(c) ? ((c) + 32) : (c))
*/
-#ifndef to_upper
-# define to_upper(c) (islower(c) ? toupper(c) : (c))
-# define to_lower(c) (isupper(c) ? tolower(c) : (c))
+#ifndef _rl_to_upper
+# define _rl_to_upper(c) (islower(c) ? toupper(c) : (c))
+# define _rl_to_lower(c) (isupper(c) ? tolower(c) : (c))
#endif
-#ifndef digit_value
-#define digit_value(x) ((x) - '0')
+#ifndef _rl_digit_value
+#define _rl_digit_value(x) ((x) - '0')
#endif
#ifndef NEWLINE
@@ -119,4 +124,4 @@
#define ESC CTRL('[')
-#endif /* _CHARDEFS_H */
+#endif /* _CHARDEFS_H_ */
diff --git a/complete.c b/complete.c
index 2180132..b17c63e 100644
--- a/complete.c
+++ b/complete.c
@@ -21,12 +21,15 @@
675 Mass Ave, Cambridge, MA 02139, USA. */
#define READLINE_LIBRARY
-#include <stdio.h>
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
#include <sys/types.h>
#include <fcntl.h>
-#if !defined (NO_SYS_FILE)
-# include <sys/file.h>
-#endif /* !NO_SYS_FILE */
+#if defined (HAVE_SYS_FILE_H)
+#include <sys/file.h>
+#endif
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
@@ -38,14 +41,15 @@
# include "ansi_stdlib.h"
#endif /* HAVE_STDLIB_H */
+#include <stdio.h>
+
#include <errno.h>
-/* Not all systems declare ERRNO in errno.h... and some systems #define it! */
#if !defined (errno)
extern int errno;
#endif /* !errno */
#include <pwd.h>
-#if defined (USG) && !defined (HAVE_GETPW_DECLS)
+#if !defined (HAVE_GETPW_DECLS)
extern struct passwd *getpwent ();
#endif /* USG && !HAVE_GETPW_DECLS */
@@ -58,6 +62,7 @@ extern struct passwd *getpwent ();
# endif /* !__STDC__ */
#endif /* isc386 && _POSIX_SOURCE */
+#include "posixdir.h"
#include "posixstat.h"
/* System-specific feature definitions and include files. */
@@ -66,35 +71,36 @@ extern struct passwd *getpwent ();
/* Some standard library routines. */
#include "readline.h"
-/* Possible values for do_replace in rl_complete_internal. */
-#define NO_MATCH 0
-#define SINGLE_MATCH 1
-#define MULT_MATCH 2
-
-#if !defined (strchr) && !defined (__STDC__)
-extern char *strchr (), *strrchr ();
-#endif /* !strchr && !__STDC__ */
-
extern char *tilde_expand ();
extern char *rl_copy_text ();
+extern void _rl_abort_internal ();
+extern int _rl_qsort_string_compare ();
extern Function *rl_last_func;
extern int rl_editing_mode;
extern int screenwidth;
+extern void _rl_move_vert ();
+extern int _rl_vis_botlin;
+extern int rl_display_fixed;
+
/* Forward declarations for functions defined and used in this file. */
char *filename_completion_function ();
char **completion_matches ();
-static int compare_strings ();
+static char *rl_quote_filename ();
static char *rl_strpbrk ();
-#if defined (STATIC_MALLOC)
-static char *xmalloc (), *xrealloc ();
-#else
+static char **remove_duplicate_matches ();
+static void insert_text ();
+static void insert_match ();
+static void append_to_match ();
+static void insert_all_matches ();
+static void display_matches ();
+static int compute_lcd_of_matches ();
+
extern char *xmalloc (), *xrealloc ();
-#endif /* STATIC_MALLOC */
-
+
/* If non-zero, then this is the address of a function to call when
completing on a directory name. The function is called with
the address of a string (the current directory name) as an arg. */
@@ -106,6 +112,9 @@ int rl_complete_with_tilde_expansion = 0;
/* If non-zero, non-unique completions always show the list of matches. */
int _rl_complete_show_all = 0;
+/* If non-zero, completed directory names have a slash appended. */
+int _rl_complete_mark_directories = 1;
+
#if defined (VISIBLE_STATS)
# if !defined (X_OK)
# define X_OK 1
@@ -125,8 +134,11 @@ int rl_visible_stats = 0;
/* */
/* **************************************************************** */
+/* Local variable states what happened during the last completion attempt. */
+static int completion_changed_buffer;
+
/* Pointer to the generator function for completion_matches ().
- NULL means to use filename_entry_function (), the default filename
+ NULL means to use filename_completion_function (), the default filename
completer. */
Function *rl_completion_entry_function = (Function *)NULL;
@@ -143,54 +155,10 @@ CPPFunction *rl_attempted_completion_function = (CPPFunction *)NULL;
user-specified completion function has been called. */
int rl_attempted_completion_over = 0;
-/* Local variable states what happened during the last completion attempt. */
-static int completion_changed_buffer = 0;
-
-/* Complete the word at or before point. You have supplied the function
- that does the initial simple matching selection algorithm (see
- completion_matches ()). The default is to do filename completion. */
-
-rl_complete (ignore, invoking_key)
- int ignore, invoking_key;
-{
- if (rl_last_func == rl_complete && !completion_changed_buffer)
- return (rl_complete_internal ('?'));
- else if (_rl_complete_show_all)
- return (rl_complete_internal ('!'));
- else
- return (rl_complete_internal (TAB));
-}
-
-/* List the possible completions. See description of rl_complete (). */
-rl_possible_completions (ignore, invoking_key)
- int ignore, invoking_key;
-{
- return (rl_complete_internal ('?'));
-}
-
-rl_insert_completions (ignore, invoking_key)
- int ignore, invoking_key;
-{
- return (rl_complete_internal ('*'));
-}
-
-/* The user must press "y" or "n". Non-zero return means "y" pressed. */
-get_y_or_n ()
-{
- int c;
-
- for (;;)
- {
- c = rl_read_key ();
- if (c == 'y' || c == 'Y' || c == ' ')
- return (1);
- if (c == 'n' || c == 'N' || c == RUBOUT)
- return (0);
- if (c == ABORT_CHAR)
- rl_abort ();
- ding ();
- }
-}
+/* Set to a character indicating the type of completion being performed
+ by rl_complete_internal, available for use by application completion
+ functions. */
+int rl_completion_type = 0;
/* Up to this many items will be displayed in response to a
possible-completions call. After that, we ask the user if
@@ -202,6 +170,9 @@ int rl_completion_query_items = 100;
in the shell, i.e. " \t\n\"\\'`@$><=" */
char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{(";
+/* List of basic quoting characters. */
+char *rl_basic_quote_characters = "\"'";
+
/* The list of characters that signal a break between words for
rl_complete_internal. The default list is the contents of
rl_basic_word_break_characters. */
@@ -213,6 +184,9 @@ char *rl_completer_word_break_characters = (char *)NULL;
unless they also appear within this list. */
char *rl_completer_quote_characters = (char *)NULL;
+/* List of characters that should be quoted in filenames by the completer. */
+char *rl_filename_quote_characters = (char *)NULL;
+
/* List of characters that are word break characters, but should be left
in TEXT when it is passed to the completion function. The shell uses
this to help determine what kind of completing to do. */
@@ -228,7 +202,7 @@ int rl_filename_completion_desired = 0;
/* Non-zero means that the results of the matches are to be quoted using
double quotes (or an application-specific quoting mechanism) if the
- filename contains any characters in rl_word_break_chars. This is
+ filename contains any characters in rl_filename_quote_chars. This is
ALWAYS non-zero on entry, and can only be changed within a completion
entry finder function. */
int rl_filename_quoting_desired = 1;
@@ -244,43 +218,80 @@ int rl_filename_quoting_desired = 1;
to implement FIGNORE a la SunOS csh. */
Function *rl_ignore_some_completions_function = (Function *)NULL;
-#if defined (SHELL)
-/* A function to strip quotes that are not protected by backquotes. It
- allows single quotes to appear within double quotes, and vice versa.
- It should be smarter. It's fairly shell-specific, hence the SHELL
- definition wrapper. */
-static char *
-_delete_quotes (text)
- char *text;
+/* Set to a function to quote a filename in an application-specific fashion.
+ Called with the text to quote, the type of match found (single or multiple)
+ and a pointer to the quoting character to be used, which the function can
+ reset if desired. */
+CPFunction *rl_filename_quoting_function = rl_quote_filename;
+
+/* Function to call to remove quoting characters from a filename. Called
+ before completion is attempted, so the embedded quotes do not interfere
+ with matching names in the file system. Readline doesn't do anything
+ with this; it's set only by applications. */
+CPFunction *rl_filename_dequoting_function = (CPFunction *)NULL;
+
+/* Function to call to decide whether or not a word break character is
+ quoted. If a character is quoted, it does not break words for the
+ completer. */
+Function *rl_char_is_quoted_p = (Function *)NULL;
+
+/* Character appended to completed words when at the end of the line. The
+ default is a space. */
+int rl_completion_append_character = ' ';
+
+/* If non-zero, inhibit completion (temporarily). */
+int rl_inhibit_completion;
+
+/* Complete the word at or before point. You have supplied the function
+ that does the initial simple matching selection algorithm (see
+ completion_matches ()). The default is to do filename completion. */
+int
+rl_complete (ignore, invoking_key)
+ int ignore, invoking_key;
{
- char *ret, *p, *r;
- int l, quoted;
+ if (rl_inhibit_completion)
+ return (rl_insert (ignore, invoking_key));
+ else if (rl_last_func == rl_complete && !completion_changed_buffer)
+ return (rl_complete_internal ('?'));
+ else if (_rl_complete_show_all)
+ return (rl_complete_internal ('!'));
+ else
+ return (rl_complete_internal (TAB));
+}
+
+/* List the possible completions. See description of rl_complete (). */
+int
+rl_possible_completions (ignore, invoking_key)
+ int ignore, invoking_key;
+{
+ return (rl_complete_internal ('?'));
+}
- l = strlen (text);
- ret = xmalloc (l + 1);
- for (quoted = 0, p = text, r = ret; p && *p; p++)
+int
+rl_insert_completions (ignore, invoking_key)
+ int ignore, invoking_key;
+{
+ return (rl_complete_internal ('*'));
+}
+
+/* The user must press "y" or "n". Non-zero return means "y" pressed. */
+static int
+get_y_or_n ()
+{
+ int c;
+
+ for (;;)
{
- /* Allow backslash-quoted characters to pass through unscathed. */
- if (*p == '\\')
- continue;
- /* Close quote. */
- if (quoted && *p == quoted)
- {
- quoted = 0;
- continue;
- }
- /* Open quote. */
- if (quoted == 0 && (*p == '\'' || *p == '"'))
- {
- quoted = *p;
- continue;
- }
- *r++ = *p;
+ c = rl_read_key ();
+ if (c == 'y' || c == 'Y' || c == ' ')
+ return (1);
+ if (c == 'n' || c == 'N' || c == RUBOUT)
+ return (0);
+ if (c == ABORT_CHAR)
+ _rl_abort_internal ();
+ ding ();
}
- *r = '\0';
- return ret;
}
-#endif /* SHELL */
/* Return the portion of PATHNAME that should be output when listing
possible completions. If we are hacking filename completion, we
@@ -290,33 +301,52 @@ static char *
printable_part (pathname)
char *pathname;
{
- char *temp = (char *)NULL;
-
- if (rl_filename_completion_desired)
- temp = strrchr (pathname, '/');
+ char *temp;
- if (!temp)
- return (pathname);
- else
- return (++temp);
+ temp = rl_filename_completion_desired ? strrchr (pathname, '/') : (char *)NULL;
+ return (temp ? ++temp : pathname);
}
/* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and we
are using it, check for and output a single character for `special'
filenames. Return 1 if we printed an extension character, 0 if not. */
+
+#define PUTX(c) \
+ if (CTRL_CHAR (c)) \
+ { \
+ putc ('^', rl_outstream); \
+ putc (UNCTRL (c), rl_outstream); \
+ } \
+ else if (c == RUBOUT) \
+ { \
+ putc ('^', rl_outstream); \
+ putc ('?', rl_outstream); \
+ } \
+ else \
+ putc (c, rl_outstream)
+
static int
print_filename (to_print, full_pathname)
char *to_print, *full_pathname;
{
#if !defined (VISIBLE_STATS)
- fputs (to_print, rl_outstream);
+ char *s;
+
+ for (s = to_print; *s; s++)
+ {
+ PUTX (*s);
+ }
return 0;
#else
char *s, c, *new_full_pathname;
- int extension_char = 0, slen, tlen;
+ int extension_char, slen, tlen;
+
+ for (s = to_print; *s; s++)
+ {
+ PUTX (*s);
+ }
- fputs (to_print, rl_outstream);
- if (rl_filename_completion_desired && rl_visible_stats)
+ if (rl_filename_completion_desired && rl_visible_stats)
{
/* If to_print != full_pathname, to_print is the basename of the
path passed. In this case, we try to expand the directory
@@ -359,139 +389,160 @@ print_filename (to_print, full_pathname)
#endif /* VISIBLE_STATS */
}
-/* Complete the word at or before point.
- WHAT_TO_DO says what to do with the completion.
- `?' means list the possible completions.
- TAB means do standard completion.
- `*' means insert all of the possible completions.
- `!' means to do standard completion, and list all possible completions if
- there is more than one. */
-rl_complete_internal (what_to_do)
- int what_to_do;
+static char *
+rl_quote_filename (s, rtype, qcp)
+ char *s;
+ int rtype;
+ char *qcp;
{
- char **matches;
- Function *our_func;
- int start, scan, end, delimiter = 0, pass_next;
- char *text, *saved_line_buffer;
- char *replacement;
- char quote_char = '\0';
- int found_quote = 0;
-
- if (rl_line_buffer)
- saved_line_buffer = savestring (rl_line_buffer);
- else
- saved_line_buffer = (char *)NULL;
-
- if (rl_completion_entry_function)
- our_func = rl_completion_entry_function;
- else
- our_func = (Function *)filename_completion_function;
+ char *r;
+
+ r = xmalloc (strlen (s) + 2);
+ *r = *rl_completer_quote_characters;
+ strcpy (r + 1, s);
+ if (qcp)
+ *qcp = *rl_completer_quote_characters;
+ return r;
+}
- /* Only the completion entry function can change these. */
- rl_filename_completion_desired = 0;
- rl_filename_quoting_desired = 1;
+/* Find the bounds of the current word for completion purposes, and leave
+ rl_point set to the end of the word. This function skips quoted
+ substrings (characters between matched pairs of characters in
+ rl_completer_quote_characters. First we try to find an unclosed
+ quoted substring on which to do matching. If one is not found, we use
+ the word break characters to find the boundaries of the current word.
+ We call an application-specific function to decide whether or not a
+ particular word break character is quoted; if that function returns a
+ non-zero result, the character does not break a word. This function
+ returns the opening quote character if we found an unclosed quoted
+ substring, '\0' otherwise. FP, if non-null, is set to a value saying
+ which (shell-like) quote characters we found (single quote, double
+ quote, or backslash) anywhere in the string. DP, if non-null, is set to
+ the value of the delimiter character that caused a word break. */
+
+static char
+find_completion_word (fp, dp)
+ int *fp, *dp;
+{
+ int scan, end, found_quote, delimiter, pass_next, isbrk;
+ char quote_char;
- /* We now look backwards for the start of a filename/variable word. */
end = rl_point;
+ found_quote = delimiter = 0;
+ quote_char = '\0';
- if (rl_point)
+ if (rl_completer_quote_characters)
{
- if (rl_completer_quote_characters)
+ /* We have a list of characters which can be used in pairs to
+ quote substrings for the completer. Try to find the start
+ of an unclosed quoted substring. */
+ /* FOUND_QUOTE is set so we know what kind of quotes we found. */
+ for (scan = pass_next = 0; scan < end; scan++)
{
- /* We have a list of characters which can be used in pairs to
- quote substrings for the completer. Try to find the start
- of an unclosed quoted substring. */
- /* FOUND_QUOTE is set so we know what kind of quotes we found. */
- for (scan = pass_next = 0; scan < end; scan++)
+ if (pass_next)
{
- if (pass_next)
- {
- pass_next = 0;
- continue;
- }
+ pass_next = 0;
+ continue;
+ }
- if (rl_line_buffer[scan] == '\\')
- {
- pass_next = 1;
- found_quote |= 4;
- continue;
- }
+ if (rl_line_buffer[scan] == '\\')
+ {
+ pass_next = 1;
+ found_quote |= RL_QF_BACKSLASH;
+ continue;
+ }
- if (quote_char != '\0')
- {
- /* Ignore everything until the matching close quote char. */
- if (rl_line_buffer[scan] == quote_char)
- {
- /* Found matching close. Abandon this substring. */
- quote_char = '\0';
- rl_point = end;
- }
- }
- else if (strchr (rl_completer_quote_characters, rl_line_buffer[scan]))
+ if (quote_char != '\0')
+ {
+ /* Ignore everything until the matching close quote char. */
+ if (rl_line_buffer[scan] == quote_char)
{
- /* Found start of a quoted substring. */
- quote_char = rl_line_buffer[scan];
- rl_point = scan + 1;
- /* Shell-like quoting conventions. */
- if (quote_char == '\'')
- found_quote |= 1;
- else if (quote_char == '"')
- found_quote |= 2;
+ /* Found matching close. Abandon this substring. */
+ quote_char = '\0';
+ rl_point = end;
}
}
+ else if (strchr (rl_completer_quote_characters, rl_line_buffer[scan]))
+ {
+ /* Found start of a quoted substring. */
+ quote_char = rl_line_buffer[scan];
+ rl_point = scan + 1;
+ /* Shell-like quoting conventions. */
+ if (quote_char == '\'')
+ found_quote |= RL_QF_SINGLE_QUOTE;
+ else if (quote_char == '"')
+ found_quote |= RL_QF_DOUBLE_QUOTE;
+ }
}
+ }
- if (rl_point == end)
+ if (rl_point == end && quote_char == '\0')
+ {
+ /* We didn't find an unclosed quoted substring upon which to do
+ completion, so use the word break characters to find the
+ substring on which to complete. */
+ while (--rl_point)
{
- int quoted = 0;
- /* We didn't find an unclosed quoted substring upon which to do
- completion, so use the word break characters to find the
- substring on which to complete. */
- while (--rl_point)
- {
- scan = rl_line_buffer[rl_point];
+ scan = rl_line_buffer[rl_point];
- if (strchr (rl_completer_word_break_characters, scan) == 0)
- continue;
+ if (strchr (rl_completer_word_break_characters, scan) == 0)
+ continue;
-#if defined (SHELL)
- /* Don't let word break characters in quoted substrings break
- words for the completer. */
- if (found_quote && char_is_quoted (rl_line_buffer, rl_point))
- continue;
-#endif /* SHELL */
-
- /* Convoluted code, but it avoids an n^2 algorithm with calls
- to char_is_quoted. */
- break;
- }
- }
+ /* Call the application-specific function to tell us whether
+ this word break character is quoted and should be skipped. */
+ if (rl_char_is_quoted_p && found_quote &&
+ (*rl_char_is_quoted_p) (rl_line_buffer, rl_point))
+ continue;
- /* If we are at an unquoted word break, then advance past it. */
- scan = rl_line_buffer[rl_point];
-#if defined (SHELL)
- if ((found_quote == 0 || char_is_quoted (rl_line_buffer, rl_point) == 0) &&
- strchr (rl_completer_word_break_characters, scan))
-#else
- if (strchr (rl_completer_word_break_characters, scan))
-#endif
- {
- /* If the character that caused the word break was a quoting
- character, then remember it as the delimiter. */
- if (strchr ("\"'", scan) && (end - rl_point) > 1)
- delimiter = scan;
-
- /* If the character isn't needed to determine something special
- about what kind of completion to perform, then advance past it. */
- if (!rl_special_prefixes || strchr (rl_special_prefixes, scan) == 0)
- rl_point++;
+ /* Convoluted code, but it avoids an n^2 algorithm with calls
+ to char_is_quoted. */
+ break;
}
}
- /* At this point, we know we have an open quote if quote_char != '\0'. */
- start = rl_point;
- rl_point = end;
- text = rl_copy_text (start, end);
+ /* If we are at an unquoted word break, then advance past it. */
+ scan = rl_line_buffer[rl_point];
+
+ /* If there is an application-specific function to say whether or not
+ a character is quoted and we found a quote character, let that
+ function decide whether or not a character is a word break, even
+ if it is found in rl_completer_word_break_characters. */
+ if (rl_char_is_quoted_p)
+ isbrk = (found_quote == 0 ||
+ (*rl_char_is_quoted_p) (rl_line_buffer, rl_point) == 0) &&
+ strchr (rl_completer_word_break_characters, scan) != 0;
+ else
+ isbrk = strchr (rl_completer_word_break_characters, scan) != 0;
+
+ if (isbrk)
+ {
+ /* If the character that caused the word break was a quoting
+ character, then remember it as the delimiter. */
+ if (rl_basic_quote_characters && strchr (rl_basic_quote_characters, scan) && (end - rl_point) > 1)
+ delimiter = scan;
+
+ /* If the character isn't needed to determine something special
+ about what kind of completion to perform, then advance past it. */
+ if (rl_special_prefixes == 0 || strchr (rl_special_prefixes, scan) == 0)
+ rl_point++;
+ }
+
+ if (fp)
+ *fp = found_quote;
+ if (dp)
+ *dp = delimiter;
+
+ return (quote_char);
+}
+
+static char **
+gen_completion_matches (text, start, end, our_func, found_quote, quote_char)
+ char *text;
+ int start, end;
+ Function *our_func;
+ int found_quote, quote_char;
+{
+ char **matches, *temp;
/* If the user wants to TRY to complete, but then wants to give
up and use the default completion function, they set the
@@ -503,412 +554,528 @@ rl_complete_internal (what_to_do)
if (matches || rl_attempted_completion_over)
{
rl_attempted_completion_over = 0;
- our_func = (Function *)NULL;
- goto after_usual_completion;
+ return (matches);
}
}
-#if defined (SHELL)
/* Beware -- we're stripping the quotes here. Do this only if we know
- we are doing filename completion. */
- if (found_quote && our_func == (Function *)filename_completion_function)
+ we are doing filename completion and the application has defined a
+ filename dequoting function. */
+ temp = (char *)NULL;
+ if (found_quote && our_func == (Function *)filename_completion_function &&
+ rl_filename_dequoting_function)
{
/* delete single and double quotes */
- replacement = _delete_quotes (text);
- free (text);
- text = replacement;
- replacement = (char *)0;
+ temp = (*rl_filename_dequoting_function) (text, quote_char);
+ text = temp; /* not freeing text is not a memory leak */
}
-#endif /* SHELL */
matches = completion_matches (text, our_func);
+ FREE (temp);
+ return matches;
+}
- after_usual_completion:
- free (text);
+/* Filter out duplicates in MATCHES. This frees up the strings in
+ MATCHES. */
+static char **
+remove_duplicate_matches (matches)
+ char **matches;
+{
+ char *lowest_common;
+ int i, j, newlen;
+ char dead_slot;
+ char **temp_array;
- if (!matches)
- ding ();
- else
- {
- register int i;
- int should_quote;
+ /* Sort the items. */
+ for (i = 0; matches[i]; i++)
+ ;
+
+ /* Sort the array without matches[0], since we need it to
+ stay in place no matter what. */
+ if (i)
+ qsort (matches+1, i-1, sizeof (char *), _rl_qsort_string_compare);
- /* It seems to me that in all the cases we handle we would like
- to ignore duplicate possiblilities. Scan for the text to
- insert being identical to the other completions. */
- if (rl_ignore_completion_duplicates)
+ /* Remember the lowest common denominator for it may be unique. */
+ lowest_common = savestring (matches[0]);
+
+ for (i = newlen = 0; matches[i + 1]; i++)
+ {
+ if (strcmp (matches[i], matches[i + 1]) == 0)
{
- char *lowest_common;
- int j, newlen = 0;
- char dead_slot;
- char **temp_array;
+ free (matches[i]);
+ matches[i] = (char *)&dead_slot;
+ }
+ else
+ newlen++;
+ }
- /* Sort the items. */
- /* It is safe to sort this array, because the lowest common
- denominator found in matches[0] will remain in place. */
- for (i = 0; matches[i]; i++);
- qsort (matches, i, sizeof (char *), compare_strings);
+ /* We have marked all the dead slots with (char *)&dead_slot.
+ Copy all the non-dead entries into a new array. */
+ temp_array = (char **)xmalloc ((3 + newlen) * sizeof (char *));
+ for (i = j = 1; matches[i]; i++)
+ {
+ if (matches[i] != (char *)&dead_slot)
+ temp_array[j++] = matches[i];
+ }
+ temp_array[j] = (char *)NULL;
- /* Remember the lowest common denominator for it may be unique. */
- lowest_common = savestring (matches[0]);
+ if (matches[0] != (char *)&dead_slot)
+ free (matches[0]);
- for (i = 0; matches[i + 1]; i++)
- {
- if (strcmp (matches[i], matches[i + 1]) == 0)
- {
- free (matches[i]);
- matches[i] = (char *)&dead_slot;
- }
- else
- newlen++;
- }
+ /* Place the lowest common denominator back in [0]. */
+ temp_array[0] = lowest_common;
- /* We have marked all the dead slots with (char *)&dead_slot.
- Copy all the non-dead entries into a new array. */
- temp_array = (char **)xmalloc ((3 + newlen) * sizeof (char *));
- for (i = j = 1; matches[i]; i++)
- {
- if (matches[i] != (char *)&dead_slot)
- temp_array[j++] = matches[i];
- }
- temp_array[j] = (char *)NULL;
+ /* If there is one string left, and it is identical to the
+ lowest common denominator, then the LCD is the string to
+ insert. */
+ if (j == 2 && strcmp (temp_array[0], temp_array[1]) == 0)
+ {
+ free (temp_array[1]);
+ temp_array[1] = (char *)NULL;
+ }
+ return (temp_array);
+}
- if (matches[0] != (char *)&dead_slot)
- free (matches[0]);
- free (matches);
+static void
+display_matches (matches)
+ char **matches;
+{
+ int len, count, limit, max, printed_len;
+ int i, j, k, l;
+ char *temp;
- matches = temp_array;
+ /* Move to the last visible line of a possibly-multiple-line command. */
+ _rl_move_vert (_rl_vis_botlin);
- /* Place the lowest common denominator back in [0]. */
- matches[0] = lowest_common;
+ /* Handle simple case first. What if there is only one answer? */
+ if (matches[1] == 0)
+ {
+ temp = printable_part (matches[0]);
+ crlf ();
+ print_filename (temp, matches[0]);
+ crlf ();
+#if 0
+ rl_on_new_line ();
+#else
+ rl_forced_update_display ();
+ rl_display_fixed = 1;
+#endif
+ return;
+ }
- /* If there is one string left, and it is identical to the
- lowest common denominator, then the LCD is the string to
- insert. */
- if (j == 2 && strcmp (matches[0], matches[1]) == 0)
- {
- free (matches[1]);
- matches[1] = (char *)NULL;
- }
- }
+ /* There is more than one answer. Find out how many there are,
+ and find the maximum printed length of a single entry. */
+ for (max = 0, i = 1; matches[i]; i++)
+ {
+ temp = printable_part (matches[i]);
+ len = strlen (temp);
- switch (what_to_do)
+ if (len > max)
+ max = len;
+ }
+
+ len = i - 1;
+
+ /* If there are many items, then ask the user if she really wants to
+ see them all. */
+ if (len >= rl_completion_query_items)
+ {
+ crlf ();
+ fprintf (rl_outstream, "Display all %d possibilities? (y or n)", len);
+ fflush (rl_outstream);
+ if (get_y_or_n () == 0)
{
- case TAB:
- case '!':
- /* If we are matching filenames, then here is our chance to
- do clever processing by re-examining the list. Call the
- ignore function with the array as a parameter. It can
- munge the array, deleting matches as it desires. */
- if (rl_ignore_some_completions_function &&
- our_func == (Function *)filename_completion_function)
- (void)(*rl_ignore_some_completions_function)(matches);
-
- /* If we are doing completion on quoted substrings, and any matches
- contain any of the completer_word_break_characters, then auto-
- matically prepend the substring with a quote character (just pick
- the first one from the list of such) if it does not already begin
- with a quote string. FIXME: Need to remove any such automatically
- inserted quote character when it no longer is necessary, such as
- if we change the string we are completing on and the new set of
- matches don't require a quoted substring. */
- replacement = matches[0];
-
- should_quote = matches[0] && rl_completer_quote_characters &&
- rl_filename_completion_desired &&
- rl_filename_quoting_desired;
-
- if (should_quote)
-#if defined (SHELL)
- should_quote = should_quote && (!quote_char || quote_char == '"');
+ crlf ();
+#if 0
+ rl_on_new_line ();
#else
- should_quote = should_quote && !quote_char;
+ rl_forced_update_display ();
+ rl_display_fixed = 1;
#endif
+ return;
+ }
+ }
+
+ /* How many items of MAX length can we fit in the screen window? */
+ max += 2;
+ limit = screenwidth / max;
+ if (limit != 1 && (limit * max == screenwidth))
+ limit--;
- if (should_quote)
+ /* Avoid a possible floating exception. If max > screenwidth,
+ limit will be 0 and a divide-by-zero fault will result. */
+ if (limit == 0)
+ limit = 1;
+
+ /* How many iterations of the printing loop? */
+ count = (len + (limit - 1)) / limit;
+
+ /* Watch out for special case. If LEN is less than LIMIT, then
+ just do the inner printing loop.
+ 0 < len <= limit implies count = 1. */
+
+ /* Sort the items if they are not already sorted. */
+ if (rl_ignore_completion_duplicates == 0)
+ qsort (matches + 1, len, sizeof (char *), _rl_qsort_string_compare);
+
+ /* Print the sorted items, up-and-down alphabetically, like ls. */
+ crlf ();
+
+ for (i = 1; i <= count; i++)
+ {
+ for (j = 0, l = i; j < limit; j++)
+ {
+ if (l > len || matches[l] == 0)
+ break;
+ else
{
- int do_replace;
+ temp = printable_part (matches[l]);
+ printed_len = strlen (temp) + print_filename (temp, matches[l]);
- do_replace = NO_MATCH;
+ if (j + 1 < limit)
+ for (k = 0; k < max - printed_len; k++)
+ putc (' ', rl_outstream);
+ }
+ l += count;
+ }
+ crlf ();
+ }
- /* If there is a single match, see if we need to quote it.
- This also checks whether the common prefix of several
- matches needs to be quoted. If the common prefix should
- not be checked, add !matches[1] to the if clause. */
- should_quote = rl_strpbrk (matches[0], rl_completer_word_break_characters) != 0;
-#if defined (SHELL)
- should_quote = should_quote || rl_strpbrk (matches[0], "#$`") != 0;
+#if 0
+ rl_on_new_line ();
+#else
+ rl_forced_update_display ();
+ rl_display_fixed = 1;
#endif
+}
- if (should_quote)
- do_replace = matches[1] ? MULT_MATCH : SINGLE_MATCH;
+static void
+insert_text (text, start, end)
+ char *text;
+ int start, end;
+{
+ rl_begin_undo_group ();
+ rl_delete_text (start, end + 1);
+ rl_point = start;
+ rl_insert_text (text);
+ rl_end_undo_group ();
+}
- if (do_replace != NO_MATCH)
- {
+static char *
+make_quoted_replacement (match, mtype, qc)
+ char *match;
+ int mtype;
+ char *qc; /* Pointer to quoting character, if any */
+{
+ int should_quote, do_replace;
+ char *replacement;
+
+ /* If we are doing completion on quoted substrings, and any matches
+ contain any of the completer_word_break_characters, then auto-
+ matically prepend the substring with a quote character (just pick
+ the first one from the list of such) if it does not already begin
+ with a quote string. FIXME: Need to remove any such automatically
+ inserted quote character when it no longer is necessary, such as
+ if we change the string we are completing on and the new set of
+ matches don't require a quoted substring. */
+ replacement = match;
+
+ should_quote = match && rl_completer_quote_characters &&
+ rl_filename_completion_desired &&
+ rl_filename_quoting_desired;
+
+ if (should_quote)
#if defined (SHELL)
- /* Quote the replacement, since we found an
- embedded word break character in a potential
- match. */
- char *rtext, *mtext;
- int rlen;
- extern char *double_quote (); /* in builtins/common.c */
-
- /* If DO_REPLACE == MULT_MATCH, it means that there is
- more than one match. In this case, we do not add
- the closing quote or attempt to perform tilde
- expansion. If DO_REPLACE == SINGLE_MATCH, we try
- to perform tilde expansion, because double quotes
- inhibit tilde expansion by the shell. */
-
- mtext = matches[0];
- if (mtext[0] == '~' && do_replace == SINGLE_MATCH)
- mtext = tilde_expand (matches[0]);
- rtext = double_quote (mtext);
- if (mtext != matches[0])
- free (mtext);
-
- rlen = strlen (rtext);
- replacement = xmalloc (rlen + 1);
- /* If we're completing on a quoted string where the user
- has already supplied the opening quote, we don't want
- the quote in the replacement text, and we reset
- QUOTE_CHAR to 0 to avoid an extra closing quote. */
- if (quote_char == '"')
- {
- strcpy (replacement, rtext + 1);
- rlen--;
- quote_char = 0;
- }
- else
- strcpy (replacement, rtext);
- if (do_replace == MULT_MATCH)
- replacement[rlen - 1] = '\0';
- free (rtext);
+ should_quote = should_quote && (!qc || !*qc || *qc == '"' || *qc == '\'');
#else /* !SHELL */
- /* Found an embedded word break character in a potential
- match, so we need to prepend a quote character if we
- are replacing the completion string. */
- replacement = xmalloc (strlen (matches[0]) + 2);
- quote_char = *rl_completer_quote_characters;
- *replacement = quote_char;
- strcpy (replacement + 1, matches[0]);
-#endif /* SHELL */
- }
- }
+ should_quote = should_quote && (!qc || !*qc);
+#endif /* !SHELL */
- if (replacement)
- {
- rl_begin_undo_group ();
- rl_delete_text (start, rl_point);
- rl_point = start;
- rl_insert_text (replacement);
- rl_end_undo_group ();
- if (replacement != matches[0])
- free (replacement);
- }
+ if (should_quote)
+ {
+ /* If there is a single match, see if we need to quote it.
+ This also checks whether the common prefix of several
+ matches needs to be quoted. */
+ should_quote = rl_strpbrk (match, rl_filename_quote_characters) != 0;
+
+ do_replace = should_quote ? mtype : NO_MATCH;
+ /* Quote the replacement, since we found an embedded
+ word break character in a potential match. */
+ if (do_replace != NO_MATCH && rl_filename_quoting_function)
+ replacement = (*rl_filename_quoting_function) (match, do_replace, qc);
+ }
+ return (replacement);
+}
- /* If there are more matches, ring the bell to indicate.
- If this was the only match, and we are hacking files,
- check the file to see if it was a directory. If so,
- add a '/' to the name. If not, and we are at the end
- of the line, then add a space. */
- if (matches[1])
- {
- if (what_to_do == '!')
- goto display_matches; /* XXX */
- else if (rl_editing_mode != vi_mode)
- ding (); /* There are other matches remaining. */
- }
- else
- {
- char temp_string[4];
- int temp_string_index = 0;
+static void
+insert_match (match, start, mtype, qc)
+ char *match;
+ int start, mtype;
+ char *qc;
+{
+ char *replacement;
+ char oqc;
- if (quote_char)
- temp_string[temp_string_index++] = quote_char;
+ oqc = qc ? *qc : '\0';
+ replacement = make_quoted_replacement (match, mtype, qc);
- temp_string[temp_string_index++] = delimiter ? delimiter : ' ';
- temp_string[temp_string_index++] = '\0';
+ /* Now insert the match. */
+ if (replacement)
+ {
+ /* Don't double an opening quote character. */
+ if (qc && *qc && start && rl_line_buffer[start - 1] == *qc &&
+ replacement[0] == *qc)
+ start--;
+ /* If make_quoted_replacement changed the quoting character, remove
+ the opening quote and insert the (fully-quoted) replacement. */
+ else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc &&
+ replacement[0] != oqc)
+ start--;
+ insert_text (replacement, start, rl_point - 1);
+ if (replacement != match)
+ free (replacement);
+ }
+}
- if (rl_filename_completion_desired)
- {
- struct stat finfo;
- char *filename = tilde_expand (matches[0]);
-
- if ((stat (filename, &finfo) == 0) && S_ISDIR (finfo.st_mode))
- {
- if (rl_line_buffer[rl_point] != '/')
- rl_insert_text ("/");
- }
- else
- {
- if (rl_point == rl_end)
- rl_insert_text (temp_string);
- }
- free (filename);
- }
- else
- {
- if (rl_point == rl_end)
- rl_insert_text (temp_string);
- }
- }
- break;
+/* Append any necessary closing quote and a separator character to the
+ just-inserted match. If the user has specified that directories
+ should be marked by a trailing `/', append one of those instead. The
+ default trailing character */
+static void
+append_to_match (text, delimiter, quote_char)
+ char *text;
+ int delimiter, quote_char;
+{
+ char temp_string[4], *filename;
+ int temp_string_index;
+ struct stat finfo;
- case '*':
- {
- int i = 1;
-
- rl_begin_undo_group ();
- rl_delete_text (start, rl_point);
- rl_point = start;
- if (matches[1])
- {
- while (matches[i])
- {
- rl_insert_text (matches[i++]);
- rl_insert_text (" ");
- }
- }
- else
- {
- rl_insert_text (matches[0]);
- rl_insert_text (" ");
- }
- rl_end_undo_group ();
- }
- break;
+ temp_string_index = 0;
+ if (quote_char && rl_point && rl_line_buffer[rl_point - 1] != quote_char)
+ temp_string[temp_string_index++] = quote_char;
- case '?':
- {
- int len, count, limit, max;
- int j, k, l;
-
- /* Handle simple case first. What if there is only one answer? */
- if (!matches[1])
- {
- char *temp;
-
- temp = printable_part (matches[0]);
- crlf ();
- print_filename (temp, matches[0]);
- crlf ();
- goto restart;
- }
-
- /* There is more than one answer. Find out how many there are,
- and find out what the maximum printed length of a single entry
- is. */
- display_matches:
- for (max = 0, i = 1; matches[i]; i++)
- {
- char *temp;
- int name_length;
-
- temp = printable_part (matches[i]);
- name_length = strlen (temp);
-
- if (name_length > max)
- max = name_length;
- }
-
- len = i - 1;
-
- /* If there are many items, then ask the user if she
- really wants to see them all. */
- if (len >= rl_completion_query_items)
- {
- crlf ();
- fprintf (rl_outstream,
- "There are %d possibilities. Do you really", len);
- crlf ();
- fprintf (rl_outstream, "wish to see them all? (y or n)");
- fflush (rl_outstream);
- if (!get_y_or_n ())
- {
- crlf ();
- goto restart;
- }
- }
-
- /* How many items of MAX length can we fit in the screen window? */
- max += 2;
- limit = screenwidth / max;
- if (limit != 1 && (limit * max == screenwidth))
- limit--;
-
- /* Avoid a possible floating exception. If max > screenwidth,
- limit will be 0 and a divide-by-zero fault will result. */
- if (limit == 0)
- limit = 1;
-
- /* How many iterations of the printing loop? */
- count = (len + (limit - 1)) / limit;
-
- /* Watch out for special case. If LEN is less than LIMIT, then
- just do the inner printing loop. */
- if (len < limit)
- count = 1;
-
- /* Sort the items if they are not already sorted. */
- if (!rl_ignore_completion_duplicates)
- qsort (matches, len, sizeof (char *), compare_strings);
-
- /* Print the sorted items, up-and-down alphabetically, like
- ls might. */
- crlf ();
-
- for (i = 1; i < count + 1; i++)
- {
- for (j = 0, l = i; j < limit; j++)
- {
- if (l > len || !matches[l])
- break;
- else
- {
- char *temp;
- int printed_length;
-
- temp = printable_part (matches[l]);
- printed_length = strlen (temp);
- printed_length += print_filename (temp, matches[l]);
-
- if (j + 1 < limit)
- {
- for (k = 0; k < max - printed_length; k++)
- putc (' ', rl_outstream);
- }
- }
- l += count;
- }
- crlf ();
- }
- restart:
-
- rl_on_new_line ();
- }
- break;
+ if (delimiter)
+ temp_string[temp_string_index++] = delimiter;
+ else if (rl_completion_append_character)
+ temp_string[temp_string_index++] = rl_completion_append_character;
+
+ temp_string[temp_string_index++] = '\0';
+
+ if (rl_filename_completion_desired)
+ {
+ filename = tilde_expand (text);
+ if (stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode))
+ {
+ if (_rl_complete_mark_directories && rl_line_buffer[rl_point] != '/')
+ rl_insert_text ("/");
+ }
+ else
+ {
+ if (rl_point == rl_end)
+ rl_insert_text (temp_string);
+ }
+ free (filename);
+ }
+ else
+ {
+ if (rl_point == rl_end)
+ rl_insert_text (temp_string);
+ }
+}
- default:
- fprintf (stderr, "\r\nreadline: bad value for what_to_do in rl_complete\n");
- abort ();
+static void
+insert_all_matches (matches, point, qc)
+ char **matches;
+ int point;
+ char *qc;
+{
+ int i;
+ char *rp;
+
+ rl_begin_undo_group ();
+ /* remove any opening quote character; make_quoted_replacement will add
+ it back. */
+ if (qc && *qc && point && rl_line_buffer[point - 1] == *qc)
+ point--;
+ rl_delete_text (point, rl_point);
+ rl_point = point;
+
+ if (matches[1])
+ {
+ for (i = 1; matches[i]; i++)
+ {
+ rp = make_quoted_replacement (matches[i], SINGLE_MATCH, qc);
+ rl_insert_text (rp);
+ rl_insert_text (" ");
+ if (rp != matches[i])
+ free (rp);
}
+ }
+ else
+ {
+ rp = make_quoted_replacement (matches[0], SINGLE_MATCH, qc);
+ rl_insert_text (rp);
+ rl_insert_text (" ");
+ if (rp != matches[0])
+ free (rp);
+ }
+ rl_end_undo_group ();
+}
+
+/* Complete the word at or before point.
+ WHAT_TO_DO says what to do with the completion.
+ `?' means list the possible completions.
+ TAB means do standard completion.
+ `*' means insert all of the possible completions.
+ `!' means to do standard completion, and list all possible completions if
+ there is more than one. */
+int
+rl_complete_internal (what_to_do)
+ int what_to_do;
+{
+ char **matches, **temp_matches;
+ Function *our_func;
+ int start, end, delimiter, found_quote, nmatch, i;
+ char *text, *saved_line_buffer, *t;
+ char quote_char;
+
+ saved_line_buffer = rl_line_buffer ? savestring (rl_line_buffer) : (char *)NULL;
+
+ our_func = rl_completion_entry_function
+ ? rl_completion_entry_function
+ : (Function *)filename_completion_function;
+
+ /* Only the completion entry function can change these. */
+ rl_filename_completion_desired = 0;
+ rl_filename_quoting_desired = 1;
+
+ rl_completion_type = what_to_do;
- for (i = 0; matches[i]; i++)
- free (matches[i]);
+ /* We now look backwards for the start of a filename/variable word. */
+ end = rl_point;
+
+ found_quote = delimiter = 0;
+ quote_char = '\0';
+
+ if (rl_point)
+ /* This (possibly) changes rl_point. If it returns a non-zero char,
+ we know we have an open quote. */
+ quote_char = find_completion_word (&found_quote, &delimiter);
+
+ start = rl_point;
+ rl_point = end;
+
+ text = rl_copy_text (start, end);
+ matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char);
+
+ if (matches == 0)
+ {
+ ding ();
+ FREE (saved_line_buffer);
+ free (text);
+ return 0;
+ }
+
+ /* It seems to me that in all the cases we handle we would like
+ to ignore duplicate possiblilities. Scan for the text to
+ insert being identical to the other completions. */
+ if (rl_ignore_completion_duplicates)
+ {
+ temp_matches = remove_duplicate_matches (matches);
free (matches);
+ matches = temp_matches;
}
- /* Check to see if the line has changed through all of this manipulation. */
- if (saved_line_buffer)
+ /* If we are matching filenames, then here is our chance to
+ do clever processing by re-examining the list. Call the
+ ignore function with the array as a parameter. It can
+ munge the array, deleting matches as it desires. */
+ if (rl_ignore_some_completions_function &&
+ our_func == (Function *)filename_completion_function)
{
- if (strcmp (rl_line_buffer, saved_line_buffer) != 0)
- completion_changed_buffer = 1;
+ for (nmatch = 1; matches[nmatch]; nmatch++)
+ ;
+ (void)(*rl_ignore_some_completions_function) (matches);
+ if (matches == 0 || matches[0] == 0)
+ {
+ FREE (matches);
+ ding ();
+ FREE (saved_line_buffer);
+ FREE (text);
+ return 0;
+ }
else
- completion_changed_buffer = 0;
+ {
+ /* If we removed some matches, recompute the common prefix. */
+ for (i = 1; matches[i]; i++)
+ ;
+ if (i > 1 && i < nmatch)
+ {
+ t = matches[0];
+ compute_lcd_of_matches (matches, i - 1, text);
+ FREE (t);
+ }
+ }
+ }
+ free (text);
+ switch (what_to_do)
+ {
+ case TAB:
+ case '!':
+ /* Insert the first match with proper quoting. */
+ if (*matches[0])
+ insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, &quote_char);
+
+ /* If there are more matches, ring the bell to indicate.
+ If we are in vi mode, Posix.2 says to not ring the bell.
+ If the `show-all-if-ambiguous' variable is set, display
+ all the matches immediately. Otherwise, if this was the
+ only match, and we are hacking files, check the file to
+ see if it was a directory. If so, and the `mark-directories'
+ variable is set, add a '/' to the name. If not, and we
+ are at the end of the line, then add a space. */
+ if (matches[1])
+ {
+ if (what_to_do == '!')
+ {
+ display_matches (matches);
+ break;
+ }
+ else if (rl_editing_mode != vi_mode)
+ ding (); /* There are other matches remaining. */
+ }
+ else
+ append_to_match (matches[0], delimiter, quote_char);
+
+ break;
+
+ case '*':
+ insert_all_matches (matches, start, &quote_char);
+ break;
+
+ case '?':
+ display_matches (matches);
+ break;
+
+ default:
+ fprintf (stderr, "\r\nreadline: bad value %d for what_to_do in rl_complete\n", what_to_do);
+ ding ();
+ FREE (saved_line_buffer);
+ return 1;
+ }
+
+ for (i = 0; matches[i]; i++)
+ free (matches[i]);
+ free (matches);
+
+ /* Check to see if the line has changed through all of this manipulation. */
+ if (saved_line_buffer)
+ {
+ completion_changed_buffer = strcmp (rl_line_buffer, saved_line_buffer) != 0;
free (saved_line_buffer);
}
+
return 0;
}
@@ -917,7 +1084,10 @@ rl_complete_internal (what_to_do)
`@' for symbolic links
`/' for directories
`*' for executables
- `=' for sockets */
+ `=' for sockets
+ `|' for FIFOs
+ `%' for character special devices
+ `#' for block special devices */
static int
stat_char (filename)
char *filename;
@@ -925,7 +1095,7 @@ stat_char (filename)
struct stat finfo;
int character, r;
-#if defined (S_ISLNK)
+#if defined (HAVE_LSTAT) && defined (S_ISLNK)
r = lstat (filename, &finfo);
#else
r = stat (filename, &finfo);
@@ -937,6 +1107,14 @@ stat_char (filename)
character = 0;
if (S_ISDIR (finfo.st_mode))
character = '/';
+#if defined (S_ISCHR)
+ else if (S_ISCHR (finfo.st_mode))
+ character = '%';
+#endif /* S_ISCHR */
+#if defined (S_ISBLK)
+ else if (S_ISBLK (finfo.st_mode))
+ character = '#';
+#endif /* S_ISBLK */
#if defined (S_ISLNK)
else if (S_ISLNK (finfo.st_mode))
character = '@';
@@ -945,6 +1123,10 @@ stat_char (filename)
else if (S_ISSOCK (finfo.st_mode))
character = '=';
#endif /* S_ISSOCK */
+#if defined (S_ISFIFO)
+ else if (S_ISFIFO (finfo.st_mode))
+ character = '|';
+#endif
else if (S_ISREG (finfo.st_mode))
{
if (access (filename, X_OK) == 0)
@@ -954,20 +1136,6 @@ stat_char (filename)
}
#endif /* VISIBLE_STATS */
-/* Stupid comparison routine for qsort () ing strings. */
-static int
-compare_strings (s1, s2)
- char **s1, **s2;
-{
- int result;
-
- result = **s1 - **s2;
- if (result == 0)
- result = strcmp (*s1, *s2);
-
- return result;
-}
-
/* A completion function for usernames.
TEXT contains a partial username preceded by a random
character (usually `~'). */
@@ -976,24 +1144,20 @@ username_completion_function (text, state)
int state;
char *text;
{
-#if defined (__GO32__)
+#if defined (__GO32__) || defined (__WIN32__)
return (char *)NULL;
#else /* !__GO32__ */
static char *username = (char *)NULL;
static struct passwd *entry;
static int namelen, first_char, first_char_loc;
+ char *value;
- if (!state)
+ if (state == 0)
{
- if (username)
- free (username);
+ FREE (username);
first_char = *text;
-
- if (first_char == '~')
- first_char_loc = 1;
- else
- first_char_loc = 0;
+ first_char_loc = first_char == '~';
username = savestring (&text[first_char_loc]);
namelen = strlen (username);
@@ -1002,19 +1166,19 @@ username_completion_function (text, state)
while (entry = getpwent ())
{
- if ((username[0] == entry->pw_name[0]) &&
- (strncmp (username, entry->pw_name, namelen) == 0))
+ /* Null usernames should result in all users as possible completions. */
+ if (namelen == 0 || (STREQN (username, entry->pw_name, namelen)))
break;
}
- if (!entry)
+ if (entry == 0)
{
endpwent ();
return ((char *)NULL);
}
else
{
- char *value = xmalloc (2 + strlen (entry->pw_name));
+ value = xmalloc (2 + strlen (entry->pw_name));
*value = *text;
@@ -1027,7 +1191,7 @@ username_completion_function (text, state)
}
#endif /* !__GO32__ */
}
-
+
/* **************************************************************** */
/* */
/* Completion */
@@ -1037,6 +1201,70 @@ username_completion_function (text, state)
/* Non-zero means that case is not significant in completion. */
int completion_case_fold = 0;
+/* Find the common prefix of the list of matches, and put it into
+ matches[0]. */
+static int
+compute_lcd_of_matches (match_list, matches, text)
+ char **match_list;
+ int matches;
+ char *text;
+{
+ register int i, c1, c2, si;
+ int low; /* Count of max-matched characters. */
+
+ /* If only one match, just use that. Otherwise, compare each
+ member of the list with the next, finding out where they
+ stop matching. */
+ if (matches == 1)
+ {
+ match_list[0] = match_list[1];
+ match_list[1] = (char *)NULL;
+ return 1;
+ }
+
+ for (i = 1, low = 100000; i < matches; i++)
+ {
+ if (completion_case_fold)
+ {
+ for (si = 0;
+ (c1 = _rl_to_lower(match_list[i][si])) &&
+ (c2 = _rl_to_lower(match_list[i + 1][si]));
+ si++)
+ if (c1 != c2)
+ break;
+ }
+ else
+ {
+ for (si = 0;
+ (c1 = match_list[i][si]) &&
+ (c2 = match_list[i + 1][si]);
+ si++)
+ if (c1 != c2)
+ break;
+ }
+
+ if (low > si)
+ low = si;
+ }
+
+ /* If there were multiple matches, but none matched up to even the
+ first character, and the user typed something, use that as the
+ value of matches[0]. */
+ if (low == 0 && text && *text)
+ {
+ match_list[0] = xmalloc (strlen (text) + 1);
+ strcpy (match_list[0], text);
+ }
+ else
+ {
+ match_list[0] = xmalloc (low + 1);
+ strncpy (match_list[0], match_list[1], low);
+ match_list[0][low] = '\0';
+ }
+
+ return matches;
+}
+
/* Return an array of (char *) which is a list of completions for TEXT.
If there are no completions, return a NULL pointer.
The first entry in the returned array is the substitution for TEXT.
@@ -1058,15 +1286,17 @@ completion_matches (text, entry_function)
int match_list_size;
/* The list of matches. */
- char **match_list =
- (char **)xmalloc (((match_list_size = 10) + 1) * sizeof (char *));
+ char **match_list;
/* Number of matches actually found. */
- int matches = 0;
+ int matches;
/* Temporary string binder. */
char *string;
+ matches = 0;
+ match_list_size = 10;
+ match_list = (char **)xmalloc ((match_list_size + 1) * sizeof (char *));
match_list[1] = (char *)NULL;
while (string = (*entry_function) (text, matches))
@@ -1082,50 +1312,7 @@ completion_matches (text, entry_function)
/* If there were any matches, then look through them finding out the
lowest common denominator. That then becomes match_list[0]. */
if (matches)
- {
- register int i = 1;
- int low = 100000; /* Count of max-matched characters. */
-
- /* If only one match, just use that. */
- if (matches == 1)
- {
- match_list[0] = match_list[1];
- match_list[1] = (char *)NULL;
- }
- else
- {
- /* Otherwise, compare each member of the list with
- the next, finding out where they stop matching. */
-
- while (i < matches)
- {
- register int c1, c2, si;
-
- if (completion_case_fold)
- {
- for (si = 0;
- (c1 = to_lower(match_list[i][si])) &&
- (c2 = to_lower(match_list[i + 1][si]));
- si++)
- if (c1 != c2) break;
- }
- else
- {
- for (si = 0;
- (c1 = match_list[i][si]) &&
- (c2 = match_list[i + 1][si]);
- si++)
- if (c1 != c2) break;
- }
-
- if (low > si) low = si;
- i++;
- }
- match_list[0] = xmalloc (low + 1);
- strncpy (match_list[0], match_list[1], low);
- match_list[0][low] = '\0';
- }
- }
+ compute_lcd_of_matches (match_list, matches, text);
else /* There were no matches. */
{
free (match_list);
@@ -1143,25 +1330,32 @@ filename_completion_function (text, state)
int state;
char *text;
{
- static DIR *directory;
+ static DIR *directory = (DIR *)NULL;
static char *filename = (char *)NULL;
static char *dirname = (char *)NULL;
static char *users_dirname = (char *)NULL;
static int filename_len;
-
- struct dirent *entry = (struct dirent *)NULL;
+ char *temp;
+ int dirlen;
+ struct dirent *entry;
/* If we don't have any state, then do some initialization. */
- if (!state)
+ if (state == 0)
{
- char *temp;
-
- if (dirname) free (dirname);
- if (filename) free (filename);
- if (users_dirname) free (users_dirname);
+ /* If we were interrupted before closing the directory or reading
+ all of its contents, close it. */
+ if (directory)
+ {
+ closedir (directory);
+ directory = (DIR *)NULL;
+ }
+ FREE (dirname);
+ FREE (filename);
+ FREE (users_dirname);
filename = savestring (text);
- if (!*text) text = ".";
+ if (*text == 0)
+ text = ".";
dirname = savestring (text);
temp = strrchr (dirname, '/');
@@ -1172,29 +1366,29 @@ filename_completion_function (text, state)
*temp = '\0';
}
else
- strcpy (dirname, ".");
+ {
+ dirname[0] = '.';
+ dirname[1] = '\0';
+ }
/* We aren't done yet. We also support the "~user" syntax. */
/* Save the version of the directory that the user typed. */
users_dirname = savestring (dirname);
- {
- char *temp_dirname;
- int replace_dirname;
-
- temp_dirname = tilde_expand (dirname);
- free (dirname);
- dirname = temp_dirname;
-
- replace_dirname = 0;
- if (rl_directory_completion_hook)
- replace_dirname = (*rl_directory_completion_hook) (&dirname);
- if (replace_dirname)
- {
- free (users_dirname);
- users_dirname = savestring (dirname);
- }
- }
+
+ if (*dirname == '~')
+ {
+ temp = tilde_expand (dirname);
+ free (dirname);
+ dirname = temp;
+ }
+
+ if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&dirname))
+ {
+ free (users_dirname);
+ users_dirname = savestring (dirname);
+ }
+
directory = opendir (dirname);
filename_len = strlen (filename);
@@ -1209,14 +1403,16 @@ filename_completion_function (text, state)
/* Now that we have some state, we can read the directory. */
+ entry = (struct dirent *)NULL;
while (directory && (entry = readdir (directory)))
{
/* Special case for no filename.
All entries except "." and ".." match. */
- if (!filename_len)
+ if (filename_len == 0)
{
- if ((strcmp (entry->d_name, ".") != 0) &&
- (strcmp (entry->d_name, "..") != 0))
+ if (entry->d_name[0] != '.' ||
+ (entry->d_name[1] &&
+ (entry->d_name[1] != '.' || entry->d_name[2])))
break;
}
else
@@ -1230,7 +1426,7 @@ filename_completion_function (text, state)
}
}
- if (!entry)
+ if (entry == 0)
{
if (directory)
{
@@ -1257,34 +1453,33 @@ filename_completion_function (text, state)
}
else
{
- char *temp;
-
/* dirname && (strcmp (dirname, ".") != 0) */
if (dirname && (dirname[0] != '.' || dirname[1]))
{
if (rl_complete_with_tilde_expansion && *users_dirname == '~')
{
- int dirlen = strlen (dirname);
+ dirlen = strlen (dirname);
temp = xmalloc (2 + dirlen + D_NAMLEN (entry));
strcpy (temp, dirname);
- /* Canonicalization cuts off any final slash present. We need
- to add it back. */
+ /* Canonicalization cuts off any final slash present. We
+ may need to add it back. */
if (dirname[dirlen - 1] != '/')
{
- temp[dirlen] = '/';
- temp[dirlen + 1] = '\0';
+ temp[dirlen++] = '/';
+ temp[dirlen] = '\0';
}
}
else
{
- temp = xmalloc (1 + strlen (users_dirname) + D_NAMLEN (entry));
+ dirlen = strlen (users_dirname);
+ temp = xmalloc (1 + dirlen + D_NAMLEN (entry));
strcpy (temp, users_dirname);
}
- strcat (temp, entry->d_name);
+ strcpy (temp + dirlen, entry->d_name); /* strcat (temp, entry->d_name); */
}
else
- temp = (savestring (entry->d_name));
+ temp = savestring (entry->d_name);
return (temp);
}
@@ -1296,7 +1491,8 @@ rl_tilde_expand (ignore, key)
int ignore, key;
{
register int start, end;
- char *homedir;
+ char *homedir, *temp;
+ int len;
end = rl_point;
start = end - 1;
@@ -1304,20 +1500,20 @@ rl_tilde_expand (ignore, key)
if (rl_point == rl_end && rl_line_buffer[rl_point] == '~')
{
homedir = tilde_expand ("~");
- goto insert;
+ insert_text (homedir, start, end);
+ return (0);
}
else if (rl_line_buffer[start] != '~')
{
- for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--);
+ for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--)
+ ;
start++;
}
end = start;
do
- {
- end++;
- }
- while (!whitespace (rl_line_buffer[end]) && end < rl_end);
+ end++;
+ while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end);
if (whitespace (rl_line_buffer[end]) || end >= rl_end)
end--;
@@ -1327,9 +1523,6 @@ rl_tilde_expand (ignore, key)
nothing. */
if (rl_line_buffer[start] == '~')
{
- char *temp;
- int len;
-
len = end - start + 1;
temp = xmalloc (len + 1);
strncpy (temp, rl_line_buffer + start, len);
@@ -1337,12 +1530,7 @@ rl_tilde_expand (ignore, key)
homedir = tilde_expand (temp);
free (temp);
- insert:
- rl_begin_undo_group ();
- rl_delete_text (start, end + 1);
- rl_point = start;
- rl_insert_text (homedir);
- rl_end_undo_group ();
+ insert_text (homedir, start, end);
}
return (0);
@@ -1368,50 +1556,3 @@ rl_strpbrk (string1, string2)
}
return ((char *)NULL);
}
-
-#if defined (STATIC_MALLOC)
-
-/* **************************************************************** */
-/* */
-/* xmalloc and xrealloc () */
-/* */
-/* **************************************************************** */
-
-static void memory_error_and_abort ();
-
-static char *
-xmalloc (bytes)
- int bytes;
-{
- char *temp = (char *)malloc (bytes);
-
- if (!temp)
- memory_error_and_abort ();
- return (temp);
-}
-
-static char *
-xrealloc (pointer, bytes)
- char *pointer;
- int bytes;
-{
- char *temp;
-
- if (!pointer)
- temp = (char *)malloc (bytes);
- else
- temp = (char *)realloc (pointer, bytes);
-
- if (!temp)
- memory_error_and_abort ();
-
- return (temp);
-}
-
-static void
-memory_error_and_abort ()
-{
- fprintf (stderr, "readline: Out of virtual memory!\n");
- abort ();
-}
-#endif /* STATIC_MALLOC */
diff --git a/config.h.in b/config.h.in
index 7d7525d..45ed5b9 100644
--- a/config.h.in
+++ b/config.h.in
@@ -1,57 +1,69 @@
/* config.h.in. Generated automatically from configure.in by autoheader. */
-#ifndef _RL_CONFIG_H
-#define _RL_CONFIG_H
+/* Define as the return type of signal handlers (int or void). */
+#undef RETSIGTYPE
-/* Define if using alloca.c. */
-#undef C_ALLOCA
+/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly. */
+#undef STAT_MACROS_BROKEN
-/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
- This function is required for alloca.c support on those systems. */
-#undef CRAY_STACKSEG_END
+#undef VOID_SIGHANDLER
-/* Define if you have alloca.h and it should be used (not Ultrix). */
-#undef HAVE_ALLOCA_H
+/* Define if you have the lstat function. */
+#undef HAVE_LSTAT
-/* If using the C implementation of alloca, define if you know the
- direction of stack growth for your system; otherwise it will be
- automatically deduced at run-time.
- STACK_DIRECTION > 0 => grows toward higher addresses
- STACK_DIRECTION < 0 => grows toward lower addresses
- STACK_DIRECTION = 0 => direction of growth unknown
- */
-#undef STACK_DIRECTION
+/* Define if you have the putenv function. */
+#undef HAVE_PUTENV
-/* Define if you do not have strings.h, index, bzero, etc.. */
-#undef USG
+/* Define if you have the select function. */
+#undef HAVE_SELECT
-/* Define if your system defines TIOCGWINSZ in sys/ioctl.h. */
-#undef GWINSZ_IN_SYS_IOCTL
-
-#undef HAVE_GETPW_DECLS
-#undef NO_SYS_FILE
+/* Define if you have the setenv function. */
+#undef HAVE_SETENV
-/* Define if you have strcasecmp. */
+/* Define if you have the strcasecmp function. */
#undef HAVE_STRCASECMP
-/* Define if you have the <alloca.h> header file. */
-#undef HAVE_ALLOCA_H
+/* Define if you have the setlocale function. */
+#undef HAVE_SETLOCALE
+
+/* Define if you have the tcgetattr function. */
+#undef HAVE_TCGETATTR
+
+/* Define if you have the strcoll function. */
+#undef HAVE_STRCOLL
+
+#undef STRCOLL_BROKEN
/* Define if you have the <dirent.h> header file. */
#undef HAVE_DIRENT_H
+/* Define if you have the <ndir.h> header file. */
+#undef HAVE_NDIR_H
+
/* Define if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define if you have the <string.h> header file. */
#undef HAVE_STRING_H
+/* Define if you have the <sys/dir.h> header file. */
+#undef HAVE_SYS_DIR_H
+
+/* Define if you have the <sys/file.h> header file. */
+#undef HAVE_SYS_FILE_H
+
+/* Define if you have the <sys/ndir.h> header file. */
+#undef HAVE_SYS_NDIR_H
+
/* Define if you have the <sys/pte.h> header file. */
#undef HAVE_SYS_PTE_H
/* Define if you have the <sys/ptem.h> header file. */
#undef HAVE_SYS_PTEM_H
+/* Define if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
/* Define if you have the <sys/stream.h> header file. */
#undef HAVE_SYS_STREAM_H
@@ -61,10 +73,66 @@
/* Define if you have the <termio.h> header file. */
#undef HAVE_TERMIO_H
+/* Define if you have the <termios.h> header file. */
+#undef HAVE_TERMIOS_H
+
/* Define if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define if you have the <varargs.h> header file. */
#undef HAVE_VARARGS_H
+/* Define if you have the <stdarg.h> header file. */
+#undef HAVE_STDARG_H
+
+#undef HAVE_LOCALE_H
+
+/* Definitions pulled in from aclocal.m4. */
+#undef VOID_SIGHANDLER
+
+#undef GWINSZ_IN_SYS_IOCTL
+
+#undef TIOCSTAT_IN_SYS_IOCTL
+
+#undef FIONREAD_IN_SYS_IOCTL
+
+#undef SPEED_T_IN_SYS_TYPES
+
+#undef HAVE_GETPW_DECLS
+
+#undef STRUCT_DIRENT_HAS_D_INO
+
+#undef STRUCT_DIRENT_HAS_D_FILENO
+
+#undef HAVE_BSD_SIGNALS
+
+#undef HAVE_POSIX_SIGNALS
+
+#undef HAVE_USG_SIGHOLD
+
+#undef MUST_REINSTALL_SIGHANDLERS
+
+#undef HAVE_POSIX_SIGSETJMP
+
+/* config.h.bot */
+/* modify settings or make new ones based on what autoconf tells us. */
+
+/* Ultrix botches type-ahead when switching from canonical to
+ non-canonical mode, at least through version 4.3 */
+#if !defined (HAVE_TERMIOS_H) || !defined (HAVE_TCGETATTR) || defined (ultrix)
+# define TERMIOS_MISSING
+#endif
+
+#if defined (STRCOLL_BROKEN)
+# undef HAVE_STRCOLL
+#endif
+
+#if defined (__STDC__) && defined (HAVE_STDARG_H)
+# define PREFER_STDARG
+# define USE_VARARGS
+#else
+# if defined (HAVE_VARARGS_H)
+# define PREFER_VARARGS
+# define USE_VARARGS
+# endif
#endif
diff --git a/configure b/configure
index c1b0a63..4b7479d 100755
--- a/configure
+++ b/configure
@@ -1,64 +1,132 @@
-#!/bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 1.11
-# Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+#! /bin/sh
+
+# From configure.in for Readline 2.1, version 2.04, from autoconf version 2.12
+LIBVERSION=2.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-# This configure script is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-# This script 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-# Save the original args to write them into config.status later.
-configure_args="$*"
-# Only options that might do something get documented.
-ac_usage="Usage: configure [options] [host]
-Options: [defaults in brackets after descriptions]
---build=BUILD configure for building on BUILD [BUILD=HOST]
---disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
---enable-FEATURE[=ARG] include FEATURE [ARG=yes]
---exec-prefix=PREFIX install host dependent files in PREFIX [/usr/local]
---help print this message
---host=HOST configure for HOST [guessed]
---prefix=PREFIX install host independent files in PREFIX [/usr/local]
---quiet, --silent do not print \`checking for...' messages
---srcdir=DIR find the sources in DIR [configure dir or ..]
---target=TARGET configure for TARGET [TARGET=HOST]
---verbose print results of checks
---version print the version of autoconf that created configure
---with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
---without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
---x-includes=DIR X include files are in DIR
---x-libraries=DIR X library files are in DIR"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.12
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
# Initialize some variables set by options.
# The variables have the same names as the options, with
# dashes changed to underlines.
build=NONE
-exec_prefix=
+cache_file=./config.cache
+exec_prefix=NONE
host=NONE
no_create=
nonopt=NONE
-norecursion=
-prefix=
-program_prefix=
-program_suffix=
-program_transform_name=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
silent=
+site=
srcdir=
target=NONE
verbose=
-x_includes=
-x_libraries=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
ac_prev=
for ac_option
@@ -71,35 +139,52 @@ do
continue
fi
- # Accept (but ignore some of) the important Cygnus configure
- # options, so we can diagnose typos.
-
case "$ac_option" in
-*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
*) ac_optarg= ;;
esac
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
case "$ac_option" in
- -build | --build | --buil | --bui | --bu | --b)
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
ac_prev=build ;;
- -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*)
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
build="$ac_optarg" ;;
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
-disable-* | --disable-*)
ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
- # Reject names that aren't valid shell variable names.
+ # Reject names that are not valid shell variable names.
if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
- echo "configure: $ac_feature: invalid feature name" >&2; exit 1
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
fi
ac_feature=`echo $ac_feature| sed 's/-/_/g'`
eval "enable_${ac_feature}=no" ;;
-enable-* | --enable-*)
ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
- # Reject names that aren't valid shell variable names.
+ # Reject names that are not valid shell variable names.
if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
- echo "configure: $ac_feature: invalid feature name" >&2; exit 1
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
fi
ac_feature=`echo $ac_feature| sed 's/-/_/g'`
case "$ac_option" in
@@ -108,7 +193,6 @@ do
esac
eval "enable_${ac_feature}='$ac_optarg'" ;;
- # For backward compatibility, recognize -exec-prefix and --exec_prefix.
-exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
| --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
| --exec | --exe | --ex)
@@ -119,12 +203,62 @@ do
exec_prefix="$ac_optarg" ;;
-gas | --gas | --ga | --g)
- with_gas=yes ;; # Obsolete; use --with-gas.
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
-help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
cat << EOF
-$ac_usage
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
exit 0 ;;
-host | --host | --hos | --ho)
@@ -132,16 +266,64 @@ EOF
-host=* | --host=* | --hos=* | --ho=*)
host="$ac_optarg" ;;
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
-nfp | --nfp | --nf)
- with_fp=no ;; # Obsolete; use --without-fp.
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
| --no-cr | --no-c)
no_create=yes ;;
- -norecursion | --norecursion | --norecursio | --norecursi \
- | --norecurs | --norecur | --norecu | --norec | --nore | --nor)
- norecursion=yes ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
ac_prev=prefix ;;
@@ -183,11 +365,40 @@ EOF
| -silent | --silent | --silen | --sile | --sil)
silent=yes ;;
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
ac_prev=srcdir ;;
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
srcdir="$ac_optarg" ;;
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
-target | --target | --targe | --targ | --tar | --ta | --t)
ac_prev=target ;;
-target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
@@ -197,14 +408,14 @@ EOF
verbose=yes ;;
-version | --version | --versio | --versi | --vers)
- echo "configure generated by autoconf version 1.11"
+ echo "configure generated by autoconf version 2.12"
exit 0 ;;
-with-* | --with-*)
ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
- # Reject names that aren't valid shell variable names.
+ # Reject names that are not valid shell variable names.
if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
- echo "configure: $ac_package: invalid package name" >&2; exit 1
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
fi
ac_package=`echo $ac_package| sed 's/-/_/g'`
case "$ac_option" in
@@ -215,14 +426,16 @@ EOF
-without-* | --without-*)
ac_package=`echo $ac_option|sed -e 's/-*without-//'`
- # Reject names that aren't valid shell variable names.
+ # Reject names that are not valid shell variable names.
if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
- echo "configure: $ac_package: invalid package name" >&2; exit 1
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
fi
ac_package=`echo $ac_package| sed 's/-/_/g'`
eval "with_${ac_package}=no" ;;
- --x) with_x=yes ;; # Obsolete; use --with-x.
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
-x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
| --x-incl | --x-inc | --x-in | --x-i)
@@ -238,15 +451,15 @@ EOF
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
x_libraries="$ac_optarg" ;;
- -*) echo "configure: $ac_option: invalid option; use --help to show usage" >&2; exit 1
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
;;
- *)
+ *)
if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
- echo "configure: warning: $ac_option: invalid host type" >&2
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
fi
if test "x$nonopt" != xNONE; then
- echo "configure: can only configure for one host and one target at a time" >&2; exit 1
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
fi
nonopt="$ac_option"
;;
@@ -255,31 +468,56 @@ EOF
done
if test -n "$ac_prev"; then
- echo "configure: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" >&2; exit 1
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
fi
-trap 'rm -fr conftest* confdefs* core $ac_clean_files; exit 1' 1 2 15
-trap 'rm -fr confdefs* $ac_clean_files' 0
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
-# Save the original args if we used an alternate arg parser.
-ac_configure_temp="${configure_args-$*}"
-# Strip out --no-create and --norecursion so they don't pile up.
-configure_args=
-for ac_arg in $ac_configure_temp; do
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
case "$ac_arg" in
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
| --no-cr | --no-c) ;;
- -norecursion | --norecursion | --norecursio | --norecursi \
- | --norecurs | --norecur | --norecu | --norec | --nore | --nor) ;;
- *) configure_args="$configure_args $ac_arg" ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
esac
done
# NLS nuisances.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-if test "${LC_ALL+set}" = 'set'; then LC_ALL=C; export LC_ALL; fi
-if test "${LANG+set}" = 'set'; then LANG=C; export LANG; fi
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
@@ -293,7 +531,7 @@ ac_unique_file=readline.h
# Find the source files, if location was not specified.
if test -z "$srcdir"; then
ac_srcdir_defaulted=yes
- # Try the directory containing this script, then `..'.
+ # Try the directory containing this script, then its parent.
ac_prog=$0
ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
@@ -301,163 +539,422 @@ if test -z "$srcdir"; then
if test ! -r $srcdir/$ac_unique_file; then
srcdir=..
fi
+else
+ ac_srcdir_defaulted=no
fi
if test ! -r $srcdir/$ac_unique_file; then
- if test x$ac_srcdir_defaulted = xyes; then
- echo "configure: can not find sources in ${ac_confdir} or .." >&2; exit 1
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
else
- echo "configure: can not find sources in ${srcdir}" >&2; exit 1
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
fi
+
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='${CPP}'
-ac_compile='${CC-cc} $CFLAGS $LDFLAGS conftest.${ac_ext} -o conftest $LIBS >/dev/null 2>&1'
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+
+
+ac_aux_dir=
+for ac_dir in ./support $srcdir/./support; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in ./support $srcdir/./support" 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Make sure we can run config.sub.
+if $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:629: checking host system type" >&5
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`$ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
-#!/bin/sh
-# From configure.in Configure for Readline 2.0
+host=`$ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
# We want these before the checks, so the checks can modify their values.
test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:656: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
if test -z "$CC"; then
- # Extract the first word of `gcc', so it can be a program name with args.
- set ac_dummy gcc; ac_word=$2
- test -n "$silent" || echo "checking for $ac_word"
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:685: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ ac_prog_rejected=no
for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
- CC="gcc"
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
break
fi
done
IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi
-test -z "$CC" && CC="cc"
-test -n "$CC" && test -n "$verbose" && echo " setting CC to $CC"
-# Find out if we are using GNU C, under whatever name.
-cat > conftest.c <<EOF
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:733: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext <<EOF
+#line 743 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+if { (eval echo configure:747: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:767: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:772: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
#ifdef __GNUC__
- yes
+ yes;
#endif
EOF
-${CC-cc} -E conftest.c > conftest.out 2>&1
-if egrep yes conftest.out >/dev/null 2>&1; then
- GCC=1 # For later tests.
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:781: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:796: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
fi
rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
# If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS.
test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O"
-
-test -n "$silent" || echo "checking how to run the C preprocessor"
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:828: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
if test -z "$CPP"; then
- # This must be in double quotes, not single quotes, because CPP may get
- # substituted into the Makefile and ``${CC-cc}'' will simply confuse
- # make. It must be expanded now.
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
CPP="${CC-cc} -E"
- cat > conftest.${ac_ext} <<EOF
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 843 "configure"
#include "confdefs.h"
-#include <stdio.h>
+#include <assert.h>
Syntax Error
EOF
-# Some shells (Coherent) do redirections in the wrong order, so need
-# the parens.
-ac_err=`eval "($ac_cpp conftest.${ac_ext} >/dev/null) 2>&1"`
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:849: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
:
else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
- cat > conftest.${ac_ext} <<EOF
+ cat > conftest.$ac_ext <<EOF
+#line 860 "configure"
#include "confdefs.h"
-#include <stdio.h>
+#include <assert.h>
Syntax Error
EOF
-# Some shells (Coherent) do redirections in the wrong order, so need
-# the parens.
-ac_err=`eval "($ac_cpp conftest.${ac_ext} >/dev/null) 2>&1"`
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:866: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
:
else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
rm -rf conftest*
CPP=/lib/cpp
fi
rm -f conftest*
fi
rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
fi
-test -n "$verbose" && echo " setting CPP to $CPP"
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
-if test -n "$GCC"; then
- test -n "$silent" || echo "checking whether -traditional is needed"
- ac_pattern="Autoconf.*'x'"
- ac_prog='#include <sgtty.h>
-Autoconf TIOCGETP'
- cat > conftest.${ac_ext} <<EOF
+if test $ac_cv_prog_gcc = yes; then
+ echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
+echo "configure:890: checking whether ${CC-cc} needs -traditional" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_pattern="Autoconf.*'x'"
+ cat > conftest.$ac_ext <<EOF
+#line 896 "configure"
#include "confdefs.h"
-$ac_prog
+#include <sgtty.h>
+Autoconf TIOCGETP
EOF
-eval "$ac_cpp conftest.${ac_ext} > conftest.out 2>&1"
-if egrep "$ac_pattern" conftest.out >/dev/null 2>&1; then
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "$ac_pattern" >/dev/null 2>&1; then
rm -rf conftest*
- ac_need_trad=1
-
+ ac_cv_prog_gcc_traditional=yes
+else
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=no
fi
rm -f conftest*
- if test -z "$ac_need_trad"; then
- ac_prog='#include <termio.h>
-Autoconf TCGETA'
- cat > conftest.${ac_ext} <<EOF
+ if test $ac_cv_prog_gcc_traditional = no; then
+ cat > conftest.$ac_ext <<EOF
+#line 914 "configure"
#include "confdefs.h"
-$ac_prog
+#include <termio.h>
+Autoconf TCGETA
EOF
-eval "$ac_cpp conftest.${ac_ext} > conftest.out 2>&1"
-if egrep "$ac_pattern" conftest.out >/dev/null 2>&1; then
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "$ac_pattern" >/dev/null 2>&1; then
rm -rf conftest*
- ac_need_trad=1
-
+ ac_cv_prog_gcc_traditional=yes
fi
rm -f conftest*
fi
- test -n "$ac_need_trad" && CC="$CC -traditional"
fi
-# Make sure to not get the incompatible SysV /etc/install and
-# /usr/sbin/install, which might be in PATH before a BSD-like install,
-# or the SunOS /usr/etc/install directory, or the AIX /bin/install,
-# or the AFS install, which mishandles nonexistent args, or
-# /usr/ucb/install on SVR4, which tries to use the nonexistent group
-# `staff', or /sbin/install on IRIX which has incompatible command-line
-# syntax. Sigh.
-#
-# On most BSDish systems install is in /usr/bin, not /usr/ucb
-# anyway.
-# This turns out not to be true, so the mere pathname isn't an indication
-# of whether the program works. What we really need is a set of tests for
-# the install program to see if it actually works in all the required ways.
-#
-# Avoid using ./install, which might have been erroneously created
-# by make from ./install.sh.
-if test -z "${INSTALL}"; then
- test -n "$silent" || echo "checking for a BSD compatible install"
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6
+ if test $ac_cv_prog_gcc_traditional = yes; then
+ CC="$CC -traditional"
+ fi
+fi
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:946: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:"
for ac_dir in $PATH; do
- case "$ac_dir" in
- ''|.|/etc|/sbin|/usr/sbin|/usr/etc|/usr/afsws/bin|/usr/ucb) ;;
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
*)
# OSF1 and SCO ODT 3.0 have their own names for install.
- for ac_prog in installbsd scoinst install; do
+ for ac_prog in ginstall installbsd scoinst install; do
if test -f $ac_dir/$ac_prog; then
if test $ac_prog = install &&
grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
@@ -465,7 +962,7 @@ if test -z "${INSTALL}"; then
# OSF/1 installbsd also uses dspmsg, but is usable.
:
else
- INSTALL="$ac_dir/$ac_prog -c"
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
break 2
fi
fi
@@ -473,541 +970,1179 @@ if test -z "${INSTALL}"; then
;;
esac
done
- IFS="$ac_save_ifs"
-fi
+ IFS="$ac_save_IFS"
-if test -z "$INSTALL"; then
- # As a last resort, use the slow shell script.
- for ac_dir in ${srcdir} ${srcdir}/.. ${srcdir}/../..; do
- if test -f $ac_dir/install.sh; then
- INSTALL="$ac_dir/install.sh -c"; break
- fi
- done
fi
-if test -z "$INSTALL"; then
- echo "configure: can not find install.sh in ${srcdir} or ${srcdir}/.. or ${srcdir}/../.." >&2; exit 1
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
fi
-test -n "$verbose" && echo " setting INSTALL to $INSTALL"
+echo "$ac_t""$INSTALL" 1>&6
-# Use test -z because SunOS4 sh mishandles ${INSTALL_PROGRAM-'${INSTALL}'}.
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-test -n "$verbose" && echo " setting INSTALL_PROGRAM to $INSTALL_PROGRAM"
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-test -n "$verbose" && echo " setting INSTALL_DATA to $INSTALL_DATA"
-if test -z "$RANLIB"; then
- # Extract the first word of `ranlib', so it can be a program name with args.
- set ac_dummy ranlib; ac_word=$2
- test -n "$silent" || echo "checking for $ac_word"
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:998: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
- RANLIB="ranlib"
+ ac_cv_prog_RANLIB="ranlib"
break
fi
done
IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
fi
-test -z "$RANLIB" && RANLIB=":"
-test -n "$RANLIB" && test -n "$verbose" && echo " setting RANLIB to $RANLIB"
-test -n "$silent" || echo "checking for BSD string and memory functions"
-cat > conftest.${ac_ext} <<EOF
+echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
+echo "configure:1026: checking return type of signal handlers" >&5
+if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1031 "configure"
#include "confdefs.h"
-#include <strings.h>
-int main() { return 0; }
-int t() { rindex(0, 0); bzero(0, 0);; return 0; }
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+#ifdef __cplusplus
+extern "C" void (*signal (int, void (*)(int)))(int);
+#else
+void (*signal ()) ();
+#endif
+
+int main() {
+int i;
+; return 0; }
EOF
-if eval $ac_compile; then
- :
+if { (eval echo configure:1048: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_type_signal=void
else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
rm -rf conftest*
-
-{
-test -n "$verbose" && \
-echo " defining USG"
-echo "#define" USG "1" >> confdefs.h
-DEFS="$DEFS -DUSG=1"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}USG\${ac_dB}USG\${ac_dC}1\${ac_dD}
-\${ac_uA}USG\${ac_uB}USG\${ac_uC}1\${ac_uD}
-\${ac_eA}USG\${ac_eB}USG\${ac_eC}1\${ac_eD}
-"
-}
+ ac_cv_type_signal=int
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_type_signal" 1>&6
+cat >> confdefs.h <<EOF
+#define RETSIGTYPE $ac_cv_type_signal
+EOF
+
+
+
+echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6
+echo "configure:1068: checking whether stat file-mode macros are broken" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1073 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined(S_ISBLK) && defined(S_IFDIR)
+# if S_ISBLK (S_IFDIR)
+You lose.
+# endif
+#endif
+
+#if defined(S_ISBLK) && defined(S_IFCHR)
+# if S_ISBLK (S_IFCHR)
+You lose.
+# endif
+#endif
+
+#if defined(S_ISLNK) && defined(S_IFREG)
+# if S_ISLNK (S_IFREG)
+You lose.
+# endif
+#endif
+
+#if defined(S_ISSOCK) && defined(S_IFREG)
+# if S_ISSOCK (S_IFREG)
+You lose.
+# endif
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "You lose" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_header_stat_broken=yes
+else
+ rm -rf conftest*
+ ac_cv_header_stat_broken=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_header_stat_broken" 1>&6
+if test $ac_cv_header_stat_broken = yes; then
+ cat >> confdefs.h <<\EOF
+#define STAT_MACROS_BROKEN 1
+EOF
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
+echo "configure:1128: checking for $ac_hdr that defines DIR" >&5
+if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1133 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_hdr>
+int main() {
+DIR *dirp = 0;
+; return 0; }
+EOF
+if { (eval echo configure:1141: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ eval "ac_cv_header_dirent_$ac_safe=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_dirent_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ ac_header_dirent=$ac_hdr; break
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
+echo "configure:1166: checking for opendir in -ldir" >&5
+ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldir $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1174 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:1185: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="$LIBS -ldir"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
+echo "configure:1207: checking for opendir in -lx" >&5
+ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lx $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1215 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:1226: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
rm -f conftest*
+LIBS="$ac_save_LIBS"
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="$LIBS -lx"
+else
+ echo "$ac_t""no" 1>&6
+fi
-for ac_func in strcasecmp sighold
+fi
+
+
+for ac_func in strcasecmp select setenv putenv tcgetattr setlocale lstat
do
-ac_tr_func=HAVE_`echo $ac_func | tr '[a-z]' '[A-Z]'`
-test -n "$silent" || echo "checking for ${ac_func}"
-cat > conftest.${ac_ext} <<EOF
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:1252: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1257 "configure"
#include "confdefs.h"
-#include <ctype.h>
-int main() { return 0; }
-int t() {
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
-#if defined (__stub_${ac_func}) || defined (__stub___${ac_func})
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-/* Override any gcc2 internal prototype to avoid an error. */
-extern char ${ac_func}(); ${ac_func}();
+$ac_func();
#endif
+
; return 0; }
EOF
-if eval $ac_compile; then
+if { (eval echo configure:1280: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
- {
-test -n "$verbose" && \
-echo " defining ${ac_tr_func}"
-echo "#define" ${ac_tr_func} "1" >> confdefs.h
-DEFS="$DEFS -D${ac_tr_func}=1"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}${ac_tr_func}\${ac_dB}${ac_tr_func}\${ac_dC}1\${ac_dD}
-\${ac_uA}${ac_tr_func}\${ac_uB}${ac_tr_func}\${ac_uC}1\${ac_uD}
-\${ac_eA}${ac_tr_func}\${ac_eB}${ac_tr_func}\${ac_eC}1\${ac_eD}
-"
-}
-
-
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
done
-for ac_hdr in unistd.h stdlib.h varargs.h string.h alloca.h \
- dirent.h sys/ptem.h sys/pte.h sys/stream.h termcap.h \
- termio.h
-do
-ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./' '[A-Z]__'`
-test -n "$silent" || echo "checking for ${ac_hdr}"
-cat > conftest.${ac_ext} <<EOF
+echo $ac_n "checking for working strcoll""... $ac_c" 1>&6
+echo "configure:1306: checking for working strcoll" >&5
+if eval "test \"`echo '$''{'ac_cv_func_strcoll_works'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_strcoll_works=no
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1314 "configure"
#include "confdefs.h"
-#include <${ac_hdr}>
-EOF
-# Some shells (Coherent) do redirections in the wrong order, so need
-# the parens.
-ac_err=`eval "($ac_cpp conftest.${ac_ext} >/dev/null) 2>&1"`
-if test -z "$ac_err"; then
- rm -rf conftest*
-
+#include <string.h>
+main ()
{
-test -n "$verbose" && \
-echo " defining ${ac_tr_hdr}"
-echo "#define" ${ac_tr_hdr} "1" >> confdefs.h
-DEFS="$DEFS -D${ac_tr_hdr}=1"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}${ac_tr_hdr}\${ac_dB}${ac_tr_hdr}\${ac_dC}1\${ac_dD}
-\${ac_uA}${ac_tr_hdr}\${ac_uB}${ac_tr_hdr}\${ac_uC}1\${ac_uD}
-\${ac_eA}${ac_tr_hdr}\${ac_eB}${ac_tr_hdr}\${ac_eC}1\${ac_eD}
-"
+ exit (strcoll ("abc", "def") >= 0 ||
+ strcoll ("ABC", "DEF") >= 0 ||
+ strcoll ("123", "456") >= 0);
}
+EOF
+if { (eval echo configure:1324: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_func_strcoll_works=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_func_strcoll_works=no
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_func_strcoll_works" 1>&6
+if test $ac_cv_func_strcoll_works = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_STRCOLL 1
+EOF
fi
-rm -f conftest*
-done
-test -n "$silent" || echo "checking for sys/file.h"
-cat > conftest.${ac_ext} <<EOF
+for ac_hdr in unistd.h stdlib.h varargs.h stdarg.h string.h \
+ sys/ptem.h sys/pte.h sys/stream.h sys/select.h \
+ termcap.h termios.h termio.h sys/file.h locale.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1353: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1358 "configure"
#include "confdefs.h"
-#include <sys/file.h>
+#include <$ac_hdr>
EOF
-# Some shells (Coherent) do redirections in the wrong order, so need
-# the parens.
-ac_err=`eval "($ac_cpp conftest.${ac_ext} >/dev/null) 2>&1"`
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1363: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
- :
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
rm -rf conftest*
-
-{
-test -n "$verbose" && \
-echo " defining NO_SYS_FILE"
-echo "#define" NO_SYS_FILE "1" >> confdefs.h
-DEFS="$DEFS -DNO_SYS_FILE=1"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}NO_SYS_FILE\${ac_dB}NO_SYS_FILE\${ac_dC}1\${ac_dD}
-\${ac_uA}NO_SYS_FILE\${ac_uB}NO_SYS_FILE\${ac_uC}1\${ac_uD}
-\${ac_eA}NO_SYS_FILE\${ac_eB}NO_SYS_FILE\${ac_eC}1\${ac_eD}
-"
-}
-
+ eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
-if test -z "$have_tiocgwinsz"; then
-test -n "$silent" || echo "checking for TIOCGWINSZ in sys/ioctl.h"
-cat > conftest.${ac_ext} <<EOF
+echo $ac_n "checking for type of signal functions""... $ac_c" 1>&6
+echo "configure:1392: checking for type of signal functions" >&5
+if eval "test \"`echo '$''{'bash_cv_signal_vintage'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 1398 "configure"
#include "confdefs.h"
-#include <sys/types.h>
-#include <sys/ioctl.h>
-int main() { return 0; }
-int t() { int x = TIOCGWINSZ;; return 0; }
+#include <signal.h>
+int main() {
+
+ sigset_t ss;
+ struct sigaction sa;
+ sigemptyset(&ss); sigsuspend(&ss);
+ sigaction(SIGINT, &sa, (struct sigaction *) 0);
+ sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0);
+
+; return 0; }
EOF
-if eval $ac_compile; then
+if { (eval echo configure:1411: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ bash_cv_signal_vintage=posix
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
rm -rf conftest*
-{
-test -n "$verbose" && \
-echo " defining GWINSZ_IN_SYS_IOCTL"
-echo "#define" GWINSZ_IN_SYS_IOCTL "1" >> confdefs.h
-DEFS="$DEFS -DGWINSZ_IN_SYS_IOCTL=1"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}GWINSZ_IN_SYS_IOCTL\${ac_dB}GWINSZ_IN_SYS_IOCTL\${ac_dC}1\${ac_dD}
-\${ac_uA}GWINSZ_IN_SYS_IOCTL\${ac_uB}GWINSZ_IN_SYS_IOCTL\${ac_uC}1\${ac_uD}
-\${ac_eA}GWINSZ_IN_SYS_IOCTL\${ac_eB}GWINSZ_IN_SYS_IOCTL\${ac_eC}1\${ac_eD}
-"
-}
-
+ cat > conftest.$ac_ext <<EOF
+#line 1420 "configure"
+#include "confdefs.h"
+#include <signal.h>
+int main() {
-fi
-rm -f conftest*
+ int mask = sigmask(SIGINT);
+ sigsetmask(mask); sigblock(mask); sigpause(mask);
+
+; return 0; }
+EOF
+if { (eval echo configure:1430: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ bash_cv_signal_vintage=4.2bsd
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+
+ cat > conftest.$ac_ext <<EOF
+#line 1439 "configure"
+#include "confdefs.h"
-fi
+ #include <signal.h>
+ RETSIGTYPE foo() { }
+int main() {
-test -n "$silent" || echo "checking for programs able to redeclare getpw functions"
-cat > conftest.${ac_ext} <<EOF
-#include "confdefs.h"
-#include <sys/types.h>
-#include <pwd.h>
-extern struct passwd *getpwuid();
-int main() { return 0; }
-int t() { struct passwd *z; z = getpwuid(0);; return 0; }
+ int mask = sigmask(SIGINT);
+ sigset(SIGINT, foo); sigrelse(SIGINT);
+ sighold(SIGINT); sigpause(SIGINT);
+
+; return 0; }
EOF
-if eval $ac_compile; then
- :
+if { (eval echo configure:1452: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ bash_cv_signal_vintage=svr3
else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
rm -rf conftest*
+ bash_cv_signal_vintage=v7
+
+fi
+rm -f conftest*
-{
-test -n "$verbose" && \
-echo " defining HAVE_GETPW_DECLS"
-echo "#define" HAVE_GETPW_DECLS "1" >> confdefs.h
-DEFS="$DEFS -DHAVE_GETPW_DECLS=1"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}HAVE_GETPW_DECLS\${ac_dB}HAVE_GETPW_DECLS\${ac_dC}1\${ac_dD}
-\${ac_uA}HAVE_GETPW_DECLS\${ac_uB}HAVE_GETPW_DECLS\${ac_uC}1\${ac_uD}
-\${ac_eA}HAVE_GETPW_DECLS\${ac_eB}HAVE_GETPW_DECLS\${ac_eC}1\${ac_eD}
-"
-}
+fi
+rm -f conftest*
fi
rm -f conftest*
+fi
-# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
-# for constant arguments. Useless!
-test -n "$silent" || echo "checking for working alloca.h"
-cat > conftest.${ac_ext} <<EOF
-#include "confdefs.h"
-#include <alloca.h>
-int main() { return 0; }
-int t() { char *p = alloca(2 * sizeof(int));; return 0; }
+echo "$ac_t""$bash_cv_signal_vintage" 1>&6
+if test "$bash_cv_signal_vintage" = posix; then
+cat >> confdefs.h <<\EOF
+#define HAVE_POSIX_SIGNALS 1
EOF
-if eval $ac_compile; then
- rm -rf conftest*
-
-{
-test -n "$verbose" && \
-echo " defining HAVE_ALLOCA_H"
-echo "#define" HAVE_ALLOCA_H "1" >> confdefs.h
-DEFS="$DEFS -DHAVE_ALLOCA_H=1"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}HAVE_ALLOCA_H\${ac_dB}HAVE_ALLOCA_H\${ac_dC}1\${ac_dD}
-\${ac_uA}HAVE_ALLOCA_H\${ac_uB}HAVE_ALLOCA_H\${ac_uC}1\${ac_uD}
-\${ac_eA}HAVE_ALLOCA_H\${ac_eB}HAVE_ALLOCA_H\${ac_eC}1\${ac_eD}
-"
-}
+elif test "$bash_cv_signal_vintage" = "4.2bsd"; then
+cat >> confdefs.h <<\EOF
+#define HAVE_BSD_SIGNALS 1
+EOF
+
+elif test "$bash_cv_signal_vintage" = svr3; then
+cat >> confdefs.h <<\EOF
+#define HAVE_USG_SIGHOLD 1
+EOF
fi
-rm -f conftest*
-ac_decl="#ifdef __GNUC__
-#define alloca __builtin_alloca
-#else
-#if HAVE_ALLOCA_H
-#include <alloca.h>
-#else
-#ifdef _AIX
- #pragma alloca
-#else
-char *alloca ();
-#endif
+
+
+echo $ac_n "checking if signal handlers must be reinstalled when invoked""... $ac_c" 1>&6
+echo "configure:1493: checking if signal handlers must be reinstalled when invoked" >&5
+if eval "test \"`echo '$''{'bash_cv_must_reinstall_sighandlers'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ { echo "configure: error: cannot check signal handling if cross compiling" 1>&2; exit 1; }
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1501 "configure"
+#include "confdefs.h"
+
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
#endif
+
+typedef RETSIGTYPE sigfunc();
+
+int nsigint;
+
+#ifdef HAVE_POSIX_SIGNALS
+sigfunc *
+set_signal_handler(sig, handler)
+ int sig;
+ sigfunc *handler;
+{
+ struct sigaction act, oact;
+ act.sa_handler = handler;
+ act.sa_flags = 0;
+ sigemptyset (&act.sa_mask);
+ sigemptyset (&oact.sa_mask);
+ sigaction (sig, &act, &oact);
+ return (oact.sa_handler);
+}
+#else
+#define set_signal_handler(s, h) signal(s, h)
#endif
-"
-test -n "$silent" || echo "checking for alloca"
-cat > conftest.${ac_ext} <<EOF
-#include "confdefs.h"
-$ac_decl
-int main() { return 0; }
-int t() { char *p = (char *) alloca(1);; return 0; }
-EOF
-if eval $ac_compile; then
- rm -rf conftest*
-
+
+RETSIGTYPE
+sigint(s)
+int s;
{
-test -n "$verbose" && \
-echo " defining HAVE_ALLOCA"
-echo "#define" HAVE_ALLOCA "1" >> confdefs.h
-DEFS="$DEFS -DHAVE_ALLOCA=1"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}HAVE_ALLOCA\${ac_dB}HAVE_ALLOCA\${ac_dC}1\${ac_dD}
-\${ac_uA}HAVE_ALLOCA\${ac_uB}HAVE_ALLOCA\${ac_uC}1\${ac_uD}
-\${ac_eA}HAVE_ALLOCA\${ac_eB}HAVE_ALLOCA\${ac_eC}1\${ac_eD}
-"
+ nsigint++;
}
+main()
+{
+ nsigint = 0;
+ set_signal_handler(SIGINT, sigint);
+ kill((int)getpid(), SIGINT);
+ kill((int)getpid(), SIGINT);
+ exit(nsigint != 2);
+}
+
+EOF
+if { (eval echo configure:1548: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ bash_cv_must_reinstall_sighandlers=no
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ bash_cv_must_reinstall_sighandlers=yes
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$bash_cv_must_reinstall_sighandlers" 1>&6
+if test $bash_cv_must_reinstall_sighandlers = yes; then
+cat >> confdefs.h <<\EOF
+#define MUST_REINSTALL_SIGHANDLERS 1
+EOF
+
+fi
+
+
+echo $ac_n "checking for presence of POSIX-style sigsetjmp/siglongjmp""... $ac_c" 1>&6
+echo "configure:1573: checking for presence of POSIX-style sigsetjmp/siglongjmp" >&5
+if eval "test \"`echo '$''{'bash_cv_func_sigsetjmp'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
else
- rm -rf conftest*
- ac_alloca_missing=1
-cat > conftest.${ac_ext} <<EOF
+ if test "$cross_compiling" = yes; then
+ { echo "configure: error: cannot check for sigsetjmp/siglongjmp if cross-compiling" 1>&2; exit 1; }
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1581 "configure"
#include "confdefs.h"
-#if defined(CRAY) && ! defined(CRAY2)
-winnitude
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/types.h>
+#include <signal.h>
+#include <setjmp.h>
+
+main()
+{
+#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS)
+exit (1);
#else
-lossage
+
+int code;
+sigset_t set, oset;
+sigjmp_buf xx;
+
+/* get the mask */
+sigemptyset(&set);
+sigemptyset(&oset);
+sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &set);
+sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset);
+
+/* save it */
+code = sigsetjmp(xx, 1);
+if (code)
+ exit(0); /* could get sigmask and compare to oset here. */
+
+/* change it */
+sigaddset(&set, SIGINT);
+sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL);
+
+/* and siglongjmp */
+siglongjmp(xx, 10);
+exit(1);
#endif
+}
+EOF
+if { (eval echo configure:1622: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ bash_cv_func_sigsetjmp=present
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ bash_cv_func_sigsetjmp=missing
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$bash_cv_func_sigsetjmp" 1>&6
+if test $bash_cv_func_sigsetjmp = present; then
+cat >> confdefs.h <<\EOF
+#define HAVE_POSIX_SIGSETJMP 1
EOF
-eval "$ac_cpp conftest.${ac_ext} > conftest.out 2>&1"
-if egrep "winnitude" conftest.out >/dev/null 2>&1; then
- rm -rf conftest*
- test -n "$silent" || echo "checking for _getb67"
-cat > conftest.${ac_ext} <<EOF
+
+fi
+
+echo $ac_n "checking for lstat""... $ac_c" 1>&6
+echo "configure:1646: checking for lstat" >&5
+if eval "test \"`echo '$''{'bash_cv_func_lstat'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1651 "configure"
#include "confdefs.h"
-#include <ctype.h>
-int main() { return 0; }
-int t() {
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub__getb67) || defined (__stub____getb67)
-choke me
-#else
-/* Override any gcc2 internal prototype to avoid an error. */
-extern char _getb67(); _getb67();
-#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int main() {
+ lstat("",(struct stat *)0);
; return 0; }
EOF
-if eval $ac_compile; then
+if { (eval echo configure:1661: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
- {
-test -n "$verbose" && \
-echo " defining" CRAY_STACKSEG_END to be "_getb67"
-echo "#define" CRAY_STACKSEG_END "_getb67" >> confdefs.h
-DEFS="$DEFS -DCRAY_STACKSEG_END=_getb67"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}CRAY_STACKSEG_END\${ac_dB}CRAY_STACKSEG_END\${ac_dC}_getb67\${ac_dD}
-\${ac_uA}CRAY_STACKSEG_END\${ac_uB}CRAY_STACKSEG_END\${ac_uC}_getb67\${ac_uD}
-\${ac_eA}CRAY_STACKSEG_END\${ac_eB}CRAY_STACKSEG_END\${ac_eC}_getb67\${ac_eD}
-"
-}
+ bash_cv_func_lstat=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_func_lstat=no
+fi
+rm -f conftest*
+fi
+echo "$ac_t""$bash_cv_func_lstat" 1>&6
+if test $bash_cv_func_lstat = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_LSTAT 1
+EOF
+
+fi
+echo $ac_n "checking whether programs are able to redeclare getpw functions""... $ac_c" 1>&6
+echo "configure:1682: checking whether programs are able to redeclare getpw functions" >&5
+if eval "test \"`echo '$''{'bash_cv_can_redecl_getpw'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
else
- rm -rf conftest*
- test -n "$silent" || echo "checking for GETB67"
-cat > conftest.${ac_ext} <<EOF
+ cat > conftest.$ac_ext <<EOF
+#line 1687 "configure"
#include "confdefs.h"
-#include <ctype.h>
-int main() { return 0; }
-int t() {
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_GETB67) || defined (__stub___GETB67)
-choke me
-#else
-/* Override any gcc2 internal prototype to avoid an error. */
-extern char GETB67(); GETB67();
-#endif
+#include <sys/types.h>
+#include <pwd.h>
+extern struct passwd *getpwent();
+int main() {
+struct passwd *z; z = getpwent();
; return 0; }
EOF
-if eval $ac_compile; then
+if { (eval echo configure:1696: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
- {
-test -n "$verbose" && \
-echo " defining" CRAY_STACKSEG_END to be "GETB67"
-echo "#define" CRAY_STACKSEG_END "GETB67" >> confdefs.h
-DEFS="$DEFS -DCRAY_STACKSEG_END=GETB67"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}CRAY_STACKSEG_END\${ac_dB}CRAY_STACKSEG_END\${ac_dC}GETB67\${ac_dD}
-\${ac_uA}CRAY_STACKSEG_END\${ac_uB}CRAY_STACKSEG_END\${ac_uC}GETB67\${ac_uD}
-\${ac_eA}CRAY_STACKSEG_END\${ac_eB}CRAY_STACKSEG_END\${ac_eC}GETB67\${ac_eD}
-"
-}
+ bash_cv_can_redecl_getpw=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_can_redecl_getpw=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$bash_cv_can_redecl_getpw" 1>&6
+if test $bash_cv_can_redecl_getpw = no; then
+cat >> confdefs.h <<\EOF
+#define HAVE_GETPW_DECLS 1
+EOF
+
+fi
+echo $ac_n "checking whether or not strcoll and strcmp differ""... $ac_c" 1>&6
+echo "configure:1718: checking whether or not strcoll and strcmp differ" >&5
+if eval "test \"`echo '$''{'bash_cv_func_strcoll_broken'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
else
- rm -rf conftest*
- test -n "$silent" || echo "checking for getb67"
-cat > conftest.${ac_ext} <<EOF
+ if test "$cross_compiling" = yes; then
+ { echo "configure: error: cannot check strcoll if cross compiling" 1>&2; exit 1; }
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1726 "configure"
#include "confdefs.h"
-#include <ctype.h>
-int main() { return 0; }
-int t() {
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_getb67) || defined (__stub___getb67)
-choke me
+
+#include <stdio.h>
+#if defined (HAVE_LOCALE_H)
+#include <locale.h>
+#endif
+
+main(c, v)
+int c;
+char *v[];
+{
+ int r1, r2;
+ char *deflocale, *defcoll;
+
+#ifdef HAVE_SETLOCALE
+ deflocale = setlocale(LC_ALL, "");
+ defcoll = setlocale(LC_COLLATE, "");
+#endif
+
+#ifdef HAVE_STRCOLL
+ /* These two values are taken from tests/glob-test. */
+ r1 = strcoll("abd", "aXd");
#else
-/* Override any gcc2 internal prototype to avoid an error. */
-extern char getb67(); getb67();
+ r1 = 0;
#endif
-; return 0; }
-EOF
-if eval $ac_compile; then
- rm -rf conftest*
- {
-test -n "$verbose" && \
-echo " defining" CRAY_STACKSEG_END to be "getb67"
-echo "#define" CRAY_STACKSEG_END "getb67" >> confdefs.h
-DEFS="$DEFS -DCRAY_STACKSEG_END=getb67"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}CRAY_STACKSEG_END\${ac_dB}CRAY_STACKSEG_END\${ac_dC}getb67\${ac_dD}
-\${ac_uA}CRAY_STACKSEG_END\${ac_uB}CRAY_STACKSEG_END\${ac_uC}getb67\${ac_uD}
-\${ac_eA}CRAY_STACKSEG_END\${ac_eB}CRAY_STACKSEG_END\${ac_eC}getb67\${ac_eD}
-"
+ r2 = strcmp("abd", "aXd");
+
+ /* These two should both be greater than 0. It is permissible for
+ a system to return different values, as long as the sign is the
+ same. */
+
+ /* Exit with 1 (failure) if these two values are both > 0, since
+ this tests whether strcoll(3) is broken with respect to strcmp(3)
+ in the default locale. */
+ exit (r1 > 0 && r2 > 0);
}
+EOF
+if { (eval echo configure:1765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ bash_cv_func_strcoll_broken=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ bash_cv_func_strcoll_broken=no
+fi
+rm -fr conftest*
+fi
+
fi
-rm -f conftest*
+
+echo "$ac_t""$bash_cv_func_strcoll_broken" 1>&6
+if test $bash_cv_func_strcoll_broken = yes; then
+cat >> confdefs.h <<\EOF
+#define STRCOLL_BROKEN 1
+EOF
fi
-rm -f conftest*
+
+echo $ac_n "checking whether signal handlers are of type void""... $ac_c" 1>&6
+echo "configure:1790: checking whether signal handlers are of type void" >&5
+if eval "test \"`echo '$''{'bash_cv_void_sighandler'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1795 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+void (*signal ()) ();
+int main() {
+int i;
+; return 0; }
+EOF
+if { (eval echo configure:1810: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_void_sighandler=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_void_sighandler=no
fi
rm -f conftest*
+fi
+echo "$ac_t""$bash_cv_void_sighandler" 1>&6
+if test $bash_cv_void_sighandler = yes; then
+cat >> confdefs.h <<\EOF
+#define VOID_SIGHANDLER 1
+EOF
+fi
+echo $ac_n "checking for TIOCGWINSZ in sys/ioctl.h""... $ac_c" 1>&6
+echo "configure:1830: checking for TIOCGWINSZ in sys/ioctl.h" >&5
+if eval "test \"`echo '$''{'bash_cv_tiocgwinsz_in_ioctl'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1835 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/ioctl.h>
+int main() {
+int x = TIOCGWINSZ;
+; return 0; }
+EOF
+if { (eval echo configure:1843: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_tiocgwinsz_in_ioctl=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_tiocgwinsz_in_ioctl=no
fi
rm -f conftest*
+fi
+echo "$ac_t""$bash_cv_tiocgwinsz_in_ioctl" 1>&6
+if test $bash_cv_tiocgwinsz_in_ioctl = yes; then
+cat >> confdefs.h <<\EOF
+#define GWINSZ_IN_SYS_IOCTL 1
+EOF
fi
+
+echo $ac_n "checking for TIOCSTAT in sys/ioctl.h""... $ac_c" 1>&6
+echo "configure:1864: checking for TIOCSTAT in sys/ioctl.h" >&5
+if eval "test \"`echo '$''{'bash_cv_tiocstat_in_ioctl'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1869 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/ioctl.h>
+int main() {
+int x = TIOCSTAT;
+; return 0; }
+EOF
+if { (eval echo configure:1877: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_tiocstat_in_ioctl=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_tiocstat_in_ioctl=no
+fi
rm -f conftest*
+fi
-if test -n "$ac_alloca_missing"; then
- # The SVR3 libPW and SVR4 libucb both contain incompatible functions
- # that cause trouble. Some versions do not even contain alloca or
- # contain a buggy version. If you still want to use their alloca,
- # use ar to extract alloca.o from them instead of compiling alloca.c.
- ALLOCA=alloca.o
-
-{
-test -n "$verbose" && \
-echo " defining C_ALLOCA"
-echo "#define" C_ALLOCA "1" >> confdefs.h
-DEFS="$DEFS -DC_ALLOCA=1"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}C_ALLOCA\${ac_dB}C_ALLOCA\${ac_dC}1\${ac_dD}
-\${ac_uA}C_ALLOCA\${ac_uB}C_ALLOCA\${ac_uC}1\${ac_uD}
-\${ac_eA}C_ALLOCA\${ac_eB}C_ALLOCA\${ac_eC}1\${ac_eD}
-"
-}
+echo "$ac_t""$bash_cv_tiocstat_in_ioctl" 1>&6
+if test $bash_cv_tiocstat_in_ioctl = yes; then
+cat >> confdefs.h <<\EOF
+#define TIOCSTAT_IN_SYS_IOCTL 1
+EOF
+fi
- test -n "$silent" || echo "checking stack direction for C alloca"
- test -n "$silent" || echo "checking whether cross-compiling"
-# If we cannot run a trivial program, we must be cross compiling.
-cat > conftest.${ac_ext} <<EOF
+echo $ac_n "checking for FIONREAD in sys/ioctl.h""... $ac_c" 1>&6
+echo "configure:1898: checking for FIONREAD in sys/ioctl.h" >&5
+if eval "test \"`echo '$''{'bash_cv_fionread_in_ioctl'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1903 "configure"
#include "confdefs.h"
-main(){exit(0);}
+#include <sys/types.h>
+#include <sys/ioctl.h>
+int main() {
+int x = FIONREAD;
+; return 0; }
EOF
-eval $ac_compile
-if test -s conftest && (./conftest; exit) 2>/dev/null; then
- :
+if { (eval echo configure:1911: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_fionread_in_ioctl=yes
else
- cross_compiling=1
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_fionread_in_ioctl=no
+fi
+rm -f conftest*
fi
-rm -fr conftest*
-if test -n "$cross_compiling"
-then
-
-{
-test -n "$verbose" && \
-echo " defining" STACK_DIRECTION to be "0"
-echo "#define" STACK_DIRECTION "0" >> confdefs.h
-DEFS="$DEFS -DSTACK_DIRECTION=0"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}STACK_DIRECTION\${ac_dB}STACK_DIRECTION\${ac_dC}0\${ac_dD}
-\${ac_uA}STACK_DIRECTION\${ac_uB}STACK_DIRECTION\${ac_uC}0\${ac_uD}
-\${ac_eA}STACK_DIRECTION\${ac_eB}STACK_DIRECTION\${ac_eC}0\${ac_eD}
-"
-}
+echo "$ac_t""$bash_cv_fionread_in_ioctl" 1>&6
+if test $bash_cv_fionread_in_ioctl = yes; then
+cat >> confdefs.h <<\EOF
+#define FIONREAD_IN_SYS_IOCTL 1
+EOF
+
+fi
+echo $ac_n "checking for speed_t in sys/types.h""... $ac_c" 1>&6
+echo "configure:1932: checking for speed_t in sys/types.h" >&5
+if eval "test \"`echo '$''{'bash_cv_speed_t_in_sys_types'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
else
-cat > conftest.${ac_ext} <<EOF
+ cat > conftest.$ac_ext <<EOF
+#line 1937 "configure"
#include "confdefs.h"
-find_stack_direction ()
-{
- static char *addr = 0;
- auto char dummy;
- if (addr == 0)
- {
- addr = &dummy;
- return find_stack_direction ();
- }
- else
- return (&dummy > addr) ? 1 : -1;
-}
-main ()
-{
- exit (find_stack_direction() < 0);
-}
+#include <sys/types.h>
+int main() {
+speed_t x;
+; return 0; }
+EOF
+if { (eval echo configure:1944: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_speed_t_in_sys_types=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_speed_t_in_sys_types=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$bash_cv_speed_t_in_sys_types" 1>&6
+if test $bash_cv_speed_t_in_sys_types = yes; then
+cat >> confdefs.h <<\EOF
+#define SPEED_T_IN_SYS_TYPES 1
EOF
-eval $ac_compile
-if test -s conftest && (./conftest; exit) 2>/dev/null; then
-
-{
-test -n "$verbose" && \
-echo " defining" STACK_DIRECTION to be "1"
-echo "#define" STACK_DIRECTION "1" >> confdefs.h
-DEFS="$DEFS -DSTACK_DIRECTION=1"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}STACK_DIRECTION\${ac_dB}STACK_DIRECTION\${ac_dC}1\${ac_dD}
-\${ac_uA}STACK_DIRECTION\${ac_uB}STACK_DIRECTION\${ac_uC}1\${ac_uD}
-\${ac_eA}STACK_DIRECTION\${ac_eB}STACK_DIRECTION\${ac_eC}1\${ac_eD}
-"
-}
+
+fi
+echo $ac_n "checking if struct dirent has a d_ino member""... $ac_c" 1>&6
+echo "configure:1966: checking if struct dirent has a d_ino member" >&5
+if eval "test \"`echo '$''{'bash_cv_dirent_has_dino'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
else
-
-{
-test -n "$verbose" && \
-echo " defining" STACK_DIRECTION to be "-1"
-echo "#define" STACK_DIRECTION "-1" >> confdefs.h
-DEFS="$DEFS -DSTACK_DIRECTION=-1"
-ac_sed_defs="${ac_sed_defs}\${ac_dA}STACK_DIRECTION\${ac_dB}STACK_DIRECTION\${ac_dC}-1\${ac_dD}
-\${ac_uA}STACK_DIRECTION\${ac_uB}STACK_DIRECTION\${ac_uC}-1\${ac_uD}
-\${ac_eA}STACK_DIRECTION\${ac_eB}STACK_DIRECTION\${ac_eC}-1\${ac_eD}
-"
-}
+ cat > conftest.$ac_ext <<EOF
+#line 1971 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+
+int main() {
+
+struct dirent d; int z; z = d.d_ino;
+
+; return 0; }
+EOF
+if { (eval echo configure:2000: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_dirent_has_dino=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_dirent_has_dino=no
fi
+rm -f conftest*
fi
-rm -fr conftest*
+
+echo "$ac_t""$bash_cv_dirent_has_dino" 1>&6
+if test $bash_cv_dirent_has_dino = yes; then
+cat >> confdefs.h <<\EOF
+#define STRUCT_DIRENT_HAS_D_INO 1
+EOF
+
fi
+echo $ac_n "checking if struct dirent has a d_fileno member""... $ac_c" 1>&6
+echo "configure:2022: checking if struct dirent has a d_fileno member" >&5
+if eval "test \"`echo '$''{'bash_cv_dirent_has_d_fileno'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2027 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+
+int main() {
+
+struct dirent d; int z; z = d.d_fileno;
-# The preferred way to propogate these variables is regular @ substitutions.
-if test -n "$prefix"; then
- ac_prsub="s%^prefix\\([ ]*\\)=\\([ ]*\\).*$%prefix\\1=\\2$prefix%"
+; return 0; }
+EOF
+if { (eval echo configure:2056: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_dirent_has_d_fileno=yes
else
- prefix=/usr/local
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_dirent_has_d_fileno=no
+fi
+rm -f conftest*
fi
-if test -n "$exec_prefix"; then
- ac_prsub="$ac_prsub
-s%^exec_prefix\\([ ]*\\)=\\([ ]*\\).*$%exec_prefix\\1=\\2$exec_prefix%"
+
+echo "$ac_t""$bash_cv_dirent_has_d_fileno" 1>&6
+if test $bash_cv_dirent_has_d_fileno = yes; then
+cat >> confdefs.h <<\EOF
+#define STRUCT_DIRENT_HAS_D_FILENO 1
+EOF
+
+fi
+
+
+case "$host_cpu" in
+*cray*) LOCAL_CFLAGS=-DCRAY ;;
+esac
+
+case "$host_os" in
+isc*) LOCAL_CFLAGS=-Disc386 ;;
+esac
+
+
+
+
+
+
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
else
- exec_prefix='${prefix}' # Let make expand it.
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
# Any assignment to VPATH causes Sun make to only execute
# the first set of double-colon rules, so remove it if not needed.
@@ -1016,36 +2151,36 @@ if test "x$srcdir" = x.; then
ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
fi
-# Quote sed substitution magic chars in DEFS.
-cat >conftest.def <<EOF
-$DEFS
-EOF
-ac_escape_ampersand_and_backslash='s%[&\\]%\\&%g'
-DEFS=`sed "$ac_escape_ampersand_and_backslash" <conftest.def`
-rm -f conftest.def
-# Substitute for predefined variables.
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
-trap 'rm -f config.status; exit 1' 1 2 15
-echo creating config.status
-rm -f config.status
-cat > config.status <<EOF
-#!/bin/sh
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
# This directory was configured as follows,
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
#
-# $0 $configure_args
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
-ac_cs_usage="Usage: config.status [--recheck] [--version] [--help]"
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
for ac_option
do
case "\$ac_option" in
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
- echo running \${CONFIG_SHELL-/bin/sh} $0 $configure_args --no-create
- exec \${CONFIG_SHELL-/bin/sh} $0 $configure_args --no-create ;;
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
- echo "config.status generated by autoconf version 1.11"
+ echo "$CONFIG_STATUS generated by autoconf version 2.12"
exit 0 ;;
-help | --help | --hel | --he | --h)
echo "\$ac_cs_usage"; exit 0 ;;
@@ -1053,46 +2188,121 @@ do
esac
done
-trap 'rm -fr Makefile config.h conftest*; exit 1' 1 2 15
-CC='$CC'
-CFLAGS='$CFLAGS'
-LDFLAGS='$LDFLAGS'
-CPP='$CPP'
-INSTALL='$INSTALL'
-INSTALL_PROGRAM='$INSTALL_PROGRAM'
-INSTALL_DATA='$INSTALL_DATA'
-RANLIB='$RANLIB'
-ALLOCA='$ALLOCA'
-LIBS='$LIBS'
-srcdir='$srcdir'
-top_srcdir='$top_srcdir'
-prefix='$prefix'
-exec_prefix='$exec_prefix'
-ac_prsub='$ac_prsub'
-ac_vpsub='$ac_vpsub'
-extrasub='$extrasub'
-EOF
-cat >> config.status <<\EOF
-
ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile doc/Makefile examples/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@RANLIB@%$RANLIB%g
+s%@LOCAL_CFLAGS@%$LOCAL_CFLAGS%g
+s%@LOCAL_DEFS@%$LOCAL_DEFS%g
+s%@LIBVERSION@%$LIBVERSION%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile doc/Makefile examples/Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
-CONFIG_FILES=${CONFIG_FILES-"Makefile"}
-for ac_file in .. ${CONFIG_FILES}; do if test "x$ac_file" != x..; then
# Remove last slash and all that follows it. Not all systems have dirname.
ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
# The file is in a subdirectory.
test ! -d "$ac_dir" && mkdir "$ac_dir"
- ac_dir_suffix="/$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
else
- ac_dir_suffix=
+ ac_dir_suffix= ac_dots=
fi
- # A "../" for each directory in $ac_dir_suffix.
- ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
case "$ac_given_srcdir" in
.) srcdir=.
- if test -z "$ac_dir_suffix"; then top_srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
/*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
*) # Relative path.
@@ -1100,141 +2310,149 @@ for ac_file in .. ${CONFIG_FILES}; do if test "x$ac_file" != x..; then
top_srcdir="$ac_dots$ac_given_srcdir" ;;
esac
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
echo creating "$ac_file"
rm -f "$ac_file"
- comment_str="Generated automatically from `echo $ac_file|sed 's|.*/||'`.in by configure."
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
case "$ac_file" in
- *.c | *.h | *.C | *.cc | *.m ) echo "/* $comment_str */" > "$ac_file" ;;
- * ) echo "# $comment_str" > "$ac_file" ;;
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
esac
- sed -e "
-$ac_prsub
-$ac_vpsub
-$extrasub
-s%@CC@%$CC%g
-s%@CFLAGS@%$CFLAGS%g
-s%@LDFLAGS@%$LDFLAGS%g
-s%@CPP@%$CPP%g
-s%@INSTALL@%$INSTALL%g
-s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
-s%@INSTALL_DATA@%$INSTALL_DATA%g
-s%@RANLIB@%$RANLIB%g
-s%@ALLOCA@%$ALLOCA%g
-s%@LIBS@%$LIBS%g
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
s%@srcdir@%$srcdir%g
s%@top_srcdir@%$top_srcdir%g
-s%@prefix@%$prefix%g
-s%@exec_prefix@%$exec_prefix%g
-s%@DEFS@%-DHAVE_CONFIG_H%" $ac_given_srcdir/${ac_file}.in >> $ac_file
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
fi; done
+rm -f conftest.s*
-# These sed commands are put into ac_sed_defs when defining a macro.
-# They are broken into pieces to make the sed script easier to manage.
-# They are passed to sed as "A NAME B NAME C VALUE D", where NAME
-# is the cpp macro being defined and VALUE is the value it is being given.
-# Each defining turns into a single global substitution command.
-# Hopefully no one uses "!" as a variable value.
-# Other candidates for the sed separators, like , and @, do get used.
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
#
# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s!^\([ ]*\)#\([ ]*define[ ][ ]*\)'
-ac_dB='\([ ][ ]*\)[^ ]*!\1#\2'
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
ac_dC='\3'
-ac_dD='!g'
+ac_dD='%g'
# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
-ac_uA='s!^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
-ac_uB='\([ ]\)!\1#\2define\3'
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
ac_uC=' '
-ac_uD='\4!g'
+ac_uD='\4%g'
# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_eA='s!^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
-ac_eB='$!\1#\2define\3'
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
ac_eC=' '
-ac_eD='!g'
-rm -f conftest.sed
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.in
+
EOF
-# Turn off quoting long enough to insert the sed commands.
-rm -f conftest.sh
-cat > conftest.sh <<EOF
-$ac_sed_defs
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
-# Break up $ac_sed_defs (now in conftest.sh) because some shells have a limit
-# on the size of here documents.
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
-# Maximum number of lines to put in a single here document.
-ac_max_sh_lines=9
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+rm -f conftest.tail
while :
do
- # wc gives bogus results for an empty file on some AIX systems.
- ac_lines=`grep -c . conftest.sh`
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
- rm -f conftest.s1 conftest.s2
- sed ${ac_max_sh_lines}q conftest.sh > conftest.s1 # Like head -9.
- sed 1,${ac_max_sh_lines}d conftest.sh > conftest.s2 # Like tail +10.
- # Write a limited-size here document to append to conftest.sed.
- echo 'cat >> conftest.sed <<CONFEOF' >> config.status
- cat conftest.s1 >> config.status
- echo 'CONFEOF' >> config.status
- rm -f conftest.s1 conftest.sh
- mv conftest.s2 conftest.sh
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
done
-rm -f conftest.sh
-
-# Now back to your regularly scheduled config.status.
-cat >> config.status <<\EOF
-# This sed command replaces #undef's with comments. This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it in
-# config.h.
-cat >> conftest.sed <<\CONFEOF
-s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-CONFEOF
-rm -f conftest.h
-# Break up the sed commands because old seds have small limits.
-ac_max_sed_lines=20
-
-CONFIG_HEADERS=${CONFIG_HEADERS-"config.h"}
-for ac_file in .. ${CONFIG_HEADERS}; do if test "x$ac_file" != x..; then
- echo creating $ac_file
+rm -f conftest.vals
- cp $ac_given_srcdir/$ac_file.in conftest.h1
- cp conftest.sed conftest.stm
- while :
- do
- ac_lines=`grep -c . conftest.stm`
- if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
- rm -f conftest.s1 conftest.s2 conftest.h2
- sed ${ac_max_sed_lines}q conftest.stm > conftest.s1 # Like head -20.
- sed 1,${ac_max_sed_lines}d conftest.stm > conftest.s2 # Like tail +21.
- sed -f conftest.s1 < conftest.h1 > conftest.h2
- rm -f conftest.s1 conftest.h1 conftest.stm
- mv conftest.h2 conftest.h1
- mv conftest.s2 conftest.stm
- done
- rm -f conftest.stm conftest.h
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
- cat conftest.h1 >> conftest.h
- rm -f conftest.h1
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
if cmp -s $ac_file conftest.h 2>/dev/null; then
- # The file exists and we would not be changing it.
echo "$ac_file is unchanged"
rm -f conftest.h
else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
rm -f $ac_file
mv conftest.h $ac_file
fi
fi; done
-rm -f conftest.sed
+EOF
+cat >> $CONFIG_STATUS <<EOF
+EOF
+cat >> $CONFIG_STATUS <<\EOF
# Makefile uses this timestamp file to record whether config.h is up to date.
-touch stamp-config
+echo > stamp-h
+
exit 0
EOF
-chmod +x config.status
-# Some shells look in PATH for config.status without the "./".
-test -n "$no_create" || ${CONFIG_SHELL-/bin/sh} ./config.status
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
diff --git a/configure.in b/configure.in
index febcbab..13152b8 100644
--- a/configure.in
+++ b/configure.in
@@ -1,7 +1,21 @@
+dnl
+dnl Configure script for readline library
+dnl
+dnl report bugs to chet@po.cwru.edu
+dnl
dnl Process this file with autoconf to produce a configure script.
+AC_REVISION([for Readline 2.1, version 2.04, from autoconf version] AC_ACVERSION)
+LIBVERSION=2.1
+
AC_INIT(readline.h)
AC_CONFIG_HEADER(config.h)
-AC_REVISION(Configure for Readline 2.0)
+
+dnl make sure we are using a recent autoconf version
+AC_PREREQ(2.10)
+
+AC_CONFIG_AUX_DIR(./support)
+
+AC_CANONICAL_HOST
# We want these before the checks, so the checks can modify their values.
test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1
@@ -11,38 +25,58 @@ AC_PROG_CC
# If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS.
test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O"
-AC_SUBST(CFLAGS)dnl
-AC_SUBST(LDFLAGS)dnl
-
-AC_GCC_TRADITIONAL
+AC_PROG_GCC_TRADITIONAL
AC_PROG_INSTALL
AC_PROG_RANLIB
-AC_USG
+AC_RETSIGTYPE
+
+AC_HEADER_STAT
+AC_HEADER_DIRENT
+
+AC_CHECK_FUNCS(strcasecmp select setenv putenv tcgetattr setlocale lstat)
+
+AC_FUNC_STRCOLL
+
+AC_CHECK_HEADERS(unistd.h stdlib.h varargs.h stdarg.h string.h \
+ sys/ptem.h sys/pte.h sys/stream.h sys/select.h \
+ termcap.h termios.h termio.h sys/file.h locale.h)
+
+BASH_SIGNAL_CHECK
+BASH_REINSTALL_SIGHANDLERS
+
+BASH_FUNC_POSIX_SETJMP
+BASH_FUNC_LSTAT
+BASH_CHECK_GETPW_FUNCS
+BASH_FUNC_STRCOLL
-AC_HAVE_FUNCS(strcasecmp sighold)
+BASH_TYPE_SIGHANDLER
+BASH_HAVE_TIOCGWINSZ
+BASH_HAVE_TIOCSTAT
+BASH_HAVE_FIONREAD
+BASH_MISC_SPEED_T
+BASH_STRUCT_DIRENT_D_INO
+BASH_STRUCT_DIRENT_D_FILENO
-AC_HAVE_HEADERS(unistd.h stdlib.h varargs.h string.h alloca.h \
- dirent.h sys/ptem.h sys/pte.h sys/stream.h termcap.h \
- termio.h)
+case "$host_cpu" in
+*cray*) LOCAL_CFLAGS=-DCRAY ;;
+esac
-AC_HEADER_CHECK(sys/file.h, ,AC_DEFINE(NO_SYS_FILE))
+case "$host_os" in
+isc*) LOCAL_CFLAGS=-Disc386 ;;
+esac
-if test -z "$have_tiocgwinsz"; then
-AC_COMPILE_CHECK(TIOCGWINSZ in sys/ioctl.h,
-[#include <sys/types.h>
-#include <sys/ioctl.h>], [int x = TIOCGWINSZ;],
-AC_DEFINE(GWINSZ_IN_SYS_IOCTL))
-fi
+AC_SUBST(CFLAGS)
+AC_SUBST(LOCAL_CFLAGS)
+AC_SUBST(LOCAL_DEFS)
-AC_COMPILE_CHECK(programs able to redeclare getpw functions,
-[#include <sys/types.h>
-#include <pwd.h>
-extern struct passwd *getpwuid();], [struct passwd *z; z = getpwuid(0);], ,
-AC_DEFINE(HAVE_GETPW_DECLS))
+AC_SUBST(host_cpu)
+AC_SUBST(host_os)
-AC_ALLOCA
+AC_SUBST(LIBVERSION)
-AC_OUTPUT(Makefile, [
+AC_OUTPUT([Makefile doc/Makefile examples/Makefile],
+[
# Makefile uses this timestamp file to record whether config.h is up to date.
-touch stamp-config])
+echo > stamp-h
+])
diff --git a/display.c b/display.c
index 8204570..c283f9a 100644
--- a/display.c
+++ b/display.c
@@ -21,24 +21,37 @@
675 Mass Ave, Cambridge, MA 02139, USA. */
#define READLINE_LIBRARY
-#include <stdio.h>
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
#include <sys/types.h>
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
+#include "posixstat.h"
+
#if defined (HAVE_STDLIB_H)
# include <stdlib.h>
#else
# include "ansi_stdlib.h"
#endif /* HAVE_STDLIB_H */
-#include "posixstat.h"
+#include <stdio.h>
+
+#if defined (__GO32__)
+# include <go32.h>
+# include <pc.h>
+#endif /* __GO32__ */
/* System-specific feature definitions and include files. */
#include "rldefs.h"
+/* Termcap library stuff. */
+#include "tcap.h"
+
/* Some standard library routines. */
#include "readline.h"
#include "history.h"
@@ -51,27 +64,34 @@ extern char *strchr (), *strrchr ();
imported from readline.c. */
extern char *rl_prompt;
extern int readline_echoing_p;
-extern char *term_clreol, *term_im, *term_ic, *term_ei, *term_DC;
-/* Termcap variables. */
-extern char *term_up, *term_dc, *term_cr, *term_IC;
-extern int screenheight, screenwidth, screenchars;
-extern int terminal_can_insert, term_xn;
-
-extern void _rl_output_some_chars ();
-extern int _rl_output_character_function ();
extern int _rl_output_meta_chars;
extern int _rl_horizontal_scroll_mode;
extern int _rl_mark_modified_lines;
extern int _rl_prefer_visible_bell;
+/* Variables and functions imported from terminal.c */
+extern void _rl_output_some_chars ();
+extern int _rl_output_character_function ();
+extern int _rl_backspace ();
+
+extern char *term_clreol, *term_clrpag;
+extern char *term_im, *term_ic, *term_ei, *term_DC;
+extern char *term_up, *term_dc, *term_cr, *term_IC;
+extern int screenheight, screenwidth, screenchars;
+extern int terminal_can_insert, _rl_term_autowrap;
+
/* Pseudo-global functions (local to the readline library) exported
by this file. */
void _rl_move_cursor_relative (), _rl_output_some_chars ();
void _rl_move_vert ();
+void _rl_clear_to_eol (), _rl_clear_screen ();
-static void update_line (), clear_to_eol (), space_to_eol ();
+static void update_line (), space_to_eol ();
static void delete_chars (), insert_some_chars ();
+static void cr ();
+
+static int *inv_lbreaks, *vis_lbreaks;
extern char *xmalloc (), *xrealloc ();
@@ -106,10 +126,15 @@ extern char *xmalloc (), *xrealloc ();
this function know that the display has been fixed by setting the
RL_DISPLAY_FIXED variable. This is good for efficiency. */
+/* Application-specific redisplay function. */
+VFunction *rl_redisplay_function = rl_redisplay;
+
/* Global variables declared here. */
/* What YOU turn on when you have handled all redisplay yourself. */
int rl_display_fixed = 0;
+int _rl_suppress_redisplay = 0;
+
/* The stuff that gets printed out before the actual text of the line.
This is usually pointing to rl_prompt. */
char *rl_display_prompt = (char *)NULL;
@@ -125,7 +150,7 @@ int _rl_vis_botlin = 0;
/* Variables used only in this file. */
/* The last left edge of text that was displayed. This is used when
doing horizontal scrolling. It shifts in thirds of a screenwidth. */
-static int last_lmargin = 0;
+static int last_lmargin;
/* The line display buffers. One is the line currently displayed on
the screen. The other is the line about to be displayed. */
@@ -136,26 +161,32 @@ static char *invisible_line = (char *)NULL;
static char msg_buf[128];
/* Non-zero forces the redisplay even if we thought it was unnecessary. */
-static int forced_display = 0;
+static int forced_display;
/* Default and initial buffer size. Can grow. */
static int line_size = 1024;
-static char *last_prompt_string = (char *)NULL;
static char *local_prompt, *local_prompt_prefix;
static int visible_length, prefix_length;
/* The number of invisible characters in the line currently being
displayed on the screen. */
-static int visible_wrap_offset = 0;
+static int visible_wrap_offset;
+
+/* static so it can be shared between rl_redisplay and update_line */
+static int wrap_offset;
+
+/* The index of the last invisible_character in the prompt string. */
+static int last_invisible;
/* The length (buffer offset) of the first line of the last (possibly
multi-line) buffer displayed on the screen. */
-static int visible_first_line_len = 0;
+static int visible_first_line_len;
/* Expand the prompt string S and return the number of visible
characters in *LP, if LP is not null. This is currently more-or-less
- a placeholder for expansion. */
+ a placeholder for expansion. LIP, if non-null is a place to store the
+ index of the last invisible character in ther eturned string. */
/* Current implementation:
\001 (^A) start non-visible characters
@@ -165,12 +196,12 @@ static int visible_first_line_len = 0;
\002 are assumed to be `visible'. */
static char *
-expand_prompt (pmt, lp)
+expand_prompt (pmt, lp, lip)
char *pmt;
- int *lp;
+ int *lp, *lip;
{
char *r, *ret, *p;
- int l, rl, ignoring;
+ int l, rl, last, ignoring;
/* Short-circuit if we can. */
if (strchr (pmt, RL_PROMPT_START_IGNORE) == 0)
@@ -184,7 +215,7 @@ expand_prompt (pmt, lp)
l = strlen (pmt);
r = ret = xmalloc (l + 1);
- for (rl = ignoring = 0, p = pmt; p && *p; p++)
+ for (rl = ignoring = last = 0, p = pmt; p && *p; p++)
{
/* This code strips the invisible character string markers
RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE */
@@ -196,6 +227,7 @@ expand_prompt (pmt, lp)
else if (ignoring && *p == RL_PROMPT_END_IGNORE)
{
ignoring = 0;
+ last = r - ret - 1;
continue;
}
else
@@ -209,6 +241,8 @@ expand_prompt (pmt, lp)
*r = '\0';
if (lp)
*lp = rl;
+ if (lip)
+ *lip = last;
return ret;
}
@@ -242,12 +276,16 @@ rl_expand_prompt (prompt)
if (local_prompt_prefix)
free (local_prompt_prefix);
local_prompt = local_prompt_prefix = (char *)0;
+ last_invisible = 0;
+
+ if (prompt == 0 || *prompt == 0)
+ return (0);
p = strrchr (prompt, '\n');
if (!p)
{
/* The prompt is only one line. */
- local_prompt = expand_prompt (prompt, &visible_length);
+ local_prompt = expand_prompt (prompt, &visible_length, &last_invisible);
local_prompt_prefix = (char *)0;
return (visible_length);
}
@@ -255,11 +293,11 @@ rl_expand_prompt (prompt)
{
/* The prompt spans multiple lines. */
t = ++p;
- local_prompt = expand_prompt (p, &visible_length);
+ local_prompt = expand_prompt (p, &visible_length, &last_invisible);
c = *t; *t = '\0';
/* The portion of the prompt string up to and including the
final newline is now null-terminated. */
- local_prompt_prefix = expand_prompt (prompt, &prefix_length);
+ local_prompt_prefix = expand_prompt (prompt, &prefix_length, (int *)NULL);
*t = c;
return (prefix_length);
}
@@ -269,9 +307,10 @@ rl_expand_prompt (prompt)
void
rl_redisplay ()
{
- register int in, out, c, linenum;
- register char *line = invisible_line;
- int c_pos = 0, inv_botlin = 0, wrap_offset, wrap_column;
+ register int in, out, c, linenum, cursor_linenum;
+ register char *line;
+ int c_pos, inv_botlin, lb_botlin, lb_linenum;
+ int newlines, lpos, temp;
char *prompt_this_line;
if (!readline_echoing_p)
@@ -280,25 +319,32 @@ rl_redisplay ()
if (!rl_display_prompt)
rl_display_prompt = "";
- if (!invisible_line)
+ if (invisible_line == 0)
{
visible_line = xmalloc (line_size);
invisible_line = xmalloc (line_size);
- line = invisible_line;
for (in = 0; in < line_size; in++)
{
visible_line[in] = 0;
invisible_line[in] = 1;
}
+
+ /* should be enough, but then again, this is just for testing. */
+ inv_lbreaks = (int *)malloc (256 * sizeof (int));
+ vis_lbreaks = (int *)malloc (256 * sizeof (int));
+ inv_lbreaks[0] = vis_lbreaks[0] = 0;
+
rl_on_new_line ();
}
/* Draw the line into the buffer. */
c_pos = -1;
+ line = invisible_line;
+ out = inv_botlin = 0;
+
/* Mark the line as modified or not. We only do this for history
lines. */
- out = 0;
if (_rl_mark_modified_lines && current_history () && rl_undo_list)
{
line[out++] = '*';
@@ -315,15 +361,17 @@ rl_redisplay ()
one passed to readline()), use the values we have already expanded.
If not, use what's already in rl_display_prompt. WRAP_OFFSET is the
number of non-visible characters in the prompt string. */
- if (rl_display_prompt == rl_prompt)
+ if (rl_display_prompt == rl_prompt || local_prompt)
{
int local_len = local_prompt ? strlen (local_prompt) : 0;
if (local_prompt_prefix && forced_display)
_rl_output_some_chars (local_prompt_prefix, strlen (local_prompt_prefix));
if (local_len > 0)
- strncpy (line + out, local_prompt, local_len);
- out += local_len;
+ {
+ strncpy (line + out, local_prompt, local_len);
+ out += local_len;
+ }
line[out] = '\0';
wrap_offset = local_len - visible_length;
}
@@ -337,7 +385,13 @@ rl_redisplay ()
{
prompt_this_line++;
if (forced_display)
- _rl_output_some_chars (rl_display_prompt, prompt_this_line - rl_display_prompt);
+ {
+ _rl_output_some_chars (rl_display_prompt, prompt_this_line - rl_display_prompt);
+ /* Make sure we are at column zero even after a newline,
+ regardless of the state of terminal output processing. */
+ if (prompt_this_line[-2] != '\r')
+ cr ();
+ }
}
pmtlen = strlen (prompt_this_line);
@@ -347,6 +401,30 @@ rl_redisplay ()
wrap_offset = 0;
}
+#define CHECK_LPOS() \
+ do { \
+ lpos++; \
+ if (lpos >= screenwidth) \
+ { \
+ inv_lbreaks[++newlines] = out; \
+ lpos = 0; \
+ } \
+ } while (0)
+
+ /* inv_lbreaks[i] is where line i starts in the buffer. */
+ inv_lbreaks[newlines = 0] = 0;
+ lpos = out - wrap_offset;
+
+ /* XXX - what if lpos is already >= screenwidth before we start drawing the
+ contents of the command line? */
+ while (lpos >= screenwidth)
+ {
+ temp = ((newlines + 1) * screenwidth) - ((newlines == 0) ? wrap_offset : 0);
+ inv_lbreaks[++newlines] = temp;
+ lpos -= screenwidth;
+ }
+
+ lb_linenum = 0;
for (in = 0; in < rl_end; in++)
{
c = (unsigned char)rl_line_buffer[in];
@@ -360,42 +438,86 @@ rl_redisplay ()
}
if (in == rl_point)
- c_pos = out;
+ {
+ c_pos = out;
+ lb_linenum = newlines;
+ }
if (META_CHAR (c))
{
if (_rl_output_meta_chars == 0)
{
sprintf (line + out, "\\%o", c);
+
+ if (lpos + 4 >= screenwidth)
+ {
+ temp = screenwidth - lpos;
+ inv_lbreaks[++newlines] = out + temp;
+ lpos = 4 - temp;
+ }
+ else
+ lpos += 4;
+
out += 4;
}
else
- line[out++] = c;
+ {
+ line[out++] = c;
+ CHECK_LPOS();
+ }
}
#if defined (DISPLAY_TABS)
else if (c == '\t')
{
- register int newout = (out | (int)7) + 1;
- while (out < newout)
- line[out++] = ' ';
+ register int temp, newout;
+ newout = (out | (int)7) + 1;
+ temp = newout - out;
+ if (lpos + temp >= screenwidth)
+ {
+ register int temp2;
+ temp2 = screenwidth - lpos;
+ inv_lbreaks[++newlines] = out + temp2;
+ lpos = temp - temp2;
+ while (out < newout)
+ line[out++] = ' ';
+ }
+ else
+ {
+ while (out < newout)
+ line[out++] = ' ';
+ lpos += temp;
+ }
}
#endif
- else if (c < ' ')
+ else if (c == '\n' && _rl_horizontal_scroll_mode == 0 && term_up && *term_up)
+ {
+ line[out++] = '\0'; /* XXX - sentinel */
+ inv_lbreaks[++newlines] = out;
+ lpos = 0;
+ }
+ else if (CTRL_CHAR (c) || c == RUBOUT)
{
line[out++] = '^';
- line[out++] = UNCTRL (c); /* XXX was c ^ 0x40 */
+ CHECK_LPOS();
+ line[out++] = CTRL_CHAR (c) ? UNCTRL (c) : '?';
+ CHECK_LPOS();
}
- else if (c == 127)
+ else
{
- line[out++] = '^';
- line[out++] = '?';
+ line[out++] = c;
+ CHECK_LPOS();
}
- else
- line[out++] = c;
}
line[out] = '\0';
if (c_pos < 0)
- c_pos = out;
+ {
+ c_pos = out;
+ lb_linenum = newlines;
+ }
+
+ inv_botlin = lb_botlin = newlines;
+ inv_lbreaks[newlines+1] = out;
+ cursor_linenum = lb_linenum;
/* C_POS == position in buffer where cursor should be placed. */
@@ -408,10 +530,9 @@ rl_redisplay ()
otherwise, let long lines display in a single terminal line, and
horizontally scroll it. */
- if (!_rl_horizontal_scroll_mode && term_up && *term_up)
+ if (_rl_horizontal_scroll_mode == 0 && term_up && *term_up)
{
- int total_screen_chars = screenchars;
- int nleft, cursor_linenum, pos, changed_screen_line;
+ int nleft, pos, changed_screen_line;
if (!rl_display_fixed || forced_display)
{
@@ -419,52 +540,46 @@ rl_redisplay ()
/* If we have more than a screenful of material to display, then
only display a screenful. We should display the last screen,
- not the first. I'll fix this in a minute. */
- if (out >= total_screen_chars)
- out = total_screen_chars - 1;
-
- /* Number of screen lines to display. The first line wraps at
- (screenwidth + wrap_offset) chars, the rest of the lines have
- screenwidth chars. */
- nleft = out - wrap_offset + term_xn - 1;
- inv_botlin = (nleft > 0) ? nleft / screenwidth : 0;
+ not the first. */
+ if (out >= screenchars)
+ out = screenchars - 1;
/* The first line is at character position 0 in the buffer. The
- second and subsequent lines start at N * screenwidth, offset by
- OFFSET. OFFSET is wrap_offset for the invisible line and
- visible_wrap_offset for the line currently displayed. */
+ second and subsequent lines start at inv_lbreaks[N], offset by
+ OFFSET (which has already been calculated above). */
#define W_OFFSET(line, offset) ((line) == 0 ? offset : 0)
-#define L_OFFSET(n, offset) ((n) > 0 ? ((n) * screenwidth) + (offset) : 0)
-#define VIS_CHARS(line) &visible_line[L_OFFSET((line), visible_wrap_offset)]
+#define VIS_LLEN(l) ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l]))
+#define INV_LLEN(l) (inv_lbreaks[l+1] - inv_lbreaks[l])
+#define VIS_CHARS(line) (visible_line + vis_lbreaks[line])
#define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line)
-#define INV_LINE(line) &invisible_line[L_OFFSET((line), wrap_offset)]
+#define INV_LINE(line) (invisible_line + inv_lbreaks[line])
/* For each line in the buffer, do the updating display. */
for (linenum = 0; linenum <= inv_botlin; linenum++)
{
update_line (VIS_LINE(linenum), INV_LINE(linenum), linenum,
- screenwidth + W_OFFSET(linenum, visible_wrap_offset),
- screenwidth + W_OFFSET(linenum, wrap_offset),
- inv_botlin);
+ VIS_LLEN(linenum), INV_LLEN(linenum), inv_botlin);
/* If this is the line with the prompt, we might need to
compensate for invisible characters in the new line. Do
this only if there is not more than one new line (which
implies that we completely overwrite the old visible line)
- and the new line is shorter than the old. */
+ and the new line is shorter than the old. Make sure we are
+ at the end of the new line before clearing. */
if (linenum == 0 &&
- inv_botlin == 0 &&
+ inv_botlin == 0 && _rl_last_c_pos == out &&
(wrap_offset > visible_wrap_offset) &&
(_rl_last_c_pos < visible_first_line_len))
{
nleft = screenwidth + wrap_offset - _rl_last_c_pos;
- clear_to_eol (nleft);
+ if (nleft)
+ _rl_clear_to_eol (nleft);
}
/* Since the new first line is now visible, save its length. */
if (linenum == 0)
- visible_first_line_len = (inv_botlin > 0) ? screenwidth : out - wrap_offset;
+ visible_first_line_len = (inv_botlin > 0) ? inv_lbreaks[1] : out - wrap_offset;
}
/* We may have deleted some lines. If so, clear the left over
@@ -477,17 +592,12 @@ rl_redisplay ()
tt = VIS_CHARS (linenum);
_rl_move_vert (linenum);
_rl_move_cursor_relative (0, tt);
- clear_to_eol
+ _rl_clear_to_eol
((linenum == _rl_vis_botlin) ? strlen (tt) : screenwidth);
}
}
_rl_vis_botlin = inv_botlin;
- /* Move the cursor where it should be. */
- /* Which line? */
- nleft = c_pos - wrap_offset - term_xn + 1;
- cursor_linenum = (nleft > 0) ? nleft / screenwidth : 0;
-
/* CHANGED_SCREEN_LINE is set to 1 if we have moved to a
different screen line during this redisplay. */
changed_screen_line = _rl_last_v_pos != cursor_linenum;
@@ -504,10 +614,12 @@ rl_redisplay ()
/* We have to reprint the prompt if it contains invisible
characters, since it's not generally OK to just reprint
- the characters from the current cursor position. */
+ the characters from the current cursor position. But we
+ only need to reprint it if the cursor is before the last
+ invisible character in the prompt string. */
nleft = visible_length + wrap_offset;
if (cursor_linenum == 0 && wrap_offset > 0 && _rl_last_c_pos > 0 &&
- _rl_last_c_pos <= nleft && local_prompt)
+ _rl_last_c_pos <= last_invisible && local_prompt)
{
if (term_cr)
tputs (term_cr, 1, _rl_output_character_function);
@@ -517,17 +629,17 @@ rl_redisplay ()
/* Where on that line? And where does that line start
in the buffer? */
- pos = L_OFFSET(cursor_linenum, wrap_offset);
+ pos = inv_lbreaks[cursor_linenum];
/* nleft == number of characters in the line buffer between the
start of the line and the cursor position. */
nleft = c_pos - pos;
- /* Since backspace() doesn't know about invisible characters in the
+ /* Since _rl_backspace() doesn't know about invisible characters in the
prompt, and there's no good way to tell it, we compensate for
- those characters here and call backspace() directly. */
+ those characters here and call _rl_backspace() directly. */
if (wrap_offset && cursor_linenum == 0 && nleft < _rl_last_c_pos)
{
- backspace (_rl_last_c_pos - nleft);
+ _rl_backspace (_rl_last_c_pos - nleft);
_rl_last_c_pos = nleft;
}
@@ -615,7 +727,7 @@ rl_redisplay ()
t < visible_first_line_len)
{
nleft = screenwidth - t;
- clear_to_eol (nleft);
+ _rl_clear_to_eol (nleft);
}
visible_first_line_len = out - lmargin - M_OFFSET (lmargin, wrap_offset);
if (visible_first_line_len > screenwidth)
@@ -630,8 +742,11 @@ rl_redisplay ()
/* Swap visible and non-visible lines. */
{
char *temp = visible_line;
+ int *itemp = vis_lbreaks;
visible_line = invisible_line;
invisible_line = temp;
+ vis_lbreaks = inv_lbreaks;
+ inv_lbreaks = itemp;
rl_display_fixed = 0;
/* If we are displaying on a single line, and last_lmargin is > 0, we
are not displaying any invisible characters, so set visible_wrap_offset
@@ -662,10 +777,11 @@ new: eddie> Oh, my little buggy says to me, as lurgid as
static void
update_line (old, new, current_line, omax, nmax, inv_botlin)
register char *old, *new;
- int current_line, omax, nmax;
+ int current_line, omax, nmax, inv_botlin;
{
register char *ofd, *ols, *oe, *nfd, *nls, *ne;
int temp, lendiff, wsatend, od, nd;
+ int current_invis_chars;
/* If we're at the right edge of a terminal that supports xn, we're
ready to wrap around, so do so. This fixes problems with knowing
@@ -673,7 +789,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
emulators. In this calculation, TEMP is the physical screen
position of the cursor. */
temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset);
- if (temp == screenwidth && term_xn && !_rl_horizontal_scroll_mode
+ if (temp == screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
&& _rl_last_v_pos == current_line - 1)
{
if (new[0])
@@ -682,7 +798,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
putc (' ', rl_outstream);
_rl_last_c_pos = 1; /* XXX */
_rl_last_v_pos++;
- if (old[0])
+ if (old[0] && new[0])
old[0] = new[0];
}
@@ -726,33 +842,53 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
nls++;
}
- _rl_move_vert (current_line);
+ /* count of invisible characters in the current invisible line. */
+ current_invis_chars = W_OFFSET (current_line, wrap_offset);
+ if (_rl_last_v_pos != current_line)
+ {
+ _rl_move_vert (current_line);
+ if (current_line == 0 && visible_wrap_offset)
+ _rl_last_c_pos += visible_wrap_offset;
+ }
/* If this is the first line and there are invisible characters in the
- prompt string, and the prompt string has not changed, then redraw
- the entire prompt string. We can only do this reliably if the
- terminal supports a `cr' capability.
-
- This is more than just an efficiency hack -- there is a problem with
- redrawing portions of the prompt string if they contain terminal
- escape sequences (like drawing the `unbold' sequence without a
- corresponding `bold') that manifests itself on certain terminals. */
-
- lendiff = strlen (local_prompt);
+ prompt string, and the prompt string has not changed, and the current
+ cursor position is before the last invisible character in the prompt,
+ and the index of the character to move to is past the end of the prompt
+ string, then redraw the entire prompt string. We can only do this
+ reliably if the terminal supports a `cr' capability.
+
+ This is not an efficiency hack -- there is a problem with redrawing
+ portions of the prompt string if they contain terminal escape
+ sequences (like drawing the `unbold' sequence without a corresponding
+ `bold') that manifests itself on certain terminals. */
+
+ lendiff = local_prompt ? strlen (local_prompt) : 0;
+ od = ofd - old; /* index of first difference in visible line */
if (current_line == 0 && !_rl_horizontal_scroll_mode &&
- lendiff > visible_length &&
- _rl_last_c_pos > 0 && (ofd - old) >= lendiff && term_cr)
+ term_cr && lendiff > visible_length && _rl_last_c_pos > 0 &&
+ od > lendiff && _rl_last_c_pos < last_invisible)
{
tputs (term_cr, 1, _rl_output_character_function);
_rl_output_some_chars (local_prompt, lendiff);
_rl_last_c_pos = lendiff;
}
- _rl_move_cursor_relative (ofd - old, old);
+ _rl_move_cursor_relative (od, old);
/* if (len (new) > len (old)) */
lendiff = (nls - nfd) - (ols - ofd);
+ /* If we are changing the number of invisible characters in a line, and
+ the spot of first difference is before the end of the invisible chars,
+ lendiff needs to be adjusted. */
+ if (current_line == 0 && !_rl_horizontal_scroll_mode &&
+ current_invis_chars != visible_wrap_offset)
+ {
+ temp = visible_wrap_offset - current_invis_chars;
+ lendiff += temp;
+ }
+
/* Insert (diff (len (old), len (new)) ch. */
temp = ne - nfd;
if (lendiff > 0)
@@ -763,25 +899,36 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
use the terminal's capabilities. If we're growing the number
of lines, make sure we actually cause the new line to wrap
around on auto-wrapping terminals. */
- if (terminal_can_insert && ((2 * temp) >= lendiff || term_IC) && (!term_xn || !gl))
+ if (terminal_can_insert && ((2 * temp) >= lendiff || term_IC) && (!_rl_term_autowrap || !gl))
{
/* If lendiff > visible_length and _rl_last_c_pos == 0 and
_rl_horizontal_scroll_mode == 1, inserting the characters with
term_IC or term_ic will screw up the screen because of the
invisible characters. We need to just draw them. */
if (*ols && (!_rl_horizontal_scroll_mode || _rl_last_c_pos > 0 ||
- lendiff <= visible_length))
+ lendiff <= visible_length || !current_invis_chars))
{
insert_some_chars (nfd, lendiff);
_rl_last_c_pos += lendiff;
}
- else
+ else if (*ols == 0)
{
/* At the end of a line the characters do not have to
be "inserted". They can just be placed on the screen. */
+ /* However, this screws up the rest of this block, which
+ assumes you've done the insert because you can. */
_rl_output_some_chars (nfd, lendiff);
_rl_last_c_pos += lendiff;
}
+ else
+ {
+ /* We have horizontal scrolling and we are not inserting at
+ the end. We have invisible characters in this line. This
+ is a dumb update. */
+ _rl_output_some_chars (nfd, temp);
+ _rl_last_c_pos += temp;
+ return;
+ }
/* Copy (new) chars to screen from first diff to last match. */
temp = nls - nfd;
if ((temp - lendiff) > 0)
@@ -829,15 +976,16 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
_rl_last_c_pos += temp;
}
lendiff = (oe - old) - (ne - new);
- if (term_xn && current_line < inv_botlin)
+ if (_rl_term_autowrap && current_line < inv_botlin)
space_to_eol (lendiff);
else
- clear_to_eol (lendiff);
+ _rl_clear_to_eol (lendiff);
}
}
}
/* Tell the update routines that we have moved onto a new (empty) line. */
+int
rl_on_new_line ()
{
if (visible_line)
@@ -845,21 +993,26 @@ rl_on_new_line ()
_rl_last_c_pos = _rl_last_v_pos = 0;
_rl_vis_botlin = last_lmargin = 0;
+ if (vis_lbreaks)
+ vis_lbreaks[0] = vis_lbreaks[1] = 0;
+ visible_wrap_offset = 0;
return 0;
}
/* Actually update the display, period. */
+int
rl_forced_update_display ()
{
if (visible_line)
{
register char *temp = visible_line;
- while (*temp) *temp++ = '\0';
+ while (*temp)
+ *temp++ = '\0';
}
rl_on_new_line ();
forced_display++;
- rl_redisplay ();
+ (*rl_redisplay_function) ();
return 0;
}
@@ -880,7 +1033,8 @@ _rl_move_cursor_relative (new, data)
of moving backwards. */
/* i == current physical cursor position. */
i = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset);
- if (CR_FASTER (new, _rl_last_c_pos) || (term_xn && i == screenwidth))
+ if (new == 0 || CR_FASTER (new, _rl_last_c_pos) ||
+ (_rl_term_autowrap && i == screenwidth))
{
#if defined (__MSDOS__)
putc ('\r', rl_outstream);
@@ -916,7 +1070,7 @@ _rl_move_cursor_relative (new, data)
#endif /* HACK_TERMCAP_MOTION */
}
else if (_rl_last_c_pos != new)
- backspace (_rl_last_c_pos - new);
+ _rl_backspace (_rl_last_c_pos - new);
_rl_last_c_pos = new;
}
@@ -958,6 +1112,7 @@ _rl_move_vert (to)
/* Physically print C on rl_outstream. This is for functions which know
how to optimize the display. Return the number of characters output. */
+int
rl_show_char (c)
int c;
{
@@ -970,14 +1125,14 @@ rl_show_char (c)
}
#if defined (DISPLAY_TABS)
- if (c < 32 && c != '\t')
+ if ((CTRL_CHAR (c) && c != '\t') || c == RUBOUT)
#else
- if (c < 32)
+ if (CTRL_CHAR (c) || c == RUBOUT)
#endif /* !DISPLAY_TABS */
{
fprintf (rl_outstream, "C-");
n += 2;
- c += 64;
+ c = CTRL_CHAR (c) ? UNCTRL (c) : '?';
}
putc (c, rl_outstream);
@@ -1005,47 +1160,65 @@ rl_character_len (c, pos)
#endif /* !DISPLAY_TABS */
}
+ if (CTRL_CHAR (c) || c == RUBOUT)
+ return (2);
+
return ((isprint (uc)) ? 1 : 2);
}
/* How to print things in the "echo-area". The prompt is treated as a
mini-modeline. */
-#if defined (HAVE_VARARGS_H)
+#if defined (USE_VARARGS)
+int
+#if defined (PREFER_STDARG)
+rl_message (const char *format, ...)
+#else
rl_message (va_alist)
va_dcl
+#endif
{
- char *format;
va_list args;
+#if defined (PREFER_VARARGS)
+ char *format;
+#endif
+#if defined (PREFER_STDARG)
+ va_start (args, format);
+#else
va_start (args);
format = va_arg (args, char *);
+#endif
+
vsprintf (msg_buf, format, args);
va_end (args);
rl_display_prompt = msg_buf;
- rl_redisplay ();
+ (*rl_redisplay_function) ();
return 0;
}
-#else /* !HAVE_VARARGS_H */
+#else /* !USE_VARARGS */
+int
rl_message (format, arg1, arg2)
char *format;
{
sprintf (msg_buf, format, arg1, arg2);
rl_display_prompt = msg_buf;
- rl_redisplay ();
+ (*rl_redisplay_function) ();
return 0;
}
-#endif /* !HAVE_VARARGS_H */
+#endif /* !USE_VARARGS */
/* How to clear things from the "echo-area". */
+int
rl_clear_message ()
{
rl_display_prompt = rl_prompt;
- rl_redisplay ();
+ (*rl_redisplay_function) ();
return 0;
}
+int
rl_reset_line_state ()
{
rl_on_new_line ();
@@ -1055,6 +1228,70 @@ rl_reset_line_state ()
return 0;
}
+static char *saved_local_prompt;
+static char *saved_local_prefix;
+static int saved_last_invisible;
+static int saved_visible_length;
+
+void
+_rl_save_prompt ()
+{
+ saved_local_prompt = local_prompt;
+ saved_local_prefix = local_prompt_prefix;
+ saved_last_invisible = last_invisible;
+ saved_visible_length = visible_length;
+
+ local_prompt = local_prompt_prefix = (char *)0;
+ last_invisible = visible_length = 0;
+}
+
+void
+_rl_restore_prompt ()
+{
+ if (local_prompt)
+ free (local_prompt);
+ if (local_prompt_prefix)
+ free (local_prompt_prefix);
+
+ local_prompt = saved_local_prompt;
+ local_prompt_prefix = saved_local_prefix;
+ last_invisible = saved_last_invisible;
+ visible_length = saved_visible_length;
+}
+
+char *
+_rl_make_prompt_for_search (pchar)
+ int pchar;
+{
+ int len;
+ char *pmt;
+
+ _rl_save_prompt ();
+
+ if (saved_local_prompt == 0)
+ {
+ len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0;
+ pmt = xmalloc (len + 2);
+ if (len)
+ strcpy (pmt, rl_prompt);
+ pmt[len] = pchar;
+ pmt[len+1] = '\0';
+ }
+ else
+ {
+ len = *saved_local_prompt ? strlen (saved_local_prompt) : 0;
+ pmt = xmalloc (len + 2);
+ if (len)
+ strcpy (pmt, saved_local_prompt);
+ pmt[len] = pchar;
+ pmt[len+1] = '\0';
+ local_prompt = savestring (pmt);
+ last_invisible = saved_last_invisible;
+ visible_length = saved_visible_length + 1;
+ }
+ return pmt;
+}
+
/* Quick redisplay hack when erasing characters at the end of the line. */
void
_rl_erase_at_end_of_line (l)
@@ -1062,10 +1299,10 @@ _rl_erase_at_end_of_line (l)
{
register int i;
- backspace (l);
+ _rl_backspace (l);
for (i = 0; i < l; i++)
putc (' ', rl_outstream);
- backspace (l);
+ _rl_backspace (l);
for (i = 0; i < l; i++)
visible_line[--_rl_last_c_pos] = '\0';
rl_display_fixed++;
@@ -1073,16 +1310,14 @@ _rl_erase_at_end_of_line (l)
/* Clear to the end of the line. COUNT is the minimum
number of character spaces to clear, */
-static void
-clear_to_eol (count)
+void
+_rl_clear_to_eol (count)
int count;
{
#if !defined (__GO32__)
if (term_clreol)
- {
- tputs (term_clreol, 1, _rl_output_character_function);
- }
- else
+ tputs (term_clreol, 1, _rl_output_character_function);
+ else if (count)
#endif /* !__GO32__ */
space_to_eol (count);
}
@@ -1101,6 +1336,17 @@ space_to_eol (count)
_rl_last_c_pos += count;
}
+void
+_rl_clear_screen ()
+{
+#if !defined (__GO32__)
+ if (term_clrpag)
+ tputs (term_clrpag, 1, _rl_output_character_function);
+ else
+#endif /* !__GO32__ */
+ crlf ();
+}
+
/* Insert COUNT characters from STRING to the output stream. */
static void
insert_some_chars (string, count)
@@ -1124,7 +1370,7 @@ insert_some_chars (string, count)
/* If IC is defined, then we do not have to "enter" insert mode. */
if (term_IC)
{
- char *tgoto (), *buffer;
+ char *buffer;
buffer = tgoto (term_IC, 0, count);
tputs (buffer, 1, _rl_output_character_function);
_rl_output_some_chars (string, count);
@@ -1178,7 +1424,7 @@ delete_chars (count)
if (term_DC && *term_DC)
{
- char *tgoto (), *buffer;
+ char *buffer;
buffer = tgoto (term_DC, count, count);
tputs (buffer, count, _rl_output_character_function);
}
@@ -1197,19 +1443,22 @@ _rl_update_final ()
int full_lines;
full_lines = 0;
- if (_rl_vis_botlin && visible_line[screenwidth * _rl_vis_botlin] == 0)
+ /* If the cursor is the only thing on an otherwise-blank last line,
+ compensate so we don't print an extra CRLF. */
+ if (_rl_vis_botlin && _rl_last_c_pos == 0 &&
+ visible_line[vis_lbreaks[_rl_vis_botlin]] == 0)
{
_rl_vis_botlin--;
full_lines = 1;
}
_rl_move_vert (_rl_vis_botlin);
- if (full_lines && term_xn)
+ /* If we've wrapped lines, remove the final xterm line-wrap flag. */
+ if (full_lines && _rl_term_autowrap && (VIS_LLEN(_rl_vis_botlin) == screenwidth))
{
- /* Remove final line-wrap flag in xterm. */
char *last_line;
- last_line = &visible_line[screenwidth * _rl_vis_botlin];
+ last_line = &visible_line[inv_lbreaks[_rl_vis_botlin]];
_rl_move_cursor_relative (screenwidth - 1, last_line);
- clear_to_eol (0);
+ _rl_clear_to_eol (0);
putc (last_line[screenwidth - 1], rl_outstream);
}
_rl_vis_botlin = 0;
@@ -1217,3 +1466,64 @@ _rl_update_final ()
fflush (rl_outstream);
rl_display_fixed++;
}
+
+/* Move to the start of the current line. */
+static void
+cr ()
+{
+ if (term_cr)
+ {
+ tputs (term_cr, 1, _rl_output_character_function);
+ _rl_last_c_pos = 0;
+ }
+}
+
+/* Redisplay the current line after a SIGWINCH is received. */
+void
+_rl_redisplay_after_sigwinch ()
+{
+ char *t, *oldp;
+
+ /* Clear the current line and put the cursor at column 0. Make sure
+ the right thing happens if we have wrapped to a new screen line. */
+ if (term_cr)
+ {
+ tputs (term_cr, 1, _rl_output_character_function);
+ _rl_last_c_pos = 0;
+ if (term_clreol)
+ tputs (term_clreol, 1, _rl_output_character_function);
+ else
+ {
+ space_to_eol (screenwidth);
+ tputs (term_cr, 1, _rl_output_character_function);
+ }
+ if (_rl_last_v_pos > 0)
+ _rl_move_vert (0);
+ }
+ else
+ crlf ();
+
+ /* Redraw only the last line of a multi-line prompt. */
+ t = strrchr (rl_display_prompt, '\n');
+ if (t)
+ {
+ oldp = rl_display_prompt;
+ rl_display_prompt = ++t;
+ rl_forced_update_display ();
+ rl_display_prompt = oldp;
+ }
+ else
+ rl_forced_update_display ();
+}
+
+void
+_rl_clean_up_for_exit ()
+{
+ if (readline_echoing_p)
+ {
+ _rl_move_vert (_rl_vis_botlin);
+ _rl_vis_botlin = 0;
+ fflush (rl_outstream);
+ rl_restart_output ();
+ }
+}
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..bbbd5c3
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,123 @@
+# This makefile for Readline library documentation is in -*- text -*- mode.
+# Emacs likes it that way.
+top_srcdir = @top_srcdir@
+srcdir = @srcdir@
+
+prefix = @prefix@
+infodir = @infodir@
+
+mandir = @mandir@
+man3dir = $(mandir)/man3
+
+RM = rm -f
+
+TEXINPUTDIR = $(srcdir)
+
+MAKEINFO = makeinfo
+TEXI2DVI = $(srcdir)/texi2dvi
+TEXI2HTML = $(srcdir)/texi2html
+QUIETPS = #set this to -q to shut up dvips
+DVIPS = dvips -D 300 $(QUIETPS) -o $@ # tricky
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+RLSRC = $(srcdir)/rlman.texinfo $(srcdir)/rluser.texinfo \
+ $(srcdir)/rltech.texinfo
+HISTSRC = $(srcdir)/hist.texinfo $(srcdir)/hsuser.texinfo \
+ $(srcdir)/hstech.texinfo
+
+# This should be a program that converts troff to an ascii-readable format
+NROFF = groff -Tascii
+
+# This should be a program that converts troff to postscript
+GROFF = groff
+
+DVIOBJ = readline.dvi history.dvi
+INFOOBJ = readline.info history.info
+PSOBJ = readline.ps history.ps
+HTMLOBJ = readline.html history.html
+TEXTOBJ = readline.0
+
+CREATED_DOCS = $(DVIOBJ) $(INFOOBJ) $(PSOBJ) $(HTMLOBJ) $(TEXTOBJ)
+
+.SUFFIXES: .0 .3 .ps .txt .dvi
+
+.3.0:
+ $(RM) $@
+ -${NROFF} -man $< > $@
+
+all: info dvi html ps text
+nodvi: info html text
+
+readline.dvi: $(RLSRC)
+ TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rlman.texinfo
+ mv rlman.dvi readline.dvi
+
+readline.info: $(RLSRC)
+ $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rlman.texinfo
+
+history.dvi: ${HISTSRC}
+ TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/hist.texinfo
+ mv hist.dvi history.dvi
+
+history.info: ${HISTSRC}
+ $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/hist.texinfo
+
+readline.ps: readline.dvi
+ $(RM) $@
+ $(DVIPS) readline.dvi
+
+history.ps: history.dvi
+ $(RM) $@
+ $(DVIPS) history.dvi
+
+readline.html: ${RLSRC}
+ $(TEXI2HTML) -I $(TEXINPUTDIR) $(srcdir)/rlman.texinfo
+ sed -e 's:rlman.html:readline.html:' -e 's:rlman_toc.html:readline_toc.html:' rlman.html > readline.html
+ sed -e 's:rlman.html:readline.html:' -e 's:rlman_toc.html:readline_toc.html:' rlman_toc.html > readline_toc.html
+ $(RM) rlman.html rlman_toc.html
+
+history.html: ${HISTSRC}
+ $(TEXI2HTML) -I $(TEXINPUTDIR) $(srcdir)/hist.texinfo
+ sed -e 's:hist.html:history.html:' -e 's:hist_toc.html:history_toc.html:' hist.html > history.html
+ sed -e 's:hist.html:history.html:' -e 's:hist_toc.html:history_toc.html:' hist_toc.html > history_toc.html
+ $(RM) hist.html hist_toc.html
+
+info: $(INFOOBJ)
+dvi: $(DVIOBJ)
+ps: $(PSOBJ)
+html: $(HTMLOBJ)
+text: $(TEXTOBJ)
+
+readline.0: $(srcdir)/readline.3
+
+clean:
+ $(RM) *.aux *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps *.pgs \
+ *.fns *.kys *.tps *.vrs *.o core
+
+distclean: clean
+ $(RM) $(CREATED_DOCS)
+
+mostlyclean: clean
+
+maintainer-clean: clean
+ $(RM) $(CREATED_DOCS)
+
+installdirs: $(top_srcdir)/support/mkdirs
+ -$(SHELL) $(top_srcdir)/support/mkdirs $(infodir) $(man3dir)
+
+install: installdirs info
+ ${INSTALL_DATA} readline.info $(infodir)/readline.info
+ ${INSTALL_DATA} history.info $(infodir)/history.info
+ if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
+ install-info --dir-file=$(infodir)/dir $(infodir)/readline.info ; \
+ install-info --dir-file=$(infodir)/dir $(infodir)/history.info ; \
+ else true; fi
+ -${INSTALL_DATA} $(srcdir)/readline.3 $(man3dir)/readline.3
+
+uninstall:
+ $(RM) $(infodir)/readline.info
+ $(RM) $(infodir)/history.info
+ $(RM) $(man3dir)/readline.3
diff --git a/doc/hist.texinfo b/doc/hist.texinfo
index cc80efa..aa04553 100644
--- a/doc/hist.texinfo
+++ b/doc/hist.texinfo
@@ -7,20 +7,20 @@
@setchapternewpage odd
@ignore
-last change: Wed Jul 20 09:57:17 EDT 1994
+last change: Thu Mar 21 16:07:29 EST 1996
@end ignore
-@set EDITION 2.0
-@set VERSION 2.0
-@set UPDATED 20 July 1994
-@set UPDATE-MONTH July 1994
+@set EDITION 2.1
+@set VERSION 2.1
+@set UPDATED 21 March 1996
+@set UPDATE-MONTH March 1996
@ifinfo
This document describes the GNU History library, a programming tool that
provides a consistent user interface for recalling lines of previously
typed input.
-Copyright (C) 1988, 1991 Free Software Foundation, Inc.
+Copyright (C) 1988, 1991, 1993, 1995, 1996 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
@@ -45,7 +45,6 @@ by the Foundation.
@end ifinfo
@titlepage
-@sp 10
@title GNU History Library
@subtitle Edition @value{EDITION}, for @code{History Library} Version @value{VERSION}.
@subtitle @value{UPDATE-MONTH}
diff --git a/doc/history.dvi b/doc/history.dvi
index 60d7376..b73cd3c 100644
--- a/doc/history.dvi
+++ b/doc/history.dvi
Binary files differ
diff --git a/doc/history.html b/doc/history.html
new file mode 100644
index 0000000..276ed82
--- /dev/null
+++ b/doc/history.html
@@ -0,0 +1,1062 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from /usr/homes/chet/src/bash/readline-2.1/doc/hist.texinfo on 3 June 1997 -->
+
+<TITLE>GNU History Library</TITLE>
+</HEAD>
+<BODY>
+<H1>GNU History Library</H1>
+<H2>Edition 2.1, for <CODE>History Library</CODE> Version 2.1.</H2>
+<H2>March 1996</H2>
+<ADDRESS>Brian Fox, Free Software Foundation</ADDRESS>
+<ADDRESS>Chet Ramey, Case Western Reserve University</ADDRESS>
+<P>
+<P><HR><P>
+
+<P>
+This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+
+</P>
+<P>
+Published by the Free Software Foundation <BR>
+675 Massachusetts Avenue, <BR>
+Cambridge, MA 02139 USA
+
+</P>
+<P>
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+</P>
+<P>
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+</P>
+<P>
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+
+</P>
+<P>
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+
+</P>
+
+
+
+<H1><A NAME="SEC1" HREF="history_toc.html#TOC1">Using History Interactively</A></H1>
+
+<P>
+This chapter describes how to use the GNU History Library interactively,
+from a user's standpoint. It should be considered a user's guide. For
+information on using the GNU History Library in your own programs,
+see section <A HREF="history.html#SEC6">Programming with GNU History</A>.
+
+</P>
+
+
+
+<H2><A NAME="SEC2" HREF="history_toc.html#TOC2">Interactive History Expansion</A></H2>
+<P>
+<A NAME="IDX1"></A>
+
+</P>
+<P>
+The History library provides a history expansion feature that is similar
+to the history expansion provided by <CODE>csh</CODE>. This section
+describes the syntax used to manipulate the history information.
+
+</P>
+<P>
+History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+
+</P>
+<P>
+History expansion takes place in two parts. The first is to determine
+which line from the previous history should be used during substitution.
+The second is to select portions of that line for inclusion into the
+current one. The line selected from the previous history is called the
+<STRONG>event</STRONG>, and the portions of that line that are acted upon are
+called <STRONG>words</STRONG>. Various <STRONG>modifiers</STRONG> are available to manipulate
+the selected words. The line is broken into words in the same fashion
+that Bash does, so that several English (or Unix) words
+surrounded by quotes are considered as one word.
+History expansions are introduced by the appearance of the
+history expansion character, which is <SAMP>`!'</SAMP> by default.
+
+</P>
+
+
+
+<H3><A NAME="SEC3" HREF="history_toc.html#TOC3">Event Designators</A></H3>
+<P>
+<A NAME="IDX2"></A>
+
+</P>
+<P>
+An event designator is a reference to a command line entry in the
+history list.
+<A NAME="IDX3"></A>
+
+</P>
+<DL COMPACT>
+
+<DT><CODE>!</CODE>
+<DD>
+Start a history substitution, except when followed by a space, tab,
+the end of the line, <KBD>=</KBD> or <KBD>(</KBD>.
+
+<DT><CODE>!<VAR>n</VAR></CODE>
+<DD>
+Refer to command line <VAR>n</VAR>.
+
+<DT><CODE>!-<VAR>n</VAR></CODE>
+<DD>
+Refer to the command <VAR>n</VAR> lines back.
+
+<DT><CODE>!!</CODE>
+<DD>
+Refer to the previous command. This is a synonym for <SAMP>`!-1'</SAMP>.
+
+<DT><CODE>!<VAR>string</VAR></CODE>
+<DD>
+Refer to the most recent command starting with <VAR>string</VAR>.
+
+<DT><CODE>!?<VAR>string</VAR>[?]</CODE>
+<DD>
+Refer to the most recent command containing <VAR>string</VAR>. The trailing
+<SAMP>`?'</SAMP> may be omitted if the <VAR>string</VAR> is followed immediately by
+a newline.
+
+<DT><CODE>^<VAR>string1</VAR>^<VAR>string2</VAR>^</CODE>
+<DD>
+Quick Substitution. Repeat the last command, replacing <VAR>string1</VAR>
+with <VAR>string2</VAR>. Equivalent to
+<CODE>!!:s/<VAR>string1</VAR>/<VAR>string2</VAR>/</CODE>.
+
+<DT><CODE>!#</CODE>
+<DD>
+The entire command line typed so far.
+
+</DL>
+
+
+
+<H3><A NAME="SEC4" HREF="history_toc.html#TOC4">Word Designators</A></H3>
+
+<P>
+Word designators are used to select desired words from the event.
+A <SAMP>`:'</SAMP> separates the event specification from the word designator. It
+can be omitted if the word designator begins with a <SAMP>`^'</SAMP>, <SAMP>`$'</SAMP>,
+<SAMP>`*'</SAMP>, <SAMP>`-'</SAMP>, or <SAMP>`%'</SAMP>. Words are numbered from the beginning
+of the line, with the first word being denoted by 0 (zero). Words are
+inserted into the current line separated by single spaces.
+
+</P>
+<DL COMPACT>
+
+<DT><CODE>0 (zero)</CODE>
+<DD>
+The <CODE>0</CODE>th word. For many applications, this is the command word.
+
+<DT><CODE><VAR>n</VAR></CODE>
+<DD>
+The <VAR>n</VAR>th word.
+
+<DT><CODE>^</CODE>
+<DD>
+The first argument; that is, word 1.
+
+<DT><CODE>$</CODE>
+<DD>
+The last argument.
+
+<DT><CODE>%</CODE>
+<DD>
+The word matched by the most recent <SAMP>`?<VAR>string</VAR>?'</SAMP> search.
+
+<DT><CODE><VAR>x</VAR>-<VAR>y</VAR></CODE>
+<DD>
+A range of words; <SAMP>`-<VAR>y</VAR>'</SAMP> abbreviates <SAMP>`0-<VAR>y</VAR>'</SAMP>.
+
+<DT><CODE>*</CODE>
+<DD>
+All of the words, except the <CODE>0</CODE>th. This is a synonym for <SAMP>`1-$'</SAMP>.
+It is not an error to use <SAMP>`*'</SAMP> if there is just one word in the event;
+the empty string is returned in that case.
+
+<DT><CODE><VAR>x</VAR>*</CODE>
+<DD>
+Abbreviates <SAMP>`<VAR>x</VAR>-$'</SAMP>
+
+<DT><CODE><VAR>x</VAR>-</CODE>
+<DD>
+Abbreviates <SAMP>`<VAR>x</VAR>-$'</SAMP> like <SAMP>`<VAR>x</VAR>*'</SAMP>, but omits the last word.
+
+</DL>
+
+<P>
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+
+</P>
+
+
+<H3><A NAME="SEC5" HREF="history_toc.html#TOC5">Modifiers</A></H3>
+
+<P>
+After the optional word designator, you can add a sequence of one or more
+of the following modifiers, each preceded by a <SAMP>`:'</SAMP>.
+
+</P>
+<DL COMPACT>
+
+<DT><CODE>h</CODE>
+<DD>
+Remove a trailing pathname component, leaving only the head.
+
+<DT><CODE>t</CODE>
+<DD>
+Remove all leading pathname components, leaving the tail.
+
+<DT><CODE>r</CODE>
+<DD>
+Remove a trailing suffix of the form <SAMP>`.<VAR>suffix</VAR>'</SAMP>, leaving
+the basename.
+
+<DT><CODE>e</CODE>
+<DD>
+Remove all but the trailing suffix.
+
+<DT><CODE>p</CODE>
+<DD>
+Print the new command but do not execute it.
+
+<DT><CODE>s/<VAR>old</VAR>/<VAR>new</VAR>/</CODE>
+<DD>
+Substitute <VAR>new</VAR> for the first occurrence of <VAR>old</VAR> in the
+event line. Any delimiter may be used in place of <SAMP>`/'</SAMP>.
+The delimiter may be quoted in <VAR>old</VAR> and <VAR>new</VAR>
+with a single backslash. If <SAMP>`&#38;'</SAMP> appears in <VAR>new</VAR>,
+it is replaced by <VAR>old</VAR>. A single backslash will quote
+the <SAMP>`&#38;'</SAMP>. The final delimiter is optional if it is the last
+character on the input line.
+
+<DT><CODE>&#38;</CODE>
+<DD>
+Repeat the previous substitution.
+
+<DT><CODE>g</CODE>
+<DD>
+Cause changes to be applied over the entire event line. Used in
+conjunction with <SAMP>`s'</SAMP>, as in <CODE>gs/<VAR>old</VAR>/<VAR>new</VAR>/</CODE>,
+or with <SAMP>`&#38;'</SAMP>.
+
+</DL>
+
+
+
+<H1><A NAME="SEC6" HREF="history_toc.html#TOC6">Programming with GNU History</A></H1>
+
+<P>
+This chapter describes how to interface programs that you write
+with the GNU History Library.
+It should be considered a technical guide.
+For information on the interactive use of GNU History, see section <A HREF="history.html#SEC1">Using History Interactively</A>.
+
+</P>
+
+
+
+<H2><A NAME="SEC7" HREF="history_toc.html#TOC7">Introduction to History</A></H2>
+
+<P>
+Many programs read input from the user a line at a time. The GNU History
+library is able to keep track of those lines, associate arbitrary data with
+each line, and utilize information from previous lines in composing new
+ones.
+
+</P>
+<P>
+The programmer using the History library has available functions
+for remembering lines on a history list, associating arbitrary data
+with a line, removing lines from the list, searching through the list
+for a line containing an arbitrary text string, and referencing any line
+in the list directly. In addition, a history <STRONG>expansion</STRONG> function
+is available which provides for a consistent user interface across
+different programs.
+
+</P>
+<P>
+The user using programs written with the History library has the
+benefit of a consistent user interface with a set of well-known
+commands for manipulating the text of previous lines and using that text
+in new commands. The basic history manipulation commands are similar to
+the history substitution provided by <CODE>csh</CODE>.
+
+</P>
+<P>
+If the programmer desires, he can use the Readline library, which
+includes some history manipulation by default, and has the added
+advantage of command line editing.
+
+</P>
+
+
+<H2><A NAME="SEC8" HREF="history_toc.html#TOC8">History Storage</A></H2>
+
+<P>
+The history list is an array of history entries. A history entry is
+declared as follows:
+
+</P>
+
+<PRE>
+typedef struct _hist_entry {
+ char *line;
+ char *data;
+} HIST_ENTRY;
+</PRE>
+
+<P>
+The history list itself might therefore be declared as
+
+</P>
+
+<PRE>
+HIST_ENTRY **the_history_list;
+</PRE>
+
+<P>
+The state of the History library is encapsulated into a single structure:
+
+</P>
+
+<PRE>
+/* A structure used to pass the current state of the history stuff around. */
+typedef struct _hist_state {
+ HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+ int offset; /* The location pointer within this array. */
+ int length; /* Number of elements within this array. */
+ int size; /* Number of slots allocated to this array. */
+ int flags;
+} HISTORY_STATE;
+</PRE>
+
+<P>
+If the flags member includes <CODE>HS_STIFLED</CODE>, the history has been
+stifled.
+
+</P>
+
+
+<H2><A NAME="SEC9" HREF="history_toc.html#TOC9">History Functions</A></H2>
+
+<P>
+This section describes the calling sequence for the various functions
+present in GNU History.
+
+</P>
+
+
+
+<H3><A NAME="SEC10" HREF="history_toc.html#TOC10">Initializing History and State Management</A></H3>
+
+<P>
+This section describes functions used to initialize and manage
+the state of the History library when you want to use the history
+functions in your program.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>using_history</B> <I>()</I>
+<DD><A NAME="IDX4"></A>
+Begin a session in which the history functions might be used. This
+initializes the interactive variables.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> HISTORY_STATE * <B>history_get_history_state</B> <I>()</I>
+<DD><A NAME="IDX5"></A>
+Return a structure describing the current state of the input history.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>history_set_history_state</B> <I>(HISTORY_STATE *state)</I>
+<DD><A NAME="IDX6"></A>
+Set the state of the history list according to <VAR>state</VAR>.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC11" HREF="history_toc.html#TOC11">History List Management</A></H3>
+
+<P>
+These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>add_history</B> <I>(char *string)</I>
+<DD><A NAME="IDX7"></A>
+Place <VAR>string</VAR> at the end of the history list. The associated data
+field (if any) is set to <CODE>NULL</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>remove_history</B> <I>(int which)</I>
+<DD><A NAME="IDX8"></A>
+Remove history entry at offset <VAR>which</VAR> from the history. The
+removed element is returned so you can free the line, data,
+and containing structure.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>replace_history_entry</B> <I>(int which, char *line, char *data)</I>
+<DD><A NAME="IDX9"></A>
+Make the history entry at offset <VAR>which</VAR> have <VAR>line</VAR> and <VAR>data</VAR>.
+This returns the old entry so you can dispose of the data. In the case
+of an invalid <VAR>which</VAR>, a <CODE>NULL</CODE> pointer is returned.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>clear_history</B> <I>()</I>
+<DD><A NAME="IDX10"></A>
+Clear the history list by deleting all the entries.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>stifle_history</B> <I>(int max)</I>
+<DD><A NAME="IDX11"></A>
+Stifle the history list, remembering only the last <VAR>max</VAR> entries.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>unstifle_history</B> <I>()</I>
+<DD><A NAME="IDX12"></A>
+Stop stifling the history. This returns the previous amount the
+history was stifled. The value is positive if the history was
+stifled, negative if it wasn't.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>history_is_stifled</B> <I>()</I>
+<DD><A NAME="IDX13"></A>
+Returns non-zero if the history is stifled, zero if it is not.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC12" HREF="history_toc.html#TOC12">Information About the History List</A></H3>
+
+<P>
+These functions return information about the entire history list or
+individual list entries.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY ** <B>history_list</B> <I>()</I>
+<DD><A NAME="IDX14"></A>
+Return a <CODE>NULL</CODE> terminated array of <CODE>HIST_ENTRY</CODE> which is the
+current input history. Element 0 of this list is the beginning of time.
+If there is no history, return <CODE>NULL</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>where_history</B> <I>()</I>
+<DD><A NAME="IDX15"></A>
+Returns the offset of the current history element.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>current_history</B> <I>()</I>
+<DD><A NAME="IDX16"></A>
+Return the history entry at the current position, as determined by
+<CODE>where_history ()</CODE>. If there is no entry there, return a <CODE>NULL</CODE>
+pointer.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>history_get</B> <I>(int offset)</I>
+<DD><A NAME="IDX17"></A>
+Return the history entry at position <VAR>offset</VAR>, starting from
+<CODE>history_base</CODE>. If there is no entry there, or if <VAR>offset</VAR>
+is greater than the history length, return a <CODE>NULL</CODE> pointer.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>history_total_bytes</B> <I>()</I>
+<DD><A NAME="IDX18"></A>
+Return the number of bytes that the primary history entries are using.
+This function returns the sum of the lengths of all the lines in the
+history.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC13" HREF="history_toc.html#TOC13">Moving Around the History List</A></H3>
+
+<P>
+These functions allow the current index into the history list to be
+set or changed.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>history_set_pos</B> <I>(int pos)</I>
+<DD><A NAME="IDX19"></A>
+Set the position in the history list to <VAR>pos</VAR>, an absolute index
+into the list.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>previous_history</B> <I>()</I>
+<DD><A NAME="IDX20"></A>
+Back up the current history offset to the previous history entry, and
+return a pointer to that entry. If there is no previous entry, return
+a <CODE>NULL</CODE> pointer.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>next_history</B> <I>()</I>
+<DD><A NAME="IDX21"></A>
+Move the current history offset forward to the next history entry, and
+return the a pointer to that entry. If there is no next entry, return
+a <CODE>NULL</CODE> pointer.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC14" HREF="history_toc.html#TOC14">Searching the History List</A></H3>
+<P>
+<A NAME="IDX22"></A>
+
+</P>
+<P>
+These functions allow searching of the history list for entries containing
+a specific string. Searching may be performed both forward and backward
+from the current history position. The search may be <STRONG>anchored</STRONG>,
+meaning that the string must match at the beginning of the history entry.
+<A NAME="IDX23"></A>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>history_search</B> <I>(char *string, int direction)</I>
+<DD><A NAME="IDX24"></A>
+Search the history for <VAR>string</VAR>, starting at the current history
+offset. If <VAR>direction</VAR> &#60; 0, then the search is through previous entries,
+else through subsequent. If <VAR>string</VAR> is found, then
+the current history index is set to that history entry, and the value
+returned is the offset in the line of the entry where
+<VAR>string</VAR> was found. Otherwise, nothing is changed, and a -1 is
+returned.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>history_search_prefix</B> <I>(char *string, int direction)</I>
+<DD><A NAME="IDX25"></A>
+Search the history for <VAR>string</VAR>, starting at the current history
+offset. The search is anchored: matching lines must begin with
+<VAR>string</VAR>. If <VAR>direction</VAR> &#60; 0, then the search is through previous
+entries, else through subsequent. If <VAR>string</VAR> is found, then the
+current history index is set to that entry, and the return value is 0.
+Otherwise, nothing is changed, and a -1 is returned.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>history_search_pos</B> <I>(char *string, int direction, int pos)</I>
+<DD><A NAME="IDX26"></A>
+Search for <VAR>string</VAR> in the history list, starting at <VAR>pos</VAR>, an
+absolute index into the list. If <VAR>direction</VAR> is negative, the search
+proceeds backward from <VAR>pos</VAR>, otherwise forward. Returns the absolute
+index of the history element where <VAR>string</VAR> was found, or -1 otherwise.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC15" HREF="history_toc.html#TOC15">Managing the History File</A></H3>
+
+<P>
+The History library can read the history from and write it to a file.
+This section documents the functions for managing a history file.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>read_history</B> <I>(char *filename)</I>
+<DD><A NAME="IDX27"></A>
+Add the contents of <VAR>filename</VAR> to the history list, a line at a
+time. If <VAR>filename</VAR> is <CODE>NULL</CODE>, then read from
+<TT>`~/.history'</TT>. Returns 0 if successful, or errno if not.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>read_history_range</B> <I>(char *filename, int from, int to)</I>
+<DD><A NAME="IDX28"></A>
+Read a range of lines from <VAR>filename</VAR>, adding them to the history list.
+Start reading at line <VAR>from</VAR> and end at <VAR>to</VAR>. If
+<VAR>from</VAR> is zero, start at the beginning. If <VAR>to</VAR> is less than
+<VAR>from</VAR>, then read until the end of the file. If <VAR>filename</VAR> is
+<CODE>NULL</CODE>, then read from <TT>`~/.history'</TT>. Returns 0 if successful,
+or <CODE>errno</CODE> if not.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>write_history</B> <I>(char *filename)</I>
+<DD><A NAME="IDX29"></A>
+Write the current history to <VAR>filename</VAR>, overwriting <VAR>filename</VAR>
+if necessary. If <VAR>filename</VAR> is
+<CODE>NULL</CODE>, then write the history list to <TT>`~/.history'</TT>. Values
+returned are as in <CODE>read_history ()</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>append_history</B> <I>(int nelements, char *filename)</I>
+<DD><A NAME="IDX30"></A>
+Append the last <VAR>nelements</VAR> of the history list to <VAR>filename</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>history_truncate_file</B> <I>(char *filename, int nlines)</I>
+<DD><A NAME="IDX31"></A>
+Truncate the history file <VAR>filename</VAR>, leaving only the last
+<VAR>nlines</VAR> lines.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC16" HREF="history_toc.html#TOC16">History Expansion</A></H3>
+
+<P>
+These functions implement <CODE>csh</CODE>-like history expansion.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>history_expand</B> <I>(char *string, char **output)</I>
+<DD><A NAME="IDX32"></A>
+Expand <VAR>string</VAR>, placing the result into <VAR>output</VAR>, a pointer
+to a string (see section <A HREF="history.html#SEC2">Interactive History Expansion</A>). Returns:
+<DL COMPACT>
+
+<DT><CODE>0</CODE>
+<DD>
+If no expansions took place (or, if the only change in
+the text was the de-slashifying of the history expansion
+character);
+<DT><CODE>1</CODE>
+<DD>
+if expansions did take place;
+<DT><CODE>-1</CODE>
+<DD>
+if there was an error in expansion;
+<DT><CODE>2</CODE>
+<DD>
+if the returned line should only be displayed, but not executed,
+as with the <CODE>:p</CODE> modifier (see section <A HREF="history.html#SEC5">Modifiers</A>).
+</DL>
+
+<P>
+If an error ocurred in expansion, then <VAR>output</VAR> contains a descriptive
+error message.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char * <B>history_arg_extract</B> <I>(int first, int last, char *string)</I>
+<DD><A NAME="IDX33"></A>
+Extract a string segment consisting of the <VAR>first</VAR> through <VAR>last</VAR>
+arguments present in <VAR>string</VAR>. Arguments are broken up as in Bash.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char * <B>get_history_event</B> <I>(char *string, int *cindex, int qchar)</I>
+<DD><A NAME="IDX34"></A>
+Returns the text of the history event beginning at <VAR>string</VAR> +
+<VAR>*cindex</VAR>. <VAR>*cindex</VAR> is modified to point to after the event
+specifier. At function entry, <VAR>cindex</VAR> points to the index into
+<VAR>string</VAR> where the history event specification begins. <VAR>qchar</VAR>
+is a character that is allowed to end the event specification in addition
+to the "normal" terminating characters.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char ** <B>history_tokenize</B> <I>(char *string)</I>
+<DD><A NAME="IDX35"></A>
+Return an array of tokens parsed out of <VAR>string</VAR>, much as the
+shell might. The tokens are split on white space and on the
+characters <CODE>()&#60;&#62;;&#38;|$</CODE>, and shell quoting conventions are
+obeyed.
+</DL>
+
+</P>
+
+
+<H2><A NAME="SEC17" HREF="history_toc.html#TOC17">History Variables</A></H2>
+
+<P>
+This section describes the externally visible variables exported by
+the GNU History Library.
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>history_base</B>
+<DD><A NAME="IDX36"></A>
+The logical offset of the first entry in the history list.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>history_length</B>
+<DD><A NAME="IDX37"></A>
+The number of entries currently stored in the history list.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>max_input_history</B>
+<DD><A NAME="IDX38"></A>
+The maximum number of history entries. This must be changed using
+<CODE>stifle_history ()</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char <B>history_expansion_char</B>
+<DD><A NAME="IDX39"></A>
+The character that starts a history event. The default is <SAMP>`!'</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char <B>history_subst_char</B>
+<DD><A NAME="IDX40"></A>
+The character that invokes word substitution if found at the start of
+a line. The default is <SAMP>`^'</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char <B>history_comment_char</B>
+<DD><A NAME="IDX41"></A>
+During tokenization, if this character is seen as the first character
+of a word, then it and all subsequent characters up to a newline are
+ignored, suppressing history expansion for the remainder of the line.
+This is disabled by default.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>history_no_expand_chars</B>
+<DD><A NAME="IDX42"></A>
+The list of characters which inhibit history expansion if found immediately
+following <VAR>history_expansion_char</VAR>. The default is whitespace and
+<SAMP>`='</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>history_search_delimiter_chars</B>
+<DD><A NAME="IDX43"></A>
+The list of additional characters which can delimit a history search
+string, in addition to whitespace, <SAMP>`:'</SAMP> and <SAMP>`?'</SAMP> in the case of
+a substring search. The default is empty.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>history_quotes_inhibit_expansion</B>
+<DD><A NAME="IDX44"></A>
+If non-zero, single-quoted words are not scanned for the history expansion
+character. The default value is 0.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>history_inhibit_expansion_function</B>
+<DD><A NAME="IDX45"></A>
+This should be set to the address of a function that takes two arguments:
+a <CODE>char *</CODE> (<VAR>string</VAR>) and an integer index into that string (<VAR>i</VAR>).
+It should return a non-zero value if the history expansion starting at
+<VAR>string[i]</VAR> should not be performed; zero if the expansion should
+be done.
+It is intended for use by applications like Bash that use the history
+expansion character for additional purposes.
+By default, this variable is set to NULL.
+</DL>
+
+</P>
+
+
+<H2><A NAME="SEC18" HREF="history_toc.html#TOC18">History Programming Example</A></H2>
+
+<P>
+The following program demonstrates simple use of the GNU History Library.
+
+</P>
+
+<PRE>
+main ()
+{
+ char line[1024], *t;
+ int len, done = 0;
+
+ line[0] = 0;
+
+ using_history ();
+ while (!done)
+ {
+ printf ("history$ ");
+ fflush (stdout);
+ t = fgets (line, sizeof (line) - 1, stdin);
+ if (t &#38;&#38; *t)
+ {
+ len = strlen (t);
+ if (t[len - 1] == '\n')
+ t[len - 1] = '\0';
+ }
+
+ if (!t)
+ strcpy (line, "quit");
+
+ if (line[0])
+ {
+ char *expansion;
+ int result;
+
+ result = history_expand (line, &#38;expansion);
+ if (result)
+ fprintf (stderr, "%s\n", expansion);
+
+ if (result &#60; 0 || result == 2)
+ {
+ free (expansion);
+ continue;
+ }
+
+ add_history (expansion);
+ strncpy (line, expansion, sizeof (line) - 1);
+ free (expansion);
+ }
+
+ if (strcmp (line, "quit") == 0)
+ done = 1;
+ else if (strcmp (line, "save") == 0)
+ write_history ("history_file");
+ else if (strcmp (line, "read") == 0)
+ read_history ("history_file");
+ else if (strcmp (line, "list") == 0)
+ {
+ register HIST_ENTRY **the_list;
+ register int i;
+
+ the_list = history_list ();
+ if (the_list)
+ for (i = 0; the_list[i]; i++)
+ printf ("%d: %s\n", i + history_base, the_list[i]-&#62;line);
+ }
+ else if (strncmp (line, "delete", 6) == 0)
+ {
+ int which;
+ if ((sscanf (line + 6, "%d", &#38;which)) == 1)
+ {
+ HIST_ENTRY *entry = remove_history (which);
+ if (!entry)
+ fprintf (stderr, "No such entry %d\n", which);
+ else
+ {
+ free (entry-&#62;line);
+ free (entry);
+ }
+ }
+ else
+ {
+ fprintf (stderr, "non-numeric arg given to `delete'\n");
+ }
+ }
+ }
+}
+</PRE>
+
+
+
+<H1><A NAME="SEC19" HREF="history_toc.html#TOC19">Concept Index</A></H1>
+<P>
+<H2>a</H2>
+<DIR>
+<LI><A HREF="history.html#IDX23">anchored search</A>
+</DIR>
+<H2>e</H2>
+<DIR>
+<LI><A HREF="history.html#IDX2">event designators</A>
+</DIR>
+<H2>h</H2>
+<DIR>
+<LI><A HREF="history.html#IDX3">history events</A>
+<LI><A HREF="history.html#IDX1">history expansion</A>
+<LI><A HREF="history.html#IDX22">History Searching</A>
+</DIR>
+
+</P>
+
+
+<H1><A NAME="SEC20" HREF="history_toc.html#TOC20">Function and Variable Index</A></H1>
+<P>
+<H2>a</H2>
+<DIR>
+<LI><A HREF="history.html#IDX7">add_history</A>
+<LI><A HREF="history.html#IDX30">append_history</A>
+</DIR>
+<H2>c</H2>
+<DIR>
+<LI><A HREF="history.html#IDX10">clear_history</A>
+<LI><A HREF="history.html#IDX16">current_history</A>
+</DIR>
+<H2>g</H2>
+<DIR>
+<LI><A HREF="history.html#IDX34">get_history_event</A>
+</DIR>
+<H2>h</H2>
+<DIR>
+<LI><A HREF="history.html#IDX33">history_arg_extract</A>
+<LI><A HREF="history.html#IDX36">history_base</A>
+<LI><A HREF="history.html#IDX41">history_comment_char</A>
+<LI><A HREF="history.html#IDX32">history_expand</A>
+<LI><A HREF="history.html#IDX39">history_expansion_char</A>
+<LI><A HREF="history.html#IDX17">history_get</A>
+<LI><A HREF="history.html#IDX5">history_get_history_state</A>
+<LI><A HREF="history.html#IDX45">history_inhibit_expansion_function</A>
+<LI><A HREF="history.html#IDX13">history_is_stifled</A>
+<LI><A HREF="history.html#IDX37">history_length</A>
+<LI><A HREF="history.html#IDX14">history_list</A>
+<LI><A HREF="history.html#IDX42">history_no_expand_chars</A>
+<LI><A HREF="history.html#IDX44">history_quotes_inhibit_expansion</A>
+<LI><A HREF="history.html#IDX24">history_search</A>
+<LI><A HREF="history.html#IDX43">history_search_delimiter_chars</A>
+<LI><A HREF="history.html#IDX26">history_search_pos</A>
+<LI><A HREF="history.html#IDX25">history_search_prefix</A>
+<LI><A HREF="history.html#IDX6">history_set_history_state</A>
+<LI><A HREF="history.html#IDX19">history_set_pos</A>
+<LI><A HREF="history.html#IDX40">history_subst_char</A>
+<LI><A HREF="history.html#IDX35">history_tokenize</A>
+<LI><A HREF="history.html#IDX18">history_total_bytes</A>
+<LI><A HREF="history.html#IDX31">history_truncate_file</A>
+</DIR>
+<H2>m</H2>
+<DIR>
+<LI><A HREF="history.html#IDX38">max_input_history</A>
+</DIR>
+<H2>n</H2>
+<DIR>
+<LI><A HREF="history.html#IDX21">next_history</A>
+</DIR>
+<H2>p</H2>
+<DIR>
+<LI><A HREF="history.html#IDX20">previous_history</A>
+</DIR>
+<H2>r</H2>
+<DIR>
+<LI><A HREF="history.html#IDX27">read_history</A>
+<LI><A HREF="history.html#IDX28">read_history_range</A>
+<LI><A HREF="history.html#IDX8">remove_history</A>
+<LI><A HREF="history.html#IDX9">replace_history_entry</A>
+</DIR>
+<H2>s</H2>
+<DIR>
+<LI><A HREF="history.html#IDX11">stifle_history</A>
+</DIR>
+<H2>u</H2>
+<DIR>
+<LI><A HREF="history.html#IDX12">unstifle_history</A>
+<LI><A HREF="history.html#IDX4">using_history</A>
+</DIR>
+<H2>w</H2>
+<DIR>
+<LI><A HREF="history.html#IDX15">where_history</A>
+<LI><A HREF="history.html#IDX29">write_history</A>
+</DIR>
+
+</P>
+<P><HR><P>
+This document was generated on 3 June 1997 using the
+<A HREF="http://wwwcn.cern.ch/dci/texi2html/">texi2html</A>
+translator version 1.51.</P>
+</BODY>
+</HTML>
diff --git a/doc/history.info b/doc/history.info
index 6df0bd9..9266a5d 100644
--- a/doc/history.info
+++ b/doc/history.info
@@ -1,11 +1,12 @@
This is Info file history.info, produced by Makeinfo-1.55 from the
-input file hist.texinfo.
+input file /usr/homes/chet/src/bash/readline-2.1/doc/hist.texinfo.
This document describes the GNU History library, a programming tool
that provides a consistent user interface for recalling lines of
previously typed input.
- Copyright (C) 1988, 1991 Free Software Foundation, Inc.
+ Copyright (C) 1988, 1991, 1993, 1995, 1996 Free Software Foundation,
+Inc.
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice pare
@@ -57,21 +58,29 @@ own programs, *note Programming with GNU History::..

File: history.info, Node: History Interaction, Up: Using History Interactively
-History Interaction
-===================
+Interactive History Expansion
+=============================
The History library provides a history expansion feature that is
-similar to the history expansion provided by `csh'. The following text
+similar to the history expansion provided by `csh'. This section
describes the syntax used to manipulate the history information.
+ History expansions introduce words from the history list into the
+input stream, making it easy to repeat commands, insert the arguments
+to a previous command into the current input line, or fix errors in
+previous commands quickly.
+
History expansion takes place in two parts. The first is to
determine which line from the previous history should be used during
substitution. The second is to select portions of that line for
inclusion into the current one. The line selected from the previous
history is called the "event", and the portions of that line that are
-acted upon are called "words". The line is broken into words in the
+acted upon are called "words". Various "modifiers" are available to
+manipulate the selected words. The line is broken into words in the
same fashion that Bash does, so that several English (or Unix) words
-surrounded by quotes are considered as one word.
+surrounded by quotes are considered as one word. History expansions
+are introduced by the appearance of the history expansion character,
+which is `!' by default.
* Menu:
@@ -92,67 +101,74 @@ history list.
Start a history substitution, except when followed by a space, tab,
the end of the line, = or (.
-`!!'
- Refer to the previous command. This is a synonym for `!-1'.
-
-`!n'
+`!N'
Refer to command line N.
-`!-n'
+`!-N'
Refer to the command N lines back.
-`!string'
+`!!'
+ Refer to the previous command. This is a synonym for `!-1'.
+
+`!STRING'
Refer to the most recent command starting with STRING.
-`!?string'[`?']
- Refer to the most recent command containing STRING.
+`!?STRING[?]'
+ Refer to the most recent command containing STRING. The trailing
+ `?' may be omitted if the STRING is followed immediately by a
+ newline.
+
+`^STRING1^STRING2^'
+ Quick Substitution. Repeat the last command, replacing STRING1
+ with STRING2. Equivalent to `!!:s/STRING1/STRING2/'.
`!#'
The entire command line typed so far.
-`^string1^string2^'
- Quick Substitution. Repeat the last command, replacing STRING1
- with STRING2. Equivalent to `!!:s/string1/string2/'.
-

File: history.info, Node: Word Designators, Next: Modifiers, Prev: Event Designators, Up: History Interaction
Word Designators
----------------
- A : separates the event specification from the word designator. It
-can be omitted if the word designator begins with a ^, $, * or %.
-Words are numbered from the beginning of the line, with the first word
-being denoted by a 0 (zero).
+ Word designators are used to select desired words from the event. A
+`:' separates the event specification from the word designator. It can
+be omitted if the word designator begins with a `^', `$', `*', `-', or
+`%'. Words are numbered from the beginning of the line, with the first
+word being denoted by 0 (zero). Words are inserted into the current
+line separated by single spaces.
`0 (zero)'
The `0'th word. For many applications, this is the command word.
-`n'
+`N'
The Nth word.
`^'
- The first argument; that is, word 1.
+ The first argument; that is, word 1.
`$'
The last argument.
`%'
- The word matched by the most recent `?string?' search.
+ The word matched by the most recent `?STRING?' search.
-`x-y'
+`X-Y'
A range of words; `-Y' abbreviates `0-Y'.
`*'
All of the words, except the `0'th. This is a synonym for `1-$'.
- It is not an error to use * if there is just one word in the event;
- the empty string is returned in that case.
+ It is not an error to use `*' if there is just one word in the
+ event; the empty string is returned in that case.
-`x*'
- Abbreviates `x-$'
+`X*'
+ Abbreviates `X-$'
-`x-'
- Abbreviates `x-$' like `x*', but omits the last word.
+`X-'
+ Abbreviates `X-$' like `X*', but omits the last word.
+
+ If a word designator is supplied without an event specification, the
+previous command is used as the event.

File: history.info, Node: Modifiers, Prev: Word Designators, Up: History Interaction
@@ -161,38 +177,38 @@ Modifiers
---------
After the optional word designator, you can add a sequence of one or
-more of the following modifiers, each preceded by a :.
+more of the following modifiers, each preceded by a `:'.
`h'
Remove a trailing pathname component, leaving only the head.
+`t'
+ Remove all leading pathname components, leaving the tail.
+
`r'
- Remove a trailing suffix of the form `.'SUFFIX, leaving the
+ Remove a trailing suffix of the form `.SUFFIX', leaving the
basename.
`e'
Remove all but the trailing suffix.
-`t'
- Remove all leading pathname components, leaving the tail.
-
`p'
Print the new command but do not execute it.
-`s/old/new/'
+`s/OLD/NEW/'
Substitute NEW for the first occurrence of OLD in the event line.
- Any delimiter may be used in place of /. The delimiter may be
- quoted in OLD and NEW with a single backslash. If & appears in
- NEW, it is replaced by OLD. A single backslash will quote the &.
- The final delimiter is optional if it is the last character on the
- input line.
+ Any delimiter may be used in place of `/'. The delimiter may be
+ quoted in OLD and NEW with a single backslash. If `&' appears in
+ NEW, it is replaced by OLD. A single backslash will quote the
+ `&'. The final delimiter is optional if it is the last character
+ on the input line.
`&'
Repeat the previous substitution.
`g'
Cause changes to be applied over the entire event line. Used in
- conjunction with `s', as in `gs/old/new/', or with `&'.
+ conjunction with `s', as in `gs/OLD/NEW/', or with `&'.

File: history.info, Node: Programming with GNU History, Next: Concept Index, Prev: Using History Interactively, Up: Top
@@ -347,6 +363,9 @@ parameters managing the list itself.
returns the old entry so you can dispose of the data. In the case
of an invalid WHICH, a `NULL' pointer is returned.
+ - Function: void clear_history ()
+ Clear the history list by deleting all the entries.
+
- Function: void stifle_history (int max)
Stifle the history list, remembering only the last MAX entries.
@@ -567,6 +586,24 @@ the GNU History Library.
immediately following HISTORY_EXPANSION_CHAR. The default is
whitespace and `='.
+ - Variable: char * history_search_delimiter_chars
+ The list of additional characters which can delimit a history
+ search string, in addition to whitespace, `:' and `?' in the case
+ of a substring search. The default is empty.
+
+ - Variable: int history_quotes_inhibit_expansion
+ If non-zero, single-quoted words are not scanned for the history
+ expansion character. The default value is 0.
+
+ - Variable: Function * history_inhibit_expansion_function
+ This should be set to the address of a function that takes two
+ arguments: a `char *' (STRING) and an integer index into that
+ string (I). It should return a non-zero value if the history
+ expansion starting at STRING[I] should not be performed; zero if
+ the expansion should be done. It is intended for use by
+ applications like Bash that use the history expansion character
+ for additional purposes. By default, this variable is set to NULL.
+

File: history.info, Node: History Programming Example, Prev: History Variables, Up: Programming with GNU History
@@ -667,8 +704,8 @@ Concept Index
* anchored search: Searching the History List.
* event designators: Event Designators.
-* expansion: History Interaction.
* history events: Event Designators.
+* history expansion: History Interaction.
* History Searching: Searching the History List.

@@ -681,6 +718,7 @@ Function and Variable Index
* add_history: History List Management.
* append_history: Managing the History File.
+* clear_history: History List Management.
* current_history: Information About the History List.
* get_history_event: History Expansion.
* history_arg_extract: History Expansion.
@@ -690,11 +728,14 @@ Function and Variable Index
* history_expansion_char: History Variables.
* history_get: Information About the History List.
* history_get_history_state: Initializing History and State Management.
+* history_inhibit_expansion_function: History Variables.
* history_is_stifled: History List Management.
* history_length: History Variables.
* history_list: Information About the History List.
* history_no_expand_chars: History Variables.
+* history_quotes_inhibit_expansion: History Variables.
* history_search: Searching the History List.
+* history_search_delimiter_chars: History Variables.
* history_search_pos: Searching the History List.
* history_search_prefix: Searching the History List.
* history_set_history_state: Initializing History and State Management.
@@ -719,26 +760,26 @@ Function and Variable Index

Tag Table:
-Node: Top975
-Node: Using History Interactively1569
-Node: History Interaction2077
-Node: Event Designators3122
-Node: Word Designators3952
-Node: Modifiers4936
-Node: Programming with GNU History6065
-Node: Introduction to History6791
-Node: History Storage8112
-Node: History Functions9205
-Node: Initializing History and State Management10176
-Node: History List Management10968
-Node: Information About the History List12396
-Node: Moving Around the History List13702
-Node: Searching the History List14587
-Node: Managing the History File16419
-Node: History Expansion17925
-Node: History Variables19769
-Node: History Programming Example21138
-Node: Concept Index23742
-Node: Function and Variable Index24223
+Node: Top1035
+Node: Using History Interactively1629
+Node: History Interaction2137
+Node: Event Designators3614
+Node: Word Designators4537
+Node: Modifiers5786
+Node: Programming with GNU History6924
+Node: Introduction to History7650
+Node: History Storage8971
+Node: History Functions10064
+Node: Initializing History and State Management11035
+Node: History List Management11827
+Node: Information About the History List13348
+Node: Moving Around the History List14654
+Node: Searching the History List15539
+Node: Managing the History File17371
+Node: History Expansion18877
+Node: History Variables20721
+Node: History Programming Example23039
+Node: Concept Index25643
+Node: Function and Variable Index26124

End Tag Table
diff --git a/doc/history.ps b/doc/history.ps
index 839598f..1866d92 100644
--- a/doc/history.ps
+++ b/doc/history.ps
@@ -1,2037 +1,1558 @@
-%!PS-Adobe-2.0
-%%Creator: dvipsk 5.490s Copyright 1986, 1992 Radical Eye Software
-%%Title: history.dvi
-%%Pages: 22 1
-%%BoundingBox: 0 0 612 792
-%%EndComments
+%!PS (but not EPSF; comments have been disabled)
%DVIPSCommandLine: dvips -D 300 -o history.ps history.dvi
-%%BeginProcSet: tex.pro
-%!
-/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}
-B /TR{translate}N /isls false N /vsize 11 72 mul N /@rigin{isls{[0 -1 1 0 0 0]
-concat}if 72 Resolution div 72 VResolution div neg scale isls{Resolution hsize
--72 div mul 0 TR}if Resolution VResolution vsize -72 div 1 add mul TR matrix
-currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put
-setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed
-true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N
-/IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix
-fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{
-CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn
-put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0
-0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data
-dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128
-ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127
-sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type
-/stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N
-/cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get
-S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height
-sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0
--1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{/cc X dup
-type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1
-ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}
-B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
-0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add
-.99 lt{/FV}{/RV}ifelse load def pop}N /eop{SI restore showpage userdict
-/eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook}
-if /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE
-S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div
-/hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley
-0 N /v{/ruley X /rulex X V}B /V{}B /RV statusdict begin /product where{pop
-product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval
-(NeXT)eq or}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale
-rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex
-ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /FV{gsave
-transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
-rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail{dup
-/delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}B /d{-3 M}
-B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B /w{0
-rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w}B /r{p 2 w}
-B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B
-/eos{SS restore}B end
-%%EndProcSet
-TeXDict begin 40258431 52099146 1000 300 300 @start /Fa 1 59
-df<70F8F8F87005057C840D>58 D E /Fb 1 59 df<78FCFCFCFC7806067B8510>58
-D E /Fc 24 123 df<1FC0007FF000707800201800001C00001C0007FC001FFC003C1C00701C00
-E01C00E01C00E01C00707C003FFF800F8F8011107E8F14>97 D<FC0000FC00001C00001C00001C
-00001C00001C00001CF8001DFE001F07001E03001C03801C01C01C01C01C01C01C01C01C01C01C
-01C01C03801E03001F0E001DFC000CF8001217809614>I<03F80FFC1C1C380870006000E000E0
-00E000E00060007000380E1C1E0FFC03F00F107E8F14>I<007E00007E00000E00000E00000E00
-000E00000E0007CE000FFE001C3E00301E00700E00E00E00E00E00E00E00E00E00E00E00E00E00
-700E00301E00383E001FEFC007CFC012177F9614>I<07E00FF01C38301C700CE00EE00EFFFEFF
-FEE00060007000380E1C1E0FFC03F00F107E8F14>I<007C00FE01CE03840380038003807FFEFF
-FE0380038003800380038003800380038003800380038003807FFC7FFC0F177F9614>I<07CF00
-1FFF80383B80301800701C00701C00701C003018003838003FF00037C0007000007000003FF800
-1FFC003FFE00700F00E00380E00380E00380E003807007003C1E001FFC0007F00011197F8F14>
-I<FC0000FC00001C00001C00001C00001C00001C00001C78001DFE001F86001E07001C07001C07
-001C07001C07001C07001C07001C07001C07001C07001C0700FF8FE0FF8FE01317809614>I<03
-0007800780030000000000000000007F807F800380038003800380038003800380038003800380
-03800380FFFCFFFC0E187D9714>I<FC0000FC00001C00001C00001C00001C00001C00001DFF80
-1DFF801C3C001C78001CF0001DE0001FC0001FC0001FE0001EF0001C70001C38001C38001C1C00
-FE3F80FE3F8011177F9614>107 D<FF80FF800380038003800380038003800380038003800380
-038003800380038003800380038003800380FFFEFFFE0F177E9614>I<FB8E00FFDF003CF3803C
-F38038E38038E38038E38038E38038E38038E38038E38038E38038E38038E380FEFBE0FE79E013
-10808F14>I<FC7800FDFE001F86001E07001C07001C07001C07001C07001C07001C07001C0700
-1C07001C07001C0700FF8FE0FF8FE01310808F14>I<07C01FF03C78701C701CE00EE00EE00EE0
-0EE00EE00E701C783C3C781FF007C00F107E8F14>I<FCF800FDFE001F07001E03001C03801C01
-C01C01C01C01C01C01C01C01C01C01C01C03801E03001F0E001DFC001CF8001C00001C00001C00
-001C00001C00001C0000FF8000FF80001218808F14>I<FE1F00FE7F800EE3800F81000F00000F
-00000E00000E00000E00000E00000E00000E00000E00000E0000FFF000FFF00011107F8F14>
-114 D<0FD83FF86038C038C038F0007F803FF007F8001C6006E006F006F81CFFF8CFE00F107E8F
-14>I<030007000700070007007FFCFFFC07000700070007000700070007000700070E070E070E
-070C03FC00F00F157F9414>I<FC3F00FC3F001C07001C07001C07001C07001C07001C07001C07
-001C07001C07001C07001C07001C1F000FFFE003E7E01310808F14>I<FE3F80FE3F801C1C001C
-1C001C1C001C1C000E38000E38000E380006300007700007700007700003E00003E00003E00011
-107F8F14>I<FF7F80FF7F80380E00380E00380E00380E0039CE0039CE0019CC001B6C001B6C00
-1A6C001A6C001E7C000E78000E780011107F8F14>I<7E3F007E3F001E38000E780007700007E0
-0003E00001C00003C00003E0000770000E78000E38001C1C00FE3F80FE3F8011107F8F14>I<FE
-3F80FE3F801C1C001C1C001C1C000E1C000E38000E380007380007300007300003700003700001
-E00001E00001E00001C00001C00001C0000380007380007700007E00003C000011187F8F14>I<
-3FFF7FFF700E701C7038007000E001C0038007000E001C0738077007FFFFFFFF10107F8F14>I
-E /Fd 1 59 df<60F0F06004047D830B>58 D E /Fe 25 122 df<078018603030303060186018
-E01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01C6018601870383030186007800E187E
-9713>48 D<03000700FF0007000700070007000700070007000700070007000700070007000700
-070007000700070007000700FFF00C187D9713>I<0F80106020304038803CC01CE01C401C003C
-003800380070006000C001800100020004040804100430083FF87FF8FFF80E187E9713>I<01E0
-06100C1818383038300070006000E000E7C0E860F030F018E018E01CE01CE01C601C601C701830
-183030186007C00E187E9713>54 D<40007FFE7FFC7FFC40088010801080200040004000800180
-01800100030003000300030007000700070007000700070002000F197E9813>I<078018603030
-201860186018601870103C303E600F8007C019F030F86038401CC00CC00CC00CC00C6008201018
-600FC00E187E9713>I<07801860303070306018E018E018E01CE01CE01C601C603C303C185C0F
-9C001C00180018003870307060604021801F000E187E9713>I<FFE7FF0E00700E00700E00700E
-00700E00700E00700E00700E00700E00700E00700E00700FFFF00E00700E00700E00700E00700E
-00700E00700E00700E00700E00700E00700E00700E0070FFE7FF181A7E991D>72
-D<0FC21836200E6006C006C002C002C002E00070007E003FE01FF807FC003E000E000700038003
-80038003C002C006E004D81887E0101A7E9915>83 D<3F8070C070E020700070007007F01C7030
-707070E070E071E071E0F171FB1E3C10107E8F13>97 D<07F80C1C381C30087000E000E000E000
-E000E000E0007000300438080C1807E00E107F8F11>99 D<007E00000E00000E00000E00000E00
-000E00000E00000E00000E00000E0003CE000C3E00380E00300E00700E00E00E00E00E00E00E00
-E00E00E00E00E00E00600E00700E00381E001C2E0007CFC0121A7F9915>I<07C01C3030187018
-600CE00CFFFCE000E000E000E0006000300438080C1807E00E107F8F11>I<0FCE187330307038
-703870387038303018602FC02000600070003FF03FFC1FFE600FC003C003C003C0036006381C07
-E010187F8F13>103 D<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00
-001CF8001D0C001E0E001E0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E
-001C0E001C0E00FF9FC0121A7F9915>I<18003C003C001800000000000000000000000000FC00
-1C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF80091A80990A>I<FCF8
-001D0C001E0E001E0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E
-001C0E00FF9FC012107F8F15>110 D<07E01C38300C700E6006E007E007E007E007E007E00760
-06700E381C1C3807E010107F8F13>I<FCF8001F0E001E07001C03801C03801C01C01C01C01C01
-C01C01C01C01C01C01C01C03801C03001E07001F0C001CF0001C00001C00001C00001C00001C00
-001C0000FF800012177F8F15>I<FCE01D701E701E201C001C001C001C001C001C001C001C001C
-001C001C00FFC00C107F8F0F>114 D<1F2060E04020C020C020F0007F003FC01FE000F0807080
-30C030C020F0408F800C107F8F0F>I<0400040004000C000C001C003C00FFC01C001C001C001C
-001C001C001C001C001C201C201C201C201C200E4003800B177F960F>I<FF1F803C06001C0400
-1C04001E0C000E08000E080007100007100007900003A00003A00001C00001C00001C000008000
-11107F8F14>118 D<FF3F803C1C001C18000E100007200007600003C00001C00001E00003E000
-027000043800083800181C00381E00FC3FC012107F8F14>120 D<FF1F803C06001C04001C0400
-1E0C000E08000E080007100007100007900003A00003A00001C00001C00001C000008000008000
-010000010000E10000E20000E4000078000011177F8F14>I E /Ff 2 42
-df<007000E001C00380078007000E001E001E003C003C003C0078007800780078007000F000F0
-00F000F000F000F000F000F000F000F000F000F000700078007800780078003C003C003C001E00
-1E000E0007000780038001C000E000700C2E7EA112>40 D<E000700038001C001E000E00070007
-80078003C003C003C001E001E001E001E000E000F000F000F000F000F000F000F000F000F000F0
-00F000F000E001E001E001E001E003C003C003C00780078007000E001E001C0038007000E0000C
-2E7DA112>I E /Fg 25 123 df<0007F800007FFC0001FC0E0003F01F0007E03F000FC03F000F
-C03F000FC03F000FC01E000FC00C000FC000000FC000000FC0FF80FFFFFF80FFFFFF800FC01F80
-0FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F
-800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F807FF8FFF07FF8FFF01C23
-7FA220>12 D<000FFF80007FFF8001FC1F8003F03F8007E03F800FC03F800FC01F800FC01F800F
-C01F800FC01F800FC01F800FC01F800FC01F80FFFFFF80FFFFFF800FC01F800FC01F800FC01F80
-0FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F
-800FC01F800FC01F800FC01F800FC01F800FC01F807FF8FFF07FF8FFF01C237FA220>I<07FE00
-001FFF80003F07E0003F03F0003F01F0003F01F8001E01F8000001F8000001F800003FF80003FD
-F8001F81F8003E01F8007C01F800F801F800F801F800F801F800F801F8007C02F8007E0CF8001F
-F87F8007E03F8019167E951C>97 D<FF800000FF8000001F8000001F8000001F8000001F800000
-1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F87F0001FBFFC001FF03E
-001FC01F001F800F801F800FC01F8007C01F8007E01F8007E01F8007E01F8007E01F8007E01F80
-07E01F8007E01F8007C01F8007C01F800FC01F800F801FC01F001E707E001C3FFC00180FE0001B
-237EA220>I<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000FC0000FC0000FC0000
-FC0000FC0000FC00007C00007E00007E00003F00301F00600FC0E007FF8000FE0014167E9519>
-I<0001FF000001FF0000003F0000003F0000003F0000003F0000003F0000003F0000003F000000
-3F0000003F0000003F0000003F0000FE3F0007FFBF000FC1FF001F007F003E003F007E003F007C
-003F007C003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F007C003F00
-7E003F003E003F001F007F000F81FF0007FF3FE001FC3FE01B237EA220>I<00FE0007FF800F83
-C01F01E03E00F07E00F07C00F87C0078FC0078FFFFF8FFFFF8FC0000FC0000FC00007C00007C00
-003E00183E00181F00300F80E003FFC000FF0015167E951A>I<00FE0F8003FF9FC00F83E3C01F
-01F3C01E00F0003E00F8003E00F8003E00F8003E00F8003E00F8001E00F0001F01F0000F83E000
-0BFF800008FE000018000000180000001C0000001FFFE0001FFFFC000FFFFF0007FFFF001FFFFF
-807C001FC078000FC0F80007C0F80007C0F80007C07C000F803E001F001F807E000FFFFC0001FF
-E0001A217F951D>103 D<FF800000FF8000001F8000001F8000001F8000001F8000001F800000
-1F8000001F8000001F8000001F8000001F8000001F8000001F83F0001F8FFC001F987E001FA03E
-001FC03F001FC03F001F803F001F803F001F803F001F803F001F803F001F803F001F803F001F80
-3F001F803F001F803F001F803F001F803F001F803F001F803F00FFF1FFE0FFF1FFE01B237DA220
->I<1E003F007F807F807F807F803F001E00000000000000000000000000FF80FF801F801F801F
-801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F80FFF0FFF00C247EA3
-0F>I<FF800000FF8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000
-1F8000001F8000001F8000001F8000001F80FF801F80FF801F803C001F8030001F80E0001F81C0
-001F8300001F8600001F9E00001FBE00001FFF00001FDF80001F8FC0001F07C0001F07E0001F03
-F0001F01F8001F00F8001F00FC001F007E00FFE1FFC0FFE1FFC01A237EA21E>107
-D<FF80FF801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F80
-1F801F801F801F801F801F801F801F801F801F801F801F801F801F80FFF0FFF00C237EA20F>I<
-FF03F803F800FF0FFE0FFE001F183F183F001F201F201F001F401FC01F801F401FC01F801F801F
-801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F80
-1F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F
-801F80FFF0FFF0FFF0FFF0FFF0FFF02C167D9531>I<FF03F000FF0FFC001F187E001F203E001F
-403F001F403F001F803F001F803F001F803F001F803F001F803F001F803F001F803F001F803F00
-1F803F001F803F001F803F001F803F001F803F001F803F00FFF1FFE0FFF1FFE01B167D9520>I<
-00FF0007FFE00F81F01F00F83E007C7C003E7C003E7C003EFC003FFC003FFC003FFC003FFC003F
-FC003FFC003F7C003E7E007E3E007C1F00F80F81F007FFE000FF0018167E951D>I<FF87F000FF
-BFFC001FF07E001FC01F001F800F801F800FC01F800FC01F8007E01F8007E01F8007E01F8007E0
-1F8007E01F8007E01F8007E01F8007C01F800FC01F800FC01F801F801FC01F001FF07E001FBFFC
-001F8FE0001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000FFF0
-0000FFF000001B207E9520>I<FF0F80FF1FE01F33F01F63F01F43F01F43F01FC1E01F80001F80
-001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8000FFF800FFF8
-0014167E9518>114 D<07F9801FFF80380780700380F00180F00180F80000FF0000FFF8007FFE
-003FFF001FFF8007FF80003FC0C007C0C003C0E003C0E003C0F00380FC0F00EFFE00C3F8001216
-7E9517>I<00C00000C00000C00000C00001C00001C00003C00007C0000FC0001FC000FFFF00FF
-FF000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC1800F
-C1800FC1800FC1800FC18007C18007E30003FE0000FC0011207F9F16>I<FF81FF00FF81FF001F
-803F001F803F001F803F001F803F001F803F001F803F001F803F001F803F001F803F001F803F00
-1F803F001F803F001F803F001F803F001F803F001F807F001F80FF000FC1BF0007FF3FE001FC3F
-E01B167D9520>I<FFF01FE0FFF01FE00FC007000FC006000FE00E0007E00C0007F01C0003F018
-0003F8180001F8300001F8300000FC600000FC6000007EC000007EC000007FC000003F8000003F
-8000001F0000001F0000000E0000000E00001B167F951E>I<FFF3FF87FCFFF3FF87FC1F807C00
-E00FC07C00C00FC07E00C00FE03E01C007E03F018007E07F018003F07F030003F0CF830001F8CF
-860001F8CFC60001FD87C60000FD87CC0000FF03EC00007F03F800007F03F800007E01F800003E
-01F000003C00F000001C00E000001800600026167F9529>I<FFF0FFC0FFF0FFC00FC01C0007E0
-380007F0700003F0E00001F8C00000FD8000007F0000007F0000003F0000001F8000003FC00000
-37E0000067F00000C3F00001C1F8000380FC000700FE000E007E00FFC1FFE0FFC1FFE01B167F95
-1E>I<FFF01FE0FFF01FE00FC007000FC006000FE00E0007E00C0007F01C0003F0180003F81800
-01F8300001F8300000FC600000FC6000007EC000007EC000007FC000003F8000003F8000001F00
-00001F0000000E0000000E0000000C0000000C00000018000078180000FC380000FC300000FC60
-000069E000007F8000001F0000001B207F951E>I<7FFFE07FFFE0780FC0701FC0601F80E03F00
-C07F00C07E00C0FC0001FC0001F80003F00007F03007E0300FC0301FC0701F80703F00607F00E0
-7E03E0FFFFE0FFFFE014167E9519>I E /Fh 22 119 df<00E00000E00000E00000E00040E040
-F0E1E0F8E3E07EEFC01FFF0007FC0003F80007FC001FFF007EEFC0F8E3E0F0E1E040E04000E000
-00E00000E00000E00013157D991A>42 D<003800007C00007C00006C0000EE0000EE0000EE0000
-EE0000C60001C70001C70001C70001C7000383800383800383800383800783C00701C007FFC007
-FFC007FFC00E00E00E00E00E00E00E00E01C00707F83FCFF83FE7F83FC171E7F9D1A>65
-D<7FFFFCFFFFFC7FFFFC0E001C0E001C0E001C0E001C0E001C0E00000E00000E07000E07000E07
-000FFF000FFF000FFF000E07000E07000E07000E00000E00000E00000E000E0E000E0E000E0E00
-0E0E000E7FFFFEFFFFFE7FFFFE171E7F9D1A>69 D<FF8FF8FF8FF8FF8FF81C01C01C01C01C01C0
-1C01C01C01C01C01C01C01C01C01C01C01C01C01C01FFFC01FFFC01FFFC01C01C01C01C01C01C0
-1C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C0FF8FF8FF8FF8FF8FF8151E7E9D1A>
-72 D<FFFF80FFFF80FFFF8001C00001C00001C00001C00001C00001C00001C00001C00001C000
-01C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000
-01C00001C000FFFF80FFFF80FFFF80111E7C9D1A>I<FE0FF8FF0FF8FF0FF81D81C01D81C01D81
-C01D81C01DC1C01CC1C01CC1C01CE1C01CE1C01C61C01C61C01C71C01C71C01C31C01C31C01C39
-C01C39C01C19C01C19C01C1DC01C0DC01C0DC01C0DC01C0DC0FF87C0FF87C0FF83C0151E7E9D1A
->78 D<0FFE003FFF807FFFC07C07C07001C0F001E0E000E0E000E0E000E0E000E0E000E0E000E0
-E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0F001E0F001E0
-7001C07C07C07FFFC03FFF800FFE00131E7D9D1A>I<FFF000FFFC00FFFF001C0F801C07801C03
-C01C01C01C01C01C01C01C01C01C03C01C07801C0F801FFF001FFC001FFE001C0F001C07001C03
-801C03801C03801C03801C03801C03841C038E1C038E1C038EFF81FCFF81FCFF8070171E7E9D1A
->82 D<03F1C00FFDC03FFFC07C0FC07003C0E003C0E001C0E001C0E001C0E00000700000780000
-3F00001FF00007FE0000FF00000F800003C00001C00000E00000E06000E0E000E0E000E0E001C0
-F001C0FC0780FFFF80EFFE00E3F800131E7D9D1A>I<7FFFFEFFFFFEFFFFFEE0380EE0380EE038
-0EE0380EE0380E0038000038000038000038000038000038000038000038000038000038000038
-0000380000380000380000380000380000380000380000380003FF8007FFC003FF80171E7F9D1A
->I<FF01FEFF83FEFF01FE1E00F00E00E00E00E00701C00701C003838003838003C78001C70001
-C70000EE0000EE00007C00007C0000380000380000380000380000380000380000380000380000
-380000380001FF0001FF0001FF00171E7F9D1A>89 D<7FFFC0FFFFE0FFFFE07FFFC013047D7E1A
->95 D<1FF0003FFC007FFE00780F00300700000380000380007F8007FF801FFF803F8380780380
-700380E00380E00380E00380700780780F803FFFFC1FFDFC07F0FC16157D941A>97
-D<00FF8003FFC00FFFE01F01E03C00C0780000700000700000E00000E00000E00000E00000E000
-007000007000007800703C00701F01F00FFFE003FFC000FE0014157D941A>99
-D<001FC0001FC0001FC00001C00001C00001C00001C00001C00001C001F1C007FDC00FFFC01E0F
-C03C07C07803C07001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C07003C07003C03807
-C03E0FC01FFFFC07FDFC01F1FC161E7E9D1A>I<FE0000FE0000FE00000E00000E00000E00000E
-00000E00000E00000E3E000EFF800FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E00E
-00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E0FFE3FEFFE3FEFFE3FE171E7F9D1A>
-104 D<01C00003E00003E00003E00001C0000000000000000000000000000000007FE000FFE000
-7FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E000
-00E00000E00000E000FFFFC0FFFFC0FFFFC0121F7C9E1A>I<FE3E00FEFF80FFFFC00FC1C00F80
-E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00
-E0FFE3FEFFE3FEFFE3FE17157F941A>110 D<01F00007FC001FFF003E0F803C07807803C07001
-C0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C07803C03C07803E0F801FFF0007FC
-0001F00013157D941A>I<FF83F0FF8FF8FFBFFC03FC3C03F01803E00003C00003C00003800003
-8000038000038000038000038000038000038000038000038000FFFF00FFFF80FFFF0016157E94
-1A>114 D<00C00001C00001C00001C00001C00001C00001C0007FFFE0FFFFE0FFFFE001C00001
-C00001C00001C00001C00001C00001C00001C00001C00001C00001C07001C07001C07001C07000
-E0E000FFE0007FC0001F00141C7F9B1A>116 D<7FC7FCFFC7FE7FC7FC0E00E00E00E00F01E007
-01C00701C00783C003838003838003838001C70001C70001C70000EE0000EE0000EE00007C0000
-7C0000380017157F941A>118 D E /Fi 41 123 df<0003FC00003FFE00007E070001F80F8003
-F01F8003E01F8007E01F8007E01F8007E01F8007E0060007E0000007E0000007E0000007E0FFC0
-FFFFFFC0FFFFFFC007E00FC007E00FC007E00FC007E00FC007E00FC007E00FC007E00FC007E00F
-C007E00FC007E00FC007E00FC007E00FC007E00FC007E00FC007E00FC007E00FC007E00FC007E0
-0FC007E00FC007E00FC07FFC7FFC7FFC7FFC1E267FA522>12 D<3C7EFFFFFFFF7E3C08087C8711
->46 D<001C00003C0000FC00FFFC00FFFC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00
-00FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00
-00FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC007FFFFC7FFFFC16237CA21F>49
-D<01FF0007FFC01E07F03803F86001FC7C00FEFE00FEFE00FFFE007FFE007F7C007F3800FF0000
-FF0000FE0000FE0001FC0001F80003F00007E0000780000F00001E00003C0000700000E00301C0
-030380070700060600060FFFFE1FFFFE3FFFFE7FFFFCFFFFFCFFFFFC18237DA21F>I<01FF0007
-FFE01E03F03801F83C01FC7E00FE7E00FE7E00FE3E00FE1C01FE0001FC0001FC0003F80007F000
-0FC001FF0001FF000007E00001F00001F80000FC0000FE0000FF0000FF1000FF7C00FFFE00FFFE
-00FFFE00FEFE00FE7C01FC7001F83E07F00FFFC001FF0018237DA21F>I<000038000000780000
-0078000000F8000001F8000003F8000007F8000006F800000CF800001CF8000038F8000030F800
-0060F80000E0F80001C0F8000180F8000300F8000700F8000E00F8001C00F8001800F8003000F8
-007000F800E000F800FFFFFFC0FFFFFFC00001F8000001F8000001F8000001F8000001F8000001
-F8000001F800007FFFC0007FFFC01A237EA21F>I<18000C1F007C1FFFF81FFFF01FFFE01FFFC0
-1FFF801FFE0018000018000018000018000018000018FF001BFFE01F01F01C00F80800FC00007E
-00007E00007E00007F00007F78007FFC007FFC007FFC007FFC007EF8007E6000FC7000FC3801F8
-1E07E007FFC001FE0018237DA21F>I<001FC0007FF001F83803E00C07803E0F807E1F007E3F00
-7E3F007E7E003C7E00007E00007E0000FE3FC0FE7FF0FE80F8FF80FCFF007CFF007EFE007EFE00
-7FFE007FFE007FFE007F7E007F7E007F7E007F7E007F3E007E3F007E1F007C0F80F807C1F003FF
-C0007F0018237DA21F>I<300000003C0000003FFFFFC03FFFFFC03FFFFF807FFFFF007FFFFE00
-7FFFFC006000180060001800E0003000C0006000C000C000000180000001800000030000000700
-0000060000000E0000001E0000001E0000001E0000003C0000003C0000007C0000007C0000007C
-0000007C000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000078000000
-3000001A257DA41F>I<00001C00000000001C00000000003E00000000003E00000000003E0000
-0000007F00000000007F0000000000FF8000000000FF8000000000FF80000000019FC000000001
-9FC0000000031FE0000000030FE0000000030FE00000000607F00000000607F00000000C07F800
-00000C03F80000001C03FC0000001801FC0000001801FC0000003001FE0000003000FE0000007F
-FFFF0000007FFFFF00000060007F000000C0007F800000C0003F800001C0003FC0000180001FC0
-000180001FC0000300000FE0000300000FE0000780000FF000FFF801FFFF80FFF801FFFF802925
-7EA42E>65 D<FFFFFFE00000FFFFFFFC000003F800FF000003F8001FC00003F80007E00003F800
-03F00003F80001F80003F80001FC0003F80000FC0003F80000FE0003F80000FE0003F800007F00
-03F800007F0003F800007F0003F800007F8003F800007F8003F800007F8003F800007F8003F800
-007F8003F800007F8003F800007F8003F800007F8003F800007F8003F800007F8003F800007F00
-03F800007F0003F800007F0003F80000FE0003F80000FE0003F80001FC0003F80001F80003F800
-03F00003F80007E00003F8001FC00003F800FF8000FFFFFFFE0000FFFFFFE0000029257EA42F>
-68 D<FFFFFFFF00FFFFFFFF0003F8007F0003F8000F8003F800078003F800038003F800038003
-F800018003F800018003F800018003F80000C003F80600C003F80600C003F806000003F8060000
-03F80E000003F81E000003FFFE000003FFFE000003F81E000003F80E000003F806000003F80600
-0003F806006003F806006003F800006003F80000C003F80000C003F80000C003F80000C003F800
-01C003F80003C003F80003C003F8000F8003F8003F80FFFFFFFF80FFFFFFFF8023257EA428>I<
-FFFFFFFE00FFFFFFFE0003F800FE0003F8001F0003F8000F0003F800070003F800070003F80003
-0003F800030003F800030003F800018003F806018003F806018003F806000003F806000003F80E
-000003F81E000003FFFE000003FFFE000003F81E000003F80E000003F806000003F806000003F8
-06000003F806000003F800000003F800000003F800000003F800000003F800000003F800000003
-F800000003F800000003F800000003F8000000FFFFF00000FFFFF0000021257EA427>I<FFFFE0
-FFFFE0FFFFE0FFFFE003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800
-03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800
-03F80003F80003F80003F80003F80003F80003F80003FFFFFFF80003FFFFFFF80003F80003F800
-03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800
-03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800
-03F80003F80003F80003F800FFFFE0FFFFE0FFFFE0FFFFE02B257EA430>72
-D<FFFFE0FFFFE003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F8
-0003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F8
-0003F80003F80003F80003F80003F80003F80003F80003F80003F800FFFFE0FFFFE013257EA417
->I<FFFFF000FFFFF00003F8000003F8000003F8000003F8000003F8000003F8000003F8000003
-F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F80000
-03F8000003F8000003F8000003F8000003F8000603F8000603F8000603F8000C03F8000C03F800
-0C03F8001C03F8001C03F8003C03F8007C03F800F803F803F8FFFFFFF8FFFFFFF81F257EA425>
-76 D<FFF8000000FFF8FFFC000001FFF803FC000001FE00037E0000037E00037E0000037E0003
-7E0000037E00033F0000067E00033F0000067E00031F80000C7E00031F80000C7E00030FC00018
-7E00030FC000187E000307E000307E000307E000307E000307E000307E000303F000607E000303
-F000607E000301F800C07E000301F800C07E000300FC01807E000300FC01807E0003007E03007E
-0003007E03007E0003007E03007E0003003F06007E0003003F06007E0003001F8C007E0003001F
-8C007E0003000FD8007E0003000FD8007E00030007F0007E00030007F0007E00030007F0007E00
-030003E0007E00078003E0007E00FFFC01C01FFFF8FFFC01C01FFFF835257EA43A>I<00FF0080
-07FFE3800F80F7801E001F803C000F807800078078000380F8000380F8000180F8000180FC0001
-80FC000000FF0000007FE000007FFF00003FFFE0003FFFF8001FFFFE0007FFFF0003FFFF80007F
-FF800003FFC000003FC000000FE0000007E0000007E0C00003E0C00003E0C00003E0C00003C0E0
-0003C0F00007C0F8000780FC000F00FFC03E00E3FFF800803FE0001B257DA422>83
-D<FFFF83FFFE01FFF0FFFF83FFFE01FFF007F0001FC0000F0007F0001FC000060003F8000FE000
-0C0003F8000FE0000C0003FC000FF0001C0001FC0007F000180001FC0007F000180000FE000FF8
-00300000FE000FF800300000FE000FFC003000007F0019FC006000007F0019FC006000007F8039
-FE00E000003F8030FE00C000003F8030FE00C000001FC0607F018000001FC0607F018000001FE0
-607F818000000FE0C03F830000000FE0C03F830000000FF1C03FC700000007F1801FC600000007
-F1801FC600000003FB000FEC00000003FB000FEC00000003FF000FFC00000001FE0007F8000000
-01FE0007F800000001FE0007F800000000FC0003F000000000FC0003F000000000780001E00000
-0000780001E000000000780001E000000000300000C000003C257FA43F>87
-D<07FF00001FFFC0003E03E0003F01F0003F01F8003F00FC001E00FC000000FC000000FC000000
-FC00003FFC0003FCFC000FC0FC003F00FC007E00FC007E00FC00FC00FC00FC00FC00FC00FC00FC
-017C007E017C003F067C001FFC3FE007F01FE01B187E971E>97 D<FFC00000FFC000000FC00000
-0FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000
-000FC000000FC3F8000FCFFE000FF81F800FE00FC00FC007E00FC007E00FC003F00FC003F00FC0
-03F80FC003F80FC003F80FC003F80FC003F80FC003F80FC003F80FC003F80FC003F00FC003F00F
-C007E00FC007C00FE00FC00F383F000E1FFE000C07F0001D267EA522>I<007FE003FFF807C07C
-1F80FC1F00FC3F00FC7E00787E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000
-7E00007F00003F000C1F800C1FC01807E07003FFE0007F0016187E971B>I<0001FF800001FF80
-00001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F
-8000001F8000001F80007F1F8003FFDF8007E0FF801F803F803F001F803F001F807E001F807E00
-1F80FE001F80FE001F80FE001F80FE001F80FE001F80FE001F80FE001F80FE001F807E001F807E
-001F803F001F803F003F801F807F800FC0FF8003FF9FF800FE1FF81D267EA522>I<007F0003FF
-C007C1F00F80F81F00F83F007C7E007C7E007EFE007EFE007EFFFFFEFFFFFEFE0000FE0000FE00
-007E00007E00007E00063F00061F000C0F801807E07003FFE0007F8017187E971C>I<000FC000
-7FF000F8F001F1F803F1F803E1F807E0F007E00007E00007E00007E00007E00007E00007E000FF
-FF00FFFF0007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007
-E00007E00007E00007E00007E00007E00007E00007E00007E0007FFF007FFF0015267EA513>I<
-01FF07C007FFDFE00F83F1E01F01F1E03E00F8007E00FC007E00FC007E00FC007E00FC007E00FC
-007E00FC003E00F8001F01F0000F83E0000FFFC00011FF00003000000030000000380000003C00
-00003FFFE0001FFFFC001FFFFE000FFFFF001FFFFF803C003F8078000FC0F80007C0F80007C0F8
-0007C0F80007C07C000F803E001F001F807E0007FFF80000FFC0001B247E971F>I<FFC00000FF
-C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000
-0FC000000FC000000FC000000FC1F8000FC7FE000FCC3F000FD01F000FF01F800FE01F800FE01F
-800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC0
-1F800FC01F800FC01F800FC01F800FC01F800FC01F80FFFCFFF8FFFCFFF81D267DA522>I<0F00
-1F803FC03FC03FC03FC01F800F000000000000000000000000000000FFC0FFC00FC00FC00FC00F
-C00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0FFF8FFF80D27
-7EA611>I<FFC0FFC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0
-0FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0FF
-FCFFFC0E267EA511>108 D<FF81FC01FC00FF87FF07FF000F8C1F8C1F800F980F980F800FB00F
-F00FC00FA00FE00FC00FA00FE00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0
-0FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00F
-C00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0FFFCFFFCFFFCFFFCFFFCFFFC
-2E187D9733>I<FF81F800FF87FE000F8C3F000F901F000FB01F800FA01F800FA01F800FC01F80
-0FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F
-800FC01F800FC01F800FC01F800FC01F80FFFCFFF8FFFCFFF81D187D9722>I<007F800003FFF0
-0007C0F8001F807E003F003F003F003F007E001F807E001F80FE001FC0FE001FC0FE001FC0FE00
-1FC0FE001FC0FE001FC0FE001FC0FE001FC07E001F807E001F803F003F003F003F001F807E000F
-C0FC0003FFF000007F80001A187E971F>I<FFC3F800FFCFFE000FF83F800FE00FC00FC00FE00F
-C007E00FC007F00FC003F00FC003F80FC003F80FC003F80FC003F80FC003F80FC003F80FC003F8
-0FC003F80FC007F00FC007F00FC007E00FC00FC00FE01FC00FF83F000FDFFE000FC7F0000FC000
-000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000FFFC0000FFFC
-00001D237E9722>I<FF87C0FF8FF00F98F80FB1F80FA1F80FA1F80FE0F00FC0000FC0000FC000
-0FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC000FFFE00
-FFFE0015187E9719>114 D<07F9801FFF803C0F80700380F00180F00180F00180FC0000FF8000
-7FFC007FFE003FFF800FFFC003FFC0001FE00003E0C001E0C001E0E001E0E001C0F003C0FC0780
-EFFF00C3FC0013187E9718>I<00600000600000600000600000E00000E00001E00001E00003E0
-0007E0001FE000FFFFC0FFFFC007E00007E00007E00007E00007E00007E00007E00007E00007E0
-0007E00007E00007E00007E06007E06007E06007E06007E06007E06003E0C003F0C001FF80007E
-0013237FA218>I<FFC1FF80FFC1FF800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F
-800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC0
-1F800FC03F800FC03F8007C07F8007E0DF8003FF9FF800FE1FF81D187D9722>I<FFF80FF8FFF8
-0FF80FC003C00FE0018007E0030007E0030003F0060003F0060003F80E0001F80C0001FC1C0000
-FC180000FE1800007E3000007E3000003F6000003F6000001FC000001FC000001FC000000F8000
-000F800000070000000700001D187F9720>I<FFF83FF0FFF83FF00FC00F0007E00C0003F01C00
-03F8380001FC700000FCE000007EC000003F8000003F8000001F8000000FC000001FE000001FF0
-000033F8000071F80000E0FC0001C07E0003807F0003003F000F001F80FFC07FF8FFC07FF81D18
-7F9720>120 D<FFF80FF8FFF80FF80FC003C00FE0018007E0030007E0030003F0060003F00600
-03F80E0001F80C0001FC1C0000FC180000FE1800007E3000007E3000003F6000003F6000001FC0
-00001FC000001FC000000F8000000F800000070000000700000006000000060000000C0000300C
-0000781C0000FC180000FC380000FC70000078E000007FC000001F0000001D237F9720>I<3FFF
-F83FFFF83E03F03807F0300FE0700FC0701F80603F80603F00607E0000FE0000FC0001F80003F8
-1803F01807E0180FE0180FC0381F80303F80707F00707E01F0FFFFF0FFFFF015187E971B>I
-E /Fj 29 122 df<0003F07C001E0DC600380F0F00701E0F00E01E0E00E00C0001C01C0001C01C
-0001C01C0001C01C0001C01C00038038007FFFFFC0038038000380380003803800038038000700
-700007007000070070000700700007007000070070000E00E0000E00E0000E00E0000E00E0000E
-00E0000E00E0001C01C0001E01E000FF8FFE0020207E9F1B>11 D<0003E0001C1800381800703C
-00E03C00E03801C00001C00001C00001C00001C0000380007FFFF0038070038070038070038070
-0700E00700E00700E00700E00700E00700E00E01C00E01C00E01C00E01C00E01C00E01C01C0380
-1E03C0FF0FF816207E9F19>I<0003F03F00001E09E08000380F80C000701F01E000E03E01E000
-E01E01C001C01C000001C01C000001C01C000001C01C000001C01C000003803800007FFFFFFF80
-038038038003803803800380380380038038038007007007000700700700070070070007007007
-00070070070007007007000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E0
-0E001C01C01C001E01E01E00FF8FF8FFC023207E9F26>14 D<0020000060000060000060000060
-007061C03843800E4E0007580001E00001E00006B8001C9C00708700E083800180000180000180
-0001800001000012147AA117>42 D<FFC0FFC00A027D8A0F>45 D<000C001C00FC0F3800380038
-00380038003800700070007000700070007000E000E000E000E000E000E001C001C001C001C001
-C001C0038003C0FFFE0F1E7C9D17>49 D<003F8000C1E00100F00200780400780400780F007C0F
-807C0F807C0F00780600780000F80000F00001E00001C0000380000700000E00001C0000380000
-600000C0000180000300200600200800401000403FFFC07FFF80FFFF80161E7E9D17>I<07F800
-0C0C001E06001E07001C070000070000070000070000FF0007C7001E07003C0E00780E00F00E10
-F00E10F00E10F01E10F02E20784F401F878014147D9317>97 D<01FC07060E0F1C0F380E780070
-00F000F000F000F000E000E000E000E000F0027004300818300FC010147C9314>99
-D<0000700003F00000F00000700000700000E00000E00000E00000E00000E00000E00001C000F9
-C00305C00E03C01C03C03801C0780380700380F00380F00380F00380F00380E00700E00700E007
-00E00700E00700700F00301E00186F000F8FE014207C9F19>I<00F800070E000E07001C070038
-0380780380700380F00380F00380FFFF80F00000E00000E00000E00000E00000F0010070020030
-04001C180007E00011147D9314>I<0007800018C00031E00061E000E1C000C00001C00001C000
-01C00001C00001C0000380007FF800038000038000038000038000070000070000070000070000
-0700000700000E00000E00000E00000E00000E00000E00001C00001E0000FFE00013207E9F0E>
-I<00000E003E1100E1A301C1C20381E00780E00701E00F01E00F01E00F01E00703C00703800787
-0004FC000800000800001800001C00000FFF000FFFC007FFE01800F0300030600030C00030C000
-30C000306000603000C01C070007FC00181F809417>I<00E00007E00001E00000E00000E00001
-C00001C00001C00001C00001C00001C000038000038F800390E003A0E003C0600380600780E007
-00E00700E00700E00700E00700E00E01C00E01C00E01C00E01C00E01C00E01C01C03801E03C0FF
-CFF815207E9F19>I<01C003E003E003C0018000000000000000000000000003801F8007800380
-03800700070007000700070007000E000E000E000E000E000E001C001E00FF800B1F7F9E0C>I<
-00E007E001E000E000E001C001C001C001C001C001C00380038003800380038003800700070007
-000700070007000E000E000E000E000E000E001C001E00FFC00B207F9F0C>108
-D<0387C07C001F9861860007A072070003C0340300038038030007807807000700700700070070
-07000700700700070070070007007007000E00E00E000E00E00E000E00E00E000E00E00E000E00
-E00E000E00E00E001C01C01C001E01E01E00FFCFFCFFC022147E9326>I<038F801F90E007A0E0
-03C0600380600780E00700E00700E00700E00700E00700E00E01C00E01C00E01C00E01C00E01C0
-0E01C01C03801E03C0FFCFF815147E9319>I<00FC000387000E01801C00C03800E03800E07000
-F0F000F0F000F0F000F0F000F0E001E0E001E0E001C0E003C0F00380700700380E001C1C0007E0
-0014147D9317>I<00E3E007EC3800F01C00E01E00E00E01C00E01C00F01C00F01C00F01C00F01
-C00F03801E03801E03801C03803C0380380380700740E00721C0071F000700000700000700000E
-00000E00000E00000E00001E0000FFC000181D809319>I<00F040038CC00E04C01C03C03C03C0
-780380780380F00380F00380F00380F00380E00700E00700E00700F00700F00F00700F00301E00
-186E000F8E00000E00000E00000E00001C00001C00001C00001C00003C0001FF80121D7C9318>
-I<038E001FB38007C78003C7800383000780000700000700000700000700000700000E00000E00
-000E00000E00000E00000E00001C00001E0000FFE00011147E9312>I<01F2060E080618061802
-380438001E001FE00FF003F8003C401C400C400C600C6018E010D0608FC00F147E9312>I<0080
-010001000100030007000F001E00FFF80E000E000E000E001C001C001C001C001C001C00380038
-203820382038203840384018800F000D1C7C9B12>I<1C0380FC1F803C07801C03801C03803807
-00380700380700380700380700380700700E00700E00700E00700E00701E00701E00703C00305E
-001F9FC012147B9319>I<FF83F81E00E01C00C01C00800E00800E01000E02000E02000F040007
-040007080007080007100003900003A00003E00003C00003800001800001000015147C9318>I<
-FF9FE1FC3E0780701C0300601C0300401C0380401C0380800E0780800E0581000E0981000E09C2
-000E11C2000731C4000721C4000760C8000740C8000780F0000780F0000300E000030060000200
-40001E147C9321>I<1FF0FF03C07801C06001C04000E08000E180007300007600003C00003C00
-001C00002E00004E000087000107000203800603800C01C03E03E0FF07FC18147F9318>I<0FF8
-3F8001E00E0001C00C0001C0080000E0180000E0100000E0200000E0200000F040000070400000
-708000007080000071000000390000003A0000003E0000003C0000003800000018000000100000
-0010000000200000002000000040000070C00000F0800000F1000000E20000007C000000191D80
-9318>I E /Fk 36 122 df<0001C0000003C000000FC000007FC0001FFFC000FFFFC000FFBFC0
-00E03FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003F
-C000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00000
-3FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000
-003FC000003FC000003FC000003FC000003FC000003FC000003FC0007FFFFFE07FFFFFE07FFFFF
-E01B2E7AAD28>49 D<003FE00001FFFE0007FFFF800F80FFC01E003FE038001FF07C000FF87E00
-07FCFF0007FCFF8007FEFF8007FEFF8003FEFF8003FE7F0003FE3E0007FE000007FE000007FC00
-0007FC00000FF800000FF800000FF000001FE000001FC000003F8000007F0000007E000000F800
-0001F0000003E0000007C000000F0000001E000E003C000E0038000E0070001E00E0001C01C000
-1C0300003C07FFFFFC0FFFFFFC1FFFFFFC3FFFFFFC7FFFFFF8FFFFFFF8FFFFFFF8FFFFFFF81F2E
-7CAD28>I<0000007800000000000078000000000000FC000000000000FC000000000000FC0000
-00000001FE000000000001FE000000000003FF000000000003FF000000000007FF800000000007
-FF800000000007FF80000000000FFFC0000000000E7FC0000000001E7FE0000000001C3FE00000
-00001C3FE000000000383FF000000000381FF000000000781FF800000000700FF800000000700F
-F800000000E00FFC00000000E007FC00000001E007FE00000001C003FE00000001C003FE000000
-038003FF000000038001FF000000078001FF800000070000FF800000070000FF8000000FFFFFFF
-C000000FFFFFFFC000001FFFFFFFE000001C00003FE000003C00003FF000003800001FF0000038
-00001FF000007000001FF800007000000FF80000F000000FFC0000E0000007FC0000E0000007FC
-0001C0000007FE0003E0000003FE00FFFF8001FFFFFCFFFF8001FFFFFCFFFF8001FFFFFC36317D
-B03D>65 D<FFFFFFFFE00000FFFFFFFFFE0000FFFFFFFFFF800000FF0000FFC00000FF00003FF0
-0000FF00001FF80000FF00000FF80000FF000007FC0000FF000007FC0000FF000007FE0000FF00
-0003FE0000FF000003FE0000FF000003FE0000FF000003FE0000FF000007FE0000FF000007FE00
-00FF000007FC0000FF000007FC0000FF00000FF80000FF00001FF00000FF00003FE00000FF0000
-FF800000FF000FFF000000FFFFFFFE000000FFFFFFFFC00000FF00001FF00000FF000007F80000
-FF000003FE0000FF000003FE0000FF000001FF0000FF000001FF8000FF000000FF8000FF000000
-FFC000FF000000FFC000FF000000FFC000FF000000FFC000FF000000FFC000FF000000FFC000FF
-000000FFC000FF000000FF8000FF000001FF8000FF000001FF0000FF000003FF0000FF000007FE
-0000FF00000FFC0000FF00007FF800FFFFFFFFFFE000FFFFFFFFFF8000FFFFFFFFFC000032317E
-B039>I<000003FF80018000003FFFF003800001FFFFFC07800007FF003F0F80001FF800079F80
-003FC00001FF8000FF800000FF8001FE0000007F8003FC0000003F8007FC0000001F8007F80000
-000F800FF00000000F801FF000000007801FF000000007803FE000000007803FE000000003807F
-E000000003807FE000000003807FC000000000007FC00000000000FFC00000000000FFC0000000
-0000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC0
-0000000000FFC000000000007FC000000000007FC000000000007FE000000000007FE000000003
-803FE000000003803FE000000003801FF000000003801FF000000007800FF0000000070007F800
-0000070007FC0000000E0003FC0000001E0001FE0000001C0000FF8000007800003FC00000F000
-001FF80003E0000007FF003F80000001FFFFFE000000003FFFF80000000003FF80000031317CB0
-3A>I<FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE000FF80007FE000FF80000FF000FF800003F0
-00FF800001F000FF800001F000FF800000F000FF800000F000FF8000007000FF8000007000FF80
-00007000FF8000003800FF8000003800FF8007003800FF8007003800FF8007000000FF80070000
-00FF8007000000FF800F000000FF801F000000FF803F000000FFFFFF000000FFFFFF000000FFFF
-FF000000FF803F000000FF801F000000FF800F000000FF8007000000FF8007000000FF80070000
-00FF8007000000FF8007000000FF8000000000FF8000000000FF8000000000FF8000000000FF80
-00000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF80000000
-00FF80000000FFFFFFE00000FFFFFFE00000FFFFFFE000002D317EB033>70
-D<000003FF00030000007FFFF007000001FFFFFC0F000007FF007E1F00001FF0000FBF00007FC0
-0003FF0000FF800001FF0001FE0000007F0003FC0000007F0007FC0000003F000FF80000001F00
-0FF00000001F001FF00000000F001FF00000000F003FE000000007003FE000000007007FE00000
-0007007FE000000007007FC00000000000FFC00000000000FFC00000000000FFC00000000000FF
-C00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC0000000
-0000FFC00000000000FFC00007FFFFFC7FC00007FFFFFC7FE00007FFFFFC7FE0000001FF003FE0
-000001FF003FE0000001FF001FF0000001FF001FF0000001FF000FF0000001FF000FF8000001FF
-0007FC000001FF0003FC000001FF0001FE000001FF0000FF800001FF00007FC00003FF00001FF8
-00077F000007FF003E3F000001FFFFFC1F0000007FFFF00F00000003FF80030036317CB03F>I<
-FFFFFF807FFFFFC0FFFFFF807FFFFFC0FFFFFF807FFFFFC000FF8000007FC00000FF8000007FC0
-0000FF8000007FC00000FF8000007FC00000FF8000007FC00000FF8000007FC00000FF8000007F
-C00000FF8000007FC00000FF8000007FC00000FF8000007FC00000FF8000007FC00000FF800000
-7FC00000FF8000007FC00000FF8000007FC00000FF8000007FC00000FF8000007FC00000FF8000
-007FC00000FF8000007FC00000FF8000007FC00000FFFFFFFFFFC00000FFFFFFFFFFC00000FFFF
-FFFFFFC00000FF8000007FC00000FF8000007FC00000FF8000007FC00000FF8000007FC00000FF
-8000007FC00000FF8000007FC00000FF8000007FC00000FF8000007FC00000FF8000007FC00000
-FF8000007FC00000FF8000007FC00000FF8000007FC00000FF8000007FC00000FF8000007FC000
-00FF8000007FC00000FF8000007FC00000FF8000007FC00000FF8000007FC00000FF8000007FC0
-0000FF8000007FC00000FF8000007FC000FFFFFF807FFFFFC0FFFFFF807FFFFFC0FFFFFF807FFF
-FFC03A317EB03F>I<FFFFFF80FFFFFF80FFFFFF8000FF800000FF800000FF800000FF800000FF
-800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000
-FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF8000
-00FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF80
-0000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF8000FFFF
-FF80FFFFFF80FFFFFF8019317EB01E>I<FFFF800001FFFFC0FFFFC00001FFFFC0FFFFE00001FF
-FFC000FFF0000003E00000FFF8000001C00000EFFC000001C00000E7FC000001C00000E7FE0000
-01C00000E3FF000001C00000E1FF800001C00000E0FFC00001C00000E07FE00001C00000E03FE0
-0001C00000E03FF00001C00000E01FF80001C00000E00FFC0001C00000E007FE0001C00000E003
-FE0001C00000E001FF0001C00000E001FF8001C00000E000FFC001C00000E0007FE001C00000E0
-003FF001C00000E0001FF001C00000E0001FF801C00000E0000FFC01C00000E00007FE01C00000
-E00003FF01C00000E00001FF81C00000E00000FF81C00000E00000FFC1C00000E000007FE1C000
-00E000003FF1C00000E000001FF9C00000E000000FFDC00000E0000007FDC00000E0000007FFC0
-0000E0000003FFC00000E0000001FFC00000E0000000FFC00000E00000007FC00000E00000003F
-C00000E00000003FC00000E00000001FC00000E00000000FC00001F000000007C000FFFFE00000
-03C000FFFFE0000001C000FFFFE0000001C0003A317EB03F>78 D<FFFFFFFFE000FFFFFFFFFE00
-FFFFFFFFFF8000FF8000FFE000FF80003FF000FF80000FF800FF800007FC00FF800007FC00FF80
-0003FE00FF800003FE00FF800003FF00FF800003FF00FF800003FF00FF800003FF00FF800003FF
-00FF800003FF00FF800003FF00FF800003FE00FF800003FE00FF800007FC00FF800007F800FF80
-000FF800FF80003FE000FF8000FFC000FFFFFFFF0000FFFFFFF80000FF8000000000FF80000000
-00FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF80
-00000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF80000000
-00FF8000000000FF8000000000FF8000000000FF8000000000FF80000000FFFFFF800000FFFFFF
-800000FFFFFF80000030317EB037>80 D<7FFFFFFFFFFF007FFFFFFFFFFF007FFFFFFFFFFF007F
-C00FF801FF007E000FF8003F007C000FF8001F0078000FF8000F0078000FF8000F0070000FF800
-0700F0000FF8000780F0000FF8000780F0000FF8000780E0000FF8000380E0000FF8000380E000
-0FF8000380E0000FF8000380E0000FF800038000000FF800000000000FF800000000000FF80000
-0000000FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000F
-F800000000000FF800000000000FF800000000000FF800000000000FF800000000000FF8000000
-00000FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000FF8
-00000000000FF800000000000FF800000000000FF800000000000FF800000000000FF800000000
-000FF800000000000FF800000000000FF8000000007FFFFFFF0000007FFFFFFF0000007FFFFFFF
-000031307DAF38>84 D<FFFFFF8003FFFF80FFFFFF8003FFFF80FFFFFF8003FFFF8000FF800000
-07C00000FF80000003800000FF80000003800000FF80000003800000FF80000003800000FF8000
-0003800000FF80000003800000FF80000003800000FF80000003800000FF80000003800000FF80
-000003800000FF80000003800000FF80000003800000FF80000003800000FF80000003800000FF
-80000003800000FF80000003800000FF80000003800000FF80000003800000FF80000003800000
-FF80000003800000FF80000003800000FF80000003800000FF80000003800000FF800000038000
-00FF80000003800000FF80000003800000FF80000003800000FF80000003800000FF8000000380
-0000FF80000003800000FF80000003800000FF800000038000007F800000038000007F80000007
-0000007FC00000070000003FC000000E0000003FC000000E0000001FE000001C0000000FF00000
-3800000007F800007000000003FC0001E000000000FF801FC0000000003FFFFF80000000000FFF
-FE000000000000FFE000000039317EB03E>I<FFFFFC0000FFFFFFFFFC0000FFFFFFFFFC0000FF
-FF03FF00000003C001FF000000038001FF800000078000FF800000070000FFC000000700007FC0
-00000E00007FC000000E00007FE000001E00003FE000001C00003FF000003C00001FF000003800
-001FF800003800000FF800007000000FFC000070000007FC0000E0000007FC0000E0000007FE00
-01E0000003FE0001C0000003FF0003C0000001FF000380000001FF800380000000FF8007000000
-00FFC00700000000FFC00F000000007FC00E000000007FE01E000000003FE01C000000003FF03C
-000000001FF038000000001FF838000000000FF870000000000FF870000000000FFCF000000000
-07FCE00000000007FFE00000000003FFC00000000003FFC00000000001FF800000000001FF8000
-00000000FF000000000000FF000000000000FF0000000000007E0000000000007E000000000000
-3C0000000000003C00000038317EB03D>I<00FFF0000003FFFE00000F803F80000FC00FE0001F
-E007F0001FE007F0001FE003F8000FC003FC00078003FC00000003FC00000003FC00000003FC00
-000003FC000000FFFC00001FFFFC0000FFE3FC0003FC03FC000FF003FC001FC003FC003FC003FC
-007F8003FC007F8003FC00FF0003FC00FF0003FC00FF0003FC00FF0007FC00FF0007FC007F800D
-FC003FC019FE001FE070FFF007FFE07FF000FF803FF024207E9F27>97 D<01F8000000FFF80000
-00FFF8000000FFF80000000FF800000007F800000007F800000007F800000007F800000007F800
-000007F800000007F800000007F800000007F800000007F800000007F800000007F800000007F8
-00000007F83FE00007F8FFFC0007FBE07F0007FF001F8007FE000FC007FC000FE007F80007F007
-F80007F807F80007F807F80003FC07F80003FC07F80003FC07F80003FE07F80003FE07F80003FE
-07F80003FE07F80003FE07F80003FE07F80003FE07F80003FE07F80003FC07F80003FC07F80003
-FC07F80007F807F80007F807F80007F007FC000FE007FE000FC007E7003F8007C3C0FE000780FF
-F80007003FC00027327EB12D>I<000FFF00007FFFC001FC01F003F003F007E007F80FE007F81F
-C007F83FC003F03FC001E07F8000007F8000007F800000FF800000FF800000FF800000FF800000
-FF800000FF800000FF800000FF8000007F8000007F8000007F8000003FC0001C3FC0001C1FC000
-380FE0003807E0007003F001E001FC07C0007FFF00000FF8001E207D9F24>I<0000000FC00000
-07FFC0000007FFC0000007FFC00000007FC00000003FC00000003FC00000003FC00000003FC000
-00003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0
-0000003FC00007F83FC0003FFF3FC000FE07BFC003F801FFC007E0007FC00FE0007FC01FC0003F
-C03FC0003FC03FC0003FC07F80003FC07F80003FC07F80003FC0FF80003FC0FF80003FC0FF8000
-3FC0FF80003FC0FF80003FC0FF80003FC0FF80003FC0FF80003FC07F80003FC07F80003FC07F80
-003FC03FC0003FC03FC0003FC01FC0003FC00FE0007FC007E000FFC003F003FFE001FC0F3FFE00
-7FFE3FFE000FF03FFE27327DB12D>I<000FFC00007FFF8001FC0FC003F003E007E001F00FE001
-F81FC000FC3FC000FE3FC000FE7F80007E7F80007F7F80007FFF80007FFF80007FFFFFFFFFFFFF
-FFFFFF800000FF800000FF800000FF8000007F8000007F8000007F8000003FC000071FC000071F
-C0000E0FE0000E07F0001C03F8007800FE03E0003FFFC00007FE0020207E9F25>I<0001FE0000
-0FFF80001FC3C0007F07E000FE0FF001FE0FF001FC0FF003FC0FF003FC07E003FC018003FC0000
-03FC000003FC000003FC000003FC000003FC000003FC000003FC0000FFFFFC00FFFFFC00FFFFFC
-0003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC
-000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003
-FC000003FC000003FC000003FC000003FC000003FC000003FC00007FFFF0007FFFF0007FFFF000
-1C327EB119>I<001FF007C000FFFE3FE001F83F79F007E00FC3F00FE00FE1F00FC007E0E01FC0
-07F0001FC007F0003FC007F8003FC007F8003FC007F8003FC007F8003FC007F8001FC007F0001F
-C007F0000FC007E0000FE00FE00007E00FC00003F83F000006FFFE00000E1FF000000E00000000
-1E000000001E000000001F000000001F800000001FFFFF80000FFFFFF0000FFFFFFC0007FFFFFE
-0003FFFFFF0003FFFFFF800FFFFFFFC01F00007FC07E00001FE07C00000FE0FC000007E0FC0000
-07E0FC000007E0FC000007E07E00000FC03E00000F803F00001F800FC0007E0007F803FC0001FF
-FFF000001FFF0000242F7E9F28>I<01F8000000FFF8000000FFF8000000FFF80000000FF80000
-0007F800000007F800000007F800000007F800000007F800000007F800000007F800000007F800
-000007F800000007F800000007F800000007F800000007F800000007F807F80007F83FFE0007F8
-783F0007F8C03F8007F9801FC007FB001FC007FE001FE007FC001FE007FC001FE007FC001FE007
-F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0
-07F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001F
-E007F8001FE007F8001FE007F8001FE0FFFFC3FFFFFFFFC3FFFFFFFFC3FFFF28327DB12D>I<03
-C00007E0000FF0001FF8001FF8001FF8001FF8000FF00007E00003C00000000000000000000000
-000000000000000000000000000000000001F800FFF800FFF800FFF8000FF80007F80007F80007
-F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007
-F80007F80007F80007F80007F80007F80007F80007F80007F800FFFF80FFFF80FFFF8011337DB2
-17>I<01F800FFF800FFF800FFF8000FF80007F80007F80007F80007F80007F80007F80007F800
-07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800
-07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800
-07F80007F80007F80007F80007F80007F80007F80007F80007F800FFFFC0FFFFC0FFFFC012327D
-B117>108 D<03F007F8001FE000FFF03FFE00FFF800FFF0783F01E0FC00FFF0C03F8300FE000F
-F1801FC6007F0007F3001FCC007F0007F6001FF8007F8007FC001FF0007F8007FC001FF0007F80
-07FC001FF0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F
-8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE000
-7F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0
-007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001F
-E0007F80FFFFC3FFFF0FFFFCFFFFC3FFFF0FFFFCFFFFC3FFFF0FFFFC3E207D9F43>I<03F007F8
-00FFF03FFE00FFF0783F00FFF0C03F800FF1801FC007F3001FC007F6001FE007FC001FE007FC00
-1FE007FC001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8
-001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007
-F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0FFFFC3FFFFFFFFC3FFFFFFFFC3FFFF
-28207D9F2D>I<0007FC0000007FFFC00001FC07F00003F001F80007E000FC000FC0007E001FC0
-007F003FC0007F803F80003F807F80003FC07F80003FC07F80003FC0FF80003FE0FF80003FE0FF
-80003FE0FF80003FE0FF80003FE0FF80003FE0FF80003FE0FF80003FE07F80003FC07F80003FC0
-7F80003FC03FC0007F803FC0007F801FC0007F000FE000FE0007E000FC0003F803F80001FE0FF0
-00007FFFC0000007FC000023207E9F28>I<01F83FE000FFF8FFFC00FFFBE07F00FFFF003F8007
-FE001FC007FC000FE007F8000FF007F80007F807F80007F807F80007FC07F80003FC07F80003FC
-07F80003FE07F80003FE07F80003FE07F80003FE07F80003FE07F80003FE07F80003FE07F80003
-FE07F80003FC07F80007FC07F80007FC07F80007F807F80007F807F8000FF007FC000FE007FE00
-1FC007FF003F8007FBC0FE0007F8FFF80007F83FC00007F800000007F800000007F800000007F8
-00000007F800000007F800000007F800000007F800000007F800000007F800000007F8000000FF
-FFC00000FFFFC00000FFFFC00000272E7E9F2D>I<03F03F00FFF07FC0FFF1C3E0FFF187E00FF3
-0FF007F60FF007F60FF007FC07E007FC03C007FC000007FC000007F8000007F8000007F8000007
-F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F80000
-07F8000007F8000007F8000007F8000007F80000FFFFE000FFFFE000FFFFE0001C207E9F21>
-114 D<01FF860007FFFE001F00FE003C003E0078001E0078000E00F8000E00F8000E00F8000E00
-FC000000FF800000FFFC00007FFFC0007FFFF0003FFFF8001FFFFC0007FFFE0001FFFF00003FFF
-000000FF8000003F8060001F80E0000F80E0000F80F0000F80F0000F00F8000F00FC001E00FE00
-1C00FF807800F3FFF000C07F800019207D9F20>I<001C0000001C0000001C0000001C0000001C
-0000003C0000003C0000003C0000007C0000007C000000FC000001FC000003FC000007FC00001F
-FFFE00FFFFFE00FFFFFE0003FC000003FC000003FC000003FC000003FC000003FC000003FC0000
-03FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC03
-8003FC038003FC038003FC038003FC038003FC038003FC038001FC038001FC070000FE0700007F
-0E00003FFC000007F000192E7FAD1F>I<01F80007E0FFF803FFE0FFF803FFE0FFF803FFE00FF8
-003FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007
-F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0
-07F8001FE007F8001FE007F8001FE007F8001FE007F8003FE007F8003FE003F8007FE003F8007F
-E001FC00DFF000FE039FFF007FFF1FFF000FFC1FFF28207D9F2D>I<FFFF801FFCFFFF801FFCFF
-FF801FFC0FF80003C007F800038007FC00078003FC00070003FE000F0001FE000E0001FF000E00
-00FF001C0000FF001C00007F803800007F803800007FC07800003FC07000003FE0F000001FE0E0
-00001FF1E000000FF1C000000FF9C0000007FB80000007FB80000003FF00000003FF00000003FF
-00000001FE00000001FE00000000FC00000000FC00000000780000000078000026207E9F2B>I<
-FFFF1FFFE07FF8FFFF1FFFE07FF8FFFF1FFFE07FF80FF000FE0007800FF800FE00078007F800FE
-00070007F8007F00070003FC007F000E0003FC00FF800E0003FE00FF801E0001FE00FF801C0001
-FE01DFC01C0001FF01DFC03C0000FF03DFE0380000FF838FE07800007F838FE07000007F8707F0
-7000007FC707F0F000003FCF07F8E000003FCE03F8E000001FEE03F9C000001FFC01FDC000001F
-FC01FFC000000FFC01FF8000000FF800FF80000007F800FF00000007F0007F00000007F0007F00
-000003F0007E00000003E0003E00000001E0003C00000001C0001C000035207E9F3A>I<7FFF80
-7FFC7FFF807FFC7FFF807FFC03FE000F0001FE001E0000FF003C0000FF807800007FC07800003F
-E0F000001FE1E000000FF3C000000FFF80000007FF00000003FE00000001FE00000000FF000000
-00FF80000000FFC0000001FFC0000003DFE00000078FF00000078FF800000F07FC00001E03FC00
-003C01FE00007800FF0000F000FF8000E0007FC001E0003FC0FFFC01FFFFFFFC01FFFFFFFC01FF
-FF28207F9F2B>I<FFFF801FFCFFFF801FFCFFFF801FFC0FF80003C007F800038007FC00078003
-FC00070003FE000F0001FE000E0001FF000E0000FF001C0000FF001C00007F803800007F803800
-007FC07800003FC07000003FE0F000001FE0E000001FF1E000000FF1C000000FF9C0000007FB80
-000007FB80000003FF00000003FF00000003FF00000001FE00000001FE00000000FC00000000FC
-000000007800000000780000000070000000007000000000F000000000E000000001E000007C01
-C00000FE03C00000FE03800000FE07800000FE0F000000FC1E000000787C0000003FF00000000F
-C0000000262E7E9F2B>I E /Fl 1 14 df<0001FE00000007FF8000001E01E000007800780000
-E0001C000180000600030000030006000001800C000000C00C000000C018000000603000000030
-30000000303000000030600000001860000000186000000018C00000000CC00000000CC0000000
-0CC00000000CC00000000CC00000000CC00000000CC00000000CC00000000C6000000018600000
-0018600000001830000000303000000030300000003018000000600C000000C00C000000C00600
-0001800300000300018000060000E0001C000078007800001E01E0000007FF80000001FE000026
-2B7DA02D>13 D E /Fm 46 122 df<3C007F00FF80FF80FFC0FFC0FFC07FC03EC000C000C00180
-018001800300030006000E001C00380030000A157B8813>44 D<1C007F007F00FF80FF80FF807F
-007F001C0009097B8813>46 D<000E00001E00007E0007FE00FFFE00FFFE00F8FE0000FE0000FE
-0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE
-0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE
-0000FE007FFFFE7FFFFE7FFFFE17277BA622>49 D<00FF800007FFF0000FFFFC001E03FE003800
-FF807C003F80FE003FC0FF001FC0FF001FE0FF000FE0FF000FE07E000FE03C001FE000001FE000
-001FC000001FC000003F8000003F0000007E000000FC000000F8000001F0000003E00000078000
-000F0000001E0000003C00E0007000E000E000E001C001C0038001C0060001C00FFFFFC01FFFFF
-C03FFFFFC07FFFFFC0FFFFFF80FFFFFF80FFFFFF801B277DA622>I<007F800003FFF00007FFFC
-000F80FE001F007F003F807F003F803F803F803F803F803F801F803F801F003F8000007F000000
-7F0000007E000000FC000001F8000007F00000FFC00000FFC0000001F80000007E0000003F0000
-003F8000001FC000001FC000001FE000001FE03C001FE07E001FE0FF001FE0FF001FE0FF001FC0
-FF003FC0FE003F807C007F003F00FE001FFFFC0007FFF00000FF80001B277DA622>I<00000E00
-00001E0000003E0000007E000000FE000000FE000001FE000003FE0000077E00000E7E00000E7E
-00001C7E0000387E0000707E0000E07E0000E07E0001C07E0003807E0007007E000E007E000E00
-7E001C007E0038007E0070007E00E0007E00FFFFFFF8FFFFFFF8FFFFFFF80000FE000000FE0000
-00FE000000FE000000FE000000FE000000FE000000FE00007FFFF8007FFFF8007FFFF81D277EA6
-22>I<180003001F801F001FFFFE001FFFFC001FFFF8001FFFF0001FFFC0001FFF00001C000000
-1C0000001C0000001C0000001C0000001C0000001C0000001C7FC0001DFFF8001F80FC001E003F
-0008003F0000001F8000001FC000001FC000001FE000001FE018001FE07C001FE0FE001FE0FE00
-1FE0FE001FE0FE001FC0FC001FC078003F8078003F803C007F001F01FE000FFFFC0003FFF00000
-FF80001B277DA622>I<380000003E0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07F
-FFFF807FFFFF0070000E0070000E0070001C00E0003800E0007000E000E0000001E0000001C000
-000380000007800000070000000F0000001F0000001E0000003E0000003E0000007E0000007C00
-00007C000000FC000000FC000000FC000000FC000001FC000001FC000001FC000001FC000001FC
-000001FC000001FC000000F80000007000001C297CA822>55 D<00000780000000000780000000
-000FC0000000000FC0000000000FC0000000001FE0000000001FE0000000003FF0000000003FF0
-000000003FF00000000077F80000000077F800000000F7FC00000000E3FC00000000E3FC000000
-01C1FE00000001C1FE00000003C1FF0000000380FF0000000380FF00000007007F80000007007F
-8000000F007FC000000E003FC000000E003FC000001C001FE000001C001FE000003FFFFFF00000
-3FFFFFF000003FFFFFF00000700007F80000700007F80000F00007FC0000E00003FC0000E00003
-FC0001C00001FE0001C00001FE0003C00001FF00FFFE003FFFFCFFFE003FFFFCFFFE003FFFFC2E
-297EA833>65 D<FFFFFFF800FFFFFFFF00FFFFFFFFC003F8001FE003F8000FF003F80007F803F8
-0003F803F80003FC03F80003FC03F80001FC03F80001FC03F80001FC03F80003FC03F80003F803
-F80003F803F80007F003F8000FF003F8001FC003F800FF8003FFFFFE0003FFFFFFC003F8000FF0
-03F80003F803F80001FC03F80001FE03F80000FE03F80000FE03F80000FF03F80000FF03F80000
-FF03F80000FF03F80000FF03F80000FF03F80000FE03F80001FE03F80003FC03F80007FC03F800
-1FF8FFFFFFFFE0FFFFFFFFC0FFFFFFFE0028297DA830>I<00007FE0030007FFFC07001FFFFF0F
-007FF00F9F00FF0001FF01FC0000FF03F800007F07F000003F0FE000001F1FC000001F1FC00000
-0F3F8000000F3F800000077F800000077F800000077F00000000FF00000000FF00000000FF0000
-0000FF00000000FF00000000FF00000000FF00000000FF00000000FF000000007F000000007F80
-0000007F800000073F800000073F800000071FC00000071FC000000E0FE000000E07F000001C03
-F800003C01FC00007800FF0001F0007FF007C0001FFFFF800007FFFE0000007FF00028297CA831
->I<FFFFFFFFE0FFFFFFFFE0FFFFFFFFE003FC001FE003FC0007F003FC0001F003FC0001F003FC
-0000F003FC00007003FC00007003FC00007003FC01C07803FC01C03803FC01C03803FC01C03803
-FC03C00003FC03C00003FC0FC00003FFFFC00003FFFFC00003FFFFC00003FC0FC00003FC03C000
-03FC03C00003FC01C00E03FC01C00E03FC01C00E03FC01C01C03FC00001C03FC00001C03FC0000
-1C03FC00003C03FC00003803FC00007803FC0000F803FC0001F803FC0003F803FC001FF8FFFFFF
-FFF0FFFFFFFFF0FFFFFFFFF027297EA82C>69 D<FFFFFFFFC0FFFFFFFFC0FFFFFFFFC003FC003F
-C003FC000FE003FC0003E003FC0001E003FC0001E003FC0000E003FC0000E003FC0000E003FC00
-00F003FC01C07003FC01C07003FC01C07003FC01C00003FC03C00003FC03C00003FC0FC00003FF
-FFC00003FFFFC00003FFFFC00003FC0FC00003FC03C00003FC03C00003FC01C00003FC01C00003
-FC01C00003FC01C00003FC00000003FC00000003FC00000003FC00000003FC00000003FC000000
-03FC00000003FC00000003FC000000FFFFFC0000FFFFFC0000FFFFFC000024297EA82A>I<0000
-7FE003000007FFFC0700001FFFFF0F00007FF00F9F0000FF0001FF0001FC0000FF0003F800007F
-0007F000003F000FE000001F001FC000001F001FC000000F003F8000000F003F80000007007F80
-000007007F80000007007F0000000000FF0000000000FF0000000000FF0000000000FF00000000
-00FF0000000000FF0000000000FF0000000000FF0000000000FF0000FFFFF87F0000FFFFF87F80
-00FFFFF87F800000FF003F800000FF003F800000FF001FC00000FF001FC00000FF000FE00000FF
-0007F00000FF0003F80000FF0001FC0000FF0000FF0001FF00007FF007FF00001FFFFF9F000007
-FFFE0F0000007FF003002D297CA835>I<FFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFF03FC0000
-3FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003
-FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC0000
-3FC003FC00003FC003FFFFFFFFC003FFFFFFFFC003FFFFFFFFC003FC00003FC003FC00003FC003
-FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC0000
-3FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003
-FC00003FC003FC00003FC0FFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFF30297EA835>I<FFFFFC
-FFFFFCFFFFFC01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE00
-01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE00
-01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE00FFFFFCFFFFFC
-FFFFFC16297FA819>I<FFFE0000003FFF80FFFE0000003FFF80FFFF0000007FFF8003FF000000
-7FE00003FF0000007FE00003BF800000EFE00003BF800000EFE000039FC00001CFE000039FC000
-01CFE000038FE000038FE000038FE000038FE000038FE000038FE0000387F000070FE0000387F0
-00070FE0000383F8000E0FE0000383F8000E0FE0000381FC001C0FE0000381FC001C0FE0000381
-FC001C0FE0000380FE00380FE0000380FE00380FE00003807F00700FE00003807F00700FE00003
-803F80E00FE00003803F80E00FE00003803F80E00FE00003801FC1C00FE00003801FC1C00FE000
-03800FE3800FE00003800FE3800FE000038007F7000FE000038007F7000FE000038007F7000FE0
-00038003FE000FE000038003FE000FE000038001FC000FE000038001FC000FE000038000F8000F
-E000FFFE00F803FFFF80FFFE00F803FFFF80FFFE007003FFFF8039297DA840>77
-D<FFFC00007FFFFFFE00007FFFFFFF00007FFF03FF800001C003FFC00001C003BFE00001C0039F
-E00001C0039FF00001C0038FF80001C00387FC0001C00383FE0001C00381FF0001C00380FF8001
-C003807F8001C003807FC001C003803FE001C003801FF001C003800FF801C0038007FC01C00380
-03FC01C0038003FE01C0038001FF01C0038000FF81C00380007FC1C00380003FE1C00380001FF1
-C00380000FF1C00380000FF9C003800007FDC003800003FFC003800001FFC003800000FFC00380
-00007FC0038000007FC0038000003FC0038000001FC0038000000FC00380000007C0FFFE000003
-C0FFFE000001C0FFFE000001C030297EA835>I<FFFFFFF800FFFFFFFF00FFFFFFFFC003FC003F
-E003FC0007F003FC0003F803FC0003FC03FC0001FC03FC0001FE03FC0001FE03FC0001FE03FC00
-01FE03FC0001FE03FC0001FE03FC0001FE03FC0001FC03FC0003FC03FC0003F803FC0007F003FC
-003FE003FFFFFF8003FFFFFE0003FC00000003FC00000003FC00000003FC00000003FC00000003
-FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC000000
-03FC00000003FC00000003FC000000FFFFF00000FFFFF00000FFFFF0000027297EA82E>80
-D<FFFFFFE00000FFFFFFFE0000FFFFFFFF800003FC003FE00003FC000FF00003FC0007F80003FC
-0003FC0003FC0001FC0003FC0001FE0003FC0001FE0003FC0001FE0003FC0001FE0003FC0001FE
-0003FC0001FE0003FC0001FC0003FC0003F80003FC0007F80003FC000FE00003FC003FC00003FF
-FFFE000003FFFFFE000003FC00FF800003FC003FC00003FC001FE00003FC000FF00003FC0007F8
-0003FC0007F80003FC0007F80003FC0007F80003FC0007F80003FC0007F80003FC0007F80003FC
-0007F80003FC0007F80003FC0007F80E03FC0007F80E03FC0003F80E03FC0001FC1CFFFFF000FE
-1CFFFFF0007FF8FFFFF0000FE02F297EA832>82 D<00FF00C003FFE1C00FFFF9C01F80FFC03F00
-3FC03E000FC07C0007C07C0007C0FC0003C0FC0003C0FC0001C0FE0001C0FE0001C0FF000000FF
-C000007FFC00007FFFE0003FFFF8001FFFFE001FFFFF0007FFFF8003FFFFC000FFFFC0000FFFE0
-00007FE000001FF000000FF0000007F0E00003F0E00003F0E00003F0E00003F0F00003E0F00003
-E0F80007E0FC0007C0FF000F80FFE01F80E3FFFF00E1FFFC00C01FF0001C297CA825>I<FFFFF0
-00FFFEFFFFF000FFFEFFFFF000FFFE03FC0000038003FC0000038003FC0000038003FC00000380
-03FC0000038003FC0000038003FC0000038003FC0000038003FC0000038003FC0000038003FC00
-00038003FC0000038003FC0000038003FC0000038003FC0000038003FC0000038003FC00000380
-03FC0000038003FC0000038003FC0000038003FC0000038003FC0000038003FC0000038003FC00
-00038003FC0000038003FC0000038003FC0000038003FC0000038001FC0000070001FE00000700
-00FE00000E00007F00000E00003F00003C00001FC0007800000FF003F0000007FFFFE0000000FF
-FF800000001FFC00002F297EA834>85 D<FFFFF0007FFFFFFFF0007FFFFFFFF0007FFF03FE0000
-01C001FE0000038001FE0000038000FF0000070000FF0000070000FF80000F00007F80000E0000
-7FC0000E00003FC0001C00003FE0001C00001FE0003800001FE0003800001FF0007800000FF000
-7000000FF800F0000007F800E0000007FC00E0000003FC01C0000003FC01C0000003FE03C00000
-01FE0380000001FF0780000000FF0700000000FF87000000007F8E000000007F8E000000007FDE
-000000003FDC000000003FFC000000001FF8000000001FF8000000000FF0000000000FF0000000
-000FF00000000007E00000000007E00000000003C00000000003C0000030297FA833>I<FFFFE0
-FFFFE01FFFC0FFFFE0FFFFE01FFFC0FFFFE0FFFFE01FFFC003FC0003FC0000700003FC0003FC00
-00700003FE0003FE0000F00001FE0001FE0000E00001FE0001FE0000E00001FF0001FF0001E000
-00FF0001FF0001C00000FF0001FF0001C000007F8003FF80038000007F8003FF80038000007FC0
-07FFC0078000003FC0073FC0070000003FC0073FC0070000003FE00F3FE00F0000001FE00E1FE0
-0E0000001FE00E1FE00E0000000FF01C0FF01C0000000FF01C0FF01C0000000FF01C0FF81C0000
-0007F83807F83800000007F83807F83800000007FC7807FC7800000003FC7003FC7000000003FC
-7003FC7000000003FEF003FEF000000001FEE001FEE000000001FEE001FEE000000000FFC000FF
-C000000000FFC000FFC000000000FFC000FFC0000000007F80007F80000000007F80007F800000
-00007F80007F80000000003F00003F00000000003F00003F00000000003F00003F00000000001E
-00001E00000000001E00001E00000042297FA845>I<03FF80000FFFF0001F01FC003F80FE003F
-807F003F803F003F803F801F003F8000003F8000003F8000003F8000003F80003FFF8001FC3F80
-0FE03F801F803F803F003F807E003F80FC003F80FC003F80FC003F80FC003F80FC005F807E00DF
-803F839FFC1FFE0FFC03F803FC1E1B7E9A21>97 D<FFE00000FFE00000FFE000000FE000000FE0
-00000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000F
-E000000FE1FE000FE7FF800FFE07E00FF803F00FF001F80FE000FC0FE000FC0FE0007E0FE0007E
-0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007E0FE000
-7E0FE0007E0FE000FC0FE000FC0FF001F80FF803F00F9C0FE00F0FFF800E01FC00202A7EA925>
-I<003FF00001FFFC0003F03E000FC07F001F807F003F007F003F007F007F003E007E0000007E00
-0000FE000000FE000000FE000000FE000000FE000000FE000000FE0000007E0000007E0000007F
-0000003F0003803F8003801F8007000FE00E0003F83C0001FFF800003FC000191B7E9A1E>I<00
-007FF000007FF000007FF0000007F0000007F0000007F0000007F0000007F0000007F0000007F0
-000007F0000007F0000007F0000007F0000007F0003F87F001FFF7F007F03FF00FC00FF01F8007
-F03F0007F03F0007F07E0007F07E0007F07E0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE00
-07F0FE0007F0FE0007F0FE0007F07E0007F07E0007F03F0007F03F0007F01F800FF00FC01FF007
-E07FFF01FFE7FF007F87FF202A7EA925>I<003FC00001FFF00003E07C000F803E001F801F001F
-001F003F000F807E000F807E000FC07E000FC0FE0007C0FE0007C0FFFFFFC0FFFFFFC0FE000000
-FE000000FE0000007E0000007E0000007F0000003F0001C01F0001C00F80038007C0070003F01E
-0000FFFC00003FE0001A1B7E9A1F>I<0007F8003FFC007E3E01FC7F03F87F03F07F07F07F07F0
-3E07F00007F00007F00007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007F00007F00007F0
-0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0
-0007F00007F00007F00007F00007F0007FFF807FFF807FFF80182A7EA915>I<007F80F001FFE3
-F807C0FE1C0F807C7C1F003E7C1F003E103F003F003F003F003F003F003F003F003F003F003F00
-3F001F003E001F003E000F807C0007C0F80005FFE0000C7F8000180000001C0000001C0000001E
-0000001FFFF8001FFFFF000FFFFFC007FFFFE003FFFFF00FFFFFF03E0007F07C0001F8F80000F8
-F80000F8F80000F8F80000F87C0001F07C0001F03F0007E00FC01F8007FFFF00007FF0001E287E
-9A22>I<FFE00000FFE00000FFE000000FE000000FE000000FE000000FE000000FE000000FE000
-000FE000000FE000000FE000000FE000000FE000000FE000000FE07E000FE1FF800FE30FC00FE4
-0FE00FE807E00FF807F00FF007F00FF007F00FE007F00FE007F00FE007F00FE007F00FE007F00F
-E007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F0
-0FE007F0FFFE3FFFFFFE3FFFFFFE3FFF202A7DA925>I<07000F801FC03FE03FE03FE01FC00F80
-07000000000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00F
-E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7EAA12>I<FF
-E0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0
-0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FF
-FEFFFEFFFE0F2A7EA912>108 D<FFC07F001FC000FFC1FFC07FF000FFC307E0C1F8000FC407F1
-01FC000FC803F200FC000FD803FE00FE000FD003FC00FE000FD003FC00FE000FE003F800FE000F
-E003F800FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F800
-FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F800FE000FE0
-03F800FE000FE003F800FE000FE003F800FE000FE003F800FE00FFFE3FFF8FFFE0FFFE3FFF8FFF
-E0FFFE3FFF8FFFE0331B7D9A38>I<FFC07E00FFC1FF80FFC30FC00FC40FE00FC807E00FD807F0
-0FD007F00FD007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007
-F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F0FFFE3FFFFFFE
-3FFFFFFE3FFF201B7D9A25>I<003FE00001FFFC0003F07E000FC01F801F800FC03F0007E03F00
-07E07E0003F07E0003F07E0003F0FE0003F8FE0003F8FE0003F8FE0003F8FE0003F8FE0003F8FE
-0003F8FE0003F87E0003F07E0003F03F0007E03F0007E01F800FC00FC01F8007F07F0001FFFC00
-003FE0001D1B7E9A22>I<FFE1FE00FFE7FF80FFFE0FE00FF803F00FF001F80FE001FC0FE000FC
-0FE000FE0FE000FE0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE000
-7F0FE0007E0FE000FE0FE000FE0FE000FC0FE001FC0FF001F80FF803F00FFC0FE00FEFFF800FE1
-FC000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00000FF
-FE0000FFFE0000FFFE000020277E9A25>I<FFC3E0FFC7F8FFCC7C0FD8FE0FD0FE0FD0FE0FF0FE
-0FE07C0FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE000
-0FE0000FE0000FE0000FE000FFFF00FFFF00FFFF00171B7E9A1B>114 D<03FE300FFFF03E03F0
-7800F07000F0F00070F00070F80070FE0000FFE0007FFF007FFFC03FFFE01FFFF007FFF800FFF8
-0007FC0000FCE0007CE0003CF0003CF00038F80038FC0070FF01E0E7FFC0C1FF00161B7E9A1B>
-I<00700000700000700000700000F00000F00000F00001F00003F00003F00007F0001FFFE0FFFF
-E0FFFFE007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0
-0007F00007F07007F07007F07007F07007F07007F07007F07003F0E001F8C000FFC0003F001426
-7FA51A>I<FFE07FF0FFE07FF0FFE07FF00FE007F00FE007F00FE007F00FE007F00FE007F00FE0
-07F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00F
-E007F00FE007F00FE007F00FE00FF00FE00FF007E017F003F067FF01FFC7FF007F87FF201B7D9A
-25>I<FFFE07FFFFFE07FFFFFE07FF07F000E007F000E007F801E003F801C003F801C001FC0380
-01FC038001FE078000FE070000FF0F00007F0E00007F0E00003F9C00003F9C00003FFC00001FF8
-00001FF800000FF000000FF000000FF0000007E0000007E0000003C0000003C000201B7F9A23>
-I<FFFC7FFC1FFCFFFC7FFC1FFCFFFC7FFC1FFC0FE00FE001C007F007E0038007F007E0038007F8
-07F0078003F807F0070003F807F8070001FC0FF80E0001FC0FF80E0001FE1FFC1E0000FE1CFC1C
-0000FE1CFE1C0000FF387E3C00007F387E3800007F787F3800003FF03F7000003FF03F7000003F
-E01FF000001FE01FE000001FE01FE000000FC00FC000000FC00FC000000FC00FC0000007800780
-000007800780002E1B7F9A31>I<FFFC1FFEFFFC1FFEFFFC1FFE07F0078003F8070001FC0F0001
-FE1E0000FE3C00007F7800003FF800003FF000001FE000000FE0000007F0000007F800000FF800
-001FFC00003DFE000038FF0000787F0000F03F8001E03FC003C01FE003800FE0FFF03FFFFFF03F
-FFFFF03FFF201B7F9A23>I<FFFE07FFFFFE07FFFFFE07FF07F000E007F000E007F801E003F801
-C003F801C001FC038001FC038001FE078000FE070000FF0F00007F0E00007F0E00003F9C00003F
-9C00003FFC00001FF800001FF800000FF000000FF0000007F0000007E0000007E0000003C00000
-03C000000380000003800000078000380700007C070000FE0E0000FE0E0000FE1C0000FE380000
-7C7000003FE000000F80000020277F9A23>I E /Fn 75 127 df<70F8F8F8F8F8F8F8F8F8F8F8
-F8F8F8F8F870000000000070F8F8F870051C779B18>33 D<4010E038F078E038E038E038E038E0
-38E038E038E038E038E03860300D0E7B9C18>I<030600078F00078F00078F00078F00078F0007
-8F007FFFC0FFFFE0FFFFE07FFFC00F1E000F1E000F1E000F1E000F1E000F1E007FFFC0FFFFE0FF
-FFE07FFFC01E3C001E3C001E3C001E3C001E3C001E3C000C1800131C7E9B18>I<00C00001C000
-01C00001C00003F0000FFC003FFE007DCF0071C700E1C380E1C780E1C780E1C780F1C00079C000
-3DC0001FE0000FF80003FC0001DE0001CF0001C70061C380F1C380F1C380E1C380E1C70071C700
-79DE003FFE001FF80007E00001C00001C00001C00000C00011247D9F18>I<3803007C07807C07
-80EE0F80EE0F00EE0F00EE1F00EE1E00EE1E00EE3E007C3C007C3C00387C0000780000780000F8
-0000F00001F00001E00001E00003E00003C00003C00007C0000783800787C00F87C00F0EE00F0E
-E01F0EE01E0EE01E0EE03E0EE03C07C03C07C018038013247E9F18>I<01C00007E0000FF0000E
-70001C38001C38001C38001C38001C73F01C73F01CE3F00FE3800FC7000F87000F07001F0E003F
-0E007B8E0073DC00E1DC00E0F800E0F800E07070E0787070FC707FFFE03FCFE00F03C0141C7F9B
-18>I<387C7C7E3E0E0E0E1C1C38F8F0C0070E789B18>I<007000F001E003C007800F001E001C00
-380038007000700070007000E000E000E000E000E000E000E000E0007000700070007000380038
-001C001E000F00078003C001F000F000700C24799F18>I<6000F00078003C001E000F00078003
-8001C001C000E000E000E000E00070007000700070007000700070007000E000E000E000E001C0
-01C0038007800F001E003C007800F00060000C247C9F18>I<01C00001C00001C00001C000C1C1
-80F1C780F9CF807FFF001FFC0007F00007F0001FFC007FFF00F9CF80F1C780C1C18001C00001C0
-0001C00001C00011147D9718>I<00600000F00000F00000F00000F00000F00000F00000F0007F
-FFC0FFFFE0FFFFE07FFFC000F00000F00000F00000F00000F00000F00000F00000600013147E97
-18>I<1C3E7E7F3F1F070E1E7CF860080C788518>I<7FFF00FFFF80FFFF807FFF0011047D8F18>
-I<3078FCFC78300606778518>I<000300000780000780000F80000F00001F00001E00001E0000
-3E00003C00007C0000780000780000F80000F00001F00001E00003E00003C00003C00007C00007
-80000F80000F00000F00001F00001E00003E00003C00003C00007C0000780000F80000F00000F0
-000060000011247D9F18>I<01F00007FC000FFE001F1F001C07003803807803C07001C07001C0
-E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C07001C07803C0
-3803801C07001F1F000FFE0007FC0001F000131C7E9B18>I<01800380038007800F803F80FF80
-FB80438003800380038003800380038003800380038003800380038003800380038003807FFCFF
-FE7FFC0F1C7B9B18>I<03F0000FFE003FFF007C0F807003C0E001C0F000E0F000E06000E00000
-E00000E00001C00001C00003C0000780000F00001E00003C0000780000F00001E00007C0000F80
-001E00E03C00E07FFFE0FFFFE07FFFE0131C7E9B18>I<001F00003F0000770000770000E70001
-E70001C7000387000787000707000E07001E07003C0700380700780700F00700FFFFF8FFFFF8FF
-FFF8000700000700000700000700000700000700007FF000FFF8007FF0151C7F9B18>52
-D<007E0001FF0007FF800F83C01E03C01C03C0380180380000700000700000E1F800E7FE00FFFF
-00FE0780F803C0F001C0F000E0E000E0F000E07000E07000E07000E03801C03C03C01E07800FFF
-0007FE0001F800131C7E9B18>54 D<3078FCFC783000000000000000003078FCFC783006147793
-18>58 D<183C7E7E3C180000000000000000183C7E7E3E1E0E1C3C78F060071A789318>I<0003
-00000780001F80003F00007E0001FC0003F00007E0001FC0003F00007E0000FC0000FC00007E00
-003F00001FC00007E00003F00001FC00007E00003F00001F8000078000030011187D9918>I<7F
-FFC0FFFFE0FFFFE0FFFFE0000000000000000000000000FFFFE0FFFFE0FFFFE07FFFC0130C7E93
-18>I<600000F00000FC00007E00003F00001FC00007E00003F00001FC00007E00003F00001F80
-001F80003F00007E0001FC0003F00007E0001FC0003F00007E0000FC0000F0000060000011187D
-9918>I<0FF0003FFC007FFF00700F00F00380F00380600780000F00003E00007C0001F00001E0
-0003C00003C00003C00003C00003C00003800000000000000000000000000000000003800007C0
-0007C00007C000038000111C7D9B18>I<00700000F80000F80000D80000D80001DC0001DC0001
-DC00018C00038E00038E00038E00038E000306000707000707000707000707000FFF800FFF800F
-FF800E03800E03801C01C01C01C07F07F0FF8FF87F07F0151C7F9B18>65
-D<7FF800FFFE007FFF001C0F801C03C01C03C01C01E01C00E01C00E01C00F01C00701C00701C00
-701C00701C00701C00701C00701C00701C00F01C00E01C00E01C01E01C01C01C03C01C0F807FFF
-00FFFE007FF800141C7F9B18>68 D<FFFFF0FFFFF0FFFFF01C00701C00701C00701C00701C0000
-1C00001C0E001C0E001C0E001FFE001FFE001FFE001C0E001C0E001C0E001C00001C00001C0038
-1C00381C00381C00381C0038FFFFF8FFFFF8FFFFF8151C7F9B18>I<FFFFE0FFFFE0FFFFE01C00
-E01C00E01C00E01C00E01C00001C00001C1C001C1C001C1C001FFC001FFC001FFC001C1C001C1C
-001C1C001C00001C00001C00001C00001C00001C00001C0000FFC000FFC000FFC000131C7E9B18
->I<7F07F0FF8FF87F07F01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01F
-FFC01FFFC01FFFC01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C07F
-07F0FF8FF87F07F0151C7F9B18>72 D<7FFF00FFFF807FFF0001C00001C00001C00001C00001C0
-0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0
-0001C00001C00001C00001C0007FFF00FFFF807FFF00111C7D9B18>I<7FE000FFE0007FE0000E
-00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E
-00000E00000E00000E00000E00700E00700E00700E00700E00707FFFF0FFFFF07FFFF0141C7F9B
-18>76 D<7E07F0FF0FF87F07F01D81C01D81C01D81C01DC1C01CC1C01CC1C01CE1C01CE1C01CE1
-C01C61C01C71C01C71C01C31C01C39C01C39C01C39C01C19C01C19C01C1DC01C0DC01C0DC01C0D
-C07F07C0FF87C07F03C0151C7F9B18>78 D<0FF8003FFE007FFF00780F00700700F00780E00380
-E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380
-E00380E00380F00780700700780F007FFF003FFE000FF800111C7D9B18>I<FFFE00FFFF80FFFF
-C01C03C01C01E01C00E01C00701C00701C00701C00701C00701C00E01C01E01C03C01FFFC01FFF
-801FFE001C00001C00001C00001C00001C00001C00001C00001C0000FF8000FF8000FF8000141C
-7F9B18>I<7FF800FFFE007FFF001C0F801C03801C03C01C01C01C01C01C01C01C03C01C03801C
-0F801FFF001FFE001FFE001C0F001C07001C03801C03801C03801C03801C03801C039C1C039C1C
-039C7F01F8FF81F87F00F0161C7F9B18>82 D<03F3801FFF803FFF807C0F80700780E00380E003
-80E00380E000007000007800003F00001FF00007FE0000FF00000F800003C00001C00000E00000
-E06000E0E000E0E001E0F001C0F80780FFFF80FFFE00E7F800131C7E9B18>I<7FFFF8FFFFF8FF
-FFF8E07038E07038E07038E0703800700000700000700000700000700000700000700000700000
-700000700000700000700000700000700000700000700000700000700007FF0007FF0007FF0015
-1C7F9B18>I<FF83FEFF83FEFF83FE1C00701C00701C00701C00701C00701C00701C00701C0070
-1C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00700E00E00F01E0
-0783C003FF8001FF00007C00171C809B18>I<FF07F8FF07F8FF07F81C01C01E03C00E03800F07
-80070700070700038E00038E0001DC0001DC0001DC0000F80000F8000070000070000070000070
-0000700000700000700000700000700001FC0003FE0001FC00151C7F9B18>89
-D<FFF8FFF8FFF8E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000
-E000E000E000E000E000E000E000E000E000E000E000E000E000E000FFF8FFF8FFF80D24779F18
->91 D<600000F00000F00000F800007800007C00003C00003C00003E00001E00001F00000F0000
-0F00000F800007800007C00003C00003C00003E00001E00001F00000F00000F800007800007800
-007C00003C00003E00001E00001E00001F00000F00000F8000078000078000030011247D9F18>
-I<FFF8FFF8FFF80038003800380038003800380038003800380038003800380038003800380038
-00380038003800380038003800380038003800380038003800380038FFF8FFF8FFF80D247F9F18
->I<018007C01FF07EFCF83EE00E0F067C9B18>I<7FFF00FFFF80FFFF807FFF0011047D7F18>I<
-061E3E387070E0E0E0F8FC7C7C38070E789E18>I<1FE0003FF8007FFC00781E00300E00000700
-00070000FF0007FF001FFF007F0700780700E00700E00700E00700F00F00781F003FFFF01FFBF0
-07E1F014147D9318>I<7E0000FE00007E00000E00000E00000E00000E00000E00000E3E000EFF
-800FFFC00FC1E00F80E00F00700E00700E00380E00380E00380E00380E00380E00380F00700F00
-700F80E00FC1E00FFFC00EFF80063E00151C809B18>I<01FE0007FF001FFF803E078038030070
-0000700000E00000E00000E00000E00000E00000E000007000007001C03801C03E03C01FFF8007
-FF0001FC0012147D9318>I<001F80003F80001F8000038000038000038000038000038003E380
-0FFB801FFF803C1F80380F80700780700380E00380E00380E00380E00380E00380E00380700780
-700780380F803C1F801FFFF00FFBF803E3F0151C7E9B18>I<01F00007FC001FFE003E0F003807
-80700380700380E001C0E001C0FFFFC0FFFFC0FFFFC0E000007000007001C03801C03E03C01FFF
-8007FF0001FC0012147D9318>I<001F80007FC000FFE000E1E001C0C001C00001C00001C0007F
-FFC0FFFFC0FFFFC001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001
-C00001C00001C00001C0007FFF007FFF007FFF00131C7F9B18>I<01E1F007FFF80FFFF81E1E30
-1C0E003807003807003807003807003807001C0E001E1E001FFC001FF80039E0003800001C0000
-1FFE001FFFC03FFFE07801F0700070E00038E00038E00038E000387800F07E03F01FFFC00FFF80
-01FC00151F7F9318>I<7E0000FE00007E00000E00000E00000E00000E00000E00000E3E000EFF
-800FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00
-E00E00E00E00E07FC3FCFFE7FE7FC3FC171C809B18>I<03800007C00007C00007C00003800000
-00000000000000000000007FC000FFC0007FC00001C00001C00001C00001C00001C00001C00001
-C00001C00001C00001C00001C00001C00001C00001C000FFFF00FFFF80FFFF00111D7C9C18>I<
-7FE000FFE0007FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E000
-00E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0007FFFC0
-FFFFE07FFFC0131C7E9B18>108 D<7CE0E000FFFBF8007FFFF8001F1F1C001E1E1C001E1E1C00
-1C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C
-001C1C1C007F1F1F00FFBFBF807F1F1F001914819318>I<7E3E00FEFF807FFFC00FC1C00F80E0
-0F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC3FC
-FFE7FE7FC3FC1714809318>I<01F0000FFE001FFF003E0F803803807001C07001C0E000E0E000
-E0E000E0E000E0E000E0F001E07001C07803C03C07803E0F801FFF000FFE0001F00013147E9318
->I<7E3E00FEFF807FFFC00FC1E00F80E00F00700E00700E00380E00380E00380E00380E00380E
-00380F00700F00700F80E00FC1E00FFFC00EFF800E3E000E00000E00000E00000E00000E00000E
-00000E00007FC000FFE0007FC000151E809318>I<01E38007FB801FFF803E1F80380F80700780
-700780E00380E00380E00380E00380E00380E00380700780700780380F803C1F801FFF800FFB80
-03E380000380000380000380000380000380000380000380003FF8003FF8003FF8151E7E9318>
-I<7F87E0FF9FF07FBFF803F87803F03003E00003C00003C0000380000380000380000380000380
-000380000380000380000380007FFE00FFFF007FFE0015147F9318>I<07F7003FFF007FFF0078
-0F00E00700E00700E007007C00007FE0001FFC0003FE00001F00600780E00380E00380F00380F8
-0F00FFFF00FFFC00E7F00011147D9318>I<0180000380000380000380000380007FFFC0FFFFC0
-FFFFC00380000380000380000380000380000380000380000380000380000380400380E00380E0
-0380E001C1C001FFC000FF80003E0013197F9818>I<7E07E0FE0FE07E07E00E00E00E00E00E00
-E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFC03FF
-FE01FCFC1714809318>I<7F8FF0FF8FF87F8FF01E03C00E03800E03800E038007070007070007
-0700038E00038E00038E00038E0001DC0001DC0001DC0000F80000F80000700015147F9318>I<
-FF8FF8FF8FF8FF8FF83800E03800E03800E01C01C01C01C01C71C01CF9C01CF9C01CD9C01CD9C0
-0DDD800DDD800DDD800D8D800F8F800F8F8007070015147F9318>I<7F8FF07F9FF07F8FF00707
-00078E00039E0001DC0001F80000F80000700000F00000F80001DC00039E00038E000707000F07
-807F8FF0FF8FF87F8FF015147F9318>I<7F8FF0FF8FF87F8FF00E01C00E03800E038007038007
-0700070700038700038600038E0001CE0001CE0000CC0000CC0000DC0000780000780000780000
-700000700000700000F00000E00079E0007BC0007F80003F00001E0000151E7F9318>I<3FFFF0
-7FFFF07FFFF07001E07003C0700780000F00001E00003C0000F80001F00003C0000780000F0070
-1E00703C0070780070FFFFF0FFFFF0FFFFF014147F9318>I<0007E0001FE0007FE000780000E0
-0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00001E0007FC000FF80
-00FF80007FC00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0
-0000E000007800007FE0001FE00007E013247E9F18>I<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0
-F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0600424769F18>I<7C0000FF0000FFC00003C000
-00E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000F000007FC0
-003FE0003FE0007FC000F00000E00000E00000E00000E00000E00000E00000E00000E00000E000
-00E00000E00003C000FFC000FF00007C000013247E9F18>I<060C1F1E3FBEFBF8F1F060C00F06
-7C9B18>I E /Fo 75 123 df<001F83E000F06E3001C078780380F8780300F030070070000700
-70000700700007007000070070000700700007007000FFFFFF8007007000070070000700700007
-007000070070000700700007007000070070000700700007007000070070000700700007007000
-07007000070070000700700007007000070070007FE3FF001D20809F1B>11
-D<003F0000E0C001C0C00381E00701E00701E0070000070000070000070000070000070000FFFF
-E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700
-E00700E00700E00700E00700E00700E07FC3FE1720809F19>I<003FE000E0E001C1E00381E007
-00E00700E00700E00700E00700E00700E00700E00700E0FFFFE00700E00700E00700E00700E007
-00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E007
-00E07FE7FE1720809F19>I<001F81F80000F04F040001C07C06000380F80F000300F00F000700
-F00F00070070000007007000000700700000070070000007007000000700700000FFFFFFFF0007
-007007000700700700070070070007007007000700700700070070070007007007000700700700
-070070070007007007000700700700070070070007007007000700700700070070070007007007
-00070070070007007007007FE3FE3FF02420809F26>I<7038F87CFC7EFC7E743A040204020402
-0804080410081008201040200F0E7E9F17>34 D<70F8FCFC74040404080810102040060E7C9F0D
->39 D<0020004000800100020006000C000C00180018003000300030007000600060006000E000
-E000E000E000E000E000E000E000E000E000E000E0006000600060007000300030003000180018
-000C000C000600020001000080004000200B2E7DA112>I<800040002000100008000C00060006
-000300030001800180018001C000C000C000C000E000E000E000E000E000E000E000E000E000E0
-00E000E000C000C000C001C001800180018003000300060006000C00080010002000400080000B
-2E7DA112>I<70F8FCFC74040404080810102040060E7C840D>44 D<FFC0FFC00A027F8A0F>I<70
-F8F8F87005057C840D>I<03F0000E1C001C0E00180600380700700380700380700380700380F0
-03C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C070
-03807003807003807807803807001806001C0E000E1C0003F000121F7E9D17>48
-D<018003800F80F380038003800380038003800380038003800380038003800380038003800380
-03800380038003800380038003800380038007C0FFFE0F1E7C9D17>I<03F0000C1C00100E0020
-0700400780800780F007C0F803C0F803C0F803C02007C00007C0000780000780000F00000E0000
-1C0000380000700000600000C0000180000300000600400C00401800401000803FFF807FFF80FF
-FF80121E7E9D17>I<03F0000C1C00100E00200F00780F80780780780780380F80000F80000F00
-000F00000E00001C0000380003F000003C00000E00000F000007800007800007C02007C0F807C0
-F807C0F807C0F00780400780400F00200E001C3C0003F000121F7E9D17>I<000600000600000E
-00000E00001E00002E00002E00004E00008E00008E00010E00020E00020E00040E00080E00080E
-00100E00200E00200E00400E00C00E00FFFFF0000E00000E00000E00000E00000E00000E00000E
-0000FFE0141E7F9D17>I<1803001FFE001FFC001FF8001FE00010000010000010000010000010
-000010000011F000161C00180E001007001007800003800003800003C00003C00003C07003C0F0
-03C0F003C0E00380400380400700200600100E000C380003E000121F7E9D17>I<007C00018200
-0701000E03800C07801C0780380300380000780000700000700000F1F000F21C00F40600F80700
-F80380F80380F003C0F003C0F003C0F003C0F003C07003C07003C0700380380380380700180700
-0C0E00061C0001F000121F7E9D17>I<4000007FFFC07FFF807FFF804001008002008002008004
-0000080000080000100000200000200000400000400000C00000C00001C0000180000380000380
-00038000038000078000078000078000078000078000078000078000030000121F7D9D17>I<03
-F0000C0C001006003003002001806001806001806001807001807803003E03003F06001FC8000F
-F00003F80007FC000C7E00103F00300F806003804001C0C001C0C000C0C000C0C000C0C0008060
-01802001001002000C0C0003F000121F7E9D17>I<03F0000E18001C0C00380600380700700700
-700380F00380F00380F003C0F003C0F003C0F003C0F003C07007C07007C03807C0180BC00E13C0
-03E3C0000380000380000380000700300700780600780E00700C002018001070000FC000121F7E
-9D17>I<70F8F8F8700000000000000000000070F8F8F87005147C930D>I<70F8F8F87000000000
-00000000000070F0F8F878080808101010202040051D7C930D>I<000100000003800000038000
-000380000007C0000007C0000007C0000009E0000009E0000009E0000010F0000010F0000010F0
-0000207800002078000020780000403C0000403C0000403C0000801E0000801E0000FFFE000100
-0F0001000F0001000F00020007800200078002000780040003C00E0003C01F0007E0FFC03FFE1F
-207F9F22>65 D<FFFFE0000F80380007801E0007801F0007800F0007800F8007800F8007800F80
-07800F8007800F8007800F0007801F0007801E0007803C0007FFF00007803C0007801E0007800F
-0007800F8007800780078007C0078007C0078007C0078007C0078007C00780078007800F800780
-0F0007801F000F803C00FFFFF0001A1F7E9E20>I<000FC040007030C001C009C0038005C00700
-03C00E0001C01E0000C01C0000C03C0000C07C0000407C00004078000040F8000000F8000000F8
-000000F8000000F8000000F8000000F8000000F8000000F8000000780000007C0000407C000040
-3C0000401C0000401E0000800E000080070001000380020001C0040000703800000FC0001A217D
-9F21>I<FFFFE0000F803C0007801E000780070007800380078003C0078001E0078001E0078001
-F0078000F0078000F0078000F8078000F8078000F8078000F8078000F8078000F8078000F80780
-00F8078000F8078000F0078000F0078000F0078001E0078001E0078003C0078003800780070007
-800E000F803C00FFFFE0001D1F7E9E23>I<FFFFFF000F800F0007800300078003000780010007
-800180078000800780008007800080078080800780800007808000078080000781800007FF8000
-078180000780800007808000078080000780800007800020078000200780002007800040078000
-4007800040078000C0078000C0078001800F800F80FFFFFF801B1F7E9E1F>I<FFFFFF000F800F
-000780030007800300078001000780018007800080078000800780008007800080078080000780
-800007808000078080000781800007FF8000078180000780800007808000078080000780800007
-800000078000000780000007800000078000000780000007800000078000000FC00000FFFE0000
-191F7E9E1E>I<000FE0200078186000E004E0038002E0070001E00F0000E01E0000601E000060
-3C0000603C0000207C00002078000020F8000000F8000000F8000000F8000000F8000000F80000
-00F8000000F8007FFCF80003E0780001E07C0001E03C0001E03C0001E01E0001E01E0001E00F00
-01E0070001E0038002E000E0046000781820000FE0001E217D9F24>I<FFF8FFF80F800F800780
-0F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007
-800F0007800F0007FFFF0007800F0007800F0007800F0007800F0007800F0007800F0007800F00
-07800F0007800F0007800F0007800F0007800F0007800F0007800F000F800F80FFF8FFF81D1F7E
-9E22>I<FFFC0FC007800780078007800780078007800780078007800780078007800780078007
-80078007800780078007800780078007800780078007800FC0FFFC0E1F7F9E10>I<0FFFC0007C
-00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C
-00003C00003C00003C00003C00003C00003C00003C00003C00203C00F83C00F83C00F83C00F038
-0040780040700030E0000F800012207E9E17>I<FFFE000FC00007800007800007800007800007
-800007800007800007800007800007800007800007800007800007800007800007800007800007
-800007800207800207800207800207800607800407800407800C07801C0F807CFFFFFC171F7E9E
-1C>76 D<FF80001FF80F80001F800780001F0005C0002F0005C0002F0005C0002F0004E0004F00
-04E0004F000470008F000470008F000470008F000438010F000438010F000438010F00041C020F
-00041C020F00041C020F00040E040F00040E040F00040E040F000407080F000407080F00040708
-0F000403900F000403900F000401E00F000401E00F000401E00F000E00C00F001F00C01F80FFE0
-C1FFF8251F7E9E2A>I<FF803FF807C007C007C0038005E0010005E0010004F001000478010004
-780100043C0100043C0100041E0100040F0100040F010004078100040781000403C1000401E100
-0401E1000400F1000400F1000400790004003D0004003D0004001F0004001F0004000F00040007
-00040007000E0003001F000300FFE001001D1F7E9E22>I<001F800000F0F00001C0380007801E
-000F000F000E0007001E0007803C0003C03C0003C07C0003E0780001E0780001E0F80001F0F800
-01F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0780001E07C0003E07C
-0003E03C0003C03C0003C01E0007800E0007000F000F0007801E0001C0380000F0F000001F8000
-1C217D9F23>I<FFFFE0000F80780007801C0007801E0007800F0007800F8007800F8007800F80
-07800F8007800F8007800F8007800F0007801E0007801C000780780007FFE00007800000078000
-000780000007800000078000000780000007800000078000000780000007800000078000000780
-0000078000000FC00000FFFC0000191F7E9E1F>I<001F800000F0F00001C0380007801E000F00
-0F000E0007001E0007803C0003C03C0003C07C0003E07C0003E0780001E0F80001F0F80001F0F8
-0001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0780001E0780001E07C0003E0
-3C0003C03C0F03C01E1087800E2047000F204F0007A03E0001E0380000F0F010001FB010000030
-10000038300000387000003FF000001FE000001FE000000FC0000007801C297D9F23>I<FFFF80
-000F80F0000780780007803C0007801E0007801E0007801F0007801F0007801F0007801F000780
-1E0007801E0007803C00078078000780F00007FF80000781C0000780E0000780F0000780700007
-807800078078000780780007807C0007807C0007807C0007807C0407807E0407803E040FC01E08
-FFFC0F10000003E01E207E9E21>I<07E0800C1980100780300380600180600180E00180E00080
-E00080E00080F00000F000007800007F00003FF0001FFC000FFE0003FF00001F800007800003C0
-0003C00001C08001C08001C08001C08001C0C00180C00380E00300F00600CE0C0081F80012217D
-9F19>I<7FFFFFE0780F01E0600F0060400F0020400F0020C00F0030800F0010800F0010800F00
-10800F0010000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F
-0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000
-0F0000001F800007FFFE001C1F7E9E21>I<FFFC3FF80FC007C007800380078001000780010007
-800100078001000780010007800100078001000780010007800100078001000780010007800100
-078001000780010007800100078001000780010007800100078001000780010007800100038002
-000380020001C0020001C0040000E008000070180000382000000FC0001D207E9E22>I<FFF003
-FE1F8000F80F0000600F800060078000400780004003C0008003C0008003C0008001E0010001E0
-010001F0010000F0020000F0020000F806000078040000780400003C0800003C0800003C080000
-1E1000001E1000001F3000000F2000000F20000007C0000007C0000007C0000003800000038000
-00038000000100001F207F9E22>I<FFF07FF81FF01F800FC007C00F00078003800F0007800100
-0F0007C00100078007C00200078007C00200078007C0020003C009E0040003C009E0040003C009
-E0040003E010F00C0001E010F0080001E010F0080001F02078080000F02078100000F020781000
-00F0403C10000078403C20000078403C20000078C03E2000003C801E4000003C801E4000003C80
-1E4000001F000F8000001F000F8000001F000F8000001E00078000000E00070000000E00070000
-000C000300000004000200002C207F9E2F>I<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0
-C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FEFE072D7CA10D>91
-D<080410082010201040204020804080408040B85CFC7EFC7E7C3E381C0F0E7B9F17>I<FEFE06
-060606060606060606060606060606060606060606060606060606060606060606060606060606
-06FEFE072D7FA10D>I<081020204040808080B8FCFC7C38060E7D9F0D>96
-D<1FE000303000781800781C00300E00000E00000E00000E0000FE00078E001E0E00380E00780E
-00F00E10F00E10F00E10F01E10781E103867200F83C014147E9317>I<0E0000FE00000E00000E
-00000E00000E00000E00000E00000E00000E00000E00000E00000E3E000EC3800F01C00F00E00E
-00E00E00700E00700E00780E00780E00780E00780E00780E00780E00700E00700E00E00F00E00D
-01C00CC300083E0015207F9F19>I<03F80E0C1C1E381E380C70007000F000F000F000F000F000
-F00070007000380138011C020E0C03F010147E9314>I<000380003F8000038000038000038000
-038000038000038000038000038000038000038003E380061B801C078038038038038070038070
-0380F00380F00380F00380F00380F00380F003807003807003803803803807801C07800E1B8003
-E3F815207E9F19>I<03F0000E1C001C0E00380700380700700700700380F00380F00380FFFF80
-F00000F00000F000007000007000003800801800800C010007060001F80011147F9314>I<007C
-00C6018F038F07060700070007000700070007000700FFF0070007000700070007000700070007
-0007000700070007000700070007000700070007007FF01020809F0E>I<0000E003E3300E3C30
-1C1C30380E00780F00780F00780F00780F00780F00380E001C1C001E380033E000200000200000
-3000003000003FFE001FFF800FFFC03001E0600070C00030C00030C00030C000306000603000C0
-1C038003FC00141F7F9417>I<0E0000FE00000E00000E00000E00000E00000E00000E00000E00
-000E00000E00000E00000E3E000E43000E81800F01C00F01C00E01C00E01C00E01C00E01C00E01
-C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFE7FC16207F9F19>I<1C
-003E003E003E001C000000000000000000000000000E007E000E000E000E000E000E000E000E00
-0E000E000E000E000E000E000E000E000E000E00FFC00A1F809E0C>I<00E001F001F001F000E0
-000000000000000000000000007007F000F0007000700070007000700070007000700070007000
-7000700070007000700070007000700070007000706070F060F0C061803F000C28829E0E>I<0E
-0000FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0FF00E
-03C00E03000E02000E04000E08000E10000E30000E70000EF8000F38000E1C000E1E000E0E000E
-07000E07800E03800E03C00E03E0FFCFF815207F9F18>I<0E00FE000E000E000E000E000E000E
-000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00
-0E000E000E000E00FFE00B20809F0C>I<0E1F01F000FE618618000E81C81C000F00F00E000F00
-F00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E
-00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E00FFE7FE7FE0
-23147F9326>I<0E3E00FE43000E81800F01C00F01C00E01C00E01C00E01C00E01C00E01C00E01
-C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFE7FC16147F9319>I<01F80007
-0E001C03803801C03801C07000E07000E0F000F0F000F0F000F0F000F0F000F0F000F07000E070
-00E03801C03801C01C0380070E0001F80014147F9317>I<0E3E00FEC3800F01C00F00E00E00E0
-0E00F00E00700E00780E00780E00780E00780E00780E00780E00700E00F00E00E00F01E00F01C0
-0EC3000E3E000E00000E00000E00000E00000E00000E00000E00000E0000FFE000151D7F9319>
-I<03E0800619801C05803C0780380380780380700380F00380F00380F00380F00380F00380F003
-807003807803803803803807801C0B800E138003E3800003800003800003800003800003800003
-80000380000380003FF8151D7E9318>I<0E78FE8C0F1E0F1E0F0C0E000E000E000E000E000E00
-0E000E000E000E000E000E000E000E00FFE00F147F9312>I<1F9030704030C010C010C010E000
-78007F803FE00FF00070803880188018C018C018E030D0608F800D147E9312>I<020002000200
-060006000E000E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E080E080E
-080E080E080610031001E00D1C7F9B12>I<0E01C0FE1FC00E01C00E01C00E01C00E01C00E01C0
-0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E03C00603C0030DC001F1FC
-16147F9319>I<FF83F81E01E01C00C00E00800E00800E00800701000701000382000382000382
-0001C40001C40001EC0000E80000E80000700000700000700000200015147F9318>I<FF9FE1FC
-3C0780701C0300601C0380200E0380400E0380400E03C0400707C0800704C0800704E080038861
-000388710003C8730001D0320001D03A0000F03C0000E01C0000E01C0000601800004008001E14
-7F9321>I<7FC3FC0F01E00701C007018003810001C20000E40000EC00007800003800003C0000
-7C00004E000087000107000303800201C00601E01E01E0FF07FE1714809318>I<FF83F81E01E0
-1C00C00E00800E00800E008007010007010003820003820003820001C40001C40001EC0000E800
-00E800007000007000007000002000002000004000004000004000F08000F08000F10000620000
-3C0000151D7F9318>I<3FFF380E200E201C40384078407000E001E001C00380078007010E011E
-011C0338027006700EFFFE10147F9314>I E /Fp 13 122 df<0000001FFC0000C000000003FF
-FFC001C00000001FFFFFF003C00000007FFFFFFC07C0000001FFFC00FE0FC0000007FFC0001F9F
-C000000FFE000007FFC000003FF8000003FFC000007FF0000000FFC00000FFE00000007FC00001
-FFC00000007FC00001FF800000003FC00003FF000000001FC00007FE000000001FC0000FFE0000
-00000FC0000FFC000000000FC0001FFC0000000007C0001FFC0000000007C0003FF80000000007
-C0003FF80000000003C0003FF80000000003C0007FF80000000003C0007FF80000000003C0007F
-F0000000000000007FF000000000000000FFF000000000000000FFF000000000000000FFF00000
-0000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF00000000000
-0000FFF000000000000000FFF000000000000000FFF000000000000000FFF000001FFFFFFF807F
-F000001FFFFFFF807FF000001FFFFFFF807FF800001FFFFFFF807FF800000001FFC0003FF80000
-0001FFC0003FF800000001FFC0003FF800000001FFC0001FFC00000001FFC0001FFC00000001FF
-C0000FFE00000001FFC0000FFE00000001FFC00007FF00000001FFC00003FF00000001FFC00001
-FF80000001FFC00001FFC0000001FFC00000FFE0000001FFC000007FF0000003FFC000003FFC00
-0003FFC000000FFF000007FFC0000007FFC0001FBFC0000001FFFC00FF1FC00000007FFFFFFE0F
-C00000001FFFFFF803C000000003FFFFE000C0000000001FFE00000000413D7BBB4C>71
-D<FFFFFFF803FFFFFFE0FFFFFFF803FFFFFFE0FFFFFFF803FFFFFFE0FFFFFFF803FFFFFFE0007F
-F0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF00000
-01FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC0
-00007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000007F
-F0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF00000
-01FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC0
-00007FFFFFFFFFFFC000007FFFFFFFFFFFC000007FFFFFFFFFFFC000007FFFFFFFFFFFC000007F
-F0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF00000
-01FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC0
-00007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000007F
-F0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF00000
-01FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000007FF0000001FFC0
-00007FF0000001FFC000007FF0000001FFC000007FF0000001FFC000FFFFFFF803FFFFFFE0FFFF
-FFF803FFFFFFE0FFFFFFF803FFFFFFE0FFFFFFF803FFFFFFE0433B7CBA4C>I<FFFFFFFE000000
-FFFFFFFE000000FFFFFFFE000000FFFFFFFE000000007FF000000000007FF000000000007FF000
-000000007FF000000000007FF000000000007FF000000000007FF000000000007FF00000000000
-7FF000000000007FF000000000007FF000000000007FF000000000007FF000000000007FF00000
-0000007FF000000000007FF000000000007FF000000000007FF000000000007FF000000000007F
-F000000000007FF000000000007FF000000000007FF000000000007FF000000000007FF0000000
-00007FF000000000007FF000000000007FF000000000007FF000000000007FF000000000007FF0
-00000000007FF000000780007FF000000780007FF000000780007FF000000780007FF000000780
-007FF000000F80007FF000000F00007FF000000F00007FF000000F00007FF000001F00007FF000
-001F00007FF000001F00007FF000003F00007FF000003F00007FF000007F00007FF00000FF0000
-7FF00001FF00007FF00003FF00007FF0000FFE00007FF0007FFE00FFFFFFFFFFFE00FFFFFFFFFF
-FE00FFFFFFFFFFFE00FFFFFFFFFFFE00313B7CBA3A>76 D<FFFFF0000007FFFFE0FFFFF8000007
-FFFFE0FFFFFC000007FFFFE0FFFFFE000007FFFFE0007FFE00000007E000007FFF00000003C000
-007FFF80000003C000007BFFC0000003C000007BFFE0000003C0000079FFE0000003C0000078FF
-F0000003C00000787FF8000003C00000783FFC000003C00000783FFE000003C00000781FFE0000
-03C00000780FFF000003C000007807FF800003C000007803FFC00003C000007803FFE00003C000
-007801FFE00003C000007800FFF00003C0000078007FF80003C0000078003FFC0003C000007800
-3FFE0003C0000078001FFF0003C0000078000FFF0003C00000780007FF8003C00000780003FFC0
-03C00000780003FFE003C00000780001FFF003C00000780000FFF003C000007800007FF803C000
-007800003FFC03C000007800003FFE03C000007800001FFF03C000007800000FFF03C000007800
-0007FF83C0000078000003FFC3C0000078000003FFE3C0000078000001FFF3C0000078000000FF
-F3C00000780000007FFBC00000780000003FFFC00000780000003FFFC00000780000001FFFC000
-00780000000FFFC000007800000007FFC000007800000003FFC000007800000003FFC000007800
-000001FFC000007800000000FFC0000078000000007FC0000078000000003FC000007800000000
-3FC00000FC000000001FC000FFFFFC0000000FC000FFFFFC00000007C000FFFFFC00000003C000
-FFFFFC00000003C000433B7CBA4C>78 D<FFFFFFF8001FFFFF80FFFFFFF8001FFFFF80FFFFFFF8
-001FFFFF80FFFFFFF8001FFFFF80007FF00000001F8000007FF00000000F0000007FF00000000F
-0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F000000
-7FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF000
-00000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F
-0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F000000
-7FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF000
-00000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F
-0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F000000
-7FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF000
-00000F0000007FF00000000F0000007FF00000000F0000003FF00000001E0000003FF00000001E
-0000003FF80000001E0000001FF80000003C0000001FF80000003C0000000FFC00000078000000
-07FC000000F800000007FE000001F000000003FF000003F000000001FF800007E000000000FFE0
-001FC0000000003FFC01FF80000000001FFFFFFE000000000007FFFFF8000000000000FFFFE000
-00000000000FFE00000000413C7CBA4A>85 D<003FFE00000001FFFFE0000007FFFFF800000FE0
-07FC00000FF001FE00001FF800FF00001FF8007F80001FF8007FC0001FF8003FC0000FF0003FE0
-0007E0003FE00003C0003FE0000000003FE0000000003FE0000000003FE0000000003FE0000000
-FFFFE000001FFFFFE000007FF83FE00003FF803FE00007FC003FE0000FF0003FE0001FE0003FE0
-003FE0003FE0007FC0003FE0007FC0003FE000FF80003FE000FF80003FE000FF80003FE000FF80
-003FE000FF80007FE0007FC0007FE0007FC000DFE0003FE0039FF0001FF80F0FFFE007FFFE0FFF
-E001FFF807FFE0003FE000FFE02B267DA52F>97 D<00FE00000000FFFE00000000FFFE00000000
-FFFE00000000FFFE0000000007FE0000000003FE0000000003FE0000000003FE0000000003FE00
-00000003FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE00000000
-03FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE01
-FF000003FE1FFFF00003FE7FFFFC0003FEFC03FE0003FFF000FF0003FFC0003F8003FF00001FC0
-03FE00001FE003FE00000FF003FE00000FF803FE00000FF803FE000007FC03FE000007FC03FE00
-0007FC03FE000007FE03FE000007FE03FE000007FE03FE000007FE03FE000007FE03FE000007FE
-03FE000007FE03FE000007FE03FE000007FE03FE000007FC03FE000007FC03FE000007FC03FE00
-000FFC03FE00000FF803FE00000FF003FE00001FF003FF00001FE003FF80003FC003FFC0007F80
-03F9E000FF0003F0FC07FE0003F07FFFF80003E01FFFE00003C003FE00002F3C7DBB36>I<01E0
-0007F8000FFC000FFC001FFE001FFE001FFE001FFE000FFC000FFC0007F80001E0000000000000
-0000000000000000000000000000000000000000000000000000000000FE00FFFE00FFFE00FFFE
-00FFFE0007FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE
-0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE
-0003FE0003FE0003FE0003FE00FFFFF0FFFFF0FFFFF0FFFFF0143D7DBC1A>105
-D<0001FFC00000000FFFF80000007FFFFF000000FF80FF800003FE003FE00007F8000FF0000FF0
-0007F8000FF00007F8001FE00003FC003FE00003FE003FE00003FE007FC00001FF007FC00001FF
-007FC00001FF007FC00001FF00FFC00001FF80FFC00001FF80FFC00001FF80FFC00001FF80FFC0
-0001FF80FFC00001FF80FFC00001FF80FFC00001FF80FFC00001FF807FC00001FF007FC00001FF
-007FC00001FF003FE00003FE003FE00003FE001FE00003FC001FF00007FC000FF00007F80007F8
-000FF00003FE003FE00000FF80FF8000007FFFFF0000000FFFF800000001FFC0000029267DA530
->111 D<01FC03F000FFFC0FFC00FFFC1FFF00FFFC3C3F80FFFC707F8007FCE0FFC003FCC0FFC0
-03FD80FFC003FD80FFC003FF807F8003FF003F0003FF001E0003FF00000003FE00000003FE0000
-0003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00
-000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE
-00000003FE00000003FE00000003FE000000FFFFFC0000FFFFFC0000FFFFFC0000FFFFFC000022
-267DA528>114 D<003FF07003FFFEF007FFFFF01FC01FF03F0003F03E0001F07C0001F07C0000
-F0FC0000F0FC0000F0FE0000F0FF000000FFC00000FFFC00007FFFF0003FFFFE003FFFFF801FFF
-FFC00FFFFFE003FFFFF000FFFFF8001FFFFC00007FFC000007FE700001FEF00000FEF000007EF8
-00007EF800007EFC00007EFC00007CFE0000FCFF0000F8FF8001F0FFF00FE0F9FFFFC0F07FFF00
-C01FF8001F267DA526>I<000F0000000F0000000F0000000F0000000F0000001F0000001F0000
-001F0000001F0000003F0000003F0000007F0000007F000000FF000001FF000003FF000007FF00
-001FFFFFF0FFFFFFF0FFFFFFF0FFFFFFF001FF000001FF000001FF000001FF000001FF000001FF
-000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001
-FF000001FF000001FF000001FF000001FF003C01FF003C01FF003C01FF003C01FF003C01FF003C
-01FF003C01FF003C00FF007800FF8078007F80F0003FC1E0001FFFC0000FFF800001FE001E377E
-B626>I<FFFFF001FFFCFFFFF001FFFCFFFFF001FFFCFFFFF001FFFC03FE00001F8003FF00001F
-0001FF00001E0001FF80003E0000FF80003C0000FF80003C00007FC0007800007FC0007800007F
-E000F800003FE000F000003FF001F000001FF001E000001FF803E000000FF803C000000FFC03C0
-000007FC0780000007FC0780000007FE0F80000003FE0F00000003FF1F00000001FF1E00000001
-FFBE00000000FFBC00000000FFFC000000007FF8000000007FF8000000007FF8000000003FF000
-0000003FF0000000001FE0000000001FE0000000000FC0000000000FC000000000078000000000
-0780000000000F80000000000F00000000001F00000000001E00000008003E0000007F003C0000
-007F007C000000FF8078000000FF80F8000000FF80F0000000FF81E00000007F07C00000007C1F
-800000003FFF000000001FFE0000000007F0000000002E377EA533>121
-D E end
-%%EndProlog
-%%BeginSetup
-%%Feature: *Resolution 300dpi
+%DVIPSParameters: dpi=300, compressed, comments removed
+%DVIPSSource: TeX output 1997.06.03:1139
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N
+/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id
+gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp
+add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add
+/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{
+dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1
+adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2
+idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
+putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
+adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
+{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
+adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
+chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
+}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict
+/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
+B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
+4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
+p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+TeXDict begin 40258431 52099146 1000 300 300 (history.dvi)
+@start /Fa 1 47 df<127012F8A212F012E005057B840E>46 D
+E /Fb 1 47 df<1238127C12FCA212F8127006067A8512>46 D E
+/Fc 25 123 df<EA1FC0EA7FF0EA7078EA2018EA001CA2EA07FC121FEA3C1C127012E0A3
+EA707C383FFF80EA0F8F11107E8F14>97 D<12FCA2121CA513F8EA1DFEEA1F07EA1E0300
+1C1380EB01C0A6EB0380001E1300EA1F0EEA1DFCEA0CF81217809614>I<EA03F8EA0FFE
+EA1C0EEA3804EA7000126012E0A412601270EA380EEA1C1EEA0FFCEA03F00F107E8F14>
+I<137EA2130EA5EA07CEEA0FFEEA1C3EEA301EEA700E12E0A61270EA301EEA383E381FEF
+C0EA07CF12177F9614>I<EA07E0EA0FF0EA1C38EA301CEA700CEAE00EA2EAFFFEA2EAE0
+0012601270EA380EEA1C1EEA0FFCEA03F00F107E8F14>I<13FCEA01FEEA038EEA070413
+00A3EA7FFE12FFEA0700ACEAFFF8A20F177F9614>I<EA07CF381FFF80EA383B38301800
+EA701CA3EA3018EA3838EA3FF0EA37C00070C7FCA2EA3FF86C7E487EEA700F38E00380A4
+38700700EA3C1EEA1FFCEA07F011197F8F14>I<12FCA2121CA51378EA1DFEEA1F86EA1E
+07121CAA38FF8FE0A21317809614>I<1206120FA21206C7FCA4B4FCA21207ACEAFFF8A2
+0D187C9714>I<12FCA2121CA5EBFF80A2EB1C005B5B5BEA1DC0EA1FE0A2EA1E70EA1C38
+133C131C7F38FF1F80A21117809614>107 D<EAFF80A21203B3EAFFFEA20F177E9614>I<
+EAFB8EEAFFDF383CF380A2EA38E3AA38FEFBE013791310808F14>I<EAFC78EAFDFEEA1F
+86EA1E07121CAA38FF8FE0A21310808F14>I<EA07C0EA1FF0EA3C78EA701CA2EAE00EA6
+EA701CEA783CEA3C78EA1FF0EA07C00F107E8F14>I<EAFCF8EAFDFEEA1F07EA1E03001C
+1380EB01C0A6EB0380001E1300EA1F0EEA1DFCEA1CF890C7FCA6B47EA21218808F14>I<
+EA03E7EA0FF7EA1C1FEA300F1270487EA6EA700F1230EA1C3FEA0FF7EA07C7EA0007A6EB
+3FE0A213187F8F14>I<EAFE1FEB7F80EA0EE3380F810090C7FCA2120EA8EAFFF0A21110
+7F8F14>I<EA0FD8EA3FF8EA603812C0A2EAF000EA7F80EA3FF0EA07F8EA001CEA600612
+E012F0EAF81CEAFFF8EACFE00F107E8F14>I<1206120EA4EA7FFC12FFEA0E00A8130EA3
+131CEA07F8EA01F00F157F9414>I<EAFC3FA2EA1C07AB131F380FFFE0EA03E71310808F
+14>I<38FE3F80A2383C1E00EA1C1CA36C5AA3EA0630EA0770A36C5AA311107F8F14>I<38
+FE3F80A238700700EA380EA3EA39CEA3EA1B6C121AA3EA1E7CA2EA0E3811107F8F14>I<
+EA7E3FA2EA1E3CEA0E78EA07705B12036C5A12037FEA0770EA0E781338487E38FE3F80A2
+11107F8F14>I<38FE3F80A2381C0E005BA2120E5BA212071330A2EA0370A25B1201A25B
+A3485A12730077C7FC127E123C11187F8F14>I<EA3FFF5AEA700E131C1338EA007013E0
+EA01C0EA0380EA0700120EEA1C0712381270B5FCA210107F8F14>I
+E /Fd 1 47 df<1270A212F0126004047D830B>46 D E /Fe 25
+122 df<EA07E0EA1C38EA381CEA300CEA700EEA6006A2EAE007AAEA6006A2EA700EEA30
+0CEA381CEA1C38EA07E010187F9713>48 D<12035AB4FC1207B3A2EA7FF80D187D9713>
+I<EA0F80EA1060EA2030EA4038EA803CEAC01C12E01240EA003C1338A21370136013C0EA
+018013001202EA040412081210EA3008EA3FF8127F12FF0E187E9713>I<EA01F8EA0704
+EA0C06EA180E123013001270126012E0EAE3E0EAE418EAE80CEAF00EEAE0061307A31260
+A2EA7006EA300EEA180CEA0C38EA07E010187F9713>54 D<1240EA7FFF13FEA2EA4004EA
+80081310A2EA00201340A21380120113005AA25A1206A2120EA5120410197E9813>I<EA
+07E0EA1818EA300CEA20061260A21270EA780CEA3E18EA1F30EA07C0EA03E0EA0CF8EA30
+7CEA601E130FEAC0071303A3EA6002EA2004EA1818EA07E010187F9713>I<EA07E0EA1C
+30EA3018EA700CEA600EEAE006A21307A31260EA700FEA3017EA1827EA07C7EA00071306
+130E130C12701318EA6030EA3060EA0F8010187F9713>I<39FFE1FFC0390E001C00AB38
+0FFFFC380E001CAC39FFE1FFC01A1A7F991D>72 D<EA0FC2EA1836EA200EEA600612C013
+02A3EAE0001270127EEA3FE0EA1FF8EA03FCEA007E130E130713031280A3EAC0021306EA
+E004EAD818EA87E0101A7E9915>83 D<EA1FC0EA38707FEA101C1200A2EA03FCEA1E1C12
+38127012E01480A2133CEA705F381F8F0011107F8F13>97 D<EA07F8EA1C1C1238EA7008
+13005AA612701304EA3808EA1C18EA07E00E107F8F11>99 D<133F1307A9EA03E7EA0C17
+EA180F487E127012E0A6126012706C5AEA1C373807C7E0131A7F9915>I<EA07C0EA1C30
+EA30181270EA600C12E0EAFFFCEAE000A41260EA7004EA3808EA1C18EA07E00E107F8F11
+>I<EA0FCF3818718038303000EA7038A4EA30306C5AEA2FC00060C7FCA21270EA3FF013
+FC6C7EEA600FEAC003A4EA6006EA381CEA07E011187F8F13>103
+D<12FC121CA9137CEA1D87381E0380A2121CAB38FF9FF0141A809915>I<1218123CA212
+181200A612FC121CAE12FF081A80990A>I<EAFC7CEA1D87381E0380A2121CAB38FF9FF0
+1410808F15>110 D<EA07E0EA1C38EA300CEA700EEA6006EAE007A6EA6006EA700EEA38
+1CEA1C38EA07E010107F8F13>I<EAFCFCEA1D07381E0380381C01C0A2EB00E0A6EB01C0
+1480381E0300EA1D06EA1CF890C7FCA6B47E1317808F15>I<EAFC78EA1D9CEA1E1C1308
+EA1C00ABEAFF800E10808F0F>114 D<EA1F20EA60E0EA402012C0A2EAF000127FEA3FC0
+EA1FE0EA00F0EA8070133012C01320EAF040EA8F800C107F8F0F>I<1208A41218A21238
+EAFFC0EA3800A81320A41218EA1C40EA07800B177F960F>I<38FF0F80383C0700EA1C06
+1304A26C5AA26C5AA3EA03A0A2EA01C0A36C5A11107F8F14>118
+D<38FE3F80383C1E00EA1C086C5AEA0F306C5A6C5A12017F1203EA0270487E1208EA181C
+EA381E38FC3FC012107F8F14>120 D<38FF0F80383C0700EA1C061304A26C5AA26C5AA3
+EA03A0A2EA01C0A36C5AA248C7FCA212E112E212E4127811177F8F14>I
+E /Ff 2 42 df<13E0EA01C0EA0380120713005A121EA2121C123CA212381278A3127012
+F0AE12701278A31238123CA2121C121EA27E7E13801203EA01C0EA00E00B2E7CA112>40
+D<12E012707E123C121C121E7EA27E1380A2120313C0A3120113E0AE13C01203A3138012
+07A213005AA2121E121C123C12385A5A0B2E7EA112>I E /Fg 27
+123 df<EB07F8EB7FFC3801FC0E3803F01F48485AEA0FC0A3141E140C91C7FCA2ECFF80
+B6FCA2380FC01FB2397FF8FFF0A21C237FA220>12 D<90380FFF80137F3801FC1F3803F0
+3FEA07E0EA0FC0141FA7B6FCA2380FC01FB2397FF8FFF0A21C237FA220>I<EA07FE381F
+FF80383F07E06D7E130180121E1200A2133FEA03FDEA1F81EA3E01127C12F8A4EA7C02EA
+7E0C391FF87F803807E03F19167E951C>97 D<B47EA2121FABEB87F0EBBFFCEBF03EEBC0
+1F9038800F8015C0140715E0A715C0A2140F15809038C01F00381E707E381C3FFC38180F
+E01B237EA220>I<EBFF80000713E0380F83F0EA1F03123E127E387C01E090C7FC12FCA6
+127C127EA2003E13186C1330380FC0603807FFC0C6130015167E9519>I<49B4FCA2EB00
+3FAB13FE3807FFBF380FC1FF48C67E003E7F127E127CA212FCA7127C127E123E6C5B380F
+81FF3907FF3FE0EA01FC1B237EA220>I<13FE3807FF80380F83C0381E01E0383E00F012
+7E007C13F8147812FCB512F8A200FCC7FCA3127CA26C1318A26C1330380F80E03803FFC0
+C6130015167E951A>I<EB1F80EBFFE03801F1F0EA03E31207EA0FC3EBC1E0EBC000A6EA
+FFFEA2EA0FC0B2EA7FFCA214237EA212>I<9038FE0F803903FF9FC0380F83E3381F01F3
+391E00F000003E7FA5001E5BEA1F01380F83E0380BFF80D808FEC7FC0018C8FCA2121C38
+1FFFE014FC6C13FF7E001F1480397C001FC00078130F00F81307A3007CEB0F806CEB1F00
+381F807E6CB45A000113E01A217F951D>I<B47EA2121FABEB83F0EB8FFCEB987EEBA03E
+EBC03FA21380AE39FFF1FFE0A21B237DA220>I<121E123FEA7F80A4EA3F00121EC7FCA6
+EAFF80A2121FB2EAFFF0A20C247EA30F>I<B47EA2121FABECFF80A2EC3C00143014E0EB
+81C00183C7FC1386139E13BE13FFEBDF80EB8FC01307806D7E6D7E130080147E39FFE1FF
+C0A21A237EA21E>107 D<EAFF80A2121FB3ADEAFFF0A20C237EA20F>I<3AFF03F803F890
+390FFE0FFE3A1F183F183F9039201F201F014001C01380A201801380AE3BFFF0FFF0FFF0
+A22C167D9531>I<38FF03F0EB0FFC381F187EEB203EEB403FA21380AE39FFF1FFE0A21B
+167D9520>I<13FF000713E0380F81F0381F00F8003E137C48133EA300FC133FA7007C13
+3E007E137E003E137C6C13F8380F81F03807FFE0C6130018167E951D>I<38FF87F0EBBF
+FC381FF07EEBC01F9038800F8015C0A2EC07E0A715C0140FA2EC1F8001C01300EBF07EEB
+BFFCEB8FE00180C7FCA8EAFFF0A21B207E9520>I<EBFE033807FF07380FC1CF381F00DF
+48137F007E7FA2127C12FCA7127EA2003E5B6C5BEA0FC13807FF3FEA00FC1300A8903801
+FFE0A21B207E951E>I<38FF0F80EB1FE0381F33F013631343A2EBC1E0EB8000ADEAFFF8
+A214167E9518>I<3807F980EA1FFFEA3807EA7003EAF001A26CC7FCB4FC13F8EA7FFE6C
+7E6C1380120738003FC0EAC007130312E0A200F0138038FC0F00EAEFFEEAC3F812167E95
+17>I<487EA41203A21207A2120F123FB5FCA2EA1F80ABEB8180A5380F830013C3EA07FE
+EA01F811207F9F16>I<38FF81FFA2381F803FAF5C5C380FC1BF3907FF3FE0EA01FC1B16
+7D9520>I<39FFF01FE0A2391FC00700000F1306EBE00E0007130C13F000035BA26C6C5A
+A26C6C5AA2EBFEE0EB7EC0137F6D5AA26DC7FCA2130EA21B167F951E>I<3AFFF3FF83FC
+A23A1F807C00E0D80FC014C08001E013010007017F1380A2D803F0EB0300ECCF8301F813
+87D801F913C61487D800FD13ECEBFF0315FC017F5BEB7E01013E5BEB3C00A20118136026
+167F9529>I<39FFF07FC0A2390FC01C006C6C5A6D5A00035B6C6C5A3800FD80137F91C7
+FC7F6D7E497EEB37E0EB67F013C33801C1F8380380FC48487E000E137F39FF81FFE0A21B
+167F951E>I<39FFF01FE0A2391FC00700000F1306EBE00E0007130C13F000035BA26C6C
+5AA26C6C5AA2EBFEE0EB7EC0137F6D5AA26DC7FCA2130EA2130CA25B1278EAFC3813305B
+EA69C0EA7F80001FC8FC1B207F951E>I<387FFFF0A2387C07E038700FC0EA601F00E013
+8038C03F005B137EC65A1201485AEBF030EA07E0120FEBC070EA1F80003F1360EB00E0EA
+7E03B5FCA214167E9519>I E /Fh 24 119 df<13E0A538F0E1E0EAFCE7387EEFC0381F
+FF00EA07FCEA01F0EA07FCEA1FFF387EEFC038FCE7E0EAF0E13800E000A513157D991A>
+42 D<1338137CA2136C13EEA313C6A2EA01C7A438038380A4380701C0A213FFA24813E0
+EA0E00A4481370387F01FC38FF83FE387F01FC171E7F9D1A>65 D<B512F8A3381C0038A5
+1400A2130EA3EA1FFEA3EA1C0EA390C7FCA3141CA5B512FCA3161E7E9D1A>69
+D<387FFFFCB5FC7E380E001CA51400A2EB0380A3EA0FFFA3EA0E03A390C7FCA8EA7FE012
+FF127F161E7F9D1A>I<38FF83FEA3381C0070AA381FFFF0A3381C0070AB38FF83FEA317
+1E7F9D1A>72 D<B51280A33801C000B3A6B51280A3111E7C9D1A>I<38FE03FE12FFA238
+1D8070A213C0121CA213E0A213601370A213301338A21318131CA2130C130EA21306A213
+071303A238FF81F0A21380171E7F9D1A>78 D<EA0FFE383FFF804813C0EA7C07EA700100
+F013E0EAE000B1EAF001A2007013C0EA7C07EA7FFF6C1380380FFE00131E7D9D1A>I<EA
+FFFC13FF1480381C07C0EB01E0EB00F01470A414F0EB01E0EB07C0381FFF801400148038
+1C07C01301EB00E0A514E214E7A338FF807EA21438181E7F9D1A>82
+D<3803F1C0EA0FFDEA3FFFEA7C0FEA700312E01301A390C7FC12701278123FEA1FF0EA07
+FE3800FF80EB0FC0EB01E013001470A2126012E0A214E0EAF00138FC03C0B5128000EF13
+00EAE3FC141E7D9D1A>I<387FFFFEB5FCA238E0380EA500001300B33803FF80A3171E7F
+9D1A>I<38FF01FEA3381C00706C13E0A2380701C0A213830003138013C700011300A2EA
+00EEA2137CA21338AA48B4FCA3171E7F9D1A>89 D<387FFFC0B512E0A26C13C013047D7E
+1A>95 D<EA1FF0EA3FFC487EEA780FEA300738000380A2137FEA07FF121FEA3F83EA7803
+127012E0A3EA7007EA780F383FFFFCEA1FFDEA07F016157D941A>97
+D<EBFF80000313C0000F13E0EA1F01383C00C04813001270A25AA51270A2007813707E38
+1F01F0380FFFE0000313C03800FE0014157D941A>99 D<EB1FC0A31301A6EA01F1EA07FD
+EA0FFFEA1E0FEA3C07EA7803EA700112E0A7EA7003A2EA3807EA3E0F381FFFFCEA07FDEA
+01F1161E7E9D1A>I<12FEA3120EA6133EEBFF80000F13C013C1EB80E01300120EAC38FF
+E3FE13E713E3171E7F9D1A>104 D<EA01C0487EA36C5AC8FCA5EA7FE0A31200AF387FFF
+80B512C06C1380121F7C9E1A>I<EAFE3EEBFF80B512C0EA0FC1EB80E01300120EAC38FF
+E3FE13E713E317157F941A>110 D<EA01F0EA07FCEA1FFF383E0F80EA3C07387803C0EA
+700138E000E0A6EAF001007013C0EA7803383C0780EA3E0F381FFF00EA07FCEA01F01315
+7D941A>I<387F81F838FF8FFC387F9FFE3803FE1EEBF80CEBE000A25B5BAAEA7FFFB5FC
+7E17157F941A>114 D<487E1203A6387FFFE0B5FCA238038000AA1470A43801C1E013FF
+6C1380EB3F00141C7F9B1A>116 D<38FE0FE0A3EA0E00AD1301EA0F033807FFFE7EEA00
+FC17157F941A>I<387FC7FC00FF13FE007F13FC380E00E0A3380701C0A338038380A338
+01C700A3EA00EEA3137CA2133817157F941A>I E /Fi 41 123 df<EB07FCEB3FFF9038
+FE0780D803F013C03807E00FA2EA0FC0A3EC030091C7FCA3EC7FE0B6FCA2380FC007B3A2
+39FFFC7FFEA21F267FA522>12 D<123C127E12FFA4127E123C08087C8711>46
+D<131C133C13FC12FFA21200B3AA387FFFFCA216237CA21F>49 D<48B4FC000713C0381E
+07F0383803F8386001FC387C00FE12FE14FF147FA2127C003813FFC7FC14FEA2EB01FC14
+F8EB03F0EB07E01480EB0F00131E5B1370EBE003EA01C038038007380700061206380FFF
+FE5A5A4813FCB5FCA218237DA21F>I<48B4FC000713E0381E03F0383801F8003C13FC38
+7E00FEA3123EEA1C01000013FCA2EB03F8EB07F0EB0FC03801FF00A2380007E0EB01F014
+F8EB00FC14FE14FFA21210127C12FEA214FEA2387C01FC007013F8383E07F0380FFFC000
+01130018237DA21F>I<14381478A214F81301130313071306130C131C13381330136013
+E0EA01C01380EA03005A120E5A12185A12705AB612C0A2390001F800A790387FFFC0A21A
+237EA21F>I<0018130C001F137CEBFFF814F014E014C01480EBFC000018C7FCA513FF00
+1B13E0381F03F0381C00F8000813FCC7127EA3147FA2127812FCA3147E5A006013FC1270
+383801F8381E07E03807FFC03801FE0018237DA21F>I<EB1FC0EB7FF03801F0383803E0
+0C3807803E000F137EEA1F005AA2007E133C1400A338FE3FC0EB7FF0EB80F800FF13FCEB
+007C147E5A147FA4127EA4003E137E123F6C137C380F80F83807C1F03803FFC038007F00
+18237DA21F>I<1230123C003FB512C0A215804814005C5C38600018A200E05B485B5CC6
+485AA249C7FC1306130EA25BA2133CA25BA213F8A41201A66C5A13601A257DA41F>I<14
+1CA2143EA3147FA24A7EA39038019FC0A29038031FE0140F01077FEB0607A2010C7F1403
+011C7FEB1801A2496C7EA2017FB5FCA29039E0007F8049133FA2484880151F00038190C7
+120FA2486E7ED8FFF090B51280A229257EA42E>65 D<B612E015FC3903F800FFED1FC0ED
+07E06F7E6F7E82150082A2167FA31780AA1700A316FEA24B5A5E4B5A4B5AED1FC0EDFF80
+B648C7FC15E029257EA42F>68 D<B7FCA23903F8007FED0F8015071503A21501A3ED00C0
+1406A21600A2140E141EEBFFFEA2EBF81E140E1406A21660A291C7FC16C0A415011503A2
+ED0F80153FB7FCA223257EA428>I<B612FEA23803F800151F8181A281A3ED01801403A2
+92C7FCA25C5C90B5FCA2EBF80F8080A491C8FCAAB512F0A221257EA427>I<B500E0B512
+E0A23B03F80003F800AF90B6FCA29038F80003B0B500E0B512E0A22B257EA430>72
+D<B512E0A23803F800B3AFB512E0A213257EA417>I<B512F0A2D803F8C7FCB3A31503A3
+1506A3150EA2151E153E157CEC03FCB6FCA220257EA425>76 D<D8FFF8EDFFF86D5C0003
+EEFE00017EEC037EA36D1406A26D6C130CA26D6C1318A26D6C1330A36D6C1360A26D6C13
+C0A2903900FC0180A291387E0300A3EC3F06A2EC1F8CA2EC0FD8A2EC07F0A36E5AEA0780
+3CFFFC01C01FFFF8A235257EA43A>I<01FF1380000713E3380F80F7381E001F48130F48
+1307140312F81401A27E91C7FCB4FCEA7FE013FE383FFFE014F86C13FE00077F6C1480C6
+7E010313C0EB003FEC0FE01407A200C01303A315C07E6C13076C14806CEB0F0038FFC03E
+38E3FFF838803FE01B257DA422>83 D<B53B81FFFE01FFF0A23D07F0001FC0000F007013
+066C6C010F5CA26F7E6C6C5EA26D496C1338000017304B7E017F01195CA291388030FE01
+3F5E829139C0607F01011F5E03E0138190280FE0C03F83C7FCA29139F1801FC3010715C6
+17E69139FB000FEE010315EC02FF14FC6D486D5AA24A130301005DA24A130102785CA202
+306D5A3C257FA43F>87 D<EA07FF001F13E0383E03F0383F00F880147E121EC7FCA3EB1F
+FE3803FE7EEA0FC0EA1F00123E127E5AA314BEEA7E01383F073E391FFE1FE03807F00F1B
+187E971E>97 D<EAFFC0A2120FACEBC1FCEBCFFF9038FC0FC09038F007E09038C003F0A2
+EC01F8A215FCA815F8A2EC03F013E09038F007E090381C1F80390E0FFF00380C03F81E26
+7FA522>I<EB7FE03803FFF83807C07C381F80FC13005A007E1378140012FEA8127E127F
+6C130CEA1F80EBC0183807E0703803FFE038007F0016187E971B>I<ECFFC0A2140FAC13
+7F3803FFCF380FE0FF381F803F383F000FA2127EA212FEA8127EA27E141F381F803F380F
+C0EF3903FFCFFC3800FE0F1E267EA522>I<137F3803FFC03807C1F0380F80F8EA1F0048
+137C127E147E12FEA2B512FEA248C7FCA3127EA214067E6C130C380F80183807E0703803
+FFE038007F8017187E971C>I<EB1FC0EB7FF0EA01F83803E1F8120713C1380FC0F01400
+A7B5FCA2EA0FC0B3A2EAFFFEA215267EA513>I<3901FF07C00007EBDFE0380F83F1EA1F
+01393E00F800007E7FA6003E5B6C485A380F83E0EBFFC0001190C7FC0030C8FCA2123812
+3C383FFFE06C13FC806C7F481480383C003F48EB0FC000F81307A4007CEB0F806CEB1F00
+381F807E3807FFF8C613C01B247E971F>I<EAFFC0A2120FAC14FE9038C3FF809038CE0F
+C013D89038D007E013E0A213C0AF39FFFC7FFEA21F267EA522>I<120FEA1F80EA3FC0A4
+EA1F80EA0F00C7FCA7EA7FC0A2120FB3A2EAFFF8A20D277EA611>I<EAFFC0A2120FB3B0
+EAFFFCA20E267EA511>108 D<26FF80FE137F903A83FF81FFC03B0F8E0FC707E0019813
+CC903A9007E803F001A013F0A201C013E0AF3BFFFC7FFE3FFFA230187E9733>I<38FF80
+FE903883FF80390F8E0FC0139890389007E013A0A213C0AF39FFFC7FFEA21F187E9722>
+I<EB7F803803FFF03807C0F8381F807E48487EA2007EEB1F80A200FE14C0A8007E1480A2
+6CEB3F00A2381F807E6C6C5A3803FFF038007F801A187E971F>I<38FFC1FCEBCFFF390F
+FC1FC09038F007E001C013F0140315F8140115FCA8EC03F8A215F0EBE0079038F00FE090
+38DC1F809038CFFF00EBC3F801C0C7FCA9EAFFFCA21E237F9722>I<38FF83E0EB8FF838
+0F8C7CEB90FC13B013A01478EBE0005BAEEAFFFEA216187F9719>114
+D<3807F8C0EA1FFFEA3C07EA7001EAF000A300FC1300B47EEA7FFC7F383FFF80000F13C0
+120338001FE01303EAC001A212E014C0EAF00338FC078038EFFF00EAC3FC13187E9718>
+I<13C0A41201A312031207120F121FB512C0A2380FC000AC1460A63807E0C013E13801FF
+8038007E0013237FA218>I<39FFC07FE0A2000F1307B0140FA200071317EBE0673903FF
+C7FE38007F071F187E9722>I<39FFF80FF8A2390FC001C015803907E00300A26D5A0003
+1306EBF80E0001130C13FC00005B13FEEB7E30A26D5AA214E06D5AA26D5AA26DC7FCA21D
+187F9720>I<39FFF83FF0A2390FC00F003807E00E6C6C5A6D5A6C6C5A00001360EB7EC0
+6D5AA2131F6D7E497E80EB33F81361EBE0FC3801C07E3803807F3907003F8048131F39FF
+C07FF8A21D187F9720>120 D<39FFF80FF8A2390FC001C015803907E00300A26D5A0003
+1306EBF80E0001130C13FC00005B13FEEB7E30A26D5AA214E06D5AA26D5AA26DC7FCA213
+06A25B1230EA781CEAFC185B1370EA68E0EA7FC0001FC8FC1D237F9720>I<387FFFF8A2
+387C03F0EA700738600FE000E013C0EB1F80EAC03F1400137EEA00FE5B485A0003130C13
+F0EA07E0120FEBC01C381F8018003F1338387F0078387E01F8B5FCA216187E971B>I
+E /Fj 31 122 df<903803F07C90381E0DC69038380F0FEB701E01E0130EEC0C003801C0
+1CA548485A007FB512C03903803800A448485AA6000E5BA648485A001E7F38FF8FFC2020
+7E9F1B>11 D<EB03E0EB1C181338EB703C13E014383801C000A5485A387FFFF038038070
+A4380700E0A6380E01C0A6381C0380001E13C038FF0FF016207E9F19>I<903803F03F90
+391E09E0809039380F80C09039701F01E0EBE03E021E13C02601C01CC7FCA548485A007F
+B612803903803803A43A0700700700A6000EEBE00EA64848485A001EEBE01E3AFF8FF8FF
+C023207E9F26>14 D<13201360A4383061C0383C4380380E4E00EA0778EA01E0A2EA07B8
+EA1C9CEA708FEAE083EA0180A490C7FC12147AA117>42 D<EAFFF0A20C027E8A0F>45
+D<13181338EA01F8EA0E701200A513E0A6EA01C0A6EA0380A6EA07001380EAFFFC0E1E7B
+9D17>49 D<EB3F80EBC1E038010070000213785AA2000F137C1380A2EB00781206C712F8
+14F0EB01E014C0EB0380EB0700130E5B5B13605B485A380300201206000813405A383FFF
+C0481380B5FC161E7E9D17>I<13FFEA01FE1380A5EA0300A61206A65AA65AA65AA65AA6
+B4FCA2102D7EA10D>91 D<13FFEA01FEEA0006A5130CA61318A61330A61360A613C0A6EA
+0180A6EAFF00A2102D82A10D>93 D<EA07F8EA0C0CEA1E061307121C1200A313FFEA07C7
+EA1E07EA3C0E127800F01310A3131EEB2E2038784F40381F878014147D9317>97
+D<13FEEA0383380E0780121C0038130090C7FC12785AA45AA37E5BEA70026C5AEA1C18EA
+07E011147D9314>99 D<1438EB01F8EB00781438A21470A614E013FCEA0382EA0601121C
+EA3C00383801C0127812F0A438E00380A412F0EA700738380F00381C37803807C7E01520
+7D9F19>I<13F8EA070EEA0E07121C383803801278127012F0A2B5FC00F0C7FC5AA46C5A
+EA7002EA3004EA1C18EA07E011147D9314>I<EB07C0EB1C60EB30F01360EBE0E0EBC000
+1201A5485AEA3FFCEA0380A448C7FCA6120EA65A121EEAFFC014207F9F0E>I<140EEB3E
+11EBE1A33801C1C2380381E0EA07801301120FA3380703C01480EB8700EA04FC48C7FCA2
+1218121CEA0FFF14C014E0381800F04813305A5AA3006013606C13C0381C0700EA07FC18
+1F809417>I<13E0120712011200A2485AA6485AEB8F80EB90E013A0EBC0601380000713
+E01300A5380E01C0A6381C0380001E13C038FF8FF014207E9F19>I<EA01C0EA03E0A213
+C0EA0180C7FCA6EA0380121F12071203A2EA0700A6120EA65A121EEAFF800B1F7F9E0C>
+I<13E0120712011200A2EA01C0A6EA0380A6EA0700A6120EA65A121EEAFF800B207F9F0C
+>108 D<390387C07C391F9861863907A072073903C03403EB80380007EB7807EB0070A5
+000EEBE00EA64848485A001EEBE01E3AFFCFFCFFC022147E9326>I<38038F80381F90E0
+EA07A03803C0601380000713E01300A5380E01C0A6381C0380001E13C038FF8FF014147E
+9319>I<13FCEA0387380E0180381C00C04813E0A24813F012F0A438E001E0A214C01303
+00F0138038700700EA380E6C5AEA07E014147D9317>I<EBE3E03807EC383800F01C497E
+140F48487E1580A53903800F00A2140E141E141C5C38074070EB61C0011FC7FC90C8FCA3
+120EA4121EEAFFC0191D809319>I<EBFC2038038260EA0702381E01E0123C003813C012
+7812F0A438E00380A212F0A21307127038380F00EA1C37EA07C7EA0007A3130EA4131EEB
+FFC0131D7D9318>I<EA038E381FB380EA07C71203EB8300EA078090C7FCA5120EA65A12
+1EEAFFC011147E9312>I<EA01F9EA0607EA080312181301EA3802EA3C00121F13F0EA07
+FCEA01FEEA001FEA40071303A212601306EAF004EAC818EA87E010147F9312>I<1380EA
+0100A35A5A5A121EEAFFF8EA0E00A45AA65A1310A41320A2EA1840EA0F800D1C7C9B12>
+I<381C0380EAFC1FEA3C07EA1C03A238380700A6EA700EA4131EA25BEA305E381F9F8011
+147B9319>I<38FF83F8381E00E0001C13C01480121E380E01005B13025B12075BA25BEA
+039013A013E05B5B120190C7FC15147C9318>I<39FF9FE1FC393C078070391C03006014
+8015401580EA0E0790380D81001309EB19C21311380F21C4EA0720EB40C814E8EB80F0A2
+6C485A1460000213401E147C9321>I<381FF0FF3803C0780001137014403800E0C0EBE1
+80EB73001376133CA2131C132E134E1387EA0107380203801204380C01C0383C03E038FE
+07FC18147F9318>I<390FF83F803901E00E00EBC00C140813E000005B143014205C1370
+5CA20171C7FC1339133A133E133C133813181310A25BA25BEA70C0EAF08000F1C8FC12E6
+1278191D809318>I E /Fk 36 122 df<EB01C01303130F137FEA1FFFB5FC13BFEAE03F
+1200B3B1007FB512F0A31C2E7AAD28>49 D<EB3FE03801FFFE0007EBFF80D80F8013C039
+1E003FE00038EB1FF0007CEB0FF8007EEB07FCB4FC018013FEA21403A2EA7F00003E1307
+C7FC15FCA2EC0FF8A215F0EC1FE015C0EC3F80EC7F00147E14F8495A495A495A49C7FC01
+1E130E5B133849131E49131C485A48C7123C48B512FC5A5A5A4814F8B6FCA31F2E7CAD28
+>I<1578A215FCA34A7EA24A7EA24A7FA34A7FEC0E7F021E7FEC1C3FA202387F151F0278
+7FEC700FA202E07F1507010180ECC003A249486C7EA201078191C7FC498191B6FCA24981
+011CC7123F013C810138141FA24981160F01F081491407A2484881486C1403B549B512FC
+A336317DB03D>65 D<B712C016FC16FFD801FEC77FEE7FE0707E161F707EA2831607A416
+0FA25FA24C5A4C5A4C5A4B485ADB1FFEC7FC90B65AEEFF8049C7EA3FE0EE0FF0EE07FCA2
+707E83821880A718005E5F16074C5A4C5AEEFFF0B812C094C7FC16F831317DB039>I<91
+3A03FF800180023FEBF00349B5EAFC0701079038003F0FD91FF8EB079FD93FC0EB01FFD9
+FF807F4848C8127F4848153F0007161F49150F485A001F1607A2485A1703127FA24992C7
+FCA212FFA9127FA27FEF0380123FA26C7E1707000F17006C7E6D150E0003161E6C6C151C
+6C6C6C1478D93FC05CD91FF8EB03E0D907FFEB3F800101D9FFFEC7FCD9003F13F8020313
+8031317CB03A>I<B812E0A3C6903880007FEE0FF016031601A21600A21770A31738A215
+07A21700A35D5D5D91B5FCA3EC803F818181A592C8FCACB612C0A32D317EB033>70
+D<DA03FF1303027FEBF00749B5EAFC0F01079038007E1FD91FF0EB0FBFD97FC0EB03FF49
+487F4848C87E485A0007824848815B001F82A2484881A2127FA24992C7FC12FFAA0307B5
+12F8127F7FDB00011300123FA26C7EA2120F7F6C7E12036C7E6C6C7E6D6C5BD91FF8497E
+D907FFEB3E3F01019038FFFC1F6D6CEBF00F0203EB800335317CB03F>I<B6D8807FB512
+C0A3C60180C7387FC000B391B7FCA30280C7127FB3A3B6D8807FB512C0A33A317EB03F>
+I<B61280A3C6EB8000B3B3A7B61280A319317EB01E>I<B56C49B512C08080C66D903900
+03E0006E6E5AEBEFFC13E780EBE3FF01E17F01E07F6E7E143F816E7E6E7E6E7E14036E7E
+16806E13C0ED7FE0ED3FF0151F16F8ED0FFCED07FEED03FF6F13818117C1EE7FE1EE3FF1
+EE1FF9EE0FFD160717FF828282177F173FA2171F170F486C1507B500E014031701A23A31
+7EB03F>78 D<B712E016FEEEFF80C6D9800013E0EE3FF0EE0FF8EE07FCA2EE03FEA217FF
+A717FEA2EE07FC17F8160FEE3FE0EEFFC091B6120016F80280C8FCB3A2B67EA330317EB0
+37>80 D<007FB8FCA39039C00FF801D87E00EC003F007C82007882A200708200F01780A3
+481603A5C792C7FCB3AA017FB6FCA331307DAF38>84 D<B6D88003B51280A3C60180C738
+07C000715AB3AE137F4DC7FC80013F150EA26D6C5C6D6C5C6D6C5C6D6C495A903A00FF80
+1FC0023FB55A020F49C8FC020013E039317EB03E>I<B500FC91B5FCA3000390C8EA03C0
+6C17806E14076C170080017F150EA26E141E013F151C6E143C011F153880010F5D800107
+5DA26E130101035D6E13036D5D15806D4AC7FCA26F5A027F130EEDE01E023F131CEDF03C
+021F133815F8020F5BA2EDFCF002075B15FF6E5BA26E5BA26E90C8FCA3157EA2153CA238
+317EB03D>I<EBFFF0000313FF390F803F809038C00FE0486C6C7EA26E7ED80FC07FEA07
+80C7FCA414FF131FEBFFE33803FC03EA0FF0EA1FC0123FEA7F80A2EAFF00A31407A2387F
+800D393FC01DFE3A1FE078FFF03907FFE07FC6EB803F24207E9F27>97
+D<EA01F812FFA3120F1207ADEC3FE0ECFFFC9038FBE07F9039FF001F8049EB0FC04914E0
+49EB07F016F8A2ED03FCA316FEA816FCA3ED07F8A216F06DEB0FE06D14C001E7EB3F8090
+39C3C0FE00903880FFF89038003FC027327EB12D>I<EB0FFF017F13C03901FC01F03803
+F0033907E007F8120FEA1FC0003FEB03F0EC01E04848C7FCA312FFA8127FA36C6C131CA2
+001F14386C7E000714703903F001E03901FC07C039007FFF00EB0FF81E207D9F24>I<ED
+0FC0EC07FFA3EC007F153FADEB07F8EB3FFF9038FE07BF3903F801FF3907E0007F120F48
+48133F123FA2485AA312FFA8127FA36C7EA2121F6C6C137F000714FF2603F00313E03A01
+FC0F3FFE38007FFEEB0FF027327DB12D>I<EB0FFC90387FFF803901FC0FC03903F003E0
+3907E001F0000F14F8391FC000FC003F14FEA24848137E157FA212FFA290B6FCA20180C7
+FCA4127FA36C6C1307121F150E6C7E6C6C131C6C6C13783900FE03E090383FFFC0903807
+FE0020207E9F25>I<EB01FE90380FFF8090381FC3C090387F07E09038FE0FF0120113FC
+1203EC07E0EC018091C7FCA8B512FCA3D803FCC7FCB3A8387FFFF0A31C327EB119>I<90
+391FF007C09039FFFE3FE03A01F83F79F03907E00FC3000F14E19039C007E0E0001FECF0
+00A2003F80A5001F5CA2000F5CEBE00F00075C2603F83FC7FC3806FFFE380E1FF090C9FC
+121EA2121F7F90B57E6C14F015FC6C806C801680000F15C0003FC7127F007EEC1FE0007C
+140F00FC1407A4007EEC0FC0003E1580003F141FD80FC0EB7E003907F803FC0001B512F0
+D8001F90C7FC242F7E9F28>I<EA01F812FFA3120F1207ADEC07F8EC3FFEEC783F02C013
+809039F9801FC0EBFB0001FE14E05BA35BB3B500C3B5FCA328327DB12D>I<EA03C0487E
+487E487EA46C5A6C5A6C5AC8FCA9EA01F8127FA31207B3A7B51280A311337DB217>I<EA
+01F812FFA3120F1207B3B3A6B512C0A312327DB117>108 D<2703F007F8EB1FE000FFD9
+3FFEEBFFF8913A783F01E0FC02C090388300FE280FF1801FC6137F2607F30013CC01F602
+F8148001FC5CA3495CB3B500C3B5380FFFFCA33E207D9F43>I<3903F007F800FFEB3FFE
+EC783F02C013803A0FF1801FC03807F30001F614E013FCA35BB3B500C3B5FCA328207D9F
+2D>I<EB07FC90387FFFC03901FC07F03903F001F848486C7E4848137E001F147F003F15
+8049133F007F15C0A300FF15E0A8007F15C0A36C6CEB7F80A2001F15006C6C13FE00075C
+3903F803F83901FE0FF039007FFFC0D907FCC7FC23207E9F28>I<3901F83FE000FFEBFF
+FC9038FBE07F9039FF003F80D807FEEB1FC049EB0FE04914F0ED07F8A216FC1503A216FE
+A816FC1507A216F8A2ED0FF06D14E06DEB1FC06DEB3F809039FBC0FE009038F8FFF8EC3F
+C091C8FCABB512C0A3272E7E9F2D>I<3803F03F00FFEB7FC09038F1C3E01487390FF30F
+F0EA07F6A29038FC07E0EC03C091C7FCA25BB2B512E0A31C207E9F21>114
+D<3801FF86000713FEEA1F00003C133E48131E140E12F8A36C90C7FCB47E13FC387FFFC0
+6C13F0806C7F00077F00017FEA003F01001380143F0060131F00E0130FA27E15007E6C13
+1E6C131C38FF807838F3FFF038C07F8019207D9F20>I<131CA5133CA3137CA213FC1201
+12031207381FFFFEB5FCA2D803FCC7FCB0EC0380A71201EC0700EA00FEEB7F0EEB3FFCEB
+07F0192E7FAD1F>I<D801F8EB07E000FFEB03FFA3000FEB003F0007141FB3153FA20003
+147FA26C6CEBDFF03A00FE039FFF90387FFF1FEB0FFC28207D9F2D>I<B5EB1FFCA3D80F
+F8EB03C0000715806D1307000315007F0001140E7F6C5CA2EC803C017F1338ECC078013F
+1370ECE0F0011F5B14F1010F5B14F9903807FB80A214FF6D90C7FCA26D5AA26D5AA21478
+A226207E9F2B>I<B53A1FFFE03FF8A33C0FF000FE0007806D150300076EEB0700816D5D
+00039138FF800EA26C6C486D5A15DF01FF153C6C9039038FE038A2D97F876D5A150702C7
+14F0D93FCF6D5AECCE03D91FFEEBF9C09138FC01FD16FF010F5D4A7EA26D486DC7FCA201
+03147E4A133EA26D48131C35207E9F3A>I<3A7FFF807FFCA33A03FC000F006C6C131E6C
+6C5BEC803890387FC078013F5B90381FE1E090380FF3C0ECFF806D90C7FC6D5A13016D7E
+81815B903803DFE09038078FF08190380F07FC90381E03FEEB3C01496C7E4914804848EB
+7FC00003EC3FE026FFFC01B5FCA328207F9F2B>I<B5EB1FFCA3D80FF8EB03C000071580
+6D1307000315007F0001140E7F6C5CA2EC803C017F1338ECC078013F1370ECE0F0011F5B
+14F1010F5B14F9903807FB80A214FF6D90C7FCA26D5AA26D5AA21478A21470A214F05C13
+01007C5BEAFE035C49C8FC5BEAFC1EEA787CEA3FF0EA0FC0262E7E9F2B>I
+E /Fl 1 14 df<14FF010713E090381F00F80178131E01E01307D80180EB018048C812C0
+00061560481530A248151848150CA2481506A4481503A900601506A46C150CA26C15186C
+1530A26C15606C15C06C6CEB0180D800E0EB07000178131E011F13F8903807FFE0010090
+C7FC282B7EA02D>13 D E /Fm 46 122 df<123C127FEAFF80A213C0A3127F123E1200A2
+EA0180A3EA0300A21206120E5A5A12100A157B8813>44 D<121C127FA2EAFF80A3EA7F00
+A2121C09097B8813>46 D<130E131E137EEA07FE12FFA212F81200B3ABB512FEA317277B
+A622>49 D<EBFF80000713F04813FC381E03FE393800FF80007C133F00FE14C06C131F15
+E0140FA2127E003C131FC7FC15C0A2EC3F801500147E5C5C495A495AEB078049C7FC131E
+4913E013705B3901C001C0EA0380EA0600000FB5FC5A5A5AB61280A31B277DA622>I<EB
+7F803803FFF04813FC380F81FE381F007FEA3F80EC3F80A3121F1300C7EA7F00A2147E5C
+495AEB07F0EBFFC0A2EB01F8EB007E801580EC1FC0A215E0A2123C127EB4FCA215C0143F
+481480007CEB7F00383F01FE6CB45A000713F0C613801B277DA622>I<140FA25C5C5C5C
+5BA2EB03BFEB073F130E131C133C1338137013E0EA01C0EA038012071300120E5A5A5A12
+F0B612F8A3C7EA7F00A890381FFFF8A31D277EA622>I<00181303381F801FEBFFFE5C5C
+5C14C091C7FC001CC8FCA7EB7FC0381DFFF8381F80FC381E003F1208C7EA1F8015C0A215
+E0A21218127C12FEA315C05A0078EB3F80A26CEB7F00381F01FE6CB45A000313F0C61380
+1B277DA622>I<1238123E003FB512F0A34814E015C0158015003870000EA25C485B5C5C
+C6485AA2495A130791C7FC5B5B131E133EA2137E137CA213FCA41201A76C5A13701C297C
+A822>55 D<EC0780A24A7EA34A7EA24A7EA3EC77F8A2ECF7FC14E3A2903801C1FEA20103
+7F1480A249486C7EA24980010E133FA2496D7EA2013FB57EA39039700007F8A201F08049
+1303000181491301A2000381D8FFFE013F13FCA32E297EA833>65
+D<B612F815FF16C03A03F8001FE0ED0FF0ED07F8150316FCA21501A3150316F8A2ED07F0
+150FED1FC0EDFF8090B5EAFE00EDFFC09039F8000FF0ED03F8ED01FC16FE1500A216FFA6
+16FE1501ED03FC1507ED1FF8B712E016C0EDFE0028297DA830>I<91387FE003903907FF
+FC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F4848147F4848143F4848141F48
+5A160F485A1607127FA290C9FC5AA97E7F1607123FA26C7E160E6C7E6C6C141C6C6C143C
+6C6C14786CB4EB01F090397FF007C0011FB512800107EBFE009038007FF028297CA831>
+I<B712E0A33903FC001FED07F01501A215001670A3913801C0781638A302031300A2140F
+90B5FCA3EBFC0F1403A20201130EA3161C91C7FCA3163C1638167816F815011503151FB7
+12F0A327297EA82C>69 D<B712C0A33903FC003FED0FE015031501A21500A316F0913801
+C070A316001403A2140F90B5FCA3EBFC0F1403A21401A491C8FCA9B512FCA324297EA82A
+>I<91387FE003903907FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F4848
+80484880484880485A82485A82127FA290CAFC5AA892B512F87E7F03001300123FA26C7E
+A26C7E6C7E6C7E6C7E6CB45B90387FF007011FB5129F0107EBFE0F9039007FF0032D297C
+A835>I<B5D8F00FB5FCA3D803FCC7EA3FC0AF90B7FCA301FCC7123FB1B5D8F00FB5FCA3
+30297EA835>I<B512F0A33803FC00B3B1B512F0A314297EA819>I<D8FFFE92383FFF80A2
+6D5D0003EFE000A2D9BF8014EFA2D99FC0EB01CFA2D98FE0EB038FA3D987F0EB070FA2D9
+83F8130EA2D981FC131CA3D980FE1338A2027F1370A291383F80E0A391381FC1C0A29138
+0FE380A2913807F700A3EC03FEA26E5AA26E5AD8FFFE0203B51280A2157039297DA840>
+77 D<D8FFFCEC7FFF7F7F00036DEB01C080EBBFE0139F80EB8FF8EB87FCEB83FEEB81FF
+01801380147F15C0EC3FE0EC1FF0EC0FF8EC07FC140315FEEC01FF6E1381ED7FC1ED3FE1
+ED1FF1150F16F9ED07FDED03FF8181167FA2163F161F160F1607D8FFFE14031601A23029
+7EA835>I<B612F815FF16C03A03FC003FE0ED07F0ED03F816FC150116FEA716FC150316
+F8ED07F0ED3FE090B61280EDFE0001FCC8FCB0B512F0A327297EA82E>80
+D<B612E015FE6F7E3A03FC003FE0ED0FF06F7E6F7E150182A65E4B5A1507ED0FE0ED3FC0
+90B500FEC7FCA29039FC00FF80ED3FC06F7E6F7E6F7EA9170EA21503923801FC1CB538F0
+00FEEE7FF8EE0FE02F297EA832>82 D<9038FF80600003EBF0E0000F13F8381F80FD383F
+001F003E1307481303A200FC1301A214007EA26C140013C0EA7FFCEBFFE06C13F86C13FE
+80000714806C14C0C6FC010F13E0EB007FEC1FF0140F140700E01303A46C14E0A26C1307
+6C14C0B4EB0F80EBE03F39E3FFFE0000E15B38C01FF01C297CA825>I<B500F0EBFFFEA3
+D803FCC7EA0380B3AA0001ED07007F0000150E137F6D143CD91FC05B90390FF003F06DB5
+5A01001480DA1FFCC7FC2F297EA834>85 D<B500F0EB7FFFA3D803FEC7EA01C00001ED03
+80A26D14076C16006E5B017F140E80013F5CA26E133C011F14386E1378010F1470800107
+5CA26D6C485AA2ECFE0301015CECFF076D91C7FC1587EC7F8EA215DEEC3FDC15FC6E5AA2
+6E5AA36E5AA26E5AA230297FA833>I<B53CE07FFFE01FFFC0A32803FC0003FCC7EA7000
+A26D6D7E000160A26D6E13016C604B138002801503017F5F4B13C0D93FC0013F49C7FCA2
+913AE00E1FE00F011F160E17F09126F01C0F131E010F161C033C13F8902707F838075BA2
+037813FC902703FC70035BA2913AFEE001FEF001015E02FF14FF4B7E6D5EA26E486D5AA3
+6EC76CC8FCA2023E80021E141EA242297FA845>I<3803FF80000F13F0381F01FC383F80
+FE147F801580EA1F00C7FCA4EB3FFF3801FC3FEA0FE0EA1F80EA3F00127E5AA4145F007E
+13DF393F839FFC381FFE0F3803FC031E1B7E9A21>97 D<EAFFE0A3120FACEBE1FE9038EF
+FF809038FE07E09038F803F09038F001F89038E000FCA2157EA2157FA8157EA315FCA290
+38F001F89038F803F090389C0FE090380FFF80390E01FC00202A7EA925>I<EB3FF03801
+FFFC3803F03E380FC07FEA1F80EA3F00A248133E007E90C7FCA212FEA7127EA2127F6CEB
+03801380001FEB0700380FE00E3803F83C3801FFF838003FC0191B7E9A1E>I<EC7FF0A3
+1407ACEB3F873801FFF73807F03F380FC00F381F8007EA3F00A2127EA312FEA8127EA27E
+A2381F800F380FC01F3907E07FFF3801FFE738007F87202A7EA925>I<EB3FC03801FFF0
+3803E07C380F803E001F7F130048EB0F80127E15C0A200FE1307A2B6FCA248C8FCA3127E
+A2127F6CEB01C07E390F8003803907C007003803F01E3800FFFCEB3FE01A1B7E9A1F>I<
+EB07F8EB3FFCEB7E3E3801FC7FEA03F813F01207143E1400A7B512C0A33807F000B3A338
+7FFF80A3182A7EA915>I<9038FF80F00003EBE3F8390FC1FE1C391F007C7C48137E003E
+EB3E10007EEB3F00A6003E133E003F137E6C137C380FC1F8380BFFE00018138090C8FC12
+38A2123C383FFFF814FF6C14C06C14E06C14F0121F383C0007007CEB01F8481300A4007C
+EB01F0A2003FEB07E0390FC01F806CB5120038007FF01E287E9A22>I<EAFFE0A3120FAC
+147E9038E1FF809038E30FC001E413E0EBE80701F813F013F0A213E0B039FFFE3FFFA320
+2A7DA925>I<1207EA0F80EA1FC0EA3FE0A3EA1FC0EA0F80EA0700C7FCA7EAFFE0A3120F
+B3A3EAFFFEA30F2B7EAA12>I<EAFFE0A3120FB3B2EAFFFEA30F2A7EA912>108
+D<26FFC07FEB1FC0903AC1FFC07FF0903AC307E0C1F8D80FC49038F101FC9039C803F200
+01D801FE7F01D05BA201E05BB03CFFFE3FFF8FFFE0A3331B7D9A38>I<38FFC07E9038C1
+FF809038C30FC0D80FC413E0EBC80701D813F013D0A213E0B039FFFE3FFFA3201B7D9A25
+>I<EB3FE03801FFFC3803F07E390FC01F80391F800FC0393F0007E0A2007EEB03F0A300
+FE14F8A8007E14F0A26CEB07E0A2391F800FC0390FC01F803907F07F003801FFFC38003F
+E01D1B7E9A22>I<38FFE1FE9038EFFF809038FE0FE0390FF803F09038F001F801E013FC
+140015FEA2157FA8157E15FEA215FC140101F013F89038F807F09038FC0FE09038EFFF80
+9038E1FC0001E0C7FCA9EAFFFEA320277E9A25>I<38FFC1F0EBC7FCEBC63E380FCC7F13
+D813D0A2EBF03EEBE000B0B5FCA3181B7F9A1B>114 D<3803FE30380FFFF0EA3E03EA78
+00127000F01370A27E00FE1300EAFFE06CB4FC14C06C13E06C13F0000713F8C6FCEB07FC
+130000E0137C143C7E14387E6C137038FF01E038E7FFC000C11300161B7E9A1B>I<13E0
+A41201A31203A21207120F381FFFE0B5FCA2380FE000AD1470A73807F0E0000313C03801
+FF8038007F0014267FA51A>I<39FFE07FF0A3000F1307B2140FA2000713173903F067FF
+3801FFC738007F87201B7D9A25>I<39FFFC03FFA3390FF000F0000714E07F0003EB01C0
+A2EBFC0300011480EBFE070000140013FFEB7F0EA2149EEB3F9C14FC6D5AA26D5AA36D5A
+A26D5AA2201B7F9A23>I<3BFFFC7FFC1FFCA33B0FE00FE001C02607F007EB0380A201F8
+EBF00700031600EC0FF801FC5C0001150EEC1FFC2600FE1C5B15FE9039FF387E3C017F14
+38EC787F6D486C5A16F0ECE01F011F5CA26D486C5AA2EC800701075CA22E1B7F9A31>I<
+39FFFC1FFEA33907F003803803F8079038FC0F003801FE1E00005BEB7F3814F86D5A6D5A
+130F806D7E130F497EEB3CFEEB38FFEB787F9038F03F803901E01FC0D803C013E0EB800F
+39FFF03FFFA3201B7F9A23>I<39FFFC03FFA3390FF000F0000714E07F0003EB01C0A2EB
+FC0300011480EBFE070000140013FFEB7F0EA2149EEB3F9C14FC6D5AA26D5AA36D5AA26D
+5AA25CA21307003890C7FCEA7C0FEAFE0E131E131C5BEA74F0EA3FE0EA0F8020277F9A23
+>I E /Fn 75 127 df<127012F8B012701200A5127012F8A31270051C779B18>33
+D<EA4010EAE038EAF078EAE038AAEA60300D0E7B9C18>I<EA0306EA078FA6387FFFC0B5
+12E0A26C13C0380F1E00A6387FFFC0B512E0A26C13C0381E3C00A6EA0C18131C7E9B18>
+I<13C01201A3EA03F0EA0FFCEA3FFEEA7DCFEA71C738E1C38013C7A338F1C0001279123F
+6C7EEA0FF8EA01FC13DE13CF13C73861C38012F1A212E1EBC7001271EA79DEEA3FFEEA1F
+F8EA07E0EA01C0A3120011247D9F18>I<EA3803387C0780A2EAEE0F1400A25B131EA213
+3EEA7C3CA2EA387CEA0078A213F85B12015BA212035BA21207EB8380EB87C0120FEB0EE0
+A2121F121EA2123E383C07C0A23818038013247E9F18>I<EA01C0EA07E0487EEA0E7048
+7EA4EB73F813F313E3380FC1C0EBC38013831303381F0700EA3F87EA7B8EEA71CEEAE1FC
+12E0137CEB7870A2EA70FE387FFFE0EA3FC7380F03C0151C7F9B18>I<1238127CA2127E
+123E120EA3121CA2123812F812F012C0070E789B18>I<137013F0EA01E0EA03C0EA0780
+EA0F00121E121C5AA25AA45AA81270A47EA27E121E7EEA0780EA03C0EA01F0120013700C
+24799F18>I<126012F012787E7E7EEA07801203EA01C0A2EA00E0A41370A813E0A4EA01
+C0A2EA03801207EA0F00121E5A5A5A12600C247C9F18>I<EA01C0A4EA41C138F1C780EA
+FDDF387FFF00EA1FFCEA07F0A2EA1FFCEA7FFF38FDDF80EAF1C73841C100EA01C0A41114
+7D9718>I<136013F0A7387FFFC0B512E0A26C13C03800F000A7136013147E9718>I<121C
+123E127E127F123F121F1207120E121E127C12F81260080C788518>I<387FFFC0B512E0
+A26C13C013047E8F18>I<1230127812FCA2127812300606778518>I<1303EB0780A2130F
+14005B131EA2133E133C137C1378A213F85B12015B12035BA212075B120F90C7FCA25A12
+1E123E123CA2127C127812F85AA2126011247D9F18>I<EA01F0EA07FC487EEA1F1FEA1C
+0738380380007813C0EA7001A238E000E0A9EAF001007013C0A2EA780300381380381C07
+00EA1F1FEA0FFE6C5AEA01F0131C7E9B18>I<EA01801203A21207120F123F12FF12FB12
+431203B0EA7FFCEAFFFEEA7FFC0F1C7B9B18>I<EA03F0EA0FFEEA3FFF387C0F80387003
+C0EAE00138F000E0A21260C7FCA2EB01C0A21303EB0780EB0F00131E5B5B5B485AEA07C0
+485A381E00E05AEA7FFFB5FC7E131C7E9B18>I<131F5B1377A213E7120113C7EA038712
+071307120E121E123C1238127812F0B512F8A338000700A6EB7FF0A3151C7F9B18>52
+D<137E48B4FC00071380380F83C0EA1E03121C3838018090C7FC5AA2EAE1F8EAE7FEB5FC
+38FE078038F803C0EAF001EB00E05A7E1270A3383801C0EA3C03381E0780380FFF006C5A
+EA01F8131C7E9B18>54 D<1230127812FCA2127812301200A81230127812FCA212781230
+0614779318>58 D<1218123C127EA2123C12181200A81218123C127EA2123E121E120E12
+1C123C127812F01260071A789318>I<14C0EB03E01307EB1FC0EB3F80EBFE00485AEA07
+F0485AEA3F8048C7FC12FCA2127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07E013
+03EB00C013187E9918>I<387FFFC0B512E0A3C8FCA4B512E0A36C13C0130C7E9318>I<12
+6012F87E127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07E0A2EB1FC0EB3F80EBFE
+00485AEA07F0485AEA3F8048C7FC12FC5A126013187E9918>I<EA0FF0EA3FFC48B4FCEA
+700F38F00380A2EA600738000F00133E5BEA01F05B485AA55BC8FCA5EA0380487EA36C5A
+111C7D9B18>I<137013F8A213D8A2EA01DCA3138CEA038EA4EA0707A5380FFF80A3EA0E
+03381C01C0A3387F07F000FF13F8007F13F0151C7F9B18>65 D<EA7FF8EAFFFE6C7E381C
+0F80EB03C0A2EB01E01300A214F01470A814F014E0A2130114C01303EB0F80387FFF0048
+5AEA7FF8141C7F9B18>68 D<B512F0A3381C0070A41400A2130EA3EA1FFEA3EA1C0EA390
+C7FCA21438A5B512F8A3151C7F9B18>I<B512F8A3381C0038A41400A21307A3EA1FFFA3
+EA1C07A390C7FCA7EAFFC0A3151C7F9B18>I<387F07F038FF8FF8387F07F0381C01C0A9
+EA1FFFA3EA1C01AA387F07F038FF8FF8387F07F0151C7F9B18>72
+D<EA7FFFB512806C1300EA01C0B3A4EA7FFFB512806C1300111C7D9B18>I<EAFFC0A300
+1CC7FCB114E0A5B5FCA3131C7E9B18>76 D<387E07F038FF0FF8387F07F0381D81C0A313
+C1121CA213E1A313611371A213311339A31319A2131D130DA3EA7F07EAFF87EA7F03151C
+7F9B18>78 D<EA0FFE383FFF804813C0EA7803EA700100F013E0EAE000B0EAF001007013
+C0EA7C07EA7FFF6C1380380FFE00131C7E9B18>I<EAFFFEEBFF8014C0EA1C03EB01E013
+001470A514E01301EB03C0EA1FFF1480EBFE00001CC7FCA8B47EA3141C7F9B18>I<EA7F
+F8EAFFFE6C7E381C0F80130314C01301A313031480130F381FFF005BA2EA1C0F7FEB0380
+A5149CA3387F01F8EAFF81387F00F0161C7F9B18>82 D<3803F1C0EA1FFF5AEA7C0FEA70
+03EAE001A390C7FC12701278123FEA1FF0EA07FEC67EEB0F80EB03C01301EB00E0A21260
+12E0130100F013C038F80780B5FCEBFE00EAE7F8131C7E9B18>I<387FFFF8B5FCA238E0
+7038A400001300B2EA07FFA3151C7F9B18>I<38FF83FEA3381C0070B36C13E0EA0F0138
+0783C03803FF806C1300EA007C171C809B18>I<38FE03F8EAFF07EAFE03381C01C0EA1E
+03000E1380EA0F0700071300A2EA038EA2EA01DCA3EA00F8A21370A9EA01FC487E6C5A15
+1C7F9B18>89 D<EAFFF8A3EAE000B3ACEAFFF8A30D24779F18>91
+D<126012F0A27E1278127C123CA2123E121E121F7EA27F12077F1203A27F12017F12007F
+1378A2137C133C133E131EA2131F7F14801307A2EB030011247D9F18>I<EAFFF8A3EA00
+38B3ACEAFFF8A30D247F9F18>I<EA0180EA07C0EA1FF0EA7EFCEAF83EEAE00E0F067C9B
+18>I<387FFFC0B512E0A26C13C013047E7F18>I<1206121E123E12381270A212E0A312F8
+12FC127CA21238070E789E18>I<EA0FF0EA1FFC487EEA3C0FEA180738000380A213FF12
+07121FEA7F03127812E0A3EAF007EA780F383FFFF8EA1FFDEA07F015147E9318>I<127E
+12FE127E120EA5133EEBFF80000F13C0EBC1E01380EB0070120E1438A6000F1370A2EB80
+E013C1EBFFC0000E138038063E00151C809B18>I<EA01FEEA07FF001F1380EA3E073838
+030048C7FCA25AA61270EB01C01238EA3E03381FFF8000071300EA01FC12147D9318>I<
+EB1F80133F131F1303A5EA03E3EA0FFBEA1FFFEA3C1FEA380FEA7007130312E0A6EA7007
+A2EA380FEA3C1F381FFFF0380FFBF83803E3F0151C7E9B18>I<EA01F0EA07FCEA1FFEEA
+3E0F38380780EA7003A238E001C0A2B5FCA300E0C7FC1270EB01C01238EA3E07381FFF80
+00071300EA01F812147D9318>I<EB1F80EB7FC0EBFFE013E13801C0C01400A3387FFFC0
+B5FCA23801C000AEEA7FFFA3131C7F9B18>I<3801E1F03807FFF85A381E1E30381C0E00
+487EA5EA1C0EEA1E1EEA1FFC5BEA39E00038C7FC7EEA1FFEEBFFC04813E0387801F03870
+0070481338A4007813F0EA7E03381FFFC06C13803801FC00151F7F9318>I<127E12FE12
+7E120EA5133EEBFF80000F13C013C1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC17
+1C809B18>I<EA0380EA07C0A3EA0380C7FCA4EA7FC012FF127F1201AEB5FCA3101D7C9C
+18>I<EAFFC0A31201B3A4B51280A3111C7D9B18>108 D<38F9C1C038FFF7F013FF383E3E
+38EA3C3CA2EA3838AB38FE3E3EEB7E7EEB3E3E1714809318>I<EA7E3E38FEFF80007F13
+C0EA0FC1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC1714809318>I<EA01F0EA0F
+FE487E383E0F80EA3803387001C0A238E000E0A5EAF001007013C0EA7803383C0780EA3E
+0F381FFF006C5AEA01F013147E9318>I<EA7E3E38FEFF80007F13C0380FC1E01380EB00
+70120E1438A6000F1370A2EB80E013C1EBFFC0000E1380EB3E0090C7FCA7EA7FC0487E6C
+5A151E809318>I<3801F380EA07FBEA1FFFEA3E1FEA380FEA7007A2EAE003A6EA7007A2
+EA380FEA3C1FEA1FFFEA0FFBEA03E3EA0003A7EB1FF0EB3FF8EB1FF0151E7E9318>I<38
+FF0FC0EB3FE0EB7FF0EA07F0EBE060EBC0005BA290C7FCA9EAFFFC7F5B14147E9318>I<
+EA07F7EA3FFF5AEA780FEAE007A3007CC7FCEA7FE0EA1FFCEA03FEEA001F38600780EAE0
+03A212F038F80F00B5FC13FCEAE7F011147D9318>I<487E1203A4387FFFC0B5FCA23803
+8000A9144014E0A33801C1C013FF6C1380EB3E0013197F9818>I<387E07E0EAFE0FEA7E
+07EA0E00AC1301EA0F033807FFFC6C13FE3801FCFC1714809318>I<387F8FF000FF13F8
+007F13F0381C01C0380E0380A338070700A3138FEA038EA3EA01DCA3EA00F8A213701514
+7F9318>I<38FF07F8138F1307383800E0A4381C01C0137113F9A213D9EA1DDD000D1380
+A3138DEA0F8FA23807070015147F9318>I<387F8FF0139F138F380F0700EA078EEA039E
+EA01DC13F81200137013F07FEA01DCEA039E138EEA0707000E1380387F8FF000FF13F800
+7F13F015147F9318>I<387F8FF000FF13F8007F13F0380E01C0EB0380A21207EB0700A2
+EA0387A2138EEA01CEA213CC120013DC1378A31370A313F05B1279EA7BC0EA7F806CC7FC
+121E151E7F9318>I<383FFFF05AA2387001E0EB03C0EB078038000F00131E5B13F8485A
+EA03C0485A380F0070121E5A5AB512F0A314147F9318>I<EB07E0131F137FEB780013E0
+AB1201EA7FC0485AA26C7EEA01E01200AB1378EB7FE0131F130713247E9F18>I<126012
+F0B3B012600424769F18>I<127CB4FC13C01203C67EAB7FEB7FC0EB3FE0A2EB7FC0EBF0
+005BABEA03C012FF90C7FC127C13247E9F18>I<EA060CEA1F1EEA3FBEEAFBF8EAF1F0EA
+60C00F067C9B18>I E /Fo 74 123 df<90381F83E09038F06E303901C07878380380F8
+903800F03048EB7000A7B612803907007000B2383FE3FF1D20809F1B>11
+D<133FEBE0C0EA01C0380381E0EA0701A290C7FCA6B512E0EA0700B2383FC3FC1620809F
+19>I<EB3FE013E0EA01C1EA0381EA0700A8B5FCEA0700B2383FE7FC1620809F19>I<9038
+1F81F89038F04F043901C07C06390380F80FEB00F05A0270C7FCA6B7FC3907007007B23A
+3FE3FE3FE02320809F26>I<EA7038EAF87CEAFC7EA2EA743AEA0402A3EA0804A2EA1008
+A2EA2010EA40200F0E7F9F17>34 D<127012F812FCA212741204A31208A21210A2122012
+40060E7C9F0D>39 D<13401380EA01005A12061204120C5AA212381230A212701260A412
+E0AC1260A412701230A212381218A27E120412067E7EEA008013400A2E7BA112>I<7E12
+407E12307E1208120C7EA212077EA213801201A413C0AC1380A412031300A25A1206A25A
+120812185A12205A5A0A2E7EA112>I<127012F012F8A212781208A31210A31220A21240
+050E7C840D>44 D<EAFFF0A20C02808A0F>I<127012F8A3127005057C840D>I<EA03F0EA
+0E1C487EEA1806EA380738700380A400F013C0AD00701380A3EA780700381300EA1806EA
+1C0E6C5AEA03F0121F7E9D17>48 D<13801203120F12F31203B3A6EA07C0EAFFFE0F1E7C
+9D17>I<EA03F0EA0C1CEA100E487E00401380128000F013C0EAF803A3EA200712001480
+A2EB0F00130E5B5B5B13605B485A48C7FC000613405A5A00101380EA3FFF5AB5FC121E7E
+9D17>I<EA03F0EA0C1CEA100EEA200F007813801307A2EA380F12001400A2131E131C13
+70EA07F0EA003C130E130FEB0780A214C0122012F8A300F013801240EB0F00EA200EEA18
+3CEA07F0121F7E9D17>I<1306A2130EA2131E132EA2134E138EA2EA010E1202A2120412
+08A212101220A2124012C0B512F038000E00A7EBFFE0141E7F9D17>I<EA1803EA1FFE5B
+5B13E00010C7FCA6EA11F0EA161CEA180EEA10071480EA0003A214C0A3127012F0A200E0
+13801240EB0700EA20066C5AEA0838EA07E0121F7E9D17>I<137CEA0182EA0701380E03
+80EA0C0712183838030090C7FC12781270A2EAF1F0EAF21CEAF406EAF807EB0380A200F0
+13C0A51270A214801238EB07001218EA0C0E6C5AEA01F0121F7E9D17>I<1240387FFFE0
+14C0A23840008038800100A21302485AA25B5BA25BA21360A213E05B1201A41203A76C5A
+131F7E9D17>I<EA03F0EA0C0CEA1006EA3003382001801260A3127038780300123EEA3F
+06EA1FC8EA0FF0EA03F8487EEA0C7EEA103F38300F80EA6007EB01C012C01300A31480EA
+600100201300EA1002EA0C0CEA03F0121F7E9D17>I<EA03F0EA0E18487E487E13071270
+EB038012F0A214C0A5EA7007A21238EA180BEA0E13EA03E338000380A3EB07001230EA78
+06130EEA700CEA2018EA1070EA0FC0121F7E9D17>I<127012F8A312701200AA127012F8
+A3127005147C930D>I<127012F8A312701200AA127012F012F8A212781208A31210A312
+20A21240051D7C930D>I<5B497EA3497EA3EB09E0A3EB10F0A3EB2078A3497EA2EBC03E
+EB801EA248B5FCEB000FA20002EB0780A348EB03C0A2120C001E14E039FF801FFE1F207F
+9F22>65 D<B512E0380F0078141EA2801580A515005C141E147CEBFFF0EB007C141FEC0F
+80EC07C0140315E0A515C014071580EC0F00143EB512F01B1F7E9E20>I<90380FE01090
+38381C309038E002703803C00139078000F048C71270121E15305A1510127C127800F814
+00A91278007C1410123CA26C1420A27E6C6C13406C6C13803900E00300EB380CEB0FF01C
+217E9F21>I<B512F83807801EEC0780EC03C0EC01E0EC00F015701578A2153CA3153EA8
+153CA2157C1578A215F0EC01E0EC03C0EC0780EC1E00B512F81F1F7F9E23>I<B6128038
+0F000F14031401140015C01540A314401500A214C0130113FF130113001440A3EC0020A3
+1540A315C01401EC0380140FB6FC1B1F7E9E1F>I<B61280380780071401A2140015C015
+40A4EC2000A3146014E013FF138014601420A391C7FCA87FEAFFFE1A1F7F9E1E>I<9038
+0FE0109038381C309038E002703803C00139078000F048C71270121E15305A1510127C12
+7800F81400A7EC3FFEEC01F000781300127C123CA27EA27E6C7E3903C001703900E00230
+9038380C1090380FF0001F217E9F24>I<39FFF07FF8390F000780AD90B5FCEB0007AF39
+FFF07FF81D1F7E9E22>I<EAFFF0EA0F00B3ABEAFFF00C1F7E9E10>I<EAFFF8EA0F8090C7
+FCB21402A414061404A2140C141C147CB512FC171F7E9E1C>76 D<B46CEB07FE000715C0
+A2D805C0130BA2D804E01313A301701323A26D1343A36D1383A290380E0103A3EB0702A3
+EB0384A2EB01C8A3EB00F0A21460121FD8FFE0EB7FFE271F7F9E2A>I<B4EB0FF8390F80
+03E0EC0080EA0BC0EA09E0A2EA08F01378A27F7FA27FEB0780A2EB03C0EB01E0A2EB00F0
+1478A2143C141EA2140F1407A214031401123E38FF80001D1F7E9E22>I<EB1FE0EB7038
+3801C00E48487E39070003804814C0001EEB01E048EB00F0A2007C14F8A20078147800F8
+147CA900781478007C14F8A2003C14F0003E1301001E14E06CEB03C06C14803903800700
+3801E01E38007038EB1FE01E217E9F23>I<B512E0380F007C141E80EC0780A215C0A415
+80A2EC0F00141E147CEBFFE090C8FCAEEAFFF01A1F7E9E1F>I<EB1FE0EB70383801C00E
+48487E39070003804814C0001EEB01E0003E14F0003C1300007C14F8A20078147800F814
+7CA900781478007C14F8A2003C14F0383E0781391E0841E0390F1023C000071480390390
+17003801D01E3900783804EB1FF8EB001CEC0C0CEC0E1CEC0FF8A2140715F0EC01E01E29
+7E9F23>I<B57E380F00F0143C8080A21580A41500A2141E5C14F0EBFF80EB01C0EB0070
+A280143CA3143EA31504143F141FEC0F0839FFF00788C7EA01F01E207E9E21>I<3803F0
+40380C0CC0EA1803EA3001EA6000A212E01440A36C13007E127CEA7F80EA3FF86CB4FC00
+071380C613C0EB1FE013031301EB00F014707EA46C136014E06C13C038F8018038C60300
+EA81FC14217E9F19>I<007FB512E038780F010060EB006000401420A200C01430008014
+10A400001400B3497E3803FFFC1C1F7E9E21>I<39FFF00FF8390F0003E0EC0080B3A46C
+EB01001380120314026C6C5A6C6C5AEB3830EB0FC01D207E9E22>I<39FFF003FE391F80
+00F86CC7126015206C6C1340A36C6C1380A2EBE00100011400A23800F002A213F8EB7804
+A26D5AA36D5AA2131F6D5AA2EB07C0A36D5AA36DC7FC1F207F9E22>I<3BFFF07FF81FF0
+3B1F000FC007C06C903907800180170015C001805C00071502EC09E013C000035DEC19F0
+1410D801E05CA2EC2078D800F05CA2EC403C01785CA2EC801E017C1460013C144090383D
+000F133F6D5CA2011E1307010E91C7FCA2010C7F010413022C207F9E2F>I<12FFA212C0
+B3B3A512FFA2082D7CA10D>91 D<EA0804EA1008EA2010A2EA4020A2EA8040A3EAB85CEA
+FC7EA2EA7C3EEA381C0F0E7A9F17>I<12FFA21203B3B3A512FFA2082D80A10D>I<120812
+101220A21240A21280A312B812FCA2127C1238060E7D9F0D>96 D<EA1FE0EA3030EA7818
+131CEA300E1200A313FEEA078EEA1E0E1238127800F01310A3131E127838386720380F83
+C014147E9317>I<121C12FC121CAA137CEA1D87381E0180EB00C0001C13E01470A21478
+A6147014F014E0001E13C0381A018038198700EA107C15207E9F19>I<EA01FCEA0706EA
+1C0F123813060078C7FC127012F0A61270127800381380A2381C0100EA0706EA01F81114
+7F9314>I<EB01C0130F1301AAEA01F1EA070DEA0C03EA180112381278127012F0A61270
+A21238EA1803120CEA070D3801F1F815207F9F19>I<EA03F0EA0E1C487E487EA21270EB
+038012F0A2B5FC00F0C7FCA31270A26C1380A2381C0100EA0706EA01F811147F9314>I<
+137CEA01C6EA030F1207EA0E061300A7EAFFF0EA0E00B2EA7FE01020809F0E>I<14E038
+03E330EA0E3CEA1C1C38380E00EA780FA5EA380E6C5AEA1E38EA33E00020C7FCA21230A2
+EA3FFE381FFF8014C0383001E038600070481330A4006013606C13C0381C03803803FC00
+141F7F9417>I<121C12FC121CAA137C1386EA1D03001E1380A2121CAE38FF8FF014207E
+9F19>I<1238127CA31238C7FCA6121C12FC121CB1EAFF80091F7F9E0C>I<13E0EA01F0A3
+EA00E01300A61370EA07F012001370B3A31260EAF06013C0EA6180EA3F000C28829E0E>
+I<121C12FC121CAAEB1FE0EB0780EB060013045B5B5B136013E0EA1DF0EA1E70EA1C3813
+3C131C7F130F7F148014C038FF9FF014207E9F18>I<121C12FC121CB3ABEAFF8009207F
+9F0C>I<391C3E03E039FCC30C30391D039038391E01E01CA2001C13C0AE3AFF8FF8FF80
+21147E9326>I<EA1C7CEAFC86EA1D03001E1380A2121CAE38FF8FF014147E9319>I<EA01
+F8EA070E381C0380383801C0A2387000E0A200F013F0A6007013E0A2383801C0A2381C03
+8038070E00EA01F814147F9317>I<EA1C7CEAFD87381E018014C0381C00E014F0147014
+78A6147014F014E0381E01C0EB0380381D8700EA1C7C90C7FCA8B47E151D7E9319>I<38
+01F04038070CC0EA0E02EA1C03EA38011278127012F0A6127012781238EA1C03EA0C05EA
+0709EA01F1EA0001A8EB0FF8151D7F9318>I<EA1CF0EAFD18EA1E3CA21318EA1C00AEEA
+FFC00E147E9312>I<EA0FC8EA3038EA6018EAC008A3EAE000127CEA3FE0EA1FF0EA07F8
+EA003CEA800E130612C0A21304EAE00CEAD818EA87E00F147F9312>I<1202A31206A212
+0EA2123EEAFFF8EA0E00AB1304A5EA07081203EA01F00E1C7F9B12>I<381C0380EAFC1F
+EA1C03AE1307120CEA061B3803E3F014147E9319>I<38FF83F8383E00E0001C13C06C13
+80A338070100A21383EA0382A2EA01C4A213E4EA00E8A21370A3132015147F9318>I<39
+FF9FE1FC393C078070391C030060EC8020000E1440A214C0D80704138014E0A239038861
+001471A23801D032143A143E3800E01CA2EB6018EB40081E147F9321>I<38FF87F8381E
+03C0380E0180EB0300EA0702EA0384EA01C813D8EA00F01370137813F8139CEA010E1202
+EA060738040380000C13C0003C13E038FE07FC16147F9318>I<38FF83F8383E00E0001C
+13C06C1380A338070100A21383EA0382A2EA01C4A213E4EA00E8A21370A31320A25BA3EA
+F080A200F1C7FC1262123C151D7F9318>I<EA7FFFEA700E1260EA401C133813781370EA
+00E0120113C0EA038012071301120E121EEA1C03EA3802EA7006130EEAFFFE10147F9314
+>I E /Fp 13 122 df<DB1FFC14C00203B5EAC001021FECF003027FECFC07903B01FFFC
+00FE0F010701C0EB1F9F4948C7EA07FFD93FF880494814004948157F485B4A153F4890C9
+121F485A000F170F5B001F1707A2485A1803A2127FA24993C8FCA212FFAA041FB6128012
+7FA27FDC0001EBC000123FA36C7EA26C7EA26C7E7E6C7F806C7F6D6C5CEB3FFCD90FFF5C
+6D01C0EB1FBF010101FCEBFF1F6D6CB5EAFE0F021FECF8030203ECE0009126001FFEC9FC
+413D7BBB4C>71 D<B6D8F803B612E0A426007FF0C70001EBC000B3A491B8FCA402F0C712
+01B3A7B6D8F803B612E0A4433B7CBA4C>I<B612FEA426007FF0C9FCB3ADEF03C0A51707
+1880A3170FA3171FA2173F177F17FF5E04071300163FB9FCA4323B7DBA3A>76
+D<B500F00207B512E0808080D8007F92390007E0006E6F5A81017B7F81137901787F6E7E
+6E7E81141F6E7E6E7F6E7F82806E7F6F7E6F7E826F7E816F13806F13C017E06F13F081EE
+7FF8EE3FFC17FEEE1FFF827013837013C318E37013F382EF7FFBEF3FFFA283838383A283
+83187F183FA201FC161FB500FC150F18071803A2433B7CBA4C>78
+D<B600F80107B512E0A426007FF0C83807E000725AB3B3A3013F4C5AA280011F4CC7FCA2
+6D6C151E0107163E6E5D6D6C5D6D6D13019026007FE0EB0FE0DA3FFCEB7FC0020FB65A02
+034AC8FCDA007F13F003071380433C7DBA4A>85 D<EB3FFE48B512E0000714F8390FE007
+FC9038F001FE486C6C7E6F7E82153F6C48806C5A6C5AC8FCA491B5FC131F90387FF83F38
+03FF803807FC00EA0FF0485A123F485AA2485AA4157F6C7E15DF3A3FE0039FF03B1FF80F
+0FFFE03807FFFE0001497E39003FE0002B267DA52F>97 D<13FE12FFA412071203B04AB4
+FC021F13F0027F13FC9138FC03FE9039FFF000FF02C0EB3F8091C7EA1FC04915E0EE0FF0
+17F8A2EE07FCA317FEA917FCA3160F17F817F0161F6D15E06EEB3FC06EEB7F80D9F9E0EB
+FF009039F0FC07FE91387FFFF8D9E01F13E09026C003FEC7FC2F3C7DBB36>I<EA01E0EA
+07F8487EA2487EA46C5AA26C5AEA01E0C8FCAB13FE127FA412071203B3AAB512F0A4143D
+7DBC1A>105 D<903801FFC0010F13F8017F13FFD9FF807F3A03FE003FE0D807F8EB0FF0
+48486D7EA248486D7E003F81A248486D7EA400FF1680A9007F1600A36C6C495AA2001F5D
+6D1307000F5D6C6C495AD803FEEB3FE03A00FF80FF806DB5C7FC010F13F8010113C02926
+7DA530>111 D<3901FC03F000FFEB0FFC4AB4FC91383C3F80EC707F00079038E0FFC000
+035BEBFD80A201FFEB7F809138003F00151E92C7FC5BB3A3B512FCA422267DA528>114
+D<90383FF0383903FFFE7848EBFFF8381FC00F383F0003003E13005A157812FCA27E6C14
+0013C013FC387FFFF06C13FEECFF806C14C06C14E0000314F0C614F8011F13FCEB007FEC
+07FE0070130100F01300157E7EA27E157C6C14FC6C14F890388001F09038F00FE000F9B5
+12C0D8F07F130038C01FF81F267DA526>I<130FA55BA45BA25BA25B5A5A5A001FEBFFF0
+B6FCA3000190C7FCB3153CA86C14781480017F13F090383FC1E090381FFFC06D13809038
+01FE001E377EB626>I<B500F0EBFFFCA4D803FEC7EA1F806D15006C151E806C5DA26E13
+7C017F14786E13F8013F5CECF001011F5CECF803010F5CA2ECFC0701075CECFE0F010391
+C7FC6E5A6D131E15BE6D13BC15FC6E5AA36E5AA26E5AA26E5AA26E5AA2140F92C8FC5C14
+1E0008133E007F133C147C38FF807814F8EB81F0EB83E06C485A387C1F80D83FFFC9FCEA
+1FFCEA07F02E377EA533>121 D E end
TeXDict begin
-%%EndSetup
-%%Page: 1 1
-0 bop 0 1152 a Fp(GNU)33 b(History)f(Library)p 0 1201 1950
-17 v 1035 1250 a Fo(Edition)16 b(2.0,)e(for)h Fn(History)f(Library)g
-Fo(V)l(ersion)i(2.0.)1759 1304 y(July)g(1994)0 2443 y Fm(Brian)23
-b(F)-6 b(o)n(x,)23 b(F)-6 b(ree)23 b(Soft)n(w)n(are)f(F)-6
-b(oundation)0 2509 y(Chet)22 b(Ramey)-6 b(,)23 b(Case)e(W)-6
-b(estern)23 b(Reserv)n(e)f(Univ)n(ersit)n(y)p 0 2545 1950 9
-v eop
-%%Page: 2 2
-1 bop 0 295 a Fo(This)16 b(do)q(cumen)o(t)g(describ)q(es)h(the)f(GNU)f
-(History)g(library)l(,)h(a)g(programming)e(to)q(ol)i(that)f(pro)o(vides)h(a)f
-(consisten)o(t)0 358 y(user)g(in)o(terface)h(for)e(recalling)j(lines)g(of)e
-(previously)h(t)o(yp)q(ed)g(input.)0 495 y(Published)h(b)o(y)f(the)f(F)l(ree)
-g(Soft)o(w)o(are)f(F)l(oundation)0 557 y(675)g(Massac)o(h)o(usetts)g(Av)o(en)
-o(ue,)0 619 y(Cam)o(bridge,)h(MA)g(02139)f(USA)0 756 y(P)o(ermission)f(is)g
-(gran)o(ted)f(to)f(mak)o(e)h(and)h(distribute)h(v)o(erbatim)e(copies)h(of)f
-(this)h(man)o(ual)g(pro)o(vided)g(the)f(cop)o(yrigh)o(t)0 818
-y(notice)k(and)f(this)h(p)q(ermission)h(notice)e(are)g(preserv)o(ed)h(on)f
-(all)h(copies.)0 955 y(P)o(ermission)f(is)f(gran)o(ted)f(to)h(cop)o(y)g(and)g
-(distribute)h(mo)q(di\014ed)h(v)o(ersions)e(of)f(this)i(man)o(ual)f(under)h
-(the)f(conditions)0 1018 y(for)e(v)o(erbatim)g(cop)o(ying,)h(pro)o(vided)h
-(that)d(the)i(en)o(tire)g(resulting)h(deriv)o(ed)f(w)o(ork)f(is)h
-(distributed)h(under)f(the)g(terms)0 1080 y(of)i(a)g(p)q(ermission)h(notice)g
-(iden)o(tical)h(to)e(this)g(one.)0 1217 y(P)o(ermission)20
-b(is)g(gran)o(ted)f(to)g(cop)o(y)h(and)f(distribute)i(translations)f(of)f
-(this)h(man)o(ual)f(in)o(to)h(another)f(language,)0 1279 y(under)c(the)f(ab)q
-(o)o(v)o(e)g(conditions)h(for)e(mo)q(di\014ed)j(v)o(ersions,)e(except)g(that)
-g(this)g(p)q(ermission)i(notice)e(ma)o(y)g(b)q(e)h(stated)0
-1341 y(in)h(a)f(translation)g(appro)o(v)o(ed)g(b)o(y)g(the)g(F)l(oundation.)0
-2636 y(Cop)o(yrigh)o(t)226 2635 y(c)214 2636 y Fl(\015)g Fo(1989,)f(1991)g(F)
-l(ree)h(Soft)o(w)o(are)f(F)l(oundation,)h(Inc.)p eop
-%%Page: 1 3
-2 bop 0 -83 a Fo(Chapter)15 b(1:)k(Using)d(History)f(In)o(teractiv)o(ely)1157
-b(1)0 158 y Fk(1)41 b(Using)14 b(History)h(In)n(teractiv)n(ely)62
-330 y Fo(This)i(c)o(hapter)e(describ)q(es)j(ho)o(w)d(to)h(use)g(the)g(GNU)g
-(History)f(Library)i(in)o(teractiv)o(ely)l(,)g(from)e(a)g(user's)h(stand-)0
-392 y(p)q(oin)o(t.)23 b(It)16 b(should)h(b)q(e)f(considered)i(a)d(user's)h
-(guide.)23 b(F)l(or)15 b(information)h(on)g(using)h(the)f(GNU)g(History)f
-(Library)0 454 y(in)h(y)o(our)f(o)o(wn)f(programs,)g(see)i(Chapter)e(2)h
-([Programming)f(with)i(GNU)f(History],)f(page)h(5.)0 663 y
-Fm(1.1)33 b(History)15 b(In)n(teraction)62 800 y Fo(The)j(History)g(library)g
-(pro)o(vides)h(a)e(history)h(expansion)h(feature)e(that)g(is)i(similar)g(to)e
-(the)h(history)f(expan-)0 862 y(sion)k(pro)o(vided)h(b)o(y)f
-Fn(csh)p Fo(.)36 b(The)22 b(follo)o(wing)f(text)g(describ)q(es)h(the)f(syn)o
-(tax)f(used)i(to)e(manipulate)i(the)f(history)0 924 y(information.)62
-1061 y(History)11 b(expansion)i(tak)o(es)d(place)i(in)h(t)o(w)o(o)d(parts.)18
-b(The)11 b(\014rst)g(is)h(to)f(determine)h(whic)o(h)g(line)h(from)e(the)g
-(previous)0 1124 y(history)h(should)h(b)q(e)f(used)h(during)f(substitution.)
-20 b(The)12 b(second)g(is)h(to)e(select)h(p)q(ortions)g(of)g(that)f(line)i
-(for)f(inclusion)0 1186 y(in)o(to)f(the)h(curren)o(t)f(one.)18
-b(The)12 b(line)h(selected)f(from)f(the)g(previous)h(history)g(is)f(called)i
-(the)e Fj(ev)o(en)o(t)p Fo(,)h(and)f(the)h(p)q(ortions)0 1248
-y(of)h(that)g(line)i(that)e(are)g(acted)g(up)q(on)h(are)g(called)h
-Fj(w)o(ords)p Fo(.)j(The)c(line)h(is)f(brok)o(en)f(in)o(to)h(w)o(ords)f(in)h
-(the)f(same)h(fashion)0 1310 y(that)j(Bash)h(do)q(es,)h(so)e(that)g(sev)o
-(eral)h(English)i(\(or)d(Unix\))h(w)o(ords)f(surrounded)i(b)o(y)f(quotes)f
-(are)h(considered)h(as)0 1373 y(one)c(w)o(ord.)0 1565 y Fi(1.1.1)30
-b(Ev)n(en)n(t)16 b(Designators)62 1702 y Fo(An)g(ev)o(en)o(t)f(designator)g
-(is)g(a)g(reference)h(to)f(a)g(command)g(line)i(en)o(try)d(in)i(the)g
-(history)f(list.)0 1847 y Fn(!)216 b Fo(Start)14 b(a)g(history)h
-(substitution,)g(except)h(when)f(follo)o(w)o(ed)g(b)o(y)g(a)f(space,)h(tab,)f
-(the)h(end)g(of)g(the)g(line,)240 1909 y Fn(=)g Fo(or)g Fn(\()p
-Fo(.)0 1989 y Fn(!!)192 b Fo(Refer)16 b(to)e(the)i(previous)f(command.)20
-b(This)c(is)g(a)f(synon)o(ym)g(for)f Fn(!-1)p Fo(.)0 2068 y
-Fn(!n)192 b Fo(Refer)16 b(to)e(command)h(line)i Fj(n)p Fo(.)0
-2148 y Fn(!-n)168 b Fo(Refer)16 b(to)e(the)i(command)f Fj(n)g
-Fo(lines)i(bac)o(k.)0 2227 y Fn(!string)72 b Fo(Refer)16 b(to)e(the)i(most)e
-(recen)o(t)h(command)g(starting)g(with)g Fj(string)p Fo(.)0
-2298 y Fn(!?string)p Fo([)p Fn(?)p Fo(])240 2360 y(Refer)h(to)e(the)i(most)e
-(recen)o(t)h(command)g(con)o(taining)h Fj(string)p Fo(.)0 2440
-y Fn(!#)192 b Fo(The)15 b(en)o(tire)h(command)f(line)i(t)o(yp)q(ed)f(so)e
-(far.)0 2510 y Fn(^string1^string2^)240 2573 y Fo(Quic)o(k)j(Substitution.)22
-b(Rep)q(eat)16 b(the)g(last)f(command,)h(replacing)h Fj(string1)h
-Fo(with)e Fj(string2)p Fo(.)21 b(Equiv-)240 2635 y(alen)o(t)15
-b(to)g Fn(!!:s/string1/string2/)p Fo(.)p eop
-%%Page: 2 4
-3 bop 0 -83 a Fo(2)1497 b(GNU)15 b(History)g(Library)0 158
-y Fi(1.1.2)30 b(W)-5 b(ord)15 b(Designators)62 295 y Fo(A)i
-Fn(:)g Fo(separates)f(the)h(ev)o(en)o(t)f(sp)q(eci\014cation)j(from)d(the)g
-(w)o(ord)g(designator.)25 b(It)17 b(can)g(b)q(e)g(omitted)g(if)g(the)g(w)o
-(ord)0 358 y(designator)d(b)q(egins)h(with)f(a)f Fn(^)p Fo(,)h
-Fn($)p Fo(,)f Fn(*)h Fo(or)f Fn(\045)p Fo(.)20 b(W)l(ords)13
-b(are)h(n)o(um)o(b)q(ered)g(from)f(the)h(b)q(eginning)i(of)d(the)h(line,)i
-(with)e(the)0 420 y(\014rst)h(w)o(ord)f(b)q(eing)j(denoted)f(b)o(y)f(a)g(0)f
-(\(zero\).)0 569 y Fn(0)h(\(zero\))57 b Fo(The)15 b Fn(0)p
-Fo(th)g(w)o(ord.)20 b(F)l(or)14 b(man)o(y)h(applications,)h(this)g(is)g(the)f
-(command)g(w)o(ord.)0 656 y Fn(n)216 b Fo(The)15 b Fj(n)p Fo(th)h(w)o(ord.)0
-744 y Fn(^)216 b Fo(The)15 b(\014rst)g(argumen)o(t;)f(that)h(is,)g(w)o(ord)g
-(1.)0 831 y Fn($)216 b Fo(The)15 b(last)h(argumen)o(t.)0 918
+1 0 bop 0 693 a Fp(GNU)33 b(History)f(Library)p 0 743
+1950 17 v 1035 791 a Fo(Edition)16 b(2.1,)e(for)h Fn(History)f(Library)
+g Fo(V)l(ersion)i(2.1.)1718 845 y(Marc)o(h)e(1996)0 2467
+y Fm(Brian)23 b(F)-6 b(o)n(x,)23 b(F)-6 b(ree)23 b(Soft)n(w)n(are)f(F)
+-6 b(oundation)0 2534 y(Chet)22 b(Ramey)-6 b(,)23 b(Case)e(W)-6
+b(estern)23 b(Reserv)n(e)f(Univ)n(ersit)n(y)p 0 2570
+1950 9 v eop
+2 1 bop 0 320 a Fo(This)16 b(do)q(cumen)o(t)g(describ)q(es)h(the)f(GNU)
+f(History)g(library)l(,)h(a)g(programming)e(to)q(ol)i(that)f(pro)o
+(vides)h(a)f(consisten)o(t)0 382 y(user)g(in)o(terface)h(for)e
+(recalling)j(lines)g(of)e(previously)h(t)o(yp)q(ed)g(input.)0
+519 y(Published)h(b)o(y)f(the)f(F)l(ree)g(Soft)o(w)o(are)f(F)l
+(oundation)0 582 y(675)g(Massac)o(h)o(usetts)g(Av)o(en)o(ue,)0
+644 y(Cam)o(bridge,)h(MA)g(02139)f(USA)0 781 y(P)o(ermission)f(is)g
+(gran)o(ted)f(to)f(mak)o(e)h(and)h(distribute)h(v)o(erbatim)e(copies)h
+(of)f(this)h(man)o(ual)g(pro)o(vided)g(the)f(cop)o(yrigh)o(t)0
+843 y(notice)k(and)f(this)h(p)q(ermission)h(notice)e(are)g(preserv)o
+(ed)h(on)f(all)h(copies.)0 980 y(P)o(ermission)f(is)f(gran)o(ted)f(to)h
+(cop)o(y)g(and)g(distribute)h(mo)q(di\014ed)h(v)o(ersions)e(of)f(this)i
+(man)o(ual)f(under)h(the)f(conditions)0 1043 y(for)e(v)o(erbatim)g(cop)
+o(ying,)h(pro)o(vided)h(that)d(the)i(en)o(tire)g(resulting)h(deriv)o
+(ed)f(w)o(ork)f(is)h(distributed)h(under)f(the)g(terms)0
+1105 y(of)i(a)g(p)q(ermission)h(notice)g(iden)o(tical)h(to)e(this)g
+(one.)0 1242 y(P)o(ermission)20 b(is)g(gran)o(ted)f(to)g(cop)o(y)h(and)
+f(distribute)i(translations)f(of)f(this)h(man)o(ual)f(in)o(to)h
+(another)f(language,)0 1304 y(under)c(the)f(ab)q(o)o(v)o(e)g
+(conditions)h(for)e(mo)q(di\014ed)j(v)o(ersions,)e(except)g(that)g
+(this)g(p)q(ermission)i(notice)e(ma)o(y)g(b)q(e)h(stated)0
+1366 y(in)h(a)f(translation)g(appro)o(v)o(ed)g(b)o(y)g(the)g(F)l
+(oundation.)0 2661 y(Cop)o(yrigh)o(t)226 2660 y(c)214
+2661 y Fl(\015)g Fo(1989,)f(1991)g(F)l(ree)h(Soft)o(w)o(are)f(F)l
+(oundation,)h(Inc.)p eop
+1 2 bop 0 -58 a Fo(Chapter)15 b(1:)k(Using)d(History)f(In)o(teractiv)o
+(ely)1157 b(1)0 183 y Fk(1)41 b(Using)14 b(History)h(In)n(teractiv)n
+(ely)62 380 y Fo(This)i(c)o(hapter)e(describ)q(es)j(ho)o(w)d(to)h(use)g
+(the)g(GNU)g(History)f(Library)i(in)o(teractiv)o(ely)l(,)g(from)e(a)g
+(user's)h(stand-)0 442 y(p)q(oin)o(t.)23 b(It)16 b(should)h(b)q(e)f
+(considered)i(a)d(user's)h(guide.)23 b(F)l(or)15 b(information)h(on)g
+(using)h(the)f(GNU)g(History)f(Library)0 505 y(in)h(y)o(our)f(o)o(wn)f
+(programs,)g(see)i(Chapter)e(2)h([Programming)f(with)i(GNU)f(History],)
+f(page)h(5.)0 747 y Fm(1.1)33 b(In)n(teractiv)n(e)16
+b(History)g(Expansion)62 886 y Fo(The)e(History)f(library)h(pro)o
+(vides)g(a)f(history)g(expansion)h(feature)f(that)g(is)g(similar)i(to)d
+(the)i(history)f(expansion)0 948 y(pro)o(vided)j(b)o(y)f
+Fn(csh)p Fo(.)20 b(This)15 b(section)h(describ)q(es)h(the)e(syn)o(tax)g
+(used)g(to)g(manipulate)h(the)g(history)f(information.)62
+1087 y(History)h(expansions)g(in)o(tro)q(duce)g(w)o(ords)f(from)g(the)h
+(history)f(list)i(in)o(to)e(the)h(input)g(stream,)f(making)g(it)h(easy)
+0 1150 y(to)g(rep)q(eat)g(commands,)h(insert)g(the)f(argumen)o(ts)g(to)
+g(a)g(previous)h(command)f(in)o(to)h(the)f(curren)o(t)h(input)g(line,)h
+(or)0 1212 y(\014x)d(errors)g(in)h(previous)g(commands)f(quic)o(kly)l
+(.)62 1351 y(History)c(expansion)i(tak)o(es)d(place)i(in)h(t)o(w)o(o)d
+(parts.)18 b(The)11 b(\014rst)g(is)h(to)f(determine)h(whic)o(h)g(line)h
+(from)e(the)g(previous)0 1413 y(history)h(should)h(b)q(e)f(used)h
+(during)f(substitution.)20 b(The)12 b(second)g(is)h(to)e(select)h(p)q
+(ortions)g(of)g(that)f(line)i(for)f(inclusion)0 1475
+y(in)o(to)f(the)h(curren)o(t)f(one.)18 b(The)12 b(line)h(selected)f
+(from)f(the)g(previous)h(history)g(is)f(called)i(the)e
+Fj(ev)o(en)o(t)p Fo(,)h(and)f(the)h(p)q(ortions)0 1538
+y(of)h(that)f(line)j(that)e(are)f(acted)i(up)q(on)g(are)e(called)j
+Fj(w)o(ords)p Fo(.)k(V)l(arious)13 b Fj(mo)q(di\014ers)j
+Fo(are)d(a)o(v)m(ailable)i(to)d(manipulate)j(the)0 1600
+y(selected)i(w)o(ords.)23 b(The)16 b(line)i(is)f(brok)o(en)f(in)o(to)g
+(w)o(ords)f(in)i(the)g(same)f(fashion)g(that)g(Bash)g(do)q(es,)g(so)g
+(that)g(sev)o(eral)0 1662 y(English)g(\(or)e(Unix\))h(w)o(ords)e
+(surrounded)j(b)o(y)e(quotes)h(are)f(considered)i(as)e(one)h(w)o(ord.)k
+(History)14 b(expansions)h(are)0 1725 y(in)o(tro)q(duced)h(b)o(y)g(the)
+f(app)q(earance)h(of)e(the)i(history)f(expansion)h(c)o(haracter,)e
+(whic)o(h)i(is)g(`)p Fn(!)p Fo(')e(b)o(y)h(default.)0
+1950 y Fi(1.1.1)30 b(Ev)n(en)n(t)16 b(Designators)62
+2089 y Fo(An)g(ev)o(en)o(t)f(designator)g(is)g(a)g(reference)h(to)f(a)g
+(command)g(line)i(en)o(try)d(in)i(the)g(history)f(list.)0
+2243 y Fn(!)216 b Fo(Start)14 b(a)g(history)h(substitution,)g(except)h
+(when)f(follo)o(w)o(ed)g(b)o(y)g(a)f(space,)h(tab,)f(the)h(end)g(of)g
+(the)g(line,)240 2305 y Fn(=)g Fo(or)g Fn(\()p Fo(.)0
+2396 y Fn(!)p Fj(n)191 b Fo(Refer)16 b(to)e(command)h(line)i
+Fj(n)p Fo(.)0 2488 y Fn(!-)p Fj(n)167 b Fo(Refer)16 b(to)e(the)i
+(command)f Fj(n)g Fo(lines)i(bac)o(k.)0 2579 y Fn(!!)192
+b Fo(Refer)16 b(to)e(the)i(previous)f(command.)20 b(This)c(is)g(a)f
+(synon)o(ym)g(for)f(`)p Fn(!-1)p Fo('.)0 2670 y Fn(!)p
+Fj(string)102 b Fo(Refer)16 b(to)e(the)i(most)e(recen)o(t)h(command)g
+(starting)g(with)g Fj(string)p Fo(.)p eop
+2 3 bop 0 -58 a Fo(2)1497 b(GNU)15 b(History)g(Library)0
+183 y Fn(!?)p Fj(string)t Fn([?])240 246 y Fo(Refer)h(to)f(the)g(most)g
+(recen)o(t)g(command)g(con)o(taining)h Fj(string)p Fo(.)21
+b(The)15 b(trailing)i(`)p Fn(?)p Fo(')d(ma)o(y)h(b)q(e)h(omitted)240
+308 y(if)g(the)f Fj(string)k Fo(is)d(follo)o(w)o(ed)f(immediately)i(b)o
+(y)e(a)g(newline.)0 395 y Fn(^)p Fj(string1)t Fn(^)p
+Fj(string2)t Fn(^)240 457 y Fo(Quic)o(k)i(Substitution.)22
+b(Rep)q(eat)16 b(the)g(last)f(command,)h(replacing)h
+Fj(string1)h Fo(with)e Fj(string2)p Fo(.)21 b(Equiv-)240
+520 y(alen)o(t)15 b(to)g Fn(!!:s/)p Fj(string1)t Fn(/)p
+Fj(string2)t Fn(/)p Fo(.)0 607 y Fn(!#)192 b Fo(The)15
+b(en)o(tire)h(command)f(line)i(t)o(yp)q(ed)f(so)e(far.)0
+816 y Fi(1.1.2)30 b(W)-5 b(ord)15 b(Designators)62 953
+y Fo(W)l(ord)k(designators)g(are)f(used)i(to)e(select)i(desired)g(w)o
+(ords)e(from)h(the)g(ev)o(en)o(t.)31 b(A)19 b(`)p Fn(:)p
+Fo(')f(separates)g(the)h(ev)o(en)o(t)0 1015 y(sp)q(eci\014cation)e
+(from)d(the)h(w)o(ord)f(designator.)20 b(It)15 b(can)g(b)q(e)g(omitted)
+g(if)g(the)g(w)o(ord)g(designator)f(b)q(egins)i(with)g(a)e(`)p
+Fn(^)p Fo(',)0 1077 y(`)p Fn($)p Fo(',)i(`)p Fn(*)p Fo(',)g(`)p
+Fn(-)p Fo(',)g(or)g(`)p Fn(\045)p Fo('.)24 b(W)l(ords)17
+b(are)f(n)o(um)o(b)q(ered)i(from)e(the)h(b)q(eginning)i(of)d(the)h
+(line,)i(with)e(the)g(\014rst)g(w)o(ord)f(b)q(eing)0
+1139 y(denoted)g(b)o(y)f(0)g(\(zero\).)k(W)l(ords)c(are)g(inserted)h
+(in)o(to)f(the)g(curren)o(t)g(line)i(separated)e(b)o(y)g(single)i
+(spaces.)0 1289 y Fn(0)e(\(zero\))57 b Fo(The)15 b Fn(0)p
+Fo(th)g(w)o(ord.)20 b(F)l(or)14 b(man)o(y)h(applications,)h(this)g(is)g
+(the)f(command)g(w)o(ord.)0 1376 y Fj(n)215 b Fo(The)15
+b Fj(n)p Fo(th)h(w)o(ord.)0 1464 y Fn(^)216 b Fo(The)15
+b(\014rst)g(argumen)o(t;)f(that)h(is,)g(w)o(ord)g(1.)0
+1551 y Fn($)216 b Fo(The)15 b(last)h(argumen)o(t.)0 1639
y Fn(\045)216 b Fo(The)15 b(w)o(ord)g(matc)o(hed)g(b)o(y)g(the)g(most)g
-(recen)o(t)g Fn(?string?)f Fo(searc)o(h.)0 1005 y Fn(x-y)168
-b Fo(A)15 b(range)g(of)g(w)o(ords;)f Fn(-)p Fj(y)19 b Fo(abbreviates)c
-Fn(0-)p Fj(y)t Fo(.)0 1092 y Fn(*)216 b Fo(All)17 b(of)f(the)g(w)o(ords,)f
-(except)i(the)f Fn(0)p Fo(th.)22 b(This)17 b(is)f(a)g(synon)o(ym)g(for)f
-Fn(1-$)p Fo(.)22 b(It)17 b(is)f(not)g(an)g(error)f(to)h(use)240
-1155 y Fn(*)f Fo(if)h(there)f(is)h(just)f(one)g(w)o(ord)f(in)i(the)g(ev)o(en)
-o(t;)e(the)i(empt)o(y)e(string)i(is)f(returned)h(in)g(that)e(case.)0
-1242 y Fn(x*)192 b Fo(Abbreviates)16 b Fn(x-$)0 1329 y(x-)192
-b Fo(Abbreviates)16 b Fn(x-$)f Fo(lik)o(e)h Fn(x*)p Fo(,)e(but)i(omits)f(the)
-g(last)g(w)o(ord.)0 1537 y Fi(1.1.3)30 b(Mo)r(di\014ers)62
-1674 y Fo(After)20 b(the)f(optional)i(w)o(ord)e(designator,)h(y)o(ou)f(can)h
-(add)g(a)g(sequence)h(of)e(one)h(or)f(more)g(of)g(the)h(follo)o(wing)0
-1736 y(mo)q(di\014ers,)c(eac)o(h)f(preceded)i(b)o(y)e(a)g Fn(:)p
-Fo(.)0 1885 y Fn(h)216 b Fo(Remo)o(v)o(e)15 b(a)g(trailing)h(pathname)f(comp)
-q(onen)o(t,)g(lea)o(ving)h(only)g(the)f(head.)0 1973 y Fn(r)216
+(recen)o(t)g(`)p Fn(?)p Fj(string)t Fn(?)p Fo(')f(searc)o(h.)0
+1726 y Fj(x)p Fn(-)p Fj(y)168 b Fo(A)15 b(range)g(of)g(w)o(ords;)f(`)p
+Fn(-)p Fj(y)t Fo(')g(abbreviates)i(`)p Fn(0-)p Fj(y)t
+Fo('.)0 1813 y Fn(*)216 b Fo(All)16 b(of)f(the)g(w)o(ords,)f(except)h
+(the)g Fn(0)p Fo(th.)k(This)d(is)f(a)g(synon)o(ym)g(for)f(`)p
+Fn(1-$)p Fo('.)k(It)d(is)h(not)e(an)h(error)f(to)h(use)240
+1876 y(`)p Fn(*)p Fo(')f(if)i(there)f(is)h(just)f(one)g(w)o(ord)g(in)h
+(the)f(ev)o(en)o(t;)g(the)g(empt)o(y)g(string)g(is)h(returned)f(in)h
+(that)f(case.)0 1963 y Fj(x)s Fn(*)189 b Fo(Abbreviates)16
+b(`)p Fj(x)p Fn(-$)p Fo(')0 2050 y Fj(x)p Fn(-)192 b
+Fo(Abbreviates)16 b(`)p Fj(x)p Fn(-$)p Fo(')e(lik)o(e)i(`)p
+Fj(x)s Fn(*)p Fo(',)e(but)i(omits)f(the)g(last)g(w)o(ord.)62
+2200 y(If)i(a)g(w)o(ord)f(designator)g(is)i(supplied)h(without)d(an)h
+(ev)o(en)o(t)g(sp)q(eci\014cation,)h(the)f(previous)h(command)e(is)h
+(used)0 2262 y(as)e(the)g(ev)o(en)o(t.)0 2471 y Fi(1.1.3)30
+b(Mo)r(di\014ers)62 2608 y Fo(After)20 b(the)f(optional)i(w)o(ord)e
+(designator,)h(y)o(ou)f(can)h(add)g(a)g(sequence)h(of)e(one)h(or)f
+(more)g(of)g(the)h(follo)o(wing)0 2670 y(mo)q(di\014ers,)c(eac)o(h)f
+(preceded)i(b)o(y)e(a)g(`)p Fn(:)p Fo('.)p eop
+3 4 bop 0 -58 a Fo(Chapter)15 b(1:)k(Using)d(History)f(In)o(teractiv)o
+(ely)1157 b(3)0 183 y Fn(h)216 b Fo(Remo)o(v)o(e)15 b(a)g(trailing)h
+(pathname)f(comp)q(onen)o(t,)g(lea)o(ving)h(only)g(the)f(head.)0
+270 y Fn(t)216 b Fo(Remo)o(v)o(e)15 b(all)h(leading)h(pathname)e(comp)q
+(onen)o(ts,)g(lea)o(ving)h(the)f(tail.)0 358 y Fn(r)216
b Fo(Remo)o(v)o(e)15 b(a)g(trailing)h(su\016x)f(of)g(the)g(form)g(`)p
-Fn(.)p Fo(')p Fj(su\016x)p Fo(,)f(lea)o(ving)i(the)f(basename.)0
-2060 y Fn(e)216 b Fo(Remo)o(v)o(e)15 b(all)h(but)g(the)f(trailing)h(su\016x.)
-0 2147 y Fn(t)216 b Fo(Remo)o(v)o(e)15 b(all)h(leading)h(pathname)e(comp)q
-(onen)o(ts,)g(lea)o(ving)h(the)f(tail.)0 2234 y Fn(p)216 b
-Fo(Prin)o(t)15 b(the)g(new)h(command)f(but)g(do)g(not)g(execute)h(it.)0
-2309 y Fn(s/old/new/)240 2371 y Fo(Substitute)g Fj(new)k Fo(for)15
-b(the)h(\014rst)f(o)q(ccurrence)h(of)g Fj(old)h Fo(in)g(the)e(ev)o(en)o(t)h
-(line.)22 b(An)o(y)16 b(delimiter)h(ma)o(y)e(b)q(e)240 2433
-y(used)e(in)f(place)h(of)f Fn(/)p Fo(.)19 b(The)12 b(delimiter)i(ma)o(y)d(b)q
-(e)i(quoted)f(in)h Fj(old)h Fo(and)e Fj(new)17 b Fo(with)12
-b(a)g(single)h(bac)o(kslash.)240 2496 y(If)g Fn(&)h Fo(app)q(ears)f(in)h
-Fj(new)p Fo(,)f(it)h(is)g(replaced)g(b)o(y)f Fj(old)p Fo(.)20
-b(A)13 b(single)i(bac)o(kslash)e(will)i(quote)e(the)h Fn(&)p
-Fo(.)19 b(The)13 b(\014nal)240 2558 y(delimiter)k(is)f(optional)g(if)f(it)h
-(is)f(the)h(last)f(c)o(haracter)f(on)h(the)h(input)g(line.)0
-2645 y Fn(&)216 b Fo(Rep)q(eat)16 b(the)f(previous)h(substitution.)p
+Fn(.)p Fj(su\016x)s Fo(',)f(lea)o(ving)i(the)f(basename.)0
+445 y Fn(e)216 b Fo(Remo)o(v)o(e)15 b(all)h(but)g(the)f(trailing)h
+(su\016x.)0 532 y Fn(p)216 b Fo(Prin)o(t)15 b(the)g(new)h(command)f
+(but)g(do)g(not)g(execute)h(it.)0 619 y Fn(s/)p Fj(old)r
+Fn(/)p Fj(new)t Fn(/)240 681 y Fo(Substitute)k Fj(new)k
+Fo(for)19 b(the)g(\014rst)g(o)q(ccurrence)i(of)e Fj(old)j
+Fo(in)e(the)f(ev)o(en)o(t)h(line.)34 b(An)o(y)19 b(delimiter)j(ma)o(y)
+240 744 y(b)q(e)e(used)g(in)g(place)g(of)f(`)p Fn(/)p
+Fo('.)31 b(The)19 b(delimiter)i(ma)o(y)e(b)q(e)h(quoted)f(in)h
+Fj(old)h Fo(and)f Fj(new)j Fo(with)d(a)f(single)240 806
+y(bac)o(kslash.)28 b(If)18 b(`)p Fn(&)p Fo(')f(app)q(ears)h(in)h
+Fj(new)p Fo(,)f(it)h(is)f(replaced)h(b)o(y)f Fj(old)p
+Fo(.)28 b(A)18 b(single)h(bac)o(kslash)g(will)g(quote)240
+868 y(the)c(`)p Fn(&)p Fo('.)k(The)d(\014nal)g(delimiter)h(is)e
+(optional)h(if)g(it)f(is)h(the)f(last)g(c)o(haracter)g(on)g(the)g
+(input)i(line.)0 955 y Fn(&)216 b Fo(Rep)q(eat)16 b(the)f(previous)h
+(substitution.)0 1043 y Fn(g)216 b Fo(Cause)17 b(c)o(hanges)g(to)f(b)q
+(e)i(applied)g(o)o(v)o(er)e(the)h(en)o(tire)h(ev)o(en)o(t)e(line.)27
+b(Used)17 b(in)h(conjunction)g(with)f(`)p Fn(s)p Fo(',)240
+1105 y(as)e(in)h Fn(gs/)p Fj(old)r Fn(/)p Fj(new)t Fn(/)p
+Fo(,)f(or)f(with)i(`)p Fn(&)p Fo('.)p eop
+4 5 bop 0 -58 a Fo(4)1497 b(GNU)15 b(History)g(Library)p
eop
-%%Page: 3 5
-4 bop 0 -83 a Fo(Chapter)15 b(1:)k(Using)d(History)f(In)o(teractiv)o(ely)1157
-b(3)0 158 y Fn(g)216 b Fo(Cause)15 b(c)o(hanges)g(to)f(b)q(e)i(applied)h(o)o
-(v)o(er)d(the)h(en)o(tire)g(ev)o(en)o(t)g(line.)21 b(Used)16
-b(in)g(conjunction)g(with)f Fn(s)p Fo(,)f(as)240 221 y(in)i
-Fn(gs/old/new/)p Fo(,)d(or)i(with)h Fn(&)p Fo(.)p eop
-%%Page: 4 6
-5 bop 0 -83 a Fo(4)1497 b(GNU)15 b(History)g(Library)p eop
-%%Page: 5 7
-6 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(History)1039
-b(5)0 158 y Fk(2)41 b(Programming)16 b(with)f(GNU)h(History)62
-347 y Fo(This)e(c)o(hapter)f(describ)q(es)i(ho)o(w)d(to)h(in)o(terface)g
-(programs)f(that)h(y)o(ou)g(write)g(with)g(the)h(GNU)f(History)g(Library)l(.)
-0 409 y(It)j(should)g(b)q(e)g(considered)h(a)f(tec)o(hnical)h(guide.)22
-b(F)l(or)15 b(information)h(on)f(the)h(in)o(teractiv)o(e)g(use)g(of)f(GNU)g
-(History)l(,)0 471 y(see)g(Chapter)g(1)g([Using)h(History)f(In)o(teractiv)o
-(ely],)g(page)g(1.)0 698 y Fm(2.1)33 b(In)n(tro)r(duction)17
-b(to)e(History)62 835 y Fo(Man)o(y)j(programs)g(read)h(input)h(from)e(the)g
-(user)h(a)g(line)h(at)f(a)f(time.)31 b(The)19 b(GNU)g(History)f(library)i(is)
-f(able)0 897 y(to)e(k)o(eep)g(trac)o(k)f(of)h(those)g(lines,)i(asso)q(ciate)e
-(arbitrary)g(data)g(with)g(eac)o(h)g(line,)j(and)d(utilize)i(information)f
-(from)0 960 y(previous)e(lines)h(in)f(comp)q(osing)f(new)h(ones.)62
-1097 y(The)i(programmer)f(using)h(the)g(History)g(library)g(has)g(a)o(v)m
-(ailable)h(functions)g(for)e(remem)o(b)q(ering)h(lines)i(on)d(a)0
-1159 y(history)f(list,)g(asso)q(ciating)g(arbitrary)g(data)f(with)h(a)f
-(line,)j(remo)o(ving)d(lines)j(from)d(the)h(list,)g(searc)o(hing)g(through)0
-1221 y(the)h(list)h(for)e(a)h(line)h(con)o(taining)g(an)f(arbitrary)f(text)h
-(string,)g(and)g(referencing)h(an)o(y)f(line)h(in)g(the)f(list)h(directly)l
-(.)0 1284 y(In)d(addition,)h(a)e(history)h Fj(expansion)h Fo(function)g(is)f
-(a)o(v)m(ailable)h(whic)o(h)g(pro)o(vides)f(for)f(a)h(consisten)o(t)g(user)g
-(in)o(terface)0 1346 y(across)f(di\013eren)o(t)i(programs.)62
-1483 y(The)i(user)g(using)g(programs)f(written)g(with)h(the)g(History)f
-(library)i(has)e(the)h(b)q(ene\014t)h(of)e(a)g(consisten)o(t)h(user)0
-1545 y(in)o(terface)d(with)g(a)f(set)h(of)f(w)o(ell-kno)o(wn)h(commands)g
-(for)f(manipulating)i(the)f(text)f(of)g(previous)h(lines)h(and)f(using)0
-1608 y(that)g(text)g(in)i(new)e(commands.)22 b(The)15 b(basic)i(history)e
-(manipulation)j(commands)d(are)g(similar)i(to)e(the)h(history)0
-1670 y(substitution)g(pro)o(vided)g(b)o(y)f Fn(csh)p Fo(.)62
-1807 y(If)g(the)g(programmer)e(desires,)i(he)g(can)g(use)g(the)f(Readline)j
-(library)l(,)e(whic)o(h)h(includes)g(some)f(history)f(manip-)0
-1870 y(ulation)i(b)o(y)f(default,)h(and)f(has)g(the)g(added)h(adv)m(an)o
-(tage)f(of)g(command)g(line)h(editing.)0 2096 y Fm(2.2)33 b(History)15
-b(Storage)62 2234 y Fo(The)h(history)f(list)h(is)g(an)f(arra)o(y)f(of)g
-(history)i(en)o(tries.)k(A)15 b(history)g(en)o(try)g(is)h(declared)g(as)f
-(follo)o(ws:)120 2358 y Fn(typedef)23 b(struct)g(_hist_entry)f({)168
-2408 y(char)h(*line;)168 2458 y(char)g(*data;)120 2508 y(})h(HIST_ENTRY;)62
-2645 y Fo(The)16 b(history)f(list)h(itself)g(migh)o(t)f(therefore)g(b)q(e)h
-(declared)g(as)p eop
-%%Page: 6 8
-7 bop 0 -83 a Fo(6)1497 b(GNU)15 b(History)g(Library)120 158
-y Fn(HIST_ENTRY)22 b(**the_history_list;)62 302 y Fo(The)16
-b(state)e(of)h(the)g(History)g(library)h(is)g(encapsulated)g(in)o(to)f(a)g
-(single)i(structure:)120 434 y Fn(/*)24 b(A)f(structure)g(used)g(to)h(pass)f
-(the)h(current)f(state)g(of)g(the)h(history)f(stuff)g(around.)g(*/)120
-484 y(typedef)g(struct)g(_hist_state)f({)168 534 y(HIST_ENTRY)g(**entries;)
-214 b(/*)23 b(Pointer)g(to)h(the)f(entries)g(themselves.)f(*/)168
-584 y(int)h(offset;)453 b(/*)23 b(The)h(location)e(pointer)h(within)g(this)h
-(array.)f(*/)168 633 y(int)g(length;)453 b(/*)23 b(Number)g(of)h(elements)f
-(within)g(this)g(array.)g(*/)168 683 y(int)g(size;)501 b(/*)23
-b(Number)g(of)h(slots)f(allocated)g(to)g(this)h(array.)f(*/)168
-733 y(int)g(flags;)120 783 y(})h(HISTORY_STATE;)62 927 y Fo(If)16
-b(the)f(\015ags)g(mem)o(b)q(er)g(includes)j Fn(HS_STIFLED)p
-Fo(,)13 b(the)i(history)h(has)f(b)q(een)h(sti\015ed.)0 1215
-y Fm(2.3)33 b(History)15 b(F)-6 b(unctions)62 1359 y Fo(This)16
-b(section)g(describ)q(es)h(the)e(calling)i(sequence)f(for)f(the)g(v)m(arious)
-h(functions)g(presen)o(t)f(in)h(GNU)f(History)l(.)0 1631 y
-Fi(2.3.1)30 b(Initializing)15 b(History)g(and)g(State)g(Managemen)n(t)62
-1775 y Fo(This)j(section)g(describ)q(es)h(functions)f(used)g(to)e(initialize)
-21 b(and)c(manage)g(the)g(state)g(of)g(the)g(History)g(library)0
-1837 y(when)f(y)o(ou)f(w)o(an)o(t)f(to)g(use)i(the)f(history)g(functions)h
-(in)g(y)o(our)f(program.)1725 2021 y(F)l(unction)-1899 b Fh(void)20
-b Fg(using)p 258 2021 18 3 v 20 w(history)j Ff(\(\))120 2083
-y Fo(Begin)g(a)f(session)g(in)h(whic)o(h)g(the)f(history)g(functions)g(migh)o
-(t)g(b)q(e)h(used.)40 b(This)23 b(initializes)i(the)120 2145
-y(in)o(teractiv)o(e)16 b(v)m(ariables.)1725 2328 y(F)l(unction)-1899
-b Fh(HISTORY_STATE)21 b(*)e Fg(history)p 582 2328 V 21 w(get)p
-680 2328 V 21 w(history)p 876 2328 V 21 w(state)j Ff(\(\))120
-2391 y Fo(Return)16 b(a)f(structure)g(describing)i(the)e(curren)o(t)g(state)f
-(of)h(the)g(input)i(history)l(.)1725 2574 y(F)l(unction)-1899
-b Fh(void)20 b Fg(history)p 302 2574 V 20 w(set)p 393 2574
-V 21 w(history)p 589 2574 V 21 w(state)j Ff(\()p Fn(HISTORY_STATE)13
-b(*state)p Ff(\))120 2636 y Fo(Set)i(the)h(state)e(of)h(the)g(history)g(list)
-h(according)g(to)e Fj(state)p Fo(.)p eop
-%%Page: 7 9
-8 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(History)1039
-b(7)0 158 y Fi(2.3.2)30 b(History)15 b(List)g(Managemen)n(t)62
-295 y Fo(These)i(functions)h(manage)e(individual)k(en)o(tries)d(on)f(the)h
-(history)g(list,)g(or)f(set)h(parameters)e(managing)i(the)0
-358 y(list)f(itself.)1725 520 y(F)l(unction)-1899 b Fh(void)20
-b Fg(add)p 219 520 18 3 v 20 w(history)j Ff(\()p Fn(char)14
-b(*string)p Ff(\))120 582 y Fo(Place)j Fj(string)k Fo(at)16
-b(the)g(end)i(of)e(the)g(history)h(list.)25 b(The)17 b(asso)q(ciated)g(data)f
-(\014eld)h(\(if)g(an)o(y\))f(is)h(set)g(to)120 644 y Fn(NULL)p
-Fo(.)1725 806 y(F)l(unction)-1899 b Fh(HIST_ENTRY)21 b(*)e
-Fg(remo)n(v)n(e)p 509 806 V 20 w(history)k Ff(\()p Fn(int)14
-b(which)p Ff(\))120 868 y Fo(Remo)o(v)o(e)d(history)g(en)o(try)g(at)g
-(o\013set)f Fj(whic)o(h)i Fo(from)f(the)g(history)l(.)19 b(The)11
-b(remo)o(v)o(ed)g(elemen)o(t)h(is)g(returned)120 930 y(so)j(y)o(ou)g(can)g
-(free)g(the)h(line,)g(data,)e(and)i(con)o(taining)g(structure.)1725
-1092 y(F)l(unction)-1899 b Fh(HIST_ENTRY)21 b(*)e Fg(replace)p
-505 1092 V 22 w(history)p 702 1092 V 20 w(en)n(try)24 b Ff(\()p
-Fn(int)14 b(which,)g(char)h(*line,)f(char)208 1155 y(*data)p
-Ff(\))120 1217 y Fo(Mak)o(e)d(the)i(history)f(en)o(try)g(at)f(o\013set)h
-Fj(whic)o(h)h Fo(ha)o(v)o(e)e Fj(line)17 b Fo(and)12 b Fj(data)p
-Fo(.)19 b(This)12 b(returns)g(the)h(old)g(en)o(try)e(so)120
-1279 y(y)o(ou)i(can)g(disp)q(ose)h(of)e(the)h(data.)19 b(In)13
-b(the)g(case)g(of)f(an)h(in)o(v)m(alid)i Fj(whic)o(h)p Fo(,)f(a)f
-Fn(NULL)f Fo(p)q(oin)o(ter)i(is)f(returned.)1725 1441 y(F)l(unction)-1899
-b Fh(void)20 b Fg(sti\015e)p 245 1441 V 21 w(history)j Ff(\()p
-Fn(int)14 b(max)p Ff(\))120 1503 y Fo(Sti\015e)i(the)f(history)h(list,)f
-(remem)o(b)q(ering)h(only)g(the)f(last)g Fj(max)j Fo(en)o(tries.)1725
-1665 y(F)l(unction)-1899 b Fh(int)20 b Fg(unsti\015e)p 283
-1665 V 21 w(history)i Ff(\(\))120 1728 y Fo(Stop)13 b(sti\015ing)h(the)f
-(history)l(.)19 b(This)14 b(returns)f(the)g(previous)h(amoun)o(t)e(the)h
-(history)g(w)o(as)g(sti\015ed.)20 b(The)120 1790 y(v)m(alue)c(is)g(p)q
-(ositiv)o(e)g(if)g(the)f(history)g(w)o(as)g(sti\015ed,)h(negativ)o(e)f(if)g
-(it)h(w)o(asn't.)1725 1952 y(F)l(unction)-1899 b Fh(int)20
-b Fg(history)p 276 1952 V 20 w(is)p 334 1952 V 21 w(sti\015ed)k
-Ff(\(\))120 2014 y Fo(Returns)16 b(non-zero)f(if)h(the)f(history)g(is)h
-(sti\015ed,)g(zero)f(if)g(it)h(is)g(not.)0 2222 y Fi(2.3.3)30
-b(Information)14 b(Ab)r(out)h(the)g(History)g(List)62 2359
-y Fo(These)h(functions)g(return)f(information)g(ab)q(out)g(the)h(en)o(tire)f
-(history)g(list)h(or)f(individual)j(list)f(en)o(tries.)1725
-2521 y(F)l(unction)-1899 b Fh(HIST_ENTRY)21 b(**)e Fg(history)p
-530 2521 V 21 w(list)24 b Ff(\(\))120 2583 y Fo(Return)e(a)e
-Fn(NULL)h Fo(terminated)g(arra)o(y)f(of)g Fn(HIST_ENTRY)g Fo(whic)o(h)i(is)f
-(the)g(curren)o(t)g(input)h(history)l(.)120 2645 y(Elemen)o(t)16
-b(0)f(of)f(this)i(list)g(is)g(the)f(b)q(eginning)i(of)e(time.)20
-b(If)c(there)f(is)h(no)f(history)l(,)g(return)g Fn(NULL)p Fo(.)p
-eop
-%%Page: 8 10
-9 bop 0 -83 a Fo(8)1497 b(GNU)15 b(History)g(Library)1725 158
-y(F)l(unction)-1899 b Fh(int)20 b Fg(where)p 250 158 18 3 v
-20 w(history)j Ff(\(\))120 221 y Fo(Returns)16 b(the)f(o\013set)f(of)h(the)g
-(curren)o(t)g(history)g(elemen)o(t.)1725 378 y(F)l(unction)-1899
-b Fh(HIST_ENTRY)21 b(*)e Fg(curren)n(t)p 512 378 V 21 w(history)k
-Ff(\(\))120 440 y Fo(Return)14 b(the)g(history)g(en)o(try)f(at)h(the)g
-(curren)o(t)f(p)q(osition,)i(as)e(determined)j(b)o(y)d Fn(where_history)h
-(\(\))p Fo(.)120 502 y(If)h(there)h(is)f(no)h(en)o(try)e(there,)h(return)g(a)
-g Fn(NULL)g Fo(p)q(oin)o(ter.)1725 660 y(F)l(unction)-1899
-b Fh(HIST_ENTRY)21 b(*)e Fg(history)p 504 660 V 21 w(get)j
-Ff(\()p Fn(int)15 b(offset)p Ff(\))120 722 y Fo(Return)g(the)g(history)f(en)o
-(try)g(at)g(p)q(osition)i Fj(o\013set)p Fo(,)d(starting)h(from)g
-Fn(history_base)p Fo(.)k(If)c(there)h(is)g(no)120 784 y(en)o(try)g(there,)g
-(or)f(if)i Fj(o\013set)f Fo(is)h(greater)e(than)h(the)h(history)f(length,)g
-(return)g(a)g Fn(NULL)g Fo(p)q(oin)o(ter.)1725 942 y(F)l(unction)-1899
-b Fh(int)20 b Fg(history)p 276 942 V 20 w(total)p 412 942 V
-22 w(b)n(ytes)j Ff(\(\))120 1004 y Fo(Return)17 b(the)f(n)o(um)o(b)q(er)g(of)
-g(b)o(ytes)g(that)f(the)h(primary)g(history)g(en)o(tries)h(are)e(using.)23
-b(This)17 b(function)120 1066 y(returns)e(the)g(sum)h(of)e(the)i(lengths)f
-(of)g(all)h(the)g(lines)g(in)g(the)g(history)l(.)0 1265 y Fi(2.3.4)30
-b(Mo)n(ving)15 b(Around)h(the)f(History)g(List)62 1402 y Fo(These)h
-(functions)g(allo)o(w)f(the)g(curren)o(t)h(index)g(in)o(to)f(the)h(history)f
-(list)h(to)e(b)q(e)i(set)f(or)g(c)o(hanged.)1725 1559 y(F)l(unction)-1899
-b Fh(int)20 b Fg(history)p 276 1559 V 20 w(set)p 367 1559 V
-21 w(p)r(os)h Ff(\()p Fn(int)15 b(pos)p Ff(\))120 1621 y Fo(Set)g(the)h(p)q
-(osition)g(in)g(the)f(history)g(list)h(to)f Fj(p)q(os)p Fo(,)g(an)g(absolute)
-g(index)i(in)o(to)e(the)g(list.)1725 1779 y(F)l(unction)-1899
-b Fh(HIST_ENTRY)21 b(*)e Fg(previous)p 540 1779 V 20 w(history)k
-Ff(\(\))120 1841 y Fo(Bac)o(k)16 b(up)h(the)g(curren)o(t)f(history)h
-(o\013set)e(to)h(the)h(previous)g(history)g(en)o(try)l(,)f(and)h(return)f(a)g
-(p)q(oin)o(ter)120 1903 y(to)f(that)f(en)o(try)l(.)20 b(If)15
+5 6 bop 0 -58 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)1039 b(5)0 183 y Fk(2)41 b(Programming)16 b(with)f(GNU)h
+(History)62 370 y Fo(This)e(c)o(hapter)f(describ)q(es)i(ho)o(w)d(to)h
+(in)o(terface)g(programs)f(that)h(y)o(ou)g(write)g(with)g(the)h(GNU)f
+(History)g(Library)l(.)0 432 y(It)j(should)g(b)q(e)g(considered)h(a)f
+(tec)o(hnical)h(guide.)22 b(F)l(or)15 b(information)h(on)f(the)h(in)o
+(teractiv)o(e)g(use)g(of)f(GNU)g(History)l(,)0 495 y(see)g(Chapter)g(1)
+g([Using)h(History)f(In)o(teractiv)o(ely],)g(page)g(1.)0
+719 y Fm(2.1)33 b(In)n(tro)r(duction)17 b(to)e(History)62
+856 y Fo(Man)o(y)j(programs)g(read)h(input)h(from)e(the)g(user)h(a)g
+(line)h(at)f(a)f(time.)31 b(The)19 b(GNU)g(History)f(library)i(is)f
+(able)0 918 y(to)e(k)o(eep)g(trac)o(k)f(of)h(those)g(lines,)i(asso)q
+(ciate)e(arbitrary)g(data)g(with)g(eac)o(h)g(line,)j(and)d(utilize)i
+(information)f(from)0 980 y(previous)e(lines)h(in)f(comp)q(osing)f(new)
+h(ones.)62 1117 y(The)i(programmer)f(using)h(the)g(History)g(library)g
+(has)g(a)o(v)m(ailable)h(functions)g(for)e(remem)o(b)q(ering)h(lines)i
+(on)d(a)0 1180 y(history)f(list,)g(asso)q(ciating)g(arbitrary)g(data)f
+(with)h(a)f(line,)j(remo)o(ving)d(lines)j(from)d(the)h(list,)g(searc)o
+(hing)g(through)0 1242 y(the)h(list)h(for)e(a)h(line)h(con)o(taining)g
+(an)f(arbitrary)f(text)h(string,)g(and)g(referencing)h(an)o(y)f(line)h
+(in)g(the)f(list)h(directly)l(.)0 1304 y(In)d(addition,)h(a)e(history)h
+Fj(expansion)h Fo(function)g(is)f(a)o(v)m(ailable)h(whic)o(h)g(pro)o
+(vides)f(for)f(a)h(consisten)o(t)g(user)g(in)o(terface)0
+1366 y(across)f(di\013eren)o(t)i(programs.)62 1503 y(The)i(user)g
+(using)g(programs)f(written)g(with)h(the)g(History)f(library)i(has)e
+(the)h(b)q(ene\014t)h(of)e(a)g(consisten)o(t)h(user)0
+1566 y(in)o(terface)d(with)g(a)f(set)h(of)f(w)o(ell-kno)o(wn)h
+(commands)g(for)f(manipulating)i(the)f(text)f(of)g(previous)h(lines)h
+(and)f(using)0 1628 y(that)g(text)g(in)i(new)e(commands.)22
+b(The)15 b(basic)i(history)e(manipulation)j(commands)d(are)g(similar)i
+(to)e(the)h(history)0 1690 y(substitution)g(pro)o(vided)g(b)o(y)f
+Fn(csh)p Fo(.)62 1827 y(If)g(the)g(programmer)e(desires,)i(he)g(can)g
+(use)g(the)f(Readline)j(library)l(,)e(whic)o(h)h(includes)g(some)f
+(history)f(manip-)0 1889 y(ulation)i(b)o(y)f(default,)h(and)f(has)g
+(the)g(added)h(adv)m(an)o(tage)f(of)g(command)g(line)h(editing.)0
+2114 y Fm(2.2)33 b(History)15 b(Storage)62 2251 y Fo(The)h(history)f
+(list)h(is)g(an)f(arra)o(y)f(of)g(history)i(en)o(tries.)k(A)15
+b(history)g(en)o(try)g(is)h(declared)g(as)f(follo)o(ws:)120
+2377 y Fn(typedef)23 b(struct)g(_hist_entry)f({)168 2429
+y(char)h(*line;)168 2481 y(char)g(*data;)120 2533 y(})h(HIST_ENTRY;)62
+2670 y Fo(The)16 b(history)f(list)h(itself)g(migh)o(t)f(therefore)g(b)q
+(e)h(declared)g(as)p eop
+6 7 bop 0 -58 a Fo(6)1497 b(GNU)15 b(History)g(Library)120
+183 y Fn(HIST_ENTRY)22 b(**the_history_list;)62 327 y
+Fo(The)16 b(state)e(of)h(the)g(History)g(library)h(is)g(encapsulated)g
+(in)o(to)f(a)g(single)i(structure:)120 460 y Fn(/*)24
+b(A)f(structure)g(used)g(to)h(pass)f(the)h(current)f(state)g(of)g(the)h
+(history)f(stuff)g(around.)g(*/)120 512 y(typedef)g(struct)g
+(_hist_state)f({)168 564 y(HIST_ENTRY)g(**entries;)214
+b(/*)23 b(Pointer)g(to)h(the)f(entries)g(themselves.)f(*/)168
+616 y(int)h(offset;)453 b(/*)23 b(The)h(location)e(pointer)h(within)g
+(this)h(array.)f(*/)168 668 y(int)g(length;)453 b(/*)23
+b(Number)g(of)h(elements)f(within)g(this)g(array.)g(*/)168
+719 y(int)g(size;)501 b(/*)23 b(Number)g(of)h(slots)f(allocated)g(to)g
+(this)h(array.)f(*/)168 771 y(int)g(flags;)120 823 y(})h
+(HISTORY_STATE;)62 967 y Fo(If)16 b(the)f(\015ags)g(mem)o(b)q(er)g
+(includes)j Fn(HS_STIFLED)p Fo(,)13 b(the)i(history)h(has)f(b)q(een)h
+(sti\015ed.)0 1250 y Fm(2.3)33 b(History)15 b(F)-6 b(unctions)62
+1394 y Fo(This)16 b(section)g(describ)q(es)h(the)e(calling)i(sequence)f
+(for)f(the)g(v)m(arious)h(functions)g(presen)o(t)f(in)h(GNU)f(History)l
+(.)0 1661 y Fi(2.3.1)30 b(Initializing)15 b(History)g(and)g(State)g
+(Managemen)n(t)62 1805 y Fo(This)j(section)g(describ)q(es)h(functions)f
+(used)g(to)e(initialize)21 b(and)c(manage)g(the)g(state)g(of)g(the)g
+(History)g(library)0 1867 y(when)f(y)o(ou)f(w)o(an)o(t)f(to)g(use)i
+(the)f(history)g(functions)h(in)g(y)o(our)f(program.)1725
+2049 y(F)l(unction)-1899 b Fh(void)20 b Fg(using)p 258
+2049 18 3 v 20 w(history)j Ff(\(\))120 2111 y Fo(Begin)g(a)f(session)g
+(in)h(whic)o(h)g(the)f(history)g(functions)g(migh)o(t)g(b)q(e)h(used.)
+40 b(This)23 b(initializes)i(the)120 2173 y(in)o(teractiv)o(e)16
+b(v)m(ariables.)1725 2355 y(F)l(unction)-1899 b Fh(HISTORY_STATE)21
+b(*)e Fg(history)p 582 2355 V 21 w(get)p 680 2355 V 21
+w(history)p 876 2355 V 21 w(state)j Ff(\(\))120 2417
+y Fo(Return)16 b(a)f(structure)g(describing)i(the)e(curren)o(t)g(state)
+f(of)h(the)g(input)i(history)l(.)1725 2599 y(F)l(unction)-1899
+b Fh(void)20 b Fg(history)p 302 2599 V 20 w(set)p 393
+2599 V 21 w(history)p 589 2599 V 21 w(state)j Ff(\()p
+Fn(HISTORY_STATE)13 b(*state)p Ff(\))120 2661 y Fo(Set)i(the)h(state)e
+(of)h(the)g(history)g(list)h(according)g(to)e Fj(state)p
+Fo(.)p eop
+7 8 bop 0 -58 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)1039 b(7)0 183 y Fi(2.3.2)30 b(History)15 b(List)g(Managemen)n
+(t)62 322 y Fo(These)i(functions)h(manage)e(individual)k(en)o(tries)d
+(on)f(the)h(history)g(list,)g(or)f(set)h(parameters)e(managing)i(the)0
+384 y(list)f(itself.)1725 552 y(F)l(unction)-1899 b Fh(void)20
+b Fg(add)p 219 552 18 3 v 20 w(history)j Ff(\()p Fn(char)14
+b(*string)p Ff(\))120 614 y Fo(Place)j Fj(string)k Fo(at)16
+b(the)g(end)i(of)e(the)g(history)h(list.)25 b(The)17
+b(asso)q(ciated)g(data)f(\014eld)h(\(if)g(an)o(y\))f(is)h(set)g(to)120
+677 y Fn(NULL)p Fo(.)1725 844 y(F)l(unction)-1899 b Fh(HIST_ENTRY)21
+b(*)e Fg(remo)n(v)n(e)p 509 844 V 20 w(history)k Ff(\()p
+Fn(int)14 b(which)p Ff(\))120 907 y Fo(Remo)o(v)o(e)d(history)g(en)o
+(try)g(at)g(o\013set)f Fj(whic)o(h)i Fo(from)f(the)g(history)l(.)19
+b(The)11 b(remo)o(v)o(ed)g(elemen)o(t)h(is)g(returned)120
+969 y(so)j(y)o(ou)g(can)g(free)g(the)h(line,)g(data,)e(and)i(con)o
+(taining)g(structure.)1725 1137 y(F)l(unction)-1899 b
+Fh(HIST_ENTRY)21 b(*)e Fg(replace)p 505 1137 V 22 w(history)p
+702 1137 V 20 w(en)n(try)24 b Ff(\()p Fn(int)14 b(which,)g(char)h
+(*line,)f(char)208 1199 y(*data)p Ff(\))120 1261 y Fo(Mak)o(e)d(the)i
+(history)f(en)o(try)g(at)f(o\013set)h Fj(whic)o(h)h Fo(ha)o(v)o(e)e
+Fj(line)17 b Fo(and)12 b Fj(data)p Fo(.)19 b(This)12
+b(returns)g(the)h(old)g(en)o(try)e(so)120 1324 y(y)o(ou)i(can)g(disp)q
+(ose)h(of)e(the)h(data.)19 b(In)13 b(the)g(case)g(of)f(an)h(in)o(v)m
+(alid)i Fj(whic)o(h)p Fo(,)f(a)f Fn(NULL)f Fo(p)q(oin)o(ter)i(is)f
+(returned.)1725 1491 y(F)l(unction)-1899 b Fh(void)20
+b Fg(clear)p 245 1491 V 21 w(history)j Ff(\(\))120 1554
+y Fo(Clear)15 b(the)h(history)f(list)h(b)o(y)f(deleting)i(all)f(the)f
+(en)o(tries.)1725 1721 y(F)l(unction)-1899 b Fh(void)20
+b Fg(sti\015e)p 245 1721 V 21 w(history)j Ff(\()p Fn(int)14
+b(max)p Ff(\))120 1784 y Fo(Sti\015e)i(the)f(history)h(list,)f(remem)o
+(b)q(ering)h(only)g(the)f(last)g Fj(max)j Fo(en)o(tries.)1725
+1951 y(F)l(unction)-1899 b Fh(int)20 b Fg(unsti\015e)p
+283 1951 V 21 w(history)i Ff(\(\))120 2014 y Fo(Stop)13
+b(sti\015ing)h(the)f(history)l(.)19 b(This)14 b(returns)f(the)g
+(previous)h(amoun)o(t)e(the)h(history)g(w)o(as)g(sti\015ed.)20
+b(The)120 2076 y(v)m(alue)c(is)g(p)q(ositiv)o(e)g(if)g(the)f(history)g
+(w)o(as)g(sti\015ed,)h(negativ)o(e)f(if)g(it)h(w)o(asn't.)1725
+2244 y(F)l(unction)-1899 b Fh(int)20 b Fg(history)p 276
+2244 V 20 w(is)p 334 2244 V 21 w(sti\015ed)k Ff(\(\))120
+2306 y Fo(Returns)16 b(non-zero)f(if)h(the)f(history)g(is)h(sti\015ed,)
+g(zero)f(if)g(it)h(is)g(not.)0 2531 y Fi(2.3.3)30 b(Information)14
+b(Ab)r(out)h(the)g(History)g(List)62 2670 y Fo(These)h(functions)g
+(return)f(information)g(ab)q(out)g(the)h(en)o(tire)f(history)g(list)h
+(or)f(individual)j(list)f(en)o(tries.)p eop
+8 9 bop 0 -58 a Fo(8)1497 b(GNU)15 b(History)g(Library)1725
+183 y(F)l(unction)-1899 b Fh(HIST_ENTRY)21 b(**)e Fg(history)p
+530 183 18 3 v 21 w(list)24 b Ff(\(\))120 246 y Fo(Return)e(a)e
+Fn(NULL)h Fo(terminated)g(arra)o(y)f(of)g Fn(HIST_ENTRY)g
+Fo(whic)o(h)i(is)f(the)g(curren)o(t)g(input)h(history)l(.)120
+308 y(Elemen)o(t)16 b(0)f(of)f(this)i(list)g(is)g(the)f(b)q(eginning)i
+(of)e(time.)20 b(If)c(there)f(is)h(no)f(history)l(,)g(return)g
+Fn(NULL)p Fo(.)1725 482 y(F)l(unction)-1899 b Fh(int)20
+b Fg(where)p 250 482 V 20 w(history)j Ff(\(\))120 544
+y Fo(Returns)16 b(the)f(o\013set)f(of)h(the)g(curren)o(t)g(history)g
+(elemen)o(t.)1725 719 y(F)l(unction)-1899 b Fh(HIST_ENTRY)21
+b(*)e Fg(curren)n(t)p 512 719 V 21 w(history)k Ff(\(\))120
+781 y Fo(Return)14 b(the)g(history)g(en)o(try)f(at)h(the)g(curren)o(t)f
+(p)q(osition,)i(as)e(determined)j(b)o(y)d Fn(where_history)h(\(\))p
+Fo(.)120 843 y(If)h(there)h(is)f(no)h(en)o(try)e(there,)h(return)g(a)g
+Fn(NULL)g Fo(p)q(oin)o(ter.)1725 1018 y(F)l(unction)-1899
+b Fh(HIST_ENTRY)21 b(*)e Fg(history)p 504 1018 V 21 w(get)j
+Ff(\()p Fn(int)15 b(offset)p Ff(\))120 1080 y Fo(Return)g(the)g
+(history)f(en)o(try)g(at)g(p)q(osition)i Fj(o\013set)p
+Fo(,)d(starting)h(from)g Fn(history_base)p Fo(.)k(If)c(there)h(is)g(no)
+120 1142 y(en)o(try)g(there,)g(or)f(if)i Fj(o\013set)f
+Fo(is)h(greater)e(than)h(the)h(history)f(length,)g(return)g(a)g
+Fn(NULL)g Fo(p)q(oin)o(ter.)1725 1316 y(F)l(unction)-1899
+b Fh(int)20 b Fg(history)p 276 1316 V 20 w(total)p 412
+1316 V 22 w(b)n(ytes)j Ff(\(\))120 1379 y Fo(Return)17
+b(the)f(n)o(um)o(b)q(er)g(of)g(b)o(ytes)g(that)f(the)h(primary)g
+(history)g(en)o(tries)h(are)e(using.)23 b(This)17 b(function)120
+1441 y(returns)e(the)g(sum)h(of)e(the)i(lengths)f(of)g(all)h(the)g
+(lines)g(in)g(the)g(history)l(.)0 1686 y Fi(2.3.4)30
+b(Mo)n(ving)15 b(Around)h(the)f(History)g(List)62 1827
+y Fo(These)h(functions)g(allo)o(w)f(the)g(curren)o(t)h(index)g(in)o(to)
+f(the)h(history)f(list)h(to)e(b)q(e)i(set)f(or)g(c)o(hanged.)1725
+2001 y(F)l(unction)-1899 b Fh(int)20 b Fg(history)p 276
+2001 V 20 w(set)p 367 2001 V 21 w(p)r(os)h Ff(\()p Fn(int)15
+b(pos)p Ff(\))120 2063 y Fo(Set)g(the)h(p)q(osition)g(in)g(the)f
+(history)g(list)h(to)f Fj(p)q(os)p Fo(,)g(an)g(absolute)g(index)i(in)o
+(to)e(the)g(list.)1725 2238 y(F)l(unction)-1899 b Fh(HIST_ENTRY)21
+b(*)e Fg(previous)p 540 2238 V 20 w(history)k Ff(\(\))120
+2300 y Fo(Bac)o(k)16 b(up)h(the)g(curren)o(t)f(history)h(o\013set)e(to)
+h(the)h(previous)g(history)g(en)o(try)l(,)f(and)h(return)f(a)g(p)q(oin)
+o(ter)120 2362 y(to)f(that)f(en)o(try)l(.)20 b(If)15
b(there)g(is)h(no)f(previous)h(en)o(try)l(,)f(return)g(a)g
-Fn(NULL)g Fo(p)q(oin)o(ter.)1725 2061 y(F)l(unction)-1899 b
-Fh(HIST_ENTRY)21 b(*)e Fg(next)p 439 2061 V 21 w(history)k
-Ff(\(\))120 2123 y Fo(Mo)o(v)o(e)c(the)h(curren)o(t)g(history)f(o\013set)g
-(forw)o(ard)g(to)g(the)h(next)g(history)g(en)o(try)l(,)g(and)g(return)g(the)g
-(a)120 2185 y(p)q(oin)o(ter)c(to)e(that)h(en)o(try)l(.)k(If)d(there)f(is)h
-(no)f(next)g(en)o(try)l(,)g(return)g(a)g Fn(NULL)g Fo(p)q(oin)o(ter.)0
-2384 y Fi(2.3.5)30 b(Searc)n(hing)15 b(the)h(History)f(List)62
-2521 y Fo(These)e(functions)g(allo)o(w)f(searc)o(hing)h(of)f(the)g(history)g
-(list)h(for)f(en)o(tries)h(con)o(taining)g(a)f(sp)q(eci\014c)i(string.)19
-b(Searc)o(h-)0 2583 y(ing)e(ma)o(y)g(b)q(e)g(p)q(erformed)g(b)q(oth)g(forw)o
-(ard)f(and)h(bac)o(kw)o(ard)f(from)g(the)h(curren)o(t)f(history)h(p)q
-(osition.)26 b(The)17 b(searc)o(h)0 2645 y(ma)o(y)d(b)q(e)i
-Fj(anc)o(hored)p Fo(,)f(meaning)h(that)f(the)g(string)g(m)o(ust)g(matc)o(h)f
-(at)h(the)g(b)q(eginning)i(of)e(the)h(history)f(en)o(try)l(.)p
-eop
-%%Page: 9 11
-10 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(History)1039
-b(9)1725 158 y(F)l(unction)-1899 b Fh(int)20 b Fg(history)p
-276 158 18 3 v 20 w(searc)n(h)j Ff(\()p Fn(char)14 b(*string,)g(int)h
-(direction)p Ff(\))120 221 y Fo(Searc)o(h)k(the)g(history)g(for)f
-Fj(string)p Fo(,)i(starting)e(at)g(the)h(curren)o(t)g(history)g(o\013set.)30
-b(If)19 b Fj(direction)h Fn(<)f Fo(0,)120 283 y(then)14 b(the)f(searc)o(h)g
-(is)h(through)e(previous)i(en)o(tries,)g(else)g(through)f(subsequen)o(t.)20
-b(If)13 b Fj(string)k Fo(is)d(found,)120 345 y(then)f(the)g(curren)o(t)g
-(history)g(index)i(is)e(set)g(to)f(that)h(history)g(en)o(try)l(,)f(and)i(the)
-f(v)m(alue)h(returned)f(is)h(the)120 407 y(o\013set)h(in)i(the)f(line)i(of)d
-(the)h(en)o(try)g(where)g Fj(string)k Fo(w)o(as)c(found.)22
-b(Otherwise,)17 b(nothing)f(is)h(c)o(hanged,)120 470 y(and)e(a)g(-1)g(is)h
-(returned.)1725 659 y(F)l(unction)-1899 b Fh(int)20 b Fg(history)p
-276 659 V 20 w(searc)n(h)p 452 659 V 21 w(pre\014x)i Ff(\()p
-Fn(char)15 b(*string,)f(int)g(direction)p Ff(\))120 721 y Fo(Searc)o(h)22
-b(the)h(history)f(for)f Fj(string)p Fo(,)j(starting)e(at)f(the)i(curren)o(t)f
-(history)g(o\013set.)40 b(The)22 b(searc)o(h)g(is)120 783 y(anc)o(hored:)i
-(matc)o(hing)18 b(lines)h(m)o(ust)d(b)q(egin)j(with)f Fj(string)p
-Fo(.)26 b(If)17 b Fj(direction)i Fn(<)e Fo(0,)g(then)h(the)f(searc)o(h)g(is)
-120 845 y(through)e(previous)h(en)o(tries,)f(else)i(through)d(subsequen)o(t.)
-21 b(If)16 b Fj(string)j Fo(is)d(found,)f(then)h(the)f(curren)o(t)120
-908 y(history)20 b(index)i(is)e(set)g(to)g(that)f(en)o(try)l(,)i(and)f(the)g
-(return)h(v)m(alue)g(is)g(0.)34 b(Otherwise,)22 b(nothing)e(is)120
-970 y(c)o(hanged,)15 b(and)h(a)e(-1)h(is)h(returned.)1725 1159
-y(F)l(unction)-1899 b Fh(int)20 b Fg(history)p 276 1159 V 20
-w(searc)n(h)p 452 1159 V 21 w(p)r(os)h Ff(\()p Fn(char)15 b(*string,)f(int)g
-(direction,)g(int)h(pos)p Ff(\))120 1221 y Fo(Searc)o(h)d(for)f
+Fn(NULL)g Fo(p)q(oin)o(ter.)1725 2537 y(F)l(unction)-1899
+b Fh(HIST_ENTRY)21 b(*)e Fg(next)p 439 2537 V 21 w(history)k
+Ff(\(\))120 2599 y Fo(Mo)o(v)o(e)c(the)h(curren)o(t)g(history)f
+(o\013set)g(forw)o(ard)g(to)g(the)h(next)g(history)g(en)o(try)l(,)g
+(and)g(return)g(the)g(a)120 2661 y(p)q(oin)o(ter)c(to)e(that)h(en)o
+(try)l(.)k(If)d(there)f(is)h(no)f(next)g(en)o(try)l(,)g(return)g(a)g
+Fn(NULL)g Fo(p)q(oin)o(ter.)p eop
+9 10 bop 0 -58 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)1039 b(9)0 183 y Fi(2.3.5)30 b(Searc)n(hing)15
+b(the)h(History)f(List)62 320 y Fo(These)e(functions)g(allo)o(w)f
+(searc)o(hing)h(of)f(the)g(history)g(list)h(for)f(en)o(tries)h(con)o
+(taining)g(a)f(sp)q(eci\014c)i(string.)19 b(Searc)o(h-)0
+382 y(ing)e(ma)o(y)g(b)q(e)g(p)q(erformed)g(b)q(oth)g(forw)o(ard)f(and)
+h(bac)o(kw)o(ard)f(from)g(the)h(curren)o(t)f(history)h(p)q(osition.)26
+b(The)17 b(searc)o(h)0 445 y(ma)o(y)d(b)q(e)i Fj(anc)o(hored)p
+Fo(,)f(meaning)h(that)f(the)g(string)g(m)o(ust)g(matc)o(h)f(at)h(the)g
+(b)q(eginning)i(of)e(the)h(history)f(en)o(try)l(.)1725
+600 y(F)l(unction)-1899 b Fh(int)20 b Fg(history)p 276
+600 18 3 v 20 w(searc)n(h)j Ff(\()p Fn(char)14 b(*string,)g(int)h
+(direction)p Ff(\))120 662 y Fo(Searc)o(h)k(the)g(history)g(for)f
+Fj(string)p Fo(,)i(starting)e(at)g(the)h(curren)o(t)g(history)g
+(o\013set.)30 b(If)19 b Fj(direction)h Fn(<)f Fo(0,)120
+724 y(then)14 b(the)f(searc)o(h)g(is)h(through)e(previous)i(en)o
+(tries,)g(else)g(through)f(subsequen)o(t.)20 b(If)13
+b Fj(string)k Fo(is)d(found,)120 786 y(then)f(the)g(curren)o(t)g
+(history)g(index)i(is)e(set)g(to)f(that)h(history)g(en)o(try)l(,)f(and)
+i(the)f(v)m(alue)h(returned)f(is)h(the)120 849 y(o\013set)h(in)i(the)f
+(line)i(of)d(the)h(en)o(try)g(where)g Fj(string)k Fo(w)o(as)c(found.)22
+b(Otherwise,)17 b(nothing)f(is)h(c)o(hanged,)120 911
+y(and)e(a)g(-1)g(is)h(returned.)1725 1066 y(F)l(unction)-1899
+b Fh(int)20 b Fg(history)p 276 1066 V 20 w(searc)n(h)p
+452 1066 V 21 w(pre\014x)i Ff(\()p Fn(char)15 b(*string,)f(int)g
+(direction)p Ff(\))120 1128 y Fo(Searc)o(h)22 b(the)h(history)f(for)f
+Fj(string)p Fo(,)j(starting)e(at)f(the)i(curren)o(t)f(history)g
+(o\013set.)40 b(The)22 b(searc)o(h)g(is)120 1190 y(anc)o(hored:)i(matc)
+o(hing)18 b(lines)h(m)o(ust)d(b)q(egin)j(with)f Fj(string)p
+Fo(.)26 b(If)17 b Fj(direction)i Fn(<)e Fo(0,)g(then)h(the)f(searc)o(h)
+g(is)120 1253 y(through)e(previous)h(en)o(tries,)f(else)i(through)d
+(subsequen)o(t.)21 b(If)16 b Fj(string)j Fo(is)d(found,)f(then)h(the)f
+(curren)o(t)120 1315 y(history)20 b(index)i(is)e(set)g(to)g(that)f(en)o
+(try)l(,)i(and)f(the)g(return)h(v)m(alue)g(is)g(0.)34
+b(Otherwise,)22 b(nothing)e(is)120 1377 y(c)o(hanged,)15
+b(and)h(a)e(-1)h(is)h(returned.)1725 1532 y(F)l(unction)-1899
+b Fh(int)20 b Fg(history)p 276 1532 V 20 w(searc)n(h)p
+452 1532 V 21 w(p)r(os)h Ff(\()p Fn(char)15 b(*string,)f(int)g
+(direction,)g(int)h(pos)p Ff(\))120 1594 y Fo(Searc)o(h)d(for)f
Fj(string)k Fo(in)d(the)g(history)f(list,)i(starting)e(at)g
Fj(p)q(os)p Fo(,)h(an)f(absolute)h(index)h(in)o(to)e(the)h(list.)19
-b(If)12 b Fj(di-)120 1283 y(rection)g Fo(is)h(negativ)o(e,)f(the)g(searc)o(h)
-g(pro)q(ceeds)h(bac)o(kw)o(ard)e(from)g Fj(p)q(os)p Fo(,)i(otherwise)f(forw)o
-(ard.)17 b(Returns)120 1345 y(the)e(absolute)h(index)g(of)f(the)g(history)h
-(elemen)o(t)f(where)h Fj(string)j Fo(w)o(as)14 b(found,)h(or)g(-1)g
-(otherwise.)0 1634 y Fi(2.3.6)30 b(Managing)14 b(the)i(History)f(File)62
-1780 y Fo(The)f(History)g(library)h(can)f(read)g(the)g(history)g(from)f(and)i
-(write)f(it)g(to)f(a)h(\014le.)20 b(This)15 b(section)g(do)q(cumen)o(ts)f
-(the)0 1842 y(functions)i(for)f(managing)g(a)f(history)i(\014le.)1725
-2031 y(F)l(unction)-1899 b Fh(int)20 b Fg(read)p 211 2031 V
-20 w(history)i Ff(\()p Fn(char)15 b(*filename)p Ff(\))120 2093
-y Fo(Add)i(the)f(con)o(ten)o(ts)g(of)g Fj(\014lename)k Fo(to)c(the)h(history)
-f(list,)h(a)f(line)i(at)e(a)g(time.)24 b(If)17 b Fj(\014lename)j
-Fo(is)d Fn(NULL)p Fo(,)120 2155 y(then)f(read)f(from)f(`)p
-Fn(~/.history)p Fo('.)k(Returns)e(0)e(if)i(successful,)g(or)f(errno)g(if)h
-(not.)1725 2344 y(F)l(unction)-1899 b Fh(int)20 b Fg(read)p
-211 2344 V 20 w(history)p 406 2344 V 20 w(range)i Ff(\()p Fn(char)15
-b(*filename,)e(int)i(from,)g(int)f(to)p Ff(\))120 2407 y Fo(Read)j(a)e(range)
-h(of)f(lines)j(from)d Fj(\014lename)p Fo(,)i(adding)f(them)g(to)f(the)h
-(history)g(list.)23 b(Start)15 b(reading)i(at)120 2469 y(line)f
-Fj(from)f Fo(and)g(end)g(at)f Fj(to)p Fo(.)19 b(If)d Fj(from)e
+b(If)12 b Fj(di-)120 1656 y(rection)g Fo(is)h(negativ)o(e,)f(the)g
+(searc)o(h)g(pro)q(ceeds)h(bac)o(kw)o(ard)e(from)g Fj(p)q(os)p
+Fo(,)i(otherwise)f(forw)o(ard.)17 b(Returns)120 1719
+y(the)e(absolute)h(index)g(of)f(the)g(history)h(elemen)o(t)f(where)h
+Fj(string)j Fo(w)o(as)14 b(found,)h(or)g(-1)g(otherwise.)0
+1912 y Fi(2.3.6)30 b(Managing)14 b(the)i(History)f(File)62
+2049 y Fo(The)f(History)g(library)h(can)f(read)g(the)g(history)g(from)f
+(and)i(write)f(it)g(to)f(a)h(\014le.)20 b(This)15 b(section)g(do)q
+(cumen)o(ts)f(the)0 2111 y(functions)i(for)f(managing)g(a)f(history)i
+(\014le.)1725 2266 y(F)l(unction)-1899 b Fh(int)20 b
+Fg(read)p 211 2266 V 20 w(history)i Ff(\()p Fn(char)15
+b(*filename)p Ff(\))120 2328 y Fo(Add)i(the)f(con)o(ten)o(ts)g(of)g
+Fj(\014lename)k Fo(to)c(the)h(history)f(list,)h(a)f(line)i(at)e(a)g
+(time.)24 b(If)17 b Fj(\014lename)j Fo(is)d Fn(NULL)p
+Fo(,)120 2391 y(then)f(read)f(from)f(`)p Fn(~/.history)p
+Fo('.)k(Returns)e(0)e(if)i(successful,)g(or)f(errno)g(if)h(not.)1725
+2545 y(F)l(unction)-1899 b Fh(int)20 b Fg(read)p 211
+2545 V 20 w(history)p 406 2545 V 20 w(range)i Ff(\()p
+Fn(char)15 b(*filename,)e(int)i(from,)g(int)f(to)p Ff(\))120
+2608 y Fo(Read)j(a)e(range)h(of)f(lines)j(from)d Fj(\014lename)p
+Fo(,)i(adding)f(them)g(to)f(the)h(history)g(list.)23
+b(Start)15 b(reading)i(at)120 2670 y(line)f Fj(from)f
+Fo(and)g(end)g(at)f Fj(to)p Fo(.)19 b(If)d Fj(from)e
Fo(is)h(zero,)f(start)g(at)g(the)h(b)q(eginning.)22 b(If)15
-b Fj(to)i Fo(is)e(less)g(than)g Fj(from)p Fo(,)120 2531 y(then)i(read)g(un)o
-(til)h(the)f(end)g(of)g(the)g(\014le.)25 b(If)17 b Fj(\014lename)k
-Fo(is)c Fn(NULL)p Fo(,)f(then)i(read)e(from)g(`)p Fn(~/.history)p
-Fo('.)120 2593 y(Returns)g(0)f(if)g(successful,)h(or)f Fn(errno)g
-Fo(if)g(not.)p eop
-%%Page: 10 12
-11 bop 0 -83 a Fo(10)1474 b(GNU)15 b(History)g(Library)1725
-158 y(F)l(unction)-1899 b Fh(int)20 b Fg(write)p 229 158 18
-3 v 22 w(history)i Ff(\()p Fn(char)15 b(*filename)p Ff(\))120
-221 y Fo(W)l(rite)20 b(the)g(curren)o(t)f(history)h(to)f Fj(\014lename)p
-Fo(,)i(o)o(v)o(erwriting)f Fj(\014lename)j Fo(if)d(necessary)l(.)34
-b(If)20 b Fj(\014lename)120 283 y Fo(is)d Fn(NULL)p Fo(,)g(then)g(write)g
-(the)g(history)g(list)h(to)e(`)p Fn(~/.history)p Fo('.)23 b(V)l(alues)18
-b(returned)g(are)e(as)h(in)h Fn(read_)120 345 y(history)c(\(\))p
-Fo(.)1725 504 y(F)l(unction)-1899 b Fh(int)20 b Fg(app)r(end)p
-285 504 V 19 w(history)j Ff(\()p Fn(int)14 b(nelements,)g(char)h(*filename)p
-Ff(\))120 566 y Fo(App)q(end)i(the)e(last)g Fj(nelemen)o(ts)j
-Fo(of)d(the)g(history)g(list)h(to)f Fj(\014lename)p Fo(.)1725
-724 y(F)l(unction)-1899 b Fh(int)20 b Fg(history)p 276 724
-V 20 w(truncate)p 507 724 V 21 w(\014le)k Ff(\()p Fn(char)14
-b(*filename,)g(int)h(nlines)p Ff(\))120 787 y Fo(T)l(runcate)g(the)h(history)
-f(\014le)h Fj(\014lename)p Fo(,)g(lea)o(ving)g(only)g(the)f(last)g
-Fj(nlines)k Fo(lines.)0 988 y Fi(2.3.7)30 b(History)15 b(Expansion)62
-1125 y Fo(These)h(functions)g(implemen)o(t)g Fn(csh)p Fo(-lik)o(e)g(history)g
-(expansion.)1725 1283 y(F)l(unction)-1899 b Fh(int)20 b Fg(history)p
-276 1283 V 20 w(expand)j Ff(\()p Fn(char)14 b(*string,)g(char)h(**output)p
-Ff(\))120 1345 y Fo(Expand)20 b Fj(string)p Fo(,)f(placing)i(the)e(result)h
-(in)o(to)f Fj(output)p Fo(,)h(a)f(p)q(oin)o(ter)h(to)e(a)h(string)h(\(see)f
-(Section)h(1.1)120 1408 y([History)15 b(In)o(teraction],)f(page)h(1\).)20
-b(Returns:)120 1555 y Fn(0)216 b Fo(If)21 b(no)g(expansions)h(to)q(ok)e
-(place)h(\(or,)g(if)h(the)f(only)g(c)o(hange)g(in)h(the)f(text)f(w)o(as)g
-(the)360 1618 y(de-slashifying)d(of)e(the)g(history)h(expansion)g(c)o
-(haracter\);)120 1701 y Fn(1)216 b Fo(if)16 b(expansions)g(did)g(tak)o(e)e
-(place;)120 1785 y Fn(-1)192 b Fo(if)16 b(there)f(w)o(as)f(an)h(error)g(in)h
-(expansion;)120 1869 y Fn(2)216 b Fo(if)14 b(the)f(returned)h(line)h(should)f
-(only)g(b)q(e)f(displa)o(y)o(ed,)i(but)e(not)g(executed,)h(as)f(with)h(the)
-360 1931 y Fn(:p)h Fo(mo)q(di\014er)h(\(see)f(Section)h(1.1.3)e([Mo)q
-(di\014ers],)h(page)g(2\).)120 2079 y(If)g(an)h(error)e(o)q(curred)i(in)g
-(expansion,)f(then)h Fj(output)g Fo(con)o(tains)f(a)g(descriptiv)o(e)i(error)
-d(message.)1725 2238 y(F)l(unction)-1899 b Fh(char)20 b(*)f
-Fg(history)p 347 2238 V 21 w(arg)p 449 2238 V 19 w(extract)24
-b Ff(\()p Fn(int)14 b(first,)h(int)g(last,)f(char)h(*string)p
-Ff(\))120 2300 y Fo(Extract)10 b(a)h(string)g(segmen)o(t)g(consisting)h(of)f
-(the)g Fj(\014rst)h Fo(through)f Fj(last)h Fo(argumen)o(ts)e(presen)o(t)h(in)
-h Fj(string)p Fo(.)120 2362 y(Argumen)o(ts)j(are)g(brok)o(en)g(up)g(as)g(in)h
-(Bash.)1725 2521 y(F)l(unction)-1899 b Fh(char)20 b(*)f Fg(get)p
-249 2521 V 21 w(history)p 445 2521 V 20 w(ev)n(en)n(t)25 b
-Ff(\()p Fn(char)14 b(*string,)g(int)h(*cindex,)f(int)h(qchar)p
-Ff(\))120 2583 y Fo(Returns)e(the)f(text)f(of)h(the)g(history)g(ev)o(en)o(t)f
-(b)q(eginning)k(at)c Fj(string)16 b Fn(+)c Fj(*cindex)p Fo(.)20
-b Fj(*cindex)c Fo(is)d(mo)q(di\014ed)120 2645 y(to)h(p)q(oin)o(t)h(to)f
-(after)h(the)f(ev)o(en)o(t)h(sp)q(eci\014er.)21 b(A)o(t)15
-b(function)g(en)o(try)l(,)f Fj(cindex)20 b Fo(p)q(oin)o(ts)15
-b(to)f(the)h(index)h(in)o(to)p eop
-%%Page: 11 13
-12 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(History)1017
-b(11)120 158 y Fj(string)17 b Fo(where)d(the)f(history)h(ev)o(en)o(t)f(sp)q
-(eci\014cation)i(b)q(egins.)20 b Fj(qc)o(har)d Fo(is)c(a)g(c)o(haracter)g
-(that)g(is)h(allo)o(w)o(ed)120 221 y(to)h(end)g(the)h(ev)o(en)o(t)f(sp)q
-(eci\014cation)i(in)f(addition)g(to)f(the)g(\\normal")g(terminating)g(c)o
-(haracters.)1725 394 y(F)l(unction)-1899 b Fh(char)20 b(**)f
-Fg(history)p 373 394 18 3 v 21 w(tok)n(enize)25 b Ff(\()p Fn(char)14
-b(*string)p Ff(\))120 456 y Fo(Return)k(an)f(arra)o(y)f(of)h(tok)o(ens)f
-(parsed)i(out)e(of)h Fj(string)p Fo(,)g(m)o(uc)o(h)h(as)e(the)i(shell)g(migh)
-o(t.)26 b(The)17 b(tok)o(ens)120 519 y(are)c(split)h(on)f(white)g(space)h
-(and)f(on)g(the)g(c)o(haracters)f Fn(\(\)<>;&|$)p Fo(,)g(and)h(shell)i
-(quoting)e(con)o(v)o(en)o(tions)120 581 y(are)i(ob)q(ey)o(ed.)0
-840 y Fm(2.4)33 b(History)15 b(V)-6 b(ariables)62 981 y Fo(This)16
-b(section)g(describ)q(es)h(the)e(externally)h(visible)i(v)m(ariables)e(exp)q
-(orted)g(b)o(y)f(the)g(GNU)g(History)g(Library)l(.)1736 1155
-y(V)l(ariable)-1899 b Fh(int)20 b Fg(history)p 276 1155 V 20
-w(base)120 1217 y Fo(The)15 b(logical)i(o\013set)d(of)h(the)g(\014rst)g(en)o
-(try)g(in)h(the)f(history)g(list.)1736 1390 y(V)l(ariable)-1899
-b Fh(int)20 b Fg(history)p 276 1390 V 20 w(length)120 1453
-y Fo(The)15 b(n)o(um)o(b)q(er)h(of)f(en)o(tries)g(curren)o(tly)h(stored)f(in)
-h(the)f(history)g(list.)1736 1626 y(V)l(ariable)-1899 b Fh(int)20
-b Fg(max)p 208 1626 V 19 w(input)p 360 1626 V 21 w(history)120
-1689 y Fo(The)12 b(maxim)o(um)g(n)o(um)o(b)q(er)g(of)f(history)h(en)o(tries.)
-19 b(This)12 b(m)o(ust)f(b)q(e)h(c)o(hanged)g(using)h Fn(stifle_history)120
-1751 y(\(\))p Fo(.)1736 1924 y(V)l(ariable)-1899 b Fh(char)20
-b Fg(history)p 302 1924 V 20 w(expansion)p 569 1924 V 21 w(c)n(har)120
-1987 y Fo(The)15 b(c)o(haracter)g(that)f(starts)g(a)h(history)g(ev)o(en)o(t.)
-20 b(The)15 b(default)h(is)g(`)p Fn(!)p Fo('.)1736 2160 y(V)l(ariable)-1899
-b Fh(char)20 b Fg(history)p 302 2160 V 20 w(subst)p 454 2160
-V 20 w(c)n(har)120 2222 y Fo(The)13 b(c)o(haracter)e(that)h(in)o(v)o(ok)o(es)
-g(w)o(ord)g(substitution)h(if)g(found)g(at)e(the)i(start)e(of)h(a)g(line.)21
-b(The)12 b(default)120 2285 y(is)k(`)p Fn(^)p Fo('.)1736 2458
-y(V)l(ariable)-1899 b Fh(char)20 b Fg(history)p 302 2458 V
-20 w(commen)n(t)p 552 2458 V 19 w(c)n(har)120 2521 y Fo(During)12
-b(tok)o(enization,)h(if)f(this)h(c)o(haracter)e(is)i(seen)f(as)g(the)g
-(\014rst)f(c)o(haracter)g(of)h(a)g(w)o(ord,)f(then)i(it)f(and)120
-2583 y(all)19 b(subsequen)o(t)g(c)o(haracters)e(up)h(to)g(a)f(newline)j(are)e
-(ignored,)h(suppressing)g(history)f(expansion)120 2645 y(for)d(the)g
-(remainder)h(of)f(the)g(line.)21 b(This)16 b(is)g(disabled)h(b)o(y)e
-(default.)p eop
-%%Page: 12 14
-13 bop 0 -83 a Fo(12)1474 b(GNU)15 b(History)g(Library)1736
-158 y(V)l(ariable)-1899 b Fh(char)20 b(*)f Fg(history)p 347
-158 18 3 v 21 w(no)p 429 158 V 20 w(expand)p 629 158 V 20 w(c)n(hars)120
-221 y Fo(The)f(list)g(of)g(c)o(haracters)e(whic)o(h)j(inhibit)h(history)d
-(expansion)i(if)f(found)g(immediately)h(follo)o(wing)120 283
-y Fj(history)p 261 283 14 2 v 16 w(expansion)p 472 283 V 18
-w(c)o(har)p Fo(.)g(The)d(default)f(is)h(whitespace)g(and)g(`)p
-Fn(=)p Fo('.)0 575 y Fm(2.5)33 b(History)15 b(Programming)h(Example)62
-720 y Fo(The)g(follo)o(wing)g(program)e(demonstrates)g(simple)j(use)e(of)g
-(the)g(GNU)g(History)g(Library)l(.)120 852 y Fn(main)23 b(\(\))120
-902 y({)168 951 y(char)g(line[1024],)f(*t;)168 1001 y(int)h(len,)g(done)h(=)g
-(0;)168 1101 y(line[0])f(=)g(0;)168 1201 y(using_history)f(\(\);)168
-1250 y(while)h(\(!done\))215 1300 y({)263 1350 y(printf)g(\("history$)g("\);)
-263 1400 y(fflush)g(\(stdout\);)263 1450 y(t)h(=)g(fgets)f(\(line,)g(sizeof)g
-(\(line\))g(-)h(1,)f(stdin\);)263 1499 y(if)h(\(t)f(&&)h(*t\))311
-1549 y({)359 1599 y(len)f(=)h(strlen)f(\(t\);)359 1649 y(if)g(\(t[len)g(-)h
-(1])g(==)f('\\n'\))406 1699 y(t[len)h(-)f(1])h(=)g('\\0';)311
-1748 y(})263 1848 y(if)g(\(!t\))311 1898 y(strcpy)f(\(line,)g("quit"\);)263
-1998 y(if)h(\(line[0]\))311 2047 y({)359 2097 y(char)f(*expansion;)359
-2147 y(int)g(result;)359 2247 y(result)g(=)g(history_expand)f(\(line,)h
-(&expansion\);)359 2296 y(if)g(\(result\))406 2346 y(fprintf)g(\(stderr,)g
-("\045s\\n",)g(expansion\);)359 2446 y(if)g(\(result)g(<)h(0)g(||)f(result)g
-(==)h(2\))406 2496 y({)454 2545 y(free)f(\(expansion\);)454
-2595 y(continue;)406 2645 y(})p eop
-%%Page: 13 15
-14 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(History)1017
-b(13)359 208 y Fn(add_history)22 b(\(expansion\);)359 258 y(strncpy)h
-(\(line,)g(expansion,)f(sizeof)h(\(line\))g(-)h(1\);)359 308
-y(free)f(\(expansion\);)311 358 y(})263 457 y(if)h(\(strcmp)f(\(line,)g
-("quit"\))g(==)g(0\))311 507 y(done)g(=)h(1;)263 557 y(else)f(if)h(\(strcmp)f
-(\(line,)g("save"\))g(==)h(0\))311 607 y(write_history)e(\("history_file"\);)
-263 656 y(else)h(if)h(\(strcmp)f(\(line,)g("read"\))g(==)h(0\))311
-706 y(read_history)e(\("history_file"\);)263 756 y(else)h(if)h(\(strcmp)f
-(\(line,)g("list"\))g(==)h(0\))311 806 y({)359 856 y(register)e(HIST_ENTRY)h
-(**the_list;)359 906 y(register)f(int)i(i;)359 1005 y(the_list)e(=)i
-(history_list)e(\(\);)359 1055 y(if)h(\(the_list\))406 1105
-y(for)h(\(i)f(=)h(0;)g(the_list[i];)e(i++\))454 1155 y(printf)h(\("\045d:)g
-(\045s\\n",)g(i)h(+)g(history_base,)e(the_list[i]->line\);)311
-1204 y(})263 1254 y(else)h(if)h(\(strncmp)f(\(line,)g("delete",)g(6\))g(==)h
-(0\))311 1304 y({)359 1354 y(int)f(which;)359 1404 y(if)g(\(\(sscanf)g
-(\(line)g(+)h(6,)f("\045d",)h(&which\)\))e(==)i(1\))406 1453
-y({)454 1503 y(HIST_ENTRY)f(*entry)g(=)g(remove_history)f(\(which\);)454
-1553 y(if)i(\(!entry\))502 1603 y(fprintf)f(\(stderr,)f("No)i(such)f(entry)g
-(\045d\\n",)g(which\);)454 1653 y(else)502 1703 y({)550 1752
-y(free)g(\(entry->line\);)550 1802 y(free)g(\(entry\);)502
-1852 y(})406 1902 y(})359 1952 y(else)406 2001 y({)454 2051
-y(fprintf)g(\(stderr,)g("non-numeric)f(arg)h(given)h(to)f(`delete'\\n"\);)406
-2101 y(})311 2151 y(})215 2201 y(})120 2250 y(})p eop
-%%Page: 14 16
-15 bop 0 -83 a Fo(14)1474 b(GNU)15 b(History)g(Library)p eop
-%%Page: 15 17
-16 bop 0 -83 a Fo(App)q(endix)17 b(A:)e(Concept)g(Index)1346
-b(15)0 158 y Fk(App)r(endix)13 b(A)41 b(Concept)15 b(Index)0
-405 y Fm(A)0 471 y Fe(anc)o(hored)f(searc)o(h)5 b Fd(:)i(:)f(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)18 b Fe(8)0
-579 y Fm(E)0 646 y Fe(ev)o(en)o(t)13 b(designators)g Fd(:)6
-b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)23
-b Fe(1)1015 405 y(expansion)5 b Fd(:)k(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)18 b Fe(1)1015
-521 y Fm(H)1015 587 y Fe(history)d(ev)o(en)o(ts)5 b Fd(:)i(:)f(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)18 b
-Fe(1)1015 646 y(History)c(Searc)o(hing)7 b Fd(:)h(:)e(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)20 b Fe(8)p eop
-%%Page: 16 18
-17 bop 0 -83 a Fo(16)1474 b(GNU)15 b(History)g(Library)p eop
-%%Page: 17 19
-18 bop 0 -83 a Fo(App)q(endix)17 b(B:)e(F)l(unction)h(and)g(V)l(ariable)g
-(Index)1069 b(17)0 158 y Fk(App)r(endix)13 b(B)41 b(F)-7 b(unction)15
-b(and)g(V)-7 b(ariable)14 b(Index)0 405 y Fm(A)0 471 y Fc(add)p
-62 471 12 2 v 13 w(history)8 b Fd(:)s(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)20 b Fe(7)0 529 y Fc(append)p
-122 529 V 12 w(history)9 b Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)24 b Fe(10)0 654 y Fm(C)0 720 y Fc(current)p
-142 720 V 11 w(history)9 b Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)24 b Fe(8)0 845 y Fm(G)0 911 y Fc(get)p 62 911
-V 13 w(history)p 215 911 V 11 w(event)9 b Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)23 b Fe(10)0 1036 y Fm(H)0 1102 y Fc(history)p
-142 1102 V 11 w(arg)p 213 1102 V 13 w(extract)8 b Fd(:)t(:)e(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)21 b Fe(10)0 1160 y Fc(history)p 142 1160
-V 11 w(base)e Fd(:)6 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)20 b Fe(11)0 1218 y Fc(history)p 142 1218 V 11 w(comment)p
-293 1218 V 12 w(char)g Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)21
-b Fe(11)0 1276 y Fc(history)p 142 1276 V 11 w(expand)10 b Fd(:)c(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fe(10)0
-1335 y Fc(history)p 142 1335 V 11 w(expansion)p 333 1335 V
-11 w(char)17 b Fd(:)7 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)19 b Fe(11)0
-1393 y Fc(history)p 142 1393 V 11 w(get)8 b Fd(:)d(:)h(:)g(:)g(:)g(:)g(:)h(:)
-f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)20 b Fe(8)0
-1451 y Fc(history)p 142 1451 V 11 w(get)p 213 1451 V 13 w(history)p
-366 1451 V 12 w(state)t Fd(:)t(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)17 b Fe(6)0
-1509 y Fc(history)p 142 1509 V 11 w(is)p 193 1509 V 14 w(stifled)7
-b Fd(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)23 b
-Fe(7)0 1567 y Fc(history)p 142 1567 V 11 w(length)16 b Fd(:)6
-b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)18
-b Fe(11)0 1625 y Fc(history)p 142 1625 V 11 w(list)7 b Fd(:)t(:)g(:)f(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)19
-b Fe(7)0 1683 y Fc(history)p 142 1683 V 11 w(no)p 193 1683
-V 14 w(expand)p 327 1683 V 12 w(chars)f Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)20
-b Fe(12)0 1741 y Fc(history)p 142 1741 V 11 w(search)t Fd(:)t(:)6
-b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)17
-b Fe(9)0 1800 y Fc(history)p 142 1800 V 11 w(search)p 273 1800
-V 12 w(pos)9 b Fd(:)d(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)23
-b Fe(9)0 1858 y Fc(history)p 142 1858 V 11 w(search)p 273 1858
-V 12 w(prefix)6 b Fd(:)t(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)19
-b Fe(9)0 1916 y Fc(history)p 142 1916 V 11 w(set)p 213 1916
-V 13 w(history)p 366 1916 V 12 w(state)t Fd(:)t(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)17
-b Fe(6)0 1974 y Fc(history)p 142 1974 V 11 w(set)p 213 1974
-V 13 w(pos)5 b Fd(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)18 b Fe(8)0 2032 y Fc(history)p 142 2032 V 11 w(subst)p
-253 2032 V 13 w(char)k Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)24
-b Fe(11)1015 405 y Fc(history)p 1157 405 V 12 w(tokenize)9
-b Fd(:)s(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)22
-b Fe(11)1015 463 y Fc(history)p 1157 463 V 12 w(total)p 1269
-463 V 12 w(bytes)9 b Fd(:)t(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)22
-b Fe(8)1015 521 y Fc(history)p 1157 521 V 12 w(truncate)p 1329
-521 V 11 w(file)5 b Fd(:)g(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
-f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)19
-b Fe(10)1015 629 y Fm(M)1015 695 y Fc(max)p 1077 695 V 13 w(input)p
-1190 695 V 13 w(history)14 b Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)17 b Fe(11)1015 803 y Fm(N)1015 870 y Fc(next)p 1097
-870 V 13 w(history)7 b Fd(:)s(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)20 b Fe(8)1015 978 y Fm(P)1015 1044
-y Fc(previous)p 1177 1044 V 12 w(history)7 b Fd(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)23 b Fe(8)1015 1152 y Fm(R)1015
-1218 y Fc(read)p 1097 1218 V 13 w(history)7 b Fd(:)s(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)20 b Fe(9)1015
-1276 y Fc(read)p 1097 1276 V 13 w(history)p 1250 1276 V 11
-w(range)9 b Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)23
-b Fe(9)1015 1335 y Fc(remove)p 1137 1335 V 12 w(history)t Fd(:)t(:)6
-b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)17
-b Fe(7)1015 1393 y Fc(replace)p 1157 1393 V 12 w(history)p
-1309 1393 V 11 w(entry)6 b Fd(:)f(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)19
-b Fe(7)1015 1501 y Fm(S)1015 1567 y Fc(stifle)p 1137 1567 V
-12 w(history)t Fd(:)t(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)g(:)g(:)17 b Fe(7)1015 1675 y Fm(U)1015 1741 y Fc(unstifle)p
-1177 1741 V 12 w(history)7 b Fd(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)23 b Fe(7)1015 1800 y Fc(using)p 1117 1800 V
-13 w(history)5 b Fd(:)s(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)18 b Fe(6)1015 1907 y Fm(W)1015 1974 y Fc(where)p
-1117 1974 V 13 w(history)5 b Fd(:)s(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)18 b Fe(8)1015 2032 y Fc(write)p
-1117 2032 V 13 w(history)5 b Fd(:)s(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)18 b Fe(9)p eop
-%%Page: 18 20
-19 bop 0 -83 a Fo(18)1474 b(GNU)15 b(History)g(Library)p eop
-%%Page: -1 21
-20 bop 1937 -83 a Fo(i)0 158 y Fk(T)-7 b(able)15 b(of)g(Con)n(ten)n(ts)0
-333 y Fm(1)67 b(Using)22 b(History)h(In)n(teractiv)n(ely)9
-b Fb(:)k(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)31 b Fm(1)149 411 y Fo(1.1)45
-b(History)15 b(In)o(teraction)9 b Fa(:)f(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)23
-b Fo(1)299 473 y(1.1.1)44 b(Ev)o(en)o(t)14 b(Designators)6
-b Fa(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)20 b Fo(1)299 535 y(1.1.2)44 b(W)l(ord)15 b(Designators)9
-b Fa(:)d(:)h(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)23 b Fo(2)299 597 y(1.1.3)44 b(Mo)q(di\014ers)14
-b Fa(:)8 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)
-g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fo(2)0 722
-y Fm(2)67 b(Programming)23 b(with)g(GNU)f(History)13 b Fb(:)e(:)f(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)36 b
-Fm(5)149 800 y Fo(2.1)45 b(In)o(tro)q(duction)16 b(to)f(History)6
-b Fa(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)h(:)f(:)g(:)20 b Fo(5)149 862 y(2.2)45 b(History)15
-b(Storage)d Fa(:)7 b(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)27
-b Fo(5)149 924 y(2.3)45 b(History)15 b(F)l(unctions)c Fa(:)d(:)f(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)h(:)25 b Fo(6)299 986 y(2.3.1)44 b(Initializing)18
-b(History)d(and)h(State)e(Managemen)o(t)f Fa(:)7 b(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)h(:)f(:)g(:)g(:)g(:)h(:)27 b Fo(6)299 1049 y(2.3.2)44 b(History)15
-b(List)h(Managemen)o(t)c Fa(:)7 b(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)28 b Fo(7)299 1111 y(2.3.3)44 b(Information)15 b(Ab)q(out)g(the)h(History)
-f(List)5 b Fa(:)i(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)19 b Fo(7)299 1173 y(2.3.4)44 b(Mo)o(ving)15
-b(Around)g(the)g(History)g(List)6 b Fa(:)i(:)f(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)
-g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)20
-b Fo(8)299 1236 y(2.3.5)44 b(Searc)o(hing)16 b(the)f(History)g(List)7
-b Fa(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)21 b
-Fo(8)299 1298 y(2.3.6)44 b(Managing)15 b(the)g(History)g(File)5
-b Fa(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)19 b
-Fo(9)299 1360 y(2.3.7)44 b(History)15 b(Expansion)d Fa(:)7
-b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)26
-b Fo(10)149 1422 y(2.4)45 b(History)15 b(V)l(ariables)5 b Fa(:)k(:)e(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)h(:)f(:)g(:)20 b Fo(11)149 1485 y(2.5)45 b(History)15
-b(Programming)f(Example)8 b Fa(:)g(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)
-g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)23 b Fo(12)0 1609 y Fm(App)r(endix)h(A)67 b(Concept)22
-b(Index)15 b Fb(:)c(:)f(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)37 b Fm(15)0 1749
-y(App)r(endix)24 b(B)67 b(F)-6 b(unction)25 b(and)e(V)-6 b(ariable)24
-b(Index)8 b Fb(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)31
+b Fj(to)i Fo(is)e(less)g(than)g Fj(from)p Fo(,)p eop
+10 11 bop 0 -58 a Fo(10)1474 b(GNU)15 b(History)g(Library)120
+183 y(then)i(read)g(un)o(til)h(the)f(end)g(of)g(the)g(\014le.)25
+b(If)17 b Fj(\014lename)k Fo(is)c Fn(NULL)p Fo(,)f(then)i(read)e(from)g
+(`)p Fn(~/.history)p Fo('.)120 246 y(Returns)g(0)f(if)g(successful,)h
+(or)f Fn(errno)g Fo(if)g(not.)1725 410 y(F)l(unction)-1899
+b Fh(int)20 b Fg(write)p 229 410 18 3 v 22 w(history)i
+Ff(\()p Fn(char)15 b(*filename)p Ff(\))120 472 y Fo(W)l(rite)20
+b(the)g(curren)o(t)f(history)h(to)f Fj(\014lename)p Fo(,)i(o)o(v)o
+(erwriting)f Fj(\014lename)j Fo(if)d(necessary)l(.)34
+b(If)20 b Fj(\014lename)120 534 y Fo(is)d Fn(NULL)p Fo(,)g(then)g
+(write)g(the)g(history)g(list)h(to)e(`)p Fn(~/.history)p
+Fo('.)23 b(V)l(alues)18 b(returned)g(are)e(as)h(in)h
+Fn(read_)120 596 y(history)c(\(\))p Fo(.)1725 760 y(F)l(unction)-1899
+b Fh(int)20 b Fg(app)r(end)p 285 760 V 19 w(history)j
+Ff(\()p Fn(int)14 b(nelements,)g(char)h(*filename)p Ff(\))120
+823 y Fo(App)q(end)i(the)e(last)g Fj(nelemen)o(ts)j Fo(of)d(the)g
+(history)g(list)h(to)f Fj(\014lename)p Fo(.)1725 987
+y(F)l(unction)-1899 b Fh(int)20 b Fg(history)p 276 987
+V 20 w(truncate)p 507 987 V 21 w(\014le)k Ff(\()p Fn(char)14
+b(*filename,)g(int)h(nlines)p Ff(\))120 1049 y Fo(T)l(runcate)g(the)h
+(history)f(\014le)h Fj(\014lename)p Fo(,)g(lea)o(ving)g(only)g(the)f
+(last)g Fj(nlines)k Fo(lines.)0 1263 y Fi(2.3.7)30 b(History)15
+b(Expansion)62 1401 y Fo(These)h(functions)g(implemen)o(t)g
+Fn(csh)p Fo(-lik)o(e)g(history)g(expansion.)1725 1565
+y(F)l(unction)-1899 b Fh(int)20 b Fg(history)p 276 1565
+V 20 w(expand)j Ff(\()p Fn(char)14 b(*string,)g(char)h(**output)p
+Ff(\))120 1627 y Fo(Expand)20 b Fj(string)p Fo(,)f(placing)i(the)e
+(result)h(in)o(to)f Fj(output)p Fo(,)h(a)f(p)q(oin)o(ter)h(to)e(a)h
+(string)h(\(see)f(Section)h(1.1)120 1689 y([History)15
+b(In)o(teraction],)f(page)h(1\).)20 b(Returns:)120 1840
+y Fn(0)216 b Fo(If)21 b(no)g(expansions)h(to)q(ok)e(place)h(\(or,)g(if)
+h(the)f(only)g(c)o(hange)g(in)h(the)f(text)f(w)o(as)g(the)360
+1902 y(de-slashifying)d(of)e(the)g(history)h(expansion)g(c)o
+(haracter\);)120 1991 y Fn(1)216 b Fo(if)16 b(expansions)g(did)g(tak)o
+(e)e(place;)120 2080 y Fn(-1)192 b Fo(if)16 b(there)f(w)o(as)f(an)h
+(error)g(in)h(expansion;)120 2168 y Fn(2)216 b Fo(if)14
+b(the)f(returned)h(line)h(should)f(only)g(b)q(e)f(displa)o(y)o(ed,)i
+(but)e(not)g(executed,)h(as)f(with)h(the)360 2231 y Fn(:p)h
+Fo(mo)q(di\014er)h(\(see)f(Section)h(1.1.3)e([Mo)q(di\014ers],)h(page)g
+(2\).)120 2381 y(If)g(an)h(error)e(o)q(curred)i(in)g(expansion,)f(then)
+h Fj(output)g Fo(con)o(tains)f(a)g(descriptiv)o(e)i(error)d(message.)
+1725 2545 y(F)l(unction)-1899 b Fh(char)20 b(*)f Fg(history)p
+347 2545 V 21 w(arg)p 449 2545 V 19 w(extract)24 b Ff(\()p
+Fn(int)14 b(first,)h(int)g(last,)f(char)h(*string)p Ff(\))120
+2608 y Fo(Extract)10 b(a)h(string)g(segmen)o(t)g(consisting)h(of)f(the)
+g Fj(\014rst)h Fo(through)f Fj(last)h Fo(argumen)o(ts)e(presen)o(t)h
+(in)h Fj(string)p Fo(.)120 2670 y(Argumen)o(ts)j(are)g(brok)o(en)g(up)g
+(as)g(in)h(Bash.)p eop
+11 12 bop 0 -58 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)1017 b(11)1725 183 y(F)l(unction)-1899 b Fh(char)20
+b(*)f Fg(get)p 249 183 18 3 v 21 w(history)p 445 183
+V 20 w(ev)n(en)n(t)25 b Ff(\()p Fn(char)14 b(*string,)g(int)h(*cindex,)
+f(int)h(qchar)p Ff(\))120 246 y Fo(Returns)e(the)f(text)f(of)h(the)g
+(history)g(ev)o(en)o(t)f(b)q(eginning)k(at)c Fj(string)16
+b Fn(+)c Fj(*cindex)p Fo(.)20 b Fj(*cindex)c Fo(is)d(mo)q(di\014ed)120
+308 y(to)h(p)q(oin)o(t)h(to)f(after)h(the)f(ev)o(en)o(t)h(sp)q
+(eci\014er.)21 b(A)o(t)15 b(function)g(en)o(try)l(,)f
+Fj(cindex)20 b Fo(p)q(oin)o(ts)15 b(to)f(the)h(index)h(in)o(to)120
+370 y Fj(string)h Fo(where)d(the)f(history)h(ev)o(en)o(t)f(sp)q
+(eci\014cation)i(b)q(egins.)20 b Fj(qc)o(har)d Fo(is)c(a)g(c)o
+(haracter)g(that)g(is)h(allo)o(w)o(ed)120 432 y(to)h(end)g(the)h(ev)o
+(en)o(t)f(sp)q(eci\014cation)i(in)f(addition)g(to)f(the)g(\\normal")g
+(terminating)g(c)o(haracters.)1725 587 y(F)l(unction)-1899
+b Fh(char)20 b(**)f Fg(history)p 373 587 V 21 w(tok)n(enize)25
+b Ff(\()p Fn(char)14 b(*string)p Ff(\))120 649 y Fo(Return)k(an)f(arra)
+o(y)f(of)h(tok)o(ens)f(parsed)i(out)e(of)h Fj(string)p
+Fo(,)g(m)o(uc)o(h)h(as)e(the)i(shell)g(migh)o(t.)26 b(The)17
+b(tok)o(ens)120 711 y(are)c(split)h(on)f(white)g(space)h(and)f(on)g
+(the)g(c)o(haracters)f Fn(\(\)<>;&|$)p Fo(,)g(and)h(shell)i(quoting)e
+(con)o(v)o(en)o(tions)120 774 y(are)i(ob)q(ey)o(ed.)0
+983 y Fm(2.4)33 b(History)15 b(V)-6 b(ariables)62 1120
+y Fo(This)16 b(section)g(describ)q(es)h(the)e(externally)h(visible)i(v)
+m(ariables)e(exp)q(orted)g(b)o(y)f(the)g(GNU)g(History)g(Library)l(.)
+1736 1275 y(V)l(ariable)-1899 b Fh(int)20 b Fg(history)p
+276 1275 V 20 w(base)120 1337 y Fo(The)15 b(logical)i(o\013set)d(of)h
+(the)g(\014rst)g(en)o(try)g(in)h(the)f(history)g(list.)1736
+1491 y(V)l(ariable)-1899 b Fh(int)20 b Fg(history)p 276
+1491 V 20 w(length)120 1554 y Fo(The)15 b(n)o(um)o(b)q(er)h(of)f(en)o
+(tries)g(curren)o(tly)h(stored)f(in)h(the)f(history)g(list.)1736
+1708 y(V)l(ariable)-1899 b Fh(int)20 b Fg(max)p 208 1708
+V 19 w(input)p 360 1708 V 21 w(history)120 1771 y Fo(The)12
+b(maxim)o(um)g(n)o(um)o(b)q(er)g(of)f(history)h(en)o(tries.)19
+b(This)12 b(m)o(ust)f(b)q(e)h(c)o(hanged)g(using)h Fn(stifle_history)
+120 1833 y(\(\))p Fo(.)1736 1987 y(V)l(ariable)-1899
+b Fh(char)20 b Fg(history)p 302 1987 V 20 w(expansion)p
+569 1987 V 21 w(c)n(har)120 2050 y Fo(The)15 b(c)o(haracter)g(that)f
+(starts)g(a)h(history)g(ev)o(en)o(t.)20 b(The)15 b(default)h(is)g(`)p
+Fn(!)p Fo('.)1736 2204 y(V)l(ariable)-1899 b Fh(char)20
+b Fg(history)p 302 2204 V 20 w(subst)p 454 2204 V 20
+w(c)n(har)120 2266 y Fo(The)13 b(c)o(haracter)e(that)h(in)o(v)o(ok)o
+(es)g(w)o(ord)g(substitution)h(if)g(found)g(at)e(the)i(start)e(of)h(a)g
+(line.)21 b(The)12 b(default)120 2329 y(is)k(`)p Fn(^)p
+Fo('.)1736 2483 y(V)l(ariable)-1899 b Fh(char)20 b Fg(history)p
+302 2483 V 20 w(commen)n(t)p 552 2483 V 19 w(c)n(har)120
+2545 y Fo(During)12 b(tok)o(enization,)h(if)f(this)h(c)o(haracter)e(is)
+i(seen)f(as)g(the)g(\014rst)f(c)o(haracter)g(of)h(a)g(w)o(ord,)f(then)i
+(it)f(and)120 2608 y(all)19 b(subsequen)o(t)g(c)o(haracters)e(up)h(to)g
+(a)f(newline)j(are)e(ignored,)h(suppressing)g(history)f(expansion)120
+2670 y(for)d(the)g(remainder)h(of)f(the)g(line.)21 b(This)16
+b(is)g(disabled)h(b)o(y)e(default.)p eop
+12 13 bop 0 -58 a Fo(12)1474 b(GNU)15 b(History)g(Library)1736
+183 y(V)l(ariable)-1899 b Fh(char)20 b(*)f Fg(history)p
+347 183 18 3 v 21 w(no)p 429 183 V 20 w(expand)p 629
+183 V 20 w(c)n(hars)120 246 y Fo(The)f(list)g(of)g(c)o(haracters)e
+(whic)o(h)j(inhibit)h(history)d(expansion)i(if)f(found)g(immediately)h
+(follo)o(wing)120 308 y Fj(history)p 261 308 14 2 v 16
+w(expansion)p 472 308 V 18 w(c)o(har)p Fo(.)g(The)d(default)f(is)h
+(whitespace)g(and)g(`)p Fn(=)p Fo('.)1736 469 y(V)l(ariable)-1899
+b Fh(char)20 b(*)f Fg(history)p 347 469 18 3 v 21 w(searc)n(h)p
+524 469 V 20 w(delimiter)p 768 469 V 23 w(c)n(hars)120
+532 y Fo(The)d(list)g(of)f(additional)i(c)o(haracters)d(whic)o(h)i(can)
+g(delimit)h(a)e(history)g(searc)o(h)h(string,)f(in)h(addition)120
+594 y(to)f(whitespace,)g(`)p Fn(:)p Fo(')f(and)i(`)p
+Fn(?)p Fo(')e(in)i(the)f(case)h(of)e(a)h(substring)h(searc)o(h.)k(The)
+15 b(default)h(is)g(empt)o(y)l(.)1736 755 y(V)l(ariable)-1899
+b Fh(int)20 b Fg(history)p 276 755 V 20 w(quotes)p 458
+755 V 21 w(inhibit)p 642 755 V 23 w(expansion)120 818
+y Fo(If)e(non-zero,)f(single-quoted)i(w)o(ords)e(are)g(not)g(scanned)h
+(for)e(the)i(history)f(expansion)h(c)o(haracter.)120
+880 y(The)d(default)h(v)m(alue)h(is)e(0.)1736 1041 y(V)l(ariable)-1899
+b Fh(Function)20 b(*)g Fg(history)p 452 1041 V 20 w(inhibit)p
+635 1041 V 23 w(expansion)p 905 1041 V 21 w(function)120
+1104 y Fo(This)f(should)h(b)q(e)f(set)f(to)g(the)h(address)f(of)g(a)h
+(function)g(that)f(tak)o(es)f(t)o(w)o(o)h(argumen)o(ts:)25
+b(a)19 b Fn(char)14 b(*)120 1166 y Fo(\()p Fj(string)t
+Fo(\))c(and)i(an)f(in)o(teger)g(index)h(in)o(to)f(that)g(string)g(\()p
+Fj(i)r Fo(\).)19 b(It)11 b(should)h(return)f(a)g(non-zero)g(v)m(alue)h
+(if)g(the)120 1228 y(history)17 b(expansion)h(starting)e(at)h
+Fj(string[i])h Fo(should)g(not)f(b)q(e)h(p)q(erformed;)f(zero)g(if)h
+(the)f(expansion)120 1290 y(should)i(b)q(e)f(done.)28
+b(It)18 b(is)g(in)o(tended)h(for)e(use)h(b)o(y)g(applications)h(lik)o
+(e)g(Bash)f(that)f(use)h(the)g(history)120 1353 y(expansion)e(c)o
+(haracter)f(for)f(additional)j(purp)q(oses.)j(By)c(default,)f(this)h(v)
+m(ariable)g(is)g(set)f(to)f(NULL.)0 1576 y Fm(2.5)33
+b(History)15 b(Programming)h(Example)62 1713 y Fo(The)g(follo)o(wing)g
+(program)e(demonstrates)g(simple)j(use)e(of)g(the)g(GNU)g(History)g
+(Library)l(.)120 1840 y Fn(main)23 b(\(\))120 1892 y({)168
+1944 y(char)g(line[1024],)f(*t;)168 1995 y(int)h(len,)g(done)h(=)g(0;)
+168 2099 y(line[0])f(=)g(0;)168 2203 y(using_history)f(\(\);)168
+2255 y(while)h(\(!done\))215 2307 y({)263 2359 y(printf)g(\("history$)g
+("\);)263 2411 y(fflush)g(\(stdout\);)263 2462 y(t)h(=)g(fgets)f
+(\(line,)g(sizeof)g(\(line\))g(-)h(1,)f(stdin\);)263
+2514 y(if)h(\(t)f(&&)h(*t\))311 2566 y({)359 2618 y(len)f(=)h(strlen)f
+(\(t\);)359 2670 y(if)g(\(t[len)g(-)h(1])g(==)f('\\n'\))p
+eop
+13 14 bop 0 -58 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)1017 b(13)406 183 y Fn(t[len)24 b(-)f(1])h(=)g('\\0';)311
+235 y(})263 339 y(if)g(\(!t\))311 391 y(strcpy)f(\(line,)g("quit"\);)
+263 495 y(if)h(\(line[0]\))311 546 y({)359 598 y(char)f(*expansion;)359
+650 y(int)g(result;)359 754 y(result)g(=)g(history_expand)f(\(line,)h
+(&expansion\);)359 806 y(if)g(\(result\))406 858 y(fprintf)g(\(stderr,)
+g("\045s\\n",)g(expansion\);)359 962 y(if)g(\(result)g(<)h(0)g(||)f
+(result)g(==)h(2\))406 1013 y({)454 1065 y(free)f(\(expansion\);)454
+1117 y(continue;)406 1169 y(})359 1273 y(add_history)f(\(expansion\);)
+359 1325 y(strncpy)h(\(line,)g(expansion,)f(sizeof)h(\(line\))g(-)h
+(1\);)359 1377 y(free)f(\(expansion\);)311 1429 y(})263
+1532 y(if)h(\(strcmp)f(\(line,)g("quit"\))g(==)g(0\))311
+1584 y(done)g(=)h(1;)263 1636 y(else)f(if)h(\(strcmp)f(\(line,)g
+("save"\))g(==)h(0\))311 1688 y(write_history)e(\("history_file"\);)263
+1740 y(else)h(if)h(\(strcmp)f(\(line,)g("read"\))g(==)h(0\))311
+1792 y(read_history)e(\("history_file"\);)263 1844 y(else)h(if)h
+(\(strcmp)f(\(line,)g("list"\))g(==)h(0\))311 1896 y({)359
+1947 y(register)e(HIST_ENTRY)h(**the_list;)359 1999 y(register)f(int)i
+(i;)359 2103 y(the_list)e(=)i(history_list)e(\(\);)359
+2155 y(if)h(\(the_list\))406 2207 y(for)h(\(i)f(=)h(0;)g(the_list[i];)e
+(i++\))454 2259 y(printf)h(\("\045d:)g(\045s\\n",)g(i)h(+)g
+(history_base,)e(the_list[i]->line\);)311 2311 y(})263
+2363 y(else)h(if)h(\(strncmp)f(\(line,)g("delete",)g(6\))g(==)h(0\))311
+2414 y({)359 2466 y(int)f(which;)359 2518 y(if)g(\(\(sscanf)g(\(line)g
+(+)h(6,)f("\045d",)h(&which\)\))e(==)i(1\))406 2570 y({)454
+2622 y(HIST_ENTRY)f(*entry)g(=)g(remove_history)f(\(which\);)p
+eop
+14 15 bop 0 -58 a Fo(14)1474 b(GNU)15 b(History)g(Library)454
+183 y Fn(if)24 b(\(!entry\))502 235 y(fprintf)f(\(stderr,)f("No)i(such)
+f(entry)g(\045d\\n",)g(which\);)454 287 y(else)502 339
+y({)550 391 y(free)g(\(entry->line\);)550 443 y(free)g(\(entry\);)502
+495 y(})406 546 y(})359 598 y(else)406 650 y({)454 702
+y(fprintf)g(\(stderr,)g("non-numeric)f(arg)h(given)h(to)f
+(`delete'\\n"\);)406 754 y(})311 806 y(})215 858 y(})120
+910 y(})p eop
+15 16 bop 0 -58 a Fo(App)q(endix)17 b(A:)e(Concept)g(Index)1346
+b(15)0 183 y Fk(App)r(endix)13 b(A)41 b(Concept)15 b(Index)0
+430 y Fm(A)0 496 y Fe(anc)o(hored)f(searc)o(h)5 b Fd(.)i(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18
+b Fe(9)0 604 y Fm(E)0 670 y Fe(ev)o(en)o(t)13 b(designators)g
+Fd(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)23 b Fe(1)1015 430 y Fm(H)1015 496 y Fe(history)15
+b(ev)o(en)o(ts)5 b Fd(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Fe(1)1015 554
+y(history)d(expansion)8 b Fd(.)h(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Fe(1)1015 612 y(History)14
+b(Searc)o(hing)7 b Fd(.)h(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)20 b Fe(9)p eop
+16 17 bop 0 -58 a Fo(16)1474 b(GNU)15 b(History)g(Library)p
+eop
+17 18 bop 0 -58 a Fo(App)q(endix)17 b(B:)e(F)l(unction)h(and)g(V)l
+(ariable)g(Index)1069 b(17)0 183 y Fk(App)r(endix)13
+b(B)41 b(F)-7 b(unction)15 b(and)g(V)-7 b(ariable)14
+b(Index)0 430 y Fm(A)0 496 y Fc(add)p 62 496 12 2 v 13
+w(history)8 b Fd(.)s(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)20 b Fe(7)0 554 y
+Fc(append)p 122 554 V 12 w(history)9 b Fd(.)d(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)24 b Fe(10)0
+679 y Fm(C)0 745 y Fc(clear)p 102 745 V 12 w(history)5
+b Fd(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)18 b Fe(7)0 803 y Fc(current)p 142 803
+V 11 w(history)9 b Fd(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)24 b Fe(8)0 928 y Fm(G)0 994 y Fc(get)p
+62 994 V 13 w(history)p 215 994 V 11 w(event)9 b Fd(.)d(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)23 b Fe(11)0 1119
+y Fm(H)0 1185 y Fc(history)p 142 1185 V 11 w(arg)p 213
+1185 V 13 w(extract)8 b Fd(.)t(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)21 b Fe(10)0 1243 y Fc(history)p 142 1243 V 11 w(base)e
+Fd(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)20 b Fe(11)0 1301 y Fc(history)p 142 1301
+V 11 w(comment)p 293 1301 V 12 w(char)g Fd(.)6 b(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)21 b Fe(11)0 1359 y Fc(history)p 142 1359
+V 11 w(expand)10 b Fd(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)24 b Fe(10)0 1418 y Fc(history)p
+142 1418 V 11 w(expansion)p 333 1418 V 11 w(char)17 b
+Fd(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Fe(11)0 1476
+y Fc(history)p 142 1476 V 11 w(get)8 b Fd(.)d(.)h(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)20
+b Fe(8)0 1534 y Fc(history)p 142 1534 V 11 w(get)p 213
+1534 V 13 w(history)p 366 1534 V 12 w(state)t Fd(.)t(.)6
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)17 b Fe(6)0 1592 y Fc(history)p
+142 1592 V 11 w(inhibit)p 293 1592 V 12 w(expansion)p
+484 1592 V 10 w(function)k Fd(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)23 b Fe(12)0 1650 y Fc(history)p 142 1650 V 11
+w(is)p 193 1650 V 14 w(stifled)7 b Fd(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(7)0 1708 y Fc(history)p
+142 1708 V 11 w(length)16 b Fd(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Fe(11)0 1766 y Fc(history)p
+142 1766 V 11 w(list)7 b Fd(.)t(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fe(8)0 1824
+y Fc(history)p 142 1824 V 11 w(no)p 193 1824 V 14 w(expand)p
+327 1824 V 12 w(chars)f Fd(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)20
+b Fe(12)0 1883 y Fc(history)p 142 1883 V 11 w(quotes)p
+273 1883 V 12 w(inhibit)p 425 1883 V 12 w(expansion)14
+b Fd(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)17
+b Fe(12)0 1941 y Fc(history)p 142 1941 V 11 w(search)t
+Fd(.)t(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)17 b Fe(9)0 1999 y Fc(history)p 142 1999 V
+11 w(search)p 273 1999 V 12 w(delimiter)p 465 1999 V
+11 w(chars)h Fd(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)20 b Fe(12)0 2057 y Fc(history)p 142 2057
+V 11 w(search)p 273 2057 V 12 w(pos)9 b Fd(.)d(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(9)0 2115 y Fc(history)p
+142 2115 V 11 w(search)p 273 2115 V 12 w(prefix)6 b Fd(.)t(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Fe(9)0 2173 y Fc(history)p
+142 2173 V 11 w(set)p 213 2173 V 13 w(history)p 366 2173
+V 12 w(state)t Fd(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Fe(6)1015
+430 y Fc(history)p 1157 430 V 12 w(set)p 1229 430 V 13
+w(pos)5 b Fd(.)g(.)h(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)19 b Fe(8)1015 488 y Fc(history)p 1157
+488 V 12 w(subst)p 1269 488 V 12 w(char)k Fd(.)6 b(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)25 b Fe(11)1015 546 y Fc(history)p
+1157 546 V 12 w(tokenize)9 b Fd(.)s(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)22 b Fe(11)1015 604 y Fc(history)p
+1157 604 V 12 w(total)p 1269 604 V 12 w(bytes)9 b Fd(.)t(.)d(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Fe(8)1015 662
+y Fc(history)p 1157 662 V 12 w(truncate)p 1329 662 V
+11 w(file)5 b Fd(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
+b Fe(10)1015 770 y Fm(M)1015 836 y Fc(max)p 1077 836
+V 13 w(input)p 1190 836 V 13 w(history)14 b Fd(.)6 b(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)17 b Fe(11)1015 944
+y Fm(N)1015 1011 y Fc(next)p 1097 1011 V 13 w(history)7
+b Fd(.)s(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)20 b Fe(8)1015 1119 y Fm(P)1015 1185
+y Fc(previous)p 1177 1185 V 12 w(history)7 b Fd(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(8)1015
+1293 y Fm(R)1015 1359 y Fc(read)p 1097 1359 V 13 w(history)7
+b Fd(.)s(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)20 b Fe(9)1015 1418 y Fc(read)p 1097
+1418 V 13 w(history)p 1250 1418 V 11 w(range)9 b Fd(.)d(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23 b Fe(9)1015 1476
+y Fc(remove)p 1137 1476 V 12 w(history)t Fd(.)t(.)6 b(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)17
+b Fe(7)1015 1534 y Fc(replace)p 1157 1534 V 12 w(history)p
+1309 1534 V 11 w(entry)6 b Fd(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)19 b Fe(7)1015 1642 y Fm(S)1015 1708 y Fc(stifle)p
+1137 1708 V 12 w(history)t Fd(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)17 b Fe(7)1015 1816
+y Fm(U)1015 1883 y Fc(unstifle)p 1177 1883 V 12 w(history)7
+b Fd(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)23
+b Fe(7)1015 1941 y Fc(using)p 1117 1941 V 13 w(history)5
+b Fd(.)s(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)18 b Fe(6)1015 2049 y Fm(W)1015 2115 y
+Fc(where)p 1117 2115 V 13 w(history)5 b Fd(.)s(.)h(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18
+b Fe(8)1015 2173 y Fc(write)p 1117 2173 V 13 w(history)t
+Fd(.)s(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)17 b Fe(10)p eop
+18 19 bop 0 -58 a Fo(18)1474 b(GNU)15 b(History)g(Library)p
+eop
+-1 20 bop 1937 -58 a Fo(i)0 183 y Fk(T)-7 b(able)15 b(of)g(Con)n(ten)n
+(ts)0 358 y Fm(1)67 b(Using)22 b(History)h(In)n(teractiv)n(ely)15
+b Fb(.)e(.)c(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)f(.)h(.)g(.)37 b Fm(1)149 435 y Fo(1.1)45
+b(In)o(teractiv)o(e)15 b(History)g(Expansion)9 b Fa(.)g(.)e(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)23 b
+Fo(1)299 498 y(1.1.1)44 b(Ev)o(en)o(t)14 b(Designators)d
+Fa(.)d(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)26 b Fo(1)299 560 y(1.1.2)44 b(W)l(ord)15 b(Designators)t
+Fa(.)7 b(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)19 b Fo(2)299 622 y(1.1.3)44 b(Mo)q(di\014ers)15
+b Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b Fo(2)0
+747 y Fm(2)67 b(Programming)23 b(with)g(GNU)f(History)11
+b Fb(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)
+g(.)33 b Fm(5)149 825 y Fo(2.1)45 b(In)o(tro)q(duction)16
+b(to)f(History)9 b Fa(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)24 b Fo(5)149
+887 y(2.2)45 b(History)15 b(Storage)c Fa(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)26 b Fo(5)149 949 y(2.3)45 b(History)15
+b(F)l(unctions)c Fa(.)e(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26
+b Fo(6)299 1011 y(2.3.1)44 b(Initializing)18 b(History)d(and)h(State)e
+(Managemen)o(t)g Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)29 b Fo(6)299 1074 y(2.3.2)44 b(History)15 b(List)h(Managemen)o
+(t)d Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)28
+b Fo(7)299 1136 y(2.3.3)44 b(Information)15 b(Ab)q(out)g(the)h(History)
+f(List)c Fa(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)25 b Fo(7)299 1198 y(2.3.4)44
+b(Mo)o(ving)15 b(Around)g(the)g(History)g(List)10 b Fa(.)f(.)e(.)h(.)f
+(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)25 b Fo(8)299 1260 y(2.3.5)44 b(Searc)o(hing)16
+b(the)f(History)g(List)7 b Fa(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)
+f(.)h(.)21 b Fo(9)299 1323 y(2.3.6)44 b(Managing)15 b(the)g(History)g
+(File)5 b Fa(.)k(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20
+b Fo(9)299 1385 y(2.3.7)44 b(History)15 b(Expansion)8
+b Fa(.)g(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)23 b Fo(10)149 1447 y(2.4)45 b(History)15 b(V)l(ariables)5
+b Fa(.)k(.)e(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)20 b Fo(11)149
+1510 y(2.5)45 b(History)15 b(Programming)f(Example)6
+b Fa(.)j(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)21
+b Fo(12)0 1634 y Fm(App)r(endix)j(A)67 b(Concept)22 b(Index)7
+b Fb(.)k(.)f(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)
+h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)29 b Fm(15)0 1774 y(App)r(endix)24
+b(B)67 b(F)-6 b(unction)25 b(and)e(V)-6 b(ariable)24
+b(Index)13 b Fb(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)35
b Fm(17)p eop
-%%Page: -2 22
-21 bop 0 -83 a Fo(ii)1496 b(GNU)15 b(History)g(Library)p eop
-%%Trailer
-end
+-2 21 bop 0 -58 a Fo(ii)1496 b(GNU)15 b(History)g(Library)p
+eop end
userdict /end-hook known{end-hook}if
-%%EOF
diff --git a/doc/history_toc.html b/doc/history_toc.html
new file mode 100644
index 0000000..645dedf
--- /dev/null
+++ b/doc/history_toc.html
@@ -0,0 +1,51 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from /usr/homes/chet/src/bash/readline-2.1/doc/hist.texinfo on 3 June 1997 -->
+
+<TITLE>GNU History Library - Table of Contents</TITLE>
+</HEAD>
+<BODY>
+<H1>GNU History Library</H1>
+<H2>Edition 2.1, for <CODE>History Library</CODE> Version 2.1.</H2>
+<H2>March 1996</H2>
+<ADDRESS>Brian Fox, Free Software Foundation</ADDRESS>
+<ADDRESS>Chet Ramey, Case Western Reserve University</ADDRESS>
+<P>
+<P><HR><P>
+<UL>
+<LI><A NAME="TOC1" HREF="history.html#SEC1">Using History Interactively</A>
+<UL>
+<LI><A NAME="TOC2" HREF="history.html#SEC2">Interactive History Expansion</A>
+<UL>
+<LI><A NAME="TOC3" HREF="history.html#SEC3">Event Designators</A>
+<LI><A NAME="TOC4" HREF="history.html#SEC4">Word Designators</A>
+<LI><A NAME="TOC5" HREF="history.html#SEC5">Modifiers</A>
+</UL>
+</UL>
+<LI><A NAME="TOC6" HREF="history.html#SEC6">Programming with GNU History</A>
+<UL>
+<LI><A NAME="TOC7" HREF="history.html#SEC7">Introduction to History</A>
+<LI><A NAME="TOC8" HREF="history.html#SEC8">History Storage</A>
+<LI><A NAME="TOC9" HREF="history.html#SEC9">History Functions</A>
+<UL>
+<LI><A NAME="TOC10" HREF="history.html#SEC10">Initializing History and State Management</A>
+<LI><A NAME="TOC11" HREF="history.html#SEC11">History List Management</A>
+<LI><A NAME="TOC12" HREF="history.html#SEC12">Information About the History List</A>
+<LI><A NAME="TOC13" HREF="history.html#SEC13">Moving Around the History List</A>
+<LI><A NAME="TOC14" HREF="history.html#SEC14">Searching the History List</A>
+<LI><A NAME="TOC15" HREF="history.html#SEC15">Managing the History File</A>
+<LI><A NAME="TOC16" HREF="history.html#SEC16">History Expansion</A>
+</UL>
+<LI><A NAME="TOC17" HREF="history.html#SEC17">History Variables</A>
+<LI><A NAME="TOC18" HREF="history.html#SEC18">History Programming Example</A>
+</UL>
+<LI><A NAME="TOC19" HREF="history.html#SEC19">Concept Index</A>
+<LI><A NAME="TOC20" HREF="history.html#SEC20">Function and Variable Index</A>
+</UL>
+<P><HR><P>
+This document was generated on 3 June 1997 using the
+<A HREF="http://wwwcn.cern.ch/dci/texi2html/">texi2html</A>
+translator version 1.51.</P>
+</BODY>
+</HTML>
diff --git a/doc/hstech.texinfo b/doc/hstech.texinfo
index 5f0f600..5410090 100644
--- a/doc/hstech.texinfo
+++ b/doc/hstech.texinfo
@@ -1,7 +1,7 @@
@ignore
This file documents the user interface to the GNU History library.
-Copyright (C) 1988, 1991 Free Software Foundation, Inc.
+Copyright (C) 1988, 1991, 1994, 1996 Free Software Foundation, Inc.
Authored by Brian Fox and Chet Ramey.
Permission is granted to make and distribute verbatim copies of this manual
@@ -168,6 +168,10 @@ This returns the old entry so you can dispose of the data. In the case
of an invalid @var{which}, a @code{NULL} pointer is returned.
@end deftypefun
+@deftypefun void clear_history ()
+Clear the history list by deleting all the entries.
+@end deftypefun
+
@deftypefun void stifle_history (int max)
Stifle the history list, remembering only the last @var{max} entries.
@end deftypefun
@@ -400,6 +404,28 @@ following @var{history_expansion_char}. The default is whitespace and
@samp{=}.
@end deftypevar
+@deftypevar {char *} history_search_delimiter_chars
+The list of additional characters which can delimit a history search
+string, in addition to whitespace, @samp{:} and @samp{?} in the case of
+a substring search. The default is empty.
+@end deftypevar
+
+@deftypevar int history_quotes_inhibit_expansion
+If non-zero, single-quoted words are not scanned for the history expansion
+character. The default value is 0.
+@end deftypevar
+
+@deftypevar {Function *} history_inhibit_expansion_function
+This should be set to the address of a function that takes two arguments:
+a @code{char *} (@var{string}) and an integer index into that string (@var{i}).
+It should return a non-zero value if the history expansion starting at
+@var{string[i]} should not be performed; zero if the expansion should
+be done.
+It is intended for use by applications like Bash that use the history
+expansion character for additional purposes.
+By default, this variable is set to NULL.
+@end deftypevar
+
@node History Programming Example
@section History Programming Example
diff --git a/doc/hsuser.texinfo b/doc/hsuser.texinfo
index 51327a3..6e95649 100644
--- a/doc/hsuser.texinfo
+++ b/doc/hsuser.texinfo
@@ -1,7 +1,7 @@
@ignore
This file documents the user interface to the GNU History library.
-Copyright (C) 1988, 1991 Free Software Foundation, Inc.
+Copyright (C) 1988, 1991, 1996 Free Software Foundation, Inc.
Authored by Brian Fox and Chet Ramey.
Permission is granted to make and distribute verbatim copies of this manual
@@ -39,26 +39,124 @@ information on using the GNU History Library in your own programs,
@pxref{Programming with GNU History}.
@end ifclear
+@ifset BashFeatures
@menu
+* Bash History Facilities:: How Bash lets you manipulate your command
+ history.
* History Interaction:: What it feels like using History as a user.
@end menu
+@end ifset
+@ifclear BashFeatures
+@menu
+* History Interaction:: What it feels like using History as a user.
+@end menu
+@end ifclear
+
+@ifset BashFeatures
+@node Bash History Facilities
+@section Bash History Facilities
+@cindex command history
+@cindex history list
+
+When the @samp{-o history} option to the @code{set} builtin
+is enabled (@pxref{The Set Builtin}),
+the shell provides access to the @var{command history},
+the list of commands previously typed. The text of the last
+@code{HISTSIZE}
+commands (default 500) is saved in a history list. The shell
+stores each command in the history list prior to parameter and
+variable expansion
+but after history expansion is performed, subject to the
+values of the shell variables
+@code{HISTIGNORE} and @code{HISTCONTROL}.
+When the shell starts up, the history is initialized from the
+file named by the @code{HISTFILE} variable (default @file{~/.bash_history}).
+@code{HISTFILE} is truncated, if necessary, to contain no more than
+the number of lines specified by the value of the @code{HISTFILESIZE}
+variable. When an interactive shell exits, the last
+@code{HISTSIZE} lines are copied from the history list to @code{HISTFILE}.
+If the @code{histappend} shell option is set (@pxref{Bash Builtins}),
+the lines are appended to the history file,
+otherwise the history file is overwritten.
+If @code{HISTFILE}
+is unset, or if the history file is unwritable, the history is
+not saved. After saving the history, the history file is truncated
+to contain no more than @code{$HISTFILESIZE}
+lines. If @code{HISTFILESIZE} is not set, no truncation is performed.
+
+The builtin command @code{fc} (@pxref{Korn Shell Builtins})
+may be used to list or edit and re-execute a portion of
+the history list. The @code{history} builtin (@pxref{C Shell Builtins})
+can be used to display or modify the history list and
+manipulate the history file.
+When using the command-line editing, search commands
+are available in each editing mode that provide access to the
+history list.
+
+The shell allows control over which commands are saved on the history
+list. The @code{HISTCONTROL} and @code{HISTIGNORE}
+variables may be set to cause the shell to save only a subset of the
+commands entered.
+The @code{cmdhist}
+shell option, if enabled, causes the shell to attempt to save each
+line of a multi-line command in the same history entry, adding
+semicolons where necessary to preserve syntactic correctness.
+The @code{lithist}
+shell option causes the shell to save the command with embedded newlines
+instead of semicolons.
+@xref{Bash Builtins} for a description of @code{shopt}.
+@end ifset
@node History Interaction
-@section History Interaction
-@cindex expansion
+@section Interactive History Expansion
+@cindex history expansion
The History library provides a history expansion feature that is similar
-to the history expansion provided by @code{csh}. The following text
+to the history expansion provided by @code{csh}. This section
describes the syntax used to manipulate the history information.
+History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+
History expansion takes place in two parts. The first is to determine
which line from the previous history should be used during substitution.
The second is to select portions of that line for inclusion into the
current one. The line selected from the previous history is called the
@dfn{event}, and the portions of that line that are acted upon are
-called @dfn{words}. The line is broken into words in the same fashion
+called @dfn{words}. Various @dfn{modifiers} are available to manipulate
+the selected words. The line is broken into words in the same fashion
that Bash does, so that several English (or Unix) words
surrounded by quotes are considered as one word.
+History expansions are introduced by the appearance of the
+history expansion character, which is @samp{!} by default.
+@ifset BashFeatures
+Only @samp{\} and @samp{'} may be used to escape the history expansion
+character.
+@end ifset
+
+@ifset BashFeatures
+Several shell options settable with the @code{shopt}
+builtin (@pxref{Bash Builtins}) may be used to tailor
+the behavior of history expansion. If the
+@code{histverify} shell option is enabled, and Readline
+is being used, history substitutions are not immediately passed to
+the shell parser.
+Instead, the expanded line is reloaded into the Readline
+editing buffer for further modification.
+If Readline is being used, and the @code{histreedit}
+shell option is enabled, a failed history expansion will be
+reloaded into the Readline editing buffer for correction.
+The @samp{-p} option to the @code{history} builtin command
+may be used to see what a history expansion will do before using it.
+The @samp{-s} option to the @code{history} builtin may be used to
+add commands to the end of the history list without actually executing
+them, so that they are available for subsequent recall.
+
+The shell allows control of the various characters used by the
+history expansion mechanism with the @code{histchars} variable.
+@end ifset
@menu
* Event Designators:: How to specify which history line to use.
@@ -80,92 +178,100 @@ history list.
Start a history substitution, except when followed by a space, tab,
the end of the line, @key{=} or @key{(}.
-@item @code{!!}
-Refer to the previous command. This is a synonym for @code{!-1}.
-
-@item @code{!n}
+@item @code{!@var{n}}
Refer to command line @var{n}.
-@item @code{!-n}
+@item @code{!-@var{n}}
Refer to the command @var{n} lines back.
-@item @code{!string}
+@item @code{!!}
+Refer to the previous command. This is a synonym for @samp{!-1}.
+
+@item @code{!@var{string}}
Refer to the most recent command starting with @var{string}.
-@item @code{!?string}[@code{?}]
-Refer to the most recent command containing @var{string}.
+@item @code{!?@var{string}[?]}
+Refer to the most recent command containing @var{string}. The trailing
+@samp{?} may be omitted if the @var{string} is followed immediately by
+a newline.
-@item @code{!#}
-The entire command line typed so far.
-
-@item @code{^string1^string2^}
+@item @code{^@var{string1}^@var{string2}^}
Quick Substitution. Repeat the last command, replacing @var{string1}
with @var{string2}. Equivalent to
-@code{!!:s/string1/string2/}.
+@code{!!:s/@var{string1}/@var{string2}/}.
+
+@item @code{!#}
+The entire command line typed so far.
@end table
@node Word Designators
@subsection Word Designators
-A @key{:} separates the event specification from the word designator. It
-can be omitted if the word designator begins with a @key{^}, @key{$},
-@key{*} or @key{%}. Words are numbered from the beginning of the line,
-with the first word being denoted by a 0 (zero).
+Word designators are used to select desired words from the event.
+A @samp{:} separates the event specification from the word designator. It
+can be omitted if the word designator begins with a @samp{^}, @samp{$},
+@samp{*}, @samp{-}, or @samp{%}. Words are numbered from the beginning
+of the line, with the first word being denoted by 0 (zero). Words are
+inserted into the current line separated by single spaces.
@table @code
@item 0 (zero)
The @code{0}th word. For many applications, this is the command word.
-@item n
+@item @var{n}
The @var{n}th word.
@item ^
-The first argument; that is, word 1.
+The first argument; that is, word 1.
@item $
The last argument.
@item %
-The word matched by the most recent @code{?string?} search.
+The word matched by the most recent @samp{?@var{string}?} search.
-@item x-y
-A range of words; @code{-@var{y}} abbreviates @code{0-@var{y}}.
+@item @var{x}-@var{y}
+A range of words; @samp{-@var{y}} abbreviates @samp{0-@var{y}}.
@item *
-All of the words, except the @code{0}th. This is a synonym for @code{1-$}.
-It is not an error to use @key{*} if there is just one word in the event;
+All of the words, except the @code{0}th. This is a synonym for @samp{1-$}.
+It is not an error to use @samp{*} if there is just one word in the event;
the empty string is returned in that case.
-@item x*
-Abbreviates @code{x-$}
+@item @var{x}*
+Abbreviates @samp{@var{x}-$}
-@item x-
-Abbreviates @code{x-$} like @code{x*}, but omits the last word.
+@item @var{x}-
+Abbreviates @samp{@var{x}-$} like @samp{@var{x}*}, but omits the last word.
@end table
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+
@node Modifiers
@subsection Modifiers
After the optional word designator, you can add a sequence of one or more
-of the following modifiers, each preceded by a @key{:}.
+of the following modifiers, each preceded by a @samp{:}.
@table @code
@item h
Remove a trailing pathname component, leaving only the head.
+@item t
+Remove all leading pathname components, leaving the tail.
+
@item r
-Remove a trailing suffix of the form @samp{.}@var{suffix}, leaving the basename.
+Remove a trailing suffix of the form @samp{.@var{suffix}}, leaving
+the basename.
@item e
Remove all but the trailing suffix.
-@item t
-Remove all leading pathname components, leaving the tail.
-
@item p
Print the new command but do not execute it.
@@ -174,17 +280,17 @@ Print the new command but do not execute it.
Quote the substituted words, escaping further substitutions.
@item x
-Quote the substituted words as with @code{q},
+Quote the substituted words as with @samp{q},
but break into words at spaces, tabs, and newlines.
@end ifset
-@item s/old/new/
+@item s/@var{old}/@var{new}/
Substitute @var{new} for the first occurrence of @var{old} in the
-event line. Any delimiter may be used in place of @key{/}.
+event line. Any delimiter may be used in place of @samp{/}.
The delimiter may be quoted in @var{old} and @var{new}
-with a single backslash. If @key{&} appears in @var{new},
+with a single backslash. If @samp{&} appears in @var{new},
it is replaced by @var{old}. A single backslash will quote
-the @key{&}. The final delimiter is optional if it is the last
+the @samp{&}. The final delimiter is optional if it is the last
character on the input line.
@item &
@@ -192,7 +298,7 @@ Repeat the previous substitution.
@item g
Cause changes to be applied over the entire event line. Used in
-conjunction with @code{s}, as in @code{gs/old/new/}, or with
-@code{&}.
+conjunction with @samp{s}, as in @code{gs/@var{old}/@var{new}/},
+or with @samp{&}.
@end table
diff --git a/doc/readline.0 b/doc/readline.0
new file mode 100644
index 0000000..e81db5a
--- /dev/null
+++ b/doc/readline.0
@@ -0,0 +1,1122 @@
+
+
+
+READLINE(3) READLINE(3)
+
+
+NNAAMMEE
+ readline - get a line from a user with editing
+
+SSYYNNOOPPSSIISS
+ ##iinncclluuddee <<rreeaaddlliinnee..hh>>
+ ##iinncclluuddee <<hhiissttoorryy..hh>>
+
+ cchhaarr **rreeaaddlliinnee ((pprroommpptt))
+ cchhaarr **pprroommpptt;;
+
+CCOOPPYYRRIIGGHHTT
+ Readline is Copyright (C) 1989, 1991, 1993, 1995, 1996 by
+ the Free Software Foundation, Inc.
+
+DDEESSCCRRIIPPTTIIOONN
+ rreeaaddlliinnee will read a line from the terminal and return it,
+ using pprroommpptt as a prompt. If pprroommpptt is null, no prompt is
+ issued. The line returned is allocated with _m_a_l_l_o_c(3), so
+ the caller must free it when finished. The line returned
+ has the final newline removed, so only the text of the
+ line remains.
+
+ rreeaaddlliinnee offers editing capabilities while the user is
+ entering the line. By default, the line editing commands
+ are similar to those of emacs. A vi-style line editing
+ interface is also available.
+
+RREETTUURRNN VVAALLUUEE
+ rreeaaddlliinnee returns the text of the line read. A blank line
+ returns the empty string. If EEOOFF is encountered while
+ reading a line, and the line is empty, NNUULLLL is returned.
+ If an EEOOFF is read with a non-empty line, it is treated as
+ a newline.
+
+NNOOTTAATTIIOONN
+ An emacs-style notation is used to denote keystrokes.
+ Control keys are denoted by C-_k_e_y, e.g., C-n means Con-
+ trol-N. Similarly, _m_e_t_a keys are denoted by M-_k_e_y, so M-x
+ means Meta-X. (On keyboards without a _m_e_t_a key, M-_x means
+ ESC _x, i.e., press the Escape key then the _x key. This
+ makes ESC the _m_e_t_a _p_r_e_f_i_x. The combination M-C-_x means
+ ESC-Control-_x, or press the Escape key then hold the Con-
+ trol key while pressing the _x key.)
+
+ Readline commands may be given numeric _a_r_g_u_m_e_n_t_s, which
+ normally act as a repeat count. Sometimes, however, it is
+ the sign of the argument that is significant. Passing a
+ negative argument to a command that acts in the forward
+ direction (e.g., kkiillll--lliinnee) causes that command to act in
+ a backward direction. Commands whose behavior with argu-
+ ments deviates from this are noted.
+
+ When a command is described as _k_i_l_l_i_n_g text, the text
+ deleted is saved for possible future retrieval (_y_a_n_k_i_n_g).
+
+
+
+GNU 1997 Feb 5 1
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ The killed text is saved in a _k_i_l_l _r_i_n_g. Consecutive
+ kills cause the text to be accumulated into one unit,
+ which can be yanked all at once. Commands which do not
+ kill text separate the chunks of text on the kill ring.
+
+IINNIITTIIAALLIIZZAATTIIOONN FFIILLEE
+ Readline is customized by putting commands in an initial-
+ ization file (the _i_n_p_u_t_r_c file). The name of this file is
+ taken from the value of the IINNPPUUTTRRCC environment variable.
+ If that variable is unset, the default is _~_/_._i_n_p_u_t_r_c.
+ When a program which uses the readline library starts up,
+ the init file is read, and the key bindings and variables
+ are set. There are only a few basic constructs allowed in
+ the readline init file. Blank lines are ignored. Lines
+ beginning with a ## are comments. Lines beginning with a $$
+ indicate conditional constructs. Other lines denote key
+ bindings and variable settings. Each program using this
+ library may add its own commands and bindings.
+
+ For example, placing
+
+ M-Control-u: universal-argument
+ or
+ C-Meta-u: universal-argument
+ into the _i_n_p_u_t_r_c would make M-C-u execute the readline
+ command _u_n_i_v_e_r_s_a_l_-_a_r_g_u_m_e_n_t.
+
+ The following symbolic character names are recognized
+ while processing key bindings: _R_U_B_O_U_T, _D_E_L, _E_S_C, _L_F_D, _N_E_W_-
+ _L_I_N_E, _R_E_T, _R_E_T_U_R_N, _S_P_C, _S_P_A_C_E, and _T_A_B. In addition to
+ command names, readline allows keys to be bound to a
+ string that is inserted when the key is pressed (a _m_a_c_r_o).
+
+
+ KKeeyy BBiinnddiinnggss
+ The syntax for controlling key bindings in the _i_n_p_u_t_r_c
+ file is simple. All that is required is the name of the
+ command or the text of a macro and a key sequence to which
+ it should be bound. The name may be specified in one of
+ two ways: as a symbolic key name, possibly with _M_e_t_a_- or
+ _C_o_n_t_r_o_l_- prefixes, or as a key sequence. When using the
+ form kkeeyynnaammee:_f_u_n_c_t_i_o_n_-_n_a_m_e or _m_a_c_r_o, _k_e_y_n_a_m_e is the name
+ of a key spelled out in English. For example:
+
+ Control-u: universal-argument
+ Meta-Rubout: backward-kill-word
+ Control-o: ">&output"
+
+ In the above example, _C_-_u is bound to the function uunniivveerr--
+ ssaall--aarrgguummeenntt, _M_-_D_E_L is bound to the function bbaacckk--
+ wwaarrdd--kkiillll--wwoorrdd, and _C_-_o is bound to run the macro
+ expressed on the right hand side (that is, to insert the
+ text _>_&_o_u_t_p_u_t into the line).
+
+
+
+
+GNU 1997 Feb 5 2
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ In the second form, ""kkeeyysseeqq"":_f_u_n_c_t_i_o_n_-_n_a_m_e or _m_a_c_r_o, kkeeyy--
+ sseeqq differs from kkeeyynnaammee above in that strings denoting an
+ entire key sequence may be specified by placing the
+ sequence within double quotes. Some GNU Emacs style key
+ escapes can be used, as in the following example.
+
+ "\C-u": universal-argument
+ "\C-x\C-r": re-read-init-file
+ "\e[11~": "Function Key 1"
+
+ In this example, _C_-_u is again bound to the function uunnii--
+ vveerrssaall--aarrgguummeenntt. _C_-_x _C_-_r is bound to the function
+ rree--rreeaadd--iinniitt--ffiillee, and _E_S_C _[ _1 _1 _~ is bound to insert the
+ text FFuunnccttiioonn KKeeyy 11. The full set of escape sequences is
+
+ \\CC-- control prefix
+
+ \\MM-- meta prefix
+
+ \\ee an escape character
+
+ \\\\ backslash
+
+ \\"" literal "
+
+ \\'' literal '
+
+ When entering the text of a macro, single or double quotes
+ should be used to indicate a macro definition. Unquoted
+ text is assumed to be a function name. Backslash will
+ quote any character in the macro text, including " and '.
+
+ BBaasshh allows the current readline key bindings to be dis-
+ played or modified with the bbiinndd builtin command. The
+ editing mode may be switched during interactive use by
+ using the --oo option to the sseett builtin command. Other
+ programs using this library provide similar mechanisms.
+ The _i_n_p_u_t_r_c file may be edited and re-read if a program
+ does not provide any other means to incorporate new bind-
+ ings.
+
+ VVaarriiaabblleess
+ Readline has variables that can be used to further cus-
+ tomize its behavior. A variable may be set in the _i_n_p_u_t_r_c
+ file with a statement of the form
+
+ sseett _v_a_r_i_a_b_l_e_-_n_a_m_e _v_a_l_u_e
+
+ Except where noted, readline variables can take the values
+ OOnn or OOffff. The variables and their default values are:
+
+ bbeellll--ssttyyllee ((aauuddiibbllee))
+ Controls what happens when readline wants to ring
+ the terminal bell. If set to nnoonnee, readline never
+
+
+
+GNU 1997 Feb 5 3
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ rings the bell. If set to vviissiibbllee, readline uses a
+ visible bell if one is available. If set to aauuddii--
+ bbllee, readline attempts to ring the terminal's bell.
+ ccoommmmeenntt--bbeeggiinn ((````##''''))
+ The string that is inserted in vvii mode when the
+ iinnsseerrtt--ccoommmmeenntt command is executed. This command
+ is bound to MM--## in emacs mode and to ## in vi com-
+ mand mode.
+ ccoommpplleettiioonn--qquueerryy--iitteemmss ((110000))
+ This determines when the user is queried about
+ viewing the number of possible completions gener-
+ ated by the ppoossssiibbllee--ccoommpplleettiioonnss command. It may
+ be set to any integer value greater than or equal
+ to zero. If the number of possible completions is
+ greater than or equal to the value of this vari-
+ able, the user is asked whether or not he wishes to
+ view them; otherwise they are simply listed on the
+ terminal.
+ ccoonnvveerrtt--mmeettaa ((OOnn))
+ If set to OOnn, readline will convert characters with
+ the eighth bit set to an ASCII key sequence by
+ stripping the eighth bit and prepending an escape
+ character (in effect, using escape as the _m_e_t_a _p_r_e_-
+ _f_i_x).
+ ddiissaabbllee--ccoommpplleettiioonn ((OOffff))
+ If set to OOnn, readline will inhibit word comple-
+ tion. Completion characters will be inserted into
+ the line as if they had been mapped to sseellff--iinnsseerrtt.
+ eeddiittiinngg--mmooddee ((eemmaaccss))
+ Controls whether readline begins with a set of key
+ bindings similar to _e_m_a_c_s or _v_i. eeddiittiinngg--mmooddee can
+ be set to either eemmaaccss or vvii.
+ eennaabbllee--kkeeyyppaadd ((OOffff))
+ When set to OOnn, readline will try to enable the
+ application keypad when it is called. Some systems
+ need this to enable the arrow keys.
+ eexxppaanndd--ttiillddee ((OOffff))
+ If set to oonn, tilde expansion is performed when
+ readline attempts word completion.
+ hhoorriizzoonnttaall--ssccrroollll--mmooddee ((OOffff))
+ When set to OOnn, makes readline use a single line
+ for display, scrolling the input horizontally on a
+ single screen line when it becomes longer than the
+ screen width rather than wrapping to a new line.
+ kkeeyymmaapp ((eemmaaccss))
+ Set the current readline keymap. The set of legal
+ keymap names is _e_m_a_c_s_, _e_m_a_c_s_-_s_t_a_n_d_a_r_d_, _e_m_a_c_s_-_m_e_t_a_,
+ _e_m_a_c_s_-_c_t_l_x_, _v_i_, _v_i_-_m_o_v_e_, _v_i_-_c_o_m_m_a_n_d, and _v_i_-_i_n_s_e_r_t.
+ _v_i is equivalent to _v_i_-_c_o_m_m_a_n_d; _e_m_a_c_s is equivalent
+ to _e_m_a_c_s_-_s_t_a_n_d_a_r_d. The default value is _e_m_a_c_s; the
+ value of eeddiittiinngg--mmooddee also affects the default
+ keymap.
+ mmaarrkk--ddiirreeccttoorriieess ((OOnn))
+ If set to OOnn, completed directory names have a
+
+
+
+GNU 1997 Feb 5 4
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ slash appended.
+ mmaarrkk--mmooddiiffiieedd--lliinneess ((OOffff))
+ If set to OOnn, history lines that have been modified
+ are displayed with a preceding asterisk (**).
+ mmeettaa--ffllaagg ((OOffff))
+ If set to OOnn, readline will enable eight-bit input
+ (that is, it will not strip the high bit from the
+ characters it reads), regardless of what the termi-
+ nal claims it can support.
+ oouuttppuutt--mmeettaa ((OOffff))
+ If set to OOnn, readline will display characters with
+ the eighth bit set directly rather than as a meta-
+ prefixed escape sequence.
+ sshhooww--aallll--iiff--aammbbiigguuoouuss ((OOffff))
+ This alters the default behavior of the completion
+ functions. If set to oonn, words which have more
+ than one possible completion cause the matches to
+ be listed immediately instead of ringing the bell.
+ vviissiibbllee--ssttaattss ((OOffff))
+ If set to OOnn, a character denoting a file's type as
+ reported by ssttaatt(2) is appended to the filename
+ when listing possible completions.
+
+ CCoonnddiittiioonnaall CCoonnssttrruuccttss
+ Readline implements a facility similar in spirit to the
+ conditional compilation features of the C preprocessor
+ which allows key bindings and variable settings to be per-
+ formed as the result of tests. There are three parser
+ directives used.
+
+ $$iiff The $$iiff construct allows bindings to be made based
+ on the editing mode, the terminal being used, or
+ the application using readline. The text of the
+ test extends to the end of the line; no characters
+ are required to isolate it.
+
+ mmooddee The mmooddee== form of the $$iiff directive is used
+ to test whether readline is in emacs or vi
+ mode. This may be used in conjunction with
+ the sseett kkeeyymmaapp command, for instance, to set
+ bindings in the _e_m_a_c_s_-_s_t_a_n_d_a_r_d and _e_m_a_c_s_-
+ _c_t_l_x keymaps only if readline is starting
+ out in emacs mode.
+
+ tteerrmm The tteerrmm== form may be used to include termi-
+ nal-specific key bindings, perhaps to bind
+ the key sequences output by the terminal's
+ function keys. The word on the right side
+ of the == is tested against the full name of
+ the terminal and the portion of the terminal
+ name before the first --. This allows _s_u_n to
+ match both _s_u_n and _s_u_n_-_c_m_d, for instance.
+
+
+
+
+
+GNU 1997 Feb 5 5
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ aapppplliiccaattiioonn
+ The aapppplliiccaattiioonn construct is used to include
+ application-specific settings. Each program
+ using the readline library sets the _a_p_p_l_i_c_a_-
+ _t_i_o_n _n_a_m_e, and an initialization file can
+ test for a particular value. This could be
+ used to bind key sequences to functions use-
+ ful for a specific program. For instance,
+ the following command adds a key sequence
+ that quotes the current or previous word in
+ Bash:
+ $$iiff bash
+ # Quote the current or previous word
+ "\C-xq": "\eb\"\ef\""
+ $$eennddiiff
+
+ $$eennddiiff This command, as you saw in the previous example,
+ terminates an $$iiff command.
+
+ $$eellssee Commands in this branch of the $$iiff directive are
+ executed if the test fails.
+
+SSEEAARRCCHHIINNGG
+ Readline provides commands for searching through the com-
+ mand history for lines containing a specified string.
+ There are two search modes: _i_n_c_r_e_m_e_n_t_a_l and _n_o_n_-_i_n_c_r_e_m_e_n_-
+ _t_a_l.
+
+ Incremental searches begin before the user has finished
+ typing the search string. As each character of the search
+ string is typed, readline displays the next entry from the
+ history matching the string typed so far. An incremental
+ search requires only as many characters as needed to find
+ the desired history entry. The Escape character is used
+ to terminate an incremental search. Control-J will also
+ terminate the search. Control-G will abort an incremental
+ search and restore the original line. When the search is
+ terminated, the history entry containing the search string
+ becomes the current line. To find other matching entries
+ in the history list, type Control-S or Control-R as appro-
+ priate. This will search backward or forward in the his-
+ tory for the next line matching the search string typed so
+ far. Any other key sequence bound to a readline command
+ will terminate the search and execute that command. For
+ instance, a _n_e_w_l_i_n_e will terminate the search and accept
+ the line, thereby executing the command from the history
+ list.
+
+ Non-incremental searches read the entire search string
+ before starting to search for matching history lines. The
+ search string may be typed by the user or part of the con-
+ tents of the current line.
+
+
+
+
+
+GNU 1997 Feb 5 6
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+EEDDIITTIINNGG CCOOMMMMAANNDDSS
+ The following is a list of the names of the commands and
+ the default key sequences to which they are bound. Com-
+ mand names without an accompanying key sequence are
+ unbound by default.
+
+ CCoommmmaannddss ffoorr MMoovviinngg
+ bbeeggiinnnniinngg--ooff--lliinnee ((CC--aa))
+ Move to the start of the current line.
+ eenndd--ooff--lliinnee ((CC--ee))
+ Move to the end of the line.
+ ffoorrwwaarrdd--cchhaarr ((CC--ff))
+ Move forward a character.
+ bbaacckkwwaarrdd--cchhaarr ((CC--bb))
+ Move back a character.
+ ffoorrwwaarrdd--wwoorrdd ((MM--ff))
+ Move forward to the end of the next word. Words
+ are composed of alphanumeric characters (letters
+ and digits).
+ bbaacckkwwaarrdd--wwoorrdd ((MM--bb))
+ Move back to the start of this, or the previous,
+ word. Words are composed of alphanumeric charac-
+ ters (letters and digits).
+ cclleeaarr--ssccrreeeenn ((CC--ll))
+ Clear the screen leaving the current line at the
+ top of the screen. With an argument, refresh the
+ current line without clearing the screen.
+ rreeddrraaww--ccuurrrreenntt--lliinnee
+ Refresh the current line.
+
+ CCoommmmaannddss ffoorr MMaanniippuullaattiinngg tthhee HHiissttoorryy
+ aacccceepptt--lliinnee ((NNeewwlliinnee,, RReettuurrnn))
+ Accept the line regardless of where the cursor is.
+ If this line is non-empty, add it to the history
+ list. If the line is a modified history line, then
+ restore the history line to its original state.
+ pprreevviioouuss--hhiissttoorryy ((CC--pp))
+ Fetch the previous command from the history list,
+ moving back in the list.
+ nneexxtt--hhiissttoorryy ((CC--nn))
+ Fetch the next command from the history list, mov-
+ ing forward in the list.
+ bbeeggiinnnniinngg--ooff--hhiissttoorryy ((MM--<<))
+ Move to the first line in the history.
+ eenndd--ooff--hhiissttoorryy ((MM-->>))
+ Move to the end of the input history, i.e., the
+ line currently being entered.
+ rreevveerrssee--sseeaarrcchh--hhiissttoorryy ((CC--rr))
+ Search backward starting at the current line and
+ moving `up' through the history as necessary. This
+ is an incremental search.
+ ffoorrwwaarrdd--sseeaarrcchh--hhiissttoorryy ((CC--ss))
+ Search forward starting at the current line and
+ moving `down' through the history as necessary.
+
+
+
+GNU 1997 Feb 5 7
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ This is an incremental search.
+ nnoonn--iinnccrreemmeennttaall--rreevveerrssee--sseeaarrcchh--hhiissttoorryy ((MM--pp))
+ Search backward through the history starting at the
+ current line using a non-incremental search for a
+ string supplied by the user.
+ nnoonn--iinnccrreemmeennttaall--ffoorrwwaarrdd--sseeaarrcchh--hhiissttoorryy ((MM--nn))
+ Search forward through the history using a non-
+ incremental search for a string supplied by the
+ user.
+ hhiissttoorryy--sseeaarrcchh--ffoorrwwaarrdd
+ Search forward through the history for the string
+ of characters between the start of the current line
+ and the current cursor position (the _p_o_i_n_t). This
+ is a non-incremental search.
+ hhiissttoorryy--sseeaarrcchh--bbaacckkwwaarrdd
+ Search backward through the history for the string
+ of characters between the start of the current line
+ and the point. This is a non-incremental search.
+ yyaannkk--nntthh--aarrgg ((MM--CC--yy))
+ Insert the first argument to the previous command
+ (usually the second word on the previous line) at
+ point (the current cursor position). With an argu-
+ ment _n, insert the _nth word from the previous com-
+ mand (the words in the previous command begin with
+ word 0). A negative argument inserts the _nth word
+ from the end of the previous command.
+ yyaannkk--llaasstt--aarrgg ((MM--..,, MM--__))
+ Insert the last argument to the previous command
+ (the last word of the previous history entry).
+ With an argument, behave exactly like yyaannkk--nntthh--aarrgg.
+
+ CCoommmmaannddss ffoorr CChhaannggiinngg TTeexxtt
+ ddeelleettee--cchhaarr ((CC--dd))
+ Delete the character under the cursor. If point is
+ at the beginning of the line, there are no charac-
+ ters in the line, and the last character typed was
+ not CC--dd, then return EEOOFF.
+ bbaacckkwwaarrdd--ddeelleettee--cchhaarr ((RRuubboouutt))
+ Delete the character behind the cursor. When given
+ a numeric argument, save the deleted text on the
+ kill ring.
+ qquuootteedd--iinnsseerrtt ((CC--qq,, CC--vv))
+ Add the next character that you type to the line
+ verbatim. This is how to insert characters like
+ CC--qq, for example.
+ ttaabb--iinnsseerrtt ((MM--TTAABB))
+ Insert a tab character.
+ sseellff--iinnsseerrtt ((aa,, bb,, AA,, 11,, !!,, ......))
+ Insert the character typed.
+ ttrraannssppoossee--cchhaarrss ((CC--tt))
+ Drag the character before point forward over the
+ character at point. Point moves forward as well.
+ If point is at the end of the line, then transpose
+ the two characters before point. Negative
+
+
+
+GNU 1997 Feb 5 8
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ arguments don't work.
+ ttrraannssppoossee--wwoorrddss ((MM--tt))
+ Drag the word behind the cursor past the word in
+ front of the cursor moving the cursor over that
+ word as well.
+ uuppccaassee--wwoorrdd ((MM--uu))
+ Uppercase the current (or following) word. With a
+ negative argument, do the previous word, but do not
+ move point.
+ ddoowwnnccaassee--wwoorrdd ((MM--ll))
+ Lowercase the current (or following) word. With a
+ negative argument, do the previous word, but do not
+ move point.
+ ccaappiittaalliizzee--wwoorrdd ((MM--cc))
+ Capitalize the current (or following) word. With a
+ negative argument, do the previous word, but do not
+ move point.
+
+ KKiilllliinngg aanndd YYaannkkiinngg
+ kkiillll--lliinnee ((CC--kk))
+ Kill the text from the current cursor position to
+ the end of the line.
+ bbaacckkwwaarrdd--kkiillll--lliinnee ((CC--xx RRuubboouutt))
+ Kill backward to the beginning of the line.
+ uunniixx--lliinnee--ddiissccaarrdd ((CC--uu))
+ Kill backward from point to the beginning of the
+ line.
+ kkiillll--wwhhoollee--lliinnee
+ Kill all characters on the current line, no matter
+ where the cursor is.
+ kkiillll--wwoorrdd ((MM--dd))
+ Kill from the cursor to the end of the current
+ word, or if between words, to the end of the next
+ word. Word boundaries are the same as those used
+ by ffoorrwwaarrdd--wwoorrdd.
+ bbaacckkwwaarrdd--kkiillll--wwoorrdd ((MM--RRuubboouutt))
+ Kill the word behind the cursor. Word boundaries
+ are the same as those used by bbaacckkwwaarrdd--wwoorrdd.
+ uunniixx--wwoorrdd--rruubboouutt ((CC--ww))
+ Kill the word behind the cursor, using white space
+ as a word boundary. The word boundaries are dif-
+ ferent from bbaacckkwwaarrdd--kkiillll--wwoorrdd.
+ ddeelleettee--hhoorriizzoonnttaall--ssppaaccee ((MM--\\))
+ Delete all spaces and tabs around point.
+ kkiillll--rreeggiioonn
+ Kill the text between the point and _m_a_r_k (saved
+ cursor position). This text is referred to as the
+ _r_e_g_i_o_n.
+ ccooppyy--rreeggiioonn--aass--kkiillll
+ Copy the text in the region to the kill buffer.
+ ccooppyy--bbaacckkwwaarrdd--wwoorrdd
+ Copy the word before point to the kill buffer.
+ ccooppyy--ffoorrwwaarrdd--wwoorrdd
+ Copy the word following point to the kill buffer.
+
+
+
+GNU 1997 Feb 5 9
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ yyaannkk ((CC--yy))
+ Yank the top of the kill ring into the buffer at
+ the cursor.
+ yyaannkk--ppoopp ((MM--yy))
+ Rotate the kill ring, and yank the new top. Only
+ works following yyaannkk or yyaannkk--ppoopp.
+
+ NNuummeerriicc AArrgguummeennttss
+ ddiiggiitt--aarrgguummeenntt ((MM--00,, MM--11,, ......,, MM----))
+ Add this digit to the argument already accumulat-
+ ing, or start a new argument. M-- starts a nega-
+ tive argument.
+ uunniivveerrssaall--aarrgguummeenntt
+ This is another way to specify an argument. If
+ this command is followed by one or more digits,
+ optionally with a leading minus sign, those digits
+ define the argument. If the command is followed by
+ digits, executing uunniivveerrssaall--aarrgguummeenntt again ends the
+ numeric argument, but is otherwise ignored. As a
+ special case, if this command is immediately fol-
+ lowed by a character that is neither a digit or
+ minus sign, the argument count for the next command
+ is multiplied by four. The argument count is ini-
+ tially one, so executing this function the first
+ time makes the argument count four, a second time
+ makes the argument count sixteen, and so on.
+
+ CCoommpplleettiinngg
+ ccoommpplleettee ((TTAABB))
+ Attempt to perform completion on the text before
+ point. The actual completion performed is applica-
+ tion-specific. BBaasshh, for instance, attempts com-
+ pletion treating the text as a variable (if the
+ text begins with $$), username (if the text begins
+ with ~~), hostname (if the text begins with @@), or
+ command (including aliases and functions) in turn.
+ If none of these produces a match, filename comple-
+ tion is attempted. GGddbb, on the other hand, allows
+ completion of program functions and variables, and
+ only attempts filename completion under certain
+ circumstances.
+ ppoossssiibbllee--ccoommpplleettiioonnss ((MM--??))
+ List the possible completions of the text before
+ point.
+ iinnsseerrtt--ccoommpplleettiioonnss ((MM--**))
+ Insert all completions of the text before point
+ that would have been generated by ppoossssiibbllee--ccoommppllee--
+ ttiioonnss.
+
+ KKeeyybbooaarrdd MMaaccrrooss
+ ssttaarrtt--kkbbdd--mmaaccrroo ((CC--xx (())
+ Begin saving the characters typed into the current
+ keyboard macro.
+
+
+
+
+GNU 1997 Feb 5 10
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ eenndd--kkbbdd--mmaaccrroo ((CC--xx ))))
+ Stop saving the characters typed into the current
+ keyboard macro and store the definition.
+ ccaallll--llaasstt--kkbbdd--mmaaccrroo ((CC--xx ee))
+ Re-execute the last keyboard macro defined, by mak-
+ ing the characters in the macro appear as if typed
+ at the keyboard.
+
+ MMiisscceellllaanneeoouuss
+ rree--rreeaadd--iinniitt--ffiillee ((CC--xx CC--rr))
+ Read in the contents of the _i_n_p_u_t_r_c file, and
+ incorporate any bindings or variable assignments
+ found there.
+ aabboorrtt ((CC--gg))
+ Abort the current editing command and ring the ter-
+ minal's bell (subject to the setting of
+ bbeellll--ssttyyllee).
+ ddoo--uuppppeerrccaassee--vveerrssiioonn ((MM--aa,, MM--bb,, MM--_x,, ......))
+ If the metafied character _x is lowercase, run the
+ command that is bound to the corresponding upper-
+ case character.
+ pprreeffiixx--mmeettaa ((EESSCC))
+ Metafy the next character typed. EESSCC ff is equiva-
+ lent to MMeettaa--ff.
+ uunnddoo ((CC--__,, CC--xx CC--uu))
+ Incremental undo, separately remembered for each
+ line.
+ rreevveerrtt--lliinnee ((MM--rr))
+ Undo all changes made to this line. This is like
+ typing the uunnddoo command enough times to return the
+ line to its initial state.
+ ttiillddee--eexxppaanndd ((MM--~~))
+ Perform tilde expansion on the current word.
+ sseett--mmaarrkk ((CC--@@,, MM--<<ssppaaccee>>))
+ Set the mark to the current point. If a numeric
+ argument is supplied, the mark is set to that posi-
+ tion.
+ eexxcchhaannggee--ppooiinntt--aanndd--mmaarrkk ((CC--xx CC--xx))
+ Swap the point with the mark. The current cursor
+ position is set to the saved position, and the old
+ cursor position is saved as the mark.
+ cchhaarraacctteerr--sseeaarrcchh ((CC--]]))
+ A character is read and point is moved to the next
+ occurrence of that character. A negative count
+ searches for previous occurrences.
+ cchhaarraacctteerr--sseeaarrcchh--bbaacckkwwaarrdd ((MM--CC--]]))
+ A character is read and point is moved to the pre-
+ vious occurrence of that character. A negative
+ count searches for subsequent occurrences.
+ iinnsseerrtt--ccoommmmeenntt ((MM--##))
+ The value of the readline ccoommmmeenntt--bbeeggiinn variable is
+ inserted at the beginning of the current line, and
+ the line is accepted as if a newline had been
+ typed. This makes the current line a shell
+
+
+
+GNU 1997 Feb 5 11
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ comment.
+ gglloobb--eexxppaanndd--wwoorrdd ((CC--xx **))
+ The word before point is treated as a pattern for
+ pathname expansion, and the list of matching file
+ names is inserted, replacing the word.
+ gglloobb--lliisstt--eexxppaannssiioonnss ((CC--xx gg))
+ The list of expansions that would have been gener-
+ ated by gglloobb--eexxppaanndd--wwoorrdd is inserted into the line,
+ replacing the word before point.
+ dduummpp--ffuunnccttiioonnss
+ Print all of the functions and their key bindings
+ to the readline output stream. If a numeric argu-
+ ment is supplied, the output is formatted in such a
+ way that it can be made part of an _i_n_p_u_t_r_c file.
+ dduummpp--vvaarriiaabblleess
+ Print all of the settable variables and their val-
+ ues to the readline output stream. If a numeric
+ argument is supplied, the output is formatted in
+ such a way that it can be made part of an _i_n_p_u_t_r_c
+ file.
+ dduummpp--mmaaccrrooss
+ Print all of the readline key sequences bound to
+ macros and the strings they ouput. If a numeric
+ argument is supplied, the output is formatted in
+ such a way that it can be made part of an _i_n_p_u_t_r_c
+ file.
+ eemmaaccss--eeddiittiinngg--mmooddee ((CC--ee))
+ When in vvii editing mode, this causes a switch to
+ eemmaaccss editing mode.
+ vvii--eeddiittiinngg--mmooddee ((MM--CC--jj))
+ When in eemmaaccss editing mode, this causes a switch to
+ vvii editing mode.
+
+DDEEFFAAUULLTT KKEEYY BBIINNDDIINNGGSS
+ The following is a list of the default emacs and vi bind-
+ ings. Characters with the 8th bit set are written as
+ M-<character>, and are referred to as _m_e_t_a_f_i_e_d characters.
+ The printable ASCII characters not mentioned in the list
+ of emacs standard bindings are bound to the _s_e_l_f_-_i_n_s_e_r_t
+ function, which just inserts the given character into the
+ input line. In vi insertion mode, all characters not
+ specifically mentioned are bound to _s_e_l_f_-_i_n_s_e_r_t. Charac-
+ ters assigned to signal generation by _s_t_t_y(1) or the ter-
+ minal driver, such as C-Z or C-C, retain that function.
+ Upper and lower case _m_e_t_a_f_i_e_d characters are bound to the
+ same function in the emacs mode meta keymap. The remain-
+ ing characters are unbound, which causes readline to ring
+ the bell (subject to the setting of the bbeellll--ssttyyllee vari-
+ able).
+
+ EEmmaaccss MMooddee
+ Emacs Standard bindings
+
+ "C-@" set-mark
+
+
+
+GNU 1997 Feb 5 12
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ "C-A" beginning-of-line
+ "C-B" backward-char
+ "C-D" delete-char
+ "C-E" end-of-line
+ "C-F" forward-char
+ "C-G" abort
+ "C-H" backward-delete-char
+ "C-I" complete
+ "C-J" accept-line
+ "C-K" kill-line
+ "C-L" clear-screen
+ "C-M" accept-line
+ "C-N" next-history
+ "C-P" previous-history
+ "C-Q" quoted-insert
+ "C-R" reverse-search-history
+ "C-S" forward-search-history
+ "C-T" transpose-chars
+ "C-U" unix-line-discard
+ "C-V" quoted-insert
+ "C-W" unix-word-rubout
+ "C-Y" yank
+ "C-]" character-search
+ "C-_" undo
+ " " to "/" self-insert
+ "0" to "9" self-insert
+ ":" to "~" self-insert
+ "C-?" backward-delete-char
+
+ Emacs Meta bindings
+
+ "M-C-G" abort
+ "M-C-H" backward-kill-word
+ "M-C-I" tab-insert
+ "M-C-J" vi-editing-mode
+ "M-C-M" vi-editing-mode
+ "M-C-R" revert-line
+ "M-C-Y" yank-nth-arg
+ "M-C-[" complete
+ "M-C-]" character-search-backward
+ "M-space" set-mark
+ "M-#" insert-comment
+ "M-&" tilde-expand
+ "M-*" insert-completions
+ "M--" digit-argument
+ "M-." yank-last-arg
+ "M-0" digit-argument
+ "M-1" digit-argument
+ "M-2" digit-argument
+ "M-3" digit-argument
+ "M-4" digit-argument
+ "M-5" digit-argument
+ "M-6" digit-argument
+ "M-7" digit-argument
+
+
+
+GNU 1997 Feb 5 13
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ "M-8" digit-argument
+ "M-9" digit-argument
+ "M-<" beginning-of-history
+ "M-=" possible-completions
+ "M->" end-of-history
+ "M-?" possible-completions
+ "M-B" backward-word
+ "M-C" capitalize-word
+ "M-D" kill-word
+ "M-F" forward-word
+ "M-L" downcase-word
+ "M-N" non-incremental-forward-search-history
+ "M-P" non-incremental-reverse-search-history
+ "M-R" revert-line
+ "M-T" transpose-words
+ "M-U" upcase-word
+ "M-Y" yank-pop
+ "M-\" delete-horizontal-space
+ "M-~" tilde-expand
+ "M-C-?" backward-delete-word
+ "M-_" yank-last-arg
+
+ Emacs Control-X bindings
+
+ "C-XC-G" abort
+ "C-XC-R" re-read-init-file
+ "C-XC-U" undo
+ "C-XC-X" exchange-point-and-mark
+ "C-X(" start-kbd-macro
+ "C-X)" end-kbd-macro
+ "C-XE" call-last-kbd-macro
+ "C-XC-?" backward-kill-line
+
+
+ VVII MMooddee bbiinnddiinnggss
+ VI Insert Mode functions
+
+ "C-D" vi-eof-maybe
+ "C-H" backward-delete-char
+ "C-I" complete
+ "C-J" accept-line
+ "C-M" accept-line
+ "C-R" reverse-search-history
+ "C-S" forward-search-history
+ "C-T" transpose-chars
+ "C-U" unix-line-discard
+ "C-V" quoted-insert
+ "C-W" unix-word-rubout
+ "C-Y" yank
+ "C-[" vi-movement-mode
+ "C-_" undo
+ " " to "~" self-insert
+ "C-?" backward-delete-char
+
+
+
+
+GNU 1997 Feb 5 14
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ VI Command Mode functions
+
+ "C-D" vi-eof-maybe
+ "C-E" emacs-editing-mode
+ "C-G" abort
+ "C-H" backward-char
+ "C-J" accept-line
+ "C-K" kill-line
+ "C-L" clear-screen
+ "C-M" accept-line
+ "C-N" next-history
+ "C-P" previous-history
+ "C-Q" quoted-insert
+ "C-R" reverse-search-history
+ "C-S" forward-search-history
+ "C-T" transpose-chars
+ "C-U" unix-line-discard
+ "C-V" quoted-insert
+ "C-W" unix-word-rubout
+ "C-Y" yank
+ " " forward-char
+ "#" insert-comment
+ "$" end-of-line
+ "%" vi-match
+ "&" vi-tilde-expand
+ "*" vi-complete
+ "+" next-history
+ "," vi-char-search
+ "-" previous-history
+ "." vi-redo
+ "/" vi-search
+ "0" beginning-of-line
+ "1" to "9" vi-arg-digit
+ ";" vi-char-search
+ "=" vi-complete
+ "?" vi-search
+ "A" vi-append-eol
+ "B" vi-prev-word
+ "C" vi-change-to
+ "D" vi-delete-to
+ "E" vi-end-word
+ "F" vi-char-search
+ "G" vi-fetch-history
+ "I" vi-insert-beg
+ "N" vi-search-again
+ "P" vi-put
+ "R" vi-replace
+ "S" vi-subst
+ "T" vi-char-search
+ "U" revert-line
+ "W" vi-next-word
+ "X" backward-delete-char
+ "Y" vi-yank-to
+ "\" vi-complete
+
+
+
+GNU 1997 Feb 5 15
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ "^" vi-first-print
+ "_" vi-yank-arg
+ "`" vi-goto-mark
+ "a" vi-append-mode
+ "b" vi-prev-word
+ "c" vi-change-to
+ "d" vi-delete-to
+ "e" vi-end-word
+ "f" vi-char-search
+ "h" backward-char
+ "i" vi-insertion-mode
+ "j" next-history
+ "k" prev-history
+ "l" forward-char
+ "m" vi-set-mark
+ "n" vi-search-again
+ "p" vi-put
+ "r" vi-change-char
+ "s" vi-subst
+ "t" vi-char-search
+ "u" undo
+ "w" vi-next-word
+ "x" vi-delete
+ "y" vi-yank-to
+ "|" vi-column
+ "~" vi-change-case
+
+SSEEEE AALLSSOO
+ _T_h_e _G_n_u _R_e_a_d_l_i_n_e _L_i_b_r_a_r_y, Brian Fox and Chet Ramey
+ _T_h_e _G_n_u _H_i_s_t_o_r_y _L_i_b_r_a_r_y, Brian Fox and Chet Ramey
+ _b_a_s_h(1)
+
+FFIILLEESS
+ _~_/_._i_n_p_u_t_r_c
+ Individual rreeaaddlliinnee initialization file
+
+AAUUTTHHOORRSS
+ Brian Fox, Free Software Foundation (primary author)
+ bfox@ai.MIT.Edu
+
+ Chet Ramey, Case Western Reserve University
+ chet@ins.CWRU.Edu
+
+BBUUGG RREEPPOORRTTSS
+ If you find a bug in rreeaaddlliinnee,, you should report it. But
+ first, you should make sure that it really is a bug, and
+ that it appears in the latest version of the rreeaaddlliinnee
+ library that you have.
+
+ Once you have determined that a bug actually exists, mail
+ a bug report to _b_u_g_-_r_e_a_d_l_i_n_e@_p_r_e_p_._a_i_._M_I_T_._E_d_u. If you have
+ a fix, you are welcome to mail that as well! Suggestions
+ and `philosophical' bug reports may be mailed to _b_u_g_-_r_e_a_d_-
+ _l_i_n_e@_p_r_e_p_._a_i_._M_I_T_._E_d_u or posted to the Usenet newsgroup
+
+
+
+GNU 1997 Feb 5 16
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ ggnnuu..bbaasshh..bbuugg.
+
+ Comments and bug reports concerning this manual page
+ should be directed to _c_h_e_t_@_i_n_s_._C_W_R_U_._E_d_u.
+
+BBUUGGSS
+ It's too big and too slow.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+GNU 1997 Feb 5 17
+
+
diff --git a/doc/readline.3 b/doc/readline.3
index e3da7cc..3d16168 100644
--- a/doc/readline.3
+++ b/doc/readline.3
@@ -6,9 +6,9 @@
.\" Case Western Reserve University
.\" chet@ins.CWRU.Edu
.\"
-.\" Last Change: Mon Jun 13 20:06:14 EDT 1994
+.\" Last Change: Wed Feb 5 14:13:22 EST 1997
.\"
-.TH READLINE 3 "1994 June 13" GNU
+.TH READLINE 3 "1997 Feb 5" GNU
.\"
.\" File Name macro. This used to be `.PN', for Path Name,
.\" but Sun doesn't seem to like that very much.
@@ -29,132 +29,13 @@ readline \- get a line from a user with editing
.LP
.nf
.ft B
-typedef int Function ();
-.LP
-.nf
-.ft B
char *readline (prompt)
char *prompt;
.ft
.fi
-.LP
-.nf
-.ft B
-int rl_add_defun (name, function, key)
-char *name;
-Function *function;
-int key;
-.ft
-.fi
-.LP
-.nf
-.ft B
-int rl_bind_key (key, function)
-int key;
-Function *function;
-.ft
-.fi
-.LP
-.nf
-.ft B
-int rl_unbind_key (key)
-int key;
-.ft
-.fi
-.LP
-.nf
-.ft B
-int rl_bind_key_in_map (key, function, keymap)
-int key;
-Function *function;
-Keymap keymap;
-.ft
-.fi
-.LP
-.nf
-.ft B
-int rl_unbind_key_in_map (key, keymap)
-int key;
-Keymap keymap;
-.ft
-.fi
-.ft B
-int rl_macro_bind (keyseq, macro, keymap)
-char *keyseq, *macro;
-Keymap keymap;
-.ft
-.fi
-.LP
-.nf
-.ft B
-int rl_variable_bind (variable, value)
-char *variable, *value;
-.ft
-.fi
-.LP
-.nf
-.LP
-.nf
-.ft B
-int rl_parse_and_bind (line)
-char *line;
-.ft
-.fi
-.LP
-.nf
-.ft B
-int rl_translate_keyseq (keyseq, array, len)
-char *keyseq, *array;
-int *len;
-.ft
-.fi
-.LP
-.nf
-.ft B
-Function *rl_named_function (command)
-char *command;
-.ft
-.fi
-.LP
-.nf
-.ft B
-Function *rl_function_of_keyseq (keyseq, keymap, type)
-char *keyseq;
-Keymap keymap;
-int *type;
-.ft
-.fi
-.LP
-.nf
-.ft B
-char **rl_invoking_keyseqs (function)
-Function *function;
-.ft
-.fi
-.LP
-.nf
-.ft B
-char **rl_invoking_keyseqs_in_map (function, keymap)
-Function *function;
-Keymap keymap;
-.ft
-.fi
-.LP
-.nf
-.ft B
-void rl_function_dumper (readable)
-int readable;
-.ft
-.fi
-.LP
-.nf
-.ft B
-char **rl_funmap_names ()
-.ft
-.fi
.SH COPYRIGHT
-.if n Readline is Copyright (C) 1989, 1991 by the Free Software Foundation, Inc.
-.if t Readline is Copyright \(co 1989, 1991 by the Free Software Foundation, Inc.
+.if n Readline is Copyright (C) 1989, 1991, 1993, 1995, 1996 by the Free Software Foundation, Inc.
+.if t Readline is Copyright \(co 1989, 1991, 1993, 1995, 1996 by the Free Software Foundation, Inc.
.SH DESCRIPTION
.LP
.B readline
@@ -175,119 +56,6 @@ line.
By default, the line editing commands
are similar to those of emacs.
A vi\-style line editing interface is also available.
-.LP
-In the following descriptions,
-.B keymap
-can be one of \fIemacs_keymap, emacs_meta_keymap, emacs_ctlx_keymap,
-vi_insertion_keymap, or vi_movement_keymap\fP.
-.LP
-.B rl_add_defun
-makes
-.B name
-appear as a bindable readline command, and makes
-.B function
-be the function called when that command is invoked. If
-.B key
-is not \-1, it is bound to
-.B function
-in the current keymap.
-.LP
-.B rl_bind_key
-causes
-.B key
-to invoke
-.BR function .
-The binding is made in the current keymap.
-.LP
-.B rl_unbind_key
-removes the binding for
-.B key
-in the current keymap.
-.LP
-.B rl_bind_key_in_map
-makes the
-.B key
-entry in
-.B keymap
-invoke
-.BR function .
-.LP
-.B rl_unbind_key_in_map
-removes the binding for
-.B key
-in keymap
-.BR keymap .
-.LP
-.B rl_macro_bind
-makes
-.B keyseq
-insert the string
-.BR macro .
-The binding is performed in
-.BR keymap .
-.LP
-.B rl_variable_bind
-sets the value of the readline variable
-.B variable
-to
-.BR value .
-.LP
-.B rl_parse_and_bind
-takes as an argument a line of the same form as the readline startup
-file (see
-.SM
-.B INITIALIZATION FILE
-below) and executes the commands therein.
-.LP
-.B rl_translate_keyseq
-converts
-.B keyseq
-into a new string, storing the result in
-.BR array .
-This translates control and meta prefixes and the readline
-character escape sequences (see
-.SM
-.B Key Bindings
-below). The length of the translated sequence is returned in
-.BR *len .
-.LP
-.B rl_named_function
-returns the function that is executed when the readline
-command
-.B command
-is invoked.
-.LP
-.B rl_function_of_keyseq
-returns the function that is executed when
-.B keyseq
-is read and
-.B keymap
-is the current keymap.
-.B type
-is set to indicate whether the return value corresponds to a
-function, macro, or auxiliary keymap.
-.LP
-.B rl_invoking_keyseqs
-returns all of the key sequences in the current keymap that
-invoke
-.BR function .
-.LP
-.B rl_invoking_keyseqs_in_map
-returns all of the key sequences in
-.B keymap
-that invoke
-.BR function .
-.LP
-.B rl_function_dumper
-prints all of the readline functions and their bindings to the
-readline output stream. If
-.B readable
-is non\-zero, the output is formattted so that it can be read
-back in to restore the bindings.
-.LP
-.B rl_funmap_names
-returns an array of all known readline bindable function names.
-The array is sorted.
.SH RETURN VALUE
.LP
.B readline
@@ -300,12 +68,9 @@ is returned. If an
.B EOF
is read with a non\-empty line, it is
treated as a newline.
-.LP
-Unless otherwise stated,
-the other functions return 0 on success and non\-zero on failure.
.SH NOTATION
.LP
-An emacs\-style notation is used to denote
+An emacs-style notation is used to denote
keystrokes. Control keys are denoted by C\-\fIkey\fR, e.g., C\-n
means Control\-N. Similarly,
.I meta
@@ -333,25 +98,25 @@ behavior with arguments deviates from this are noted.
When a command is described as \fIkilling\fP text, the text
deleted is saved for possible future retrieval
(\fIyanking\fP). The killed text is saved in a
-\fIkill\-ring\fP. Consecutive kills cause the text to be
+\fIkill ring\fP. Consecutive kills cause the text to be
accumulated into one unit, which can be yanked all at once.
Commands which do not kill text separate the chunks of text
-on the kill\-ring.
+on the kill ring.
.SH INITIALIZATION FILE
.LP
Readline is customized by putting commands in an initialization
-file. The name of this file is taken from the value of the
+file (the \fIinputrc\fP file).
+The name of this file is taken from the value of the
.B INPUTRC
-variable. If that variable is unset, the default is
+environment variable. If that variable is unset, the default is
.IR ~/.inputrc .
When a program which uses the readline library starts up, the
init file is read, and the key bindings and variables are set.
There are only a few basic constructs allowed in the
readline init file. Blank lines are ignored.
Lines beginning with a \fB#\fP are comments.
-Lines beginning with a \fB$\fP indicate conditional
-constructs. Other lines
-denote key bindings and variable settings.
+Lines beginning with a \fB$\fP indicate conditional constructs.
+Other lines denote key bindings and variable settings.
Each program using this library may add its own commands
and bindings.
.PP
@@ -365,7 +130,7 @@ or
C\-Meta\-u: universal\-argument
.RE
into the
-.FN ~/.inputrc
+.I inputrc
would make M\-C\-u execute the readline command
.IR universal\-argument .
.PP
@@ -388,7 +153,7 @@ to a string that is inserted when the key is pressed (a \fImacro\fP).
.SS Key Bindings
.PP
The syntax for controlling key bindings in the
-.I ~/.inputrc
+.I inputrc
file is simple. All that is required is the name of the
command or the text of a macro and a key sequence to which
it should be bound. The name may be specified in one of two ways:
@@ -451,10 +216,10 @@ is bound to insert the text
The full set of escape sequences is
.RS
.TP
-.B \eC-
+.B \eC\-
control prefix
.TP
-.B \eM-
+.B \eM\-
meta prefix
.TP
.B \ee
@@ -487,7 +252,7 @@ option to the
builtin command. Other programs using this library provide
similar mechanisms. The
.I inputrc
-file may be edited and re\-read if a program does not provide
+file may be edited and re-read if a program does not provide
any other means to incorporate new bindings.
.SS Variables
.PP
@@ -508,24 +273,6 @@ The variables and their default values are:
.PP
.PD 0
.TP
-.B horizontal\-scroll\-mode (Off)
-When set to \fBOn\fP, makes readline use a single line for display,
-scrolling the input horizontally on a single screen line when it
-becomes longer than the screen width rather than wrapping to a new line.
-.TP
-.B editing\-mode (emacs)
-Controls whether readline begins with a set of key bindings similar
-to \fIemacs\fP or \fIvi\fP.
-.B editing\-mode
-can be set to either
-.B emacs
-or
-.BR vi .
-.TP
-.B mark\-modified\-lines (Off)
-If set to \fBOn\fP, history lines that have been modified are displayed
-with a preceding asterisk (\fB*\fP).
-.TP
.B bell\-style (audible)
Controls what happens when readline wants to ring the terminal bell.
If set to \fBnone\fP, readline never rings the bell. If set to
@@ -534,24 +281,13 @@ If set to \fBaudible\fP, readline attempts to ring the terminal's bell.
.TP
.B comment\-begin (``#'')
The string that is inserted in \fBvi\fP mode when the
-.B vi\-comment
+.B insert\-comment
command is executed.
-.TP
-.B meta\-flag (Off)
-If set to \fBOn\fP, readline will enable eight-bit input (that is,
-it will not strip the high bit from the characters it reads),
-regardless of what the terminal claims it can support.
-.TP
-.B convert\-meta (On)
-If set to \fBOn\fP, readline will convert characters with the
-eighth bit set to an ASCII key sequence
-by stripping the eighth bit and prepending an
-escape character (in effect, using escape as the \fImeta prefix\fP).
-.TP
-.B output\-meta (Off)
-If set to \fBOn\fP, readline will display characters with the
-eighth bit set directly rather than as a meta-prefixed escape
-sequence.
+This command is bound to
+.B M\-#
+in emacs mode and to
+.B #
+in vi command mode.
.TP
.B completion\-query\-items (100)
This determines when the user is queried about viewing
@@ -563,6 +299,40 @@ or equal to the value of this variable, the user is asked whether
or not he wishes to view them; otherwise they are simply listed
on the terminal.
.TP
+.B convert\-meta (On)
+If set to \fBOn\fP, readline will convert characters with the
+eighth bit set to an ASCII key sequence
+by stripping the eighth bit and prepending an
+escape character (in effect, using escape as the \fImeta prefix\fP).
+.TP
+.B disable\-completion (Off)
+If set to \fBOn\fP, readline will inhibit word completion. Completion
+characters will be inserted into the line as if they had been
+mapped to \fBself-insert\fP.
+.TP
+.B editing\-mode (emacs)
+Controls whether readline begins with a set of key bindings similar
+to \fIemacs\fP or \fIvi\fP.
+.B editing\-mode
+can be set to either
+.B emacs
+or
+.BR vi .
+.TP
+.B enable\-keypad (Off)
+When set to \fBOn\fP, readline will try to enable the application
+keypad when it is called. Some systems need this to enable the
+arrow keys.
+.TP
+.B expand\-tilde (Off)
+If set to \fBon\fP, tilde expansion is performed when readline
+attempts word completion.
+.TP
+.B horizontal\-scroll\-mode (Off)
+When set to \fBOn\fP, makes readline use a single line for display,
+scrolling the input horizontally on a single screen line when it
+becomes longer than the screen width rather than wrapping to a new line.
+.TP
.B keymap (emacs)
Set the current readline keymap. The set of legal keymap names is
\fIemacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,
@@ -575,6 +345,24 @@ the value of
.B editing\-mode
also affects the default keymap.
.TP
+.B mark\-directories (On)
+If set to \fBOn\fP, completed directory names have a slash
+appended.
+.TP
+.B mark\-modified\-lines (Off)
+If set to \fBOn\fP, history lines that have been modified are displayed
+with a preceding asterisk (\fB*\fP).
+.TP
+.B meta\-flag (Off)
+If set to \fBOn\fP, readline will enable eight-bit input (that is,
+it will not strip the high bit from the characters it reads),
+regardless of what the terminal claims it can support.
+.TP
+.B output\-meta (Off)
+If set to \fBOn\fP, readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.
+.TP
.B show\-all\-if\-ambiguous (Off)
This alters the default behavior of the completion functions. If
set to
@@ -582,9 +370,10 @@ set to
words which have more than one possible completion cause the
matches to be listed immediately instead of ringing the bell.
.TP
-.B expand\-tilde (Off)
-If set to \fBon\fP, tilde expansion is performed when readline
-attempts word completion.
+.B visible\-stats (Off)
+If set to \fBOn\fP, a character denoting a file's type as reported
+by \fBstat\fP(2) is appended to the filename when listing possible
+completions.
.PD
.SS Conditional Constructs
.PP
@@ -622,7 +411,7 @@ and
for instance.
.IP \fBapplication\fP
The \fBapplication\fP construct is used to include
-application\-specific settings. Each program using the readline
+application-specific settings. Each program using the readline
library sets the \fIapplication name\fP, and an initialization
file can test for a particular value.
This could be used to bind key sequences to functions useful for
@@ -643,10 +432,44 @@ This command, as you saw in the previous example, terminates an
.IP \fB$else\fP
Commands in this branch of the \fB$if\fP directive are executed if
the test fails.
+.SH SEARCHING
+.PP
+Readline provides commands for searching through the command history
+for lines containing a specified string.
+There are two search modes:
+.I incremental
+and
+.IR non-incremental .
+.PP
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+The Escape character is used to terminate an incremental search.
+Control-J will also terminate the search.
+Control-G will abort an incremental search and restore the original
+line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+To find other matching entries in the history list, type Control-S or
+Control-R as appropriate.
+This will search backward or forward in the history for the next
+line matching the search string typed so far.
+Any other key sequence bound to a readline command will terminate
+the search and execute that command.
+For instance, a \fInewline\fP will terminate the search and accept
+the line, thereby executing the command from the history list.
+.PP
+Non-incremental searches read the entire search string before starting
+to search for matching history lines. The search string may be
+typed by the user or part of the contents of the current line.
.SH EDITING COMMANDS
.PP
The following is a list of the names of the commands and the default
key sequences to which they are bound.
+Command names without an accompanying key sequence are unbound by default.
.SS Commands for Moving
.PP
.PD 0
@@ -677,7 +500,7 @@ With an argument, refresh the current line without clearing the
screen.
.TP
.B redraw\-current\-line
-Refresh the current line. By default, this is unbound.
+Refresh the current line.
.PD
.SS Commands for Manipulating the History
.PP
@@ -685,7 +508,7 @@ Refresh the current line. By default, this is unbound.
.TP
.B accept\-line (Newline, Return)
Accept the line regardless of where the cursor is. If this line is
-non\-empty, add it to the history list. If the line is a modified
+non-empty, add it to the history list. If the line is a modified
history line, then restore the history line to its original state.
.TP
.B previous\-history (C\-p)
@@ -713,21 +536,22 @@ the history as necessary. This is an incremental search.
.TP
.B non\-incremental\-reverse\-search\-history (M\-p)
Search backward through the history starting at the current line
-using a non\-incremental search for a string supplied by the user.
+using a non-incremental search for a string supplied by the user.
.TP
.B non\-incremental\-forward\-search\-history (M\-n)
-Search forward through the history using a non\-incremental search
+Search forward through the history using a non-incremental search
for a string supplied by the user.
.TP
.B history\-search\-forward
Search forward through the history for the string of characters
-between the start of the current line and the current point. This
-is a non-incremental search. By default, this command is unbound.
+between the start of the current line and the current cursor
+position (the \fIpoint\fP).
+This is a non-incremental search.
.TP
.B history\-search\-backward
Search backward through the history for the string of characters
-between the start of the current line and the current point. This
-is a non-incremental search. By default, this command is unbound.
+between the start of the current line and the point.
+This is a non-incremental search.
.TP
.B yank\-nth\-arg (M\-C\-y)
Insert the first argument to the previous command (usually
@@ -737,6 +561,12 @@ cursor position). With an argument
insert the \fIn\fPth word from the previous command (the words
in the previous command begin with word 0). A negative argument
inserts the \fIn\fPth word from the end of the previous command.
+.TP
+.B
+yank\-last\-arg (M\-.\^, M\-_\^)
+Insert the last argument to the previous command (the last word of
+the previous history entry). With an argument,
+behave exactly like \fByank\-nth\-arg\fP.
.PD
.SS Commands for Changing Text
.PP
@@ -753,7 +583,7 @@ then return
.TP
.B backward\-delete\-char (Rubout)
Delete the character behind the cursor. When given a numeric argument,
-save the deleted text on the kill\-ring.
+save the deleted text on the kill ring.
.TP
.B quoted\-insert (C\-q, C\-v)
Add the next character that you type to the line verbatim. This is
@@ -802,7 +632,7 @@ Kill backward from point to the beginning of the line.
.TP
.B kill\-whole\-line
Kill all characters on the current line, no matter where the
-cursor is. By default, this is unbound.
+cursor is.
.TP
.B kill\-word (M\-d)
Kill from the cursor to the end of the current word, or if between
@@ -818,14 +648,27 @@ Kill the word behind the cursor, using white space as a word boundary.
The word boundaries are different from
.BR backward\-kill\-word .
.TP
-.B delete\-horizontal\-space
-Delete all spaces and tabs around point. By default, this is unbound.
+.B delete\-horizontal\-space (M\-\e)
+Delete all spaces and tabs around point.
+.TP
+.B kill\-region
+Kill the text between the point and \fImark\fP (saved cursor position).
+This text is referred to as the \fIregion\fP.
+.TP
+.B copy\-region\-as\-kill
+Copy the text in the region to the kill buffer.
+.TP
+.B copy\-backward\-word
+Copy the word before point to the kill buffer.
+.TP
+.B copy\-forward\-word
+Copy the word following point to the kill buffer.
.TP
.B yank (C\-y)
Yank the top of the kill ring into the buffer at the cursor.
.TP
.B yank\-pop (M\-y)
-Rotate the kill\-ring, and yank the new top. Only works following
+Rotate the kill ring, and yank the new top. Only works following
.B yank
or
.BR yank\-pop .
@@ -839,10 +682,18 @@ Add this digit to the argument already accumulating, or start a new
argument. M\-\- starts a negative argument.
.TP
.B universal\-argument
-Each time this is executed, the argument count is multiplied by four.
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing
+.B universal\-argument
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
The argument count is initially one, so executing this function the
-first time makes the argument count four. By default, this is not
-bound to a key.
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
.PD
.SS Completing
.PP
@@ -862,27 +713,26 @@ on the other hand,
allows completion of program functions and variables, and
only attempts filename completion under certain circumstances.
.TP
-.B possible\-completions (M-?)
+.B possible\-completions (M\-?)
List the possible completions of the text before point.
.TP
-.B insert\-completions
+.B insert\-completions (M\-*)
Insert all completions of the text before point
that would have been generated by
-\fBpossible\-completions\fP. By default, this
-is not bound to a key.
+\fBpossible\-completions\fP.
.PD
.SS Keyboard Macros
.PP
.PD 0
.TP
-.B start\-kbd\-macro (C-x (\^)
+.B start\-kbd\-macro (C\-x (\^)
Begin saving the characters typed into the current keyboard macro.
.TP
-.B end\-kbd\-macro (C-x )\^)
+.B end\-kbd\-macro (C\-x )\^)
Stop saving the characters typed into the current keyboard macro
-and save the definition.
+and store the definition.
.TP
-.B call\-last\-kbd\-macro (C-x e)
+.B call\-last\-kbd\-macro (C\-x e)
Re-execute the last keyboard macro defined, by making the characters
in the macro appear as if typed at the keyboard.
.PD
@@ -890,8 +740,8 @@ in the macro appear as if typed at the keyboard.
.PP
.PD 0
.TP
-.B re-read-init-file (C\-x C\-r)
-Read in the contents of your init file, and incorporate
+.B re\-read\-init\-file (C\-x C\-r)
+Read in the contents of the \fIinputrc\fP file, and incorporate
any bindings or variable assignments found there.
.TP
.B abort (C\-g)
@@ -899,9 +749,9 @@ Abort the current editing command and
ring the terminal's bell (subject to the setting of
.BR bell\-style ).
.TP
-.B do\-uppercase\-version (M\-a, M\-b, ...)
-Run the command that is bound to the corresponding uppercase
-character.
+.B do\-uppercase\-version (M\-a, M\-b, M\-\fIx\fP, ...)
+If the metafied character \fIx\fP is lowercase, run the command
+that is bound to the corresponding uppercase character.
.TP
.B prefix\-meta (ESC)
Metafy the next character typed.
@@ -922,12 +772,56 @@ command enough times to return the line to its initial state.
.B tilde\-expand (M\-~)
Perform tilde expansion on the current word.
.TP
+.B set\-mark (C\-@, M-<space>)
+Set the mark to the current point. If a
+numeric argument is supplied, the mark is set to that position.
+.TP
+.B exchange\-point\-and\-mark (C\-x C\-x)
+Swap the point with the mark. The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+.TP
+.B character\-search (C\-])
+A character is read and point is moved to the next occurrence of that
+character. A negative count searches for previous occurrences.
+.TP
+.B character\-search\-backward (M\-C\-])
+A character is read and point is moved to the previous occurrence of that
+character. A negative count searches for subsequent occurrences.
+.TP
+.B insert\-comment (M\-#)
+The value of the readline
+.B comment\-begin
+variable is inserted at the beginning of the current line, and the line
+is accepted as if a newline had been typed. This makes the current line
+a shell comment.
+.TP
+.B glob\-expand\-word (C\-x *)
+The word before point is treated as a pattern for pathname expansion,
+and the list of matching file names is inserted, replacing the word.
+.TP
+.B glob\-list\-expansions (C\-x g)
+The list of expansions that would have been generated by
+.B glob\-expand\-word
+is inserted into the line, replacing the word before point.
+.TP
.B dump\-functions
Print all of the functions and their key bindings to the
readline output stream. If a numeric argument is supplied,
the output is formatted in such a way that it can be made part
of an \fIinputrc\fP file.
.TP
+.B dump\-variables
+Print all of the settable variables and their values to the
+readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B dump\-macros
+Print all of the readline key sequences bound to macros and the
+strings they ouput. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
.B emacs\-editing\-mode (C\-e)
When in
.B vi
@@ -945,7 +839,7 @@ editing mode.
.SH DEFAULT KEY BINDINGS
.LP
The following is a list of the default emacs and vi bindings.
-Characters with the 8th bit set are written as M-<character>, and
+Characters with the 8th bit set are written as M\-<character>, and
are referred to as
.I metafied
characters.
@@ -975,82 +869,93 @@ variable).
.sp
Emacs Standard bindings
.sp
-"C-A" -> beginning-of-line
-"C-B" -> backward-char
-"C-D" -> delete-char
-"C-E" -> end-of-line
-"C-F" -> forward-char
-"C-G" -> abort
-"C-H" -> backward-delete-char
-"C-I" -> complete
-"C-J" -> accept-line
-"C-K" -> kill-line
-"C-L" -> clear-screen
-"C-M" -> accept-line
-"C-N" -> next-history
-"C-P" -> previous-history
-"C-Q" -> quoted-insert
-"C-R" -> reverse-search-history
-"C-S" -> forward-search-history
-"C-T" -> transpose-chars
-"C-U" -> unix-line-discard
-"C-V" -> quoted-insert
-"C-W" -> unix-word-rubout
-"C-Y" -> yank
-"C-_" -> undo
-"\^ " to "/" -> self-insert
-"0" to "9" -> self-insert
-":" to "~" -> self-insert
-"C-?" -> backward-delete-char
+"C-@" set-mark
+"C-A" beginning-of-line
+"C-B" backward-char
+"C-D" delete-char
+"C-E" end-of-line
+"C-F" forward-char
+"C-G" abort
+"C-H" backward-delete-char
+"C-I" complete
+"C-J" accept-line
+"C-K" kill-line
+"C-L" clear-screen
+"C-M" accept-line
+"C-N" next-history
+"C-P" previous-history
+"C-Q" quoted-insert
+"C-R" reverse-search-history
+"C-S" forward-search-history
+"C-T" transpose-chars
+"C-U" unix-line-discard
+"C-V" quoted-insert
+"C-W" unix-word-rubout
+"C-Y" yank
+"C-]" character-search
+"C-_" undo
+"\^ " to "/" self-insert
+"0" to "9" self-insert
+":" to "~" self-insert
+"C-?" backward-delete-char
.PP
Emacs Meta bindings
.sp
-"M-C-H" -> backward-kill-word
-"M-C-I" -> tab-insert
-"M-C-J" -> vi-editing-mode
-"M-C-M" -> vi-editing-mode
-"M-C-R" -> revert-line
-"M-C-Y" -> yank-nth-arg
-"M-C-[" -> complete
-"M-&" -> tilde-expand
-"M--" -> digit-argument
-"M-0" -> digit-argument
-"M-1" -> digit-argument
-"M-2" -> digit-argument
-"M-3" -> digit-argument
-"M-4" -> digit-argument
-"M-5" -> digit-argument
-"M-6" -> digit-argument
-"M-7" -> digit-argument
-"M-8" -> digit-argument
-"M-9" -> digit-argument
-"M-<" -> beginning-of-history
-"M->" -> end-of-history
-"M-?" -> possible-completions
-"M-B" -> backward-word
-"M-C" -> capitalize-word
-"M-D" -> kill-word
-"M-F" -> forward-word
-"M-L" -> downcase-word
-"M-N" -> non-incremental-forward-search-history
-"M-O" -> arrow-key-prefix
-"M-P" -> non-incremental-reverse-search-history
-"M-R" -> revert-line
-"M-T" -> transpose-words
-"M-U" -> upcase-word
-"M-Y" -> yank-pop
-"M-C-Y" -> yank-nth-arg
-"M-C-?" -> backward-delete-word
+"M-C-G" abort
+"M-C-H" backward-kill-word
+"M-C-I" tab-insert
+"M-C-J" vi-editing-mode
+"M-C-M" vi-editing-mode
+"M-C-R" revert-line
+"M-C-Y" yank-nth-arg
+"M-C-[" complete
+"M-C-]" character-search-backward
+"M-space" set-mark
+"M-#" insert-comment
+"M-&" tilde-expand
+"M-*" insert-completions
+"M--" digit-argument
+"M-." yank-last-arg
+"M-0" digit-argument
+"M-1" digit-argument
+"M-2" digit-argument
+"M-3" digit-argument
+"M-4" digit-argument
+"M-5" digit-argument
+"M-6" digit-argument
+"M-7" digit-argument
+"M-8" digit-argument
+"M-9" digit-argument
+"M-<" beginning-of-history
+"M-=" possible-completions
+"M->" end-of-history
+"M-?" possible-completions
+"M-B" backward-word
+"M-C" capitalize-word
+"M-D" kill-word
+"M-F" forward-word
+"M-L" downcase-word
+"M-N" non-incremental-forward-search-history
+"M-P" non-incremental-reverse-search-history
+"M-R" revert-line
+"M-T" transpose-words
+"M-U" upcase-word
+"M-Y" yank-pop
+"M-\e" delete-horizontal-space
+"M-~" tilde-expand
+"M-C-?" backward-delete-word
+"M-_" yank-last-arg
.PP
Emacs Control-X bindings
.sp
-"C-XC-G" -> abort
-"C-XC-R" -> re-read-init-file
-"C-XC-U" -> undo
-"C-X(" -> start-kbd-macro
-"C-X)" -> end-kbd-macro
-"C-Xe" -> call-last-kbd-macro
-"C-XC-?" -> backward-kill-line
+"C-XC-G" abort
+"C-XC-R" re-read-init-file
+"C-XC-U" undo
+"C-XC-X" exchange-point-and-mark
+"C-X(" start-kbd-macro
+"C-X)" end-kbd-macro
+"C-XE" call-last-kbd-macro
+"C-XC-?" backward-kill-line
.sp
.RE
.SS VI Mode bindings
@@ -1061,112 +966,110 @@ Emacs Control-X bindings
.PP
VI Insert Mode functions
.sp
-"C-D" -> vi-eof-maybe
-"C-H" -> backward-delete-char
-"C-I" -> complete
-"C-J" -> accept-line
-"C-K" -> kill-line
-"C-L" -> clear-screen
-"C-M" -> accept-line
-"C-N" -> next-history
-"C-P" -> previous-history
-"C-Q" -> quoted-insert
-"C-R" -> reverse-search-history
-"C-S" -> forward-search-history
-"C-T" -> transpose-chars
-"C-U" -> unix-line-discard
-"C-V" -> quoted-insert
-"C-W" -> unix-word-rubout
-"C-Y" -> yank
-"C-[" -> vi-movement-mode
-"\^ " to "~" -> self-insert
-"C-?" -> backward-delete-char
+"C-D" vi-eof-maybe
+"C-H" backward-delete-char
+"C-I" complete
+"C-J" accept-line
+"C-M" accept-line
+"C-R" reverse-search-history
+"C-S" forward-search-history
+"C-T" transpose-chars
+"C-U" unix-line-discard
+"C-V" quoted-insert
+"C-W" unix-word-rubout
+"C-Y" yank
+"C-[" vi-movement-mode
+"C-_" undo
+"\^ " to "~" self-insert
+"C-?" backward-delete-char
.PP
VI Command Mode functions
.sp
-"C-D" -> vi-eof-maybe
-"C-E" -> emacs-editing-mode
-"C-G" -> abort
-"C-H" -> backward-char
-"C-J" -> accept-line
-"C-K" -> kill-line
-"C-L" -> clear-screen
-"C-M" -> accept-line
-"C-N" -> next-history
-"C-P" -> previous-history
-"C-Q" -> quoted-insert
-"C-R" -> reverse-search-history
-"C-S" -> forward-search-history
-"C-T" -> transpose-chars
-"C-U" -> unix-line-discard
-"C-V" -> quoted-insert
-"C-W" -> unix-word-rubout
-"C-Y" -> yank
-"C-[" -> abort
-"\^ " -> forward-char
-"#" -> vi-comment
-"$" -> end-of-line
-"%" -> vi-match
-"&" -> vi-tilde-expand
-"*" -> vi-complete
-"+" -> down-history
-"," -> vi-char-search
-"-" -> previous-history
-"." -> vi-redo
-"/" -> vi-search
-"0" -> beginning-of-line
-"1" to "9" -> vi-arg-digit
-";" -> vi-char-search
-"=" -> vi-complete
-"?" -> vi-search
-"@" -> is undefined
-"A" -> vi-append-eol
-"B" -> vi-prev-word
-"C" -> vi-change-to
-"D" -> vi-delete-to
-"E" -> vi-end-word
-"F" -> vi-char-search
-"I" -> vi-insert-beg
-"N" -> vi-search-again
-"P" -> vi-put
-"R" -> vi-replace
-"S" -> vi-subst
-"T" -> vi-char-search
-"U" -> revert-line
-"W" -> vi-next-word
-"X" -> backward-delete-char
-"Y" -> vi-yank-to
-"\e" -> vi-complete
-"^" -> vi-first-print
-"_" -> vi-yank-arg
-"a" -> vi-append-mode
-"b" -> vi-prev-word
-"c" -> vi-change-to
-"d" -> vi-delete-to
-"e" -> vi-end-word
-"f" -> vi-char-search
-"h" -> backward-char
-"i" -> vi-insertion-mode
-"j" -> next-history
-"k" -> prev-history
-"l" -> forward-char
-"n" -> vi-search-again
-"r" -> vi-change-char
-"s" -> vi-subst
-"t" -> vi-char-search
-"u" -> undo
-"w" -> vi-next-word
-"x" -> vi-delete
-"y" -> vi-yank-to
-"|" -> vi-column
-"~" -> vi-change-case
+"C-D" vi-eof-maybe
+"C-E" emacs-editing-mode
+"C-G" abort
+"C-H" backward-char
+"C-J" accept-line
+"C-K" kill-line
+"C-L" clear-screen
+"C-M" accept-line
+"C-N" next-history
+"C-P" previous-history
+"C-Q" quoted-insert
+"C-R" reverse-search-history
+"C-S" forward-search-history
+"C-T" transpose-chars
+"C-U" unix-line-discard
+"C-V" quoted-insert
+"C-W" unix-word-rubout
+"C-Y" yank
+"\^ " forward-char
+"#" insert-comment
+"$" end-of-line
+"%" vi-match
+"&" vi-tilde-expand
+"*" vi-complete
+"+" next-history
+"," vi-char-search
+"-" previous-history
+"." vi-redo
+"/" vi-search
+"0" beginning-of-line
+"1" to "9" vi-arg-digit
+";" vi-char-search
+"=" vi-complete
+"?" vi-search
+"A" vi-append-eol
+"B" vi-prev-word
+"C" vi-change-to
+"D" vi-delete-to
+"E" vi-end-word
+"F" vi-char-search
+"G" vi-fetch-history
+"I" vi-insert-beg
+"N" vi-search-again
+"P" vi-put
+"R" vi-replace
+"S" vi-subst
+"T" vi-char-search
+"U" revert-line
+"W" vi-next-word
+"X" backward-delete-char
+"Y" vi-yank-to
+"\e" vi-complete
+"^" vi-first-print
+"_" vi-yank-arg
+"`" vi-goto-mark
+"a" vi-append-mode
+"b" vi-prev-word
+"c" vi-change-to
+"d" vi-delete-to
+"e" vi-end-word
+"f" vi-char-search
+"h" backward-char
+"i" vi-insertion-mode
+"j" next-history
+"k" prev-history
+"l" forward-char
+"m" vi-set-mark
+"n" vi-search-again
+"p" vi-put
+"r" vi-change-char
+"s" vi-subst
+"t" vi-char-search
+"u" undo
+"w" vi-next-word
+"x" vi-delete
+"y" vi-yank-to
+"|" vi-column
+"~" vi-change-case
.RE
.SH "SEE ALSO"
.PD 0
.TP
-\fIThe Gnu Readline Library\fP, Brian Fox
+\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey
.TP
-\fIThe Gnu History Library\fP, Brian Fox
+\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey
.TP
\fIbash\fP(1)
.PD
@@ -1177,7 +1080,6 @@ VI Command Mode functions
Individual \fBreadline\fP initialization file
.PD
.SH AUTHORS
-.RS
Brian Fox, Free Software Foundation (primary author)
.br
bfox@ai.MIT.Edu
@@ -1195,10 +1097,10 @@ version of the
library that you have.
.PP
Once you have determined that a bug actually exists, mail a
-bug report to \fIbash\-maintainers\fP@\fIprep.ai.MIT.Edu\fP.
+bug report to \fIbug\-readline\fP@\fIprep.ai.MIT.Edu\fP.
If you have a fix, you are welcome to mail that
as well! Suggestions and `philosophical' bug reports may be mailed
-to \fPbug-bash\fP@\fIprep.ai.MIT.Edu\fP or posted to the Usenet
+to \fPbug-readline\fP@\fIprep.ai.MIT.Edu\fP or posted to the Usenet
newsgroup
.BR gnu.bash.bug .
.PP
diff --git a/doc/readline.dvi b/doc/readline.dvi
index a967128..b09a22b 100644
--- a/doc/readline.dvi
+++ b/doc/readline.dvi
Binary files differ
diff --git a/doc/readline.html b/doc/readline.html
new file mode 100644
index 0000000..2a665f8
--- /dev/null
+++ b/doc/readline.html
@@ -0,0 +1,3363 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from /usr/homes/chet/src/bash/readline-2.1/doc/rlman.texinfo on 3 June 1997 -->
+
+<TITLE>GNU Readline Library</TITLE>
+</HEAD>
+<BODY>
+<H1>GNU Readline Library</H1>
+<H2>Edition 2.1, for <CODE>Readline Library</CODE> Version 2.1.</H2>
+<H2>March 1996</H2>
+<ADDRESS>Brian Fox, Free Software Foundation</ADDRESS>
+<ADDRESS>Chet Ramey, Case Western Reserve University</ADDRESS>
+<P>
+<P><HR><P>
+
+<P>
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs that need
+to provide a command line interface.
+
+</P>
+<P>
+Published by the Free Software Foundation <BR>
+675 Massachusetts Avenue, <BR>
+Cambridge, MA 02139 USA
+
+</P>
+<P>
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+</P>
+<P>
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+</P>
+<P>
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+
+</P>
+<P>
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+
+</P>
+
+
+
+<H1><A NAME="SEC1" HREF="readline_toc.html#TOC1">Command Line Editing</A></H1>
+
+<P>
+This chapter describes the basic features of the GNU
+command line editing interface.
+
+</P>
+
+
+
+<H2><A NAME="SEC2" HREF="readline_toc.html#TOC2">Introduction to Line Editing</A></H2>
+
+<P>
+The following paragraphs describe the notation used to represent
+keystrokes.
+
+</P>
+<P>
+The text <KBD>C-k</KBD> is read as `Control-K' and describes the character
+produced when the <KBD>k</KBD> key is pressed while the Control key
+is depressed.
+
+</P>
+<P>
+The text <KBD>M-k</KBD> is read as `Meta-K' and describes the character
+produced when the meta key (if you have one) is depressed, and the <KBD>k</KBD>
+key is pressed. If you do not have a meta key, the identical keystroke
+can be generated by typing <KBD>ESC</KBD> <I>first</I>, and then typing <KBD>k</KBD>.
+Either process is known as <STRONG>metafying</STRONG> the <KBD>k</KBD> key.
+
+</P>
+<P>
+The text <KBD>M-C-k</KBD> is read as `Meta-Control-k' and describes the
+character produced by <STRONG>metafying</STRONG> <KBD>C-k</KBD>.
+
+</P>
+<P>
+In addition, several keys have their own names. Specifically,
+<KBD>DEL</KBD>, <KBD>ESC</KBD>, <KBD>LFD</KBD>, <KBD>SPC</KBD>, <KBD>RET</KBD>, and <KBD>TAB</KBD> all
+stand for themselves when seen in this text, or in an init file
+(@xref{Readline Init File}).
+
+</P>
+
+
+<H2><A NAME="SEC3" HREF="readline_toc.html#TOC3">Readline Interaction</A></H2>
+<P>
+<A NAME="IDX1"></A>
+
+</P>
+<P>
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled. The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line. Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections. Then, when you are satisfied with
+the line, you simply press <KBD>RETURN</KBD>. You do not have to be at the
+end of the line to press <KBD>RETURN</KBD>; the entire line is accepted
+regardless of the location of the cursor within the line.
+
+</P>
+
+
+
+<H3><A NAME="SEC4" HREF="readline_toc.html#TOC4">Readline Init File Syntax</A></H3>
+
+<P>
+There are only a few basic constructs allowed in the
+Readline init file. Blank lines are ignored.
+Lines beginning with a <SAMP>`#'</SAMP> are comments.
+Lines beginning with a <SAMP>`$'</SAMP> indicate conditional
+constructs (see section <A HREF="readline.html#SEC5">Conditional Init Constructs</A>). Other lines
+denote variable settings and key bindings.
+
+</P>
+<DL COMPACT>
+
+<DT>Variable Settings
+<DD>
+You can change the state of a few variables in Readline by
+using the <CODE>set</CODE> command within the init file. Here is how you
+would specify that you wish to use <CODE>vi</CODE> line editing commands:
+
+
+<PRE>
+set editing-mode vi
+</PRE>
+
+Right now, there are only a few variables which can be set;
+so few, in fact, that we just list them here:
+
+<DL COMPACT>
+
+<DT><CODE>bell-style</CODE>
+<DD>
+<A NAME="IDX2"></A>
+Controls what happens when Readline wants to ring the terminal bell.
+If set to <SAMP>`none'</SAMP>, Readline never rings the bell. If set to
+<SAMP>`visible'</SAMP>, Readline uses a visible bell if one is available.
+If set to <SAMP>`audible'</SAMP> (the default), Readline attempts to ring
+the terminal's bell.
+
+<DT><CODE>comment-begin</CODE>
+<DD>
+<A NAME="IDX3"></A>
+The string to insert at the beginning of the line when the
+<CODE>insert-comment</CODE> command is executed. The default value
+is <CODE>"#"</CODE>.
+
+<DT><CODE>completion-query-items</CODE>
+<DD>
+<A NAME="IDX4"></A>
+The number of possible completions that determines when the user is
+asked whether he wants to see the list of possibilities. If the
+number of possible completions is greater than this value,
+Readline will ask the user whether or not he wishes to view
+them; otherwise, they are simply listed. The default limit is
+<CODE>100</CODE>.
+
+<DT><CODE>convert-meta</CODE>
+<DD>
+<A NAME="IDX5"></A>
+If set to <SAMP>`on'</SAMP>, Readline will convert characters with the
+eigth bit set to an ASCII key sequence by stripping the eigth
+bit and prepending an <KBD>ESC</KBD> character, converting them to a
+meta-prefixed key sequence. The default value is <SAMP>`on'</SAMP>.
+
+<DT><CODE>disable-completion</CODE>
+<DD>
+<A NAME="IDX6"></A>
+If set to <SAMP>`On'</SAMP>, readline will inhibit word completion.
+Completion characters will be inserted into the line as if they had
+been mapped to <CODE>self-insert</CODE>. The default is <SAMP>`off'</SAMP>.
+
+<DT><CODE>editing-mode</CODE>
+<DD>
+<A NAME="IDX7"></A>
+The <CODE>editing-mode</CODE> variable controls which editing mode you are
+using. By default, Readline starts up in Emacs editing mode, where
+the keystrokes are most similar to Emacs. This variable can be
+set to either <SAMP>`emacs'</SAMP> or <SAMP>`vi'</SAMP>.
+
+<DT><CODE>enable-keypad</CODE>
+<DD>
+<A NAME="IDX8"></A>
+When set to <SAMP>`on'</SAMP>, readline will try to enable the application
+keypad when it is called. Some systems need this to enable the
+arrow keys. The default is <SAMP>`off'</SAMP>.
+
+<DT><CODE>expand-tilde</CODE>
+<DD>
+<A NAME="IDX9"></A>
+If set to <SAMP>`on'</SAMP>, tilde expansion is performed when Readline
+attempts word completion. The default is <SAMP>`off'</SAMP>.
+
+<DT><CODE>horizontal-scroll-mode</CODE>
+<DD>
+<A NAME="IDX10"></A>
+This variable can be set to either <SAMP>`on'</SAMP> or <SAMP>`off'</SAMP>. Setting it
+to <SAMP>`on'</SAMP> means that the text of the lines that you edit will scroll
+horizontally on a single screen line when they are longer than the width
+of the screen, instead of wrapping onto a new screen line. By default,
+this variable is set to <SAMP>`off'</SAMP>.
+
+<DT><CODE>keymap</CODE>
+<DD>
+<A NAME="IDX11"></A>
+Sets Readline's idea of the current keymap for key binding commands.
+Acceptable <CODE>keymap</CODE> names are
+<CODE>emacs</CODE>,
+<CODE>emacs-standard</CODE>,
+<CODE>emacs-meta</CODE>,
+<CODE>emacs-ctlx</CODE>,
+<CODE>vi</CODE>,
+<CODE>vi-command</CODE>, and
+<CODE>vi-insert</CODE>.
+<CODE>vi</CODE> is equivalent to <CODE>vi-command</CODE>; <CODE>emacs</CODE> is
+equivalent to <CODE>emacs-standard</CODE>. The default value is <CODE>emacs</CODE>.
+The value of the <CODE>editing-mode</CODE> variable also affects the
+default keymap.
+
+<DT><CODE>mark-directories</CODE>
+<DD>
+If set to <SAMP>`on'</SAMP>, completed directory names have a slash
+appended. The default is <SAMP>`on'</SAMP>.
+
+<DT><CODE>mark-modified-lines</CODE>
+<DD>
+<A NAME="IDX12"></A>
+This variable, when set to <SAMP>`on'</SAMP>, says to display an asterisk
+(<SAMP>`*'</SAMP>) at the start of history lines which have been modified.
+This variable is <SAMP>`off'</SAMP> by default.
+
+<DT><CODE>input-meta</CODE>
+<DD>
+<A NAME="IDX13"></A>
+<A NAME="IDX14"></A>
+If set to <SAMP>`on'</SAMP>, Readline will enable eight-bit input (it
+will not strip the eighth bit from the characters it reads),
+regardless of what the terminal claims it can support. The
+default value is <SAMP>`off'</SAMP>. The name <CODE>meta-flag</CODE> is a
+synonym for this variable.
+
+<DT><CODE>output-meta</CODE>
+<DD>
+<A NAME="IDX15"></A>
+If set to <SAMP>`on'</SAMP>, Readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence. The default is <SAMP>`off'</SAMP>.
+
+<DT><CODE>show-all-if-ambiguous</CODE>
+<DD>
+<A NAME="IDX16"></A>
+This alters the default behavior of the completion functions. If
+set to <SAMP>`on'</SAMP>,
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+The default value is <SAMP>`off'</SAMP>.
+
+<DT><CODE>visible-stats</CODE>
+<DD>
+<A NAME="IDX17"></A>
+If set to <SAMP>`on'</SAMP>, a character denoting a file's type
+is appended to the filename when listing possible
+completions. The default is <SAMP>`off'</SAMP>.
+
+</DL>
+
+<DT>Key Bindings
+<DD>
+The syntax for controlling key bindings in the init file is
+simple. First you have to know the name of the command that you
+want to change. The following pages contain tables of the command name,
+the default keybinding, and a short description of what the command
+does.
+
+Once you know the name of the command, simply place the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command on a line in the init file. The name of the key
+can be expressed in different ways, depending on which is most
+comfortable for you.
+
+<DL COMPACT>
+
+<DT><VAR>keyname</VAR>: <VAR>function-name</VAR> or <VAR>macro</VAR>
+<DD>
+<VAR>keyname</VAR> is the name of a key spelled out in English. For example:
+
+<PRE>
+Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: "&#62; output"
+</PRE>
+
+In the above example, <SAMP>`C-u'</SAMP> is bound to the function
+<CODE>universal-argument</CODE>, and <SAMP>`C-o'</SAMP> is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+<SAMP>`&#62; output'</SAMP> into the line).
+
+<DT>"<VAR>keyseq</VAR>": <VAR>function-name</VAR> or <VAR>macro</VAR>
+<DD>
+<VAR>keyseq</VAR> differs from <VAR>keyname</VAR> above in that strings
+denoting an entire key sequence can be specified, by placing
+the key sequence in double quotes. Some GNU Emacs style key
+escapes can be used, as in the following example, but the
+special character names are not recognized.
+
+
+<PRE>
+"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+</PRE>
+
+In the above example, <SAMP>`C-u'</SAMP> is bound to the function
+<CODE>universal-argument</CODE> (just as it was in the first example),
+<SAMP>`C-x C-r'</SAMP> is bound to the function <CODE>re-read-init-file</CODE>, and
+<SAMP>`ESC [ 1 1 ~'</SAMP> is bound to insert the text <SAMP>`Function Key 1'</SAMP>.
+The following escape sequences are available when specifying key
+sequences:
+
+<DL COMPACT>
+
+<DT><CODE><KBD>\C-</KBD></CODE>
+<DD>
+control prefix
+<DT><CODE><KBD>\M-</KBD></CODE>
+<DD>
+meta prefix
+<DT><CODE><KBD>\e</KBD></CODE>
+<DD>
+an escape character
+<DT><CODE><KBD>\\</KBD></CODE>
+<DD>
+backslash
+<DT><CODE><KBD>\"</KBD></CODE>
+<DD>
+<KBD>"</KBD>
+<DT><CODE><KBD>\'</KBD></CODE>
+<DD>
+<KBD>'</KBD>
+</DL>
+
+When entering the text of a macro, single or double quotes should
+be used to indicate a macro definition. Unquoted text
+is assumed to be a function name. Backslash
+will quote any character in the macro text, including <SAMP>`"'</SAMP>
+and <SAMP>`''</SAMP>.
+For example, the following binding will make <SAMP>`C-x \'</SAMP>
+insert a single <SAMP>`\'</SAMP> into the line:
+
+<PRE>
+"\C-x\\": "\\"
+</PRE>
+
+</DL>
+</DL>
+
+
+
+<H3><A NAME="SEC5" HREF="readline_toc.html#TOC5">Conditional Init Constructs</A></H3>
+
+<P>
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests. There are three parser directives used.
+
+</P>
+<DL COMPACT>
+
+<DT><CODE>$if</CODE>
+<DD>
+The <CODE>$if</CODE> construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+Readline. The text of the test extends to the end of the line;
+no characters are required to isolate it.
+
+<DL COMPACT>
+
+<DT><CODE>mode</CODE>
+<DD>
+The <CODE>mode=</CODE> form of the <CODE>$if</CODE> directive is used to test
+whether Readline is in <CODE>emacs</CODE> or <CODE>vi</CODE> mode.
+This may be used in conjunction
+with the <SAMP>`set keymap'</SAMP> command, for instance, to set bindings in
+the <CODE>emacs-standard</CODE> and <CODE>emacs-ctlx</CODE> keymaps only if
+Readline is starting out in <CODE>emacs</CODE> mode.
+
+<DT><CODE>term</CODE>
+<DD>
+The <CODE>term=</CODE> form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys. The word on the right side of the
+<SAMP>`='</SAMP> is tested against the full name of the terminal and the
+portion of the terminal name before the first <SAMP>`-'</SAMP>. This
+allows <CODE>sun</CODE> to match both <CODE>sun</CODE> and <CODE>sun-cmd</CODE>,
+for instance.
+
+<DT><CODE>application</CODE>
+<DD>
+The <VAR>application</VAR> construct is used to include
+application-specific settings. Each program using the Readline
+library sets the <VAR>application name</VAR>, and you can test for it.
+This could be used to bind key sequences to functions useful for
+a specific program. For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+
+<PRE>
+$if Bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+</PRE>
+
+</DL>
+
+<DT><CODE>$endif</CODE>
+<DD>
+This command, as you saw in the previous example, terminates an
+<CODE>$if</CODE> command.
+
+<DT><CODE>$else</CODE>
+<DD>
+Commands in this branch of the <CODE>$if</CODE> directive are executed if
+the test fails.
+</DL>
+
+
+
+<H3><A NAME="SEC6" HREF="readline_toc.html#TOC6">Sample Init File</A></H3>
+
+<P>
+Here is an example of an inputrc file. This illustrates key
+binding, variable assignment, and conditional syntax.
+
+</P>
+
+<PRE>
+# This file controls the behaviour of line input editing for
+# programs that use the Gnu Readline library. Existing programs
+# include FTP, Bash, and Gdb.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# Set various bindings for emacs mode.
+
+set editing-mode emacs
+
+$if mode=emacs
+
+Meta-Control-h: backward-kill-word Text after the function name is ignored
+
+#
+# Arrow keys in keypad mode
+#
+#"\M-OD": backward-char
+#"\M-OC": forward-char
+#"\M-OA": previous-history
+#"\M-OB": next-history
+#
+# Arrow keys in ANSI mode
+#
+"\M-[D": backward-char
+"\M-[C": forward-char
+"\M-[A": previous-history
+"\M-[B": next-history
+#
+# Arrow keys in 8 bit keypad mode
+#
+#"\M-\C-OD": backward-char
+#"\M-\C-OC": forward-char
+#"\M-\C-OA": previous-history
+#"\M-\C-OB": next-history
+#
+# Arrow keys in 8 bit ANSI mode
+#
+#"\M-\C-[D": backward-char
+#"\M-\C-[C": forward-char
+#"\M-\C-[A": previous-history
+#"\M-\C-[B": next-history
+
+C-q: quoted-insert
+
+$endif
+
+# An old-style binding. This happens to be the default.
+TAB: complete
+
+# Macros that are convenient for shell interaction
+$if Bash
+# edit the path
+"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+# prepare to type a quoted word -- insert open and close double quotes
+# and move to just after the open quote
+"\C-x\"": "\"\"\C-b"
+# insert a backslash (testing backslash escapes in sequences and macros)
+"\C-x\\": "\\"
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+# Add a binding to refresh the line, which is unbound
+"\C-xr": redraw-current-line
+# Edit variable on current line.
+"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+$endif
+
+# use a visible bell if one is available
+set bell-style visible
+
+# don't strip characters to 7 bits when reading
+set input-meta on
+
+# allow iso-latin1 characters to be inserted rather than converted to
+# prefix-meta sequences
+set convert-meta off
+
+# display characters with the eighth bit set directly rather than
+# as meta-prefixed characters
+set output-meta on
+
+# if there are more than 150 possible completions for a word, ask the
+# user if he wants to see all of them
+set completion-query-items 150
+
+# For FTP
+$if Ftp
+"\C-xg": "get \M-?"
+"\C-xt": "put \M-?"
+"\M-.": yank-last-arg
+$endif
+</PRE>
+
+
+
+<H2><A NAME="SEC7" HREF="readline_toc.html#TOC7">Bindable Readline Commands</A></H2>
+
+<P>
+This section describes Readline commands that may be bound to key
+sequences.
+
+</P>
+
+
+<H3><A NAME="SEC8" HREF="readline_toc.html#TOC8">Commands For Moving</A></H3>
+<DL COMPACT>
+
+<DT><CODE>beginning-of-line (C-a)</CODE>
+<DD>
+<A NAME="IDX18"></A>
+Move to the start of the current line.
+
+<DT><CODE>end-of-line (C-e)</CODE>
+<DD>
+<A NAME="IDX19"></A>
+Move to the end of the line.
+
+<DT><CODE>forward-char (C-f)</CODE>
+<DD>
+<A NAME="IDX20"></A>
+Move forward a character.
+
+<DT><CODE>backward-char (C-b)</CODE>
+<DD>
+<A NAME="IDX21"></A>
+Move back a character.
+
+<DT><CODE>forward-word (M-f)</CODE>
+<DD>
+<A NAME="IDX22"></A>
+Move forward to the end of the next word. Words are composed of
+letters and digits.
+
+<DT><CODE>backward-word (M-b)</CODE>
+<DD>
+<A NAME="IDX23"></A>
+Move back to the start of this, or the previous, word. Words are
+composed of letters and digits.
+
+<DT><CODE>clear-screen (C-l)</CODE>
+<DD>
+<A NAME="IDX24"></A>
+Clear the screen and redraw the current line,
+leaving the current line at the top of the screen.
+
+<DT><CODE>redraw-current-line ()</CODE>
+<DD>
+<A NAME="IDX25"></A>
+Refresh the current line. By default, this is unbound.
+
+</DL>
+
+
+
+<H3><A NAME="SEC9" HREF="readline_toc.html#TOC9">Commands For Manipulating The History</A></H3>
+
+<DL COMPACT>
+
+<DT><CODE>accept-line (Newline, Return)</CODE>
+<DD>
+<A NAME="IDX26"></A>
+Accept the line regardless of where the cursor is. If this line is
+non-empty, add it to the history list. If this line was a history
+line, then restore the history line to its original state.
+
+<DT><CODE>previous-history (C-p)</CODE>
+<DD>
+<A NAME="IDX27"></A>
+Move `up' through the history list.
+
+<DT><CODE>next-history (C-n)</CODE>
+<DD>
+<A NAME="IDX28"></A>
+Move `down' through the history list.
+
+<DT><CODE>beginning-of-history (M-&#60;)</CODE>
+<DD>
+<A NAME="IDX29"></A>
+Move to the first line in the history.
+
+<DT><CODE>end-of-history (M-&#62;)</CODE>
+<DD>
+<A NAME="IDX30"></A>
+Move to the end of the input history, i.e., the line you are entering.
+
+<DT><CODE>reverse-search-history (C-r)</CODE>
+<DD>
+<A NAME="IDX31"></A>
+Search backward starting at the current line and moving `up' through
+the history as necessary. This is an incremental search.
+
+<DT><CODE>forward-search-history (C-s)</CODE>
+<DD>
+<A NAME="IDX32"></A>
+Search forward starting at the current line and moving `down' through
+the the history as necessary. This is an incremental search.
+
+<DT><CODE>non-incremental-reverse-search-history (M-p)</CODE>
+<DD>
+<A NAME="IDX33"></A>
+Search backward starting at the current line and moving `up'
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+
+<DT><CODE>non-incremental-forward-search-history (M-n)</CODE>
+<DD>
+<A NAME="IDX34"></A>
+Search forward starting at the current line and moving `down'
+through the the history as necessary using a non-incremental search
+for a string supplied by the user.
+
+<DT><CODE>history-search-forward ()</CODE>
+<DD>
+<A NAME="IDX35"></A>
+Search forward through the history for the string of characters
+between the start of the current line and the current cursor
+position (the `point'). This is a non-incremental search. By
+default, this command is unbound.
+
+<DT><CODE>history-search-backward ()</CODE>
+<DD>
+<A NAME="IDX36"></A>
+Search backward through the history for the string of characters
+between the start of the current line and the point. This
+is a non-incremental search. By default, this command is unbound.
+
+<DT><CODE>yank-nth-arg (M-C-y)</CODE>
+<DD>
+<A NAME="IDX37"></A>
+Insert the first argument to the previous command (usually
+the second word on the previous line). With an argument <VAR>n</VAR>,
+insert the <VAR>n</VAR>th word from the previous command (the words
+in the previous command begin with word 0). A negative argument
+inserts the <VAR>n</VAR>th word from the end of the previous command.
+
+<DT><CODE>yank-last-arg (M-., M-_)</CODE>
+<DD>
+<A NAME="IDX38"></A>
+Insert last argument to the previous command (the last word of the
+previous history entry). With an
+argument, behave exactly like <CODE>yank-nth-arg</CODE>.
+
+</DL>
+
+
+
+<H3><A NAME="SEC10" HREF="readline_toc.html#TOC10">Commands For Changing Text</A></H3>
+
+<DL COMPACT>
+
+<DT><CODE>delete-char (C-d)</CODE>
+<DD>
+<A NAME="IDX39"></A>
+Delete the character under the cursor. If the cursor is at the
+beginning of the line, there are no characters in the line, and
+the last character typed was not <KBD>C-d</KBD>, then return <CODE>EOF</CODE>.
+
+<DT><CODE>backward-delete-char (Rubout)</CODE>
+<DD>
+<A NAME="IDX40"></A>
+Delete the character behind the cursor. A numeric arg says to kill
+the characters instead of deleting them.
+
+<DT><CODE>quoted-insert (C-q, C-v)</CODE>
+<DD>
+<A NAME="IDX41"></A>
+Add the next character that you type to the line verbatim. This is
+how to insert key sequences like <KBD>C-q</KBD>, for example.
+
+<DT><CODE>tab-insert (M-TAB)</CODE>
+<DD>
+<A NAME="IDX42"></A>
+Insert a tab character.
+
+<DT><CODE>self-insert (a, b, A, 1, !, ...)</CODE>
+<DD>
+<A NAME="IDX43"></A>
+Insert yourself.
+
+<DT><CODE>transpose-chars (C-t)</CODE>
+<DD>
+<A NAME="IDX44"></A>
+Drag the character before the cursor forward over
+the character at the cursor, moving the
+cursor forward as well. If the insertion point
+is at the end of the line, then this
+transposes the last two characters of the line.
+Negative argumentss don't work.
+
+<DT><CODE>transpose-words (M-t)</CODE>
+<DD>
+<A NAME="IDX45"></A>
+Drag the word behind the cursor past the word in front of the cursor
+moving the cursor over that word as well.
+
+<DT><CODE>upcase-word (M-u)</CODE>
+<DD>
+<A NAME="IDX46"></A>
+Uppercase the current (or following) word. With a negative argument,
+do the previous word, but do not move the cursor.
+
+<DT><CODE>downcase-word (M-l)</CODE>
+<DD>
+<A NAME="IDX47"></A>
+Lowercase the current (or following) word. With a negative argument,
+do the previous word, but do not move the cursor.
+
+<DT><CODE>capitalize-word (M-c)</CODE>
+<DD>
+<A NAME="IDX48"></A>
+Capitalize the current (or following) word. With a negative argument,
+do the previous word, but do not move the cursor.
+
+</DL>
+
+
+
+<H3><A NAME="SEC11" HREF="readline_toc.html#TOC11">Killing And Yanking</A></H3>
+
+<DL COMPACT>
+
+<DT><CODE>kill-line (C-k)</CODE>
+<DD>
+<A NAME="IDX49"></A>
+Kill the text from the current cursor position to the end of the line.
+
+<DT><CODE>backward-kill-line (C-x Rubout)</CODE>
+<DD>
+<A NAME="IDX50"></A>
+Kill backward to the beginning of the line.
+
+<DT><CODE>unix-line-discard (C-u)</CODE>
+<DD>
+<A NAME="IDX51"></A>
+Kill backward from the cursor to the beginning of the current line.
+Save the killed text on the kill-ring.
+
+<DT><CODE>kill-whole-line ()</CODE>
+<DD>
+<A NAME="IDX52"></A>
+Kill all characters on the current line, no matter where the
+cursor is. By default, this is unbound.
+
+<DT><CODE>kill-word (M-d)</CODE>
+<DD>
+<A NAME="IDX53"></A>
+Kill from the cursor to the end of the current word, or if between
+words, to the end of the next word. Word boundaries are the same
+as <CODE>forward-word</CODE>.
+
+<DT><CODE>backward-kill-word (M-DEL)</CODE>
+<DD>
+<A NAME="IDX54"></A>
+Kill the word behind the cursor. Word boundaries are the same
+as <CODE>backward-word</CODE>.
+
+<DT><CODE>unix-word-rubout (C-w)</CODE>
+<DD>
+<A NAME="IDX55"></A>
+Kill the word behind the cursor, using white space as a word
+boundary. The killed text is saved on the kill-ring.
+
+<DT><CODE>delete-horizontal-space ()</CODE>
+<DD>
+<A NAME="IDX56"></A>
+Delete all spaces and tabs around point. By default, this is unbound.
+
+<DT><CODE>kill-region ()</CODE>
+<DD>
+<A NAME="IDX57"></A>
+Kill the text between the point and the <EM>mark</EM> (saved
+cursor position. This text is referred to as the <VAR>region</VAR>.
+By default, this command is unbound.
+
+<DT><CODE>copy-region-as-kill ()</CODE>
+<DD>
+<A NAME="IDX58"></A>
+Copy the text in the region to the kill buffer, so you can yank it
+right away. By default, this command is unbound.
+
+<DT><CODE>copy-backward-word ()</CODE>
+<DD>
+<A NAME="IDX59"></A>
+Copy the word before point to the kill buffer.
+By default, this command is unbound.
+
+<DT><CODE>copy-forward-word ()</CODE>
+<DD>
+<A NAME="IDX60"></A>
+Copy the word following point to the kill buffer.
+By default, this command is unbound.
+
+<DT><CODE>yank (C-y)</CODE>
+<DD>
+<A NAME="IDX61"></A>
+Yank the top of the kill ring into the buffer at the current
+cursor position.
+
+<DT><CODE>yank-pop (M-y)</CODE>
+<DD>
+<A NAME="IDX62"></A>
+Rotate the kill-ring, and yank the new top. You can only do this if
+the prior command is yank or yank-pop.
+</DL>
+
+
+
+<H3><A NAME="SEC12" HREF="readline_toc.html#TOC12">Specifying Numeric Arguments</A></H3>
+<DL COMPACT>
+
+<DT><CODE>digit-argument (M-0, M-1, ... M--)</CODE>
+<DD>
+<A NAME="IDX63"></A>
+Add this digit to the argument already accumulating, or start a new
+argument. <KBD>M--</KBD> starts a negative argument.
+
+<DT><CODE>universal-argument ()</CODE>
+<DD>
+<A NAME="IDX64"></A>
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing <CODE>universal-argument</CODE>
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+By default, this is not bound to a key.
+</DL>
+
+
+
+<H3><A NAME="SEC13" HREF="readline_toc.html#TOC13">Letting Readline Type For You</A></H3>
+
+<DL COMPACT>
+
+<DT><CODE>complete (TAB)</CODE>
+<DD>
+<A NAME="IDX65"></A>
+Attempt to do completion on the text before the cursor. This is
+application-specific. Generally, if you are typing a filename
+argument, you can do filename completion; if you are typing a command,
+you can do command completion, if you are typing in a symbol to GDB, you
+can do symbol name completion, if you are typing in a variable to Bash,
+you can do variable name completion, and so on.
+
+<DT><CODE>possible-completions (M-?)</CODE>
+<DD>
+<A NAME="IDX66"></A>
+List the possible completions of the text before the cursor.
+
+<DT><CODE>insert-completions (M-*)</CODE>
+<DD>
+<A NAME="IDX67"></A>
+Insert all completions of the text before point that would have
+been generated by <CODE>possible-completions</CODE>.
+
+</DL>
+
+
+
+<H3><A NAME="SEC14" HREF="readline_toc.html#TOC14">Keyboard Macros</A></H3>
+<DL COMPACT>
+
+<DT><CODE>start-kbd-macro (C-x ()</CODE>
+<DD>
+<A NAME="IDX68"></A>
+Begin saving the characters typed into the current keyboard macro.
+
+<DT><CODE>end-kbd-macro (C-x ))</CODE>
+<DD>
+<A NAME="IDX69"></A>
+Stop saving the characters typed into the current keyboard macro
+and save the definition.
+
+<DT><CODE>call-last-kbd-macro (C-x e)</CODE>
+<DD>
+<A NAME="IDX70"></A>
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+
+</DL>
+
+
+
+<H3><A NAME="SEC15" HREF="readline_toc.html#TOC15">Some Miscellaneous Commands</A></H3>
+<DL COMPACT>
+
+<DT><CODE>re-read-init-file (C-x C-r)</CODE>
+<DD>
+<A NAME="IDX71"></A>
+Read in the contents of the inputrc file, and incorporate
+any bindings or variable assignments found there.
+
+<DT><CODE>abort (C-g)</CODE>
+<DD>
+<A NAME="IDX72"></A>
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+<CODE>bell-style</CODE>).
+
+<DT><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, ...)</CODE>
+<DD>
+<A NAME="IDX73"></A>
+If the metafied character <VAR>x</VAR> is lowercase, run the command
+that is bound to the corresponding uppercase character.
+
+<DT><CODE>prefix-meta (ESC)</CODE>
+<DD>
+<A NAME="IDX74"></A>
+Make the next character that you type be metafied. This is for people
+without a meta key. Typing <SAMP>`ESC f'</SAMP> is equivalent to typing
+<SAMP>`M-f'</SAMP>.
+
+<DT><CODE>undo (C-_, C-x C-u)</CODE>
+<DD>
+<A NAME="IDX75"></A>
+Incremental undo, separately remembered for each line.
+
+<DT><CODE>revert-line (M-r)</CODE>
+<DD>
+<A NAME="IDX76"></A>
+Undo all changes made to this line. This is like typing the <CODE>undo</CODE>
+command enough times to get back to the beginning.
+
+<DT><CODE>tilde-expand (M-~)</CODE>
+<DD>
+<A NAME="IDX77"></A>
+Perform tilde expansion on the current word.
+
+<DT><CODE>set-mark (C-@)</CODE>
+<DD>
+<A NAME="IDX78"></A>
+Set the mark to the current point. If a
+numeric argument is supplied, the mark is set to that position.
+
+<DT><CODE>exchange-point-and-mark (C-x C-x)</CODE>
+<DD>
+<A NAME="IDX79"></A>
+Swap the point with the mark. The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+
+<DT><CODE>character-search (C-])</CODE>
+<DD>
+<A NAME="IDX80"></A>
+A character is read and point is moved to the next occurrence of that
+character. A negative count searches for previous occurrences.
+
+<DT><CODE>character-search-backward (M-C-])</CODE>
+<DD>
+<A NAME="IDX81"></A>
+A character is read and point is moved to the previous occurrence
+of that character. A negative count searches for subsequent
+occurrences.
+
+<DT><CODE>insert-comment (M-#)</CODE>
+<DD>
+<A NAME="IDX82"></A>
+The value of the <CODE>comment-begin</CODE>
+variable is inserted at the beginning of the current line,
+and the line is accepted as if a newline had been typed.
+
+<DT><CODE>dump-functions ()</CODE>
+<DD>
+<A NAME="IDX83"></A>
+Print all of the functions and their key bindings to the
+readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file. This command is unbound by default.
+
+<DT><CODE>dump-variables ()</CODE>
+<DD>
+<A NAME="IDX84"></A>
+Print all of the settable variables and their values to the
+readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file. This command is unbound by default.
+
+<DT><CODE>dump-macros ()</CODE>
+<DD>
+<A NAME="IDX85"></A>
+Print all of the readline key sequences bound to macros and the
+strings they ouput. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file. This command is unbound by default.
+
+</DL>
+
+
+
+<H2><A NAME="SEC16" HREF="readline_toc.html#TOC16">Readline vi Mode</A></H2>
+
+<P>
+While the Readline library does not have a full set of <CODE>vi</CODE>
+editing functions, it does contain enough to allow simple editing
+of the line. The Readline <CODE>vi</CODE> mode behaves as specified in
+the POSIX 1003.2 standard.
+
+</P>
+<P>
+In order to switch interactively between <CODE>emacs</CODE> and <CODE>vi</CODE>
+editing modes, use the command M-C-j (toggle-editing-mode).
+The Readline default is <CODE>emacs</CODE> mode.
+
+</P>
+<P>
+When you enter a line in <CODE>vi</CODE> mode, you are already placed in
+`insertion' mode, as if you had typed an <SAMP>`i'</SAMP>. Pressing <KBD>ESC</KBD>
+switches you into `command' mode, where you can edit the text of the
+line with the standard <CODE>vi</CODE> movement keys, move to previous
+history lines with <SAMP>`k'</SAMP> and subsequent lines with <SAMP>`j'</SAMP>, and
+so forth.
+
+</P>
+
+
+
+<H1><A NAME="SEC17" HREF="readline_toc.html#TOC17">Programming with GNU Readline</A></H1>
+
+<P>
+This chapter describes the interface between the GNU Readline Library and
+other programs. If you are a programmer, and you wish to include the
+features found in GNU Readline
+such as completion, line editing, and interactive history manipulation
+in your own programs, this section is for you.
+
+</P>
+
+
+
+<H2><A NAME="SEC18" HREF="readline_toc.html#TOC18">Basic Behavior</A></H2>
+
+<P>
+Many programs provide a command line interface, such as <CODE>mail</CODE>,
+<CODE>ftp</CODE>, and <CODE>sh</CODE>. For such programs, the default behaviour of
+Readline is sufficient. This section describes how to use Readline in
+the simplest way possible, perhaps to replace calls in your code to
+<CODE>gets()</CODE> or <CODE>fgets ()</CODE>.
+
+</P>
+<P>
+<A NAME="IDX86"></A>
+<A NAME="IDX87"></A>
+The function <CODE>readline ()</CODE> prints a prompt and then reads and returns
+a single line of text from the user. The line <CODE>readline</CODE>
+returns is allocated with <CODE>malloc ()</CODE>; you should <CODE>free ()</CODE>
+the line when you are done with it. The declaration for <CODE>readline</CODE>
+in ANSI C is
+
+</P>
+
+<PRE>
+<CODE>char *readline (char *<VAR>prompt</VAR>);</CODE>
+</PRE>
+
+<P>
+So, one might say
+
+<PRE>
+<CODE>char *line = readline ("Enter a line: ");</CODE>
+</PRE>
+
+<P>
+in order to read a line of text from the user.
+The line returned has the final newline removed, so only the
+text remains.
+
+</P>
+<P>
+If <CODE>readline</CODE> encounters an <CODE>EOF</CODE> while reading the line, and the
+line is empty at that point, then <CODE>(char *)NULL</CODE> is returned.
+Otherwise, the line is ended just as if a newline had been typed.
+
+</P>
+<P>
+If you want the user to be able to get at the line later, (with
+<KBD>C-p</KBD> for example), you must call <CODE>add_history ()</CODE> to save the
+line away in a <STRONG>history</STRONG> list of such lines.
+
+</P>
+
+<PRE>
+<CODE>add_history (line)</CODE>;
+</PRE>
+
+<P>
+For full details on the GNU History Library, see the associated manual.
+
+</P>
+<P>
+It is preferable to avoid saving empty lines on the history list, since
+users rarely have a burning need to reuse a blank line. Here is
+a function which usefully replaces the standard <CODE>gets ()</CODE> library
+function, and has the advantage of no static buffer to overflow:
+
+</P>
+
+<PRE>
+/* A static variable for holding the line. */
+static char *line_read = (char *)NULL;
+
+/* Read a string, and return a pointer to it. Returns NULL on EOF. */
+char *
+rl_gets ()
+{
+ /* If the buffer has already been allocated, return the memory
+ to the free pool. */
+ if (line_read)
+ {
+ free (line_read);
+ line_read = (char *)NULL;
+ }
+
+ /* Get a line from the user. */
+ line_read = readline ("");
+
+ /* If the line has any text in it, save it on the history. */
+ if (line_read &#38;&#38; *line_read)
+ add_history (line_read);
+
+ return (line_read);
+}
+</PRE>
+
+<P>
+This function gives the user the default behaviour of <KBD>TAB</KBD>
+completion: completion on file names. If you do not want Readline to
+complete on filenames, you can change the binding of the <KBD>TAB</KBD> key
+with <CODE>rl_bind_key ()</CODE>.
+
+</P>
+
+<PRE>
+<CODE>int rl_bind_key (int <VAR>key</VAR>, int (*<VAR>function</VAR>)());</CODE>
+</PRE>
+
+<P>
+<CODE>rl_bind_key ()</CODE> takes two arguments: <VAR>key</VAR> is the character that
+you want to bind, and <VAR>function</VAR> is the address of the function to
+call when <VAR>key</VAR> is pressed. Binding <KBD>TAB</KBD> to <CODE>rl_insert ()</CODE>
+makes <KBD>TAB</KBD> insert itself.
+<CODE>rl_bind_key ()</CODE> returns non-zero if <VAR>key</VAR> is not a valid
+ASCII character code (between 0 and 255).
+
+</P>
+<P>
+Thus, to disable the default <KBD>TAB</KBD> behavior, the following suffices:
+
+<PRE>
+<CODE>rl_bind_key ('\t', rl_insert);</CODE>
+</PRE>
+
+<P>
+This code should be executed once at the start of your program; you
+might write a function called <CODE>initialize_readline ()</CODE> which
+performs this and other desired initializations, such as installing
+custom completers (see section <A HREF="readline.html#SEC34">Custom Completers</A>).
+
+</P>
+
+
+<H2><A NAME="SEC19" HREF="readline_toc.html#TOC19">Custom Functions</A></H2>
+
+<P>
+Readline provides many functions for manipulating the text of
+the line, but it isn't possible to anticipate the needs of all
+programs. This section describes the various functions and variables
+defined within the Readline library which allow a user program to add
+customized functionality to Readline.
+
+</P>
+
+
+
+<H3><A NAME="SEC20" HREF="readline_toc.html#TOC20">The Function Type</A></H3>
+
+<P>
+For readabilty, we declare a new type of object, called
+<STRONG>Function</STRONG>. A <CODE>Function</CODE> is a C function which
+returns an <CODE>int</CODE>. The type declaration for <CODE>Function</CODE> is:
+
+</P>
+<P>
+<CODE>typedef int Function ();</CODE>
+
+</P>
+<P>
+The reason for declaring this new type is to make it easier to write
+code describing pointers to C functions. Let us say we had a variable
+called <VAR>func</VAR> which was a pointer to a function. Instead of the
+classic C declaration
+
+</P>
+<P>
+<CODE>int (*)()func;</CODE>
+
+</P>
+<P>
+we may write
+
+</P>
+<P>
+<CODE>Function *func;</CODE>
+
+</P>
+<P>
+Similarly, there are
+
+</P>
+
+<PRE>
+typedef void VFunction ();
+typedef char *CPFunction (); and
+typedef char **CPPFunction ();
+</PRE>
+
+<P>
+for functions returning no value, <CODE>pointer to char</CODE>, and
+<CODE>pointer to pointer to char</CODE>, respectively.
+
+</P>
+
+
+<H3><A NAME="SEC21" HREF="readline_toc.html#TOC21">Writing a New Function</A></H3>
+
+<P>
+In order to write new functions for Readline, you need to know the
+calling conventions for keyboard-invoked functions, and the names of the
+variables that describe the current state of the line read so far.
+
+</P>
+<P>
+The calling sequence for a command <CODE>foo</CODE> looks like
+
+</P>
+
+<PRE>
+<CODE>foo (int count, int key)</CODE>
+</PRE>
+
+<P>
+where <VAR>count</VAR> is the numeric argument (or 1 if defaulted) and
+<VAR>key</VAR> is the key that invoked this function.
+
+</P>
+<P>
+It is completely up to the function as to what should be done with the
+numeric argument. Some functions use it as a repeat count, some
+as a flag, and others to choose alternate behavior (refreshing the current
+line as opposed to refreshing the screen, for example). Some choose to
+ignore it. In general, if a
+function uses the numeric argument as a repeat count, it should be able
+to do something useful with both negative and positive arguments.
+At the very least, it should be aware that it can be passed a
+negative argument.
+
+</P>
+
+
+<H2><A NAME="SEC22" HREF="readline_toc.html#TOC22">Readline Variables</A></H2>
+
+<P>
+These variables are available to function writers.
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_line_buffer</B>
+<DD><A NAME="IDX88"></A>
+This is the line gathered so far. You are welcome to modify the
+contents of the line, but see section <A HREF="readline.html#SEC28">Allowing Undoing</A>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_point</B>
+<DD><A NAME="IDX89"></A>
+The offset of the current cursor position in <CODE>rl_line_buffer</CODE>
+(the <EM>point</EM>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_end</B>
+<DD><A NAME="IDX90"></A>
+The number of characters present in <CODE>rl_line_buffer</CODE>. When
+<CODE>rl_point</CODE> is at the end of the line, <CODE>rl_point</CODE> and
+<CODE>rl_end</CODE> are equal.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_mark</B>
+<DD><A NAME="IDX91"></A>
+The mark (saved position) in the current line. If set, the mark
+and point define a <EM>region</EM>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_done</B>
+<DD><A NAME="IDX92"></A>
+Setting this to a non-zero value causes Readline to return the current
+line immediately.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_pending_input</B>
+<DD><A NAME="IDX93"></A>
+Setting this to a value makes it the next keystroke read. This is a
+way to stuff a single character into the input stream.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_prompt</B>
+<DD><A NAME="IDX94"></A>
+The prompt Readline uses. This is set from the argument to
+<CODE>readline ()</CODE>, and should not be assigned to directly.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_library_version</B>
+<DD><A NAME="IDX95"></A>
+The version number of this revision of the library.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_terminal_name</B>
+<DD><A NAME="IDX96"></A>
+The terminal type, used for initialization.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_readline_name</B>
+<DD><A NAME="IDX97"></A>
+This variable is set to a unique name by each application using Readline.
+The value allows conditional parsing of the inputrc file
+(see section <A HREF="readline.html#SEC5">Conditional Init Constructs</A>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> FILE * <B>rl_instream</B>
+<DD><A NAME="IDX98"></A>
+The stdio stream from which Readline reads input.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> FILE * <B>rl_outstream</B>
+<DD><A NAME="IDX99"></A>
+The stdio stream to which Readline performs output.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_startup_hook</B>
+<DD><A NAME="IDX100"></A>
+If non-zero, this is the address of a function to call just
+before <CODE>readline</CODE> prints the first prompt.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_event_hook</B>
+<DD><A NAME="IDX101"></A>
+If non-zero, this is the address of a function to call periodically
+when readline is waiting for terminal input.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_getc_function</B>
+<DD><A NAME="IDX102"></A>
+If non-zero, <CODE>readline</CODE> will call indirectly through this pointer
+to get a character from the input stream. By default, it is set to
+<CODE>rl_getc</CODE>, the default <CODE>readline</CODE> character input function
+(see section <A HREF="readline.html#SEC31">Utility Functions</A>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> VFunction * <B>rl_redisplay_function</B>
+<DD><A NAME="IDX103"></A>
+If non-zero, <CODE>readline</CODE> will call indirectly through this pointer
+to update the display with the current contents of the editing buffer.
+By default, it is set to <CODE>rl_redisplay</CODE>, the default <CODE>readline</CODE>
+redisplay function (see section <A HREF="readline.html#SEC29">Redisplay</A>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Keymap <B>rl_executing_keymap</B>
+<DD><A NAME="IDX104"></A>
+This variable is set to the keymap (see section <A HREF="readline.html#SEC25">Selecting a Keymap</A>) in which the
+currently executing readline function was found.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Keymap <B>rl_binding_keymap</B>
+<DD><A NAME="IDX105"></A>
+This variable is set to the keymap (see section <A HREF="readline.html#SEC25">Selecting a Keymap</A>) in which the
+last key binding occurred.
+</DL>
+
+</P>
+
+
+<H2><A NAME="SEC23" HREF="readline_toc.html#TOC23">Readline Convenience Functions</A></H2>
+
+
+
+<H3><A NAME="SEC24" HREF="readline_toc.html#TOC24">Naming a Function</A></H3>
+
+<P>
+The user can dynamically change the bindings of keys while using
+Readline. This is done by representing the function with a descriptive
+name. The user is able to type the descriptive name when referring to
+the function. Thus, in an init file, one might find
+
+</P>
+
+<PRE>
+Meta-Rubout: backward-kill-word
+</PRE>
+
+<P>
+This binds the keystroke <KBD>Meta-Rubout</KBD> to the function
+<EM>descriptively</EM> named <CODE>backward-kill-word</CODE>. You, as the
+programmer, should bind the functions you write to descriptive names as
+well. Readline provides a function for doing that:
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_add_defun</B> <I>(char *name, Function *function, int key)</I>
+<DD><A NAME="IDX106"></A>
+Add <VAR>name</VAR> to the list of named functions. Make <VAR>function</VAR> be
+the function that gets called. If <VAR>key</VAR> is not -1, then bind it to
+<VAR>function</VAR> using <CODE>rl_bind_key ()</CODE>.
+</DL>
+
+</P>
+<P>
+Using this function alone is sufficient for most applications. It is
+the recommended way to add a few functions to the default functions that
+Readline has built in. If you need to do something other
+than adding a function to Readline, you may need to use the
+underlying functions described below.
+
+</P>
+
+
+<H3><A NAME="SEC25" HREF="readline_toc.html#TOC25">Selecting a Keymap</A></H3>
+
+<P>
+Key bindings take place on a <STRONG>keymap</STRONG>. The keymap is the
+association between the keys that the user types and the functions that
+get run. You can make your own keymaps, copy existing keymaps, and tell
+Readline which keymap to use.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_make_bare_keymap</B> <I>()</I>
+<DD><A NAME="IDX107"></A>
+Returns a new, empty keymap. The space for the keymap is allocated with
+<CODE>malloc ()</CODE>; you should <CODE>free ()</CODE> it when you are done.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_copy_keymap</B> <I>(Keymap map)</I>
+<DD><A NAME="IDX108"></A>
+Return a new keymap which is a copy of <VAR>map</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_make_keymap</B> <I>()</I>
+<DD><A NAME="IDX109"></A>
+Return a new keymap with the printing characters bound to rl_insert,
+the lowercase Meta characters bound to run their equivalents, and
+the Meta digits bound to produce numeric arguments.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_discard_keymap</B> <I>(Keymap keymap)</I>
+<DD><A NAME="IDX110"></A>
+Free the storage associated with <VAR>keymap</VAR>.
+</DL>
+
+</P>
+<P>
+Readline has several internal keymaps. These functions allow you to
+change which keymap is active.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_get_keymap</B> <I>()</I>
+<DD><A NAME="IDX111"></A>
+Returns the currently active keymap.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_set_keymap</B> <I>(Keymap keymap)</I>
+<DD><A NAME="IDX112"></A>
+Makes <VAR>keymap</VAR> the currently active keymap.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_get_keymap_by_name</B> <I>(char *name)</I>
+<DD><A NAME="IDX113"></A>
+Return the keymap matching <VAR>name</VAR>. <VAR>name</VAR> is one which would
+be supplied in a <CODE>set keymap</CODE> inputrc line (@xref{Readline Init File}).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char * <B>rl_get_keymap_name</B> <I>(Keymap keymap)</I>
+<DD><A NAME="IDX114"></A>
+Return the name matching <VAR>keymap</VAR>. <VAR>name</VAR> is one which would
+be supplied in a <CODE>set keymap</CODE> inputrc line (@xref{Readline Init File}).
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC26" HREF="readline_toc.html#TOC26">Binding Keys</A></H3>
+
+<P>
+You associate keys with functions through the keymap. Readline has
+several internal keymaps: <CODE>emacs_standard_keymap</CODE>,
+<CODE>emacs_meta_keymap</CODE>, <CODE>emacs_ctlx_keymap</CODE>,
+<CODE>vi_movement_keymap</CODE>, and <CODE>vi_insertion_keymap</CODE>.
+<CODE>emacs_standard_keymap</CODE> is the default, and the examples in
+this manual assume that.
+
+</P>
+<P>
+These functions manage key bindings.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_key</B> <I>(int key, Function *function)</I>
+<DD><A NAME="IDX115"></A>
+Binds <VAR>key</VAR> to <VAR>function</VAR> in the currently active keymap.
+Returns non-zero in the case of an invalid <VAR>key</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_key_in_map</B> <I>(int key, Function *function, Keymap map)</I>
+<DD><A NAME="IDX116"></A>
+Bind <VAR>key</VAR> to <VAR>function</VAR> in <VAR>map</VAR>. Returns non-zero in the case
+of an invalid <VAR>key</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_key</B> <I>(int key)</I>
+<DD><A NAME="IDX117"></A>
+Bind <VAR>key</VAR> to the null function in the currently active keymap.
+Returns non-zero in case of error.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_key_in_map</B> <I>(int key, Keymap map)</I>
+<DD><A NAME="IDX118"></A>
+Bind <VAR>key</VAR> to the null function in <VAR>map</VAR>.
+Returns non-zero in case of error.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_generic_bind</B> <I>(int type, char *keyseq, char *data, Keymap map)</I>
+<DD><A NAME="IDX119"></A>
+Bind the key sequence represented by the string <VAR>keyseq</VAR> to the arbitrary
+pointer <VAR>data</VAR>. <VAR>type</VAR> says what kind of data is pointed to by
+<VAR>data</VAR>; this can be a function (<CODE>ISFUNC</CODE>), a macro
+(<CODE>ISMACR</CODE>), or a keymap (<CODE>ISKMAP</CODE>). This makes new keymaps as
+necessary. The initial keymap in which to do bindings is <VAR>map</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_parse_and_bind</B> <I>(char *line)</I>
+<DD><A NAME="IDX120"></A>
+Parse <VAR>line</VAR> as if it had been read from the <CODE>inputrc</CODE> file and
+perform any key bindings and variable assignments found
+(@xref{Readline Init File}).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_read_init_file</B> <I>(char *filename)</I>
+<DD><A NAME="IDX121"></A>
+Read keybindings and variable assignments from <VAR>filename</VAR>
+(@xref{Readline Init File}).
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC27" HREF="readline_toc.html#TOC27">Associating Function Names and Bindings</A></H3>
+
+<P>
+These functions allow you to find out what keys invoke named functions
+and the functions invoked by a particular key sequence.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> Function * <B>rl_named_function</B> <I>(char *name)</I>
+<DD><A NAME="IDX122"></A>
+Return the function with name <VAR>name</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> Function * <B>rl_function_of_keyseq</B> <I>(char *keyseq, Keymap map, int *type)</I>
+<DD><A NAME="IDX123"></A>
+Return the function invoked by <VAR>keyseq</VAR> in keymap <VAR>map</VAR>.
+If <VAR>map</VAR> is NULL, the current keymap is used. If <VAR>type</VAR> is
+not NULL, the type of the object is returned in it (one of <CODE>ISFUNC</CODE>,
+<CODE>ISKMAP</CODE>, or <CODE>ISMACR</CODE>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char ** <B>rl_invoking_keyseqs</B> <I>(Function *function)</I>
+<DD><A NAME="IDX124"></A>
+Return an array of strings representing the key sequences used to
+invoke <VAR>function</VAR> in the current keymap.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char ** <B>rl_invoking_keyseqs_in_map</B> <I>(Function *function, Keymap map)</I>
+<DD><A NAME="IDX125"></A>
+Return an array of strings representing the key sequences used to
+invoke <VAR>function</VAR> in the keymap <VAR>map</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_function_dumper</B> <I>(int readable)</I>
+<DD><A NAME="IDX126"></A>
+Print the readline function names and the key sequences currently
+bound to them to <CODE>rl_outstream</CODE>. If <VAR>readable</VAR> is non-zero,
+the list is formatted in such a way that it can be made part of an
+<CODE>inputrc</CODE> file and re-read.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_list_funmap_names</B> <I>()</I>
+<DD><A NAME="IDX127"></A>
+Print the names of all bindable Readline functions to <CODE>rl_outstream</CODE>.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC28" HREF="readline_toc.html#TOC28">Allowing Undoing</A></H3>
+
+<P>
+Supporting the undo command is a painless thing, and makes your
+functions much more useful. It is certainly easy to try
+something if you know you can undo it. I could use an undo function for
+the stock market.
+
+</P>
+<P>
+If your function simply inserts text once, or deletes text once, and
+uses <CODE>rl_insert_text ()</CODE> or <CODE>rl_delete_text ()</CODE> to do it, then
+undoing is already done for you automatically.
+
+</P>
+<P>
+If you do multiple insertions or multiple deletions, or any combination
+of these operations, you should group them together into one operation.
+This is done with <CODE>rl_begin_undo_group ()</CODE> and
+<CODE>rl_end_undo_group ()</CODE>.
+
+</P>
+<P>
+The types of events that can be undone are:
+
+</P>
+
+<PRE>
+enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END };
+</PRE>
+
+<P>
+Notice that <CODE>UNDO_DELETE</CODE> means to insert some text, and
+<CODE>UNDO_INSERT</CODE> means to delete some text. That is, the undo code
+tells undo what to undo, not how to undo it. <CODE>UNDO_BEGIN</CODE> and
+<CODE>UNDO_END</CODE> are tags added by <CODE>rl_begin_undo_group ()</CODE> and
+<CODE>rl_end_undo_group ()</CODE>.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_begin_undo_group</B> <I>()</I>
+<DD><A NAME="IDX128"></A>
+Begins saving undo information in a group construct. The undo
+information usually comes from calls to <CODE>rl_insert_text ()</CODE> and
+<CODE>rl_delete_text ()</CODE>, but could be the result of calls to
+<CODE>rl_add_undo ()</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_end_undo_group</B> <I>()</I>
+<DD><A NAME="IDX129"></A>
+Closes the current undo group started with <CODE>rl_begin_undo_group
+()</CODE>. There should be one call to <CODE>rl_end_undo_group ()</CODE>
+for each call to <CODE>rl_begin_undo_group ()</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_add_undo</B> <I>(enum undo_code what, int start, int end, char *text)</I>
+<DD><A NAME="IDX130"></A>
+Remember how to undo an event (according to <VAR>what</VAR>). The affected
+text runs from <VAR>start</VAR> to <VAR>end</VAR>, and encompasses <VAR>text</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>free_undo_list</B> <I>()</I>
+<DD><A NAME="IDX131"></A>
+Free the existing undo list.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_do_undo</B> <I>()</I>
+<DD><A NAME="IDX132"></A>
+Undo the first thing on the undo list. Returns <CODE>0</CODE> if there was
+nothing to undo, non-zero if something was undone.
+</DL>
+
+</P>
+<P>
+Finally, if you neither insert nor delete text, but directly modify the
+existing text (e.g., change its case), call <CODE>rl_modifying ()</CODE>
+once, just before you modify the text. You must supply the indices of
+the text range that you are going to modify.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_modifying</B> <I>(int start, int end)</I>
+<DD><A NAME="IDX133"></A>
+Tell Readline to save the text between <VAR>start</VAR> and <VAR>end</VAR> as a
+single undo unit. It is assumed that you will subsequently modify
+that text.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC29" HREF="readline_toc.html#TOC29">Redisplay</A></H3>
+
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_redisplay</B> <I>()</I>
+<DD><A NAME="IDX134"></A>
+Change what's displayed on the screen to reflect the current contents
+of <CODE>rl_line_buffer</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_forced_update_display</B> <I>()</I>
+<DD><A NAME="IDX135"></A>
+Force the line to be updated and redisplayed, whether or not
+Readline thinks the screen display is correct.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_on_new_line</B> <I>()</I>
+<DD><A NAME="IDX136"></A>
+Tell the update routines that we have moved onto a new (empty) line,
+usually after ouputting a newline.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_reset_line_state</B> <I>()</I>
+<DD><A NAME="IDX137"></A>
+Reset the display state to a clean state and redisplay the current line
+starting on a new line.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_message</B> <I>(va_alist)</I>
+<DD><A NAME="IDX138"></A>
+The arguments are a string as would be supplied to <CODE>printf</CODE>. The
+resulting string is displayed in the <STRONG>echo area</STRONG>. The echo area
+is also used to display numeric arguments and search strings.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_clear_message</B> <I>()</I>
+<DD><A NAME="IDX139"></A>
+Clear the message in the echo area.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC30" HREF="readline_toc.html#TOC30">Modifying Text</A></H3>
+
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_insert_text</B> <I>(char *text)</I>
+<DD><A NAME="IDX140"></A>
+Insert <VAR>text</VAR> into the line at the current cursor position.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_delete_text</B> <I>(int start, int end)</I>
+<DD><A NAME="IDX141"></A>
+Delete the text between <VAR>start</VAR> and <VAR>end</VAR> in the current line.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char * <B>rl_copy_text</B> <I>(int start, int end)</I>
+<DD><A NAME="IDX142"></A>
+Return a copy of the text between <VAR>start</VAR> and <VAR>end</VAR> in
+the current line.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_kill_text</B> <I>(int start, int end)</I>
+<DD><A NAME="IDX143"></A>
+Copy the text between <VAR>start</VAR> and <VAR>end</VAR> in the current line
+to the kill ring, appending or prepending to the last kill if the
+last command was a kill command. The text is deleted.
+If <VAR>start</VAR> is less than <VAR>end</VAR>,
+the text is appended, otherwise prepended. If the last command was
+not a kill, a new kill ring slot is used.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC31" HREF="readline_toc.html#TOC31">Utility Functions</A></H3>
+
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_read_key</B> <I>()</I>
+<DD><A NAME="IDX144"></A>
+Return the next character available. This handles input inserted into
+the input stream via <VAR>pending input</VAR> (see section <A HREF="readline.html#SEC22">Readline Variables</A>)
+and <CODE>rl_stuff_char ()</CODE>, macros, and characters read from the keyboard.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_getc</B> <I>(FILE *)</I>
+<DD><A NAME="IDX145"></A>
+Return the next character available from the keyboard.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_stuff_char</B> <I>(int c)</I>
+<DD><A NAME="IDX146"></A>
+Insert <VAR>c</VAR> into the Readline input stream. It will be "read"
+before Readline attempts to read characters from the terminal with
+<CODE>rl_read_key ()</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> rl_extend_line_buffer <B>(int</B> <I>len)</I>
+<DD><A NAME="IDX147"></A>
+Ensure that <CODE>rl_line_buffer</CODE> has enough space to hold <VAR>len</VAR>
+characters, possibly reallocating it if necessary.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_initialize</B> <I>()</I>
+<DD><A NAME="IDX148"></A>
+Initialize or re-initialize Readline's internal state.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_reset_terminal</B> <I>(char *terminal_name)</I>
+<DD><A NAME="IDX149"></A>
+Reinitialize Readline's idea of the terminal settings using
+<VAR>terminal_name</VAR> as the terminal type (e.g., <CODE>vt100</CODE>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>alphabetic</B> <I>(int c)</I>
+<DD><A NAME="IDX150"></A>
+Return 1 if <VAR>c</VAR> is an alphabetic character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>numeric</B> <I>(int c)</I>
+<DD><A NAME="IDX151"></A>
+Return 1 if <VAR>c</VAR> is a numeric character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>ding</B> <I>()</I>
+<DD><A NAME="IDX152"></A>
+Ring the terminal bell, obeying the setting of <CODE>bell-style</CODE>.
+</DL>
+
+</P>
+<P>
+The following are implemented as macros, defined in <CODE>chartypes.h</CODE>.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>uppercase_p</B> <I>(int c)</I>
+<DD><A NAME="IDX153"></A>
+Return 1 if <VAR>c</VAR> is an uppercase alphabetic character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>lowercase_p</B> <I>(int c)</I>
+<DD><A NAME="IDX154"></A>
+Return 1 if <VAR>c</VAR> is a lowercase alphabetic character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>digit_p</B> <I>(int c)</I>
+<DD><A NAME="IDX155"></A>
+Return 1 if <VAR>c</VAR> is a numeric character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>to_upper</B> <I>(int c)</I>
+<DD><A NAME="IDX156"></A>
+If <VAR>c</VAR> is a lowercase alphabetic character, return the corresponding
+uppercase character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>to_lower</B> <I>(int c)</I>
+<DD><A NAME="IDX157"></A>
+If <VAR>c</VAR> is an uppercase alphabetic character, return the corresponding
+lowercase character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>digit_value</B> <I>(int c)</I>
+<DD><A NAME="IDX158"></A>
+If <VAR>c</VAR> is a number, return the value it represents.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC32" HREF="readline_toc.html#TOC32">Alternate Interface</A></H3>
+
+<P>
+An alternate interface is available to plain <CODE>readline()</CODE>. Some
+applications need to interleave keyboard I/O with file, device, or
+window system I/O, typically by using a main loop to <CODE>select()</CODE>
+on various file descriptors. To accomodate this need, readline can
+also be invoked as a `callback' function from an event loop. There
+are functions available to make this easy.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_callback_handler_install</B> <I>(char *prompt, Vfunction *lhandler)</I>
+<DD><A NAME="IDX159"></A>
+Set up the terminal for readline I/O and display the initial
+expanded value of <VAR>prompt</VAR>. Save the value of <VAR>lhandler</VAR> to
+use as a callback when a complete line of input has been entered.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_callback_read_char</B> <I>()</I>
+<DD><A NAME="IDX160"></A>
+Whenever an application determines that keyboard input is available, it
+should call <CODE>rl_callback_read_char()</CODE>, which will read the next
+character from the current input source. If that character completes the
+line, <CODE>rl_callback_read_char</CODE> will invoke the <VAR>lhandler</VAR>
+function saved by <CODE>rl_callback_handler_install</CODE> to process the
+line. <CODE>EOF</CODE> is indicated by calling <VAR>lhandler</VAR> with a
+<CODE>NULL</CODE> line.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_callback_handler_remove</B> <I>()</I>
+<DD><A NAME="IDX161"></A>
+Restore the terminal to its initial state and remove the line handler.
+This may be called from within a callback as well as independently.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC33" HREF="readline_toc.html#TOC33">An Example</A></H3>
+
+<P>
+Here is a function which changes lowercase characters to their uppercase
+equivalents, and uppercase characters to lowercase. If
+this function was bound to <SAMP>`M-c'</SAMP>, then typing <SAMP>`M-c'</SAMP> would
+change the case of the character under point. Typing <SAMP>`M-1 0 M-c'</SAMP>
+would change the case of the following 10 characters, leaving the cursor on
+the last character changed.
+
+</P>
+
+<PRE>
+/* Invert the case of the COUNT following characters. */
+int
+invert_case_line (count, key)
+ int count, key;
+{
+ register int start, end, i;
+
+ start = rl_point;
+
+ if (rl_point &#62;= rl_end)
+ return (0);
+
+ if (count &#60; 0)
+ {
+ direction = -1;
+ count = -count;
+ }
+ else
+ direction = 1;
+
+ /* Find the end of the range to modify. */
+ end = start + (count * direction);
+
+ /* Force it to be within range. */
+ if (end &#62; rl_end)
+ end = rl_end;
+ else if (end &#60; 0)
+ end = 0;
+
+ if (start == end)
+ return (0);
+
+ if (start &#62; end)
+ {
+ int temp = start;
+ start = end;
+ end = temp;
+ }
+
+ /* Tell readline that we are modifying the line, so it will save
+ the undo information. */
+ rl_modifying (start, end);
+
+ for (i = start; i != end; i++)
+ {
+ if (uppercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = to_lower (rl_line_buffer[i]);
+ else if (lowercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = to_upper (rl_line_buffer[i]);
+ }
+ /* Move point to on top of the last character changed. */
+ rl_point = (direction == 1) ? end - 1 : start;
+ return (0);
+}
+</PRE>
+
+
+
+<H2><A NAME="SEC34" HREF="readline_toc.html#TOC34">Custom Completers</A></H2>
+
+<P>
+Typically, a program that reads commands from the user has a way of
+disambiguating commands and data. If your program is one of these, then
+it can provide completion for commands, data, or both.
+The following sections describe how your program and Readline
+cooperate to provide this service.
+
+</P>
+
+
+
+<H3><A NAME="SEC35" HREF="readline_toc.html#TOC35">How Completing Works</A></H3>
+
+<P>
+In order to complete some text, the full list of possible completions
+must be available. That is, it is not possible to accurately
+expand a partial word without knowing all of the possible words
+which make sense in that context. The Readline library provides
+the user interface to completion, and two of the most common
+completion functions: filename and username. For completing other types
+of text, you must write your own completion function. This section
+describes exactly what such functions must do, and provides an example.
+
+</P>
+<P>
+There are three major functions used to perform completion:
+
+</P>
+
+<OL>
+<LI>
+
+The user-interface function <CODE>rl_complete ()</CODE>. This function is
+called with the same arguments as other Readline
+functions intended for interactive use: <VAR>count</VAR> and
+<VAR>invoking_key</VAR>. It isolates the word to be completed and calls
+<CODE>completion_matches ()</CODE> to generate a list of possible completions.
+It then either lists the possible completions, inserts the possible
+completions, or actually performs the
+completion, depending on which behavior is desired.
+
+<LI>
+
+The internal function <CODE>completion_matches ()</CODE> uses your
+<STRONG>generator</STRONG> function to generate the list of possible matches, and
+then returns the array of these matches. You should place the address
+of your generator function in <CODE>rl_completion_entry_function</CODE>.
+
+<LI>
+
+The generator function is called repeatedly from
+<CODE>completion_matches ()</CODE>, returning a string each time. The
+arguments to the generator function are <VAR>text</VAR> and <VAR>state</VAR>.
+<VAR>text</VAR> is the partial word to be completed. <VAR>state</VAR> is zero the
+first time the function is called, allowing the generator to perform
+any necessary initialization, and a positive non-zero integer for
+each subsequent call. When the generator function returns
+<CODE>(char *)NULL</CODE> this signals <CODE>completion_matches ()</CODE> that there are
+no more possibilities left. Usually the generator function computes the
+list of possible completions when <VAR>state</VAR> is zero, and returns them
+one at a time on subsequent calls. Each string the generator function
+returns as a match must be allocated with <CODE>malloc()</CODE>; Readline
+frees the strings when it has finished with them.
+
+</OL>
+
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_complete</B> <I>(int ignore, int invoking_key)</I>
+<DD><A NAME="IDX162"></A>
+Complete the word at or before point. You have supplied the function
+that does the initial simple matching selection algorithm (see
+<CODE>completion_matches ()</CODE>). The default is to do filename completion.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_completion_entry_function</B>
+<DD><A NAME="IDX163"></A>
+This is a pointer to the generator function for <CODE>completion_matches
+()</CODE>. If the value of <CODE>rl_completion_entry_function</CODE> is
+<CODE>(Function *)NULL</CODE> then the default filename generator function,
+<CODE>filename_completion_function ()</CODE>, is used.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC36" HREF="readline_toc.html#TOC36">Completion Functions</A></H3>
+
+<P>
+Here is the complete list of callable completion functions present in
+Readline.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_complete_internal</B> <I>(int what_to_do)</I>
+<DD><A NAME="IDX164"></A>
+Complete the word at or before point. <VAR>what_to_do</VAR> says what to do
+with the completion. A value of <SAMP>`?'</SAMP> means list the possible
+completions. <SAMP>`TAB'</SAMP> means do standard completion. <SAMP>`*'</SAMP> means
+insert all of the possible completions. <SAMP>`!'</SAMP> means to display
+all of the possible completions, if there is more than one, as well as
+performing partial completion.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_complete</B> <I>(int ignore, int invoking_key)</I>
+<DD><A NAME="IDX165"></A>
+Complete the word at or before point. You have supplied the function
+that does the initial simple matching selection algorithm (see
+<CODE>completion_matches ()</CODE> and <CODE>rl_completion_entry_function</CODE>).
+The default is to do filename
+completion. This calls <CODE>rl_complete_internal ()</CODE> with an
+argument depending on <VAR>invoking_key</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_possible_completions</B> <I>(int count, int invoking_key))</I>
+<DD><A NAME="IDX166"></A>
+List the possible completions. See description of <CODE>rl_complete
+()</CODE>. This calls <CODE>rl_complete_internal ()</CODE> with an argument of
+<SAMP>`?'</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_insert_completions</B> <I>(int count, int invoking_key))</I>
+<DD><A NAME="IDX167"></A>
+Insert the list of possible completions into the line, deleting the
+partially-completed word. See description of <CODE>rl_complete ()</CODE>.
+This calls <CODE>rl_complete_internal ()</CODE> with an argument of <SAMP>`*'</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char ** <B>completion_matches</B> <I>(char *text, CPFunction *entry_func)</I>
+<DD><A NAME="IDX168"></A>
+Returns an array of <CODE>(char *)</CODE> which is a list of completions for
+<VAR>text</VAR>. If there are no completions, returns <CODE>(char **)NULL</CODE>.
+The first entry in the returned array is the substitution for <VAR>text</VAR>.
+The remaining entries are the possible completions. The array is
+terminated with a <CODE>NULL</CODE> pointer.
+
+</P>
+<P>
+<VAR>entry_func</VAR> is a function of two args, and returns a
+<CODE>(char *)</CODE>. The first argument is <VAR>text</VAR>. The second is a
+state argument; it is zero on the first call, and non-zero on subsequent
+calls. <VAR>entry_func</VAR> returns a <CODE>NULL</CODE> pointer to the caller
+when there are no more matches.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char * <B>filename_completion_function</B> <I>(char *text, int state)</I>
+<DD><A NAME="IDX169"></A>
+A generator function for filename completion in the general case. Note
+that completion in Bash is a little different because of all
+the pathnames that must be followed when looking up completions for a
+command. The Bash source is a useful reference for writing custom
+completion functions.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char * <B>username_completion_function</B> <I>(char *text, int state)</I>
+<DD><A NAME="IDX170"></A>
+A completion generator for usernames. <VAR>text</VAR> contains a partial
+username preceded by a random character (usually <SAMP>`~'</SAMP>). As with all
+completion generators, <VAR>state</VAR> is zero on the first call and non-zero
+for subsequent calls.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC37" HREF="readline_toc.html#TOC37">Completion Variables</A></H3>
+
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_completion_entry_function</B>
+<DD><A NAME="IDX171"></A>
+A pointer to the generator function for <CODE>completion_matches ()</CODE>.
+<CODE>NULL</CODE> means to use <CODE>filename_entry_function ()</CODE>, the default
+filename completer.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> CPPFunction * <B>rl_attempted_completion_function</B>
+<DD><A NAME="IDX172"></A>
+A pointer to an alternative function to create matches.
+The function is called with <VAR>text</VAR>, <VAR>start</VAR>, and <VAR>end</VAR>.
+<VAR>start</VAR> and <VAR>end</VAR> are indices in <CODE>rl_line_buffer</CODE> saying
+what the boundaries of <VAR>text</VAR> are. If this function exists and
+returns <CODE>NULL</CODE>, or if this variable is set to <CODE>NULL</CODE>, then
+<CODE>rl_complete ()</CODE> will call the value of
+<CODE>rl_completion_entry_function</CODE> to generate matches, otherwise the
+array of strings returned will be used.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> CPFunction * <B>rl_filename_quoting_function</B>
+<DD><A NAME="IDX173"></A>
+A pointer to a function that will quote a filename in an application-
+specific fashion. This is called if filename completion is being
+attempted and one of the characters in <CODE>rl_filename_quote_characters</CODE>
+appears in a completed filename. The function is called with
+<VAR>text</VAR>, <VAR>match_type</VAR>, and <VAR>quote_pointer</VAR>. The <VAR>text</VAR>
+is the filename to be quoted. The <VAR>match_type</VAR> is either
+<CODE>SINGLE_MATCH</CODE>, if there is only one completion match, or
+<CODE>MULT_MATCH</CODE>. Some functions use this to decide whether or not to
+insert a closing quote character. The <VAR>quote_pointer</VAR> is a pointer
+to any opening quote character the user typed. Some functions choose
+to reset this character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> CPFunction * <B>rl_filename_dequoting_function</B>
+<DD><A NAME="IDX174"></A>
+A pointer to a function that will remove application-specific quoting
+characters from a filename before completion is attempted, so those
+characters do not interfere with matching the text against names in
+the filesystem. It is called with <VAR>text</VAR>, the text of the word
+to be dequoted, and <VAR>quote_char</VAR>, which is the quoting character
+that delimits the filename (usually <SAMP>`''</SAMP> or <SAMP>`"'</SAMP>). If
+<VAR>quote_char</VAR> is zero, the filename was not in an embedded string.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_char_is_quoted_p</B>
+<DD><A NAME="IDX175"></A>
+A pointer to a function to call that determines whether or not a specific
+character in the line buffer is quoted, according to whatever quoting
+mechanism the program calling readline uses. The function is called with
+two arguments: <VAR>text</VAR>, the text of the line, and <VAR>index</VAR>, the
+index of the character in the line. It is used to decide whether a
+character found in <CODE>rl_completer_word_break_characters</CODE> should be
+used to break words for the completer.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_query_items</B>
+<DD><A NAME="IDX176"></A>
+Up to this many items will be displayed in response to a
+possible-completions call. After that, we ask the user if she is sure
+she wants to see them all. The default value is 100.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_basic_word_break_characters</B>
+<DD><A NAME="IDX177"></A>
+The basic list of characters that signal a break between words for the
+completer routine. The default value of this variable is the characters
+which break words for completion in Bash, i.e.,
+<CODE>" \t\n\"\\'`@$&#62;&#60;=;|&#38;{("</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_basic_quote_characters</B>
+<DD><A NAME="IDX178"></A>
+List of quote characters which can cause a word break.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_completer_word_break_characters</B>
+<DD><A NAME="IDX179"></A>
+The list of characters that signal a break between words for
+<CODE>rl_complete_internal ()</CODE>. The default list is the value of
+<CODE>rl_basic_word_break_characters</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_completer_quote_characters</B>
+<DD><A NAME="IDX180"></A>
+List of characters which can be used to quote a substring of the line.
+Completion occurs on the entire substring, and within the substring
+<CODE>rl_completer_word_break_characters</CODE> are treated as any other character,
+unless they also appear within this list.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_filename_quote_characters</B>
+<DD><A NAME="IDX181"></A>
+A list of characters that cause a filename to be quoted by the completer
+when they appear in a completed filename. The default is empty.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_special_prefixes</B>
+<DD><A NAME="IDX182"></A>
+The list of characters that are word break characters, but should be
+left in <VAR>text</VAR> when it is passed to the completion function.
+Programs can use this to help determine what kind of completing to do.
+For instance, Bash sets this variable to "$@" so that it can complete
+shell variables and hostnames.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_append_character</B>
+<DD><A NAME="IDX183"></A>
+When a single completion alternative matches at the end of the command
+line, this character is appended to the inserted completion text. The
+default is a space character (<SAMP>` '</SAMP>). Setting this to the null
+character (<SAMP>`\0'</SAMP>) prevents anything being appended automatically.
+This can be changed in custom completion functions to
+provide the "most sensible word separator character" according to
+an application-specific command line syntax specification.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_ignore_completion_duplicates</B>
+<DD><A NAME="IDX184"></A>
+If non-zero, then disallow duplicates in the matches. Default is 1.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_filename_completion_desired</B>
+<DD><A NAME="IDX185"></A>
+Non-zero means that the results of the matches are to be treated as
+filenames. This is <EM>always</EM> zero on entry, and can only be changed
+within a completion entry generator function. If it is set to a non-zero
+value, directory names have a slash appended and Readline attempts to
+quote completed filenames if they contain any embedded word break
+characters.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_filename_quoting_desired</B>
+<DD><A NAME="IDX186"></A>
+Non-zero means that the results of the matches are to be quoted using
+double quotes (or an application-specific quoting mechanism) if the
+completed filename contains any characters in
+<CODE>rl_filename_quote_chars</CODE>. This is <EM>always</EM> non-zero
+on entry, and can only be changed within a completion entry generator
+function. The quoting is effected via a call to the function pointed to
+by <CODE>rl_filename_quoting_function</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_inhibit_completion</B>
+<DD><A NAME="IDX187"></A>
+If this variable is non-zero, completion is inhibit&#60;ed. The completion
+character will be inserted as any other bound to <CODE>self-insert</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_ignore_some_completions_function</B>
+<DD><A NAME="IDX188"></A>
+This function, if defined, is called by the completer when real filename
+completion is done, after all the matching names have been generated.
+It is passed a <CODE>NULL</CODE> terminated array of matches.
+The first element (<CODE>matches[0]</CODE>) is the
+maximal substring common to all matches. This function can
+re-arrange the list of matches as required, but each element deleted
+from the array must be freed.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_directory_completion_hook</B>
+<DD><A NAME="IDX189"></A>
+This function, if defined, is allowed to modify the directory portion
+of filenames Readline completes. It is called with the address of a
+string (the current directory name) as an argument. It could be used
+to expand symbolic links or shell variables in pathnames.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC38" HREF="readline_toc.html#TOC38">A Short Completion Example</A></H3>
+
+<P>
+Here is a small application demonstrating the use of the GNU Readline
+library. It is called <CODE>fileman</CODE>, and the source code resides in
+<TT>`examples/fileman.c'</TT>. This sample application provides
+completion of command names, line editing features, and access to the
+history list.
+
+</P>
+
+<PRE>
+/* fileman.c -- A tiny application which demonstrates how to use the
+ GNU Readline library. This application interactively allows users
+ to manipulate files and their modes. */
+
+#include &#60;stdio.h&#62;
+#include &#60;sys/types.h&#62;
+#include &#60;sys/file.h&#62;
+#include &#60;sys/stat.h&#62;
+#include &#60;sys/errno.h&#62;
+
+#include &#60;readline/readline.h&#62;
+#include &#60;readline/history.h&#62;
+
+extern char *getwd ();
+extern char *xmalloc ();
+
+/* The names of functions that actually do the manipulation. */
+int com_list (), com_view (), com_rename (), com_stat (), com_pwd ();
+int com_delete (), com_help (), com_cd (), com_quit ();
+
+/* A structure which contains information on the commands this program
+ can understand. */
+
+typedef struct {
+ char *name; /* User printable name of the function. */
+ Function *func; /* Function to call to do the job. */
+ char *doc; /* Documentation for this function. */
+} COMMAND;
+
+COMMAND commands[] = {
+ { "cd", com_cd, "Change to directory DIR" },
+ { "delete", com_delete, "Delete FILE" },
+ { "help", com_help, "Display this text" },
+ { "?", com_help, "Synonym for `help'" },
+ { "list", com_list, "List files in DIR" },
+ { "ls", com_list, "Synonym for `list'" },
+ { "pwd", com_pwd, "Print the current working directory" },
+ { "quit", com_quit, "Quit using Fileman" },
+ { "rename", com_rename, "Rename FILE to NEWNAME" },
+ { "stat", com_stat, "Print out statistics on FILE" },
+ { "view", com_view, "View the contents of FILE" },
+ { (char *)NULL, (Function *)NULL, (char *)NULL }
+};
+
+/* Forward declarations. */
+char *stripwhite ();
+COMMAND *find_command ();
+
+/* The name of this program, as taken from argv[0]. */
+char *progname;
+
+/* When non-zero, this global means the user is done using this program. */
+int done;
+
+char *
+dupstr (s)
+ int s;
+{
+ char *r;
+
+ r = xmalloc (strlen (s) + 1);
+ strcpy (r, s);
+ return (r);
+}
+
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *line, *s;
+
+ progname = argv[0];
+
+ initialize_readline (); /* Bind our completer. */
+
+ /* Loop reading and executing lines until the user quits. */
+ for ( ; done == 0; )
+ {
+ line = readline ("FileMan: ");
+
+ if (!line)
+ break;
+
+ /* Remove leading and trailing whitespace from the line.
+ Then, if there is anything left, add it to the history list
+ and execute it. */
+ s = stripwhite (line);
+
+ if (*s)
+ {
+ add_history (s);
+ execute_line (s);
+ }
+
+ free (line);
+ }
+ exit (0);
+}
+
+/* Execute a command line. */
+int
+execute_line (line)
+ char *line;
+{
+ register int i;
+ COMMAND *command;
+ char *word;
+
+ /* Isolate the command word. */
+ i = 0;
+ while (line[i] &#38;&#38; whitespace (line[i]))
+ i++;
+ word = line + i;
+
+ while (line[i] &#38;&#38; !whitespace (line[i]))
+ i++;
+
+ if (line[i])
+ line[i++] = '\0';
+
+ command = find_command (word);
+
+ if (!command)
+ {
+ fprintf (stderr, "%s: No such command for FileMan.\n", word);
+ return (-1);
+ }
+
+ /* Get argument to command, if any. */
+ while (whitespace (line[i]))
+ i++;
+
+ word = line + i;
+
+ /* Call the function. */
+ return ((*(command-&#62;func)) (word));
+}
+
+/* Look up NAME as the name of a command, and return a pointer to that
+ command. Return a NULL pointer if NAME isn't a command name. */
+COMMAND *
+find_command (name)
+ char *name;
+{
+ register int i;
+
+ for (i = 0; commands[i].name; i++)
+ if (strcmp (name, commands[i].name) == 0)
+ return (&#38;commands[i]);
+
+ return ((COMMAND *)NULL);
+}
+
+/* Strip whitespace from the start and end of STRING. Return a pointer
+ into STRING. */
+char *
+stripwhite (string)
+ char *string;
+{
+ register char *s, *t;
+
+ for (s = string; whitespace (*s); s++)
+ ;
+
+ if (*s == 0)
+ return (s);
+
+ t = s + strlen (s) - 1;
+ while (t &#62; s &#38;&#38; whitespace (*t))
+ t--;
+ *++t = '\0';
+
+ return s;
+}
+
+/* **************************************************************** */
+/* */
+/* Interface to Readline Completion */
+/* */
+/* **************************************************************** */
+
+char *command_generator ();
+char **fileman_completion ();
+
+/* Tell the GNU Readline library how to complete. We want to try to complete
+ on command names if this is the first word in the line, or on filenames
+ if not. */
+initialize_readline ()
+{
+ /* Allow conditional parsing of the ~/.inputrc file. */
+ rl_readline_name = "FileMan";
+
+ /* Tell the completer that we want a crack first. */
+ rl_attempted_completion_function = (CPPFunction *)fileman_completion;
+}
+
+/* Attempt to complete on the contents of TEXT. START and END bound the
+ region of rl_line_buffer that contains the word to complete. TEXT is
+ the word to complete. We can use the entire contents of rl_line_buffer
+ in case we want to do some simple parsing. Return the array of matches,
+ or NULL if there aren't any. */
+char **
+fileman_completion (text, start, end)
+ char *text;
+ int start, end;
+{
+ char **matches;
+
+ matches = (char **)NULL;
+
+ /* If this word is at the start of the line, then it is a command
+ to complete. Otherwise it is the name of a file in the current
+ directory. */
+ if (start == 0)
+ matches = completion_matches (text, command_generator);
+
+ return (matches);
+}
+
+/* Generator function for command completion. STATE lets us know whether
+ to start from scratch; without any state (i.e. STATE == 0), then we
+ start at the top of the list. */
+char *
+command_generator (text, state)
+ char *text;
+ int state;
+{
+ static int list_index, len;
+ char *name;
+
+ /* If this is a new word to complete, initialize now. This includes
+ saving the length of TEXT for efficiency, and initializing the index
+ variable to 0. */
+ if (!state)
+ {
+ list_index = 0;
+ len = strlen (text);
+ }
+
+ /* Return the next name which partially matches from the command list. */
+ while (name = commands[list_index].name)
+ {
+ list_index++;
+
+ if (strncmp (name, text, len) == 0)
+ return (dupstr(name));
+ }
+
+ /* If no names matched, then return NULL. */
+ return ((char *)NULL);
+}
+
+/* **************************************************************** */
+/* */
+/* FileMan Commands */
+/* */
+/* **************************************************************** */
+
+/* String to pass to system (). This is for the LIST, VIEW and RENAME
+ commands. */
+static char syscom[1024];
+
+/* List the file(s) named in arg. */
+com_list (arg)
+ char *arg;
+{
+ if (!arg)
+ arg = "";
+
+ sprintf (syscom, "ls -FClg %s", arg);
+ return (system (syscom));
+}
+
+com_view (arg)
+ char *arg;
+{
+ if (!valid_argument ("view", arg))
+ return 1;
+
+ sprintf (syscom, "more %s", arg);
+ return (system (syscom));
+}
+
+com_rename (arg)
+ char *arg;
+{
+ too_dangerous ("rename");
+ return (1);
+}
+
+com_stat (arg)
+ char *arg;
+{
+ struct stat finfo;
+
+ if (!valid_argument ("stat", arg))
+ return (1);
+
+ if (stat (arg, &#38;finfo) == -1)
+ {
+ perror (arg);
+ return (1);
+ }
+
+ printf ("Statistics for `%s':\n", arg);
+
+ printf ("%s has %d link%s, and is %d byte%s in length.\n", arg,
+ finfo.st_nlink,
+ (finfo.st_nlink == 1) ? "" : "s",
+ finfo.st_size,
+ (finfo.st_size == 1) ? "" : "s");
+ printf ("Inode Last Change at: %s", ctime (&#38;finfo.st_ctime));
+ printf (" Last access at: %s", ctime (&#38;finfo.st_atime));
+ printf (" Last modified at: %s", ctime (&#38;finfo.st_mtime));
+ return (0);
+}
+
+com_delete (arg)
+ char *arg;
+{
+ too_dangerous ("delete");
+ return (1);
+}
+
+/* Print out help for ARG, or for all of the commands if ARG is
+ not present. */
+com_help (arg)
+ char *arg;
+{
+ register int i;
+ int printed = 0;
+
+ for (i = 0; commands[i].name; i++)
+ {
+ if (!*arg || (strcmp (arg, commands[i].name) == 0))
+ {
+ printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+ printed++;
+ }
+ }
+
+ if (!printed)
+ {
+ printf ("No commands match `%s'. Possibilties are:\n", arg);
+
+ for (i = 0; commands[i].name; i++)
+ {
+ /* Print in six columns. */
+ if (printed == 6)
+ {
+ printed = 0;
+ printf ("\n");
+ }
+
+ printf ("%s\t", commands[i].name);
+ printed++;
+ }
+
+ if (printed)
+ printf ("\n");
+ }
+ return (0);
+}
+
+/* Change to the directory ARG. */
+com_cd (arg)
+ char *arg;
+{
+ if (chdir (arg) == -1)
+ {
+ perror (arg);
+ return 1;
+ }
+
+ com_pwd ("");
+ return (0);
+}
+
+/* Print out the current working directory. */
+com_pwd (ignore)
+ char *ignore;
+{
+ char dir[1024], *s;
+
+ s = getwd (dir);
+ if (s == 0)
+ {
+ printf ("Error getting pwd: %s\n", dir);
+ return 1;
+ }
+
+ printf ("Current directory is %s\n", dir);
+ return 0;
+}
+
+/* The user wishes to quit using this program. Just set DONE non-zero. */
+com_quit (arg)
+ char *arg;
+{
+ done = 1;
+ return (0);
+}
+
+/* Function which tells you that you can't do this. */
+too_dangerous (caller)
+ char *caller;
+{
+ fprintf (stderr,
+ "%s: Too dangerous for me to distribute. Write it yourself.\n",
+ caller);
+}
+
+/* Return non-zero if ARG is a valid argument for CALLER, else print
+ an error message and return zero. */
+int
+valid_argument (caller, arg)
+ char *caller, *arg;
+{
+ if (!arg || !*arg)
+ {
+ fprintf (stderr, "%s: Argument required.\n", caller);
+ return (0);
+ }
+
+ return (1);
+}
+</PRE>
+
+
+
+<H1><A NAME="SEC39" HREF="readline_toc.html#TOC39">Concept Index</A></H1>
+<P>
+<H2>i</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX1">interaction, readline</A>
+</DIR>
+<H2>r</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX87">readline, function</A>
+</DIR>
+
+</P>
+
+
+<H1><A NAME="SEC40" HREF="readline_toc.html#TOC40">Function and Variable Index</A></H1>
+<P>
+<H2>(</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX147">(int</A>
+</DIR>
+<H2>a</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX72">abort (C-g)</A>
+<LI><A HREF="readline.html#IDX26">accept-line (Newline, Return)</A>
+<LI><A HREF="readline.html#IDX150">alphabetic</A>
+</DIR>
+<H2>b</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX21">backward-char (C-b)</A>
+<LI><A HREF="readline.html#IDX40">backward-delete-char (Rubout)</A>
+<LI><A HREF="readline.html#IDX50">backward-kill-line (C-x Rubout)</A>
+<LI><A HREF="readline.html#IDX54">backward-kill-word (M-DEL)</A>
+<LI><A HREF="readline.html#IDX23">backward-word (M-b)</A>
+<LI><A HREF="readline.html#IDX29">beginning-of-history (M-&#38;#60;)</A>
+<LI><A HREF="readline.html#IDX18">beginning-of-line (C-a)</A>
+<LI><A HREF="readline.html#IDX2">bell-style</A>
+</DIR>
+<H2>c</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX70">call-last-kbd-macro (C-x e)</A>
+<LI><A HREF="readline.html#IDX48">capitalize-word (M-c)</A>
+<LI><A HREF="readline.html#IDX80">character-search (C-])</A>
+<LI><A HREF="readline.html#IDX81">character-search-backward (M-C-])</A>
+<LI><A HREF="readline.html#IDX24">clear-screen (C-l)</A>
+<LI><A HREF="readline.html#IDX3">comment-begin</A>
+<LI><A HREF="readline.html#IDX65">complete (TAB)</A>
+<LI><A HREF="readline.html#IDX4">completion-query-items</A>
+<LI><A HREF="readline.html#IDX168">completion_matches</A>
+<LI><A HREF="readline.html#IDX5">convert-meta</A>
+<LI><A HREF="readline.html#IDX59">copy-backward-word ()</A>
+<LI><A HREF="readline.html#IDX60">copy-forward-word ()</A>
+<LI><A HREF="readline.html#IDX58">copy-region-as-kill ()</A>
+</DIR>
+<H2>d</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX39">delete-char (C-d)</A>
+<LI><A HREF="readline.html#IDX56">delete-horizontal-space ()</A>
+<LI><A HREF="readline.html#IDX63">digit-argument (M-0, M-1, ... M--)</A>
+<LI><A HREF="readline.html#IDX155">digit_p</A>
+<LI><A HREF="readline.html#IDX158">digit_value</A>
+<LI><A HREF="readline.html#IDX152">ding</A>
+<LI><A HREF="readline.html#IDX6">disable-completion</A>
+<LI><A HREF="readline.html#IDX73">do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, ...)</A>
+<LI><A HREF="readline.html#IDX47">downcase-word (M-l)</A>
+<LI><A HREF="readline.html#IDX83">dump-functions ()</A>
+<LI><A HREF="readline.html#IDX85">dump-macros ()</A>
+<LI><A HREF="readline.html#IDX84">dump-variables ()</A>
+</DIR>
+<H2>e</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX7">editing-mode</A>
+<LI><A HREF="readline.html#IDX8">enable-keypad</A>
+<LI><A HREF="readline.html#IDX69">end-kbd-macro (C-x ))</A>
+<LI><A HREF="readline.html#IDX30">end-of-history (M-&#38;#62;)</A>
+<LI><A HREF="readline.html#IDX19">end-of-line (C-e)</A>
+<LI><A HREF="readline.html#IDX79">exchange-point-and-mark (C-x C-x)</A>
+<LI><A HREF="readline.html#IDX9">expand-tilde</A>
+</DIR>
+<H2>f</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX169">filename_completion_function</A>
+<LI><A HREF="readline.html#IDX20">forward-char (C-f)</A>
+<LI><A HREF="readline.html#IDX32">forward-search-history (C-s)</A>
+<LI><A HREF="readline.html#IDX22">forward-word (M-f)</A>
+<LI><A HREF="readline.html#IDX131">free_undo_list</A>
+</DIR>
+<H2>h</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX36">history-search-backward ()</A>
+<LI><A HREF="readline.html#IDX35">history-search-forward ()</A>
+<LI><A HREF="readline.html#IDX10">horizontal-scroll-mode</A>
+</DIR>
+<H2>i</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX13">input-meta</A>
+<LI><A HREF="readline.html#IDX82">insert-comment (M-#)</A>
+<LI><A HREF="readline.html#IDX67">insert-completions (M-*)</A>
+</DIR>
+<H2>k</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX11">keymap</A>
+<LI><A HREF="readline.html#IDX49">kill-line (C-k)</A>
+<LI><A HREF="readline.html#IDX57">kill-region ()</A>
+<LI><A HREF="readline.html#IDX52">kill-whole-line ()</A>
+<LI><A HREF="readline.html#IDX53">kill-word (M-d)</A>
+</DIR>
+<H2>l</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX154">lowercase_p</A>
+</DIR>
+<H2>m</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX12">mark-modified-lines</A>
+<LI><A HREF="readline.html#IDX14">meta-flag</A>
+</DIR>
+<H2>n</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX28">next-history (C-n)</A>
+<LI><A HREF="readline.html#IDX34">non-incremental-forward-search-history (M-n)</A>
+<LI><A HREF="readline.html#IDX33">non-incremental-reverse-search-history (M-p)</A>
+<LI><A HREF="readline.html#IDX151">numeric</A>
+</DIR>
+<H2>o</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX15">output-meta</A>
+</DIR>
+<H2>p</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX66">possible-completions (M-?)</A>
+<LI><A HREF="readline.html#IDX74">prefix-meta (ESC)</A>
+<LI><A HREF="readline.html#IDX27">previous-history (C-p)</A>
+</DIR>
+<H2>q</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX41">quoted-insert (C-q, C-v)</A>
+</DIR>
+<H2>r</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX71">re-read-init-file (C-x C-r)</A>
+<LI><A HREF="readline.html#IDX86">readline</A>
+<LI><A HREF="readline.html#IDX25">redraw-current-line ()</A>
+<LI><A HREF="readline.html#IDX31">reverse-search-history (C-r)</A>
+<LI><A HREF="readline.html#IDX76">revert-line (M-r)</A>
+<LI><A HREF="readline.html#IDX106">rl_add_defun</A>
+<LI><A HREF="readline.html#IDX130">rl_add_undo</A>
+<LI><A HREF="readline.html#IDX172">rl_attempted_completion_function</A>
+<LI><A HREF="readline.html#IDX178">rl_basic_quote_characters</A>
+<LI><A HREF="readline.html#IDX177">rl_basic_word_break_characters</A>
+<LI><A HREF="readline.html#IDX128">rl_begin_undo_group</A>
+<LI><A HREF="readline.html#IDX115">rl_bind_key</A>
+<LI><A HREF="readline.html#IDX116">rl_bind_key_in_map</A>
+<LI><A HREF="readline.html#IDX105">rl_binding_keymap</A>
+<LI><A HREF="readline.html#IDX159">rl_callback_handler_install</A>
+<LI><A HREF="readline.html#IDX161">rl_callback_handler_remove</A>
+<LI><A HREF="readline.html#IDX160">rl_callback_read_char</A>
+<LI><A HREF="readline.html#IDX175">rl_char_is_quoted_p</A>
+<LI><A HREF="readline.html#IDX139">rl_clear_message</A>
+<LI><A HREF="readline.html#IDX162">rl_complete</A>, <A HREF="rlman.html#IDX165">rl_complete</A>
+<LI><A HREF="readline.html#IDX164">rl_complete_internal</A>
+<LI><A HREF="readline.html#IDX180">rl_completer_quote_characters</A>
+<LI><A HREF="readline.html#IDX179">rl_completer_word_break_characters</A>
+<LI><A HREF="readline.html#IDX183">rl_completion_append_character</A>
+<LI><A HREF="readline.html#IDX163">rl_completion_entry_function</A>, <A HREF="rlman.html#IDX171">rl_completion_entry_function</A>
+<LI><A HREF="readline.html#IDX176">rl_completion_query_items</A>
+<LI><A HREF="readline.html#IDX108">rl_copy_keymap</A>
+<LI><A HREF="readline.html#IDX142">rl_copy_text</A>
+<LI><A HREF="readline.html#IDX141">rl_delete_text</A>
+<LI><A HREF="readline.html#IDX189">rl_directory_completion_hook</A>
+<LI><A HREF="readline.html#IDX110">rl_discard_keymap</A>
+<LI><A HREF="readline.html#IDX132">rl_do_undo</A>
+<LI><A HREF="readline.html#IDX92">rl_done</A>
+<LI><A HREF="readline.html#IDX90">rl_end</A>
+<LI><A HREF="readline.html#IDX129">rl_end_undo_group</A>
+<LI><A HREF="readline.html#IDX101">rl_event_hook</A>
+<LI><A HREF="readline.html#IDX104">rl_executing_keymap</A>
+<LI><A HREF="readline.html#IDX185">rl_filename_completion_desired</A>
+<LI><A HREF="readline.html#IDX174">rl_filename_dequoting_function</A>
+<LI><A HREF="readline.html#IDX181">rl_filename_quote_characters</A>
+<LI><A HREF="readline.html#IDX186">rl_filename_quoting_desired</A>
+<LI><A HREF="readline.html#IDX173">rl_filename_quoting_function</A>
+<LI><A HREF="readline.html#IDX135">rl_forced_update_display</A>
+<LI><A HREF="readline.html#IDX126">rl_function_dumper</A>
+<LI><A HREF="readline.html#IDX123">rl_function_of_keyseq</A>
+<LI><A HREF="readline.html#IDX119">rl_generic_bind</A>
+<LI><A HREF="readline.html#IDX111">rl_get_keymap</A>
+<LI><A HREF="readline.html#IDX113">rl_get_keymap_by_name</A>
+<LI><A HREF="readline.html#IDX114">rl_get_keymap_name</A>
+<LI><A HREF="readline.html#IDX145">rl_getc</A>
+<LI><A HREF="readline.html#IDX102">rl_getc_function</A>
+<LI><A HREF="readline.html#IDX184">rl_ignore_completion_duplicates</A>
+<LI><A HREF="readline.html#IDX188">rl_ignore_some_completions_function</A>
+<LI><A HREF="readline.html#IDX187">rl_inhibit_completion</A>
+<LI><A HREF="readline.html#IDX148">rl_initialize</A>
+<LI><A HREF="readline.html#IDX167">rl_insert_completions</A>
+<LI><A HREF="readline.html#IDX140">rl_insert_text</A>
+<LI><A HREF="readline.html#IDX98">rl_instream</A>
+<LI><A HREF="readline.html#IDX124">rl_invoking_keyseqs</A>
+<LI><A HREF="readline.html#IDX125">rl_invoking_keyseqs_in_map</A>
+<LI><A HREF="readline.html#IDX143">rl_kill_text</A>
+<LI><A HREF="readline.html#IDX95">rl_library_version</A>
+<LI><A HREF="readline.html#IDX88">rl_line_buffer</A>
+<LI><A HREF="readline.html#IDX127">rl_list_funmap_names</A>
+<LI><A HREF="readline.html#IDX107">rl_make_bare_keymap</A>
+<LI><A HREF="readline.html#IDX109">rl_make_keymap</A>
+<LI><A HREF="readline.html#IDX91">rl_mark</A>
+<LI><A HREF="readline.html#IDX138">rl_message</A>
+<LI><A HREF="readline.html#IDX133">rl_modifying</A>
+<LI><A HREF="readline.html#IDX122">rl_named_function</A>
+<LI><A HREF="readline.html#IDX136">rl_on_new_line</A>
+<LI><A HREF="readline.html#IDX99">rl_outstream</A>
+<LI><A HREF="readline.html#IDX120">rl_parse_and_bind</A>
+<LI><A HREF="readline.html#IDX93">rl_pending_input</A>
+<LI><A HREF="readline.html#IDX89">rl_point</A>
+<LI><A HREF="readline.html#IDX166">rl_possible_completions</A>
+<LI><A HREF="readline.html#IDX94">rl_prompt</A>
+<LI><A HREF="readline.html#IDX121">rl_read_init_file</A>
+<LI><A HREF="readline.html#IDX144">rl_read_key</A>
+<LI><A HREF="readline.html#IDX97">rl_readline_name</A>
+<LI><A HREF="readline.html#IDX134">rl_redisplay</A>
+<LI><A HREF="readline.html#IDX103">rl_redisplay_function</A>
+<LI><A HREF="readline.html#IDX137">rl_reset_line_state</A>
+<LI><A HREF="readline.html#IDX149">rl_reset_terminal</A>
+<LI><A HREF="readline.html#IDX112">rl_set_keymap</A>
+<LI><A HREF="readline.html#IDX182">rl_special_prefixes</A>
+<LI><A HREF="readline.html#IDX100">rl_startup_hook</A>
+<LI><A HREF="readline.html#IDX146">rl_stuff_char</A>
+<LI><A HREF="readline.html#IDX96">rl_terminal_name</A>
+<LI><A HREF="readline.html#IDX117">rl_unbind_key</A>
+<LI><A HREF="readline.html#IDX118">rl_unbind_key_in_map</A>
+</DIR>
+<H2>s</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX43">self-insert (a, b, A, 1, !, ...)</A>
+<LI><A HREF="readline.html#IDX78">set-mark (C-@)</A>
+<LI><A HREF="readline.html#IDX16">show-all-if-ambiguous</A>
+<LI><A HREF="readline.html#IDX68">start-kbd-macro (C-x ()</A>
+</DIR>
+<H2>t</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX42">tab-insert (M-TAB)</A>
+<LI><A HREF="readline.html#IDX77">tilde-expand (M-~)</A>
+<LI><A HREF="readline.html#IDX157">to_lower</A>
+<LI><A HREF="readline.html#IDX156">to_upper</A>
+<LI><A HREF="readline.html#IDX44">transpose-chars (C-t)</A>
+<LI><A HREF="readline.html#IDX45">transpose-words (M-t)</A>
+</DIR>
+<H2>u</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX75">undo (C-_, C-x C-u)</A>
+<LI><A HREF="readline.html#IDX64">universal-argument ()</A>
+<LI><A HREF="readline.html#IDX51">unix-line-discard (C-u)</A>
+<LI><A HREF="readline.html#IDX55">unix-word-rubout (C-w)</A>
+<LI><A HREF="readline.html#IDX46">upcase-word (M-u)</A>
+<LI><A HREF="readline.html#IDX153">uppercase_p</A>
+<LI><A HREF="readline.html#IDX170">username_completion_function</A>
+</DIR>
+<H2>v</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX17">visible-stats</A>
+</DIR>
+<H2>y</H2>
+<DIR>
+<LI><A HREF="readline.html#IDX61">yank (C-y)</A>
+<LI><A HREF="readline.html#IDX38">yank-last-arg (M-., M-_)</A>
+<LI><A HREF="readline.html#IDX37">yank-nth-arg (M-C-y)</A>
+<LI><A HREF="readline.html#IDX62">yank-pop (M-y)</A>
+</DIR>
+
+</P>
+<P><HR><P>
+This document was generated on 3 June 1997 using the
+<A HREF="http://wwwcn.cern.ch/dci/texi2html/">texi2html</A>
+translator version 1.51.</P>
+</BODY>
+</HTML>
diff --git a/doc/readline.info b/doc/readline.info
index f4882e9..3e44460 100644
--- a/doc/readline.info
+++ b/doc/readline.info
@@ -1,5 +1,5 @@
This is Info file readline.info, produced by Makeinfo-1.55 from the
-input file rlman.texinfo.
+input file /usr/homes/chet/src/bash/readline-2.1/doc/rlman.texinfo.
This document describes the GNU Readline Library, a utility which
aids in the consistency of user interface across discrete programs that
@@ -22,53 +22,2744 @@ versions, except that this permission notice may be stated in a
translation approved by the Foundation.

-Indirect:
-readline.info-1: 1000
-readline.info-2: 50467
+File: readline.info, Node: Top, Next: Command Line Editing, Prev: (DIR), Up: (DIR)
+
+GNU Readline Library
+********************
+
+ This document describes the GNU Readline Library, a utility which
+aids in the consistency of user interface across discrete programs that
+need to provide a command line interface.
+
+* Menu:
+
+* Command Line Editing:: GNU Readline User's Manual.
+* Programming with GNU Readline:: GNU Readline Programmer's Manual.
+* Concept Index:: Index of concepts described in this manual.
+* Function and Variable Index:: Index of externally visible functions
+ and variables.
+
+
+File: readline.info, Node: Command Line Editing, Next: Programming with GNU Readline, Prev: Top, Up: Top
+
+Command Line Editing
+********************
+
+ This chapter describes the basic features of the GNU command line
+editing interface.
+
+* Menu:
+
+* Introduction and Notation:: Notation used in this text.
+* Readline Interaction:: The minimum set of commands for editing a line.
+* Readline Init File:: Customizing Readline from a user's view.
+* Bindable Readline Commands:: A description of most of the Readline commands
+ available for binding
+* Readline vi Mode:: A short description of how to make Readline
+ behave like the vi editor.
+
+
+File: readline.info, Node: Introduction and Notation, Next: Readline Interaction, Up: Command Line Editing
+
+Introduction to Line Editing
+============================
+
+ The following paragraphs describe the notation used to represent
+keystrokes.
+
+ The text C-k is read as `Control-K' and describes the character
+produced when the k key is pressed while the Control key is depressed.
+
+ The text M-k is read as `Meta-K' and describes the character
+produced when the meta key (if you have one) is depressed, and the k
+key is pressed. If you do not have a meta key, the identical keystroke
+can be generated by typing ESC first, and then typing k. Either
+process is known as "metafying" the k key.
+
+ The text M-C-k is read as `Meta-Control-k' and describes the
+character produced by "metafying" C-k.
+
+ In addition, several keys have their own names. Specifically, DEL,
+ESC, LFD, SPC, RET, and TAB all stand for themselves when seen in this
+text, or in an init file (*note Readline Init File::.).
+
+
+File: readline.info, Node: Readline Interaction, Next: Readline Init File, Prev: Introduction and Notation, Up: Command Line Editing
+
+Readline Interaction
+====================
+
+ Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled. The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line. Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections. Then, when you are satisfied with
+the line, you simply press RETURN. You do not have to be at the end of
+the line to press RETURN; the entire line is accepted regardless of the
+location of the cursor within the line.
+
+* Menu:
+
+* Readline Bare Essentials:: The least you need to know about Readline.
+* Readline Movement Commands:: Moving about the input line.
+* Readline Killing Commands:: How to delete text, and how to get it back!
+* Readline Arguments:: Giving numeric arguments to commands.
+* Searching:: Searching through previous lines.
+
+
+File: readline.info, Node: Readline Bare Essentials, Next: Readline Movement Commands, Up: Readline Interaction
+
+Readline Bare Essentials
+------------------------
+
+ In order to enter characters into the line, simply type them. The
+typed character appears where the cursor was, and then the cursor moves
+one space to the right. If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+
+ Sometimes you may miss typing a character that you wanted to type,
+and not notice your error until you have typed several other
+characters. In that case, you can type C-b to move the cursor to the
+left, and then correct your mistake. Afterwards, you can move the
+cursor to the right with C-f.
+
+ When you add text in the middle of a line, you will notice that
+characters to the right of the cursor are `pushed over' to make room
+for the text that you have inserted. Likewise, when you delete text
+behind the cursor, characters to the right of the cursor are `pulled
+back' to fill in the blank space created by the removal of the text. A
+list of the basic bare essentials for editing the text of an input line
+follows.
+
+C-b
+ Move back one character.
+
+C-f
+ Move forward one character.
+
+DEL
+ Delete the character to the left of the cursor.
+
+C-d
+ Delete the character underneath the cursor.
+
+Printing characters
+ Insert the character into the line at the cursor.
+
+C-_
+ Undo the last thing that you did. You can undo all the way back
+ to an empty line.
+
+
+File: readline.info, Node: Readline Movement Commands, Next: Readline Killing Commands, Prev: Readline Bare Essentials, Up: Readline Interaction
+
+Readline Movement Commands
+--------------------------
+
+ The above table describes the most basic possible keystrokes that
+you need in order to do editing of the input line. For your
+convenience, many other commands have been added in addition to C-b,
+C-f, C-d, and DEL. Here are some commands for moving more rapidly
+about the line.
+
+C-a
+ Move to the start of the line.
+
+C-e
+ Move to the end of the line.
+
+M-f
+ Move forward a word.
+
+M-b
+ Move backward a word.
+
+C-l
+ Clear the screen, reprinting the current line at the top.
+
+ Notice how C-f moves forward a character, while M-f moves forward a
+word. It is a loose convention that control keystrokes operate on
+characters while meta keystrokes operate on words.
+
+
+File: readline.info, Node: Readline Killing Commands, Next: Readline Arguments, Prev: Readline Movement Commands, Up: Readline Interaction
+
+Readline Killing Commands
+-------------------------
+
+ "Killing" text means to delete the text from the line, but to save
+it away for later use, usually by "yanking" (re-inserting) it back into
+the line. If the description for a command says that it `kills' text,
+then you can be sure that you can get the text back in a different (or
+the same) place later.
+
+ When you use a kill command, the text is saved in a "kill-ring".
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all. The kill ring is not line
+specific; the text that you killed on a previously typed line is
+available to be yanked back later, when you are typing another line.
+
+ Here is the list of commands for killing text.
+
+C-k
+ Kill the text from the current cursor position to the end of the
+ line.
+
+M-d
+ Kill from the cursor to the end of the current word, or if between
+ words, to the end of the next word.
+
+M-DEL
+ Kill from the cursor the start of the previous word, or if between
+ words, to the start of the previous word.
+
+C-w
+ Kill from the cursor to the previous whitespace. This is
+ different than M-DEL because the word boundaries differ.
+
+ And, here is how to "yank" the text back into the line. Yanking
+means to copy the most-recently-killed text from the kill buffer.
+
+C-y
+ Yank the most recently killed text back into the buffer at the
+ cursor.
+
+M-y
+ Rotate the kill-ring, and yank the new top. You can only do this
+ if the prior command is C-y or M-y.
+
+
+File: readline.info, Node: Readline Arguments, Next: Searching, Prev: Readline Killing Commands, Up: Readline Interaction
+
+Readline Arguments
+------------------
+
+ You can pass numeric arguments to Readline commands. Sometimes the
+argument acts as a repeat count, other times it is the sign of the
+argument that is significant. If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction. For example, to kill text back to the
+start of the line, you might type `M-- C-k'.
+
+ The general way to pass numeric arguments to a command is to type
+meta digits before the command. If the first `digit' you type is a
+minus sign (-), then the sign of the argument will be negative. Once
+you have typed one meta digit to get the argument started, you can type
+the remainder of the digits, and then the command. For example, to give
+the C-d command an argument of 10, you could type `M-1 0 C-d'.
+
+
+File: readline.info, Node: Searching, Prev: Readline Arguments, Up: Readline Interaction
+
+Searching for Commands in the History
+-------------------------------------
+
+ Readline provides commands for searching through the command history
+for lines containing a specified string. There are two search modes:
+iNCREMENTAL and NON-INCREMENTAL.
+
+ Incremental searches begin before the user has finished typing the
+search string. As each character of the search string is typed,
+readline displays the next entry from the history matching the string
+typed so far. An incremental search requires only as many characters
+as needed to find the desired history entry. The Escape character is
+used to terminate an incremental search. Control-J will also terminate
+the search. Control-G will abort an incremental search and restore the
+original line. When the search is terminated, the history entry
+containing the search string becomes the current line. To find other
+matching entries in the history list, type Control-S or Control-R as
+appropriate. This will search backward or forward in the history for
+the next entry matching the search string typed so far. Any other key
+sequence bound to a readline command will terminate the search and
+execute that command. For instance, a `newline' will terminate the
+search and accept the line, thereby executing the command from the
+history list.
+
+ Non-incremental searches read the entire search string before
+starting to search for matching history lines. The search string may be
+typed by the user or part of the contents of the current line.
+
+
+File: readline.info, Node: Readline Init File, Next: Bindable Readline Commands, Prev: Readline Interaction, Up: Command Line Editing
+
+Readline Init File
+==================
+
+ Although the Readline library comes with a set of `emacs'-like
+keybindings installed by default, it is possible that you would like to
+use a different set of keybindings. You can customize programs that
+use Readline by putting commands in an "inputrc" file in your home
+directory. The name of this file is taken from the value of the
+environment variable `INPUTRC'. If that variable is unset, the default
+is `~/.inputrc'.
+
+ When a program which uses the Readline library starts up, the init
+file is read, and the key bindings are set.
+
+ In addition, the `C-x C-r' command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+
+* Menu:
+
+* Readline Init File Syntax:: Syntax for the commands in the inputrc file.
+
+* Conditional Init Constructs:: Conditional key bindings in the inputrc file.
+
+* Sample Init File:: An example inputrc file.
+
+
+File: readline.info, Node: Readline Init File Syntax, Next: Conditional Init Constructs, Up: Readline Init File
+
+Readline Init File Syntax
+-------------------------
+
+ There are only a few basic constructs allowed in the Readline init
+file. Blank lines are ignored. Lines beginning with a `#' are
+comments. Lines beginning with a `$' indicate conditional constructs
+(*note Conditional Init Constructs::.). Other lines denote variable
+settings and key bindings.
+
+Variable Settings
+ You can change the state of a few variables in Readline by using
+ the `set' command within the init file. Here is how you would
+ specify that you wish to use `vi' line editing commands:
+
+ set editing-mode vi
+
+ Right now, there are only a few variables which can be set; so
+ few, in fact, that we just list them here:
+
+ `bell-style'
+ Controls what happens when Readline wants to ring the
+ terminal bell. If set to `none', Readline never rings the
+ bell. If set to `visible', Readline uses a visible bell if
+ one is available. If set to `audible' (the default),
+ Readline attempts to ring the terminal's bell.
+
+ `comment-begin'
+ The string to insert at the beginning of the line when the
+ `insert-comment' command is executed. The default value is
+ `"#"'.
+
+ `completion-query-items'
+ The number of possible completions that determines when the
+ user is asked whether he wants to see the list of
+ possibilities. If the number of possible completions is
+ greater than this value, Readline will ask the user whether
+ or not he wishes to view them; otherwise, they are simply
+ listed. The default limit is `100'.
+
+ `convert-meta'
+ If set to `on', Readline will convert characters with the
+ eigth bit set to an ASCII key sequence by stripping the eigth
+ bit and prepending an ESC character, converting them to a
+ meta-prefixed key sequence. The default value is `on'.
+
+ `disable-completion'
+ If set to `On', readline will inhibit word completion.
+ Completion characters will be inserted into the line as if
+ they had been mapped to `self-insert'. The default is `off'.
+
+ `editing-mode'
+ The `editing-mode' variable controls which editing mode you
+ are using. By default, Readline starts up in Emacs editing
+ mode, where the keystrokes are most similar to Emacs. This
+ variable can be set to either `emacs' or `vi'.
+
+ `enable-keypad'
+ When set to `on', readline will try to enable the application
+ keypad when it is called. Some systems need this to enable
+ the arrow keys. The default is `off'.
+
+ `expand-tilde'
+ If set to `on', tilde expansion is performed when Readline
+ attempts word completion. The default is `off'.
+
+ `horizontal-scroll-mode'
+ This variable can be set to either `on' or `off'. Setting it
+ to `on' means that the text of the lines that you edit will
+ scroll horizontally on a single screen line when they are
+ longer than the width of the screen, instead of wrapping onto
+ a new screen line. By default, this variable is set to `off'.
+
+ `keymap'
+ Sets Readline's idea of the current keymap for key binding
+ commands. Acceptable `keymap' names are `emacs',
+ `emacs-standard', `emacs-meta', `emacs-ctlx', `vi',
+ `vi-command', and `vi-insert'. `vi' is equivalent to
+ `vi-command'; `emacs' is equivalent to `emacs-standard'. The
+ default value is `emacs'. The value of the `editing-mode'
+ variable also affects the default keymap.
+
+ `mark-directories'
+ If set to `on', completed directory names have a slash
+ appended. The default is `on'.
+
+ `mark-modified-lines'
+ This variable, when set to `on', says to display an asterisk
+ (`*') at the start of history lines which have been modified.
+ This variable is `off' by default.
+
+ `input-meta'
+ If set to `on', Readline will enable eight-bit input (it will
+ not strip the eighth bit from the characters it reads),
+ regardless of what the terminal claims it can support. The
+ default value is `off'. The name `meta-flag' is a synonym
+ for this variable.
+
+ `output-meta'
+ If set to `on', Readline will display characters with the
+ eighth bit set directly rather than as a meta-prefixed escape
+ sequence. The default is `off'.
+
+ `show-all-if-ambiguous'
+ This alters the default behavior of the completion functions.
+ If set to `on', words which have more than one possible
+ completion cause the matches to be listed immediately instead
+ of ringing the bell. The default value is `off'.
+
+ `visible-stats'
+ If set to `on', a character denoting a file's type is
+ appended to the filename when listing possible completions.
+ The default is `off'.
+
+Key Bindings
+ The syntax for controlling key bindings in the init file is
+ simple. First you have to know the name of the command that you
+ want to change. The following pages contain tables of the command
+ name, the default keybinding, and a short description of what the
+ command does.
+
+ Once you know the name of the command, simply place the name of
+ the key you wish to bind the command to, a colon, and then the
+ name of the command on a line in the init file. The name of the
+ key can be expressed in different ways, depending on which is most
+ comfortable for you.
+
+ KEYNAME: FUNCTION-NAME or MACRO
+ KEYNAME is the name of a key spelled out in English. For
+ example:
+ Control-u: universal-argument
+ Meta-Rubout: backward-kill-word
+ Control-o: "> output"
+
+ In the above example, `C-u' is bound to the function
+ `universal-argument', and `C-o' is bound to run the macro
+ expressed on the right hand side (that is, to insert the text
+ `> output' into the line).
+
+ "KEYSEQ": FUNCTION-NAME or MACRO
+ KEYSEQ differs from KEYNAME above in that strings denoting an
+ entire key sequence can be specified, by placing the key
+ sequence in double quotes. Some GNU Emacs style key escapes
+ can be used, as in the following example, but the special
+ character names are not recognized.
+
+ "\C-u": universal-argument
+ "\C-x\C-r": re-read-init-file
+ "\e[11~": "Function Key 1"
+
+ In the above example, `C-u' is bound to the function
+ `universal-argument' (just as it was in the first example),
+ `C-x C-r' is bound to the function `re-read-init-file', and
+ `ESC [ 1 1 ~' is bound to insert the text `Function Key 1'.
+ The following escape sequences are available when specifying
+ key sequences:
+
+ ``\C-''
+ control prefix
+
+ ``\M-''
+ meta prefix
+
+ ``\e''
+ an escape character
+
+ ``\\''
+ backslash
+
+ ``\"''
+ "
+
+ ``\'''
+ '
+
+ When entering the text of a macro, single or double quotes
+ should be used to indicate a macro definition. Unquoted text
+ is assumed to be a function name. Backslash will quote any
+ character in the macro text, including `"' and `''. For
+ example, the following binding will make `C-x \' insert a
+ single `\' into the line:
+ "\C-x\\": "\\"
+
+
+File: readline.info, Node: Conditional Init Constructs, Next: Sample Init File, Prev: Readline Init File Syntax, Up: Readline Init File
+
+Conditional Init Constructs
+---------------------------
+
+ Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key bindings
+and variable settings to be performed as the result of tests. There
+are three parser directives used.
+
+`$if'
+ The `$if' construct allows bindings to be made based on the
+ editing mode, the terminal being used, or the application using
+ Readline. The text of the test extends to the end of the line; no
+ characters are required to isolate it.
+
+ `mode'
+ The `mode=' form of the `$if' directive is used to test
+ whether Readline is in `emacs' or `vi' mode. This may be
+ used in conjunction with the `set keymap' command, for
+ instance, to set bindings in the `emacs-standard' and
+ `emacs-ctlx' keymaps only if Readline is starting out in
+ `emacs' mode.
+
+ `term'
+ The `term=' form may be used to include terminal-specific key
+ bindings, perhaps to bind the key sequences output by the
+ terminal's function keys. The word on the right side of the
+ `=' is tested against the full name of the terminal and the
+ portion of the terminal name before the first `-'. This
+ allows `sun' to match both `sun' and `sun-cmd', for instance.
+
+ `application'
+ The APPLICATION construct is used to include
+ application-specific settings. Each program using the
+ Readline library sets the APPLICATION NAME, and you can test
+ for it. This could be used to bind key sequences to
+ functions useful for a specific program. For instance, the
+ following command adds a key sequence that quotes the current
+ or previous word in Bash:
+ $if Bash
+ # Quote the current or previous word
+ "\C-xq": "\eb\"\ef\""
+ $endif
+
+`$endif'
+ This command, as you saw in the previous example, terminates an
+ `$if' command.
+
+`$else'
+ Commands in this branch of the `$if' directive are executed if the
+ test fails.
+
+
+File: readline.info, Node: Sample Init File, Prev: Conditional Init Constructs, Up: Readline Init File
+
+Sample Init File
+----------------
+
+ Here is an example of an inputrc file. This illustrates key
+binding, variable assignment, and conditional syntax.
+
+
+ # This file controls the behaviour of line input editing for
+ # programs that use the Gnu Readline library. Existing programs
+ # include FTP, Bash, and Gdb.
+ #
+ # You can re-read the inputrc file with C-x C-r.
+ # Lines beginning with '#' are comments.
+ #
+ # Set various bindings for emacs mode.
+
+ set editing-mode emacs
+
+ $if mode=emacs
+
+ Meta-Control-h: backward-kill-word Text after the function name is ignored
+
+ #
+ # Arrow keys in keypad mode
+ #
+ #"\M-OD": backward-char
+ #"\M-OC": forward-char
+ #"\M-OA": previous-history
+ #"\M-OB": next-history
+ #
+ # Arrow keys in ANSI mode
+ #
+ "\M-[D": backward-char
+ "\M-[C": forward-char
+ "\M-[A": previous-history
+ "\M-[B": next-history
+ #
+ # Arrow keys in 8 bit keypad mode
+ #
+ #"\M-\C-OD": backward-char
+ #"\M-\C-OC": forward-char
+ #"\M-\C-OA": previous-history
+ #"\M-\C-OB": next-history
+ #
+ # Arrow keys in 8 bit ANSI mode
+ #
+ #"\M-\C-[D": backward-char
+ #"\M-\C-[C": forward-char
+ #"\M-\C-[A": previous-history
+ #"\M-\C-[B": next-history
+
+ C-q: quoted-insert
+
+ $endif
+
+ # An old-style binding. This happens to be the default.
+ TAB: complete
+
+ # Macros that are convenient for shell interaction
+ $if Bash
+ # edit the path
+ "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+ # prepare to type a quoted word -- insert open and close double quotes
+ # and move to just after the open quote
+ "\C-x\"": "\"\"\C-b"
+ # insert a backslash (testing backslash escapes in sequences and macros)
+ "\C-x\\": "\\"
+ # Quote the current or previous word
+ "\C-xq": "\eb\"\ef\""
+ # Add a binding to refresh the line, which is unbound
+ "\C-xr": redraw-current-line
+ # Edit variable on current line.
+ "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+ $endif
+
+ # use a visible bell if one is available
+ set bell-style visible
+
+ # don't strip characters to 7 bits when reading
+ set input-meta on
+
+ # allow iso-latin1 characters to be inserted rather than converted to
+ # prefix-meta sequences
+ set convert-meta off
+
+ # display characters with the eighth bit set directly rather than
+ # as meta-prefixed characters
+ set output-meta on
+
+ # if there are more than 150 possible completions for a word, ask the
+ # user if he wants to see all of them
+ set completion-query-items 150
+
+ # For FTP
+ $if Ftp
+ "\C-xg": "get \M-?"
+ "\C-xt": "put \M-?"
+ "\M-.": yank-last-arg
+ $endif
+
+
+File: readline.info, Node: Bindable Readline Commands, Next: Readline vi Mode, Prev: Readline Init File, Up: Command Line Editing
+
+Bindable Readline Commands
+==========================
+
+* Menu:
+
+* Commands For Moving:: Moving about the line.
+* Commands For History:: Getting at previous lines.
+* Commands For Text:: Commands for changing text.
+* Commands For Killing:: Commands for killing and yanking.
+* Numeric Arguments:: Specifying numeric arguments, repeat counts.
+* Commands For Completion:: Getting Readline to do the typing for you.
+* Keyboard Macros:: Saving and re-executing typed characters
+* Miscellaneous Commands:: Other miscellaneous commands.
+
+ This section describes Readline commands that may be bound to key
+sequences.
+
+
+File: readline.info, Node: Commands For Moving, Next: Commands For History, Up: Bindable Readline Commands
+
+Commands For Moving
+-------------------
+
+`beginning-of-line (C-a)'
+ Move to the start of the current line.
+
+`end-of-line (C-e)'
+ Move to the end of the line.
+
+`forward-char (C-f)'
+ Move forward a character.
+
+`backward-char (C-b)'
+ Move back a character.
+
+`forward-word (M-f)'
+ Move forward to the end of the next word. Words are composed of
+ letters and digits.
+
+`backward-word (M-b)'
+ Move back to the start of this, or the previous, word. Words are
+ composed of letters and digits.
+
+`clear-screen (C-l)'
+ Clear the screen and redraw the current line, leaving the current
+ line at the top of the screen.
+
+`redraw-current-line ()'
+ Refresh the current line. By default, this is unbound.
+
+
+File: readline.info, Node: Commands For History, Next: Commands For Text, Prev: Commands For Moving, Up: Bindable Readline Commands
+
+Commands For Manipulating The History
+-------------------------------------
+
+`accept-line (Newline, Return)'
+ Accept the line regardless of where the cursor is. If this line is
+ non-empty, add it to the history list. If this line was a history
+ line, then restore the history line to its original state.
+
+`previous-history (C-p)'
+ Move `up' through the history list.
+
+`next-history (C-n)'
+ Move `down' through the history list.
+
+`beginning-of-history (M-<)'
+ Move to the first line in the history.
+
+`end-of-history (M->)'
+ Move to the end of the input history, i.e., the line you are
+ entering.
+
+`reverse-search-history (C-r)'
+ Search backward starting at the current line and moving `up'
+ through the history as necessary. This is an incremental search.
+
+`forward-search-history (C-s)'
+ Search forward starting at the current line and moving `down'
+ through the the history as necessary. This is an incremental
+ search.
+
+`non-incremental-reverse-search-history (M-p)'
+ Search backward starting at the current line and moving `up'
+ through the history as necessary using a non-incremental search
+ for a string supplied by the user.
+
+`non-incremental-forward-search-history (M-n)'
+ Search forward starting at the current line and moving `down'
+ through the the history as necessary using a non-incremental search
+ for a string supplied by the user.
+
+`history-search-forward ()'
+ Search forward through the history for the string of characters
+ between the start of the current line and the current cursor
+ position (the `point'). This is a non-incremental search. By
+ default, this command is unbound.
+
+`history-search-backward ()'
+ Search backward through the history for the string of characters
+ between the start of the current line and the point. This is a
+ non-incremental search. By default, this command is unbound.
+
+`yank-nth-arg (M-C-y)'
+ Insert the first argument to the previous command (usually the
+ second word on the previous line). With an argument N, insert the
+ Nth word from the previous command (the words in the previous
+ command begin with word 0). A negative argument inserts the Nth
+ word from the end of the previous command.
+
+`yank-last-arg (M-., M-_)'
+ Insert last argument to the previous command (the last word of the
+ previous history entry). With an argument, behave exactly like
+ `yank-nth-arg'.
+
+
+File: readline.info, Node: Commands For Text, Next: Commands For Killing, Prev: Commands For History, Up: Bindable Readline Commands
+
+Commands For Changing Text
+--------------------------
+
+`delete-char (C-d)'
+ Delete the character under the cursor. If the cursor is at the
+ beginning of the line, there are no characters in the line, and
+ the last character typed was not `C-d', then return `EOF'.
+
+`backward-delete-char (Rubout)'
+ Delete the character behind the cursor. A numeric arg says to kill
+ the characters instead of deleting them.
+
+`quoted-insert (C-q, C-v)'
+ Add the next character that you type to the line verbatim. This is
+ how to insert key sequences like C-q, for example.
+
+`tab-insert (M-TAB)'
+ Insert a tab character.
+
+`self-insert (a, b, A, 1, !, ...)'
+ Insert yourself.
+
+`transpose-chars (C-t)'
+ Drag the character before the cursor forward over the character at
+ the cursor, moving the cursor forward as well. If the insertion
+ point is at the end of the line, then this transposes the last two
+ characters of the line. Negative argumentss don't work.
+
+`transpose-words (M-t)'
+ Drag the word behind the cursor past the word in front of the
+ cursor moving the cursor over that word as well.
+
+`upcase-word (M-u)'
+ Uppercase the current (or following) word. With a negative
+ argument, do the previous word, but do not move the cursor.
+
+`downcase-word (M-l)'
+ Lowercase the current (or following) word. With a negative
+ argument, do the previous word, but do not move the cursor.
+
+`capitalize-word (M-c)'
+ Capitalize the current (or following) word. With a negative
+ argument, do the previous word, but do not move the cursor.
+
+
+File: readline.info, Node: Commands For Killing, Next: Numeric Arguments, Prev: Commands For Text, Up: Bindable Readline Commands
+
+Killing And Yanking
+-------------------
+
+`kill-line (C-k)'
+ Kill the text from the current cursor position to the end of the
+ line.
+
+`backward-kill-line (C-x Rubout)'
+ Kill backward to the beginning of the line.
+
+`unix-line-discard (C-u)'
+ Kill backward from the cursor to the beginning of the current line.
+ Save the killed text on the kill-ring.
+
+`kill-whole-line ()'
+ Kill all characters on the current line, no matter where the
+ cursor is. By default, this is unbound.
+
+`kill-word (M-d)'
+ Kill from the cursor to the end of the current word, or if between
+ words, to the end of the next word. Word boundaries are the same
+ as `forward-word'.
+
+`backward-kill-word (M-DEL)'
+ Kill the word behind the cursor. Word boundaries are the same as
+ `backward-word'.
+
+`unix-word-rubout (C-w)'
+ Kill the word behind the cursor, using white space as a word
+ boundary. The killed text is saved on the kill-ring.
+
+`delete-horizontal-space ()'
+ Delete all spaces and tabs around point. By default, this is
+ unbound.
+
+`kill-region ()'
+ Kill the text between the point and the *mark* (saved cursor
+ position. This text is referred to as the REGION. By default,
+ this command is unbound.
+
+`copy-region-as-kill ()'
+ Copy the text in the region to the kill buffer, so you can yank it
+ right away. By default, this command is unbound.
+
+`copy-backward-word ()'
+ Copy the word before point to the kill buffer. By default, this
+ command is unbound.
+
+`copy-forward-word ()'
+ Copy the word following point to the kill buffer. By default,
+ this command is unbound.
+
+`yank (C-y)'
+ Yank the top of the kill ring into the buffer at the current
+ cursor position.
+
+`yank-pop (M-y)'
+ Rotate the kill-ring, and yank the new top. You can only do this
+ if the prior command is yank or yank-pop.
+
+
+File: readline.info, Node: Numeric Arguments, Next: Commands For Completion, Prev: Commands For Killing, Up: Bindable Readline Commands
+
+Specifying Numeric Arguments
+----------------------------
+
+`digit-argument (M-0, M-1, ... M--)'
+ Add this digit to the argument already accumulating, or start a new
+ argument. M- starts a negative argument.
+
+`universal-argument ()'
+ This is another way to specify an argument. If this command is
+ followed by one or more digits, optionally with a leading minus
+ sign, those digits define the argument. If the command is
+ followed by digits, executing `universal-argument' again ends the
+ numeric argument, but is otherwise ignored. As a special case, if
+ this command is immediately followed by a character that is
+ neither a digit or minus sign, the argument count for the next
+ command is multiplied by four. The argument count is initially
+ one, so executing this function the first time makes the argument
+ count four, a second time makes the argument count sixteen, and so
+ on. By default, this is not bound to a key.
+
+
+File: readline.info, Node: Commands For Completion, Next: Keyboard Macros, Prev: Numeric Arguments, Up: Bindable Readline Commands
+
+Letting Readline Type For You
+-----------------------------
+
+`complete (TAB)'
+ Attempt to do completion on the text before the cursor. This is
+ application-specific. Generally, if you are typing a filename
+ argument, you can do filename completion; if you are typing a
+ command, you can do command completion, if you are typing in a
+ symbol to GDB, you can do symbol name completion, if you are
+ typing in a variable to Bash, you can do variable name completion,
+ and so on.
+
+`possible-completions (M-?)'
+ List the possible completions of the text before the cursor.
+
+`insert-completions (M-*)'
+ Insert all completions of the text before point that would have
+ been generated by `possible-completions'.
+
+
+File: readline.info, Node: Keyboard Macros, Next: Miscellaneous Commands, Prev: Commands For Completion, Up: Bindable Readline Commands
+
+Keyboard Macros
+---------------
+
+`start-kbd-macro (C-x ()'
+ Begin saving the characters typed into the current keyboard macro.
+
+`end-kbd-macro (C-x ))'
+ Stop saving the characters typed into the current keyboard macro
+ and save the definition.
+
+`call-last-kbd-macro (C-x e)'
+ Re-execute the last keyboard macro defined, by making the
+ characters in the macro appear as if typed at the keyboard.
+
+
+File: readline.info, Node: Miscellaneous Commands, Prev: Keyboard Macros, Up: Bindable Readline Commands
+
+Some Miscellaneous Commands
+---------------------------
+
+`re-read-init-file (C-x C-r)'
+ Read in the contents of the inputrc file, and incorporate any
+ bindings or variable assignments found there.
+
+`abort (C-g)'
+ Abort the current editing command and ring the terminal's bell
+ (subject to the setting of `bell-style').
+
+`do-uppercase-version (M-a, M-b, M-X, ...)'
+ If the metafied character X is lowercase, run the command that is
+ bound to the corresponding uppercase character.
+
+`prefix-meta (ESC)'
+ Make the next character that you type be metafied. This is for
+ people without a meta key. Typing `ESC f' is equivalent to typing
+ `M-f'.
+
+`undo (C-_, C-x C-u)'
+ Incremental undo, separately remembered for each line.
+
+`revert-line (M-r)'
+ Undo all changes made to this line. This is like typing the `undo'
+ command enough times to get back to the beginning.
+
+`tilde-expand (M-~)'
+ Perform tilde expansion on the current word.
+
+`set-mark (C-@)'
+ Set the mark to the current point. If a numeric argument is
+ supplied, the mark is set to that position.
+
+`exchange-point-and-mark (C-x C-x)'
+ Swap the point with the mark. The current cursor position is set
+ to the saved position, and the old cursor position is saved as the
+ mark.
+
+`character-search (C-])'
+ A character is read and point is moved to the next occurrence of
+ that character. A negative count searches for previous
+ occurrences.
+
+`character-search-backward (M-C-])'
+ A character is read and point is moved to the previous occurrence
+ of that character. A negative count searches for subsequent
+ occurrences.
+
+`insert-comment (M-#)'
+ The value of the `comment-begin' variable is inserted at the
+ beginning of the current line, and the line is accepted as if a
+ newline had been typed.
+
+`dump-functions ()'
+ Print all of the functions and their key bindings to the readline
+ output stream. If a numeric argument is supplied, the output is
+ formatted in such a way that it can be made part of an INPUTRC
+ file. This command is unbound by default.
+
+`dump-variables ()'
+ Print all of the settable variables and their values to the
+ readline output stream. If a numeric argument is supplied, the
+ output is formatted in such a way that it can be made part of an
+ INPUTRC file. This command is unbound by default.
+
+`dump-macros ()'
+ Print all of the readline key sequences bound to macros and the
+ strings they ouput. If a numeric argument is supplied, the output
+ is formatted in such a way that it can be made part of an INPUTRC
+ file. This command is unbound by default.
+
+
+File: readline.info, Node: Readline vi Mode, Prev: Bindable Readline Commands, Up: Command Line Editing
+
+Readline vi Mode
+================
+
+ While the Readline library does not have a full set of `vi' editing
+functions, it does contain enough to allow simple editing of the line.
+The Readline `vi' mode behaves as specified in the POSIX 1003.2
+standard.
+
+ In order to switch interactively between `emacs' and `vi' editing
+modes, use the command M-C-j (toggle-editing-mode). The Readline
+default is `emacs' mode.
+
+ When you enter a line in `vi' mode, you are already placed in
+`insertion' mode, as if you had typed an `i'. Pressing ESC switches
+you into `command' mode, where you can edit the text of the line with
+the standard `vi' movement keys, move to previous history lines with
+`k' and subsequent lines with `j', and so forth.
+
+ This document describes the GNU Readline Library, a utility for
+aiding in the consitency of user interface across discrete programs
+that need to provide a command line interface.
+
+ Copyright (C) 1988, 1994, 1996 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice pare
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Foundation.
+
+
+File: readline.info, Node: Programming with GNU Readline, Next: Concept Index, Prev: Command Line Editing, Up: Top
+
+Programming with GNU Readline
+*****************************
+
+ This chapter describes the interface between the GNU Readline
+Library and other programs. If you are a programmer, and you wish to
+include the features found in GNU Readline such as completion, line
+editing, and interactive history manipulation in your own programs,
+this section is for you.
+
+* Menu:
+
+* Basic Behavior:: Using the default behavior of Readline.
+* Custom Functions:: Adding your own functions to Readline.
+* Readline Variables:: Variables accessible to custom
+ functions.
+* Readline Convenience Functions:: Functions which Readline supplies to
+ aid in writing your own
+* Custom Completers:: Supplanting or supplementing Readline's
+ completion functions.
+
+
+File: readline.info, Node: Basic Behavior, Next: Custom Functions, Up: Programming with GNU Readline
+
+Basic Behavior
+==============
+
+ Many programs provide a command line interface, such as `mail',
+`ftp', and `sh'. For such programs, the default behaviour of Readline
+is sufficient. This section describes how to use Readline in the
+simplest way possible, perhaps to replace calls in your code to
+`gets()' or `fgets ()'.
+
+ The function `readline ()' prints a prompt and then reads and returns
+a single line of text from the user. The line `readline' returns is
+allocated with `malloc ()'; you should `free ()' the line when you are
+done with it. The declaration for `readline' in ANSI C is
+
+ `char *readline (char *PROMPT);'
+
+So, one might say
+ `char *line = readline ("Enter a line: ");'
+
+in order to read a line of text from the user. The line returned has
+the final newline removed, so only the text remains.
+
+ If `readline' encounters an `EOF' while reading the line, and the
+line is empty at that point, then `(char *)NULL' is returned.
+Otherwise, the line is ended just as if a newline had been typed.
+
+ If you want the user to be able to get at the line later, (with C-p
+for example), you must call `add_history ()' to save the line away in a
+"history" list of such lines.
+
+ `add_history (line)';
+
+For full details on the GNU History Library, see the associated manual.
+
+ It is preferable to avoid saving empty lines on the history list,
+since users rarely have a burning need to reuse a blank line. Here is
+a function which usefully replaces the standard `gets ()' library
+function, and has the advantage of no static buffer to overflow:
+
+ /* A static variable for holding the line. */
+ static char *line_read = (char *)NULL;
+
+ /* Read a string, and return a pointer to it. Returns NULL on EOF. */
+ char *
+ rl_gets ()
+ {
+ /* If the buffer has already been allocated, return the memory
+ to the free pool. */
+ if (line_read)
+ {
+ free (line_read);
+ line_read = (char *)NULL;
+ }
+
+ /* Get a line from the user. */
+ line_read = readline ("");
+
+ /* If the line has any text in it, save it on the history. */
+ if (line_read && *line_read)
+ add_history (line_read);
+
+ return (line_read);
+ }
+
+ This function gives the user the default behaviour of TAB
+completion: completion on file names. If you do not want Readline to
+complete on filenames, you can change the binding of the TAB key with
+`rl_bind_key ()'.
+
+ `int rl_bind_key (int KEY, int (*FUNCTION)());'
+
+ `rl_bind_key ()' takes two arguments: KEY is the character that you
+want to bind, and FUNCTION is the address of the function to call when
+KEY is pressed. Binding TAB to `rl_insert ()' makes TAB insert itself.
+`rl_bind_key ()' returns non-zero if KEY is not a valid ASCII character
+code (between 0 and 255).
+
+ Thus, to disable the default TAB behavior, the following suffices:
+ `rl_bind_key ('\t', rl_insert);'
+
+ This code should be executed once at the start of your program; you
+might write a function called `initialize_readline ()' which performs
+this and other desired initializations, such as installing custom
+completers (*note Custom Completers::.).
+
+
+File: readline.info, Node: Custom Functions, Next: Readline Variables, Prev: Basic Behavior, Up: Programming with GNU Readline
+
+Custom Functions
+================
+
+ Readline provides many functions for manipulating the text of the
+line, but it isn't possible to anticipate the needs of all programs.
+This section describes the various functions and variables defined
+within the Readline library which allow a user program to add
+customized functionality to Readline.
+
+* Menu:
+
+* The Function Type:: C declarations to make code readable.
+* Function Writing:: Variables and calling conventions.
+
+
+File: readline.info, Node: The Function Type, Next: Function Writing, Up: Custom Functions
+
+The Function Type
+-----------------
+
+ For readabilty, we declare a new type of object, called "Function".
+A `Function' is a C function which returns an `int'. The type
+declaration for `Function' is:
+
+`typedef int Function ();'
+
+ The reason for declaring this new type is to make it easier to write
+code describing pointers to C functions. Let us say we had a variable
+called FUNC which was a pointer to a function. Instead of the classic
+C declaration
+
+ `int (*)()func;'
+
+we may write
+
+ `Function *func;'
+
+Similarly, there are
+
+ typedef void VFunction ();
+ typedef char *CPFunction (); and
+ typedef char **CPPFunction ();
+
+for functions returning no value, `pointer to char', and `pointer to
+pointer to char', respectively.
+
+
+File: readline.info, Node: Function Writing, Prev: The Function Type, Up: Custom Functions
+
+Writing a New Function
+----------------------
+
+ In order to write new functions for Readline, you need to know the
+calling conventions for keyboard-invoked functions, and the names of the
+variables that describe the current state of the line read so far.
+
+ The calling sequence for a command `foo' looks like
+
+ `foo (int count, int key)'
+
+where COUNT is the numeric argument (or 1 if defaulted) and KEY is the
+key that invoked this function.
+
+ It is completely up to the function as to what should be done with
+the numeric argument. Some functions use it as a repeat count, some as
+a flag, and others to choose alternate behavior (refreshing the current
+line as opposed to refreshing the screen, for example). Some choose to
+ignore it. In general, if a function uses the numeric argument as a
+repeat count, it should be able to do something useful with both
+negative and positive arguments. At the very least, it should be aware
+that it can be passed a negative argument.
+
+
+File: readline.info, Node: Readline Variables, Next: Readline Convenience Functions, Prev: Custom Functions, Up: Programming with GNU Readline
+
+Readline Variables
+==================
+
+ These variables are available to function writers.
+
+ - Variable: char * rl_line_buffer
+ This is the line gathered so far. You are welcome to modify the
+ contents of the line, but see *Note Allowing Undoing::.
+
+ - Variable: int rl_point
+ The offset of the current cursor position in `rl_line_buffer' (the
+ *point*).
+
+ - Variable: int rl_end
+ The number of characters present in `rl_line_buffer'. When
+ `rl_point' is at the end of the line, `rl_point' and `rl_end' are
+ equal.
+
+ - Variable: int rl_mark
+ The mark (saved position) in the current line. If set, the mark
+ and point define a *region*.
+
+ - Variable: int rl_done
+ Setting this to a non-zero value causes Readline to return the
+ current line immediately.
+
+ - Variable: int rl_pending_input
+ Setting this to a value makes it the next keystroke read. This is
+ a way to stuff a single character into the input stream.
+
+ - Variable: char * rl_prompt
+ The prompt Readline uses. This is set from the argument to
+ `readline ()', and should not be assigned to directly.
+
+ - Variable: char * rl_library_version
+ The version number of this revision of the library.
+
+ - Variable: char * rl_terminal_name
+ The terminal type, used for initialization.
+
+ - Variable: char * rl_readline_name
+ This variable is set to a unique name by each application using
+ Readline. The value allows conditional parsing of the inputrc file
+ (*note Conditional Init Constructs::.).
+
+ - Variable: FILE * rl_instream
+ The stdio stream from which Readline reads input.
+
+ - Variable: FILE * rl_outstream
+ The stdio stream to which Readline performs output.
+
+ - Variable: Function * rl_startup_hook
+ If non-zero, this is the address of a function to call just before
+ `readline' prints the first prompt.
+
+ - Variable: Function * rl_event_hook
+ If non-zero, this is the address of a function to call periodically
+ when readline is waiting for terminal input.
+
+ - Variable: Function * rl_getc_function
+ If non-zero, `readline' will call indirectly through this pointer
+ to get a character from the input stream. By default, it is set to
+ `rl_getc', the default `readline' character input function (*note
+ Utility Functions::.).
+
+ - Variable: VFunction * rl_redisplay_function
+ If non-zero, `readline' will call indirectly through this pointer
+ to update the display with the current contents of the editing
+ buffer. By default, it is set to `rl_redisplay', the default
+ `readline' redisplay function (*note Redisplay::.).
+
+ - Variable: Keymap rl_executing_keymap
+ This variable is set to the keymap (*note Keymaps::.) in which the
+ currently executing readline function was found.
+
+ - Variable: Keymap rl_binding_keymap
+ This variable is set to the keymap (*note Keymaps::.) in which the
+ last key binding occurred.
+
+
+File: readline.info, Node: Readline Convenience Functions, Next: Custom Completers, Prev: Readline Variables, Up: Programming with GNU Readline
+
+Readline Convenience Functions
+==============================
+
+* Menu:
+
+* Function Naming:: How to give a function you write a name.
+* Keymaps:: Making keymaps.
+* Binding Keys:: Changing Keymaps.
+* Associating Function Names and Bindings:: Translate function names to
+ key sequences.
+* Allowing Undoing:: How to make your functions undoable.
+* Redisplay:: Functions to control line display.
+* Modifying Text:: Functions to modify `rl_line_buffer'.
+* Utility Functions:: Generally useful functions and hooks.
+* Alternate Interface:: Using Readline in a `callback' fashion.
+
+
+File: readline.info, Node: Function Naming, Next: Keymaps, Up: Readline Convenience Functions
+
+Naming a Function
+-----------------
+
+ The user can dynamically change the bindings of keys while using
+Readline. This is done by representing the function with a descriptive
+name. The user is able to type the descriptive name when referring to
+the function. Thus, in an init file, one might find
+
+ Meta-Rubout: backward-kill-word
+
+ This binds the keystroke Meta-Rubout to the function *descriptively*
+named `backward-kill-word'. You, as the programmer, should bind the
+functions you write to descriptive names as well. Readline provides a
+function for doing that:
+
+ - Function: int rl_add_defun (char *name, Function *function, int key)
+ Add NAME to the list of named functions. Make FUNCTION be the
+ function that gets called. If KEY is not -1, then bind it to
+ FUNCTION using `rl_bind_key ()'.
+
+ Using this function alone is sufficient for most applications. It is
+the recommended way to add a few functions to the default functions that
+Readline has built in. If you need to do something other than adding a
+function to Readline, you may need to use the underlying functions
+described below.
+
+
+File: readline.info, Node: Keymaps, Next: Binding Keys, Prev: Function Naming, Up: Readline Convenience Functions
+
+Selecting a Keymap
+------------------
+
+ Key bindings take place on a "keymap". The keymap is the
+association between the keys that the user types and the functions that
+get run. You can make your own keymaps, copy existing keymaps, and tell
+Readline which keymap to use.
+
+ - Function: Keymap rl_make_bare_keymap ()
+ Returns a new, empty keymap. The space for the keymap is
+ allocated with `malloc ()'; you should `free ()' it when you are
+ done.
+
+ - Function: Keymap rl_copy_keymap (Keymap map)
+ Return a new keymap which is a copy of MAP.
+
+ - Function: Keymap rl_make_keymap ()
+ Return a new keymap with the printing characters bound to
+ rl_insert, the lowercase Meta characters bound to run their
+ equivalents, and the Meta digits bound to produce numeric
+ arguments.
+
+ - Function: void rl_discard_keymap (Keymap keymap)
+ Free the storage associated with KEYMAP.
+
+ Readline has several internal keymaps. These functions allow you to
+change which keymap is active.
+
+ - Function: Keymap rl_get_keymap ()
+ Returns the currently active keymap.
+
+ - Function: void rl_set_keymap (Keymap keymap)
+ Makes KEYMAP the currently active keymap.
+
+ - Function: Keymap rl_get_keymap_by_name (char *name)
+ Return the keymap matching NAME. NAME is one which would be
+ supplied in a `set keymap' inputrc line (*note Readline Init
+ File::.).
+
+ - Function: char * rl_get_keymap_name (Keymap keymap)
+ Return the name matching KEYMAP. NAME is one which would be
+ supplied in a `set keymap' inputrc line (*note Readline Init
+ File::.).
+
+
+File: readline.info, Node: Binding Keys, Next: Associating Function Names and Bindings, Prev: Keymaps, Up: Readline Convenience Functions
+
+Binding Keys
+------------
+
+ You associate keys with functions through the keymap. Readline has
+several internal keymaps: `emacs_standard_keymap', `emacs_meta_keymap',
+`emacs_ctlx_keymap', `vi_movement_keymap', and `vi_insertion_keymap'.
+`emacs_standard_keymap' is the default, and the examples in this manual
+assume that.
+
+ These functions manage key bindings.
+
+ - Function: int rl_bind_key (int key, Function *function)
+ Binds KEY to FUNCTION in the currently active keymap. Returns
+ non-zero in the case of an invalid KEY.
+
+ - Function: int rl_bind_key_in_map (int key, Function *function,
+ Keymap map)
+ Bind KEY to FUNCTION in MAP. Returns non-zero in the case of an
+ invalid KEY.
+
+ - Function: int rl_unbind_key (int key)
+ Bind KEY to the null function in the currently active keymap.
+ Returns non-zero in case of error.
+
+ - Function: int rl_unbind_key_in_map (int key, Keymap map)
+ Bind KEY to the null function in MAP. Returns non-zero in case of
+ error.
+
+ - Function: int rl_generic_bind (int type, char *keyseq, char *data,
+ Keymap map)
+ Bind the key sequence represented by the string KEYSEQ to the
+ arbitrary pointer DATA. TYPE says what kind of data is pointed to
+ by DATA; this can be a function (`ISFUNC'), a macro (`ISMACR'), or
+ a keymap (`ISKMAP'). This makes new keymaps as necessary. The
+ initial keymap in which to do bindings is MAP.
+
+ - Function: int rl_parse_and_bind (char *line)
+ Parse LINE as if it had been read from the `inputrc' file and
+ perform any key bindings and variable assignments found (*note
+ Readline Init File::.).
+
+ - Function: int rl_read_init_file (char *filename)
+ Read keybindings and variable assignments from FILENAME (*note
+ Readline Init File::.).
+
+
+File: readline.info, Node: Associating Function Names and Bindings, Next: Allowing Undoing, Prev: Binding Keys, Up: Readline Convenience Functions
+
+Associating Function Names and Bindings
+---------------------------------------
+
+ These functions allow you to find out what keys invoke named
+functions and the functions invoked by a particular key sequence.
+
+ - Function: Function * rl_named_function (char *name)
+ Return the function with name NAME.
+
+ - Function: Function * rl_function_of_keyseq (char *keyseq, Keymap
+ map, int *type)
+ Return the function invoked by KEYSEQ in keymap MAP. If MAP is
+ NULL, the current keymap is used. If TYPE is not NULL, the type
+ of the object is returned in it (one of `ISFUNC', `ISKMAP', or
+ `ISMACR').
+
+ - Function: char ** rl_invoking_keyseqs (Function *function)
+ Return an array of strings representing the key sequences used to
+ invoke FUNCTION in the current keymap.
+
+ - Function: char ** rl_invoking_keyseqs_in_map (Function *function,
+ Keymap map)
+ Return an array of strings representing the key sequences used to
+ invoke FUNCTION in the keymap MAP.
+
+ - Function: void rl_function_dumper (int readable)
+ Print the readline function names and the key sequences currently
+ bound to them to `rl_outstream'. If READABLE is non-zero, the
+ list is formatted in such a way that it can be made part of an
+ `inputrc' file and re-read.
+
+ - Function: void rl_list_funmap_names ()
+ Print the names of all bindable Readline functions to
+ `rl_outstream'.
+
+
+File: readline.info, Node: Allowing Undoing, Next: Redisplay, Prev: Associating Function Names and Bindings, Up: Readline Convenience Functions
+
+Allowing Undoing
+----------------
+
+ Supporting the undo command is a painless thing, and makes your
+functions much more useful. It is certainly easy to try something if
+you know you can undo it. I could use an undo function for the stock
+market.
+
+ If your function simply inserts text once, or deletes text once, and
+uses `rl_insert_text ()' or `rl_delete_text ()' to do it, then undoing
+is already done for you automatically.
+
+ If you do multiple insertions or multiple deletions, or any
+combination of these operations, you should group them together into
+one operation. This is done with `rl_begin_undo_group ()' and
+`rl_end_undo_group ()'.
+
+ The types of events that can be undone are:
+
+ enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END };
+
+ Notice that `UNDO_DELETE' means to insert some text, and
+`UNDO_INSERT' means to delete some text. That is, the undo code tells
+undo what to undo, not how to undo it. `UNDO_BEGIN' and `UNDO_END' are
+tags added by `rl_begin_undo_group ()' and `rl_end_undo_group ()'.
+
+ - Function: int rl_begin_undo_group ()
+ Begins saving undo information in a group construct. The undo
+ information usually comes from calls to `rl_insert_text ()' and
+ `rl_delete_text ()', but could be the result of calls to
+ `rl_add_undo ()'.
+
+ - Function: int rl_end_undo_group ()
+ Closes the current undo group started with `rl_begin_undo_group
+ ()'. There should be one call to `rl_end_undo_group ()' for each
+ call to `rl_begin_undo_group ()'.
+
+ - Function: void rl_add_undo (enum undo_code what, int start, int end,
+ char *text)
+ Remember how to undo an event (according to WHAT). The affected
+ text runs from START to END, and encompasses TEXT.
+
+ - Function: void free_undo_list ()
+ Free the existing undo list.
+
+ - Function: int rl_do_undo ()
+ Undo the first thing on the undo list. Returns `0' if there was
+ nothing to undo, non-zero if something was undone.
+
+ Finally, if you neither insert nor delete text, but directly modify
+the existing text (e.g., change its case), call `rl_modifying ()' once,
+just before you modify the text. You must supply the indices of the
+text range that you are going to modify.
+
+ - Function: int rl_modifying (int start, int end)
+ Tell Readline to save the text between START and END as a single
+ undo unit. It is assumed that you will subsequently modify that
+ text.
+
+
+File: readline.info, Node: Redisplay, Next: Modifying Text, Prev: Allowing Undoing, Up: Readline Convenience Functions
+
+Redisplay
+---------
+
+ - Function: void rl_redisplay ()
+ Change what's displayed on the screen to reflect the current
+ contents of `rl_line_buffer'.
+
+ - Function: int rl_forced_update_display ()
+ Force the line to be updated and redisplayed, whether or not
+ Readline thinks the screen display is correct.
+
+ - Function: int rl_on_new_line ()
+ Tell the update routines that we have moved onto a new (empty)
+ line, usually after ouputting a newline.
+
+ - Function: int rl_reset_line_state ()
+ Reset the display state to a clean state and redisplay the current
+ line starting on a new line.
+
+ - Function: int rl_message (va_alist)
+ The arguments are a string as would be supplied to `printf'. The
+ resulting string is displayed in the "echo area". The echo area
+ is also used to display numeric arguments and search strings.
+
+ - Function: int rl_clear_message ()
+ Clear the message in the echo area.
+
+
+File: readline.info, Node: Modifying Text, Next: Utility Functions, Prev: Redisplay, Up: Readline Convenience Functions
+
+Modifying Text
+--------------
+
+ - Function: int rl_insert_text (char *text)
+ Insert TEXT into the line at the current cursor position.
+
+ - Function: int rl_delete_text (int start, int end)
+ Delete the text between START and END in the current line.
+
+ - Function: char * rl_copy_text (int start, int end)
+ Return a copy of the text between START and END in the current
+ line.
+
+ - Function: int rl_kill_text (int start, int end)
+ Copy the text between START and END in the current line to the
+ kill ring, appending or prepending to the last kill if the last
+ command was a kill command. The text is deleted. If START is
+ less than END, the text is appended, otherwise prepended. If the
+ last command was not a kill, a new kill ring slot is used.
+
+
+File: readline.info, Node: Utility Functions, Next: Alternate Interface, Prev: Modifying Text, Up: Readline Convenience Functions
+
+Utility Functions
+-----------------
+
+ - Function: int rl_read_key ()
+ Return the next character available. This handles input inserted
+ into the input stream via PENDING INPUT (*note Readline
+ Variables::.) and `rl_stuff_char ()', macros, and characters read
+ from the keyboard.
+
+ - Function: int rl_getc (FILE *)
+ Return the next character available from the keyboard.
+
+ - Function: int rl_stuff_char (int c)
+ Insert C into the Readline input stream. It will be "read" before
+ Readline attempts to read characters from the terminal with
+ `rl_read_key ()'.
+
+ - Function: rl_extend_line_buffer (int len)
+ Ensure that `rl_line_buffer' has enough space to hold LEN
+ characters, possibly reallocating it if necessary.
+
+ - Function: int rl_initialize ()
+ Initialize or re-initialize Readline's internal state.
+
+ - Function: int rl_reset_terminal (char *terminal_name)
+ Reinitialize Readline's idea of the terminal settings using
+ TERMINAL_NAME as the terminal type (e.g., `vt100').
+
+ - Function: int alphabetic (int c)
+ Return 1 if C is an alphabetic character.
+
+ - Function: int numeric (int c)
+ Return 1 if C is a numeric character.
+
+ - Function: int ding ()
+ Ring the terminal bell, obeying the setting of `bell-style'.
+
+ The following are implemented as macros, defined in `chartypes.h'.
+
+ - Function: int uppercase_p (int c)
+ Return 1 if C is an uppercase alphabetic character.
+
+ - Function: int lowercase_p (int c)
+ Return 1 if C is a lowercase alphabetic character.
+
+ - Function: int digit_p (int c)
+ Return 1 if C is a numeric character.
+
+ - Function: int to_upper (int c)
+ If C is a lowercase alphabetic character, return the corresponding
+ uppercase character.
+
+ - Function: int to_lower (int c)
+ If C is an uppercase alphabetic character, return the corresponding
+ lowercase character.
+
+ - Function: int digit_value (int c)
+ If C is a number, return the value it represents.
+
+
+File: readline.info, Node: Alternate Interface, Prev: Utility Functions, Up: Readline Convenience Functions
+
+Alternate Interface
+-------------------
+
+ An alternate interface is available to plain `readline()'. Some
+applications need to interleave keyboard I/O with file, device, or
+window system I/O, typically by using a main loop to `select()' on
+various file descriptors. To accomodate this need, readline can also
+be invoked as a `callback' function from an event loop. There are
+functions available to make this easy.
+
+ - Function: void rl_callback_handler_install (char *prompt, Vfunction
+ *lhandler)
+ Set up the terminal for readline I/O and display the initial
+ expanded value of PROMPT. Save the value of LHANDLER to use as a
+ callback when a complete line of input has been entered.
+
+ - Function: void rl_callback_read_char ()
+ Whenever an application determines that keyboard input is
+ available, it should call `rl_callback_read_char()', which will
+ read the next character from the current input source. If that
+ character completes the line, `rl_callback_read_char' will invoke
+ the LHANDLER function saved by `rl_callback_handler_install' to
+ process the line. `EOF' is indicated by calling LHANDLER with a
+ `NULL' line.
+
+ - Function: void rl_callback_handler_remove ()
+ Restore the terminal to its initial state and remove the line
+ handler. This may be called from within a callback as well as
+ independently.
+
+An Example
+----------
+
+ Here is a function which changes lowercase characters to their
+uppercase equivalents, and uppercase characters to lowercase. If this
+function was bound to `M-c', then typing `M-c' would change the case of
+the character under point. Typing `M-1 0 M-c' would change the case of
+the following 10 characters, leaving the cursor on the last character
+changed.
+
+ /* Invert the case of the COUNT following characters. */
+ int
+ invert_case_line (count, key)
+ int count, key;
+ {
+ register int start, end, i;
+
+ start = rl_point;
+
+ if (rl_point >= rl_end)
+ return (0);
+
+ if (count < 0)
+ {
+ direction = -1;
+ count = -count;
+ }
+ else
+ direction = 1;
+
+ /* Find the end of the range to modify. */
+ end = start + (count * direction);
+
+ /* Force it to be within range. */
+ if (end > rl_end)
+ end = rl_end;
+ else if (end < 0)
+ end = 0;
+
+ if (start == end)
+ return (0);
+
+ if (start > end)
+ {
+ int temp = start;
+ start = end;
+ end = temp;
+ }
+
+ /* Tell readline that we are modifying the line, so it will save
+ the undo information. */
+ rl_modifying (start, end);
+
+ for (i = start; i != end; i++)
+ {
+ if (uppercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = to_lower (rl_line_buffer[i]);
+ else if (lowercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = to_upper (rl_line_buffer[i]);
+ }
+ /* Move point to on top of the last character changed. */
+ rl_point = (direction == 1) ? end - 1 : start;
+ return (0);
+ }
+
+
+File: readline.info, Node: Custom Completers, Prev: Readline Convenience Functions, Up: Programming with GNU Readline
+
+Custom Completers
+=================
+
+ Typically, a program that reads commands from the user has a way of
+disambiguating commands and data. If your program is one of these, then
+it can provide completion for commands, data, or both. The following
+sections describe how your program and Readline cooperate to provide
+this service.
+
+* Menu:
+
+* How Completing Works:: The logic used to do completion.
+* Completion Functions:: Functions provided by Readline.
+* Completion Variables:: Variables which control completion.
+* A Short Completion Example:: An example of writing completer subroutines.
+
+
+File: readline.info, Node: How Completing Works, Next: Completion Functions, Up: Custom Completers
+
+How Completing Works
+--------------------
+
+ In order to complete some text, the full list of possible completions
+must be available. That is, it is not possible to accurately expand a
+partial word without knowing all of the possible words which make sense
+in that context. The Readline library provides the user interface to
+completion, and two of the most common completion functions: filename
+and username. For completing other types of text, you must write your
+own completion function. This section describes exactly what such
+functions must do, and provides an example.
+
+ There are three major functions used to perform completion:
+
+ 1. The user-interface function `rl_complete ()'. This function is
+ called with the same arguments as other Readline functions
+ intended for interactive use: COUNT and INVOKING_KEY. It
+ isolates the word to be completed and calls `completion_matches
+ ()' to generate a list of possible completions. It then either
+ lists the possible completions, inserts the possible completions,
+ or actually performs the completion, depending on which behavior
+ is desired.
+
+ 2. The internal function `completion_matches ()' uses your
+ "generator" function to generate the list of possible matches, and
+ then returns the array of these matches. You should place the
+ address of your generator function in
+ `rl_completion_entry_function'.
+
+ 3. The generator function is called repeatedly from
+ `completion_matches ()', returning a string each time. The
+ arguments to the generator function are TEXT and STATE. TEXT is
+ the partial word to be completed. STATE is zero the first time
+ the function is called, allowing the generator to perform any
+ necessary initialization, and a positive non-zero integer for each
+ subsequent call. When the generator function returns `(char
+ *)NULL' this signals `completion_matches ()' that there are no
+ more possibilities left. Usually the generator function computes
+ the list of possible completions when STATE is zero, and returns
+ them one at a time on subsequent calls. Each string the generator
+ function returns as a match must be allocated with `malloc()';
+ Readline frees the strings when it has finished with them.
+
+
+ - Function: int rl_complete (int ignore, int invoking_key)
+ Complete the word at or before point. You have supplied the
+ function that does the initial simple matching selection algorithm
+ (see `completion_matches ()'). The default is to do filename
+ completion.
+
+ - Variable: Function * rl_completion_entry_function
+ This is a pointer to the generator function for `completion_matches
+ ()'. If the value of `rl_completion_entry_function' is `(Function
+ *)NULL' then the default filename generator function,
+ `filename_completion_function ()', is used.
+
+
+File: readline.info, Node: Completion Functions, Next: Completion Variables, Prev: How Completing Works, Up: Custom Completers
+
+Completion Functions
+--------------------
+
+ Here is the complete list of callable completion functions present in
+Readline.
+
+ - Function: int rl_complete_internal (int what_to_do)
+ Complete the word at or before point. WHAT_TO_DO says what to do
+ with the completion. A value of `?' means list the possible
+ completions. `TAB' means do standard completion. `*' means
+ insert all of the possible completions. `!' means to display all
+ of the possible completions, if there is more than one, as well as
+ performing partial completion.
+
+ - Function: int rl_complete (int ignore, int invoking_key)
+ Complete the word at or before point. You have supplied the
+ function that does the initial simple matching selection algorithm
+ (see `completion_matches ()' and `rl_completion_entry_function').
+ The default is to do filename completion. This calls
+ `rl_complete_internal ()' with an argument depending on
+ INVOKING_KEY.
+
+ - Function: int rl_possible_completions (int count, int invoking_key))
+ List the possible completions. See description of `rl_complete
+ ()'. This calls `rl_complete_internal ()' with an argument of `?'.
+
+ - Function: int rl_insert_completions (int count, int invoking_key))
+ Insert the list of possible completions into the line, deleting the
+ partially-completed word. See description of `rl_complete ()'.
+ This calls `rl_complete_internal ()' with an argument of `*'.
+
+ - Function: char ** completion_matches (char *text, CPFunction
+ *entry_func)
+ Returns an array of `(char *)' which is a list of completions for
+ TEXT. If there are no completions, returns `(char **)NULL'. The
+ first entry in the returned array is the substitution for TEXT.
+ The remaining entries are the possible completions. The array is
+ terminated with a `NULL' pointer.
+
+ ENTRY_FUNC is a function of two args, and returns a `(char *)'.
+ The first argument is TEXT. The second is a state argument; it is
+ zero on the first call, and non-zero on subsequent calls.
+ eNTRY_FUNC returns a `NULL' pointer to the caller when there are
+ no more matches.
+
+ - Function: char * filename_completion_function (char *text, int state)
+ A generator function for filename completion in the general case.
+ Note that completion in Bash is a little different because of all
+ the pathnames that must be followed when looking up completions
+ for a command. The Bash source is a useful reference for writing
+ custom completion functions.
+
+ - Function: char * username_completion_function (char *text, int state)
+ A completion generator for usernames. TEXT contains a partial
+ username preceded by a random character (usually `~'). As with all
+ completion generators, STATE is zero on the first call and non-zero
+ for subsequent calls.
+
+
+File: readline.info, Node: Completion Variables, Next: A Short Completion Example, Prev: Completion Functions, Up: Custom Completers
+
+Completion Variables
+--------------------
+
+ - Variable: Function * rl_completion_entry_function
+ A pointer to the generator function for `completion_matches ()'.
+ `NULL' means to use `filename_entry_function ()', the default
+ filename completer.
+
+ - Variable: CPPFunction * rl_attempted_completion_function
+ A pointer to an alternative function to create matches. The
+ function is called with TEXT, START, and END. START and END are
+ indices in `rl_line_buffer' saying what the boundaries of TEXT
+ are. If this function exists and returns `NULL', or if this
+ variable is set to `NULL', then `rl_complete ()' will call the
+ value of `rl_completion_entry_function' to generate matches,
+ otherwise the array of strings returned will be used.
+
+ - Variable: CPFunction * rl_filename_quoting_function
+ A pointer to a function that will quote a filename in an
+ application- specific fashion. This is called if filename
+ completion is being attempted and one of the characters in
+ `rl_filename_quote_characters' appears in a completed filename.
+ The function is called with TEXT, MATCH_TYPE, and QUOTE_POINTER.
+ The TEXT is the filename to be quoted. The MATCH_TYPE is either
+ `SINGLE_MATCH', if there is only one completion match, or
+ `MULT_MATCH'. Some functions use this to decide whether or not to
+ insert a closing quote character. The QUOTE_POINTER is a pointer
+ to any opening quote character the user typed. Some functions
+ choose to reset this character.
+
+ - Variable: CPFunction * rl_filename_dequoting_function
+ A pointer to a function that will remove application-specific
+ quoting characters from a filename before completion is attempted,
+ so those characters do not interfere with matching the text
+ against names in the filesystem. It is called with TEXT, the text
+ of the word to be dequoted, and QUOTE_CHAR, which is the quoting
+ character that delimits the filename (usually `'' or `"'). If
+ QUOTE_CHAR is zero, the filename was not in an embedded string.
+
+ - Variable: Function * rl_char_is_quoted_p
+ A pointer to a function to call that determines whether or not a
+ specific character in the line buffer is quoted, according to
+ whatever quoting mechanism the program calling readline uses. The
+ function is called with two arguments: TEXT, the text of the line,
+ and INDEX, the index of the character in the line. It is used to
+ decide whether a character found in
+ `rl_completer_word_break_characters' should be used to break words
+ for the completer.
+
+ - Variable: int rl_completion_query_items
+ Up to this many items will be displayed in response to a
+ possible-completions call. After that, we ask the user if she is
+ sure she wants to see them all. The default value is 100.
+
+ - Variable: char * rl_basic_word_break_characters
+ The basic list of characters that signal a break between words for
+ the completer routine. The default value of this variable is the
+ characters which break words for completion in Bash, i.e., `"
+ \t\n\"\\'`@$><=;|&{("'.
+
+ - Variable: char * rl_basic_quote_characters
+ List of quote characters which can cause a word break.
+
+ - Variable: char * rl_completer_word_break_characters
+ The list of characters that signal a break between words for
+ `rl_complete_internal ()'. The default list is the value of
+ `rl_basic_word_break_characters'.
+
+ - Variable: char * rl_completer_quote_characters
+ List of characters which can be used to quote a substring of the
+ line. Completion occurs on the entire substring, and within the
+ substring `rl_completer_word_break_characters' are treated as any
+ other character, unless they also appear within this list.
+
+ - Variable: char * rl_filename_quote_characters
+ A list of characters that cause a filename to be quoted by the
+ completer when they appear in a completed filename. The default
+ is empty.
+
+ - Variable: char * rl_special_prefixes
+ The list of characters that are word break characters, but should
+ be left in TEXT when it is passed to the completion function.
+ Programs can use this to help determine what kind of completing to
+ do. For instance, Bash sets this variable to "$@" so that it can
+ complete shell variables and hostnames.
+
+ - Variable: int rl_completion_append_character
+ When a single completion alternative matches at the end of the
+ command line, this character is appended to the inserted
+ completion text. The default is a space character (` '). Setting
+ this to the null character (`\0') prevents anything being appended
+ automatically. This can be changed in custom completion functions
+ to provide the "most sensible word separator character" according
+ to an application-specific command line syntax specification.
+
+ - Variable: int rl_ignore_completion_duplicates
+ If non-zero, then disallow duplicates in the matches. Default is
+ 1.
+
+ - Variable: int rl_filename_completion_desired
+ Non-zero means that the results of the matches are to be treated as
+ filenames. This is *always* zero on entry, and can only be changed
+ within a completion entry generator function. If it is set to a
+ non-zero value, directory names have a slash appended and Readline
+ attempts to quote completed filenames if they contain any embedded
+ word break characters.
+
+ - Variable: int rl_filename_quoting_desired
+ Non-zero means that the results of the matches are to be quoted
+ using double quotes (or an application-specific quoting mechanism)
+ if the completed filename contains any characters in
+ `rl_filename_quote_chars'. This is *always* non-zero on entry,
+ and can only be changed within a completion entry generator
+ function. The quoting is effected via a call to the function
+ pointed to by `rl_filename_quoting_function'.
+
+ - Variable: int rl_inhibit_completion
+ If this variable is non-zero, completion is inhibit<ed. The
+ completion character will be inserted as any other bound to
+ `self-insert'.
+
+ - Variable: Function * rl_ignore_some_completions_function
+ This function, if defined, is called by the completer when real
+ filename completion is done, after all the matching names have
+ been generated. It is passed a `NULL' terminated array of matches.
+ The first element (`matches[0]') is the maximal substring common
+ to all matches. This function can re-arrange the list of matches
+ as required, but each element deleted from the array must be freed.
+
+ - Variable: Function * rl_directory_completion_hook
+ This function, if defined, is allowed to modify the directory
+ portion of filenames Readline completes. It is called with the
+ address of a string (the current directory name) as an argument.
+ It could be used to expand symbolic links or shell variables in
+ pathnames.
+
+
+File: readline.info, Node: A Short Completion Example, Prev: Completion Variables, Up: Custom Completers
+
+A Short Completion Example
+--------------------------
+
+ Here is a small application demonstrating the use of the GNU Readline
+library. It is called `fileman', and the source code resides in
+`examples/fileman.c'. This sample application provides completion of
+command names, line editing features, and access to the history list.
+
+ /* fileman.c -- A tiny application which demonstrates how to use the
+ GNU Readline library. This application interactively allows users
+ to manipulate files and their modes. */
+
+ #include <stdio.h>
+ #include <sys/types.h>
+ #include <sys/file.h>
+ #include <sys/stat.h>
+ #include <sys/errno.h>
+
+ #include <readline/readline.h>
+ #include <readline/history.h>
+
+ extern char *getwd ();
+ extern char *xmalloc ();
+
+ /* The names of functions that actually do the manipulation. */
+ int com_list (), com_view (), com_rename (), com_stat (), com_pwd ();
+ int com_delete (), com_help (), com_cd (), com_quit ();
+
+ /* A structure which contains information on the commands this program
+ can understand. */
+
+ typedef struct {
+ char *name; /* User printable name of the function. */
+ Function *func; /* Function to call to do the job. */
+ char *doc; /* Documentation for this function. */
+ } COMMAND;
+
+ COMMAND commands[] = {
+ { "cd", com_cd, "Change to directory DIR" },
+ { "delete", com_delete, "Delete FILE" },
+ { "help", com_help, "Display this text" },
+ { "?", com_help, "Synonym for `help'" },
+ { "list", com_list, "List files in DIR" },
+ { "ls", com_list, "Synonym for `list'" },
+ { "pwd", com_pwd, "Print the current working directory" },
+ { "quit", com_quit, "Quit using Fileman" },
+ { "rename", com_rename, "Rename FILE to NEWNAME" },
+ { "stat", com_stat, "Print out statistics on FILE" },
+ { "view", com_view, "View the contents of FILE" },
+ { (char *)NULL, (Function *)NULL, (char *)NULL }
+ };
+
+ /* Forward declarations. */
+ char *stripwhite ();
+ COMMAND *find_command ();
+
+ /* The name of this program, as taken from argv[0]. */
+ char *progname;
+
+ /* When non-zero, this global means the user is done using this program. */
+ int done;
+
+ char *
+ dupstr (s)
+ int s;
+ {
+ char *r;
+
+ r = xmalloc (strlen (s) + 1);
+ strcpy (r, s);
+ return (r);
+ }
+
+ main (argc, argv)
+ int argc;
+ char **argv;
+ {
+ char *line, *s;
+
+ progname = argv[0];
+
+ initialize_readline (); /* Bind our completer. */
+
+ /* Loop reading and executing lines until the user quits. */
+ for ( ; done == 0; )
+ {
+ line = readline ("FileMan: ");
+
+ if (!line)
+ break;
+
+ /* Remove leading and trailing whitespace from the line.
+ Then, if there is anything left, add it to the history list
+ and execute it. */
+ s = stripwhite (line);
+
+ if (*s)
+ {
+ add_history (s);
+ execute_line (s);
+ }
+
+ free (line);
+ }
+ exit (0);
+ }
+
+ /* Execute a command line. */
+ int
+ execute_line (line)
+ char *line;
+ {
+ register int i;
+ COMMAND *command;
+ char *word;
+
+ /* Isolate the command word. */
+ i = 0;
+ while (line[i] && whitespace (line[i]))
+ i++;
+ word = line + i;
+
+ while (line[i] && !whitespace (line[i]))
+ i++;
+
+ if (line[i])
+ line[i++] = '\0';
+
+ command = find_command (word);
+
+ if (!command)
+ {
+ fprintf (stderr, "%s: No such command for FileMan.\n", word);
+ return (-1);
+ }
+
+ /* Get argument to command, if any. */
+ while (whitespace (line[i]))
+ i++;
+
+ word = line + i;
+
+ /* Call the function. */
+ return ((*(command->func)) (word));
+ }
+
+ /* Look up NAME as the name of a command, and return a pointer to that
+ command. Return a NULL pointer if NAME isn't a command name. */
+ COMMAND *
+ find_command (name)
+ char *name;
+ {
+ register int i;
+
+ for (i = 0; commands[i].name; i++)
+ if (strcmp (name, commands[i].name) == 0)
+ return (&commands[i]);
+
+ return ((COMMAND *)NULL);
+ }
+
+ /* Strip whitespace from the start and end of STRING. Return a pointer
+ into STRING. */
+ char *
+ stripwhite (string)
+ char *string;
+ {
+ register char *s, *t;
+
+ for (s = string; whitespace (*s); s++)
+ ;
+
+ if (*s == 0)
+ return (s);
+
+ t = s + strlen (s) - 1;
+ while (t > s && whitespace (*t))
+ t--;
+ *++t = '\0';
+
+ return s;
+ }
+
+ /* **************************************************************** */
+ /* */
+ /* Interface to Readline Completion */
+ /* */
+ /* **************************************************************** */
+
+ char *command_generator ();
+ char **fileman_completion ();
+
+ /* Tell the GNU Readline library how to complete. We want to try to complete
+ on command names if this is the first word in the line, or on filenames
+ if not. */
+ initialize_readline ()
+ {
+ /* Allow conditional parsing of the ~/.inputrc file. */
+ rl_readline_name = "FileMan";
+
+ /* Tell the completer that we want a crack first. */
+ rl_attempted_completion_function = (CPPFunction *)fileman_completion;
+ }
+
+ /* Attempt to complete on the contents of TEXT. START and END bound the
+ region of rl_line_buffer that contains the word to complete. TEXT is
+ the word to complete. We can use the entire contents of rl_line_buffer
+ in case we want to do some simple parsing. Return the array of matches,
+ or NULL if there aren't any. */
+ char **
+ fileman_completion (text, start, end)
+ char *text;
+ int start, end;
+ {
+ char **matches;
+
+ matches = (char **)NULL;
+
+ /* If this word is at the start of the line, then it is a command
+ to complete. Otherwise it is the name of a file in the current
+ directory. */
+ if (start == 0)
+ matches = completion_matches (text, command_generator);
+
+ return (matches);
+ }
+
+ /* Generator function for command completion. STATE lets us know whether
+ to start from scratch; without any state (i.e. STATE == 0), then we
+ start at the top of the list. */
+ char *
+ command_generator (text, state)
+ char *text;
+ int state;
+ {
+ static int list_index, len;
+ char *name;
+
+ /* If this is a new word to complete, initialize now. This includes
+ saving the length of TEXT for efficiency, and initializing the index
+ variable to 0. */
+ if (!state)
+ {
+ list_index = 0;
+ len = strlen (text);
+ }
+
+ /* Return the next name which partially matches from the command list. */
+ while (name = commands[list_index].name)
+ {
+ list_index++;
+
+ if (strncmp (name, text, len) == 0)
+ return (dupstr(name));
+ }
+
+ /* If no names matched, then return NULL. */
+ return ((char *)NULL);
+ }
+
+ /* **************************************************************** */
+ /* */
+ /* FileMan Commands */
+ /* */
+ /* **************************************************************** */
+
+ /* String to pass to system (). This is for the LIST, VIEW and RENAME
+ commands. */
+ static char syscom[1024];
+
+ /* List the file(s) named in arg. */
+ com_list (arg)
+ char *arg;
+ {
+ if (!arg)
+ arg = "";
+
+ sprintf (syscom, "ls -FClg %s", arg);
+ return (system (syscom));
+ }
+
+ com_view (arg)
+ char *arg;
+ {
+ if (!valid_argument ("view", arg))
+ return 1;
+
+ sprintf (syscom, "more %s", arg);
+ return (system (syscom));
+ }
+
+ com_rename (arg)
+ char *arg;
+ {
+ too_dangerous ("rename");
+ return (1);
+ }
+
+ com_stat (arg)
+ char *arg;
+ {
+ struct stat finfo;
+
+ if (!valid_argument ("stat", arg))
+ return (1);
+
+ if (stat (arg, &finfo) == -1)
+ {
+ perror (arg);
+ return (1);
+ }
+
+ printf ("Statistics for `%s':\n", arg);
+
+ printf ("%s has %d link%s, and is %d byte%s in length.\n", arg,
+ finfo.st_nlink,
+ (finfo.st_nlink == 1) ? "" : "s",
+ finfo.st_size,
+ (finfo.st_size == 1) ? "" : "s");
+ printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime));
+ printf (" Last access at: %s", ctime (&finfo.st_atime));
+ printf (" Last modified at: %s", ctime (&finfo.st_mtime));
+ return (0);
+ }
+
+ com_delete (arg)
+ char *arg;
+ {
+ too_dangerous ("delete");
+ return (1);
+ }
+
+ /* Print out help for ARG, or for all of the commands if ARG is
+ not present. */
+ com_help (arg)
+ char *arg;
+ {
+ register int i;
+ int printed = 0;
+
+ for (i = 0; commands[i].name; i++)
+ {
+ if (!*arg || (strcmp (arg, commands[i].name) == 0))
+ {
+ printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+ printed++;
+ }
+ }
+
+ if (!printed)
+ {
+ printf ("No commands match `%s'. Possibilties are:\n", arg);
+
+ for (i = 0; commands[i].name; i++)
+ {
+ /* Print in six columns. */
+ if (printed == 6)
+ {
+ printed = 0;
+ printf ("\n");
+ }
+
+ printf ("%s\t", commands[i].name);
+ printed++;
+ }
+
+ if (printed)
+ printf ("\n");
+ }
+ return (0);
+ }
+
+ /* Change to the directory ARG. */
+ com_cd (arg)
+ char *arg;
+ {
+ if (chdir (arg) == -1)
+ {
+ perror (arg);
+ return 1;
+ }
+
+ com_pwd ("");
+ return (0);
+ }
+
+ /* Print out the current working directory. */
+ com_pwd (ignore)
+ char *ignore;
+ {
+ char dir[1024], *s;
+
+ s = getwd (dir);
+ if (s == 0)
+ {
+ printf ("Error getting pwd: %s\n", dir);
+ return 1;
+ }
+
+ printf ("Current directory is %s\n", dir);
+ return 0;
+ }
+
+ /* The user wishes to quit using this program. Just set DONE non-zero. */
+ com_quit (arg)
+ char *arg;
+ {
+ done = 1;
+ return (0);
+ }
+
+ /* Function which tells you that you can't do this. */
+ too_dangerous (caller)
+ char *caller;
+ {
+ fprintf (stderr,
+ "%s: Too dangerous for me to distribute. Write it yourself.\n",
+ caller);
+ }
+
+ /* Return non-zero if ARG is a valid argument for CALLER, else print
+ an error message and return zero. */
+ int
+ valid_argument (caller, arg)
+ char *caller, *arg;
+ {
+ if (!arg || !*arg)
+ {
+ fprintf (stderr, "%s: Argument required.\n", caller);
+ return (0);
+ }
+
+ return (1);
+ }
+
+
+File: readline.info, Node: Concept Index, Next: Function and Variable Index, Prev: Programming with GNU Readline, Up: Top
+
+Concept Index
+*************
+
+* Menu:
+
+* command editing: Readline Bare Essentials.
+* editing command lines: Readline Bare Essentials.
+* initialization file, readline: Readline Init File.
+* interaction, readline: Readline Interaction.
+* kill ring: Readline Killing Commands.
+* killing text: Readline Killing Commands.
+* notation, readline: Readline Bare Essentials.
+* readline, function: Basic Behavior.
+* yanking text: Readline Killing Commands.
+
+
+File: readline.info, Node: Function and Variable Index, Prev: Concept Index, Up: Top
+
+Function and Variable Index
+***************************
+
+* Menu:
+
+* (: Utility Functions.
+* abort (C-g): Miscellaneous Commands.
+* accept-line (Newline, Return): Commands For History.
+* alphabetic: Utility Functions.
+* backward-char (C-b): Commands For Moving.
+* backward-delete-char (Rubout): Commands For Text.
+* backward-kill-line (C-x Rubout): Commands For Killing.
+* backward-kill-word (M-DEL): Commands For Killing.
+* backward-word (M-b): Commands For Moving.
+* beginning-of-history (M-<): Commands For History.
+* beginning-of-line (C-a): Commands For Moving.
+* bell-style: Readline Init File Syntax.
+* call-last-kbd-macro (C-x e): Keyboard Macros.
+* capitalize-word (M-c): Commands For Text.
+* character-search (C-]): Miscellaneous Commands.
+* character-search-backward (M-C-]): Miscellaneous Commands.
+* clear-screen (C-l): Commands For Moving.
+* comment-begin: Readline Init File Syntax.
+* complete (TAB): Commands For Completion.
+* completion-query-items: Readline Init File Syntax.
+* completion_matches: Completion Functions.
+* convert-meta: Readline Init File Syntax.
+* copy-backward-word (): Commands For Killing.
+* copy-forward-word (): Commands For Killing.
+* copy-region-as-kill (): Commands For Killing.
+* delete-char (C-d): Commands For Text.
+* delete-horizontal-space (): Commands For Killing.
+* digit-argument (M-0, M-1, ... M-): Numeric Arguments.
+* digit_p: Utility Functions.
+* digit_value: Utility Functions.
+* ding: Utility Functions.
+* disable-completion: Readline Init File Syntax.
+* do-uppercase-version (M-a, M-b, M-X, ...): Miscellaneous Commands.
+* downcase-word (M-l): Commands For Text.
+* dump-functions (): Miscellaneous Commands.
+* dump-macros (): Miscellaneous Commands.
+* dump-variables (): Miscellaneous Commands.
+* editing-mode: Readline Init File Syntax.
+* enable-keypad: Readline Init File Syntax.
+* end-kbd-macro (C-x )): Keyboard Macros.
+* end-of-history (M->): Commands For History.
+* end-of-line (C-e): Commands For Moving.
+* exchange-point-and-mark (C-x C-x): Miscellaneous Commands.
+* expand-tilde: Readline Init File Syntax.
+* filename_completion_function: Completion Functions.
+* forward-char (C-f): Commands For Moving.
+* forward-search-history (C-s): Commands For History.
+* forward-word (M-f): Commands For Moving.
+* free_undo_list: Allowing Undoing.
+* history-search-backward (): Commands For History.
+* history-search-forward (): Commands For History.
+* horizontal-scroll-mode: Readline Init File Syntax.
+* input-meta: Readline Init File Syntax.
+* insert-comment (M-#): Miscellaneous Commands.
+* insert-completions (M-*): Commands For Completion.
+* keymap: Readline Init File Syntax.
+* kill-line (C-k): Commands For Killing.
+* kill-region (): Commands For Killing.
+* kill-whole-line (): Commands For Killing.
+* kill-word (M-d): Commands For Killing.
+* lowercase_p: Utility Functions.
+* mark-modified-lines: Readline Init File Syntax.
+* meta-flag: Readline Init File Syntax.
+* next-history (C-n): Commands For History.
+* non-incremental-forward-search-history (M-n): Commands For History.
+* non-incremental-reverse-search-history (M-p): Commands For History.
+* numeric: Utility Functions.
+* output-meta: Readline Init File Syntax.
+* possible-completions (M-?): Commands For Completion.
+* prefix-meta (ESC): Miscellaneous Commands.
+* previous-history (C-p): Commands For History.
+* quoted-insert (C-q, C-v): Commands For Text.
+* re-read-init-file (C-x C-r): Miscellaneous Commands.
+* readline: Basic Behavior.
+* redraw-current-line (): Commands For Moving.
+* reverse-search-history (C-r): Commands For History.
+* revert-line (M-r): Miscellaneous Commands.
+* rl_add_defun: Function Naming.
+* rl_add_undo: Allowing Undoing.
+* rl_attempted_completion_function: Completion Variables.
+* rl_basic_quote_characters: Completion Variables.
+* rl_basic_word_break_characters: Completion Variables.
+* rl_begin_undo_group: Allowing Undoing.
+* rl_binding_keymap: Readline Variables.
+* rl_bind_key: Binding Keys.
+* rl_bind_key_in_map: Binding Keys.
+* rl_callback_handler_install: Alternate Interface.
+* rl_callback_handler_remove: Alternate Interface.
+* rl_callback_read_char: Alternate Interface.
+* rl_char_is_quoted_p: Completion Variables.
+* rl_clear_message: Redisplay.
+* rl_complete: Completion Functions.
+* rl_complete: How Completing Works.
+* rl_completer_quote_characters: Completion Variables.
+* rl_completer_word_break_characters: Completion Variables.
+* rl_complete_internal: Completion Functions.
+* rl_completion_append_character: Completion Variables.
+* rl_completion_entry_function: Completion Variables.
+* rl_completion_entry_function: How Completing Works.
+* rl_completion_query_items: Completion Variables.
+* rl_copy_keymap: Keymaps.
+* rl_copy_text: Modifying Text.
+* rl_delete_text: Modifying Text.
+* rl_directory_completion_hook: Completion Variables.
+* rl_discard_keymap: Keymaps.
+* rl_done: Readline Variables.
+* rl_do_undo: Allowing Undoing.
+* rl_end: Readline Variables.
+* rl_end_undo_group: Allowing Undoing.
+* rl_event_hook: Readline Variables.
+* rl_executing_keymap: Readline Variables.
+* rl_filename_completion_desired: Completion Variables.
+* rl_filename_dequoting_function: Completion Variables.
+* rl_filename_quote_characters: Completion Variables.
+* rl_filename_quoting_desired: Completion Variables.
+* rl_filename_quoting_function: Completion Variables.
+* rl_forced_update_display: Redisplay.
+* rl_function_dumper: Associating Function Names and Bindings.
+* rl_function_of_keyseq: Associating Function Names and Bindings.
+* rl_generic_bind: Binding Keys.
+* rl_getc: Utility Functions.
+* rl_getc_function: Readline Variables.
+* rl_get_keymap: Keymaps.
+* rl_get_keymap_by_name: Keymaps.
+* rl_get_keymap_name: Keymaps.
+* rl_ignore_completion_duplicates: Completion Variables.
+* rl_ignore_some_completions_function: Completion Variables.
+* rl_inhibit_completion: Completion Variables.
+* rl_initialize: Utility Functions.
+* rl_insert_completions: Completion Functions.
+* rl_insert_text: Modifying Text.
+* rl_instream: Readline Variables.
+* rl_invoking_keyseqs: Associating Function Names and Bindings.
+* rl_invoking_keyseqs_in_map: Associating Function Names and Bindings.
+* rl_kill_text: Modifying Text.
+* rl_library_version: Readline Variables.
+* rl_line_buffer: Readline Variables.
+* rl_list_funmap_names: Associating Function Names and Bindings.
+* rl_make_bare_keymap: Keymaps.
+* rl_make_keymap: Keymaps.
+* rl_mark: Readline Variables.
+* rl_message: Redisplay.
+* rl_modifying: Allowing Undoing.
+* rl_named_function: Associating Function Names and Bindings.
+* rl_on_new_line: Redisplay.
+* rl_outstream: Readline Variables.
+* rl_parse_and_bind: Binding Keys.
+* rl_pending_input: Readline Variables.
+* rl_point: Readline Variables.
+* rl_possible_completions: Completion Functions.
+* rl_prompt: Readline Variables.
+* rl_readline_name: Readline Variables.
+* rl_read_init_file: Binding Keys.
+* rl_read_key: Utility Functions.
+* rl_redisplay: Redisplay.
+* rl_redisplay_function: Readline Variables.
+* rl_reset_line_state: Redisplay.
+* rl_reset_terminal: Utility Functions.
+* rl_set_keymap: Keymaps.
+* rl_special_prefixes: Completion Variables.
+* rl_startup_hook: Readline Variables.
+* rl_stuff_char: Utility Functions.
+* rl_terminal_name: Readline Variables.
+* rl_unbind_key: Binding Keys.
+* rl_unbind_key_in_map: Binding Keys.
+* self-insert (a, b, A, 1, !, ...): Commands For Text.
+* set-mark (C-@): Miscellaneous Commands.
+* show-all-if-ambiguous: Readline Init File Syntax.
+* start-kbd-macro (C-x (): Keyboard Macros.
+* tab-insert (M-TAB): Commands For Text.
+* tilde-expand (M-~): Miscellaneous Commands.
+* to_lower: Utility Functions.
+* to_upper: Utility Functions.
+* transpose-chars (C-t): Commands For Text.
+* transpose-words (M-t): Commands For Text.
+* undo (C-_, C-x C-u): Miscellaneous Commands.
+* universal-argument (): Numeric Arguments.
+* unix-line-discard (C-u): Commands For Killing.
+* unix-word-rubout (C-w): Commands For Killing.
+* upcase-word (M-u): Commands For Text.
+* uppercase_p: Utility Functions.
+* username_completion_function: Completion Functions.
+* visible-stats: Readline Init File Syntax.
+* yank (C-y): Commands For Killing.
+* yank-last-arg (M-., M-_): Commands For History.
+* yank-nth-arg (M-C-y): Commands For History.
+* yank-pop (M-y): Commands For Killing.
+
+

Tag Table:
-(Indirect)
-Node: Top1000
-Node: Command Line Editing1613
-Node: Introduction and Notation2264
-Node: Readline Interaction3284
-Node: Readline Bare Essentials4423
-Node: Readline Movement Commands5953
-Node: Readline Killing Commands6844
-Node: Readline Arguments8547
-Node: Readline Init File9498
-Node: Readline Init Syntax10502
-Node: Conditional Init Constructs17435
-Node: Bindable Readline Commands19681
-Node: Commands For Moving20351
-Node: Commands For History21199
-Node: Commands For Text23783
-Node: Commands For Killing25522
-Node: Numeric Arguments26971
-Node: Commands For Completion27598
-Node: Keyboard Macros28525
-Node: Miscellaneous Commands29084
-Node: Readline vi Mode30372
-Node: Programming with GNU Readline32122
-Node: Basic Behavior32919
-Node: Custom Functions36232
-Node: The Function Type36845
-Node: Function Writing37690
-Node: Readline Convenience Functions40453
-Node: Function Naming41118
-Node: Keymaps42345
-Node: Binding Keys43856
-Node: Associating Function Names and Bindings45650
-Node: Allowing Undoing46812
-Node: Redisplay49397
-Node: Modifying Text50467
-Node: Utility Functions51378
-Node: Custom Completers54444
-Node: How Completing Works55165
-Node: Completion Functions58156
-Node: Completion Variables61171
-Node: A Short Completion Example64996
-Node: Concept Index77230
-Node: Function and Variable Index77717
+Node: Top1042
+Node: Command Line Editing1655
+Node: Introduction and Notation2306
+Node: Readline Interaction3315
+Node: Readline Bare Essentials4504
+Node: Readline Movement Commands6034
+Node: Readline Killing Commands6925
+Node: Readline Arguments8628
+Node: Searching9602
+Node: Readline Init File11203
+Node: Readline Init File Syntax12266
+Node: Conditional Init Constructs20056
+Node: Sample Init File22338
+Node: Bindable Readline Commands25372
+Node: Commands For Moving26123
+Node: Commands For History26971
+Node: Commands For Text29585
+Node: Commands For Killing31328
+Node: Numeric Arguments33355
+Node: Commands For Completion34480
+Node: Keyboard Macros35364
+Node: Miscellaneous Commands35923
+Node: Readline vi Mode38734
+Node: Programming with GNU Readline40490
+Node: Basic Behavior41359
+Node: Custom Functions44672
+Node: The Function Type45273
+Node: Function Writing46118
+Node: Readline Variables47202
+Node: Readline Convenience Functions50290
+Node: Function Naming51021
+Node: Keymaps52248
+Node: Binding Keys53962
+Node: Associating Function Names and Bindings55906
+Node: Allowing Undoing57484
+Node: Redisplay60069
+Node: Modifying Text61140
+Node: Utility Functions62051
+Node: Alternate Interface64170
+Node: Custom Completers67464
+Node: How Completing Works68185
+Node: Completion Functions71181
+Node: Completion Variables74196
+Node: A Short Completion Example81338
+Node: Concept Index93644
+Node: Function and Variable Index94389

End Tag Table
diff --git a/doc/readline.ps b/doc/readline.ps
index e96ac47..ace5d14 100644
--- a/doc/readline.ps
+++ b/doc/readline.ps
@@ -1,3766 +1,3856 @@
-%!PS-Adobe-2.0
-%%Creator: dvipsk 5.490s Copyright 1986, 1992 Radical Eye Software
-%%Title: readline.dvi
-%%Pages: 52 1
-%%BoundingBox: 0 0 612 792
-%%EndComments
+%!PS (but not EPSF; comments have been disabled)
%DVIPSCommandLine: dvips -D 300 -o readline.ps readline.dvi
-%%BeginProcSet: tex.pro
-%!
-/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}
-B /TR{translate}N /isls false N /vsize 11 72 mul N /@rigin{isls{[0 -1 1 0 0 0]
-concat}if 72 Resolution div 72 VResolution div neg scale isls{Resolution hsize
--72 div mul 0 TR}if Resolution VResolution vsize -72 div 1 add mul TR matrix
-currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put
-setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed
-true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N
-/IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix
-fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{
-CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn
-put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0
-0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data
-dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128
-ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127
-sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type
-/stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N
-/cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get
-S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height
-sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0
--1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{/cc X dup
-type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1
-ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}
-B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
-0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add
-.99 lt{/FV}{/RV}ifelse load def pop}N /eop{SI restore showpage userdict
-/eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook}
-if /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE
-S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div
-/hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley
-0 N /v{/ruley X /rulex X V}B /V{}B /RV statusdict begin /product where{pop
-product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval
-(NeXT)eq or}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale
-rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex
-ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /FV{gsave
-transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
-rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail{dup
-/delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}B /d{-3 M}
-B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B /w{0
-rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w}B /r{p 2 w}
-B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B
-/eos{SS restore}B end
-%%EndProcSet
-TeXDict begin 40258431 52099146 1000 300 300 @start /Fa 1 59
-df<70F8F8F87005057C840D>58 D E /Fb 1 59 df<78FCFCFCFC7806067B8510>58
-D E /Fc 49 127 df<60F0F0F0F0F0F0F0F0F0F0F0F0F0600000000060F0F0600417789614>33
-D<00800180018007E01FF039BC619CC18EC18EC18EC18471807F803FE00FF001F8019C018E4186
-E186E186E186718C39B81FF00FC00180018000800F1D7E9914>36 D<00C001C0030006000C001C
-0038003000700070006000E000E000E000E000E000E000E000600070007000300038001C000C00
-0600030001C000C00A1D7A9914>40 D<8000C0006000300018001C000E00060007000700030003
-8003800380038003800380038003000700070006000E001C00180030006000C0008000091D7C99
-14>I<70F8FCFC7C0C1830E0C0060A798414>44 D<FFFEFFFEFFFE0F037E8C14>I<70F8F8F87005
-05798414>I<07C00FE01C7038383018701C701CE00EE00EE00EE00EE00EE00EE00EE00EE00E70
-1C701C383838381C700FE007C00F177E9614>48 D<0300030007000F003F00F700470007000700
-0700070007000700070007000700070007000700070007007FF07FF00C177C9614>I<000E003E
-007C00F003E007C01F003E00F800F000F8003E001F0007C003E000F0007C003E000E0F137E9414
->60 D<4000E000F8007C001E000F8007C001F000F8003E001E003E00F801F007C00F801E007C00
-F800E00040000F157E9514>62 D<1FE03FF8701CE00EE00E400E003C007000E001C00380038003
-8003800300000000000000000003000780078003000F177E9614>I<01C00003E00003E0000360
-000360000770000770000770000770000630000E38000E38000E38000E38000E38001FFC001FFC
-001C1C001C1C003C1E00380E00FE3F80FE3F8011177F9614>65 D<FFF0FFFC381E380E38073807
-38073807380E381E3FFC3FFC381E380E38073807380738073807380E381EFFFCFFF810177F9614
->I<03C60FFE1C3E181E381E700E700E600EE000E000E000E000E000E000E000600E700E700E38
-0C181C1C380FF003C00F177E9614>I<FFE000FFF800383C00381E00380E003807003807003807
-00380380380380380380380380380380380380380380380380380700380700380E00381E00383C
-00FFF800FFE00011177F9614>I<FFFF00FFFF0038070038070038070038070038000038000038
-70003870003FF0003FF000387000387000380000380000380000380380380380380380380380FF
-FF80FFFF8011177F9614>I<FF00FF003800380038003800380038003800380038003800380038
-003800380038003807380738073807FFFFFFFF10177E9614>76 D<FE0FE0FE0FE03E0F803B1B80
-3B1B803B1B803B1B803BBB803BBB8039B38039B38039B38039F38038E38038E380380380380380
-380380380380380380380380FE0FE0FE0FE01317809614>I<FE3F80FE3F803E0E003B0E003B0E
-003B0E003B0E003B8E00398E00398E0039CE0039CE0039CE0038CE0038CE0038EE00386E00386E
-00386E00386E00383E00FE3E00FE3E0011177F9614>I<FFE000FFF800383C00381C00380E0038
-0E00380E00380E00381C00383C003FF8003FF000383800381C00381C00381C00381C00381C0038
-1C80381DC0381DC0FE0F80FE070012177F9614>82 D<0FCC1FFC307C603CE01CE01CE01CE00070
-007E003FE00FF001F8001C001E000E600EE00EE00EF01CF838FFF0C7E00F177E9614>I<7FFF80
-FFFF80E1C380E1C380E1C380E1C38001C00001C00001C00001C00001C00001C00001C00001C000
-01C00001C00001C00001C00001C00001C00001C0000FF8000FF80011177F9614>I<1FC0007FF0
-00707800201800001C00001C0007FC001FFC003C1C00701C00E01C00E01C00E01C00707C003FFF
-800F8F8011107E8F14>97 D<FC0000FC00001C00001C00001C00001C00001C00001CF8001DFE00
-1F07001E03001C03801C01C01C01C01C01C01C01C01C01C01C01C01C03801E03001F0E001DFC00
-0CF8001217809614>I<03F80FFC1C1C380870006000E000E000E000E00060007000380E1C1E0F
-FC03F00F107E8F14>I<007E00007E00000E00000E00000E00000E00000E0007CE000FFE001C3E
-00301E00700E00E00E00E00E00E00E00E00E00E00E00E00E00700E00301E00383E001FEFC007CF
-C012177F9614>I<07E00FF01C38301C700CE00EE00EFFFEFFFEE00060007000380E1C1E0FFC03
-F00F107E8F14>I<007C00FE01CE03840380038003807FFEFFFE03800380038003800380038003
-80038003800380038003807FFC7FFC0F177F9614>I<07CF001FFF80383B80301800701C00701C
-00701C003018003838003FF00037C0007000007000003FF8001FFC003FFE00700F00E00380E003
-80E00380E003807007003C1E001FFC0007F00011197F8F14>I<FC0000FC00001C00001C00001C
-00001C00001C00001C78001DFE001F86001E07001C07001C07001C07001C07001C07001C07001C
-07001C07001C07001C0700FF8FE0FF8FE01317809614>I<030007800780030000000000000000
-007F807F80038003800380038003800380038003800380038003800380FFFCFFFC0E187D9714>
-I<FC0000FC00001C00001C00001C00001C00001C00001DFF801DFF801C3C001C78001CF0001DE0
-001FC0001FC0001FE0001EF0001C70001C38001C38001C1C00FE3F80FE3F8011177F9614>107
-D<FF80FF8003800380038003800380038003800380038003800380038003800380038003800380
-03800380FFFEFFFE0F177E9614>I<FB8E00FFDF003CF3803CF38038E38038E38038E38038E380
-38E38038E38038E38038E38038E38038E380FEFBE0FE79E01310808F14>I<FC7800FDFE001F86
-001E07001C07001C07001C07001C07001C07001C07001C07001C07001C07001C0700FF8FE0FF8F
-E01310808F14>I<07C01FF03C78701C701CE00EE00EE00EE00EE00EE00E701C783C3C781FF007
-C00F107E8F14>I<FCF800FDFE001F07001E03001C03801C01C01C01C01C01C01C01C01C01C01C
-01C01C03801E03001F0E001DFC001CF8001C00001C00001C00001C00001C00001C0000FF8000FF
-80001218808F14>I<03CE000FFE001C3E00301E00700E00E00E00E00E00E00E00E00E00E00E00
-E00E00700E00301E001C3E000FEE0007CE00000E00000E00000E00000E00000E00000E00007FC0
-007FC012187F8F14>I<FE1F00FE7F800EE3800F81000F00000F00000E00000E00000E00000E00
-000E00000E00000E00000E0000FFF000FFF00011107F8F14>I<0FD83FF86038C038C038F0007F
-803FF007F8001C6006E006F006F81CFFF8CFE00F107E8F14>I<030007000700070007007FFCFF
-FC07000700070007000700070007000700070E070E070E070C03FC00F00F157F9414>I<FC3F00
-FC3F001C07001C07001C07001C07001C07001C07001C07001C07001C07001C07001C07001C1F00
-0FFFE003E7E01310808F14>I<FE3F80FE3F801C1C001C1C001C1C001C1C000E38000E38000E38
-0006300007700007700007700003E00003E00003E00011107F8F14>I<FF7F80FF7F80380E0038
-0E00380E00380E0039CE0039CE0019CC001B6C001B6C001A6C001A6C001E7C000E78000E780011
-107F8F14>I<7E3F007E3F001E38000E780007700007E00003E00001C00003C00003E000077000
-0E78000E38001C1C00FE3F80FE3F8011107F8F14>I<FE3F80FE3F801C1C001C1C001C1C000E1C
-000E38000E380007380007300007300003700003700001E00001E00001E00001C00001C00001C0
-000380007380007700007E00003C000011187F8F14>I<3FFF7FFF700E701C7038007000E001C0
-038007000E001C0738077007FFFFFFFF10107F8F14>I<1C103F38E7E041C00D047D9614>126
-D E /Fd 1 59 df<60F0F06004047D830B>58 D E /Fe 41 123 df<00FC000182000703000607
-000E02000E00000E00000E00000E00000E0000FFFF000E07000E07000E07000E07000E07000E07
-000E07000E07000E07000E07000E07000E07000E07000E07007F0FE0131A809915>12
-D<00FF000387000707000607000E07000E07000E07000E07000E07000E0700FFFF000E07000E07
-000E07000E07000E07000E07000E07000E07000E07000E07000E07000E07000E07000E07007F9F
-E0131A809915>I<60F0F07010101020204080040B7D830B>44 D<FFC0FFC00A0280880D>I<0780
-18603030303060186018E01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01C6018601870
-383030186007800E187E9713>48 D<03000700FF00070007000700070007000700070007000700
-07000700070007000700070007000700070007000700FFF00C187D9713>I<0F80106020304038
-803CC01CE01C401C003C003800380070006000C001800100020004040804100430083FF87FF8FF
-F80E187E9713>I<0F8010E02070607870382038007800700070006000C00F8000E00070003800
-3C003CE03CE03CC03C4038407030E00F800E187E9713>I<00300030007000F000F00170037002
-7004700C7008701070307020704070C070FFFF00700070007000700070007007FF10187F9713>
-I<30183FF03FE03FC02000200020002000200027C03860203000380018001C001C401CE01CE01C
-80184038403030E00F800E187E9713>I<01E006100C1818383038300070006000E000E7C0E860
-F030F018E018E01CE01CE01C601C601C701830183030186007C00E187E9713>I<40007FFE7FFC
-7FFC40088010801080200040004000800180018001000300030003000300070007000700070007
-00070002000F197E9813>I<078018603030201860186018601870103C303E600F8007C019F030
-F86038401CC00CC00CC00CC00C6008201018600FC00E187E9713>I<07801860303070306018E0
-18E018E01CE01CE01C601C603C303C185C0F9C001C00180018003870307060604021801F000E18
-7E9713>I<FFE07F800E001E000E0018000E0010000E0020000E0040000E0080000E0100000E02
-00000E0400000E0800000E1C00000E2E00000E4E00000E8700000F0380000E0380000E01C0000E
-00E0000E00E0000E0070000E0070000E0038000E001C000E003E00FFE0FF80191A7E991E>75
-D<FF801FE01E0007000E0006000F000400070008000780080003C0100001C0300001E0200000F0
-4000007040000078800000388000001D0000001F0000000E0000000E0000000E0000000E000000
-0E0000000E0000000E0000000E0000000E0000000E000000FFE0001B1A7F991D>89
-D<3F8070C070E020700070007007F01C7030707070E070E071E071E0F171FB1E3C10107E8F13>
-97 D<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001CF8001F0E00
-1E07001C03801C01801C01C01C01C01C01C01C01C01C01C01C01C01C03801C03001E07001B0C00
-10F000121A7F9915>I<07F80C1C381C30087000E000E000E000E000E000E0007000300438080C
-1807E00E107F8F11>I<007E00000E00000E00000E00000E00000E00000E00000E00000E00000E
-0003CE000C3E00380E00300E00700E00E00E00E00E00E00E00E00E00E00E00E00E00600E00700E
-00381E001C2E0007CFC0121A7F9915>I<07C01C3030187018600CE00CFFFCE000E000E000E000
-6000300438080C1807E00E107F8F11>I<01F0031807380E100E000E000E000E000E000E00FFC0
-0E000E000E000E000E000E000E000E000E000E000E000E000E000E007FE00D1A80990C>I<0FCE
-187330307038703870387038303018602FC02000600070003FF03FFC1FFE600FC003C003C003C0
-036006381C07E010187F8F13>I<FC00001C00001C00001C00001C00001C00001C00001C00001C
-00001C00001CF8001D0C001E0E001E0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C
-0E001C0E001C0E001C0E00FF9FC0121A7F9915>I<18003C003C00180000000000000000000000
-0000FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF80091A80990A
->I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C3F801C1E001C
-18001C10001C20001C40001DC0001FE0001CE0001C70001C78001C38001C1C001C1E001C1F00FF
-3FC0121A7F9914>107 D<FC001C001C001C001C001C001C001C001C001C001C001C001C001C00
-1C001C001C001C001C001C001C001C001C001C001C00FF80091A80990A>I<FC7C1F001D8E6380
-1E0781C01E0781C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701
-C01C0701C01C0701C01C0701C0FF9FE7F81D107F8F20>I<FCF8001D0C001E0E001E0E001C0E00
-1C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E00FF9FC012107F8F15>
-I<07E01C38300C700E6006E007E007E007E007E007E0076006700E381C1C3807E010107F8F13>
-I<FCF8001F0E001E07001C03801C03801C01C01C01C01C01C01C01C01C01C01C01C01C03801C03
-001E07001F0C001CF0001C00001C00001C00001C00001C00001C0000FF800012177F8F15>I<03
-C2000C2600381E00300E00700E00E00E00E00E00E00E00E00E00E00E00E00E00700E00700E0038
-1E001C2E0007CE00000E00000E00000E00000E00000E00000E00007FC012177F8F14>I<FCE01D
-701E701E201C001C001C001C001C001C001C001C001C001C001C00FFC00C107F8F0F>I<1F2060
-E04020C020C020F0007F003FC01FE000F080708030C030C020F0408F800C107F8F0F>I<040004
-0004000C000C001C003C00FFC01C001C001C001C001C001C001C001C001C201C201C201C201C20
-0E4003800B177F960F>I<FC7E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C
-0E001C0E001C0E001C0E001C1E000C2E0007CFC012107F8F15>I<FF1F803C06001C04001C0400
-1E0C000E08000E080007100007100007900003A00003A00001C00001C00001C00000800011107F
-8F14>I<FF3F9F803C0E0700380E06001C1604001C1704001E170C000E2308000E2388000F2398
-00074190000741D00003C1E0000380E0000380E0000180C0000100400019107F8F1C>I<FF3F80
-3C1C001C18000E100007200007600003C00001C00001E00003E000027000043800083800181C00
-381E00FC3FC012107F8F14>I<FF1F803C06001C04001C04001E0C000E08000E08000710000710
-0007900003A00003A00001C00001C00001C000008000008000010000010000E10000E20000E400
-0078000011177F8F14>I<7FF86070407040E041C041C00380070007000E081C081C0838107010
-7030FFF00D107F8F11>I E /Ff 2 42 df<007000E001C00380078007000E001E001E003C003C
-003C0078007800780078007000F000F000F000F000F000F000F000F000F000F000F000F0007000
-78007800780078003C003C003C001E001E000E0007000780038001C000E000700C2E7EA112>40
-D<E000700038001C001E000E0007000780078003C003C003C001E001E001E001E000E000F000F0
-00F000F000F000F000F000F000F000F000F000F000E001E001E001E001E003C003C003C0078007
-8007000E001E001C0038007000E0000C2E7DA112>I E /Fg 26 122 df<000FF07F00007FFBFF
-C001F83FE3C003F07F87E007E07F87E00FC07F07E00FC07F03C00FC03F00000FC03F00000FC03F
-00000FC03F00000FC03F00000FC03F0000FFFFFFFC00FFFFFFFC000FC03F00000FC03F00000FC0
-3F00000FC03F00000FC03F00000FC03F00000FC03F00000FC03F00000FC03F00000FC03F00000F
-C03F00000FC03F00000FC03F00000FC03F00000FC03F00000FC03F00000FC03F00000FC03F0000
-7FF9FFF0007FF9FFF00023237FA221>11 D<0007F800007FFC0001FC0E0003F01F0007E03F000F
-C03F000FC03F000FC03F000FC01E000FC00C000FC000000FC000000FC0FF80FFFFFF80FFFFFF80
-0FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F
-800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F807FF8FFF07FF8
-FFF01C237FA220>I<07FE00001FFF80003F07E0003F03F0003F01F0003F01F8001E01F8000001
-F8000001F800003FF80003FDF8001F81F8003E01F8007C01F800F801F800F801F800F801F800F8
-01F8007C02F8007E0CF8001FF87F8007E03F8019167E951C>97 D<FF800000FF8000001F800000
-1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000
-001F87F0001FBFFC001FF03E001FC01F001F800F801F800FC01F8007C01F8007E01F8007E01F80
-07E01F8007E01F8007E01F8007E01F8007E01F8007C01F8007C01F800FC01F800F801FC01F001E
-707E001C3FFC00180FE0001B237EA220>I<00FF8007FFE00F83F01F03F03E03F07E03F07C01E0
-7C0000FC0000FC0000FC0000FC0000FC0000FC00007C00007E00007E00003F00301F00600FC0E0
-07FF8000FE0014167E9519>I<0001FF000001FF0000003F0000003F0000003F0000003F000000
-3F0000003F0000003F0000003F0000003F0000003F0000003F0000FE3F0007FFBF000FC1FF001F
-007F003E003F007E003F007C003F007C003F00FC003F00FC003F00FC003F00FC003F00FC003F00
-FC003F00FC003F007C003F007E003F003E003F001F007F000F81FF0007FF3FE001FC3FE01B237E
-A220>I<00FE0007FF800F83C01F01E03E00F07E00F07C00F87C0078FC0078FFFFF8FFFFF8FC00
-00FC0000FC00007C00007C00003E00183E00181F00300F80E003FFC000FF0015167E951A>I<00
-1F8000FFE001F1F003E3F007E3F00FC3F00FC1E00FC0000FC0000FC0000FC0000FC0000FC000FF
-FE00FFFE000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000F
-C0000FC0000FC0000FC0000FC0000FC0000FC0007FFC007FFC0014237EA212>I<00FE0F8003FF
-9FC00F83E3C01F01F3C01E00F0003E00F8003E00F8003E00F8003E00F8003E00F8001E00F0001F
-01F0000F83E0000BFF800008FE000018000000180000001C0000001FFFE0001FFFFC000FFFFF00
-07FFFF001FFFFF807C001FC078000FC0F80007C0F80007C0F80007C07C000F803E001F001F807E
-000FFFFC0001FFE0001A217F951D>I<FF800000FF8000001F8000001F8000001F8000001F8000
-001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F83F0001F8FFC001F98
-7E001FA03E001FC03F001FC03F001F803F001F803F001F803F001F803F001F803F001F803F001F
-803F001F803F001F803F001F803F001F803F001F803F001F803F001F803F00FFF1FFE0FFF1FFE0
-1B237DA220>I<1E003F007F807F807F807F803F001E00000000000000000000000000FF80FF80
-1F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F80FFF0FF
-F00C247EA30F>I<FF800000FF8000001F8000001F8000001F8000001F8000001F8000001F8000
-001F8000001F8000001F8000001F8000001F8000001F80FF801F80FF801F803C001F8030001F80
-E0001F81C0001F8300001F8600001F9E00001FBE00001FFF00001FDF80001F8FC0001F07C0001F
-07E0001F03F0001F01F8001F00F8001F00FC001F007E00FFE1FFC0FFE1FFC01A237EA21E>107
-D<FF80FF801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F80
-1F801F801F801F801F801F801F801F801F801F801F801F801F801F80FFF0FFF00C237EA20F>I<
-FF03F803F800FF0FFE0FFE001F183F183F001F201F201F001F401FC01F801F401FC01F801F801F
-801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F80
-1F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F
-801F80FFF0FFF0FFF0FFF0FFF0FFF02C167D9531>I<FF03F000FF0FFC001F187E001F203E001F
-403F001F403F001F803F001F803F001F803F001F803F001F803F001F803F001F803F001F803F00
-1F803F001F803F001F803F001F803F001F803F001F803F00FFF1FFE0FFF1FFE01B167D9520>I<
-00FF0007FFE00F81F01F00F83E007C7C003E7C003E7C003EFC003FFC003FFC003FFC003FFC003F
-FC003FFC003F7C003E7E007E3E007C1F00F80F81F007FFE000FF0018167E951D>I<FF87F000FF
-BFFC001FF07E001FC01F001F800F801F800FC01F800FC01F8007E01F8007E01F8007E01F8007E0
-1F8007E01F8007E01F8007E01F8007C01F800FC01F800FC01F801F801FC01F001FF07E001FBFFC
-001F8FE0001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000FFF0
-0000FFF000001B207E9520>I<00FE030007FF07000FC1CF001F00DF003F007F007E003F007E00
-3F007C003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F007E003F007E
-003F003E007F001F00FF000FC1FF0007FF3F0001FC3F0000003F0000003F0000003F0000003F00
-00003F0000003F0000003F0000003F000001FFE00001FFE01B207E951E>I<FF0F80FF1FE01F33
-F01F63F01F43F01F43F01FC1E01F80001F80001F80001F80001F80001F80001F80001F80001F80
-001F80001F80001F80001F8000FFF800FFF80014167E9518>I<07F9801FFF80380780700380F0
-0180F00180F80000FF0000FFF8007FFE003FFF001FFF8007FF80003FC0C007C0C003C0E003C0E0
-03C0F00380FC0F00EFFE00C3F80012167E9517>I<00C00000C00000C00000C00001C00001C000
-03C00007C0000FC0001FC000FFFF00FFFF000FC0000FC0000FC0000FC0000FC0000FC0000FC000
-0FC0000FC0000FC0000FC0000FC1800FC1800FC1800FC1800FC18007C18007E30003FE0000FC00
-11207F9F16>I<FF81FF00FF81FF001F803F001F803F001F803F001F803F001F803F001F803F00
-1F803F001F803F001F803F001F803F001F803F001F803F001F803F001F803F001F803F001F807F
-001F80FF000FC1BF0007FF3FE001FC3FE01B167D9520>I<FFF01FE0FFF01FE00FC007000FC006
-000FE00E0007E00C0007F01C0003F0180003F8180001F8300001F8300000FC600000FC6000007E
-C000007EC000007FC000003F8000003F8000001F0000001F0000000E0000000E00001B167F951E
->I<FFF3FF87FCFFF3FF87FC1F807C00E00FC07C00C00FC07E00C00FE03E01C007E03F018007E0
-7F018003F07F030003F0CF830001F8CF860001F8CFC60001FD87C60000FD87CC0000FF03EC0000
-7F03F800007F03F800007E01F800003E01F000003C00F000001C00E000001800600026167F9529
->I<FFF0FFC0FFF0FFC00FC01C0007E0380007F0700003F0E00001F8C00000FD8000007F000000
-7F0000003F0000001F8000003FC0000037E0000067F00000C3F00001C1F8000380FC000700FE00
-0E007E00FFC1FFE0FFC1FFE01B167F951E>I<FFF01FE0FFF01FE00FC007000FC006000FE00E00
-07E00C0007F01C0003F0180003F8180001F8300001F8300000FC600000FC6000007EC000007EC0
-00007FC000003F8000003F8000001F0000001F0000000E0000000E0000000C0000000C00000018
-000078180000FC380000FC300000FC60000069E000007F8000001F0000001B207F951E>I
-E /Fh 23 122 df<00E00000E00000E00000E00040E040F0E1E0F8E3E07EEFC01FFF0007FC0003
-F80007FC001FFF007EEFC0F8E3E0F0E1E040E04000E00000E00000E00000E00013157D991A>42
-D<007C3801FF3807FFF80F83F81E00F81C0078380078380038700038700038700000E00000E000
-00E00000E00000E00000E00000E00000E000007000007000387000383800383800381C00701E00
-F00F83E007FFC001FF80007C00151E7E9D1A>67 D<7FFFFCFFFFFC7FFFFC0E001C0E001C0E001C
-0E001C0E001C0E00000E00000E07000E07000E07000FFF000FFF000FFF000E07000E07000E0700
-0E00000E00000E00000E000E0E000E0E000E0E000E0E000E7FFFFEFFFFFE7FFFFE171E7F9D1A>
-69 D<7FFFFCFFFFFC7FFFFC0E001C0E001C0E001C0E001C0E001C0E00000E00000E07000E0700
-0E07000FFF000FFF000FFF000E07000E07000E07000E00000E00000E00000E00000E00000E0000
-0E00000E00007FE000FFF0007FE000161E7F9D1A>I<FFFF80FFFF80FFFF8001C00001C00001C0
-0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0
-0001C00001C00001C00001C00001C00001C00001C00001C000FFFF80FFFF80FFFF80111E7C9D1A
->73 D<FF83F8FF87FCFF83F81C01E01C03C01C03801C07001C0F001C1E001C1C001C38001C7800
-1CF0001CF8001DF8001FDC001F9C001F0E001E0F001E07001C07801C03801C01C01C01C01C00E0
-1C00E01C0070FF81FCFF81FEFF81FC171E7F9D1A>75 D<7FE000FFF0007FE0000E00000E00000E
-00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E
-00000E00000E00000E00000E00380E00380E00380E00380E00387FFFF8FFFFF87FFFF8151E7E9D
-1A>I<7FFF00FFFFC07FFFE00E01F00E00780E00380E003C0E001C0E001C0E001C0E001C0E003C
-0E00380E00780E01F00FFFE00FFFC00FFF000E00000E00000E00000E00000E00000E00000E0000
-0E00000E00007FC000FFE0007FC000161E7F9D1A>80 D<1FF0003FFC007FFE00780F0030070000
-0380000380007F8007FF801FFF803F8380780380700380E00380E00380E00380700780780F803F
-FFFC1FFDFC07F0FC16157D941A>97 D<00FF8003FFC00FFFE01F01E03C00C07800007000007000
-00E00000E00000E00000E00000E000007000007000007800703C00701F01F00FFFE003FFC000FE
-0014157D941A>99 D<001FC0001FC0001FC00001C00001C00001C00001C00001C00001C001F1C0
-07FDC00FFFC01E0FC03C07C07803C07001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C0
-7003C07003C03807C03E0FC01FFFFC07FDFC01F1FC161E7E9D1A>I<01F80007FF000FFF801E07
-C03C01C07800E07000E0E00070E00070FFFFF0FFFFF0FFFFF0E000007000007000007800703C00
-701F01F00FFFE003FFC000FE0014157D941A>I<FE0000FE0000FE00000E00000E00000E00000E
-00000E00000E00000E3E000EFF800FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E00E
-00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E0FFE3FEFFE3FEFFE3FE171E7F9D1A>
-104 D<01C00003E00003E00003E00001C0000000000000000000000000000000007FE000FFE000
-7FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E000
-00E00000E00000E000FFFFC0FFFFC0FFFFC0121F7C9E1A>I<7CE0E000FFFBF8007FFFF8001F1F
-1C001E1E1C001E1E1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C
-1C1C001C1C1C001C1C1C001C1C1C001C1C1C007F1F1F00FF9F9F807F1F1F00191580941A>109
-D<FE3E00FEFF80FFFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00
-E00E00E00E00E00E00E00E00E00E00E0FFE3FEFFE3FEFFE3FE17157F941A>I<01F00007FC001F
-FF003E0F803C07807803C07001C0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C078
-03C03C07803E0F801FFF0007FC0001F00013157D941A>I<FE3E00FEFF80FFFFE00FC1F00F8070
-0F00380E00380E001C0E001C0E001C0E001C0E001C0E001C0E001C0F00380F00780F80F00FC1E0
-0FFFC00EFF800E3E000E00000E00000E00000E00000E00000E00000E00000E0000FFE000FFE000
-FFE00016207F941A>I<FF83F0FF8FF8FFBFFC03FC3C03F01803E00003C00003C0000380000380
-00038000038000038000038000038000038000038000038000FFFF00FFFF80FFFF0016157E941A
->114 D<00C00001C00001C00001C00001C00001C00001C0007FFFE0FFFFE0FFFFE001C00001C0
-0001C00001C00001C00001C00001C00001C00001C00001C00001C07001C07001C07001C07000E0
-E000FFE0007FC0001F00141C7F9B1A>116 D<FE0FE0FE0FE0FE0FE00E00E00E00E00E00E00E00
-E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFE03FF
-FE00FCFE17157F941A>I<7FC7FCFFC7FE7FC7FC0E00E00E00E00F01E00701C00701C00783C003
-838003838003838001C70001C70001C70000EE0000EE0000EE00007C00007C0000380017157F94
-1A>I<7FC7FCFFC7FE7FC7FC0E00E00F00E00701E00701C00781C00381C003838001C38001C380
-01C70000E70000E70000E600006600006E00003C00003C00003C00003C00003800003800007800
-00700030700078E00079E0007FC0003F80001E000017207F941A>121 D
-E /Fi 51 122 df<3C7EFFFFFFFF7E3C08087C8711>46 D<001C00003C0000FC00FFFC00FFFC00
-00FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00
-00FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00
-00FC0000FC007FFFFC7FFFFC16237CA21F>49 D<01FF0007FFC01E07F03803F86001FC7C00FEFE
-00FEFE00FFFE007FFE007F7C007F3800FF0000FF0000FE0000FE0001FC0001F80003F00007E000
-0780000F00001E00003C0000700000E00301C0030380070700060600060FFFFE1FFFFE3FFFFE7F
-FFFCFFFFFCFFFFFC18237DA21F>I<01FF0007FFE01E03F03801F83C01FC7E00FE7E00FE7E00FE
-3E00FE1C01FE0001FC0001FC0003F80007F0000FC001FF0001FF000007E00001F00001F80000FC
-0000FE0000FF0000FF1000FF7C00FFFE00FFFE00FFFE00FEFE00FE7C01FC7001F83E07F00FFFC0
-01FF0018237DA21F>I<0000380000007800000078000000F8000001F8000003F8000007F80000
-06F800000CF800001CF8000038F8000030F8000060F80000E0F80001C0F8000180F8000300F800
-0700F8000E00F8001C00F8001800F8003000F8007000F800E000F800FFFFFFC0FFFFFFC00001F8
-000001F8000001F8000001F8000001F8000001F8000001F800007FFFC0007FFFC01A237EA21F>
-I<18000C1F007C1FFFF81FFFF01FFFE01FFFC01FFF801FFE001800001800001800001800001800
-0018FF001BFFE01F01F01C00F80800FC00007E00007E00007E00007F00007F78007FFC007FFC00
-7FFC007FFC007EF8007E6000FC7000FC3801F81E07E007FFC001FE0018237DA21F>I<001FC000
-7FF001F83803E00C07803E0F807E1F007E3F007E3F007E7E003C7E00007E00007E0000FE3FC0FE
-7FF0FE80F8FF80FCFF007CFF007EFE007EFE007FFE007FFE007FFE007F7E007F7E007F7E007F7E
-007F3E007E3F007E1F007C0F80F807C1F003FFC0007F0018237DA21F>I<300000003C0000003F
-FFFFC03FFFFFC03FFFFF807FFFFF007FFFFE007FFFFC006000180060001800E0003000C0006000
-C000C0000001800000018000000300000007000000060000000E0000001E0000001E0000001E00
-00003C0000003C0000007C0000007C0000007C0000007C000000FC000000FC000000FC000000FC
-000000FC000000FC000000FC000000780000003000001A257DA41F>I<00FF8003FFE00F01F81C
-007C38003C38001E78001E78001E7C001E7E001E7F803C7FE03C3FF8781FFCF01FFFC00FFFC003
-FFE003FFF80FFFFC1E1FFC3C07FE7801FE7800FFF0003FF0001FF0000FF0000FF0000FF0000E78
-000E78001C3E00381F80F007FFE000FF0018237DA21F>I<00FF0003FFC00F83E01F00F03F00F8
-7E007C7E007C7E007EFE007EFE007EFE007EFE007FFE007FFE007FFE007F7E007F7E00FF3E00FF
-3F01FF1F017F0FFE7F03FC7F00007F00007E00007E3C007E7E00FC7E00FC7E00F87E00F07C01F0
-3003E01C0F800FFF0003F80018237DA21F>I<00001C00000000001C00000000003E0000000000
-3E00000000003E00000000007F00000000007F0000000000FF8000000000FF8000000000FF8000
-0000019FC0000000019FC0000000031FE0000000030FE0000000030FE00000000607F000000006
-07F00000000C07F80000000C03F80000001C03FC0000001801FC0000001801FC0000003001FE00
-00003000FE0000007FFFFF0000007FFFFF00000060007F000000C0007F800000C0003F800001C0
-003FC0000180001FC0000180001FC0000300000FE0000300000FE0000780000FF000FFF801FFFF
-80FFF801FFFF8029257EA42E>65 D<FFFFFFE000FFFFFFFC0003F0007F0003F0003F8003F0001F
-C003F0000FE003F0000FE003F0000FF003F0000FF003F00007F003F0000FF003F0000FF003F000
-0FE003F0001FE003F0001FC003F0007F8003F001FE0003FFFFF80003FFFFFF0003F0003FC003F0
-000FE003F00007F003F00007F803F00003F803F00003FC03F00003FC03F00003FC03F00003FC03
-F00003FC03F00003FC03F00003F803F00007F803F0000FF003F0001FE003F0007FC0FFFFFFFF00
-FFFFFFF80026257EA42C>I<0000FF8008000FFFF018003FC03C7800FE0006F801F80003F803F0
-0001F807E00000F80FC00000781FC00000783F800000383F800000387F800000187F000000187F
-00000018FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000
-FF00000000FF000000007F000000007F000000187F800000183F800000183F800000181FC00000
-300FC000003007E000006003F00000C001F800018000FE000700003FC01E00000FFFF8000000FF
-C00025257DA42C>I<FFFFFFFF00FFFFFFFF0003F8007F0003F8000F8003F800078003F8000380
-03F800038003F800018003F800018003F800018003F80000C003F80600C003F80600C003F80600
-0003F806000003F80E000003F81E000003FFFE000003FFFE000003F81E000003F80E000003F806
-000003F806000003F806006003F806006003F800006003F80000C003F80000C003F80000C003F8
-0000C003F80001C003F80003C003F80003C003F8000F8003F8003F80FFFFFFFF80FFFFFFFF8023
-257EA428>69 D<FFFFFFFE00FFFFFFFE0003F800FE0003F8001F0003F8000F0003F800070003F8
-00070003F800030003F800030003F800030003F800018003F806018003F806018003F806000003
-F806000003F80E000003F81E000003FFFE000003FFFE000003F81E000003F80E000003F8060000
-03F806000003F806000003F806000003F800000003F800000003F800000003F800000003F80000
-0003F800000003F800000003F800000003F800000003F8000000FFFFF00000FFFFF0000021257E
-A427>I<FFFFE0FFFFE0FFFFE0FFFFE003F80003F80003F80003F80003F80003F80003F80003F8
-0003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F8
-0003F80003F80003F80003F80003F80003F80003F80003F80003F80003FFFFFFF80003FFFFFFF8
-0003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F8
-0003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F8
-0003F80003F80003F80003F80003F80003F800FFFFE0FFFFE0FFFFE0FFFFE02B257EA430>72
-D<FFFFE0FFFFE003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F8
-0003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F8
-0003F80003F80003F80003F80003F80003F80003F80003F80003F800FFFFE0FFFFE013257EA417
->I<FFFFE007FF80FFFFE007FF8003F80000780003F80000600003F80000C00003F80001800003
-F80007000003F8000E000003F80018000003F80030000003F80060000003F800C0000003F80380
-000003F80700000003F80E00000003F81F00000003F83F80000003F87F80000003F8DFC0000003
-FB8FE0000003FF0FF0000003FC07F0000003F803F8000003F803FC000003F801FE000003F800FE
-000003F8007F000003F8007F800003F8003F800003F8001FC00003F8000FE00003F8000FF00003
-F80007F00003F80003F80003F80003FC00FFFFE03FFFC0FFFFE03FFFC02A257EA430>75
-D<FFFFF000FFFFF00003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8
-000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003
-F8000003F8000003F8000003F8000003F8000603F8000603F8000603F8000C03F8000C03F8000C
-03F8001C03F8001C03F8003C03F8007C03F800F803F803F8FFFFFFF8FFFFFFF81F257EA425>I<
-FFF8000000FFF8FFFC000001FFF803FC000001FE00037E0000037E00037E0000037E00037E0000
-037E00033F0000067E00033F0000067E00031F80000C7E00031F80000C7E00030FC000187E0003
-0FC000187E000307E000307E000307E000307E000307E000307E000303F000607E000303F00060
-7E000301F800C07E000301F800C07E000300FC01807E000300FC01807E0003007E03007E000300
-7E03007E0003007E03007E0003003F06007E0003003F06007E0003001F8C007E0003001F8C007E
-0003000FD8007E0003000FD8007E00030007F0007E00030007F0007E00030007F0007E00030003
-E0007E00078003E0007E00FFFC01C01FFFF8FFFC01C01FFFF835257EA43A>I<FFF80007FFE0FF
-FC0007FFE003FE00003C0003FF00001800037F00001800033F80001800031FC0001800031FE000
-1800030FF00018000307F80018000303F80018000301FC0018000300FE0018000300FF00180003
-007F80180003003FC0180003001FC0180003000FE0180003000FF01800030007F81800030003FC
-1800030001FC1800030000FE18000300007F18000300007F98000300003FD8000300001FF80003
-00000FF80003000007F80003000003F80003000003F80003000001F80003000000F80003000000
-7800078000003800FFFC00001800FFFC000018002B257EA430>I<FFFFFF800000FFFFFFF80000
-03F801FE000003F8007F000003F8003F800003F8001FC00003F8001FC00003F8001FE00003F800
-1FE00003F8001FE00003F8001FE00003F8001FE00003F8001FC00003F8001FC00003F8003F8000
-03F8007F000003F801FE000003FFFFF8000003FFFFC0000003F803F0000003F801F8000003F800
-FC000003F8007E000003F8007E000003F8007F000003F8007F000003F8007F000003F8007F0000
-03F8007F800003F8007F800003F8007F800003F8007F806003F8003FC06003F8003FC0C003F800
-1FE1C0FFFFE00FFF80FFFFE001FE002B257EA42E>82 D<00FF008007FFE3800F80F7801E001F80
-3C000F807800078078000380F8000380F8000180F8000180FC000180FC000000FF0000007FE000
-007FFF00003FFFE0003FFFF8001FFFFE0007FFFF0003FFFF80007FFF800003FFC000003FC00000
-0FE0000007E0000007E0C00003E0C00003E0C00003E0C00003C0E00003C0F00007C0F8000780FC
-000F00FFC03E00E3FFF800803FE0001B257DA422>I<7FFFFFFFF87FFFFFFFF87E00FE01F87800
-FE00787000FE00386000FE00186000FE0018E000FE001CE000FE000CC000FE000CC000FE000CC0
-00FE000CC000FE000C0000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000
-0000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00
-000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000FFFF
-FE0000FFFFFE0026247EA32B>I<FFFFE00FFFC0FFFFE00FFFC003F80000780003F80000300003
-F80000300003F80000300003F80000300003F80000300003F80000300003F80000300003F80000
-300003F80000300003F80000300003F80000300003F80000300003F80000300003F80000300003
-F80000300003F80000300003F80000300003F80000300003F80000300003F80000300003F80000
-300003F80000300003F80000300003F80000300003F80000300001F80000600001FC0000600000
-FC0000C000007C0000C000003E00018000001F00070000000FE03E00000003FFF8000000007FC0
-00002A257EA42F>I<FFFFC003FFE0FFFFC003FFE007F800003C0003F80000180003FC00001800
-01FC0000300001FC0000300001FE0000700000FE0000600000FF0000E000007F0000C000007F80
-00C000003F80018000003F80018000001FC0030000001FC0030000001FE0070000000FE0060000
-000FF00600000007F00C00000007F80C00000003F81800000003F81800000003FC3800000001FC
-3000000001FE7000000000FE6000000000FF60000000007FC0000000007FC0000000003F800000
-00003F80000000003F80000000001F00000000001F00000000000E00000000000E0000002B257F
-A42E>I<FFFF83FFFE01FFF0FFFF83FFFE01FFF007F0001FC0000F0007F0001FC000060003F800
-0FE0000C0003F8000FE0000C0003FC000FF0001C0001FC0007F000180001FC0007F000180000FE
-000FF800300000FE000FF800300000FE000FFC003000007F0019FC006000007F0019FC00600000
-7F8039FE00E000003F8030FE00C000003F8030FE00C000001FC0607F018000001FC0607F018000
-001FE0607F818000000FE0C03F830000000FE0C03F830000000FF1C03FC700000007F1801FC600
-000007F1801FC600000003FB000FEC00000003FB000FEC00000003FF000FFC00000001FE0007F8
-00000001FE0007F800000001FE0007F800000000FC0003F000000000FC0003F000000000780001
-E000000000780001E000000000780001E000000000300000C000003C257FA43F>I<FFFFC001FF
-E0FFFFC001FFE007F800001C0003FC0000180003FE0000300001FE0000700000FF0000600000FF
-0000C000007F8001C000003FC0018000003FC0038000001FE0070000000FF0060000000FF00E00
-000007F81C00000003FC1800000003FC3800000001FE7000000000FF6000000000FFE000000000
-7FC0000000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000
-0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000000000
-3F80000000003F800000000FFFFE0000000FFFFE00002B257FA42E>89 D<07FF00001FFFC0003E
-03E0003F01F0003F01F8003F00FC001E00FC000000FC000000FC000000FC00003FFC0003FCFC00
-0FC0FC003F00FC007E00FC007E00FC00FC00FC00FC00FC00FC00FC00FC017C007E017C003F067C
-001FFC3FE007F01FE01B187E971E>97 D<FFC00000FFC000000FC000000FC000000FC000000FC0
-00000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC3F8000F
-CFFE000FF81F800FE00FC00FC007E00FC007E00FC003F00FC003F00FC003F80FC003F80FC003F8
-0FC003F80FC003F80FC003F80FC003F80FC003F80FC003F00FC003F00FC007E00FC007C00FE00F
-C00F383F000E1FFE000C07F0001D267EA522>I<007FE003FFF807C07C1F80FC1F00FC3F00FC7E
-00787E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00007E00007F00003F000C1F
-800C1FC01807E07003FFE0007F0016187E971B>I<0001FF800001FF8000001F8000001F800000
-1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000
-7F1F8003FFDF8007E0FF801F803F803F001F803F001F807E001F807E001F80FE001F80FE001F80
-FE001F80FE001F80FE001F80FE001F80FE001F80FE001F807E001F807E001F803F001F803F003F
-801F807F800FC0FF8003FF9FF800FE1FF81D267EA522>I<007F0003FFC007C1F00F80F81F00F8
-3F007C7E007C7E007EFE007EFE007EFFFFFEFFFFFEFE0000FE0000FE00007E00007E00007E0006
-3F00061F000C0F801807E07003FFE0007F8017187E971C>I<000FC0007FF000F8F001F1F803F1
-F803E1F807E0F007E00007E00007E00007E00007E00007E00007E000FFFF00FFFF0007E00007E0
-0007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E0
-0007E00007E00007E00007E00007E0007FFF007FFF0015267EA513>I<01FF07C007FFDFE00F83
-F1E01F01F1E03E00F8007E00FC007E00FC007E00FC007E00FC007E00FC007E00FC003E00F8001F
-01F0000F83E0000FFFC00011FF00003000000030000000380000003C0000003FFFE0001FFFFC00
-1FFFFE000FFFFF001FFFFF803C003F8078000FC0F80007C0F80007C0F80007C0F80007C07C000F
-803E001F001F807E0007FFF80000FFC0001B247E971F>I<FFC00000FFC000000FC000000FC000
-000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0
-00000FC1F8000FC7FE000FCC3F000FD01F000FF01F800FE01F800FE01F800FC01F800FC01F800F
-C01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F80
-0FC01F800FC01F800FC01F80FFFCFFF8FFFCFFF81D267DA522>I<0F001F803FC03FC03FC03FC0
-1F800F000000000000000000000000000000FFC0FFC00FC00FC00FC00FC00FC00FC00FC00FC00F
-C00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0FFF8FFF80D277EA611>I<FFC00000FF
-C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000
-0FC000000FC000000FC000000FC07FC00FC07FC00FC01E000FC018000FC030000FC060000FC0C0
-000FC380000FC700000FCF00000FDF80000FFFC0000FE7C0000FC7E0000F83F0000F81F0000F80
-F8000F80FC000F807E000F803E000F803F000F801F80FFF8FFF0FFF8FFF01C267EA520>107
-D<FFC0FFC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0
-0FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0FFFCFFFC0E
-267EA511>I<FF81FC01FC00FF87FF07FF000F8C1F8C1F800F980F980F800FB00FF00FC00FA00F
-E00FC00FA00FE00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0
-0FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00F
-C00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0FFFCFFFCFFFCFFFCFFFCFFFC2E187D9733>
-I<FF81F800FF87FE000F8C3F000F901F000FB01F800FA01F800FA01F800FC01F800FC01F800FC0
-1F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800F
-C01F800FC01F800FC01F80FFFCFFF8FFFCFFF81D187D9722>I<007F800003FFF00007C0F8001F
-807E003F003F003F003F007E001F807E001F80FE001FC0FE001FC0FE001FC0FE001FC0FE001FC0
-FE001FC0FE001FC0FE001FC07E001F807E001F803F003F003F003F001F807E000FC0FC0003FFF0
-00007F80001A187E971F>I<FFC3F800FFCFFE000FF83F800FE00FC00FC00FE00FC007E00FC007
-F00FC003F00FC003F80FC003F80FC003F80FC003F80FC003F80FC003F80FC003F80FC003F80FC0
-07F00FC007F00FC007E00FC00FC00FE01FC00FF83F000FDFFE000FC7F0000FC000000FC000000F
-C000000FC000000FC000000FC000000FC000000FC000000FC00000FFFC0000FFFC00001D237E97
-22>I<FF87C0FF8FF00F98F80FB1F80FA1F80FA1F80FE0F00FC0000FC0000FC0000FC0000FC000
-0FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC000FFFE00FFFE0015187E
-9719>114 D<07F9801FFF803C0F80700380F00180F00180F00180FC0000FF80007FFC007FFE00
-3FFF800FFFC003FFC0001FE00003E0C001E0C001E0E001E0E001C0F003C0FC0780EFFF00C3FC00
-13187E9718>I<00600000600000600000600000E00000E00001E00001E00003E00007E0001FE0
-00FFFFC0FFFFC007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E0
-0007E00007E06007E06007E06007E06007E06007E06003E0C003F0C001FF80007E0013237FA218
->I<FFC1FF80FFC1FF800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800F
-C01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC03F80
-0FC03F8007C07F8007E0DF8003FF9FF800FE1FF81D187D9722>I<FFF80FF8FFF80FF80FC003C0
-0FE0018007E0030007E0030003F0060003F0060003F80E0001F80C0001FC1C0000FC180000FE18
-00007E3000007E3000003F6000003F6000001FC000001FC000001FC000000F8000000F80000007
-0000000700001D187F9720>I<FFF9FFE0FF80FFF9FFE0FF801FC03F001C000FC01F0018000FC0
-1F80180007E01F80300007E01F80300007F01FC0700003F037C0600003F037C0600001F877E0C0
-0001F863E0C00001FC63F1C00000FCC1F1800000FCC1F18000007FC1FB0000007F80FB0000007F
-80FF0000003F007E0000003F007E0000001F007C0000001E003C0000001E003C0000000C001800
-0029187F972C>I<FFF83FF0FFF83FF00FC00F0007E00C0003F01C0003F8380001FC700000FCE0
-00007EC000003F8000003F8000001F8000000FC000001FE000001FF0000033F8000071F80000E0
-FC0001C07E0003807F0003003F000F001F80FFC07FF8FFC07FF81D187F9720>I<FFF80FF8FFF8
-0FF80FC003C00FE0018007E0030007E0030003F0060003F0060003F80E0001F80C0001FC1C0000
-FC180000FE1800007E3000007E3000003F6000003F6000001FC000001FC000001FC000000F8000
-000F800000070000000700000006000000060000000C0000300C0000781C0000FC180000FC3800
-00FC70000078E000007FC000001F0000001D237F9720>I E /Fj 27 122
-df<0003E0001C1800381800703C00E03C00E03801C00001C00001C00001C00001C0000380007F
-FFF00380700380700380700380700700E00700E00700E00700E00700E00700E00E01C00E01C00E
-01C00E01C00E01C00E01C01C03801E03C0FF0FF816207E9F19>12 D<FFC0FFC00A027D8A0F>45
-D<07FFFFF8007C0078003C0038003C001800780018007800080078000800780008007800080078
-000800F0100000F0100000F0100000F0300000F0700000FFF00001E0600001E0200001E0200001
-E0200001E0200001E0000003C0000003C0000003C0000003C0000003C0000003C0000007800000
-07C00000FFFE00001D1F7E9E1E>70 D<07FFE07FE0007C001F00003C000C00003C001800007800
-10000078004000007800800000780100000078020000007804000000F008000000F010000000F0
-60000000F0F0000000F1F0000000F278000001E478000001E878000001F03C000001E03C000001
-E01E000001E01E000003C00F000003C00F000003C00F000003C007800003C007800003C003C000
-078003C00007C007E000FFFC3FFC00231F7E9E23>75 D<07F8000C0C001E06001E07001C070000
-070000070000070000FF0007C7001E07003C0E00780E00F00E10F00E10F00E10F01E10F02E2078
-4F401F878014147D9317>97 D<01FC07060E0F1C0F380E78007000F000F000F000F000E000E000
-E000E000F0027004300818300FC010147C9314>99 D<0000700003F00000F00000700000700000
-E00000E00000E00000E00000E00000E00001C000F9C00305C00E03C01C03C03801C07803807003
-80F00380F00380F00380F00380E00700E00700E00700E00700E00700700F00301E00186F000F8F
-E014207C9F19>I<00F800070E000E07001C0700380380780380700380F00380F00380FFFF80F0
-0000E00000E00000E00000E00000F001007002003004001C180007E00011147D9314>I<000780
-0018C00031E00061E000E1C000C00001C00001C00001C00001C00001C0000380007FF800038000
-0380000380000380000700000700000700000700000700000700000E00000E00000E00000E0000
-0E00000E00001C00001E0000FFE00013207E9F0E>I<00000E003E1100E1A301C1C20381E00780
-E00701E00F01E00F01E00F01E00703C007038007870004FC000800000800001800001C00000FFF
-000FFFC007FFE01800F0300030600030C00030C00030C000306000603000C01C070007FC00181F
-809417>I<00E00007E00001E00000E00000E00001C00001C00001C00001C00001C00001C00003
-8000038F800390E003A0E003C0600380600780E00700E00700E00700E00700E00700E00E01C00E
-01C00E01C00E01C00E01C00E01C01C03801E03C0FFCFF815207E9F19>I<01C003E003E003C001
-8000000000000000000000000003801F800780038003800700070007000700070007000E000E00
-0E000E000E000E001C001E00FF800B1F7F9E0C>I<00E00007E00001E00000E00000E00001C000
-01C00001C00001C00001C00001C0000380000383FC0380F00380C0038180038100070400070800
-071800073800077C00071C000E1C000E0E000E0E000E0F000E07000E07801C03801E07C0FF8FF0
-16207E9F18>107 D<00E007E001E000E000E001C001C001C001C001C001C00380038003800380
-038003800700070007000700070007000E000E000E000E000E000E001C001E00FFC00B207F9F0C
->I<0387C07C001F9861860007A072070003C03403000380380300078078070007007007000700
-7007000700700700070070070007007007000E00E00E000E00E00E000E00E00E000E00E00E000E
-00E00E000E00E00E001C01C01C001E01E01E00FFCFFCFFC022147E9326>I<038F801F90E007A0
-E003C0600380600780E00700E00700E00700E00700E00700E00E01C00E01C00E01C00E01C00E01
-C00E01C01C03801E03C0FFCFF815147E9319>I<00FC000387000E01801C00C03800E03800E070
-00F0F000F0F000F0F000F0F000F0E001E0E001E0E001C0E003C0F00380700700380E001C1C0007
-E00014147D9317>I<00E3E007EC3800F01C00E01E00E00E01C00E01C00F01C00F01C00F01C00F
-01C00F03801E03801E03801C03803C0380380380700740E00721C0071F00070000070000070000
-0E00000E00000E00000E00001E0000FFC000181D809319>I<00F040038CC00E04C01C03C03C03
-C0780380780380F00380F00380F00380F00380E00700E00700E00700F00700F00F00700F00301E
-00186E000F8E00000E00000E00000E00001C00001C00001C00001C00003C0001FF80121D7C9318
->I<038E001FB38007C78003C7800383000780000700000700000700000700000700000E00000E
-00000E00000E00000E00000E00001C00001E0000FFE00011147E9312>I<01F2060E0806180618
-02380438001E001FE00FF003F8003C401C400C400C600C6018E010D0608FC00F147E9312>I<00
-80010001000100030007000F001E00FFF80E000E000E000E001C001C001C001C001C001C003800
-38203820382038203840384018800F000D1C7C9B12>I<1C0380FC1F803C07801C03801C038038
-0700380700380700380700380700380700700E00700E00700E00700E00701E00701E00703C0030
-5E001F9FC012147B9319>I<FF83F81E00E01C00C01C00800E00800E01000E02000E02000F0400
-07040007080007080007100003900003A00003E00003C00003800001800001000015147C9318>
-I<FF9FE1FC3E0780701C0300601C0300401C0380401C0380800E0780800E0581000E0981000E09
-C2000E11C2000731C4000721C4000760C8000740C8000780F0000780F0000300E0000300600002
-0040001E147C9321>I<1FF0FF03C07801C06001C04000E08000E180007300007600003C00003C
-00001C00002E00004E000087000107000203800603800C01C03E03E0FF07FC18147F9318>I<0F
-F83F8001E00E0001C00C0001C0080000E0180000E0100000E0200000E0200000F0400000704000
-00708000007080000071000000390000003A0000003E0000003C00000038000000180000001000
-000010000000200000002000000040000070C00000F0800000F1000000E20000007C000000191D
-809318>I E /Fk 34 121 df<0001C0000003C000000FC000007FC0001FFFC000FFFFC000FFBF
-C000E03FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00000
-3FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000
-003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0
-00003FC000003FC000003FC000003FC000003FC000003FC000003FC0007FFFFFE07FFFFFE07FFF
-FFE01B2E7AAD28>49 D<003FE00001FFFE0007FFFF800F80FFC01E003FE038001FF07C000FF87E
-0007FCFF0007FCFF8007FEFF8007FEFF8003FEFF8003FE7F0003FE3E0007FE000007FE000007FC
-000007FC00000FF800000FF800000FF000001FE000001FC000003F8000007F0000007E000000F8
-000001F0000003E0000007C000000F0000001E000E003C000E0038000E0070001E00E0001C01C0
-001C0300003C07FFFFFC0FFFFFFC1FFFFFFC3FFFFFFC7FFFFFF8FFFFFFF8FFFFFFF8FFFFFFF81F
-2E7CAD28>I<000003FF80018000003FFFF003800001FFFFFC07800007FF003F0F80001FF80007
-9F80003FC00001FF8000FF800000FF8001FE0000007F8003FC0000003F8007FC0000001F8007F8
-0000000F800FF00000000F801FF000000007801FF000000007803FE000000007803FE000000003
-807FE000000003807FE000000003807FC000000000007FC00000000000FFC00000000000FFC000
-00000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000
-FFC00000000000FFC000000000007FC000000000007FC000000000007FE000000000007FE00000
-0003803FE000000003803FE000000003801FF000000003801FF000000007800FF0000000070007
-F8000000070007FC0000000E0003FC0000001E0001FE0000001C0000FF8000007800003FC00000
-F000001FF80003E0000007FF003F80000001FFFFFE000000003FFFF80000000003FF8000003131
-7CB03A>67 D<FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFFF000FF80003FF000FF800007F800FF80
-0003F800FF800000F800FF800000F800FF8000007800FF8000007800FF8000003800FF80000038
-00FF8000003800FF8000001C00FF8007001C00FF8007001C00FF8007001C00FF8007000000FF80
-07000000FF800F000000FF801F000000FF803F000000FFFFFF000000FFFFFF000000FFFFFF0000
-00FF803F000000FF801F000000FF800F000000FF8007000000FF8007000000FF8007000700FF80
-07000700FF8007000700FF8000000E00FF8000000E00FF8000000E00FF8000000E00FF8000001E
-00FF8000001E00FF8000003C00FF8000003C00FF8000007C00FF800000FC00FF800001FC00FF80
-0007FC00FF80003FFCFFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF830317EB035>69
-D<FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE000FF80007FE000FF80000FF000FF800003F000FF
-800001F000FF800001F000FF800000F000FF800000F000FF8000007000FF8000007000FF800000
-7000FF8000003800FF8000003800FF8007003800FF8007003800FF8007000000FF8007000000FF
-8007000000FF800F000000FF801F000000FF803F000000FFFFFF000000FFFFFF000000FFFFFF00
-0000FF803F000000FF801F000000FF800F000000FF8007000000FF8007000000FF8007000000FF
-8007000000FF8007000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000
-0000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF
-80000000FFFFFFE00000FFFFFFE00000FFFFFFE000002D317EB033>I<000003FF00030000007F
-FFF007000001FFFFFC0F000007FF007E1F00001FF0000FBF00007FC00003FF0000FF800001FF00
-01FE0000007F0003FC0000007F0007FC0000003F000FF80000001F000FF00000001F001FF00000
-000F001FF00000000F003FE000000007003FE000000007007FE000000007007FE000000007007F
-C00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC0000000
-0000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC0
-0007FFFFFC7FC00007FFFFFC7FE00007FFFFFC7FE0000001FF003FE0000001FF003FE0000001FF
-001FF0000001FF001FF0000001FF000FF0000001FF000FF8000001FF0007FC000001FF0003FC00
-0001FF0001FE000001FF0000FF800001FF00007FC00003FF00001FF800077F000007FF003E3F00
-0001FFFFFC1F0000007FFFF00F00000003FF80030036317CB03F>I<FFFFFF80FFFFFF80FFFFFF
-8000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF
-800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000
-FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF8000
-00FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF80
-0000FF800000FF800000FF800000FF8000FFFFFF80FFFFFF80FFFFFF8019317EB01E>73
-D<FFFFFFE00000FFFFFFE00000FFFFFFE0000000FF8000000000FF8000000000FF8000000000FF
-8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000
-0000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF
-8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000
-0000FF8000000000FF8000000000FF8000000000FF8000000000FF800001C000FF800001C000FF
-800001C000FF800001C000FF800003C000FF8000038000FF8000038000FF8000078000FF800007
-8000FF8000078000FF80000F8000FF80001F8000FF80003F8000FF80007F8000FF8000FF0000FF
-8007FF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF002A317EB030>76 D<FFFF800001FFFFC0FF
-FFC00001FFFFC0FFFFE00001FFFFC000FFF0000003E00000FFF8000001C00000EFFC000001C000
-00E7FC000001C00000E7FE000001C00000E3FF000001C00000E1FF800001C00000E0FFC00001C0
-0000E07FE00001C00000E03FE00001C00000E03FF00001C00000E01FF80001C00000E00FFC0001
-C00000E007FE0001C00000E003FE0001C00000E001FF0001C00000E001FF8001C00000E000FFC0
-01C00000E0007FE001C00000E0003FF001C00000E0001FF001C00000E0001FF801C00000E0000F
-FC01C00000E00007FE01C00000E00003FF01C00000E00001FF81C00000E00000FF81C00000E000
-00FFC1C00000E000007FE1C00000E000003FF1C00000E000001FF9C00000E000000FFDC00000E0
-000007FDC00000E0000007FFC00000E0000003FFC00000E0000001FFC00000E0000000FFC00000
-E00000007FC00000E00000003FC00000E00000003FC00000E00000001FC00000E00000000FC000
-01F000000007C000FFFFE0000003C000FFFFE0000001C000FFFFE0000001C0003A317EB03F>78
-D<FFFFFFFFE000FFFFFFFFFE00FFFFFFFFFF8000FF8000FFE000FF80003FF000FF80000FF800FF
-800007FC00FF800007FC00FF800003FE00FF800003FE00FF800003FF00FF800003FF00FF800003
-FF00FF800003FF00FF800003FF00FF800003FF00FF800003FF00FF800003FE00FF800003FE00FF
-800007FC00FF800007F800FF80000FF800FF80003FE000FF8000FFC000FFFFFFFF0000FFFFFFF8
-0000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF
-8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000
-0000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF
-80000000FFFFFF800000FFFFFF800000FFFFFF80000030317EB037>80 D<FFFFFFFF80000000FF
-FFFFFFF8000000FFFFFFFFFE00000000FF8003FF80000000FF80007FE0000000FF80001FF00000
-00FF80000FF8000000FF80000FF8000000FF80000FFC000000FF800007FC000000FF800007FE00
-0000FF800007FE000000FF800007FE000000FF800007FE000000FF800007FE000000FF800007FE
-000000FF800007FC000000FF80000FFC000000FF80000FF8000000FF80001FF0000000FF80003F
-E0000000FF80007FC0000000FF8003FF00000000FFFFFFF800000000FFFFFFE000000000FF8007
-F800000000FF8001FC00000000FF8000FE00000000FF80007F00000000FF80007F80000000FF80
-003FC0000000FF80003FC0000000FF80003FE0000000FF80003FE0000000FF80003FE0000000FF
-80003FE0000000FF80003FE0000000FF80003FF0000000FF80003FF0000000FF80003FF0000000
-FF80003FF0000000FF80003FF0038000FF80003FF8038000FF80001FF8038000FF80001FF80300
-00FF80000FFC0700FFFFFF8003FE0E00FFFFFF8001FFFC00FFFFFF80001FF00039317EB03C>82
-D<7FFFFFFFFFFF007FFFFFFFFFFF007FFFFFFFFFFF007FC00FF801FF007E000FF8003F007C000F
-F8001F0078000FF8000F0078000FF8000F0070000FF8000700F0000FF8000780F0000FF8000780
-F0000FF8000780E0000FF8000380E0000FF8000380E0000FF8000380E0000FF8000380E0000FF8
-00038000000FF800000000000FF800000000000FF800000000000FF800000000000FF800000000
-000FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000FF800
-000000000FF800000000000FF800000000000FF800000000000FF800000000000FF80000000000
-0FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000FF80000
-0000000FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000F
-F8000000007FFFFFFF0000007FFFFFFF0000007FFFFFFF000031307DAF38>84
-D<FFFFFF8003FFFF80FFFFFF8003FFFF80FFFFFF8003FFFF8000FF80000007C00000FF80000003
-800000FF80000003800000FF80000003800000FF80000003800000FF80000003800000FF800000
-03800000FF80000003800000FF80000003800000FF80000003800000FF80000003800000FF8000
-0003800000FF80000003800000FF80000003800000FF80000003800000FF80000003800000FF80
-000003800000FF80000003800000FF80000003800000FF80000003800000FF80000003800000FF
-80000003800000FF80000003800000FF80000003800000FF80000003800000FF80000003800000
-FF80000003800000FF80000003800000FF80000003800000FF80000003800000FF800000038000
-00FF80000003800000FF800000038000007F800000038000007F800000070000007FC000000700
-00003FC000000E0000003FC000000E0000001FE000001C0000000FF000003800000007F8000070
-00000003FC0001E000000000FF801FC0000000003FFFFF80000000000FFFFE000000000000FFE0
-00000039317EB03E>I<FFFFFC0000FFFFFFFFFC0000FFFFFFFFFC0000FFFF03FF00000003C001
-FF000000038001FF800000078000FF800000070000FFC000000700007FC000000E00007FC00000
-0E00007FE000001E00003FE000001C00003FF000003C00001FF000003800001FF800003800000F
-F800007000000FFC000070000007FC0000E0000007FC0000E0000007FE0001E0000003FE0001C0
-000003FF0003C0000001FF000380000001FF800380000000FF800700000000FFC00700000000FF
-C00F000000007FC00E000000007FE01E000000003FE01C000000003FF03C000000001FF0380000
-00001FF838000000000FF870000000000FF870000000000FFCF00000000007FCE00000000007FF
-E00000000003FFC00000000003FFC00000000001FF800000000001FF800000000000FF00000000
-0000FF000000000000FF0000000000007E0000000000007E0000000000003C0000000000003C00
-000038317EB03D>I<00FFF0000003FFFE00000F803F80000FC00FE0001FE007F0001FE007F000
-1FE003F8000FC003FC00078003FC00000003FC00000003FC00000003FC00000003FC000000FFFC
-00001FFFFC0000FFE3FC0003FC03FC000FF003FC001FC003FC003FC003FC007F8003FC007F8003
-FC00FF0003FC00FF0003FC00FF0003FC00FF0007FC00FF0007FC007F800DFC003FC019FE001FE0
-70FFF007FFE07FF000FF803FF024207E9F27>97 D<01F8000000FFF8000000FFF8000000FFF800
-00000FF800000007F800000007F800000007F800000007F800000007F800000007F800000007F8
-00000007F800000007F800000007F800000007F800000007F800000007F800000007F83FE00007
-F8FFFC0007FBE07F0007FF001F8007FE000FC007FC000FE007F80007F007F80007F807F80007F8
-07F80003FC07F80003FC07F80003FC07F80003FE07F80003FE07F80003FE07F80003FE07F80003
-FE07F80003FE07F80003FE07F80003FE07F80003FC07F80003FC07F80003FC07F80007F807F800
-07F807F80007F007FC000FE007FE000FC007E7003F8007C3C0FE000780FFF80007003FC0002732
-7EB12D>I<000FFF00007FFFC001FC01F003F003F007E007F80FE007F81FC007F83FC003F03FC0
-01E07F8000007F8000007F800000FF800000FF800000FF800000FF800000FF800000FF800000FF
-800000FF8000007F8000007F8000007F8000003FC0001C3FC0001C1FC000380FE0003807E00070
-03F001E001FC07C0007FFF00000FF8001E207D9F24>I<0000000FC0000007FFC0000007FFC000
-0007FFC00000007FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0
-0000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00007F83F
-C0003FFF3FC000FE07BFC003F801FFC007E0007FC00FE0007FC01FC0003FC03FC0003FC03FC000
-3FC07F80003FC07F80003FC07F80003FC0FF80003FC0FF80003FC0FF80003FC0FF80003FC0FF80
-003FC0FF80003FC0FF80003FC0FF80003FC07F80003FC07F80003FC07F80003FC03FC0003FC03F
-C0003FC01FC0003FC00FE0007FC007E000FFC003F003FFE001FC0F3FFE007FFE3FFE000FF03FFE
-27327DB12D>I<000FFC00007FFF8001FC0FC003F003E007E001F00FE001F81FC000FC3FC000FE
-3FC000FE7F80007E7F80007F7F80007FFF80007FFF80007FFFFFFFFFFFFFFFFFFF800000FF8000
-00FF800000FF8000007F8000007F8000007F8000003FC000071FC000071FC0000E0FE0000E07F0
-001C03F8007800FE03E0003FFFC00007FE0020207E9F25>I<0001FE00000FFF80001FC3C0007F
-07E000FE0FF001FE0FF001FC0FF003FC0FF003FC07E003FC018003FC000003FC000003FC000003
-FC000003FC000003FC000003FC000003FC0000FFFFFC00FFFFFC00FFFFFC0003FC000003FC0000
-03FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00
-0003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC
-000003FC000003FC000003FC000003FC00007FFFF0007FFFF0007FFFF0001C327EB119>I<001F
-F007C000FFFE3FE001F83F79F007E00FC3F00FE00FE1F00FC007E0E01FC007F0001FC007F0003F
-C007F8003FC007F8003FC007F8003FC007F8003FC007F8001FC007F0001FC007F0000FC007E000
-0FE00FE00007E00FC00003F83F000006FFFE00000E1FF000000E000000001E000000001E000000
-001F000000001F800000001FFFFF80000FFFFFF0000FFFFFFC0007FFFFFE0003FFFFFF0003FFFF
-FF800FFFFFFFC01F00007FC07E00001FE07C00000FE0FC000007E0FC000007E0FC000007E0FC00
-0007E07E00000FC03E00000F803F00001F800FC0007E0007F803FC0001FFFFF000001FFF000024
-2F7E9F28>I<01F8000000FFF8000000FFF8000000FFF80000000FF800000007F800000007F800
-000007F800000007F800000007F800000007F800000007F800000007F800000007F800000007F8
-00000007F800000007F800000007F800000007F807F80007F83FFE0007F8783F0007F8C03F8007
-F9801FC007FB001FC007FE001FE007FC001FE007FC001FE007FC001FE007F8001FE007F8001FE0
-07F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001F
-E007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F800
-1FE007F8001FE0FFFFC3FFFFFFFFC3FFFFFFFFC3FFFF28327DB12D>I<03C00007E0000FF0001F
-F8001FF8001FF8001FF8000FF00007E00003C00000000000000000000000000000000000000000
-000000000000000001F800FFF800FFF800FFF8000FF80007F80007F80007F80007F80007F80007
-F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007
-F80007F80007F80007F80007F80007F800FFFF80FFFF80FFFF8011337DB217>I<01F800FFF800
-FFF800FFF8000FF80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800
-07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800
-07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800
-07F80007F80007F80007F80007F80007F800FFFFC0FFFFC0FFFFC012327DB117>108
-D<03F007F8001FE000FFF03FFE00FFF800FFF0783F01E0FC00FFF0C03F8300FE000FF1801FC600
-7F0007F3001FCC007F0007F6001FF8007F8007FC001FF0007F8007FC001FF0007F8007FC001FF0
-007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001F
-E0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F800
-1FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8
-001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F80FF
-FFC3FFFF0FFFFCFFFFC3FFFF0FFFFCFFFFC3FFFF0FFFFC3E207D9F43>I<03F007F800FFF03FFE
-00FFF0783F00FFF0C03F800FF1801FC007F3001FC007F6001FE007FC001FE007FC001FE007FC00
-1FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8
-001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007
-F8001FE007F8001FE007F8001FE007F8001FE0FFFFC3FFFFFFFFC3FFFFFFFFC3FFFF28207D9F2D
->I<0007FC0000007FFFC00001FC07F00003F001F80007E000FC000FC0007E001FC0007F003FC0
-007F803F80003F807F80003FC07F80003FC07F80003FC0FF80003FE0FF80003FE0FF80003FE0FF
-80003FE0FF80003FE0FF80003FE0FF80003FE0FF80003FE07F80003FC07F80003FC07F80003FC0
-3FC0007F803FC0007F801FC0007F000FE000FE0007E000FC0003F803F80001FE0FF000007FFFC0
-000007FC000023207E9F28>I<01F83FE000FFF8FFFC00FFFBE07F00FFFF003F8007FE001FC007
-FC000FE007F8000FF007F80007F807F80007F807F80007FC07F80003FC07F80003FC07F80003FE
-07F80003FE07F80003FE07F80003FE07F80003FE07F80003FE07F80003FE07F80003FE07F80003
-FC07F80007FC07F80007FC07F80007F807F80007F807F8000FF007FC000FE007FE001FC007FF00
-3F8007FBC0FE0007F8FFF80007F83FC00007F800000007F800000007F800000007F800000007F8
-00000007F800000007F800000007F800000007F800000007F800000007F8000000FFFFC00000FF
-FFC00000FFFFC00000272E7E9F2D>I<03F03F00FFF07FC0FFF1C3E0FFF187E00FF30FF007F60F
-F007F60FF007FC07E007FC03C007FC000007FC000007F8000007F8000007F8000007F8000007F8
-000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007
-F8000007F8000007F8000007F80000FFFFE000FFFFE000FFFFE0001C207E9F21>114
-D<01FF860007FFFE001F00FE003C003E0078001E0078000E00F8000E00F8000E00F8000E00FC00
-0000FF800000FFFC00007FFFC0007FFFF0003FFFF8001FFFFC0007FFFE0001FFFF00003FFF0000
-00FF8000003F8060001F80E0000F80E0000F80F0000F80F0000F00F8000F00FC001E00FE001C00
-FF807800F3FFF000C07F800019207D9F20>I<001C0000001C0000001C0000001C0000001C0000
-003C0000003C0000003C0000007C0000007C000000FC000001FC000003FC000007FC00001FFFFE
-00FFFFFE00FFFFFE0003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC
-000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC038003
-FC038003FC038003FC038003FC038003FC038003FC038001FC038001FC070000FE0700007F0E00
-003FFC000007F000192E7FAD1F>I<01F80007E0FFF803FFE0FFF803FFE0FFF803FFE00FF8003F
-E007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F800
-1FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8
-001FE007F8001FE007F8001FE007F8001FE007F8003FE007F8003FE003F8007FE003F8007FE001
-FC00DFF000FE039FFF007FFF1FFF000FFC1FFF28207D9F2D>I<FFFF1FFFE07FF8FFFF1FFFE07F
-F8FFFF1FFFE07FF80FF000FE0007800FF800FE00078007F800FE00070007F8007F00070003FC00
-7F000E0003FC00FF800E0003FE00FF801E0001FE00FF801C0001FE01DFC01C0001FF01DFC03C00
-00FF03DFE0380000FF838FE07800007F838FE07000007F8707F07000007FC707F0F000003FCF07
-F8E000003FCE03F8E000001FEE03F9C000001FFC01FDC000001FFC01FFC000000FFC01FF800000
-0FF800FF80000007F800FF00000007F0007F00000007F0007F00000003F0007E00000003E0003E
-00000001E0003C00000001C0001C000035207E9F3A>119 D<7FFF807FFC7FFF807FFC7FFF807F
-FC03FE000F0001FE001E0000FF003C0000FF807800007FC07800003FE0F000001FE1E000000FF3
-C000000FFF80000007FF00000003FE00000001FE00000000FF00000000FF80000000FFC0000001
-FFC0000003DFE00000078FF00000078FF800000F07FC00001E03FC00003C01FE00007800FF0000
-F000FF8000E0007FC001E0003FC0FFFC01FFFFFFFC01FFFFFFFC01FFFF28207F9F2B>I
-E /Fl 1 14 df<0001FE00000007FF8000001E01E000007800780000E0001C0001800006000300
-00030006000001800C000000C00C000000C0180000006030000000303000000030300000003060
-0000001860000000186000000018C00000000CC00000000CC00000000CC00000000CC00000000C
-C00000000CC00000000CC00000000CC00000000C60000000186000000018600000001830000000
-303000000030300000003018000000600C000000C00C000000C006000001800300000300018000
-060000E0001C000078007800001E01E0000007FF80000001FE0000262B7DA02D>13
-D E /Fm 53 122 df<001C0000001C0000001C0000007F800003FFE0000FFFF8001F9CFC003E1C
-1E003C1C0F007C1C0700781C0F80F81C1F80F81C3F80F81C3F80F81C3F80FC1C3F80FE1C1F00FF
-1C00007FDC00007FFC00007FFFC0003FFFE0001FFFF8000FFFFC0007FFFC0001FFFE00007FFF00
-001FFF00001C7F00001C3F80381C1F807C1C1F80FE1C0F80FE1C0F80FE1C0F80FC1C0F80F81C0F
-00701C0F00701C1F00381C1E003C1C3C001F9CF8000FFFF00003FFE00000FF0000001C0000001C
-0000001C000019307CAC22>36 D<3C007F00FF80FF80FFC0FFC0FFC07FC03EC000C000C0018001
-8001800300030006000E001C00380030000A157B8813>44 D<1C007F007F00FF80FF80FF807F00
-7F001C0009097B8813>46 D<000E00001E00007E0007FE00FFFE00FFFE00F8FE0000FE0000FE00
-00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00
-00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00
-00FE007FFFFE7FFFFE7FFFFE17277BA622>49 D<00FF800007FFF0000FFFFC001E03FE003800FF
-807C003F80FE003FC0FF001FC0FF001FE0FF000FE0FF000FE07E000FE03C001FE000001FE00000
-1FC000001FC000003F8000003F0000007E000000FC000000F8000001F0000003E0000007800000
-0F0000001E0000003C00E0007000E000E000E001C001C0038001C0060001C00FFFFFC01FFFFFC0
-3FFFFFC07FFFFFC0FFFFFF80FFFFFF80FFFFFF801B277DA622>I<007F800003FFF00007FFFC00
-0F80FE001F007F003F807F003F803F803F803F803F803F801F803F801F003F8000007F0000007F
-0000007E000000FC000001F8000007F00000FFC00000FFC0000001F80000007E0000003F000000
-3F8000001FC000001FC000001FE000001FE03C001FE07E001FE0FF001FE0FF001FE0FF001FC0FF
-003FC0FE003F807C007F003F00FE001FFFFC0007FFF00000FF80001B277DA622>I<00000E0000
-001E0000003E0000007E000000FE000000FE000001FE000003FE0000077E00000E7E00000E7E00
-001C7E0000387E0000707E0000E07E0000E07E0001C07E0003807E0007007E000E007E000E007E
-001C007E0038007E0070007E00E0007E00FFFFFFF8FFFFFFF8FFFFFFF80000FE000000FE000000
-FE000000FE000000FE000000FE000000FE000000FE00007FFFF8007FFFF8007FFFF81D277EA622
->I<180003001F801F001FFFFE001FFFFC001FFFF8001FFFF0001FFFC0001FFF00001C0000001C
-0000001C0000001C0000001C0000001C0000001C0000001C7FC0001DFFF8001F80FC001E003F00
-08003F0000001F8000001FC000001FC000001FE000001FE018001FE07C001FE0FE001FE0FE001F
-E0FE001FE0FE001FC0FC001FC078003F8078003F803C007F001F01FE000FFFFC0003FFF00000FF
-80001B277DA622>I<00000780000000000780000000000FC0000000000FC0000000000FC00000
-00001FE0000000001FE0000000003FF0000000003FF0000000003FF00000000077F80000000077
-F800000000F7FC00000000E3FC00000000E3FC00000001C1FE00000001C1FE00000003C1FF0000
-000380FF0000000380FF00000007007F80000007007F8000000F007FC000000E003FC000000E00
-3FC000001C001FE000001C001FE000003FFFFFF000003FFFFFF000003FFFFFF00000700007F800
-00700007F80000F00007FC0000E00003FC0000E00003FC0001C00001FE0001C00001FE0003C000
-01FF00FFFE003FFFFCFFFE003FFFFCFFFE003FFFFC2E297EA833>65 D<FFFFFFF800FFFFFFFF00
-FFFFFFFFC003F8001FE003F8000FF003F80007F803F80003F803F80003FC03F80003FC03F80001
-FC03F80001FC03F80001FC03F80003FC03F80003F803F80003F803F80007F003F8000FF003F800
-1FC003F800FF8003FFFFFE0003FFFFFFC003F8000FF003F80003F803F80001FC03F80001FE03F8
-0000FE03F80000FE03F80000FF03F80000FF03F80000FF03F80000FF03F80000FF03F80000FF03
-F80000FE03F80001FE03F80003FC03F80007FC03F8001FF8FFFFFFFFE0FFFFFFFFC0FFFFFFFE00
-28297DA830>I<00007FE0030007FFFC07001FFFFF0F007FF00F9F00FF0001FF01FC0000FF03F8
-00007F07F000003F0FE000001F1FC000001F1FC000000F3F8000000F3F800000077F800000077F
-800000077F00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000
-FF00000000FF00000000FF000000007F000000007F800000007F800000073F800000073F800000
-071FC00000071FC000000E0FE000000E07F000001C03F800003C01FC00007800FF0001F0007FF0
-07C0001FFFFF800007FFFE0000007FF00028297CA831>I<FFFFFFFC0000FFFFFFFF8000FFFFFF
-FFE00003FC001FF80003FC0003FC0003FC0000FE0003FC00007F0003FC00003F8003FC00001FC0
-03FC00001FC003FC00000FE003FC00000FE003FC000007F003FC000007F003FC000007F003FC00
-0007F003FC000007F803FC000007F803FC000007F803FC000007F803FC000007F803FC000007F8
-03FC000007F803FC000007F803FC000007F803FC000007F803FC000007F003FC000007F003FC00
-0007F003FC00000FE003FC00000FE003FC00000FC003FC00001FC003FC00003F8003FC00007F00
-03FC0000FF0003FC0003FC0003FC001FF800FFFFFFFFF000FFFFFFFF8000FFFFFFFC00002D297E
-A834>I<FFFFFFFFE0FFFFFFFFE0FFFFFFFFE003FC001FE003FC0007F003FC0001F003FC0001F0
-03FC0000F003FC00007003FC00007003FC00007003FC01C07803FC01C03803FC01C03803FC01C0
-3803FC03C00003FC03C00003FC0FC00003FFFFC00003FFFFC00003FFFFC00003FC0FC00003FC03
-C00003FC03C00003FC01C00E03FC01C00E03FC01C00E03FC01C01C03FC00001C03FC00001C03FC
-00001C03FC00003C03FC00003803FC00007803FC0000F803FC0001F803FC0003F803FC001FF8FF
-FFFFFFF0FFFFFFFFF0FFFFFFFFF027297EA82C>I<FFFFFFFFC0FFFFFFFFC0FFFFFFFFC003FC00
-3FC003FC000FE003FC0003E003FC0001E003FC0001E003FC0000E003FC0000E003FC0000E003FC
-0000F003FC01C07003FC01C07003FC01C07003FC01C00003FC03C00003FC03C00003FC0FC00003
-FFFFC00003FFFFC00003FFFFC00003FC0FC00003FC03C00003FC03C00003FC01C00003FC01C000
-03FC01C00003FC01C00003FC00000003FC00000003FC00000003FC00000003FC00000003FC0000
-0003FC00000003FC00000003FC000000FFFFFC0000FFFFFC0000FFFFFC000024297EA82A>I<00
-007FE003000007FFFC0700001FFFFF0F00007FF00F9F0000FF0001FF0001FC0000FF0003F80000
-7F0007F000003F000FE000001F001FC000001F001FC000000F003F8000000F003F80000007007F
-80000007007F80000007007F0000000000FF0000000000FF0000000000FF0000000000FF000000
-0000FF0000000000FF0000000000FF0000000000FF0000000000FF0000FFFFF87F0000FFFFF87F
-8000FFFFF87F800000FF003F800000FF003F800000FF001FC00000FF001FC00000FF000FE00000
-FF0007F00000FF0003F80000FF0001FC0000FF0000FF0001FF00007FF007FF00001FFFFF9F0000
-07FFFE0F0000007FF003002D297CA835>I<FFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFF03FC00
-003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC0
-03FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00
-003FC003FC00003FC003FFFFFFFFC003FFFFFFFFC003FFFFFFFFC003FC00003FC003FC00003FC0
-03FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00
-003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC0
-03FC00003FC003FC00003FC0FFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFF30297EA835>I<FFFF
-FCFFFFFCFFFFFC01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE
-0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE
-0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE00FFFFFCFFFF
-FCFFFFFC16297FA819>I<FFFFF001FFFCFFFFF001FFFCFFFFF001FFFC03FC00001E0003FC0000
-3C0003FC0000780003FC0000F00003FC0001E00003FC0003C00003FC0007000003FC001E000003
-FC003C000003FC0078000003FC00F0000003FC01E0000003FC0380000003FC07C0000003FC1FC0
-000003FC3FE0000003FC7FF0000003FCFFF8000003FDE7F8000003FF83FC000003FF03FE000003
-FE01FF000003FC00FF000003FC007F800003FC007FC00003FC003FE00003FC001FE00003FC000F
-F00003FC000FF80003FC0007F80003FC0003FC0003FC0001FE0003FC0001FF0003FC0000FF0003
-FC00007F80FFFFF00FFFFEFFFFF00FFFFEFFFFF00FFFFE2F297EA835>75
-D<FFFFFC0000FFFFFC0000FFFFFC000003FC00000003FC00000003FC00000003FC00000003FC00
-000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC
-00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003
-FC00000003FC0001C003FC0001C003FC0001C003FC0001C003FC0003C003FC00038003FC000380
-03FC00078003FC00078003FC000F8003FC000F8003FC001F8003FC007F8003FC01FF00FFFFFFFF
-00FFFFFFFF00FFFFFFFF0022297EA828>I<FFFE0000003FFF80FFFE0000003FFF80FFFF000000
-7FFF8003FF0000007FE00003FF0000007FE00003BF800000EFE00003BF800000EFE000039FC000
-01CFE000039FC00001CFE000038FE000038FE000038FE000038FE000038FE000038FE0000387F0
-00070FE0000387F000070FE0000383F8000E0FE0000383F8000E0FE0000381FC001C0FE0000381
-FC001C0FE0000381FC001C0FE0000380FE00380FE0000380FE00380FE00003807F00700FE00003
-807F00700FE00003803F80E00FE00003803F80E00FE00003803F80E00FE00003801FC1C00FE000
-03801FC1C00FE00003800FE3800FE00003800FE3800FE000038007F7000FE000038007F7000FE0
-00038007F7000FE000038003FE000FE000038003FE000FE000038001FC000FE000038001FC000F
-E000038000F8000FE000FFFE00F803FFFF80FFFE00F803FFFF80FFFE007003FFFF8039297DA840
->I<FFFC00007FFFFFFE00007FFFFFFF00007FFF03FF800001C003FFC00001C003BFE00001C003
-9FE00001C0039FF00001C0038FF80001C00387FC0001C00383FE0001C00381FF0001C00380FF80
-01C003807F8001C003807FC001C003803FE001C003801FF001C003800FF801C0038007FC01C003
-8003FC01C0038003FE01C0038001FF01C0038000FF81C00380007FC1C00380003FE1C00380001F
-F1C00380000FF1C00380000FF9C003800007FDC003800003FFC003800001FFC003800000FFC003
-8000007FC0038000007FC0038000003FC0038000001FC0038000000FC00380000007C0FFFE0000
-03C0FFFE000001C0FFFE000001C030297EA835>I<0000FFC00000000FFFFC0000003F807F0000
-00FE001FC00001F80007E00003F00003F00007E00001F8000FE00001FC001FC00000FE001FC000
-00FE003F8000007F003F8000007F007F8000007F807F0000003F807F0000003F807F0000003F80
-FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000
-003FC0FF0000003FC0FF0000003FC0FF0000003FC07F0000003F807F8000007F807F8000007F80
-3F8000007F003F8000007F001FC00000FE001FC00000FE000FE00001FC0007F00003F80003F800
-07F00001FC000FE00000FE001FC000003FC0FF0000000FFFFC00000000FFC000002A297CA833>
-I<FFFFFFF800FFFFFFFF00FFFFFFFFC003FC003FE003FC0007F003FC0003F803FC0003FC03FC00
-01FC03FC0001FE03FC0001FE03FC0001FE03FC0001FE03FC0001FE03FC0001FE03FC0001FE03FC
-0001FC03FC0003FC03FC0003F803FC0007F003FC003FE003FFFFFF8003FFFFFE0003FC00000003
-FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC000000
-03FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC000000FFFFF000
-00FFFFF00000FFFFF0000027297EA82E>I<0000FFC00000000FFFFC0000003FC0FF000000FE00
-1FC00001FC000FE00003F00003F00007F00003F8000FE00001FC001FC00000FE001FC00000FE00
-3F8000007F003F8000007F007F8000007F807F8000007F807F0000003F807F0000003F80FF0000
-003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0
-FF0000003FC0FF0000003FC0FF0000003FC07F0000003F807F8000007F807F8000007F803F8000
-007F003F8000007F001FC00000FE001FC03E00FE000FE07F81FC0007E0C1C1F80003F18063F000
-01F98067E00000FF803FC000003FC07F0000000FFFFC00000000FFF800C00000003C00C0000000
-1E00C00000001E01C00000001F83C00000001FFFC00000000FFF800000000FFF800000000FFF00
-00000007FF0000000003FE0000000001FC0000000000F8002A357CA833>I<FFFFFFE00000FFFF
-FFFE0000FFFFFFFF800003FC003FE00003FC000FF00003FC0007F80003FC0003FC0003FC0001FC
-0003FC0001FE0003FC0001FE0003FC0001FE0003FC0001FE0003FC0001FE0003FC0001FE0003FC
-0001FC0003FC0003F80003FC0007F80003FC000FE00003FC003FC00003FFFFFE000003FFFFFE00
-0003FC00FF800003FC003FC00003FC001FE00003FC000FF00003FC0007F80003FC0007F80003FC
-0007F80003FC0007F80003FC0007F80003FC0007F80003FC0007F80003FC0007F80003FC0007F8
-0003FC0007F80E03FC0007F80E03FC0003F80E03FC0001FC1CFFFFF000FE1CFFFFF0007FF8FFFF
-F0000FE02F297EA832>I<00FF00C003FFE1C00FFFF9C01F80FFC03F003FC03E000FC07C0007C0
-7C0007C0FC0003C0FC0003C0FC0001C0FE0001C0FE0001C0FF000000FFC000007FFC00007FFFE0
-003FFFF8001FFFFE001FFFFF0007FFFF8003FFFFC000FFFFC0000FFFE000007FE000001FF00000
-0FF0000007F0E00003F0E00003F0E00003F0E00003F0F00003E0F00003E0F80007E0FC0007C0FF
-000F80FFE01F80E3FFFF00E1FFFC00C01FF0001C297CA825>I<7FFFFFFFFF807FFFFFFFFF807F
-FFFFFFFF807F807F807F807C007F800F8078007F80078078007F80078070007F800380F0007F80
-03C0F0007F8003C0E0007F8001C0E0007F8001C0E0007F8001C0E0007F8001C0E0007F8001C000
-007F80000000007F80000000007F80000000007F80000000007F80000000007F80000000007F80
-000000007F80000000007F80000000007F80000000007F80000000007F80000000007F80000000
-007F80000000007F80000000007F80000000007F80000000007F80000000007F80000000007F80
-000000007F80000000007F80000000FFFFFFC00000FFFFFFC00000FFFFFFC0002A287EA72F>I<
-FFFFF000FFFEFFFFF000FFFEFFFFF000FFFE03FC0000038003FC0000038003FC0000038003FC00
-00038003FC0000038003FC0000038003FC0000038003FC0000038003FC0000038003FC00000380
-03FC0000038003FC0000038003FC0000038003FC0000038003FC0000038003FC0000038003FC00
-00038003FC0000038003FC0000038003FC0000038003FC0000038003FC0000038003FC00000380
-03FC0000038003FC0000038003FC0000038003FC0000038003FC0000038001FC0000070001FE00
-00070000FE00000E00007F00000E00003F00003C00001FC0007800000FF003F0000007FFFFE000
-0000FFFF800000001FFC00002F297EA834>I<FFFFF0007FFFFFFFF0007FFFFFFFF0007FFF03FE
-000001C001FE0000038001FE0000038000FF0000070000FF0000070000FF80000F00007F80000E
-00007FC0000E00003FC0001C00003FE0001C00001FE0003800001FE0003800001FF0007800000F
-F0007000000FF800F0000007F800E0000007FC00E0000003FC01C0000003FC01C0000003FE03C0
-000001FE0380000001FF0780000000FF0700000000FF87000000007F8E000000007F8E00000000
-7FDE000000003FDC000000003FFC000000001FF8000000001FF8000000000FF0000000000FF000
-0000000FF00000000007E00000000007E00000000003C00000000003C0000030297FA833>I<FF
-FFE0FFFFE01FFFC0FFFFE0FFFFE01FFFC0FFFFE0FFFFE01FFFC003FC0003FC0000700003FC0003
-FC0000700003FE0003FE0000F00001FE0001FE0000E00001FE0001FE0000E00001FF0001FF0001
-E00000FF0001FF0001C00000FF0001FF0001C000007F8003FF80038000007F8003FF8003800000
-7FC007FFC0078000003FC0073FC0070000003FC0073FC0070000003FE00F3FE00F0000001FE00E
-1FE00E0000001FE00E1FE00E0000000FF01C0FF01C0000000FF01C0FF01C0000000FF01C0FF81C
-00000007F83807F83800000007F83807F83800000007FC7807FC7800000003FC7003FC70000000
-03FC7003FC7000000003FEF003FEF000000001FEE001FEE000000001FEE001FEE000000000FFC0
-00FFC000000000FFC000FFC000000000FFC000FFC0000000007F80007F80000000007F80007F80
-000000007F80007F80000000003F00003F00000000003F00003F00000000003F00003F00000000
-001E00001E00000000001E00001E00000042297FA845>I<FFFFF0003FFFFFFFF0003FFFFFFFF0
-003FFF03FE000003C001FF0000078000FF8000070000FF80000F00007FC0001E00003FE0001C00
-003FE0003C00001FF0007800001FF8007000000FF800F0000007FC00E0000007FE01C0000003FE
-03C0000001FF0380000001FF8700000000FF8F000000007FCE000000007FFC000000003FFC0000
-00001FF8000000001FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000F
-F0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000
-00000FF0000000000FF0000000000FF000000003FFFFC0000003FFFFC0000003FFFFC00030297F
-A833>89 D<03FF80000FFFF0001F01FC003F80FE003F807F003F803F003F803F801F003F800000
-3F8000003F8000003F8000003F80003FFF8001FC3F800FE03F801F803F803F003F807E003F80FC
-003F80FC003F80FC003F80FC003F80FC005F807E00DF803F839FFC1FFE0FFC03F803FC1E1B7E9A
-21>97 D<FFE00000FFE00000FFE000000FE000000FE000000FE000000FE000000FE000000FE000
-000FE000000FE000000FE000000FE000000FE000000FE000000FE1FE000FE7FF800FFE07E00FF8
-03F00FF001F80FE000FC0FE000FC0FE0007E0FE0007E0FE0007F0FE0007F0FE0007F0FE0007F0F
-E0007F0FE0007F0FE0007F0FE0007F0FE0007E0FE0007E0FE0007E0FE000FC0FE000FC0FF001F8
-0FF803F00F9C0FE00F0FFF800E01FC00202A7EA925>I<003FF00001FFFC0003F03E000FC07F00
-1F807F003F007F003F007F007F003E007E0000007E000000FE000000FE000000FE000000FE0000
-00FE000000FE000000FE0000007E0000007E0000007F0000003F0003803F8003801F8007000FE0
-0E0003F83C0001FFF800003FC000191B7E9A1E>I<00007FF000007FF000007FF0000007F00000
-07F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F000
-0007F0003F87F001FFF7F007F03FF00FC00FF01F8007F03F0007F03F0007F07E0007F07E0007F0
-7E0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F07E0007
-F07E0007F03F0007F03F0007F01F800FF00FC01FF007E07FFF01FFE7FF007F87FF202A7EA925>
-I<003FC00001FFF00003E07C000F803E001F801F001F001F003F000F807E000F807E000FC07E00
-0FC0FE0007C0FE0007C0FFFFFFC0FFFFFFC0FE000000FE000000FE0000007E0000007E0000007F
-0000003F0001C01F0001C00F80038007C0070003F01E0000FFFC00003FE0001A1B7E9A1F>I<00
-07F8003FFC007E3E01FC7F03F87F03F07F07F07F07F03E07F00007F00007F00007F00007F00007
-F00007F000FFFFC0FFFFC0FFFFC007F00007F00007F00007F00007F00007F00007F00007F00007
-F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0007F
-FF807FFF807FFF80182A7EA915>I<007F80F001FFE3F807C0FE1C0F807C7C1F003E7C1F003E10
-3F003F003F003F003F003F003F003F003F003F003F003F001F003E001F003E000F807C0007C0F8
-0005FFE0000C7F8000180000001C0000001C0000001E0000001FFFF8001FFFFF000FFFFFC007FF
-FFE003FFFFF00FFFFFF03E0007F07C0001F8F80000F8F80000F8F80000F8F80000F87C0001F07C
-0001F03F0007E00FC01F8007FFFF00007FF0001E287E9A22>I<FFE00000FFE00000FFE000000F
-E000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00000
-0FE000000FE000000FE07E000FE1FF800FE30FC00FE40FE00FE807E00FF807F00FF007F00FF007
-F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE0
-07F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F0FFFE3FFFFFFE3FFFFFFE3FFF20
-2A7DA925>I<07000F801FC03FE03FE03FE01FC00F8007000000000000000000000000000000FF
-E0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0
-0FE00FE00FE00FE0FFFEFFFEFFFE0F2B7EAA12>I<FFE0FFE0FFE00FE00FE00FE00FE00FE00FE0
-0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F
-E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2A7EA912>108
-D<FFC07F001FC000FFC1FFC07FF000FFC307E0C1F8000FC407F101FC000FC803F200FC000FD803
-FE00FE000FD003FC00FE000FD003FC00FE000FE003F800FE000FE003F800FE000FE003F800FE00
-0FE003F800FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F8
-00FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F800FE000F
-E003F800FE000FE003F800FE00FFFE3FFF8FFFE0FFFE3FFF8FFFE0FFFE3FFF8FFFE0331B7D9A38
->I<FFC07E00FFC1FF80FFC30FC00FC40FE00FC807E00FD807F00FD007F00FD007F00FE007F00F
-E007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F0
-0FE007F00FE007F00FE007F00FE007F00FE007F0FFFE3FFFFFFE3FFFFFFE3FFF201B7D9A25>I<
-003FE00001FFFC0003F07E000FC01F801F800FC03F0007E03F0007E07E0003F07E0003F07E0003
-F0FE0003F8FE0003F8FE0003F8FE0003F8FE0003F8FE0003F8FE0003F8FE0003F87E0003F07E00
-03F03F0007E03F0007E01F800FC00FC01F8007F07F0001FFFC00003FE0001D1B7E9A22>I<FFE1
-FE00FFE7FF80FFFE0FE00FF803F00FF001F80FE001FC0FE000FC0FE000FE0FE000FE0FE0007F0F
-E0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007E0FE000FE0FE000FE
-0FE000FC0FE001FC0FF001F80FF803F00FFC0FE00FEFFF800FE1FC000FE000000FE000000FE000
-000FE000000FE000000FE000000FE000000FE000000FE00000FFFE0000FFFE0000FFFE00002027
-7E9A25>I<FFC3E0FFC7F8FFCC7C0FD8FE0FD0FE0FD0FE0FF0FE0FE07C0FE0000FE0000FE0000F
-E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE000FF
-FF00FFFF00FFFF00171B7E9A1B>114 D<03FE300FFFF03E03F07800F07000F0F00070F00070F8
-0070FE0000FFE0007FFF007FFFC03FFFE01FFFF007FFF800FFF80007FC0000FCE0007CE0003CF0
-003CF00038F80038FC0070FF01E0E7FFC0C1FF00161B7E9A1B>I<007000007000007000007000
-00F00000F00000F00001F00003F00003F00007F0001FFFE0FFFFE0FFFFE007F00007F00007F000
-07F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F07007F07007F070
-07F07007F07007F07007F07003F0E001F8C000FFC0003F0014267FA51A>I<FFE07FF0FFE07FF0
-FFE07FF00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007
-F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE0
-0FF00FE00FF007E017F003F067FF01FFC7FF007F87FF201B7D9A25>I<FFFE07FFFFFE07FFFFFE
-07FF07F000E007F000E007F801E003F801C003F801C001FC038001FC038001FE078000FE070000
-FF0F00007F0E00007F0E00003F9C00003F9C00003FFC00001FF800001FF800000FF000000FF000
-000FF0000007E0000007E0000003C0000003C000201B7F9A23>I<FFFC7FFC1FFCFFFC7FFC1FFC
-FFFC7FFC1FFC0FE00FE001C007F007E0038007F007E0038007F807F0078003F807F0070003F807
-F8070001FC0FF80E0001FC0FF80E0001FE1FFC1E0000FE1CFC1C0000FE1CFE1C0000FF387E3C00
-007F387E3800007F787F3800003FF03F7000003FF03F7000003FE01FF000001FE01FE000001FE0
-1FE000000FC00FC000000FC00FC000000FC00FC0000007800780000007800780002E1B7F9A31>
-I<FFFC1FFEFFFC1FFEFFFC1FFE07F0078003F8070001FC0F0001FE1E0000FE3C00007F7800003F
-F800003FF000001FE000000FE0000007F0000007F800000FF800001FFC00003DFE000038FF0000
-787F0000F03F8001E03FC003C01FE003800FE0FFF03FFFFFF03FFFFFF03FFF201B7F9A23>I<FF
-FE07FFFFFE07FFFFFE07FF07F000E007F000E007F801E003F801C003F801C001FC038001FC0380
-01FE078000FE070000FF0F00007F0E00007F0E00003F9C00003F9C00003FFC00001FF800001FF8
-00000FF000000FF0000007F0000007E0000007E0000003C0000003C00000038000000380000007
-8000380700007C070000FE0E0000FE0E0000FE1C0000FE3800007C7000003FE000000F80000020
-277F9A23>I E /Fn 86 127 df<70F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F870000000000070F8
-F8F870051C779B18>33 D<4010E038F078E038E038E038E038E038E038E038E038E038E0386030
-0D0E7B9C18>I<030600078F00078F00078F00078F00078F00078F007FFFC0FFFFE0FFFFE07FFF
-C00F1E000F1E000F1E000F1E000F1E000F1E007FFFC0FFFFE0FFFFE07FFFC01E3C001E3C001E3C
-001E3C001E3C001E3C000C1800131C7E9B18>I<00C00001C00001C00001C00003F0000FFC003F
-FE007DCF0071C700E1C380E1C780E1C780E1C780F1C00079C0003DC0001FE0000FF80003FC0001
-DE0001CF0001C70061C380F1C380F1C380E1C380E1C70071C70079DE003FFE001FF80007E00001
-C00001C00001C00000C00011247D9F18>I<3803007C07807C0780EE0F80EE0F00EE0F00EE1F00
-EE1E00EE1E00EE3E007C3C007C3C00387C0000780000780000F80000F00001F00001E00001E000
-03E00003C00003C00007C0000783800787C00F87C00F0EE00F0EE01F0EE01E0EE01E0EE03E0EE0
-3C07C03C07C018038013247E9F18>I<01C00007E0000FF0000E70001C38001C38001C38001C38
-001C73F01C73F01CE3F00FE3800FC7000F87000F07001F0E003F0E007B8E0073DC00E1DC00E0F8
-00E0F800E07070E0787070FC707FFFE03FCFE00F03C0141C7F9B18>I<387C7C7E3E0E0E0E1C1C
-38F8F0C0070E789B18>I<007000F001E003C007800F001E001C00380038007000700070007000
-E000E000E000E000E000E000E000E0007000700070007000380038001C001E000F00078003C001
-F000F000700C24799F18>I<6000F00078003C001E000F000780038001C001C000E000E000E000
-E00070007000700070007000700070007000E000E000E000E001C001C0038007800F001E003C00
-7800F00060000C247C9F18>I<01C00001C00001C00001C000C1C180F1C780F9CF807FFF001FFC
-0007F00007F0001FFC007FFF00F9CF80F1C780C1C18001C00001C00001C00001C00011147D9718
->I<00600000F00000F00000F00000F00000F00000F00000F0007FFFC0FFFFE0FFFFE07FFFC000
-F00000F00000F00000F00000F00000F00000F00000600013147E9718>I<1C3E7E7F3F1F070E1E
-7CF860080C788518>I<7FFF00FFFF80FFFF807FFF0011047D8F18>I<3078FCFC78300606778518
->I<000300000780000780000F80000F00001F00001E00001E00003E00003C00007C0000780000
-780000F80000F00001F00001E00003E00003C00003C00007C0000780000F80000F00000F00001F
-00001E00003E00003C00003C00007C0000780000F80000F00000F0000060000011247D9F18>I<
-01F00007FC000FFE001F1F001C07003803807803C07001C07001C0E000E0E000E0E000E0E000E0
-E000E0E000E0E000E0E000E0E000E0F001E07001C07001C07803C03803801C07001F1F000FFE00
-07FC0001F000131C7E9B18>I<01800380038007800F803F80FF80FB8043800380038003800380
-0380038003800380038003800380038003800380038003807FFCFFFE7FFC0F1C7B9B18>I<03F0
-000FFE003FFF007C0F807003C0E001C0F000E0F000E06000E00000E00000E00001C00001C00003
-C0000780000F00001E00003C0000780000F00001E00007C0000F80001E00E03C00E07FFFE0FFFF
-E07FFFE0131C7E9B18>I<001F00003F0000770000770000E70001E70001C70003870007870007
-07000E07001E07003C0700380700780700F00700FFFFF8FFFFF8FFFFF800070000070000070000
-0700000700000700007FF000FFF8007FF0151C7F9B18>52 D<007E0001FF0007FF800F83C01E03
-C01C03C0380180380000700000700000E1F800E7FE00FFFF00FE0780F803C0F001C0F000E0E000
-E0F000E07000E07000E07000E03801C03C03C01E07800FFF0007FE0001F800131C7E9B18>54
-D<3078FCFC783000000000000000003078FCFC78300614779318>58 D<183C7E7E3C1800000000
-00000000183C7E7E3E1E0E1C3C78F060071A789318>I<000300000780001F80003F00007E0001
-FC0003F00007E0001FC0003F00007E0000FC0000FC00007E00003F00001FC00007E00003F00001
-FC00007E00003F00001F8000078000030011187D9918>I<7FFFC0FFFFE0FFFFE0FFFFE0000000
-000000000000000000FFFFE0FFFFE0FFFFE07FFFC0130C7E9318>I<600000F00000FC00007E00
-003F00001FC00007E00003F00001FC00007E00003F00001F80001F80003F00007E0001FC0003F0
-0007E0001FC0003F00007E0000FC0000F0000060000011187D9918>I<0FF0003FFC007FFF0070
-0F00F00380F00380600780000F00003E00007C0001F00001E00003C00003C00003C00003C00003
-C00003800000000000000000000000000000000003800007C00007C00007C000038000111C7D9B
-18>I<007C0001FE0007FF000F87801E03C03C1DC0387FC070FFE071E3E071C1E0E1C1E0E380E0
-E380E0E380E0E380E0E380E0E380E0E1C1C071C1C071E3C070FF80387F003C1C001E00E00F83E0
-07FFC001FF80007E00131C7E9B18>I<00700000F80000F80000D80000D80001DC0001DC0001DC
-00018C00038E00038E00038E00038E000306000707000707000707000707000FFF800FFF800FFF
-800E03800E03801C01C01C01C07F07F0FF8FF87F07F0151C7F9B18>I<FFFC00FFFF00FFFF801C
-03C01C01C01C00E01C00E01C00E01C00E01C01E01C01C01C07C01FFF801FFF001FFFC01C03C01C
-00E01C00F01C00701C00701C00701C00701C00F01C00E01C03E0FFFFC0FFFF80FFFE00141C7F9B
-18>I<00F8E003FEE007FFE00F07E01E03E03C01E03800E07000E07000E0700000E00000E00000
-E00000E00000E00000E00000E00000E000007000007000E07000E03800E03C00E01E01C00F07C0
-07FF8003FE0000F800131C7E9B18>I<7FF800FFFE007FFF001C0F801C03C01C03C01C01E01C00
-E01C00E01C00F01C00701C00701C00701C00701C00701C00701C00701C00701C00F01C00E01C00
-E01C01E01C01C01C03C01C0F807FFF00FFFE007FF800141C7F9B18>I<FFFFF0FFFFF0FFFFF01C
-00701C00701C00701C00701C00001C00001C0E001C0E001C0E001FFE001FFE001FFE001C0E001C
-0E001C0E001C00001C00001C00381C00381C00381C00381C0038FFFFF8FFFFF8FFFFF8151C7F9B
-18>I<FFFFE0FFFFE0FFFFE01C00E01C00E01C00E01C00E01C00001C00001C1C001C1C001C1C00
-1FFC001FFC001FFC001C1C001C1C001C1C001C00001C00001C00001C00001C00001C00001C0000
-FFC000FFC000FFC000131C7E9B18>I<01F1C003FDC00FFFC01F0FC01C03C03803C03801C07001
-C07001C0700000E00000E00000E00000E00000E00000E00FF0E01FF0E00FF07001C07001C07003
-C03803C03803C01C07C01F0FC00FFFC003FDC001F1C0141C7E9B18>I<7FFF00FFFF807FFF0001
-C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001
-C00001C00001C00001C00001C00001C00001C00001C00001C0007FFF00FFFF807FFF00111C7D9B
-18>73 D<01FFC003FFC001FFC0000E00000E00000E00000E00000E00000E00000E00000E00000E
-00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00F00E00F00E00F03C
-007FFC003FF0000FC000121C7D9B18>I<7F07F0FF87F87F07F01C03C01C07801C07001C0E001C
-1E001C3C001C38001C70001CF0001DF0001DF0001FB8001FB8001F1C001E1C001C0E001C0E001C
-07001C07001C03801C03801C01C07F03F0FF87F87F03F0151C7F9B18>I<7FE000FFE0007FE000
-0E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000
-0E00000E00000E00000E00000E00700E00700E00700E00700E00707FFFF0FFFFF07FFFF0141C7F
-9B18>I<FC01F8FE03F8FE03F83B06E03B06E03B06E03B06E03B8EE03B8EE0398CE0398CE039DC
-E039DCE039DCE038D8E038D8E038F8E03870E03870E03800E03800E03800E03800E03800E03800
-E0FE03F8FE03F8FE03F8151C7F9B18>I<7E07F0FF0FF87F07F01D81C01D81C01D81C01DC1C01C
-C1C01CC1C01CE1C01CE1C01CE1C01C61C01C71C01C71C01C31C01C39C01C39C01C39C01C19C01C
-19C01C1DC01C0DC01C0DC01C0DC07F07C0FF87C07F03C0151C7F9B18>I<0FF8003FFE007FFF00
-780F00700700F00780E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380
-E00380E00380E00380E00380E00380E00380F00780700700780F007FFF003FFE000FF800111C7D
-9B18>I<FFFE00FFFF80FFFFC01C03C01C01E01C00E01C00701C00701C00701C00701C00701C00
-E01C01E01C03C01FFFC01FFF801FFE001C00001C00001C00001C00001C00001C00001C00001C00
-00FF8000FF8000FF8000141C7F9B18>I<0FF8003FFE007FFF00780F00700700F00780E00380E0
-0380E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E1
-E380E1E380F0E78070F700787F007FFF003FFE000FFC00001C00001E00000E00000F0000070000
-070011227D9B18>I<7FF800FFFE007FFF001C0F801C03801C03C01C01C01C01C01C01C01C03C0
-1C03801C0F801FFF001FFE001FFE001C0F001C07001C03801C03801C03801C03801C03801C039C
-1C039C1C039C7F01F8FF81F87F00F0161C7F9B18>I<03F3801FFF803FFF807C0F80700780E003
-80E00380E00380E000007000007800003F00001FF00007FE0000FF00000F800003C00001C00000
-E00000E06000E0E000E0E001E0F001C0F80780FFFF80FFFE00E7F800131C7E9B18>I<7FFFF8FF
-FFF8FFFFF8E07038E07038E07038E0703800700000700000700000700000700000700000700000
-700000700000700000700000700000700000700000700000700000700000700007FF0007FF0007
-FF00151C7F9B18>I<FF83FEFF83FEFF83FE1C00701C00701C00701C00701C00701C00701C0070
-1C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00700E00E0
-0F01E00783C003FF8001FF00007C00171C809B18>I<FF07F8FF07F8FF07F81C01C01C01C01C01
-C01C01C00E03800E03800E03800E03800F0780070700070700070700070700038E00038E00038E
-00038E00018C0001DC0001DC0001DC0000D80000F80000F800007000151C7F9B18>I<FE03F8FE
-03F8FE03F87000707000707000703800E03800E03800E03800E03800E038F8E038F8E039DCE039
-DCE019DCC019DCC019DCC0198CC01D8DC01D8DC01D8DC01D8DC00D8D800D05800F07800F07800E
-0380151C7F9B18>I<7F8FE07F9FE07F8FE00E07000F0700070E00078E00039C0003DC0001F800
-01F80000F00000F00000700000F00000F80001F80001DC00039E00038E00070F000707000E0780
-0E03801E03C07F07F0FF8FF87F07F0151C7F9B18>I<FF07F8FF07F8FF07F81C01C01E03C00E03
-800F0780070700070700038E00038E0001DC0001DC0001DC0000F80000F8000070000070000070
-0000700000700000700000700000700000700001FC0003FE0001FC00151C7F9B18>I<FFF8FFF8
-FFF8E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E0
-00E000E000E000E000E000E000E000E000E000E000E000FFF8FFF8FFF80D24779F18>91
-D<600000F00000F00000F800007800007C00003C00003C00003E00001E00001F00000F00000F00
-000F800007800007C00003C00003C00003E00001E00001F00000F00000F800007800007800007C
-00003C00003E00001E00001E00001F00000F00000F8000078000078000030011247D9F18>I<FF
-F8FFF8FFF800380038003800380038003800380038003800380038003800380038003800380038
-0038003800380038003800380038003800380038003800380038FFF8FFF8FFF80D247F9F18>I<
-7FFF00FFFF80FFFF807FFF0011047D7F18>95 D<061E3E387070E0E0E0F8FC7C7C38070E789E18
->I<1FE0003FF8007FFC00781E00300E0000070000070000FF0007FF001FFF007F0700780700E0
-0700E00700E00700F00F00781F003FFFF01FFBF007E1F014147D9318>I<7E0000FE00007E0000
-0E00000E00000E00000E00000E00000E3E000EFF800FFFC00FC1E00F80E00F00700E00700E0038
-0E00380E00380E00380E00380E00380F00700F00700F80E00FC1E00FFFC00EFF80063E00151C80
-9B18>I<01FE0007FF001FFF803E0780380300700000700000E00000E00000E00000E00000E000
-00E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318>I<001F80003F8000
-1F8000038000038000038000038000038003E3800FFB801FFF803C1F80380F80700780700380E0
-0380E00380E00380E00380E00380E00380700780700780380F803C1F801FFFF00FFBF803E3F015
-1C7E9B18>I<01F00007FC001FFE003E0F00380780700380700380E001C0E001C0FFFFC0FFFFC0
-FFFFC0E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318>I<001F80007F
-C000FFE000E1E001C0C001C00001C00001C0007FFFC0FFFFC0FFFFC001C00001C00001C00001C0
-0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0007FFF007FFF007FFF
-00131C7F9B18>I<01E1F007FFF80FFFF81E1E301C0E003807003807003807003807003807001C
-0E001E1E001FFC001FF80039E0003800001C00001FFE001FFFC03FFFE07801F0700070E00038E0
-0038E00038E000387800F07E03F01FFFC00FFF8001FC00151F7F9318>I<7E0000FE00007E0000
-0E00000E00000E00000E00000E00000E3E000EFF800FFFC00FC1C00F80E00F00E00E00E00E00E0
-0E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC3FCFFE7FE7FC3FC171C80
-9B18>I<03800007C00007C00007C0000380000000000000000000000000007FC000FFC0007FC0
-0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0
-0001C000FFFF00FFFF80FFFF00111D7C9C18>I<0038007C007C007C003800000000000000000F
-FC1FFC0FFC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C
-001C001C001C001C001C6038F078FFF07FE03F800E277E9C18>I<FE0000FE0000FE00000E0000
-0E00000E00000E00000E00000E3FF00E7FF00E3FF00E07800E0F000E1E000E3C000E78000EF000
-0FF8000FFC000F9C000F0E000E0F000E07000E03800E03C0FFC7F8FFC7F8FFC7F8151C7F9B18>
-I<7FE000FFE0007FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0
-0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0007FFF
-C0FFFFE07FFFC0131C7E9B18>I<7CE0E000FFFBF8007FFFF8001F1F1C001E1E1C001E1E1C001C
-1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C00
-1C1C1C007F1F1F00FFBFBF807F1F1F001914819318>I<7E3E00FEFF807FFFC00FC1C00F80E00F
-00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC3FCFF
-E7FE7FC3FC1714809318>I<01F0000FFE001FFF003E0F803803807001C07001C0E000E0E000E0
-E000E0E000E0E000E0F001E07001C07803C03C07803E0F801FFF000FFE0001F00013147E9318>
-I<7E3E00FEFF807FFFC00FC1E00F80E00F00700E00700E00380E00380E00380E00380E00380E00
-380F00700F00700F80E00FC1E00FFFC00EFF800E3E000E00000E00000E00000E00000E00000E00
-000E00007FC000FFE0007FC000151E809318>I<01E38007FB801FFF803E1F80380F8070078070
-0780E00380E00380E00380E00380E00380E00380700780700780380F803C1F801FFF800FFB8003
-E380000380000380000380000380000380000380000380003FF8003FF8003FF8151E7E9318>I<
-7F87E0FF9FF07FBFF803F87803F03003E00003C00003C000038000038000038000038000038000
-0380000380000380000380007FFE00FFFF007FFE0015147F9318>I<07F7003FFF007FFF00780F
-00E00700E00700E007007C00007FE0001FFC0003FE00001F00600780E00380E00380F00380F80F
-00FFFF00FFFC00E7F00011147D9318>I<0180000380000380000380000380007FFFC0FFFFC0FF
-FFC00380000380000380000380000380000380000380000380000380000380400380E00380E003
-80E001C1C001FFC000FF80003E0013197F9818>I<7E07E0FE0FE07E07E00E00E00E00E00E00E0
-0E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFC03FFFE
-01FCFC1714809318>I<7F8FF0FF8FF87F8FF01E03C00E03800E03800E03800707000707000707
-00038E00038E00038E00038E0001DC0001DC0001DC0000F80000F80000700015147F9318>I<FF
-8FF8FF8FF8FF8FF83800E03800E03800E01C01C01C01C01C71C01CF9C01CF9C01CD9C01CD9C00D
-DD800DDD800DDD800D8D800F8F800F8F8007070015147F9318>I<7F8FF07F9FF07F8FF0070700
-078E00039E0001DC0001F80000F80000700000F00000F80001DC00039E00038E000707000F0780
-7F8FF0FF8FF87F8FF015147F9318>I<7F8FF0FF8FF87F8FF00E01C00E03800E03800703800707
-00070700038700038600038E0001CE0001CE0000CC0000CC0000DC000078000078000078000070
-0000700000700000F00000E00079E0007BC0007F80003F00001E0000151E7F9318>I<3FFFF07F
-FFF07FFFF07001E07003C0700780000F00001E00003C0000F80001F00003C0000780000F00701E
-00703C0070780070FFFFF0FFFFF0FFFFF014147F9318>I<0007E0001FE0007FE000780000E000
-00E00000E00000E00000E00000E00000E00000E00000E00000E00000E00001E0007FC000FF8000
-FF80007FC00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E000
-00E000007800007FE0001FE00007E013247E9F18>I<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0
-F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0600424769F18>I<7C0000FF0000FFC00003C00000
-E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000F000007FC000
-3FE0003FE0007FC000F00000E00000E00000E00000E00000E00000E00000E00000E00000E00000
-E00000E00003C000FFC000FF00007C000013247E9F18>I<060C1F1E3FBEFBF8F1F060C00F067C
-9B18>I E /Fo 76 124 df<001F83E000F06E3001C078780380F8780300F03007007000070070
-000700700007007000070070000700700007007000FFFFFF800700700007007000070070000700
-700007007000070070000700700007007000070070000700700007007000070070000700700007
-007000070070000700700007007000070070007FE3FF001D20809F1B>11
-D<003F0000E0C001C0C00381E00701E00701E0070000070000070000070000070000070000FFFF
-E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700
-E00700E00700E00700E00700E00700E07FC3FE1720809F19>I<003FE000E0E001C1E00381E007
-00E00700E00700E00700E00700E00700E00700E00700E0FFFFE00700E00700E00700E00700E007
-00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E007
-00E07FE7FE1720809F19>I<001F81F80000F04F040001C07C06000380F80F000300F00F000700
-F00F00070070000007007000000700700000070070000007007000000700700000FFFFFFFF0007
-007007000700700700070070070007007007000700700700070070070007007007000700700700
-070070070007007007000700700700070070070007007007000700700700070070070007007007
-00070070070007007007007FE3FE3FF02420809F26>I<0080008007E00C981084208260824081
-C087C08FC08FC086E080F08078803F803FE01FF807FC00FE009E008E00870087F083F083F08380
-83808240864084208818B007C000800080008010257DA117>36 D<70F8FCFC7404040408081010
-2040060E7C9F0D>39 D<0020004000800100020006000C000C0018001800300030003000700060
-0060006000E000E000E000E000E000E000E000E000E000E000E000E00060006000600070003000
-30003000180018000C000C000600020001000080004000200B2E7DA112>I<8000400020001000
-08000C00060006000300030001800180018001C000C000C000C000E000E000E000E000E000E000
-E000E000E000E000E000E000C000C000C001C001800180018003000300060006000C0008001000
-2000400080000B2E7DA112>I<70F8FCFC74040404080810102040060E7C840D>44
-D<FFC0FFC00A027F8A0F>I<70F8F8F87005057C840D>I<03F0000E1C001C0E0018060038070070
-0380700380700380700380F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F0
-03C0F003C0F003C0F003C07003807003807003807807803807001806001C0E000E1C0003F00012
-1F7E9D17>48 D<018003800F80F380038003800380038003800380038003800380038003800380
-03800380038003800380038003800380038003800380038007C0FFFE0F1E7C9D17>I<03F0000C
-1C00100E00200700400780800780F007C0F803C0F803C0F803C02007C00007C000078000078000
-0F00000E00001C0000380000700000600000C0000180000300000600400C00401800401000803F
-FF807FFF80FFFF80121E7E9D17>I<03F0000C1C00100E00200F00780F80780780780780380F80
-000F80000F00000F00000E00001C0000380003F000003C00000E00000F000007800007800007C0
-2007C0F807C0F807C0F807C0F00780400780400F00200E001C3C0003F000121F7E9D17>I<0006
-00000600000E00000E00001E00002E00002E00004E00008E00008E00010E00020E00020E00040E
-00080E00080E00100E00200E00200E00400E00C00E00FFFFF0000E00000E00000E00000E00000E
-00000E00000E0000FFE0141E7F9D17>I<1803001FFE001FFC001FF8001FE00010000010000010
-000010000010000010000011F000161C00180E001007001007800003800003800003C00003C000
-03C07003C0F003C0F003C0E00380400380400700200600100E000C380003E000121F7E9D17>I<
-007C000182000701000E03800C07801C0780380300380000780000700000700000F1F000F21C00
-F40600F80700F80380F80380F003C0F003C0F003C0F003C0F003C07003C07003C0700380380380
-3807001807000C0E00061C0001F000121F7E9D17>I<4000007FFFC07FFF807FFF804001008002
-0080020080040000080000080000100000200000200000400000400000C00000C00001C0000180
-00038000038000038000038000078000078000078000078000078000078000078000030000121F
-7D9D17>I<03F0000C0C001006003003002001806001806001806001807001807803003E03003F
-06001FC8000FF00003F80007FC000C7E00103F00300F806003804001C0C001C0C000C0C000C0C0
-00C0C000806001802001001002000C0C0003F000121F7E9D17>I<03F0000E18001C0C00380600
-380700700700700380F00380F00380F003C0F003C0F003C0F003C0F003C07007C07007C03807C0
-180BC00E13C003E3C0000380000380000380000700300700780600780E00700C00201800107000
-0FC000121F7E9D17>I<70F8F8F8700000000000000000000070F8F8F87005147C930D>I<70F8F8
-F8700000000000000000000070F0F8F878080808101010202040051D7C930D>I<000100000003
-800000038000000380000007C0000007C0000007C0000009E0000009E0000009E0000010F00000
-10F0000010F00000207800002078000020780000403C0000403C0000403C0000801E0000801E00
-00FFFE0001000F0001000F0001000F00020007800200078002000780040003C00E0003C01F0007
-E0FFC03FFE1F207F9F22>65 D<FFFFE0000F80380007801E0007801F0007800F0007800F800780
-0F8007800F8007800F8007800F8007800F0007801F0007801E0007803C0007FFF00007803C0007
-801E0007800F0007800F8007800780078007C0078007C0078007C0078007C0078007C007800780
-07800F8007800F0007801F000F803C00FFFFF0001A1F7E9E20>I<000FC040007030C001C009C0
-038005C0070003C00E0001C01E0000C01C0000C03C0000C07C0000407C00004078000040F80000
-00F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000780000007C00
-00407C0000403C0000401C0000401E0000800E000080070001000380020001C004000070380000
-0FC0001A217D9F21>I<FFFFE0000F803C0007801E000780070007800380078003C0078001E007
-8001E0078001F0078000F0078000F0078000F8078000F8078000F8078000F8078000F8078000F8
-078000F8078000F8078000F8078000F0078000F0078000F0078001E0078001E0078003C0078003
-800780070007800E000F803C00FFFFE0001D1F7E9E23>I<FFFFFF000F800F0007800300078003
-000780010007800180078000800780008007800080078080800780800007808000078080000781
-800007FF8000078180000780800007808000078080000780800007800020078000200780002007
-8000400780004007800040078000C0078000C0078001800F800F80FFFFFF801B1F7E9E1F>I<FF
-FFFF000F800F000780030007800300078001000780018007800080078000800780008007800080
-078080000780800007808000078080000781800007FF8000078180000780800007808000078080
-000780800007800000078000000780000007800000078000000780000007800000078000000FC0
-0000FFFE0000191F7E9E1E>I<000FE0200078186000E004E0038002E0070001E00F0000E01E00
-00601E0000603C0000603C0000207C00002078000020F8000000F8000000F8000000F8000000F8
-000000F8000000F8000000F8007FFCF80003E0780001E07C0001E03C0001E03C0001E01E0001E0
-1E0001E00F0001E0070001E0038002E000E0046000781820000FE0001E217D9F24>I<FFF8FFF8
-0F800F8007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F
-0007800F0007800F0007800F0007FFFF0007800F0007800F0007800F0007800F0007800F000780
-0F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F000F800F80FF
-F8FFF81D1F7E9E22>I<FFFC0FC007800780078007800780078007800780078007800780078007
-80078007800780078007800780078007800780078007800780078007800FC0FFFC0E1F7F9E10>
-I<0FFFC0007C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C
-00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00203C00F83C00F83C
-00F83C00F0380040780040700030E0000F800012207E9E17>I<FFFC0FFC0FC003E00780018007
-800100078002000780040007800800078010000780200007804000078080000781000007830000
-07878000078F80000793C0000791E00007A1E00007C0F0000780F0000780780007803C0007803C
-0007801E0007801E0007800F000780078007800780078007C00FC007E0FFFC3FFC1E1F7E9E23>
-I<FFFE000FC0000780000780000780000780000780000780000780000780000780000780000780
-000780000780000780000780000780000780000780000780020780020780020780020780060780
-0407800407800C07801C0F807CFFFFFC171F7E9E1C>I<FF80001FF80F80001F800780001F0005
-C0002F0005C0002F0005C0002F0004E0004F0004E0004F000470008F000470008F000470008F00
-0438010F000438010F000438010F00041C020F00041C020F00041C020F00040E040F00040E040F
-00040E040F000407080F000407080F000407080F000403900F000403900F000401E00F000401E0
-0F000401E00F000E00C00F001F00C01F80FFE0C1FFF8251F7E9E2A>I<FF803FF807C007C007C0
-038005E0010005E0010004F001000478010004780100043C0100043C0100041E0100040F010004
-0F010004078100040781000403C1000401E1000401E1000400F1000400F1000400790004003D00
-04003D0004001F0004001F0004000F0004000700040007000E0003001F000300FFE001001D1F7E
-9E22>I<001F800000F0F00001C0380007801E000F000F000E0007001E0007803C0003C03C0003
-C07C0003E0780001E0780001E0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F800
-01F0F80001F0F80001F0780001E07C0003E07C0003E03C0003C03C0003C01E0007800E0007000F
-000F0007801E0001C0380000F0F000001F80001C217D9F23>I<FFFFE0000F80780007801C0007
-801E0007800F0007800F8007800F8007800F8007800F8007800F8007800F8007800F0007801E00
-07801C000780780007FFE000078000000780000007800000078000000780000007800000078000
-000780000007800000078000000780000007800000078000000FC00000FFFC0000191F7E9E1F>
-I<FFFF80000F80F0000780780007803C0007801E0007801E0007801F0007801F0007801F000780
-1F0007801E0007801E0007803C00078078000780F00007FF80000781C0000780E0000780F00007
-80700007807800078078000780780007807C0007807C0007807C0007807C0407807E0407803E04
-0FC01E08FFFC0F10000003E01E207E9E21>82 D<07E0800C1980100780300380600180600180E0
-0180E00080E00080E00080F00000F000007800007F00003FF0001FFC000FFE0003FF00001F8000
-07800003C00003C00001C08001C08001C08001C08001C0C00180C00380E00300F00600CE0C0081
-F80012217D9F19>I<7FFFFFE0780F01E0600F0060400F0020400F0020C00F0030800F0010800F
-0010800F0010800F0010000F0000000F0000000F0000000F0000000F0000000F0000000F000000
-0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000
-000F0000000F0000001F800007FFFE001C1F7E9E21>I<FFFC3FF80FC007C00780038007800100
-078001000780010007800100078001000780010007800100078001000780010007800100078001
-000780010007800100078001000780010007800100078001000780010007800100078001000780
-0100038002000380020001C0020001C0040000E008000070180000382000000FC0001D207E9E22
->I<FFF003FE1F8000F80F0000600F800060078000400780004003C0008003C0008003C0008001
-E0010001E0010001F0010000F0020000F0020000F806000078040000780400003C0800003C0800
-003C0800001E1000001E1000001F3000000F2000000F20000007C0000007C0000007C000000380
-000003800000038000000100001F207F9E22>I<FFF07FF81FF01F800FC007C00F00078003800F
-00078001000F0007C00100078007C00200078007C00200078007C0020003C009E0040003C009E0
-040003C009E0040003E010F00C0001E010F0080001E010F0080001F02078080000F02078100000
-F02078100000F0403C10000078403C20000078403C20000078C03E2000003C801E4000003C801E
-4000003C801E4000001F000F8000001F000F8000001F000F8000001E00078000000E0007000000
-0E00070000000C000300000004000200002C207F9E2F>I<FFF003FF1F8000F80F800060078000
-4007C0004003E0008001E0008001F0010000F0030000F80200007C0400003C0400003E0800001E
-0800001F1000000FB0000007A0000007C0000003C0000003C0000003C0000003C0000003C00000
-03C0000003C0000003C0000003C0000003C0000003C0000007C000007FFE00201F7F9E22>89
-D<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0
-C0C0C0C0C0FEFE072D7CA10D>91 D<FEFE06060606060606060606060606060606060606060606
-06060606060606060606060606060606060606FEFE072D7FA10D>93 D<081020204040808080B8
-FCFC7C38060E7D9F0D>96 D<1FE000303000781800781C00300E00000E00000E00000E0000FE00
-078E001E0E00380E00780E00F00E10F00E10F00E10F01E10781E103867200F83C014147E9317>
-I<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E3E
-000EC3800F01C00F00E00E00E00E00700E00700E00780E00780E00780E00780E00780E00780E00
-700E00700E00E00F00E00D01C00CC300083E0015207F9F19>I<03F80E0C1C1E381E380C700070
-00F000F000F000F000F000F00070007000380138011C020E0C03F010147E9314>I<000380003F
-8000038000038000038000038000038000038000038000038000038000038003E380061B801C07
-80380380380380700380700380F00380F00380F00380F00380F00380F003807003807003803803
-803807801C07800E1B8003E3F815207E9F19>I<03F0000E1C001C0E0038070038070070070070
-0380F00380F00380FFFF80F00000F00000F000007000007000003800801800800C010007060001
-F80011147F9314>I<007C00C6018F038F07060700070007000700070007000700FFF007000700
-07000700070007000700070007000700070007000700070007000700070007007FF01020809F0E
->I<0000E003E3300E3C301C1C30380E00780F00780F00780F00780F00780F00380E001C1C001E
-380033E0002000002000003000003000003FFE001FFF800FFFC03001E0600070C00030C00030C0
-0030C000306000603000C01C038003FC00141F7F9417>I<0E0000FE00000E00000E00000E0000
-0E00000E00000E00000E00000E00000E00000E00000E3E000E43000E81800F01C00F01C00E01C0
-0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0
-FFE7FC16207F9F19>I<1C003E003E003E001C000000000000000000000000000E007E000E000E
-000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFC00A1F809E0C>
-I<00E001F001F001F000E0000000000000000000000000007007F000F000700070007000700070
-00700070007000700070007000700070007000700070007000700070007000706070F060F0C061
-803F000C28829E0E>I<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00
-000E00000E00000E0FF00E03C00E03000E02000E04000E08000E10000E30000E70000EF8000F38
-000E1C000E1E000E0E000E07000E07800E03800E03C00E03E0FFCFF815207F9F18>I<0E00FE00
-0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E
-000E000E000E000E000E000E000E000E000E00FFE00B20809F0C>I<0E1F01F000FE618618000E
-81C81C000F00F00E000F00F00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E00
-0E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E
-000E00E00E00FFE7FE7FE023147F9326>I<0E3E00FE43000E81800F01C00F01C00E01C00E01C0
-0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFE7FC
-16147F9319>I<01F800070E001C03803801C03801C07000E07000E0F000F0F000F0F000F0F000
-F0F000F0F000F07000E07000E03801C03801C01C0380070E0001F80014147F9317>I<0E3E00FE
-C3800F01C00F00E00E00E00E00F00E00700E00780E00780E00780E00780E00780E00780E00700E
-00F00E00E00F01E00F01C00EC3000E3E000E00000E00000E00000E00000E00000E00000E00000E
-0000FFE000151D7F9319>I<03E0800619801C05803C0780380380780380700380F00380F00380
-F00380F00380F00380F003807003807803803803803807801C0B800E138003E380000380000380
-000380000380000380000380000380000380003FF8151D7E9318>I<0E78FE8C0F1E0F1E0F0C0E
-000E000E000E000E000E000E000E000E000E000E000E000E000E00FFE00F147F9312>I<1F9030
-704030C010C010C010E00078007F803FE00FF00070803880188018C018C018E030D0608F800D14
-7E9312>I<020002000200060006000E000E003E00FFF80E000E000E000E000E000E000E000E00
-0E000E000E000E080E080E080E080E080610031001E00D1C7F9B12>I<0E01C0FE1FC00E01C00E
-01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E
-03C00603C0030DC001F1FC16147F9319>I<FF83F81E01E01C00C00E00800E00800E0080070100
-07010003820003820003820001C40001C40001EC0000E80000E800007000007000007000002000
-15147F9318>I<FF9FE1FC3C0780701C0300601C0380200E0380400E0380400E03C0400707C080
-0704C0800704E080038861000388710003C8730001D0320001D03A0000F03C0000E01C0000E01C
-0000601800004008001E147F9321>I<7FC3FC0F01E00701C007018003810001C20000E40000EC
-00007800003800003C00007C00004E000087000107000303800201C00601E01E01E0FF07FE1714
-809318>I<FF83F81E01E01C00C00E00800E00800E008007010007010003820003820003820001
-C40001C40001EC0000E80000E800007000007000007000002000002000004000004000004000F0
-8000F08000F100006200003C0000151D7F9318>I<3FFF380E200E201C40384078407000E001E0
-01C00380078007010E011E011C0338027006700EFFFE10147F9314>I<FFFFFC1601808C17>I
-E /Fp 14 122 df<0000001FFC0000C000000003FFFFC001C00000001FFFFFF003C00000007FFF
-FFFC07C0000001FFFC00FE0FC0000007FFC0001F9FC000000FFE000007FFC000003FF8000003FF
-C000007FF0000000FFC00000FFE00000007FC00001FFC00000007FC00001FF800000003FC00003
-FF000000001FC00007FE000000001FC0000FFE000000000FC0000FFC000000000FC0001FFC0000
-000007C0001FFC0000000007C0003FF80000000007C0003FF80000000003C0003FF80000000003
-C0007FF80000000003C0007FF80000000003C0007FF0000000000000007FF000000000000000FF
-F000000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF00000
-0000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF00000000000
-0000FFF000000000000000FFF000001FFFFFFF807FF000001FFFFFFF807FF000001FFFFFFF807F
-F800001FFFFFFF807FF800000001FFC0003FF800000001FFC0003FF800000001FFC0003FF80000
-0001FFC0001FFC00000001FFC0001FFC00000001FFC0000FFE00000001FFC0000FFE00000001FF
-C00007FF00000001FFC00003FF00000001FFC00001FF80000001FFC00001FFC0000001FFC00000
-FFE0000001FFC000007FF0000003FFC000003FFC000003FFC000000FFF000007FFC0000007FFC0
-001FBFC0000001FFFC00FF1FC00000007FFFFFFE0FC00000001FFFFFF803C000000003FFFFE000
-C0000000001FFE00000000413D7BBB4C>71 D<FFFFFFFE000000FFFFFFFE000000FFFFFFFE0000
-00FFFFFFFE000000007FF000000000007FF000000000007FF000000000007FF000000000007FF0
-00000000007FF000000000007FF000000000007FF000000000007FF000000000007FF000000000
-007FF000000000007FF000000000007FF000000000007FF000000000007FF000000000007FF000
-000000007FF000000000007FF000000000007FF000000000007FF000000000007FF00000000000
-7FF000000000007FF000000000007FF000000000007FF000000000007FF000000000007FF00000
-0000007FF000000000007FF000000000007FF000000000007FF000000000007FF000000780007F
-F000000780007FF000000780007FF000000780007FF000000780007FF000000F80007FF000000F
-00007FF000000F00007FF000000F00007FF000001F00007FF000001F00007FF000001F00007FF0
-00003F00007FF000003F00007FF000007F00007FF00000FF00007FF00001FF00007FF00003FF00
-007FF0000FFE00007FF0007FFE00FFFFFFFFFFFE00FFFFFFFFFFFE00FFFFFFFFFFFE00FFFFFFFF
-FFFE00313B7CBA3A>76 D<FFFFF0000007FFFFE0FFFFF8000007FFFFE0FFFFFC000007FFFFE0FF
-FFFE000007FFFFE0007FFE00000007E000007FFF00000003C000007FFF80000003C000007BFFC0
-000003C000007BFFE0000003C0000079FFE0000003C0000078FFF0000003C00000787FF8000003
-C00000783FFC000003C00000783FFE000003C00000781FFE000003C00000780FFF000003C00000
-7807FF800003C000007803FFC00003C000007803FFE00003C000007801FFE00003C000007800FF
-F00003C0000078007FF80003C0000078003FFC0003C0000078003FFE0003C0000078001FFF0003
-C0000078000FFF0003C00000780007FF8003C00000780003FFC003C00000780003FFE003C00000
-780001FFF003C00000780000FFF003C000007800007FF803C000007800003FFC03C00000780000
-3FFE03C000007800001FFF03C000007800000FFF03C0000078000007FF83C0000078000003FFC3
-C0000078000003FFE3C0000078000001FFF3C0000078000000FFF3C00000780000007FFBC00000
-780000003FFFC00000780000003FFFC00000780000001FFFC00000780000000FFFC00000780000
-0007FFC000007800000003FFC000007800000003FFC000007800000001FFC000007800000000FF
-C0000078000000007FC0000078000000003FC0000078000000003FC00000FC000000001FC000FF
-FFFC0000000FC000FFFFFC00000007C000FFFFFC00000003C000FFFFFC00000003C000433B7CBA
-4C>78 D<FFFFFFFFF800000000FFFFFFFFFFC0000000FFFFFFFFFFF8000000FFFFFFFFFFFE0000
-00007FF0001FFF000000007FF00003FFC00000007FF00000FFE00000007FF000007FF00000007F
-F000003FF80000007FF000003FF80000007FF000003FFC0000007FF000001FFC0000007FF00000
-1FFC0000007FF000001FFE0000007FF000001FFE0000007FF000001FFE0000007FF000001FFE00
-00007FF000001FFE0000007FF000001FFE0000007FF000001FFC0000007FF000001FFC0000007F
-F000003FFC0000007FF000003FF80000007FF000007FF00000007FF000007FE00000007FF00001
-FFC00000007FF00003FF800000007FF0001FFE000000007FFFFFFFF8000000007FFFFFFFC00000
-00007FFFFFFFC0000000007FF0007FF0000000007FF0001FF8000000007FF0000FFC000000007F
-F00007FE000000007FF00003FF000000007FF00003FF800000007FF00001FF800000007FF00001
-FF800000007FF00001FFC00000007FF00001FFC00000007FF00001FFC00000007FF00001FFC000
-00007FF00001FFC00000007FF00001FFE00000007FF00001FFE00000007FF00001FFE00000007F
-F00001FFE00000007FF00001FFE00000007FF00001FFE001E0007FF00001FFE001E0007FF00000
-FFF001E0007FF00000FFF001E0007FF00000FFF003C0007FF000007FF803C0FFFFFFF8003FFC07
-80FFFFFFF8001FFE0F80FFFFFFF80007FFFF00FFFFFFF80001FFFC000000000000001FF000433C
-7CBA48>82 D<FFFFFFF8001FFFFF80FFFFFFF8001FFFFF80FFFFFFF8001FFFFF80FFFFFFF8001F
-FFFF80007FF00000001F8000007FF00000000F0000007FF00000000F0000007FF00000000F0000
-007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF0
-0000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF0000000
-0F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000
-007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF0
-0000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF0000000
-0F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000
-007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF0
-0000000F0000007FF00000000F0000007FF00000000F0000007FF00000000F0000007FF0000000
-0F0000007FF00000000F0000003FF00000001E0000003FF00000001E0000003FF80000001E0000
-001FF80000003C0000001FF80000003C0000000FFC0000007800000007FC000000F800000007FE
-000001F000000003FF000003F000000001FF800007E000000000FFE0001FC0000000003FFC01FF
-80000000001FFFFFFE000000000007FFFFF8000000000000FFFFE00000000000000FFE00000000
-413C7CBA4A>85 D<003FFE00000001FFFFE0000007FFFFF800000FE007FC00000FF001FE00001F
-F800FF00001FF8007F80001FF8007FC0001FF8003FC0000FF0003FE00007E0003FE00003C0003F
-E0000000003FE0000000003FE0000000003FE0000000003FE0000000FFFFE000001FFFFFE00000
-7FF83FE00003FF803FE00007FC003FE0000FF0003FE0001FE0003FE0003FE0003FE0007FC0003F
-E0007FC0003FE000FF80003FE000FF80003FE000FF80003FE000FF80003FE000FF80007FE0007F
-C0007FE0007FC000DFE0003FE0039FF0001FF80F0FFFE007FFFE0FFFE001FFF807FFE0003FE000
-FFE02B267DA52F>97 D<00FE00000000FFFE00000000FFFE00000000FFFE00000000FFFE000000
-0007FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE
-0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE000000
-0003FE0000000003FE0000000003FE0000000003FE0000000003FE01FF000003FE1FFFF00003FE
-7FFFFC0003FEFC03FE0003FFF000FF0003FFC0003F8003FF00001FC003FE00001FE003FE00000F
-F003FE00000FF803FE00000FF803FE000007FC03FE000007FC03FE000007FC03FE000007FE03FE
-000007FE03FE000007FE03FE000007FE03FE000007FE03FE000007FE03FE000007FE03FE000007
-FE03FE000007FE03FE000007FC03FE000007FC03FE000007FC03FE00000FFC03FE00000FF803FE
-00000FF003FE00001FF003FF00001FE003FF80003FC003FFC0007F8003F9E000FF0003F0FC07FE
-0003F07FFFF80003E01FFFE00003C003FE00002F3C7DBB36>I<000000003F800000003FFF8000
-00003FFF800000003FFF800000003FFF8000000001FF8000000000FF8000000000FF8000000000
-FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000
-000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000
-FF800000FF80FF80000FFFF0FF80003FFFFCFF8000FFC03FFF8001FE000FFF8003FC0003FF8007
-F80001FF800FF00000FF801FF00000FF803FE00000FF803FE00000FF807FE00000FF807FC00000
-FF807FC00000FF807FC00000FF80FFC00000FF80FFC00000FF80FFC00000FF80FFC00000FF80FF
-C00000FF80FFC00000FF80FFC00000FF80FFC00000FF80FFC00000FF807FC00000FF807FC00000
-FF807FC00000FF803FE00000FF803FE00000FF801FE00000FF800FF00001FF8007F00003FF8003
-F80007FF8001FE001FFFC000FF807EFFFE007FFFF8FFFE000FFFE0FFFE0001FF00FFFE2F3C7DBB
-36>100 D<0001FF8000000FFFF000003FFFFC0000FF81FE0003FE007F8007F8003F800FF8001F
-C00FF0000FE01FE0000FE03FE0000FF03FE00007F07FC00007F07FC00007F87FC00007F8FFC000
-07F8FFC00007F8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFC0000000FFC0000000FFC0000000FFC0
-0000007FC00000007FC00000007FC00000003FE00000003FE00000781FE00000781FF00000780F
-F00000F007F80001F003FC0003E001FE000FC000FFC07F80003FFFFE00000FFFF8000000FFC000
-25267DA52C>I<01E00007F8000FFC000FFC001FFE001FFE001FFE001FFE000FFC000FFC0007F8
-0001E00000000000000000000000000000000000000000000000000000000000000000000000FE
-00FFFE00FFFE00FFFE00FFFE0007FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE
-0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE
-0003FE0003FE0003FE0003FE0003FE0003FE0003FE00FFFFF0FFFFF0FFFFF0FFFFF0143D7DBC1A
->105 D<00FE00FFFE00FFFE00FFFE00FFFE0007FE0003FE0003FE0003FE0003FE0003FE0003FE
-0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE
-0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE
-0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE
-0003FE0003FE0003FE0003FE0003FE00FFFFF8FFFFF8FFFFF8FFFFF8153C7DBB1A>108
-D<01FC00FF8000FFFC03FFF000FFFC0FFFF800FFFC1E03FC00FFFC3801FE0007FC6001FF0003FC
-C000FF0003FDC000FF8003FD8000FF8003FF0000FF8003FF0000FF8003FF0000FF8003FE0000FF
-8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE
-0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF
-8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE
-0000FF8003FE0000FF80FFFFF83FFFFEFFFFF83FFFFEFFFFF83FFFFEFFFFF83FFFFE2F267CA536
->110 D<01FC03F000FFFC0FFC00FFFC1FFF00FFFC3C3F80FFFC707F8007FCE0FFC003FCC0FFC0
-03FD80FFC003FD80FFC003FF807F8003FF003F0003FF001E0003FF00000003FE00000003FE0000
-0003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00
-000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE
-00000003FE00000003FE00000003FE000000FFFFFC0000FFFFFC0000FFFFFC0000FFFFFC000022
-267DA528>114 D<FFFFF001FFFCFFFFF001FFFCFFFFF001FFFCFFFFF001FFFC03FE00001F8003
-FF00001F0001FF00001E0001FF80003E0000FF80003C0000FF80003C00007FC0007800007FC000
-7800007FE000F800003FE000F000003FF001F000001FF001E000001FF803E000000FF803C00000
-0FFC03C0000007FC0780000007FC0780000007FE0F80000003FE0F00000003FF1F00000001FF1E
-00000001FFBE00000000FFBC00000000FFFC000000007FF8000000007FF8000000007FF8000000
-003FF0000000003FF0000000001FE0000000001FE0000000000FC0000000000FC0000000000780
-000000000780000000000F80000000000F00000000001F00000000001E00000008003E0000007F
-003C0000007F007C000000FF8078000000FF80F8000000FF80F0000000FF81E00000007F07C000
-00007C1F800000003FFF000000001FFE0000000007F0000000002E377EA533>121
-D E end
-%%EndProlog
-%%BeginSetup
-%%Feature: *Resolution 300dpi
+%DVIPSParameters: dpi=300, compressed, comments removed
+%DVIPSSource: TeX output 1997.06.03:1139
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N
+/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id
+gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp
+add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add
+/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{
+dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1
+adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2
+idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
+putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
+adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
+{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
+adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
+chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
+}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict
+/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
+B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
+4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
+p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+TeXDict begin 40258431 52099146 1000 300 300 (readline.dvi)
+@start /Fa 1 47 df<127012F8A212F012E005057B840E>46 D
+E /Fb 1 47 df<1238127C12FCA212F8127006067A8512>46 D E
+/Fc 1 59 df<126012F0A2126004047D830B>58 D E /Fd 52 127
+df<126012F0AD12601200A4126012F0A212600417789614>33 D<EA071CA5EA7FFFB512
+80A2380E3800A7B51280A26C1300EA1C70A511177F9614>35 D<EA01801203EA06005A12
+1C121812385AA35AA91270A37E1218121C120C7EEA03801201091D799914>40
+D<128012C01260123012381218121C120EA31207A9120EA3121C121812381230126012C0
+1280081D7C9914>I<EA0380A3EA638CEAF39EEA7FFCEA3FF8EA0FE0A2EA3FF8EA7FFCEA
+F39EEA638CEA0380A30F107E9214>I<127012F812FCA2127C120C1218123012E012C006
+0A798414>44 D<EAFFFEA30F037E8C14>I<127012F8A312700505798414>I<EA07C0EA0F
+E0EA1C70EA3838EA3018EA701CA2EAE00EA9EA701CA2EA3838A2EA1C70EA0FE0EA07C00F
+177E9614>48 D<1203A25A5A123F12F712471207AEEA7FF0A20C177C9614>I<130E133E
+137C13F0EA03E0EA07C0EA1F00123E12F85A7E123E7EEA07C0EA03E0EA00F0137C133E13
+0E0F137E9414>60 D<124012E012F8127C121EEA0F80EA07C0EA01F0EA00F8133E131E13
+3E13F8EA01F0EA07C0EA0F80EA1E00127C5A12E012400F157E9514>62
+D<EA1FE0EA3FF8EA701CEAE00EA21240EA003C137013E0EA01C0EA0380A41300C7FCA412
+03EA0780A2EA03000F177E9614>I<EA01E0EA07F0EA0E38EA181CEA38FC1271EA731E12
+77EAEE0EA7EA771CEA7318EA71F0EA38E0EA1806EA0E1EEA07F8EA01F00F177E9614>I<
+EA01C0487EA21360A2EA0770A4EA0630EA0E38A4487EEA1FFCA2EA1C1CA2487EA238FE3F
+80A211177F9614>I<EAFFF013FCEA381E130E1307A4130E131EEA3FFCA2EA381E130E13
+07A5130E131EEAFFFC13F810177F9614>I<3801F180EA07FFEA0E1FEA1C071238EA7003
+A348C7FCA738700380A338380700121CEA0E0EEA07FCEA01F011177F9614>I<EAFFE013
+F8EA383C7F130E7FA3EB0380A8EB0700A2130E131E5BEAFFF813E011177F9614>I<B5FC
+A2EA3807A490C7FCA21338A2EA3FF8A2EA3838A290C7FCA3EB0380A4B5FCA211177F9614
+>I<B4FCA21238AF1307A4B5FCA210177E9614>76 D<38FC1F80A2007C1300EA7637A4EA
+7777A2EA7367A313E7EA71C7A2EA7007A638F80F80A211177F9614>I<38FE3F80A2383E
+0E00123BA4138E1239A213CEA31238A213EE136EA4133E12FEA211177F9614>I<EAFFE0
+13F8EA383C131C7FA45B133CEA3FF85BEA38387FA51480EB1DC0A238FE0F80EB07001217
+7F9614>82 D<EA0FCCEA1FFCEA307CEA603CEAE01CA313001270127EEA3FE0EA0FF0EA01
+F8EA001C131E130E126012E0A2EAF01CEAF838EAFFF0EAC7E00F177E9614>I<387FFF80
+B5FCEAE1C3A43801C000AFEA0FF8A211177F9614>I<EAFFE0A21200B3A712FFA20B1D7F
+9914>93 D<EA1FC0EA7FF0EA7078EA2018EA001CA2EA07FC121FEA3C1C127012E0A3EA70
+7C383FFF80EA0F8F11107E8F14>97 D<12FCA2121CA513F8EA1DFEEA1F07EA1E03001C13
+80EB01C0A6EB0380001E1300EA1F0EEA1DFCEA0CF81217809614>I<EA03F8EA0FFEEA1C
+0EEA3804EA7000126012E0A412601270EA380EEA1C1EEA0FFCEA03F00F107E8F14>I<13
+7EA2130EA5EA07CEEA0FFEEA1C3EEA301EEA700E12E0A61270EA301EEA383E381FEFC0EA
+07CF12177F9614>I<EA07E0EA0FF0EA1C38EA301CEA700CEAE00EA2EAFFFEA2EAE00012
+601270EA380EEA1C1EEA0FFCEA03F00F107E8F14>I<13FCEA01FEEA038EEA07041300A3
+EA7FFE12FFEA0700ACEAFFF8A20F177F9614>I<EA07CF381FFF80EA383B38301800EA70
+1CA3EA3018EA3838EA3FF0EA37C00070C7FCA2EA3FF86C7E487EEA700F38E00380A43870
+0700EA3C1EEA1FFCEA07F011197F8F14>I<12FCA2121CA51378EA1DFEEA1F86EA1E0712
+1CAA38FF8FE0A21317809614>I<1206120FA21206C7FCA4B4FCA21207ACEAFFF8A20D18
+7C9714>I<12FCA2121CA5EBFF80A2EB1C005B5B5BEA1DC0EA1FE0A2EA1E70EA1C38133C
+131C7F38FF1F80A21117809614>107 D<EAFF80A21203B3EAFFFEA20F177E9614>I<EAFB
+8EEAFFDF383CF380A2EA38E3AA38FEFBE013791310808F14>I<EAFC78EAFDFEEA1F86EA
+1E07121CAA38FF8FE0A21310808F14>I<EA07C0EA1FF0EA3C78EA701CA2EAE00EA6EA70
+1CEA783CEA3C78EA1FF0EA07C00F107E8F14>I<EAFCF8EAFDFEEA1F07EA1E03001C1380
+EB01C0A6EB0380001E1300EA1F0EEA1DFCEA1CF890C7FCA6B47EA21218808F14>I<EA03
+E7EA0FF7EA1C1FEA300F1270487EA6EA700F1230EA1C3FEA0FF7EA07C7EA0007A6EB3FE0
+A213187F8F14>I<EAFE1FEB7F80EA0EE3380F810090C7FCA2120EA8EAFFF0A211107F8F
+14>I<EA0FD8EA3FF8EA603812C0A2EAF000EA7F80EA3FF0EA07F8EA001CEA600612E012
+F0EAF81CEAFFF8EACFE00F107E8F14>I<1206120EA4EA7FFC12FFEA0E00A8130EA3131C
+EA07F8EA01F00F157F9414>I<EAFC3FA2EA1C07AB131F380FFFE0EA03E71310808F14>I<
+38FE3F80A2383C1E00EA1C1CA36C5AA3EA0630EA0770A36C5AA311107F8F14>I<38FE3F
+80A238700700EA380EA3EA39CEA3EA1B6C121AA3EA1E7CA2EA0E3811107F8F14>I<EA7E
+3FA2EA1E3CEA0E78EA07705B12036C5A12037FEA0770EA0E781338487E38FE3F80A21110
+7F8F14>I<38FE3F80A2381C0E005BA2120E5BA212071330A2EA0370A25B1201A25BA348
+5A12730077C7FC127E123C11187F8F14>I<EA3FFF5AEA700E131C1338EA007013E0EA01
+C0EA0380EA0700120EEA1C0712381270B5FCA210107F8F14>I<EA1C10EA3F38EAE7E0EA
+41C00D047D9614>126 D E /Fe 2 121 df<1270A212F0126004047D830B>46
+D<383FC7E038078380EB0200EA038413C8EA01D8EA00F05B7F120113381202487EEA081E
+123838FC3FC013107F8F14>120 D E /Ff 39 123 df<13FEEA038138060180EA0E0338
+1C010090C7FCA5B51280EA1C03AE38FF8FF0141A809915>12 D<EBFF80EA0383EA060312
+0E121CA6B5FCEA1C03AE38FF9FF0141A809915>I<126012F0A212701210A31220A21240
+A2040B7D830B>44 D<EAFFC0A20A0280880D>I<EA07E0EA1C38EA381CEA300CEA700EEA
+6006A2EAE007AAEA6006A2EA700EEA300CEA381CEA1C38EA07E010187F9713>48
+D<12035AB4FC1207B3A2EA7FF80D187D9713>I<EA0F80EA1060EA2030EA4038EA803CEA
+C01C12E01240EA003C1338A21370136013C0EA018013001202EA040412081210EA3008EA
+3FF8127F12FF0E187E9713>I<EA07E0EA1838EA201CEA601EEA700EEA201E1200131CA2
+13381370EA07E0EA0038131C130E130FA212E0A212C0EA400EEA601CEA1838EA07E01018
+7F9713>I<1318A21338137813F813B8EA01381202A212041208121812101220124012C0
+B5FCEA0038A6EA03FF10187F9713>I<EA3018EA3FF013E01380EA2000A5EA2FC0EA3060
+EA2030EA00381318131CA2124012E0A2EA8018EA40381330EA30E0EA0F800E187E9713>
+I<EA01F8EA0704EA0C06EA180E123013001270126012E0EAE3E0EAE418EAE80CEAF00EEA
+E0061307A31260A2EA7006EA300EEA180CEA0C38EA07E010187F9713>I<1240EA7FFF13
+FEA2EA4004EA80081310A2EA00201340A21380120113005AA25A1206A2120EA512041019
+7E9813>I<EA07E0EA1818EA300CEA20061260A21270EA780CEA3E18EA1F30EA07C0EA03
+E0EA0CF8EA307CEA601E130FEAC0071303A3EA6002EA2004EA1818EA07E010187F9713>
+I<EA07E0EA1C30EA3018EA700CEA600EEAE006A21307A31260EA700FEA3017EA1827EA07
+C7EA00071306130E130C12701318EA6030EA3060EA0F8010187F9713>I<EA1FC0EA3870
+7FEA101C1200A2EA03FCEA1E1C1238127012E01480A2133CEA705F381F8F0011107F8F13
+>97 D<12FC121CA913FCEA1D07381E0380381C01C0130014E0A6EB01C01480381E0300EA
+1906EA10F8131A809915>I<EA07F8EA1C1C1238EA700813005AA612701304EA3808EA1C
+18EA07E00E107F8F11>I<133F1307A9EA03E7EA0C17EA180F487E127012E0A612601270
+6C5AEA1C373807C7E0131A7F9915>I<EA07C0EA1C30EA30181270EA600C12E0EAFFFCEA
+E000A41260EA7004EA3808EA1C18EA07E00E107F8F11>I<EA01F0EA0718EA0E38EA1C10
+1300A6EAFFC0EA1C00AEEAFF800D1A80990C>I<EA0FCF3818718038303000EA7038A4EA
+30306C5AEA2FC00060C7FCA21270EA3FF013FC6C7EEA600FEAC003A4EA6006EA381CEA07
+E011187F8F13>I<12FC121CA9137CEA1D87381E0380A2121CAB38FF9FF0141A809915>I<
+1218123CA212181200A612FC121CAE12FF081A80990A>I<12FC121CA9EB1FC0EB0F0013
+0C5B13205B13E0121DEA1E70EA1C7813387F131E7F148038FF9FE0131A809914>107
+D<12FC121CB3A6EAFF80091A80990A>I<38FC7C1F391D8E6380391E0781C0A2001C1301
+AB39FF9FE7F81D107F8F20>I<EAFC7CEA1D87381E0380A2121CAB38FF9FF01410808F15>
+I<EA07E0EA1C38EA300CEA700EEA6006EAE007A6EA6006EA700EEA381CEA1C38EA07E010
+107F8F13>I<EAFCFCEA1D07381E0380381C01C0A2EB00E0A6EB01C01480381E0300EA1D
+06EA1CF890C7FCA6B47E1317808F15>I<EA03E1EA0C13EA180BEA300FEA700712E0A612
+70A26C5AEA1C37EA07C7EA0007A6EB3FE013177F8F14>I<EAFC78EA1D9CEA1E1C1308EA
+1C00ABEAFF800E10808F0F>I<EA1F20EA60E0EA402012C0A2EAF000127FEA3FC0EA1FE0
+EA00F0EA8070133012C01320EAF040EA8F800C107F8F0F>I<1208A41218A21238EAFFC0
+EA3800A81320A41218EA1C40EA07800B177F960F>I<38FC1F80EA1C03AB1307120CEA0E
+0B3803F3F01410808F15>I<38FF0F80383C0700EA1C061304A26C5AA26C5AA3EA03A0A2
+EA01C0A36C5A11107F8F14>I<39FE7F1F8039381C0700003C1306381C0C04130E380E16
+081317A238072310149013A33803C1A014E0380180C0A319107F8F1C>I<38FE3F80383C
+1E00EA1C086C5AEA0F306C5A6C5A12017F1203EA0270487E1208EA181CEA381E38FC3FC0
+12107F8F14>I<38FF0F80383C0700EA1C061304A26C5AA26C5AA3EA03A0A2EA01C0A36C
+5AA248C7FCA212E112E212E4127811177F8F14>I<EAFFF8EAE07012C0EA80E0EA81C0A2
+EA0380EA0700A2EA0E04121CA2EA380812701338EAFFF80E107F8F11>I
+E /Fg 2 42 df<13E0EA01C0EA0380120713005A121EA2121C123CA212381278A3127012
+F0AE12701278A31238123CA2121C121EA27E7E13801203EA01C0EA00E00B2E7CA112>40
+D<12E012707E123C121C121E7EA27E1380A2120313C0A3120113E0AE13C01203A3138012
+07A213005AA2121E121C123C12385A5A0B2E7EA112>I E /Fh 28
+123 df<90380FF83F90397FFDFFC03A01FC1FE3E03903F03FC7EA07E0D80FC01387ED83
+C091381F8000A6B612FCA2390FC01F80B2397FF8FFF8A223237FA221>11
+D<EB07F8EB7FFC3801FC0E3803F01F48485AEA0FC0A3141E140C91C7FCA2ECFF80B6FCA2
+380FC01FB2397FF8FFF0A21C237FA220>I<13181330136013C01201EA0380120713005A
+121EA2123E123CA2127CA3127812F8AD1278127CA3123CA2123E121EA27E7E13801203EA
+01C012001360133013180D317BA416>40 D<EA07FE381FFF80383F07E06D7E130180121E
+1200A2133FEA03FDEA1F81EA3E01127C12F8A4EA7C02EA7E0C391FF87F803807E03F1916
+7E951C>97 D<B47EA2121FABEB87F0EBBFFCEBF03EEBC01F9038800F8015C0140715E0A7
+15C0A2140F15809038C01F00381E707E381C3FFC38180FE01B237EA220>I<EBFF800007
+13E0380F83F0EA1F03123E127E387C01E090C7FC12FCA6127C127EA2003E13186C133038
+0FC0603807FFC0C6130015167E9519>I<49B4FCA2EB003FAB13FE3807FFBF380FC1FF48
+C67E003E7F127E127CA212FCA7127C127E123E6C5B380F81FF3907FF3FE0EA01FC1B237E
+A220>I<13FE3807FF80380F83C0381E01E0383E00F0127E007C13F8147812FCB512F8A2
+00FCC7FCA3127CA26C1318A26C1330380F80E03803FFC0C6130015167E951A>I<EB1F80
+EBFFE03801F1F0EA03E31207EA0FC3EBC1E0EBC000A6EAFFFEA2EA0FC0B2EA7FFCA21423
+7EA212>I<9038FE0F803903FF9FC0380F83E3381F01F3391E00F000003E7FA5001E5BEA
+1F01380F83E0380BFF80D808FEC7FC0018C8FCA2121C381FFFE014FC6C13FF7E001F1480
+397C001FC00078130F00F81307A3007CEB0F806CEB1F00381F807E6CB45A000113E01A21
+7F951D>I<B47EA2121FABEB83F0EB8FFCEB987EEBA03EEBC03FA21380AE39FFF1FFE0A2
+1B237DA220>I<121E123FEA7F80A4EA3F00121EC7FCA6EAFF80A2121FB2EAFFF0A20C24
+7EA30F>I<B47EA2121FABECFF80A2EC3C00143014E0EB81C00183C7FC1386139E13BE13
+FFEBDF80EB8FC01307806D7E6D7E130080147E39FFE1FFC0A21A237EA21E>107
+D<EAFF80A2121FB3ADEAFFF0A20C237EA20F>I<3AFF03F803F890390FFE0FFE3A1F183F
+183F9039201F201F014001C01380A201801380AE3BFFF0FFF0FFF0A22C167D9531>I<38
+FF03F0EB0FFC381F187EEB203EEB403FA21380AE39FFF1FFE0A21B167D9520>I<13FF00
+0713E0380F81F0381F00F8003E137C48133EA300FC133FA7007C133E007E137E003E137C
+6C13F8380F81F03807FFE0C6130018167E951D>I<38FF87F0EBBFFC381FF07EEBC01F90
+38800F8015C0A2EC07E0A715C0140FA2EC1F8001C01300EBF07EEBBFFCEB8FE00180C7FC
+A8EAFFF0A21B207E9520>I<EBFE033807FF07380FC1CF381F00DF48137F007E7FA2127C
+12FCA7127EA2003E5B6C5BEA0FC13807FF3FEA00FC1300A8903801FFE0A21B207E951E>
+I<38FF0F80EB1FE0381F33F013631343A2EBC1E0EB8000ADEAFFF8A214167E9518>I<38
+07F980EA1FFFEA3807EA7003EAF001A26CC7FCB4FC13F8EA7FFE6C7E6C1380120738003F
+C0EAC007130312E0A200F0138038FC0F00EAEFFEEAC3F812167E9517>I<487EA41203A2
+1207A2120F123FB5FCA2EA1F80ABEB8180A5380F830013C3EA07FEEA01F811207F9F16>
+I<38FF81FFA2381F803FAF5C5C380FC1BF3907FF3FE0EA01FC1B167D9520>I<39FFF01F
+E0A2391FC00700000F1306EBE00E0007130C13F000035BA26C6C5AA26C6C5AA2EBFEE0EB
+7EC0137F6D5AA26DC7FCA2130EA21B167F951E>I<3AFFF3FF83FCA23A1F807C00E0D80F
+C014C08001E013010007017F1380A2D803F0EB0300ECCF8301F81387D801F913C61487D8
+00FD13ECEBFF0315FC017F5BEB7E01013E5BEB3C00A20118136026167F9529>I<39FFF0
+7FC0A2390FC01C006C6C5A6D5A00035B6C6C5A3800FD80137F91C7FC7F6D7E497EEB37E0
+EB67F013C33801C1F8380380FC48487E000E137F39FF81FFE0A21B167F951E>I<39FFF0
+1FE0A2391FC00700000F1306EBE00E0007130C13F000035BA26C6C5AA26C6C5AA2EBFEE0
+EB7EC0137F6D5AA26DC7FCA2130EA2130CA25B1278EAFC3813305BEA69C0EA7F80001FC8
+FC1B207F951E>I<387FFFF0A2387C07E038700FC0EA601F00E0138038C03F005B137EC6
+5A1201485AEBF030EA07E0120FEBC070EA1F80003F1360EB00E0EA7E03B5FCA214167E95
+19>I E /Fi 29 122 df<13E0A538F0E1E0EAFCE7387EEFC0381FFF00EA07FCEA01F0EA
+07FCEA1FFF387EEFC038FCE7E0EAF0E13800E000A513157D991A>42
+D<EB7C38EA01FF000713F8EA0F83EA1E00001C13785A14385AA214005AA812701438A27E
+A26C1370001E13F0380F83E03807FFC00001138038007C00151E7E9D1A>67
+D<B512F8A3381C0038A51400A2130EA3EA1FFEA3EA1C0EA390C7FCA3141CA5B512FCA316
+1E7E9D1A>69 D<387FFFFCB5FC7E380E001CA51400A2EB0380A3EA0FFFA3EA0E03A390C7
+FCA8EA7FE012FF127F161E7F9D1A>I<B51280A33801C000B3A6B51280A3111E7C9D1A>
+73 D<387F03F838FF87FC387F03F8381C01E0EB03C01480EB07005B131E131C5B13785B
+7F121DEA1FDC139C130EEA1E0F7F001C13801303EB01C0A2EB00E0A21470007F13FC38FF
+81FE387F00FC171E7F9D1A>75 D<EA7FE0487E6C5A000EC7FCB3141CA5387FFFFCB5FC7E
+161E7F9D1A>I<EAFFFEEBFF8014C0381C03E0EB00F0147014781438A41478147014F0EB
+03E0381FFFC01480EBFE00001CC7FCA9B47EA3151E7E9D1A>80 D<38FF01FEA3381C0070
+A3001E13F0000E13E0A3380701C0A438038380A43801C700A4EA00C613EEA3136C137CA2
+1338171E7F9D1A>86 D<387FFFC0B512E0A26C13C013047D7E1A>95
+D<EA1FF0EA3FFC487EEA780FEA300738000380A2137FEA07FF121FEA3F83EA7803127012
+E0A3EA7007EA780F383FFFFCEA1FFDEA07F016157D941A>97 D<12FEA3120EA6133EEBFF
+80000F13E0EBC1F0EB8070EB0038120E141CA7000F13381478EB80F0EBC1E0EBFFC0000E
+138038063E00161E7F9D1A>I<EBFF80000313C0000F13E0EA1F01383C00C04813001270
+A25AA51270A2007813707E381F01F0380FFFE0000313C03800FE0014157D941A>I<EB1F
+C0A31301A6EA01F1EA07FDEA0FFFEA1E0FEA3C07EA7803EA700112E0A7EA7003A2EA3807
+EA3E0F381FFFFCEA07FDEA01F1161E7E9D1A>I<EA01F8EA07FF481380381E07C0EA3C01
+387800E01270481370A2B512F0A300E0C7FC1270A2007813707E381F01F0380FFFE00003
+13803800FE0014157D941A>I<EB07E0EB1FF0EB3FF8EB7878EBF030EBE000A4387FFFF0
+B5FCA23800E000AF383FFF804813C06C1380151E7F9D1A>I<12FEA3120EA6133EEBFF80
+000F13C013C1EB80E01300120EAC38FFE3FE13E713E3171E7F9D1A>104
+D<EA01C0487EA36C5AC8FCA5EA7FE0A31200AF387FFF80B512C06C1380121F7C9E1A>I<
+EAFFE0A31200B3A6B512E0A3131E7D9D1A>108 D<387CE0E038FFFBF8EA7FFF381F1F1C
+EA1E1EA2EA1C1CAC387F1F1F39FF9F9F80397F1F1F00191580941A>I<EAFE3EEBFF80B5
+12C0EA0FC1EB80E01300120EAC38FFE3FE13E713E317157F941A>I<EA01F0EA07FCEA1F
+FF383E0F80EA3C07387803C0EA700138E000E0A6EAF001007013C0EA7803383C0780EA3E
+0F381FFF00EA07FCEA01F013157D941A>I<EAFE3EEBFF80B512E0380FC1F0EB8070EB00
+38120E141CA7000F13381478EB80F0EBC1E0EBFFC0000E1380EB3E0090C7FCA8EAFFE0A3
+16207F941A>I<387F81F838FF8FFC387F9FFE3803FE1EEBF80CEBE000A25B5BAAEA7FFF
+B5FC7E17157F941A>114 D<487E1203A6387FFFE0B5FCA238038000AA1470A43801C1E0
+13FF6C1380EB3F00141C7F9B1A>116 D<38FE0FE0A3EA0E00AD1301EA0F033807FFFE7E
+EA00FC17157F941A>I<387FC7FC00FF13FE007F13FC380E00E0A3380701C0A338038380
+A33801C700A3EA00EEA3137CA2133817157F941A>I<387FC7F8EBCFFCEBC7F8380703C0
+38038380EBC700EA01EFEA00FE137C13781338137C13EE120113C738038380000713C013
+01387FC7FC00FF13FE007F13FC17157F941A>120 D<387FC7FC00FF13FE007F13FC380E
+00E0A27EEB01C013811203EB8380EA01C3A2EBC700EA00E7A213E61366136E133CA31338
+A3137813701230EA78E01271EA7FC06C5A001EC7FC17207F941A>I
+E /Fj 1 59 df<127012F8A3127005057C840D>58 D E /Fk 52
+122 df<123C127E12FFA4127E123C08087C8711>46 D<EB7F803803FFF03807E1F8380F
+807C48487E48133F003E7F007E1480A400FE14C0AD007E1480A46CEB3F00A26C133E6C6C
+5A3807E1F86CB45A38007F801A237EA21F>48 D<131C133C13FC12FFA21200B3AA387FFF
+FCA216237CA21F>I<48B4FC000713C0381E07F0383803F8386001FC387C00FE12FE14FF
+147FA2127C003813FFC7FC14FEA2EB01FC14F8EB03F0EB07E01480EB0F00131E5B1370EB
+E003EA01C038038007380700061206380FFFFE5A5A4813FCB5FCA218237DA21F>I<48B4
+FC000713E0381E03F0383801F8003C13FC387E00FEA3123EEA1C01000013FCA2EB03F8EB
+07F0EB0FC03801FF00A2380007E0EB01F014F8EB00FC14FE14FFA21210127C12FEA214FE
+A2387C01FC007013F8383E07F0380FFFC00001130018237DA21F>I<14381478A214F813
+01130313071306130C131C13381330136013E0EA01C01380EA03005A120E5A12185A1270
+5AB612C0A2390001F800A790387FFFC0A21A237EA21F>I<0018130C001F137CEBFFF814
+F014E014C01480EBFC000018C7FCA513FF001B13E0381F03F0381C00F8000813FCC7127E
+A3147FA2127812FCA3147E5A006013FC1270383801F8381E07E03807FFC03801FE001823
+7DA21F>I<EB1FC0EB7FF03801F0383803E00C3807803E000F137EEA1F005AA2007E133C
+1400A338FE3FC0EB7FF0EB80F800FF13FCEB007C147E5A147FA4127EA4003E137E123F6C
+137C380F80F83807C1F03803FFC038007F0018237DA21F>I<1230123C003FB512C0A215
+804814005C5C38600018A200E05B485B5CC6485AA249C7FC1306130EA25BA2133CA25BA2
+13F8A41201A66C5A13601A257DA41F>I<EBFF80000313E0380F01F8381C007C48133C14
+1E1278A2127C127E387F803C13E0383FF878381FFDF0EBFFC07E000313E014F8000F13FC
+EA1E1F383C07FEEA7803EB00FF48133F141F140FA3140E1278141C6C1338381F80F03807
+FFE00001130018237DA21F>I<13FF000313C0380F83E0381F00F04813F8007E137CA214
+7E12FEA3147FA4127E14FF123EEA3F01001F137FEA0FFEEA03FCC7FC147EA2123C007E13
+FCA214F814F0EA7C01383003E0381C0F80380FFF00EA03F818237DA21F>I<141CA2143E
+A3147FA24A7EA39038019FC0A29038031FE0140F01077FEB0607A2010C7F1403011C7FEB
+1801A2496C7EA2017FB5FCA29039E0007F8049133FA2484880151F00038190C7120FA248
+6E7ED8FFF090B51280A229257EA42E>65 D<B612E015FC3903F0007FED3F80ED1FC0ED0F
+E0A216F0A21507150FA216E0151F16C0ED7F80913801FE0090B512F815FF9039F0003FC0
+ED0FE0ED07F016F8150316FCA616F81507ED0FF0ED1FE0ED7FC0B7120015F826257EA42C
+>I<9138FF8008010FEBF01890393FC03C789039FE0006F8D801F8130348481301484813
+0048481478121F48481438A2007F151890C8FCA2481500A97E16187F123FA26C6C143012
+0F6C6C14606C6C14C06C6CEB0180D800FEEB070090383FC01E90380FFFF8010013C02525
+7DA42C>I<B7FCA23903F8007FED0F8015071503A21501A3ED00C01406A21600A2140E14
+1EEBFFFEA2EBF81E140E1406A21660A291C7FC16C0A415011503A2ED0F80153FB7FCA223
+257EA428>69 D<B612FEA23803F800151F8181A281A3ED01801403A292C7FCA25C5C90B5
+FCA2EBF80F8080A491C8FCAAB512F0A221257EA427>I<B500E0B512E0A23B03F80003F8
+00AF90B6FCA29038F80003B0B500E0B512E0A22B257EA430>72 D<B512E0A23803F800B3
+AFB512E0A213257EA417>I<B539E007FF80A2D803F8C7EA780016605E4B5A0307C7FC15
+0E15185D5D5DEC03804AC8FC140E141F4A7E147FECDFC09038FB8FE09038FF0FF0EBFC07
+496C7E816E7E1400157F82153F6F7E6F7E8215076F7E82B539E03FFFC0A22A257EA430>
+75 D<B512F0A2D803F8C7FCB3A31503A31506A3150EA2151E153E157CEC03FCB6FCA220
+257EA425>I<D8FFF8EDFFF86D5C0003EEFE00017EEC037EA36D1406A26D6C130CA26D6C
+1318A26D6C1330A36D6C1360A26D6C13C0A2903900FC0180A291387E0300A3EC3F06A2EC
+1F8CA2EC0FD8A2EC07F0A36E5AEA07803CFFFC01C01FFFF8A235257EA43A>I<D8FFF890
+3807FFE07FD803FE9038003C006D14187F6D7E6D7E806D7E6D7E13036D7E6D7E80EC7F80
+EC3FC0141FEC0FE015F0EC07F8EC03FC1401EC00FE157F1698ED3FD8ED1FF8150F150715
+03A2150115001678486C1438D8FFFC1418A22B257EA430>I<B67E15F83903F801FEEC00
+7F6F7E6F7EA282A55EA24B5A4BC7FCEC01FE90B512F815C09038F803F06E7E6E7E157EA2
+157FA482A31760ED3FC017C0ED1FE1B539E00FFF80923801FE002B257EA42E>82
+D<01FF1380000713E3380F80F7381E001F48130F481307140312F81401A27E91C7FCB4FC
+EA7FE013FE383FFFE014F86C13FE00077F6C1480C67E010313C0EB003FEC0FE01407A200
+C01303A315C07E6C13076C14806CEB0F0038FFC03E38E3FFF838803FE01B257DA422>I<
+007FB612F8A2397E00FE010078EC00780070153800601518A200E0151C160C5AA4C71400
+B3A390B512FEA226247EA32B>I<B539E00FFFC0A2D803F8C7EA78001630B3A700015D7F
+00005D137C6D495A6D0107C7FC90380FE03E903803FFF89038007FC02A257EA42F>I<B5
+398001FFE0A2D807F8C7EA1C0000031518A26D1438000115306D1470000015607F6D5C80
+013F495AA2ECC003011F91C7FC6E5A010F130614F001075BA26D6C5AA2ECFC3801011330
+ECFE700100136014FF6E5AA26E5AA36EC8FCA2140EA22B257FA42E>I<B53B81FFFE01FF
+F0A23D07F0001FC0000F007013066C6C010F5CA26F7E6C6C5EA26D496C1338000017304B
+7E017F01195CA291388030FE013F5E829139C0607F01011F5E03E0138190280FE0C03F83
+C7FCA29139F1801FC3010715C617E69139FB000FEE010315EC02FF14FC6D486D5AA24A13
+0301005DA24A130102785CA202306D5A3C257FA43F>I<B539C001FFE0A2D807F8C7EA1C
+006C6C141816386C6C14306C6C5C16E06D6C5B6D6C485A1503D91FE090C7FC90380FF006
+150E903807F80C6D6C5A15386D6C5A903800FF6015E06E5A6E5AAE90380FFFFCA22B257F
+A42E>89 D<EA07FF001F13E0383E03F0383F00F880147E121EC7FCA3EB1FFE3803FE7EEA
+0FC0EA1F00123E127E5AA314BEEA7E01383F073E391FFE1FE03807F00F1B187E971E>97
+D<EAFFC0A2120FACEBC1FCEBCFFF9038FC0FC09038F007E09038C003F0A2EC01F8A215FC
+A815F8A2EC03F013E09038F007E090381C1F80390E0FFF00380C03F81E267FA522>I<EB
+7FE03803FFF83807C07C381F80FC13005A007E1378140012FEA8127E127F6C130CEA1F80
+EBC0183807E0703803FFE038007F0016187E971B>I<ECFFC0A2140FAC137F3803FFCF38
+0FE0FF381F803F383F000FA2127EA212FEA8127EA27E141F381F803F380FC0EF3903FFCF
+FC3800FE0F1E267EA522>I<137F3803FFC03807C1F0380F80F8EA1F0048137C127E147E
+12FEA2B512FEA248C7FCA3127EA214067E6C130C380F80183807E0703803FFE038007F80
+17187E971C>I<EB1FC0EB7FF0EA01F83803E1F8120713C1380FC0F01400A7B5FCA2EA0F
+C0B3A2EAFFFEA215267EA513>I<3901FF07C00007EBDFE0380F83F1EA1F01393E00F800
+007E7FA6003E5B6C485A380F83E0EBFFC0001190C7FC0030C8FCA21238123C383FFFE06C
+13FC806C7F481480383C003F48EB0FC000F81307A4007CEB0F806CEB1F00381F807E3807
+FFF8C613C01B247E971F>I<EAFFC0A2120FAC14FE9038C3FF809038CE0FC013D89038D0
+07E013E0A213C0AF39FFFC7FFEA21F267EA522>I<120FEA1F80EA3FC0A4EA1F80EA0F00
+C7FCA7EA7FC0A2120FB3A2EAFFF8A20D277EA611>I<EAFFC0A2120FACEC1FF0A2EC0780
+EC0E005C14305CEBC1C0EBC38013C713DFEBFFC0EBE7E0EBC3F0138180EB80FC147E80A2
+EC1F80EC0FC039FFF83FF8A21D267FA520>107 D<EAFFC0A2120FB3B0EAFFFCA20E267E
+A511>I<26FF80FE137F903A83FF81FFC03B0F8E0FC707E0019813CC903A9007E803F001
+A013F0A201C013E0AF3BFFFC7FFE3FFFA230187E9733>I<38FF80FE903883FF80390F8E
+0FC0139890389007E013A0A213C0AF39FFFC7FFEA21F187E9722>I<EB7F803803FFF038
+07C0F8381F807E48487EA2007EEB1F80A200FE14C0A8007E1480A26CEB3F00A2381F807E
+6C6C5A3803FFF038007F801A187E971F>I<38FFC1FCEBCFFF390FFC1FC09038F007E001
+C013F0140315F8140115FCA8EC03F8A215F0EBE0079038F00FE09038DC1F809038CFFF00
+EBC3F801C0C7FCA9EAFFFCA21E237F9722>I<38FF83E0EB8FF8380F8C7CEB90FC13B013
+A01478EBE0005BAEEAFFFEA216187F9719>114 D<3807F8C0EA1FFFEA3C07EA7001EAF0
+00A300FC1300B47EEA7FFC7F383FFF80000F13C0120338001FE01303EAC001A212E014C0
+EAF00338FC078038EFFF00EAC3FC13187E9718>I<13C0A41201A312031207120F121FB5
+12C0A2380FC000AC1460A63807E0C013E13801FF8038007E0013237FA218>I<39FFC07F
+E0A2000F1307B0140FA200071317EBE0673903FFC7FE38007F071F187E9722>I<39FFF8
+0FF8A2390FC001C015803907E00300A26D5A00031306EBF80E0001130C13FC00005B13FE
+EB7E30A26D5AA214E06D5AA26D5AA26DC7FCA21D187F9720>I<3BFFF9FFE0FF80A23B1F
+C03F001C00000F6D13181580D807E05CA29039F03FC07000030137136015E02601F8635B
+A29038FCE3F1000001C15B15F990267F80FBC7FCA215FF90383F007EA2011E133CA3010C
+131829187F972C>I<39FFF83FF0A2390FC00F003807E00E6C6C5A6D5A6C6C5A00001360
+EB7EC06D5AA2131F6D7E497E80EB33F81361EBE0FC3801C07E3803807F3907003F804813
+1F39FFC07FF8A21D187F9720>I<39FFF80FF8A2390FC001C015803907E00300A26D5A00
+031306EBF80E0001130C13FC00005B13FEEB7E30A26D5AA214E06D5AA26D5AA26DC7FCA2
+1306A25B1230EA781CEAFC185B1370EA68E0EA7FC0001FC8FC1D237F9720>I
+E /Fl 28 122 df<EB03E0EB1C181338EB703C13E014383801C000A5485A387FFFF03803
+8070A4380700E0A6380E01C0A6381C0380001E13C038FF0FF016207E9F19>12
+D<EAFFF0A20C027E8A0F>45 D<0007B512F83900F800780178133815185B1508A53901E0
+0800A314181438EBFFF83803C0301410A491C7FC485AA648C8FC7FEAFFFC1D1F7E9E1E>
+70 D<3A07FF803FE03A00F8001F000178130C5D4913205D5D4AC7FC1402140848485A5C
+146014F013E1EBE4F83803C878EBD07CEBE03CEBC03E141E141F48487E81140781140381
+380F00016D487E39FFF00FFE231F7E9E23>75 D<EA07F8EA0C0CEA1E061307121C1200A3
+13FFEA07C7EA1E07EA3C0E127800F01310A3131EEB2E2038784F40381F878014147D9317
+>97 D<1207123F120F7EA2120EA65A137CEA1D83381E0180001C13C0EB00E05A14F0A538
+7001E0A214C013031480EB0700EAE80EEACC38EA83E014207B9F19>I<13FEEA0383380E
+0780121C0038130090C7FC12785AA45AA37E5BEA70026C5AEA1C18EA07E011147D9314>
+I<1438EB01F8EB00781438A21470A614E013FCEA0382EA0601121CEA3C00383801C01278
+12F0A438E00380A412F0EA700738380F00381C37803807C7E015207D9F19>I<13F8EA07
+0EEA0E07121C383803801278127012F0A2B5FC00F0C7FC5AA46C5AEA7002EA3004EA1C18
+EA07E011147D9314>I<EB07C0EB1C60EB30F01360EBE0E0EBC0001201A5485AEA3FFCEA
+0380A448C7FCA6120EA65A121EEAFFC014207F9F0E>I<140EEB3E11EBE1A33801C1C238
+0381E0EA07801301120FA3380703C01480EB8700EA04FC48C7FCA21218121CEA0FFF14C0
+14E0381800F04813305A5AA3006013606C13C0381C0700EA07FC181F809417>I<13E012
+0712011200A2485AA6485AEB8F80EB90E013A0EBC0601380000713E01300A5380E01C0A6
+381C0380001E13C038FF8FF014207E9F19>I<EA01C0EA03E0A213C0EA0180C7FCA6EA03
+80121F12071203A2EA0700A6120EA65A121EEAFF800B1F7F9E0C>I<13E0120712011200
+A2485AA6485AEB81FCEB80F014C0EB81801400EA07045B13181338137C131C120E7FA213
+0F7F1480EA1C03381E07C038FF8FF016207E9F18>107 D<13E0120712011200A2EA01C0
+A6EA0380A6EA0700A6120EA65A121EEAFF800B207F9F0C>I<390387C07C391F98618639
+07A072073903C03403EB80380007EB7807EB0070A5000EEBE00EA64848485A001EEBE01E
+3AFFCFFCFFC022147E9326>I<38038F80381F90E0EA07A03803C0601380000713E01300
+A5380E01C0A6381C0380001E13C038FF8FF014147E9319>I<13FCEA0387380E0180381C
+00C04813E0A24813F012F0A438E001E0A214C0130300F0138038700700EA380E6C5AEA07
+E014147D9317>I<EBE3E03807EC383800F01C497E140F48487E1580A53903800F00A214
+0E141E141C5C38074070EB61C0011FC7FC90C8FCA3120EA4121EEAFFC0191D809319>I<
+EBFC2038038260EA0702381E01E0123C003813C0127812F0A438E00380A212F0A2130712
+7038380F00EA1C37EA07C7EA0007A3130EA4131EEBFFC0131D7D9318>I<EA038E381FB3
+80EA07C71203EB8300EA078090C7FCA5120EA65A121EEAFFC011147E9312>I<EA01F9EA
+0607EA080312181301EA3802EA3C00121F13F0EA07FCEA01FEEA001FEA40071303A21260
+1306EAF004EAC818EA87E010147F9312>I<1380EA0100A35A5A5A121EEAFFF8EA0E00A4
+5AA65A1310A41320A2EA1840EA0F800D1C7C9B12>I<381C0380EAFC1FEA3C07EA1C03A2
+38380700A6EA700EA4131EA25BEA305E381F9F8011147B9319>I<38FF83F8381E00E000
+1C13C01480121E380E01005B13025B12075BA25BEA039013A013E05B5B120190C7FC1514
+7C9318>I<39FF9FE1FC393C078070391C030060148015401580EA0E0790380D81001309
+EB19C21311380F21C4EA0720EB40C814E8EB80F0A26C485A1460000213401E147C9321>
+I<381FF0FF3803C0780001137014403800E0C0EBE180EB73001376133CA2131C132E134E
+1387EA0107380203801204380C01C0383C03E038FE07FC18147F9318>I<390FF83F8039
+01E00E00EBC00C140813E000005B143014205C13705CA20171C7FC1339133A133E133C13
+3813181310A25BA25BEA70C0EAF08000F1C8FC12E61278191D809318>I
+E /Fm 8 89 df<903807F00890383C0C189038E003383901C000B8D80780137848C71238
+120E001E14185A1508127C1278150012F8A6EC1FFF0078EB00F81578127C123CA27E120E
+120F6C7ED801C013B83900E0011890383C0E08903807F00020217C9F27>71
+D<EAFFF0EA0F00B3ABEAFFF00C1F7D9E12>73 D<B4EB0FF8390F8003E0EC0080EA0BC0EA
+09E0A2EA08F01378A27F7FA27FEB0780A2EB03C0EB01E0A2EB00F01478A2143C141EA214
+0F1407A214031401123E38FF80001D1F7C9E25>78 D<EB1FE0EB70383801C00E48487E39
+070003804814C0001EEB01E048EB00F0A2007C14F8A20078147800F8147CA90078147800
+7C14F8A2003C14F0003E1301001E14E06CEB03C06C148039038007003801E01E38007038
+EB1FE01E217C9F26>I<B512F0380F803E0007130FEC0780EC03C0A215E0A415C0A2EC07
+80EC0F00143EEBFFF00180C7FCAD487EEAFFFC1B1F7D9E22>I<3803F020380C0C603818
+03E0EA30005A146012E01420A36C13007E127CEA7F80EA3FFC6CB4FC00071380000113C0
+38000FE013031301EB00F014707EA46C136014E06C13C038F8018038C60300EA81FC1421
+7C9F1C>83 D<39FFF00FF8390F0003E0EC0080B3A46CEB01001380120314026C6C5A6C6C
+5AEB3830EB0FC01D207C9E25>85 D<397FF807FE390FE001F0D807C013C06C6C6C5A0001
+49C7FCEBF0023800F806EB78046D5AEB3E18EB1F106D5A14C0130713036D7E497EEB06F8
+EB0478EB087CEB183EEB101EEB201F496C7EEBC007496C7ED801007F486D7E481300391F
+8001F83AFFC007FF80211F7E9E25>88 D E /Fn 34 121 df<EB01C01303130F137FEA1F
+FFB5FC13BFEAE03F1200B3B1007FB512F0A31C2E7AAD28>49 D<EB3FE03801FFFE0007EB
+FF80D80F8013C0391E003FE00038EB1FF0007CEB0FF8007EEB07FCB4FC018013FEA21403
+A2EA7F00003E1307C7FC15FCA2EC0FF8A215F0EC1FE015C0EC3F80EC7F00147E14F8495A
+495A495A49C7FC011E130E5B133849131E49131C485A48C7123C48B512FC5A5A5A4814F8
+B6FCA31F2E7CAD28>I<913A03FF800180023FEBF00349B5EAFC0701079038003F0FD91F
+F8EB079FD93FC0EB01FFD9FF807F4848C8127F4848153F0007161F49150F485A001F1607
+A2485A1703127FA24992C7FCA212FFA9127FA27FEF0380123FA26C7E1707000F17006C7E
+6D150E0003161E6C6C151C6C6C6C1478D93FC05CD91FF8EB03E0D907FFEB3F800101D9FF
+FEC7FCD9003F13F80203138031317CB03A>67 D<B812F0A3C6903880003FEE07F8160316
+00A21778A21738A3171C1507A31700A25D5D5D91B5FCA3EC803F818181A21707A392C712
+0EA4171EA2173CA2177C17FC16011607163FB812F8A330317EB035>69
+D<B812E0A3C6903880007FEE0FF016031601A21600A21770A31738A21507A21700A35D5D
+5D91B5FCA3EC803F818181A592C8FCACB612C0A32D317EB033>I<DA03FF1303027FEBF0
+0749B5EAFC0F01079038007E1FD91FF0EB0FBFD97FC0EB03FF49487F4848C87E485A0007
+824848815B001F82A2484881A2127FA24992C7FC12FFAA0307B512F8127F7FDB00011300
+123FA26C7EA2120F7F6C7E12036C7E6C6C7E6D6C5BD91FF8497ED907FFEB3E3F01019038
+FFFC1F6D6CEBF00F0203EB800335317CB03F>I<B61280A3C6EB8000B3B3A7B61280A319
+317EB01E>73 D<B67EA3000190C9FCB3A9EE0380A416071700A25EA35E5E5E5E4B5A150F
+B7FCA329317DB030>76 D<B56C49B512C08080C66D90390003E0006E6E5AEBEFFC13E780
+EBE3FF01E17F01E07F6E7E143F816E7E6E7E6E7E14036E7E16806E13C0ED7FE0ED3FF015
+1F16F8ED0FFCED07FEED03FF6F13818117C1EE7FE1EE3FF1EE1FF9EE0FFD160717FF8282
+82177F173FA2171F170F486C1507B500E014031701A23A317EB03F>78
+D<B712E016FEEEFF80C6D9800013E0EE3FF0EE0FF8EE07FCA2EE03FEA217FFA717FEA2EE
+07FC17F8160FEE3FE0EEFFC091B6120016F80280C8FCB3A2B67EA330317EB037>80
+D<B77E16F816FEC690398003FF809238007FE0EE1FF0707EA283160783A65F160F5F4C5A
+4C5A4C5ADB03FFC8FC91B512F816E091388007F8ED01FC6F7E167F83707EA283A583A4F0
+038017F8161F1900706C5AB6398003FE0E933801FFFC9338001FF039317EB03C>82
+D<007FB8FCA39039C00FF801D87E00EC003F007C82007882A200708200F01780A3481603
+A5C792C7FCB3AA017FB6FCA331307DAF38>84 D<B6D88003B51280A3C60180C73807C000
+715AB3AE137F4DC7FC80013F150EA26D6C5C6D6C5C6D6C5C6D6C495A903A00FF801FC002
+3FB55A020F49C8FC020013E039317EB03E>I<B500FC91B5FCA3000390C8EA03C06C1780
+6E14076C170080017F150EA26E141E013F151C6E143C011F153880010F5D8001075DA26E
+130101035D6E13036D5D15806D4AC7FCA26F5A027F130EEDE01E023F131CEDF03C021F13
+3815F8020F5BA2EDFCF002075B15FF6E5BA26E5BA26E90C8FCA3157EA2153CA238317EB0
+3D>I<EBFFF0000313FF390F803F809038C00FE0486C6C7EA26E7ED80FC07FEA0780C7FC
+A414FF131FEBFFE33803FC03EA0FF0EA1FC0123FEA7F80A2EAFF00A31407A2387F800D39
+3FC01DFE3A1FE078FFF03907FFE07FC6EB803F24207E9F27>97 D<EA01F812FFA3120F12
+07ADEC3FE0ECFFFC9038FBE07F9039FF001F8049EB0FC04914E049EB07F016F8A2ED03FC
+A316FEA816FCA3ED07F8A216F06DEB0FE06D14C001E7EB3F809039C3C0FE00903880FFF8
+9038003FC027327EB12D>I<EB0FFF017F13C03901FC01F03803F0033907E007F8120FEA
+1FC0003FEB03F0EC01E04848C7FCA312FFA8127FA36C6C131CA2001F14386C7E00071470
+3903F001E03901FC07C039007FFF00EB0FF81E207D9F24>I<ED0FC0EC07FFA3EC007F15
+3FADEB07F8EB3FFF9038FE07BF3903F801FF3907E0007F120F4848133F123FA2485AA312
+FFA8127FA36C7EA2121F6C6C137F000714FF2603F00313E03A01FC0F3FFE38007FFEEB0F
+F027327DB12D>I<EB0FFC90387FFF803901FC0FC03903F003E03907E001F0000F14F839
+1FC000FC003F14FEA24848137E157FA212FFA290B6FCA20180C7FCA4127FA36C6C130712
+1F150E6C7E6C6C131C6C6C13783900FE03E090383FFFC0903807FE0020207E9F25>I<EB
+01FE90380FFF8090381FC3C090387F07E09038FE0FF0120113FC1203EC07E0EC018091C7
+FCA8B512FCA3D803FCC7FCB3A8387FFFF0A31C327EB119>I<90391FF007C09039FFFE3F
+E03A01F83F79F03907E00FC3000F14E19039C007E0E0001FECF000A2003F80A5001F5CA2
+000F5CEBE00F00075C2603F83FC7FC3806FFFE380E1FF090C9FC121EA2121F7F90B57E6C
+14F015FC6C806C801680000F15C0003FC7127F007EEC1FE0007C140F00FC1407A4007EEC
+0FC0003E1580003F141FD80FC0EB7E003907F803FC0001B512F0D8001F90C7FC242F7E9F
+28>I<EA01F812FFA3120F1207ADEC07F8EC3FFEEC783F02C013809039F9801FC0EBFB00
+01FE14E05BA35BB3B500C3B5FCA328327DB12D>I<EA03C0487E487E487EA46C5A6C5A6C
+5AC8FCA9EA01F8127FA31207B3A7B51280A311337DB217>I<EA01F812FFA3120F1207B3
+B3A6B512C0A312327DB117>108 D<2703F007F8EB1FE000FFD93FFEEBFFF8913A783F01
+E0FC02C090388300FE280FF1801FC6137F2607F30013CC01F602F8148001FC5CA3495CB3
+B500C3B5380FFFFCA33E207D9F43>I<3903F007F800FFEB3FFEEC783F02C013803A0FF1
+801FC03807F30001F614E013FCA35BB3B500C3B5FCA328207D9F2D>I<EB07FC90387FFF
+C03901FC07F03903F001F848486C7E4848137E001F147F003F158049133F007F15C0A300
+FF15E0A8007F15C0A36C6CEB7F80A2001F15006C6C13FE00075C3903F803F83901FE0FF0
+39007FFFC0D907FCC7FC23207E9F28>I<3901F83FE000FFEBFFFC9038FBE07F9039FF00
+3F80D807FEEB1FC049EB0FE04914F0ED07F8A216FC1503A216FEA816FC1507A216F8A2ED
+0FF06D14E06DEB1FC06DEB3F809039FBC0FE009038F8FFF8EC3FC091C8FCABB512C0A327
+2E7E9F2D>I<3803F03F00FFEB7FC09038F1C3E01487390FF30FF0EA07F6A29038FC07E0
+EC03C091C7FCA25BB2B512E0A31C207E9F21>114 D<3801FF86000713FEEA1F00003C13
+3E48131E140E12F8A36C90C7FCB47E13FC387FFFC06C13F0806C7F00077F00017FEA003F
+01001380143F0060131F00E0130FA27E15007E6C131E6C131C38FF807838F3FFF038C07F
+8019207D9F20>I<131CA5133CA3137CA213FC120112031207381FFFFEB5FCA2D803FCC7
+FCB0EC0380A71201EC0700EA00FEEB7F0EEB3FFCEB07F0192E7FAD1F>I<D801F8EB07E0
+00FFEB03FFA3000FEB003F0007141FB3153FA20003147FA26C6CEBDFF03A00FE039FFF90
+387FFF1FEB0FFC28207D9F2D>I<B53A1FFFE03FF8A33C0FF000FE0007806D150300076E
+EB0700816D5D00039138FF800EA26C6C486D5A15DF01FF153C6C9039038FE038A2D97F87
+6D5A150702C714F0D93FCF6D5AECCE03D91FFEEBF9C09138FC01FD16FF010F5D4A7EA26D
+486DC7FCA20103147E4A133EA26D48131C35207E9F3A>119 D<3A7FFF807FFCA33A03FC
+000F006C6C131E6C6C5BEC803890387FC078013F5B90381FE1E090380FF3C0ECFF806D90
+C7FC6D5A13016D7E81815B903803DFE09038078FF08190380F07FC90381E03FEEB3C0149
+6C7E4914804848EB7FC00003EC3FE026FFFC01B5FCA328207F9F2B>I
+E /Fo 1 14 df<14FF010713E090381F00F80178131E01E01307D80180EB018048C812C0
+00061560481530A248151848150CA2481506A4481503A900601506A46C150CA26C15186C
+1530A26C15606C15C06C6CEB0180D800E0EB07000178131E011F13F8903807FFE0010090
+C7FC282B7EA02D>13 D E /Fp 54 122 df<1306130C13181338137013E01201EA03C0A2
+EA0780A2120F13005AA2123EA3127EA3127CA212FCAE127CA2127EA3123EA37EA27E1380
+1207A2EA03C0A2EA01E01200137013381318130C13060F3C7AAC1A>40
+D<123C127FEAFF80A213C0A3127F123E1200A2EA0180A3EA0300A21206120E5A5A12100A
+157B8813>44 D<121C127FA2EAFF80A3EA7F00A2121C09097B8813>46
+D<130E131E137EEA07FE12FFA212F81200B3ABB512FEA317277BA622>49
+D<EBFF80000713F04813FC381E03FE393800FF80007C133F00FE14C06C131F15E0140FA2
+127E003C131FC7FC15C0A2EC3F801500147E5C5C495A495AEB078049C7FC131E4913E013
+705B3901C001C0EA0380EA0600000FB5FC5A5A5AB61280A31B277DA622>I<EB7F803803
+FFF04813FC380F81FE381F007FEA3F80EC3F80A3121F1300C7EA7F00A2147E5C495AEB07
+F0EBFFC0A2EB01F8EB007E801580EC1FC0A215E0A2123C127EB4FCA215C0143F48148000
+7CEB7F00383F01FE6CB45A000713F0C613801B277DA622>I<140FA25C5C5C5C5BA2EB03
+BFEB073F130E131C133C1338137013E0EA01C0EA038012071300120E5A5A5A12F0B612F8
+A3C7EA7F00A890381FFFF8A31D277EA622>I<00181303381F801FEBFFFE5C5C5C14C091
+C7FC001CC8FCA7EB7FC0381DFFF8381F80FC381E003F1208C7EA1F8015C0A215E0A21218
+127C12FEA315C05A0078EB3F80A26CEB7F00381F01FE6CB45A000313F0C613801B277DA6
+22>I<EB7F803801FFF000077F380FC0FC381F803E48487E007E1480A2140F00FE14C0A3
+15E0A5007E131FA26C133F6C132F380F80CF3807FF8F0001130FEA0008010013C0A3EC1F
+80123E127FEC3F00143E147E007E5B383E03F8381FFFE06C1380D801FEC7FC1B277DA622
+>57 D<EC0780A24A7EA34A7EA24A7EA3EC77F8A2ECF7FC14E3A2903801C1FEA201037F14
+80A249486C7EA24980010E133FA2496D7EA2013FB57EA39039700007F8A201F080491303
+000181491301A2000381D8FFFE013F13FCA32E297EA833>65 D<B612F815FF16C03A03F8
+001FE0ED0FF0ED07F8150316FCA21501A3150316F8A2ED07F0150FED1FC0EDFF8090B5EA
+FE00EDFFC09039F8000FF0ED03F8ED01FC16FE1500A216FFA616FE1501ED03FC1507ED1F
+F8B712E016C0EDFE0028297DA830>I<91387FE003903907FFFC07011FEBFF0F90397FF0
+0F9F9039FF0001FFD801FC7F4848147F4848143F4848141F485A160F485A1607127FA290
+C9FC5AA97E7F1607123FA26C7E160E6C7E6C6C141C6C6C143C6C6C14786CB4EB01F09039
+7FF007C0011FB512800107EBFE009038007FF028297CA831>I<B612FCEDFF8016E03A03
+FC001FF8ED03FCED00FE167FEE3F80EE1FC0A2EE0FE0A2EE07F0A417F8AA17F0A3EE0FE0
+A217C0161FEE3F80EE7F005EED03FCED1FF8B75A168003FCC7FC2D297EA834>I<B712E0
+A33903FC001FED07F01501A215001670A3913801C0781638A302031300A2140F90B5FCA3
+EBFC0F1403A20201130EA3161C91C7FCA3163C1638167816F815011503151FB712F0A327
+297EA82C>I<B712C0A33903FC003FED0FE015031501A21500A316F0913801C070A31600
+1403A2140F90B5FCA3EBFC0F1403A21401A491C8FCA9B512FCA324297EA82A>I<91387F
+E003903907FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F48488048488048
+4880485A82485A82127FA290CAFC5AA892B512F87E7F03001300123FA26C7EA26C7E6C7E
+6C7E6C7E6CB45B90387FF007011FB5129F0107EBFE0F9039007FF0032D297CA835>I<B5
+D8F00FB5FCA3D803FCC7EA3FC0AF90B7FCA301FCC7123FB1B5D8F00FB5FCA330297EA835
+>I<B512F0A33803FC00B3B1B512F0A314297EA819>I<B500F0EBFFFEA3D803FCC7EA0F00
+161E5E5E16E0ED03C04B5A4BC7FC151E5D15F04A5A4A5A1407140F4A7EEC7FF04A7EEBFD
+E79038FFC3FCEC83FE9038FE01FF497E6F7E826F7E151F6F7E8215076F7E6F7E8281EE7F
+80B539F00FFFFEA32F297EA835>75 D<B512FCA3D803FCC8FCB3A3ED01C0A415031680A2
+1507A2150FA2151F157F913801FF00B7FCA322297EA828>I<D8FFFE92383FFF80A26D5D
+0003EFE000A2D9BF8014EFA2D99FC0EB01CFA2D98FE0EB038FA3D987F0EB070FA2D983F8
+130EA2D981FC131CA3D980FE1338A2027F1370A291383F80E0A391381FC1C0A291380FE3
+80A2913807F700A3EC03FEA26E5AA26E5AD8FFFE0203B51280A2157039297DA840>I<D8
+FFFCEC7FFF7F7F00036DEB01C080EBBFE0139F80EB8FF8EB87FCEB83FEEB81FF01801380
+147F15C0EC3FE0EC1FF0EC0FF8EC07FC140315FEEC01FF6E1381ED7FC1ED3FE1ED1FF115
+0F16F9ED07FDED03FF8181167FA2163F161F160F1607D8FFFE14031601A230297EA835>
+I<ECFFC0010F13FC90383F807F9039FE001FC0D801F8EB07E048486D7E48486D7E000F81
+48486D7EA24848147FA2007F168090C8123FA34816C0AA6C16806D147FA2003F1600A26C
+6C14FEA26C6C495A6C6C495A6C6C495A6C6C495A6C6C495A90263FC0FFC7FC90380FFFFC
+010013C02A297CA833>I<B612F815FF16C03A03FC003FE0ED07F0ED03F816FC150116FE
+A716FC150316F8ED07F0ED3FE090B61280EDFE0001FCC8FCB0B512F0A327297EA82E>I<
+ECFFC0010F13FC90383FC0FF9039FE001FC048486D7ED803F0EB03F000078148486D7E48
+486D7EA24848147FA2007F1680A290C8123FA24816C0AA6C16806D147FA2003F1600A26C
+6C14FE143E3A0FE07F81FC00079038C1C1F83A03F18063F0D801F9EB67E0D800FFEB3FC0
+90263FC07FC7FC90380FFFFC01004913C0EC003C811601ED1F8316FF6F1380A21700816F
+5A6F5A6F5A2A357CA833>I<B612E015FE6F7E3A03FC003FE0ED0FF06F7E6F7E150182A6
+5E4B5A1507ED0FE0ED3FC090B500FEC7FCA29039FC00FF80ED3FC06F7E6F7E6F7EA9170E
+A21503923801FC1CB538F000FEEE7FF8EE0FE02F297EA832>I<9038FF80600003EBF0E0
+000F13F8381F80FD383F001F003E1307481303A200FC1301A214007EA26C140013C0EA7F
+FCEBFFE06C13F86C13FE80000714806C14C0C6FC010F13E0EB007FEC1FF0140F140700E0
+1303A46C14E0A26C13076C14C0B4EB0F80EBE03F39E3FFFE0000E15B38C01FF01C297CA8
+25>I<007FB71280A39039807F807FD87C00140F00781507A20070150300F016C0A24815
+01A5C791C7FCB3A490B612C0A32A287EA72F>I<B500F0EBFFFEA3D803FCC7EA0380B3AA
+0001ED07007F0000150E137F6D143CD91FC05B90390FF003F06DB55A01001480DA1FFCC7
+FC2F297EA834>I<B500F0EB7FFFA3D803FEC7EA01C00001ED0380A26D14076C16006E5B
+017F140E80013F5CA26E133C011F14386E1378010F14708001075CA26D6C485AA2ECFE03
+01015CECFF076D91C7FC1587EC7F8EA215DEEC3FDC15FC6E5AA26E5AA36E5AA26E5AA230
+297FA833>I<B53CE07FFFE01FFFC0A32803FC0003FCC7EA7000A26D6D7E000160A26D6E
+13016C604B138002801503017F5F4B13C0D93FC0013F49C7FCA2913AE00E1FE00F011F16
+0E17F09126F01C0F131E010F161C033C13F8902707F838075BA2037813FC902703FC7003
+5BA2913AFEE001FEF001015E02FF14FF4B7E6D5EA26E486D5AA36EC76CC8FCA2023E8002
+1E141EA242297FA845>I<B500F0EB3FFFA3D803FEC7EA03C06C6C15806C6DEB07005E6D
+6C130E6E5B013F143C6D6C13386E5B010F14F06D6C5B6E485A01031303D901FF5B0387C7
+FC6D138FEC7FCE15FC143F6E5A5D140FAE0103B512C0A330297FA833>89
+D<3803FF80000F13F0381F01FC383F80FE147F801580EA1F00C7FCA4EB3FFF3801FC3FEA
+0FE0EA1F80EA3F00127E5AA4145F007E13DF393F839FFC381FFE0F3803FC031E1B7E9A21
+>97 D<EAFFE0A3120FACEBE1FE9038EFFF809038FE07E09038F803F09038F001F89038E0
+00FCA2157EA2157FA8157EA315FCA29038F001F89038F803F090389C0FE090380FFF8039
+0E01FC00202A7EA925>I<EB3FF03801FFFC3803F03E380FC07FEA1F80EA3F00A248133E
+007E90C7FCA212FEA7127EA2127F6CEB03801380001FEB0700380FE00E3803F83C3801FF
+F838003FC0191B7E9A1E>I<EC7FF0A31407ACEB3F873801FFF73807F03F380FC00F381F
+8007EA3F00A2127EA312FEA8127EA27EA2381F800F380FC01F3907E07FFF3801FFE73800
+7F87202A7EA925>I<EB3FC03801FFF03803E07C380F803E001F7F130048EB0F80127E15
+C0A200FE1307A2B6FCA248C8FCA3127EA2127F6CEB01C07E390F8003803907C007003803
+F01E3800FFFCEB3FE01A1B7E9A1F>I<EB07F8EB3FFCEB7E3E3801FC7FEA03F813F01207
+143E1400A7B512C0A33807F000B3A3387FFF80A3182A7EA915>I<9038FF80F00003EBE3
+F8390FC1FE1C391F007C7C48137E003EEB3E10007EEB3F00A6003E133E003F137E6C137C
+380FC1F8380BFFE00018138090C8FC1238A2123C383FFFF814FF6C14C06C14E06C14F012
+1F383C0007007CEB01F8481300A4007CEB01F0A2003FEB07E0390FC01F806CB512003800
+7FF01E287E9A22>I<EAFFE0A3120FAC147E9038E1FF809038E30FC001E413E0EBE80701
+F813F013F0A213E0B039FFFE3FFFA3202A7DA925>I<1207EA0F80EA1FC0EA3FE0A3EA1F
+C0EA0F80EA0700C7FCA7EAFFE0A3120FB3A3EAFFFEA30F2B7EAA12>I<EAFFE0A3120FB3
+B2EAFFFEA30F2A7EA912>108 D<26FFC07FEB1FC0903AC1FFC07FF0903AC307E0C1F8D8
+0FC49038F101FC9039C803F20001D801FE7F01D05BA201E05BB03CFFFE3FFF8FFFE0A333
+1B7D9A38>I<38FFC07E9038C1FF809038C30FC0D80FC413E0EBC80701D813F013D0A213
+E0B039FFFE3FFFA3201B7D9A25>I<EB3FE03801FFFC3803F07E390FC01F80391F800FC0
+393F0007E0A2007EEB03F0A300FE14F8A8007E14F0A26CEB07E0A2391F800FC0390FC01F
+803907F07F003801FFFC38003FE01D1B7E9A22>I<38FFE1FE9038EFFF809038FE0FE039
+0FF803F09038F001F801E013FC140015FEA2157FA8157E15FEA215FC140101F013F89038
+F807F09038FC0FE09038EFFF809038E1FC0001E0C7FCA9EAFFFEA320277E9A25>I<38FF
+C1F0EBC7FCEBC63E380FCC7F13D813D0A2EBF03EEBE000B0B5FCA3181B7F9A1B>114
+D<3803FE30380FFFF0EA3E03EA7800127000F01370A27E00FE1300EAFFE06CB4FC14C06C
+13E06C13F0000713F8C6FCEB07FC130000E0137C143C7E14387E6C137038FF01E038E7FF
+C000C11300161B7E9A1B>I<13E0A41201A31203A21207120F381FFFE0B5FCA2380FE000
+AD1470A73807F0E0000313C03801FF8038007F0014267FA51A>I<39FFE07FF0A3000F13
+07B2140FA2000713173903F067FF3801FFC738007F87201B7D9A25>I<39FFFC03FFA339
+0FF000F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA214
+9EEB3F9C14FC6D5AA26D5AA36D5AA26D5AA2201B7F9A23>I<3BFFFC7FFC1FFCA33B0FE0
+0FE001C02607F007EB0380A201F8EBF00700031600EC0FF801FC5C0001150EEC1FFC2600
+FE1C5B15FE9039FF387E3C017F1438EC787F6D486C5A16F0ECE01F011F5CA26D486C5AA2
+EC800701075CA22E1B7F9A31>I<39FFFC1FFEA33907F003803803F8079038FC0F003801
+FE1E00005BEB7F3814F86D5A6D5A130F806D7E130F497EEB3CFEEB38FFEB787F9038F03F
+803901E01FC0D803C013E0EB800F39FFF03FFFA3201B7F9A23>I<39FFFC03FFA3390FF0
+00F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA2149EEB
+3F9C14FC6D5AA26D5AA36D5AA26D5AA25CA21307003890C7FCEA7C0FEAFE0E131E131C5B
+EA74F0EA3FE0EA0F8020277F9A23>I E /Fq 90 127 df<127012F8B012701200A51270
+12F8A31270051C779B18>33 D<EA4010EAE038EAF078EAE038AAEA60300D0E7B9C18>I<
+EA0306EA078FA6387FFFC0B512E0A26C13C0380F1E00A6387FFFC0B512E0A26C13C0381E
+3C00A6EA0C18131C7E9B18>I<13C01201A3EA03F0EA0FFCEA3FFEEA7DCFEA71C738E1C3
+8013C7A338F1C0001279123F6C7EEA0FF8EA01FC13DE13CF13C73861C38012F1A212E1EB
+C7001271EA79DEEA3FFEEA1FF8EA07E0EA01C0A3120011247D9F18>I<EA3803387C0780
+A2EAEE0F1400A25B131EA2133EEA7C3CA2EA387CEA0078A213F85B12015BA212035BA212
+07EB8380EB87C0120FEB0EE0A2121F121EA2123E383C07C0A23818038013247E9F18>I<
+EA01C0EA07E0487EEA0E70487EA4EB73F813F313E3380FC1C0EBC38013831303381F0700
+EA3F87EA7B8EEA71CEEAE1FC12E0137CEB7870A2EA70FE387FFFE0EA3FC7380F03C0151C
+7F9B18>I<1238127CA2127E123E120EA3121CA2123812F812F012C0070E789B18>I<1370
+13F0EA01E0EA03C0EA0780EA0F00121E121C5AA25AA45AA81270A47EA27E121E7EEA0780
+EA03C0EA01F0120013700C24799F18>I<126012F012787E7E7EEA07801203EA01C0A2EA
+00E0A41370A813E0A4EA01C0A2EA03801207EA0F00121E5A5A5A12600C247C9F18>I<EA
+01C0A4EA41C138F1C780EAFDDF387FFF00EA1FFCEA07F0A2EA1FFCEA7FFF38FDDF80EAF1
+C73841C100EA01C0A411147D9718>I<136013F0A7387FFFC0B512E0A26C13C03800F000
+A7136013147E9718>I<121C123E127E127F123F121F1207120E121E127C12F81260080C
+788518>I<387FFFC0B512E0A26C13C013047E8F18>I<1230127812FCA212781230060677
+8518>I<1303EB0780A2130F14005B131EA2133E133C137C1378A213F85B12015B12035B
+A212075B120F90C7FCA25A121E123E123CA2127C127812F85AA2126011247D9F18>I<EA
+01F0EA07FC487EEA1F1FEA1C0738380380007813C0EA7001A238E000E0A9EAF001007013
+C0A2EA780300381380381C0700EA1F1FEA0FFE6C5AEA01F0131C7E9B18>I<EA01801203
+A21207120F123F12FF12FB12431203B0EA7FFCEAFFFEEA7FFC0F1C7B9B18>I<EA03F0EA
+0FFEEA3FFF387C0F80387003C0EAE00138F000E0A21260C7FCA2EB01C0A21303EB0780EB
+0F00131E5B5B5B485AEA07C0485A381E00E05AEA7FFFB5FC7E131C7E9B18>I<131F5B13
+77A213E7120113C7EA038712071307120E121E123C1238127812F0B512F8A338000700A6
+EB7FF0A3151C7F9B18>52 D<383FFF80A30038C7FCA8EA3BF8EA3FFE7F383C0780383003
+C0EA0001EB00E0A2126012F0A238E001C0EA7003387C0F80383FFF00EA1FFCEA03F0131C
+7E9B18>I<137E48B4FC00071380380F83C0EA1E03121C3838018090C7FC5AA2EAE1F8EA
+E7FEB5FC38FE078038F803C0EAF001EB00E05A7E1270A3383801C0EA3C03381E0780380F
+FF006C5AEA01F8131C7E9B18>I<12E0B512E0A214C038E00380EB0700C65A131E131C5B
+A25B13F05BA2485AA3485AA448C7FCA7131D7E9C18>I<EA03F8EA0FFE487E383E0F80EA
+3803387001C0A438380380EA3C07381FFF00EA07FC487EEA1F1F383C0780387001C000F0
+13E0EAE000A4387001C0EA7803383E0F80381FFF006C5AEA03F8131C7E9B18>I<123012
+7812FCA2127812301200A81230127812FCA2127812300614779318>58
+D<1218123C127EA2123C12181200A81218123C127EA2123E121E120E121C123C127812F0
+1260071A789318>I<14C0EB03E01307EB1FC0EB3F80EBFE00485AEA07F0485AEA3F8048
+C7FC12FCA2127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07E01303EB00C013187E
+9918>I<387FFFC0B512E0A3C8FCA4B512E0A36C13C0130C7E9318>I<126012F87E127F6C
+7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07E0A2EB1FC0EB3F80EBFE00485AEA07F048
+5AEA3F8048C7FC12FC5A126013187E9918>I<EA0FF0EA3FFC48B4FCEA700F38F00380A2
+EA600738000F00133E5BEA01F05B485AA55BC8FCA5EA0380487EA36C5A111C7D9B18>I<
+137CEA01FEEA07FF380F8780381E03C0EA3C1DEA387F3870FFE0EA71E313C112E1EAE380
+A638E1C1C0127113E33870FF8038387F00EA3C1C381E00E0EA0F833807FFC00001138038
+007E00131C7E9B18>I<137013F8A213D8A2EA01DCA3138CEA038EA4EA0707A5380FFF80
+A3EA0E03381C01C0A3387F07F000FF13F8007F13F0151C7F9B18>I<EA7FFCB5FC6C1380
+381C03C01301EB00E0A4130114C01307381FFF80140014C0EA1C03EB00E014F01470A414
+F014E01303387FFFC0B51280387FFE00141C7F9B18>I<EBF8E0EA03FEEA07FFEA0F07EA
+1E03EA3C01EA38005AA214005AA8127014E0A27E123C381E01C0EA0F073807FF803803FE
+00EA00F8131C7E9B18>I<EA7FF8EAFFFE6C7E381C0F80EB03C0A2EB01E01300A214F014
+70A814F014E0A2130114C01303EB0F80387FFF00485AEA7FF8141C7F9B18>I<B512F0A3
+381C0070A41400A2130EA3EA1FFEA3EA1C0EA390C7FCA21438A5B512F8A3151C7F9B18>
+I<B512F8A3381C0038A41400A21307A3EA1FFFA3EA1C07A390C7FCA7EAFFC0A3151C7F9B
+18>I<3801F1C0EA03FDEA0FFFEA1F0FEA1C03123813011270A290C7FC5AA5EB0FF0131F
+130F387001C0A213031238A2EA1C07EA1F0FEA0FFFEA03FDEA01F1141C7E9B18>I<387F
+07F038FF8FF8387F07F0381C01C0A9EA1FFFA3EA1C01AA387F07F038FF8FF8387F07F015
+1C7F9B18>I<EA7FFFB512806C1300EA01C0B3A4EA7FFFB512806C1300111C7D9B18>I<38
+01FFC0A338000E00B312F0A2133CEA7FFCEA3FF0EA0FC0121C7D9B18>I<387F07F038FF
+87F8387F07F0381C03C0EB07801400130E131E5B13385B13F0121DA2EA1FB8A2131C121E
+EA1C0EA27FA2EB0380A2EB01C0387F03F038FF87F8387F03F0151C7F9B18>I<EAFFC0A3
+001CC7FCB114E0A5B5FCA3131C7E9B18>I<38FC01F8EAFE03A2383B06E0A4138EA2EA39
+8CA213DCA3EA38D8A213F81370A21300A638FE03F8A3151C7F9B18>I<387E07F038FF0F
+F8387F07F0381D81C0A313C1121CA213E1A313611371A213311339A31319A2131D130DA3
+EA7F07EAFF87EA7F03151C7F9B18>I<EA0FFE383FFF804813C0EA7803EA700100F013E0
+EAE000B0EAF001007013C0EA7C07EA7FFF6C1380380FFE00131C7E9B18>I<EAFFFEEBFF
+8014C0EA1C03EB01E013001470A514E01301EB03C0EA1FFF1480EBFE00001CC7FCA8B47E
+A3141C7F9B18>I<EA0FFE383FFF804813C0EA7803EA700100F013E0EAE000AE1370A2EA
+F079387039C0EA783FEA7FFF6C1380380FFE00EA000FEB0780A2EB03C01301A213227E9B
+18>I<EA7FF8EAFFFE6C7E381C0F80130314C01301A313031480130F381FFF005BA2EA1C
+0F7FEB0380A5149CA3387F01F8EAFF81387F00F0161C7F9B18>I<3803F1C0EA1FFF5AEA
+7C0FEA7003EAE001A390C7FC12701278123FEA1FF0EA07FEC67EEB0F80EB03C01301EB00
+E0A2126012E0130100F013C038F80780B5FCEBFE00EAE7F8131C7E9B18>I<387FFFF8B5
+FCA238E07038A400001300B2EA07FFA3151C7F9B18>I<38FF83FEA3381C0070B36C13E0
+EA0F01380783C03803FF806C1300EA007C171C809B18>I<38FE03F8EAFF07EAFE03383C
+01E0001C13C0A3EA1E03000E1380A438070700A4EA038EA4EA018C13DCA3EA00D813F8A2
+1370151C7F9B18>I<38FE03F8A338700070A36C13E0A513F8EA39FC13DCA2001913C0A3
+138CA2EA1D8DA31305000D1380EA0F07A2EA0E03151C7F9B18>I<387F0FE0139F130F38
+0E0700120FEA070E138EEA039C13DCEA01F8A212005B137013F07F487E13DCEA039E138E
+EA070F7F000E13801303001E13C0387F07F000FF13F8007F13F0151C7F9B18>I<38FE03
+F8EAFF07EAFE03381C01C0EA1E03000E1380EA0F0700071300A2EA038EA2EA01DCA3EA00
+F8A21370A9EA01FC487E6C5A151C7F9B18>I<EAFFF8A3EAE000B3ACEAFFF8A30D24779F
+18>91 D<126012F0A27E1278127C123CA2123E121E121F7EA27F12077F1203A27F12017F
+12007F1378A2137C133C133E131EA2131F7F14801307A2EB030011247D9F18>I<EAFFF8
+A3EA0038B3ACEAFFF8A30D247F9F18>I<387FFFC0B512E0A26C13C013047E7F18>95
+D<1206121E123E12381270A212E0A312F812FC127CA21238070E789E18>I<EA0FF0EA1F
+FC487EEA3C0FEA180738000380A213FF1207121FEA7F03127812E0A3EAF007EA780F383F
+FFF8EA1FFDEA07F015147E9318>I<127E12FE127E120EA5133EEBFF80000F13C0EBC1E0
+1380EB0070120E1438A6000F1370A2EB80E013C1EBFFC0000E138038063E00151C809B18
+>I<EA01FEEA07FF001F1380EA3E073838030048C7FCA25AA61270EB01C01238EA3E0338
+1FFF8000071300EA01FC12147D9318>I<EB1F80133F131F1303A5EA03E3EA0FFBEA1FFF
+EA3C1FEA380FEA7007130312E0A6EA7007A2EA380FEA3C1F381FFFF0380FFBF83803E3F0
+151C7E9B18>I<EA01F0EA07FCEA1FFEEA3E0F38380780EA7003A238E001C0A2B5FCA300
+E0C7FC1270EB01C01238EA3E07381FFF8000071300EA01F812147D9318>I<EB1F80EB7F
+C0EBFFE013E13801C0C01400A3387FFFC0B5FCA23801C000AEEA7FFFA3131C7F9B18>I<
+3801E1F03807FFF85A381E1E30381C0E00487EA5EA1C0EEA1E1EEA1FFC5BEA39E00038C7
+FC7EEA1FFEEBFFC04813E0387801F038700070481338A4007813F0EA7E03381FFFC06C13
+803801FC00151F7F9318>I<127E12FE127E120EA5133EEBFF80000F13C013C1EB80E013
+00120EAB387FC7FC38FFE7FE387FC7FC171C809B18>I<EA0380EA07C0A3EA0380C7FCA4
+EA7FC012FF127F1201AEB5FCA3101D7C9C18>I<1338137CA313381300A4EA0FFCA3EA00
+1CB3A4EA6038EAF078EAFFF0EA7FE0EA3F800E277E9C18>I<127E12FE127E120EA5EB3F
+F0A3EB0780EB0F00131E5B5B5BEA0FF87F139C130EEA0E0F7FEB038014C0387FC7F812FF
+127F151C7F9B18>I<EAFFC0A31201B3A4B51280A3111C7D9B18>I<38F9C1C038FFF7F013
+FF383E3E38EA3C3CA2EA3838AB38FE3E3EEB7E7EEB3E3E1714809318>I<EA7E3E38FEFF
+80007F13C0EA0FC1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC1714809318>I<EA
+01F0EA0FFE487E383E0F80EA3803387001C0A238E000E0A5EAF001007013C0EA7803383C
+0780EA3E0F381FFF006C5AEA01F013147E9318>I<EA7E3E38FEFF80007F13C0380FC1E0
+1380EB0070120E1438A6000F1370A2EB80E013C1EBFFC0000E1380EB3E0090C7FCA7EA7F
+C0487E6C5A151E809318>I<3801F380EA07FBEA1FFFEA3E1FEA380FEA7007A2EAE003A6
+EA7007A2EA380FEA3C1FEA1FFFEA0FFBEA03E3EA0003A7EB1FF0EB3FF8EB1FF0151E7E93
+18>I<38FF0FC0EB3FE0EB7FF0EA07F0EBE060EBC0005BA290C7FCA9EAFFFC7F5B14147E
+9318>I<EA07F7EA3FFF5AEA780FEAE007A3007CC7FCEA7FE0EA1FFCEA03FEEA001F3860
+0780EAE003A212F038F80F00B5FC13FCEAE7F011147D9318>I<487E1203A4387FFFC0B5
+FCA238038000A9144014E0A33801C1C013FF6C1380EB3E0013197F9818>I<387E07E0EA
+FE0FEA7E07EA0E00AC1301EA0F033807FFFC6C13FE3801FCFC1714809318>I<387F8FF0
+00FF13F8007F13F0381C01C0380E0380A338070700A3138FEA038EA3EA01DCA3EA00F8A2
+137015147F9318>I<38FF07F8138F1307383800E0A4381C01C0137113F9A213D9EA1DDD
+000D1380A3138DEA0F8FA23807070015147F9318>I<387F8FF0139F138F380F0700EA07
+8EEA039EEA01DC13F81200137013F07FEA01DCEA039E138EEA0707000E1380387F8FF000
+FF13F8007F13F015147F9318>I<387F8FF000FF13F8007F13F0380E01C0EB0380A21207
+EB0700A2EA0387A2138EEA01CEA213CC120013DC1378A31370A313F05B1279EA7BC0EA7F
+806CC7FC121E151E7F9318>I<383FFFF05AA2387001E0EB03C0EB078038000F00131E5B
+13F8485AEA03C0485A380F0070121E5A5AB512F0A314147F9318>I<EB07E0131F137FEB
+780013E0AB1201EA7FC0485AA26C7EEA01E01200AB1378EB7FE0131F130713247E9F18>
+I<126012F0B3B012600424769F18>I<127CB4FC13C01203C67EAB7FEB7FC0EB3FE0A2EB
+7FC0EBF0005BABEA03C012FF90C7FC127C13247E9F18>I<EA060CEA1F1EEA3FBEEAFBF8
+EAF1F0EA60C00F067C9B18>I E /Fr 78 123 df<90381F83E09038F06E303901C07878
+380380F8903800F03048EB7000A7B612803907007000B2383FE3FF1D20809F1B>11
+D<133FEBE0C0EA01C0380381E0EA0701A290C7FCA6B512E0EA0700B2383FC3FC1620809F
+19>I<EB3FE013E0EA01C1EA0381EA0700A8B5FCEA0700B2383FE7FC1620809F19>I<9038
+1F81F89038F04F043901C07C06390380F80FEB00F05A0270C7FCA6B7FC3907007007B23A
+3FE3FE3FE02320809F26>I<EA7038EAF87CEAFC7EA2EA743AEA0402A3EA0804A2EA1008
+A2EA2010EA40200F0E7F9F17>34 D<1340A2EA03F0EA0C4EEA1041382040801260004013
+4038C041C01343A238E04180EB40001270127CEA3FC0EA1FF86C7EEA03FEEA007FEB4F80
+1343EB41C0A2EAF040A312801480EA404100201300EA3042EA0C4CEA03F0EA0040A31225
+7EA117>36 D<127012F812FCA212741204A31208A21210A212201240060E7C9F0D>39
+D<13401380EA01005A12061204120C5AA212381230A212701260A412E0AC1260A4127012
+30A212381218A27E120412067E7EEA008013400A2E7BA112>I<7E12407E12307E120812
+0C7EA212077EA213801201A413C0AC1380A412031300A25A1206A25A120812185A12205A
+5A0A2E7EA112>I<127012F012F8A212781208A31210A31220A21240050E7C840D>44
+D<EAFFF0A20C02808A0F>I<127012F8A3127005057C840D>I<144014C0EB0180A3EB0300
+A31306A25BA35BA35BA25BA35BA3485AA348C7FCA21206A35AA35AA25AA35AA35AA2122D
+7EA117>I<EA03F0EA0E1C487EEA1806EA380738700380A400F013C0AD00701380A3EA78
+0700381300EA1806EA1C0E6C5AEA03F0121F7E9D17>I<13801203120F12F31203B3A6EA
+07C0EAFFFE0F1E7C9D17>I<EA03F0EA0C1CEA100E487E00401380128000F013C0EAF803
+A3EA200712001480A2EB0F00130E5B5B5B13605B485A48C7FC000613405A5A00101380EA
+3FFF5AB5FC121E7E9D17>I<EA03F0EA0C1CEA100EEA200F007813801307A2EA380F1200
+1400A2131E131C1370EA07F0EA003C130E130FEB0780A214C0122012F8A300F013801240
+EB0F00EA200EEA183CEA07F0121F7E9D17>I<1306A2130EA2131E132EA2134E138EA2EA
+010E1202A212041208A212101220A2124012C0B512F038000E00A7EBFFE0141E7F9D17>
+I<EA1803EA1FFE5B5B13E00010C7FCA6EA11F0EA161CEA180EEA10071480EA0003A214C0
+A3127012F0A200E013801240EB0700EA20066C5AEA0838EA07E0121F7E9D17>I<137CEA
+0182EA0701380E0380EA0C0712183838030090C7FC12781270A2EAF1F0EAF21CEAF406EA
+F807EB0380A200F013C0A51270A214801238EB07001218EA0C0E6C5AEA01F0121F7E9D17
+>I<1240387FFFE014C0A23840008038800100A21302485AA25B5BA25BA21360A213E05B
+1201A41203A76C5A131F7E9D17>I<EA03F0EA0C0CEA1006EA3003382001801260A31270
+38780300123EEA3F06EA1FC8EA0FF0EA03F8487EEA0C7EEA103F38300F80EA6007EB01C0
+12C01300A31480EA600100201300EA1002EA0C0CEA03F0121F7E9D17>I<EA03F0EA0E18
+487E487E13071270EB038012F0A214C0A5EA7007A21238EA180BEA0E13EA03E338000380
+A3EB07001230EA7806130EEA700CEA2018EA1070EA0FC0121F7E9D17>I<127012F8A312
+701200AA127012F8A3127005147C930D>I<127012F8A312701200AA127012F012F8A212
+781208A31210A31220A21240051D7C930D>I<5B497EA3497EA3EB09E0A3EB10F0A3EB20
+78A3497EA2EBC03EEB801EA248B5FCEB000FA20002EB0780A348EB03C0A2120C001E14E0
+39FF801FFE1F207F9F22>65 D<B512E0380F0078141EA2801580A515005C141E147CEBFF
+F0EB007C141FEC0F80EC07C0140315E0A515C014071580EC0F00143EB512F01B1F7E9E20
+>I<90380FE0109038381C309038E002703803C00139078000F048C71270121E15305A15
+10127C127800F81400A91278007C1410123CA26C1420A27E6C6C13406C6C13803900E003
+00EB380CEB0FF01C217E9F21>I<B512F83807801EEC0780EC03C0EC01E0EC00F0157015
+78A2153CA3153EA8153CA2157C1578A215F0EC01E0EC03C0EC0780EC1E00B512F81F1F7F
+9E23>I<B61280380F000F14031401140015C01540A314401500A214C0130113FF130113
+001440A3EC0020A31540A315C01401EC0380140FB6FC1B1F7E9E1F>I<B6128038078007
+1401A2140015C01540A4EC2000A3146014E013FF138014601420A391C7FCA87FEAFFFE1A
+1F7F9E1E>I<90380FE0109038381C309038E002703803C00139078000F048C71270121E
+15305A1510127C127800F81400A7EC3FFEEC01F000781300127C123CA27EA27E6C7E3903
+C001703900E002309038380C1090380FF0001F217E9F24>I<39FFF07FF8390F000780AD
+90B5FCEB0007AF39FFF07FF81D1F7E9E22>I<EAFFF0EA0F00B3ABEAFFF00C1F7E9E10>I<
+3807FFC038003E00131EB3A3122012F8A3EAF01CEA403CEA6038EA1070EA0FC012207F9E
+17>I<39FFF007FC390F0003E0EC0180150014025C5C5C5C5C5C49C7FC5B497E130FEB13
+C0EB21E01341EB80F0EB0078A28080A280EC0780A2EC03C015E015F039FFF01FFE1F1F7E
+9E23>I<EAFFF8EA0F8090C7FCB21402A414061404A2140C141C147CB512FC171F7E9E1C>
+I<B46CEB07FE000715C0A2D805C0130BA2D804E01313A301701323A26D1343A36D1383A2
+90380E0103A3EB0702A3EB0384A2EB01C8A3EB00F0A21460121FD8FFE0EB7FFE271F7F9E
+2A>I<B4EB0FF8390F8003E0EC0080EA0BC0EA09E0A2EA08F01378A27F7FA27FEB0780A2
+EB03C0EB01E0A2EB00F01478A2143C141EA2140F1407A214031401123E38FF80001D1F7E
+9E22>I<EB1FE0EB70383801C00E48487E39070003804814C0001EEB01E048EB00F0A200
+7C14F8A20078147800F8147CA900781478007C14F8A2003C14F0003E1301001E14E06CEB
+03C06C148039038007003801E01E38007038EB1FE01E217E9F23>I<B512E0380F007C14
+1E80EC0780A215C0A41580A2EC0F00141E147CEBFFE090C8FCAEEAFFF01A1F7E9E1F>I<
+B57E380F00F0143C8080A21580A41500A2141E5C14F0EBFF80EB01C0EB0070A280143CA3
+143EA31504143F141FEC0F0839FFF00788C7EA01F01E207E9E21>82
+D<3803F040380C0CC0EA1803EA3001EA6000A212E01440A36C13007E127CEA7F80EA3FF8
+6CB4FC00071380C613C0EB1FE013031301EB00F014707EA46C136014E06C13C038F80180
+38C60300EA81FC14217E9F19>I<007FB512E038780F010060EB006000401420A200C014
+3000801410A400001400B3497E3803FFFC1C1F7E9E21>I<39FFF00FF8390F0003E0EC00
+80B3A46CEB01001380120314026C6C5A6C6C5AEB3830EB0FC01D207E9E22>I<39FFF003
+FE391F8000F86CC7126015206C6C1340A36C6C1380A2EBE00100011400A23800F002A213
+F8EB7804A26D5AA36D5AA2131F6D5AA2EB07C0A36D5AA36DC7FC1F207F9E22>I<3BFFF0
+7FF81FF03B1F000FC007C06C903907800180170015C001805C00071502EC09E013C00003
+5DEC19F01410D801E05CA2EC2078D800F05CA2EC403C01785CA2EC801E017C1460013C14
+4090383D000F133F6D5CA2011E1307010E91C7FCA2010C7F010413022C207F9E2F>I<39
+FFF001FF391F800078000F146012076D1340000314807F3901F001001200EBF802EB7C06
+EB3C04EB3E08131EEB1F10EB0FB0EB07A014E06D5AACEB3FFC201F7F9E22>89
+D<12FFA212C0B3B3A512FFA2082D7CA10D>91 D<EA0804EA1008EA2010A2EA4020A2EA80
+40A3EAB85CEAFC7EA2EA7C3EEA381C0F0E7A9F17>I<12FFA21203B3B3A512FFA2082D80
+A10D>I<120812101220A21240A21280A312B812FCA2127C1238060E7D9F0D>96
+D<EA1FE0EA3030EA7818131CEA300E1200A313FEEA078EEA1E0E1238127800F01310A313
+1E127838386720380F83C014147E9317>I<121C12FC121CAA137CEA1D87381E0180EB00
+C0001C13E01470A21478A6147014F014E0001E13C0381A018038198700EA107C15207E9F
+19>I<EA01FCEA0706EA1C0F123813060078C7FC127012F0A61270127800381380A2381C
+0100EA0706EA01F811147F9314>I<EB01C0130F1301AAEA01F1EA070DEA0C03EA180112
+381278127012F0A61270A21238EA1803120CEA070D3801F1F815207F9F19>I<EA03F0EA
+0E1C487E487EA21270EB038012F0A2B5FC00F0C7FCA31270A26C1380A2381C0100EA0706
+EA01F811147F9314>I<137CEA01C6EA030F1207EA0E061300A7EAFFF0EA0E00B2EA7FE0
+1020809F0E>I<14E03803E330EA0E3CEA1C1C38380E00EA780FA5EA380E6C5AEA1E38EA
+33E00020C7FCA21230A2EA3FFE381FFF8014C0383001E038600070481330A4006013606C
+13C0381C03803803FC00141F7F9417>I<121C12FC121CAA137C1386EA1D03001E1380A2
+121CAE38FF8FF014207E9F19>I<1238127CA31238C7FCA6121C12FC121CB1EAFF80091F
+7F9E0C>I<13E0EA01F0A3EA00E01300A61370EA07F012001370B3A31260EAF06013C0EA
+6180EA3F000C28829E0E>I<121C12FC121CAAEB1FE0EB0780EB060013045B5B5B136013
+E0EA1DF0EA1E70EA1C38133C131C7F130F7F148014C038FF9FF014207E9F18>I<121C12
+FC121CB3ABEAFF8009207F9F0C>I<391C3E03E039FCC30C30391D039038391E01E01CA2
+001C13C0AE3AFF8FF8FF8021147E9326>I<EA1C7CEAFC86EA1D03001E1380A2121CAE38
+FF8FF014147E9319>I<EA01F8EA070E381C0380383801C0A2387000E0A200F013F0A600
+7013E0A2383801C0A2381C038038070E00EA01F814147F9317>I<EA1C7CEAFD87381E01
+8014C0381C00E014F014701478A6147014F014E0381E01C0EB0380381D8700EA1C7C90C7
+FCA8B47E151D7E9319>I<3801F04038070CC0EA0E02EA1C03EA38011278127012F0A612
+7012781238EA1C03EA0C05EA0709EA01F1EA0001A8EB0FF8151D7F9318>I<EA1CF0EAFD
+18EA1E3CA21318EA1C00AEEAFFC00E147E9312>I<EA0FC8EA3038EA6018EAC008A3EAE0
+00127CEA3FE0EA1FF0EA07F8EA003CEA800E130612C0A21304EAE00CEAD818EA87E00F14
+7F9312>I<1202A31206A2120EA2123EEAFFF8EA0E00AB1304A5EA07081203EA01F00E1C
+7F9B12>I<381C0380EAFC1FEA1C03AE1307120CEA061B3803E3F014147E9319>I<38FF83
+F8383E00E0001C13C06C1380A338070100A21383EA0382A2EA01C4A213E4EA00E8A21370
+A3132015147F9318>I<39FF9FE1FC393C078070391C030060EC8020000E1440A214C0D8
+0704138014E0A239038861001471A23801D032143A143E3800E01CA2EB6018EB40081E14
+7F9321>I<38FF87F8381E03C0380E0180EB0300EA0702EA0384EA01C813D8EA00F01370
+137813F8139CEA010E1202EA060738040380000C13C0003C13E038FE07FC16147F9318>
+I<38FF83F8383E00E0001C13C06C1380A338070100A21383EA0382A2EA01C4A213E4EA00
+E8A21370A31320A25BA3EAF080A200F1C7FC1262123C151D7F9318>I<EA7FFFEA700E12
+60EA401C133813781370EA00E0120113C0EA038012071301120E121EEA1C03EA3802EA70
+06130EEAFFFE10147F9314>I E /Fs 14 122 df<DB1FFC14C00203B5EAC001021FECF0
+03027FECFC07903B01FFFC00FE0F010701C0EB1F9F4948C7EA07FFD93FF8804948140049
+48157F485B4A153F4890C9121F485A000F170F5B001F1707A2485A1803A2127FA24993C8
+FCA212FFAA041FB61280127FA27FDC0001EBC000123FA36C7EA26C7EA26C7E7E6C7F806C
+7F6D6C5CEB3FFCD90FFF5C6D01C0EB1FBF010101FCEBFF1F6D6CB5EAFE0F021FECF80302
+03ECE0009126001FFEC9FC413D7BBB4C>71 D<B612FEA426007FF0C9FCB3ADEF03C0A517
+071880A3170FA3171FA2173F177F17FF5E04071300163FB9FCA4323B7DBA3A>76
+D<B500F00207B512E0808080D8007F92390007E0006E6F5A81017B7F81137901787F6E7E
+6E7E81141F6E7E6E7F6E7F82806E7F6F7E6F7E826F7E816F13806F13C017E06F13F081EE
+7FF8EE3FFC17FEEE1FFF827013837013C318E37013F382EF7FFBEF3FFFA283838383A283
+83187F183FA201FC161FB500FC150F18071803A2433B7CBA4C>78
+D<B712F8EEFFC017F817FE3B007FF0001FFF040313C004007F717E717EA284171FA284A6
+60A2173F604D5A604C485A4C5BDC1FFEC8FC91B612F817C0A29139F0007FF0EE1FF8707E
+707E707E8482A284A584A5F101E0A27013F0A2F103C0EF7FF8B600F890393FFC07809438
+1FFE0F0507B51200050113FCCBEA1FF0433C7CBA48>82 D<B600F80107B512E0A426007F
+F0C83807E000725AB3B3A3013F4C5AA280011F4CC7FCA26D6C151E0107163E6E5D6D6C5D
+6D6D13019026007FE0EB0FE0DA3FFCEB7FC0020FB65A02034AC8FCDA007F13F003071380
+433C7DBA4A>85 D<EB3FFE48B512E0000714F8390FE007FC9038F001FE486C6C7E6F7E82
+153F6C48806C5A6C5AC8FCA491B5FC131F90387FF83F3803FF803807FC00EA0FF0485A12
+3F485AA2485AA4157F6C7E15DF3A3FE0039FF03B1FF80F0FFFE03807FFFE0001497E3900
+3FE0002B267DA52F>97 D<13FE12FFA412071203B04AB4FC021F13F0027F13FC9138FC03
+FE9039FFF000FF02C0EB3F8091C7EA1FC04915E0EE0FF017F8A2EE07FCA317FEA917FCA3
+160F17F817F0161F6D15E06EEB3FC06EEB7F80D9F9E0EBFF009039F0FC07FE91387FFFF8
+D9E01F13E09026C003FEC7FC2F3C7DBB36>I<EE3F80ED3FFFA4150181B0ECFF80010F13
+F0013F13FC9038FFC03F3901FE000F4848130348487F48487F121F485AA2127F5BA312FF
+A9127FA36C7EA2121F6C6C5B6C6C5B00035CD801FE011F13C02700FF807E13FE90387FFF
+F8010F13E0010113002F3C7DBB36>100 D<49B47E010F13F0017F13FC9038FF81FE3A03
+FE007F80D807F8133F4848EB1FC0ED0FE0485A003F15F01507485A16F8A212FFA290B6FC
+A301C0C8FCA4127FA36C7E1678121F7F000F15F06C6C13016C6CEB03E06C6CEB0FC03A00
+FFC07F8090393FFFFE00010F13F8010013C025267DA52C>I<EA01E0EA07F8487EA2487E
+A46C5AA26C5AEA01E0C8FCAB13FE127FA412071203B3AAB512F0A4143D7DBC1A>105
+D<13FE12FFA412071203B3B3AEB512F8A4153C7DBB1A>108 D<D801FCEBFF8000FF0103
+13F0020F7F91381E03FC91383801FE000701607F0003497E01FD15805C01FFC7FCA35BB3
+A4B5D8F83F13FEA42F267CA536>110 D<3901FC03F000FFEB0FFC4AB4FC91383C3F80EC
+707F00079038E0FFC000035BEBFD80A201FFEB7F809138003F00151E92C7FC5BB3A3B512
+FCA422267DA528>114 D<B500F0EBFFFCA4D803FEC7EA1F806D15006C151E806C5DA26E
+137C017F14786E13F8013F5CECF001011F5CECF803010F5CA2ECFC0701075CECFE0F0103
+91C7FC6E5A6D131E15BE6D13BC15FC6E5AA36E5AA26E5AA26E5AA26E5AA2140F92C8FC5C
+141E0008133E007F133C147C38FF807814F8EB81F0EB83E06C485A387C1F80D83FFFC9FC
+EA1FFCEA07F02E377EA533>121 D E end
TeXDict begin
-%%EndSetup
-%%Page: 1 1
-0 bop 0 1152 a Fp(GNU)33 b(Readline)h(Library)p 0 1201 1950
-17 v 1011 1250 a Fo(Edition)17 b(2.0,)c(for)i Fn(Readline)f(Library)g
-Fo(V)l(ersion)i(2.0.)1759 1304 y(July)g(1994)0 2443 y Fm(Brian)23
-b(F)-6 b(o)n(x,)23 b(F)-6 b(ree)23 b(Soft)n(w)n(are)f(F)-6
-b(oundation)0 2509 y(Chet)22 b(Ramey)-6 b(,)23 b(Case)e(W)-6
-b(estern)23 b(Reserv)n(e)f(Univ)n(ersit)n(y)p 0 2545 1950 9
-v eop
-%%Page: 2 2
-1 bop 0 295 a Fo(This)15 b(do)q(cumen)o(t)f(describ)q(es)i(the)e(GNU)g
-(Readline)j(Library)l(,)d(a)g(utilit)o(y)h(whic)o(h)g(aids)g(in)g(the)f
-(consistency)h(of)f(user)0 358 y(in)o(terface)h(across)g(discrete)h(programs)
-e(that)g(need)j(to)d(pro)o(vide)i(a)f(command)g(line)i(in)o(terface.)0
-495 y(Published)g(b)o(y)f(the)f(F)l(ree)g(Soft)o(w)o(are)f(F)l(oundation)0
-557 y(675)g(Massac)o(h)o(usetts)g(Av)o(en)o(ue,)0 619 y(Cam)o(bridge,)h(MA)g
-(02139)f(USA)0 756 y(P)o(ermission)f(is)g(gran)o(ted)f(to)f(mak)o(e)h(and)h
-(distribute)h(v)o(erbatim)e(copies)h(of)f(this)h(man)o(ual)g(pro)o(vided)g
-(the)f(cop)o(yrigh)o(t)0 818 y(notice)k(and)f(this)h(p)q(ermission)h(notice)e
-(are)g(preserv)o(ed)h(on)f(all)h(copies.)0 955 y(P)o(ermission)f(is)f(gran)o
-(ted)f(to)h(cop)o(y)g(and)g(distribute)h(mo)q(di\014ed)h(v)o(ersions)e(of)f
-(this)i(man)o(ual)f(under)h(the)f(conditions)0 1018 y(for)e(v)o(erbatim)g
-(cop)o(ying,)h(pro)o(vided)h(that)d(the)i(en)o(tire)g(resulting)h(deriv)o(ed)
-f(w)o(ork)f(is)h(distributed)h(under)f(the)g(terms)0 1080 y(of)i(a)g(p)q
-(ermission)h(notice)g(iden)o(tical)h(to)e(this)g(one.)0 1217
-y(P)o(ermission)20 b(is)g(gran)o(ted)f(to)g(cop)o(y)h(and)f(distribute)i
-(translations)f(of)f(this)h(man)o(ual)f(in)o(to)h(another)f(language,)0
-1279 y(under)c(the)f(ab)q(o)o(v)o(e)g(conditions)h(for)e(mo)q(di\014ed)j(v)o
-(ersions,)e(except)g(that)g(this)g(p)q(ermission)i(notice)e(ma)o(y)g(b)q(e)h
-(stated)0 1341 y(in)h(a)f(translation)g(appro)o(v)o(ed)g(b)o(y)g(the)g(F)l
-(oundation.)0 2636 y(Cop)o(yrigh)o(t)226 2635 y(c)214 2636
-y Fl(\015)g Fo(1989,)f(1991)g(F)l(ree)h(Soft)o(w)o(are)f(F)l(oundation,)h
-(Inc.)p eop
-%%Page: 1 3
-2 bop 0 -83 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1227
-b(1)0 158 y Fk(1)41 b(Command)16 b(Line)f(Editing)62 383 y
-Fo(This)h(c)o(hapter)f(describ)q(es)i(the)e(basic)h(features)f(of)g(the)g
-(GNU)g(command)g(line)i(editing)f(in)o(terface.)0 676 y Fm(1.1)33
-b(In)n(tro)r(duction)17 b(to)e(Line)h(Editing)62 820 y Fo(The)g(follo)o(wing)
-g(paragraphs)e(describ)q(e)j(the)e(notation)g(used)h(to)e(represen)o(t)i(k)o
-(eystrok)o(es.)62 965 y(The)f(text)e Fn(C-K)h Fo(is)g(read)g(as)g(`Con)o
-(trol-K')f(and)h(describ)q(es)i(the)e(c)o(haracter)f(pro)q(duced)i(when)g
-(the)f(Con)o(trol)f(k)o(ey)0 1027 y(is)j(depressed)g(and)f(the)h
-Fn(K)f Fo(k)o(ey)g(is)g(struc)o(k.)62 1172 y(The)i(text)f Fn(M-K)g
-Fo(is)i(read)e(as)g(`Meta-K')g(and)h(describ)q(es)h(the)f(c)o(haracter)f(pro)
-q(duced)h(when)h(the)e(meta)g(k)o(ey)h(\(if)0 1234 y(y)o(ou)g(ha)o(v)o(e)f
-(one\))h(is)g(depressed,)h(and)f(the)g Fn(K)g Fo(k)o(ey)g(is)g(struc)o(k.)25
-b(If)17 b(y)o(ou)f(do)h(not)g(ha)o(v)o(e)f(a)h(meta)f(k)o(ey)l(,)h(the)g
-(iden)o(tical)0 1296 y(k)o(eystrok)o(e)i(can)g(b)q(e)i(generated)e(b)o(y)h(t)
-o(yping)f Fn(ESC)h Fj(\014rst)p Fo(,)g(and)f(then)h(t)o(yping)g
-Fn(K)p Fo(.)33 b(Either)20 b(pro)q(cess)g(is)g(kno)o(wn)f(as)0
-1358 y Fj(metafying)g Fo(the)c Fn(K)g Fo(k)o(ey)l(.)62 1503
-y(The)h(text)e Fn(M-C-K)g Fo(is)i(read)f(as)f(`Meta-Con)o(trol-k')g(and)h
-(describ)q(es)h(the)g(c)o(haracter)e(pro)q(duced)i(b)o(y)f
-Fj(metafying)0 1565 y Fn(C-K)p Fo(.)62 1710 y(In)i(addition,)h(sev)o(eral)e
-(k)o(eys)g(ha)o(v)o(e)g(their)h(o)o(wn)f(names.)23 b(Sp)q(eci\014cally)m(,)c
-Fn(DEL)p Fo(,)d Fn(ESC)p Fo(,)f Fn(LFD)p Fo(,)h Fn(SPC)p Fo(,)g
-Fn(RET)p Fo(,)g(and)g Fn(TAB)0 1772 y Fo(all)e(stand)f(for)f(themselv)o(es)i
-(when)f(seen)h(in)g(this)f(text,)g(or)g(in)g(an)g(init)i(\014le)f(\(see)f
-(Section)h(1.3)e([Readline)j(Init)f(File],)0 1834 y(page)h(4,)g(for)f(more)h
-(info\).)0 2127 y Fm(1.2)33 b(Readline)16 b(In)n(teraction)62
-2271 y Fo(Often)g(during)h(an)f(in)o(teractiv)o(e)g(session)h(y)o(ou)e(t)o
-(yp)q(e)h(in)h(a)f(long)g(line)h(of)f(text,)f(only)h(to)g(notice)g(that)f
-(the)h(\014rst)0 2334 y(w)o(ord)d(on)i(the)f(line)i(is)e(missp)q(elled.)23
-b(The)14 b(Readline)i(library)f(giv)o(es)g(y)o(ou)e(a)h(set)g(of)g(commands)g
-(for)f(manipulating)0 2396 y(the)18 b(text)g(as)g(y)o(ou)g(t)o(yp)q(e)g(it)h
-(in,)g(allo)o(wing)g(y)o(ou)f(to)g(just)g(\014x)g(y)o(our)g(t)o(yp)q(o,)g
-(and)h(not)f(forcing)g(y)o(ou)g(to)g(ret)o(yp)q(e)g(the)0 2458
-y(ma)s(jorit)o(y)d(of)h(the)g(line.)25 b(Using)17 b(these)g(editing)h
-(commands,)e(y)o(ou)g(mo)o(v)o(e)f(the)i(cursor)f(to)g(the)g(place)h(that)f
-(needs)0 2521 y(correction,)g(and)h(delete)g(or)f(insert)g(the)h(text)e(of)h
-(the)g(corrections.)23 b(Then,)17 b(when)g(y)o(ou)f(are)g(satis\014ed)g(with)
-h(the)0 2583 y(line,)h(y)o(ou)e(simply)i(press)f Fn(RETURN)p
-Fo(.)23 b(Y)l(ou)17 b(do)f(not)g(ha)o(v)o(e)g(to)g(b)q(e)i(at)e(the)g(end)h
-(of)f(the)h(line)h(to)e(press)h Fn(RETURN)p Fo(;)f(the)0 2645
-y(en)o(tire)g(line)h(is)e(accepted)h(regardless)f(of)g(the)g(lo)q(cation)h
-(of)f(the)h(cursor)e(within)j(the)e(line.)p eop
-%%Page: 2 4
-3 bop 0 -83 a Fo(2)1472 b(GNU)15 b(Readline)i(Library)0 158
-y Fi(1.2.1)30 b(Readline)15 b(Bare)g(Essen)n(tials)62 295 y
-Fo(In)f(order)f(to)f(en)o(ter)h(c)o(haracters)g(in)o(to)g(the)g(line,)i
-(simply)f(t)o(yp)q(e)f(them.)19 b(The)14 b(t)o(yp)q(ed)f(c)o(haracter)f(app)q
-(ears)i(where)0 358 y(the)h(cursor)h(w)o(as,)e(and)h(then)h(the)g(cursor)f
-(mo)o(v)o(es)f(one)i(space)g(to)e(the)i(righ)o(t.)k(If)c(y)o(ou)f(mist)o(yp)q
-(e)h(a)f(c)o(haracter,)f(y)o(ou)0 420 y(can)h(use)h(y)o(our)f(erase)g(c)o
-(haracter)f(to)h(bac)o(k)g(up)g(and)h(delete)g(the)f(mist)o(yp)q(ed)h(c)o
-(haracter.)62 557 y(Sometimes)f(y)o(ou)e(ma)o(y)h(miss)g(t)o(yping)g(a)g(c)o
-(haracter)g(that)f(y)o(ou)h(w)o(an)o(ted)f(to)g(t)o(yp)q(e,)h(and)h(not)e
-(notice)i(y)o(our)f(error)0 619 y(un)o(til)k(y)o(ou)e(ha)o(v)o(e)g(t)o(yp)q
-(ed)h(sev)o(eral)g(other)f(c)o(haracters.)23 b(In)18 b(that)d(case,)i(y)o(ou)
-f(can)h(t)o(yp)q(e)g Fn(C-B)f Fo(to)g(mo)o(v)o(e)g(the)g(cursor)0
-681 y(to)f(the)h(left,)g(and)g(then)g(correct)f(y)o(our)h(mistak)o(e.)21
-b(Afterw)o(ards,)14 b(y)o(ou)i(can)g(mo)o(v)o(e)f(the)h(cursor)f(to)g(the)h
-(righ)o(t)g(with)0 744 y Fn(C-F)p Fo(.)62 881 y(When)i(y)o(ou)f(add)g(text)g
-(in)h(the)f(middle)i(of)e(a)g(line,)i(y)o(ou)e(will)i(notice)e(that)g(c)o
-(haracters)f(to)h(the)g(righ)o(t)g(of)g(the)0 943 y(cursor)h(are)h(`pushed)g
-(o)o(v)o(er')e(to)h(mak)o(e)g(ro)q(om)g(for)g(the)h(text)f(that)g(y)o(ou)g
-(ha)o(v)o(e)h(inserted.)31 b(Lik)o(ewise,)20 b(when)f(y)o(ou)0
-1005 y(delete)f(text)f(b)q(ehind)i(the)f(cursor,)f(c)o(haracters)f(to)h(the)g
-(righ)o(t)g(of)g(the)h(cursor)f(are)g(`pulled)i(bac)o(k')d(to)h(\014ll)i(in)f
-(the)0 1067 y(blank)g(space)f(created)g(b)o(y)g(the)h(remo)o(v)m(al)f(of)f
-(the)i(text.)25 b(A)17 b(list)h(of)e(the)h(basic)h(bare)f(essen)o(tials)h
-(for)e(editing)j(the)0 1130 y(text)c(of)f(an)i(input)g(line)h(follo)o(ws.)0
-1279 y Fn(C-B)168 b Fo(Mo)o(v)o(e)14 b(bac)o(k)h(one)h(c)o(haracter.)0
-1366 y Fn(C-F)168 b Fo(Mo)o(v)o(e)14 b(forw)o(ard)g(one)h(c)o(haracter.)0
-1454 y Fn(DEL)168 b Fo(Delete)16 b(the)f(c)o(haracter)g(to)f(the)h(left)h(of)
-f(the)g(cursor.)0 1541 y Fn(C-D)168 b Fo(Delete)16 b(the)f(c)o(haracter)g
-(underneath)h(the)f(cursor.)0 1615 y(Prin)o(ting)h(c)o(haracters)240
-1678 y(Insert)f(the)h(c)o(haracter)e(in)o(to)h(the)h(line)h(at)d(the)h
-(cursor.)0 1765 y Fn(C-_)168 b Fo(Undo)15 b(the)h(last)f(thing)h(that)e(y)o
-(ou)h(did.)21 b(Y)l(ou)15 b(can)h(undo)f(all)h(the)g(w)o(a)o(y)e(bac)o(k)h
-(to)f(an)i(empt)o(y)e(line.)0 1973 y Fi(1.2.2)30 b(Readline)15
-b(Mo)n(v)n(emen)n(t)h(Commands)62 2110 y Fo(The)c(ab)q(o)o(v)o(e)g(table)g
-(describ)q(es)i(the)e(most)f(basic)h(p)q(ossible)i(k)o(eystrok)o(es)d(that)g
-(y)o(ou)g(need)i(in)g(order)f(to)f(do)h(editing)0 2172 y(of)g(the)h(input)h
-(line.)21 b(F)l(or)12 b(y)o(our)g(con)o(v)o(enience,)i(man)o(y)f(other)f
-(commands)h(ha)o(v)o(e)f(b)q(een)i(added)f(in)h(addition)g(to)e
-Fn(C-B)p Fo(,)0 2234 y Fn(C-F)p Fo(,)i Fn(C-D)p Fo(,)h(and)g
-Fn(DEL)p Fo(.)20 b(Here)15 b(are)g(some)g(commands)g(for)f(mo)o(ving)h(more)g
-(rapidly)i(ab)q(out)e(the)g(line.)0 2384 y Fn(C-A)168 b Fo(Mo)o(v)o(e)14
-b(to)h(the)g(start)f(of)h(the)g(line.)0 2471 y Fn(C-E)168 b
-Fo(Mo)o(v)o(e)14 b(to)h(the)g(end)h(of)f(the)g(line.)0 2558
-y Fn(M-F)168 b Fo(Mo)o(v)o(e)14 b(forw)o(ard)g(a)h(w)o(ord.)0
-2645 y Fn(M-B)168 b Fo(Mo)o(v)o(e)14 b(bac)o(kw)o(ard)h(a)g(w)o(ord.)p
+1 0 bop 0 693 a Fs(GNU)33 b(Readline)h(Library)p 0 743
+1950 17 v 1011 791 a Fr(Edition)17 b(2.1,)c(for)i Fq(Readline)f
+(Library)g Fr(V)l(ersion)i(2.1.)1718 845 y(Marc)o(h)e(1996)0
+2467 y Fp(Brian)23 b(F)-6 b(o)n(x,)23 b(F)-6 b(ree)23
+b(Soft)n(w)n(are)f(F)-6 b(oundation)0 2534 y(Chet)22
+b(Ramey)-6 b(,)23 b(Case)e(W)-6 b(estern)23 b(Reserv)n(e)f(Univ)n
+(ersit)n(y)p 0 2570 1950 9 v eop
+2 1 bop 0 320 a Fr(This)15 b(do)q(cumen)o(t)f(describ)q(es)i(the)e(GNU)
+g(Readline)j(Library)l(,)d(a)g(utilit)o(y)h(whic)o(h)g(aids)g(in)g(the)
+f(consistency)h(of)f(user)0 382 y(in)o(terface)h(across)g(discrete)h
+(programs)e(that)g(need)j(to)d(pro)o(vide)i(a)f(command)g(line)i(in)o
+(terface.)0 519 y(Published)g(b)o(y)f(the)f(F)l(ree)g(Soft)o(w)o(are)f
+(F)l(oundation)0 582 y(675)g(Massac)o(h)o(usetts)g(Av)o(en)o(ue,)0
+644 y(Cam)o(bridge,)h(MA)g(02139)f(USA)0 781 y(P)o(ermission)f(is)g
+(gran)o(ted)f(to)f(mak)o(e)h(and)h(distribute)h(v)o(erbatim)e(copies)h
+(of)f(this)h(man)o(ual)g(pro)o(vided)g(the)f(cop)o(yrigh)o(t)0
+843 y(notice)k(and)f(this)h(p)q(ermission)h(notice)e(are)g(preserv)o
+(ed)h(on)f(all)h(copies.)0 980 y(P)o(ermission)f(is)f(gran)o(ted)f(to)h
+(cop)o(y)g(and)g(distribute)h(mo)q(di\014ed)h(v)o(ersions)e(of)f(this)i
+(man)o(ual)f(under)h(the)f(conditions)0 1043 y(for)e(v)o(erbatim)g(cop)
+o(ying,)h(pro)o(vided)h(that)d(the)i(en)o(tire)g(resulting)h(deriv)o
+(ed)f(w)o(ork)f(is)h(distributed)h(under)f(the)g(terms)0
+1105 y(of)i(a)g(p)q(ermission)h(notice)g(iden)o(tical)h(to)e(this)g
+(one.)0 1242 y(P)o(ermission)20 b(is)g(gran)o(ted)f(to)g(cop)o(y)h(and)
+f(distribute)i(translations)f(of)f(this)h(man)o(ual)f(in)o(to)h
+(another)f(language,)0 1304 y(under)c(the)f(ab)q(o)o(v)o(e)g
+(conditions)h(for)e(mo)q(di\014ed)j(v)o(ersions,)e(except)g(that)g
+(this)g(p)q(ermission)i(notice)e(ma)o(y)g(b)q(e)h(stated)0
+1366 y(in)h(a)f(translation)g(appro)o(v)o(ed)g(b)o(y)g(the)g(F)l
+(oundation.)0 2661 y(Cop)o(yrigh)o(t)226 2660 y(c)214
+2661 y Fo(\015)g Fr(1989,)f(1991)g(F)l(ree)h(Soft)o(w)o(are)f(F)l
+(oundation,)h(Inc.)p eop
+1 2 bop 0 -58 a Fr(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1227
+b(1)0 183 y Fn(1)41 b(Command)16 b(Line)f(Editing)62
+408 y Fr(This)h(c)o(hapter)f(describ)q(es)i(the)e(basic)h(features)f
+(of)g(the)g Fm(GNU)g Fr(command)g(line)i(editing)f(in)o(terface.)0
+701 y Fp(1.1)33 b(In)n(tro)r(duction)17 b(to)e(Line)h(Editing)62
+845 y Fr(The)g(follo)o(wing)g(paragraphs)e(describ)q(e)j(the)e
+(notation)g(used)h(to)e(represen)o(t)i(k)o(eystrok)o(es.)62
+990 y(The)k(text)e Fq(C-K)h Fr(is)h(read)f(as)f(`Con)o(trol-K')h(and)g
+(describ)q(es)i(the)e(c)o(haracter)f(pro)q(duced)j(when)e(the)g
+Fq(K)g Fr(k)o(ey)g(is)0 1052 y(pressed)d(while)g(the)g(Con)o(trol)e(k)o
+(ey)h(is)h(depressed.)62 1197 y(The)h(text)f Fq(M-K)g
+Fr(is)i(read)e(as)g(`Meta-K')g(and)h(describ)q(es)h(the)f(c)o(haracter)
+f(pro)q(duced)h(when)h(the)e(meta)g(k)o(ey)h(\(if)0 1259
+y(y)o(ou)f(ha)o(v)o(e)f(one\))h(is)g(depressed,)h(and)f(the)g
+Fq(K)f Fr(k)o(ey)h(is)h(pressed.)22 b(If)16 b(y)o(ou)g(do)g(not)f(ha)o
+(v)o(e)g(a)h(meta)f(k)o(ey)l(,)h(the)g(iden)o(tical)0
+1321 y(k)o(eystrok)o(e)j(can)g(b)q(e)i(generated)e(b)o(y)h(t)o(yping)f
+Fq(ESC)h Fl(\014rst)p Fr(,)g(and)f(then)h(t)o(yping)g
+Fq(K)p Fr(.)33 b(Either)20 b(pro)q(cess)g(is)g(kno)o(wn)f(as)0
+1383 y Fl(metafying)g Fr(the)c Fq(K)g Fr(k)o(ey)l(.)62
+1528 y(The)h(text)e Fq(M-C-K)g Fr(is)i(read)f(as)f(`Meta-Con)o(trol-k')
+g(and)h(describ)q(es)h(the)g(c)o(haracter)e(pro)q(duced)i(b)o(y)f
+Fl(metafying)0 1590 y Fq(C-K)p Fr(.)62 1735 y(In)i(addition,)h(sev)o
+(eral)e(k)o(eys)g(ha)o(v)o(e)g(their)h(o)o(wn)f(names.)23
+b(Sp)q(eci\014cally)m(,)c Fq(DEL)p Fr(,)d Fq(ESC)p Fr(,)f
+Fq(LFD)p Fr(,)h Fq(SPC)p Fr(,)g Fq(RET)p Fr(,)g(and)g
+Fq(TAB)0 1797 y Fr(all)e(stand)f(for)f(themselv)o(es)i(when)f(seen)h
+(in)g(this)f(text,)g(or)g(in)g(an)g(init)i(\014le)f(\(see)f(Section)h
+(1.3)e([Readline)j(Init)f(File],)0 1859 y(page)h(5\).)0
+2152 y Fp(1.2)33 b(Readline)16 b(In)n(teraction)62 2296
+y Fr(Often)g(during)h(an)f(in)o(teractiv)o(e)g(session)h(y)o(ou)e(t)o
+(yp)q(e)h(in)h(a)f(long)g(line)h(of)f(text,)f(only)h(to)g(notice)g
+(that)f(the)h(\014rst)0 2359 y(w)o(ord)d(on)i(the)f(line)i(is)e(missp)q
+(elled.)23 b(The)14 b(Readline)i(library)f(giv)o(es)g(y)o(ou)e(a)h(set)
+g(of)g(commands)g(for)f(manipulating)0 2421 y(the)18
+b(text)g(as)g(y)o(ou)g(t)o(yp)q(e)g(it)h(in,)g(allo)o(wing)g(y)o(ou)f
+(to)g(just)g(\014x)g(y)o(our)g(t)o(yp)q(o,)g(and)h(not)f(forcing)g(y)o
+(ou)g(to)g(ret)o(yp)q(e)g(the)0 2483 y(ma)s(jorit)o(y)d(of)h(the)g
+(line.)25 b(Using)17 b(these)g(editing)h(commands,)e(y)o(ou)g(mo)o(v)o
+(e)f(the)i(cursor)f(to)g(the)g(place)h(that)f(needs)0
+2545 y(correction,)g(and)h(delete)g(or)f(insert)g(the)h(text)e(of)h
+(the)g(corrections.)23 b(Then,)17 b(when)g(y)o(ou)f(are)g(satis\014ed)g
+(with)h(the)0 2608 y(line,)h(y)o(ou)e(simply)i(press)f
+Fq(RETURN)p Fr(.)23 b(Y)l(ou)17 b(do)f(not)g(ha)o(v)o(e)g(to)g(b)q(e)i
+(at)e(the)g(end)h(of)f(the)h(line)h(to)e(press)h Fq(RETURN)p
+Fr(;)f(the)0 2670 y(en)o(tire)g(line)h(is)e(accepted)h(regardless)f(of)
+g(the)g(lo)q(cation)h(of)f(the)h(cursor)e(within)j(the)e(line.)p
eop
-%%Page: 3 5
-4 bop 0 -83 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1227
-b(3)0 158 y Fn(C-L)168 b Fo(Clear)15 b(the)h(screen,)f(reprin)o(ting)h(the)f
-(curren)o(t)g(line)i(at)e(the)g(top.)62 325 y(Notice)22 b(ho)o(w)e
-Fn(C-F)h Fo(mo)o(v)o(es)f(forw)o(ard)g(a)g(c)o(haracter,)i(while)g
-Fn(M-F)f Fo(mo)o(v)o(es)f(forw)o(ard)g(a)h(w)o(ord.)36 b(It)21
-b(is)h(a)f(lo)q(ose)0 387 y(con)o(v)o(en)o(tion)15 b(that)g(con)o(trol)g(k)o
-(eystrok)o(es)f(op)q(erate)h(on)g(c)o(haracters)f(while)j(meta)e(k)o(eystrok)
-o(es)f(op)q(erate)h(on)g(w)o(ords.)0 671 y Fi(1.2.3)30 b(Readline)15
-b(Killing)g(Commands)62 816 y Fj(Killing)25 b Fo(text)18 b(means)g(to)f
-(delete)i(the)g(text)e(from)h(the)g(line,)i(but)e(to)g(sa)o(v)o(e)f(it)i(a)o
-(w)o(a)o(y)d(for)i(later)g(use,)h(usually)0 878 y(b)o(y)c Fj(y)o(anking)k
-Fo(\(re-inserting\))c(it)g(bac)o(k)g(in)o(to)g(the)g(line.)21
+2 3 bop 0 -58 a Fr(2)1472 b(GNU)15 b(Readline)i(Library)0
+183 y Fk(1.2.1)30 b(Readline)15 b(Bare)g(Essen)n(tials)62
+320 y Fr(In)f(order)f(to)f(en)o(ter)h(c)o(haracters)g(in)o(to)g(the)g
+(line,)i(simply)f(t)o(yp)q(e)f(them.)19 b(The)14 b(t)o(yp)q(ed)f(c)o
+(haracter)f(app)q(ears)i(where)0 382 y(the)h(cursor)h(w)o(as,)e(and)h
+(then)h(the)g(cursor)f(mo)o(v)o(es)f(one)i(space)g(to)e(the)i(righ)o
+(t.)k(If)c(y)o(ou)f(mist)o(yp)q(e)h(a)f(c)o(haracter,)f(y)o(ou)0
+445 y(can)h(use)h(y)o(our)f(erase)g(c)o(haracter)f(to)h(bac)o(k)g(up)g
+(and)h(delete)g(the)f(mist)o(yp)q(ed)h(c)o(haracter.)62
+582 y(Sometimes)f(y)o(ou)e(ma)o(y)h(miss)g(t)o(yping)g(a)g(c)o
+(haracter)g(that)f(y)o(ou)h(w)o(an)o(ted)f(to)g(t)o(yp)q(e,)h(and)h
+(not)e(notice)i(y)o(our)f(error)0 644 y(un)o(til)k(y)o(ou)e(ha)o(v)o(e)
+g(t)o(yp)q(ed)h(sev)o(eral)g(other)f(c)o(haracters.)23
+b(In)18 b(that)d(case,)i(y)o(ou)f(can)h(t)o(yp)q(e)g
+Fq(C-B)f Fr(to)g(mo)o(v)o(e)g(the)g(cursor)0 706 y(to)f(the)h(left,)g
+(and)g(then)g(correct)f(y)o(our)h(mistak)o(e.)21 b(Afterw)o(ards,)14
+b(y)o(ou)i(can)g(mo)o(v)o(e)f(the)h(cursor)f(to)g(the)h(righ)o(t)g
+(with)0 769 y Fq(C-F)p Fr(.)62 906 y(When)i(y)o(ou)f(add)g(text)g(in)h
+(the)f(middle)i(of)e(a)g(line,)i(y)o(ou)e(will)i(notice)e(that)g(c)o
+(haracters)f(to)h(the)g(righ)o(t)g(of)g(the)0 968 y(cursor)h(are)h
+(`pushed)g(o)o(v)o(er')e(to)h(mak)o(e)g(ro)q(om)g(for)g(the)h(text)f
+(that)g(y)o(ou)g(ha)o(v)o(e)h(inserted.)31 b(Lik)o(ewise,)20
+b(when)f(y)o(ou)0 1030 y(delete)f(text)f(b)q(ehind)i(the)f(cursor,)f(c)
+o(haracters)f(to)h(the)g(righ)o(t)g(of)g(the)h(cursor)f(are)g(`pulled)i
+(bac)o(k')d(to)h(\014ll)i(in)f(the)0 1092 y(blank)g(space)f(created)g
+(b)o(y)g(the)h(remo)o(v)m(al)f(of)f(the)i(text.)25 b(A)17
+b(list)h(of)e(the)h(basic)h(bare)f(essen)o(tials)h(for)e(editing)j(the)
+0 1155 y(text)c(of)f(an)i(input)g(line)h(follo)o(ws.)0
+1303 y Fq(C-B)168 b Fr(Mo)o(v)o(e)14 b(bac)o(k)h(one)h(c)o(haracter.)0
+1390 y Fq(C-F)168 b Fr(Mo)o(v)o(e)14 b(forw)o(ard)g(one)h(c)o
+(haracter.)0 1476 y Fq(DEL)168 b Fr(Delete)16 b(the)f(c)o(haracter)g
+(to)f(the)h(left)h(of)f(the)g(cursor.)0 1562 y Fq(C-D)168
+b Fr(Delete)16 b(the)f(c)o(haracter)g(underneath)h(the)f(cursor.)0
+1648 y(Prin)o(ting)h(c)o(haracters)240 1710 y(Insert)f(the)h(c)o
+(haracter)e(in)o(to)h(the)h(line)h(at)d(the)h(cursor.)0
+1796 y Fq(C-_)168 b Fr(Undo)15 b(the)h(last)f(thing)h(that)e(y)o(ou)h
+(did.)21 b(Y)l(ou)15 b(can)h(undo)f(all)h(the)g(w)o(a)o(y)e(bac)o(k)h
+(to)f(an)i(empt)o(y)e(line.)0 2001 y Fk(1.2.2)30 b(Readline)15
+b(Mo)n(v)n(emen)n(t)h(Commands)62 2138 y Fr(The)c(ab)q(o)o(v)o(e)g
+(table)g(describ)q(es)i(the)e(most)f(basic)h(p)q(ossible)i(k)o(eystrok)
+o(es)d(that)g(y)o(ou)g(need)i(in)g(order)f(to)f(do)h(editing)0
+2201 y(of)g(the)h(input)h(line.)21 b(F)l(or)12 b(y)o(our)g(con)o(v)o
+(enience,)i(man)o(y)f(other)f(commands)h(ha)o(v)o(e)f(b)q(een)i(added)f
+(in)h(addition)g(to)e Fq(C-B)p Fr(,)0 2263 y Fq(C-F)p
+Fr(,)i Fq(C-D)p Fr(,)h(and)g Fq(DEL)p Fr(.)20 b(Here)15
+b(are)g(some)g(commands)g(for)f(mo)o(ving)h(more)g(rapidly)i(ab)q(out)e
+(the)g(line.)0 2412 y Fq(C-A)168 b Fr(Mo)o(v)o(e)14 b(to)h(the)g(start)
+f(of)h(the)g(line.)0 2498 y Fq(C-E)168 b Fr(Mo)o(v)o(e)14
+b(to)h(the)g(end)h(of)f(the)g(line.)0 2584 y Fq(M-F)168
+b Fr(Mo)o(v)o(e)14 b(forw)o(ard)g(a)h(w)o(ord.)0 2670
+y Fq(M-B)168 b Fr(Mo)o(v)o(e)14 b(bac)o(kw)o(ard)h(a)g(w)o(ord.)p
+eop
+3 4 bop 0 -58 a Fr(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1227
+b(3)0 183 y Fq(C-L)168 b Fr(Clear)15 b(the)h(screen,)f(reprin)o(ting)h
+(the)f(curren)o(t)g(line)i(at)e(the)g(top.)62 350 y(Notice)22
+b(ho)o(w)e Fq(C-F)h Fr(mo)o(v)o(es)f(forw)o(ard)g(a)g(c)o(haracter,)i
+(while)g Fq(M-F)f Fr(mo)o(v)o(es)f(forw)o(ard)g(a)h(w)o(ord.)36
+b(It)21 b(is)h(a)f(lo)q(ose)0 412 y(con)o(v)o(en)o(tion)15
+b(that)g(con)o(trol)g(k)o(eystrok)o(es)f(op)q(erate)h(on)g(c)o
+(haracters)f(while)j(meta)e(k)o(eystrok)o(es)f(op)q(erate)h(on)g(w)o
+(ords.)0 696 y Fk(1.2.3)30 b(Readline)15 b(Killing)g(Commands)62
+841 y Fl(Killing)25 b Fr(text)18 b(means)g(to)f(delete)i(the)g(text)e
+(from)h(the)g(line,)i(but)e(to)g(sa)o(v)o(e)f(it)i(a)o(w)o(a)o(y)d(for)
+i(later)g(use,)h(usually)0 903 y(b)o(y)c Fl(y)o(anking)k
+Fr(\(re-inserting\))c(it)g(bac)o(k)g(in)o(to)g(the)g(line.)21
b(If)16 b(the)f(description)h(for)e(a)h(command)f(sa)o(ys)h(that)f(it)h
-(`kills')0 941 y(text,)f(then)i(y)o(ou)f(can)g(b)q(e)h(sure)f(that)g(y)o(ou)g
-(can)g(get)g(the)g(text)g(bac)o(k)g(in)h(a)f(di\013eren)o(t)g(\(or)f(the)i
-(same\))e(place)i(later.)62 1086 y(When)g(y)o(ou)f(use)g(a)g(kill)i(command,)
-e(the)h(text)e(is)i(sa)o(v)o(ed)f(in)h(a)f Fj(kill-ring)p Fo(.)22
-b(An)o(y)16 b(n)o(um)o(b)q(er)f(of)g(consecutiv)o(e)h(kills)0
-1148 y(sa)o(v)o(e)g(all)i(of)e(the)h(killed)i(text)d(together,)g(so)g(that)g
-(when)h(y)o(ou)f(y)o(ank)h(it)g(bac)o(k,)f(y)o(ou)h(get)f(it)h(all.)25
-b(The)17 b(kill)h(ring)f(is)0 1211 y(not)e(line)i(sp)q(eci\014c;)g(the)f
-(text)f(that)g(y)o(ou)g(killed)j(on)d(a)h(previously)g(t)o(yp)q(ed)g(line)h
-(is)f(a)o(v)m(ailable)i(to)d(b)q(e)h(y)o(ank)o(ed)f(bac)o(k)0
-1273 y(later,)g(when)h(y)o(ou)e(are)h(t)o(yping)h(another)e(line.)62
-1418 y(Here)i(is)f(the)h(list)g(of)e(commands)h(for)g(killing)j(text.)0
-1585 y Fn(C-K)168 b Fo(Kill)17 b(the)f(text)e(from)h(the)g(curren)o(t)g
+(`kills')0 966 y(text,)f(then)i(y)o(ou)f(can)g(b)q(e)h(sure)f(that)g(y)
+o(ou)g(can)g(get)g(the)g(text)g(bac)o(k)g(in)h(a)f(di\013eren)o(t)g
+(\(or)f(the)i(same\))e(place)i(later.)62 1111 y(When)g(y)o(ou)f(use)g
+(a)g(kill)i(command,)e(the)h(text)e(is)i(sa)o(v)o(ed)f(in)h(a)f
+Fl(kill-ring)p Fr(.)22 b(An)o(y)16 b(n)o(um)o(b)q(er)f(of)g(consecutiv)
+o(e)h(kills)0 1173 y(sa)o(v)o(e)g(all)i(of)e(the)h(killed)i(text)d
+(together,)g(so)g(that)g(when)h(y)o(ou)f(y)o(ank)h(it)g(bac)o(k,)f(y)o
+(ou)h(get)f(it)h(all.)25 b(The)17 b(kill)h(ring)f(is)0
+1236 y(not)e(line)i(sp)q(eci\014c;)g(the)f(text)f(that)g(y)o(ou)g
+(killed)j(on)d(a)h(previously)g(t)o(yp)q(ed)g(line)h(is)f(a)o(v)m
+(ailable)i(to)d(b)q(e)h(y)o(ank)o(ed)f(bac)o(k)0 1298
+y(later,)g(when)h(y)o(ou)e(are)h(t)o(yping)h(another)e(line.)62
+1443 y(Here)i(is)f(the)h(list)g(of)e(commands)h(for)g(killing)j(text.)0
+1610 y Fq(C-K)168 b Fr(Kill)17 b(the)f(text)e(from)h(the)g(curren)o(t)g
(cursor)g(p)q(osition)h(to)f(the)g(end)h(of)f(the)g(line.)0
-1689 y Fn(M-D)168 b Fo(Kill)17 b(from)d(the)h(cursor)g(to)f(the)h(end)g(of)g
-(the)g(curren)o(t)f(w)o(ord,)g(or)g(if)i(b)q(et)o(w)o(een)f(w)o(ords,)f(to)g
-(the)h(end)g(of)240 1751 y(the)g(next)h(w)o(ord.)0 1855 y Fn(M-DEL)120
-b Fo(Kill)16 b(from)d(the)i(cursor)e(the)h(start)f(of)h(the)g(previous)h(w)o
-(ord,)e(or)g(if)i(b)q(et)o(w)o(een)f(w)o(ords,)f(to)h(the)g(start)e(of)240
-1917 y(the)j(previous)h(w)o(ord.)0 2021 y Fn(C-W)168 b Fo(Kill)18
-b(from)e(the)g(cursor)g(to)f(the)h(previous)h(whitespace.)24
-b(This)17 b(is)f(di\013eren)o(t)h(than)f Fn(M-DEL)f Fo(b)q(ecause)240
-2084 y(the)g(w)o(ord)g(b)q(oundaries)h(di\013er.)62 2250 y(And,)e(here)g(is)h
-(ho)o(w)e(to)g Fj(y)o(ank)j Fo(the)e(text)f(bac)o(k)g(in)o(to)h(the)f(line.)
-22 b(Y)l(anking)14 b(means)g(to)f(cop)o(y)g(the)h(most-recen)o(tly-)0
-2312 y(killed)j(text)e(from)g(the)g(kill)i(bu\013er.)0 2479
-y Fn(C-Y)168 b Fo(Y)l(ank)15 b(the)h(most)e(recen)o(tly)i(killed)h(text)e
-(bac)o(k)g(in)o(to)g(the)h(bu\013er)f(at)f(the)i(cursor.)0
-2583 y Fn(M-Y)168 b Fo(Rotate)13 b(the)h(kill-ring,)i(and)e(y)o(ank)g(the)g
-(new)g(top.)19 b(Y)l(ou)14 b(can)g(only)g(do)g(this)g(if)g(the)g(prior)g
-(command)240 2645 y(is)i Fn(C-Y)e Fo(or)h Fn(M-Y)p Fo(.)p eop
-%%Page: 4 6
-5 bop 0 -83 a Fo(4)1472 b(GNU)15 b(Readline)i(Library)0 158
-y Fi(1.2.4)30 b(Readline)15 b(Argumen)n(ts)62 305 y Fo(Y)l(ou)k(can)g(pass)f
-(n)o(umeric)i(argumen)o(ts)d(to)h(Readline)j(commands.)30 b(Sometimes)19
-b(the)f(argumen)o(t)g(acts)g(as)g(a)0 367 y(rep)q(eat)f(coun)o(t,)f(other)g
-(times)g(it)h(is)g(the)g Fj(sign)f Fo(of)g(the)h(argumen)o(t)f(that)f(is)i
-(signi\014can)o(t.)25 b(If)16 b(y)o(ou)h(pass)f(a)g(negativ)o(e)0
-430 y(argumen)o(t)g(to)g(a)h(command)g(whic)o(h)h(normally)f(acts)g(in)h(a)e
-(forw)o(ard)g(direction,)i(that)f(command)f(will)j(act)d(in)i(a)0
-492 y(bac)o(kw)o(ard)13 b(direction.)21 b(F)l(or)13 b(example,)h(to)f(kill)i
-(text)e(bac)o(k)h(to)f(the)h(start)e(of)h(the)h(line,)h(y)o(ou)e(migh)o(t)h
-(t)o(yp)q(e)g Fn(M--)f(C-K)p Fo(.)62 639 y(The)19 b(general)g(w)o(a)o(y)f(to)
-g(pass)g(n)o(umeric)i(argumen)o(ts)e(to)g(a)g(command)h(is)g(to)f(t)o(yp)q(e)
-g(meta)g(digits)i(b)q(efore)f(the)0 701 y(command.)36 b(If)21
-b(the)g(\014rst)f(`digit')h(y)o(ou)g(t)o(yp)q(e)f(is)i(a)e(min)o(us)h(sign)g
-(\()p Fn(-)p Fo(\),)g(then)g(the)g(sign)g(of)g(the)f(argumen)o(t)g(will)0
-763 y(b)q(e)i(negativ)o(e.)40 b(Once)22 b(y)o(ou)f(ha)o(v)o(e)h(t)o(yp)q(ed)g
-(one)f(meta)g(digit)i(to)e(get)g(the)h(argumen)o(t)f(started,)h(y)o(ou)f(can)
-h(t)o(yp)q(e)0 826 y(the)c(remainder)h(of)f(the)g(digits,)h(and)f(then)h(the)
-f(command.)29 b(F)l(or)17 b(example,)i(to)f(giv)o(e)g(the)g
-Fn(C-D)g Fo(command)g(an)0 888 y(argumen)o(t)c(of)h(10,)f(y)o(ou)h(could)h(t)
-o(yp)q(e)g Fn(M-1)23 b(0)h(C-D)p Fo(.)0 1201 y Fm(1.3)33 b(Readline)16
-b(Init)g(File)62 1348 y Fo(Although)g(the)g(Readline)h(library)g(comes)e
-(with)h(a)f(set)g(of)g(Emacs-lik)o(e)h(k)o(eybindings)h(installed)g(b)o(y)f
-(default,)0 1410 y(it)e(is)g(p)q(ossible)i(that)d(y)o(ou)g(w)o(ould)h(lik)o
-(e)h(to)e(use)h(a)f(di\013eren)o(t)h(set)g(of)f(k)o(eybindings.)21
-b(Y)l(ou)14 b(can)g(customize)g(programs)0 1472 y(that)e(use)i(Readline)h(b)o
-(y)e(putting)h(commands)f(in)h(an)f Fj(init)i Fo(\014le)f(in)g(y)o(our)f
-(home)g(directory)l(.)19 b(The)14 b(name)f(of)f(this)i(\014le)0
-1535 y(is)i(tak)o(en)f(from)g(the)g(v)m(alue)i(of)e(the)h(en)o(vironmen)o(t)f
-(v)m(ariable)i Fn(INPUTRC)p Fo(.)j(If)c(that)f(v)m(ariable)h(is)g(unset,)g
-(the)f(default)0 1597 y(is)h(`)p Fn(~/.inputrc)p Fo('.)62 1744
-y(When)j(a)g(program)e(whic)o(h)j(uses)f(the)g(Readline)i(library)e(starts)f
-(up,)h(the)g(init)h(\014le)g(is)f(read,)g(and)g(the)g(k)o(ey)0
-1806 y(bindings)e(are)e(set.)62 1953 y(In)j(addition,)h(the)f
-Fn(C-x)c(C-r)k Fo(command)f(re-reads)g(this)h(init)h(\014le,)g(th)o(us)e
-(incorp)q(orating)h(an)o(y)f(c)o(hanges)h(that)0 2015 y(y)o(ou)d(migh)o(t)g
-(ha)o(v)o(e)g(made)g(to)f(it.)0 2311 y Fi(1.3.1)30 b(Readline)15
-b(Init)g(Syn)n(tax)62 2458 y Fo(There)h(are)f(only)h(a)f(few)g(basic)h
-(constructs)f(allo)o(w)o(ed)h(in)g(the)g(Readline)i(init)e(\014le.)22
-b(Blank)16 b(lines)h(are)e(ignored.)0 2521 y(Lines)j(b)q(eginning)g(with)f(a)
-f Fn(#)g Fo(are)g(commen)o(ts.)22 b(Lines)c(b)q(eginning)g(with)f(a)f
-Fn($)g Fo(indicate)h(conditional)h(constructs)0 2583 y(\(see)e(Section)h
-(1.3.2)e([Conditional)i(Init)g(Constructs],)e(page)i(7\).)22
-b(Other)16 b(lines)i(denote)f(v)m(ariable)h(settings)e(and)0
-2645 y(k)o(ey)f(bindings.)p eop
-%%Page: 5 7
-6 bop 0 -83 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1227
-b(5)0 158 y(V)l(ariable)16 b(Settings)240 221 y(Y)l(ou)j(can)g(c)o(hange)g
-(the)g(state)f(of)g(a)g(few)h(v)m(ariables)h(in)g(Readline)h(b)o(y)d(using)i
-(the)f Fn(set)f Fo(command)240 283 y(within)e(the)f(init)h(\014le.)k(Here)15
-b(is)g(ho)o(w)g(y)o(ou)f(w)o(ould)h(sp)q(ecify)h(that)e(y)o(ou)g(wish)i(to)e
-(use)h Fn(vi)f Fo(line)j(editing)240 345 y(commands:)360 408
-y Fn(set)23 b(editing-mode)g(vi)240 484 y Fo(Righ)o(t)14 b(no)o(w,)f(there)h
-(are)f(only)h(a)f(few)h(v)m(ariables)g(whic)o(h)h(can)f(b)q(e)g(set;)f(so)g
-(few,)h(in)g(fact,)f(that)g(w)o(e)g(just)240 546 y(list)j(them)f(here:)240
-622 y Fn(editing-mode)480 684 y Fo(The)e Fn(editing-mode)e
-Fo(v)m(ariable)j(con)o(trols)e(whic)o(h)h(editing)h(mo)q(de)f(y)o(ou)f(are)g
-(using.)20 b(By)480 746 y(default,)f(Readline)h(starts)c(up)i(in)h(Emacs)e
-(editing)i(mo)q(de,)f(where)g(the)g(k)o(eystrok)o(es)480 808
-y(are)c(most)g(similar)h(to)f(Emacs.)19 b(This)c(v)m(ariable)h(can)f(b)q(e)g
-(set)f(to)g(either)h Fn(emacs)f Fo(or)g Fn(vi)p Fo(.)240 884
-y Fn(horizontal-scroll-mode)480 946 y Fo(This)k(v)m(ariable)g(can)f(b)q(e)g
-(set)g(to)f(either)i Fn(On)f Fo(or)f Fn(Off)p Fo(.)25 b(Setting)17
-b(it)g(to)f Fn(On)h Fo(means)g(that)480 1009 y(the)d(text)g(of)f(the)h(lines)
-i(that)d(y)o(ou)h(edit)h(will)g(scroll)g(horizon)o(tally)g(on)f(a)g(single)h
-(screen)480 1071 y(line)f(when)f(they)g(are)f(longer)h(than)f(the)h(width)g
-(of)f(the)g(screen,)h(instead)g(of)g(wrapping)480 1133 y(on)o(to)h(a)h(new)h
-(screen)f(line.)22 b(By)15 b(default,)h(this)f(v)m(ariable)i(is)f(set)e(to)h
-Fn(Off)p Fo(.)240 1209 y Fn(mark-modified-lines)480 1271 y
-Fo(This)h(v)m(ariable,)g(when)g(set)f(to)f Fn(On)p Fo(,)h(sa)o(ys)f(to)g
-(displa)o(y)j(an)e(asterisk)g(\(`)p Fn(*)p Fo('\))e(at)i(the)g(start)480
-1333 y(of)f(history)h(lines)i(whic)o(h)e(ha)o(v)o(e)g(b)q(een)h(mo)q
-(di\014ed.)21 b(This)15 b(v)m(ariable)h(is)g Fn(off)e Fo(b)o(y)h(default.)240
-1409 y Fn(bell-style)480 1471 y Fo(Con)o(trols)h(what)f(happ)q(ens)j(when)f
-(Readline)h(w)o(an)o(ts)e(to)f(ring)i(the)f(terminal)h(b)q(ell.)26
-b(If)480 1533 y(set)13 b(to)g Fn(none)p Fo(,)g(Readline)j(nev)o(er)e(rings)g
-(the)g(b)q(ell.)21 b(If)14 b(set)f(to)g Fn(visible)p Fo(,)g(Readline)j(uses)
-480 1596 y(a)g(visible)j(b)q(ell)g(if)e(one)g(is)g(a)o(v)m(ailable.)27
-b(If)17 b(set)f(to)g Fn(audible)g Fo(\(the)h(default\),)g(Readline)480
-1658 y(attempts)d(to)h(ring)g(the)h(terminal's)f(b)q(ell.)240
-1733 y Fn(comment-begin)480 1796 y Fo(The)21 b(string)h(to)e(insert)i(at)e
-(the)h(b)q(eginning)j(of)c(the)i(line)g(when)g(the)f Fn(vi-comment)480
-1858 y Fo(command)15 b(is)h(executed.)21 b(The)15 b(default)h(v)m(alue)g(is)g
-Fn("#")p Fo(.)240 1934 y Fn(meta-flag)480 1996 y Fo(If)d(set)g(to)f
-Fn(on)p Fo(,)g(Readline)j(will)g(enable)f(eigh)o(t-bit)f(input)h(\(it)f(will)
-h(not)f(strip)g(the)g(eigh)o(th)480 2058 y(bit)i(from)g(the)g(c)o(haracters)f
-(it)h(reads\),)f(regardless)h(of)g(what)f(the)h(terminal)h(claims)g(it)480
-2120 y(can)f(supp)q(ort.)20 b(The)c(default)g(v)m(alue)g(is)g
-Fn(off)p Fo(.)240 2196 y Fn(convert-meta)480 2258 y Fo(If)23
-b(set)f(to)f Fn(on)p Fo(,)j(Readline)h(will)f(con)o(v)o(ert)d(c)o(haracters)h
-(with)g(the)h(eigth)g(bit)f(set)h(to)480 2320 y(an)17 b(ASCI)q(I)g(k)o(ey)g
-(sequence)h(b)o(y)e(stripping)i(the)f(eigth)g(bit)g(and)g(prep)q(ending)i(an)
-d Fn(ESC)480 2383 y Fo(c)o(haracter,)h(con)o(v)o(erting)g(them)g(to)f(a)h
+1714 y Fq(M-D)168 b Fr(Kill)17 b(from)d(the)h(cursor)g(to)f(the)h(end)g
+(of)g(the)g(curren)o(t)f(w)o(ord,)g(or)g(if)i(b)q(et)o(w)o(een)f(w)o
+(ords,)f(to)g(the)h(end)g(of)240 1776 y(the)g(next)h(w)o(ord.)0
+1880 y Fq(M-DEL)120 b Fr(Kill)16 b(from)d(the)i(cursor)e(the)h(start)f
+(of)h(the)g(previous)h(w)o(ord,)e(or)g(if)i(b)q(et)o(w)o(een)f(w)o
+(ords,)f(to)h(the)g(start)e(of)240 1942 y(the)j(previous)h(w)o(ord.)0
+2046 y Fq(C-W)168 b Fr(Kill)18 b(from)e(the)g(cursor)g(to)f(the)h
+(previous)h(whitespace.)24 b(This)17 b(is)f(di\013eren)o(t)h(than)f
+Fq(M-DEL)f Fr(b)q(ecause)240 2109 y(the)g(w)o(ord)g(b)q(oundaries)h
+(di\013er.)62 2275 y(And,)e(here)g(is)h(ho)o(w)e(to)g
+Fl(y)o(ank)j Fr(the)e(text)f(bac)o(k)g(in)o(to)h(the)f(line.)22
+b(Y)l(anking)14 b(means)g(to)f(cop)o(y)g(the)h(most-recen)o(tly-)0
+2337 y(killed)j(text)e(from)g(the)g(kill)i(bu\013er.)0
+2504 y Fq(C-Y)168 b Fr(Y)l(ank)15 b(the)h(most)e(recen)o(tly)i(killed)h
+(text)e(bac)o(k)g(in)o(to)g(the)h(bu\013er)f(at)f(the)i(cursor.)0
+2608 y Fq(M-Y)168 b Fr(Rotate)13 b(the)h(kill-ring,)i(and)e(y)o(ank)g
+(the)g(new)g(top.)19 b(Y)l(ou)14 b(can)g(only)g(do)g(this)g(if)g(the)g
+(prior)g(command)240 2670 y(is)i Fq(C-Y)e Fr(or)h Fq(M-Y)p
+Fr(.)p eop
+4 5 bop 0 -58 a Fr(4)1472 b(GNU)15 b(Readline)i(Library)0
+183 y Fk(1.2.4)30 b(Readline)15 b(Argumen)n(ts)62 345
+y Fr(Y)l(ou)k(can)g(pass)f(n)o(umeric)i(argumen)o(ts)d(to)h(Readline)j
+(commands.)30 b(Sometimes)19 b(the)f(argumen)o(t)g(acts)g(as)g(a)0
+407 y(rep)q(eat)f(coun)o(t,)f(other)g(times)g(it)h(is)g(the)g
+Fl(sign)f Fr(of)g(the)h(argumen)o(t)f(that)f(is)i(signi\014can)o(t.)25
+b(If)16 b(y)o(ou)h(pass)f(a)g(negativ)o(e)0 470 y(argumen)o(t)g(to)g(a)
+h(command)g(whic)o(h)h(normally)f(acts)g(in)h(a)e(forw)o(ard)g
+(direction,)i(that)f(command)f(will)j(act)d(in)i(a)0
+532 y(bac)o(kw)o(ard)13 b(direction.)20 b(F)l(or)13 b(example,)i(to)d
+(kill)k(text)d(bac)o(k)g(to)g(the)h(start)e(of)h(the)h(line,)h(y)o(ou)e
+(migh)o(t)g(t)o(yp)q(e)h Fq(M--)h(C-k)o Fr(.)62 694 y(The)k(general)g
+(w)o(a)o(y)f(to)g(pass)g(n)o(umeric)i(argumen)o(ts)e(to)g(a)g(command)h
+(is)g(to)f(t)o(yp)q(e)g(meta)g(digits)i(b)q(efore)f(the)0
+756 y(command.)36 b(If)21 b(the)g(\014rst)f(`digit')h(y)o(ou)g(t)o(yp)q
+(e)f(is)i(a)e(min)o(us)h(sign)g(\()p Fq(-)p Fr(\),)g(then)g(the)g(sign)
+g(of)g(the)f(argumen)o(t)g(will)0 818 y(b)q(e)i(negativ)o(e.)40
+b(Once)22 b(y)o(ou)f(ha)o(v)o(e)h(t)o(yp)q(ed)g(one)f(meta)g(digit)i
+(to)e(get)g(the)h(argumen)o(t)f(started,)h(y)o(ou)f(can)h(t)o(yp)q(e)0
+881 y(the)c(remainder)h(of)f(the)g(digits,)h(and)f(then)h(the)f
+(command.)29 b(F)l(or)17 b(example,)i(to)f(giv)o(e)g(the)g
+Fq(C-D)g Fr(command)g(an)0 943 y(argumen)o(t)c(of)h(10,)f(y)o(ou)h
+(could)h(t)o(yp)q(e)g(`)p Fq(M-1)e(0)h(C-d)p Fr('.)0
+1375 y Fk(1.2.5)30 b(Searc)n(hing)15 b(for)g(Commands)h(in)f(the)g
+(History)62 1537 y Fr(Readline)j(pro)o(vides)d(commands)g(for)g(searc)o
+(hing)h(through)e(the)i(command)f(history)g(for)g(lines)h(con)o
+(taining)g(a)0 1599 y(sp)q(eci\014ed)h(string.)j(There)c(are)f(t)o(w)o
+(o)e(searc)o(h)i(mo)q(des:)20 b Fl(incremen)o(tal)f Fr(and)c
+Fl(non-incremen)o(tal)p Fr(.)62 1761 y(Incremen)o(tal)i(searc)o(hes)e
+(b)q(egin)i(b)q(efore)f(the)g(user)f(has)h(\014nished)h(t)o(yping)f
+(the)g(searc)o(h)f(string.)21 b(As)15 b(eac)o(h)h(c)o(har-)0
+1823 y(acter)f(of)h(the)g(searc)o(h)f(string)h(is)g(t)o(yp)q(ed,)g
+(readline)h(displa)o(ys)g(the)f(next)g(en)o(try)f(from)g(the)h(history)
+g(matc)o(hing)g(the)0 1885 y(string)g(t)o(yp)q(ed)g(so)f(far.)20
+b(An)c(incremen)o(tal)h(searc)o(h)e(requires)i(only)f(as)f(man)o(y)g(c)
+o(haracters)g(as)h(needed)h(to)e(\014nd)h(the)0 1948
+y(desired)g(history)f(en)o(try)l(.)20 b(The)15 b(Escap)q(e)h(c)o
+(haracter)e(is)h(used)h(to)e(terminate)h(an)g(incremen)o(tal)h(searc)o
+(h.)k(Con)o(trol-J)0 2010 y(will)c(also)f(terminate)g(the)g(searc)o(h.)
+k(Con)o(trol-G)14 b(will)j(ab)q(ort)d(an)h(incremen)o(tal)g(searc)o(h)g
+(and)g(restore)f(the)h(original)0 2072 y(line.)30 b(When)18
+b(the)h(searc)o(h)e(is)i(terminated,)g(the)f(history)g(en)o(try)f(con)o
+(taining)i(the)f(searc)o(h)g(string)g(b)q(ecomes)h(the)0
+2134 y(curren)o(t)g(line.)35 b(T)l(o)20 b(\014nd)g(other)f(matc)o(hing)
+h(en)o(tries)g(in)g(the)g(history)g(list,)h(t)o(yp)q(e)e(Con)o(trol-S)h
+(or)f(Con)o(trol-R)g(as)0 2197 y(appropriate.)k(This)17
+b(will)h(searc)o(h)e(bac)o(kw)o(ard)g(or)f(forw)o(ard)g(in)j(the)e
+(history)g(for)g(the)g(next)h(en)o(try)f(matc)o(hing)g(the)0
+2259 y(searc)o(h)c(string)h(t)o(yp)q(ed)f(so)g(far.)19
+b(An)o(y)12 b(other)g(k)o(ey)g(sequence)i(b)q(ound)f(to)f(a)g(readline)
+i(command)e(will)i(terminate)f(the)0 2321 y(searc)o(h)j(and)h(execute)g
+(that)f(command.)24 b(F)l(or)16 b(instance,)h(a)g Fq(newline)e
+Fr(will)j(terminate)f(the)g(searc)o(h)f(and)h(accept)0
+2384 y(the)e(line,)i(thereb)o(y)e(executing)h(the)g(command)f(from)f
+(the)h(history)h(list.)62 2545 y(Non-incremen)o(tal)k(searc)o(hes)f
+(read)f(the)h(en)o(tire)g(searc)o(h)g(string)f(b)q(efore)h(starting)f
+(to)g(searc)o(h)h(for)f(matc)o(hing)0 2608 y(history)g(lines.)29
+b(The)18 b(searc)o(h)g(string)g(ma)o(y)f(b)q(e)h(t)o(yp)q(ed)g(b)o(y)g
+(the)g(user)g(or)f(part)g(of)h(the)g(con)o(ten)o(ts)f(of)g(the)h
+(curren)o(t)0 2670 y(line.)p eop
+5 6 bop 0 -58 a Fr(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1227
+b(5)0 183 y Fp(1.3)33 b(Readline)16 b(Init)g(File)62
+324 y Fr(Although)h(the)f(Readline)j(library)e(comes)f(with)g(a)g(set)g
+(of)g Fq(emacs)p Fr(-lik)o(e)h(k)o(eybindings)h(installed)g(b)o(y)e
+(default,)0 387 y(it)e(is)g(p)q(ossible)i(that)d(y)o(ou)g(w)o(ould)h
+(lik)o(e)h(to)e(use)h(a)f(di\013eren)o(t)h(set)g(of)f(k)o(eybindings.)
+21 b(Y)l(ou)14 b(can)g(customize)g(programs)0 449 y(that)j(use)h
+(Readline)i(b)o(y)e(putting)h(commands)e(in)i(an)f Fl(inputrc)j
+Fr(\014le)e(in)g(y)o(our)e(home)h(directory)l(.)28 b(The)19
+b(name)e(of)0 511 y(this)e(\014le)h(is)g(tak)o(en)e(from)h(the)g(v)m
+(alue)h(of)e(the)h(en)o(vironmen)o(t)h(v)m(ariable)g
+Fq(INPUTRC)p Fr(.)j(If)c(that)f(v)m(ariable)j(is)e(unset,)g(the)0
+573 y(default)h(is)f(`)p Fq(~/.inputrc)p Fr('.)62 714
+y(When)k(a)g(program)e(whic)o(h)j(uses)f(the)g(Readline)i(library)e
+(starts)f(up,)h(the)g(init)h(\014le)g(is)f(read,)g(and)g(the)g(k)o(ey)0
+777 y(bindings)e(are)e(set.)62 918 y(In)j(addition,)h(the)f
+Fq(C-x)c(C-r)k Fr(command)f(re-reads)g(this)h(init)h(\014le,)g(th)o(us)
+e(incorp)q(orating)h(an)o(y)f(c)o(hanges)h(that)0 980
+y(y)o(ou)d(migh)o(t)g(ha)o(v)o(e)g(made)g(to)f(it.)0
+1224 y Fk(1.3.1)30 b(Readline)15 b(Init)g(File)g(Syn)n(tax)62
+1365 y Fr(There)h(are)f(only)h(a)f(few)g(basic)h(constructs)f(allo)o(w)
+o(ed)h(in)g(the)g(Readline)i(init)e(\014le.)22 b(Blank)16
+b(lines)h(are)e(ignored.)0 1427 y(Lines)f(b)q(eginning)h(with)e(a)f(`)p
+Fq(#)p Fr(')g(are)g(commen)o(ts.)19 b(Lines)14 b(b)q(eginning)h(with)e
+(a)f(`)p Fq($)p Fr(')g(indicate)i(conditional)g(constructs)0
+1490 y(\(see)i(Section)h(1.3.2)e([Conditional)i(Init)g(Constructs],)e
+(page)i(8\).)22 b(Other)16 b(lines)i(denote)f(v)m(ariable)h(settings)e
+(and)0 1552 y(k)o(ey)f(bindings.)0 1710 y(V)l(ariable)h(Settings)240
+1772 y(Y)l(ou)j(can)g(c)o(hange)g(the)g(state)f(of)g(a)g(few)h(v)m
+(ariables)h(in)g(Readline)h(b)o(y)d(using)i(the)f Fq(set)f
+Fr(command)240 1834 y(within)e(the)f(init)h(\014le.)k(Here)15
+b(is)g(ho)o(w)g(y)o(ou)f(w)o(ould)h(sp)q(ecify)h(that)e(y)o(ou)g(wish)i
+(to)e(use)h Fq(vi)f Fr(line)j(editing)240 1896 y(commands:)360
+1965 y Fq(set)23 b(editing-mode)g(vi)240 2044 y Fr(Righ)o(t)14
+b(no)o(w,)f(there)h(are)f(only)h(a)f(few)h(v)m(ariables)g(whic)o(h)h
+(can)f(b)q(e)g(set;)f(so)g(few,)h(in)g(fact,)f(that)g(w)o(e)g(just)240
+2106 y(list)j(them)f(here:)240 2201 y Fq(bell-style)480
+2263 y Fr(Con)o(trols)h(what)f(happ)q(ens)j(when)f(Readline)h(w)o(an)o
+(ts)e(to)f(ring)i(the)f(terminal)h(b)q(ell.)26 b(If)480
+2326 y(set)17 b(to)f(`)p Fq(none)p Fr(',)g(Readline)j(nev)o(er)f(rings)
+f(the)g(b)q(ell.)28 b(If)17 b(set)g(to)f(`)p Fq(visible)p
+Fr(',)g(Readline)480 2388 y(uses)21 b(a)g(visible)j(b)q(ell)f(if)e(one)
+h(is)f(a)o(v)m(ailable.)40 b(If)21 b(set)g(to)g(`)p Fq(audible)p
+Fr(')e(\(the)i(default\),)480 2450 y(Readline)d(attempts)c(to)g(ring)i
+(the)f(terminal's)h(b)q(ell.)240 2545 y Fq(comment-begin)480
+2608 y Fr(The)d(string)h(to)e(insert)i(at)e(the)i(b)q(eginning)h(of)e
+(the)g(line)i(when)f(the)f Fq(insert-comment)480 2670
+y Fr(command)i(is)h(executed.)21 b(The)15 b(default)h(v)m(alue)g(is)g
+Fq("#")p Fr(.)p eop
+6 7 bop 0 -58 a Fr(6)1472 b(GNU)15 b(Readline)i(Library)240
+183 y Fq(completion-query-items)480 246 y Fr(The)12 b(n)o(um)o(b)q(er)g
+(of)f(p)q(ossible)j(completions)e(that)f(determines)i(when)f(the)g
+(user)g(is)g(ask)o(ed)480 308 y(whether)k(he)h(w)o(an)o(ts)d(to)i(see)g
+(the)g(list)h(of)e(p)q(ossibiliti)q(es.)25 b(If)16 b(the)g(n)o(um)o(b)q
+(er)h(of)e(p)q(ossible)480 370 y(completions)i(is)f(greater)f(than)h
+(this)h(v)m(alue,)f(Readline)j(will)e(ask)f(the)g(user)g(whether)480
+432 y(or)k(not)h(he)h(wishes)f(to)g(view)g(them;)j(otherwise,)e(they)f
+(are)g(simply)h(listed.)39 b(The)480 495 y(default)16
+b(limit)g(is)g Fq(100)p Fr(.)240 592 y Fq(convert-meta)480
+654 y Fr(If)21 b(set)f(to)g(`)p Fq(on)p Fr(',)g(Readline)j(will)f(con)o
+(v)o(ert)e(c)o(haracters)f(with)i(the)g(eigth)f(bit)h(set)g(to)480
+716 y(an)c(ASCI)q(I)g(k)o(ey)g(sequence)h(b)o(y)e(stripping)i(the)f
+(eigth)g(bit)g(and)g(prep)q(ending)i(an)d Fq(ESC)480
+779 y Fr(c)o(haracter,)h(con)o(v)o(erting)g(them)g(to)f(a)h
(meta-pre\014xed)h(k)o(ey)f(sequence.)27 b(The)17 b(default)480
-2445 y(v)m(alue)f(is)g Fn(on)p Fo(.)240 2521 y Fn(output-meta)480
-2583 y Fo(If)d(set)f(to)g Fn(on)p Fo(,)h(Readline)i(will)f(displa)o(y)g(c)o
-(haracters)d(with)i(the)g(eigh)o(th)g(bit)g(set)g(directly)480
-2645 y(rather)i(than)g(as)f(a)h(meta-pre\014xed)h(escap)q(e)g(sequence.)21
-b(The)16 b(default)f(is)h Fn(off)p Fo(.)p eop
-%%Page: 6 8
-7 bop 0 -83 a Fo(6)1472 b(GNU)15 b(Readline)i(Library)240 158
-y Fn(completion-query-items)480 221 y Fo(The)12 b(n)o(um)o(b)q(er)g(of)f(p)q
-(ossible)j(completions)e(that)f(determines)i(when)f(the)g(user)g(is)g(ask)o
-(ed)480 283 y(whether)k(he)h(w)o(an)o(ts)d(to)i(see)g(the)g(list)h(of)e(p)q
-(ossibiliti)q(es.)25 b(If)16 b(the)g(n)o(um)o(b)q(er)h(of)e(p)q(ossible)480
-345 y(completions)i(is)f(greater)f(than)h(this)h(v)m(alue,)f(Readline)j(will)
-e(ask)f(the)g(user)g(whether)480 407 y(or)k(not)h(he)h(wishes)f(to)g(view)g
-(them;)j(otherwise,)e(they)f(are)g(simply)h(listed.)39 b(The)480
-470 y(default)16 b(limit)g(is)g Fn(100)p Fo(.)240 564 y Fn(keymap)96
-b Fo(Sets)13 b(Readline's)i(idea)e(of)g(the)g(curren)o(t)f(k)o(eymap)h(for)f
-(k)o(ey)h(binding)i(commands.)k(Ac-)480 626 y(ceptable)d Fn(keymap)e
-Fo(names)h(are)g Fn(emacs)p Fo(,)f Fn(emacs-standard)p Fo(,)f
-Fn(emacs-meta)p Fo(,)g Fn(emacs-)480 688 y(ctlx)p Fo(,)j Fn(vi)p
-Fo(,)h Fn(vi-move)p Fo(,)f Fn(vi-command)p Fo(,)g(and)h Fn(vi-insert)p
-Fo(.)23 b Fn(vi)17 b Fo(is)g(equiv)m(alen)o(t)i(to)d Fn(vi-)480
-750 y(command)p Fo(;)22 b Fn(emacs)e Fo(is)h(equiv)m(alen)o(t)h(to)e
-Fn(emacs-standard)p Fo(.)35 b(The)20 b(default)i(v)m(alue)f(is)480
-813 y Fn(emacs)p Fo(.)33 b(The)21 b(v)m(alue)g(of)e(the)i Fn(editing-mode)d
-Fo(v)m(ariable)j(also)f(a\013ects)f(the)h(default)480 875 y(k)o(eymap.)240
-953 y Fn(show-all-if-ambiguous)480 1015 y Fo(This)d(alters)f(the)h(default)g
-(b)q(eha)o(vior)g(of)f(the)g(completion)i(functions.)24 b(If)17
-b(set)f(to)g Fn(on)p Fo(,)480 1077 y(w)o(ords)d(whic)o(h)h(ha)o(v)o(e)f(more)
-h(than)f(one)h(p)q(ossible)h(completion)g(cause)f(the)f(matc)o(hes)h(to)480
-1140 y(b)q(e)h(listed)g(immediately)h(instead)f(of)f(ringing)h(the)f(b)q
-(ell.)22 b(The)14 b(default)h(v)m(alue)g(is)g Fn(off)p Fo(.)240
-1218 y Fn(expand-tilde)480 1280 y Fo(If)20 b(set)f(to)g Fn(on)p
-Fo(,)h(tilde)h(expansion)f(is)g(p)q(erformed)g(when)g(Readline)i(attempts)d
-(w)o(ord)480 1342 y(completion.)i(The)15 b(default)h(is)g Fn(off)p
-Fo(.)0 1420 y(Key)g(Bindings)240 1483 y(The)k(syn)o(tax)f(for)g(con)o
-(trolling)i(k)o(ey)e(bindings)j(in)e(the)g(init)h(\014le)g(is)f(simple.)35
-b(First)19 b(y)o(ou)g(ha)o(v)o(e)h(to)240 1545 y(kno)o(w)13
-b(the)h(name)g(of)f(the)h(command)g(that)f(y)o(ou)g(w)o(an)o(t)g(to)g(c)o
-(hange.)20 b(The)14 b(follo)o(wing)g(pages)g(con)o(tain)240
-1607 y(tables)i(of)f(the)h(command)g(name,)f(the)h(default)g(k)o(eybinding,)i
-(and)e(a)f(short)g(description)i(of)f(what)240 1669 y(the)f(command)g(do)q
-(es.)240 1748 y(Once)h(y)o(ou)e(kno)o(w)g(the)h(name)g(of)f(the)h(command,)f
-(simply)i(place)g(the)f(name)f(of)h(the)f(k)o(ey)h(y)o(ou)f(wish)240
-1810 y(to)g(bind)j(the)e(command)g(to,)f(a)g(colon,)i(and)f(then)g(the)g
-(name)g(of)g(the)g(command)g(on)g(a)f(line)j(in)f(the)240 1872
-y(init)h(\014le.)22 b(The)16 b(name)g(of)f(the)h(k)o(ey)f(can)h(b)q(e)g
-(expressed)h(in)f(di\013eren)o(t)g(w)o(a)o(ys,)f(dep)q(ending)i(on)f(whic)o
-(h)240 1934 y(is)g(most)e(comfortable)h(for)g(y)o(ou.)240 2012
-y Fj(k)o(eyname)s Fo(:)k Fj(function-name)g Fo(or)c Fj(macro)480
-2075 y(k)o(eyname)j Fo(is)d(the)h(name)f(of)g(a)g(k)o(ey)g(sp)q(elled)i(out)e
-(in)h(English.)21 b(F)l(or)15 b(example:)600 2140 y Fn(Control-u:)22
-b(universal-argument)600 2190 y(Meta-Rubout:)g(backward-kill-word)600
-2240 y(Control-o:)g(">&output")480 2318 y Fo(In)12 b(the)g(ab)q(o)o(v)o(e)f
-(example,)h(`)p Fn(C-u)p Fo(')f(is)h(b)q(ound)g(to)f(the)h(function)g
-Fn(universal-argument)p Fo(,)480 2380 y(and)h(`)p Fn(C-o)p
-Fo(')f(is)h(b)q(ound)h(to)f(run)g(the)g(macro)f(expressed)i(on)f(the)g(righ)o
-(t)g(hand)g(side)h(\(that)480 2442 y(is,)h(to)g(insert)h(the)f(text)g(`)p
-Fn(>&output)p Fo(')e(in)o(to)i(the)g(line\).)240 2521 y Fn(")p
-Fj(k)o(eyseq)q Fn(")p Fo(:)20 b Fj(function-name)e Fo(or)d
-Fj(macro)480 2583 y(k)o(eyseq)j Fo(di\013ers)f(from)f Fj(k)o(eyname)k
-Fo(ab)q(o)o(v)o(e)c(in)i(that)e(strings)h(denoting)h(an)f(en)o(tire)g(k)o(ey)
-480 2645 y(sequence)i(can)f(b)q(e)h(sp)q(eci\014ed,)i(b)o(y)d(placing)h(the)f
-(k)o(ey)g(sequence)h(in)g(double)h(quotes.)p eop
-%%Page: 7 9
-8 bop 0 -83 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1227
-b(7)480 158 y(Some)18 b(GNU)g(Emacs)f(st)o(yle)h(k)o(ey)g(escap)q(es)g(can)g
-(b)q(e)h(used,)g(as)e(in)i(the)f(follo)o(wing)h(ex-)480 221
-y(ample,)c(but)h(the)f(sp)q(ecial)i(c)o(haracter)e(names)g(are)g(not)f
-(recognized.)600 283 y Fn("\\C-u":)23 b(universal-argument)600
-333 y("\\C-x\\C-r":)f(re-read-init-file)600 383 y("\\e[11~":)h("Function)f
-(Key)i(1")480 457 y Fo(In)13 b(the)g(ab)q(o)o(v)o(e)g(example,)g(`)p
-Fn(C-u)p Fo(')f(is)h(b)q(ound)h(to)e(the)h(function)g Fn(universal-argument)
-480 519 y Fo(\(just)g(as)f(it)i(w)o(as)e(in)i(the)f(\014rst)g(example\),)h(`)
-p Fn(C-x)g(C-r)p Fo(')f(is)g(b)q(ound)i(to)d(the)h(function)h
-Fn(re-)480 582 y(read-init-file)p Fo(,)g(and)i(`)p Fn(ESC)e([)h(1)g(1)g(~)p
-Fo(')h(is)g(b)q(ound)h(to)f(insert)g(the)g(text)f(`)p Fn(Function)480
-644 y(Key)g(1)p Fo('.)24 b(The)18 b(follo)o(wing)f(escap)q(e)h(sequences)g
-(are)f(a)o(v)m(ailable)i(when)e(sp)q(ecifying)i(k)o(ey)480
-706 y(sequences:)480 793 y Fn(\\C-)168 b Fo(con)o(trol)15 b(pre\014x)480
-881 y Fn(\\M-)168 b Fo(meta)15 b(pre\014x)480 968 y Fn(\\e)192
-b Fo(an)15 b(escap)q(e)h(c)o(haracter)480 1055 y Fn(\\\\)192
-b Fo(bac)o(kslash)480 1142 y Fn(\\")g(")480 1229 y(\\')g(')480
-1317 y Fo(When)14 b(en)o(tering)h(the)f(text)f(of)h(a)f(macro,)g(single)j(or)
-d(double)i(quotes)f(should)h(b)q(e)f(used)480 1379 y(to)g(indicate)j(a)e
-(macro)f(de\014nition.)22 b(Unquoted)15 b(text)g(is)g(assumed)g(to)g(b)q(e)g
-(a)g(function)480 1441 y(name.)27 b(Bac)o(kslash)18 b(will)h(quote)e(an)o(y)g
-(c)o(haracter)g(in)h(the)g(macro)f(text,)g(including)j Fn(")480
-1503 y Fo(and)c Fn(')p Fo(.)22 b(F)l(or)16 b(example,)h(the)f(follo)o(wing)h
-(binding)h(will)f(mak)o(e)f Fn(C-x)f(\\)g Fo(insert)i(a)f(single)480
-1566 y Fn(\\)f Fo(in)o(to)g(the)g(line:)600 1628 y Fn("\\C-x\\\\":)23
-b("\\\\")0 1836 y Fi(1.3.2)30 b(Conditional)15 b(Init)g(Constructs)62
-1973 y Fo(Readline)j(implemen)o(ts)e(a)f(facilit)o(y)h(similar)g(in)g(spirit)
-g(to)f(the)g(conditional)i(compilation)f(features)f(of)g(the)g(C)0
-2035 y(prepro)q(cessor)f(whic)o(h)h(allo)o(ws)f(k)o(ey)g(bindings)h(and)f(v)m
-(ariable)i(settings)e(to)f(b)q(e)h(p)q(erformed)h(as)e(the)h(result)g(of)g
-(tests.)0 2097 y(There)h(are)g(three)h(parser)e(directiv)o(es)j(used.)0
-2247 y Fn($if)168 b Fo(The)14 b Fn($if)e Fo(construct)h(allo)o(ws)h(bindings)
-h(to)e(b)q(e)h(made)f(based)h(on)f(the)h(editing)g(mo)q(de,)g(the)f(terminal)
-240 2309 y(b)q(eing)k(used,)e(or)g(the)g(application)i(using)f(Readline.)22
-b(The)16 b(text)f(of)g(the)g(test)g(extends)g(to)g(the)g(end)240
-2371 y(of)g(the)g(line;)i(no)e(c)o(haracters)f(are)h(required)h(to)f(isolate)
-g(it.)240 2458 y Fn(mode)144 b Fo(The)19 b Fn(mode=)f Fo(form)g(of)h(the)g
-Fn($if)f Fo(directiv)o(e)i(is)f(used)h(to)e(test)g(whether)h(Readline)i(is)
-480 2521 y(in)h Fn(emacs)f Fo(or)f Fn(vi)h Fo(mo)q(de.)38 b(This)22
-b(ma)o(y)f(b)q(e)h(used)g(in)g(conjunction)g(with)f(the)h(`)p
-Fn(set)480 2583 y(keymap)p Fo(')d(command,)i(for)e(instance,)j(to)d(set)h
-(bindings)i(in)f(the)f Fn(emacs-standard)480 2645 y Fo(and)15
-b Fn(emacs-ctlx)f Fo(k)o(eymaps)h(only)h(if)f(Readline)j(is)e(starting)e(out)
-h(in)h Fn(emacs)f Fo(mo)q(de.)p eop
-%%Page: 8 10
-9 bop 0 -83 a Fo(8)1472 b(GNU)15 b(Readline)i(Library)240 158
-y Fn(term)144 b Fo(The)21 b Fn(term=)f Fo(form)g(ma)o(y)h(b)q(e)g(used)h(to)e
+841 y(v)m(alue)f(is)g(`)p Fq(on)p Fr('.)240 938 y Fq
+(disable-completion)480 1000 y Fr(If)e(set)f(to)g(`)p
+Fq(On)p Fr(',)f(readline)j(will)h(inhibit)f(w)o(ord)e(completion.)20
+b(Completion)15 b(c)o(haracters)480 1063 y(will)h(b)q(e)g(inserted)g
+(in)o(to)e(the)h(line)i(as)d(if)h(they)g(had)g(b)q(een)h(mapp)q(ed)g
+(to)e Fq(self-insert)p Fr(.)480 1125 y(The)h(default)h(is)g(`)p
+Fq(off)p Fr('.)240 1222 y Fq(editing-mode)480 1285 y
+Fr(The)d Fq(editing-mode)e Fr(v)m(ariable)j(con)o(trols)e(whic)o(h)h
+(editing)h(mo)q(de)f(y)o(ou)f(are)g(using.)20 b(By)480
+1347 y(default,)f(Readline)h(starts)c(up)i(in)h(Emacs)e(editing)i(mo)q
+(de,)f(where)g(the)g(k)o(eystrok)o(es)480 1409 y(are)g(most)f(similar)i
+(to)e(Emacs.)27 b(This)19 b(v)m(ariable)g(can)f(b)q(e)h(set)e(to)g
+(either)i(`)p Fq(emacs)p Fr(')d(or)480 1471 y(`)p Fq(vi)p
+Fr('.)240 1569 y Fq(enable-keypad)480 1631 y Fr(When)g(set)g(to)f(`)p
+Fq(on)p Fr(',)g(readline)j(will)f(try)e(to)h(enable)h(the)f
+(application)h(k)o(eypad)f(when)480 1693 y(it)f(is)g(called.)22
+b(Some)15 b(systems)f(need)i(this)f(to)f(enable)i(the)f(arro)o(w)f(k)o
+(eys.)19 b(The)c(default)480 1755 y(is)h(`)p Fq(off)p
+Fr('.)240 1853 y Fq(expand-tilde)480 1915 y Fr(If)i(set)f(to)f(`)p
+Fq(on)p Fr(',)h(tilde)h(expansion)h(is)e(p)q(erformed)h(when)g
+(Readline)h(attempts)e(w)o(ord)480 1977 y(completion.)k(The)15
+b(default)h(is)g(`)p Fq(off)p Fr('.)240 2075 y Fq
+(horizontal-scroll-mode)480 2137 y Fr(This)j(v)m(ariable)h(can)e(b)q(e)
+i(set)e(to)g(either)h(`)p Fq(on)p Fr(')e(or)h(`)p Fq(off)p
+Fr('.)28 b(Setting)19 b(it)g(to)f(`)p Fq(on)p Fr(')f(means)480
+2199 y(that)f(the)h(text)f(of)h(the)f(lines)j(that)d(y)o(ou)g(edit)i
+(will)g(scroll)g(horizon)o(tally)f(on)g(a)g(single)480
+2261 y(screen)h(line)h(when)f(they)f(are)g(longer)h(than)f(the)g(width)
+h(of)f(the)g(screen,)h(instead)g(of)480 2324 y(wrapping)e(on)o(to)e(a)h
+(new)g(screen)h(line.)21 b(By)16 b(default,)f(this)h(v)m(ariable)g(is)g
+(set)f(to)g(`)p Fq(off)p Fr('.)240 2421 y Fq(keymap)96
+b Fr(Sets)13 b(Readline's)i(idea)e(of)g(the)g(curren)o(t)f(k)o(eymap)h
+(for)f(k)o(ey)h(binding)i(commands.)k(Ac-)480 2483 y(ceptable)d
+Fq(keymap)e Fr(names)h(are)g Fq(emacs)p Fr(,)f Fq(emacs-standard)p
+Fr(,)f Fq(emacs-meta)p Fr(,)g Fq(emacs-)480 2545 y(ctlx)p
+Fr(,)18 b Fq(vi)p Fr(,)h Fq(vi-command)p Fr(,)e(and)i
+Fq(vi-insert)p Fr(.)28 b Fq(vi)18 b Fr(is)h(equiv)m(alen)o(t)h(to)e
+Fq(vi-command)p Fr(;)480 2608 y Fq(emacs)d Fr(is)i(equiv)m(alen)o(t)h
+(to)d Fq(emacs-standard)p Fr(.)20 b(The)d(default)f(v)m(alue)i(is)e
+Fq(emacs)p Fr(.)22 b(The)480 2670 y(v)m(alue)16 b(of)f(the)g
+Fq(editing-mode)f Fr(v)m(ariable)j(also)e(a\013ects)f(the)h(default)h
+(k)o(eymap.)p eop
+7 8 bop 0 -58 a Fr(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1227
+b(7)240 183 y Fq(mark-directories)480 246 y Fr(If)22
+b(set)g(to)g(`)p Fq(on)p Fr(',)g(completed)h(directory)f(names)h(ha)o
+(v)o(e)e(a)h(slash)h(app)q(ended.)42 b(The)480 308 y(default)16
+b(is)f(`)p Fq(on)p Fr('.)240 388 y Fq(mark-modified-lines)480
+450 y Fr(This)f(v)m(ariable,)h(when)e(set)g(to)g(`)p
+Fq(on)p Fr(',)f(sa)o(ys)h(to)g(displa)o(y)h(an)f(asterisk)g(\(`)p
+Fq(*)p Fr('\))f(at)h(the)g(start)480 512 y(of)f(history)h(lines)h(whic)
+o(h)f(ha)o(v)o(e)f(b)q(een)i(mo)q(di\014ed.)21 b(This)13
+b(v)m(ariable)h(is)f(`)p Fq(off)p Fr(')e(b)o(y)i(default.)240
+593 y Fq(input-meta)480 655 y Fr(If)21 b(set)g(to)g(`)p
+Fq(on)p Fr(',)g(Readline)i(will)g(enable)g(eigh)o(t-bit)f(input)g(\(it)
+f(will)i(not)d(strip)i(the)480 717 y(eigh)o(th)e(bit)f(from)f(the)i(c)o
+(haracters)e(it)h(reads\),)h(regardless)f(of)f(what)h(the)g(terminal)
+480 779 y(claims)d(it)g(can)f(supp)q(ort.)21 b(The)15
+b(default)h(v)m(alue)h(is)e(`)p Fq(off)p Fr('.)20 b(The)15
+b(name)g Fq(meta-flag)f Fr(is)480 842 y(a)h(synon)o(ym)g(for)f(this)i
+(v)m(ariable.)240 922 y Fq(output-meta)480 984 y Fr(If)11
+b(set)f(to)g(`)p Fq(on)p Fr(',)g(Readline)j(will)g(displa)o(y)e(c)o
+(haracters)f(with)h(the)g(eigh)o(th)g(bit)g(set)g(directly)480
+1046 y(rather)k(than)g(as)f(a)h(meta-pre\014xed)h(escap)q(e)g
+(sequence.)21 b(The)16 b(default)f(is)h(`)p Fq(off)p
+Fr('.)240 1126 y Fq(show-all-if-ambiguous)480 1189 y
+Fr(This)f(alters)f(the)h(default)g(b)q(eha)o(vior)g(of)f(the)h
+(completion)g(functions.)21 b(If)14 b(set)h(to)e(`)p
+Fq(on)p Fr(',)480 1251 y(w)o(ords)18 b(whic)o(h)i(ha)o(v)o(e)f(more)f
+(than)h(one)g(p)q(ossible)i(completion)f(cause)f(the)g(matc)o(hes)480
+1313 y(to)e(b)q(e)h(listed)h(immediately)g(instead)f(of)f(ringing)i
+(the)e(b)q(ell.)29 b(The)18 b(default)g(v)m(alue)g(is)480
+1375 y(`)p Fq(off)p Fr('.)240 1456 y Fq(visible-stats)480
+1518 y Fr(If)c(set)g(to)f(`)p Fq(on)p Fr(',)f(a)i(c)o(haracter)f
+(denoting)h(a)g(\014le's)g(t)o(yp)q(e)g(is)g(app)q(ended)i(to)d(the)h
+(\014lename)480 1580 y(when)i(listing)g(p)q(ossible)h(completions.)k
+(The)16 b(default)f(is)h(`)p Fq(off)p Fr('.)0 1660 y(Key)g(Bindings)240
+1722 y(The)k(syn)o(tax)f(for)g(con)o(trolling)i(k)o(ey)e(bindings)j(in)
+e(the)g(init)h(\014le)g(is)f(simple.)35 b(First)19 b(y)o(ou)g(ha)o(v)o
+(e)h(to)240 1785 y(kno)o(w)13 b(the)h(name)g(of)f(the)h(command)g(that)
+f(y)o(ou)g(w)o(an)o(t)g(to)g(c)o(hange.)20 b(The)14 b(follo)o(wing)g
+(pages)g(con)o(tain)240 1847 y(tables)i(of)f(the)h(command)g(name,)f
+(the)h(default)g(k)o(eybinding,)i(and)e(a)f(short)g(description)i(of)f
+(what)240 1909 y(the)f(command)g(do)q(es.)240 1980 y(Once)h(y)o(ou)e
+(kno)o(w)g(the)h(name)g(of)f(the)h(command,)f(simply)i(place)g(the)f
+(name)f(of)h(the)f(k)o(ey)h(y)o(ou)f(wish)240 2043 y(to)g(bind)j(the)e
+(command)g(to,)f(a)g(colon,)i(and)f(then)g(the)g(name)g(of)g(the)g
+(command)g(on)g(a)f(line)j(in)f(the)240 2105 y(init)h(\014le.)22
+b(The)16 b(name)g(of)f(the)h(k)o(ey)f(can)h(b)q(e)g(expressed)h(in)f
+(di\013eren)o(t)g(w)o(a)o(ys,)f(dep)q(ending)i(on)f(whic)o(h)240
+2167 y(is)g(most)e(comfortable)h(for)g(y)o(ou.)240 2247
+y Fl(k)o(eyname)s Fr(:)k Fl(function-name)g Fr(or)c Fl(macro)480
+2310 y(k)o(eyname)j Fr(is)d(the)h(name)f(of)g(a)g(k)o(ey)g(sp)q(elled)i
+(out)e(in)h(English.)21 b(F)l(or)15 b(example:)600 2370
+y Fq(Control-u:)22 b(universal-argument)600 2422 y(Meta-Rubout:)g
+(backward-kill-word)600 2474 y(Control-o:)g(">)i(output")480
+2545 y Fr(In)12 b(the)g(ab)q(o)o(v)o(e)f(example,)h(`)p
+Fq(C-u)p Fr(')f(is)h(b)q(ound)g(to)f(the)h(function)g
+Fq(universal-argument)p Fr(,)480 2608 y(and)h(`)p Fq(C-o)p
+Fr(')f(is)h(b)q(ound)h(to)f(run)g(the)g(macro)f(expressed)i(on)f(the)g
+(righ)o(t)g(hand)g(side)h(\(that)480 2670 y(is,)h(to)g(insert)h(the)f
+(text)g(`)p Fq(>)f(output)p Fr(')g(in)o(to)h(the)h(line\).)p
+eop
+8 9 bop 0 -58 a Fr(8)1472 b(GNU)15 b(Readline)i(Library)240
+183 y Fq(")p Fl(k)o(eyseq)q Fq(")p Fr(:)j Fl(function-name)e
+Fr(or)d Fl(macro)480 246 y(k)o(eyseq)j Fr(di\013ers)f(from)f
+Fl(k)o(eyname)k Fr(ab)q(o)o(v)o(e)c(in)i(that)e(strings)h(denoting)h
+(an)f(en)o(tire)g(k)o(ey)480 308 y(sequence)i(can)f(b)q(e)h(sp)q
+(eci\014ed,)i(b)o(y)d(placing)h(the)f(k)o(ey)g(sequence)h(in)g(double)h
+(quotes.)480 370 y(Some)e(GNU)g(Emacs)f(st)o(yle)h(k)o(ey)g(escap)q(es)
+g(can)g(b)q(e)h(used,)g(as)e(in)i(the)f(follo)o(wing)h(ex-)480
+432 y(ample,)c(but)h(the)f(sp)q(ecial)i(c)o(haracter)e(names)g(are)g
+(not)f(recognized.)600 499 y Fq("\\C-u":)23 b(universal-argument)600
+551 y("\\C-x\\C-r":)f(re-read-init-file)600 603 y("\\e[11~":)h
+("Function)f(Key)i(1")480 681 y Fr(In)13 b(the)g(ab)q(o)o(v)o(e)g
+(example,)g(`)p Fq(C-u)p Fr(')f(is)h(b)q(ound)h(to)e(the)h(function)g
+Fq(universal-argument)480 743 y Fr(\(just)g(as)f(it)i(w)o(as)e(in)i
+(the)f(\014rst)g(example\),)h(`)p Fq(C-x)g(C-r)p Fr(')f(is)g(b)q(ound)i
+(to)d(the)h(function)h Fq(re-)480 805 y(read-init-file)p
+Fr(,)g(and)i(`)p Fq(ESC)e([)h(1)g(1)g(~)p Fr(')h(is)g(b)q(ound)h(to)f
+(insert)g(the)g(text)f(`)p Fq(Function)480 867 y(Key)g(1)p
+Fr('.)24 b(The)18 b(follo)o(wing)f(escap)q(e)h(sequences)g(are)f(a)o(v)
+m(ailable)i(when)e(sp)q(ecifying)i(k)o(ey)480 930 y(sequences:)480
+1022 y Fq(\\C-)168 b Fr(con)o(trol)15 b(pre\014x)480
+1115 y Fq(\\M-)168 b Fr(meta)15 b(pre\014x)480 1208 y
+Fq(\\e)192 b Fr(an)15 b(escap)q(e)h(c)o(haracter)480
+1300 y Fq(\\\\)192 b Fr(bac)o(kslash)480 1393 y Fq(\\")g(")480
+1485 y(\\')g(')480 1578 y Fr(When)14 b(en)o(tering)h(the)f(text)f(of)h
+(a)f(macro,)g(single)j(or)d(double)i(quotes)f(should)h(b)q(e)f(used)480
+1640 y(to)g(indicate)j(a)e(macro)f(de\014nition.)22 b(Unquoted)15
+b(text)g(is)g(assumed)g(to)g(b)q(e)g(a)g(function)480
+1703 y(name.)21 b(Bac)o(kslash)16 b(will)h(quote)f(an)o(y)f(c)o
+(haracter)g(in)h(the)g(macro)f(text,)g(including)j(`)p
+Fq(")p Fr(')480 1765 y(and)12 b(`)p Fq(')p Fr('.)18 b(F)l(or)11
+b(example,)i(the)f(follo)o(wing)g(binding)i(will)f(mak)o(e)e(`)p
+Fq(C-x)k(\\)p Fr(')c(insert)h(a)g(single)480 1827 y(`)p
+Fq(\\)p Fr(')i(in)o(to)h(the)h(line:)600 1894 y Fq("\\C-x\\\\":)23
+b("\\\\")0 2126 y Fk(1.3.2)30 b(Conditional)15 b(Init)g(Constructs)62
+2266 y Fr(Readline)j(implemen)o(ts)e(a)f(facilit)o(y)h(similar)g(in)g
+(spirit)g(to)f(the)g(conditional)i(compilation)f(features)f(of)g(the)g
+(C)0 2328 y(prepro)q(cessor)f(whic)o(h)h(allo)o(ws)f(k)o(ey)g(bindings)
+h(and)f(v)m(ariable)i(settings)e(to)f(b)q(e)h(p)q(erformed)h(as)e(the)h
+(result)g(of)g(tests.)0 2391 y(There)h(are)g(three)h(parser)e(directiv)
+o(es)j(used.)0 2545 y Fq($if)168 b Fr(The)14 b Fq($if)e
+Fr(construct)h(allo)o(ws)h(bindings)h(to)e(b)q(e)h(made)f(based)h(on)f
+(the)h(editing)g(mo)q(de,)g(the)f(terminal)240 2608 y(b)q(eing)k(used,)
+e(or)g(the)g(application)i(using)f(Readline.)22 b(The)16
+b(text)f(of)g(the)g(test)g(extends)g(to)g(the)g(end)240
+2670 y(of)g(the)g(line;)i(no)e(c)o(haracters)f(are)h(required)h(to)f
+(isolate)g(it.)p eop
+9 10 bop 0 -58 a Fr(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1227
+b(9)240 183 y Fq(mode)144 b Fr(The)19 b Fq(mode=)f Fr(form)g(of)h(the)g
+Fq($if)f Fr(directiv)o(e)i(is)f(used)h(to)e(test)g(whether)h(Readline)i
+(is)480 246 y(in)h Fq(emacs)f Fr(or)f Fq(vi)h Fr(mo)q(de.)38
+b(This)22 b(ma)o(y)f(b)q(e)h(used)g(in)g(conjunction)g(with)f(the)h(`)p
+Fq(set)480 308 y(keymap)p Fr(')d(command,)i(for)e(instance,)j(to)d(set)
+h(bindings)i(in)f(the)f Fq(emacs-standard)480 370 y Fr(and)15
+b Fq(emacs-ctlx)f Fr(k)o(eymaps)h(only)h(if)f(Readline)j(is)e(starting)
+e(out)h(in)h Fq(emacs)f Fr(mo)q(de.)240 457 y Fq(term)144
+b Fr(The)21 b Fq(term=)f Fr(form)g(ma)o(y)h(b)q(e)g(used)h(to)e
(include)j(terminal-sp)q(eci\014c)h(k)o(ey)c(bindings,)480
-221 y(p)q(erhaps)15 b(to)f(bind)j(the)d(k)o(ey)h(sequences)h(output)e(b)o(y)h
-(the)g(terminal's)g(function)h(k)o(eys.)480 283 y(The)f(w)o(ord)g(on)f(the)i
-(righ)o(t)e(side)i(of)f(the)g(`)p Fn(=)p Fo(')f(is)h(tested)g(against)g(the)g
-(full)h(name)f(of)g(the)480 345 y(terminal)k(and)g(the)g(p)q(ortion)g(of)f
-(the)h(terminal)g(name)g(b)q(efore)g(the)g(\014rst)f(`)p Fn(-)p
-Fo('.)29 b(This)480 407 y(allo)o(ws)15 b Fj(sun)h Fo(to)e(matc)o(h)h(b)q(oth)
-g Fj(sun)h Fo(and)f Fj(sun-cmd)p Fo(,)h(for)f(instance.)240
-485 y Fn(application)480 547 y Fo(The)j Fj(application)i Fo(construct)e(is)g
-(used)h(to)e(include)k(application-sp)q(eci\014c)g(settings.)480
-610 y(Eac)o(h)d(program)g(using)h(the)f(Readline)j(library)e(sets)f(the)h
-Fj(application)h(name)p Fo(,)f(and)480 672 y(y)o(ou)c(can)h(test)f(for)g(it.)
-21 b(This)16 b(could)g(b)q(e)h(used)f(to)e(bind)j(k)o(ey)f(sequences)g(to)f
-(functions)480 734 y(useful)h(for)e(a)h(sp)q(eci\014c)i(program.)h(F)l(or)d
-(instance,)g(the)g(follo)o(wing)h(command)e(adds)h(a)480 796
-y(k)o(ey)g(sequence)h(that)f(quotes)g(the)g(curren)o(t)g(or)g(previous)h(w)o
-(ord)e(in)i(Bash:)600 862 y Fn($if)23 b(bash)600 911 y(#)h(Quote)f(the)g
-(current)g(or)h(previous)f(word)600 961 y("\\C-xq":)g("\\eb\\"\\ef\\"")600
-1011 y($endif)0 1104 y($endif)96 b Fo(This)16 b(command,)e(as)h(y)o(ou)g(sa)o
-(w)g(in)h(the)f(previous)h(example,)f(terminates)h(an)f Fn($if)f
-Fo(command.)0 1197 y Fn($else)120 b Fo(Commands)15 b(in)h(this)f(branc)o(h)h
-(of)e(the)i Fn($if)e Fo(directiv)o(e)j(are)e(executed)h(if)g(the)f(test)g
-(fails.)0 1447 y Fm(1.4)33 b(Bindable)16 b(Readline)h(Commands)0
-1681 y Fi(1.4.1)30 b(Commands)15 b(F)-5 b(or)15 b(Mo)n(ving)0
-1821 y Fn(beginning-of-line)e(\(C-a\))240 1883 y Fo(Mo)o(v)o(e)h(to)h(the)g
-(start)f(of)h(the)g(curren)o(t)g(line.)0 1961 y Fn(end-of-line)f(\(C-e\))240
-2023 y Fo(Mo)o(v)o(e)g(to)h(the)g(end)h(of)f(the)g(line.)0
-2101 y Fn(forward-char)f(\(C-f\))240 2163 y Fo(Mo)o(v)o(e)g(forw)o(ard)g(a)h
-(c)o(haracter.)0 2241 y Fn(backward-char)e(\(C-b\))240 2303
-y Fo(Mo)o(v)o(e)h(bac)o(k)h(a)g(c)o(haracter.)0 2381 y Fn(forward-word)f
-(\(M-f\))240 2443 y Fo(Mo)o(v)o(e)g(forw)o(ard)g(to)h(the)g(end)h(of)f(the)g
-(next)g(w)o(ord.)k(W)l(ords)c(are)g(comp)q(osed)h(of)e(letters)i(and)f
-(digits.)0 2521 y Fn(backward-word)e(\(M-b\))240 2583 y Fo(Mo)o(v)o(e)j(bac)o
-(k)g(to)g(the)h(start)f(of)g(this,)h(or)g(the)f(previous,)i(w)o(ord.)24
-b(W)l(ords)16 b(are)g(comp)q(osed)i(of)e(letters)240 2645 y(and)f(digits.)p
+519 y(p)q(erhaps)15 b(to)f(bind)j(the)d(k)o(ey)h(sequences)h(output)e
+(b)o(y)h(the)g(terminal's)g(function)h(k)o(eys.)480 582
+y(The)f(w)o(ord)g(on)f(the)i(righ)o(t)e(side)i(of)f(the)g(`)p
+Fq(=)p Fr(')f(is)h(tested)g(against)g(the)g(full)h(name)f(of)g(the)480
+644 y(terminal)k(and)g(the)g(p)q(ortion)g(of)f(the)h(terminal)g(name)g
+(b)q(efore)g(the)g(\014rst)f(`)p Fq(-)p Fr('.)29 b(This)480
+706 y(allo)o(ws)15 b Fq(sun)g Fr(to)g(matc)o(h)f(b)q(oth)i
+Fq(sun)e Fr(and)i Fq(sun-cmd)p Fr(,)e(for)g(instance.)240
+793 y Fq(application)480 856 y Fr(The)k Fl(application)i
+Fr(construct)e(is)g(used)h(to)e(include)k(application-sp)q(eci\014c)g
+(settings.)480 918 y(Eac)o(h)d(program)g(using)h(the)f(Readline)j
+(library)e(sets)f(the)h Fl(application)h(name)p Fr(,)f(and)480
+980 y(y)o(ou)c(can)h(test)f(for)g(it.)21 b(This)16 b(could)g(b)q(e)h
+(used)f(to)e(bind)j(k)o(ey)f(sequences)g(to)f(functions)480
+1043 y(useful)h(for)e(a)h(sp)q(eci\014c)i(program.)h(F)l(or)d
+(instance,)g(the)g(follo)o(wing)h(command)e(adds)h(a)480
+1105 y(k)o(ey)g(sequence)h(that)f(quotes)g(the)g(curren)o(t)g(or)g
+(previous)h(w)o(ord)e(in)i(Bash:)600 1169 y Fq($if)23
+b(Bash)600 1221 y(#)h(Quote)f(the)g(current)g(or)h(previous)f(word)600
+1273 y("\\C-xq":)g("\\eb\\"\\ef\\"")600 1325 y($endif)0
+1412 y($endif)96 b Fr(This)16 b(command,)e(as)h(y)o(ou)g(sa)o(w)g(in)h
+(the)f(previous)h(example,)f(terminates)h(an)f Fq($if)f
+Fr(command.)0 1499 y Fq($else)120 b Fr(Commands)15 b(in)h(this)f(branc)
+o(h)h(of)e(the)i Fq($if)e Fr(directiv)o(e)j(are)e(executed)h(if)g(the)f
+(test)g(fails.)0 1707 y Fk(1.3.3)30 b(Sample)15 b(Init)g(File)62
+1844 y Fr(Here)20 b(is)f(an)g(example)h(of)f(an)g(inputrc)h(\014le.)33
+b(This)20 b(illustrates)g(k)o(ey)f(binding,)j(v)m(ariable)e(assignmen)o
+(t,)g(and)0 1906 y(conditional)d(syn)o(tax.)p eop
+10 11 bop 0 -58 a Fr(10)1449 b(GNU)15 b(Readline)i(Library)120
+235 y Fq(#)24 b(This)f(file)g(controls)g(the)h(behaviour)e(of)i(line)f
+(input)g(editing)g(for)120 287 y(#)h(programs)e(that)i(use)f(the)h(Gnu)
+f(Readline)g(library.)47 b(Existing)22 b(programs)120
+339 y(#)i(include)f(FTP,)g(Bash,)g(and)h(Gdb.)120 391
+y(#)120 443 y(#)g(You)f(can)h(re-read)f(the)g(inputrc)g(file)g(with)h
+(C-x)f(C-r.)120 495 y(#)h(Lines)f(beginning)g(with)g('#')g(are)h
+(comments.)120 546 y(#)120 598 y(#)g(Set)f(various)g(bindings)g(for)g
+(emacs)g(mode.)120 702 y(set)g(editing-mode)g(emacs)120
+806 y($if)g(mode=emacs)120 910 y(Meta-Control-h:)46 b
+(backward-kill-word)21 b(Text)i(after)h(the)f(function)g(name)g(is)h
+(ignored)120 1013 y(#)120 1065 y(#)g(Arrow)f(keys)g(in)h(keypad)f(mode)
+120 1117 y(#)120 1169 y(#"\\M-OD":)190 b(backward-char)120
+1221 y(#"\\M-OC":)g(forward-char)120 1273 y(#"\\M-OA":)g
+(previous-history)120 1325 y(#"\\M-OB":)g(next-history)120
+1377 y(#)120 1429 y(#)24 b(Arrow)f(keys)g(in)h(ANSI)f(mode)120
+1480 y(#)120 1532 y("\\M-[D":)190 b(backward-char)120
+1584 y("\\M-[C":)g(forward-char)120 1636 y("\\M-[A":)g
+(previous-history)120 1688 y("\\M-[B":)g(next-history)120
+1740 y(#)120 1792 y(#)24 b(Arrow)f(keys)g(in)h(8)g(bit)f(keypad)g(mode)
+120 1844 y(#)120 1896 y(#"\\M-\\C-OD":)165 b(backward-char)120
+1947 y(#"\\M-\\C-OC":)g(forward-char)120 1999 y(#"\\M-\\C-OA":)g
+(previous-history)120 2051 y(#"\\M-\\C-OB":)g(next-history)120
+2103 y(#)120 2155 y(#)24 b(Arrow)f(keys)g(in)h(8)g(bit)f(ANSI)g(mode)
+120 2207 y(#)120 2259 y(#"\\M-\\C-[D":)165 b(backward-char)120
+2311 y(#"\\M-\\C-[C":)g(forward-char)120 2363 y(#"\\M-\\C-[A":)g
+(previous-history)120 2414 y(#"\\M-\\C-[B":)g(next-history)120
+2518 y(C-q:)23 b(quoted-insert)120 2622 y($endif)p eop
+11 12 bop 0 -58 a Fr(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1205
+b(11)120 235 y Fq(#)24 b(An)f(old-style)g(binding.)47
+b(This)23 b(happens)g(to)g(be)h(the)f(default.)120 287
+y(TAB:)g(complete)120 391 y(#)h(Macros)f(that)g(are)h(convenient)e(for)
+h(shell)h(interaction)120 443 y($if)f(Bash)120 495 y(#)h(edit)f(the)g
+(path)120 546 y("\\C-xp":)g("PATH=${PATH}\\e\\C-e\\C-a\\)o(ef\\C-f")120
+598 y(#)h(prepare)f(to)g(type)h(a)f(quoted)g(word)h(--)f(insert)g(open)
+h(and)f(close)g(double)g(quotes)120 650 y(#)h(and)f(move)g(to)h(just)f
+(after)h(the)f(open)g(quote)120 702 y("\\C-x\\"":)g("\\"\\"\\C-b")120
+754 y(#)h(insert)f(a)g(backslash)g(\(testing)g(backslash)g(escapes)f
+(in)i(sequences)f(and)g(macros\))120 806 y("\\C-x\\\\":)g("\\\\")120
+858 y(#)h(Quote)f(the)g(current)g(or)h(previous)f(word)120
+910 y("\\C-xq":)g("\\eb\\"\\ef\\"")120 962 y(#)h(Add)f(a)h(binding)f
+(to)g(refresh)g(the)h(line,)f(which)g(is)h(unbound)120
+1013 y("\\C-xr":)f(redraw-current-line)120 1065 y(#)h(Edit)f(variable)g
+(on)g(current)g(line.)120 1117 y("\\M-\\C-v":)f
+("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-a\\C-y=)o(")120 1169 y($endif)120
+1273 y(#)i(use)f(a)h(visible)f(bell)g(if)h(one)f(is)h(available)120
+1325 y(set)f(bell-style)g(visible)120 1429 y(#)h(don't)f(strip)g
+(characters)g(to)g(7)h(bits)f(when)h(reading)120 1480
+y(set)f(input-meta)g(on)120 1584 y(#)h(allow)f(iso-latin1)f(characters)
+h(to)g(be)h(inserted)f(rather)g(than)g(converted)g(to)120
+1636 y(#)h(prefix-meta)e(sequences)120 1688 y(set)h(convert-meta)g(off)
+120 1792 y(#)h(display)f(characters)f(with)h(the)h(eighth)f(bit)g(set)h
+(directly)f(rather)g(than)120 1844 y(#)h(as)f(meta-prefixed)f
+(characters)120 1896 y(set)h(output-meta)g(on)120 1999
+y(#)h(if)f(there)g(are)h(more)f(than)h(150)f(possible)g(completions)f
+(for)i(a)f(word,)h(ask)f(the)120 2051 y(#)h(user)f(if)h(he)f(wants)g
+(to)h(see)f(all)h(of)f(them)120 2103 y(set)g(completion-query-items)e
+(150)120 2207 y(#)j(For)f(FTP)120 2259 y($if)g(Ftp)120
+2311 y("\\C-xg":)g("get)g(\\M-?")120 2363 y("\\C-xt":)g("put)g(\\M-?")
+120 2414 y("\\M-.":)g(yank-last-arg)120 2466 y($endif)p
eop
-%%Page: 9 11
-10 bop 0 -83 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1227
-b(9)0 158 y Fn(clear-screen)14 b(\(C-l\))240 221 y Fo(Clear)h(the)g(screen)g
-(and)g(redra)o(w)f(the)h(curren)o(t)g(line,)h(lea)o(ving)g(the)f(curren)o(t)f
-(line)j(at)d(the)h(top)f(of)h(the)240 283 y(screen.)0 361 y
-Fn(redraw-current-line)e(\(\))240 423 y Fo(Refresh)j(the)f(curren)o(t)g
-(line.)22 b(By)15 b(default,)h(this)f(is)h(un)o(b)q(ound.)0
-663 y Fi(1.4.2)30 b(Commands)15 b(F)-5 b(or)15 b(Manipulating)g(The)g
-(History)0 804 y Fn(accept-line)f(\(Newline,)g(Return\))240
-866 y Fo(Accept)g(the)f(line)i(regardless)e(of)g(where)g(the)g(cursor)g(is.)
-20 b(If)13 b(this)h(line)h(is)e(non-empt)o(y)l(,)h(add)f(it)g(to)g(the)240
-928 y(history)k(list.)25 b(If)17 b(this)g(line)i(w)o(as)c(a)i(history)g
-(line,)h(then)f(restore)f(the)h(history)f(line)j(to)d(its)h(original)240
-990 y(state.)0 1069 y Fn(previous-history)c(\(C-p\))240 1131
-y Fo(Mo)o(v)o(e)h(`up')h(through)g(the)g(history)g(list.)0
-1209 y Fn(next-history)f(\(C-n\))240 1272 y Fo(Mo)o(v)o(e)g(`do)o(wn')g
-(through)h(the)h(history)f(list.)0 1350 y Fn(beginning-of-history)d(\(M-<\))
-240 1412 y Fo(Mo)o(v)o(e)i(to)h(the)g(\014rst)g(line)i(in)f(the)f(history)l
-(.)0 1490 y Fn(end-of-history)e(\(M->\))240 1553 y Fo(Mo)o(v)o(e)h(to)h(the)g
-(end)h(of)f(the)g(input)h(history)l(,)f(i.e.,)g(the)g(line)i(y)o(ou)e(are)g
-(en)o(tering.)0 1631 y Fn(reverse-search-history)d(\(C-r\))240
-1693 y Fo(Searc)o(h)18 b(bac)o(kw)o(ard)f(starting)g(at)g(the)g(curren)o(t)h
-(line)h(and)f(mo)o(ving)f(`up')h(through)f(the)h(history)f(as)240
-1756 y(necessary)l(.)j(This)c(is)g(an)f(incremen)o(tal)h(searc)o(h.)0
-1834 y Fn(forward-search-history)c(\(C-s\))240 1896 y Fo(Searc)o(h)j(forw)o
-(ard)e(starting)h(at)g(the)g(curren)o(t)h(line)h(and)f(mo)o(ving)f(`do)o(wn')
-g(through)g(the)g(the)h(history)240 1958 y(as)g(necessary)l(.)20
-b(This)c(is)g(an)f(incremen)o(tal)h(searc)o(h.)0 2037 y Fn
-(non-incremental-reverse-se)o(arch-hi)o(story)c(\(M-p\))240
-2099 y Fo(Searc)o(h)18 b(bac)o(kw)o(ard)f(starting)g(at)g(the)g(curren)o(t)h
-(line)h(and)f(mo)o(ving)f(`up')h(through)f(the)h(history)f(as)240
-2161 y(necessary)e(using)h(a)f(non-incremen)o(tal)i(searc)o(h)e(for)g(a)f
-(string)i(supplied)h(b)o(y)e(the)h(user.)0 2239 y Fn
-(non-incremental-forward-se)o(arch-hi)o(story)c(\(M-n\))240
-2302 y Fo(Searc)o(h)j(forw)o(ard)e(starting)h(at)g(the)g(curren)o(t)h(line)h
-(and)f(mo)o(ving)f(`do)o(wn')g(through)g(the)g(the)h(history)240
-2364 y(as)g(necessary)g(using)h(a)f(non-incremen)o(tal)i(searc)o(h)e(for)f(a)
-h(string)g(supplied)j(b)o(y)d(the)g(user.)0 2442 y Fn(history-search-forward)
-d(\(\))240 2505 y Fo(Searc)o(h)h(forw)o(ard)f(through)h(the)g(history)g(for)g
-(the)g(string)g(of)g(c)o(haracters)f(b)q(et)o(w)o(een)i(the)f(start)f(of)h
-(the)240 2567 y(curren)o(t)j(line)i(and)e(the)h(curren)o(t)f(p)q(oin)o(t.)23
-b(This)17 b(is)f(a)g(non-incremen)o(tal)i(searc)o(h.)23 b(By)16
-b(default,)h(this)240 2629 y(command)e(is)h(un)o(b)q(ound.)p
+12 13 bop 0 -58 a Fr(12)1449 b(GNU)15 b(Readline)i(Library)0
+183 y Fp(1.4)33 b(Bindable)16 b(Readline)h(Commands)62
+322 y Fr(This)f(section)g(describ)q(es)h(Readline)g(commands)e(that)g
+(ma)o(y)f(b)q(e)i(b)q(ound)g(to)f(k)o(ey)g(sequences.)0
+545 y Fk(1.4.1)30 b(Commands)15 b(F)-5 b(or)15 b(Mo)n(ving)0
+698 y Fq(beginning-of-line)e(\(C-a\))240 760 y Fr(Mo)o(v)o(e)h(to)h
+(the)g(start)f(of)h(the)g(curren)o(t)g(line.)0 851 y
+Fq(end-of-line)f(\(C-e\))240 913 y Fr(Mo)o(v)o(e)g(to)h(the)g(end)h(of)
+f(the)g(line.)0 1003 y Fq(forward-char)f(\(C-f\))240
+1066 y Fr(Mo)o(v)o(e)g(forw)o(ard)g(a)h(c)o(haracter.)0
+1156 y Fq(backward-char)e(\(C-b\))240 1219 y Fr(Mo)o(v)o(e)h(bac)o(k)h
+(a)g(c)o(haracter.)0 1309 y Fq(forward-word)f(\(M-f\))240
+1371 y Fr(Mo)o(v)o(e)g(forw)o(ard)g(to)h(the)g(end)h(of)f(the)g(next)g
+(w)o(ord.)k(W)l(ords)c(are)g(comp)q(osed)h(of)e(letters)i(and)f
+(digits.)0 1462 y Fq(backward-word)e(\(M-b\))240 1524
+y Fr(Mo)o(v)o(e)j(bac)o(k)g(to)g(the)h(start)f(of)g(this,)h(or)g(the)f
+(previous,)i(w)o(ord.)24 b(W)l(ords)16 b(are)g(comp)q(osed)i(of)e
+(letters)240 1587 y(and)f(digits.)0 1677 y Fq(clear-screen)f(\(C-l\))
+240 1739 y Fr(Clear)h(the)g(screen)g(and)g(redra)o(w)f(the)h(curren)o
+(t)g(line,)h(lea)o(ving)g(the)f(curren)o(t)f(line)j(at)d(the)h(top)f
+(of)h(the)240 1802 y(screen.)0 1892 y Fq(redraw-current-line)e(\(\))240
+1955 y Fr(Refresh)j(the)f(curren)o(t)g(line.)22 b(By)15
+b(default,)h(this)f(is)h(un)o(b)q(ound.)0 2177 y Fk(1.4.2)30
+b(Commands)15 b(F)-5 b(or)15 b(Manipulating)g(The)g(History)0
+2330 y Fq(accept-line)f(\(Newline,)g(Return\))240 2393
+y Fr(Accept)g(the)f(line)i(regardless)e(of)g(where)g(the)g(cursor)g
+(is.)20 b(If)13 b(this)h(line)h(is)e(non-empt)o(y)l(,)h(add)f(it)g(to)g
+(the)240 2455 y(history)k(list.)25 b(If)17 b(this)g(line)i(w)o(as)c(a)i
+(history)g(line,)h(then)f(restore)f(the)h(history)f(line)j(to)d(its)h
+(original)240 2517 y(state.)0 2608 y Fq(previous-history)c(\(C-p\))240
+2670 y Fr(Mo)o(v)o(e)h(`up')h(through)g(the)g(history)g(list.)p
eop
-%%Page: 10 12
-11 bop 0 -83 a Fo(10)1449 b(GNU)15 b(Readline)i(Library)0 158
-y Fn(history-search-backward)12 b(\(\))240 221 y Fo(Searc)o(h)k(bac)o(kw)o
-(ard)g(through)g(the)g(history)g(for)g(the)g(string)g(of)g(c)o(haracters)g(b)
-q(et)o(w)o(een)g(the)g(start)f(of)240 283 y(the)i(curren)o(t)g(line)h(and)f
-(the)g(curren)o(t)g(p)q(oin)o(t.)25 b(This)17 b(is)g(a)g(non-incremen)o(tal)h
-(searc)o(h.)25 b(By)17 b(default,)240 345 y(this)f(command)f(is)g(un)o(b)q
-(ound.)0 425 y Fn(yank-nth-arg)f(\(M-C-y\))240 487 y Fo(Insert)19
-b(the)g(\014rst)f(argumen)o(t)g(to)g(the)h(previous)g(command)g(\(usually)g
-(the)g(second)g(w)o(ord)f(on)h(the)240 550 y(previous)e(line\).)23
-b(With)16 b(an)g(argumen)o(t)f Fj(n)p Fo(,)h(insert)h(the)f
-Fj(n)p Fo(th)g(w)o(ord)f(from)g(the)h(previous)h(command)240
-612 y(\(the)d(w)o(ords)g(in)h(the)g(previous)g(command)f(b)q(egin)i(with)f(w)
-o(ord)f(0\).)19 b(A)14 b(negativ)o(e)h(argumen)o(t)f(inserts)240
-674 y(the)h Fj(n)p Fo(th)h(w)o(ord)e(from)h(the)g(end)h(of)e(the)i(previous)g
-(command.)0 754 y Fn(yank-last-arg)d(\(M-.,)i(M-_\))240 816
-y Fo(Insert)k(last)g(argumen)o(t)g(to)f(the)h(previous)h(command)f(\(the)g
-(last)g(w)o(ord)f(on)h(the)g(previous)h(line\).)240 879 y(With)15
-b(an)h(argumen)o(t,)e(b)q(eha)o(v)o(e)h(exactly)h(lik)o(e)g
-Fn(yank-nth-arg)p Fo(.)0 1134 y Fi(1.4.3)30 b(Commands)15 b(F)-5
-b(or)15 b(Changing)g(T)-5 b(ext)0 1276 y Fn(delete-char)14
-b(\(C-d\))240 1338 y Fo(Delete)f(the)f(c)o(haracter)f(under)i(the)f(cursor.)
-19 b(If)12 b(the)g(cursor)g(is)g(at)g(the)g(b)q(eginning)i(of)e(the)g(line,)i
-(there)240 1400 y(are)k(no)g(c)o(haracters)g(in)h(the)g(line,)h(and)f(the)f
-(last)g(c)o(haracter)g(t)o(yp)q(ed)h(w)o(as)e(not)h(C-d,)h(then)g(return)240
-1463 y(EOF.)0 1543 y Fn(backward-delete-char)12 b(\(Rubout\))240
-1605 y Fo(Delete)g(the)f(c)o(haracter)f(b)q(ehind)j(the)e(cursor.)18
-b(A)11 b(n)o(umeric)h(arg)e(sa)o(ys)g(to)g(kill)j(the)e(c)o(haracters)f
-(instead)240 1667 y(of)15 b(deleting)h(them.)0 1747 y Fn(quoted-insert)d
-(\(C-q,)i(C-v\))240 1809 y Fo(Add)i(the)f(next)h(c)o(haracter)f(that)f(y)o
-(ou)h(t)o(yp)q(e)h(to)f(the)g(line)i(v)o(erbatim.)24 b(This)17
-b(is)g(ho)o(w)e(to)h(insert)h(k)o(ey)240 1872 y(sequences)f(lik)o(e)h
-Fn(C-Q)p Fo(,)d(for)h(example.)0 1952 y Fn(tab-insert)f(\(M-TAB\))240
-2014 y Fo(Insert)h(a)g(tab)g(c)o(haracter.)0 2094 y Fn(self-insert)f(\(a,)g
-(b,)h(A,)g(1,)g(!,)g(...\))240 2156 y Fo(Insert)g(y)o(ourself.)0
-2236 y Fn(transpose-chars)e(\(C-t\))240 2298 y Fo(Drag)h(the)h(c)o(haracter)g
-(b)q(efore)g(the)h(cursor)f(forw)o(ard)f(o)o(v)o(er)g(the)h(c)o(haracter)g
-(at)f(the)i(cursor,)e(mo)o(ving)240 2361 y(the)k(cursor)h(forw)o(ard)e(as)h
-(w)o(ell.)30 b(If)19 b(the)f(insertion)i(p)q(oin)o(t)f(is)g(at)e(the)i(end)g
-(of)f(the)g(line,)j(then)e(this)240 2423 y(transp)q(oses)c(the)g(last)g(t)o
-(w)o(o)f(c)o(haracters)h(of)f(the)i(line.)21 b(Negativ)o(e)15
-b(argumen)o(tss)f(don't)h(w)o(ork.)0 2503 y Fn(transpose-words)e(\(M-t\))240
-2565 y Fo(Drag)f(the)h(w)o(ord)f(b)q(ehind)i(the)f(cursor)g(past)f(the)h(w)o
-(ord)f(in)h(fron)o(t)f(of)h(the)f(cursor)h(mo)o(ving)f(the)h(cursor)240
-2627 y(o)o(v)o(er)h(that)h(w)o(ord)f(as)h(w)o(ell.)p eop
-%%Page: 11 13
-12 bop 0 -83 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1205
-b(11)0 158 y Fn(upcase-word)14 b(\(M-u\))240 221 y Fo(Upp)q(ercase)h(the)e
-(curren)o(t)h(\(or)f(follo)o(wing\))h(w)o(ord.)k(With)c(a)f(negativ)o(e)h
-(argumen)o(t,)f(do)g(the)h(previous)240 283 y(w)o(ord,)g(but)h(do)h(not)e(mo)
-o(v)o(e)h(the)g(cursor.)0 358 y Fn(downcase-word)e(\(M-l\))240
-420 y Fo(Lo)o(w)o(ercase)g(the)i(curren)o(t)f(\(or)f(follo)o(wing\))h(w)o
-(ord.)19 b(With)14 b(a)g(negativ)o(e)g(argumen)o(t,)f(do)h(the)g(previous)240
-482 y(w)o(ord,)g(but)h(do)h(not)e(mo)o(v)o(e)h(the)g(cursor.)0
-557 y Fn(capitalize-word)e(\(M-c\))240 619 y Fo(Capitalize)j(the)e(curren)o
-(t)g(\(or)f(follo)o(wing\))i(w)o(ord.)j(With)d(a)f(negativ)o(e)g(argumen)o
-(t,)f(do)h(the)g(previous)240 682 y(w)o(ord,)g(but)h(do)h(not)e(mo)o(v)o(e)h
-(the)g(cursor.)0 891 y Fi(1.4.4)30 b(Killing)15 b(And)h(Y)-5
-b(anking)0 1028 y Fn(kill-line)14 b(\(C-k\))240 1090 y Fo(Kill)j(the)f(text)e
-(from)h(the)g(curren)o(t)g(cursor)g(p)q(osition)h(to)f(the)g(end)h(of)f(the)g
-(line.)0 1165 y Fn(backward-kill-line)e(\(C-x)h(Rubout\))240
-1228 y Fo(Kill)j(bac)o(kw)o(ard)e(to)f(the)i(b)q(eginning)h(of)e(the)g(line.)
-0 1302 y Fn(unix-line-discard)e(\(C-u\))240 1365 y Fo(Kill)j(bac)o(kw)o(ard)d
-(from)f(the)i(cursor)f(to)g(the)h(b)q(eginning)i(of)d(the)g(curren)o(t)h
-(line.)21 b(Sa)o(v)o(e)13 b(the)h(killed)h(text)240 1427 y(on)g(the)g
-(kill-ring.)0 1502 y Fn(kill-whole-line)e(\(\))240 1564 y Fo(Kill)18
-b(all)f(c)o(haracters)e(on)h(the)g(curren)o(t)f(line,)j(no)e(matter)e(where)i
-(the)g(cursor)g(is.)22 b(By)16 b(default,)h(this)240 1626 y(is)f(un)o(b)q
-(ound.)0 1701 y Fn(kill-word)e(\(M-d\))240 1764 y Fo(Kill)j(from)d(the)h
-(cursor)g(to)f(the)h(end)g(of)g(the)g(curren)o(t)f(w)o(ord,)g(or)g(if)i(b)q
-(et)o(w)o(een)f(w)o(ords,)f(to)g(the)h(end)g(of)240 1826 y(the)g(next)h(w)o
-(ord.)j(W)l(ord)c(b)q(oundaries)h(are)f(the)g(same)g(as)g Fn(forward-word)p
-Fo(.)0 1901 y Fn(backward-kill-word)e(\(M-DEL\))240 1963 y
-Fo(Kill)k(the)f(w)o(ord)e(b)q(ehind)j(the)f(cursor.)j(W)l(ord)c(b)q
-(oundaries)i(are)d(the)i(same)f(as)f Fn(backward-word)p Fo(.)0
-2038 y Fn(unix-word-rubout)f(\(C-w\))240 2100 y Fo(Kill)i(the)e(w)o(ord)f(b)q
-(ehind)j(the)f(cursor,)e(using)i(white)f(space)h(as)e(a)h(w)o(ord)f(b)q
-(oundary)l(.)20 b(The)13 b(killed)i(text)240 2162 y(is)h(sa)o(v)o(ed)e(on)i
-(the)f(kill-ring.)0 2237 y Fn(delete-horizontal-space)d(\(\))240
-2300 y Fo(Delete)k(all)g(spaces)f(and)h(tabs)e(around)i(p)q(oin)o(t.)k(By)15
-b(default,)h(this)f(is)h(un)o(b)q(ound.)0 2375 y Fn(yank)f(\(C-y\))240
-2437 y Fo(Y)l(ank)g(the)h(top)f(of)f(the)i(kill)h(ring)e(in)o(to)g(the)h
-(bu\013er)f(at)f(the)i(curren)o(t)f(cursor)g(p)q(osition.)0
-2512 y Fn(yank-pop)f(\(M-y\))240 2574 y Fo(Rotate)f(the)h(kill-ring,)i(and)e
-(y)o(ank)g(the)g(new)g(top.)19 b(Y)l(ou)14 b(can)g(only)g(do)g(this)g(if)g
-(the)g(prior)g(command)240 2636 y(is)i(y)o(ank)f(or)f(y)o(ank-p)q(op.)p
+13 14 bop 0 -58 a Fr(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1205
+b(13)0 183 y Fq(next-history)14 b(\(C-n\))240 246 y Fr(Mo)o(v)o(e)g
+(`do)o(wn')g(through)h(the)h(history)f(list.)0 331 y
+Fq(beginning-of-history)d(\(M-<\))240 393 y Fr(Mo)o(v)o(e)i(to)h(the)g
+(\014rst)g(line)i(in)f(the)f(history)l(.)0 478 y Fq(end-of-history)e
+(\(M->\))240 540 y Fr(Mo)o(v)o(e)h(to)h(the)g(end)h(of)f(the)g(input)h
+(history)l(,)f(i.e.,)g(the)g(line)i(y)o(ou)e(are)g(en)o(tering.)0
+625 y Fq(reverse-search-history)d(\(C-r\))240 688 y Fr(Searc)o(h)18
+b(bac)o(kw)o(ard)f(starting)g(at)g(the)g(curren)o(t)h(line)h(and)f(mo)o
+(ving)f(`up')h(through)f(the)h(history)f(as)240 750 y(necessary)l(.)j
+(This)c(is)g(an)f(incremen)o(tal)h(searc)o(h.)0 835 y
+Fq(forward-search-history)c(\(C-s\))240 897 y Fr(Searc)o(h)j(forw)o
+(ard)e(starting)h(at)g(the)g(curren)o(t)h(line)h(and)f(mo)o(ving)f(`do)
+o(wn')g(through)g(the)g(the)h(history)240 960 y(as)g(necessary)l(.)20
+b(This)c(is)g(an)f(incremen)o(tal)h(searc)o(h.)0 1045
+y Fq(non-incremental-reverse-se)o(arch-hi)o(story)c(\(M-p\))240
+1107 y Fr(Searc)o(h)18 b(bac)o(kw)o(ard)f(starting)g(at)g(the)g(curren)
+o(t)h(line)h(and)f(mo)o(ving)f(`up')h(through)f(the)h(history)f(as)240
+1169 y(necessary)e(using)h(a)f(non-incremen)o(tal)i(searc)o(h)e(for)g
+(a)f(string)i(supplied)h(b)o(y)e(the)h(user.)0 1254 y
+Fq(non-incremental-forward-se)o(arch-hi)o(story)c(\(M-n\))240
+1317 y Fr(Searc)o(h)j(forw)o(ard)e(starting)h(at)g(the)g(curren)o(t)h
+(line)h(and)f(mo)o(ving)f(`do)o(wn')g(through)g(the)g(the)h(history)240
+1379 y(as)g(necessary)g(using)h(a)f(non-incremen)o(tal)i(searc)o(h)e
+(for)f(a)h(string)g(supplied)j(b)o(y)d(the)g(user.)0
+1464 y Fq(history-search-forward)d(\(\))240 1526 y Fr(Searc)o(h)h(forw)
+o(ard)f(through)h(the)g(history)g(for)g(the)g(string)g(of)g(c)o
+(haracters)f(b)q(et)o(w)o(een)i(the)f(start)f(of)h(the)240
+1589 y(curren)o(t)19 b(line)h(and)f(the)g(curren)o(t)f(cursor)h(p)q
+(osition)g(\(the)g(`p)q(oin)o(t'\).)30 b(This)19 b(is)g(a)f
+(non-incremen)o(tal)240 1651 y(searc)o(h.)i(By)15 b(default,)g(this)h
+(command)f(is)h(un)o(b)q(ound.)0 1736 y Fq(history-search-backward)c
+(\(\))240 1798 y Fr(Searc)o(h)21 b(bac)o(kw)o(ard)f(through)g(the)h
+(history)f(for)g(the)h(string)f(of)h(c)o(haracters)f(b)q(et)o(w)o(een)g
+(the)h(start)240 1860 y(of)c(the)h(curren)o(t)g(line)h(and)f(the)f(p)q
+(oin)o(t.)28 b(This)18 b(is)h(a)e(non-incremen)o(tal)i(searc)o(h.)27
+b(By)18 b(default,)h(this)240 1923 y(command)c(is)h(un)o(b)q(ound.)0
+2008 y Fq(yank-nth-arg)e(\(M-C-y\))240 2070 y Fr(Insert)19
+b(the)g(\014rst)f(argumen)o(t)g(to)g(the)h(previous)g(command)g
+(\(usually)g(the)g(second)g(w)o(ord)f(on)h(the)240 2132
+y(previous)e(line\).)23 b(With)16 b(an)g(argumen)o(t)f
+Fl(n)p Fr(,)h(insert)h(the)f Fl(n)p Fr(th)g(w)o(ord)f(from)g(the)h
+(previous)h(command)240 2195 y(\(the)d(w)o(ords)g(in)h(the)g(previous)g
+(command)f(b)q(egin)i(with)f(w)o(ord)f(0\).)19 b(A)14
+b(negativ)o(e)h(argumen)o(t)f(inserts)240 2257 y(the)h
+Fl(n)p Fr(th)h(w)o(ord)e(from)h(the)g(end)h(of)e(the)i(previous)g
+(command.)0 2342 y Fq(yank-last-arg)d(\(M-.,)i(M-_\))240
+2404 y Fr(Insert)i(last)g(argumen)o(t)g(to)f(the)h(previous)h(command)f
+(\(the)g(last)g(w)o(ord)f(of)h(the)g(previous)h(history)240
+2467 y(en)o(try\).)h(With)d(an)f(argumen)o(t,)f(b)q(eha)o(v)o(e)h
+(exactly)h(lik)o(e)g Fq(yank-nth-arg)p Fr(.)0 2670 y
+Fk(1.4.3)30 b(Commands)15 b(F)-5 b(or)15 b(Changing)g(T)-5
+b(ext)p eop
+14 15 bop 0 -58 a Fr(14)1449 b(GNU)15 b(Readline)i(Library)0
+183 y Fq(delete-char)d(\(C-d\))240 246 y Fr(Delete)f(the)f(c)o
+(haracter)f(under)i(the)f(cursor.)19 b(If)12 b(the)g(cursor)g(is)g(at)g
+(the)g(b)q(eginning)i(of)e(the)g(line,)i(there)240 308
+y(are)k(no)h(c)o(haracters)e(in)j(the)e(line,)j(and)d(the)h(last)f(c)o
+(haracter)g(t)o(yp)q(ed)h(w)o(as)f(not)g Fq(C-d)p Fr(,)g(then)h(return)
+240 370 y Fq(EOF)p Fr(.)0 460 y Fq(backward-delete-char)12
+b(\(Rubout\))240 522 y Fr(Delete)g(the)f(c)o(haracter)f(b)q(ehind)j
+(the)e(cursor.)18 b(A)11 b(n)o(umeric)h(arg)e(sa)o(ys)g(to)g(kill)j
+(the)e(c)o(haracters)f(instead)240 584 y(of)15 b(deleting)h(them.)0
+674 y Fq(quoted-insert)d(\(C-q,)i(C-v\))240 736 y Fr(Add)i(the)f(next)h
+(c)o(haracter)f(that)f(y)o(ou)h(t)o(yp)q(e)h(to)f(the)g(line)i(v)o
+(erbatim.)24 b(This)17 b(is)g(ho)o(w)e(to)h(insert)h(k)o(ey)240
+799 y(sequences)f(lik)o(e)h Fq(C-Q)p Fr(,)d(for)h(example.)0
+888 y Fq(tab-insert)f(\(M-TAB\))240 951 y Fr(Insert)h(a)g(tab)g(c)o
+(haracter.)0 1040 y Fq(self-insert)f(\(a,)g(b,)h(A,)g(1,)g(!,)g(...\))
+240 1103 y Fr(Insert)g(y)o(ourself.)0 1192 y Fq(transpose-chars)e
+(\(C-t\))240 1255 y Fr(Drag)h(the)h(c)o(haracter)g(b)q(efore)g(the)h
+(cursor)f(forw)o(ard)f(o)o(v)o(er)g(the)h(c)o(haracter)g(at)f(the)i
+(cursor,)e(mo)o(ving)240 1317 y(the)k(cursor)h(forw)o(ard)e(as)h(w)o
+(ell.)30 b(If)19 b(the)f(insertion)i(p)q(oin)o(t)f(is)g(at)e(the)i(end)
+g(of)f(the)g(line,)j(then)e(this)240 1379 y(transp)q(oses)c(the)g(last)
+g(t)o(w)o(o)f(c)o(haracters)h(of)f(the)i(line.)21 b(Negativ)o(e)15
+b(argumen)o(tss)f(don't)h(w)o(ork.)0 1469 y Fq(transpose-words)e
+(\(M-t\))240 1531 y Fr(Drag)f(the)h(w)o(ord)f(b)q(ehind)i(the)f(cursor)
+g(past)f(the)h(w)o(ord)f(in)h(fron)o(t)f(of)h(the)f(cursor)h(mo)o(ving)
+f(the)h(cursor)240 1594 y(o)o(v)o(er)h(that)h(w)o(ord)f(as)h(w)o(ell.)0
+1683 y Fq(upcase-word)f(\(M-u\))240 1746 y Fr(Upp)q(ercase)h(the)e
+(curren)o(t)h(\(or)f(follo)o(wing\))h(w)o(ord.)k(With)c(a)f(negativ)o
+(e)h(argumen)o(t,)f(do)g(the)h(previous)240 1808 y(w)o(ord,)g(but)h(do)
+h(not)e(mo)o(v)o(e)h(the)g(cursor.)0 1898 y Fq(downcase-word)e(\(M-l\))
+240 1960 y Fr(Lo)o(w)o(ercase)g(the)i(curren)o(t)f(\(or)f(follo)o
+(wing\))h(w)o(ord.)19 b(With)14 b(a)g(negativ)o(e)g(argumen)o(t,)f(do)h
+(the)g(previous)240 2022 y(w)o(ord,)g(but)h(do)h(not)e(mo)o(v)o(e)h
+(the)g(cursor.)0 2112 y Fq(capitalize-word)e(\(M-c\))240
+2174 y Fr(Capitalize)j(the)e(curren)o(t)g(\(or)f(follo)o(wing\))i(w)o
+(ord.)j(With)d(a)f(negativ)o(e)g(argumen)o(t,)f(do)h(the)g(previous)240
+2236 y(w)o(ord,)g(but)h(do)h(not)e(mo)o(v)o(e)h(the)g(cursor.)0
+2456 y Fk(1.4.4)30 b(Killing)15 b(And)h(Y)-5 b(anking)0
+2608 y Fq(kill-line)14 b(\(C-k\))240 2670 y Fr(Kill)j(the)f(text)e
+(from)h(the)g(curren)o(t)g(cursor)g(p)q(osition)h(to)f(the)g(end)h(of)f
+(the)g(line.)p eop
+15 16 bop 0 -58 a Fr(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1205
+b(15)0 183 y Fq(backward-kill-line)13 b(\(C-x)h(Rubout\))240
+246 y Fr(Kill)j(bac)o(kw)o(ard)e(to)f(the)i(b)q(eginning)h(of)e(the)g
+(line.)0 332 y Fq(unix-line-discard)e(\(C-u\))240 394
+y Fr(Kill)j(bac)o(kw)o(ard)d(from)f(the)i(cursor)f(to)g(the)h(b)q
+(eginning)i(of)d(the)g(curren)o(t)h(line.)21 b(Sa)o(v)o(e)13
+b(the)h(killed)h(text)240 456 y(on)g(the)g(kill-ring.)0
+543 y Fq(kill-whole-line)e(\(\))240 605 y Fr(Kill)18
+b(all)f(c)o(haracters)e(on)h(the)g(curren)o(t)f(line,)j(no)e(matter)e
+(where)i(the)g(cursor)g(is.)22 b(By)16 b(default,)h(this)240
+667 y(is)f(un)o(b)q(ound.)0 753 y Fq(kill-word)e(\(M-d\))240
+816 y Fr(Kill)j(from)d(the)h(cursor)g(to)f(the)h(end)g(of)g(the)g
+(curren)o(t)f(w)o(ord,)g(or)g(if)i(b)q(et)o(w)o(een)f(w)o(ords,)f(to)g
+(the)h(end)g(of)240 878 y(the)g(next)h(w)o(ord.)j(W)l(ord)c(b)q
+(oundaries)h(are)f(the)g(same)g(as)g Fq(forward-word)p
+Fr(.)0 964 y Fq(backward-kill-word)e(\(M-DEL\))240 1027
+y Fr(Kill)k(the)f(w)o(ord)e(b)q(ehind)j(the)f(cursor.)j(W)l(ord)c(b)q
+(oundaries)i(are)d(the)i(same)f(as)f Fq(backward-word)p
+Fr(.)0 1113 y Fq(unix-word-rubout)f(\(C-w\))240 1175
+y Fr(Kill)i(the)e(w)o(ord)f(b)q(ehind)j(the)f(cursor,)e(using)i(white)f
+(space)h(as)e(a)h(w)o(ord)f(b)q(oundary)l(.)20 b(The)13
+b(killed)i(text)240 1237 y(is)h(sa)o(v)o(ed)e(on)i(the)f(kill-ring.)0
+1324 y Fq(delete-horizontal-space)d(\(\))240 1386 y Fr(Delete)k(all)g
+(spaces)f(and)h(tabs)e(around)i(p)q(oin)o(t.)k(By)15
+b(default,)h(this)f(is)h(un)o(b)q(ound.)0 1472 y Fq(kill-region)e(\(\))
+240 1535 y Fr(Kill)23 b(the)e(text)g(b)q(et)o(w)o(een)g(the)g(p)q(oin)o
+(t)g(and)g(the)g Fl(mark)j Fr(\(sa)o(v)o(ed)c(cursor)g(p)q(osition.)38
+b(This)22 b(text)e(is)240 1597 y(referred)15 b(to)g(as)g(the)g
+Fl(region)p Fr(.)20 b(By)15 b(default,)h(this)g(command)f(is)g(un)o(b)q
+(ound.)0 1683 y Fq(copy-region-as-kill)e(\(\))240 1745
+y Fr(Cop)o(y)f(the)h(text)f(in)i(the)f(region)g(to)f(the)g(kill)j
+(bu\013er,)e(so)f(y)o(ou)h(can)f(y)o(ank)h(it)g(righ)o(t)f(a)o(w)o(a)o
+(y)l(.)18 b(By)13 b(default,)240 1808 y(this)j(command)f(is)g(un)o(b)q
+(ound.)0 1894 y Fq(copy-backward-word)e(\(\))240 1956
+y Fr(Cop)o(y)i(the)g(w)o(ord)f(b)q(efore)i(p)q(oin)o(t)g(to)e(the)h
+(kill)j(bu\013er.)h(By)d(default,)f(this)h(command)f(is)h(un)o(b)q
+(ound.)0 2043 y Fq(copy-forward-word)d(\(\))240 2105
+y Fr(Cop)o(y)f(the)h(w)o(ord)f(follo)o(wing)h(p)q(oin)o(t)g(to)f(the)h
+(kill)h(bu\013er.)19 b(By)13 b(default,)g(this)h(command)e(is)h(un)o(b)
+q(ound.)0 2191 y Fq(yank)i(\(C-y\))240 2253 y Fr(Y)l(ank)g(the)h(top)f
+(of)f(the)i(kill)h(ring)e(in)o(to)g(the)h(bu\013er)f(at)f(the)i(curren)
+o(t)f(cursor)g(p)q(osition.)0 2340 y Fq(yank-pop)f(\(M-y\))240
+2402 y Fr(Rotate)f(the)h(kill-ring,)i(and)e(y)o(ank)g(the)g(new)g(top.)
+19 b(Y)l(ou)14 b(can)g(only)g(do)g(this)g(if)g(the)g(prior)g(command)
+240 2464 y(is)i(y)o(ank)f(or)f(y)o(ank-p)q(op.)0 2670
+y Fk(1.4.5)30 b(Sp)r(ecifying)15 b(Numeric)h(Argumen)n(ts)p
eop
-%%Page: 12 14
-13 bop 0 -83 a Fo(12)1449 b(GNU)15 b(Readline)i(Library)0 158
-y Fi(1.4.5)30 b(Sp)r(ecifying)15 b(Numeric)h(Argumen)n(ts)0
-301 y Fn(digit-argument)d(\(M-0,)i(M-1,)f(...)h(M--\))240 364
-y Fo(Add)k(this)f(digit)h(to)f(the)g(argumen)o(t)f(already)i(accum)o
-(ulating,)g(or)f(start)f(a)g(new)i(argumen)o(t.)28 b(M{)240
-426 y(starts)14 b(a)h(negativ)o(e)g(argumen)o(t.)0 507 y Fn
-(universal-argument)e(\(\))240 569 y Fo(Eac)o(h)k(time)h(this)g(is)f
-(executed,)i(the)e(argumen)o(t)g(coun)o(t)g(is)h(m)o(ultiplied)i(b)o(y)d
-(four.)26 b(The)18 b(argumen)o(t)240 631 y(coun)o(t)i(is)h(initially)j(one,)d
-(so)f(executing)i(this)f(function)g(the)g(\014rst)f(time)h(mak)o(es)f(the)h
-(argumen)o(t)240 693 y(coun)o(t)15 b(four.)20 b(By)15 b(default,)g(this)h(is)
-g(not)e(b)q(ound)j(to)d(a)h(k)o(ey)l(.)0 956 y Fi(1.4.6)30
-b(Letting)14 b(Readline)h(T)n(yp)r(e)h(F)-5 b(or)14 b(Y)-5
-b(ou)0 1099 y Fn(complete)14 b(\(TAB\))240 1161 y Fo(A)o(ttempt)i(to)h(do)g
+16 17 bop 0 -58 a Fr(16)1449 b(GNU)15 b(Readline)i(Library)0
+183 y Fq(digit-argument)c(\(M-0,)i(M-1,)f(...)h(M--\))240
+246 y Fr(Add)j(this)g(digit)h(to)e(the)h(argumen)o(t)e(already)i(accum)
+o(ulating,)h(or)e(start)g(a)g(new)h(argumen)o(t.)26 b
+Fq(M--)240 308 y Fr(starts)14 b(a)h(negativ)o(e)g(argumen)o(t.)0
+403 y Fq(universal-argument)e(\(\))240 465 y Fr(This)f(is)h(another)e
+(w)o(a)o(y)g(to)g(sp)q(ecify)i(an)f(argumen)o(t.)18 b(If)12
+b(this)g(command)g(is)g(follo)o(w)o(ed)g(b)o(y)g(one)g(or)f(more)240
+527 y(digits,)19 b(optionally)g(with)f(a)g(leading)h(min)o(us)f(sign,)h
+(those)e(digits)i(de\014ne)g(the)f(argumen)o(t.)27 b(If)18
+b(the)240 590 y(command)12 b(is)h(follo)o(w)o(ed)g(b)o(y)f(digits,)i
+(executing)f Fq(universal-argument)d Fr(again)j(ends)g(the)f(n)o
+(umeric)240 652 y(argumen)o(t,)i(but)h(is)g(otherwise)g(ignored.)20
+b(As)15 b(a)f(sp)q(ecial)j(case,)d(if)h(this)g(command)g(is)g
+(immediately)240 714 y(follo)o(w)o(ed)e(b)o(y)f(a)h(c)o(haracter)e
+(that)h(is)h(neither)h(a)e(digit)i(or)e(min)o(us)h(sign,)g(the)g
+(argumen)o(t)f(coun)o(t)g(for)g(the)240 776 y(next)i(command)g(is)h(m)o
+(ultiplied)i(b)o(y)d(four.)19 b(The)c(argumen)o(t)e(coun)o(t)h(is)h
+(initially)i(one,)d(so)g(executing)240 839 y(this)k(function)g(the)f
+(\014rst)g(time)g(mak)o(es)g(the)g(argumen)o(t)g(coun)o(t)g(four,)g(a)g
+(second)h(time)f(mak)o(es)g(the)240 901 y(argumen)o(t)d(coun)o(t)h
+(sixteen,)h(and)f(so)g(on.)20 b(By)15 b(default,)h(this)f(is)h(not)f(b)
+q(ound)h(to)f(a)g(k)o(ey)l(.)0 1143 y Fk(1.4.6)30 b(Letting)14
+b(Readline)h(T)n(yp)r(e)h(F)-5 b(or)14 b(Y)-5 b(ou)0
+1301 y Fq(complete)14 b(\(TAB\))240 1363 y Fr(A)o(ttempt)i(to)h(do)g
(completion)i(on)e(the)g(text)g(b)q(efore)h(the)f(cursor.)26
-b(This)18 b(is)g(application-sp)q(eci\014c.)240 1223 y(Generally)l(,)h(if)f
-(y)o(ou)f(are)h(t)o(yping)g(a)f(\014lename)i(argumen)o(t,)e(y)o(ou)g(can)h
-(do)f(\014lename)i(completion;)g(if)240 1285 y(y)o(ou)f(are)f(t)o(yping)i(a)e
-(command,)i(y)o(ou)e(can)i(do)f(command)g(completion,)h(if)g(y)o(ou)e(are)h
-(t)o(yping)g(in)h(a)240 1348 y(sym)o(b)q(ol)e(to)f(GDB,)g(y)o(ou)g(can)h(do)g
-(sym)o(b)q(ol)g(name)g(completion,)h(if)f(y)o(ou)f(are)h(t)o(yping)g(in)g(a)g
-(v)m(ariable)240 1410 y(to)e(Bash,)f(y)o(ou)h(can)h(do)f(v)m(ariable)h(name)g
-(completion,)g(and)f(so)g(on.)0 1491 y Fn(possible-completions)d(\(M-?\))240
-1553 y Fo(List)k(the)f(p)q(ossible)i(completions)f(of)f(the)g(text)g(b)q
-(efore)h(the)f(cursor.)0 1634 y Fn(insert-completions)e(\(\))240
-1696 y Fo(Insert)22 b(all)h(completions)g(of)f(the)g(text)f(b)q(efore)h(p)q
-(oin)o(t)h(that)e(w)o(ould)h(ha)o(v)o(e)g(b)q(een)h(generated)f(b)o(y)240
-1758 y Fn(possible-completions)p Fo(.)17 b(By)e(default,)h(this)f(is)h(not)f
-(b)q(ound)h(to)f(a)g(k)o(ey)l(.)0 2020 y Fi(1.4.7)30 b(Keyb)r(oard)15
-b(Macros)0 2163 y Fn(start-kbd-macro)e(\(C-x)i(\(\))240 2226
-y Fo(Begin)h(sa)o(ving)f(the)h(c)o(haracters)e(t)o(yp)q(ed)i(in)o(to)f(the)g
-(curren)o(t)g(k)o(eyb)q(oard)g(macro.)0 2306 y Fn(end-kbd-macro)e(\(C-x)i
-(\)\))240 2369 y Fo(Stop)f(sa)o(ving)h(the)g(c)o(haracters)f(t)o(yp)q(ed)h
-(in)o(to)f(the)h(curren)o(t)f(k)o(eyb)q(oard)h(macro)f(and)h(sa)o(v)o(e)f
-(the)g(de\014ni-)240 2431 y(tion.)0 2512 y Fn(call-last-kbd-macro)f(\(C-x)h
-(e\))240 2574 y Fo(Re-execute)20 b(the)f(last)f(k)o(eyb)q(oard)g(macro)g
-(de\014ned,)i(b)o(y)f(making)f(the)h(c)o(haracters)f(in)h(the)g(macro)240
-2636 y(app)q(ear)c(as)g(if)h(t)o(yp)q(ed)f(at)g(the)g(k)o(eyb)q(oard.)p
-eop
-%%Page: 13 15
-14 bop 0 -83 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1205
-b(13)0 158 y Fi(1.4.8)30 b(Some)15 b(Miscellaneous)h(Commands)0
-299 y Fn(re-read-init-file)d(\(C-x)h(C-r\))240 361 y Fo(Read)i(in)g(the)f
-(con)o(ten)o(ts)f(of)h(y)o(our)g(init)h(\014le,)g(and)f(incorp)q(orate)h(an)o
-(y)e(bindings)j(or)e(v)m(ariable)i(assign-)240 423 y(men)o(ts)e(found)g
-(there.)0 502 y Fn(abort)f(\(C-g\))240 564 y Fo(Ab)q(ort)f(the)h(curren)o(t)f
-(editing)i(command)e(and)h(ring)g(the)f(terminal's)h(b)q(ell)h(\(sub)s(ject)f
-(to)e(the)i(setting)240 626 y(of)h Fn(bell-style)p Fo(\).)0
-704 y Fn(do-uppercase-version)d(\(M-a,)j(M-b,)f(...\))240 767
-y Fo(Run)i(the)f(command)g(that)g(is)h(b)q(ound)g(to)e(the)i(corresop)q
-(onding)g(upp)q(ercase)g(c)o(haracter.)0 845 y Fn(prefix-meta)e(\(ESC\))240
-907 y Fo(Mak)o(e)g(the)g(next)h(c)o(haracter)f(that)g(y)o(ou)g(t)o(yp)q(e)h
-(b)q(e)g(meta\014ed.)20 b(This)15 b(is)g(for)f(p)q(eople)i(without)e(a)h
-(meta)240 970 y(k)o(ey)l(.)20 b(T)o(yping)c(`)p Fn(ESC)e(f)p
-Fo(')h(is)g(equiv)m(alen)o(t)i(to)e(t)o(yping)g(`)p Fn(M-f)p
-Fo('.)0 1048 y Fn(undo)g(\(C-_,)f(C-x)h(C-u\))240 1110 y Fo(Incremen)o(tal)h
-(undo,)f(separately)h(remem)o(b)q(ered)g(for)e(eac)o(h)h(line.)0
-1188 y Fn(revert-line)f(\(M-r\))240 1251 y Fo(Undo)20 b(all)h(c)o(hanges)f
-(made)g(to)f(this)i(line.)35 b(This)21 b(is)f(lik)o(e)h(t)o(yping)f(the)g
-Fn(undo)g Fo(command)g(enough)240 1313 y(times)15 b(to)g(get)g(bac)o(k)g(to)f
-(the)i(b)q(eginning.)0 1391 y Fn(tilde-expand)e(\(M-~\))240
-1453 y Fo(P)o(erform)g(tilde)j(expansion)f(on)f(the)g(curren)o(t)g(w)o(ord.)0
-1532 y Fn(dump-functions)e(\(\))240 1594 y Fo(Prin)o(t)18 b(all)h(of)f(the)g
-(functions)h(and)g(their)g(k)o(ey)f(bindings)i(to)d(the)i(readline)h(output)e
-(stream.)28 b(If)18 b(a)240 1656 y(n)o(umeric)i(argumen)o(t)d(is)i(supplied,)
-j(the)d(output)f(is)h(formatted)f(in)h(suc)o(h)g(a)f(w)o(a)o(y)g(that)g(it)h
-(can)f(b)q(e)240 1718 y(made)d(part)g(of)g(an)g Fj(inputrc)k
-Fo(\014le.)0 1974 y Fm(1.5)33 b(Readline)16 b(vi)g(Mo)r(de)62
-2115 y Fo(While)d(the)f(Readline)i(library)e(do)q(es)g(not)g(ha)o(v)o(e)f(a)g
-(full)i(set)f(of)f Fn(vi)g Fo(editing)i(functions,)g(it)f(do)q(es)g(con)o
-(tain)g(enough)0 2177 y(to)i(allo)o(w)h(simple)i(editing)f(of)f(the)g(line.)
-21 b(The)15 b(Readline)i Fn(vi)e Fo(mo)q(de)g(b)q(eha)o(v)o(es)h(as)e(sp)q
-(eci\014ed)j(in)f(the)f(P)o(osix)g(1003.2)0 2240 y(standard.)62
-2380 y(In)i(order)e(to)g(switc)o(h)h(in)o(teractiv)o(ely)h(b)q(et)o(w)o(een)f
-Fn(Emacs)f Fo(and)h Fn(Vi)f Fo(editing)i(mo)q(des,)f(use)g(the)g(command)f
-(M-C-j)0 2442 y(\(toggle-editing-mo)q(de\).)21 b(The)15 b(Readline)j(default)
-e(is)f Fn(emacs)g Fo(mo)q(de.)62 2583 y(When)k(y)o(ou)f(en)o(ter)g(a)g(line)i
-(in)g Fn(vi)e Fo(mo)q(de,)h(y)o(ou)f(are)g(already)g(placed)i(in)f
-(`insertion')g(mo)q(de,)g(as)f(if)h(y)o(ou)f(had)0 2645 y(t)o(yp)q(ed)e(an)f
-(`)p Fn(i)p Fo('.)20 b(Pressing)c Fn(ESC)f Fo(switc)o(hes)h(y)o(ou)f(in)o(to)
-h(`command')f(mo)q(de,)g(where)h(y)o(ou)f(can)h(edit)g(the)g(text)f(of)g(the)
-p eop
-%%Page: 14 16
-15 bop 0 -83 a Fo(14)1449 b(GNU)15 b(Readline)i(Library)0 158
-y(line)j(with)e(the)g(standard)g Fn(vi)f Fo(mo)o(v)o(emen)o(t)g(k)o(eys,)h
-(mo)o(v)o(e)g(to)f(previous)i(history)f(lines)h(with)g(`)p
-Fn(k)p Fo(',)e(and)h(follo)o(wing)0 221 y(lines)f(with)e(`)p
-Fn(j)p Fo(',)f(and)i(so)e(forth.)p eop
-%%Page: 15 17
-16 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(15)0 158 y Fk(2)41 b(Programming)16 b(with)f(GNU)h(Readline)62
-370 y Fo(This)j(c)o(hapter)f(describ)q(es)i(the)e(in)o(terface)g(b)q(et)o(w)o
-(een)h(the)f(GNU)g(Readline)j(Library)d(and)h(other)f(programs.)0
-433 y(If)h(y)o(ou)g(are)f(a)h(programmer,)f(and)i(y)o(ou)e(wish)i(to)e
-(include)j(the)e(features)g(found)g(in)h(GNU)f(Readline)i(suc)o(h)e(as)0
-495 y(completion,)f(line)h(editing,)f(and)f(in)o(teractiv)o(e)h(history)f
-(manipulation)h(in)g(y)o(our)f(o)o(wn)f(programs,)g(this)h(section)0
-557 y(is)f(for)e(y)o(ou.)0 826 y Fm(2.1)33 b(Basic)14 b(Beha)n(vior)62
-968 y Fo(Man)o(y)c(programs)g(pro)o(vide)h(a)g(command)f(line)j(in)o
-(terface,)e(suc)o(h)g(as)g Fn(mail)p Fo(,)f Fn(ftp)p Fo(,)h(and)g
-Fn(sh)p Fo(.)18 b(F)l(or)10 b(suc)o(h)i(programs,)0 1031 y(the)17
+b(This)18 b(is)g(application-sp)q(eci\014c.)240 1425
+y(Generally)l(,)h(if)f(y)o(ou)f(are)h(t)o(yping)g(a)f(\014lename)i
+(argumen)o(t,)e(y)o(ou)g(can)h(do)f(\014lename)i(completion;)g(if)240
+1487 y(y)o(ou)f(are)f(t)o(yping)i(a)e(command,)i(y)o(ou)e(can)i(do)f
+(command)g(completion,)h(if)g(y)o(ou)e(are)h(t)o(yping)g(in)h(a)240
+1550 y(sym)o(b)q(ol)e(to)f(GDB,)g(y)o(ou)g(can)h(do)g(sym)o(b)q(ol)g
+(name)g(completion,)h(if)f(y)o(ou)f(are)h(t)o(yping)g(in)g(a)g(v)m
+(ariable)240 1612 y(to)e(Bash,)f(y)o(ou)h(can)h(do)f(v)m(ariable)h
+(name)g(completion,)g(and)f(so)g(on.)0 1707 y Fq(possible-completions)d
+(\(M-?\))240 1769 y Fr(List)k(the)f(p)q(ossible)i(completions)f(of)f
+(the)g(text)g(b)q(efore)h(the)f(cursor.)0 1864 y Fq(insert-completions)
+e(\(M-*\))240 1926 y Fr(Insert)22 b(all)h(completions)g(of)f(the)g
+(text)f(b)q(efore)h(p)q(oin)o(t)h(that)e(w)o(ould)h(ha)o(v)o(e)g(b)q
+(een)h(generated)f(b)o(y)240 1989 y Fq(possible-completions)p
+Fr(.)0 2231 y Fk(1.4.7)30 b(Keyb)r(oard)15 b(Macros)0
+2388 y Fq(start-kbd-macro)e(\(C-x)i(\(\))240 2451 y Fr(Begin)h(sa)o
+(ving)f(the)h(c)o(haracters)e(t)o(yp)q(ed)i(in)o(to)f(the)g(curren)o(t)
+g(k)o(eyb)q(oard)g(macro.)0 2545 y Fq(end-kbd-macro)e(\(C-x)i(\)\))240
+2608 y Fr(Stop)f(sa)o(ving)h(the)g(c)o(haracters)f(t)o(yp)q(ed)h(in)o
+(to)f(the)h(curren)o(t)f(k)o(eyb)q(oard)h(macro)f(and)h(sa)o(v)o(e)f
+(the)g(de\014ni-)240 2670 y(tion.)p eop
+17 18 bop 0 -58 a Fr(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1205
+b(17)0 183 y Fq(call-last-kbd-macro)13 b(\(C-x)h(e\))240
+246 y Fr(Re-execute)20 b(the)f(last)f(k)o(eyb)q(oard)g(macro)g
+(de\014ned,)i(b)o(y)f(making)f(the)h(c)o(haracters)f(in)h(the)g(macro)
+240 308 y(app)q(ear)c(as)g(if)h(t)o(yp)q(ed)f(at)g(the)g(k)o(eyb)q
+(oard.)0 546 y Fk(1.4.8)30 b(Some)15 b(Miscellaneous)h(Commands)0
+703 y Fq(re-read-init-file)d(\(C-x)h(C-r\))240 765 y
+Fr(Read)23 b(in)h(the)e(con)o(ten)o(ts)g(of)h(the)f(inputrc)i(\014le,)h
+(and)e(incorp)q(orate)g(an)o(y)f(bindings)i(or)f(v)m(ariable)240
+827 y(assignmen)o(ts)15 b(found)h(there.)0 921 y Fq(abort)e(\(C-g\))240
+984 y Fr(Ab)q(ort)f(the)h(curren)o(t)f(editing)i(command)e(and)h(ring)g
+(the)f(terminal's)h(b)q(ell)h(\(sub)s(ject)f(to)e(the)i(setting)240
+1046 y(of)h Fq(bell-style)p Fr(\).)0 1140 y Fq(do-uppercase-version)d
+(\(M-a,)j(M-b,)f(M-)p Fl(x)p Fq(,)h Fj(:)8 b(:)g(:)n
+Fq(\))240 1202 y Fr(If)16 b(the)f(meta\014ed)g(c)o(haracter)g
+Fl(x)k Fr(is)c(lo)o(w)o(ercase,)g(run)h(the)f(command)g(that)g(is)h(b)q
+(ound)g(to)f(the)g(corre-)240 1264 y(sp)q(onding)h(upp)q(ercase)h(c)o
+(haracter.)0 1358 y Fq(prefix-meta)d(\(ESC\))240 1421
+y Fr(Mak)o(e)g(the)g(next)h(c)o(haracter)f(that)g(y)o(ou)g(t)o(yp)q(e)h
+(b)q(e)g(meta\014ed.)20 b(This)15 b(is)g(for)f(p)q(eople)i(without)e(a)
+h(meta)240 1483 y(k)o(ey)l(.)20 b(T)o(yping)c(`)p Fq(ESC)e(f)p
+Fr(')h(is)g(equiv)m(alen)o(t)i(to)e(t)o(yping)g(`)p Fq(M-f)p
+Fr('.)0 1577 y Fq(undo)g(\(C-_,)f(C-x)h(C-u\))240 1639
+y Fr(Incremen)o(tal)h(undo,)f(separately)h(remem)o(b)q(ered)g(for)e
+(eac)o(h)h(line.)0 1733 y Fq(revert-line)f(\(M-r\))240
+1796 y Fr(Undo)20 b(all)h(c)o(hanges)f(made)g(to)f(this)i(line.)35
+b(This)21 b(is)f(lik)o(e)h(t)o(yping)f(the)g Fq(undo)g
+Fr(command)g(enough)240 1858 y(times)15 b(to)g(get)g(bac)o(k)g(to)f
+(the)i(b)q(eginning.)0 1952 y Fq(tilde-expand)e(\(M-~\))240
+2014 y Fr(P)o(erform)g(tilde)j(expansion)f(on)f(the)g(curren)o(t)g(w)o
+(ord.)0 2108 y Fq(set-mark)f(\(C-@\))240 2171 y Fr(Set)i(the)g(mark)f
+(to)g(the)h(curren)o(t)g(p)q(oin)o(t.)23 b(If)16 b(a)f(n)o(umeric)i
+(argumen)o(t)e(is)i(supplied,)h(the)e(mark)f(is)h(set)240
+2233 y(to)f(that)f(p)q(osition.)0 2327 y Fq(exchange-point-and-mark)e
+(\(C-x)j(C-x\))240 2389 y Fr(Sw)o(ap)e(the)g(p)q(oin)o(t)h(with)f(the)g
+(mark.)19 b(The)13 b(curren)o(t)g(cursor)g(p)q(osition)h(is)g(set)f(to)
+f(the)i(sa)o(v)o(ed)e(p)q(osition,)240 2451 y(and)j(the)h(old)f(cursor)
+g(p)q(osition)i(is)e(sa)o(v)o(ed)g(as)g(the)g(mark.)0
+2545 y Fq(character-search)e(\(C-]\))240 2608 y Fr(A)19
+b(c)o(haracter)e(is)j(read)e(and)h(p)q(oin)o(t)g(is)g(mo)o(v)o(ed)f(to)
+g(the)g(next)h(o)q(ccurrence)h(of)e(that)g(c)o(haracter.)29
+b(A)240 2670 y(negativ)o(e)15 b(coun)o(t)g(searc)o(hes)g(for)g
+(previous)h(o)q(ccurrences.)p eop
+18 19 bop 0 -58 a Fr(18)1449 b(GNU)15 b(Readline)i(Library)0
+183 y Fq(character-search-backward)12 b(\(M-C-]\))240
+246 y Fr(A)i(c)o(haracter)f(is)h(read)g(and)f(p)q(oin)o(t)i(is)f(mo)o
+(v)o(ed)f(to)g(the)h(previous)g(o)q(ccurrence)h(of)e(that)g(c)o
+(haracter.)19 b(A)240 308 y(negativ)o(e)c(coun)o(t)g(searc)o(hes)g(for)
+g(subsequen)o(t)h(o)q(ccurrences.)0 395 y Fq(insert-comment)d(\(M-#\))
+240 457 y Fr(The)19 b(v)m(alue)g(of)f(the)g Fq(comment-begin)f
+Fr(v)m(ariable)i(is)g(inserted)g(at)f(the)g(b)q(eginning)j(of)d(the)g
+(curren)o(t)240 519 y(line,)e(and)g(the)f(line)i(is)f(accepted)g(as)e
+(if)i(a)f(newline)i(had)e(b)q(een)i(t)o(yp)q(ed.)0 607
+y Fq(dump-functions)c(\(\))240 669 y Fr(Prin)o(t)18 b(all)h(of)f(the)g
+(functions)h(and)g(their)g(k)o(ey)f(bindings)i(to)d(the)i(readline)h
+(output)e(stream.)28 b(If)18 b(a)240 731 y(n)o(umeric)i(argumen)o(t)d
+(is)i(supplied,)j(the)d(output)f(is)h(formatted)f(in)h(suc)o(h)g(a)f(w)
+o(a)o(y)g(that)g(it)h(can)f(b)q(e)240 793 y(made)d(part)g(of)g(an)g
+Fl(inputrc)k Fr(\014le.)i(This)15 b(command)g(is)h(un)o(b)q(ound)h(b)o
+(y)e(default.)0 881 y Fq(dump-variables)e(\(\))240 943
+y Fr(Prin)o(t)j(all)h(of)f(the)h(settable)f(v)m(ariables)i(and)e(their)
+h(v)m(alues)g(to)f(the)g(readline)i(output)e(stream.)23
+b(If)16 b(a)240 1005 y(n)o(umeric)k(argumen)o(t)d(is)i(supplied,)j(the)
+d(output)f(is)h(formatted)f(in)h(suc)o(h)g(a)f(w)o(a)o(y)g(that)g(it)h
+(can)f(b)q(e)240 1067 y(made)d(part)g(of)g(an)g Fl(inputrc)k
+Fr(\014le.)i(This)15 b(command)g(is)h(un)o(b)q(ound)h(b)o(y)e(default.)
+0 1155 y Fq(dump-macros)f(\(\))240 1217 y Fr(Prin)o(t)h(all)g(of)g(the)
+f(readline)j(k)o(ey)d(sequences)i(b)q(ound)g(to)e(macros)g(and)h(the)f
+(strings)h(they)g(ouput.)20 b(If)240 1279 y(a)c(n)o(umeric)h(argumen)o
+(t)e(is)i(supplied,)h(the)e(output)g(is)g(formatted)f(in)i(suc)o(h)g(a)
+e(w)o(a)o(y)g(that)h(it)g(can)g(b)q(e)240 1341 y(made)f(part)g(of)g(an)
+g Fl(inputrc)k Fr(\014le.)i(This)15 b(command)g(is)h(un)o(b)q(ound)h(b)
+o(y)e(default.)0 1566 y Fp(1.5)33 b(Readline)16 b(vi)g(Mo)r(de)62
+1703 y Fr(While)d(the)f(Readline)i(library)e(do)q(es)g(not)g(ha)o(v)o
+(e)f(a)g(full)i(set)f(of)f Fq(vi)g Fr(editing)i(functions,)g(it)f(do)q
+(es)g(con)o(tain)g(enough)0 1765 y(to)f(allo)o(w)i(simple)g(editing)g
+(of)f(the)g(line.)20 b(The)13 b(Readline)h Fq(vi)d Fr(mo)q(de)i(b)q
+(eha)o(v)o(es)f(as)g(sp)q(eci\014ed)i(in)e(the)h Fm(POSIX)f
+Fr(1003.2)0 1827 y(standard.)62 1964 y(In)17 b(order)e(to)g(switc)o(h)h
+(in)o(teractiv)o(ely)h(b)q(et)o(w)o(een)f Fq(emacs)f
+Fr(and)h Fq(vi)f Fr(editing)i(mo)q(des,)f(use)g(the)g(command)f(M-C-j)0
+2026 y(\(toggle-editing-mo)q(de\).)21 b(The)15 b(Readline)j(default)e
+(is)f Fq(emacs)g Fr(mo)q(de.)62 2163 y(When)k(y)o(ou)f(en)o(ter)g(a)g
+(line)i(in)g Fq(vi)e Fr(mo)q(de,)h(y)o(ou)f(are)g(already)g(placed)i
+(in)f(`insertion')g(mo)q(de,)g(as)f(if)h(y)o(ou)f(had)0
+2226 y(t)o(yp)q(ed)e(an)f(`)p Fq(i)p Fr('.)20 b(Pressing)c
+Fq(ESC)f Fr(switc)o(hes)h(y)o(ou)f(in)o(to)h(`command')f(mo)q(de,)g
+(where)h(y)o(ou)f(can)h(edit)g(the)g(text)f(of)g(the)0
+2288 y(line)j(with)e(the)h(standard)e Fq(vi)h Fr(mo)o(v)o(emen)o(t)f(k)
+o(eys,)h(mo)o(v)o(e)g(to)f(previous)i(history)f(lines)i(with)f(`)p
+Fq(k)p Fr(')e(and)h(subsequen)o(t)0 2350 y(lines)h(with)e(`)p
+Fq(j)p Fr(',)f(and)i(so)e(forth.)p eop
+19 20 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(19)0 183 y Fn(2)41 b(Programming)16 b(with)f(GNU)h
+(Readline)62 394 y Fr(This)j(c)o(hapter)f(describ)q(es)i(the)e(in)o
+(terface)g(b)q(et)o(w)o(een)h(the)f(GNU)g(Readline)j(Library)d(and)h
+(other)f(programs.)0 456 y(If)h(y)o(ou)g(are)f(a)h(programmer,)f(and)i
+(y)o(ou)e(wish)i(to)e(include)j(the)e(features)g(found)g(in)h(GNU)f
+(Readline)i(suc)o(h)e(as)0 518 y(completion,)f(line)h(editing,)f(and)f
+(in)o(teractiv)o(e)h(history)f(manipulation)h(in)g(y)o(our)f(o)o(wn)f
+(programs,)g(this)h(section)0 581 y(is)f(for)e(y)o(ou.)0
+848 y Fp(2.1)33 b(Basic)14 b(Beha)n(vior)62 989 y Fr(Man)o(y)c
+(programs)g(pro)o(vide)h(a)g(command)f(line)j(in)o(terface,)e(suc)o(h)g
+(as)g Fq(mail)p Fr(,)f Fq(ftp)p Fr(,)h(and)g Fq(sh)p
+Fr(.)18 b(F)l(or)10 b(suc)o(h)i(programs,)0 1052 y(the)17
b(default)h(b)q(eha)o(viour)g(of)e(Readline)k(is)e(su\016cien)o(t.)26
-b(This)18 b(section)f(describ)q(es)i(ho)o(w)e(to)f(use)i(Readline)h(in)f(the)
-0 1093 y(simplest)e(w)o(a)o(y)e(p)q(ossible,)j(p)q(erhaps)f(to)e(replace)j
-(calls)f(in)g(y)o(our)f(co)q(de)g(to)g Fn(gets\(\))f Fo(or)h
-Fn(fgets)f(\(\))p Fo(.)62 1235 y(The)g(function)g Fn(readline)g(\(\))f
-Fo(prin)o(ts)h(a)f(prompt)g(and)h(then)g(reads)f(and)g(returns)h(a)f(single)i
-(line)g(of)e(text)g(from)0 1297 y(the)g(user.)19 b(The)13 b(line)i
-Fn(readline)d Fo(returns)g(is)i(allo)q(cated)g(with)f Fn(malloc)h(\(\))p
-Fo(;)f(y)o(ou)g(should)h Fn(free)g(\(\))f Fo(the)g(line)h(when)0
-1360 y(y)o(ou)h(are)g(done)g(with)h(it.)k(The)15 b(declaration)h(for)f
-Fn(readline)f Fo(in)i(ANSI)g(C)f(is)120 1489 y Fn(char)23 b(*readline)g
-(\(char)g(*)p Fj(prompt)q Fn(\);)0 1631 y Fo(So,)15 b(one)g(migh)o(t)g(sa)o
-(y)120 1761 y Fn(char)23 b(*line)g(=)h(readline)f(\("Enter)g(a)h(line:)f
-("\);)0 1903 y Fo(in)17 b(order)g(to)f(read)g(a)g(line)j(of)d(text)g(from)g
-(the)g(user.)24 b(The)17 b(line)h(returned)f(has)g(the)f(\014nal)i(newline)g
-(remo)o(v)o(ed,)e(so)0 1965 y(only)g(the)f(text)g(remains.)62
-2107 y(If)g Fn(readline)f Fo(encoun)o(ters)h(an)f Fn(EOF)h
-Fo(while)h(reading)f(the)g(line,)h(and)f(the)g(line)h(is)f(empt)o(y)g(at)f
-(that)g(p)q(oin)o(t,)h(then)0 2169 y Fn(\(char)f(*\)NULL)h
-Fo(is)h(returned.)k(Otherwise,)15 b(the)h(line)h(is)e(ended)i(just)d(as)h(if)
-h(a)f(newline)i(had)e(b)q(een)i(t)o(yp)q(ed.)62 2311 y(If)g(y)o(ou)g(w)o(an)o
-(t)f(the)h(user)g(to)f(b)q(e)i(able)f(to)g(get)f(at)g(the)h(line)i(later,)e
-(\(with)g Fn(C-P)f Fo(for)g(example\),)i(y)o(ou)e(m)o(ust)h(call)0
-2374 y Fn(add_history)d(\(\))h Fo(to)f(sa)o(v)o(e)h(the)g(line)i(a)o(w)o(a)o
-(y)c(in)j(a)f Fj(history)k Fo(list)d(of)f(suc)o(h)h(lines.)120
-2503 y Fn(add_history)22 b(\(line\);)0 2645 y Fo(F)l(or)15
-b(full)h(details)g(on)f(the)h(GNU)f(History)g(Library)l(,)g(see)h(the)f(asso)
-q(ciated)g(man)o(ual.)p eop
-%%Page: 16 18
-17 bop 0 -83 a Fo(16)1449 b(GNU)15 b(Readline)i(Library)62
-158 y(It)e(is)g(preferable)g(to)f(a)o(v)o(oid)g(sa)o(ving)h(empt)o(y)f(lines)
-i(on)f(the)f(history)h(list,)g(since)g(users)g(rarely)g(ha)o(v)o(e)f(a)g
-(burning)0 221 y(need)i(to)e(reuse)h(a)f(blank)i(line.)21 b(Here)15
-b(is)g(a)g(function)g(whic)o(h)h(usefully)g(replaces)g(the)f(standard)f
-Fn(gets)h(\(\))f Fo(library)0 283 y(function,)i(and)f(has)g(the)g(adv)m(an)o
-(tage)g(of)g(no)g(static)g(bu\013er)g(to)g(o)o(v)o(er\015o)o(w:)120
-428 y Fn(/*)24 b(A)f(static)g(variable)g(for)h(holding)e(the)i(line.)f(*/)120
-477 y(static)g(char)g(*line_read)g(=)h(\(char)f(*\)NULL;)120
-577 y(/*)h(Read)f(a)h(string,)f(and)g(return)g(a)h(pointer)f(to)g(it.)48
-b(Returns)22 b(NULL)i(on)f(EOF.)h(*/)120 627 y(char)f(*)120
-677 y(rl_gets)g(\(\))120 726 y({)168 776 y(/*)g(If)h(the)f(buffer)g(has)h
-(already)f(been)g(allocated,)g(return)g(the)g(memory)239 826
-y(to)h(the)f(free)h(pool.)f(*/)168 876 y(if)g(\(line_read\))215
-926 y({)263 975 y(free)g(\(line_read\);)263 1025 y(line_read)g(=)h(\(char)f
-(*\)NULL;)215 1075 y(})168 1175 y(/*)g(Get)h(a)f(line)h(from)f(the)h(user.)f
-(*/)168 1225 y(line_read)f(=)i(readline)f(\(""\);)168 1324
-y(/*)g(If)h(the)f(line)h(has)f(any)h(text)f(in)g(it,)h(save)f(it)h(on)f(the)h
-(history.)f(*/)168 1374 y(if)g(\(line_read)g(&&)g(*line_read\))215
-1424 y(add_history)g(\(line_read\);)168 1523 y(return)g(\(line_read\);)120
-1573 y(})62 1730 y Fo(This)15 b(function)g(giv)o(es)f(the)g(user)g(the)g
-(default)h(b)q(eha)o(viour)g(of)e Fn(TAB)h Fo(completion:)20
-b(completion)15 b(on)f(\014le)h(names.)0 1793 y(If)h(y)o(ou)f(do)h(not)f(w)o
-(an)o(t)g(Readline)j(to)d(complete)i(on)e(\014lenames,)i(y)o(ou)e(can)h(c)o
-(hange)g(the)g(binding)i(of)d(the)h Fn(TAB)f Fo(k)o(ey)0 1855
-y(with)h Fn(rl_bind_key)d(\(\))p Fo(.)120 1999 y Fn(int)23
-b(rl_bind_key)g(\(int)g Fj(k)o(ey)p Fn(,)h(int)f(\(*)p Fj(function)p
-Fn(\)\(\)\);)62 2157 y(rl_bind_key)14 b(\(\))f Fo(tak)o(es)g(t)o(w)o(o)f
-(argumen)o(ts:)19 b Fj(k)o(ey)e Fo(is)d(the)g(c)o(haracter)f(that)g(y)o(ou)g
-(w)o(an)o(t)f(to)h(bind,)i(and)f Fj(function)0 2219 y Fo(is)g(the)g(address)g
-(of)f(the)h(function)g(to)f(call)i(when)f Fj(k)o(ey)j Fo(is)d(pressed.)20
-b(Binding)c Fn(TAB)d Fo(to)g Fn(rl_insert)h(\(\))f Fo(mak)o(es)g
-Fn(TAB)0 2281 y Fo(insert)i(itself.)20 b Fn(rl_bind_key)14
-b(\(\))g Fo(returns)g(non-zero)h(if)g Fj(k)o(ey)j Fo(is)d(not)f(a)g(v)m(alid)
-i(ASCI)q(I)f(c)o(haracter)f(co)q(de)h(\(b)q(et)o(w)o(een)0
-2343 y(0)g(and)g(255\).)62 2500 y(Th)o(us,)g(to)g(disable)h(the)g(default)f
-Fn(TAB)g Fo(b)q(eha)o(vior,)h(the)f(follo)o(wing)h(su\016ces:)120
-2645 y Fn(rl_bind_key)22 b(\('\\t',)h(rl_insert\);)p eop
-%%Page: 17 19
-18 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(17)62 158 y(This)12 b(co)q(de)f(should)h(b)q(e)f(executed)h(once)f(at)f
-(the)h(start)f(of)g(y)o(our)g(program;)h(y)o(ou)g(migh)o(t)f(write)h(a)g
-(function)g(called)0 221 y Fn(initialize_readline)i(\(\))j
-Fo(whic)o(h)h(p)q(erforms)f(this)h(and)f(other)g(desired)i(initializations,)h
-(suc)o(h)e(as)f(installing)0 283 y(custom)f(completers)g(\(see)h(Section)g
-(2.4)e([Custom)g(Completers],)h(page)g(28\).)0 539 y Fm(2.2)33
-b(Custom)14 b(F)-6 b(unctions)62 680 y Fo(Readline)18 b(pro)o(vides)f(man)o
-(y)e(functions)i(for)e(manipulating)j(the)e(text)f(of)g(the)h(line,)i(but)e
-(it)g(isn't)g(p)q(ossible)i(to)0 742 y(an)o(ticipate)i(the)g(needs)g(of)f
-(all)h(programs.)31 b(This)20 b(section)g(describ)q(es)h(the)f(v)m(arious)g
-(functions)g(and)g(v)m(ariables)0 804 y(de\014ned)c(within)f(the)g(Readline)i
-(library)e(whic)o(h)g(allo)o(w)g(a)f(user)g(program)f(to)h(add)h(customized)g
-(functionalit)o(y)h(to)0 866 y(Readline.)0 1106 y Fi(2.2.1)30
-b(The)15 b(F)-5 b(unction)14 b(T)n(yp)r(e)62 1247 y Fo(F)l(or)j(readabilt)o
-(y)l(,)h(w)o(e)f(declare)i(a)e(new)g(t)o(yp)q(e)h(of)f(ob)s(ject,)f(called)j
-Fj(F)l(unction)p Fo(.)28 b(A)17 b Fn(Function)f Fo(is)i(a)f(C)g(function)0
-1309 y(whic)o(h)f(returns)f(an)g Fn(int)p Fo(.)20 b(The)15
-b(t)o(yp)q(e)g(declaration)h(for)f Fn(Function)f Fo(is:)0 1450
-y Fn(typedef)g(int)h(Function)f(\(\);)62 1590 y Fo(The)i(reason)f(for)g
-(declaring)i(this)f(new)g(t)o(yp)q(e)f(is)h(to)f(mak)o(e)g(it)h(easier)g(to)f
-(write)g(co)q(de)h(describing)i(p)q(oin)o(ters)e(to)0 1652
-y(C)g(functions.)25 b(Let)17 b(us)f(sa)o(y)g(w)o(e)g(had)h(a)f(v)m(ariable)i
-(called)g Fj(func)i Fo(whic)o(h)d(w)o(as)f(a)g(p)q(oin)o(ter)h(to)f(a)g
-(function.)25 b(Instead)0 1715 y(of)15 b(the)g(classic)h(C)f(declaration)62
-1855 y Fn(int)g(\(*\)\(\)func;)0 1996 y Fo(w)o(e)g(ma)o(y)f(write)62
-2136 y Fn(Function)g(*func;)0 2277 y Fo(Similarly)l(,)j(there)e(are)120
-2405 y Fn(typedef)23 b(void)g(VFunction)g(\(\);)120 2455 y(typedef)g(char)g
-(*CPFunction)g(\(\);)g Fo(and)120 2505 y Fn(typedef)g(char)g(**CPPFunction)f
-(\(\);)0 2645 y Fo(for)12 b(functions)h(returning)g(no)g(v)m(alue,)g
-Fn(pointer)i(to)g(char)p Fo(,)d(and)g Fn(pointer)i(to)h(pointer)g(to)f(char)p
-Fo(,)e(resp)q(ectiv)o(ely)l(.)p eop
-%%Page: 18 20
-19 bop 0 -83 a Fo(18)1449 b(GNU)15 b(Readline)i(Library)0 158
-y Fi(2.2.2)30 b(W)-5 b(riting)15 b(a)g(New)g(F)-5 b(unction)62
-296 y Fo(In)22 b(order)f(to)g(write)g(new)h(functions)g(for)f(Readline,)j(y)o
-(ou)d(need)h(to)f(kno)o(w)g(the)g(calling)i(con)o(v)o(en)o(tions)f(for)0
-358 y(k)o(eyb)q(oard-in)o(v)o(ok)o(ed)17 b(functions,)g(and)f(the)h(names)f
-(of)g(the)h(v)m(ariables)h(that)d(describ)q(e)j(the)f(curren)o(t)f(state)g
-(of)g(the)0 420 y(line)h(read)e(so)g(far.)62 558 y(The)h(calling)h(sequence)f
-(for)f(a)f(command)i Fn(foo)e Fo(lo)q(oks)i(lik)o(e)120 683
-y Fn(foo)23 b(\(int)h(count,)f(int)g(key\))0 820 y Fo(where)f
-Fj(coun)o(t)g Fo(is)g(the)f(n)o(umeric)i(argumen)o(t)d(\(or)h(1)g(if)h
-(defaulted\))g(and)f Fj(k)o(ey)26 b Fo(is)21 b(the)h(k)o(ey)f(that)g(in)o(v)o
-(ok)o(ed)h(this)0 882 y(function.)62 1020 y(It)f(is)h(completely)g(up)f(to)f
-(the)h(function)h(as)f(to)f(what)g(should)i(b)q(e)g(done)f(with)g(the)g(n)o
-(umeric)h(argumen)o(t.)0 1082 y(Some)c(functions)g(use)g(it)g(as)f(a)h(rep)q
-(eat)g(coun)o(t,)f(some)h(as)f(a)g(\015ag,)h(and)g(others)f(to)g(c)o(ho)q
-(ose)h(alternate)f(b)q(eha)o(vior)0 1144 y(\(refreshing)12
+b(This)18 b(section)f(describ)q(es)i(ho)o(w)e(to)f(use)i(Readline)h(in)
+f(the)0 1114 y(simplest)e(w)o(a)o(y)e(p)q(ossible,)j(p)q(erhaps)f(to)e
+(replace)j(calls)f(in)g(y)o(our)f(co)q(de)g(to)g Fq(gets\(\))f
+Fr(or)h Fq(fgets)f(\(\))p Fr(.)62 1256 y(The)g(function)g
+Fq(readline)g(\(\))f Fr(prin)o(ts)h(a)f(prompt)g(and)h(then)g(reads)f
+(and)g(returns)h(a)f(single)i(line)g(of)e(text)g(from)0
+1318 y(the)g(user.)19 b(The)13 b(line)i Fq(readline)d
+Fr(returns)g(is)i(allo)q(cated)g(with)f Fq(malloc)h(\(\))p
+Fr(;)f(y)o(ou)g(should)h Fq(free)g(\(\))f Fr(the)g(line)h(when)0
+1380 y(y)o(ou)h(are)g(done)g(with)h(it.)k(The)15 b(declaration)h(for)f
+Fq(readline)f Fr(in)i(ANSI)g(C)f(is)120 1512 y Fq(char)23
+b(*readline)g(\(char)g(*)p Fl(prompt)q Fq(\);)0 1653
+y Fr(So,)15 b(one)g(migh)o(t)g(sa)o(y)120 1785 y Fq(char)23
+b(*line)g(=)h(readline)f(\("Enter)g(a)h(line:)f("\);)0
+1927 y Fr(in)17 b(order)g(to)f(read)g(a)g(line)j(of)d(text)g(from)g
+(the)g(user.)24 b(The)17 b(line)h(returned)f(has)g(the)f(\014nal)i
+(newline)g(remo)o(v)o(ed,)e(so)0 1989 y(only)g(the)f(text)g(remains.)62
+2131 y(If)g Fq(readline)f Fr(encoun)o(ters)h(an)f Fq(EOF)h
+Fr(while)h(reading)f(the)g(line,)h(and)f(the)g(line)h(is)f(empt)o(y)g
+(at)f(that)g(p)q(oin)o(t,)h(then)0 2193 y Fq(\(char)f(*\)NULL)h
+Fr(is)h(returned.)k(Otherwise,)15 b(the)h(line)h(is)e(ended)i(just)d
+(as)h(if)h(a)f(newline)i(had)e(b)q(een)i(t)o(yp)q(ed.)62
+2335 y(If)g(y)o(ou)g(w)o(an)o(t)f(the)h(user)g(to)f(b)q(e)i(able)f(to)g
+(get)f(at)g(the)h(line)i(later,)e(\(with)g Fq(C-P)f Fr(for)g
+(example\),)i(y)o(ou)e(m)o(ust)h(call)0 2397 y Fq(add_history)d(\(\))h
+Fr(to)f(sa)o(v)o(e)h(the)g(line)i(a)o(w)o(a)o(y)c(in)j(a)f
+Fl(history)k Fr(list)d(of)f(suc)o(h)h(lines.)120 2528
+y Fq(add_history)22 b(\(line\);)0 2670 y Fr(F)l(or)15
+b(full)h(details)g(on)f(the)h(GNU)f(History)g(Library)l(,)g(see)h(the)f
+(asso)q(ciated)g(man)o(ual.)p eop
+20 21 bop 0 -58 a Fr(20)1449 b(GNU)15 b(Readline)i(Library)62
+183 y(It)e(is)g(preferable)g(to)f(a)o(v)o(oid)g(sa)o(ving)h(empt)o(y)f
+(lines)i(on)f(the)f(history)h(list,)g(since)g(users)g(rarely)g(ha)o(v)o
+(e)f(a)g(burning)0 246 y(need)i(to)e(reuse)h(a)f(blank)i(line.)21
+b(Here)15 b(is)g(a)g(function)g(whic)o(h)h(usefully)g(replaces)g(the)f
+(standard)f Fq(gets)h(\(\))f Fr(library)0 308 y(function,)i(and)f(has)g
+(the)g(adv)m(an)o(tage)g(of)g(no)g(static)g(bu\013er)g(to)g(o)o(v)o
+(er\015o)o(w:)120 445 y Fq(/*)24 b(A)f(static)g(variable)g(for)h
+(holding)e(the)i(line.)f(*/)120 497 y(static)g(char)g(*line_read)g(=)h
+(\(char)f(*\)NULL;)120 601 y(/*)h(Read)f(a)h(string,)f(and)g(return)g
+(a)h(pointer)f(to)g(it.)48 b(Returns)22 b(NULL)i(on)f(EOF.)h(*/)120
+653 y(char)f(*)120 705 y(rl_gets)g(\(\))120 757 y({)168
+809 y(/*)g(If)h(the)f(buffer)g(has)h(already)f(been)g(allocated,)g
+(return)g(the)g(memory)239 861 y(to)h(the)f(free)h(pool.)f(*/)168
+912 y(if)g(\(line_read\))215 964 y({)263 1016 y(free)g(\(line_read\);)
+263 1068 y(line_read)g(=)h(\(char)f(*\)NULL;)215 1120
+y(})168 1224 y(/*)g(Get)h(a)f(line)h(from)f(the)h(user.)f(*/)168
+1276 y(line_read)f(=)i(readline)f(\(""\);)168 1379 y(/*)g(If)h(the)f
+(line)h(has)f(any)h(text)f(in)g(it,)h(save)f(it)h(on)f(the)h(history.)f
+(*/)168 1431 y(if)g(\(line_read)g(&&)g(*line_read\))215
+1483 y(add_history)g(\(line_read\);)168 1587 y(return)g(\(line_read\);)
+120 1639 y(})62 1787 y Fr(This)15 b(function)g(giv)o(es)f(the)g(user)g
+(the)g(default)h(b)q(eha)o(viour)g(of)e Fq(TAB)h Fr(completion:)20
+b(completion)15 b(on)f(\014le)h(names.)0 1849 y(If)h(y)o(ou)f(do)h(not)
+f(w)o(an)o(t)g(Readline)j(to)d(complete)i(on)e(\014lenames,)i(y)o(ou)e
+(can)h(c)o(hange)g(the)g(binding)i(of)d(the)h Fq(TAB)f
+Fr(k)o(ey)0 1912 y(with)h Fq(rl_bind_key)d(\(\))p Fr(.)120
+2049 y Fq(int)23 b(rl_bind_key)g(\(int)g Fl(k)o(ey)p
+Fq(,)h(int)f(\(*)p Fl(function)p Fq(\)\(\)\);)62 2197
+y(rl_bind_key)14 b(\(\))f Fr(tak)o(es)g(t)o(w)o(o)f(argumen)o(ts:)19
+b Fl(k)o(ey)e Fr(is)d(the)g(c)o(haracter)f(that)g(y)o(ou)g(w)o(an)o(t)f
+(to)h(bind,)i(and)f Fl(function)0 2260 y Fr(is)g(the)g(address)g(of)f
+(the)h(function)g(to)f(call)i(when)f Fl(k)o(ey)j Fr(is)d(pressed.)20
+b(Binding)c Fq(TAB)d Fr(to)g Fq(rl_insert)h(\(\))f Fr(mak)o(es)g
+Fq(TAB)0 2322 y Fr(insert)i(itself.)20 b Fq(rl_bind_key)14
+b(\(\))g Fr(returns)g(non-zero)h(if)g Fl(k)o(ey)j Fr(is)d(not)f(a)g(v)m
+(alid)i(ASCI)q(I)f(c)o(haracter)f(co)q(de)h(\(b)q(et)o(w)o(een)0
+2384 y(0)g(and)g(255\).)62 2532 y(Th)o(us,)g(to)g(disable)h(the)g
+(default)f Fq(TAB)g Fr(b)q(eha)o(vior,)h(the)f(follo)o(wing)h
+(su\016ces:)120 2670 y Fq(rl_bind_key)22 b(\('\\t',)h(rl_insert\);)p
+eop
+21 22 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(21)62 183 y(This)12 b(co)q(de)f(should)h(b)q(e)f
+(executed)h(once)f(at)f(the)h(start)f(of)g(y)o(our)g(program;)h(y)o(ou)
+g(migh)o(t)f(write)h(a)g(function)g(called)0 246 y Fq
+(initialize_readline)i(\(\))j Fr(whic)o(h)h(p)q(erforms)f(this)h(and)f
+(other)g(desired)i(initializations,)h(suc)o(h)e(as)f(installing)0
+308 y(custom)f(completers)g(\(see)h(Section)g(2.5)e([Custom)g
+(Completers],)h(page)g(34\).)0 562 y Fp(2.2)33 b(Custom)14
+b(F)-6 b(unctions)62 702 y Fr(Readline)18 b(pro)o(vides)f(man)o(y)e
+(functions)i(for)e(manipulating)j(the)e(text)f(of)g(the)h(line,)i(but)e
+(it)g(isn't)g(p)q(ossible)i(to)0 765 y(an)o(ticipate)i(the)g(needs)g
+(of)f(all)h(programs.)31 b(This)20 b(section)g(describ)q(es)h(the)f(v)m
+(arious)g(functions)g(and)g(v)m(ariables)0 827 y(de\014ned)c(within)f
+(the)g(Readline)i(library)e(whic)o(h)g(allo)o(w)g(a)f(user)g(program)f
+(to)h(add)h(customized)g(functionalit)o(y)h(to)0 889
+y(Readline.)0 1127 y Fk(2.2.1)30 b(The)15 b(F)-5 b(unction)14
+b(T)n(yp)r(e)62 1267 y Fr(F)l(or)j(readabilt)o(y)l(,)h(w)o(e)f(declare)
+i(a)e(new)g(t)o(yp)q(e)h(of)f(ob)s(ject,)f(called)j Fl(F)l(unction)p
+Fr(.)28 b(A)17 b Fq(Function)f Fr(is)i(a)f(C)g(function)0
+1329 y(whic)o(h)f(returns)f(an)g Fq(int)p Fr(.)20 b(The)15
+b(t)o(yp)q(e)g(declaration)h(for)f Fq(Function)f Fr(is:)0
+1470 y Fq(typedef)g(int)h(Function)f(\(\);)62 1610 y
+Fr(The)i(reason)f(for)g(declaring)i(this)f(new)g(t)o(yp)q(e)f(is)h(to)f
+(mak)o(e)g(it)h(easier)g(to)f(write)g(co)q(de)h(describing)i(p)q(oin)o
+(ters)e(to)0 1672 y(C)g(functions.)25 b(Let)17 b(us)f(sa)o(y)g(w)o(e)g
+(had)h(a)f(v)m(ariable)i(called)g Fl(func)i Fr(whic)o(h)d(w)o(as)f(a)g
+(p)q(oin)o(ter)h(to)f(a)g(function.)25 b(Instead)0 1735
+y(of)15 b(the)g(classic)h(C)f(declaration)62 1875 y Fq(int)g
+(\(*\)\(\)func;)0 2015 y Fr(w)o(e)g(ma)o(y)f(write)62
+2156 y Fq(Function)g(*func;)0 2296 y Fr(Similarly)l(,)j(there)e(are)120
+2426 y Fq(typedef)23 b(void)g(VFunction)g(\(\);)120 2478
+y(typedef)g(char)g(*CPFunction)g(\(\);)g Fr(and)120 2530
+y Fq(typedef)g(char)g(**CPPFunction)f(\(\);)0 2670 y
+Fr(for)12 b(functions)h(returning)g(no)g(v)m(alue,)g
+Fq(pointer)i(to)g(char)p Fr(,)d(and)g Fq(pointer)i(to)h(pointer)g(to)f
+(char)p Fr(,)e(resp)q(ectiv)o(ely)l(.)p eop
+22 23 bop 0 -58 a Fr(22)1449 b(GNU)15 b(Readline)i(Library)0
+183 y Fk(2.2.2)30 b(W)-5 b(riting)15 b(a)g(New)g(F)-5
+b(unction)62 325 y Fr(In)22 b(order)f(to)g(write)g(new)h(functions)g
+(for)f(Readline,)j(y)o(ou)d(need)h(to)f(kno)o(w)g(the)g(calling)i(con)o
+(v)o(en)o(tions)f(for)0 387 y(k)o(eyb)q(oard-in)o(v)o(ok)o(ed)17
+b(functions,)g(and)f(the)h(names)f(of)g(the)h(v)m(ariables)h(that)d
+(describ)q(e)j(the)f(curren)o(t)f(state)g(of)g(the)0
+449 y(line)h(read)e(so)g(far.)62 591 y(The)h(calling)h(sequence)f(for)f
+(a)f(command)i Fq(foo)e Fr(lo)q(oks)i(lik)o(e)120 722
+y Fq(foo)23 b(\(int)h(count,)f(int)g(key\))0 864 y Fr(where)f
+Fl(coun)o(t)g Fr(is)g(the)f(n)o(umeric)i(argumen)o(t)d(\(or)h(1)g(if)h
+(defaulted\))g(and)f Fl(k)o(ey)26 b Fr(is)21 b(the)h(k)o(ey)f(that)g
+(in)o(v)o(ok)o(ed)h(this)0 926 y(function.)62 1068 y(It)f(is)h
+(completely)g(up)f(to)f(the)h(function)h(as)f(to)f(what)g(should)i(b)q
+(e)g(done)f(with)g(the)g(n)o(umeric)h(argumen)o(t.)0
+1130 y(Some)c(functions)g(use)g(it)g(as)f(a)h(rep)q(eat)g(coun)o(t,)f
+(some)h(as)f(a)g(\015ag,)h(and)g(others)f(to)g(c)o(ho)q(ose)h
+(alternate)f(b)q(eha)o(vior)0 1192 y(\(refreshing)12
b(the)g(curren)o(t)g(line)h(as)f(opp)q(osed)g(to)f(refreshing)i(the)f
(screen,)g(for)g(example\).)19 b(Some)12 b(c)o(ho)q(ose)f(to)h(ignore)0
-1207 y(it.)24 b(In)17 b(general,)g(if)g(a)g(function)g(uses)g(the)g(n)o
-(umeric)g(argumen)o(t)f(as)g(a)g(rep)q(eat)h(coun)o(t,)f(it)h(should)h(b)q(e)
-f(able)g(to)f(do)0 1269 y(something)f(useful)g(with)g(b)q(oth)f(negativ)o(e)h
-(and)f(p)q(ositiv)o(e)i(argumen)o(ts.)i(A)o(t)c(the)h(v)o(ery)f(least,)g(it)h
-(should)g(b)q(e)g(a)o(w)o(are)0 1331 y(that)f(it)i(can)f(b)q(e)h(passed)g(a)e
-(negativ)o(e)i(argumen)o(t.)1736 1494 y(V)l(ariable)-1899 b
-Fh(char)20 b(*)f Fg(rl)p 211 1494 18 3 v 21 w(line)p 320 1494
-V 23 w(bu\013er)120 1557 y Fo(This)f(is)g(the)f(line)i(gathered)e(so)g(far.)
-25 b(Y)l(ou)18 b(are)f(w)o(elcome)g(to)g(mo)q(dify)h(the)f(con)o(ten)o(ts)g
-(of)f(the)i(line,)120 1619 y(but)d(see)h(Section)g(2.3.5)d([Allo)o(wing)k
-(Undoing],)e(page)g(23.)1736 1782 y(V)l(ariable)-1899 b Fh(int)20
-b Fg(rl)p 140 1782 V 21 w(p)r(oin)n(t)120 1844 y Fo(The)15
-b(o\013set)g(of)f(the)i(curren)o(t)f(cursor)g(p)q(osition)h(in)g
-Fn(rl_line_buffer)d Fo(\(the)i Fj(p)q(oin)o(t)q Fo(\).)1736
-2007 y(V)l(ariable)-1899 b Fh(int)20 b Fg(rl)p 140 2007 V 21
-w(end)120 2070 y Fo(The)d(n)o(um)o(b)q(er)f(of)g(c)o(haracters)g(presen)o(t)g
-(in)h Fn(rl_line_buffer)p Fo(.)k(When)c Fn(rl_point)e Fo(is)i(at)f(the)g(end)
-120 2132 y(of)f(the)g(line,)i Fn(rl_point)d Fo(and)h Fn(rl_end)f
-Fo(are)h(equal.)1736 2295 y(V)l(ariable)-1899 b Fh(int)20 b
-Fg(rl)p 140 2295 V 21 w(mark)120 2357 y Fo(The)h(mark)e(\(sa)o(v)o(ed)h(p)q
-(osition\))h(in)g(the)f(curren)o(t)h(line.)37 b(If)20 b(set,)h(the)g(mark)e
-(and)i(p)q(oin)o(t)g(de\014ne)g(a)120 2420 y Fj(region)p Fo(.)1736
-2583 y(V)l(ariable)-1899 b Fh(int)20 b Fg(rl)p 140 2583 V 21
-w(done)120 2645 y Fo(Setting)13 b(this)h(to)f(a)f(non-zero)i(v)m(alue)g
-(causes)f(Readline)j(to)c(return)h(the)h(curren)o(t)f(line)h(immediately)l(.)
-p eop
-%%Page: 19 21
-20 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(19)1736 158 y(V)l(ariable)-1899 b Fh(int)20 b Fg(rl)p 140
-158 18 3 v 21 w(p)r(ending)p 361 158 V 20 w(input)120 221 y
-Fo(Setting)15 b(this)f(to)g(a)g(v)m(alue)i(mak)o(es)d(it)i(the)f(next)h(k)o
-(eystrok)o(e)e(read.)19 b(This)c(is)g(a)f(w)o(a)o(y)f(to)h(stu\013)g(a)g
-(single)120 283 y(c)o(haracter)g(in)o(to)i(the)f(input)h(stream.)1736
-451 y(V)l(ariable)-1899 b Fh(char)20 b(*)f Fg(rl)p 211 451
-V 21 w(prompt)120 513 y Fo(The)c(prompt)e(Readline)k(uses.)j(This)15
-b(is)f(set)h(from)e(the)h(argumen)o(t)g(to)g Fn(readline)g(\(\))p
-Fo(,)f(and)i(should)120 575 y(not)g(b)q(e)h(assigned)f(to)g(directly)l(.)1736
-743 y(V)l(ariable)-1899 b Fh(char)20 b(*)f Fg(rl)p 211 743
-V 21 w(terminal)p 443 743 V 21 w(name)120 806 y Fo(The)c(terminal)h(t)o(yp)q
-(e,)f(used)h(for)f(initialization.)1736 974 y(V)l(ariable)-1899
-b Fh(char)20 b(*)f Fg(rl)p 211 974 V 21 w(readline)p 430 974
-V 22 w(name)120 1036 y Fo(This)f(v)m(ariable)h(is)f(set)f(to)g(a)g(unique)i
-(name)f(b)o(y)f(eac)o(h)h(application)h(using)f(Readline.)29
-b(The)18 b(v)m(alue)120 1098 y(allo)o(ws)f(conditional)h(parsing)f(of)f(the)g
-(inputrc)i(\014le)f(\(see)g(Section)g(1.3.2)e([Conditional)j(Init)f(Con-)120
-1160 y(structs],)d(page)h(7\).)1736 1328 y(V)l(ariable)-1899
-b Fh(FILE)20 b(*)f Fg(rl)p 211 1328 V 21 w(instream)120 1391
-y Fo(The)c(stdio)h(stream)e(from)h(whic)o(h)h(Readline)h(reads)e(input.)1736
-1559 y(V)l(ariable)-1899 b Fh(FILE)20 b(*)f Fg(rl)p 211 1559
-V 21 w(outstream)120 1621 y Fo(The)c(stdio)h(stream)e(to)h(whic)o(h)h
-(Readline)h(p)q(erforms)e(output.)1736 1789 y(V)l(ariable)-1899
-b Fh(Function)20 b(*)g Fg(rl)p 316 1789 V 21 w(startup)p 520
-1789 V 20 w(ho)r(ok)120 1851 y Fo(If)13 b(non-zero,)h(this)f(is)h(the)f
-(address)g(of)g(a)f(function)i(to)f(call)h(just)f(b)q(efore)g
-Fn(readline)f Fo(prin)o(ts)h(the)g(\014rst)120 1913 y(prompt.)0
-2156 y Fm(2.3)33 b(Readline)16 b(Con)n(v)n(enience)g(F)-6 b(unctions)0
-2382 y Fi(2.3.1)30 b(Naming)15 b(a)g(F)-5 b(unction)62 2521
-y Fo(The)19 b(user)f(can)g(dynamically)i(c)o(hange)e(the)g(bindings)i(of)e(k)
-o(eys)f(while)j(using)f(Readline.)30 b(This)19 b(is)g(done)f(b)o(y)0
-2583 y(represen)o(ting)f(the)g(function)h(with)f(a)g(descriptiv)o(e)h(name.)
-25 b(The)17 b(user)g(is)g(able)h(to)e(t)o(yp)q(e)h(the)g(descriptiv)o(e)h
-(name)0 2645 y(when)e(referring)f(to)g(the)g(function.)21 b(Th)o(us,)14
-b(in)j(an)e(init)h(\014le,)g(one)f(migh)o(t)g(\014nd)p eop
-%%Page: 20 22
-21 bop 0 -83 a Fo(20)1449 b(GNU)15 b(Readline)i(Library)120
-158 y Fn(Meta-Rubout:)46 b(backward-kill-word)62 297 y Fo(This)21
-b(binds)f(the)g(k)o(eystrok)o(e)f Fn(META-RUBOUT)f Fo(to)h(the)h(function)g
-Fj(descriptiv)o(ely)26 b Fo(named)20 b Fn(backward-kill-)0
-359 y(word)p Fo(.)j(Y)l(ou,)16 b(as)g(the)g(programmer,)f(should)i(bind)h
-(the)e(functions)i(y)o(ou)d(write)i(to)e(descriptiv)o(e)j(names)e(as)g(w)o
-(ell.)0 421 y(Readline)i(pro)o(vides)d(a)g(function)h(for)f(doing)g(that:)
-1725 587 y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140 587
-18 3 v 21 w(add)p 253 587 V 20 w(defun)i Ff(\()p Fn(char)14
-b(*name,)g(Function)g(*function,)g(int)h(key)p Ff(\))120 649
-y Fo(Add)20 b Fj(name)i Fo(to)d(the)h(list)g(of)f(named)h(functions.)33
-b(Mak)o(e)19 b Fj(function)i Fo(b)q(e)f(the)f(function)i(that)d(gets)120
-711 y(called.)j(If)16 b Fj(k)o(ey)j Fo(is)d(not)e(-1,)h(then)h(bind)g(it)g
-(to)e Fj(function)i Fo(using)g Fn(rl_bind_key)e(\(\))p Fo(.)62
-877 y(Using)i(this)g(function)g(alone)g(is)g(su\016cien)o(t)h(for)d(most)h
-(applications.)22 b(It)16 b(is)g(the)f(recommended)i(w)o(a)o(y)d(to)h(add)0
-940 y(a)i(few)h(functions)g(to)f(the)h(default)g(functions)h(that)e(Readline)
-j(has)d(built)i(in.)28 b(If)18 b(y)o(ou)g(need)g(to)f(do)h(something)0
-1002 y(other)c(than)h(adding)h(a)e(function)i(to)e(Readline,)j(y)o(ou)d(ma)o
-(y)g(need)i(to)e(use)h(the)g(underlying)h(functions)g(describ)q(ed)0
-1064 y(b)q(elo)o(w.)0 1283 y Fi(2.3.2)30 b(Selecting)15 b(a)g(Keymap)62
-1422 y Fo(Key)k(bindings)i(tak)o(e)c(place)j(on)e(a)g Fj(k)o(eymap)p
-Fo(.)30 b(The)18 b(k)o(eymap)h(is)g(the)f(asso)q(ciation)h(b)q(et)o(w)o(een)g
-(the)f(k)o(eys)h(that)0 1484 y(the)g(user)g(t)o(yp)q(es)g(and)g(the)g
-(functions)g(that)f(get)h(run.)30 b(Y)l(ou)20 b(can)e(mak)o(e)h(y)o(our)f(o)o
-(wn)g(k)o(eymaps,)h(cop)o(y)g(existing)0 1546 y(k)o(eymaps,)14
-b(and)i(tell)g(Readline)i(whic)o(h)e(k)o(eymap)f(to)f(use.)1725
-1712 y(F)l(unction)-1899 b Fh(Keymap)20 b Fg(rl)p 218 1712
-V 21 w(mak)n(e)p 370 1712 V 20 w(bare)p 500 1712 V 20 w(k)n(eymap)j
-Ff(\(\))120 1774 y Fo(Returns)14 b(a)f(new,)g(empt)o(y)g(k)o(eymap.)19
-b(The)14 b(space)f(for)g(the)h(k)o(eymap)f(is)g(allo)q(cated)i(with)e
-Fn(malloc)i(\(\))p Fo(;)120 1836 y(y)o(ou)g(should)h Fn(free)f(\(\))g
-Fo(it)g(when)h(y)o(ou)f(are)f(done.)1725 2002 y(F)l(unction)-1899
-b Fh(Keymap)20 b Fg(rl)p 218 2002 V 21 w(cop)n(y)p 353 2002
-V 21 w(k)n(eymap)j Ff(\()p Fn(Keymap)14 b(map)p Ff(\))120 2064
-y Fo(Return)i(a)f(new)g(k)o(eymap)g(whic)o(h)h(is)g(a)f(cop)o(y)g(of)g
-Fj(map)p Fo(.)1725 2230 y(F)l(unction)-1899 b Fh(Keymap)20
-b Fg(rl)p 218 2230 V 21 w(mak)n(e)p 370 2230 V 20 w(k)n(eymap)j
-Ff(\(\))120 2293 y Fo(Return)c(a)f(new)h(k)o(eymap)f(with)h(the)f(prin)o
-(ting)i(c)o(haracters)d(b)q(ound)j(to)e(rl)p 1407 2293 14 2
-v 16 w(insert,)i(the)e(lo)o(w)o(ercase)120 2355 y(Meta)13 b(c)o(haracters)g
-(b)q(ound)h(to)f(run)h(their)g(equiv)m(alen)o(ts,)i(and)d(the)h(Meta)f
-(digits)h(b)q(ound)h(to)e(pro)q(duce)120 2417 y(n)o(umeric)j(argumen)o(ts.)
-1725 2583 y(F)l(unction)-1899 b Fh(void)20 b Fg(rl)p 166 2583
-18 3 v 21 w(discard)p 366 2583 V 21 w(k)n(eymap)i Ff(\()p Fn(Keymap)14
-b(keymap)p Ff(\))120 2645 y Fo(F)l(ree)h(the)h(storage)d(asso)q(ciated)j
-(with)f Fj(k)o(eymap)p Fo(.)p eop
-%%Page: 21 23
-22 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(21)62 158 y(Readline)20 b(has)d(sev)o(eral)h(in)o(ternal)g(k)o(eymaps.)26
-b(These)18 b(functions)g(allo)o(w)g(y)o(ou)f(to)g(c)o(hange)g(whic)o(h)h(k)o
-(eymap)f(is)0 221 y(activ)o(e.)1725 383 y(F)l(unction)-1899
-b Fh(Keymap)20 b Fg(rl)p 218 383 18 3 v 21 w(get)p 316 383
-V 21 w(k)n(eymap)i Ff(\(\))120 445 y Fo(Returns)16 b(the)f(curren)o(tly)h
-(activ)o(e)f(k)o(eymap.)1725 607 y(F)l(unction)-1899 b Fh(void)20
-b Fg(rl)p 166 607 V 21 w(set)p 258 607 V 21 w(k)n(eymap)i Ff(\()p
-Fn(Keymap)14 b(keymap)p Ff(\))120 669 y Fo(Mak)o(es)g Fj(k)o(eymap)j
-Fo(the)e(curren)o(tly)h(activ)o(e)f(k)o(eymap.)1725 831 y(F)l(unction)-1899
-b Fh(Keymap)20 b Fg(rl)p 218 831 V 21 w(get)p 316 831 V 21
-w(k)n(eymap)p 530 831 V 20 w(b)n(y)p 610 831 V 21 w(name)i
-Ff(\()p Fn(char)14 b(*name)p Ff(\))120 893 y Fo(Return)19 b(the)g(k)o(eymap)f
-(matc)o(hing)g Fj(name)p Fo(.)30 b Fj(name)21 b Fo(is)e(one)g(whic)o(h)g(w)o
-(ould)g(b)q(e)g(supplied)i(in)e(a)f Fn(set)120 955 y(keymap)c
-Fo(inputrc)j(line)f(\(see)g(Section)g(1.3)e([Readline)j(Init)f(File],)g(page)
-f(4\).)0 1163 y Fi(2.3.3)30 b(Binding)15 b(Keys)62 1300 y Fo(Y)l(ou)h(asso)q
-(ciate)f(k)o(eys)f(with)i(functions)g(through)e(the)i(k)o(eymap.)j(Readline)f
-(has)c(sev)o(eral)i(in)o(ternal)g(k)o(eymaps:)0 1362 y Fn
-(emacs_standard_keymap)p Fo(,)i Fn(emacs_meta_keymap)p Fo(,)g
-Fn(emacs_ctlx_keymap)p Fo(,)h Fn(vi_movement_keymap)p Fo(,)f(and)0
-1425 y Fn(vi_insertion_keymap)p Fo(.)h Fn(emacs_standard_keymap)13
-b Fo(is)k(the)f(default,)g(and)g(the)g(examples)h(in)f(this)h(man)o(ual)0
-1487 y(assume)e(that.)62 1624 y(These)h(functions)g(manage)e(k)o(ey)i
-(bindings.)1725 1786 y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p
-140 1786 V 21 w(bind)p 272 1786 V 21 w(k)n(ey)k Ff(\()p Fn(int)14
-b(key,)h(Function)f(*function)p Ff(\))120 1848 y Fo(Binds)i
-Fj(k)o(ey)j Fo(to)14 b Fj(function)i Fo(in)g(the)f(curren)o(tly)h(activ)o(e)f
-(k)o(eymap.)k(Returns)d(non-zero)f(in)h(the)f(case)g(of)120
-1910 y(an)g(in)o(v)m(alid)j Fj(k)o(ey)p Fo(.)1725 2072 y(F)l(unction)-1899
-b Fh(int)19 b Fg(rl)p 139 2072 V 21 w(bind)p 271 2072 V 21
-w(k)n(ey)p 376 2072 V 21 w(in)p 444 2072 V 22 w(map)i Ff(\()p
-Fn(int)14 b(key,)h(Function)f(*function,)g(Keymap)g(map)p Ff(\))120
-2134 y Fo(Bind)i Fj(k)o(ey)j Fo(to)c Fj(function)h Fo(in)g
-Fj(map)p Fo(.)k(Returns)15 b(non-zero)h(in)g(the)f(case)g(of)g(an)g(in)o(v)m
-(alid)j Fj(k)o(ey)p Fo(.)1725 2296 y(F)l(unction)-1899 b Fh(int)20
-b Fg(rl)p 140 2296 V 21 w(un)n(bind)p 334 2296 V 21 w(k)n(ey)k
-Ff(\()p Fn(int)14 b(key)p Ff(\))120 2359 y Fo(Bind)h Fj(k)o(ey)i
-Fo(to)c(the)h(n)o(ull)h(function)f(in)g(the)g(curren)o(tly)g(activ)o(e)g(k)o
-(eymap.)19 b(Returns)14 b(non-zero)g(in)g(case)120 2421 y(of)h(error.)1725
-2583 y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140 2583 V 21
-w(un)n(bind)p 334 2583 V 21 w(k)n(ey)p 439 2583 V 21 w(in)p
-507 2583 V 22 w(map)h Ff(\()p Fn(int)14 b(key,)h(Keymap)f(map)p
-Ff(\))120 2645 y Fo(Bind)i Fj(k)o(ey)j Fo(to)c(the)g(n)o(ull)i(function)f(in)
-g Fj(map)p Fo(.)k(Returns)15 b(non-zero)h(in)g(case)f(of)g(error.)p
+1255 y(it.)24 b(In)17 b(general,)g(if)g(a)g(function)g(uses)g(the)g(n)o
+(umeric)g(argumen)o(t)f(as)g(a)g(rep)q(eat)h(coun)o(t,)f(it)h(should)h
+(b)q(e)f(able)g(to)f(do)0 1317 y(something)f(useful)g(with)g(b)q(oth)f
+(negativ)o(e)h(and)f(p)q(ositiv)o(e)i(argumen)o(ts.)i(A)o(t)c(the)h(v)o
+(ery)f(least,)g(it)h(should)g(b)q(e)g(a)o(w)o(are)0 1379
+y(that)f(it)i(can)f(b)q(e)h(passed)g(a)e(negativ)o(e)i(argumen)o(t.)0
+1645 y Fp(2.3)33 b(Readline)16 b(V)-6 b(ariables)62 1787
+y Fr(These)16 b(v)m(ariables)g(are)f(a)o(v)m(ailable)i(to)e(function)h
+(writers.)1736 1963 y(V)l(ariable)-1899 b Fi(char)20
+b(*)f Fh(rl)p 211 1963 18 3 v 21 w(line)p 320 1963 V
+23 w(bu\013er)120 2025 y Fr(This)f(is)g(the)f(line)i(gathered)e(so)g
+(far.)25 b(Y)l(ou)18 b(are)f(w)o(elcome)g(to)g(mo)q(dify)h(the)f(con)o
+(ten)o(ts)g(of)f(the)i(line,)120 2087 y(but)d(see)h(Section)g(2.4.5)d
+([Allo)o(wing)k(Undoing],)e(page)g(28.)1736 2263 y(V)l(ariable)-1899
+b Fi(int)20 b Fh(rl)p 140 2263 V 21 w(p)r(oin)n(t)120
+2325 y Fr(The)15 b(o\013set)g(of)f(the)i(curren)o(t)f(cursor)g(p)q
+(osition)h(in)g Fq(rl_line_buffer)d Fr(\(the)i Fl(p)q(oin)o(t)q
+Fr(\).)1736 2501 y(V)l(ariable)-1899 b Fi(int)20 b Fh(rl)p
+140 2501 V 21 w(end)120 2563 y Fr(The)d(n)o(um)o(b)q(er)f(of)g(c)o
+(haracters)g(presen)o(t)g(in)h Fq(rl_line_buffer)p Fr(.)k(When)c
+Fq(rl_point)e Fr(is)i(at)f(the)g(end)120 2626 y(of)f(the)g(line,)i
+Fq(rl_point)d Fr(and)h Fq(rl_end)f Fr(are)h(equal.)p
eop
-%%Page: 22 24
-23 bop 0 -83 a Fo(22)1449 b(GNU)15 b(Readline)i(Library)1725
-158 y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140 158 18 3
-v 21 w(generic)p 338 158 V 21 w(bind)j Ff(\()p Fn(int)15 b(type,)f(char)h
-(*keyseq,)f(char)h(*data,)f(Keymap)208 221 y(map)p Ff(\))120
-283 y Fo(Bind)j(the)f(k)o(ey)g(sequence)h(represen)o(ted)f(b)o(y)g(the)g
-(string)g Fj(k)o(eyseq)g Fo(to)g(the)f(arbitrary)h(p)q(oin)o(ter)g
-Fj(data)p Fo(.)120 345 y Fj(t)o(yp)q(e)j Fo(sa)o(ys)c(what)g(kind)i(of)f
-(data)f(is)i(p)q(oin)o(ted)g(to)e(b)o(y)h Fj(data)p Fo(;)f(this)i(can)f(b)q
-(e)g(a)g(function)h(\()p Fn(ISFUNC)p Fo(\),)d(a)120 407 y(macro)i(\()p
-Fn(ISMACR)p Fo(\),)f(or)i(a)f(k)o(eymap)g(\()p Fn(ISKMAP)p
-Fo(\).)23 b(This)18 b(mak)o(es)e(new)h(k)o(eymaps)f(as)h(necessary)l(.)25
-b(The)120 470 y(initial)17 b(k)o(eymap)e(in)h(whic)o(h)g(to)f(do)g(bindings)i
-(is)f Fj(map)p Fo(.)1725 656 y(F)l(unction)-1899 b Fh(int)20
-b Fg(rl)p 140 656 V 21 w(parse)p 294 656 V 19 w(and)p 405 656
-V 21 w(bind)j Ff(\()p Fn(char)14 b(*line)p Ff(\))120 718 y
-Fo(P)o(arse)i Fj(line)21 b Fo(as)16 b(if)h(it)g(had)f(b)q(een)i(read)f(from)e
-(the)i Fn(inputrc)f Fo(\014le)h(and)g(p)q(erform)f(an)o(y)h(k)o(ey)f
-(bindings)120 780 y(and)f(v)m(ariable)i(assignmen)o(ts)e(found)h(\(see)f
-(Section)h(1.3)e([Readline)j(Init)f(File],)g(page)f(4\).)0
-1061 y Fi(2.3.4)30 b(Asso)r(ciating)15 b(F)-5 b(unction)15
-b(Names)g(and)g(Bindings)62 1206 y Fo(These)22 b(functions)g(allo)o(w)g(y)o
-(ou)f(to)f(\014nd)i(out)f(what)g(k)o(eys)g(in)o(v)o(ok)o(e)h(named)f
-(functions)h(and)g(the)f(functions)0 1269 y(in)o(v)o(ok)o(ed)15
-b(b)o(y)h(a)e(particular)i(k)o(ey)f(sequence.)1725 1455 y(F)l(unction)-1899
-b Fh(Function)20 b(*)g Fg(rl)p 316 1455 V 21 w(named)p 504
-1455 V 19 w(function)j Ff(\()p Fn(char)14 b(*name)p Ff(\))120
-1517 y Fo(Return)i(the)f(function)h(with)g(name)f Fj(name)p
-Fo(.)1725 1703 y(F)l(unction)-1899 b Fh(Function)20 b(*)g Fg(rl)p
-316 1703 V 21 w(function)p 542 1703 V 21 w(of)p 610 1703 V
-19 w(k)n(eyseq)k Ff(\()p Fn(char)15 b(*keyseq,)f(Keymap)g(map,)h(int)208
-1766 y(*type)p Ff(\))120 1828 y Fo(Return)i(the)f(function)h(in)o(v)o(ok)o
-(ed)g(b)o(y)f Fj(k)o(eyseq)i Fo(in)f(k)o(eymap)f Fj(map)p Fo(.)23
-b(If)16 b Fj(map)i Fo(is)f(NULL,)g(the)f(curren)o(t)120 1890
-y(k)o(eymap)g(is)i(used.)25 b(If)17 b Fj(t)o(yp)q(e)i Fo(is)e(not)g(NULL,)g
-(the)g(t)o(yp)q(e)g(of)f(the)h(ob)s(ject)f(is)h(returned)g(in)h(it)f(\(one)f
-(of)120 1952 y Fn(ISFUNC)p Fo(,)e Fn(ISKMAP)p Fo(,)g(or)h Fn(ISMACR)p
-Fo(\).)1725 2139 y(F)l(unction)-1899 b Fh(char)20 b(**)f Fg(rl)p
-237 2139 V 21 w(in)n(v)n(oking)p 466 2139 V 23 w(k)n(eyseqs)k
-Ff(\()p Fn(Function)14 b(*function)p Ff(\))120 2201 y Fo(Return)19
-b(an)e(arra)o(y)g(of)h(strings)f(represen)o(ting)i(the)f(k)o(ey)g(sequences)h
-(used)f(to)f(in)o(v)o(ok)o(e)h Fj(function)h Fo(in)120 2263
-y(the)c(curren)o(t)g(k)o(eymap.)1725 2449 y(F)l(unction)-1899
-b Fh(char)20 b(**)f Fg(rl)p 237 2449 V 21 w(in)n(v)n(oking)p
-466 2449 V 23 w(k)n(eyseqs)p 675 2449 V 21 w(in)p 743 2449
-V 22 w(map)i Ff(\()p Fn(Function)14 b(*function,)f(Keymap)208
-2512 y(map)p Ff(\))120 2574 y Fo(Return)19 b(an)e(arra)o(y)g(of)h(strings)f
-(represen)o(ting)i(the)f(k)o(ey)g(sequences)h(used)f(to)f(in)o(v)o(ok)o(e)h
-Fj(function)h Fo(in)120 2636 y(the)c(k)o(eymap)g Fj(map)p Fo(.)p
+23 24 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(23)1736 183 y(V)l(ariable)-1899 b Fi(int)20
+b Fh(rl)p 140 183 18 3 v 21 w(mark)120 246 y Fr(The)h(mark)e(\(sa)o(v)o
+(ed)h(p)q(osition\))h(in)g(the)f(curren)o(t)h(line.)37
+b(If)20 b(set,)h(the)g(mark)e(and)i(p)q(oin)o(t)g(de\014ne)g(a)120
+308 y Fl(region)p Fr(.)1736 473 y(V)l(ariable)-1899 b
+Fi(int)20 b Fh(rl)p 140 473 V 21 w(done)120 536 y Fr(Setting)13
+b(this)h(to)f(a)f(non-zero)i(v)m(alue)g(causes)f(Readline)j(to)c
+(return)h(the)h(curren)o(t)f(line)h(immediately)l(.)1736
+701 y(V)l(ariable)-1899 b Fi(int)20 b Fh(rl)p 140 701
+V 21 w(p)r(ending)p 361 701 V 20 w(input)120 764 y Fr(Setting)15
+b(this)f(to)g(a)g(v)m(alue)i(mak)o(es)d(it)i(the)f(next)h(k)o(eystrok)o
+(e)e(read.)19 b(This)c(is)g(a)f(w)o(a)o(y)f(to)h(stu\013)g(a)g(single)
+120 826 y(c)o(haracter)g(in)o(to)i(the)f(input)h(stream.)1736
+991 y(V)l(ariable)-1899 b Fi(char)20 b(*)f Fh(rl)p 211
+991 V 21 w(prompt)120 1054 y Fr(The)c(prompt)e(Readline)k(uses.)j(This)
+15 b(is)f(set)h(from)e(the)h(argumen)o(t)g(to)g Fq(readline)g(\(\))p
+Fr(,)f(and)i(should)120 1116 y(not)g(b)q(e)h(assigned)f(to)g(directly)l
+(.)1736 1282 y(V)l(ariable)-1899 b Fi(char)20 b(*)f Fh(rl)p
+211 1282 V 21 w(library)p 400 1282 V 22 w(v)n(ersion)120
+1344 y Fr(The)c(v)o(ersion)h(n)o(um)o(b)q(er)f(of)g(this)h(revision)g
+(of)f(the)g(library)l(.)1736 1509 y(V)l(ariable)-1899
+b Fi(char)20 b(*)f Fh(rl)p 211 1509 V 21 w(terminal)p
+443 1509 V 21 w(name)120 1572 y Fr(The)c(terminal)h(t)o(yp)q(e,)f(used)
+h(for)f(initialization.)1736 1737 y(V)l(ariable)-1899
+b Fi(char)20 b(*)f Fh(rl)p 211 1737 V 21 w(readline)p
+430 1737 V 22 w(name)120 1800 y Fr(This)f(v)m(ariable)h(is)f(set)f(to)g
+(a)g(unique)i(name)f(b)o(y)f(eac)o(h)h(application)h(using)f(Readline.)
+29 b(The)18 b(v)m(alue)120 1862 y(allo)o(ws)f(conditional)h(parsing)f
+(of)f(the)g(inputrc)i(\014le)f(\(see)g(Section)g(1.3.2)e([Conditional)j
+(Init)f(Con-)120 1924 y(structs],)d(page)h(8\).)1736
+2090 y(V)l(ariable)-1899 b Fi(FILE)20 b(*)f Fh(rl)p 211
+2090 V 21 w(instream)120 2152 y Fr(The)c(stdio)h(stream)e(from)h(whic)o
+(h)h(Readline)h(reads)e(input.)1736 2318 y(V)l(ariable)-1899
+b Fi(FILE)20 b(*)f Fh(rl)p 211 2318 V 21 w(outstream)120
+2380 y Fr(The)c(stdio)h(stream)e(to)h(whic)o(h)h(Readline)h(p)q
+(erforms)e(output.)1736 2545 y(V)l(ariable)-1899 b Fi(Function)20
+b(*)g Fh(rl)p 316 2545 V 21 w(startup)p 520 2545 V 20
+w(ho)r(ok)120 2608 y Fr(If)13 b(non-zero,)h(this)f(is)h(the)f(address)g
+(of)g(a)f(function)i(to)f(call)h(just)f(b)q(efore)g Fq(readline)f
+Fr(prin)o(ts)h(the)g(\014rst)120 2670 y(prompt.)p eop
+24 25 bop 0 -58 a Fr(24)1449 b(GNU)15 b(Readline)i(Library)1736
+183 y(V)l(ariable)-1899 b Fi(Function)20 b(*)g Fh(rl)p
+316 183 18 3 v 21 w(ev)n(en)n(t)p 469 183 V 22 w(ho)r(ok)120
+246 y Fr(If)13 b(non-zero,)f(this)h(is)g(the)g(address)f(of)g(a)g
+(function)h(to)f(call)i(p)q(erio)q(dically)h(when)e(readline)h(is)f(w)o
+(aiting)120 308 y(for)i(terminal)h(input.)1736 471 y(V)l(ariable)-1899
+b Fi(Function)20 b(*)g Fh(rl)p 316 471 V 21 w(getc)p
+439 471 V 21 w(function)120 533 y Fr(If)c(non-zero,)h
+Fq(readline)d Fr(will)k(call)f(indirectly)i(through)c(this)i(p)q(oin)o
+(ter)g(to)e(get)h(a)f(c)o(haracter)h(from)120 595 y(the)k(input)h
+(stream.)33 b(By)20 b(default,)i(it)e(is)g(set)g(to)g
+Fq(rl_getc)p Fr(,)f(the)h(default)h Fq(readline)e Fr(c)o(haracter)120
+657 y(input)d(function)g(\(see)f(Section)h(2.4.8)e([Utilit)o(y)i(F)l
+(unctions],)f(page)g(31\).)1736 820 y(V)l(ariable)-1899
+b Fi(VFunction)20 b(*)g Fh(rl)p 342 820 V 21 w(redispla)n(y)p
+586 820 V 22 w(function)120 883 y Fr(If)f(non-zero,)h
+Fq(readline)e Fr(will)i(call)g(indirectly)i(through)c(this)i(p)q(oin)o
+(ter)f(to)f(up)q(date)i(the)f(displa)o(y)120 945 y(with)d(the)g(curren)
+o(t)f(con)o(ten)o(ts)g(of)h(the)f(editing)i(bu\013er.)22
+b(By)15 b(default,)h(it)g(is)h(set)e(to)g Fq(rl_redisplay)p
+Fr(,)120 1007 y(the)g(default)h Fq(readline)e Fr(redispla)o(y)i
+(function)g(\(see)g(Section)g(2.4.6)d([Redispla)o(y],)j(page)f(29\).)
+1736 1170 y(V)l(ariable)-1899 b Fi(Keymap)20 b Fh(rl)p
+218 1170 V 21 w(executing)p 476 1170 V 22 w(k)n(eymap)120
+1232 y Fr(This)15 b(v)m(ariable)h(is)f(set)g(to)f(the)g(k)o(eymap)h
+(\(see)f(Section)i(2.4.2)d([Keymaps],)h(page)g(25\))g(in)h(whic)o(h)h
+(the)120 1294 y(curren)o(tly)g(executing)g(readline)h(function)f(w)o
+(as)e(found.)1736 1457 y(V)l(ariable)-1899 b Fi(Keymap)20
+b Fh(rl)p 218 1457 V 21 w(binding)p 426 1457 V 22 w(k)n(eymap)120
+1520 y Fr(This)15 b(v)m(ariable)h(is)f(set)g(to)f(the)g(k)o(eymap)h
+(\(see)f(Section)i(2.4.2)d([Keymaps],)h(page)g(25\))g(in)h(whic)o(h)h
+(the)120 1582 y(last)f(k)o(ey)g(binding)i(o)q(ccurred.)0
+1809 y Fp(2.4)33 b(Readline)16 b(Con)n(v)n(enience)g(F)-6
+b(unctions)0 2019 y Fk(2.4.1)30 b(Naming)15 b(a)g(F)-5
+b(unction)62 2157 y Fr(The)19 b(user)f(can)g(dynamically)i(c)o(hange)e
+(the)g(bindings)i(of)e(k)o(eys)f(while)j(using)f(Readline.)30
+b(This)19 b(is)g(done)f(b)o(y)0 2219 y(represen)o(ting)f(the)g
+(function)h(with)f(a)g(descriptiv)o(e)h(name.)25 b(The)17
+b(user)g(is)g(able)h(to)e(t)o(yp)q(e)h(the)g(descriptiv)o(e)h(name)0
+2281 y(when)e(referring)f(to)g(the)g(function.)21 b(Th)o(us,)14
+b(in)j(an)e(init)h(\014le,)g(one)f(migh)o(t)g(\014nd)120
+2408 y Fq(Meta-Rubout:)46 b(backward-kill-word)62 2545
+y Fr(This)21 b(binds)f(the)g(k)o(eystrok)o(e)f Fq(META-RUBOUT)f
+Fr(to)h(the)h(function)g Fl(descriptiv)o(ely)26 b Fr(named)20
+b Fq(backward-kill-)0 2608 y(word)p Fr(.)j(Y)l(ou,)16
+b(as)g(the)g(programmer,)f(should)i(bind)h(the)e(functions)i(y)o(ou)d
+(write)i(to)e(descriptiv)o(e)j(names)e(as)g(w)o(ell.)0
+2670 y(Readline)i(pro)o(vides)d(a)g(function)h(for)f(doing)g(that:)p
eop
-%%Page: 23 25
-24 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(23)0 158 y Fi(2.3.5)30 b(Allo)n(wing)16 b(Undoing)62 297
-y Fo(Supp)q(orting)f(the)f(undo)g(command)g(is)g(a)g(painless)h(thing,)f(and)
-g(mak)o(es)f(y)o(our)h(functions)g(m)o(uc)o(h)g(more)f(useful.)0
-359 y(It)i(is)g(certainly)g(easy)f(to)g(try)g(something)h(if)g(y)o(ou)f(kno)o
-(w)g(y)o(ou)g(can)h(undo)g(it.)20 b(I)15 b(could)g(use)g(an)f(undo)h
-(function)h(for)0 422 y(the)f(sto)q(c)o(k)g(mark)o(et.)62 561
-y(If)h(y)o(our)f(function)i(simply)g(inserts)f(text)f(once,)h(or)f(deletes)h
-(text)f(once,)h(and)g(uses)g Fn(rl_insert_text)d(\(\))i Fo(or)0
-623 y Fn(rl_delete_text)e(\(\))i Fo(to)g(do)g(it,)g(then)g(undoing)i(is)e
-(already)h(done)f(for)g(y)o(ou)g(automatically)l(.)62 762 y(If)h(y)o(ou)f(do)
-g(m)o(ultiple)i(insertions)f(or)f(m)o(ultiple)i(deletions,)f(or)f(an)o(y)g
-(com)o(bination)h(of)f(these)g(op)q(erations,)g(y)o(ou)0 824
-y(should)j(group)e(them)g(together)g(in)o(to)g(one)h(op)q(eration.)24
-b(This)17 b(is)g(done)g(with)g Fn(rl_begin_undo_group)c(\(\))j
-Fo(and)0 886 y Fn(rl_end_undo_group)d(\(\))p Fo(.)62 1025 y(The)j(t)o(yp)q
-(es)f(of)g(ev)o(en)o(ts)g(that)f(can)h(b)q(e)h(undone)g(are:)120
-1151 y Fn(enum)23 b(undo_code)g({)h(UNDO_DELETE,)e(UNDO_INSERT,)g
-(UNDO_BEGIN,)g(UNDO_END)h(};)62 1290 y Fo(Notice)c(that)e Fn(UNDO_DELETE)f
-Fo(means)i(to)f(insert)i(some)e(text,)h(and)g Fn(UNDO_INSERT)e
-Fo(means)i(to)f(delete)i(some)0 1353 y(text.)37 b(That)21 b(is,)i(the)e(undo)
-h(co)q(de)f(tells)i(undo)e(what)g(to)f(undo,)j(not)e(ho)o(w)g(to)f(undo)i
-(it.)38 b Fn(UNDO_BEGIN)20 b Fo(and)0 1415 y Fn(UNDO_END)14
-b Fo(are)h(tags)f(added)i(b)o(y)f Fn(rl_begin_undo_group)e(\(\))i
-Fo(and)g Fn(rl_end_undo_group)e(\(\))p Fo(.)1725 1582 y(F)l(unction)-1899
-b Fh(int)20 b Fg(rl)p 140 1582 18 3 v 21 w(b)r(egin)p 297 1582
-V 20 w(undo)p 442 1582 V 20 w(group)h Ff(\(\))120 1645 y Fo(Begins)e(sa)o
+25 26 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(25)1725 183 y(F)l(unction)-1899 b Fi(int)20
+b Fh(rl)p 140 183 18 3 v 21 w(add)p 253 183 V 20 w(defun)i
+Fg(\()p Fq(char)14 b(*name,)g(Function)g(*function,)g(int)h(key)p
+Fg(\))120 246 y Fr(Add)20 b Fl(name)i Fr(to)d(the)h(list)g(of)f(named)h
+(functions.)33 b(Mak)o(e)19 b Fl(function)i Fr(b)q(e)f(the)f(function)i
+(that)d(gets)120 308 y(called.)j(If)16 b Fl(k)o(ey)j
+Fr(is)d(not)e(-1,)h(then)h(bind)g(it)g(to)e Fl(function)i
+Fr(using)g Fq(rl_bind_key)e(\(\))p Fr(.)62 471 y(Using)i(this)g
+(function)g(alone)g(is)g(su\016cien)o(t)h(for)d(most)h(applications.)22
+b(It)16 b(is)g(the)f(recommended)i(w)o(a)o(y)d(to)h(add)0
+533 y(a)i(few)h(functions)g(to)f(the)h(default)g(functions)h(that)e
+(Readline)j(has)d(built)i(in.)28 b(If)18 b(y)o(ou)g(need)g(to)f(do)h
+(something)0 595 y(other)c(than)h(adding)h(a)e(function)i(to)e
+(Readline,)j(y)o(ou)d(ma)o(y)g(need)i(to)e(use)h(the)g(underlying)h
+(functions)g(describ)q(ed)0 658 y(b)q(elo)o(w.)0 869
+y Fk(2.4.2)30 b(Selecting)15 b(a)g(Keymap)62 1006 y Fr(Key)k(bindings)i
+(tak)o(e)c(place)j(on)e(a)g Fl(k)o(eymap)p Fr(.)30 b(The)18
+b(k)o(eymap)h(is)g(the)f(asso)q(ciation)h(b)q(et)o(w)o(een)g(the)f(k)o
+(eys)h(that)0 1069 y(the)g(user)g(t)o(yp)q(es)g(and)g(the)g(functions)g
+(that)f(get)h(run.)30 b(Y)l(ou)20 b(can)e(mak)o(e)h(y)o(our)f(o)o(wn)g
+(k)o(eymaps,)h(cop)o(y)g(existing)0 1131 y(k)o(eymaps,)14
+b(and)i(tell)g(Readline)i(whic)o(h)e(k)o(eymap)f(to)f(use.)1725
+1294 y(F)l(unction)-1899 b Fi(Keymap)20 b Fh(rl)p 218
+1294 V 21 w(mak)n(e)p 370 1294 V 20 w(bare)p 500 1294
+V 20 w(k)n(eymap)j Fg(\(\))120 1356 y Fr(Returns)14 b(a)f(new,)g(empt)o
+(y)g(k)o(eymap.)19 b(The)14 b(space)f(for)g(the)h(k)o(eymap)f(is)g
+(allo)q(cated)i(with)e Fq(malloc)i(\(\))p Fr(;)120 1419
+y(y)o(ou)g(should)h Fq(free)f(\(\))g Fr(it)g(when)h(y)o(ou)f(are)f
+(done.)1725 1582 y(F)l(unction)-1899 b Fi(Keymap)20 b
+Fh(rl)p 218 1582 V 21 w(cop)n(y)p 353 1582 V 21 w(k)n(eymap)j
+Fg(\()p Fq(Keymap)14 b(map)p Fg(\))120 1644 y Fr(Return)i(a)f(new)g(k)o
+(eymap)g(whic)o(h)h(is)g(a)f(cop)o(y)g(of)g Fl(map)p
+Fr(.)1725 1807 y(F)l(unction)-1899 b Fi(Keymap)20 b Fh(rl)p
+218 1807 V 21 w(mak)n(e)p 370 1807 V 20 w(k)n(eymap)j
+Fg(\(\))120 1869 y Fr(Return)c(a)f(new)h(k)o(eymap)f(with)h(the)f(prin)
+o(ting)i(c)o(haracters)d(b)q(ound)j(to)e(rl)p 1407 1869
+14 2 v 16 w(insert,)i(the)e(lo)o(w)o(ercase)120 1932
+y(Meta)13 b(c)o(haracters)g(b)q(ound)h(to)f(run)h(their)g(equiv)m(alen)
+o(ts,)i(and)d(the)h(Meta)f(digits)h(b)q(ound)h(to)e(pro)q(duce)120
+1994 y(n)o(umeric)j(argumen)o(ts.)1725 2157 y(F)l(unction)-1899
+b Fi(void)20 b Fh(rl)p 166 2157 18 3 v 21 w(discard)p
+366 2157 V 21 w(k)n(eymap)i Fg(\()p Fq(Keymap)14 b(keymap)p
+Fg(\))120 2219 y Fr(F)l(ree)h(the)h(storage)d(asso)q(ciated)j(with)f
+Fl(k)o(eymap)p Fr(.)62 2382 y(Readline)20 b(has)d(sev)o(eral)h(in)o
+(ternal)g(k)o(eymaps.)26 b(These)18 b(functions)g(allo)o(w)g(y)o(ou)f
+(to)g(c)o(hange)g(whic)o(h)h(k)o(eymap)f(is)0 2445 y(activ)o(e.)1725
+2608 y(F)l(unction)-1899 b Fi(Keymap)20 b Fh(rl)p 218
+2608 V 21 w(get)p 316 2608 V 21 w(k)n(eymap)i Fg(\(\))120
+2670 y Fr(Returns)16 b(the)f(curren)o(tly)h(activ)o(e)f(k)o(eymap.)p
+eop
+26 27 bop 0 -58 a Fr(26)1449 b(GNU)15 b(Readline)i(Library)1725
+183 y(F)l(unction)-1899 b Fi(void)20 b Fh(rl)p 166 183
+18 3 v 21 w(set)p 258 183 V 21 w(k)n(eymap)i Fg(\()p
+Fq(Keymap)14 b(keymap)p Fg(\))120 246 y Fr(Mak)o(es)g
+Fl(k)o(eymap)j Fr(the)e(curren)o(tly)h(activ)o(e)f(k)o(eymap.)1725
+420 y(F)l(unction)-1899 b Fi(Keymap)20 b Fh(rl)p 218
+420 V 21 w(get)p 316 420 V 21 w(k)n(eymap)p 530 420 V
+20 w(b)n(y)p 610 420 V 21 w(name)i Fg(\()p Fq(char)14
+b(*name)p Fg(\))120 482 y Fr(Return)19 b(the)g(k)o(eymap)f(matc)o(hing)
+g Fl(name)p Fr(.)30 b Fl(name)21 b Fr(is)e(one)g(whic)o(h)g(w)o(ould)g
+(b)q(e)g(supplied)i(in)e(a)f Fq(set)120 544 y(keymap)c
+Fr(inputrc)j(line)f(\(see)g(Section)g(1.3)e([Readline)j(Init)f(File],)g
+(page)f(5\).)1725 719 y(F)l(unction)-1899 b Fi(char)20
+b(*)f Fh(rl)p 211 719 V 21 w(get)p 309 719 V 21 w(k)n(eymap)p
+523 719 V 20 w(name)i Fg(\()p Fq(Keymap)14 b(keymap)p
+Fg(\))120 781 y Fr(Return)19 b(the)g(name)f(matc)o(hing)h
+Fl(k)o(eymap)p Fr(.)29 b Fl(name)21 b Fr(is)e(one)g(whic)o(h)g(w)o
+(ould)g(b)q(e)g(supplied)i(in)e(a)f Fq(set)120 843 y(keymap)c
+Fr(inputrc)j(line)f(\(see)g(Section)g(1.3)e([Readline)j(Init)f(File],)g
+(page)f(5\).)0 1088 y Fk(2.4.3)30 b(Binding)15 b(Keys)62
+1229 y Fr(Y)l(ou)h(asso)q(ciate)f(k)o(eys)f(with)i(functions)g(through)
+e(the)i(k)o(eymap.)j(Readline)f(has)c(sev)o(eral)i(in)o(ternal)g(k)o
+(eymaps:)0 1291 y Fq(emacs_standard_keymap)p Fr(,)i Fq
+(emacs_meta_keymap)p Fr(,)g Fq(emacs_ctlx_keymap)p Fr(,)h
+Fq(vi_movement_keymap)p Fr(,)f(and)0 1354 y Fq(vi_insertion_keymap)p
+Fr(.)h Fq(emacs_standard_keymap)13 b Fr(is)k(the)f(default,)g(and)g
+(the)g(examples)h(in)f(this)h(man)o(ual)0 1416 y(assume)e(that.)62
+1557 y(These)h(functions)g(manage)e(k)o(ey)i(bindings.)1725
+1731 y(F)l(unction)-1899 b Fi(int)20 b Fh(rl)p 140 1731
+V 21 w(bind)p 272 1731 V 21 w(k)n(ey)k Fg(\()p Fq(int)14
+b(key,)h(Function)f(*function)p Fg(\))120 1794 y Fr(Binds)i
+Fl(k)o(ey)j Fr(to)14 b Fl(function)i Fr(in)g(the)f(curren)o(tly)h
+(activ)o(e)f(k)o(eymap.)k(Returns)d(non-zero)f(in)h(the)f(case)g(of)120
+1856 y(an)g(in)o(v)m(alid)j Fl(k)o(ey)p Fr(.)1725 2030
+y(F)l(unction)-1899 b Fi(int)19 b Fh(rl)p 139 2030 V
+21 w(bind)p 271 2030 V 21 w(k)n(ey)p 376 2030 V 21 w(in)p
+444 2030 V 22 w(map)i Fg(\()p Fq(int)14 b(key,)h(Function)f(*function,)
+g(Keymap)g(map)p Fg(\))120 2093 y Fr(Bind)i Fl(k)o(ey)j
+Fr(to)c Fl(function)h Fr(in)g Fl(map)p Fr(.)k(Returns)15
+b(non-zero)h(in)g(the)f(case)g(of)g(an)g(in)o(v)m(alid)j
+Fl(k)o(ey)p Fr(.)1725 2267 y(F)l(unction)-1899 b Fi(int)20
+b Fh(rl)p 140 2267 V 21 w(un)n(bind)p 334 2267 V 21 w(k)n(ey)k
+Fg(\()p Fq(int)14 b(key)p Fg(\))120 2329 y Fr(Bind)h
+Fl(k)o(ey)i Fr(to)c(the)h(n)o(ull)h(function)f(in)g(the)g(curren)o(tly)
+g(activ)o(e)g(k)o(eymap.)19 b(Returns)14 b(non-zero)g(in)g(case)120
+2391 y(of)h(error.)1725 2566 y(F)l(unction)-1899 b Fi(int)20
+b Fh(rl)p 140 2566 V 21 w(un)n(bind)p 334 2566 V 21 w(k)n(ey)p
+439 2566 V 21 w(in)p 507 2566 V 22 w(map)h Fg(\()p Fq(int)14
+b(key,)h(Keymap)f(map)p Fg(\))120 2628 y Fr(Bind)i Fl(k)o(ey)j
+Fr(to)c(the)g(n)o(ull)i(function)f(in)g Fl(map)p Fr(.)k(Returns)15
+b(non-zero)h(in)g(case)f(of)g(error.)p eop
+27 28 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(27)1725 183 y(F)l(unction)-1899 b Fi(int)20
+b Fh(rl)p 140 183 18 3 v 21 w(generic)p 338 183 V 21
+w(bind)j Fg(\()p Fq(int)15 b(type,)f(char)h(*keyseq,)f(char)h(*data,)f
+(Keymap)208 246 y(map)p Fg(\))120 308 y Fr(Bind)j(the)f(k)o(ey)g
+(sequence)h(represen)o(ted)f(b)o(y)g(the)g(string)g Fl(k)o(eyseq)g
+Fr(to)g(the)f(arbitrary)h(p)q(oin)o(ter)g Fl(data)p Fr(.)120
+370 y Fl(t)o(yp)q(e)j Fr(sa)o(ys)c(what)g(kind)i(of)f(data)f(is)i(p)q
+(oin)o(ted)g(to)e(b)o(y)h Fl(data)p Fr(;)f(this)i(can)f(b)q(e)g(a)g
+(function)h(\()p Fq(ISFUNC)p Fr(\),)d(a)120 432 y(macro)i(\()p
+Fq(ISMACR)p Fr(\),)f(or)i(a)f(k)o(eymap)g(\()p Fq(ISKMAP)p
+Fr(\).)23 b(This)18 b(mak)o(es)e(new)h(k)o(eymaps)f(as)h(necessary)l(.)
+25 b(The)120 495 y(initial)17 b(k)o(eymap)e(in)h(whic)o(h)g(to)f(do)g
+(bindings)i(is)f Fl(map)p Fr(.)1725 683 y(F)l(unction)-1899
+b Fi(int)20 b Fh(rl)p 140 683 V 21 w(parse)p 294 683
+V 19 w(and)p 405 683 V 21 w(bind)j Fg(\()p Fq(char)14
+b(*line)p Fg(\))120 745 y Fr(P)o(arse)i Fl(line)21 b
+Fr(as)16 b(if)h(it)g(had)f(b)q(een)i(read)f(from)e(the)i
+Fq(inputrc)f Fr(\014le)h(and)g(p)q(erform)f(an)o(y)h(k)o(ey)f(bindings)
+120 808 y(and)f(v)m(ariable)i(assignmen)o(ts)e(found)h(\(see)f(Section)
+h(1.3)e([Readline)j(Init)f(File],)g(page)f(5\).)1725
+996 y(F)l(unction)-1899 b Fi(int)20 b Fh(rl)p 140 996
+V 21 w(read)p 271 996 V 20 w(init)p 375 996 V 22 w(\014le)k
+Fg(\()p Fq(char)14 b(*filename)p Fg(\))120 1059 y Fr(Read)19
+b(k)o(eybindings)i(and)e(v)m(ariable)h(assignmen)o(ts)f(from)f
+Fl(\014lename)k Fr(\(see)d(Section)g(1.3)f([Readline)120
+1121 y(Init)e(File],)g(page)f(5\).)0 1409 y Fk(2.4.4)30
+b(Asso)r(ciating)15 b(F)-5 b(unction)15 b(Names)g(and)g(Bindings)62
+1554 y Fr(These)22 b(functions)g(allo)o(w)g(y)o(ou)f(to)f(\014nd)i(out)
+f(what)g(k)o(eys)g(in)o(v)o(ok)o(e)h(named)f(functions)h(and)g(the)f
+(functions)0 1617 y(in)o(v)o(ok)o(ed)15 b(b)o(y)h(a)e(particular)i(k)o
+(ey)f(sequence.)1725 1805 y(F)l(unction)-1899 b Fi(Function)20
+b(*)g Fh(rl)p 316 1805 V 21 w(named)p 504 1805 V 19 w(function)j
+Fg(\()p Fq(char)14 b(*name)p Fg(\))120 1868 y Fr(Return)i(the)f
+(function)h(with)g(name)f Fl(name)p Fr(.)1725 2056 y(F)l(unction)-1899
+b Fi(Function)20 b(*)g Fh(rl)p 316 2056 V 21 w(function)p
+542 2056 V 21 w(of)p 610 2056 V 19 w(k)n(eyseq)k Fg(\()p
+Fq(char)15 b(*keyseq,)f(Keymap)g(map,)h(int)208 2118
+y(*type)p Fg(\))120 2181 y Fr(Return)i(the)f(function)h(in)o(v)o(ok)o
+(ed)g(b)o(y)f Fl(k)o(eyseq)i Fr(in)f(k)o(eymap)f Fl(map)p
+Fr(.)23 b(If)16 b Fl(map)i Fr(is)f(NULL,)g(the)f(curren)o(t)120
+2243 y(k)o(eymap)g(is)i(used.)25 b(If)17 b Fl(t)o(yp)q(e)i
+Fr(is)e(not)g(NULL,)g(the)g(t)o(yp)q(e)g(of)f(the)h(ob)s(ject)f(is)h
+(returned)g(in)h(it)f(\(one)f(of)120 2305 y Fq(ISFUNC)p
+Fr(,)e Fq(ISKMAP)p Fr(,)g(or)h Fq(ISMACR)p Fr(\).)1725
+2494 y(F)l(unction)-1899 b Fi(char)20 b(**)f Fh(rl)p
+237 2494 V 21 w(in)n(v)n(oking)p 466 2494 V 23 w(k)n(eyseqs)k
+Fg(\()p Fq(Function)14 b(*function)p Fg(\))120 2556 y
+Fr(Return)19 b(an)e(arra)o(y)g(of)h(strings)f(represen)o(ting)i(the)f
+(k)o(ey)g(sequences)h(used)f(to)f(in)o(v)o(ok)o(e)h Fl(function)h
+Fr(in)120 2618 y(the)c(curren)o(t)g(k)o(eymap.)p eop
+28 29 bop 0 -58 a Fr(28)1449 b(GNU)15 b(Readline)i(Library)1725
+183 y(F)l(unction)-1899 b Fi(char)20 b(**)f Fh(rl)p 237
+183 18 3 v 21 w(in)n(v)n(oking)p 466 183 V 23 w(k)n(eyseqs)p
+675 183 V 21 w(in)p 743 183 V 22 w(map)i Fg(\()p Fq(Function)14
+b(*function,)f(Keymap)208 246 y(map)p Fg(\))120 308 y
+Fr(Return)19 b(an)e(arra)o(y)g(of)h(strings)f(represen)o(ting)i(the)f
+(k)o(ey)g(sequences)h(used)f(to)f(in)o(v)o(ok)o(e)h Fl(function)h
+Fr(in)120 370 y(the)c(k)o(eymap)g Fl(map)p Fr(.)1725
+563 y(F)l(unction)-1899 b Fi(void)20 b Fh(rl)p 166 563
+V 21 w(function)p 392 563 V 21 w(dump)r(er)g Fg(\()p
+Fq(int)15 b(readable)p Fg(\))120 625 y Fr(Prin)o(t)i(the)g(readline)h
+(function)g(names)f(and)g(the)g(k)o(ey)g(sequences)h(curren)o(tly)g(b)q
+(ound)f(to)g(them)g(to)120 687 y Fq(rl_outstream)p Fr(.)j(If)c
+Fl(readable)j Fr(is)d(non-zero,)g(the)g(list)g(is)g(formatted)f(in)i
+(suc)o(h)f(a)f(w)o(a)o(y)g(that)g(it)h(can)120 750 y(b)q(e)g(made)f
+(part)g(of)f(an)i Fq(inputrc)e Fr(\014le)i(and)f(re-read.)1725
+942 y(F)l(unction)-1899 b Fi(void)20 b Fh(rl)p 166 942
+V 21 w(list)p 262 942 V 22 w(funmap)p 475 942 V 18 w(names)h
+Fg(\(\))120 1005 y Fr(Prin)o(t)15 b(the)g(names)h(of)e(all)j(bindable)g
+(Readline)g(functions)f(to)f Fq(rl_outstream)p Fr(.)0
+1305 y Fk(2.4.5)30 b(Allo)n(wing)16 b(Undoing)62 1452
+y Fr(Supp)q(orting)f(the)f(undo)g(command)g(is)g(a)g(painless)h(thing,)
+f(and)g(mak)o(es)f(y)o(our)h(functions)g(m)o(uc)o(h)g(more)f(useful.)0
+1515 y(It)i(is)g(certainly)g(easy)f(to)g(try)g(something)h(if)g(y)o(ou)
+f(kno)o(w)g(y)o(ou)g(can)h(undo)g(it.)20 b(I)15 b(could)g(use)g(an)f
+(undo)h(function)h(for)0 1577 y(the)f(sto)q(c)o(k)g(mark)o(et.)62
+1724 y(If)h(y)o(our)f(function)i(simply)g(inserts)f(text)f(once,)h(or)f
+(deletes)h(text)f(once,)h(and)g(uses)g Fq(rl_insert_text)d(\(\))i
+Fr(or)0 1786 y Fq(rl_delete_text)e(\(\))i Fr(to)g(do)g(it,)g(then)g
+(undoing)i(is)e(already)h(done)f(for)g(y)o(ou)g(automatically)l(.)62
+1934 y(If)h(y)o(ou)f(do)g(m)o(ultiple)i(insertions)f(or)f(m)o(ultiple)i
+(deletions,)f(or)f(an)o(y)g(com)o(bination)h(of)f(these)g(op)q
+(erations,)g(y)o(ou)0 1996 y(should)j(group)e(them)g(together)g(in)o
+(to)g(one)h(op)q(eration.)24 b(This)17 b(is)g(done)g(with)g
+Fq(rl_begin_undo_group)c(\(\))j Fr(and)0 2058 y Fq(rl_end_undo_group)d
+(\(\))p Fr(.)62 2206 y(The)j(t)o(yp)q(es)f(of)g(ev)o(en)o(ts)g(that)f
+(can)h(b)q(e)h(undone)g(are:)120 2343 y Fq(enum)23 b(undo_code)g({)h
+(UNDO_DELETE,)e(UNDO_INSERT,)g(UNDO_BEGIN,)g(UNDO_END)h(};)62
+2490 y Fr(Notice)c(that)e Fq(UNDO_DELETE)f Fr(means)i(to)f(insert)i
+(some)e(text,)h(and)g Fq(UNDO_INSERT)e Fr(means)i(to)f(delete)i(some)0
+2552 y(text.)37 b(That)21 b(is,)i(the)e(undo)h(co)q(de)f(tells)i(undo)e
+(what)g(to)f(undo,)j(not)e(ho)o(w)g(to)f(undo)i(it.)38
+b Fq(UNDO_BEGIN)20 b Fr(and)0 2614 y Fq(UNDO_END)14 b
+Fr(are)h(tags)f(added)i(b)o(y)f Fq(rl_begin_undo_group)e(\(\))i
+Fr(and)g Fq(rl_end_undo_group)e(\(\))p Fr(.)p eop
+29 30 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(29)1725 183 y(F)l(unction)-1899 b Fi(int)20
+b Fh(rl)p 140 183 18 3 v 21 w(b)r(egin)p 297 183 V 20
+w(undo)p 442 183 V 20 w(group)h Fg(\(\))120 246 y Fr(Begins)e(sa)o
(ving)e(undo)i(information)f(in)g(a)g(group)f(construct.)27
-b(The)18 b(undo)h(information)f(usually)120 1707 y(comes)j(from)f(calls)h(to)
-g Fn(rl_insert_text)13 b(\(\))20 b Fo(and)h Fn(rl_delete_text)13
-b(\(\))p Fo(,)22 b(but)f(could)g(b)q(e)h(the)120 1769 y(result)16
-b(of)e(calls)j(to)d Fn(rl_add_undo)g(\(\))p Fo(.)1725 1937
-y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140 1937 V 21 w(end)p
-251 1937 V 20 w(undo)p 396 1937 V 20 w(group)h Ff(\(\))120
-1999 y Fo(Closes)d(the)f(curren)o(t)g(undo)h(group)f(started)g(with)h
-Fn(rl_begin_undo_group)12 b(\(\))p Fo(.)26 b(There)18 b(should)120
-2061 y(b)q(e)e(one)f(call)i(to)d Fn(rl_end_undo_group)f(\(\))i
-Fo(for)f(eac)o(h)i(call)g(to)f Fn(rl_begin_undo_group)d(\(\))p
-Fo(.)1725 2229 y(F)l(unction)-1899 b Fh(void)20 b Fg(rl)p 166
-2229 V 21 w(add)p 279 2229 V 20 w(undo)i Ff(\()p Fn(enum)14
-b(undo_code)g(what,)g(int)h(start,)g(int)f(end,)h(char)208
-2291 y(*text)p Ff(\))120 2353 y Fo(Remem)o(b)q(er)20 b(ho)o(w)e(to)h(undo)g
-(an)g(ev)o(en)o(t)g(\(according)g(to)g Fj(what)q Fo(\).)30
-b(The)19 b(a\013ected)g(text)f(runs)i(from)120 2415 y Fj(start)15
-b Fo(to)g Fj(end)p Fo(,)g(and)g(encompasses)h Fj(text)p Fo(.)1725
-2583 y(F)l(unction)-1899 b Fh(void)20 b Fg(free)p 221 2583
-V 20 w(undo)p 366 2583 V 20 w(list)k Ff(\(\))120 2645 y Fo(F)l(ree)15
-b(the)h(existing)g(undo)f(list.)p eop
-%%Page: 24 26
-25 bop 0 -83 a Fo(24)1449 b(GNU)15 b(Readline)i(Library)1725
-158 y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140 158 18 3
-v 21 w(do)p 222 158 V 20 w(undo)i Ff(\(\))120 221 y Fo(Undo)14
-b(the)f(\014rst)g(thing)h(on)g(the)f(undo)h(list.)20 b(Returns)14
-b Fn(0)f Fo(if)h(there)g(w)o(as)e(nothing)i(to)f(undo,)h(non-zero)120
-283 y(if)i(something)f(w)o(as)f(undone.)62 454 y(Finally)l(,)j(if)f(y)o(ou)f
-(neither)i(insert)f(nor)f(delete)i(text,)d(but)i(directly)h(mo)q(dify)f(the)f
-(existing)i(text)e(\(e.g.,)f(c)o(hange)0 516 y(its)g(case\),)f(call)i
-Fn(rl_modifying)e(\(\))g Fo(once,)h(just)f(b)q(efore)h(y)o(ou)f(mo)q(dify)h
-(the)g(text.)19 b(Y)l(ou)14 b(m)o(ust)f(supply)h(the)g(indices)0
-578 y(of)h(the)g(text)g(range)g(that)f(y)o(ou)h(are)g(going)g(to)g(mo)q(dify)
-l(.)1725 749 y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140
-749 V 21 w(mo)r(difying)h Ff(\()p Fn(int)15 b(start,)f(int)h(end)p
-Ff(\))120 811 y Fo(T)l(ell)e(Readline)g(to)e(sa)o(v)o(e)f(the)i(text)f(b)q
-(et)o(w)o(een)g Fj(start)g Fo(and)h Fj(end)h Fo(as)e(a)g(single)i(undo)e
-(unit.)20 b(It)11 b(is)h(assumed)120 873 y(that)i(y)o(ou)h(will)i(subsequen)o
-(tly)g(mo)q(dify)e(that)g(text.)0 1107 y Fi(2.3.6)30 b(Redispla)n(y)1725
-1278 y Fo(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140 1278
-V 21 w(redispla)n(y)k Ff(\(\))120 1340 y Fo(Change)d(what's)g(displa)o(y)o
-(ed)h(on)g(the)f(screen)h(to)f(re\015ect)h(the)f(curren)o(t)g(con)o(ten)o(ts)
-g(of)g Fn(rl_line_)120 1402 y(buffer)p Fo(.)1725 1573 y(F)l(unction)-1899
-b Fh(int)20 b Fg(rl)p 140 1573 V 21 w(forced)p 315 1573 V 20
-w(up)r(date)p 509 1573 V 20 w(displa)n(y)k Ff(\(\))120 1635
-y Fo(F)l(orce)12 b(the)g(line)h(to)f(b)q(e)g(up)q(dated)h(and)f(redispla)o(y)
-o(ed,)i(whether)e(or)f(not)h(Readline)i(thinks)e(the)g(screen)120
-1697 y(displa)o(y)k(is)g(correct.)1725 1868 y(F)l(unction)-1899
-b Fh(int)20 b Fg(rl)p 140 1868 V 21 w(on)p 222 1868 V 20 w(new)p
-341 1868 V 21 w(line)k Ff(\(\))120 1930 y Fo(T)l(ell)c(the)f(up)q(date)g
-(routines)g(that)f(w)o(e)g(ha)o(v)o(e)g(mo)o(v)o(ed)g(on)o(to)g(a)g(new)h
-(\(empt)o(y\))e(line,)k(usually)f(after)120 1992 y(ouputting)c(a)e(newline.)
-1725 2163 y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140 2163
-V 21 w(reset)p 282 2163 V 20 w(line)p 390 2163 V 23 w(state)j
-Ff(\(\))120 2225 y Fo(Reset)14 b(the)f(displa)o(y)h(state)f(to)f(a)h(clean)h
-(state)f(and)g(redispla)o(y)i(the)e(curren)o(t)g(line)i(starting)e(on)g(a)g
-(new)120 2288 y(line.)1725 2458 y(F)l(unction)-1899 b Fh(int)20
-b Fg(rl)p 140 2458 V 21 w(message)g Ff(\()p Fn(va_alist)p Ff(\))120
-2521 y Fo(The)f(argumen)o(ts)e(are)h(a)g(string)g(as)g(w)o(ould)h(b)q(e)g
-(supplied)i(to)d Fn(printf)p Fo(.)28 b(The)19 b(resulting)g(string)f(is)120
-2583 y(displa)o(y)o(ed)h(in)f(the)g Fj(ec)o(ho)f(area)p Fo(.)27
-b(The)18 b(ec)o(ho)f(area)g(is)h(also)g(used)g(to)f(displa)o(y)h(n)o(umeric)h
-(argumen)o(ts)120 2645 y(and)c(searc)o(h)g(strings.)p eop
-%%Page: 25 27
-26 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(25)1725 158 y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140
-158 18 3 v 21 w(clear)p 279 158 V 21 w(message)h Ff(\(\))120
-221 y Fo(Clear)15 b(the)h(message)e(in)i(the)g(ec)o(ho)f(area.)0
-423 y Fi(2.3.7)30 b(Mo)r(difying)15 b(T)-5 b(ext)1725 582 y
-Fo(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140 582 V 21 w(insert)p
-303 582 V 21 w(text)k Ff(\()p Fn(char)14 b(*text)p Ff(\))120
-644 y Fo(Insert)h Fj(text)h Fo(in)o(to)f(the)h(line)g(at)f(the)g(curren)o(t)g
-(cursor)g(p)q(osition.)1725 803 y(F)l(unction)-1899 b Fh(int)20
-b Fg(rl)p 140 803 V 21 w(delete)p 308 803 V 22 w(text)k Ff(\()p
-Fn(int)14 b(start,)h(int)f(end)p Ff(\))120 865 y Fo(Delete)i(the)f(text)g(b)q
-(et)o(w)o(een)g Fj(start)g Fo(and)h Fj(end)h Fo(in)f(the)g(curren)o(t)f
-(line.)1725 1025 y(F)l(unction)-1899 b Fh(char)20 b(*)f Fg(rl)p
-211 1025 V 21 w(cop)n(y)p 346 1025 V 21 w(text)24 b Ff(\()p
-Fn(int)14 b(start,)h(int)g(end)p Ff(\))120 1087 y Fo(Return)h(a)f(cop)o(y)g
-(of)g(the)g(text)f(b)q(et)o(w)o(een)i Fj(start)f Fo(and)g Fj(end)j
-Fo(in)e(the)f(curren)o(t)g(line.)1725 1246 y(F)l(unction)-1899
-b Fh(int)20 b Fg(rl)p 140 1246 V 21 w(kill)p 236 1246 V 23
-w(text)k Ff(\()p Fn(int)14 b(start,)h(int)g(end)p Ff(\))120
-1308 y Fo(Cop)o(y)k(the)g(text)f(b)q(et)o(w)o(een)i Fj(start)e
-Fo(and)i Fj(end)h Fo(in)f(the)f(curren)o(t)g(line)i(to)d(the)h(kill)i(ring,)f
-(app)q(ending)120 1371 y(or)e(prep)q(ending)j(to)d(the)h(last)f(kill)j(if)e
-(the)g(last)f(command)h(w)o(as)e(a)i(kill)h(command.)30 b(The)19
-b(text)f(is)120 1433 y(deleted.)j(If)13 b Fj(start)g Fo(is)h(less)f(than)h
-Fj(end)p Fo(,)f(the)h(text)e(is)i(app)q(ended,)h(otherwise)e(prep)q(ended.)21
-b(If)14 b(the)f(last)120 1495 y(command)i(w)o(as)f(not)h(a)g(kill,)i(a)e(new)
-g(kill)i(ring)f(slot)f(is)g(used.)0 1697 y Fi(2.3.8)30 b(Utilit)n(y)16
-b(F)-5 b(unctions)1725 1856 y Fo(F)l(unction)-1899 b Fh(int)20
-b Fg(rl)p 140 1856 V 21 w(reset)p 282 1856 V 20 w(terminal)j
-Ff(\()p Fn(char)15 b(*terminal_name)p Ff(\))120 1919 y Fo(Reinitializ)q(e)f
-(Readline's)e(idea)g(of)e(the)h(terminal)h(settings)f(using)g
-Fj(terminal)p 1404 1919 14 2 v 17 w(name)j Fo(as)c(the)h(terminal)120
-1981 y(t)o(yp)q(e)k(\(e.g.,)f Fn(vt100)p Fo(\).)1725 2140 y(F)l(unction)-1899
-b Fh(int)20 b Fg(alphab)r(etic)k Ff(\()p Fn(int)14 b(c)p Ff(\))120
-2202 y Fo(Return)i(1)f(if)g Fj(c)j Fo(is)e(an)f(alphab)q(etic)i(c)o
-(haracter.)1725 2361 y(F)l(unction)-1899 b Fh(int)20 b Fg(n)n(umeric)i
-Ff(\()p Fn(int)15 b(c)p Ff(\))120 2424 y Fo(Return)h(1)f(if)g
-Fj(c)j Fo(is)e(a)f(n)o(umeric)h(c)o(haracter.)1725 2583 y(F)l(unction)-1899
-b Fh(int)20 b Fg(ding)i Ff(\(\))120 2645 y Fo(Ring)16 b(the)f(terminal)h(b)q
-(ell,)h(ob)q(eying)f(the)g(setting)f(of)g Fn(bell-style)p Fo(.)p
+b(The)18 b(undo)h(information)f(usually)120 308 y(comes)j(from)f(calls)
+h(to)g Fq(rl_insert_text)13 b(\(\))20 b Fr(and)h Fq(rl_delete_text)13
+b(\(\))p Fr(,)22 b(but)f(could)g(b)q(e)h(the)120 370
+y(result)16 b(of)e(calls)j(to)d Fq(rl_add_undo)g(\(\))p
+Fr(.)1725 541 y(F)l(unction)-1899 b Fi(int)20 b Fh(rl)p
+140 541 V 21 w(end)p 251 541 V 20 w(undo)p 396 541 V
+20 w(group)h Fg(\(\))120 603 y Fr(Closes)d(the)f(curren)o(t)g(undo)h
+(group)f(started)g(with)h Fq(rl_begin_undo_group)12 b(\(\))p
+Fr(.)26 b(There)18 b(should)120 665 y(b)q(e)e(one)f(call)i(to)d
+Fq(rl_end_undo_group)f(\(\))i Fr(for)f(eac)o(h)i(call)g(to)f
+Fq(rl_begin_undo_group)d(\(\))p Fr(.)1725 836 y(F)l(unction)-1899
+b Fi(void)20 b Fh(rl)p 166 836 V 21 w(add)p 279 836 V
+20 w(undo)i Fg(\()p Fq(enum)14 b(undo_code)g(what,)g(int)h(start,)g
+(int)f(end,)h(char)208 898 y(*text)p Fg(\))120 960 y
+Fr(Remem)o(b)q(er)20 b(ho)o(w)e(to)h(undo)g(an)g(ev)o(en)o(t)g
+(\(according)g(to)g Fl(what)q Fr(\).)30 b(The)19 b(a\013ected)g(text)f
+(runs)i(from)120 1023 y Fl(start)15 b Fr(to)g Fl(end)p
+Fr(,)g(and)g(encompasses)h Fl(text)p Fr(.)1725 1193 y(F)l(unction)-1899
+b Fi(void)20 b Fh(free)p 221 1193 V 20 w(undo)p 366 1193
+V 20 w(list)k Fg(\(\))120 1256 y Fr(F)l(ree)15 b(the)h(existing)g(undo)
+f(list.)1725 1426 y(F)l(unction)-1899 b Fi(int)20 b Fh(rl)p
+140 1426 V 21 w(do)p 222 1426 V 20 w(undo)i Fg(\(\))120
+1488 y Fr(Undo)14 b(the)f(\014rst)g(thing)h(on)g(the)f(undo)h(list.)20
+b(Returns)14 b Fq(0)f Fr(if)h(there)g(w)o(as)e(nothing)i(to)f(undo,)h
+(non-zero)120 1551 y(if)i(something)f(w)o(as)f(undone.)62
+1721 y(Finally)l(,)j(if)f(y)o(ou)f(neither)i(insert)f(nor)f(delete)i
+(text,)d(but)i(directly)h(mo)q(dify)f(the)f(existing)i(text)e(\(e.g.,)f
+(c)o(hange)0 1784 y(its)g(case\),)f(call)i Fq(rl_modifying)e(\(\))g
+Fr(once,)h(just)f(b)q(efore)h(y)o(ou)f(mo)q(dify)h(the)g(text.)19
+b(Y)l(ou)14 b(m)o(ust)f(supply)h(the)g(indices)0 1846
+y(of)h(the)g(text)g(range)g(that)f(y)o(ou)h(are)g(going)g(to)g(mo)q
+(dify)l(.)1725 2017 y(F)l(unction)-1899 b Fi(int)20 b
+Fh(rl)p 140 2017 V 21 w(mo)r(difying)h Fg(\()p Fq(int)15
+b(start,)f(int)h(end)p Fg(\))120 2079 y Fr(T)l(ell)e(Readline)g(to)e
+(sa)o(v)o(e)f(the)i(text)f(b)q(et)o(w)o(een)g Fl(start)g
+Fr(and)h Fl(end)h Fr(as)e(a)g(single)i(undo)e(unit.)20
+b(It)11 b(is)h(assumed)120 2141 y(that)i(y)o(ou)h(will)i(subsequen)o
+(tly)g(mo)q(dify)e(that)g(text.)0 2375 y Fk(2.4.6)30
+b(Redispla)n(y)1725 2545 y Fr(F)l(unction)-1899 b Fi(void)20
+b Fh(rl)p 166 2545 V 21 w(redispla)n(y)k Fg(\(\))120
+2608 y Fr(Change)d(what's)g(displa)o(y)o(ed)h(on)g(the)f(screen)h(to)f
+(re\015ect)h(the)f(curren)o(t)g(con)o(ten)o(ts)g(of)g
+Fq(rl_line_)120 2670 y(buffer)p Fr(.)p eop
+30 31 bop 0 -58 a Fr(30)1449 b(GNU)15 b(Readline)i(Library)1725
+183 y(F)l(unction)-1899 b Fi(int)20 b Fh(rl)p 140 183
+18 3 v 21 w(forced)p 315 183 V 20 w(up)r(date)p 509 183
+V 20 w(displa)n(y)k Fg(\(\))120 246 y Fr(F)l(orce)12
+b(the)g(line)h(to)f(b)q(e)g(up)q(dated)h(and)f(redispla)o(y)o(ed,)i
+(whether)e(or)f(not)h(Readline)i(thinks)e(the)g(screen)120
+308 y(displa)o(y)k(is)g(correct.)1725 462 y(F)l(unction)-1899
+b Fi(int)20 b Fh(rl)p 140 462 V 21 w(on)p 222 462 V 20
+w(new)p 341 462 V 21 w(line)k Fg(\(\))120 524 y Fr(T)l(ell)c(the)f(up)q
+(date)g(routines)g(that)f(w)o(e)g(ha)o(v)o(e)g(mo)o(v)o(ed)g(on)o(to)g
+(a)g(new)h(\(empt)o(y\))e(line,)k(usually)f(after)120
+587 y(ouputting)c(a)e(newline.)1725 741 y(F)l(unction)-1899
+b Fi(int)20 b Fh(rl)p 140 741 V 21 w(reset)p 282 741
+V 20 w(line)p 390 741 V 23 w(state)j Fg(\(\))120 803
+y Fr(Reset)14 b(the)f(displa)o(y)h(state)f(to)f(a)h(clean)h(state)f
+(and)g(redispla)o(y)i(the)e(curren)o(t)g(line)i(starting)e(on)g(a)g
+(new)120 866 y(line.)1725 1020 y(F)l(unction)-1899 b
+Fi(int)20 b Fh(rl)p 140 1020 V 21 w(message)g Fg(\()p
+Fq(va_alist)p Fg(\))120 1082 y Fr(The)f(argumen)o(ts)e(are)h(a)g
+(string)g(as)g(w)o(ould)h(b)q(e)g(supplied)i(to)d Fq(printf)p
+Fr(.)28 b(The)19 b(resulting)g(string)f(is)120 1145 y(displa)o(y)o(ed)h
+(in)f(the)g Fl(ec)o(ho)f(area)p Fr(.)27 b(The)18 b(ec)o(ho)f(area)g(is)
+h(also)g(used)g(to)f(displa)o(y)h(n)o(umeric)h(argumen)o(ts)120
+1207 y(and)c(searc)o(h)g(strings.)1725 1361 y(F)l(unction)-1899
+b Fi(int)20 b Fh(rl)p 140 1361 V 21 w(clear)p 279 1361
+V 21 w(message)h Fg(\(\))120 1424 y Fr(Clear)15 b(the)h(message)e(in)i
+(the)g(ec)o(ho)f(area.)0 1616 y Fk(2.4.7)30 b(Mo)r(difying)15
+b(T)-5 b(ext)1725 1771 y Fr(F)l(unction)-1899 b Fi(int)20
+b Fh(rl)p 140 1771 V 21 w(insert)p 303 1771 V 21 w(text)k
+Fg(\()p Fq(char)14 b(*text)p Fg(\))120 1833 y Fr(Insert)h
+Fl(text)h Fr(in)o(to)f(the)h(line)g(at)f(the)g(curren)o(t)g(cursor)g(p)
+q(osition.)1725 1988 y(F)l(unction)-1899 b Fi(int)20
+b Fh(rl)p 140 1988 V 21 w(delete)p 308 1988 V 22 w(text)k
+Fg(\()p Fq(int)14 b(start,)h(int)f(end)p Fg(\))120 2050
+y Fr(Delete)i(the)f(text)g(b)q(et)o(w)o(een)g Fl(start)g
+Fr(and)h Fl(end)h Fr(in)f(the)g(curren)o(t)f(line.)1725
+2204 y(F)l(unction)-1899 b Fi(char)20 b(*)f Fh(rl)p 211
+2204 V 21 w(cop)n(y)p 346 2204 V 21 w(text)24 b Fg(\()p
+Fq(int)14 b(start,)h(int)g(end)p Fg(\))120 2266 y Fr(Return)h(a)f(cop)o
+(y)g(of)g(the)g(text)f(b)q(et)o(w)o(een)i Fl(start)f
+Fr(and)g Fl(end)j Fr(in)e(the)f(curren)o(t)g(line.)1725
+2421 y(F)l(unction)-1899 b Fi(int)20 b Fh(rl)p 140 2421
+V 21 w(kill)p 236 2421 V 23 w(text)k Fg(\()p Fq(int)14
+b(start,)h(int)g(end)p Fg(\))120 2483 y Fr(Cop)o(y)k(the)g(text)f(b)q
+(et)o(w)o(een)i Fl(start)e Fr(and)i Fl(end)h Fr(in)f(the)f(curren)o(t)g
+(line)i(to)d(the)h(kill)i(ring,)f(app)q(ending)120 2545
+y(or)e(prep)q(ending)j(to)d(the)h(last)f(kill)j(if)e(the)g(last)f
+(command)h(w)o(as)e(a)i(kill)h(command.)30 b(The)19 b(text)f(is)120
+2608 y(deleted.)j(If)13 b Fl(start)g Fr(is)h(less)f(than)h
+Fl(end)p Fr(,)f(the)h(text)e(is)i(app)q(ended,)h(otherwise)e(prep)q
+(ended.)21 b(If)14 b(the)f(last)120 2670 y(command)i(w)o(as)f(not)h(a)g
+(kill,)i(a)e(new)g(kill)i(ring)f(slot)f(is)g(used.)p
eop
-%%Page: 26 28
-27 bop 0 -83 a Fo(26)1449 b(GNU)15 b(Readline)i(Library)62
-158 y(The)f(follo)o(wing)g(are)f(implemen)o(ted)h(as)f(macros,)f(de\014ned)j
-(in)f Fn(chartypes.h)p Fo(.)1725 319 y(F)l(unction)-1899 b
-Fh(int)20 b Fg(upp)r(ercase)p 351 319 18 3 v 19 w(p)j Ff(\()p
-Fn(int)14 b(c)p Ff(\))120 381 y Fo(Return)i(1)f(if)g Fj(c)j
-Fo(is)e(an)f(upp)q(ercase)i(alphab)q(etic)f(c)o(haracter.)1725
-541 y(F)l(unction)-1899 b Fh(int)20 b Fg(lo)n(w)n(ercase)p
-334 541 V 22 w(p)i Ff(\()p Fn(int)15 b(c)p Ff(\))120 604 y
-Fo(Return)h(1)f(if)g Fj(c)j Fo(is)e(a)f(lo)o(w)o(ercase)g(alphab)q(etic)i(c)o
-(haracter.)1725 764 y(F)l(unction)-1899 b Fh(int)20 b Fg(digit)p
-214 764 V 22 w(p)i Ff(\()p Fn(int)15 b(c)p Ff(\))120 826 y
-Fo(Return)h(1)f(if)g Fj(c)j Fo(is)e(a)f(n)o(umeric)h(c)o(haracter.)1725
-987 y(F)l(unction)-1899 b Fh(int)20 b Fg(to)p 152 987 V 20
-w(upp)r(er)i Ff(\()p Fn(int)14 b(c)p Ff(\))120 1049 y Fo(If)h
-Fj(c)i Fo(is)f(a)e(lo)o(w)o(ercase)g(alphab)q(etic)j(c)o(haracter,)c(return)i
-(the)g(corresp)q(onding)g(upp)q(ercase)h(c)o(haracter.)1725
-1209 y(F)l(unction)-1899 b Fh(int)20 b Fg(to)p 152 1209 V 20
-w(lo)n(w)n(er)k Ff(\()p Fn(int)15 b(c)p Ff(\))120 1272 y Fo(If)e
-Fj(c)i Fo(is)e(an)f(upp)q(ercase)h(alphab)q(etic)h(c)o(haracter,)e(return)g
-(the)h(corresp)q(onding)g(lo)o(w)o(ercase)f(c)o(haracter.)1725
-1432 y(F)l(unction)-1899 b Fh(int)20 b Fg(digit)p 214 1432
-V 22 w(v)m(alue)j Ff(\()p Fn(int)15 b(c)p Ff(\))120 1494 y
-Fo(If)g Fj(c)k Fo(is)c(a)g(n)o(um)o(b)q(er,)g(return)g(the)h(v)m(alue)g(it)g
-(represen)o(ts.)0 1699 y Fi(2.3.9)30 b(An)15 b(Example)62 1836
-y Fo(Here)e(is)g(a)f(function)h(whic)o(h)g(c)o(hanges)g(lo)o(w)o(ercase)f(c)o
-(haracters)f(to)h(their)h(upp)q(ercase)g(equiv)m(alen)o(ts,)h(and)f(upp)q
-(er-)0 1898 y(case)j(c)o(haracters)g(to)g(lo)o(w)o(ercase.)23
-b(If)16 b(this)h(function)g(w)o(as)f(b)q(ound)h(to)f(`)p Fn(M-c)p
-Fo(',)f(then)h(t)o(yping)h(`)p Fn(M-c)p Fo(')e(w)o(ould)i(c)o(hange)0
-1960 y(the)g(case)f(of)g(the)h(c)o(haracter)f(under)h(p)q(oin)o(t.)25
-b(T)o(yping)17 b(`)p Fn(M-1)d(0)h(M-c)p Fo(')h(w)o(ould)h(c)o(hange)f(the)h
-(case)f(of)h(the)f(follo)o(wing)0 2022 y(10)f(c)o(haracters,)f(lea)o(ving)i
-(the)f(cursor)g(on)g(the)g(last)g(c)o(haracter)g(c)o(hanged.)120
-2147 y Fn(/*)24 b(Invert)f(the)g(case)g(of)h(the)f(COUNT)h(following)e
-(characters.)h(*/)120 2197 y(int)120 2247 y(invert_case_line)f(\(count,)h
-(key\))239 2296 y(int)h(count,)f(key;)120 2346 y({)168 2396
-y(register)f(int)i(start,)f(end,)g(i;)168 2496 y(start)g(=)h(rl_point;)168
-2595 y(if)f(\(rl_point)g(>=)h(rl_end\))215 2645 y(return)f(\(0\);)p
+31 32 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(31)0 183 y Fk(2.4.8)30 b(Utilit)n(y)16
+b(F)-5 b(unctions)1725 345 y Fr(F)l(unction)-1899 b Fi(int)20
+b Fh(rl)p 140 345 18 3 v 21 w(read)p 271 345 V 20 w(k)n(ey)k
+Fg(\(\))120 407 y Fr(Return)14 b(the)g(next)g(c)o(haracter)f(a)o(v)m
+(ailable.)21 b(This)15 b(handles)g(input)g(inserted)f(in)o(to)g(the)g
+(input)h(stream)120 469 y(via)h Fl(p)q(ending)i(input)h
+Fr(\(see)d(Section)h(2.3)e([Readline)j(V)l(ariables],)f(page)f(22\))f
+(and)i Fq(rl_stuff_char)120 532 y(\(\))p Fr(,)e(macros,)f(and)h(c)o
+(haracters)f(read)h(from)g(the)g(k)o(eyb)q(oard.)1725
+693 y(F)l(unction)-1899 b Fi(int)20 b Fh(rl)p 140 693
+V 21 w(getc)j Fg(\()p Fq(FILE)14 b(*)p Fg(\))120 755
+y Fr(Return)i(the)f(next)g(c)o(haracter)g(a)o(v)m(ailable)i(from)d(the)
+h(k)o(eyb)q(oard.)1725 917 y(F)l(unction)-1899 b Fi(int)20
+b Fh(rl)p 140 917 V 21 w(stu\013)p 271 917 V 20 w(c)n(har)j
+Fg(\()p Fq(int)15 b(c)p Fg(\))120 979 y Fr(Insert)g Fl(c)i
+Fr(in)o(to)e(the)g(Readline)i(input)e(stream.)k(It)c(will)h(b)q(e)g
+Fq(")p Fr(read)p Fq(")e Fr(b)q(efore)h(Readline)i(attempts)d(to)120
+1041 y(read)h(c)o(haracters)g(from)f(the)h(terminal)h(with)g
+Fq(rl_read_key)d(\(\))p Fr(.)1725 1203 y(F)l(unction)-1899
+b Fi(rl_extend_line_buffer)22 b Fh(\(in)n(t)j Fq(len)p
+Fg(\))120 1265 y Fr(Ensure)15 b(that)f Fq(rl_line_buffer)e
+Fr(has)j(enough)g(space)g(to)e(hold)j Fl(len)f Fr(c)o(haracters,)f(p)q
+(ossibly)i(reallo-)120 1327 y(cating)f(it)h(if)f(necessary)l(.)1725
+1489 y(F)l(unction)-1899 b Fi(int)20 b Fh(rl)p 140 1489
+V 21 w(initiali)q(z)q(e)26 b Fg(\(\))120 1551 y Fr(Initialize)18
+b(or)d(re-initialize)j(Readline's)f(in)o(ternal)f(state.)1725
+1713 y(F)l(unction)-1899 b Fi(int)20 b Fh(rl)p 140 1713
+V 21 w(reset)p 282 1713 V 20 w(terminal)j Fg(\()p Fq(char)15
+b(*terminal_name)p Fg(\))120 1775 y Fr(Reinitializ)q(e)f(Readline's)e
+(idea)g(of)e(the)h(terminal)h(settings)f(using)g Fl(terminal)p
+1404 1775 14 2 v 17 w(name)j Fr(as)c(the)h(terminal)120
+1837 y(t)o(yp)q(e)k(\(e.g.,)f Fq(vt100)p Fr(\).)1725
+1999 y(F)l(unction)-1899 b Fi(int)20 b Fh(alphab)r(etic)k
+Fg(\()p Fq(int)14 b(c)p Fg(\))120 2061 y Fr(Return)i(1)f(if)g
+Fl(c)j Fr(is)e(an)f(alphab)q(etic)i(c)o(haracter.)1725
+2222 y(F)l(unction)-1899 b Fi(int)20 b Fh(n)n(umeric)i
+Fg(\()p Fq(int)15 b(c)p Fg(\))120 2285 y Fr(Return)h(1)f(if)g
+Fl(c)j Fr(is)e(a)f(n)o(umeric)h(c)o(haracter.)1725 2446
+y(F)l(unction)-1899 b Fi(int)20 b Fh(ding)i Fg(\(\))120
+2508 y Fr(Ring)16 b(the)f(terminal)h(b)q(ell,)h(ob)q(eying)f(the)g
+(setting)f(of)g Fq(bell-style)p Fr(.)62 2670 y(The)h(follo)o(wing)g
+(are)f(implemen)o(ted)h(as)f(macros,)f(de\014ned)j(in)f
+Fq(chartypes.h)p Fr(.)p eop
+32 33 bop 0 -58 a Fr(32)1449 b(GNU)15 b(Readline)i(Library)1725
+183 y(F)l(unction)-1899 b Fi(int)20 b Fh(upp)r(ercase)p
+351 183 18 3 v 19 w(p)j Fg(\()p Fq(int)14 b(c)p Fg(\))120
+246 y Fr(Return)i(1)f(if)g Fl(c)j Fr(is)e(an)f(upp)q(ercase)i(alphab)q
+(etic)f(c)o(haracter.)1725 409 y(F)l(unction)-1899 b
+Fi(int)20 b Fh(lo)n(w)n(ercase)p 334 409 V 22 w(p)i Fg(\()p
+Fq(int)15 b(c)p Fg(\))120 471 y Fr(Return)h(1)f(if)g
+Fl(c)j Fr(is)e(a)f(lo)o(w)o(ercase)g(alphab)q(etic)i(c)o(haracter.)1725
+634 y(F)l(unction)-1899 b Fi(int)20 b Fh(digit)p 214
+634 V 22 w(p)i Fg(\()p Fq(int)15 b(c)p Fg(\))120 696
+y Fr(Return)h(1)f(if)g Fl(c)j Fr(is)e(a)f(n)o(umeric)h(c)o(haracter.)
+1725 859 y(F)l(unction)-1899 b Fi(int)20 b Fh(to)p 152
+859 V 20 w(upp)r(er)i Fg(\()p Fq(int)14 b(c)p Fg(\))120
+922 y Fr(If)h Fl(c)i Fr(is)f(a)e(lo)o(w)o(ercase)g(alphab)q(etic)j(c)o
+(haracter,)c(return)i(the)g(corresp)q(onding)g(upp)q(ercase)h(c)o
+(haracter.)1725 1085 y(F)l(unction)-1899 b Fi(int)20
+b Fh(to)p 152 1085 V 20 w(lo)n(w)n(er)k Fg(\()p Fq(int)15
+b(c)p Fg(\))120 1147 y Fr(If)e Fl(c)i Fr(is)e(an)f(upp)q(ercase)h
+(alphab)q(etic)h(c)o(haracter,)e(return)g(the)h(corresp)q(onding)g(lo)o
+(w)o(ercase)f(c)o(haracter.)1725 1310 y(F)l(unction)-1899
+b Fi(int)20 b Fh(digit)p 214 1310 V 22 w(v)m(alue)j Fg(\()p
+Fq(int)15 b(c)p Fg(\))120 1372 y Fr(If)g Fl(c)k Fr(is)c(a)g(n)o(um)o(b)
+q(er,)g(return)g(the)h(v)m(alue)g(it)g(represen)o(ts.)0
+1584 y Fk(2.4.9)30 b(Alternate)15 b(In)n(terface)62 1721
+y Fr(An)k(alternate)e(in)o(terface)h(is)h(a)o(v)m(ailable)h(to)d(plain)
+i Fq(readline\(\))p Fr(.)27 b(Some)18 b(applications)h(need)g(to)e(in)o
+(terlea)o(v)o(e)0 1783 y(k)o(eyb)q(oard)d(I/O)h(with)f(\014le,)h
+(device,)h(or)d(windo)o(w)i(system)e(I/O,)i(t)o(ypically)g(b)o(y)f
+(using)h(a)f(main)h(lo)q(op)g(to)e Fq(select\(\))0 1846
+y Fr(on)k(v)m(arious)h(\014le)g(descriptors.)26 b(T)l(o)17
+b(accomo)q(date)g(this)h(need,)g(readline)h(can)e(also)h(b)q(e)f(in)o
+(v)o(ok)o(ed)h(as)f(a)g(`callbac)o(k')0 1908 y(function)f(from)e(an)i
+(ev)o(en)o(t)f(lo)q(op.)20 b(There)15 b(are)g(functions)h(a)o(v)m
+(ailable)h(to)e(mak)o(e)f(this)i(easy)l(.)1725 2071 y(F)l(unction)-1899
+b Fi(void)20 b Fh(rl)p 166 2071 V 21 w(callbac)n(k)p
+383 2071 V 23 w(handler)p 595 2071 V 21 w(install)25
+b Fg(\()p Fq(char)14 b(*prompt,)g(Vfunction)208 2133
+y(*lhandler)p Fg(\))120 2196 y Fr(Set)h(up)g(the)f(terminal)i(for)d
+(readline)k(I/O)e(and)f(displa)o(y)i(the)f(initial)h(expanded)g(v)m
+(alue)g(of)e Fl(prompt)p Fr(.)120 2258 y(Sa)o(v)o(e)h(the)f(v)m(alue)j
+(of)d Fl(lhandler)20 b Fr(to)14 b(use)h(as)g(a)g(callbac)o(k)h(when)f
+(a)f(complete)i(line)h(of)d(input)i(has)f(b)q(een)120
+2320 y(en)o(tered.)1725 2483 y(F)l(unction)-1899 b Fi(void)20
+b Fh(rl)p 166 2483 V 21 w(callbac)n(k)p 383 2483 V 23
+w(read)p 516 2483 V 20 w(c)n(har)j Fg(\(\))120 2545 y
+Fr(Whenev)o(er)d(an)f(application)i(determines)g(that)e(k)o(eyb)q(oard)
+g(input)i(is)f(a)o(v)m(ailable,)i(it)d(should)i(call)120
+2608 y Fq(rl_callback_read_char\(\))p Fr(,)11 b(whic)o(h)j(will)i(read)
+e(the)g(next)g(c)o(haracter)f(from)g(the)h(curren)o(t)g(input)120
+2670 y(source.)24 b(If)17 b(that)f(c)o(haracter)g(completes)i(the)f
+(line,)h Fq(rl_callback_read_char)c Fr(will)k(in)o(v)o(ok)o(e)f(the)p
eop
-%%Page: 27 29
-28 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(27)168 208 y Fn(if)23 b(\(count)g(<)h(0\))215 258 y({)263
-308 y(direction)f(=)h(-1;)263 358 y(count)f(=)h(-count;)215
-407 y(})168 457 y(else)215 507 y(direction)f(=)h(1;)168 607
-y(/*)f(Find)h(the)f(end)h(of)f(the)h(range)f(to)g(modify.)g(*/)168
-656 y(end)g(=)h(start)f(+)h(\(count)f(*)h(direction\);)168
-756 y(/*)f(Force)g(it)h(to)g(be)f(within)g(range.)g(*/)168
-806 y(if)g(\(end)h(>)f(rl_end\))215 856 y(end)h(=)g(rl_end;)168
-906 y(else)f(if)h(\(end)f(<)h(0\))215 955 y(end)g(=)g(0;)168
-1055 y(if)f(\(start)g(==)h(end\))215 1105 y(return)f(\(0\);)168
-1204 y(if)g(\(start)g(>)h(end\))215 1254 y({)263 1304 y(int)g(temp)f(=)h
-(start;)263 1354 y(start)f(=)h(end;)263 1404 y(end)g(=)f(temp;)215
-1453 y(})168 1553 y(/*)g(Tell)h(readline)e(that)i(we)f(are)h(modifying)e(the)
-i(line,)f(so)h(it)f(will)h(save)239 1603 y(the)g(undo)f(information.)f(*/)168
-1653 y(rl_modifying)g(\(start,)h(end\);)168 1752 y(for)g(\(i)h(=)f(start;)h
-(i)f(!=)h(end;)f(i++\))215 1802 y({)263 1852 y(if)h(\(uppercase_p)e
-(\(rl_line_buffer[i]\)\))311 1902 y(rl_line_buffer[i])f(=)j(to_lower)f
-(\(rl_line_buffer[i]\);)263 1952 y(else)g(if)h(\(lowercase_p)e
-(\(rl_line_buffer[i]\)\))311 2001 y(rl_line_buffer[i])f(=)j(to_upper)f
-(\(rl_line_buffer[i]\);)215 2051 y(})168 2101 y(/*)g(Move)h(point)f(to)g(on)h
-(top)f(of)h(the)f(last)h(character)e(changed.)h(*/)168 2151
-y(rl_point)f(=)i(\(direction)f(==)g(1\))h(?)g(end)f(-)h(1)g(:)f(start;)168
-2201 y(return)g(\(0\);)120 2250 y(})p eop
-%%Page: 28 30
-29 bop 0 -83 a Fo(28)1449 b(GNU)15 b(Readline)i(Library)0 158
-y Fm(2.4)33 b(Custom)14 b(Completers)62 306 y Fo(T)o(ypically)l(,)g(a)c
-(program)g(that)h(reads)g(commands)g(from)f(the)h(user)h(has)e(a)h(w)o(a)o(y)
-f(of)h(disam)o(biguating)h(commands)0 368 y(and)k(data.)k(If)c(y)o(our)f
-(program)g(is)h(one)g(of)f(these,)h(then)g(it)g(can)g(pro)o(vide)g
-(completion)g(for)g(commands,)f(data,)f(or)0 430 y(b)q(oth.)28
+33 34 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(33)120 183 y Fl(lhandler)19 b Fr(function)d(sa)o(v)o
+(ed)e(b)o(y)g Fq(rl_callback_handler_install)d Fr(to)j(pro)q(cess)h
+(the)f(line.)21 b Fq(EOF)14 b Fr(is)120 246 y(indicated)j(b)o(y)e
+(calling)i Fl(lhandler)j Fr(with)c(a)f Fq(NULL)f Fr(line.)1725
+413 y(F)l(unction)-1899 b Fi(void)20 b Fh(rl)p 166 413
+18 3 v 21 w(callbac)n(k)p 383 413 V 23 w(handler)p 595
+413 V 21 w(remo)n(v)n(e)i Fg(\(\))120 476 y Fr(Restore)12
+b(the)g(terminal)h(to)e(its)i(initial)h(state)d(and)h(remo)o(v)o(e)g
+(the)g(line)i(handler.)20 b(This)12 b(ma)o(y)g(b)q(e)g(called)120
+538 y(from)i(within)j(a)e(callbac)o(k)h(as)f(w)o(ell)h(as)f(indep)q
+(enden)o(tly)l(.)0 763 y Fk(2.4.10)29 b(An)16 b(Example)62
+902 y Fr(Here)d(is)g(a)f(function)h(whic)o(h)g(c)o(hanges)g(lo)o(w)o
+(ercase)f(c)o(haracters)f(to)h(their)h(upp)q(ercase)g(equiv)m(alen)o
+(ts,)h(and)f(upp)q(er-)0 964 y(case)j(c)o(haracters)g(to)g(lo)o(w)o
+(ercase.)23 b(If)16 b(this)h(function)g(w)o(as)f(b)q(ound)h(to)f(`)p
+Fq(M-c)p Fr(',)f(then)h(t)o(yping)h(`)p Fq(M-c)p Fr(')e(w)o(ould)i(c)o
+(hange)0 1026 y(the)g(case)f(of)g(the)h(c)o(haracter)f(under)h(p)q(oin)
+o(t.)25 b(T)o(yping)17 b(`)p Fq(M-1)d(0)h(M-c)p Fr(')h(w)o(ould)h(c)o
+(hange)f(the)h(case)f(of)h(the)f(follo)o(wing)0 1089
+y(10)f(c)o(haracters,)f(lea)o(ving)i(the)f(cursor)g(on)g(the)g(last)g
+(c)o(haracter)g(c)o(hanged.)120 1217 y Fq(/*)24 b(Invert)f(the)g(case)g
+(of)h(the)f(COUNT)h(following)e(characters.)h(*/)120
+1269 y(int)120 1321 y(invert_case_line)f(\(count,)h(key\))239
+1373 y(int)h(count,)f(key;)120 1425 y({)168 1477 y(register)f(int)i
+(start,)f(end,)g(i;)168 1580 y(start)g(=)h(rl_point;)168
+1684 y(if)f(\(rl_point)g(>=)h(rl_end\))215 1736 y(return)f(\(0\);)168
+1840 y(if)g(\(count)g(<)h(0\))215 1892 y({)263 1944 y(direction)f(=)h
+(-1;)263 1995 y(count)f(=)h(-count;)215 2047 y(})168
+2099 y(else)215 2151 y(direction)f(=)h(1;)168 2255 y(/*)f(Find)h(the)f
+(end)h(of)f(the)h(range)f(to)g(modify.)g(*/)168 2307
+y(end)g(=)h(start)f(+)h(\(count)f(*)h(direction\);)168
+2411 y(/*)f(Force)g(it)h(to)g(be)f(within)g(range.)g(*/)168
+2462 y(if)g(\(end)h(>)f(rl_end\))215 2514 y(end)h(=)g(rl_end;)168
+2566 y(else)f(if)h(\(end)f(<)h(0\))215 2618 y(end)g(=)g(0;)p
+eop
+34 35 bop 0 -58 a Fr(34)1449 b(GNU)15 b(Readline)i(Library)168
+183 y Fq(if)23 b(\(start)g(==)h(end\))215 235 y(return)f(\(0\);)168
+339 y(if)g(\(start)g(>)h(end\))215 391 y({)263 443 y(int)g(temp)f(=)h
+(start;)263 495 y(start)f(=)h(end;)263 546 y(end)g(=)f(temp;)215
+598 y(})168 702 y(/*)g(Tell)h(readline)e(that)i(we)f(are)h(modifying)e
+(the)i(line,)f(so)h(it)f(will)h(save)239 754 y(the)g(undo)f
+(information.)f(*/)168 806 y(rl_modifying)g(\(start,)h(end\);)168
+910 y(for)g(\(i)h(=)f(start;)h(i)f(!=)h(end;)f(i++\))215
+962 y({)263 1013 y(if)h(\(uppercase_p)e(\(rl_line_buffer[i]\)\))311
+1065 y(rl_line_buffer[i])f(=)j(to_lower)f(\(rl_line_buffer[i]\);)263
+1117 y(else)g(if)h(\(lowercase_p)e(\(rl_line_buffer[i]\)\))311
+1169 y(rl_line_buffer[i])f(=)j(to_upper)f(\(rl_line_buffer[i]\);)215
+1221 y(})168 1273 y(/*)g(Move)h(point)f(to)g(on)h(top)f(of)h(the)f
+(last)h(character)e(changed.)h(*/)168 1325 y(rl_point)f(=)i
+(\(direction)f(==)g(1\))h(?)g(end)f(-)h(1)g(:)f(start;)168
+1377 y(return)g(\(0\);)120 1429 y(})0 1670 y Fp(2.5)33
+b(Custom)14 b(Completers)62 1809 y Fr(T)o(ypically)l(,)g(a)c(program)g
+(that)h(reads)g(commands)g(from)f(the)h(user)h(has)e(a)h(w)o(a)o(y)f
+(of)h(disam)o(biguating)h(commands)0 1871 y(and)k(data.)k(If)c(y)o(our)
+f(program)g(is)h(one)g(of)f(these,)h(then)g(it)g(can)g(pro)o(vide)g
+(completion)g(for)g(commands,)f(data,)f(or)0 1933 y(b)q(oth.)28
b(The)18 b(follo)o(wing)h(sections)f(describ)q(e)h(ho)o(w)f(y)o(our)f
(program)g(and)h(Readline)i(co)q(op)q(erate)e(to)f(pro)o(vide)i(this)0
-493 y(service.)0 795 y Fi(2.4.1)30 b(Ho)n(w)15 b(Completing)g(W)-5
-b(orks)62 942 y Fo(In)16 b(order)f(to)g(complete)h(some)f(text,)f(the)h(full)
-i(list)f(of)f(p)q(ossible)i(completions)f(m)o(ust)f(b)q(e)h(a)o(v)m(ailable.)
-21 b(That)15 b(is,)0 1004 y(it)k(is)f(not)g(p)q(ossible)i(to)e(accurately)h
-(expand)g(a)f(partial)h(w)o(ord)e(without)i(kno)o(wing)f(all)h(of)f(the)h(p)q
-(ossible)h(w)o(ords)0 1067 y(whic)o(h)c(mak)o(e)f(sense)h(in)g(that)e(con)o
-(text.)20 b(The)15 b(Readline)j(library)e(pro)o(vides)f(the)h(user)f(in)o
-(terface)h(to)e(completion,)0 1129 y(and)h(t)o(w)o(o)f(of)h(the)h(most)e
-(common)h(completion)h(functions:)21 b(\014lename)c(and)e(username.)20
-b(F)l(or)15 b(completing)h(other)0 1191 y(t)o(yp)q(es)h(of)f(text,)g(y)o(ou)h
-(m)o(ust)f(write)h(y)o(our)f(o)o(wn)g(completion)i(function.)25
-b(This)18 b(section)f(describ)q(es)h(exactly)g(what)0 1253
-y(suc)o(h)e(functions)f(m)o(ust)g(do,)g(and)g(pro)o(vides)h(an)f(example.)62
-1401 y(There)h(are)f(three)g(ma)s(jor)f(functions)i(used)f(to)g(p)q(erform)g
-(completion:)25 1548 y(1.)29 b(The)15 b(user-in)o(terface)g(function)g
-Fn(rl_complete)e(\(\))p Fo(.)20 b(This)15 b(function)g(is)g(called)h(with)e
-(the)h(same)f(argumen)o(ts)90 1611 y(as)j(other)g(Readline)j(functions)f(in)o
-(tended)g(for)e(in)o(teractiv)o(e)h(use:)25 b Fj(coun)o(t)18
-b Fo(and)g Fj(in)o(v)o(oking)p 1633 1611 14 2 v 17 w(k)o(ey)p
-Fo(.)27 b(It)18 b(isolates)90 1673 y(the)j(w)o(ord)g(to)f(b)q(e)i(completed)h
-(and)e(calls)h Fn(completion_matches)13 b(\(\))21 b Fo(to)f(generate)h(a)g
-(list)h(of)f(p)q(ossible)90 1735 y(completions.)h(It)16 b(then)g(either)h
-(lists)f(the)g(p)q(ossible)h(completions,)g(inserts)f(the)g(p)q(ossible)h
-(completions,)f(or)90 1797 y(actually)g(p)q(erforms)f(the)g(completion,)h
-(dep)q(ending)i(on)d(whic)o(h)h(b)q(eha)o(vior)f(is)h(desired.)25
-1883 y(2.)29 b(The)18 b(in)o(ternal)h(function)g Fn(completion_matches)13
-b(\(\))18 b Fo(uses)g(y)o(our)f Fj(generator)k Fo(function)e(to)e(generate)h
-(the)90 1945 y(list)h(of)e(p)q(ossible)j(matc)o(hes,)e(and)g(then)g(returns)g
-(the)g(arra)o(y)f(of)h(these)g(matc)o(hes.)28 b(Y)l(ou)18 b(should)h(place)g
-(the)90 2007 y(address)c(of)g(y)o(our)g(generator)f(function)i(in)g
-Fn(rl_completion_entry_functi)o(on)p Fo(.)25 2092 y(3.)29 b(The)16
-b(generator)g(function)h(is)f(called)i(rep)q(eatedly)g(from)d
-Fn(completion_matches)e(\(\))p Fo(,)i(returning)i(a)f(string)90
-2155 y(eac)o(h)j(time.)31 b(The)19 b(argumen)o(ts)f(to)g(the)h(generator)e
-(function)j(are)e Fj(text)i Fo(and)f Fj(state)p Fo(.)29 b Fj(text)19
-b Fo(is)h(the)f(partial)90 2217 y(w)o(ord)13 b(to)g(b)q(e)h(completed.)21
-b Fj(state)15 b Fo(is)f(zero)g(the)g(\014rst)f(time)h(the)g(function)g(is)g
-(called,)i(allo)o(wing)e(the)g(generator)90 2279 y(to)19 b(p)q(erform)f(an)o
-(y)h(necessary)h(initialization,)i(and)e(a)f(p)q(ositiv)o(e)h(non-zero)f(in)o
-(teger)h(for)e(eac)o(h)h(subsequen)o(t)90 2341 y(call.)35 b(When)21
-b(the)f(generator)f(function)i(returns)f Fn(\(char)14 b(*\)NULL)19
-b Fo(this)i(signals)f Fn(completion_matches)90 2404 y(\(\))c
-Fo(that)g(there)h(are)f(no)h(more)f(p)q(ossibilitie)q(s)j(left.)25
-b(Usually)18 b(the)e(generator)g(function)i(computes)e(the)h(list)90
-2466 y(of)j(p)q(ossible)i(completions)f(when)g Fj(state)h Fo(is)f(zero,)g
-(and)f(returns)g(them)h(one)f(at)g(a)g(time)g(on)g(subsequen)o(t)90
-2528 y(calls.)g(Eac)o(h)14 b(string)f(the)h(generator)e(function)j(returns)e
-(as)g(a)g(matc)o(h)g(m)o(ust)g(b)q(e)h(allo)q(cated)h(with)e
-Fn(malloc\(\))p Fo(;)90 2590 y(Readline)18 b(frees)d(the)g(strings)g(when)h
-(it)f(has)g(\014nished)i(with)f(them.)p eop
-%%Page: 29 31
-30 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(29)1725 158 y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140
-158 18 3 v 21 w(complete)j Ff(\()p Fn(int)14 b(ignore,)g(int)h(invoking_key)p
-Ff(\))120 221 y Fo(Complete)j(the)f(w)o(ord)f(at)h(or)g(b)q(efore)g(p)q(oin)o
-(t.)27 b(Y)l(ou)17 b(ha)o(v)o(e)g(supplied)i(the)f(function)g(that)e(do)q(es)
-i(the)120 283 y(initial)d(simple)f(matc)o(hing)f(selection)h(algorithm)f
-(\(see)f Fn(completion_matches)h(\(\))p Fo(\).)18 b(The)13
-b(default)120 345 y(is)j(to)e(do)h(\014lename)i(completion.)1736
-520 y(V)l(ariable)-1899 b Fh(Function)20 b(*)g Fg(rl)p 316
-520 V 21 w(completion)p 611 520 V 21 w(en)n(try)p 764 520 V
-21 w(function)120 582 y Fo(This)e(is)g(a)f(p)q(oin)o(ter)h(to)f(the)g
-(generator)g(function)h(for)f Fn(completion_matches)12 b(\(\))p
-Fo(.)27 b(If)17 b(the)h(v)m(alue)120 644 y(of)j Fn(rl_completion_entry_funct)
-o(ion)d Fo(is)k Fn(\(Function)14 b(*\)NULL)20 b Fo(then)i(the)f(default)h
-(\014lename)120 707 y(generator)14 b(function,)i Fn(filename_entry_function)c
-(\(\))p Fo(,)i(is)i(used.)0 953 y Fi(2.4.2)30 b(Completion)15
-b(F)-5 b(unctions)62 1094 y Fo(Here)16 b(is)f(the)h(complete)g(list)g(of)e
-(callable)k(completion)e(functions)g(presen)o(t)f(in)h(Readline.)1725
-1269 y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140 1269 V 21
-w(complete)p 385 1269 V 21 w(in)n(ternal)k Ff(\()p Fn(int)15
-b(what_to_do)p Ff(\))120 1331 y Fo(Complete)d(the)g(w)o(ord)f(at)g(or)g(b)q
-(efore)h(p)q(oin)o(t.)19 b Fj(what)p 979 1331 14 2 v 16 w(to)p
-1036 1331 V 16 w(do)14 b Fo(sa)o(ys)d(what)g(to)g(do)g(with)h(the)g
-(completion.)120 1394 y(A)g(v)m(alue)h(of)f(`)p Fn(?)p Fo(')f(means)h(list)h
-(the)f(p)q(ossible)i(completions.)20 b(`)p Fn(TAB)p Fo(')11
-b(means)h(do)g(standard)f(completion.)120 1456 y(`)p Fn(*)p
-Fo(')i(means)h(insert)h(all)g(of)f(the)g(p)q(ossible)i(completions.)21
-b(`)p Fn(!)p Fo(')13 b(means)h(to)g(displa)o(y)h(all)g(of)f(the)g(p)q
-(ossible)120 1518 y(completions,)i(if)g(there)f(is)h(more)e(than)h(one,)g(as)
-g(w)o(ell)h(as)f(p)q(erforming)h(partial)f(completion.)1725
-1693 y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140 1693 18
-3 v 21 w(complete)j Ff(\()p Fn(int)14 b(ignore,)g(int)h(invoking_key)p
-Ff(\))120 1755 y Fo(Complete)23 b(the)g(w)o(ord)e(at)h(or)g(b)q(efore)h(p)q
-(oin)o(t.)43 b(Y)l(ou)23 b(ha)o(v)o(e)f(supplied)j(the)d(function)i(that)e
-(do)q(es)120 1817 y(the)16 b(initial)j(simple)f(matc)o(hing)e(selection)i
-(algorithm)e(\(see)g Fn(completion_matches)d(\(\))j Fo(and)g
-Fn(rl_)120 1880 y(completion_entry_function)p Fo(\))o(.)25
+1995 y(service.)0 2220 y Fk(2.5.1)30 b(Ho)n(w)15 b(Completing)g(W)-5
+b(orks)62 2359 y Fr(In)16 b(order)f(to)g(complete)h(some)f(text,)f(the)
+h(full)i(list)f(of)f(p)q(ossible)i(completions)f(m)o(ust)f(b)q(e)h(a)o
+(v)m(ailable.)21 b(That)15 b(is,)0 2421 y(it)k(is)f(not)g(p)q(ossible)i
+(to)e(accurately)h(expand)g(a)f(partial)h(w)o(ord)e(without)i(kno)o
+(wing)f(all)h(of)f(the)h(p)q(ossible)h(w)o(ords)0 2483
+y(whic)o(h)c(mak)o(e)f(sense)h(in)g(that)e(con)o(text.)20
+b(The)15 b(Readline)j(library)e(pro)o(vides)f(the)h(user)f(in)o
+(terface)h(to)e(completion,)0 2545 y(and)h(t)o(w)o(o)f(of)h(the)h(most)
+e(common)h(completion)h(functions:)21 b(\014lename)c(and)e(username.)20
+b(F)l(or)15 b(completing)h(other)0 2608 y(t)o(yp)q(es)h(of)f(text,)g(y)
+o(ou)h(m)o(ust)f(write)h(y)o(our)f(o)o(wn)g(completion)i(function.)25
+b(This)18 b(section)f(describ)q(es)h(exactly)g(what)0
+2670 y(suc)o(h)e(functions)f(m)o(ust)g(do,)g(and)g(pro)o(vides)h(an)f
+(example.)p eop
+35 36 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(35)62 183 y(There)16 b(are)f(three)g(ma)s(jor)f
+(functions)i(used)f(to)g(p)q(erform)g(completion:)25
+320 y(1.)29 b(The)15 b(user-in)o(terface)g(function)g
+Fq(rl_complete)e(\(\))p Fr(.)20 b(This)15 b(function)g(is)g(called)h
+(with)e(the)h(same)f(argumen)o(ts)90 383 y(as)j(other)g(Readline)j
+(functions)f(in)o(tended)g(for)e(in)o(teractiv)o(e)h(use:)25
+b Fl(coun)o(t)18 b Fr(and)g Fl(in)o(v)o(oking)p 1633
+383 14 2 v 17 w(k)o(ey)p Fr(.)27 b(It)18 b(isolates)90
+445 y(the)j(w)o(ord)g(to)f(b)q(e)i(completed)h(and)e(calls)h
+Fq(completion_matches)13 b(\(\))21 b Fr(to)f(generate)h(a)g(list)h(of)f
+(p)q(ossible)90 507 y(completions.)h(It)16 b(then)g(either)h(lists)f
+(the)g(p)q(ossible)h(completions,)g(inserts)f(the)g(p)q(ossible)h
+(completions,)f(or)90 569 y(actually)g(p)q(erforms)f(the)g(completion,)
+h(dep)q(ending)i(on)d(whic)o(h)h(b)q(eha)o(vior)f(is)h(desired.)25
+644 y(2.)29 b(The)18 b(in)o(ternal)h(function)g Fq(completion_matches)
+13 b(\(\))18 b Fr(uses)g(y)o(our)f Fl(generator)k Fr(function)e(to)e
+(generate)h(the)90 706 y(list)h(of)e(p)q(ossible)j(matc)o(hes,)e(and)g
+(then)g(returns)g(the)g(arra)o(y)f(of)h(these)g(matc)o(hes.)28
+b(Y)l(ou)18 b(should)h(place)g(the)90 769 y(address)c(of)g(y)o(our)g
+(generator)f(function)i(in)g Fq(rl_completion_entry_functi)o(on)p
+Fr(.)25 843 y(3.)29 b(The)16 b(generator)g(function)h(is)f(called)i
+(rep)q(eatedly)g(from)d Fq(completion_matches)e(\(\))p
+Fr(,)i(returning)i(a)f(string)90 906 y(eac)o(h)j(time.)31
+b(The)19 b(argumen)o(ts)f(to)g(the)h(generator)e(function)j(are)e
+Fl(text)i Fr(and)f Fl(state)p Fr(.)29 b Fl(text)19 b
+Fr(is)h(the)f(partial)90 968 y(w)o(ord)13 b(to)g(b)q(e)h(completed.)21
+b Fl(state)15 b Fr(is)f(zero)g(the)g(\014rst)f(time)h(the)g(function)g
+(is)g(called,)i(allo)o(wing)e(the)g(generator)90 1030
+y(to)19 b(p)q(erform)f(an)o(y)h(necessary)h(initialization,)i(and)e(a)f
+(p)q(ositiv)o(e)h(non-zero)f(in)o(teger)h(for)e(eac)o(h)h(subsequen)o
+(t)90 1092 y(call.)35 b(When)21 b(the)f(generator)f(function)i(returns)
+f Fq(\(char)14 b(*\)NULL)19 b Fr(this)i(signals)f Fq
+(completion_matches)90 1155 y(\(\))c Fr(that)g(there)h(are)f(no)h(more)
+f(p)q(ossibilitie)q(s)j(left.)25 b(Usually)18 b(the)e(generator)g
+(function)i(computes)e(the)h(list)90 1217 y(of)j(p)q(ossible)i
+(completions)f(when)g Fl(state)h Fr(is)f(zero,)g(and)f(returns)g(them)h
+(one)f(at)g(a)g(time)g(on)g(subsequen)o(t)90 1279 y(calls.)g(Eac)o(h)14
+b(string)f(the)h(generator)e(function)j(returns)e(as)g(a)g(matc)o(h)g
+(m)o(ust)g(b)q(e)h(allo)q(cated)h(with)e Fq(malloc\(\))p
+Fr(;)90 1341 y(Readline)18 b(frees)d(the)g(strings)g(when)h(it)f(has)g
+(\014nished)i(with)f(them.)1725 1503 y(F)l(unction)-1899
+b Fi(int)20 b Fh(rl)p 140 1503 18 3 v 21 w(complete)j
+Fg(\()p Fq(int)14 b(ignore,)g(int)h(invoking_key)p Fg(\))120
+1566 y Fr(Complete)j(the)f(w)o(ord)f(at)h(or)g(b)q(efore)g(p)q(oin)o
+(t.)27 b(Y)l(ou)17 b(ha)o(v)o(e)g(supplied)i(the)f(function)g(that)e
+(do)q(es)i(the)120 1628 y(initial)d(simple)f(matc)o(hing)f(selection)h
+(algorithm)f(\(see)f Fq(completion_matches)h(\(\))p Fr(\).)18
+b(The)13 b(default)120 1690 y(is)j(to)e(do)h(\014lename)i(completion.)
+1736 1852 y(V)l(ariable)-1899 b Fi(Function)20 b(*)g
+Fh(rl)p 316 1852 V 21 w(completion)p 611 1852 V 21 w(en)n(try)p
+764 1852 V 21 w(function)120 1914 y Fr(This)e(is)g(a)f(p)q(oin)o(ter)h
+(to)f(the)g(generator)g(function)h(for)f Fq(completion_matches)12
+b(\(\))p Fr(.)27 b(If)17 b(the)h(v)m(alue)120 1977 y(of)j
+Fq(rl_completion_entry_funct)o(ion)d Fr(is)k Fq(\(Function)14
+b(*\)NULL)20 b Fr(then)i(the)f(default)h(\014lename)120
+2039 y(generator)14 b(function,)i Fq(filename_completion_functi)o(on)c
+(\(\))p Fr(,)j(is)g(used.)0 2247 y Fk(2.5.2)30 b(Completion)15
+b(F)-5 b(unctions)62 2384 y Fr(Here)16 b(is)f(the)h(complete)g(list)g
+(of)e(callable)k(completion)e(functions)g(presen)o(t)f(in)h(Readline.)
+1725 2545 y(F)l(unction)-1899 b Fi(int)20 b Fh(rl)p 140
+2545 V 21 w(complete)p 385 2545 V 21 w(in)n(ternal)k
+Fg(\()p Fq(int)15 b(what_to_do)p Fg(\))120 2608 y Fr(Complete)d(the)g
+(w)o(ord)f(at)g(or)g(b)q(efore)h(p)q(oin)o(t.)19 b Fl(what)p
+979 2608 14 2 v 16 w(to)p 1036 2608 V 16 w(do)14 b Fr(sa)o(ys)d(what)g
+(to)g(do)g(with)h(the)g(completion.)120 2670 y(A)g(v)m(alue)h(of)f(`)p
+Fq(?)p Fr(')f(means)h(list)h(the)f(p)q(ossible)i(completions.)20
+b(`)p Fq(TAB)p Fr(')11 b(means)h(do)g(standard)f(completion.)p
+eop
+36 37 bop 0 -58 a Fr(36)1449 b(GNU)15 b(Readline)i(Library)120
+183 y(`)p Fq(*)p Fr(')c(means)h(insert)h(all)g(of)f(the)g(p)q(ossible)i
+(completions.)21 b(`)p Fq(!)p Fr(')13 b(means)h(to)g(displa)o(y)h(all)g
+(of)f(the)g(p)q(ossible)120 246 y(completions,)i(if)g(there)f(is)h
+(more)e(than)h(one,)g(as)g(w)o(ell)h(as)f(p)q(erforming)h(partial)f
+(completion.)1725 441 y(F)l(unction)-1899 b Fi(int)20
+b Fh(rl)p 140 441 18 3 v 21 w(complete)j Fg(\()p Fq(int)14
+b(ignore,)g(int)h(invoking_key)p Fg(\))120 503 y Fr(Complete)23
+b(the)g(w)o(ord)e(at)h(or)g(b)q(efore)h(p)q(oin)o(t.)43
+b(Y)l(ou)23 b(ha)o(v)o(e)f(supplied)j(the)d(function)i(that)e(do)q(es)
+120 565 y(the)16 b(initial)j(simple)f(matc)o(hing)e(selection)i
+(algorithm)e(\(see)g Fq(completion_matches)d(\(\))j Fr(and)g
+Fq(rl_)120 627 y(completion_entry_function)p Fr(\))o(.)25
b(The)18 b(default)g(is)g(to)f(do)h(\014lename)h(completion.)29
-b(This)18 b(calls)120 1942 y Fn(rl_complete_internal)12 b(\(\))j
-Fo(with)h(an)f(argumen)o(t)f(dep)q(ending)k(on)d Fj(in)o(v)o(oking)p
-1496 1942 14 2 v 17 w(k)o(ey)p Fo(.)1725 2117 y(F)l(unction)-1899
-b Fh(int)20 b Fg(rl)p 140 2117 18 3 v 21 w(p)r(ossible)p 358
-2117 V 20 w(completions)j Ff(\()p Fn(int)15 b(count,)f(int)h(invoking_key)p
-Ff(\)\))120 2179 y Fo(List)23 b(the)f(p)q(ossible)j(completions.)42
-b(See)23 b(description)h(of)e Fn(rl_complete)14 b(\(\))p Fo(.)41
-b(This)23 b(calls)g Fn(rl_)120 2241 y(complete_internal)13
-b(\(\))i Fo(with)g(an)g(argumen)o(t)g(of)g(`)p Fn(?)p Fo('.)1725
-2416 y(F)l(unction)-1899 b Fh(int)20 b Fg(rl)p 140 2416 V 21
-w(insert)p 303 2416 V 21 w(completions)j Ff(\()p Fn(int)14
-b(count,)g(int)h(invoking_key)p Ff(\)\))120 2478 y Fo(Insert)20
-b(the)f(list)i(of)e(p)q(ossible)i(completions)f(in)o(to)g(the)f(line,)j
-(deleting)f(the)f(partially-completed)120 2540 y(w)o(ord.)h(See)c
-(description)g(of)e Fn(rl_complete)f(\(\))p Fo(.)21 b(This)c(calls)g
-Fn(rl_complete_internal)12 b(\(\))k Fo(with)120 2603 y(an)f(argumen)o(t)g(of)
-f(`)p Fn(*)p Fo('.)p eop
-%%Page: 30 32
-31 bop 0 -83 a Fo(30)1449 b(GNU)15 b(Readline)i(Library)1725
-158 y(F)l(unction)-1899 b Fh(char)20 b(**)f Fg(completion)p
-472 158 18 3 v 21 w(matc)n(hes)j Ff(\()p Fn(char)15 b(*text,)f(CPFunction)208
-221 y(*entry_func)p Ff(\))120 283 y Fo(Returns)22 b(an)g(arra)o(y)e(of)h
-Fn(\(char)15 b(*\))21 b Fo(whic)o(h)i(is)f(a)f(list)i(of)e(completions)i(for)
-e Fj(text)p Fo(.)39 b(If)22 b(there)f(are)120 345 y(no)d(completions,)i
-(returns)e Fn(\(char)c(**\)NULL)p Fo(.)28 b(The)19 b(\014rst)e(en)o(try)h(in)
-h(the)g(returned)f(arra)o(y)f(is)i(the)120 407 y(substitution)c(for)e
-Fj(text)p Fo(.)19 b(The)c(remaining)g(en)o(tries)f(are)g(the)g(p)q(ossible)i
-(completions.)k(The)15 b(arra)o(y)d(is)120 470 y(terminated)j(with)h(a)f
-Fn(NULL)f Fo(p)q(oin)o(ter.)120 613 y Fj(en)o(try)p 227 613
-14 2 v 16 w(func)h Fo(is)d(a)g(function)h(of)e(t)o(w)o(o)g(args,)g(and)h
-(returns)g(a)f Fn(\(char)k(*\))p Fo(.)j(The)12 b(\014rst)f(argumen)o(t)g(is)i
-Fj(text)p Fo(.)120 675 y(The)i(second)f(is)h(a)f(state)g(argumen)o(t;)f(it)i
-(is)g(zero)f(on)g(the)h(\014rst)f(call,)h(and)f(non-zero)h(on)f(subsequen)o
-(t)120 738 y(calls.)21 b Fj(en)o(try)p 346 738 V 16 w(func)c
-Fo(returns)e(a)f Fn(NULL)g Fo(p)q(oin)o(ter)h(to)f(the)g(caller)i(when)f
-(there)f(are)g(no)h(more)f(matc)o(hes.)1725 919 y(F)l(unction)-1899
-b Fh(char)20 b(*)f Fg(\014lename)p 380 919 18 3 v 20 w(completion)p
-674 919 V 21 w(function)k Ff(\()p Fn(char)15 b(*text,)f(int)h(state)p
-Ff(\))120 981 y Fo(A)e(generator)f(function)h(for)f(\014lename)i(completion)g
-(in)f(the)g(general)g(case.)19 b(Note)13 b(that)f(completion)120
-1043 y(in)18 b(Bash)f(is)h(a)f(little)h(di\013eren)o(t)f(b)q(ecause)h(of)f
-(all)h(the)f(pathnames)g(that)g(m)o(ust)f(b)q(e)i(follo)o(w)o(ed)f(when)120
-1105 y(lo)q(oking)23 b(up)f(completions)h(for)e(a)g(command.)39
+b(This)18 b(calls)120 690 y Fq(rl_complete_internal)12
+b(\(\))j Fr(with)h(an)f(argumen)o(t)f(dep)q(ending)k(on)d
+Fl(in)o(v)o(oking)p 1496 690 14 2 v 17 w(k)o(ey)p Fr(.)1725
+885 y(F)l(unction)-1899 b Fi(int)20 b Fh(rl)p 140 885
+18 3 v 21 w(p)r(ossible)p 358 885 V 20 w(completions)j
+Fg(\()p Fq(int)15 b(count,)f(int)h(invoking_key)p Fg(\)\))120
+947 y Fr(List)23 b(the)f(p)q(ossible)j(completions.)42
+b(See)23 b(description)h(of)e Fq(rl_complete)14 b(\(\))p
+Fr(.)41 b(This)23 b(calls)g Fq(rl_)120 1009 y(complete_internal)13
+b(\(\))i Fr(with)g(an)g(argumen)o(t)g(of)g(`)p Fq(?)p
+Fr('.)1725 1204 y(F)l(unction)-1899 b Fi(int)20 b Fh(rl)p
+140 1204 V 21 w(insert)p 303 1204 V 21 w(completions)j
+Fg(\()p Fq(int)14 b(count,)g(int)h(invoking_key)p Fg(\)\))120
+1267 y Fr(Insert)20 b(the)f(list)i(of)e(p)q(ossible)i(completions)f(in)
+o(to)g(the)f(line,)j(deleting)f(the)f(partially-completed)120
+1329 y(w)o(ord.)h(See)c(description)g(of)e Fq(rl_complete)f(\(\))p
+Fr(.)21 b(This)c(calls)g Fq(rl_complete_internal)12 b(\(\))k
+Fr(with)120 1391 y(an)f(argumen)o(t)g(of)f(`)p Fq(*)p
+Fr('.)1725 1586 y(F)l(unction)-1899 b Fi(char)20 b(**)f
+Fh(completion)p 472 1586 V 21 w(matc)n(hes)j Fg(\()p
+Fq(char)15 b(*text,)f(CPFunction)208 1648 y(*entry_func)p
+Fg(\))120 1711 y Fr(Returns)22 b(an)g(arra)o(y)e(of)h
+Fq(\(char)15 b(*\))21 b Fr(whic)o(h)i(is)f(a)f(list)i(of)e(completions)
+i(for)e Fl(text)p Fr(.)39 b(If)22 b(there)f(are)120 1773
+y(no)d(completions,)i(returns)e Fq(\(char)c(**\)NULL)p
+Fr(.)28 b(The)19 b(\014rst)e(en)o(try)h(in)h(the)g(returned)f(arra)o(y)
+f(is)i(the)120 1835 y(substitution)c(for)e Fl(text)p
+Fr(.)19 b(The)c(remaining)g(en)o(tries)f(are)g(the)g(p)q(ossible)i
+(completions.)k(The)15 b(arra)o(y)d(is)120 1897 y(terminated)j(with)h
+(a)f Fq(NULL)f Fr(p)q(oin)o(ter.)120 2045 y Fl(en)o(try)p
+227 2045 14 2 v 16 w(func)h Fr(is)d(a)g(function)h(of)e(t)o(w)o(o)g
+(args,)g(and)h(returns)g(a)f Fq(\(char)k(*\))p Fr(.)j(The)12
+b(\014rst)f(argumen)o(t)g(is)i Fl(text)p Fr(.)120 2108
+y(The)i(second)f(is)h(a)f(state)g(argumen)o(t;)f(it)i(is)g(zero)f(on)g
+(the)h(\014rst)f(call,)h(and)f(non-zero)h(on)f(subsequen)o(t)120
+2170 y(calls.)21 b Fl(en)o(try)p 346 2170 V 16 w(func)c
+Fr(returns)e(a)f Fq(NULL)g Fr(p)q(oin)o(ter)h(to)f(the)g(caller)i(when)
+f(there)f(are)g(no)h(more)f(matc)o(hes.)1725 2365 y(F)l(unction)-1899
+b Fi(char)20 b(*)f Fh(\014lename)p 380 2365 18 3 v 20
+w(completion)p 674 2365 V 21 w(function)k Fg(\()p Fq(char)15
+b(*text,)f(int)h(state)p Fg(\))120 2427 y Fr(A)e(generator)f(function)h
+(for)f(\014lename)i(completion)g(in)f(the)g(general)g(case.)19
+b(Note)13 b(that)f(completion)120 2490 y(in)18 b(Bash)f(is)h(a)f
+(little)h(di\013eren)o(t)f(b)q(ecause)h(of)f(all)h(the)f(pathnames)g
+(that)g(m)o(ust)f(b)q(e)i(follo)o(w)o(ed)f(when)120 2552
+y(lo)q(oking)23 b(up)f(completions)h(for)e(a)g(command.)39
b(The)22 b(Bash)g(source)g(is)g(a)f(useful)i(reference)g(for)120
-1168 y(writing)16 b(custom)f(completion)h(functions.)1725 1349
-y(F)l(unction)-1899 b Fh(char)20 b(*)f Fg(username)p 412 1349
-V 19 w(completion)p 705 1349 V 21 w(function)k Ff(\()p Fn(char)14
-b(*text,)g(int)h(state)p Ff(\))120 1411 y Fo(A)i(completion)h(generator)e
-(for)g(usernames.)24 b Fj(text)18 b Fo(con)o(tains)e(a)h(partial)g(username)g
-(preceded)h(b)o(y)120 1473 y(a)f(random)g(c)o(haracter)f(\(usually)j(`)p
-Fn(~)p Fo('\).)24 b(As)18 b(with)f(all)h(completion)h(generators,)d
-Fj(state)j Fo(is)f(zero)f(on)120 1536 y(the)e(\014rst)g(call)h(and)g
-(non-zero)f(for)g(subsequen)o(t)h(calls.)0 1801 y Fi(2.4.3)30
-b(Completion)15 b(V)-5 b(ariables)1736 1982 y Fo(V)l(ariable)-1899
-b Fh(Function)20 b(*)g Fg(rl)p 316 1982 V 21 w(completion)p
-611 1982 V 21 w(en)n(try)p 764 1982 V 21 w(function)120 2044
-y Fo(A)d(p)q(oin)o(ter)h(to)f(the)g(generator)f(function)i(for)f
-Fn(completion_matches)c(\(\))p Fo(.)25 b Fn(NULL)17 b Fo(means)g(to)g(use)120
-2106 y Fn(filename_entry_function)12 b(\(\))p Fo(,)j(the)g(default)h
-(\014lename)g(completer.)1736 2287 y(V)l(ariable)-1899 b Fh(CPPFunction)21
-b(*)e Fg(rl)p 394 2287 V 21 w(attempted)p 674 2287 V 20 w(completion)p
-968 2287 V 21 w(function)120 2350 y Fo(A)g(p)q(oin)o(ter)h(to)f(an)g
-(alternativ)o(e)h(function)g(to)f(create)g(matc)o(hes.)32 b(The)20
-b(function)g(is)g(called)h(with)120 2412 y Fj(text)p Fo(,)e
-Fj(start)p Fo(,)g(and)g Fj(end)p Fo(.)32 b Fj(start)19 b Fo(and)g
-Fj(end)j Fo(are)c(indices)j(in)f Fn(rl_line_buffer)d Fo(sa)o(ying)i(what)g
-(the)120 2474 y(b)q(oundaries)c(of)e Fj(text)h Fo(are.)19 b(If)13
-b(this)h(function)g(exists)g(and)g(returns)f Fn(NULL)p Fo(,)g(or)g(if)h(this)
-f(v)m(ariable)i(is)f(set)120 2536 y(to)h Fn(NULL)p Fo(,)f(then)i
-Fn(rl_complete)e(\(\))h Fo(will)i(call)g(the)e(v)m(alue)i(of)e
-Fn(rl_completion_entry_funct)o(ion)120 2599 y Fo(to)g(generate)f(matc)o(hes,)
-h(otherwise)g(the)h(arra)o(y)e(of)g(strings)h(returned)h(will)h(b)q(e)f
-(used.)p eop
-%%Page: 31 33
-32 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(31)1736 158 y(V)l(ariable)-1899 b Fh(int)20 b Fg(rl)p 140
-158 18 3 v 21 w(completion)p 435 158 V 21 w(query)p 598 158
-V 21 w(items)120 221 y Fo(Up)h(to)e(this)i(man)o(y)f(items)h(will)h(b)q(e)f
-(displa)o(y)o(ed)h(in)f(resp)q(onse)g(to)f(a)g(p)q(ossible-completions)j
-(call.)120 283 y(After)16 b(that,)f(w)o(e)g(ask)h(the)g(user)g(if)g(she)g(is)
-h(sure)f(she)g(w)o(an)o(ts)f(to)g(see)h(them)g(all.)23 b(The)16
-b(default)h(v)m(alue)120 345 y(is)f(100.)1736 524 y(V)l(ariable)-1899
-b Fh(char)20 b(*)f Fg(rl)p 211 524 V 21 w(basic)p 355 524 V
-21 w(w)n(ord)p 500 524 V 21 w(break)p 661 524 V 20 w(c)n(haracters)120
-586 y Fo(The)12 b(basic)g(list)h(of)e(c)o(haracters)g(that)g(signal)h(a)g
-(break)f(b)q(et)o(w)o(een)h(w)o(ords)f(for)g(the)h(completer)g(routine.)120
-648 y(The)17 b(default)h(v)m(alue)g(of)e(this)i(v)m(ariable)g(is)g(the)f(c)o
-(haracters)f(whic)o(h)h(break)g(w)o(ords)g(for)f(completion)120
-711 y(in)g(Bash,)f(i.e.,)g Fn(")g(\\t\\n\\"\\\\'`@$><=;|&{\(")p
-Fo(.)1736 889 y(V)l(ariable)-1899 b Fh(char)20 b(*)f Fg(rl)p
-211 889 V 21 w(completer)p 480 889 V 21 w(w)n(ord)p 625 889
-V 20 w(break)p 785 889 V 20 w(c)n(haracters)120 952 y Fo(The)f(list)h(of)e(c)
-o(haracters)g(that)g(signal)i(a)f(break)f(b)q(et)o(w)o(een)h(w)o(ords)g(for)f
-Fn(rl_complete_internal)120 1014 y(\(\))p Fo(.)j(The)15 b(default)h(list)g
-(is)f(the)h(v)m(alue)g(of)f Fn(rl_basic_word_break_charac)o(ters)p
-Fo(.)1736 1192 y(V)l(ariable)-1899 b Fh(char)20 b(*)f Fg(rl)p
-211 1192 V 21 w(sp)r(ecial)p 398 1192 V 22 w(pre\014xes)120
-1255 y Fo(The)d(list)h(of)e(c)o(haracters)g(that)g(are)h(w)o(ord)f(break)h(c)
-o(haracters,)f(but)h(should)h(b)q(e)f(left)g(in)h Fj(text)f
-Fo(when)120 1317 y(it)f(is)g(passed)g(to)f(the)g(completion)i(function.)k
-(Programs)14 b(can)g(use)h(this)g(to)f(help)i(determine)g(what)120
-1379 y(kind)h(of)f(completing)i(to)e(do.)23 b(F)l(or)16 b(instance,)h(Bash)f
-(sets)g(this)h(v)m(ariable)h(to)e Fn(")p Fo($)p Fn(@")f Fo(so)h(that)g(it)h
-(can)120 1442 y(complete)f(shell)h(v)m(ariables)f(and)g(hostnames.)1736
-1620 y(V)l(ariable)-1899 b Fh(int)20 b Fg(rl)p 140 1620 V 21
-w(ignore)p 316 1620 V 20 w(completion)p 610 1620 V 21 w(duplicates)120
-1682 y Fo(If)15 b(non-zero,)h(then)f(disallo)o(w)h(duplicates)h(in)f(the)g
-(matc)o(hes.)j(Default)c(is)h(1.)1736 1861 y(V)l(ariable)-1899
-b Fh(int)20 b Fg(rl)p 140 1861 V 21 w(\014lename)p 369 1861
-V 20 w(completion)p 663 1861 V 21 w(desired)120 1923 y Fo(Non-zero)e(means)g
-(that)f(the)g(results)i(of)e(the)h(matc)o(hes)f(are)h(to)f(b)q(e)h(treated)f
-(as)h(\014lenames.)28 b(This)120 1986 y(is)16 b Fj(alw)o(a)o(ys)h
-Fo(zero)e(on)g(en)o(try)l(,)g(and)h(can)g(only)g(b)q(e)g(c)o(hanged)f(within)
-i(a)e(completion)i(en)o(try)e(generator)120 2048 y(function.)26
-b(If)18 b(it)f(is)h(set)f(to)f(a)h(non-zero)g(v)m(alue,)i(directory)e(names)g
-(ha)o(v)o(e)g(a)g(slash)g(app)q(ended)i(and)120 2110 y(Readline)i(attempts)c
-(to)g(quote)h(completed)i(\014lenames)f(if)f(they)h(con)o(tain)f(an)o(y)g(em)
-o(b)q(edded)i(w)o(ord)120 2172 y(break)15 b(c)o(haracters.)1736
-2351 y(V)l(ariable)-1899 b Fh(int)20 b Fg(rl)p 140 2351 V 21
-w(\014lename)p 369 2351 V 20 w(quoting)p 578 2351 V 21 w(desired)120
-2413 y Fo(Non-zero)c(means)g(that)g(the)g(results)h(of)e(the)i(matc)o(hes)e
-(are)h(to)g(b)q(e)h(quoted)f(using)h(double)g(quotes)120 2476
-y(\(or)d(an)h(application-sp)q(eci\014)q(c)j(quoting)d(mec)o(hanism\))g(if)h
-(the)f(completed)h(\014lename)g(con)o(tains)f(an)o(y)120 2538
-y(c)o(haracters)c(in)h Fn(rl_completer_word_break_cha)o(rs)p
-Fo(.)k(This)c(is)g Fj(alw)o(a)o(ys)h Fo(non-zero)f(on)f(en)o(try)l(,)h(and)
-120 2600 y(can)j(only)h(b)q(e)g(c)o(hanged)f(within)i(a)e(completion)h(en)o
-(try)f(generator)f(function.)p eop
-%%Page: 32 34
-33 bop 0 -83 a Fo(32)1449 b(GNU)15 b(Readline)i(Library)1736
-158 y(V)l(ariable)-1899 b Fh(Function)20 b(*)g Fg(rl)p 316
-158 18 3 v 21 w(ignore)p 492 158 V 20 w(some)p 639 158 V 19
-w(completions)p 955 158 V 21 w(function)120 221 y Fo(This)e(function,)g(if)g
+2614 y(writing)16 b(custom)f(completion)h(functions.)p
+eop
+37 38 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(37)1725 183 y(F)l(unction)-1899 b Fi(char)20
+b(*)f Fh(username)p 412 183 18 3 v 19 w(completion)p
+705 183 V 21 w(function)k Fg(\()p Fq(char)14 b(*text,)g(int)h(state)p
+Fg(\))120 246 y Fr(A)i(completion)h(generator)e(for)g(usernames.)24
+b Fl(text)18 b Fr(con)o(tains)e(a)h(partial)g(username)g(preceded)h(b)o
+(y)120 308 y(a)f(random)g(c)o(haracter)f(\(usually)j(`)p
+Fq(~)p Fr('\).)24 b(As)18 b(with)f(all)h(completion)h(generators,)d
+Fl(state)j Fr(is)f(zero)f(on)120 370 y(the)e(\014rst)g(call)h(and)g
+(non-zero)f(for)g(subsequen)o(t)h(calls.)0 618 y Fk(2.5.3)30
+b(Completion)15 b(V)-5 b(ariables)1736 793 y Fr(V)l(ariable)-1899
+b Fi(Function)20 b(*)g Fh(rl)p 316 793 V 21 w(completion)p
+611 793 V 21 w(en)n(try)p 764 793 V 21 w(function)120
+856 y Fr(A)d(p)q(oin)o(ter)h(to)f(the)g(generator)f(function)i(for)f
+Fq(completion_matches)c(\(\))p Fr(.)25 b Fq(NULL)17 b
+Fr(means)g(to)g(use)120 918 y Fq(filename_entry_function)12
+b(\(\))p Fr(,)j(the)g(default)h(\014lename)g(completer.)1736
+1093 y(V)l(ariable)-1899 b Fi(CPPFunction)21 b(*)e Fh(rl)p
+394 1093 V 21 w(attempted)p 674 1093 V 20 w(completion)p
+968 1093 V 21 w(function)120 1156 y Fr(A)g(p)q(oin)o(ter)h(to)f(an)g
+(alternativ)o(e)h(function)g(to)f(create)g(matc)o(hes.)32
+b(The)20 b(function)g(is)g(called)h(with)120 1218 y Fl(text)p
+Fr(,)e Fl(start)p Fr(,)g(and)g Fl(end)p Fr(.)32 b Fl(start)19
+b Fr(and)g Fl(end)j Fr(are)c(indices)j(in)f Fq(rl_line_buffer)d
+Fr(sa)o(ying)i(what)g(the)120 1280 y(b)q(oundaries)c(of)e
+Fl(text)h Fr(are.)19 b(If)13 b(this)h(function)g(exists)g(and)g
+(returns)f Fq(NULL)p Fr(,)g(or)g(if)h(this)f(v)m(ariable)i(is)f(set)120
+1342 y(to)h Fq(NULL)p Fr(,)f(then)i Fq(rl_complete)e(\(\))h
+Fr(will)i(call)g(the)e(v)m(alue)i(of)e Fq(rl_completion_entry_funct)o
+(ion)120 1405 y Fr(to)g(generate)f(matc)o(hes,)h(otherwise)g(the)h
+(arra)o(y)e(of)g(strings)h(returned)h(will)h(b)q(e)f(used.)1736
+1580 y(V)l(ariable)-1899 b Fi(CPFunction)21 b(*)e Fh(rl)p
+368 1580 V 21 w(\014lename)p 597 1580 V 20 w(quoting)p
+806 1580 V 21 w(function)120 1642 y Fr(A)e(p)q(oin)o(ter)h(to)f(a)g
+(function)h(that)e(will)j(quote)e(a)g(\014lename)h(in)h(an)e
+(application-)i(sp)q(eci\014c)g(fashion.)120 1705 y(This)f(is)g(called)
+i(if)e(\014lename)h(completion)f(is)h(b)q(eing)f(attempted)g(and)f(one)
+h(of)f(the)h(c)o(haracters)f(in)120 1767 y Fq
+(rl_filename_quote_characte)o(rs)g Fr(app)q(ears)k(in)g(a)f(completed)h
+(\014lename.)37 b(The)20 b(function)h(is)120 1829 y(called)14
+b(with)f Fl(text)p Fr(,)g Fl(matc)o(h)p 579 1829 14 2
+v 15 w(t)o(yp)q(e)p Fr(,)g(and)g Fl(quote)p 903 1829
+V 16 w(p)q(oin)o(ter)p Fr(.)20 b(The)13 b Fl(text)g Fr(is)g(the)g
+(\014lename)h(to)e(b)q(e)h(quoted.)120 1891 y(The)21
+b Fl(matc)o(h)p 345 1891 V 16 w(t)o(yp)q(e)j Fr(is)e(either)f
+Fq(SINGLE_MATCH)p Fr(,)g(if)h(there)f(is)h(only)f(one)h(completion)g
+(matc)o(h,)f(or)120 1954 y Fq(MULT_MATCH)p Fr(.)d(Some)13
+b(functions)g(use)h(this)f(to)f(decide)j(whether)e(or)f(not)h(to)f
+(insert)i(a)e(closing)i(quote)120 2016 y(c)o(haracter.)36
+b(The)21 b Fl(quote)p 565 2016 V 16 w(p)q(oin)o(ter)k
+Fr(is)c(a)g(p)q(oin)o(ter)g(to)f(an)o(y)h(op)q(ening)h(quote)f(c)o
+(haracter)f(the)h(user)120 2078 y(t)o(yp)q(ed.)f(Some)15
+b(functions)h(c)o(ho)q(ose)g(to)e(reset)h(this)h(c)o(haracter.)1736
+2254 y(V)l(ariable)-1899 b Fi(CPFunction)21 b(*)e Fh(rl)p
+368 2254 18 3 v 21 w(\014lename)p 597 2254 V 20 w(dequoting)p
+864 2254 V 21 w(function)120 2316 y Fr(A)f(p)q(oin)o(ter)g(to)f(a)g
+(function)h(that)f(will)i(remo)o(v)o(e)e(application-sp)q(eci\014c)k
+(quoting)d(c)o(haracters)f(from)120 2378 y(a)h(\014lename)i(b)q(efore)f
+(completion)h(is)f(attempted,)g(so)f(those)h(c)o(haracters)f(do)g(not)h
+(in)o(terfere)g(with)120 2440 y(matc)o(hing)13 b(the)g(text)f(against)g
+(names)h(in)g(the)g(\014lesystem.)20 b(It)13 b(is)g(called)h(with)f
+Fl(text)p Fr(,)g(the)f(text)h(of)f(the)120 2503 y(w)o(ord)i(to)g(b)q(e)
+h(dequoted,)g(and)g Fl(quote)p 757 2503 14 2 v 16 w(c)o(har)p
+Fr(,)f(whic)o(h)i(is)f(the)g(quoting)g(c)o(haracter)f(that)f(delimits)k
+(the)120 2565 y(\014lename)d(\(usually)g(`)p Fq(')p Fr(')e(or)g(`)p
+Fq(")p Fr('\).)18 b(If)13 b Fl(quote)p 838 2565 V 16
+w(c)o(har)j Fr(is)e(zero,)e(the)h(\014lename)h(w)o(as)e(not)h(in)h(an)f
+(em)o(b)q(edded)120 2627 y(string.)p eop
+38 39 bop 0 -58 a Fr(38)1449 b(GNU)15 b(Readline)i(Library)1736
+183 y(V)l(ariable)-1899 b Fi(Function)20 b(*)g Fh(rl)p
+316 183 18 3 v 21 w(c)n(har)p 444 183 V 20 w(is)p 502
+183 V 22 w(quoted)p 695 183 V 20 w(p)120 246 y Fr(A)d(p)q(oin)o(ter)g
+(to)f(a)g(function)i(to)e(call)h(that)f(determines)i(whether)f(or)f
+(not)g(a)h(sp)q(eci\014c)h(c)o(haracter)e(in)120 308
+y(the)c(line)i(bu\013er)e(is)h(quoted,)f(according)h(to)e(whatev)o(er)h
+(quoting)g(mec)o(hanism)h(the)f(program)f(calling)120
+370 y(readline)j(uses.)20 b(The)13 b(function)g(is)h(called)g(with)f(t)
+o(w)o(o)f(argumen)o(ts:)17 b Fl(text)p Fr(,)c(the)g(text)f(of)g(the)h
+(line,)i(and)120 432 y Fl(index)p Fr(,)j(the)e(index)i(of)e(the)g(c)o
+(haracter)g(in)h(the)g(line.)25 b(It)16 b(is)h(used)g(to)f(decide)i
+(whether)f(a)f(c)o(haracter)120 495 y(found)j(in)g Fq
+(rl_completer_word_break_)o(charact)o(ers)c Fr(should)20
+b(b)q(e)e(used)h(to)f(break)g(w)o(ords)g(for)120 557
+y(the)d(completer.)1736 745 y(V)l(ariable)-1899 b Fi(int)20
+b Fh(rl)p 140 745 V 21 w(completion)p 435 745 V 21 w(query)p
+598 745 V 21 w(items)120 807 y Fr(Up)h(to)e(this)i(man)o(y)f(items)h
+(will)h(b)q(e)f(displa)o(y)o(ed)h(in)f(resp)q(onse)g(to)f(a)g(p)q
+(ossible-completions)j(call.)120 869 y(After)16 b(that,)f(w)o(e)g(ask)h
+(the)g(user)g(if)g(she)g(is)h(sure)f(she)g(w)o(an)o(ts)f(to)g(see)h
+(them)g(all.)23 b(The)16 b(default)h(v)m(alue)120 932
+y(is)f(100.)1736 1120 y(V)l(ariable)-1899 b Fi(char)20
+b(*)f Fh(rl)p 211 1120 V 21 w(basic)p 355 1120 V 21 w(w)n(ord)p
+500 1120 V 21 w(break)p 661 1120 V 20 w(c)n(haracters)120
+1182 y Fr(The)12 b(basic)g(list)h(of)e(c)o(haracters)g(that)g(signal)h
+(a)g(break)f(b)q(et)o(w)o(een)h(w)o(ords)f(for)g(the)h(completer)g
+(routine.)120 1244 y(The)17 b(default)h(v)m(alue)g(of)e(this)i(v)m
+(ariable)g(is)g(the)f(c)o(haracters)f(whic)o(h)h(break)g(w)o(ords)g
+(for)f(completion)120 1306 y(in)g(Bash,)f(i.e.,)g Fq(")g
+(\\t\\n\\"\\\\'`@$><=;|&{\(")p Fr(.)1736 1494 y(V)l(ariable)-1899
+b Fi(char)20 b(*)f Fh(rl)p 211 1494 V 21 w(basic)p 355
+1494 V 21 w(quote)p 515 1494 V 21 w(c)n(haracters)120
+1557 y Fr(List)d(of)f(quote)g(c)o(haracters)f(whic)o(h)i(can)f(cause)h
+(a)f(w)o(ord)f(break.)1736 1745 y(V)l(ariable)-1899 b
+Fi(char)20 b(*)f Fh(rl)p 211 1745 V 21 w(completer)p
+480 1745 V 21 w(w)n(ord)p 625 1745 V 20 w(break)p 785
+1745 V 20 w(c)n(haracters)120 1807 y Fr(The)f(list)h(of)e(c)o
+(haracters)g(that)g(signal)i(a)f(break)f(b)q(et)o(w)o(een)h(w)o(ords)g
+(for)f Fq(rl_complete_internal)120 1869 y(\(\))p Fr(.)j(The)15
+b(default)h(list)g(is)f(the)h(v)m(alue)g(of)f Fq
+(rl_basic_word_break_charac)o(ters)p Fr(.)1736 2057 y(V)l(ariable)-1899
+b Fi(char)20 b(*)f Fh(rl)p 211 2057 V 21 w(completer)p
+480 2057 V 21 w(quote)p 640 2057 V 21 w(c)n(haracters)120
+2120 y Fr(List)j(of)e(c)o(haracters)g(whic)o(h)i(can)f(b)q(e)h(used)f
+(to)f(quote)h(a)g(substring)g(of)f(the)h(line.)39 b(Completion)120
+2182 y(o)q(ccurs)17 b(on)f(the)h(en)o(tire)g(substring,)g(and)f(within)
+i(the)e(substring)h Fq(rl_completer_word_break_)120 2244
+y(characters)i Fr(are)g(treated)h(as)f(an)o(y)h(other)g(c)o(haracter,)g
+(unless)h(they)f(also)g(app)q(ear)g(within)i(this)120
+2306 y(list.)1736 2494 y(V)l(ariable)-1899 b Fi(char)20
+b(*)f Fh(rl)p 211 2494 V 21 w(\014lename)p 440 2494 V
+20 w(quote)p 599 2494 V 21 w(c)n(haracters)120 2557 y
+Fr(A)g(list)h(of)e(c)o(haracters)g(that)g(cause)h(a)g(\014lename)h(to)e
+(b)q(e)i(quoted)e(b)o(y)h(the)g(completer)h(when)f(they)120
+2619 y(app)q(ear)c(in)h(a)f(completed)h(\014lename.)21
+b(The)16 b(default)g(is)f(empt)o(y)l(.)p eop
+39 40 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(39)1736 183 y(V)l(ariable)-1899 b Fi(char)20
+b(*)f Fh(rl)p 211 183 18 3 v 21 w(sp)r(ecial)p 398 183
+V 22 w(pre\014xes)120 246 y Fr(The)d(list)h(of)e(c)o(haracters)g(that)g
+(are)h(w)o(ord)f(break)h(c)o(haracters,)f(but)h(should)h(b)q(e)f(left)g
+(in)h Fl(text)f Fr(when)120 308 y(it)f(is)g(passed)g(to)f(the)g
+(completion)i(function.)k(Programs)14 b(can)g(use)h(this)g(to)f(help)i
+(determine)g(what)120 370 y(kind)h(of)f(completing)i(to)e(do.)23
+b(F)l(or)16 b(instance,)h(Bash)f(sets)g(this)h(v)m(ariable)h(to)e
+Fq(")p Fr($)p Fq(@")f Fr(so)h(that)g(it)h(can)120 432
+y(complete)f(shell)h(v)m(ariables)f(and)g(hostnames.)1736
+587 y(V)l(ariable)-1899 b Fi(int)20 b Fh(rl)p 140 587
+V 21 w(completion)p 435 587 V 21 w(app)r(end)p 640 587
+V 19 w(c)n(haracter)120 650 y Fr(When)f(a)g(single)h(completion)g
+(alternativ)o(e)f(matc)o(hes)g(at)f(the)h(end)g(of)g(the)g(command)f
+(line,)k(this)120 712 y(c)o(haracter)12 b(is)i(app)q(ended)h(to)d(the)i
+(inserted)g(completion)g(text.)19 b(The)13 b(default)h(is)f(a)g(space)h
+(c)o(haracter)120 774 y(\(`)g('\).)21 b(Setting)c(this)f(to)f(the)h(n)o
+(ull)h(c)o(haracter)e(\(`)p Fq(\\0)p Fr('\))f(prev)o(en)o(ts)i(an)o
+(ything)g(b)q(eing)h(app)q(ended)g(auto-)120 836 y(matically)l(.)26
+b(This)17 b(can)g(b)q(e)g(c)o(hanged)g(in)g(custom)g(completion)h
+(functions)f(to)f(pro)o(vide)h(the)g(\\most)120 899 y(sensible)i(w)o
+(ord)d(separator)g(c)o(haracter")g(according)h(to)f(an)h
+(application-sp)q(eci\014)q(c)j(command)c(line)120 961
+y(syn)o(tax)e(sp)q(eci\014cation.)1736 1116 y(V)l(ariable)-1899
+b Fi(int)20 b Fh(rl)p 140 1116 V 21 w(ignore)p 316 1116
+V 20 w(completion)p 610 1116 V 21 w(duplicates)120 1178
+y Fr(If)15 b(non-zero,)h(then)f(disallo)o(w)h(duplicates)h(in)f(the)g
+(matc)o(hes.)j(Default)c(is)h(1.)1736 1333 y(V)l(ariable)-1899
+b Fi(int)20 b Fh(rl)p 140 1333 V 21 w(\014lename)p 369
+1333 V 20 w(completion)p 663 1333 V 21 w(desired)120
+1395 y Fr(Non-zero)e(means)g(that)f(the)g(results)i(of)e(the)h(matc)o
+(hes)f(are)h(to)f(b)q(e)h(treated)f(as)h(\014lenames.)28
+b(This)120 1458 y(is)16 b Fl(alw)o(a)o(ys)h Fr(zero)e(on)g(en)o(try)l
+(,)g(and)h(can)g(only)g(b)q(e)g(c)o(hanged)f(within)i(a)e(completion)i
+(en)o(try)e(generator)120 1520 y(function.)26 b(If)18
+b(it)f(is)h(set)f(to)f(a)h(non-zero)g(v)m(alue,)i(directory)e(names)g
+(ha)o(v)o(e)g(a)g(slash)g(app)q(ended)i(and)120 1582
+y(Readline)i(attempts)c(to)g(quote)h(completed)i(\014lenames)f(if)f
+(they)h(con)o(tain)f(an)o(y)g(em)o(b)q(edded)i(w)o(ord)120
+1645 y(break)15 b(c)o(haracters.)1736 1800 y(V)l(ariable)-1899
+b Fi(int)20 b Fh(rl)p 140 1800 V 21 w(\014lename)p 369
+1800 V 20 w(quoting)p 578 1800 V 21 w(desired)120 1862
+y Fr(Non-zero)c(means)g(that)g(the)g(results)h(of)e(the)i(matc)o(hes)e
+(are)h(to)g(b)q(e)h(quoted)f(using)h(double)g(quotes)120
+1924 y(\(or)d(an)h(application-sp)q(eci\014)q(c)j(quoting)d(mec)o
+(hanism\))g(if)h(the)f(completed)h(\014lename)g(con)o(tains)f(an)o(y)
+120 1986 y(c)o(haracters)i(in)h Fq(rl_filename_quote_chars)p
+Fr(.)24 b(This)19 b(is)f Fl(alw)o(a)o(ys)h Fr(non-zero)f(on)f(en)o(try)
+l(,)h(and)g(can)120 2049 y(only)d(b)q(e)g(c)o(hanged)f(within)i(a)e
+(completion)h(en)o(try)f(generator)g(function.)20 b(The)14
+b(quoting)h(is)g(e\013ected)120 2111 y(via)g(a)g(call)i(to)d(the)i
+(function)g(p)q(oin)o(ted)g(to)e(b)o(y)h Fq
+(rl_filename_quoting_function)p Fr(.)1736 2266 y(V)l(ariable)-1899
+b Fi(int)20 b Fh(rl)p 140 2266 V 21 w(inhibit)p 324 2266
+V 23 w(completion)120 2328 y Fr(If)15 b(this)g(v)m(ariable)h(is)f
+(non-zero,)g(completion)h(is)f(inhibit)p Fq(<)p Fr(ed.)22
+b(The)15 b(completion)h(c)o(haracter)e(will)i(b)q(e)120
+2390 y(inserted)g(as)f(an)o(y)g(other)g(b)q(ound)h(to)e
+Fq(self-insert)p Fr(.)1736 2545 y(V)l(ariable)-1899 b
+Fi(Function)20 b(*)g Fh(rl)p 316 2545 V 21 w(ignore)p
+492 2545 V 20 w(some)p 639 2545 V 19 w(completions)p
+955 2545 V 21 w(function)120 2608 y Fr(This)e(function,)g(if)g
(de\014ned,)h(is)f(called)h(b)o(y)e(the)h(completer)g(when)g(real)f
-(\014lename)i(completion)f(is)120 283 y(done,)13 b(after)e(all)i(the)g(matc)o
-(hing)f(names)g(ha)o(v)o(e)g(b)q(een)h(generated.)19 b(It)12
-b(is)h(passed)f(a)g Fn(NULL)g Fo(terminated)120 345 y(arra)o(y)k(of)h(matc)o
-(hes.)26 b(The)17 b(\014rst)g(elemen)o(t)h(\()p Fn(matches[0])p
-Fo(\))e(is)h(the)h(maximal)g(substring)f(common)120 407 y(to)f(all)h(matc)o
-(hes.)22 b(This)17 b(function)g(can)f(re-arrange)g(the)g(list)h(of)f(matc)o
-(hes)g(as)f(required,)j(but)e(eac)o(h)120 470 y(elemen)o(t)g(deleted)g(from)f
-(the)g(arra)o(y)f(m)o(ust)h(b)q(e)h(freed.)1736 632 y(V)l(ariable)-1899
-b Fh(char)20 b(*)f Fg(rl)p 211 632 V 21 w(completer)p 480 632
-V 21 w(quote)p 640 632 V 21 w(c)n(haracters)120 694 y Fo(List)j(of)e(c)o
-(haracters)g(whic)o(h)i(can)f(b)q(e)h(used)f(to)f(quote)h(a)g(substring)g(of)
-f(the)h(line.)39 b(Completion)120 756 y(o)q(ccurs)17 b(on)f(the)h(en)o(tire)g
-(substring,)g(and)f(within)i(the)e(substring)h Fn(rl_completer_word_break_)
-120 818 y(characters)i Fo(are)g(treated)h(as)f(an)o(y)h(other)g(c)o
-(haracter,)g(unless)h(they)f(also)g(app)q(ear)g(within)i(this)120
-881 y(list.)0 1088 y Fi(2.4.4)30 b(A)15 b(Short)g(Completion)g(Example)62
-1225 y Fo(Here)20 b(is)h(a)e(small)i(application)g(demonstrating)f(the)f(use)
-i(of)e(the)h(GNU)f(Readline)k(library)l(.)34 b(It)20 b(is)g(called)0
-1287 y Fn(fileman)p Fo(,)14 b(and)i(the)f(source)g(co)q(de)h(resides)g(in)h
-(`)p Fn(examples/fileman.c)p Fo(')o(.)h(This)e(sample)f(application)i(pro)o
-(vides)0 1350 y(completion)f(of)f(command)g(names,)g(line)i(editing)f
-(features,)f(and)g(access)g(to)g(the)g(history)g(list.)p eop
-%%Page: 33 35
-34 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(33)120 158 y Fn(/*)24 b(fileman.c)e(--)i(A)g(tiny)f(application)f(which)h
-(demonstrates)g(how)g(to)h(use)f(the)192 208 y(GNU)g(Readline)g(library.)46
-b(This)24 b(application)e(interactively)g(allows)h(users)192
-258 y(to)g(manipulate)g(files)g(and)g(their)g(modes.)h(*/)120
-358 y(#include)f(<stdio.h>)120 407 y(#include)g(<sys/types.h>)120
-457 y(#include)g(<sys/file.h>)120 507 y(#include)g(<sys/stat.h>)120
-557 y(#include)g(<sys/errno.h>)120 656 y(#include)g(<readline/readline.h>)120
-706 y(#include)g(<readline/history.h>)120 806 y(extern)g(char)g(*getwd)g
-(\(\);)120 856 y(extern)g(char)g(*xmalloc)g(\(\);)120 955 y(/*)h(The)f(names)
-g(of)h(functions)e(that)i(actually)f(do)g(the)h(manipulation.)e(*/)120
-1005 y(int)h(com_list)g(\(\),)h(com_view)e(\(\),)i(com_rename)e(\(\),)i
-(com_stat)f(\(\),)g(com_pwd)g(\(\);)120 1055 y(int)g(com_delete)g(\(\),)g
-(com_help)g(\(\),)h(com_cd)f(\(\),)g(com_quit)g(\(\);)120 1155
-y(/*)h(A)f(structure)g(which)g(contains)g(information)f(on)i(the)f(commands)g
-(this)g(program)192 1204 y(can)g(understand.)f(*/)120 1304
-y(typedef)h(struct)g({)168 1354 y(char)g(*name;)g(/*)h(User)f(printable)g
-(name)g(of)h(the)f(function.)g(*/)168 1404 y(Function)f(*func;)i(/*)f
-(Function)g(to)g(call)h(to)f(do)h(the)f(job.)h(*/)168 1453
-y(char)f(*doc;)g(/*)h(Documentation)e(for)h(this)h(function.)46
-b(*/)120 1503 y(})24 b(COMMAND;)120 1603 y(COMMAND)f(commands[])f(=)i({)168
-1653 y({)f("cd",)h(com_cd,)f("Change)f(to)i(directory)f(DIR")g(},)168
-1703 y({)g("delete",)g(com_delete,)f("Delete)h(FILE")h(},)168
-1752 y({)f("help",)g(com_help,)g("Display)g(this)g(text")g(},)168
-1802 y({)g("?",)h(com_help,)e("Synonym)h(for)h(`help'")f(},)168
-1852 y({)g("list",)g(com_list,)g("List)g(files)g(in)h(DIR")f(},)168
-1902 y({)g("ls",)h(com_list,)e("Synonym)h(for)g(`list'")g(},)168
-1952 y({)g("pwd",)g(com_pwd,)g("Print)g(the)h(current)f(working)g(directory")
-f(},)168 2001 y({)h("quit",)g(com_quit,)g("Quit)g(using)g(Fileman")g(},)168
-2051 y({)g("rename",)g(com_rename,)f("Rename)h(FILE)h(to)f(NEWNAME")g(},)168
-2101 y({)g("stat",)g(com_stat,)g("Print)g(out)g(statistics)g(on)h(FILE")f(},)
-168 2151 y({)g("view",)g(com_view,)g("View)g(the)h(contents)e(of)i(FILE")f
-(},)168 2201 y({)g(\(char)h(*\)NULL,)f(\(Function)f(*\)NULL,)h(\(char)g
-(*\)NULL)g(})120 2250 y(};)120 2350 y(/*)h(Forward)e(declarations.)h(*/)120
-2400 y(char)g(*stripwhite)g(\(\);)120 2450 y(COMMAND)g(*find_command)f(\(\);)
-120 2549 y(/*)i(The)f(name)g(of)h(this)f(program,)g(as)h(taken)f(from)g
-(argv[0].)g(*/)120 2599 y(char)g(*progname;)p eop
-%%Page: 34 36
-35 bop 0 -83 a Fo(34)1449 b(GNU)15 b(Readline)i(Library)120
-208 y Fn(/*)24 b(When)f(non-zero,)g(this)g(global)g(means)g(the)h(user)f(is)g
-(done)h(using)f(this)g(program.)g(*/)120 258 y(int)g(done;)120
-358 y(char)g(*)120 407 y(dupstr)g(\(s\))239 457 y(int)h(s;)120
-507 y({)168 557 y(char)f(*r;)168 656 y(r)g(=)h(xmalloc)f(\(strlen)g(\(s\))g
-(+)h(1\);)168 706 y(strcpy)f(\(r,)g(s\);)168 756 y(return)g(\(r\);)120
-806 y(})120 906 y(main)g(\(argc,)g(argv\))239 955 y(int)h(argc;)239
-1005 y(char)g(**argv;)120 1055 y({)168 1105 y(char)f(*line,)g(*s;)168
-1204 y(progname)f(=)i(argv[0];)168 1304 y(initialize_readline)d(\(\);)i(/*)h
-(Bind)f(our)h(completer.)e(*/)168 1404 y(/*)h(Loop)h(reading)f(and)g
-(executing)g(lines)g(until)g(the)g(user)h(quits.)f(*/)168 1453
-y(for)g(\()h(;)g(done)f(==)h(0;)f(\))215 1503 y({)263 1553
-y(line)g(=)h(readline)f(\("FileMan:)f("\);)263 1653 y(if)i(\(!line\))311
-1703 y(break;)263 1802 y(/*)g(Remove)f(leading)g(and)g(trailing)g(whitespace)
-f(from)i(the)f(line.)335 1852 y(Then,)g(if)h(there)f(is)g(anything)g(left,)g
-(add)h(it)f(to)h(the)f(history)g(list)335 1902 y(and)g(execute)g(it.)h(*/)263
-1952 y(s)g(=)g(stripwhite)e(\(line\);)263 2051 y(if)i(\(*s\))311
-2101 y({)359 2151 y(add_history)e(\(s\);)359 2201 y(execute_line)g(\(s\);)311
-2250 y(})263 2350 y(free)h(\(line\);)215 2400 y(})168 2450
-y(exit)g(\(0\);)120 2500 y(})120 2599 y(/*)h(Execute)e(a)i(command)f(line.)g
-(*/)p eop
-%%Page: 35 37
-36 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(35)120 158 y Fn(int)120 208 y(execute_line)22 b(\(line\))239
-258 y(char)i(*line;)120 308 y({)168 358 y(register)e(int)i(i;)168
-407 y(COMMAND)f(*command;)168 457 y(char)g(*word;)168 557 y(/*)g(Isolate)g
-(the)h(command)f(word.)g(*/)168 607 y(i)g(=)h(0;)168 656 y(while)f(\(line[i])
-g(&&)g(whitespace)g(\(line[i]\)\))215 706 y(i++;)168 756 y(word)g(=)h(line)f
-(+)h(i;)168 856 y(while)f(\(line[i])g(&&)g(!whitespace)g(\(line[i]\)\))215
-906 y(i++;)168 1005 y(if)g(\(line[i]\))215 1055 y(line[i++])g(=)h('\\0';)168
-1155 y(command)f(=)g(find_command)g(\(word\);)168 1254 y(if)g(\(!command\))
-215 1304 y({)263 1354 y(fprintf)g(\(stderr,)g("\045s:)g(No)h(such)f(command)g
-(for)g(FileMan.\\n",)g(word\);)263 1404 y(return)g(\(-1\);)215
-1453 y(})168 1553 y(/*)g(Get)h(argument)f(to)g(command,)g(if)g(any.)h(*/)168
-1603 y(while)f(\(whitespace)f(\(line[i]\)\))215 1653 y(i++;)168
-1752 y(word)h(=)h(line)f(+)h(i;)168 1852 y(/*)f(Call)h(the)f(function.)g(*/)
-168 1902 y(return)g(\(\(*\(command->func\)\))e(\(word\)\);)120
-1952 y(})120 2051 y(/*)j(Look)f(up)g(NAME)h(as)f(the)h(name)f(of)h(a)f
-(command,)g(and)h(return)f(a)g(pointer)g(to)h(that)192 2101
-y(command.)46 b(Return)23 b(a)h(NULL)f(pointer)g(if)h(NAME)f(isn't)g(a)h
-(command)f(name.)g(*/)120 2151 y(COMMAND)g(*)120 2201 y(find_command)f
-(\(name\))239 2250 y(char)i(*name;)120 2300 y({)168 2350 y(register)e(int)i
-(i;)168 2450 y(for)f(\(i)h(=)f(0;)h(commands[i].name;)e(i++\))215
-2500 y(if)i(\(strcmp)f(\(name,)g(commands[i].name\))f(==)h(0\))263
-2549 y(return)g(\(&commands[i]\);)p eop
-%%Page: 36 38
-37 bop 0 -83 a Fo(36)1449 b(GNU)15 b(Readline)i(Library)168
-208 y Fn(return)23 b(\(\(COMMAND)f(*\)NULL\);)120 258 y(})120
-358 y(/*)i(Strip)f(whitespace)f(from)i(the)f(start)g(and)h(end)f(of)h
-(STRING.)46 b(Return)24 b(a)f(pointer)192 407 y(into)g(STRING.)g(*/)120
-457 y(char)g(*)120 507 y(stripwhite)f(\(string\))239 557 y(char)i(*string;)
-120 607 y({)168 656 y(register)e(char)i(*s,)f(*t;)168 756 y(for)g(\(s)h(=)f
-(string;)g(whitespace)g(\(*s\);)g(s++\))215 806 y(;)168 906
-y(if)g(\(*s)h(==)f(0\))215 955 y(return)g(\(s\);)168 1055 y(t)g(=)h(s)g(+)g
-(strlen)f(\(s\))g(-)h(1;)168 1105 y(while)f(\(t)g(>)h(s)g(&&)g(whitespace)e
-(\(*t\)\))215 1155 y(t--;)168 1204 y(*++t)h(=)h('\\0';)168
-1304 y(return)f(s;)120 1354 y(})120 1453 y(/*)h(***********************)o
+(\014lename)i(completion)f(is)120 2670 y(done,)13 b(after)e(all)i(the)g
+(matc)o(hing)f(names)g(ha)o(v)o(e)g(b)q(een)h(generated.)19
+b(It)12 b(is)h(passed)f(a)g Fq(NULL)g Fr(terminated)p
+eop
+40 41 bop 0 -58 a Fr(40)1449 b(GNU)15 b(Readline)i(Library)120
+183 y(arra)o(y)f(of)h(matc)o(hes.)26 b(The)17 b(\014rst)g(elemen)o(t)h
+(\()p Fq(matches[0])p Fr(\))e(is)h(the)h(maximal)g(substring)f(common)
+120 246 y(to)f(all)h(matc)o(hes.)22 b(This)17 b(function)g(can)f
+(re-arrange)g(the)g(list)h(of)f(matc)o(hes)g(as)f(required,)j(but)e
+(eac)o(h)120 308 y(elemen)o(t)g(deleted)g(from)f(the)g(arra)o(y)f(m)o
+(ust)h(b)q(e)h(freed.)1736 470 y(V)l(ariable)-1899 b
+Fi(Function)20 b(*)g Fh(rl)p 316 470 18 3 v 21 w(directory)p
+564 470 V 21 w(completion)p 859 470 V 21 w(ho)r(ok)120
+532 y Fr(This)15 b(function,)g(if)g(de\014ned,)h(is)f(allo)o(w)o(ed)g
+(to)e(mo)q(dify)j(the)e(directory)h(p)q(ortion)g(of)f(\014lenames)h
+(Read-)120 594 y(line)h(completes.)k(It)14 b(is)g(called)i(with)e(the)g
+(address)g(of)g(a)g(string)g(\(the)g(curren)o(t)f(directory)i(name\))e
+(as)120 656 y(an)f(argumen)o(t.)17 b(It)12 b(could)h(b)q(e)f(used)g(to)
+f(expand)h(sym)o(b)q(olic)h(links)g(or)e(shell)i(v)m(ariables)g(in)f
+(pathnames.)0 864 y Fk(2.5.4)30 b(A)15 b(Short)g(Completion)g(Example)
+62 1001 y Fr(Here)20 b(is)h(a)e(small)i(application)g(demonstrating)f
+(the)f(use)i(of)e(the)h(GNU)f(Readline)k(library)l(.)34
+b(It)20 b(is)g(called)0 1063 y Fq(fileman)p Fr(,)14 b(and)i(the)f
+(source)g(co)q(de)h(resides)g(in)h(`)p Fq(examples/fileman.c)p
+Fr(')o(.)h(This)e(sample)f(application)i(pro)o(vides)0
+1126 y(completion)f(of)f(command)g(names,)g(line)i(editing)f(features,)
+f(and)g(access)g(to)g(the)g(history)g(list.)p eop
+41 42 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(41)120 183 y Fq(/*)24 b(fileman.c)e(--)i(A)g(tiny)f
+(application)f(which)h(demonstrates)g(how)g(to)h(use)f(the)192
+235 y(GNU)g(Readline)g(library.)46 b(This)24 b(application)e
+(interactively)g(allows)h(users)192 287 y(to)g(manipulate)g(files)g
+(and)g(their)g(modes.)h(*/)120 391 y(#include)f(<stdio.h>)120
+443 y(#include)g(<sys/types.h>)120 495 y(#include)g(<sys/file.h>)120
+546 y(#include)g(<sys/stat.h>)120 598 y(#include)g(<sys/errno.h>)120
+702 y(#include)g(<readline/readline.h>)120 754 y(#include)g
+(<readline/history.h>)120 858 y(extern)g(char)g(*getwd)g(\(\);)120
+910 y(extern)g(char)g(*xmalloc)g(\(\);)120 1013 y(/*)h(The)f(names)g
+(of)h(functions)e(that)i(actually)f(do)g(the)h(manipulation.)e(*/)120
+1065 y(int)h(com_list)g(\(\),)h(com_view)e(\(\),)i(com_rename)e(\(\),)i
+(com_stat)f(\(\),)g(com_pwd)g(\(\);)120 1117 y(int)g(com_delete)g
+(\(\),)g(com_help)g(\(\),)h(com_cd)f(\(\),)g(com_quit)g(\(\);)120
+1221 y(/*)h(A)f(structure)g(which)g(contains)g(information)f(on)i(the)f
+(commands)g(this)g(program)192 1273 y(can)g(understand.)f(*/)120
+1377 y(typedef)h(struct)g({)168 1429 y(char)g(*name;)g(/*)h(User)f
+(printable)g(name)g(of)h(the)f(function.)g(*/)168 1480
+y(Function)f(*func;)i(/*)f(Function)g(to)g(call)h(to)f(do)h(the)f(job.)
+h(*/)168 1532 y(char)f(*doc;)g(/*)h(Documentation)e(for)h(this)h
+(function.)46 b(*/)120 1584 y(})24 b(COMMAND;)120 1688
+y(COMMAND)f(commands[])f(=)i({)168 1740 y({)f("cd",)h(com_cd,)f
+("Change)f(to)i(directory)f(DIR")g(},)168 1792 y({)g("delete",)g
+(com_delete,)f("Delete)h(FILE")h(},)168 1844 y({)f("help",)g(com_help,)
+g("Display)g(this)g(text")g(},)168 1896 y({)g("?",)h(com_help,)e
+("Synonym)h(for)h(`help'")f(},)168 1947 y({)g("list",)g(com_list,)g
+("List)g(files)g(in)h(DIR")f(},)168 1999 y({)g("ls",)h(com_list,)e
+("Synonym)h(for)g(`list'")g(},)168 2051 y({)g("pwd",)g(com_pwd,)g
+("Print)g(the)h(current)f(working)g(directory")f(},)168
+2103 y({)h("quit",)g(com_quit,)g("Quit)g(using)g(Fileman")g(},)168
+2155 y({)g("rename",)g(com_rename,)f("Rename)h(FILE)h(to)f(NEWNAME")g
+(},)168 2207 y({)g("stat",)g(com_stat,)g("Print)g(out)g(statistics)g
+(on)h(FILE")f(},)168 2259 y({)g("view",)g(com_view,)g("View)g(the)h
+(contents)e(of)i(FILE")f(},)168 2311 y({)g(\(char)h(*\)NULL,)f
+(\(Function)f(*\)NULL,)h(\(char)g(*\)NULL)g(})120 2363
+y(};)120 2466 y(/*)h(Forward)e(declarations.)h(*/)120
+2518 y(char)g(*stripwhite)g(\(\);)120 2570 y(COMMAND)g(*find_command)f
+(\(\);)p eop
+42 43 bop 0 -58 a Fr(42)1449 b(GNU)15 b(Readline)i(Library)120
+183 y Fq(/*)24 b(The)f(name)g(of)h(this)f(program,)g(as)h(taken)f(from)
+g(argv[0].)g(*/)120 235 y(char)g(*progname;)120 339 y(/*)h(When)f
+(non-zero,)g(this)g(global)g(means)g(the)h(user)f(is)g(done)h(using)f
+(this)g(program.)g(*/)120 391 y(int)g(done;)120 495 y(char)g(*)120
+546 y(dupstr)g(\(s\))239 598 y(int)h(s;)120 650 y({)168
+702 y(char)f(*r;)168 806 y(r)g(=)h(xmalloc)f(\(strlen)g(\(s\))g(+)h
+(1\);)168 858 y(strcpy)f(\(r,)g(s\);)168 910 y(return)g(\(r\);)120
+962 y(})120 1065 y(main)g(\(argc,)g(argv\))239 1117 y(int)h(argc;)239
+1169 y(char)g(**argv;)120 1221 y({)168 1273 y(char)f(*line,)g(*s;)168
+1377 y(progname)f(=)i(argv[0];)168 1480 y(initialize_readline)d(\(\);)i
+(/*)h(Bind)f(our)h(completer.)e(*/)168 1584 y(/*)h(Loop)h(reading)f
+(and)g(executing)g(lines)g(until)g(the)g(user)h(quits.)f(*/)168
+1636 y(for)g(\()h(;)g(done)f(==)h(0;)f(\))215 1688 y({)263
+1740 y(line)g(=)h(readline)f(\("FileMan:)f("\);)263 1844
+y(if)i(\(!line\))311 1896 y(break;)263 1999 y(/*)g(Remove)f(leading)g
+(and)g(trailing)g(whitespace)f(from)i(the)f(line.)335
+2051 y(Then,)g(if)h(there)f(is)g(anything)g(left,)g(add)h(it)f(to)h
+(the)f(history)g(list)335 2103 y(and)g(execute)g(it.)h(*/)263
+2155 y(s)g(=)g(stripwhite)e(\(line\);)263 2259 y(if)i(\(*s\))311
+2311 y({)359 2363 y(add_history)e(\(s\);)359 2414 y(execute_line)g
+(\(s\);)311 2466 y(})263 2570 y(free)h(\(line\);)215
+2622 y(})p eop
+43 44 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(43)168 183 y Fq(exit)23 b(\(0\);)120
+235 y(})120 339 y(/*)h(Execute)e(a)i(command)f(line.)g(*/)120
+391 y(int)120 443 y(execute_line)f(\(line\))239 495 y(char)i(*line;)120
+546 y({)168 598 y(register)e(int)i(i;)168 650 y(COMMAND)f(*command;)168
+702 y(char)g(*word;)168 806 y(/*)g(Isolate)g(the)h(command)f(word.)g
+(*/)168 858 y(i)g(=)h(0;)168 910 y(while)f(\(line[i])g(&&)g(whitespace)
+g(\(line[i]\)\))215 962 y(i++;)168 1013 y(word)g(=)h(line)f(+)h(i;)168
+1117 y(while)f(\(line[i])g(&&)g(!whitespace)g(\(line[i]\)\))215
+1169 y(i++;)168 1273 y(if)g(\(line[i]\))215 1325 y(line[i++])g(=)h
+('\\0';)168 1429 y(command)f(=)g(find_command)g(\(word\);)168
+1532 y(if)g(\(!command\))215 1584 y({)263 1636 y(fprintf)g(\(stderr,)g
+("\045s:)g(No)h(such)f(command)g(for)g(FileMan.\\n",)g(word\);)263
+1688 y(return)g(\(-1\);)215 1740 y(})168 1844 y(/*)g(Get)h(argument)f
+(to)g(command,)g(if)g(any.)h(*/)168 1896 y(while)f(\(whitespace)f
+(\(line[i]\)\))215 1947 y(i++;)168 2051 y(word)h(=)h(line)f(+)h(i;)168
+2155 y(/*)f(Call)h(the)f(function.)g(*/)168 2207 y(return)g
+(\(\(*\(command->func\)\))e(\(word\)\);)120 2259 y(})120
+2363 y(/*)j(Look)f(up)g(NAME)h(as)f(the)h(name)f(of)h(a)f(command,)g
+(and)h(return)f(a)g(pointer)g(to)h(that)192 2414 y(command.)46
+b(Return)23 b(a)h(NULL)f(pointer)g(if)h(NAME)f(isn't)g(a)h(command)f
+(name.)g(*/)120 2466 y(COMMAND)g(*)120 2518 y(find_command)f(\(name\))
+239 2570 y(char)i(*name;)120 2622 y({)p eop
+44 45 bop 0 -58 a Fr(44)1449 b(GNU)15 b(Readline)i(Library)168
+183 y Fq(register)22 b(int)i(i;)168 287 y(for)f(\(i)h(=)f(0;)h
+(commands[i].name;)e(i++\))215 339 y(if)i(\(strcmp)f(\(name,)g
+(commands[i].name\))f(==)h(0\))263 391 y(return)g(\(&commands[i]\);)168
+495 y(return)g(\(\(COMMAND)f(*\)NULL\);)120 546 y(})120
+650 y(/*)i(Strip)f(whitespace)f(from)i(the)f(start)g(and)h(end)f(of)h
+(STRING.)46 b(Return)24 b(a)f(pointer)192 702 y(into)g(STRING.)g(*/)120
+754 y(char)g(*)120 806 y(stripwhite)f(\(string\))239
+858 y(char)i(*string;)120 910 y({)168 962 y(register)e(char)i(*s,)f
+(*t;)168 1065 y(for)g(\(s)h(=)f(string;)g(whitespace)g(\(*s\);)g(s++\))
+215 1117 y(;)168 1221 y(if)g(\(*s)h(==)f(0\))215 1273
+y(return)g(\(s\);)168 1377 y(t)g(=)h(s)g(+)g(strlen)f(\(s\))g(-)h(1;)
+168 1429 y(while)f(\(t)g(>)h(s)g(&&)g(whitespace)e(\(*t\)\))215
+1480 y(t--;)168 1532 y(*++t)h(=)h('\\0';)168 1636 y(return)f(s;)120
+1688 y(})120 1792 y(/*)h(***********************)o(*******)o(********)o
+(*******)o(*******)o(********)o(****)d(*/)120 1844 y(/*)1575
+b(*/)120 1896 y(/*)429 b(Interface)23 b(to)g(Readline)g(Completion)381
+b(*/)120 1947 y(/*)1575 b(*/)120 1999 y(/*)24 b
+(***********************)o(*******)o(********)o(*******)o(*******)o
+(********)o(****)d(*/)120 2103 y(char)i(*command_generator)f(\(\);)120
+2155 y(char)h(**fileman_completion)e(\(\);)120 2259 y(/*)j(Tell)f(the)g
+(GNU)h(Readline)f(library)f(how)i(to)g(complete.)46 b(We)24
+b(want)f(to)h(try)f(to)h(complete)192 2311 y(on)f(command)g(names)g(if)
+h(this)f(is)h(the)f(first)g(word)h(in)f(the)h(line,)f(or)h(on)f
+(filenames)192 2363 y(if)g(not.)g(*/)120 2414 y(initialize_readline)e
+(\(\))120 2466 y({)168 2518 y(/*)i(Allow)g(conditional)g(parsing)g(of)g
+(the)h(~/.inputrc)e(file.)h(*/)168 2570 y(rl_readline_name)e(=)j
+("FileMan";)p eop
+45 46 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(45)168 183 y Fq(/*)23 b(Tell)h(the)f(completer)g(that)g
+(we)h(want)f(a)h(crack)f(first.)g(*/)168 235 y
+(rl_attempted_completion_)o(functio)o(n)e(=)j(\(CPPFunction)e
+(*\)fileman_completion;)120 287 y(})120 391 y(/*)i(Attempt)e(to)i
+(complete)f(on)g(the)h(contents)f(of)g(TEXT.)47 b(START)23
+b(and)h(END)f(bound)h(the)192 443 y(region)f(of)g(rl_line_buffer)f
+(that)h(contains)g(the)h(word)f(to)h(complete.)46 b(TEXT)23
+b(is)192 495 y(the)g(word)g(to)h(complete.)46 b(We)24
+b(can)f(use)h(the)f(entire)g(contents)g(of)h(rl_line_buffer)192
+546 y(in)f(case)g(we)h(want)f(to)h(do)g(some)f(simple)g(parsing.)47
+b(Return)23 b(the)g(array)g(of)h(matches,)192 598 y(or)f(NULL)g(if)h
+(there)f(aren't)g(any.)h(*/)120 650 y(char)f(**)120 702
+y(fileman_completion)e(\(text,)i(start,)g(end\))239 754
+y(char)h(*text;)239 806 y(int)g(start,)f(end;)120 858
+y({)168 910 y(char)g(**matches;)168 1013 y(matches)g(=)g(\(char)h
+(**\)NULL;)168 1117 y(/*)f(If)h(this)f(word)h(is)f(at)h(the)f(start)g
+(of)h(the)f(line,)h(then)f(it)g(is)h(a)g(command)239
+1169 y(to)g(complete.)46 b(Otherwise)23 b(it)h(is)f(the)h(name)f(of)h
+(a)f(file)h(in)f(the)h(current)239 1221 y(directory.)f(*/)168
+1273 y(if)g(\(start)g(==)h(0\))215 1325 y(matches)f(=)h
+(completion_matches)d(\(text,)j(command_generator\);)168
+1429 y(return)f(\(matches\);)120 1480 y(})120 1584 y(/*)h(Generator)e
+(function)h(for)g(command)g(completion.)47 b(STATE)23
+b(lets)g(us)h(know)f(whether)192 1636 y(to)g(start)g(from)h(scratch;)e
+(without)h(any)h(state)f(\(i.e.)g(STATE)g(==)h(0\),)f(then)h(we)192
+1688 y(start)f(at)g(the)h(top)f(of)h(the)f(list.)g(*/)120
+1740 y(char)g(*)120 1792 y(command_generator)f(\(text,)h(state\))239
+1844 y(char)h(*text;)239 1896 y(int)g(state;)120 1947
+y({)168 1999 y(static)f(int)g(list_index,)g(len;)168
+2051 y(char)g(*name;)168 2155 y(/*)g(If)h(this)f(is)h(a)g(new)f(word)g
+(to)h(complete,)f(initialize)f(now.)47 b(This)24 b(includes)239
+2207 y(saving)f(the)h(length)f(of)g(TEXT)h(for)f(efficiency,)g(and)g
+(initializing)f(the)i(index)239 2259 y(variable)f(to)h(0.)f(*/)168
+2311 y(if)g(\(!state\))215 2363 y({)263 2414 y(list_index)g(=)g(0;)263
+2466 y(len)h(=)f(strlen)g(\(text\);)215 2518 y(})168
+2622 y(/*)g(Return)g(the)h(next)f(name)g(which)h(partially)e(matches)h
+(from)g(the)h(command)f(list.)g(*/)p eop
+46 47 bop 0 -58 a Fr(46)1449 b(GNU)15 b(Readline)i(Library)168
+183 y Fq(while)23 b(\(name)g(=)h(commands[list_index].name)o(\))215
+235 y({)263 287 y(list_index++;)263 391 y(if)g(\(strncmp)f(\(name,)g
+(text,)g(len\))g(==)h(0\))311 443 y(return)f(\(dupstr\(name\)\);)215
+495 y(})168 598 y(/*)g(If)h(no)f(names)h(matched,)e(then)i(return)f
+(NULL.)g(*/)168 650 y(return)g(\(\(char)g(*\)NULL\);)120
+702 y(})120 806 y(/*)h(***********************)o(*******)o(********)o
+(*******)o(*******)o(********)o(****)d(*/)120 858 y(/*)1575
+b(*/)120 910 y(/*)549 b(FileMan)22 b(Commands)644 b(*/)120
+962 y(/*)1575 b(*/)120 1013 y(/*)24 b(***********************)o
(*******)o(********)o(*******)o(*******)o(********)o(****)d(*/)120
-1503 y(/*)1575 b(*/)120 1553 y(/*)429 b(Interface)23 b(to)g(Readline)g
-(Completion)381 b(*/)120 1603 y(/*)1575 b(*/)120 1653 y(/*)24
-b(***********************)o(*******)o(********)o(*******)o(*******)o
-(********)o(****)d(*/)120 1752 y(char)i(*command_generator)f(\(\);)120
-1802 y(char)h(**fileman_completion)e(\(\);)120 1902 y(/*)j(Tell)f(the)g(GNU)h
-(Readline)f(library)f(how)i(to)g(complete.)46 b(We)24 b(want)f(to)h(try)f(to)
-h(complete)192 1952 y(on)f(command)g(names)g(if)h(this)f(is)h(the)f(first)g
-(word)h(in)f(the)h(line,)f(or)h(on)f(filenames)192 2001 y(if)g(not.)g(*/)120
-2051 y(initialize_readline)e(\(\))120 2101 y({)168 2151 y(/*)i(Allow)g
-(conditional)g(parsing)g(of)g(the)h(~/.inputrc)e(file.)h(*/)168
-2201 y(rl_readline_name)e(=)j("FileMan";)168 2300 y(/*)f(Tell)h(the)f
-(completer)g(that)g(we)h(want)f(a)h(crack)f(first.)g(*/)168
-2350 y(rl_attempted_completion_)o(functio)o(n)e(=)j(\(CPPFunction)e
-(*\)fileman_completion;)120 2400 y(})p eop
-%%Page: 37 39
-38 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(37)120 158 y Fn(/*)24 b(Attempt)e(to)i(complete)f(on)g(the)h(contents)f(of)
-g(TEXT.)47 b(START)23 b(and)h(END)f(show)h(the)192 208 y(region)f(of)g(TEXT)h
-(that)f(contains)g(the)g(word)g(to)h(complete.)46 b(We)24 b(can)g(use)f(the)
-192 258 y(entire)g(line)g(in)h(case)f(we)g(want)h(to)f(do)h(some)f(simple)g
-(parsing.)47 b(Return)23 b(the)192 308 y(array)g(of)g(matches,)g(or)h(NULL)f
-(if)h(there)f(aren't)g(any.)g(*/)120 358 y(char)g(**)120 407
-y(fileman_completion)e(\(text,)i(start,)g(end\))239 457 y(char)h(*text;)239
-507 y(int)g(start,)f(end;)120 557 y({)168 607 y(char)g(**matches;)168
-706 y(matches)g(=)g(\(char)h(**\)NULL;)168 806 y(/*)f(If)h(this)f(word)h(is)f
-(at)h(the)f(start)g(of)h(the)f(line,)h(then)f(it)g(is)h(a)g(command)239
-856 y(to)g(complete.)46 b(Otherwise)23 b(it)h(is)f(the)h(name)f(of)h(a)f
-(file)h(in)f(the)h(current)239 906 y(directory.)f(*/)168 955
-y(if)g(\(start)g(==)h(0\))215 1005 y(matches)f(=)h(completion_matches)d
-(\(text,)j(command_generator\);)168 1105 y(return)f(\(matches\);)120
-1155 y(})120 1254 y(/*)h(Generator)e(function)h(for)g(command)g(completion.)
-47 b(STATE)23 b(lets)g(us)h(know)f(whether)192 1304 y(to)g(start)g(from)h
-(scratch;)e(without)h(any)h(state)f(\(i.e.)g(STATE)g(==)h(0\),)f(then)h(we)
-192 1354 y(start)f(at)g(the)h(top)f(of)h(the)f(list.)g(*/)120
-1404 y(char)g(*)120 1453 y(command_generator)f(\(text,)h(state\))239
-1503 y(char)h(*text;)239 1553 y(int)g(state;)120 1603 y({)168
-1653 y(static)f(int)g(list_index,)g(len;)168 1703 y(char)g(*name;)168
-1802 y(/*)g(If)h(this)f(is)h(a)g(new)f(word)g(to)h(complete,)f(initialize)f
-(now.)47 b(This)24 b(includes)239 1852 y(saving)f(the)h(length)f(of)g(TEXT)h
-(for)f(efficiency,)g(and)g(initializing)f(the)i(index)239 1902
-y(variable)f(to)h(0.)f(*/)168 1952 y(if)g(\(!state\))215 2001
-y({)263 2051 y(list_index)g(=)g(0;)263 2101 y(len)h(=)f(strlen)g(\(text\);)
-215 2151 y(})168 2250 y(/*)g(Return)g(the)h(next)f(name)g(which)h(partially)e
-(matches)h(from)g(the)h(command)f(list.)g(*/)168 2300 y(while)g(\(name)g(=)h
-(commands[list_index].name)o(\))215 2350 y({)263 2400 y(list_index++;)263
-2500 y(if)g(\(strncmp)f(\(name,)g(text,)g(len\))g(==)h(0\))311
-2549 y(return)f(\(dupstr\(name\)\);)215 2599 y(})p eop
-%%Page: 38 40
-39 bop 0 -83 a Fo(38)1449 b(GNU)15 b(Readline)i(Library)168
-208 y Fn(/*)23 b(If)h(no)f(names)h(matched,)e(then)i(return)f(NULL.)g(*/)168
-258 y(return)g(\(\(char)g(*\)NULL\);)120 308 y(})120 407 y(/*)h
-(***********************)o(*******)o(********)o(*******)o(*******)o(********)
-o(****)d(*/)120 457 y(/*)1575 b(*/)120 507 y(/*)549 b(FileMan)22
-b(Commands)644 b(*/)120 557 y(/*)1575 b(*/)120 607 y(/*)24
-b(***********************)o(*******)o(********)o(*******)o(*******)o
-(********)o(****)d(*/)120 706 y(/*)j(String)f(to)g(pass)h(to)f(system)g
-(\(\).)47 b(This)24 b(is)f(for)h(the)f(LIST,)g(VIEW)h(and)f(RENAME)192
-756 y(commands.)f(*/)120 806 y(static)h(char)g(syscom[1024];)120
-906 y(/*)h(List)f(the)g(file\(s\))g(named)g(in)h(arg.)f(*/)120
-955 y(com_list)g(\(arg\))239 1005 y(char)h(*arg;)120 1055 y({)168
-1105 y(if)f(\(!arg\))215 1155 y(arg)h(=)g("";)168 1254 y(sprintf)f(\(syscom,)
-f("ls)i(-FClg)f(\045s",)g(arg\);)168 1304 y(return)g(\(system)g
-(\(syscom\)\);)120 1354 y(})120 1453 y(com_view)g(\(arg\))239
-1503 y(char)h(*arg;)120 1553 y({)168 1603 y(if)f(\(!valid_argument)f
-(\("view",)h(arg\)\))215 1653 y(return)g(1;)168 1752 y(sprintf)g(\(syscom,)f
-("more)i(\045s",)f(arg\);)168 1802 y(return)g(\(system)g(\(syscom\)\);)120
-1852 y(})120 1952 y(com_rename)f(\(arg\))239 2001 y(char)i(*arg;)120
-2051 y({)168 2101 y(too_dangerous)e(\("rename"\);)168 2151
-y(return)h(\(1\);)120 2201 y(})120 2300 y(com_stat)g(\(arg\))239
-2350 y(char)h(*arg;)120 2400 y({)168 2450 y(struct)f(stat)g(finfo;)168
-2549 y(if)g(\(!valid_argument)f(\("stat",)h(arg\)\))215 2599
-y(return)g(\(1\);)p eop
-%%Page: 39 41
-40 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(39)168 208 y Fn(if)23 b(\(stat)g(\(arg,)h(&finfo\))f(==)g(-1\))215
-258 y({)263 308 y(perror)g(\(arg\);)263 358 y(return)g(\(1\);)215
-407 y(})168 507 y(printf)g(\("Statistics)f(for)h(`\045s':\\n",)g(arg\);)168
-607 y(printf)g(\("\045s)g(has)h(\045d)f(link\045s,)g(and)g(is)h(\045d)g
-(byte\045s)f(in)g(length.\\n",)g(arg,)359 656 y(finfo.st_nlink,)359
-706 y(\(finfo.st_nlink)e(==)j(1\))g(?)f("")h(:)g("s",)359 756
-y(finfo.st_size,)359 806 y(\(finfo.st_size)e(==)h(1\))h(?)f("")h(:)g("s"\);)
-168 856 y(printf)f(\("Inode)g(Last)g(Change)g(at:)g(\045s",)h(ctime)f
-(\(&finfo.st_ctime\)\);)168 906 y(printf)g(\(")143 b(Last)23
+1117 y(/*)j(String)f(to)g(pass)h(to)f(system)g(\(\).)47
+b(This)24 b(is)f(for)h(the)f(LIST,)g(VIEW)h(and)f(RENAME)192
+1169 y(commands.)f(*/)120 1221 y(static)h(char)g(syscom[1024];)120
+1325 y(/*)h(List)f(the)g(file\(s\))g(named)g(in)h(arg.)f(*/)120
+1377 y(com_list)g(\(arg\))239 1429 y(char)h(*arg;)120
+1480 y({)168 1532 y(if)f(\(!arg\))215 1584 y(arg)h(=)g("";)168
+1688 y(sprintf)f(\(syscom,)f("ls)i(-FClg)f(\045s",)g(arg\);)168
+1740 y(return)g(\(system)g(\(syscom\)\);)120 1792 y(})120
+1896 y(com_view)g(\(arg\))239 1947 y(char)h(*arg;)120
+1999 y({)168 2051 y(if)f(\(!valid_argument)f(\("view",)h(arg\)\))215
+2103 y(return)g(1;)168 2207 y(sprintf)g(\(syscom,)f("more)i(\045s",)f
+(arg\);)168 2259 y(return)g(\(system)g(\(syscom\)\);)120
+2311 y(})120 2414 y(com_rename)f(\(arg\))239 2466 y(char)i(*arg;)120
+2518 y({)168 2570 y(too_dangerous)e(\("rename"\);)168
+2622 y(return)h(\(1\);)p eop
+47 48 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(47)120 183 y Fq(})120 287 y(com_stat)23
+b(\(arg\))239 339 y(char)h(*arg;)120 391 y({)168 443
+y(struct)f(stat)g(finfo;)168 546 y(if)g(\(!valid_argument)f(\("stat",)h
+(arg\)\))215 598 y(return)g(\(1\);)168 702 y(if)g(\(stat)g(\(arg,)h
+(&finfo\))f(==)g(-1\))215 754 y({)263 806 y(perror)g(\(arg\);)263
+858 y(return)g(\(1\);)215 910 y(})168 1013 y(printf)g(\("Statistics)f
+(for)h(`\045s':\\n",)g(arg\);)168 1117 y(printf)g(\("\045s)g(has)h
+(\045d)f(link\045s,)g(and)g(is)h(\045d)g(byte\045s)f(in)g(length.\\n",)
+g(arg,)359 1169 y(finfo.st_nlink,)359 1221 y(\(finfo.st_nlink)e(==)j
+(1\))g(?)f("")h(:)g("s",)359 1273 y(finfo.st_size,)359
+1325 y(\(finfo.st_size)e(==)h(1\))h(?)f("")h(:)g("s"\);)168
+1377 y(printf)f(\("Inode)g(Last)g(Change)g(at:)g(\045s",)h(ctime)f
+(\(&finfo.st_ctime\)\);)168 1429 y(printf)g(\(")143 b(Last)23
b(access)g(at:)g(\045s",)h(ctime)f(\(&finfo.st_atime\)\);)168
-955 y(printf)g(\(")95 b(Last)23 b(modified)g(at:)g(\045s",)h(ctime)f
-(\(&finfo.st_mtime\)\);)168 1005 y(return)g(\(0\);)120 1055
-y(})120 1155 y(com_delete)f(\(arg\))239 1204 y(char)i(*arg;)120
-1254 y({)168 1304 y(too_dangerous)e(\("delete"\);)168 1354
-y(return)h(\(1\);)120 1404 y(})120 1503 y(/*)h(Print)f(out)g(help)h(for)f
-(ARG,)g(or)h(for)f(all)h(of)f(the)h(commands)f(if)g(ARG)h(is)192
-1553 y(not)f(present.)g(*/)120 1603 y(com_help)g(\(arg\))239
-1653 y(char)h(*arg;)120 1703 y({)168 1752 y(register)e(int)i(i;)168
-1802 y(int)f(printed)g(=)h(0;)168 1902 y(for)f(\(i)h(=)f(0;)h
-(commands[i].name;)e(i++\))215 1952 y({)263 2001 y(if)i(\(!*arg)f(||)g
-(\(strcmp)g(\(arg,)g(commands[i].name\))f(==)i(0\)\))311 2051
-y({)359 2101 y(printf)f(\("\045s\\t\\t\045s.\\n",)e(commands[i].name,)h
-(commands[i].doc\);)359 2151 y(printed++;)311 2201 y(})215
-2250 y(})168 2350 y(if)h(\(!printed\))215 2400 y({)263 2450
+1480 y(printf)g(\(")95 b(Last)23 b(modified)g(at:)g(\045s",)h(ctime)f
+(\(&finfo.st_mtime\)\);)168 1532 y(return)g(\(0\);)120
+1584 y(})120 1688 y(com_delete)f(\(arg\))239 1740 y(char)i(*arg;)120
+1792 y({)168 1844 y(too_dangerous)e(\("delete"\);)168
+1896 y(return)h(\(1\);)120 1947 y(})120 2051 y(/*)h(Print)f(out)g(help)
+h(for)f(ARG,)g(or)h(for)f(all)h(of)f(the)h(commands)f(if)g(ARG)h(is)192
+2103 y(not)f(present.)g(*/)120 2155 y(com_help)g(\(arg\))239
+2207 y(char)h(*arg;)120 2259 y({)168 2311 y(register)e(int)i(i;)168
+2363 y(int)f(printed)g(=)h(0;)168 2466 y(for)f(\(i)h(=)f(0;)h
+(commands[i].name;)e(i++\))215 2518 y({)263 2570 y(if)i(\(!*arg)f(||)g
+(\(strcmp)g(\(arg,)g(commands[i].name\))f(==)i(0\)\))311
+2622 y({)p eop
+48 49 bop 0 -58 a Fr(48)1449 b(GNU)15 b(Readline)i(Library)359
+183 y Fq(printf)23 b(\("\045s\\t\\t\045s.\\n",)e(commands[i].name,)h
+(commands[i].doc\);)359 235 y(printed++;)311 287 y(})215
+339 y(})168 443 y(if)h(\(!printed\))215 495 y({)263 546
y(printf)g(\("No)h(commands)e(match)h(`\045s'.)48 b(Possibilties)22
-b(are:\\n",)h(arg\);)p eop
-%%Page: 40 42
-41 bop 0 -83 a Fo(40)1449 b(GNU)15 b(Readline)i(Library)263
-208 y Fn(for)24 b(\(i)f(=)h(0;)g(commands[i].name;)d(i++\))311
-258 y({)359 308 y(/*)i(Print)g(in)h(six)f(columns.)g(*/)359
-358 y(if)g(\(printed)g(==)h(6\))406 407 y({)454 457 y(printed)f(=)h(0;)454
-507 y(printf)f(\("\\n"\);)406 557 y(})359 656 y(printf)g(\("\045s\\t",)f
-(commands[i].name\);)359 706 y(printed++;)311 756 y(})263 856
-y(if)i(\(printed\))311 906 y(printf)f(\("\\n"\);)215 955 y(})168
-1005 y(return)g(\(0\);)120 1055 y(})120 1155 y(/*)h(Change)f(to)g(the)h
-(directory)e(ARG.)i(*/)120 1204 y(com_cd)f(\(arg\))239 1254
-y(char)h(*arg;)120 1304 y({)168 1354 y(if)f(\(chdir)g(\(arg\))h(==)f(-1\))215
-1404 y({)263 1453 y(perror)g(\(arg\);)263 1503 y(return)g(1;)215
-1553 y(})168 1653 y(com_pwd)g(\(""\);)168 1703 y(return)g(\(0\);)120
-1752 y(})120 1852 y(/*)h(Print)f(out)g(the)h(current)f(working)f(directory.)h
-(*/)120 1902 y(com_pwd)g(\(ignore\))239 1952 y(char)h(*ignore;)120
-2001 y({)168 2051 y(char)f(dir[1024],)g(*s;)168 2151 y(s)g(=)h(getwd)f
-(\(dir\);)168 2201 y(if)g(\(s)h(==)f(0\))215 2250 y({)263 2300
-y(printf)g(\("Error)g(getting)g(pwd:)g(\045s\\n",)g(dir\);)263
-2350 y(return)g(1;)215 2400 y(})168 2500 y(printf)g(\("Current)f(directory)h
-(is)h(\045s\\n",)f(dir\);)168 2549 y(return)g(0;)120 2599 y(})p
+b(are:\\n",)h(arg\);)263 650 y(for)h(\(i)f(=)h(0;)g(commands[i].name;)d
+(i++\))311 702 y({)359 754 y(/*)i(Print)g(in)h(six)f(columns.)g(*/)359
+806 y(if)g(\(printed)g(==)h(6\))406 858 y({)454 910 y(printed)f(=)h(0;)
+454 962 y(printf)f(\("\\n"\);)406 1013 y(})359 1117 y(printf)g
+(\("\045s\\t",)f(commands[i].name\);)359 1169 y(printed++;)311
+1221 y(})263 1325 y(if)i(\(printed\))311 1377 y(printf)f(\("\\n"\);)215
+1429 y(})168 1480 y(return)g(\(0\);)120 1532 y(})120
+1636 y(/*)h(Change)f(to)g(the)h(directory)e(ARG.)i(*/)120
+1688 y(com_cd)f(\(arg\))239 1740 y(char)h(*arg;)120 1792
+y({)168 1844 y(if)f(\(chdir)g(\(arg\))h(==)f(-1\))215
+1896 y({)263 1947 y(perror)g(\(arg\);)263 1999 y(return)g(1;)215
+2051 y(})168 2155 y(com_pwd)g(\(""\);)168 2207 y(return)g(\(0\);)120
+2259 y(})120 2363 y(/*)h(Print)f(out)g(the)h(current)f(working)f
+(directory.)h(*/)120 2414 y(com_pwd)g(\(ignore\))239
+2466 y(char)h(*ignore;)120 2518 y({)168 2570 y(char)f(dir[1024],)g(*s;)
+p eop
+49 50 bop 0 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)994 b(49)168 183 y Fq(s)23 b(=)h(getwd)f(\(dir\);)168
+235 y(if)g(\(s)h(==)f(0\))215 287 y({)263 339 y(printf)g(\("Error)g
+(getting)g(pwd:)g(\045s\\n",)g(dir\);)263 391 y(return)g(1;)215
+443 y(})168 546 y(printf)g(\("Current)f(directory)h(is)h(\045s\\n",)f
+(dir\);)168 598 y(return)g(0;)120 650 y(})120 754 y(/*)h(The)f(user)g
+(wishes)g(to)h(quit)f(using)g(this)h(program.)46 b(Just)24
+b(set)f(DONE)h(non-zero.)e(*/)120 806 y(com_quit)h(\(arg\))239
+858 y(char)h(*arg;)120 910 y({)168 962 y(done)f(=)h(1;)168
+1013 y(return)f(\(0\);)120 1065 y(})120 1169 y(/*)h(Function)e(which)i
+(tells)f(you)g(that)g(you)h(can't)f(do)h(this.)f(*/)120
+1221 y(too_dangerous)f(\(caller\))239 1273 y(char)i(*caller;)120
+1325 y({)168 1377 y(fprintf)f(\(stderr,)382 1429 y("\045s:)h(Too)f
+(dangerous)g(for)g(me)h(to)g(distribute.)46 b(Write)23
+b(it)h(yourself.\\n",)382 1480 y(caller\);)120 1532 y(})120
+1636 y(/*)g(Return)f(non-zero)f(if)i(ARG)f(is)h(a)g(valid)f(argument)g
+(for)g(CALLER,)g(else)g(print)192 1688 y(an)g(error)g(message)g(and)h
+(return)f(zero.)g(*/)120 1740 y(int)120 1792 y(valid_argument)f
+(\(caller,)h(arg\))239 1844 y(char)h(*caller,)e(*arg;)120
+1896 y({)168 1947 y(if)h(\(!arg)g(||)h(!*arg\))215 1999
+y({)263 2051 y(fprintf)f(\(stderr,)g("\045s:)g(Argument)g
+(required.\\n",)f(caller\);)263 2103 y(return)h(\(0\);)215
+2155 y(})168 2259 y(return)g(\(1\);)120 2311 y(})p eop
+50 51 bop 0 -58 a Fr(50)1449 b(GNU)15 b(Readline)i(Library)p
eop
-%%Page: 41 43
-42 bop 0 -83 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g(Readline)994
-b(41)120 208 y Fn(/*)24 b(The)f(user)g(wishes)g(to)h(quit)f(using)g(this)h
-(program.)46 b(Just)24 b(set)f(DONE)h(non-zero.)e(*/)120 258
-y(com_quit)h(\(arg\))239 308 y(char)h(*arg;)120 358 y({)168
-407 y(done)f(=)h(1;)168 457 y(return)f(\(0\);)120 507 y(})120
-607 y(/*)h(Function)e(which)i(tells)f(you)g(that)g(you)h(can't)f(do)h(this.)f
-(*/)120 656 y(too_dangerous)f(\(caller\))239 706 y(char)i(*caller;)120
-756 y({)168 806 y(fprintf)f(\(stderr,)382 856 y("\045s:)h(Too)f(dangerous)g
-(for)g(me)h(to)g(distribute.)46 b(Write)23 b(it)h(yourself.\\n",)382
-906 y(caller\);)120 955 y(})120 1055 y(/*)g(Return)f(non-zero)f(if)i(ARG)f
-(is)h(a)g(valid)f(argument)g(for)g(CALLER,)g(else)g(print)192
-1105 y(an)g(error)g(message)g(and)h(return)f(zero.)g(*/)120
-1155 y(int)120 1204 y(valid_argument)f(\(caller,)h(arg\))239
-1254 y(char)h(*caller,)e(*arg;)120 1304 y({)168 1354 y(if)h(\(!arg)g(||)h
-(!*arg\))215 1404 y({)263 1453 y(fprintf)f(\(stderr,)g("\045s:)g(Argument)g
-(required.\\n",)f(caller\);)263 1503 y(return)h(\(0\);)215
-1553 y(})168 1653 y(return)g(\(1\);)120 1703 y(})p eop
-%%Page: 42 44
-43 bop 0 -83 a Fo(42)1449 b(GNU)15 b(Readline)i(Library)p eop
-%%Page: 43 45
-44 bop 0 -83 a Fo(Concept)15 b(Index)1616 b(43)0 158 y Fk(Concept)16
-b(Index)0 405 y Fm(I)0 471 y Fe(in)o(teraction,)f(readline)5
-b Fd(:)j(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)17
-b Fe(1)0 579 y Fm(K)0 646 y Fe(Kill)e(ring)8 b Fd(:)f(:)f(:)g(:)h(:)f(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)21
-b Fe(3)0 704 y(Killing)16 b(text)8 b Fd(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)20 b Fe(3)1015
-405 y Fm(R)1015 471 y Fe(readline,)15 b(function)8 b Fd(:)g(:)e(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21 b Fe(15)1015 637
-y Fm(Y)1015 704 y Fe(Y)m(anking)15 b(text)t Fd(:)6 b(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)17 b
-Fe(3)p eop
-%%Page: 44 46
-45 bop 0 -83 a Fo(44)1449 b(GNU)15 b(Readline)i(Library)p eop
-%%Page: 45 47
-46 bop 0 -83 a Fo(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1337
-b(45)0 158 y Fk(F)-7 b(unction)15 b(and)g(V)-7 b(ariable)14
-b(Index)0 399 y Fm($)0 466 y Fc($else)t Fd(:)t(:)6 b(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)17 b Fe(8)0 524 y Fc($endif)9 b Fd(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)24
-b Fe(8)0 582 y Fc($if)7 b Fd(:)e(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)19
-b Fe(7)0 699 y Fm(A)0 765 y Fc(abort)11 b(\(C-g\))c Fd(:)t(:)f(:)h(:)f(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)20 b
-Fe(13)0 824 y Fc(accept-lin)o(e)10 b(\(Newline)o(,)g(Return\))c
-Fd(:)s(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)19 b Fe(9)0 882 y Fc(alphabetic)t Fd(:)s(:)7 b(:)f(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)18 b Fe(25)0
-999 y Fm(B)0 1065 y Fc(backward-c)o(ha)o(r)10 b(\(C-b\))d Fd(:)t(:)f(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)19 b Fe(8)0 1124 y Fc(backward-d)o(el)o(ete)o
-(-c)o(har)9 b(\(Rubout\))e Fd(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)23 b Fe(10)0 1182 y Fc(backward-k)o(il)o(l-l)o(in)o(e)
-10 b(\(C-x)h(Rubout\))d Fd(:)e(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)24 b Fe(11)0 1240 y Fc(backward-k)o(il)o(l-w)o(or)o(d)10
-b(\(M-DEL\))5 b Fd(:)t(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)h(:)f(:)g(:)g(:)g(:)g(:)18 b Fe(11)0 1298 y Fc(backward-w)o(or)o(d)10
-b(\(M-b\))d Fd(:)t(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)19
-b Fe(8)0 1356 y Fc(beginning-)o(of)o(-hi)o(st)o(ory)9 b(\(M-<\))d
-Fd(:)f(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)g(:)g(:)g(:)19 b Fe(9)0 1414 y Fc(beginning-)o(of)o(-li)o(ne)9
-b(\(C-a\))g Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
-f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)23 b Fe(8)0 1472 y(b)q(ell-st)o(yle)s
-Fd(:)9 b(:)d(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)16 b Fe(5)0 1590 y Fm(C)0 1656 y
-Fc(call-last-)o(kb)o(d-m)o(ac)o(ro)9 b(\(C-x)j(e\))7 b Fd(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)20
-b Fe(12)0 1714 y Fc(capitalize)o(-w)o(ord)9 b(\(M-c\))s Fd(:)t(:)d(:)g(:)h(:)
-f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)16 b Fe(11)0 1772 y Fc(clear-scre)o(en)9 b(\(C-l\))f
-Fd(:)t(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
-f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)21 b Fe(9)0
-1830 y(commen)o(t-b)q(egin)13 b Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)23 b Fe(5)0 1888 y Fc(complete)10
-b(\(TAB\))t Fd(:)s(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
-(:)16 b Fe(12)0 1947 y(completion-query-i)q(tems)d Fd(:)6 b(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)23 b Fe(6)0 2005 y Fc(completion)p 201 2005
-12 2 v 10 w(matches)6 b Fd(:)t(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)19
-b Fe(29)0 2063 y(con)o(v)o(ert-meta)t Fd(:)6 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)16 b Fe(5)0
-2180 y Fm(D)0 2247 y Fc(delete-cha)o(r)10 b(\(C-d\))e Fd(:)t(:)e(:)g(:)g(:)g
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21 b Fe(10)0 2305 y Fc(delete-hor)o(iz)o(ont)o
-(al)o(-sp)o(ace)9 b(\(\))c Fd(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)18 b Fe(11)0 2363 y
-Fc(digit-argu)o(me)o(nt)9 b(\(M-0,)i(M-1,)h(...)f(M--\))5 b
-Fd(:)g(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)18
-b Fe(12)0 2421 y Fc(digit)p 102 2421 V 12 w(p)s Fd(:)6 b(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)16
-b Fe(26)0 2479 y Fc(digit)p 102 2479 V 12 w(value)7 b Fd(:)t(:)f(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)20
-b Fe(26)0 2537 y Fc(ding)t Fd(:)5 b(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)17
-b Fe(25)0 2595 y Fc(do-upperca)o(se)o(-ve)o(rs)o(ion)9 b(\(M-a,)i(M-b,)g
-(...\))d Fd(:)d(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)21 b
-Fe(13)0 2653 y Fc(downcase-w)o(or)o(d)10 b(\(M-l\))c Fd(:)t(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)19 b Fe(11)1015 399 y Fc(dump-functi)o(on)o(s)10
-b(\(\))e Fd(:)d(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)22
-b Fe(13)1015 513 y Fm(E)1015 579 y Fe(editing-mo)q(de)t Fd(:)9
-b(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)17 b Fe(5)1015 637 y Fc(end-kbd-mac)o(ro)9 b(\(C-x)j(\)\))7
-b Fd(:)t(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)20 b Fe(12)1015 695
-y Fc(end-of-hist)o(or)o(y)10 b(\(M->\))c Fd(:)t(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)19 b Fe(9)1015 754 y Fc(end-of-line)9 b(\(C-e\))e
-Fd(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)22
-b Fe(8)1015 812 y(expand-tilde)10 b Fd(:)f(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)22 b Fe(6)1015 925
-y Fm(F)1015 992 y Fc(filename)p 1177 992 V 12 w(completi)o(on)p
-1388 992 V 11 w(function)5 b Fd(:)s(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)18 b Fe(30)1015 1050 y Fc(forward-cha)o(r)
-10 b(\(C-f\))e Fd(:)t(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21
-b Fe(8)1015 1108 y Fc(forward-sea)o(rc)o(h-h)o(ist)o(or)o(y)10
-b(\(C-s\))t Fd(:)t(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)17 b Fe(9)1015 1166 y Fc(forward-wor)o(d)10
-b(\(M-f\))e Fd(:)t(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21
-b Fe(8)1015 1224 y Fc(free)p 1097 1224 V 13 w(undo)p 1190 1224
-V 13 w(list)6 b Fd(:)t(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)19 b Fe(23)1015 1338 y Fm(H)1015 1404 y Fc(history-sea)o(rc)o(h-b)o
-(ack)o(wa)o(rd)9 b(\(\))d Fd(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)19 b Fe(9)1015 1462
-y Fc(history-sea)o(rc)o(h-f)o(orw)o(ar)o(d)10 b(\(\))e Fd(:)d(:)h(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)21
-b Fe(9)1015 1521 y(horizon)o(tal-scrol)q(l)q(-mo)q(de)t Fd(:)9
-b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)17 b Fe(5)1015 1634
-y Fm(I)1015 1701 y Fc(insert-comp)o(le)o(tio)o(ns)9 b(\(\))s
-Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)16 b Fe(12)1015 1814 y
-Fm(K)1015 1881 y Fe(k)o(eymap)6 b Fd(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)19
-b Fe(6)1015 1939 y Fc(kill-line)10 b(\(C-k\))f Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)24 b Fe(11)1015 1997 y Fc(kill-whole-)o(li)o
-(ne)10 b(\(\))d Fd(:)e(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)20
-b Fe(11)1015 2055 y Fc(kill-word)10 b(\(M-d\))f Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)24 b Fe(11)1015 2169 y Fm(L)1015
-2235 y Fc(lowercase)p 1197 2235 V 11 w(p)7 b Fd(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)20 b Fe(26)1015
-2349 y Fm(M)1015 2415 y Fe(mark-mo)q(di\014ed-li)q(nes)8 b
-Fd(:)h(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)20
-b Fe(5)1015 2473 y(meta-\015ag)11 b Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)23
-b Fe(5)1015 2587 y Fm(N)1015 2653 y Fc(next-histor)o(y)10 b(\(C-n\))e
-Fd(:)t(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fe(9)p
+51 52 bop 0 -58 a Fr(Concept)15 b(Index)1616 b(51)0 183
+y Fn(Concept)16 b(Index)0 430 y Fp(C)0 496 y Ff(command)e(editing)f
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)23 b Ff(2)0 604 y Fp(E)0 670 y Ff(editing)15 b(command)f(lines)d
+Fe(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22
+b Ff(2)0 778 y Fp(I)0 845 y Ff(initiali)q(zati)q(on)16
+b(\014le,)e(readline)d Fe(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)22
+b Ff(5)0 903 y(in)o(teraction,)15 b(readline)5 b Fe(.)j(.)e(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b Ff(1)0 1011
+y Fp(K)0 1077 y Ff(kill)e(ring)5 b Fe(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)17 b Ff(3)1015 430 y(killin)q(g)f(text)t Fe(.)6
+b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)17 b Ff(3)1015 579 y Fp(N)1015
+646 y Ff(notation,)e(readline)7 b Fe(.)h(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)20 b Ff(2)1015 795
+y Fp(R)1015 861 y Ff(readline,)15 b(function)8 b Fe(.)g(.)e(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(19)1015
+1011 y Fp(Y)1015 1077 y Ff(y)o(anking)15 b(text)7 b Fe(.)g(.)f(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)20 b Ff(3)p eop
+52 53 bop 0 -58 a Fr(52)1449 b(GNU)15 b(Readline)i(Library)p
eop
-%%Page: 46 48
-47 bop 0 -83 a Fo(46)1449 b(GNU)15 b(Readline)i(Library)0 158
-y Fc(non-increm)o(en)o(tal)o(-f)o(orw)o(ard)o(-s)o(ear)o(ch)o(-hi)o(st)o(ory)
-9 b(\(M-n\))g Fd(:)t(:)22 b Fe(9)0 216 y Fc(non-increm)o(en)o(tal)o(-r)o(eve)
-o(rse)o(-s)o(ear)o(ch)o(-hi)o(st)o(ory)9 b(\(M-p\))g Fd(:)t(:)22
-b Fe(9)0 275 y Fc(numeric)9 b Fd(:)s(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)22 b Fe(25)0
-394 y Fm(O)0 460 y Fe(output-meta)8 b Fd(:)g(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)21 b Fe(5)0
-580 y Fm(P)0 646 y Fc(possible-c)o(om)o(ple)o(ti)o(ons)9 b(\(M-?\))c
-Fd(:)g(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
-g(:)g(:)g(:)18 b Fe(12)0 704 y Fc(prefix-met)o(a)10 b(\(ESC\))e
-Fd(:)t(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21 b Fe(13)0
-762 y Fc(previous-h)o(is)o(tor)o(y)10 b(\(C-p\))f Fd(:)d(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)24 b Fe(9)0 882 y Fm(Q)0 948 y Fc(quoted-ins)o(er)o(t)10
-b(\(C-q,)h(C-v\))e Fd(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)24 b Fe(10)0 1068 y
-Fm(R)0 1134 y Fc(re-read-in)o(it)o(-fi)o(le)9 b(\(C-x)i(C-r\))c
-Fd(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
-g(:)g(:)20 b Fe(13)0 1192 y Fc(readline)8 b Fd(:)s(:)e(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)21
-b Fe(15)0 1250 y Fc(redraw-cur)o(re)o(nt-)o(li)o(ne)9 b(\(\))i
-Fd(:)6 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)24 b Fe(9)0 1308 y Fc(reverse-se)o(ar)o
-(ch-)o(hi)o(sto)o(ry)9 b(\(C-r\))t Fd(:)t(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)16 b Fe(9)0 1367
-y Fc(revert-lin)o(e)10 b(\(M-r\))e Fd(:)t(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)21 b Fe(13)0 1425 y Fc(rl)p 42 1425 12 2 v 13 w(add)p
-115 1425 V 13 w(defun)8 b Fd(:)d(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)21 b Fe(20)0 1483 y Fc(rl)p 42 1483
-V 13 w(add)p 115 1483 V 13 w(undo)8 b Fd(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)22 b Fe(23)0 1541
-y Fc(rl)p 42 1541 V 13 w(attempted)p 235 1541 V 11 w(completion)p
-445 1541 V 10 w(function)15 b Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)h(:)17 b Fe(30)0 1599 y Fc(rl)p 42 1599 V 13 w(basic)p
-155 1599 V 13 w(word)p 248 1599 V 12 w(break)p 360 1599 V 12
-w(characters)i Fd(:)6 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)23 b Fe(31)0 1657 y Fc(rl)p 42 1657 V 13 w(begin)p
-155 1657 V 13 w(undo)p 248 1657 V 12 w(group)9 b Fd(:)d(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)23 b Fe(23)0 1715 y Fc(rl)p 42 1715 V 13
-w(bind)p 135 1715 V 13 w(key)8 b Fd(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)22 b Fe(21)0 1773 y
-Fc(rl)p 42 1773 V 13 w(bind)p 135 1773 V 13 w(key)p 208 1773
-V 13 w(in)p 261 1773 V 13 w(map)6 b Fd(:)f(:)h(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)19 b Fe(21)0 1831 y Fc(rl)p 42 1831 V 13 w(clear)p
-155 1831 V 13 w(message)s Fd(:)s(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)16 b Fe(25)0 1890 y Fc(rl)p 42 1890 V 13 w(complete)7
-b Fd(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)23
-b Fe(28,)13 b(29)0 1948 y Fc(rl)p 42 1948 V 13 w(complete)p
-215 1948 V 11 w(internal)7 b Fd(:)s(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)19
-b Fe(29)0 2006 y Fc(rl)p 42 2006 V 13 w(completer)p 235 2006
-V 11 w(quote)p 346 2006 V 12 w(characters)f Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)21 b Fe(32)0 2064
-y Fc(rl)p 42 2064 V 13 w(completer)p 235 2064 V 11 w(word)p
-326 2064 V 13 w(break)p 439 2064 V 12 w(character)o(s)15 b
-Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)18 b
-Fe(31)0 2122 y Fc(rl)p 42 2122 V 13 w(completion)p 254 2122
-V 11 w(entry)p 366 2122 V 12 w(function)c Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)17 b Fe(29,)c(30)0 2180 y Fc(rl)p
-42 2180 V 13 w(completion)p 254 2180 V 11 w(query)p 366 2180
-V 12 w(items)j Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)18 b Fe(30)0 2238 y Fc(rl)p
-42 2238 V 13 w(copy)p 135 2238 V 13 w(keymap)6 b Fd(:)s(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)18 b Fe(20)0 2296
-y Fc(rl)p 42 2296 V 13 w(copy)p 135 2296 V 13 w(text)8 b Fd(:)d(:)h(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)21
-b Fe(25)0 2355 y Fc(rl)p 42 2355 V 13 w(delete)p 175 2355 V
-12 w(text)6 b Fd(:)t(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)18 b Fe(25)0 2413 y Fc(rl)p 42 2413 V 13 w(discard)p
-195 2413 V 12 w(keymap)8 b Fd(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)23 b Fe(20)0 2471 y Fc(rl)p 42 2471 V 13 w(do)p 95 2471
-V 14 w(undo)9 b Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)24 b Fe(24)0 2529 y Fc(rl)p 42 2529
-V 13 w(done)17 b Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)18 b Fe(18)0 2587 y
-Fc(rl)p 42 2587 V 13 w(end)h Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)19 b
-Fe(18)0 2645 y Fc(rl)p 42 2645 V 13 w(end)p 115 2645 V 13 w(undo)p
-208 2645 V 13 w(group)5 b Fd(:)t(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)17 b Fe(23)1015 158 y Fc(rl)p 1057 158 V 14 w(filename)p
-1231 158 V 11 w(completio)o(n)p 1441 158 V 11 w(desired)g Fd(:)7
-b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)20
-b Fe(31)1015 216 y Fc(rl)p 1057 216 V 14 w(filename)p 1231
-216 V 11 w(quoting)p 1382 216 V 11 w(desired)h Fd(:)7 b(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b
-Fe(31)1015 275 y Fc(rl)p 1057 275 V 14 w(forced)p 1191 275
-V 12 w(update)p 1323 275 V 11 w(display)t Fd(:)t(:)6 b(:)g(:)g(:)g(:)g(:)g(:)
-g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)17
-b Fe(24)1015 333 y Fc(rl)p 1057 333 V 14 w(function)p 1231
-333 V 11 w(of)p 1282 333 V 13 w(keyseq)8 b Fd(:)t(:)e(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)21 b Fe(22)1015 391 y Fc(rl)p 1057 391 V 14 w(generic)p
-1211 391 V 11 w(bind)t Fd(:)5 b(:)h(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)18 b Fe(22)1015 449 y Fc(rl)p 1057 449 V 14
-w(get)p 1131 449 V 13 w(keymap)7 b Fd(:)t(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)20 b Fe(21)1015 507 y Fc(rl)p
-1057 507 V 14 w(get)p 1131 507 V 13 w(keymap)p 1264 507 V 12
-w(by)p 1316 507 V 13 w(name)9 b Fd(:)d(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)24
-b Fe(21)1015 565 y Fc(rl)p 1057 565 V 14 w(ignore)p 1191 565
-V 12 w(completio)o(n)p 1402 565 V 11 w(duplicate)o(s)16 b Fd(:)6
-b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)19
-b Fe(31)1015 623 y Fc(rl)p 1057 623 V 14 w(ignore)p 1191 623
-V 12 w(some)p 1283 623 V 12 w(completion)o(s)p 1514 623 V 11
-w(function)13 b Fd(:)6 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)17
-b Fe(31)1015 681 y Fc(rl)p 1057 681 V 14 w(insert)p 1191 681
-V 12 w(completio)o(ns)t Fd(:)t(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)19
-b Fe(29)1015 739 y Fc(rl)p 1057 739 V 14 w(insert)p 1191 739
-V 12 w(text)6 b Fd(:)t(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)19 b Fe(25)1015 798 y Fc(rl)p 1057 798 V 14 w(instream)f
-Fd(:)6 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)22 b Fe(19)1015 856 y Fc(rl)p 1057 856 V 14 w(invoking)p
-1231 856 V 11 w(keyseqs)8 b Fd(:)s(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21
-b Fe(22)1015 914 y Fc(rl)p 1057 914 V 14 w(invoking)p 1231
-914 V 11 w(keyseqs)p 1382 914 V 11 w(in)p 1433 914 V 14 w(map)t
-Fd(:)5 b(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)18 b Fe(22)1015 972 y Fc(rl)p 1057 972 V
-14 w(kill)p 1151 972 V 12 w(text)8 b Fd(:)d(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)21 b Fe(25)1015 1030
-y Fc(rl)p 1057 1030 V 14 w(line)p 1151 1030 V 12 w(buffer)e
-Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21
-b Fe(18)1015 1088 y Fc(rl)p 1057 1088 V 14 w(make)p 1151 1088
-V 12 w(bare)p 1243 1088 V 13 w(keymap)8 b Fd(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)24 b Fe(20)1015 1146 y Fc(rl)p 1057 1146 V 14 w(make)p
-1151 1146 V 12 w(keymap)6 b Fd(:)t(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)19 b Fe(20)1015 1204 y Fc(rl)p 1057 1204
-V 14 w(mark)e Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)19 b Fe(18)1015 1263 y Fc(rl)p
-1057 1263 V 14 w(message)8 b Fd(:)s(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)21 b Fe(24)1015 1321
-y Fc(rl)p 1057 1321 V 14 w(modifying)t Fd(:)t(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)19 b Fe(24)1015
-1379 y Fc(rl)p 1057 1379 V 14 w(named)p 1171 1379 V 12 w(function)7
-b Fd(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)24 b
-Fe(22)1015 1437 y Fc(rl)p 1057 1437 V 14 w(on)p 1111 1437 V
-13 w(new)p 1184 1437 V 13 w(line)8 b Fd(:)d(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)22 b Fe(24)1015 1495 y Fc(rl)p
-1057 1495 V 14 w(outstream)17 b Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)21 b Fe(19)1015 1553 y Fc(rl)p
-1057 1553 V 14 w(parse)p 1171 1553 V 12 w(and)p 1243 1553 V
-13 w(bind)5 b Fd(:)t(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)18
-b Fe(22)1015 1611 y Fc(rl)p 1057 1611 V 14 w(pending)p 1211
-1611 V 11 w(input)e Fd(:)6 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)19 b Fe(19)1015 1669 y Fc(rl)p 1057 1669 V 14 w(point)c
-Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)17 b Fe(18)1015 1727 y Fc(rl)p 1057 1727
-V 14 w(possible)p 1231 1727 V 11 w(completio)o(ns)8 b Fd(:)e(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)25 b Fe(29)1015 1786 y Fc(rl)p 1057 1786 V 14 w(prompt)d
-Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)25 b Fe(19)1015 1844 y Fc(rl)p 1057 1844 V 14 w(readline)p
-1231 1844 V 11 w(name)16 b Fd(:)6 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)19 b Fe(19)1015 1902 y Fc(rl)p 1057 1902 V 14 w(redisplay)t
-Fd(:)t(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)19 b Fe(24)1015 1960 y Fc(rl)p 1057 1960 V 14 w(reset)p
-1171 1960 V 12 w(line)p 1263 1960 V 13 w(state)8 b Fd(:)e(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)24 b Fe(24)1015 2018 y Fc(rl)p 1057 2018
-V 14 w(reset)p 1171 2018 V 12 w(terminal)7 b Fd(:)f(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)24 b Fe(25)1015 2076 y Fc(rl)p 1057
-2076 V 14 w(set)p 1131 2076 V 13 w(keymap)7 b Fd(:)t(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)20 b Fe(21)1015
-2134 y Fc(rl)p 1057 2134 V 14 w(special)p 1211 2134 V 11 w(prefixes)g
-Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)23 b Fe(31)1015
-2192 y Fc(rl)p 1057 2192 V 14 w(startup)p 1211 2192 V 11 w(hook)18
-b Fd(:)6 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)20
-b Fe(19)1015 2250 y Fc(rl)p 1057 2250 V 14 w(terminal)p 1231
-2250 V 11 w(name)c Fd(:)6 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)19 b Fe(19)1015 2309 y Fc(rl)p 1057 2309 V 14 w(unbind)p
-1191 2309 V 12 w(key)7 b Fd(:)e(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)20 b Fe(21)1015 2367 y Fc(rl)p 1057
-2367 V 14 w(unbind)p 1191 2367 V 12 w(key)p 1263 2367 V 13
-w(in)p 1316 2367 V 13 w(map)t Fd(:)t(:)6 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-17 b Fe(21)1015 2521 y Fm(S)1015 2587 y Fc(self-insert)9 b(\(a,)j(b,)g(A,)g
-(1,)g(!,)g(...\))6 b Fd(:)f(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)19 b Fe(10)1015 2645 y(sho)o(w-all-if-am)o(bigu)q(ous)9
-b Fd(:)g(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)22 b Fe(6)p
+53 54 bop 0 -58 a Fr(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1337
+b(53)0 183 y Fn(F)-7 b(unction)15 b(and)g(V)-7 b(ariable)14
+b(Index)0 424 y Fp(\()0 490 y Fd(\(int)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)17 b Ff(31)0 608 y Fp(A)0 674
+y Fd(abort)11 b(\(C-g\))c Fe(.)t(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)20 b Ff(17)0
+732 y Fd(accept-lin)o(e)10 b(\(Newline)o(,)g(Return\))5
+b Fe(.)s(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)18 b Ff(12)0 790 y Fd(alphabetic)t Fe(.)s(.)7
+b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)18 b Ff(31)0 908 y Fp(B)0 974 y Fd(backward-c)o(ha)o(r)10
+b(\(C-b\))c Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
+b Ff(12)0 1032 y Fd(backward-d)o(el)o(ete)o(-c)o(har)9
+b(\(Rubout\))e Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)23 b Ff(14)0 1090 y Fd(backward-k)o(il)o(l-l)o(in)o
+(e)10 b(\(C-x)h(Rubout\))d Fe(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(15)0 1148 y Fd(backward-k)o(il)o(l-w)o
+(or)o(d)10 b(\(M-DEL\))5 b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b Ff(15)0
+1207 y Fd(backward-w)o(or)o(d)10 b(\(M-b\))c Fe(.)t(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(12)0 1265 y Fd(beginning-)o(of)o(-hi)o
+(st)o(ory)9 b(\(M-<\))c Fe(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b Ff(13)0
+1323 y Fd(beginning-)o(of)o(-li)o(ne)9 b(\(C-a\))g Fe(.)c(.)h(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)22 b Ff(12)0 1381 y(b)q(ell-st)o(yle)s Fe(.)9
+b(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(5)0 1498 y Fp(C)0
+1565 y Fd(call-last-)o(kb)o(d-m)o(ac)o(ro)9 b(\(C-x)j(e\))7
+b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)20 b Ff(17)0 1623 y Fd(capitalize)o(-w)o(ord)9
+b(\(M-c\))s Fe(.)t(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16
+b Ff(14)0 1681 y Fd(character-)o(se)o(arc)o(h)10 b(\(C-]\))e
+Fe(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23 b Ff(17)0 1739
+y Fd(character-)o(se)o(arc)o(h-)o(bac)o(kwa)o(rd)9 b(\(M-C-]\))c
+Fe(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18
+b Ff(18)0 1797 y Fd(clear-scre)o(en)9 b(\(C-l\))e Fe(.)t(.)f(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(12)0 1855
+y(commen)o(t-b)q(egin)13 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(5)0 1913
+y Fd(complete)10 b(\(TAB\))t Fe(.)s(.)c(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)16 b Ff(16)0 1972 y(completion-query-i)
+q(tems)d Fe(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23
+b Ff(6)0 2030 y Fd(completion)p 201 2030 12 2 v 10 w(matches)6
+b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19
+b Ff(36)0 2088 y(con)o(v)o(ert-meta)t Fe(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)16
+b Ff(6)0 2146 y Fd(copy-backw)o(ar)o(d-w)o(or)o(d)10
+b(\(\))s Fe(.)5 b(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16
+b Ff(15)0 2204 y Fd(copy-forwa)o(rd)o(-wo)o(rd)9 b(\(\))t
+Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)17 b Ff(15)0
+2262 y Fd(copy-regio)o(n-)o(as-)o(ki)o(ll)9 b(\(\))h
+Fe(.)c(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23 b Ff(15)0 2379
+y Fp(D)0 2446 y Fd(delete-cha)o(r)10 b(\(C-d\))e Fe(.)t(.)e(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(14)0 2504
+y Fd(delete-hor)o(iz)o(ont)o(al)o(-sp)o(ace)9 b(\(\))c
+Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)18 b Ff(15)0 2562 y Fd(digit-argu)o(me)o(nt)9
+b(\(M-0,)i(M-1,)h(...)f(M--\))5 b Fe(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)18 b Ff(16)0 2620 y Fd(digit)p 102
+2620 V 12 w(p)s Fe(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16
+b Ff(32)0 2678 y Fd(digit)p 102 2678 V 12 w(value)7 b
+Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)20 b Ff(32)1015 424 y Fd(ding)t Fe(.)5
+b(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(31)1015
+482 y(disable-compl)q(eti)q(on)9 b Fe(.)g(.)d(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)21 b Ff(6)1015 540 y
+Fd(do-uppercas)o(e-)o(ver)o(sio)o(n)10 b(\(M-a,)g(M-b,)i(M-)p
+Fe(x)p Fd(,)g Fc(:)6 b(:)g(:)g Fd(\))j Fe(.)c(.)h(.)g(.)g(.)g(.)22
+b Ff(17)1015 598 y Fd(downcase-wo)o(rd)9 b(\(M-l\))d
+Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)19
+b Ff(14)1015 656 y Fd(dump-functi)o(on)o(s)10 b(\(\))e
+Fe(.)d(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22
+b Ff(18)1015 715 y Fd(dump-macros)9 b(\(\))t Fe(.)c(.)h(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b
+Ff(18)1015 773 y Fd(dump-variab)o(le)o(s)10 b(\(\))e
+Fe(.)d(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22
+b Ff(18)1015 890 y Fp(E)1015 956 y Ff(editing-mo)q(de)t
+Fe(.)9 b(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(6)1015 1014 y(enable-k)o(eypad)d
+Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)24 b Ff(6)1015 1072 y Fd(end-kbd-mac)o(ro)9
+b(\(C-x)j(\)\))7 b Fe(.)t(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20
+b Ff(16)1015 1131 y Fd(end-of-hist)o(or)o(y)10 b(\(M->\))t
+Fe(.)t(.)d(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(13)1015
+1189 y Fd(end-of-line)9 b(\(C-e\))f Fe(.)t(.)f(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(12)1015 1247 y Fd(exchange-po)o(in)o
+(t-a)o(nd-)o(ma)o(rk)9 b(\(C-x)j(C-x\))c Fe(.)d(.)h(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(17)1015 1305 y(expand-tilde)10
+b Fe(.)f(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(6)1015 1422 y Fp(F)1015
+1488 y Fd(filename)p 1177 1488 V 12 w(completi)o(on)p
+1388 1488 V 11 w(function)5 b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b Ff(36)1015
+1547 y Fd(forward-cha)o(r)10 b(\(C-f\))d Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)20 b Ff(12)1015 1605 y Fd(forward-sea)o(rc)o
+(h-h)o(ist)o(or)o(y)10 b(\(C-s\))f Fe(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)25 b Ff(13)1015
+1663 y Fd(forward-wor)o(d)10 b(\(M-f\))d Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)20 b Ff(12)1015 1721 y Fd(free)p
+1097 1721 V 13 w(undo)p 1190 1721 V 13 w(list)6 b Fe(.)t(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
+b Ff(29)1015 1838 y Fp(H)1015 1904 y Fd(history-sea)o(rc)o(h-b)o(ack)o
+(wa)o(rd)9 b(\(\))c Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(13)1015
+1963 y Fd(history-sea)o(rc)o(h-f)o(orw)o(ar)o(d)10 b(\(\))d
+Fe(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(13)1015 2021 y(horizon)o(tal-scrol)q(l)q
+(-mo)q(de)t Fe(.)9 b(.)d(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)17
+b Ff(6)1015 2138 y Fp(I)1015 2204 y Ff(input-meta)s Fe(.)8
+b(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)16 b Ff(7)1015 2262 y Fd(insert-comm)o(en)o(t)
+10 b(\(M-#\))t Fe(.)t(.)d(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18
+b Ff(18)1015 2320 y Fd(insert-comp)o(le)o(tio)o(ns)9
+b(\(M-*\))f Fe(.)t(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)21 b Ff(16)1015
+2438 y Fp(K)1015 2504 y Ff(k)o(eymap)6 b Fe(.)h(.)f(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)19 b Ff(6)1015 2562 y Fd(kill-line)10 b(\(C-k\))f
+Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)24
+b Ff(14)1015 2620 y Fd(kill-region)9 b(\(\))t Fe(.)c(.)h(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17
+b Ff(15)1015 2678 y Fd(kill-whole-)o(li)o(ne)10 b(\(\))d
+Fe(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)20
+b Ff(15)p eop
+54 55 bop 0 -58 a Fr(54)1449 b(GNU)15 b(Readline)i(Library)0
+183 y Fd(kill-word)9 b(\(M-d\))g Fe(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(15)0 298 y Fp(L)0
+364 y Fd(lowercase)p 182 364 12 2 v 11 w(p)7 b Fe(.)e(.)h(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20
+b Ff(32)0 479 y Fp(M)0 545 y Ff(mark-mo)q(di\014ed-lin)q(es)7
+b Fe(.)i(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20
+b Ff(7)0 603 y(meta-\015ag)10 b Fe(.)c(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)22
+b Ff(7)0 718 y Fp(N)0 784 y Fd(next-histo)o(ry)9 b(\(C-n\))e
+Fe(.)t(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20
+b Ff(13)0 842 y Fd(non-increm)o(en)o(tal)o(-f)o(orw)o(ard)o(-s)o(ear)o
+(ch)o(-hi)o(st)o(ory)9 b(\(M-n\))82 900 y Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)18 b Ff(13)0 958 y Fd(non-increm)o(en)o(tal)o(-r)o
+(eve)o(rse)o(-s)o(ear)o(ch)o(-hi)o(st)o(ory)9 b(\(M-p\))82
+1017 y Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18
+b Ff(13)0 1075 y Fd(numeric)9 b Fe(.)s(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22
+b Ff(31)0 1189 y Fp(O)0 1256 y Ff(output-meta)8 b Fe(.)g(.)e(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+21 b Ff(7)0 1370 y Fp(P)0 1436 y Fd(possible-c)o(om)o(ple)o(ti)o(ons)9
+b(\(M-?\))c Fe(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b Ff(16)0 1495 y Fd(prefix-met)o(a)10
+b(\(ESC\))e Fe(.)t(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+21 b Ff(17)0 1553 y Fd(previous-h)o(is)o(tor)o(y)10 b(\(C-p\))e
+Fe(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23 b Ff(12)0 1667
+y Fp(Q)0 1734 y Fd(quoted-ins)o(er)o(t)10 b(\(C-q,)h(C-v\))e
+Fe(.)d(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(14)0 1848 y Fp(R)0
+1914 y Fd(re-read-in)o(it)o(-fi)o(le)9 b(\(C-x)i(C-r\))c
+Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)20 b Ff(17)0 1973 y Fd(readline)8 b Fe(.)s(.)e(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)21 b Ff(19)0 2031 y Fd(redraw-cur)o(re)o(nt-)o(li)o(ne)9
+b(\(\))h Fe(.)c(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23 b Ff(12)0
+2089 y Fd(reverse-se)o(ar)o(ch-)o(hi)o(sto)o(ry)9 b(\(C-r\))h
+Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)24 b Ff(13)0 2147 y Fd(revert-lin)o(e)10 b(\(M-r\))e
+Fe(.)t(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)21
+b Ff(17)0 2205 y Fd(rl)p 42 2205 V 13 w(add)p 115 2205
+V 13 w(defun)8 b Fe(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(25)0 2263 y Fd(rl)p
+42 2263 V 13 w(add)p 115 2263 V 13 w(undo)8 b Fe(.)e(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22
+b Ff(29)0 2321 y Fd(rl)p 42 2321 V 13 w(attempted)p 235
+2321 V 11 w(completion)p 445 2321 V 10 w(function)15
+b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)17
+b Ff(37)0 2379 y Fd(rl)p 42 2379 V 13 w(basic)p 155 2379
+V 13 w(quote)p 268 2379 V 12 w(character)o(s)e Fe(.)6
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)18 b Ff(38)0 2438 y Fd(rl)p 42 2438
+V 13 w(basic)p 155 2438 V 13 w(word)p 248 2438 V 12 w(break)p
+360 2438 V 12 w(characters)h Fe(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(38)0 2496 y Fd(rl)p
+42 2496 V 13 w(begin)p 155 2496 V 13 w(undo)p 248 2496
+V 12 w(group)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23
+b Ff(28)0 2554 y Fd(rl)p 42 2554 V 13 w(bind)p 135 2554
+V 13 w(key)8 b Fe(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 b Ff(26)0 2612 y Fd(rl)p
+42 2612 V 13 w(bind)p 135 2612 V 13 w(key)p 208 2612
+V 13 w(in)p 261 2612 V 13 w(map)6 b Fe(.)f(.)h(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(26)0 2670 y Fd(rl)p 42
+2670 V 13 w(binding)p 195 2670 V 12 w(keymap)14 b Fe(.)6
+b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17
+b Ff(24)1015 183 y Fd(rl)p 1057 183 V 14 w(callback)p
+1231 183 V 11 w(handler)p 1382 183 V 11 w(install)9 b
+Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)22 b Ff(32)1015 241 y Fd(rl)p 1057 241
+V 14 w(callback)p 1231 241 V 11 w(handler)p 1382 241
+V 11 w(remove)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)23 b Ff(33)1015 299
+y Fd(rl)p 1057 299 V 14 w(callback)p 1231 299 V 11 w(read)p
+1322 299 V 12 w(char)8 b Fe(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)21
+b Ff(32)1015 358 y Fd(rl)p 1057 358 V 14 w(char)p 1151
+358 V 12 w(is)p 1203 358 V 14 w(quoted)p 1337 358 V 12
+w(p)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20
+b Ff(37)1015 416 y Fd(rl)p 1057 416 V 14 w(clear)p 1171
+416 V 12 w(message)s Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)16 b Ff(30)1015 474 y Fd(rl)p 1057
+474 V 14 w(complete)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(35,)13 b(36)1015 532
+y Fd(rl)p 1057 532 V 14 w(complete)p 1231 532 V 11 w(internal)6
+b Fe(.)s(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b
+Ff(35)1015 590 y Fd(rl)p 1057 590 V 14 w(completer)p
+1250 590 V 10 w(quote)p 1361 590 V 13 w(character)o(s)e
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)22 b Ff(38)1015 648 y Fd(rl)p 1057 648 V 14 w(completer)p
+1250 648 V 10 w(word)p 1341 648 V 13 w(break)p 1454 648
+V 12 w(characters)14 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)18 b Ff(38)1015 706 y Fd(rl)p 1057 706 V 14 w(completio)o(n)p
+1270 706 V 11 w(append)p 1401 706 V 12 w(character)e
+Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+20 b Ff(39)1015 764 y Fd(rl)p 1057 764 V 14 w(completio)o(n)p
+1270 764 V 11 w(entry)p 1381 764 V 12 w(function)14 b
+Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18
+b Ff(35,)13 b(37)1015 823 y Fd(rl)p 1057 823 V 14 w(completio)o(n)p
+1270 823 V 11 w(query)p 1381 823 V 12 w(items)j Fe(.)6
+b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)18 b Ff(38)1015 881 y Fd(rl)p 1057
+881 V 14 w(copy)p 1151 881 V 12 w(keymap)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b
+Ff(25)1015 939 y Fd(rl)p 1057 939 V 14 w(copy)p 1151
+939 V 12 w(text)8 b Fe(.)d(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)21 b Ff(30)1015 997 y
+Fd(rl)p 1057 997 V 14 w(delete)p 1191 997 V 12 w(text)6
+b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)19 b Ff(30)1015 1055 y Fd(rl)p 1057 1055 V 14
+w(directory)p 1250 1055 V 10 w(completion)p 1461 1055
+V 11 w(hook)i Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(40)1015 1113 y Fd(rl)p
+1057 1113 V 14 w(discard)p 1211 1113 V 11 w(keymap)8
+b Fe(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24
+b Ff(25)1015 1171 y Fd(rl)p 1057 1171 V 14 w(do)p 1111
+1171 V 13 w(undo)9 b Fe(.)d(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(29)1015
+1229 y Fd(rl)p 1057 1229 V 14 w(done)17 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)19 b Ff(23)1015 1287 y Fd(rl)p 1057 1287 V 14
+w(end)f Fe(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(22)1015
+1346 y Fd(rl)p 1057 1346 V 14 w(end)p 1131 1346 V 13
+w(undo)p 1224 1346 V 12 w(group)5 b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(29)1015 1404 y Fd(rl)p
+1057 1404 V 14 w(event)p 1171 1404 V 12 w(hook)i Fe(.)6
+b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+22 b Ff(24)1015 1462 y Fd(rl)p 1057 1462 V 14 w(executing)p
+1250 1462 V 10 w(keymap)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)23 b Ff(24)1015 1520 y Fd(rl)p 1057 1520 V 14 w(filename)p
+1231 1520 V 11 w(completio)o(n)p 1441 1520 V 11 w(desired)17
+b Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)20 b Ff(39)1015 1578 y Fd(rl)p 1057 1578 V 14 w(filename)p
+1231 1578 V 11 w(dequoting)p 1421 1578 V 11 w(function)c
+Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+20 b Ff(37)1015 1636 y Fd(rl)p 1057 1636 V 14 w(filename)p
+1231 1636 V 11 w(quote)p 1342 1636 V 12 w(characters)f
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)23 b Ff(38)1015 1694 y Fd(rl)p 1057 1694 V 14
+w(filename)p 1231 1694 V 11 w(quoting)p 1382 1694 V 11
+w(desired)e Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)24 b Ff(39)1015 1752 y Fd(rl)p
+1057 1752 V 14 w(filename)p 1231 1752 V 11 w(quoting)p
+1382 1752 V 11 w(function)c Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(37)1015 1810
+y Fd(rl)p 1057 1810 V 14 w(forced)p 1191 1810 V 12 w(update)p
+1323 1810 V 11 w(display)t Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)17
+b Ff(30)1015 1869 y Fd(rl)p 1057 1869 V 14 w(function)p
+1231 1869 V 11 w(dumper)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)22 b Ff(28)1015 1927 y Fd(rl)p 1057 1927
+V 14 w(function)p 1231 1927 V 11 w(of)p 1282 1927 V 13
+w(keyseq)8 b Fe(.)t(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)21
+b Ff(27)1015 1985 y Fd(rl)p 1057 1985 V 14 w(generic)p
+1211 1985 V 11 w(bind)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(26)1015 2043 y Fd(rl)p
+1057 2043 V 14 w(get)p 1131 2043 V 13 w(keymap)7 b Fe(.)t(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20
+b Ff(25)1015 2101 y Fd(rl)p 1057 2101 V 14 w(get)p 1131
+2101 V 13 w(keymap)p 1264 2101 V 12 w(by)p 1316 2101
+V 13 w(name)9 b Fe(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24
+b Ff(26)1015 2159 y Fd(rl)p 1057 2159 V 14 w(get)p 1131
+2159 V 13 w(keymap)p 1264 2159 V 12 w(name)s Fe(.)t(.)7
+b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17
+b Ff(26)1015 2217 y Fd(rl)p 1057 2217 V 14 w(getc)s Fe(.)5
+b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(31)1015 2275
+y Fd(rl)p 1057 2275 V 14 w(getc)p 1151 2275 V 12 w(function)e
+Fe(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
+b Ff(24)1015 2334 y Fd(rl)p 1057 2334 V 14 w(ignore)p
+1191 2334 V 12 w(completio)o(n)p 1402 2334 V 11 w(duplicate)o(s)d
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)19
+b Ff(39)1015 2392 y Fd(rl)p 1057 2392 V 14 w(ignore)p
+1191 2392 V 12 w(some)p 1283 2392 V 12 w(completion)o(s)p
+1514 2392 V 11 w(function)13 b Fe(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)17 b Ff(39)1015 2450 y Fd(rl)p 1057 2450 V
+14 w(inhibit)p 1211 2450 V 11 w(completion)g Fe(.)6 b(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)21 b Ff(39)1015 2508 y Fd(rl)p 1057 2508
+V 14 w(initializ)o(e)t Fe(.)s(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)17 b Ff(31)1015 2566
+y Fd(rl)p 1057 2566 V 14 w(insert)p 1191 2566 V 12 w(completio)o(ns)t
+Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(36)1015
+2624 y Fd(rl)p 1057 2624 V 14 w(insert)p 1191 2624 V
+12 w(text)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)19 b Ff(30)p eop
+55 56 bop 0 -58 a Fr(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1337
+b(55)0 183 y Fd(rl)p 42 183 12 2 v 13 w(instream)19 b
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)22 b Ff(23)0 241 y Fd(rl)p 42 241 V 13
+w(invoking)p 215 241 V 11 w(keyseqs)8 b Fe(.)t(.)e(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)21 b Ff(27)0 299 y Fd(rl)p 42 299
+V 13 w(invoking)p 215 299 V 11 w(keyseqs)p 366 299 V
+12 w(in)p 418 299 V 13 w(map)t Fe(.)5 b(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17
+b Ff(27)0 358 y Fd(rl)p 42 358 V 13 w(kill)p 135 358
+V 13 w(text)8 b Fe(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(30)0 416 y Fd(rl)p
+42 416 V 13 w(library)p 195 416 V 12 w(version)g Fe(.)6
+b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(23)0
+474 y Fd(rl)p 42 474 V 13 w(line)p 135 474 V 13 w(buffer)18
+b Fe(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)21 b Ff(22)0 532 y Fd(rl)p 42 532 V 13 w(list)p 135
+532 V 13 w(funmap)p 268 532 V 12 w(names)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)22 b Ff(28)0 590 y Fd(rl)p 42 590
+V 13 w(make)p 135 590 V 13 w(bare)p 228 590 V 13 w(keymap)8
+b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23
+b Ff(25)0 648 y Fd(rl)p 42 648 V 13 w(make)p 135 648
+V 13 w(keymap)6 b Fe(.)s(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(25)0 706 y Fd(rl)p 42
+706 V 13 w(mark)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)18
+b Ff(22)0 764 y Fd(rl)p 42 764 V 13 w(message)8 b Fe(.)t(.)e(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+21 b Ff(30)0 823 y Fd(rl)p 42 823 V 13 w(modifying)5
+b Fe(.)s(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)18 b Ff(29)0 881 y Fd(rl)p 42 881 V 13
+w(named)p 155 881 V 13 w(function)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)23 b Ff(27)0 939 y Fd(rl)p
+42 939 V 13 w(on)p 95 939 V 14 w(new)p 169 939 V 13 w(line)8
+b Fe(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)21 b Ff(30)0 997 y Fd(rl)p 42 997 V 13 w(outstream)c
+Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)20 b Ff(23)0 1055 y Fd(rl)p 42 1055 V 13 w(parse)p
+155 1055 V 13 w(and)p 228 1055 V 13 w(bind)5 b Fe(.)t(.)h(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)17 b Ff(27)0
+1113 y Fd(rl)p 42 1113 V 13 w(pending)p 195 1113 V 12
+w(input)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)18 b Ff(23)0 1171 y Fd(rl)p 42 1171 V 13 w(point)d
+Fe(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(22)0 1229 y Fd(rl)p
+42 1229 V 13 w(possible)p 215 1229 V 11 w(completions)7
+b Fe(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(36)0 1287 y Fd(rl)p
+42 1287 V 13 w(prompt)e Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)24 b Ff(23)0
+1346 y Fd(rl)p 42 1346 V 13 w(read)p 135 1346 V 13 w(init)p
+228 1346 V 13 w(file)5 b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)17 b Ff(27)0 1404 y Fd(rl)p 42 1404 V
+13 w(read)p 135 1404 V 13 w(key)8 b Fe(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22
+b Ff(31)0 1462 y Fd(rl)p 42 1462 V 13 w(readline)p 215
+1462 V 11 w(name)17 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)18 b Ff(23)0 1520 y Fd(rl)p 42 1520 V
+13 w(redisplay)5 b Fe(.)s(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)18 b Ff(29)0 1578 y Fd(rl)p
+42 1578 V 13 w(redisplay)p 235 1578 V 11 w(function)f
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 b Ff(24)0
+1636 y Fd(rl)p 42 1636 V 13 w(reset)p 155 1636 V 13 w(line)p
+248 1636 V 12 w(state)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)23 b Ff(30)0 1694 y Fd(rl)p 42 1694 V 13 w(reset)p
+155 1694 V 13 w(terminal)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)23 b Ff(31)0 1752 y Fd(rl)p 42 1752 V
+13 w(set)p 115 1752 V 13 w(keymap)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(26)0
+1810 y Fd(rl)p 42 1810 V 13 w(special)p 195 1810 V 12
+w(prefixes)f Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23
+b Ff(38)0 1869 y Fd(rl)p 42 1869 V 13 w(startup)p 195
+1869 V 12 w(hook)18 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)19 b Ff(23)0 1927 y Fd(rl)p 42 1927
+V 13 w(stuff)p 155 1927 V 13 w(char)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b
+Ff(31)0 1985 y Fd(rl)p 42 1985 V 13 w(terminal)p 215
+1985 V 11 w(name)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)18 b Ff(23)0 2043 y Fd(rl)p 42 2043 V 13
+w(unbind)p 175 2043 V 12 w(key)7 b Fe(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(26)1015
+183 y Fd(rl)p 1057 183 V 14 w(unbind)p 1191 183 V 12
+w(key)p 1263 183 V 13 w(in)p 1316 183 V 13 w(map)t Fe(.)t(.)6
+b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(26)1015
+291 y Fp(S)1015 358 y Fd(self-insert)9 b(\(a,)j(b,)g(A,)g(1,)g(!,)g
+(...\))6 b Fe(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)19 b Ff(14)1015 416 y Fd(set-mark)10 b(\(C-@\))t
+Fe(.)t(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)17 b Ff(17)1015 474 y(sho)o(w-all-if-am)o(bigu)q(ous)9
+b Fe(.)g(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22
+b Ff(7)1015 532 y Fd(start-kbd-m)o(ac)o(ro)10 b(\(C-x)h(\(\))t
+Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)17 b Ff(16)1015 640
+y Fp(T)1015 706 y Fd(tab-insert)9 b(\(M-TAB\))e Fe(.)t(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)20 b Ff(14)1015 764 y
+Fd(tilde-expan)o(d)10 b(\(M-~\))d Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)20 b Ff(17)1015 823 y Fd(to)p 1057
+823 V 14 w(lower)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b
+Ff(32)1015 881 y Fd(to)p 1057 881 V 14 w(upper)8 b Fe(.)f(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)24 b Ff(32)1015 939 y Fd(transpose-c)o(ha)o(rs)10
+b(\(C-t\))s Fe(.)t(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16
+b Ff(14)1015 997 y Fd(transpose-w)o(or)o(ds)10 b(\(M-t\))s
+Fe(.)t(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(14)1015
+1105 y Fp(U)1015 1171 y Fd(undo)c(\(C-)p 1169 1171 V
+13 w(,)g(C-x)g(C-u\))7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)20 b Ff(17)1015 1229 y Fd(universal-a)o(rg)o(ume)o(nt)9
+b(\(\))s Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16
+b Ff(16)1015 1287 y Fd(unix-line-d)o(is)o(car)o(d)10
+b(\(C-u\))f Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(15)1015
+1346 y Fd(unix-word-r)o(ub)o(out)9 b(\(C-w\))g Fe(.)d(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)24 b Ff(15)1015 1404 y Fd(upcase-word)9 b(\(M-u\))f
+Fe(.)t(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22
+b Ff(14)1015 1462 y Fd(uppercase)p 1197 1462 V 11 w(p)7
+b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)20 b Ff(32)1015 1520 y Fd(username)p
+1177 1520 V 12 w(completi)o(on)p 1388 1520 V 11 w(function)5
+b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)18 b Ff(36)1015 1628 y Fp(V)1015 1694 y Ff(visible-stats)6
+b Fe(.)j(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)18 b Ff(7)1015 1802 y Fp(Y)1015
+1869 y Fd(yank)12 b(\(C-y\))d Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22
+b Ff(15)1015 1927 y Fd(yank-last-a)o(rg)9 b(\(M-.,)i(M-)p
+1436 1927 V 13 w(\))6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
+b Ff(13)1015 1985 y Fd(yank-nth-ar)o(g)10 b(\(M-C-y\))t
+Fe(.)s(.)d(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(13)1015
+2043 y Fd(yank-pop)10 b(\(M-y\))t Fe(.)t(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(15)p eop
+56 57 bop 0 -58 a Fr(56)1449 b(GNU)15 b(Readline)i(Library)p
eop
-%%Page: 47 49
-48 bop 0 -83 a Fo(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1337
-b(47)0 158 y Fc(start-kbd-)o(ma)o(cro)9 b(\(C-x)i(\(\))t Fd(:)6
-b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)17 b Fe(12)0 266 y Fm(T)0 333 y Fc(tab-insert)9
-b(\(M-TAB\))e Fd(:)s(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)20
-b Fe(10)0 391 y Fc(tilde-expa)o(nd)9 b(\(M-~\))e Fd(:)t(:)f(:)g(:)h(:)f(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)20 b Fe(13)0 449 y Fc(to)p 42 449 12
-2 v 13 w(lower)9 b Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)23 b Fe(26)0 507 y Fc(to)p
-42 507 V 13 w(upper)9 b Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)23 b Fe(26)0 565 y Fc(transpose-)o(ch)
-o(ars)9 b(\(C-t\))s Fd(:)t(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)16
-b Fe(10)0 623 y Fc(transpose-)o(wo)o(rds)9 b(\(M-t\))s Fd(:)t(:)d(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)16 b Fe(10)0 731 y Fm(U)0 798 y Fc(undo)11 b(\(C-)p
-153 798 V 13 w(,)i(C-x)e(C-u\))c Fd(:)e(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)20 b Fe(13)1015 158 y Fc(universal-a)o(rg)o(ume)o(nt)9
-b(\(\))s Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)16 b Fe(12)1015
-216 y Fc(unix-line-d)o(is)o(car)o(d)10 b(\(C-u\))f Fd(:)t(:)d(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)22
-b Fe(11)1015 275 y Fc(unix-word-r)o(ub)o(out)9 b(\(C-w\))g
-Fd(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)24 b Fe(11)1015 333 y Fc(upcase-word)9
-b(\(M-u\))f Fd(:)t(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)
-g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)22
-b Fe(10)1015 391 y Fc(uppercase)p 1197 391 V 11 w(p)7 b Fd(:)f(:)g(:)g(:)g(:)
-g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)20
-b Fe(26)1015 449 y Fc(username)p 1177 449 V 12 w(completi)o(on)p
-1388 449 V 11 w(function)5 b Fd(:)s(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)18 b Fe(30)1015 557 y Fm(Y)1015
-623 y Fc(yank)12 b(\(C-y\))d Fd(:)t(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)22 b Fe(11)1015 681
-y Fc(yank-last-a)o(rg)9 b(\(M-.,)i(M-)p 1436 681 V 13 w(\))6
-b Fd(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)g(:)g(:)g(:)g(:)19 b Fe(10)1015 739 y Fc(yank-nth-ar)o(g)10
-b(\(M-C-y\))t Fd(:)s(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)18 b
-Fe(10)1015 798 y Fc(yank-pop)10 b(\(M-y\))t Fd(:)t(:)c(:)g(:)g(:)g(:)g(:)g(:)
-g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)17 b Fe(11)p eop
-%%Page: 48 50
-49 bop 0 -83 a Fo(48)1449 b(GNU)15 b(Readline)i(Library)p eop
-%%Page: -1 51
-50 bop 1937 -83 a Fo(i)0 158 y Fk(T)-7 b(able)15 b(of)g(Con)n(ten)n(ts)0
-333 y Fm(1)67 b(Command)22 b(Line)i(Editing)13 b Fb(:)f(:)e(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)36 b Fm(1)149 411 y Fo(1.1)45 b(In)o(tro)q(duction)16
-b(to)f(Line)h(Editing)5 b Fa(:)k(:)e(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)20 b Fo(1)149 473 y(1.2)45 b(Readline)17
-b(In)o(teraction)6 b Fa(:)i(:)g(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)21
-b Fo(1)299 535 y(1.2.1)44 b(Readline)17 b(Bare)e(Essen)o(tials)f
-Fa(:)7 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)27
-b Fo(2)299 597 y(1.2.2)44 b(Readline)17 b(Mo)o(v)o(emen)o(t)d(Commands)f
-Fa(:)7 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)27 b Fo(2)299 660 y(1.2.3)44
-b(Readline)17 b(Killing)h(Commands)9 b Fa(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)23 b Fo(3)299 722 y(1.2.4)44 b(Readline)17 b(Argumen)o(ts)5
-b Fa(:)i(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)19 b Fo(4)149 784 y(1.3)45 b(Readline)17 b(Init)g(File)d
-Fa(:)8 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)28 b Fo(4)299
-846 y(1.3.1)44 b(Readline)17 b(Init)f(Syn)o(tax)11 b Fa(:)d(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)25 b Fo(4)299
-909 y(1.3.2)44 b(Conditional)16 b(Init)g(Constructs)d Fa(:)7
-b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)27 b Fo(7)149 971 y(1.4)45
-b(Bindable)17 b(Readline)h(Commands)9 b Fa(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
-g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)23 b Fo(8)299 1033 y(1.4.1)44
-b(Commands)14 b(F)l(or)h(Mo)o(ving)t Fa(:)7 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)h(:)f(:)18 b Fo(8)299 1095 y(1.4.2)44 b(Commands)14
-b(F)l(or)h(Manipulating)i(The)e(History)9 b Fa(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)23 b Fo(9)299 1158 y(1.4.3)44
-b(Commands)14 b(F)l(or)h(Changing)h(T)l(ext)10 b Fa(:)c(:)i(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)25 b Fo(10)299 1220 y(1.4.4)44 b(Killing)18 b(And)e(Y)l(anking)10
-b Fa(:)e(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)25
-b Fo(11)299 1282 y(1.4.5)44 b(Sp)q(ecifying)17 b(Numeric)f(Argumen)o(ts)8
-b Fa(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)22 b Fo(12)299 1345 y(1.4.6)44
-b(Letting)15 b(Readline)j(T)o(yp)q(e)d(F)l(or)g(Y)l(ou)5 b
-Fa(:)i(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)
-g(:)g(:)g(:)h(:)f(:)g(:)g(:)20 b Fo(12)299 1407 y(1.4.7)44
-b(Keyb)q(oard)15 b(Macros)9 b Fa(:)e(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)24 b Fo(12)299 1469 y(1.4.8)44
-b(Some)15 b(Miscellaneous)i(Commands)11 b Fa(:)d(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)27
-b Fo(13)149 1531 y(1.5)45 b(Readline)17 b(vi)f(Mo)q(de)d Fa(:)7
-b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)27 b Fo(13)0 1656 y Fm(2)67
-b(Programming)23 b(with)g(GNU)f(Readline)d Fb(:)10 b(:)g(:)g(:)h(:)f(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)41 b Fm(15)149 1734 y Fo(2.1)k(Basic)16
-b(Beha)o(vior)9 b Fa(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)23
-b Fo(15)149 1796 y(2.2)45 b(Custom)14 b(F)l(unctions)6 b Fa(:)j(:)e(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)21 b Fo(17)299 1858 y(2.2.1)44 b(The)15
-b(F)l(unction)h(T)o(yp)q(e)e Fa(:)7 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fo(17)299 1920 y(2.2.2)44 b(W)l(riting)16
-b(a)e(New)i(F)l(unction)6 b Fa(:)h(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
-h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)20 b Fo(18)149 1983 y(2.3)45 b(Readline)17 b(Con)o(v)o(enience)g(F)l
-(unctions)8 b Fa(:)g(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)23
-b Fo(19)299 2045 y(2.3.1)44 b(Naming)15 b(a)g(F)l(unction)t
-Fa(:)9 b(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f
-(:)19 b Fo(19)299 2107 y(2.3.2)44 b(Selecting)17 b(a)e(Keymap)8
-b Fa(:)g(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)23
-b Fo(20)299 2170 y(2.3.3)44 b(Binding)17 b(Keys)11 b Fa(:)d(:)f(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)26
-b Fo(21)299 2232 y(2.3.4)44 b(Asso)q(ciating)16 b(F)l(unction)g(Names)f(and)g
-(Bindings)7 b Fa(:)i(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)22
-b Fo(22)299 2294 y(2.3.5)44 b(Allo)o(wing)16 b(Undoing)7 b
-Fa(:)i(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)
-g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)22 b Fo(23)299 2356 y(2.3.6)44 b(Redispla)o(y)9 b Fa(:)f(:)g(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)23 b Fo(24)299 2419 y(2.3.7)44 b(Mo)q(difying)16
-b(T)l(ext)11 b Fa(:)d(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)26 b Fo(25)299 2481 y(2.3.8)44 b(Utilit)o(y)16
-b(F)l(unctions)7 b Fa(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)22 b Fo(25)299 2543 y(2.3.9)44 b(An)15
-b(Example)c Fa(:)d(:)g(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)26 b Fo(26)149 2605 y(2.4)45
-b(Custom)14 b(Completers)c Fa(:)e(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)25
-b Fo(28)p eop
-%%Page: -2 52
-51 bop 0 -83 a Fo(ii)1471 b(GNU)15 b(Readline)i(Library)299
-17 y(2.4.1)44 b(Ho)o(w)14 b(Completing)i(W)l(orks)10 b Fa(:)c(:)i(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)24 b Fo(28)299 79 y(2.4.2)44
-b(Completion)16 b(F)l(unctions)7 b Fa(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)h(:)f(:)22 b Fo(29)299 141 y(2.4.3)44 b(Completion)16
-b(V)l(ariables)e Fa(:)7 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)28 b Fo(30)299 203 y(2.4.4)44 b(A)15 b(Short)g(Completion)h(Example)11
-b Fa(:)d(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)26 b Fo(32)0 328 y Fm(Concept)c(Index)5
-b Fb(:)12 b(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)h(:)28 b Fm(43)0 468 y(F)-6 b(unction)25
-b(and)d(V)-6 b(ariable)24 b(Index)11 b Fb(:)g(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)34
-b Fm(45)p eop
-%%Trailer
-end
+-1 58 bop 1937 -58 a Fr(i)0 183 y Fn(T)-7 b(able)15 b(of)g(Con)n(ten)n
+(ts)0 358 y Fp(1)67 b(Command)22 b(Line)i(Editing)18
+b Fb(.)10 b(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)38 b Fp(1)149
+435 y Fr(1.1)45 b(In)o(tro)q(duction)16 b(to)f(Line)h(Editing)d
+Fa(.)8 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)27 b Fr(1)149 498 y(1.2)45 b(Readline)17 b(In)o(teraction)8
+b Fa(.)g(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fr(1)299
+560 y(1.2.1)44 b(Readline)17 b(Bare)e(Essen)o(tials)f
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27
+b Fr(2)299 622 y(1.2.2)44 b(Readline)17 b(Mo)o(v)o(emen)o(t)d(Commands)
+7 b Fa(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fr(2)299 684
+y(1.2.3)44 b(Readline)17 b(Killing)h(Commands)10 b Fa(.)e(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)25 b Fr(3)299 747 y(1.2.4)44
+b(Readline)17 b(Argumen)o(ts)12 b Fa(.)7 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Fr(4)299 809
+y(1.2.5)44 b(Searc)o(hing)16 b(for)e(Commands)h(in)h(the)f(History)e
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+27 b Fr(4)149 871 y(1.3)45 b(Readline)17 b(Init)g(File)e
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fr(5)299
+934 y(1.3.1)44 b(Readline)17 b(Init)f(File)h(Syn)o(tax)6
+b Fa(.)h(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21
+b Fr(5)299 996 y(1.3.2)44 b(Conditional)16 b(Init)g(Constructs)t
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)19 b
+Fr(8)299 1058 y(1.3.3)44 b(Sample)16 b(Init)g(File)11
+b Fa(.)e(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)25 b Fr(9)149 1120 y(1.4)45 b(Bindable)17
+b(Readline)h(Commands)6 b Fa(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)g(.)f(.)h(.)f(.)21 b Fr(12)299 1183 y(1.4.1)44
+b(Commands)14 b(F)l(or)h(Mo)o(ving)e Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)28 b Fr(12)299 1245 y(1.4.2)44
+b(Commands)14 b(F)l(or)h(Manipulating)i(The)e(History)9
+b Fa(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)24
+b Fr(12)299 1307 y(1.4.3)44 b(Commands)14 b(F)l(or)h(Changing)h(T)l
+(ext)e Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)29 b Fr(13)299 1369
+y(1.4.4)44 b(Killing)18 b(And)e(Y)l(anking)8 b Fa(.)g(.)g(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)23 b Fr(14)299
+1432 y(1.4.5)44 b(Sp)q(ecifying)17 b(Numeric)f(Argumen)o(ts)c
+Fa(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fr(15)299 1494 y(1.4.6)44
+b(Letting)15 b(Readline)j(T)o(yp)q(e)d(F)l(or)g(Y)l(ou)9
+b Fa(.)f(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)25 b Fr(16)299 1556 y(1.4.7)44
+b(Keyb)q(oard)15 b(Macros)5 b Fa(.)i(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fr(16)299
+1618 y(1.4.8)44 b(Some)15 b(Miscellaneous)i(Commands)6
+b Fa(.)h(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fr(17)149 1681 y(1.5)45
+b(Readline)17 b(vi)f(Mo)q(de)d Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)28 b Fr(18)0 1805 y Fp(2)67 b(Programming)23 b(with)g(GNU)f
+(Readline)d Fb(.)10 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g
+(.)g(.)41 b Fp(19)149 1883 y Fr(2.1)k(Basic)16 b(Beha)o(vior)7
+b Fa(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)22
+b Fr(19)149 1945 y(2.2)45 b(Custom)14 b(F)l(unctions)7
+b Fa(.)i(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fr(21)299
+2008 y(2.2.1)44 b(The)15 b(F)l(unction)h(T)o(yp)q(e)10
+b Fa(.)e(.)g(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)26 b Fr(21)299 2070 y(2.2.2)44 b(W)l(riting)16 b(a)e(New)i(F)l
+(unction)5 b Fa(.)k(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21
+b Fr(22)149 2132 y(2.3)45 b(Readline)17 b(V)l(ariables)f
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b Fr(22)149
+2194 y(2.4)45 b(Readline)17 b(Con)o(v)o(enience)g(F)l(unctions)7
+b Fa(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)22
+b Fr(24)299 2257 y(2.4.1)44 b(Naming)15 b(a)g(F)l(unction)e
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)27 b Fr(24)299 2319 y(2.4.2)44 b(Selecting)17 b(a)e(Keymap)6
+b Fa(.)h(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)21 b Fr(25)299 2381 y(2.4.3)44 b(Binding)17 b(Keys)t
+Fa(.)8 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b Fr(26)299 2444 y(2.4.4)44
+b(Asso)q(ciating)16 b(F)l(unction)g(Names)f(and)g(Bindings)8
+b Fa(.)h(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)23
+b Fr(27)299 2506 y(2.4.5)44 b(Allo)o(wing)16 b(Undoing)f
+Fa(.)7 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)29 b Fr(28)299 2568 y(2.4.6)44 b(Redispla)o(y)10
+b Fa(.)f(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fr(29)299
+2630 y(2.4.7)44 b(Mo)q(difying)16 b(T)l(ext)6 b Fa(.)i(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21
+b Fr(30)p eop
+-2 59 bop 0 -58 a Fr(ii)1471 b(GNU)15 b(Readline)i(Library)299
+42 y(2.4.8)44 b(Utilit)o(y)16 b(F)l(unctions)e Fa(.)7
+b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)28 b Fr(31)299 104 y(2.4.9)44 b(Alternate)15 b(In)o(terface)t
+Fa(.)8 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)19 b Fr(32)299 166 y(2.4.10)43 b(An)16 b(Example)f
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)29 b Fr(33)149 228 y(2.5)45 b(Custom)14
+b(Completers)f Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)27 b
+Fr(34)299 291 y(2.5.1)44 b(Ho)o(w)14 b(Completing)i(W)l(orks)9
+b Fa(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)25
+b Fr(34)299 353 y(2.5.2)44 b(Completion)16 b(F)l(unctions)6
+b Fa(.)i(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21
+b Fr(35)299 415 y(2.5.3)44 b(Completion)16 b(V)l(ariables)11
+b Fa(.)e(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)26
+b Fr(37)299 477 y(2.5.4)44 b(A)15 b(Short)g(Completion)h(Example)t
+Fa(.)8 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)19 b Fr(40)0 602
+y Fp(Concept)j(Index)11 b Fb(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)34 b Fp(51)0
+742 y(F)-6 b(unction)25 b(and)d(V)-6 b(ariable)24 b(Index)17
+b Fb(.)10 b(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)38 b Fp(53)p eop end
userdict /end-hook known{end-hook}if
-%%EOF
diff --git a/doc/readline_toc.html b/doc/readline_toc.html
new file mode 100644
index 0000000..046b1ab
--- /dev/null
+++ b/doc/readline_toc.html
@@ -0,0 +1,77 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from /usr/homes/chet/src/bash/readline-2.1/doc/rlman.texinfo on 3 June 1997 -->
+
+<TITLE>GNU Readline Library - Table of Contents</TITLE>
+</HEAD>
+<BODY>
+<H1>GNU Readline Library</H1>
+<H2>Edition 2.1, for <CODE>Readline Library</CODE> Version 2.1.</H2>
+<H2>March 1996</H2>
+<ADDRESS>Brian Fox, Free Software Foundation</ADDRESS>
+<ADDRESS>Chet Ramey, Case Western Reserve University</ADDRESS>
+<P>
+<P><HR><P>
+<UL>
+<LI><A NAME="TOC1" HREF="readline.html#SEC1">Command Line Editing</A>
+<UL>
+<LI><A NAME="TOC2" HREF="readline.html#SEC2">Introduction to Line Editing</A>
+<LI><A NAME="TOC3" HREF="readline.html#SEC3">Readline Interaction</A>
+<UL>
+<LI><A NAME="TOC4" HREF="readline.html#SEC4">Readline Init File Syntax</A>
+<LI><A NAME="TOC5" HREF="readline.html#SEC5">Conditional Init Constructs</A>
+<LI><A NAME="TOC6" HREF="readline.html#SEC6">Sample Init File</A>
+</UL>
+<LI><A NAME="TOC7" HREF="readline.html#SEC7">Bindable Readline Commands</A>
+<UL>
+<LI><A NAME="TOC8" HREF="readline.html#SEC8">Commands For Moving</A>
+<LI><A NAME="TOC9" HREF="readline.html#SEC9">Commands For Manipulating The History</A>
+<LI><A NAME="TOC10" HREF="readline.html#SEC10">Commands For Changing Text</A>
+<LI><A NAME="TOC11" HREF="readline.html#SEC11">Killing And Yanking</A>
+<LI><A NAME="TOC12" HREF="readline.html#SEC12">Specifying Numeric Arguments</A>
+<LI><A NAME="TOC13" HREF="readline.html#SEC13">Letting Readline Type For You</A>
+<LI><A NAME="TOC14" HREF="readline.html#SEC14">Keyboard Macros</A>
+<LI><A NAME="TOC15" HREF="readline.html#SEC15">Some Miscellaneous Commands</A>
+</UL>
+<LI><A NAME="TOC16" HREF="readline.html#SEC16">Readline vi Mode</A>
+</UL>
+<LI><A NAME="TOC17" HREF="readline.html#SEC17">Programming with GNU Readline</A>
+<UL>
+<LI><A NAME="TOC18" HREF="readline.html#SEC18">Basic Behavior</A>
+<LI><A NAME="TOC19" HREF="readline.html#SEC19">Custom Functions</A>
+<UL>
+<LI><A NAME="TOC20" HREF="readline.html#SEC20">The Function Type</A>
+<LI><A NAME="TOC21" HREF="readline.html#SEC21">Writing a New Function</A>
+</UL>
+<LI><A NAME="TOC22" HREF="readline.html#SEC22">Readline Variables</A>
+<LI><A NAME="TOC23" HREF="readline.html#SEC23">Readline Convenience Functions</A>
+<UL>
+<LI><A NAME="TOC24" HREF="readline.html#SEC24">Naming a Function</A>
+<LI><A NAME="TOC25" HREF="readline.html#SEC25">Selecting a Keymap</A>
+<LI><A NAME="TOC26" HREF="readline.html#SEC26">Binding Keys</A>
+<LI><A NAME="TOC27" HREF="readline.html#SEC27">Associating Function Names and Bindings</A>
+<LI><A NAME="TOC28" HREF="readline.html#SEC28">Allowing Undoing</A>
+<LI><A NAME="TOC29" HREF="readline.html#SEC29">Redisplay</A>
+<LI><A NAME="TOC30" HREF="readline.html#SEC30">Modifying Text</A>
+<LI><A NAME="TOC31" HREF="readline.html#SEC31">Utility Functions</A>
+<LI><A NAME="TOC32" HREF="readline.html#SEC32">Alternate Interface</A>
+<LI><A NAME="TOC33" HREF="readline.html#SEC33">An Example</A>
+</UL>
+<LI><A NAME="TOC34" HREF="readline.html#SEC34">Custom Completers</A>
+<UL>
+<LI><A NAME="TOC35" HREF="readline.html#SEC35">How Completing Works</A>
+<LI><A NAME="TOC36" HREF="readline.html#SEC36">Completion Functions</A>
+<LI><A NAME="TOC37" HREF="readline.html#SEC37">Completion Variables</A>
+<LI><A NAME="TOC38" HREF="readline.html#SEC38">A Short Completion Example</A>
+</UL>
+</UL>
+<LI><A NAME="TOC39" HREF="readline.html#SEC39">Concept Index</A>
+<LI><A NAME="TOC40" HREF="readline.html#SEC40">Function and Variable Index</A>
+</UL>
+<P><HR><P>
+This document was generated on 3 June 1997 using the
+<A HREF="http://wwwcn.cern.ch/dci/texi2html/">texi2html</A>
+translator version 1.51.</P>
+</BODY>
+</HTML>
diff --git a/doc/rlman.texinfo b/doc/rlman.texinfo
index ec14066..655f3db 100644
--- a/doc/rlman.texinfo
+++ b/doc/rlman.texinfo
@@ -7,13 +7,13 @@
@setchapternewpage odd
@ignore
-last change: Thu Jul 21 16:02:40 EDT 1994
+last change: Thu Mar 21 16:06:39 EST 1996
@end ignore
-@set EDITION 2.0
-@set VERSION 2.0
-@set UPDATED 21 July 1994
-@set UPDATE-MONTH July 1994
+@set EDITION 2.1
+@set VERSION 2.1
+@set UPDATED 21 March 1996
+@set UPDATE-MONTH March 1996
@ifinfo
This document describes the GNU Readline Library, a utility which aids
@@ -45,7 +45,6 @@ by the Foundation.
@end ifinfo
@titlepage
-@sp 10
@title GNU Readline Library
@subtitle Edition @value{EDITION}, for @code{Readline Library} Version @value{VERSION}.
@subtitle @value{UPDATE-MONTH}
diff --git a/doc/rltech.texinfo b/doc/rltech.texinfo
index f24ac1f..ea0d317 100644
--- a/doc/rltech.texinfo
+++ b/doc/rltech.texinfo
@@ -8,7 +8,7 @@ This document describes the GNU Readline Library, a utility for aiding
in the consitency of user interface across discrete programs that need
to provide a command line interface.
-Copyright (C) 1988, 1994 Free Software Foundation, Inc.
+Copyright (C) 1988, 1994, 1996 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
@@ -44,6 +44,8 @@ in your own programs, this section is for you.
@menu
* Basic Behavior:: Using the default behavior of Readline.
* Custom Functions:: Adding your own functions to Readline.
+* Readline Variables:: Variables accessible to custom
+ functions.
* Readline Convenience Functions:: Functions which Readline supplies to
aid in writing your own
* Custom Completers:: Supplanting or supplementing Readline's
@@ -230,6 +232,11 @@ to do something useful with both negative and positive arguments.
At the very least, it should be aware that it can be passed a
negative argument.
+@node Readline Variables
+@section Readline Variables
+
+These variables are available to function writers.
+
@deftypevar {char *} rl_line_buffer
This is the line gathered so far. You are welcome to modify the
contents of the line, but see @ref{Allowing Undoing}.
@@ -266,6 +273,10 @@ The prompt Readline uses. This is set from the argument to
@code{readline ()}, and should not be assigned to directly.
@end deftypevar
+@deftypevar {char *} rl_library_version
+The version number of this revision of the library.
+@end deftypevar
+
@deftypevar {char *} rl_terminal_name
The terminal type, used for initialization.
@end deftypevar
@@ -289,6 +300,35 @@ If non-zero, this is the address of a function to call just
before @code{readline} prints the first prompt.
@end deftypevar
+@deftypevar {Function *} rl_event_hook
+If non-zero, this is the address of a function to call periodically
+when readline is waiting for terminal input.
+@end deftypevar
+
+@deftypevar {Function *} rl_getc_function
+If non-zero, @code{readline} will call indirectly through this pointer
+to get a character from the input stream. By default, it is set to
+@code{rl_getc}, the default @code{readline} character input function
+(@pxref{Utility Functions}).
+@end deftypevar
+
+@deftypevar {VFunction *} rl_redisplay_function
+If non-zero, @code{readline} will call indirectly through this pointer
+to update the display with the current contents of the editing buffer.
+By default, it is set to @code{rl_redisplay}, the default @code{readline}
+redisplay function (@pxref{Redisplay}).
+@end deftypevar
+
+@deftypevar {Keymap} rl_executing_keymap
+This variable is set to the keymap (@pxref{Keymaps}) in which the
+currently executing readline function was found.
+@end deftypevar
+
+@deftypevar {Keymap} rl_binding_keymap
+This variable is set to the keymap (@pxref{Keymaps}) in which the
+last key binding occurred.
+@end deftypevar
+
@node Readline Convenience Functions
@section Readline Convenience Functions
@@ -302,6 +342,7 @@ before @code{readline} prints the first prompt.
* Redisplay:: Functions to control line display.
* Modifying Text:: Functions to modify @code{rl_line_buffer}.
* Utility Functions:: Generally useful functions and hooks.
+* Alternate Interface:: Using Readline in a `callback' fashion.
@end menu
@node Function Naming
@@ -376,6 +417,11 @@ Return the keymap matching @var{name}. @var{name} is one which would
be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}).
@end deftypefun
+@deftypefun {char *} rl_get_keymap_name (Keymap keymap)
+Return the name matching @var{keymap}. @var{name} is one which would
+be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}).
+@end deftypefun
+
@node Binding Keys
@subsection Binding Keys
@@ -422,6 +468,11 @@ perform any key bindings and variable assignments found
(@pxref{Readline Init File}).
@end deftypefun
+@deftypefun int rl_read_init_file (char *filename)
+Read keybindings and variable assignments from @var{filename}
+(@pxref{Readline Init File}).
+@end deftypefun
+
@node Associating Function Names and Bindings
@subsection Associating Function Names and Bindings
@@ -449,6 +500,17 @@ Return an array of strings representing the key sequences used to
invoke @var{function} in the keymap @var{map}.
@end deftypefun
+@deftypefun void rl_function_dumper (int readable)
+Print the readline function names and the key sequences currently
+bound to them to @code{rl_outstream}. If @var{readable} is non-zero,
+the list is formatted in such a way that it can be made part of an
+@code{inputrc} file and re-read.
+@end deftypefun
+
+@deftypefun void rl_list_funmap_names ()
+Print the names of all bindable Readline functions to @code{rl_outstream}.
+@end deftypefun
+
@node Allowing Undoing
@subsection Allowing Undoing
@@ -519,7 +581,7 @@ that text.
@node Redisplay
@subsection Redisplay
-@deftypefun int rl_redisplay ()
+@deftypefun void rl_redisplay ()
Change what's displayed on the screen to reflect the current contents
of @code{rl_line_buffer}.
@end deftypefun
@@ -577,6 +639,31 @@ not a kill, a new kill ring slot is used.
@node Utility Functions
@subsection Utility Functions
+@deftypefun int rl_read_key ()
+Return the next character available. This handles input inserted into
+the input stream via @var{pending input} (@pxref{Readline Variables})
+and @code{rl_stuff_char ()}, macros, and characters read from the keyboard.
+@end deftypefun
+
+@deftypefun int rl_getc (FILE *)
+Return the next character available from the keyboard.
+@end deftypefun
+
+@deftypefun int rl_stuff_char (int c)
+Insert @var{c} into the Readline input stream. It will be "read"
+before Readline attempts to read characters from the terminal with
+@code{rl_read_key ()}.
+@end deftypefun
+
+@deftypefun rl_extend_line_buffer (int len)
+Ensure that @code{rl_line_buffer} has enough space to hold @var{len}
+characters, possibly reallocating it if necessary.
+@end deftypefun
+
+@deftypefun int rl_initialize ()
+Initialize or re-initialize Readline's internal state.
+@end deftypefun
+
@deftypefun int rl_reset_terminal (char *terminal_name)
Reinitialize Readline's idea of the terminal settings using
@var{terminal_name} as the terminal type (e.g., @code{vt100}).
@@ -606,7 +693,7 @@ Return 1 if @var{c} is a lowercase alphabetic character.
@deftypefun int digit_p (int c)
Return 1 if @var{c} is a numeric character.
-@deftypefun
+@end deftypefun
@deftypefun int to_upper (int c)
If @var{c} is a lowercase alphabetic character, return the corresponding
@@ -622,6 +709,37 @@ lowercase character.
If @var{c} is a number, return the value it represents.
@end deftypefun
+@node Alternate Interface
+@subsection Alternate Interface
+
+An alternate interface is available to plain @code{readline()}. Some
+applications need to interleave keyboard I/O with file, device, or
+window system I/O, typically by using a main loop to @code{select()}
+on various file descriptors. To accomodate this need, readline can
+also be invoked as a `callback' function from an event loop. There
+are functions available to make this easy.
+
+@deftypefun void rl_callback_handler_install (char *prompt, Vfunction *lhandler)
+Set up the terminal for readline I/O and display the initial
+expanded value of @var{prompt}. Save the value of @var{lhandler} to
+use as a callback when a complete line of input has been entered.
+@end deftypefun
+
+@deftypefun void rl_callback_read_char ()
+Whenever an application determines that keyboard input is available, it
+should call @code{rl_callback_read_char()}, which will read the next
+character from the current input source. If that character completes the
+line, @code{rl_callback_read_char} will invoke the @var{lhandler}
+function saved by @code{rl_callback_handler_install} to process the
+line. @code{EOF} is indicated by calling @var{lhandler} with a
+@code{NULL} line.
+@end deftypefun
+
+@deftypefun void rl_callback_handler_remove ()
+Restore the terminal to its initial state and remove the line handler.
+This may be called from within a callback as well as independently.
+@end deftypefun
+
@subsection An Example
Here is a function which changes lowercase characters to their uppercase
@@ -762,7 +880,7 @@ that does the initial simple matching selection algorithm (see
This is a pointer to the generator function for @code{completion_matches
()}. If the value of @code{rl_completion_entry_function} is
@code{(Function *)NULL} then the default filename generator function,
-@code{filename_entry_function ()}, is used.
+@code{filename_completion_function ()}, is used.
@end deftypevar
@node Completion Functions
@@ -850,6 +968,40 @@ returns @code{NULL}, or if this variable is set to @code{NULL}, then
array of strings returned will be used.
@end deftypevar
+@deftypevar {CPFunction *} rl_filename_quoting_function
+A pointer to a function that will quote a filename in an application-
+specific fashion. This is called if filename completion is being
+attempted and one of the characters in @code{rl_filename_quote_characters}
+appears in a completed filename. The function is called with
+@var{text}, @var{match_type}, and @var{quote_pointer}. The @var{text}
+is the filename to be quoted. The @var{match_type} is either
+@code{SINGLE_MATCH}, if there is only one completion match, or
+@code{MULT_MATCH}. Some functions use this to decide whether or not to
+insert a closing quote character. The @var{quote_pointer} is a pointer
+to any opening quote character the user typed. Some functions choose
+to reset this character.
+@end deftypevar
+
+@deftypevar {CPFunction *} rl_filename_dequoting_function
+A pointer to a function that will remove application-specific quoting
+characters from a filename before completion is attempted, so those
+characters do not interfere with matching the text against names in
+the filesystem. It is called with @var{text}, the text of the word
+to be dequoted, and @var{quote_char}, which is the quoting character
+that delimits the filename (usually @samp{'} or @samp{"}). If
+@var{quote_char} is zero, the filename was not in an embedded string.
+@end deftypevar
+
+@deftypevar {Function *} rl_char_is_quoted_p
+A pointer to a function to call that determines whether or not a specific
+character in the line buffer is quoted, according to whatever quoting
+mechanism the program calling readline uses. The function is called with
+two arguments: @var{text}, the text of the line, and @var{index}, the
+index of the character in the line. It is used to decide whether a
+character found in @code{rl_completer_word_break_characters} should be
+used to break words for the completer.
+@end deftypevar
+
@deftypevar int rl_completion_query_items
Up to this many items will be displayed in response to a
possible-completions call. After that, we ask the user if she is sure
@@ -863,12 +1015,28 @@ which break words for completion in Bash, i.e.,
@code{" \t\n\"\\'`@@$><=;|&@{("}.
@end deftypevar
+@deftypevar {char *} rl_basic_quote_characters
+List of quote characters which can cause a word break.
+@end deftypevar
+
@deftypevar {char *} rl_completer_word_break_characters
The list of characters that signal a break between words for
@code{rl_complete_internal ()}. The default list is the value of
@code{rl_basic_word_break_characters}.
@end deftypevar
+@deftypevar {char *} rl_completer_quote_characters
+List of characters which can be used to quote a substring of the line.
+Completion occurs on the entire substring, and within the substring
+@code{rl_completer_word_break_characters} are treated as any other character,
+unless they also appear within this list.
+@end deftypevar
+
+@deftypevar {char *} rl_filename_quote_characters
+A list of characters that cause a filename to be quoted by the completer
+when they appear in a completed filename. The default is empty.
+@end deftypevar
+
@deftypevar {char *} rl_special_prefixes
The list of characters that are word break characters, but should be
left in @var{text} when it is passed to the completion function.
@@ -877,6 +1045,16 @@ For instance, Bash sets this variable to "$@@" so that it can complete
shell variables and hostnames.
@end deftypevar
+@deftypevar {int} rl_completion_append_character
+When a single completion alternative matches at the end of the command
+line, this character is appended to the inserted completion text. The
+default is a space character (@samp{ }). Setting this to the null
+character (@samp{\0}) prevents anything being appended automatically.
+This can be changed in custom completion functions to
+provide the ``most sensible word separator character'' according to
+an application-specific command line syntax specification.
+@end deftypevar
+
@deftypevar int rl_ignore_completion_duplicates
If non-zero, then disallow duplicates in the matches. Default is 1.
@end deftypevar
@@ -894,9 +1072,15 @@ characters.
Non-zero means that the results of the matches are to be quoted using
double quotes (or an application-specific quoting mechanism) if the
completed filename contains any characters in
-@code{rl_completer_word_break_chars}. This is @emph{always} non-zero
+@code{rl_filename_quote_chars}. This is @emph{always} non-zero
on entry, and can only be changed within a completion entry generator
-function.
+function. The quoting is effected via a call to the function pointed to
+by @code{rl_filename_quoting_function}.
+@end deftypevar
+
+@deftypevar int rl_inhibit_completion
+If this variable is non-zero, completion is inhibit<ed. The completion
+character will be inserted as any other bound to @code{self-insert}.
@end deftypevar
@deftypevar {Function *} rl_ignore_some_completions_function
@@ -909,14 +1093,13 @@ re-arrange the list of matches as required, but each element deleted
from the array must be freed.
@end deftypevar
-@deftypevar {char *} rl_completer_quote_characters
-List of characters which can be used to quote a substring of the line.
-Completion occurs on the entire substring, and within the substring
-@code{rl_completer_word_break_characters} are treated as any other character,
-unless they also appear within this list.
+@deftypevar {Function *} rl_directory_completion_hook
+This function, if defined, is allowed to modify the directory portion
+of filenames Readline completes. It is called with the address of a
+string (the current directory name) as an argument. It could be used
+to expand symbolic links or shell variables in pathnames.
@end deftypevar
-
@node A Short Completion Example
@subsection A Short Completion Example
@@ -1124,10 +1307,11 @@ initialize_readline ()
rl_attempted_completion_function = (CPPFunction *)fileman_completion;
@}
-/* Attempt to complete on the contents of TEXT. START and END show the
- region of TEXT that contains the word to complete. We can use the
- entire line in case we want to do some simple parsing. Return the
- array of matches, or NULL if there aren't any. */
+/* Attempt to complete on the contents of TEXT. START and END bound the
+ region of rl_line_buffer that contains the word to complete. TEXT is
+ the word to complete. We can use the entire contents of rl_line_buffer
+ in case we want to do some simple parsing. Return the array of matches,
+ or NULL if there aren't any. */
char **
fileman_completion (text, start, end)
char *text;
diff --git a/doc/rluser.texinfo b/doc/rluser.texinfo
index 3567549..f7d6fd8 100644
--- a/doc/rluser.texinfo
+++ b/doc/rluser.texinfo
@@ -10,7 +10,7 @@ use these features. There is a document entitled "readline.texinfo"
which contains both end-user and programmer documentation for the GNU
Readline Library.
-Copyright (C) 1988 Free Software Foundation, Inc.
+Copyright (C) 1988, 1991, 1993, 1996 Free Software Foundation, Inc.
Authored by Brian Fox and Chet Ramey.
@@ -39,7 +39,7 @@ into another language, under the above conditions for modified versions.
@node Command Line Editing
@chapter Command Line Editing
-This chapter describes the basic features of the GNU
+This chapter describes the basic features of the @sc{GNU}
command line editing interface.
@menu
@@ -59,11 +59,12 @@ The following paragraphs describe the notation used to represent
keystrokes.
The text @key{C-k} is read as `Control-K' and describes the character
-produced when the Control key is depressed and the @key{k} key is struck.
+produced when the @key{k} key is pressed while the Control key
+is depressed.
The text @key{M-k} is read as `Meta-K' and describes the character
produced when the meta key (if you have one) is depressed, and the @key{k}
-key is struck. If you do not have a meta key, the identical keystroke
+key is pressed. If you do not have a meta key, the identical keystroke
can be generated by typing @key{ESC} @i{first}, and then typing @key{k}.
Either process is known as @dfn{metafying} the @key{k} key.
@@ -73,7 +74,7 @@ character produced by @dfn{metafying} @key{C-k}.
In addition, several keys have their own names. Specifically,
@key{DEL}, @key{ESC}, @key{LFD}, @key{SPC}, @key{RET}, and @key{TAB} all
stand for themselves when seen in this text, or in an init file
-(@pxref{Readline Init File}, for more info).
+(@pxref{Readline Init File}).
@node Readline Interaction
@section Readline Interaction
@@ -95,10 +96,14 @@ regardless of the location of the cursor within the line.
* Readline Movement Commands:: Moving about the input line.
* Readline Killing Commands:: How to delete text, and how to get it back!
* Readline Arguments:: Giving numeric arguments to commands.
-@end menu
+* Searching:: Searching through previous lines.
+ @end menu
@node Readline Bare Essentials
@subsection Readline Bare Essentials
+@cindex notation, readline
+@cindex command editing
+@cindex editing command lines
In order to enter characters into the line, simply type them. The typed
character appears where the cursor was, and then the cursor moves one
@@ -164,8 +169,8 @@ operate on characters while meta keystrokes operate on words.
@node Readline Killing Commands
@subsection Readline Killing Commands
-@cindex Killing text
-@cindex Yanking text
+@cindex killing text
+@cindex yanking text
@dfn{Killing} text means to delete the text from the line, but to save
it away for later use, usually by @dfn{yanking} (re-inserting)
@@ -180,7 +185,7 @@ that when you yank it back, you get it all. The kill
ring is not line specific; the text that you killed on a previously
typed line is available to be yanked back later, when you are typing
another line.
-@cindex Kill ring
+@cindex kill ring
Here is the list of commands for killing text.
@@ -222,24 +227,59 @@ argument acts as a repeat count, other times it is the @i{sign} of the
argument that is significant. If you pass a negative argument to a
command which normally acts in a forward direction, that command will
act in a backward direction. For example, to kill text back to the
-start of the line, you might type @key{M--} @key{C-k}.
+start of the line, you might type @w{@kbd{M-- C-k}}.
The general way to pass numeric arguments to a command is to type meta
digits before the command. If the first `digit' you type is a minus
sign (@key{-}), then the sign of the argument will be negative. Once
you have typed one meta digit to get the argument started, you can type
the remainder of the digits, and then the command. For example, to give
-the @key{C-d} command an argument of 10, you could type @key{M-1 0 C-d}.
+the @key{C-d} command an argument of 10, you could type @samp{M-1 0 C-d}.
+
+@node Searching
+@subsection Searching for Commands in the History
+Readline provides commands for searching through the command history
+@ifset BashFeatures
+(@pxref{Bash History Facilities})
+@end ifset
+for lines containing a specified string.
+There are two search modes: @var{incremental} and @var{non-incremental}.
+
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+The Escape character is used to terminate an incremental search.
+Control-J will also terminate the search.
+Control-G will abort an incremental search and restore the original
+line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+To find other matching entries in the history list, type Control-S or
+Control-R as appropriate.
+This will search backward or forward in the history for the next
+entry matching the search string typed so far.
+Any other key sequence bound to a readline command will terminate
+the search and execute that command.
+For instance, a @code{newline} will terminate the search and accept
+the line, thereby executing the command from the history list.
+
+Non-incremental searches read the entire search string before starting
+to search for matching history lines. The search string may be
+typed by the user or part of the contents of the current line.
@node Readline Init File
@section Readline Init File
+@cindex initialization file, readline
-Although the Readline library comes with a set of Emacs-like
+Although the Readline library comes with a set of @code{emacs}-like
keybindings installed by default,
it is possible that you would like to use a different set
of keybindings. You can customize programs that use Readline by putting
-commands in an @dfn{init} file in your home directory. The name of this
+commands in an @dfn{inputrc} file in your home directory. The name of this
@ifset BashFeatures
file is taken from the value of the shell variable @code{INPUTRC}. If
@end ifset
@@ -255,17 +295,20 @@ In addition, the @code{C-x C-r} command re-reads this init file, thus
incorporating any changes that you might have made to it.
@menu
-* Readline Init Syntax:: Syntax for the commands in the inputrc file.
+* Readline Init File Syntax:: Syntax for the commands in the inputrc file.
+
* Conditional Init Constructs:: Conditional key bindings in the inputrc file.
+
+* Sample Init File:: An example inputrc file.
@end menu
-@node Readline Init Syntax
-@subsection Readline Init Syntax
+@node Readline Init File Syntax
+@subsection Readline Init File Syntax
There are only a few basic constructs allowed in the
Readline init file. Blank lines are ignored.
-Lines beginning with a @key{#} are comments.
-Lines beginning with a @key{$} indicate conditional
+Lines beginning with a @samp{#} are comments.
+Lines beginning with a @samp{$} indicate conditional
constructs (@pxref{Conditional Init Constructs}). Other lines
denote variable settings and key bindings.
@@ -284,61 +327,20 @@ so few, in fact, that we just list them here:
@table @code
-@item editing-mode
-@vindex editing-mode
-The @code{editing-mode} variable controls which editing mode you are
-using. By default, Readline starts up in Emacs editing mode, where
-the keystrokes are most similar to Emacs. This variable can be
-set to either @code{emacs} or @code{vi}.
-
-@item horizontal-scroll-mode
-@vindex horizontal-scroll-mode
-This variable can be set to either @code{On} or @code{Off}. Setting it
-to @code{On} means that the text of the lines that you edit will scroll
-horizontally on a single screen line when they are longer than the width
-of the screen, instead of wrapping onto a new screen line. By default,
-this variable is set to @code{Off}.
-
-@item mark-modified-lines
-@vindex mark-modified-lines
-This variable, when set to @code{On}, says to display an asterisk
-(@samp{*}) at the start of history lines which have been modified.
-This variable is @code{off} by default.
-
@item bell-style
@vindex bell-style
Controls what happens when Readline wants to ring the terminal bell.
-If set to @code{none}, Readline never rings the bell. If set to
-@code{visible}, Readline uses a visible bell if one is available.
-If set to @code{audible} (the default), Readline attempts to ring
+If set to @samp{none}, Readline never rings the bell. If set to
+@samp{visible}, Readline uses a visible bell if one is available.
+If set to @samp{audible} (the default), Readline attempts to ring
the terminal's bell.
@item comment-begin
@vindex comment-begin
The string to insert at the beginning of the line when the
-@code{vi-comment} command is executed. The default value
+@code{insert-comment} command is executed. The default value
is @code{"#"}.
-@item meta-flag
-@vindex meta-flag
-If set to @code{on}, Readline will enable eight-bit input (it
-will not strip the eighth bit from the characters it reads),
-regardless of what the terminal claims it can support. The
-default value is @code{off}.
-
-@item convert-meta
-@vindex convert-meta
-If set to @code{on}, Readline will convert characters with the
-eigth bit set to an ASCII key sequence by stripping the eigth
-bit and prepending an @key{ESC} character, converting them to a
-meta-prefixed key sequence. The default value is @code{on}.
-
-@item output-meta
-@vindex output-meta
-If set to @code{on}, Readline will display characters with the
-eighth bit set directly rather than as a meta-prefixed escape
-sequence. The default is @code{off}.
-
@item completion-query-items
@vindex completion-query-items
The number of possible completions that determines when the user is
@@ -348,6 +350,45 @@ Readline will ask the user whether or not he wishes to view
them; otherwise, they are simply listed. The default limit is
@code{100}.
+@item convert-meta
+@vindex convert-meta
+If set to @samp{on}, Readline will convert characters with the
+eigth bit set to an ASCII key sequence by stripping the eigth
+bit and prepending an @key{ESC} character, converting them to a
+meta-prefixed key sequence. The default value is @samp{on}.
+
+@item disable-completion
+@vindex disable-completion
+If set to @samp{On}, readline will inhibit word completion.
+Completion characters will be inserted into the line as if they had
+been mapped to @code{self-insert}. The default is @samp{off}.
+
+@item editing-mode
+@vindex editing-mode
+The @code{editing-mode} variable controls which editing mode you are
+using. By default, Readline starts up in Emacs editing mode, where
+the keystrokes are most similar to Emacs. This variable can be
+set to either @samp{emacs} or @samp{vi}.
+
+@item enable-keypad
+@vindex enable-keypad
+When set to @samp{on}, readline will try to enable the application
+keypad when it is called. Some systems need this to enable the
+arrow keys. The default is @samp{off}.
+
+@item expand-tilde
+@vindex expand-tilde
+If set to @samp{on}, tilde expansion is performed when Readline
+attempts word completion. The default is @samp{off}.
+
+@item horizontal-scroll-mode
+@vindex horizontal-scroll-mode
+This variable can be set to either @samp{on} or @samp{off}. Setting it
+to @samp{on} means that the text of the lines that you edit will scroll
+horizontally on a single screen line when they are longer than the width
+of the screen, instead of wrapping onto a new screen line. By default,
+this variable is set to @samp{off}.
+
@item keymap
@vindex keymap
Sets Readline's idea of the current keymap for key binding commands.
@@ -357,7 +398,6 @@ Acceptable @code{keymap} names are
@code{emacs-meta},
@code{emacs-ctlx},
@code{vi},
-@code{vi-move},
@code{vi-command}, and
@code{vi-insert}.
@code{vi} is equivalent to @code{vi-command}; @code{emacs} is
@@ -365,18 +405,44 @@ equivalent to @code{emacs-standard}. The default value is @code{emacs}.
The value of the @code{editing-mode} variable also affects the
default keymap.
+@item mark-directories
+If set to @samp{on}, completed directory names have a slash
+appended. The default is @samp{on}.
+
+@item mark-modified-lines
+@vindex mark-modified-lines
+This variable, when set to @samp{on}, says to display an asterisk
+(@samp{*}) at the start of history lines which have been modified.
+This variable is @samp{off} by default.
+
+@item input-meta
+@vindex input-meta
+@vindex meta-flag
+If set to @samp{on}, Readline will enable eight-bit input (it
+will not strip the eighth bit from the characters it reads),
+regardless of what the terminal claims it can support. The
+default value is @samp{off}. The name @code{meta-flag} is a
+synonym for this variable.
+
+@item output-meta
+@vindex output-meta
+If set to @samp{on}, Readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence. The default is @samp{off}.
+
@item show-all-if-ambiguous
@vindex show-all-if-ambiguous
This alters the default behavior of the completion functions. If
-set to @code{on},
+set to @samp{on},
words which have more than one possible completion cause the
matches to be listed immediately instead of ringing the bell.
-The default value is @code{off}.
+The default value is @samp{off}.
-@item expand-tilde
-@vindex expand-tilde
-If set to @code{on}, tilde expansion is performed when Readline
-attempts word completion. The default is @code{off}.
+@item visible-stats
+@vindex visible-stats
+If set to @samp{on}, a character denoting a file's type
+is appended to the filename when listing possible
+completions. The default is @samp{off}.
@end table
@@ -399,13 +465,13 @@ comfortable for you.
@example
Control-u: universal-argument
Meta-Rubout: backward-kill-word
-Control-o: ">&output"
+Control-o: "> output"
@end example
In the above example, @samp{C-u} is bound to the function
@code{universal-argument}, and @samp{C-o} is bound to run the macro
expressed on the right hand side (that is, to insert the text
-@samp{>&output} into the line).
+@samp{> output} into the line).
@item @w{"@var{keyseq}": @var{function-name} or @var{macro}}
@var{keyseq} differs from @var{keyname} above in that strings
@@ -445,10 +511,10 @@ backslash
When entering the text of a macro, single or double quotes should
be used to indicate a macro definition. Unquoted text
is assumed to be a function name. Backslash
-will quote any character in the macro text, including @key{"}
-and @key{'}.
-For example, the following binding will make @kbd{C-x \}
-insert a single @key{\} into the line:
+will quote any character in the macro text, including @samp{"}
+and @samp{'}.
+For example, the following binding will make @samp{C-x \}
+insert a single @samp{\} into the line:
@example
"\C-x\\": "\\"
@end example
@@ -464,7 +530,7 @@ compilation features of the C preprocessor which allows key
bindings and variable settings to be performed as the result
of tests. There are three parser directives used.
-@ftable @code
+@table @code
@item $if
The @code{$if} construct allows bindings to be made based on the
editing mode, the terminal being used, or the application using
@@ -486,7 +552,7 @@ key bindings, perhaps to bind the key sequences output by the
terminal's function keys. The word on the right side of the
@samp{=} is tested against the full name of the terminal and the
portion of the terminal name before the first @samp{-}. This
-allows @var{sun} to match both @var{sun} and @var{sun-cmd},
+allows @code{sun} to match both @code{sun} and @code{sun-cmd},
for instance.
@item application
@@ -497,7 +563,7 @@ This could be used to bind key sequences to functions useful for
a specific program. For instance, the following command adds a
key sequence that quotes the current or previous word in Bash:
@example
-$if bash
+$if Bash
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
$endif
@@ -511,7 +577,109 @@ This command, as you saw in the previous example, terminates an
@item $else
Commands in this branch of the @code{$if} directive are executed if
the test fails.
-@end ftable
+@end table
+
+@node Sample Init File
+@subsection Sample Init File
+
+Here is an example of an inputrc file. This illustrates key
+binding, variable assignment, and conditional syntax.
+
+@example
+@page
+# This file controls the behaviour of line input editing for
+# programs that use the Gnu Readline library. Existing programs
+# include FTP, Bash, and Gdb.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# Set various bindings for emacs mode.
+
+set editing-mode emacs
+
+$if mode=emacs
+
+Meta-Control-h: backward-kill-word Text after the function name is ignored
+
+#
+# Arrow keys in keypad mode
+#
+#"\M-OD": backward-char
+#"\M-OC": forward-char
+#"\M-OA": previous-history
+#"\M-OB": next-history
+#
+# Arrow keys in ANSI mode
+#
+"\M-[D": backward-char
+"\M-[C": forward-char
+"\M-[A": previous-history
+"\M-[B": next-history
+#
+# Arrow keys in 8 bit keypad mode
+#
+#"\M-\C-OD": backward-char
+#"\M-\C-OC": forward-char
+#"\M-\C-OA": previous-history
+#"\M-\C-OB": next-history
+#
+# Arrow keys in 8 bit ANSI mode
+#
+#"\M-\C-[D": backward-char
+#"\M-\C-[C": forward-char
+#"\M-\C-[A": previous-history
+#"\M-\C-[B": next-history
+
+C-q: quoted-insert
+
+$endif
+
+# An old-style binding. This happens to be the default.
+TAB: complete
+
+# Macros that are convenient for shell interaction
+$if Bash
+# edit the path
+"\C-xp": "PATH=$@{PATH@}\e\C-e\C-a\ef\C-f"
+# prepare to type a quoted word -- insert open and close double quotes
+# and move to just after the open quote
+"\C-x\"": "\"\"\C-b"
+# insert a backslash (testing backslash escapes in sequences and macros)
+"\C-x\\": "\\"
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+# Add a binding to refresh the line, which is unbound
+"\C-xr": redraw-current-line
+# Edit variable on current line.
+"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+$endif
+
+# use a visible bell if one is available
+set bell-style visible
+
+# don't strip characters to 7 bits when reading
+set input-meta on
+
+# allow iso-latin1 characters to be inserted rather than converted to
+# prefix-meta sequences
+set convert-meta off
+
+# display characters with the eighth bit set directly rather than
+# as meta-prefixed characters
+set output-meta on
+
+# if there are more than 150 possible completions for a word, ask the
+# user if he wants to see all of them
+set completion-query-items 150
+
+# For FTP
+$if Ftp
+"\C-xg": "get \M-?"
+"\C-xt": "put \M-?"
+"\M-.": yank-last-arg
+$endif
+@end example
@node Bindable Readline Commands
@section Bindable Readline Commands
@@ -527,6 +695,9 @@ the test fails.
* Miscellaneous Commands:: Other miscellaneous commands.
@end menu
+This section describes Readline commands that may be bound to key
+sequences.
+
@node Commands For Moving
@subsection Commands For Moving
@ftable @code
@@ -608,12 +779,13 @@ for a string supplied by the user.
@item history-search-forward ()
Search forward through the history for the string of characters
-between the start of the current line and the current point. This
-is a non-incremental search. By default, this command is unbound.
+between the start of the current line and the current cursor
+position (the `point'). This is a non-incremental search. By
+default, this command is unbound.
@item history-search-backward ()
Search backward through the history for the string of characters
-between the start of the current line and the current point. This
+between the start of the current line and the point. This
is a non-incremental search. By default, this command is unbound.
@item yank-nth-arg (M-C-y)
@@ -624,8 +796,8 @@ in the previous command begin with word 0). A negative argument
inserts the @var{n}th word from the end of the previous command.
@item yank-last-arg (M-., M-_)
-Insert last argument to the previous command (the last word on the
-previous line). With an
+Insert last argument to the previous command (the last word of the
+previous history entry). With an
argument, behave exactly like @code{yank-nth-arg}.
@end ftable
@@ -637,7 +809,7 @@ argument, behave exactly like @code{yank-nth-arg}.
@item delete-char (C-d)
Delete the character under the cursor. If the cursor is at the
beginning of the line, there are no characters in the line, and
-the last character typed was not C-d, then return EOF.
+the last character typed was not @kbd{C-d}, then return @code{EOF}.
@item backward-delete-char (Rubout)
Delete the character behind the cursor. A numeric arg says to kill
@@ -714,6 +886,23 @@ boundary. The killed text is saved on the kill-ring.
@item delete-horizontal-space ()
Delete all spaces and tabs around point. By default, this is unbound.
+@item kill-region ()
+Kill the text between the point and the @emph{mark} (saved
+cursor position. This text is referred to as the @var{region}.
+By default, this command is unbound.
+
+@item copy-region-as-kill ()
+Copy the text in the region to the kill buffer, so you can yank it
+right away. By default, this command is unbound.
+
+@item copy-backward-word ()
+Copy the word before point to the kill buffer.
+By default, this command is unbound.
+
+@item copy-forward-word ()
+Copy the word following point to the kill buffer.
+By default, this command is unbound.
+
@item yank (C-y)
Yank the top of the kill ring into the buffer at the current
cursor position.
@@ -729,13 +918,21 @@ the prior command is yank or yank-pop.
@item digit-argument (M-0, M-1, ... M--)
Add this digit to the argument already accumulating, or start a new
-argument. M-- starts a negative argument.
+argument. @key{M--} starts a negative argument.
@item universal-argument ()
-Each time this is executed, the argument count is multiplied by four.
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing @code{universal-argument}
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
The argument count is initially one, so executing this function the
-first time makes the argument count four. By default, this is not
-bound to a key.
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+By default, this is not bound to a key.
@end ftable
@node Commands For Completion
@@ -750,18 +947,74 @@ you can do command completion, if you are typing in a symbol to GDB, you
can do symbol name completion, if you are typing in a variable to Bash,
you can do variable name completion, and so on.
@ifset BashFeatures
-See the Bash manual page for a complete list of available completion
-functions.
+Bash attempts completion treating the text as a variable (if the
+text begins with @samp{$}), username (if the text begins with
+@samp{~}), hostname (if the text begins with @samp{@@}), or
+command (including aliases and functions) in turn. If none
+of these produces a match, filename completion is attempted.
@end ifset
@item possible-completions (M-?)
List the possible completions of the text before the cursor.
-@item insert-completions ()
+@item insert-completions (M-*)
Insert all completions of the text before point that would have
-been generated by @code{possible-completions}. By default, this
-is not bound to a key.
+been generated by @code{possible-completions}.
+
+@ifset BashFeatures
+@item complete-filename (M-/)
+Attempt filename completion on the text before point.
+
+@item possible-filename-completions (C-x /)
+List the possible completions of the text before point,
+treating it as a filename.
+
+@item complete-username (M-~)
+Attempt completion on the text before point, treating
+it as a username.
+
+@item possible-username-completions (C-x ~)
+List the possible completions of the text before point,
+treating it as a username.
+
+@item complete-variable (M-$)
+Attempt completion on the text before point, treating
+it as a shell variable.
+
+@item possible-variable-completions (C-x $)
+List the possible completions of the text before point,
+treating it as a shell variable.
+
+@item complete-hostname (M-@@)
+Attempt completion on the text before point, treating
+it as a hostname.
+
+@item possible-hostname-completions (C-x @@)
+List the possible completions of the text before point,
+treating it as a hostname.
+
+@item complete-command (M-!)
+Attempt completion on the text before point, treating
+it as a command name. Command completion attempts to
+match the text against aliases, reserved words, shell
+functions, builtins, and finally executable filenames,
+in that order.
+
+@item possible-command-completions (C-x !)
+List the possible completions of the text before point,
+treating it as a command name.
+
+@item dynamic-complete-history (M-TAB)
+Attempt completion on the text before point, comparing
+the text against lines from the history list for possible
+completion matches.
+
+@item complete-into-braces (M-@{)
+Perform filename completion and return the list of possible completions
+enclosed within braces so the list is available to the shell
+(@pxref{Brace Expansion}).
+@end ifset
@end ftable
@node Keyboard Macros
@@ -786,7 +1039,7 @@ in the macro appear as if typed at the keyboard.
@ftable @code
@item re-read-init-file (C-x C-r)
-Read in the contents of your init file, and incorporate
+Read in the contents of the inputrc file, and incorporate
any bindings or variable assignments found there.
@item abort (C-g)
@@ -794,9 +1047,9 @@ Abort the current editing command and
ring the terminal's bell (subject to the setting of
@code{bell-style}).
-@item do-uppercase-version (M-a, M-b, ...)
-Run the command that is bound to the corresoponding uppercase
-character.
+@item do-uppercase-version (M-a, M-b, M-@var{x}, @dots{})
+If the metafied character @var{x} is lowercase, run the command
+that is bound to the corresponding uppercase character.
@item prefix-meta (ESC)
Make the next character that you type be metafied. This is for people
@@ -813,13 +1066,59 @@ command enough times to get back to the beginning.
@item tilde-expand (M-~)
Perform tilde expansion on the current word.
+@item set-mark (C-@@)
+Set the mark to the current point. If a
+numeric argument is supplied, the mark is set to that position.
+
+@item exchange-point-and-mark (C-x C-x)
+Swap the point with the mark. The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+
+@item character-search (C-])
+A character is read and point is moved to the next occurrence of that
+character. A negative count searches for previous occurrences.
+
+@item character-search-backward (M-C-])
+A character is read and point is moved to the previous occurrence
+of that character. A negative count searches for subsequent
+occurrences.
+
+@item insert-comment (M-#)
+The value of the @code{comment-begin}
+variable is inserted at the beginning of the current line,
+and the line is accepted as if a newline had been typed.
+@ifset BashFeatures
+This makes the current line a shell comment.
+@end ifset
+
@item dump-functions ()
Print all of the functions and their key bindings to the
readline output stream. If a numeric argument is supplied,
the output is formatted in such a way that it can be made part
-of an @var{inputrc} file.
+of an @var{inputrc} file. This command is unbound by default.
+
+@item dump-variables ()
+Print all of the settable variables and their values to the
+readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an @var{inputrc} file. This command is unbound by default.
+
+@item dump-macros ()
+Print all of the readline key sequences bound to macros and the
+strings they ouput. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an @var{inputrc} file. This command is unbound by default.
@ifset BashFeatures
+@item glob-expand-word (C-x *)
+The word before point is treated as a pattern for pathname expansion,
+and the list of matching file names is inserted, replacing the word.
+
+@item glob-list-expansions (C-x g)
+The list of expansions that would have been generated by
+@code{glob-expand-word}
+is inserted into the line, replacing the word before point.
+
@item display-shell-version (C-x C-v)
Display version information about the current instance of Bash.
@@ -831,6 +1130,12 @@ word expansions.
@item history-expand-line (M-^)
Perform history expansion on the current line.
+@item alias-expand-line
+Perform alias expansion on the current line (@pxref{Aliases}).
+
+@item history-and-alias-expand-line
+Perform history and alias expansion on the current line.
+
@item insert-last-argument (M-., M-_)
A synonym for @code{yank-last-arg}.
@@ -841,7 +1146,7 @@ argument is ignored.
@item emacs-editing-mode (C-e)
When in @code{vi} editing mode, this causes a switch back to
-emacs editing mode, as if the command @code{set -o emacs} had
+@code{emacs} editing mode, as if the command @samp{set -o emacs} had
been executed.
@end ifset
@@ -854,15 +1159,15 @@ been executed.
While the Readline library does not have a full set of @code{vi}
editing functions, it does contain enough to allow simple editing
of the line. The Readline @code{vi} mode behaves as specified in
-the Posix 1003.2 standard.
+the @sc{POSIX} 1003.2 standard.
@ifset BashFeatures
-In order to switch interactively between @code{Emacs} and @code{Vi}
-editing modes, use the @code{set -o emacs} and @code{set -o vi}
+In order to switch interactively between @code{emacs} and @code{vi}
+editing modes, use the @samp{set -o emacs} and @samp{set -o vi}
commands (@pxref{The Set Builtin}).
@end ifset
@ifclear BashFeatures
-In order to switch interactively between @code{Emacs} and @code{Vi}
+In order to switch interactively between @code{emacs} and @code{vi}
editing modes, use the command M-C-j (toggle-editing-mode).
@end ifclear
The Readline default is @code{emacs} mode.
@@ -871,5 +1176,5 @@ When you enter a line in @code{vi} mode, you are already placed in
`insertion' mode, as if you had typed an @samp{i}. Pressing @key{ESC}
switches you into `command' mode, where you can edit the text of the
line with the standard @code{vi} movement keys, move to previous
-history lines with @samp{k}, and following lines with @samp{j}, and
+history lines with @samp{k} and subsequent lines with @samp{j}, and
so forth.
diff --git a/doc/texi2dvi b/doc/texi2dvi
new file mode 100755
index 0000000..8fb2f90
--- /dev/null
+++ b/doc/texi2dvi
@@ -0,0 +1,275 @@
+#! /bin/sh
+# texi2dvi --- smartly produce DVI files from texinfo sources
+
+# Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+
+# $Id: texi2dvi,v 0.5 1995/06/20 02:21:36 friedman Exp $
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, 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, you can either send email to this
+# program's maintainer or write to: The Free Software Foundation,
+# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+
+# Commentary:
+
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+
+# Please send bug reports, etc. to bug-texinfo@prep.ai.mit.edu
+# If possible, please send a copy of the output of the script called with
+# the `--debug' option when making a bug report.
+
+# In the interest of general portability, some common bourne shell
+# constructs were avoided because they weren't guaranteed to be available
+# in some earlier implementations. I've tried to make this program as
+# portable as possible. Welcome to unix, where the lowest common
+# denominator is rapidly diminishing.
+#
+# Among the more interesting lossages I noticed with some bourne shells
+# are:
+# * No shell functions.
+# * No `unset' builtin.
+# * `shift' cannot take a numeric argument, and signals an error if
+# there are no arguments to shift.
+
+# Code:
+
+# Name by which this script was invoked.
+progname=`echo "$0" | sed -e 's/[^\/]*\///g'`
+
+# This string is expanded by rcs automatically when this file is checked out.
+rcs_revision='$Revision: 0.5 $'
+version=`set - $rcs_revision; echo $2`
+
+# To prevent hairy quoting and escaping later.
+bq='`'
+eq="'"
+
+usage="Usage: $progname {options} [file1] {file2 {...}}
+(version $version)
+
+Options are:
+-D, --debug Turn on shell debugging ($bq${bq}set -x$eq$eq).
+-h, --help You're looking at it.
+-v, --version Print version number.
+
+Arguments in brackets are required. Those in braces are optional.
+"
+
+# Initialize variables.
+# Don't use `unset' since old bourne shells don't have this command.
+# Instead, assign them an empty value.
+# Some of these, like TEX and TEXINDEX, may be inherited from the environment
+backup_extension=.bak
+debug=
+orig_pwd="`pwd`"
+verbose=
+texindex="${TEXINDEX-texindex}"
+tex="${TEX-tex}"
+
+# Save this so we can construct a new TEXINPUTS path for each file to be
+# processed.
+TEXINPUTS_orig="$TEXINPUTS"
+export TEXINPUTS
+
+# Parse command line arguments.
+# Make sure that all wildcarded options are long enough to be unambiguous.
+# It's a good idea to document the full long option name in each case.
+# Long options which take arguments will need a `*' appended to the
+# canonical name to match the value appended after the `=' character.
+while : ; do
+ case $# in 0) break ;; esac
+ case "$1" in
+ -D | --debug | --d* )
+ debug=t
+ shift
+ ;;
+ -h | --help | --h* )
+ echo "$usage" 1>&2
+ exit 0
+ ;;
+ -v | --version | --v* )
+ echo "texi2dvi version $version" 1>&2
+ exit 0
+ ;;
+ -- ) # Stop option processing
+ shift
+ break
+ ;;
+ -* )
+ case "$1" in
+ --*=* ) arg=`echo "$1" | sed -e 's/=.*//'` ;;
+ * ) arg="$1" ;;
+ esac
+ exec 1>&2
+ echo "$progname: unknown or ambiguous option $bq$arg$eq"
+ echo "$progname: Use $bq--help$eq for a list of options."
+ exit 1
+ ;;
+ * )
+ break
+ ;;
+ esac
+done
+
+# See if there are any command line args left (which will be interpreted as
+# filename arguments)
+case $# in
+ 0 )
+ exec 1>&2
+ echo "$progname: at least one file name is required as an argument."
+ echo "$progname: Use $bq--help$eq for a description of command syntax."
+ exit 2
+ ;;
+esac
+
+case "$debug" in t ) set -x ;; esac
+
+# Texify files
+for command_line_filename in ${1+"$@"} ; do
+ # Roughly equivalent to `dirname ...`, but more portable
+ directory="`echo ${command_line_filename} | sed 's/\/[^\/]*$//'`"
+ filename_texi="`basename ${command_line_filename}`"
+ # Strip off the last extension part (probably .texinfo or .texi)
+ filename_noext="`echo ${filename_texi} | sed 's/\.[^.]*$//'`"
+
+ # If directory and file are the same, then it's probably because there's
+ # no pathname component. Set dirname to `.', the current directory.
+ if test "z${directory}" = "z${command_line_filename}" ; then
+ directory="."
+ fi
+
+ # Source file might @include additional texinfo sources. Put `.' and
+ # directory where source file(s) reside in TEXINPUTS before anything
+ # else. `.' goes first to ensure that any old .aux, .cps, etc. files in
+ # ${directory} don't get used in preference to fresher files in `.'.
+ TEXINPUTS=".:${directory}:${TEXINPUTS_orig}"
+
+ # "Unset" variables that might have values from previous iterations and
+ # which won't be completely reset later.
+ definite_index_files=""
+
+ # See if file exists here. If it doesn't we're in trouble since, even
+ # though the user may be able to reenter a valid filename at the tex
+ # prompt (assuming they're attending the terminal), this script won't be
+ # able to find the right index files and so forth.
+ if test ! -r "${command_line_filename}" ; then
+ echo "${progname}: ${command_line_filename}: No such file or permission denied." 1>&2
+ continue;
+ fi
+
+ # Find all files having root filename with a two-letter extension,
+ # determine whether they're really index files, and save them. Foo.aux
+ # is actually the cross-references file, but we need to keep track of
+ # that too.
+ possible_index_files="`eval echo ${filename_noext}.?? ${filename_noext}.aux`"
+ for this_file in ${possible_index_files} ; do
+ # If file is empty, forget it.
+ if test ! -s "${this_file}" ; then
+ continue;
+ fi
+
+ # Examine first character of file. If it's not a backslash or
+ # single quote, then it's definitely not an index or xref file.
+ first_character="`sed -n '1s/^\(.\).*$/\1/p;q' ${this_file}`"
+ if test "${first_character}" = "\\" -o "${first_character}" = "'" ; then
+ definite_index_files="${definite_index_files} ${this_file}"
+ fi
+ done
+ orig_index_files="${definite_index_files}"
+ orig_index_files_sans_aux="`echo ${definite_index_files} \
+ | sed 's/'${filename_noext}'\.aux//;
+ s/^[ ]*//;s/[ ]*$//;'`"
+
+ # Now save copies of original index files so we have some means of
+ # comparison later.
+ for index_file_to_save in ${orig_index_files} ; do
+ cp "${index_file_to_save}" "${index_file_to_save}${backup_extension}"
+ done
+
+ # Run texindex on current index files. If they already exist, and
+ # after running TeX a first time the index files don't change, then
+ # there's no reason to run TeX again. But we won't know that if the
+ # index files are out of date or nonexistent.
+ if test "${orig_index_files_sans_aux}" ; then
+ ${texindex} ${orig_index_files_sans_aux}
+ fi
+
+ if ${tex} ${command_line_filename} ; then # TeX run first time
+ definite_index_files=""
+ # Get list of new index files
+ possible_index_files="`eval echo ${filename_noext}.?? ${filename_noext}.aux`"
+ for this_file in ${possible_index_files} ; do
+ # If file is empty, forget it.
+ if test ! -s ${this_file} ; then
+ continue;
+ fi
+
+ # Examine first character of file. If it's not a backslash or
+ # single quote, then it's definitely not an index or xref file.
+ first_character="`sed -n '1s/^\(.\).*$/\1/p;q' ${this_file}`"
+ if test "${first_character}" = "\\" -o "${first_character}" = "'" ; then
+ definite_index_files="${definite_index_files} ${this_file}"
+ fi
+ done
+ new_index_files="${definite_index_files}"
+ new_index_files_sans_aux="`echo ${definite_index_files} \
+ | sed 's/'${filename_noext}'\.aux//;
+ s/^[ ]*//;s/[ ]*$//;'`"
+
+ # If old and new list don't at least have the same file list, then one
+ # file or another has definitely changed.
+ if test "${orig_index_files}" != "${new_index_files}" ; then
+ index_files_changed_p=t
+ else
+ # File list is the same. We must compare each file until we find a
+ # difference.
+ index_files_changed_p=""
+ for this_file in ${new_index_files} ; do
+ # cmp -s will return nonzero exit status if files differ.
+ cmp -s "${this_file}" "${this_file}${backup_extension}"
+ if test $? -ne 0 ; then
+ # We only need to keep comparing until we find *one* that
+ # differs, because we'll have to run texindex & tex no
+ # matter what.
+ index_files_changed_p=t
+ break
+ fi
+ done
+ fi
+
+ # If index files have changed since TeX has been run, or if the aux
+ # file wasn't present originally, run texindex and TeX again.
+ if test "${index_files_changed_p}" ; then
+ retval=0
+ if test "${new_index_files_sans_aux}" ; then
+ ${texindex} ${new_index_files_sans_aux}
+ retval=$?
+ fi
+ if test ${retval} -eq 0 ; then
+ ${tex} "${command_line_filename}"
+ fi
+ fi
+ fi
+
+ # Generate list of files to delete, then call rm once with the entire
+ # list. This is significantly faster than multiple executions of rm.
+ file_list=""
+ for file in ${orig_index_files} ; do
+ file_list="${file_list} ${file}${backup_extension}"
+ done
+ if test "${file_list}" ; then
+ rm -f ${file_list}
+ fi
+done
+
+# texi2dvi ends here
diff --git a/doc/texi2html b/doc/texi2html
new file mode 100755
index 0000000..2c61aa9
--- /dev/null
+++ b/doc/texi2html
@@ -0,0 +1,2021 @@
+#!/usr/local/bin/perl
+'di ';
+'ig 00 ';
+#+##############################################################################
+# #
+# File: texi2html #
+# #
+# Description: Program to transform most Texinfo documents to HTML #
+# #
+#-##############################################################################
+
+# @(#)texi2html 1.51 09/10/96 Written (mainly) by Lionel Cons, Lionel.Cons@cern.ch
+
+# The man page for this program is included at the end of this file and can be
+# viewed using the command 'nroff -man texi2html'.
+# Please read the copyright at the end of the man page.
+
+#+++############################################################################
+# #
+# Constants #
+# #
+#---############################################################################
+
+$DEBUG_TOC = 1;
+$DEBUG_INDEX = 2;
+$DEBUG_BIB = 4;
+$DEBUG_GLOSS = 8;
+$DEBUG_DEF = 16;
+$DEBUG_HTML = 32;
+$DEBUG_USER = 64;
+
+$BIBRE = '\[[\w\/]+\]'; # RE for a bibliography reference
+$FILERE = '[\/\w.+-]+'; # RE for a file name
+$VARRE = '[^\s\{\}]+'; # RE for a variable name
+$NODERE = '[^@{}:\'`",]+'; # RE for a node name
+$NODESRE = '[^@{}:\'`"]+'; # RE for a list of node names
+$XREFRE = '[^@{}]+'; # RE for a xref (should use NODERE)
+
+$ERROR = "***"; # prefix for errors and warnings
+$THISPROG = "texi2html 1.51"; # program name and version
+$HOMEPAGE = "http://wwwcn.cern.ch/dci/texi2html/"; # program home page
+$TODAY = &pretty_date; # like "20 September 1993"
+$SPLITTAG = "<!-- SPLIT HERE -->\n"; # tag to know where to split
+$PROTECTTAG = "_ThisIsProtected_"; # tag to recognize protected sections
+$html2_doctype = '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0 Strict Level 2//EN">';
+
+#
+# language dependent constants
+#
+#$LDC_SEE = 'see';
+#$LDC_SECTION = 'section';
+#$LDC_IN = 'in';
+#$LDC_TOC = 'Table of Contents';
+#$LDC_GOTO = 'Go to the';
+#$LDC_FOOT = 'Footnotes';
+# TODO: @def* shortcuts
+
+#
+# pre-defined indices
+#
+%predefined_index = (
+ 'cp', 'c',
+ 'fn', 'f',
+ 'vr', 'v',
+ 'ky', 'k',
+ 'pg', 'p',
+ 'tp', 't',
+ );
+
+#
+# valid indices
+#
+%valid_index = (
+ 'c', 1,
+ 'f', 1,
+ 'v', 1,
+ 'k', 1,
+ 'p', 1,
+ 't', 1,
+ );
+
+#
+# texinfo section names to level
+#
+%sec2level = (
+ 'top', 0,
+ 'chapter', 1,
+ 'unnumbered', 1,
+ 'majorheading', 1,
+ 'chapheading', 1,
+ 'appendix', 1,
+ 'section', 2,
+ 'unnumberedsec', 2,
+ 'heading', 2,
+ 'appendixsec', 2,
+ 'appendixsection', 2,
+ 'subsection', 3,
+ 'unnumberedsubsec', 3,
+ 'subheading', 3,
+ 'appendixsubsec', 3,
+ 'subsubsection', 4,
+ 'unnumberedsubsubsec', 4,
+ 'subsubheading', 4,
+ 'appendixsubsubsec', 4,
+ );
+
+#
+# accent map, TeX command to ISO name
+#
+%accent_map = (
+ '"', 'uml',
+ '~', 'tilde',
+ '^', 'circ',
+ '`', 'grave',
+ '\'', 'acute',
+ );
+
+#
+# texinfo "simple things" (@foo) to HTML ones
+#
+%simple_map = (
+ # cf. makeinfo.c
+ "*", "<BR>", # HTML+
+ " ", " ",
+ "\n", "\n",
+ "|", "",
+ # spacing commands
+ ":", "",
+ "!", "!",
+ "?", "?",
+ ".", ".",
+ );
+
+#
+# texinfo "things" (@foo{}) to HTML ones
+#
+%things_map = (
+ 'TeX', 'TeX',
+ 'br', '<P>', # paragraph break
+ 'bullet', '*',
+ 'copyright', '(C)',
+ 'dots', '...',
+ 'equiv', '==',
+ 'error', 'error-->',
+ 'expansion', '==>',
+ 'minus', '-',
+ 'point', '-!-',
+ 'print', '-|',
+ 'result', '=>',
+ 'today', $TODAY,
+ );
+
+#
+# texinfo styles (@foo{bar}) to HTML ones
+#
+%style_map = (
+ 'asis', '',
+ 'b', 'B',
+ 'cite', 'CITE',
+ 'code', 'CODE',
+ 'ctrl', '&do_ctrl', # special case
+ 'dfn', 'STRONG', # DFN tag is illegal in the standard
+ 'dmn', '', # useless
+ 'emph', 'EM',
+ 'file', '"TT', # will put quotes, cf. &apply_style
+ 'i', 'I',
+ 'kbd', 'KBD',
+ 'key', 'KBD',
+ 'r', '', # unsupported
+ 'samp', '"SAMP', # will put quotes, cf. &apply_style
+ 'sc', '&do_sc', # special case
+ 'strong', 'STRONG',
+ 't', 'TT',
+ 'titlefont', '', # useless
+ 'var', 'VAR',
+ 'w', '', # unsupported
+ );
+
+#
+# texinfo format (@foo/@end foo) to HTML ones
+#
+%format_map = (
+ 'display', 'PRE',
+ 'example', 'PRE',
+ 'format', 'PRE',
+ 'lisp', 'PRE',
+ 'quotation', 'BLOCKQUOTE',
+ 'smallexample', 'PRE',
+ 'smalllisp', 'PRE',
+ # lists
+ 'itemize', 'UL',
+ 'enumerate', 'OL',
+ # poorly supported
+ 'flushleft', 'PRE',
+ 'flushright', 'PRE',
+ );
+
+#
+# texinfo definition shortcuts to real ones
+#
+%def_map = (
+ # basic commands
+ 'deffn', 0,
+ 'defvr', 0,
+ 'deftypefn', 0,
+ 'deftypevr', 0,
+ 'defcv', 0,
+ 'defop', 0,
+ 'deftp', 0,
+ # basic x commands
+ 'deffnx', 0,
+ 'defvrx', 0,
+ 'deftypefnx', 0,
+ 'deftypevrx', 0,
+ 'defcvx', 0,
+ 'defopx', 0,
+ 'deftpx', 0,
+ # shortcuts
+ 'defun', 'deffn Function',
+ 'defmac', 'deffn Macro',
+ 'defspec', 'deffn {Special Form}',
+ 'defvar', 'defvr Variable',
+ 'defopt', 'defvr {User Option}',
+ 'deftypefun', 'deftypefn Function',
+ 'deftypevar', 'deftypevr Variable',
+ 'defivar', 'defcv {Instance Variable}',
+ 'defmethod', 'defop Method',
+ # x shortcuts
+ 'defunx', 'deffnx Function',
+ 'defmacx', 'deffnx Macro',
+ 'defspecx', 'deffnx {Special Form}',
+ 'defvarx', 'defvrx Variable',
+ 'defoptx', 'defvrx {User Option}',
+ 'deftypefunx', 'deftypefnx Function',
+ 'deftypevarx', 'deftypevrx Variable',
+ 'defivarx', 'defcvx {Instance Variable}',
+ 'defmethodx', 'defopx Method',
+ );
+
+#
+# things to skip
+#
+%to_skip = (
+ # comments
+ 'c', 1,
+ 'comment', 1,
+ # useless
+ 'contents', 1,
+ 'shortcontents', 1,
+ 'summarycontents', 1,
+ 'footnotestyle', 1,
+ 'end ifclear', 1,
+ 'end ifset', 1,
+ 'titlepage', 1,
+ 'end titlepage', 1,
+ # unsupported commands (formatting)
+ 'afourpaper', 1,
+ 'cropmarks', 1,
+ 'finalout', 1,
+ 'headings', 1,
+ 'need', 1,
+ 'page', 1,
+ 'setchapternewpage', 1,
+ 'everyheading', 1,
+ 'everyfooting', 1,
+ 'evenheading', 1,
+ 'evenfooting', 1,
+ 'oddheading', 1,
+ 'oddfooting', 1,
+ 'smallbook', 1,
+ 'vskip', 1,
+ 'filbreak', 1,
+ # unsupported formats
+ 'cartouche', 1,
+ 'end cartouche', 1,
+ 'group', 1,
+ 'end group', 1,
+ );
+
+#+++############################################################################
+# #
+# Argument parsing, initialisation #
+# #
+#---############################################################################
+
+$use_bibliography = 1;
+$use_acc = 0;
+$debug = 0;
+$doctype = '';
+$check = 0;
+$expandinfo = 0;
+$use_glossary = 0;
+$invisible_mark = '';
+$use_iso = 0;
+@include_dirs = ();
+$show_menu = 0;
+$number_sections = 0;
+$split_node = 0;
+$split_chapter = 0;
+$monolithic = 0;
+$verbose = 0;
+$usage = <<EOT;
+This is $THISPROG
+To convert a Texinfo file to HMTL: $0 [options] file
+ where options can be:
+ -expandinfo : use \@ifinfo sections, not \@iftex
+ -glossary : handle a glossary
+ -invisible name: use 'name' as an invisible anchor
+ -I dir : search also for files in 'dir'
+ -menu : handle menus
+ -monolithic : output only one file including ToC
+ -number : number sections
+ -split_chapter : split on main sections
+ -split_node : split on nodes
+ -usage : print usage instructions
+ -verbose : verbose output
+To check converted files: $0 -check [-verbose] files
+EOT
+
+while ($#ARGV >= 0 && $ARGV[0] =~ /^-/) {
+ $_ = shift(@ARGV);
+ if (/^-acc$/) { $use_acc = 1; next; }
+ if (/^-d(ebug)?(\d+)?$/) { $debug = $2 || shift(@ARGV); next; }
+ if (/^-doctype$/) { $doctype = shift(@ARGV); next; }
+ if (/^-c(heck)?$/) { $check = 1; next; }
+ if (/^-e(xpandinfo)?$/) { $expandinfo = 1; next; }
+ if (/^-g(lossary)?$/) { $use_glossary = 1; next; }
+ if (/^-i(nvisible)?$/) { $invisible_mark = shift(@ARGV); next; }
+ if (/^-iso$/) { $use_iso = 1; next; }
+ if (/^-I(.+)?$/) { push(@include_dirs, $1 || shift(@ARGV)); next; }
+ if (/^-m(enu)?$/) { $show_menu = 1; next; }
+ if (/^-mono(lithic)?$/) { $monolithic = 1; next; }
+ if (/^-n(umber)?$/) { $number_sections = 1; next; }
+ if (/^-s(plit)?_?(n(ode)?|c(hapter)?)?$/) {
+ if ($2 =~ /^n/) {
+ $split_node = 1;
+ } else {
+ $split_chapter = 1;
+ }
+ next;
+ }
+ if (/^-v(erbose)?$/) { $verbose = 1; next; }
+ die $usage;
+}
+if ($check) {
+ die $usage unless @ARGV > 0;
+ &check;
+ exit;
+}
+
+if (($split_node || $split_chapter) && $monolithic) {
+ warn "Can't use -monolithic with -split, -monolithic ignored.\n";
+ $monolithic = 0;
+}
+if ($expandinfo) {
+ $to_skip{'ifinfo'}++;
+ $to_skip{'end ifinfo'}++;
+} else {
+ $to_skip{'iftex'}++;
+ $to_skip{'end iftex'}++;
+}
+$invisible_mark = '<IMG SRC="invisible.xbm">' if $invisible_mark eq 'xbm';
+die $usage unless @ARGV == 1;
+$docu = shift(@ARGV);
+if ($docu =~ /.*\//) {
+ chop($docu_dir = $&);
+ $docu_name = $';
+} else {
+ $docu_dir = '.';
+ $docu_name = $docu;
+}
+unshift(@include_dirs, $docu_dir);
+$docu_name =~ s/\.te?x(i|info)?$//; # basename of the document
+
+$docu_doc = "$docu_name.html"; # document's contents
+if ($monolithic) {
+ $docu_toc = $docu_foot = $docu_doc;
+} else {
+ $docu_toc = "${docu_name}_toc.html"; # document's table of contents
+ $docu_foot = "${docu_name}_foot.html"; # document's footnotes
+}
+
+#
+# variables
+#
+%value = (); # hold texinfo variables
+$value{'html'} = 1; # predefine html (the output format)
+$value{'texi2html'} = '1.51'; # predefine texi2html (the translator)
+# _foo: internal to track @foo
+foreach ('_author', '_title', '_subtitle',
+ '_settitle', '_setfilename') {
+ $value{$_} = ''; # prevent -w warnings
+}
+%node2sec = (); # node to section name
+%node2href = (); # node to HREF
+%bib2href = (); # bibliography reference to HREF
+%gloss2href = (); # glossary term to HREF
+@sections = (); # list of sections
+%tag2pro = (); # protected sections
+
+#
+# initial indexes
+#
+$bib_num = 0;
+$foot_num = 0;
+$gloss_num = 0;
+$idx_num = 0;
+$sec_num = 0;
+$doc_num = 0;
+$html_num = 0;
+
+#
+# can I use ISO8879 characters? (HTML+)
+#
+if ($use_iso) {
+ $things_map{'bullet'} = "&bull;";
+ $things_map{'copyright'} = "&copy;";
+ $things_map{'dots'} = "&hellip;";
+ $things_map{'equiv'} = "&equiv;";
+ $things_map{'expansion'} = "&rarr;";
+ $things_map{'point'} = "&lowast;";
+ $things_map{'result'} = "&rArr;";
+}
+
+#
+# read texi2html extensions (if any)
+#
+$extensions = 'texi2html.ext'; # extensions in working directory
+if (-f $extensions) {
+ print "# reading extensions from $extensions\n" if $verbose;
+ require($extensions);
+}
+($progdir = $0) =~ s/[^\/]+$//;
+if ($progdir && ($progdir ne './')) {
+ $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory
+ if (-f $extensions) {
+ print "# reading extensions from $extensions\n" if $verbose;
+ require($extensions);
+ }
+}
+
+print "# reading from $docu\n" if $verbose;
+
+#+++############################################################################
+# #
+# Pass 1: read source, handle command, variable, simple substitution #
+# #
+#---############################################################################
+
+@lines = (); # whole document
+@toc_lines = (); # table of contents
+$toplevel = 0; # top level seen in hierarchy
+$curlevel = 0; # current level in TOC
+$node = ''; # current node name
+$in_table = 0; # am I inside a table
+$table_type = ''; # type of table ('', 'f', 'v')
+@tables = (); # nested table support
+$in_bibliography = 0; # am I inside a bibliography
+$in_glossary = 0; # am I inside a glossary
+$in_top = 0; # am I inside the top node
+$in_pre = 0; # am I inside a preformatted section
+$in_list = 0; # am I inside a list
+$in_html = 0; # am I inside an HTML section
+$first_line = 1; # is it the first line
+$dont_html = 0; # don't protect HTML on this line
+$split_num = 0; # split index
+$deferred_ref = ''; # deferred reference for indexes
+@html_stack = (); # HTML elements stack
+$html_element = ''; # current HTML element
+&html_reset;
+
+# build code for simple substitutions
+# the maps used (%simple_map and %things_map) MUST be aware of this
+# watch out for regexps, / and escaped characters!
+$subst_code = '';
+foreach (keys(%simple_map)) {
+ ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars
+ $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n";
+}
+foreach (keys(%things_map)) {
+ $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n";
+}
+if ($use_acc) {
+ # accentuated characters
+ foreach (keys(%accent_map)) {
+ if ($_ eq "`") {
+ $subst_code .= "s/$;3";
+ } elsif ($_ eq "'") {
+ $subst_code .= "s/$;4";
+ } else {
+ $subst_code .= "s/\\\@\\$_";
+ }
+ $subst_code .= "([aeiou])/&\${1}$accent_map{$_};/gi;\n";
+ }
+}
+eval("sub simple_substitutions { $subst_code }");
+
+&init_input;
+while ($_ = &next_line) {
+ #
+ # remove \input on the first lines only
+ #
+ if ($first_line) {
+ next if /^\\input/;
+ $first_line = 0;
+ }
+ #
+ # parse texinfo tags
+ #
+ $tag = '';
+ $end_tag = '';
+ if (/^\@end\s+(\w+)\b/) {
+ $end_tag = $1;
+ } elsif (/^\@(\w+)\b/) {
+ $tag = $1;
+ }
+ #
+ # handle @ifhtml / @end ifhtml
+ #
+ if ($in_html) {
+ if ($end_tag eq 'ifhtml') {
+ $in_html = 0;
+ } else {
+ $tag2pro{$in_html} .= $_;
+ }
+ next;
+ } elsif ($tag eq 'ifhtml') {
+ $in_html = $PROTECTTAG . ++$html_num;
+ push(@lines, $in_html);
+ next;
+ }
+ #
+ # try to skip the line
+ #
+ if ($end_tag) {
+ next if $to_skip{"end $end_tag"};
+ } elsif ($tag) {
+ next if $to_skip{$tag};
+ last if $tag eq 'bye';
+ }
+ if ($in_top) {
+ # parsing the top node
+ if ($tag eq 'node' || $tag eq 'include' || $sec2level{$tag}) {
+ # no more in top
+ $in_top = 0;
+ } else {
+ # skip it
+ next;
+ }
+ }
+ #
+ # try to remove inlined comments
+ # syntax from tex-mode.el comment-start-skip
+ #
+ s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/;
+ # non-@ substitutions cf. texinfmt.el
+ s/``/\"/g;
+ s/''/\"/g;
+ s/([\w ])---([\w ])/$1--$2/g;
+ #
+ # analyze the tag
+ #
+ if ($tag) {
+ # skip lines
+ &skip_until($tag), next if $tag eq 'ignore';
+ if ($expandinfo) {
+ &skip_until($tag), next if $tag eq 'iftex';
+ } else {
+ &skip_until($tag), next if $tag eq 'ifinfo';
+ }
+ &skip_until($tag), next if $tag eq 'tex';
+ # handle special tables
+ if ($tag eq 'table') {
+ $table_type = '';
+ } elsif ($tag eq 'ftable') {
+ $tag = 'table';
+ $table_type = 'f';
+ } elsif ($tag eq 'vtable') {
+ $tag = 'table';
+ $table_type = 'v';
+ }
+ # special cases
+ if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*,/i)) {
+ $in_top = 1;
+ @lines = (); # ignore all lines before top (title page garbage)
+ next;
+ } elsif ($tag eq 'node') {
+ $in_top = 0;
+ warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o;
+ $_ = &protect_html($_); # if node contains '&' for instance
+ s/^\@node\s+//;
+ ($node) = split(/,/);
+ &normalise_node($node);
+ if ($split_node) {
+ &next_doc;
+ push(@lines, $SPLITTAG) if $split_num++;
+ push(@sections, $node);
+ }
+ next;
+ } elsif ($tag eq 'include') {
+ if (/^\@include\s+($FILERE)\s*$/o) {
+ $file = $1;
+ unless (-e $file) {
+ foreach $dir (@include_dirs) {
+ $file = "$dir/$1";
+ last if -e $file;
+ }
+ }
+ if (-e $file) {
+ &open($file);
+ print "# including $file\n" if $verbose;
+ } else {
+ warn "$ERROR Can't find $file, skipping";
+ }
+ } else {
+ warn "$ERROR Bad include line: $_";
+ }
+ next;
+ } elsif ($tag eq 'ifclear') {
+ if (/^\@ifclear\s+($VARRE)\s*$/o) {
+ next unless defined($value{$1});
+ &skip_until($tag);
+ } else {
+ warn "$ERROR Bad ifclear line: $_";
+ }
+ next;
+ } elsif ($tag eq 'ifset') {
+ if (/^\@ifset\s+($VARRE)\s*$/o) {
+ next if defined($value{$1});
+ &skip_until($tag);
+ } else {
+ warn "$ERROR Bad ifset line: $_";
+ }
+ next;
+ } elsif ($tag eq 'menu') {
+ unless ($show_menu) {
+ &skip_until($tag);
+ next;
+ }
+ &html_push_if($tag);
+ push(@lines, &html_debug("\n", __LINE__));
+ } elsif ($format_map{$tag}) {
+ $in_pre = 1 if $format_map{$tag} eq 'PRE';
+ &html_push_if($format_map{$tag});
+ push(@lines, &html_debug("\n", __LINE__));
+ $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ;
+ push(@lines, &debug("<$format_map{$tag}>\n", __LINE__));
+ next;
+ } elsif ($tag eq 'table') {
+ if (/^\@[fv]?table\s+\@(\w+)\s*$/) {
+ $in_table = $1;
+ unshift(@tables, join($;, $table_type, $in_table));
+ push(@lines, &debug("<DL COMPACT>\n", __LINE__));
+ &html_push_if('DL');
+ push(@lines, &html_debug("\n", __LINE__));
+ } else {
+ warn "$ERROR Bad table line: $_";
+ }
+ next;
+ } elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') {
+ if (/^\@$tag\s+(\w)\w\s+(\w)\w\s*$/) {
+ eval("*${1}index = *${2}index");
+ } else {
+ warn "$ERROR Bad syn*index line: $_";
+ }
+ next;
+ } elsif ($tag eq 'sp') {
+ push(@lines, &debug("<P>\n", __LINE__));
+ next;
+ } elsif ($tag eq 'setref') {
+ &protect_html; # if setref contains '&' for instance
+ if (/^\@$tag\s*{($NODERE)}\s*$/) {
+ $setref = $1;
+ $setref =~ s/\s+/ /g; # normalize
+ $setref =~ s/ $//;
+ $node2sec{$setref} = $name;
+ $node2href{$setref} = "$docu_doc#$docid";
+ } else {
+ warn "$ERROR Bad setref line: $_";
+ }
+ next;
+ } elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') {
+ if (/^\@$tag\s+(\w\w)\s*$/) {
+ $valid_index{$1} = 1;
+ } else {
+ warn "$ERROR Bad defindex line: $_";
+ }
+ next;
+ } elsif (defined($def_map{$tag})) {
+ if ($def_map{$tag}) {
+ s/^\@$tag\s+//;
+ $tag = $def_map{$tag};
+ $_ = "\@$tag $_";
+ $tag =~ s/\s.*//;
+ }
+ } elsif (defined($user_sub{$tag})) {
+ s/^\@$tag\s+//;
+ $sub = $user_sub{$tag};
+ print "# user $tag = $sub, arg: $_" if $debug & $DEBUG_USER;
+ if (defined(&$sub)) {
+ chop($_);
+ &$sub($_);
+ } else {
+ warn "$ERROR Bad user sub for $tag: $sub\n";
+ }
+ next;
+ }
+ if (defined($def_map{$tag})) {
+ s/^\@$tag\s+//;
+ if ($tag =~ /x$/) {
+ # extra definition line
+ $tag = $`;
+ $is_extra = 1;
+ } else {
+ $is_extra = 0;
+ }
+ while (/\{([^\{\}]*)\}/) {
+ # this is a {} construct
+ ($before, $contents, $after) = ($`, $1, $');
+ # protect spaces
+ $contents =~ s/\s+/$;9/g;
+ # restore $_ protecting {}
+ $_ = "$before$;7$contents$;8$after";
+ }
+ @args = split(/\s+/, &protect_html($_));
+ foreach (@args) {
+ s/$;9/ /g; # unprotect spaces
+ s/$;7/\{/g; # ... {
+ s/$;8/\}/g; # ... }
+ }
+ $type = shift(@args);
+ $type =~ s/^\{(.*)\}$/$1/;
+ print "# def ($tag): {$type} ", join(', ', @args), "\n"
+ if $debug & $DEBUG_DEF;
+ $type .= ':'; # it's nicer like this
+ $name = shift(@args);
+ $name =~ s/^\{(.*)\}$/$1/;
+ if ($is_extra) {
+ $_ = &debug("<DT>", __LINE__);
+ } else {
+ $_ = &debug("<DL>\n<DT>", __LINE__);
+ }
+ if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') {
+ $_ .= "<U>$type</U> <B>$name</B>";
+ $_ .= " <I>@args</I>" if @args;
+ } elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr'
+ || $tag eq 'defcv' || $tag eq 'defop') {
+ $ftype = $name;
+ $name = shift(@args);
+ $name =~ s/^\{(.*)\}$/$1/;
+ $_ .= "<U>$type</U> $ftype <B>$name</B>";
+ $_ .= " <I>@args</I>" if @args;
+ } else {
+ warn "$ERROR Unknown definition type: $tag\n";
+ $_ .= "<U>$type</U> <B>$name</B>";
+ $_ .= " <I>@args</I>" if @args;
+ }
+ $_ .= &debug("\n<DD>", __LINE__);
+ $name = &unprotect_html($name);
+ if ($tag eq 'deffn' || $tag eq 'deftypefn') {
+ unshift(@input_spool, "\@findex $name\n");
+ } elsif ($tag eq 'defop') {
+ unshift(@input_spool, "\@findex $name on $ftype\n");
+ } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') {
+ unshift(@input_spool, "\@vindex $name\n");
+ } else {
+ unshift(@input_spool, "\@tindex $name\n");
+ }
+ $dont_html = 1;
+ }
+ } elsif ($end_tag) {
+ if ($format_map{$end_tag}) {
+ $in_pre = 0 if $format_map{$end_tag} eq 'PRE';
+ $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ;
+ &html_pop_if('LI', 'P');
+ &html_pop_if();
+ push(@lines, &debug("</$format_map{$end_tag}>\n", __LINE__));
+ push(@lines, &html_debug("\n", __LINE__));
+ } elsif ($end_tag eq 'table' ||
+ $end_tag eq 'ftable' ||
+ $end_tag eq 'vtable') {
+ shift(@tables);
+ if (@tables) {
+ ($table_type, $in_table) = split($;, $tables[0]);
+ } else {
+ $in_table = 0;
+ }
+ push(@lines, "</DL>\n");
+ &html_pop_if('DD');
+ &html_pop_if();
+ } elsif (defined($def_map{$end_tag})) {
+ push(@lines, &debug("</DL>\n", __LINE__));
+ } elsif ($end_tag eq 'menu') {
+ &html_pop_if();
+ push(@lines, $_); # must keep it for pass 2
+ }
+ next;
+ }
+ #
+ # misc things
+ #
+ # protect texi and HTML things
+ &protect_texi;
+ $_ = &protect_html($_) unless $dont_html;
+ $dont_html = 0;
+ # substitution (unsupported things)
+ s/^\@center\s+//g;
+ s/^\@exdent\s+//g;
+ s/\@noindent\s+//g;
+ s/\@refill\s+//g;
+ # other substitutions
+ &simple_substitutions;
+ s/\@value{($VARRE)}/$value{$1}/eg;
+ s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4
+ #
+ # analyze the tag again
+ #
+ if ($tag) {
+ if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) {
+ if (/^\@$tag\s+(.+)$/) {
+ $name = $1;
+ $name =~ s/\s+$//;
+ $level = $sec2level{$tag};
+ $name = &update_sec_num($tag, $level) . " $name"
+ if $number_sections && $tag !~ /^unnumbered/;
+ if ($tag =~ /heading$/) {
+ push(@lines, &html_debug("\n", __LINE__));
+ if ($html_element ne 'body') {
+ # We are in a nice pickle here. We are trying to get a H? heading
+ # even though we are not in the body level. So, we convert it to a
+ # nice, bold, line by itself.
+ $_ = &debug("\n\n<P><STRONG>$name</STRONG></P>\n\n", __LINE__);
+ } else {
+ $_ = &debug("<H$level>$name</H$level>\n", __LINE__);
+ &html_push_if('body');
+ }
+ print "# heading, section $name, level $level\n"
+ if $debug & $DEBUG_TOC;
+ } else {
+ if ($split_chapter) {
+ unless ($toplevel) {
+ # first time we see a "section"
+ unless ($level == 1) {
+ warn "$ERROR The first section found is not of level 1: $_";
+ warn "$ERROR I'll split on sections of level $level...\n";
+ }
+ $toplevel = $level;
+ }
+ if ($level == $toplevel) {
+ &next_doc;
+ push(@lines, $SPLITTAG) if $split_num++;
+ push(@sections, $name);
+ }
+ }
+ $sec_num++;
+ $docid = "SEC$sec_num";
+ $tocid = "TOC$sec_num";
+ # check biblio and glossary
+ $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i);
+ $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i);
+ # check node
+ if ($node) {
+ if ($node2sec{$node}) {
+ warn "$ERROR Duplicate node found: $node\n";
+ } else {
+ $node2sec{$node} = $name;
+ $node2href{$node} = "$docu_doc#$docid";
+ print "# node $node, section $name, level $level\n"
+ if $debug & $DEBUG_TOC;
+ }
+ $node = '';
+ } else {
+ print "# no node, section $name, level $level\n"
+ if $debug & $DEBUG_TOC;
+ }
+ # update TOC
+ while ($level > $curlevel) {
+ $curlevel++;
+ push(@toc_lines, "<UL>\n");
+ }
+ while ($level < $curlevel) {
+ $curlevel--;
+ push(@toc_lines, "</UL>\n");
+ }
+ $_ = "<LI>" . &anchor($tocid, "$docu_doc#$docid", $name, 1);
+ push(@toc_lines, &substitute_style($_));
+ # update DOC
+ push(@lines, &html_debug("\n", __LINE__));
+ &html_reset;
+ $_ = "<H$level>".&anchor($docid, "$docu_toc#$tocid", $name)."</H$level>\n";
+ $_ = &debug($_, __LINE__);
+ push(@lines, &html_debug("\n", __LINE__));
+ }
+ # update DOC
+ foreach $line (split(/\n+/, $_)) {
+ push(@lines, "$line\n");
+ }
+ next;
+ } else {
+ warn "$ERROR Bad section line: $_";
+ }
+ } else {
+ # track variables
+ $value{$1} = $2, next if /^\@set\s+($VARRE)\s+(.*)$/o;
+ delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o;
+ # store things
+ $value{'_setfilename'} = $1, next if /^\@setfilename\s+(.*)$/;
+ $value{'_settitle'} = $1, next if /^\@settitle\s+(.*)$/;
+ $value{'_author'} .= "$1\n", next if /^\@author\s+(.*)$/;
+ $value{'_subtitle'} .= "$1\n", next if /^\@subtitle\s+(.*)$/;
+ $value{'_title'} .= "$1\n", next if /^\@title\s+(.*)$/;
+ # index
+ if (/^\@(..?)index\s+/) {
+ unless ($valid_index{$1}) {
+ warn "$ERROR Undefined index command: $_";
+ next;
+ }
+ $id = 'IDX' . ++$idx_num;
+ $index = $1 . 'index';
+ $what = &substitute_style($');
+ $what =~ s/\s+$//;
+ print "# found $index for '$what' id $id\n"
+ if $debug & $DEBUG_INDEX;
+ eval(<<EOC);
+ if (defined(\$$index\{\$what\})) {
+ \$$index\{\$what\} .= "$;$docu_doc#$id";
+ } else {
+ \$$index\{\$what\} = "$docu_doc#$id";
+ }
+EOC
+ #
+ # dirty hack to see if I can put an invisible anchor...
+ #
+ if ($html_element eq 'P' ||
+ $html_element eq 'LI' ||
+ $html_element eq 'DT' ||
+ $html_element eq 'DD' ||
+ $html_element eq 'ADDRESS' ||
+ $html_element eq 'B' ||
+ $html_element eq 'BLOCKQUOTE' ||
+ $html_element eq 'PRE' ||
+ $html_element eq 'SAMP') {
+ push(@lines, &anchor($id, '', $invisible_mark, !$in_pre));
+ } elsif ($html_element eq 'body') {
+ push(@lines, &debug("<P>\n", __LINE__));
+ push(@lines, &anchor($id, '', $invisible_mark, !$in_pre));
+ &html_push('P');
+ } elsif ($html_element eq 'DL' ||
+ $html_element eq 'UL' ||
+ $html_element eq 'OL' ) {
+ $deferred_ref .= &anchor($id, '', $invisible_mark, !$in_pre) . " ";
+ }
+ next;
+ }
+ # list item
+ if (/^\@itemx?\s+/) {
+ $what = $';
+ $what =~ s/\s+$//;
+ if ($in_bibliography && $use_bibliography) {
+ if ($what =~ /^$BIBRE$/o) {
+ $id = 'BIB' . ++$bib_num;
+ $bib2href{$what} = "$docu_doc#$id";
+ print "# found bibliography for '$what' id $id\n"
+ if $debug & $DEBUG_BIB;
+ $what = &anchor($id, '', $what);
+ }
+ } elsif ($in_glossary && $use_glossary) {
+ $id = 'GLOSS' . ++$gloss_num;
+ $entry = $what;
+ $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
+ $gloss2href{$entry} = "$docu_doc#$id";
+ print "# found glossary for '$entry' id $id\n"
+ if $debug & $DEBUG_GLOSS;
+ $what = &anchor($id, '', $what);
+ }
+ &html_pop_if('P');
+ if ($html_element eq 'DL' || $html_element eq 'DD') {
+ if ($things_map{$in_table} && !$what) {
+ # special case to allow @table @bullet for instance
+ push(@lines, &debug("<DT>$things_map{$in_table}\n", __LINE__));
+ } else {
+ push(@lines, &debug("<DT>\@$in_table\{$what\}\n", __LINE__));
+ }
+ push(@lines, "<DD>");
+ &html_push('DD') unless $html_element eq 'DD';
+ if ($table_type) { # add also an index
+ unshift(@input_spool, "\@${table_type}index $what\n");
+ }
+ } else {
+ push(@lines, &debug("<LI>$what\n", __LINE__));
+ &html_push('LI') unless $html_element eq 'LI';
+ }
+ push(@lines, &html_debug("\n", __LINE__));
+ if ($deferred_ref) {
+ push(@lines, &debug("$deferred_ref\n", __LINE__));
+ $deferred_ref = '';
+ }
+ next;
+ }
+ }
+ }
+ # paragraph separator
+ if ($_ eq "\n") {
+ next if $#lines >= 0 && $lines[$#lines] eq "\n";
+ if ($html_element eq 'P') {
+ push(@lines, "\n");
+ $_ = &debug("</P>\n", __LINE__);
+ &html_pop;
+ }
+ } elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE') {
+ push(@lines, "<P>\n");
+ &html_push('P');
+ $_ = &debug($_, __LINE__);
+ }
+ # otherwise
+ push(@lines, $_);
+}
+
+# finish TOC
+$level = 0;
+while ($level < $curlevel) {
+ $curlevel--;
+ push(@toc_lines, "</UL>\n");
+}
+
+print "# end of pass 1\n" if $verbose;
+
+#+++############################################################################
+# #
+# Pass 2/3: handle style, menu, index, cross-reference #
+# #
+#---############################################################################
+
+@lines2 = (); # whole document (2nd pass)
+@lines3 = (); # whole document (3rd pass)
+$in_menu = 0; # am I inside a menu
+
+while (@lines) {
+ $_ = shift(@lines);
+ #
+ # special case (protected sections)
+ #
+ if (/^$PROTECTTAG/o) {
+ push(@lines2, $_);
+ next;
+ }
+ #
+ # menu
+ #
+ $in_menu = 1, push(@lines2, &debug("<UL>\n", __LINE__)), next if /^\@menu\b/;
+ $in_menu = 0, push(@lines2, &debug("</UL>\n", __LINE__)), next if /^\@end\s+menu\b/;
+ if ($in_menu) {
+ if (/^\*\s+($NODERE)::/o) {
+ $descr = $';
+ chop($descr);
+ &menu_entry($1, $1, $descr);
+ } elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/) {
+ $descr = $';
+ chop($descr);
+ &menu_entry($1, $2, $descr);
+ } elsif (/^\*/) {
+ warn "$ERROR Bad menu line: $_";
+ } else { # description continued?
+ push(@lines2, $_);
+ }
+ next;
+ }
+ #
+ # printindex
+ #
+ if (/^\@printindex\s+(\w\w)\b/) {
+ local($index, *ary, @keys, $key, $letter, $last_letter, @refs);
+ if ($predefined_index{$1}) {
+ $index = $predefined_index{$1} . 'index';
+ } else {
+ $index = $1 . 'index';
+ }
+ eval("*ary = *$index");
+ @keys = keys(%ary);
+ foreach $key (@keys) {
+ $_ = $key;
+ 1 while s/<(\w+)>\`(.*)\'<\/\1>/$2/; # remove HTML tags with quotes
+ 1 while s/<(\w+)>(.*)<\/\1>/$2/; # remove HTML tags
+ $_ = &unprotect_html($_);
+ &unprotect_texi;
+ tr/A-Z/a-z/; # lowercase
+ $key2alpha{$key} = $_;
+ print "# index $key sorted as $_\n"
+ if $key ne $_ && $debug & $DEBUG_INDEX;
+ }
+ $last_letter = undef;
+ foreach $key (sort byalpha @keys) {
+ $letter = substr($key2alpha{$key}, 0, 1);
+ $letter = substr($key2alpha{$key}, 0, 2) if $letter eq $;;
+ if (!defined($last_letter) || $letter ne $last_letter) {
+ push(@lines2, "</DIR>\n") if defined($last_letter);
+ push(@lines2, "<H2>" . &protect_html($letter) . "</H2>\n");
+ push(@lines2, "<DIR>\n");
+ $last_letter = $letter;
+ }
+ @refs = ();
+ foreach (split(/$;/, $ary{$key})) {
+ push(@refs, &anchor('', $_, $key, 0));
+ }
+ push(@lines2, "<LI>" . join(", ", @refs) . "\n");
+ }
+ push(@lines2, "</DIR>\n") if defined($last_letter);
+ next;
+ }
+ #
+ # simple style substitutions
+ #
+ $_ = &substitute_style($_);
+ #
+ # xref
+ #
+ while (/\@(x|px|info|)ref{($XREFRE)(}?)/o) {
+ # note: Texinfo may accept other characters
+ ($type, $nodes, $full) = ($1, $2, $3);
+ ($before, $after) = ($`, $');
+ if (! $full && $after) {
+ warn "$ERROR Bad xref (no ending } on line): $_";
+ $_ = "$before$;0${type}ref\{$nodes$after";
+ next; # while xref
+ }
+ if ($type eq 'x') {
+ $type = 'See ';
+ } elsif ($type eq 'px') {
+ $type = 'see ';
+ } elsif ($type eq 'info') {
+ $type = 'See Info';
+ } else {
+ $type = '';
+ }
+ unless ($full) {
+ $next = shift(@lines);
+ $next = &substitute_style($next);
+ chop($nodes); # remove final newline
+ if ($next =~ /\}/) { # split on 2 lines
+ $nodes .= " $`";
+ $after = $';
+ } else {
+ $nodes .= " $next";
+ $next = shift(@lines);
+ $next = &substitute_style($next);
+ chop($nodes);
+ if ($next =~ /\}/) { # split on 3 lines
+ $nodes .= " $`";
+ $after = $';
+ } else {
+ warn "$ERROR Bad xref (no ending }): $_";
+ $_ = "$before$;0xref\{$nodes$after";
+ unshift(@lines, $next);
+ next; # while xref
+ }
+ }
+ }
+ $nodes =~ s/\s+/ /g; # remove useless spaces
+ @args = split(/\s*,\s*/, $nodes);
+ $node = $args[0]; # the node is always the first arg
+ &normalise_node($node);
+ $sec = $node2sec{$node};
+ if (@args == 5) { # reference to another manual
+ $sec = $args[2] || $node;
+ $man = $args[4] || $args[3];
+ $_ = "${before}${type}section `$sec' in \@cite{$man}$after";
+ } elsif ($type =~ /Info/) { # inforef
+ warn "$ERROR Wrong number of arguments: $_" unless @args == 3;
+ ($nn, $_, $in) = @args;
+ $_ = "${before}${type} file `$in', node `$nn'$after";
+ } elsif ($sec) {
+ $href = $node2href{$node};
+ $_ = "${before}${type}section " . &anchor('', $href, $sec) . $after;
+ } else {
+ warn "$ERROR Undefined node ($node): $_";
+ $_ = "$before$;0xref{$nodes}$after";
+ }
+ }
+ #
+ # try to guess bibliography references or glossary terms
+ #
+ unless (/^<H\d><A NAME=\"SEC\d/) {
+ if ($use_bibliography) {
+ $done = '';
+ while (/$BIBRE/o) {
+ ($pre, $what, $post) = ($`, $&, $');
+ $href = $bib2href{$what};
+ if (defined($href) && $post !~ /^[^<]*<\/A>/) {
+ $done .= $pre . &anchor('', $href, $what);
+ } else {
+ $done .= "$pre$what";
+ }
+ $_ = $post;
+ }
+ $_ = $done . $_;
+ }
+ if ($use_glossary) {
+ $done = '';
+ while (/\b\w+\b/) {
+ ($pre, $what, $post) = ($`, $&, $');
+ $entry = $what;
+ $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
+ $href = $gloss2href{$entry};
+ if (defined($href) && $post !~ /^[^<]*<\/A>/) {
+ $done .= $pre . &anchor('', $href, $what);
+ } else {
+ $done .= "$pre$what";
+ }
+ $_ = $post;
+ }
+ $_ = $done . $_;
+ }
+ }
+ # otherwise
+ push(@lines2, $_);
+}
+print "# end of pass 2\n" if $verbose;
+
+#
+# split style substitutions
+#
+while (@lines2) {
+ $_ = shift(@lines2);
+ #
+ # special case (protected sections)
+ #
+ if (/^$PROTECTTAG/o) {
+ push(@lines3, $_);
+ next;
+ }
+ #
+ # split style substitutions
+ #
+ $old = '';
+ while ($old ne $_) {
+ $old = $_;
+ if (/\@(\w+)\{/) {
+ ($before, $style, $after) = ($`, $1, $');
+ if (defined($style_map{$style})) {
+ $_ = $after;
+ $text = '';
+ $after = '';
+ $failed = 1;
+ while (@lines2) {
+ if (/\}/) {
+ $text .= $`;
+ $after = $';
+ $failed = 0;
+ last;
+ } else {
+ $text .= $_;
+ $_ = shift(@lines2);
+ }
+ }
+ if ($failed) {
+ die "* Bad syntax (\@$style) after: $before\n";
+ } else {
+ $text = &apply_style($style, $text);
+ $_ = "$before$text$after";
+ }
+ }
+ }
+ }
+ # otherwise
+ push(@lines3, $_);
+}
+print "# end of pass 3\n" if $verbose;
+
+#+++############################################################################
+# #
+# Pass 4: foot notes, final cleanup #
+# #
+#---############################################################################
+
+@foot_lines = (); # footnotes
+@doc_lines = (); # final document
+$end_of_para = 0; # true if last line is <P>
+
+while (@lines3) {
+ $_ = shift(@lines3);
+ #
+ # special case (protected sections)
+ #
+ if (/^$PROTECTTAG/o) {
+ push(@doc_lines, $_);
+ $end_of_para = 0;
+ next;
+ }
+ #
+ # footnotes
+ #
+ while (/\@footnote([^\{\s]+)\{/) {
+ ($before, $d, $after) = ($`, $1, $');
+ $_ = $after;
+ $text = '';
+ $after = '';
+ $failed = 1;
+ while (@lines3) {
+ if (/\}/) {
+ $text .= $`;
+ $after = $';
+ $failed = 0;
+ last;
+ } else {
+ $text .= $_;
+ $_ = shift(@lines3);
+ }
+ }
+ if ($failed) {
+ die "* Bad syntax (\@footnote) after: $before\n";
+ } else {
+ $foot_num++;
+ $docid = "DOCF$foot_num";
+ $footid = "FOOT$foot_num";
+ $foot = "($foot_num)";
+ push(@foot_lines, "<H3>" . &anchor($footid, "$d#$docid", $foot) . "</H3>\n");
+ $text = "<P>$text" unless $text =~ /^\s*<P>/;
+ push(@foot_lines, "$text\n");
+ $_ = $before . &anchor($docid, "$docu_foot#$footid", $foot) . $after;
+ }
+ }
+ #
+ # remove unnecessary <P>
+ #
+ if (/^\s*<P>\s*$/) {
+ next if $end_of_para++;
+ } else {
+ $end_of_para = 0;
+ }
+ # otherwise
+ push(@doc_lines, $_);
+}
+print "# end of pass 4\n" if $verbose;
+
+#+++############################################################################
+# #
+# Pass 5: print things #
+# #
+#---############################################################################
+
+$header = <<EOT;
+<!-- This HTML file has been created by $THISPROG
+ from $docu on $TODAY -->
+EOT
+
+$full_title = $value{'_title'} || $value{'_settitle'} || "Untitled Document";
+$title = $value{'_settitle'} || $full_title;
+$_ = &substitute_style($full_title);
+&unprotect_texi;
+s/\n$//; # rmv last \n (if any)
+$full_title = "<H1>" . join("</H1>\n<H1>", split(/\n/, $_)) . "</H1>\n";
+
+#
+# print ToC
+#
+if (!$monolithic && @toc_lines) {
+ if (open(FILE, "> $docu_toc")) {
+ print "# creating $docu_toc...\n" if $verbose;
+ &print_toplevel_header("$title - Table of Contents");
+ &print_ruler;
+ &print(*toc_lines, FILE);
+ &print_toplevel_footer;
+ close(FILE);
+ } else {
+ warn "$ERROR Can't write to $docu_toc: $!\n";
+ }
+}
+
+#
+# print footnotes
+#
+if (!$monolithic && @foot_lines) {
+ if (open(FILE, "> $docu_foot")) {
+ print "# creating $docu_foot...\n" if $verbose;
+ &print_toplevel_header("$title - Footnotes");
+ &print_ruler;
+ &print(*foot_lines, FILE);
+ &print_toplevel_footer;
+ close(FILE);
+ } else {
+ warn "$ERROR Can't write to $docu_foot: $!\n";
+ }
+}
+
+#
+# print document
+#
+if ($split_chapter || $split_node) { # split
+ $doc_num = 0;
+ $last_num = scalar(@sections);
+ $first_doc = &doc_name(1);
+ $last_doc = &doc_name($last_num);
+ while (@sections) {
+ $section = shift(@sections);
+ &next_doc;
+ if (open(FILE, "> $docu_doc")) {
+ print "# creating $docu_doc...\n" if $verbose;
+ &print_header("$title - $section");
+ $prev_doc = ($doc_num == 1 ? undef : &doc_name($doc_num - 1));
+ $next_doc = ($doc_num == $last_num ? undef : &doc_name($doc_num + 1));
+ $navigation = "Go to the ";
+ $navigation .= ($prev_doc ? &anchor('', $first_doc, "first") : "first");
+ $navigation .= ", ";
+ $navigation .= ($prev_doc ? &anchor('', $prev_doc, "previous") : "previous");
+ $navigation .= ", ";
+ $navigation .= ($next_doc ? &anchor('', $next_doc, "next") : "next");
+ $navigation .= ", ";
+ $navigation .= ($next_doc ? &anchor('', $last_doc, "last") : "last");
+ $navigation .= " section, " . &anchor('', $docu_toc, "table of contents") . ".\n";
+ print FILE $navigation;
+ &print_ruler;
+ # find corresponding lines
+ @tmp_lines = ();
+ while (@doc_lines) {
+ $_ = shift(@doc_lines);
+ last if ($_ eq $SPLITTAG);
+ push(@tmp_lines, $_);
+ }
+ &print(*tmp_lines, FILE);
+ &print_ruler;
+ print FILE $navigation;
+ &print_footer;
+ close(FILE);
+ } else {
+ warn "$ERROR Can't write to $docu_doc: $!\n";
+ }
+ }
+} else { # not split
+ if (open(FILE, "> $docu_doc")) {
+ print "# creating $docu_doc...\n" if $verbose;
+ if ($monolithic || !@toc_lines) {
+ &print_toplevel_header($title);
+ } else {
+ &print_header($title);
+ print FILE $full_title;
+ }
+ if ($monolithic && @toc_lines) {
+ &print_ruler;
+ print FILE "<H1>Table of Contents</H1>\n";
+ &print(*toc_lines, FILE);
+ }
+ &print_ruler;
+ &print(*doc_lines, FILE);
+ if ($monolithic && @foot_lines) {
+ &print_ruler;
+ print FILE "<H1>Footnotes</H1>\n";
+ &print(*foot_lines, FILE);
+ }
+ if ($monolithic || !@toc_lines) {
+ &print_toplevel_footer;
+ } else {
+ &print_footer;
+ }
+ close(FILE);
+ } else {
+ warn "$ERROR Can't write to $docu_doc: $!\n";
+ }
+}
+
+print "# that's all folks\n" if $verbose;
+
+#+++############################################################################
+# #
+# Low level functions #
+# #
+#---############################################################################
+
+sub update_sec_num {
+ local($name, $level) = @_;
+
+ $level--; # here we start at 0
+ if ($name =~ /^appendix/) {
+ # appendix style
+ if (defined(@appendix_sec_num)) {
+ &incr_sec_num($level, @appendix_sec_num);
+ } else {
+ @appendix_sec_num = ('A', 0, 0, 0);
+ }
+ return(join('.', @appendix_sec_num[0..$level]));
+ } else {
+ # normal style
+ if (defined(@normal_sec_num)) {
+ &incr_sec_num($level, @normal_sec_num);
+ } else {
+ @normal_sec_num = (1, 0, 0, 0);
+ }
+ return(join('.', @normal_sec_num[0..$level]));
+ }
+}
+
+sub incr_sec_num {
+ local($level, $l);
+ $level = shift(@_);
+ $_[$level]++;
+ foreach $l ($level+1 .. 3) {
+ $_[$l] = 0;
+ }
+}
+
+sub check {
+ local($_, %seen, %context, $before, $match, $after);
+
+ while (<>) {
+ if (/\@(\*|\.|\:|\@|\{|\})/) {
+ $seen{$&}++;
+ $context{$&} .= "> $_" if $verbose;
+ $_ = "$`XX$'";
+ redo;
+ }
+ if (/\@(\w+)/) {
+ ($before, $match, $after) = ($`, $&, $');
+ if ($before =~ /\b[\w-]+$/ && $after =~ /^[\w-.]*\b/) { # e-mail address
+ $seen{'e-mail address'}++;
+ $context{'e-mail address'} .= "> $_" if $verbose;
+ } else {
+ $seen{$match}++;
+ $context{$match} .= "> $_" if $verbose;
+ }
+ $match =~ s/^\@/X/;
+ $_ = "$before$match$after";
+ redo;
+ }
+ }
+
+ foreach (sort(keys(%seen))) {
+ if ($verbose) {
+ print "$_\n";
+ print $context{$_};
+ } else {
+ print "$_ ($seen{$_})\n";
+ }
+ }
+}
+
+sub open {
+ local($name) = @_;
+
+ ++$fh_name;
+ if (open($fh_name, $name)) {
+ unshift(@fhs, $fh_name);
+ } else {
+ warn "$ERROR Can't read file $name: $!\n";
+ }
+}
+
+sub init_input {
+ @fhs = (); # hold the file handles to read
+ @input_spool = (); # spooled lines to read
+ $fh_name = 'FH000';
+ &open($docu);
+}
+
+sub next_line {
+ local($fh, $line);
+
+ if (@input_spool) {
+ $line = shift(@input_spool);
+ return($line);
+ }
+ while (@fhs) {
+ $fh = $fhs[0];
+ $line = <$fh>;
+ return($line) if $line;
+ close($fh);
+ shift(@fhs);
+ }
+ return(undef);
+}
+
+# used in pass 1, use &next_line
+sub skip_until {
+ local($tag) = @_;
+ local($_);
+
+ while ($_ = &next_line) {
+ return if /^\@end\s+$tag\s*$/;
+ }
+ die "* Failed to find '$tag' after: " . $lines[$#lines];
+}
+
+#
+# HTML stacking to have a better HTML output
+#
+
+sub html_reset {
+ @html_stack = ('html');
+ $html_element = 'body';
+}
+
+sub html_push {
+ local($what) = @_;
+ push(@html_stack, $html_element);
+ $html_element = $what;
+}
+
+sub html_push_if {
+ local($what) = @_;
+ push(@html_stack, $html_element)
+ if ($html_element && $html_element ne 'P');
+ $html_element = $what;
+}
+
+sub html_pop {
+ $html_element = pop(@html_stack);
+}
+
+sub html_pop_if {
+ local($elt);
+
+ if (@_) {
+ foreach $elt (@_) {
+ if ($elt eq $html_element) {
+ $html_element = pop(@html_stack) if @html_stack;
+ last;
+ }
+ }
+ } else {
+ $html_element = pop(@html_stack) if @html_stack;
+ }
+}
+
+sub html_debug {
+ local($what, $line) = @_;
+ return("<!-- $line @html_stack, $html_element -->$what")
+ if $debug & $DEBUG_HTML;
+ return($what);
+}
+
+# to debug the output...
+sub debug {
+ local($what, $line) = @_;
+ return("<!-- $line -->$what")
+ if $debug & $DEBUG_HTML;
+ return($what);
+}
+
+sub normalise_node {
+ $_[0] =~ s/\s+/ /g;
+ $_[0] =~ s/ $//;
+ $_[0] =~ s/^ //;
+}
+
+sub menu_entry {
+ local($entry, $node, $descr) = @_;
+ local($href);
+
+ &normalise_node($node);
+ $href = $node2href{$node};
+ if ($href) {
+ $descr =~ s/^\s+//;
+ $descr = ": $descr" if $descr;
+ push(@lines2, "<LI>" . &anchor('', $href, $entry) . "$descr\n");
+ } else {
+ warn "$ERROR Undefined node ($node): $_";
+ }
+}
+
+sub do_ctrl { "^$_[0]" }
+
+sub do_sc { "\U$_[0]\E" }
+
+sub apply_style {
+ local($texi_style, $text) = @_;
+ local($style);
+
+ $style = $style_map{$texi_style};
+ if (defined($style)) { # known style
+ if ($style =~ /^\"/) { # add quotes
+ $style = $';
+ $text = "\`$text\'";
+ }
+ if ($style =~ /^\&/) { # custom
+ $style = $';
+ $text = &$style($text);
+ } elsif ($style) { # good style
+ $text = "<$style>$text</$style>";
+ } else { # no style
+ }
+ } else { # unknown style
+ $text = undef;
+ }
+ return($text);
+}
+
+# remove Texinfo styles
+sub remove_style {
+ local($_) = @_;
+ s/\@\w+{([^\{\}]+)}/$1/g;
+ return($_);
+}
+
+sub substitute_style {
+ local($_) = @_;
+ local($changed, $done, $style, $text);
+
+ $changed = 1;
+ while ($changed) {
+ $changed = 0;
+ $done = '';
+ while (/\@(\w+){([^\{\}]+)}/) {
+ $text = &apply_style($1, $2);
+ if ($text) {
+ $_ = "$`$text$'";
+ $changed = 1;
+ } else {
+ $done .= "$`\@$1";
+ $_ = "{$2}$'";
+ }
+ }
+ $_ = $done . $_;
+ }
+ return($_);
+}
+
+sub anchor {
+ local($name, $href, $text, $newline) = @_;
+ local($result);
+
+ $result = "<A";
+ $result .= " NAME=\"$name\"" if $name;
+ $result .= " HREF=\"$href\"" if $href;
+ $result .= ">$text</A>";
+ $result .= "\n" if $newline;
+ return($result);
+}
+
+sub pretty_date {
+ local(@MoY, $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
+
+ @MoY = ('January', 'Febuary', 'March', 'April', 'May', 'June',
+ 'July', 'August', 'September', 'October', 'November', 'December');
+ ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
+ $year += ($year < 70) ? 2000 : 1900;
+ return("$mday $MoY[$mon] $year");
+}
+
+sub doc_name {
+ local($num) = @_;
+
+ return("${docu_name}_$num.html");
+}
+
+sub next_doc {
+ $docu_doc = &doc_name(++$doc_num);
+}
+
+sub print {
+ local(*lines, $fh) = @_;
+ local($_);
+
+ while (@lines) {
+ $_ = shift(@lines);
+ if (/^$PROTECTTAG/o) {
+ $_ = $tag2pro{$_};
+ } else {
+ &unprotect_texi;
+ }
+ print $fh $_;
+ }
+}
+
+sub print_ruler {
+ print FILE "<P><HR><P>\n";
+}
+
+sub print_header {
+ local($_);
+
+ # clean the title
+ $_ = &remove_style($_[0]);
+ &unprotect_texi;
+ # print the header
+ if ($doctype eq 'html2') {
+ print FILE $html2_doctype;
+ } elsif ($doctype) {
+ print FILE $doctype;
+ }
+ print FILE <<EOT;
+<HTML>
+<HEAD>
+$header
+<TITLE>$_</TITLE>
+</HEAD>
+<BODY>
+EOT
+}
+
+sub print_toplevel_header {
+ local($_);
+
+ &print_header; # pass given arg...
+ print FILE $full_title;
+ if ($value{'_subtitle'}) {
+ $value{'_subtitle'} =~ s/\n+$//;
+ foreach (split(/\n/, $value{'_subtitle'})) {
+ $_ = &substitute_style($_);
+ &unprotect_texi;
+ print FILE "<H2>$_</H2>\n";
+ }
+ }
+ if ($value{'_author'}) {
+ $value{'_author'} =~ s/\n+$//;
+ foreach (split(/\n/, $value{'_author'})) {
+ $_ = &substitute_style($_);
+ &unprotect_texi;
+ s/[\w.-]+\@[\w.-]+/<A HREF="mailto:$&">$&<\/A>/g;
+ print FILE "<ADDRESS>$_</ADDRESS>\n";
+ }
+ }
+ print FILE "<P>\n";
+}
+
+sub print_footer {
+ print FILE <<EOT;
+</BODY>
+</HTML>
+EOT
+}
+
+sub print_toplevel_footer {
+ &print_ruler;
+ print FILE <<EOT;
+This document was generated on $TODAY using the
+<A HREF=\"$HOMEPAGE\">texi2html</A>
+translator version 1.51.</P>
+EOT
+ &print_footer;
+}
+
+sub protect_texi {
+ # protect @ { } ` '
+ s/\@\@/$;0/go;
+ s/\@\{/$;1/go;
+ s/\@\}/$;2/go;
+ s/\@\`/$;3/go;
+ s/\@\'/$;4/go;
+}
+
+sub protect_html {
+ local($what) = @_;
+ # protect & < >
+ $what =~ s/\&/\&\#38;/g;
+ $what =~ s/\</\&\#60;/g;
+ $what =~ s/\>/\&\#62;/g;
+ # but recognize some HTML things
+ $what =~ s/\&\#60;\/A\&\#62;/<\/A>/g; # </A>
+ $what =~ s/\&\#60;A ([^\&]+)\&\#62;/<A $1>/g; # <A [^&]+>
+ $what =~ s/\&\#60;IMG ([^\&]+)\&\#62;/<IMG $1>/g; # <IMG [^&]+>
+ return($what);
+}
+
+sub unprotect_texi {
+ s/$;0/\@/go;
+ s/$;1/\{/go;
+ s/$;2/\}/go;
+ s/$;3/\`/go;
+ s/$;4/\'/go;
+}
+
+sub unprotect_html {
+ local($what) = @_;
+ $what =~ s/\&\#38;/\&/g;
+ $what =~ s/\&\#60;/\</g;
+ $what =~ s/\&\#62;/\>/g;
+ return($what);
+}
+
+sub byalpha {
+ $key2alpha{$a} cmp $key2alpha{$b};
+}
+
+##############################################################################
+
+ # These next few lines are legal in both Perl and nroff.
+
+.00 ; # finish .ig
+
+'di \" finish diversion--previous line must be blank
+.nr nl 0-1 \" fake up transition to first page again
+.nr % 0 \" start at page 1
+'; __END__ ############# From here on it's a standard manual page ############
+.TH TEXI2HTML 1 "09/10/96"
+.AT 3
+.SH NAME
+texi2html \- a Texinfo to HTML converter
+.SH SYNOPSIS
+.B texi2html [options] file
+.PP
+.B texi2html -check [-verbose] files
+.SH DESCRIPTION
+.I Texi2html
+converts the given Texinfo file to a set of HTML files. It tries to handle
+most of the Texinfo commands. It creates hypertext links for cross-references,
+footnotes...
+.PP
+It also tries to add links from a reference to its corresponding entry in the
+bibliography (if any). It may also handle a glossary (see the
+.B \-glossary
+option).
+.PP
+.I Texi2html
+creates several files depending on the contents of the Texinfo file and on
+the chosen options (see FILES).
+.PP
+The HTML files created by
+.I texi2html
+are closer to TeX than to Info, that's why
+.I texi2html
+converts @iftex sections and not @ifinfo ones by default. You can reverse
+this with the \-expandinfo option.
+.SH OPTIONS
+.TP 12
+.B \-check
+Check the given file and give the list of all things that may be Texinfo commands.
+This may be used to check the output of
+.I texi2html
+to find the Texinfo commands that have been left in the HTML file.
+.TP
+.B \-expandinfo
+Expand @ifinfo sections, not @iftex ones.
+.TP
+.B \-glossary
+Use the section named 'Glossary' to build a list of terms and put links in the HTML
+document from each term toward its definition.
+.TP
+.B \-invisible \fIname\fP
+Use \fIname\fP to create invisible destination anchors for index links. This is a workaround
+for a known bug of many WWW browsers, including xmosaic.
+.TP
+.B \-I \fIdir\fP
+Look also in \fIdir\fP to find included files.
+.TP
+.B \-menu
+Show the Texinfo menus; by default they are ignored.
+.TP
+.B \-monolithic
+Output only one file, including the table of contents and footnotes.
+.TP
+.B \-number
+Number the sections.
+.TP
+.B \-split_chapter
+Split the output into several HTML files (one per main section:
+chapter, appendix...).
+.TP
+.B \-split_node
+Split the output into several HTML files (one per node).
+.TP
+.B \-usage
+Print usage instructions, listing the current available command-line options.
+.TP
+.B \-verbose
+Give a verbose output. Can be used with the
+.B \-check
+option.
+.PP
+.SH FILES
+By default
+.I texi2html
+creates the following files (foo being the name of the Texinfo file):
+.TP 16
+.B foo_toc.html
+The table of contents.
+.TP
+.B foo.html
+The document's contents.
+.TP
+.B foo_foot.html
+The footnotes (if any).
+.PP
+When used with the
+.B \-split
+option, it creates several files (one per chapter or node), named
+.B foo_n.html
+(n being the indice of the chapter or node), instead of the single
+.B foo.html
+file.
+.PP
+When used with the
+.B \-monolithic
+option, it creates only one file:
+.B foo.html
+.SH VARIABLES
+.I texi2html
+predefines the following variables: \fBhtml\fP, \fBtexi2html\fP.
+.SH ADDITIONAL COMMANDS
+.I texi2html
+implements the following non-Texinfo commands:
+.TP 16
+.B @ifhtml
+This indicates the start of an HTML section, this section will passed through
+without any modofication.
+.TP
+.B @end ifhtml
+This indcates the end of an HTML section.
+.SH VERSION
+This is \fItexi2html\fP version 1.51, 09/10/96.
+.PP
+The latest version of \fItexi2html\fP can be found in WWW, cf. URL
+http://wwwcn.cern.ch/dci/texi2html/
+.SH AUTHOR
+The main author is Lionel Cons, CERN CN/DCI/UWS, Lionel.Cons@cern.ch.
+Many other people around the net contributed to this program.
+.SH COPYRIGHT
+This program is the intellectual property of the European
+Laboratory for Particle Physics (known as CERN). No guarantee whatsoever is
+provided by CERN. No liability whatsoever is accepted for any loss or damage
+of any kind resulting from any defect or inaccuracy in this information or
+code.
+.PP
+CERN, 1211 Geneva 23, Switzerland
+.SH "SEE ALSO"
+GNU Texinfo Documentation Format,
+HyperText Markup Language (HTML),
+World Wide Web (WWW).
+.SH BUGS
+This program does not understand all Texinfo commands (yet).
+.PP
+TeX specific commands (normally enclosed in @iftex) will be
+passed unmodified.
+.ex
diff --git a/doc/texinfo.tex b/doc/texinfo.tex
index ce8124e..fb7cfe5 100644
--- a/doc/texinfo.tex
+++ b/doc/texinfo.tex
@@ -1,6 +1,6 @@
%% TeX macros to handle texinfo files
-% Copyright (C) 1985, 86, 88, 90, 91, 92, 1993 Free Software Foundation, Inc.
+% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 1994 Free Software Foundation, Inc.
%This texinfo.tex file is free software; you can redistribute it and/or
%modify it under the terms of the GNU General Public License as
@@ -22,14 +22,30 @@
%You are forbidden to forbid anyone else to use, share and improve
%what you give them. Help stamp out software-hoarding!
-\def\texinfoversion{2.108}
+
+% Send bug reports to bug-texinfo@prep.ai.mit.edu.
+% Please include a *precise* test case in each bug report.
+
+
+% Make it possible to create a .fmt file just by loading this file:
+% if the underlying format is not loaded, start by loading it now.
+% Added by gildea November 1993.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+
+% This automatically updates the version number based on RCS.
+\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
+\deftexinfoversion$Revision: 2.145 $
\message{Loading texinfo package [Version \texinfoversion]:}
-% Print the version number if in a .fmt file.
-\everyjob{\message{[Texinfo version \texinfoversion]}\message{}}
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}\message{}
+ \catcode`+=\active \catcode`\_=\active}
% Save some parts of plain tex whose names we will redefine.
+\let\ptextilde=\~
\let\ptexlbrace=\{
\let\ptexrbrace=\}
\let\ptexdots=\dots
@@ -44,7 +60,15 @@
\let\ptexl=\l
\let\ptexL=\L
-\def\tie{\penalty 10000\ } % Save plain tex definition of ~.
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ \gdef\tie{\leavevmode\penalty\@M\ }
+}
+\let\~ = \tie % And make it available as @~.
\message{Basics,}
\chardef\other=12
@@ -53,6 +77,19 @@
% starts a new line in the output.
\newlinechar = `^^J
+% Set up fixed words for English.
+\ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi%
+\def\putwordInfo{Info}%
+\ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi%
+\ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi%
+\ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi%
+\ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi%
+\ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi%
+\ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi%
+\ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi%
+\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi%
+\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi%
+
% Ignore a token.
%
\def\gobble#1{}
@@ -144,9 +181,14 @@
% Do @cropmarks to get crop marks
\def\cropmarks{\let\onepageout=\croppageout }
+\newinsert\margin \dimen\margin=\maxdimen
+
\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
{\catcode`\@ =11
\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
\dimen@=\dp#1 \unvbox#1
\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
@@ -297,13 +339,13 @@
% Single-spacing is done by various environments (specifically, in
% \nonfillstart and \quotations).
-\newskip\singlespaceskip \singlespaceskip = \baselineskip
+\newskip\singlespaceskip \singlespaceskip = 12.5pt
\def\singlespace{%
-% Why was this kern here? It messes up equalizing space above and below
-% environments. --karl, 6may93
-%{\advance \baselineskip by -\singlespaceskip
-%\kern \baselineskip}%
-\baselineskip=\singlespaceskip
+ % Why was this kern here? It messes up equalizing space above and below
+ % environments. --karl, 6may93
+ %{\advance \baselineskip by -\singlespaceskip
+ %\kern \baselineskip}%
+ \setleading \singlespaceskip
}
%% Simple single-character @ commands
@@ -335,6 +377,15 @@
% @. is an end-of-sentence period.
\def\.{.\spacefactor=3000 }
+% @enddots{} is an end-of-sentence ellipsis.
+\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000}
+
+% @! is an end-of-sentence bang.
+\gdef\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\gdef\?{?\spacefactor=3000 }
+
% @w prevents a word break. Without the \leavevmode, @w at the
% beginning of a paragraph, when TeX is still in vertical mode, would
% produce a whole line of output instead of starting the paragraph.
@@ -389,8 +440,8 @@
\obeylines
\fi
%
- % We do @comment here in case we are called inside an environment,
- % such as @example, where each end-of-line in the input causes an
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
% end-of-line in the output. We don't want the end-of-line after
% the `@group' to put extra space in the output. Since @group
% should appear on a line by itself (according to the Texinfo
@@ -584,15 +635,19 @@ where each line of input produces a line of output.}
\let\up = \relax
\let\set = \relax
\let\clear = \relax
+ \let\item = \relax
+ \let\message = \relax
}
% Ignore @ignore ... @end ignore.
%
\def\ignore{\doignore{ignore}}
-% Also ignore @ifinfo, @menu, and @direntry text.
+% Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text.
%
\def\ifinfo{\doignore{ifinfo}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\html{\doignore{html}}
\def\menu{\doignore{menu}}
\def\direntry{\doignore{direntry}}
@@ -679,6 +734,11 @@ where each line of input produces a line of output.}
\let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont
\let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont
\let\tensf = \nullfont
+ % Similarly for index fonts (mostly for their use in
+ % smallexample)
+ \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont
+ \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont
+ \let\indsf = \nullfont
%
% Don't complain when characters are missing from the fonts.
\tracinglostchars = 0
@@ -712,7 +772,10 @@ where each line of input produces a line of output.}
\else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
\fi
}
-\def\setzzz#1#2 \endsetzzz{\expandafter\xdef\csname SET#1\endcsname{#2}}
+% Can't use \xdef to pre-expand #2 and save some time, since \temp or
+% \next or other control sequences that we've defined might get us into
+% an infinite loop. Consider `@set foo @cite{bar}'.
+\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
% @clear VAR clears (i.e., unsets) the variable VAR.
%
@@ -814,15 +877,15 @@ where each line of input produces a line of output.}
\def\donoderef{\ifx\lastnode\relax\else
\expandafter\expandafter\expandafter\setref{\lastnode}\fi
-\let\lastnode=\relax}
+\global\let\lastnode=\relax}
\def\unnumbnoderef{\ifx\lastnode\relax\else
\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
-\let\lastnode=\relax}
+\global\let\lastnode=\relax}
\def\appendixnoderef{\ifx\lastnode\relax\else
\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
-\let\lastnode=\relax}
+\global\let\lastnode=\relax}
\let\refill=\relax
@@ -841,7 +904,7 @@ where each line of input produces a line of output.}
\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
\def\inforef #1{\inforefzzz #1,,,,**}
-\def\inforefzzz #1,#2,#3,#4**{See Info file \file{\ignorespaces #3{}},
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
node \samp{\ignorespaces#1{}}}
\message{fonts,}
@@ -857,28 +920,39 @@ where each line of input produces a line of output.}
%% Try out Computer Modern fonts at \magstephalf
\let\mainmagstep=\magstephalf
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+\def\setfont#1#2{\font#1=\fontprefix#2}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+
\ifx\bigger\relax
\let\mainmagstep=\magstep1
-\font\textrm=cmr12
-\font\texttt=cmtt12
+\setfont\textrm{r12}
+\setfont\texttt{tt12}
\else
-\font\textrm=cmr10 scaled \mainmagstep
-\font\texttt=cmtt10 scaled \mainmagstep
+\setfont\textrm{r10 scaled \mainmagstep}
+\setfont\texttt{tt10 scaled \mainmagstep}
\fi
% Instead of cmb10, you many want to use cmbx10.
% cmbx10 is a prettier font on its own, but cmb10
% looks better when embedded in a line with cmr10.
-\font\textbf=cmb10 scaled \mainmagstep
-\font\textit=cmti10 scaled \mainmagstep
-\font\textsl=cmsl10 scaled \mainmagstep
-\font\textsf=cmss10 scaled \mainmagstep
-\font\textsc=cmcsc10 scaled \mainmagstep
+\setfont\textbf{b10 scaled \mainmagstep}
+\setfont\textit{ti10 scaled \mainmagstep}
+\setfont\textsl{sl10 scaled \mainmagstep}
+\setfont\textsf{ss10 scaled \mainmagstep}
+\setfont\textsc{csc10 scaled \mainmagstep}
\font\texti=cmmi10 scaled \mainmagstep
\font\textsy=cmsy10 scaled \mainmagstep
% A few fonts for @defun, etc.
-\font\defbf=cmbx10 scaled \magstep1 %was 1314
-\font\deftt=cmtt10 scaled \magstep1
+\setfont\defbf{bx10 scaled \magstep1} %was 1314
+\setfont\deftt{tt10 scaled \magstep1}
\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
% Fonts for indices and small examples.
@@ -886,66 +960,66 @@ where each line of input produces a line of output.}
% because texinfo normally uses the slanted fonts for that.
% Do not make many font distinctions in general in the index, since they
% aren't very useful.
-\font\ninett=cmtt9
-\font\indrm=cmr9
-\font\indit=cmsl9
+\setfont\ninett{tt9}
+\setfont\indrm{r9}
+\setfont\indit{sl9}
\let\indsl=\indit
\let\indtt=\ninett
\let\indsf=\indrm
\let\indbf=\indrm
-\let\indsc=\indrm
+\setfont\indsc{csc10 at 9pt}
\font\indi=cmmi9
\font\indsy=cmsy9
% Fonts for headings
-\font\chaprm=cmbx12 scaled \magstep2
-\font\chapit=cmti12 scaled \magstep2
-\font\chapsl=cmsl12 scaled \magstep2
-\font\chaptt=cmtt12 scaled \magstep2
-\font\chapsf=cmss12 scaled \magstep2
+\setfont\chaprm{bx12 scaled \magstep2}
+\setfont\chapit{ti12 scaled \magstep2}
+\setfont\chapsl{sl12 scaled \magstep2}
+\setfont\chaptt{tt12 scaled \magstep2}
+\setfont\chapsf{ss12 scaled \magstep2}
\let\chapbf=\chaprm
-\font\chapsc=cmcsc10 scaled\magstep3
+\setfont\chapsc{csc10 scaled\magstep3}
\font\chapi=cmmi12 scaled \magstep2
\font\chapsy=cmsy10 scaled \magstep3
-\font\secrm=cmbx12 scaled \magstep1
-\font\secit=cmti12 scaled \magstep1
-\font\secsl=cmsl12 scaled \magstep1
-\font\sectt=cmtt12 scaled \magstep1
-\font\secsf=cmss12 scaled \magstep1
-\font\secbf=cmbx12 scaled \magstep1
-\font\secsc=cmcsc10 scaled\magstep2
+\setfont\secrm{bx12 scaled \magstep1}
+\setfont\secit{ti12 scaled \magstep1}
+\setfont\secsl{sl12 scaled \magstep1}
+\setfont\sectt{tt12 scaled \magstep1}
+\setfont\secsf{ss12 scaled \magstep1}
+\setfont\secbf{bx12 scaled \magstep1}
+\setfont\secsc{csc10 scaled\magstep2}
\font\seci=cmmi12 scaled \magstep1
\font\secsy=cmsy10 scaled \magstep2
-% \font\ssecrm=cmbx10 scaled \magstep1 % This size an font looked bad.
-% \font\ssecit=cmti10 scaled \magstep1 % The letters were too crowded.
-% \font\ssecsl=cmsl10 scaled \magstep1
-% \font\ssectt=cmtt10 scaled \magstep1
-% \font\ssecsf=cmss10 scaled \magstep1
+% \setfont\ssecrm{bx10 scaled \magstep1} % This size an font looked bad.
+% \setfont\ssecit{cmti10 scaled \magstep1} % The letters were too crowded.
+% \setfont\ssecsl{sl10 scaled \magstep1}
+% \setfont\ssectt{tt10 scaled \magstep1}
+% \setfont\ssecsf{ss10 scaled \magstep1}
-%\font\ssecrm=cmb10 scaled 1315 % Note the use of cmb rather than cmbx.
-%\font\ssecit=cmti10 scaled 1315 % Also, the size is a little larger than
-%\font\ssecsl=cmsl10 scaled 1315 % being scaled magstep1.
-%\font\ssectt=cmtt10 scaled 1315
-%\font\ssecsf=cmss10 scaled 1315
+%\setfont\ssecrm{b10 scaled 1315} % Note the use of cmb rather than cmbx.
+%\setfont\ssecit{ti10 scaled 1315} % Also, the size is a little larger than
+%\setfont\ssecsl{sl10 scaled 1315} % being scaled magstep1.
+%\setfont\ssectt{tt10 scaled 1315}
+%\setfont\ssecsf{ss10 scaled 1315}
%\let\ssecbf=\ssecrm
-\font\ssecrm=cmbx12 scaled \magstephalf
-\font\ssecit=cmti12 scaled \magstephalf
-\font\ssecsl=cmsl12 scaled \magstephalf
-\font\ssectt=cmtt12 scaled \magstephalf
-\font\ssecsf=cmss12 scaled \magstephalf
-\font\ssecbf=cmbx12 scaled \magstephalf
-\font\ssecsc=cmcsc10 scaled \magstep1
+\setfont\ssecrm{bx12 scaled \magstephalf}
+\setfont\ssecit{ti12 scaled \magstephalf}
+\setfont\ssecsl{sl12 scaled \magstephalf}
+\setfont\ssectt{tt12 scaled \magstephalf}
+\setfont\ssecsf{ss12 scaled \magstephalf}
+\setfont\ssecbf{bx12 scaled \magstephalf}
+\setfont\ssecsc{csc10 scaled \magstep1}
\font\sseci=cmmi12 scaled \magstephalf
\font\ssecsy=cmsy10 scaled \magstep1
% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
% but that is not a standard magnification.
% Fonts for title page:
-\font\titlerm = cmbx12 scaled \magstep3
+\setfont\titlerm{bx12 scaled \magstep3}
\let\authorrm = \secrm
% In order for the font changes to affect most math symbols and letters,
@@ -1001,9 +1075,9 @@ where each line of input produces a line of output.}
\newcount\fontdepth \fontdepth=0
% Fonts for short table of contents.
-\font\shortcontrm=cmr12
-\font\shortcontbf=cmbx12
-\font\shortcontsl=cmsl12
+\setfont\shortcontrm{r12}
+\setfont\shortcontbf{bx12}
+\setfont\shortcontsl{sl12}
%% Add scribe-like font environments, plus @l for inline lisp (usually sans
%% serif) and @ii for TeX italic
@@ -1074,10 +1148,17 @@ where each line of input produces a line of output.}
% and arrange explicitly to hyphenate an a dash.
% -- rms.
{
-\catcode `\-=\active
-\catcode `\_=\active
-\global\def\code{\begingroup \catcode `\-=\active \let-\codedash \let_\codeunder \codex}
+\catcode`\-=\active
+\catcode`\_=\active
+\global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex}
+% The following is used by \doprintindex to insure that long function names
+% wrap around. It is necessary for - and _ to be active before the index is
+% read from the file, as \entry parses the arguments long before \code is
+% ever called. -- mycroft
+\global\def\indexbreaks{\catcode`\-=\active \let-\realdash \catcode`\_=\active \let_\realunder}
}
+\def\realdash{-}
+\def\realunder{_}
\def\codedash{-\discretionary{}{}{}}
\def\codeunder{\normalunderscore\discretionary{}{}{}}
\def\codex #1{\tclose{#1}\endgroup}
@@ -1140,7 +1221,7 @@ where each line of input produces a line of output.}
\def\titlezzz##1{\leftline{\titlefont{##1}}
% print a rule at the page bottom also.
\finishedtitlepagefalse
- \vskip4pt \hrule height 4pt \vskip4pt}%
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
% No rule at page bottom unless we print one at the top with @title.
\finishedtitlepagetrue
%
@@ -1180,7 +1261,7 @@ where each line of input produces a line of output.}
}
\def\finishtitlepage{%
- \vskip4pt \hrule height 2pt
+ \vskip4pt \hrule height 2pt width \hsize
\vskip\titlepagebottomglue
\finishedtitlepagetrue
}
@@ -1354,14 +1435,18 @@ July\or August\or September\or October\or November\or December\fi
% They also define \itemindex
% to index the item name in whatever manner is desired (perhaps none).
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\vskip-\parskip\nobreak\fi}
+
\def\internalBitem{\smallbreak \parsearg\itemzzz}
-\def\internalBitemx{\par \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
-\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
-\def\internalBkitemx{\par \parsearg\kitemzzz}
+\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
\itemzzz {#1}}
@@ -1377,9 +1462,9 @@ July\or August\or September\or October\or November\or December\fi
\nobreak % This prevents a break before @itemx.
%
% Be sure we are not still in the middle of a paragraph.
- {\parskip = 0in
- \par
- }%
+ %{\parskip = 0in
+ %\par
+ %}%
%
% If the item text does not fit in the space we have, put it on a line
% by itself, and do not allow a page break either before or after that
@@ -1387,7 +1472,15 @@ July\or August\or September\or October\or November\or December\fi
% command is, e.g., @kindex, the whatsit would get put into the
% horizontal list on a line by itself, resulting in extra blank space.
\ifdim \wd0>\itemmax
- \setbox0=\hbox{\hskip \leftskip \hskip -\tableindent \unhbox0}\box0
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
%
% We're going to be starting a paragraph, but we don't want the
% \parskip glue -- logically it's part of the @item we just started.
@@ -1397,15 +1490,18 @@ July\or August\or September\or October\or November\or December\fi
% we can't prevent a possible page break at the following
% \baselineskip glue.
\nobreak
+ \endgroup
+ \itemxneedsnegativevskipfalse
\else
% The item text fits into the space. Start a paragraph, so that the
% following text (if any) will end up on the same line. Since that
% text will be indented by \tableindent, we make the item text be in
% a zero-width box.
\noindent
- \rlap{\hskip -\tableindent\box0}%
+ \rlap{\hskip -\tableindent\box0}\ignorespaces%
+ \endgroup%
+ \itemxneedsnegativevskiptrue%
\fi
- \endgroup
}
\def\item{\errmessage{@item while not in a table}}
@@ -1611,6 +1707,159 @@ July\or August\or September\or October\or November\or December\fi
\vadjust{\penalty 1200}}%
\flushcr}
+% @multitable macros
+% Amy Hendrickson, 8/18/94
+%
+% @multitable ... @endmultitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @percentofhsize .2 .3 .5
+% @item ...
+%
+% Numbers following @percentofhsize are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab, @multicolumn or @endmulticolumn do not need to be on their
+% own lines, but it will not hurt if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @endmultitable
+
+% Default dimensions may be reset by user.
+% @intableparskip will set vertical space between paragraphs in table.
+% @intableparindent will set paragraph indent in table.
+% @spacebetweencols will set horizontal space to be left between columns.
+% @spacebetweenlines will set vertical space to be left between lines.
+
+%%%%
+% Dimensions
+
+\newdimen\intableparskip
+\newdimen\intableparindent
+\newdimen\spacebetweencols
+\newdimen\spacebetweenlines
+\intableparskip=0pt
+\intableparindent=6pt
+\spacebetweencols=12pt
+\spacebetweenlines=12pt
+
+%%%%
+% Macros used to set up halign preamble:
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\percentofhsize\relax
+\def\xpercentofhsize{\percentofhsize}
+\newif\ifsetpercent
+
+\newcount\colcount
+\def\setuptable#1{\def\firstarg{#1}%
+\ifx\firstarg\xendsetuptable\let\go\relax%
+\else
+ \ifx\firstarg\xpercentofhsize\global\setpercenttrue%
+ \else
+ \ifsetpercent
+ \if#1.\else%
+ \global\advance\colcount by1 %
+ \expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}%
+ \fi
+ \else
+ \global\advance\colcount by1
+ \setbox0=\hbox{#1}%
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi%
+ \fi%
+ \let\go\setuptable%
+\fi\go}
+%%%%
+% multitable syntax
+\def\tab{&}
+
+%%%%
+% @multitable ... @endmultitable definitions:
+
+\def\multitable#1\item{\bgroup
+\let\item\cr
+\tolerance=9500
+\hbadness=9500
+\parskip=\intableparskip
+\parindent=\intableparindent
+\overfullrule=0pt
+\global\colcount=0\relax%
+\def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}%
+ % To parse everything between @multitable and @item :
+\def\one{#1}\expandafter\setuptable\one\endsetuptable
+ % Need to reset this to 0 after \setuptable.
+\global\colcount=0\relax%
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+\halign\bgroup&\global\advance\colcount by 1\relax%
+\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \spacebetweencols to all columns after
+ % the first one.
+ % If a template has been used, we will add \spacebetweencols
+ % to the width of each template entry.
+ % If user has set preamble in terms of percent of \hsize
+ % we will use that dimension as the width of the column, and
+ % the \leftskip will keep entries from bumping into each other.
+ % Table will start at left margin and final column will justify at
+ % right margin.
+\ifnum\colcount=1
+\else
+ \ifsetpercent
+ \else
+ % If user has <not> set preamble in terms of percent of \hsize
+ % we will advance \hsize by \spacebetweencols
+ \advance\hsize by \spacebetweencols
+ \fi
+ % In either case we will make \leftskip=\spacebetweencols:
+\leftskip=\spacebetweencols
+\fi
+\noindent##}\cr%
+ % \everycr will reset column counter, \colcount, at the end of
+ % each line. Every column entry will cause \colcount to advance by one.
+ % The table preamble
+ % looks at the current \colcount to find the correct column width.
+\global\everycr{\noalign{\nointerlineskip\vskip\spacebetweenlines
+\filbreak%% keeps underfull box messages off when table breaks over pages.
+\global\colcount=0\relax}}}
+
\message{indexing,}
% Index generation facilities
@@ -1685,6 +1934,32 @@ July\or August\or September\or October\or November\or December\fi
\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
\def\indexdummies{%
+% Take care of the plain tex accent commands.
+\def\"{\realbackslash "}%
+\def\`{\realbackslash `}%
+\def\'{\realbackslash '}%
+\def\^{\realbackslash ^}%
+\def\~{\realbackslash ~}%
+\def\={\realbackslash =}%
+\def\b{\realbackslash b}%
+\def\c{\realbackslash c}%
+\def\d{\realbackslash d}%
+\def\u{\realbackslash u}%
+\def\v{\realbackslash v}%
+\def\H{\realbackslash H}%
+% Take care of the plain tex special European modified letters.
+\def\oe{\realbackslash oe}%
+\def\ae{\realbackslash ae}%
+\def\aa{\realbackslash aa}%
+\def\OE{\realbackslash OE}%
+\def\AE{\realbackslash AE}%
+\def\AA{\realbackslash AA}%
+\def\o{\realbackslash o}%
+\def\O{\realbackslash O}%
+\def\l{\realbackslash l}%
+\def\L{\realbackslash L}%
+\def\ss{\realbackslash ss}%
+% Take care of texinfo commands likely to appear in an index entry.
\def\_{{\realbackslash _}}%
\def\w{\realbackslash w }%
\def\bf{\realbackslash bf }%
@@ -1722,6 +1997,31 @@ July\or August\or September\or October\or November\or December\fi
\def\indexdummydots{...}
\def\indexnofonts{%
+% Just ignore accents.
+\let\"=\indexdummyfont
+\let\`=\indexdummyfont
+\let\'=\indexdummyfont
+\let\^=\indexdummyfont
+\let\~=\indexdummyfont
+\let\==\indexdummyfont
+\let\b=\indexdummyfont
+\let\c=\indexdummyfont
+\let\d=\indexdummyfont
+\let\u=\indexdummyfont
+\let\v=\indexdummyfont
+\let\H=\indexdummyfont
+% Take care of the plain tex special European modified letters.
+\def\oe{oe}%
+\def\ae{ae}%
+\def\aa{aa}%
+\def\OE{OE}%
+\def\AE{AE}%
+\def\AA{AA}%
+\def\o{o}%
+\def\O{O}%
+\def\l{l}%
+\def\L{L}%
+\def\ss{ss}%
\let\w=\indexdummyfont
\let\t=\indexdummyfont
\let\r=\indexdummyfont
@@ -1754,7 +2054,14 @@ July\or August\or September\or October\or November\or December\fi
\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax %initialize!
+% workhorse for all \fooindexes
+% #1 is name of index, #2 is stuff to put there
\def\doind #1#2{%
+% Put the index entry in the margin if desired.
+\ifx\SETmarginindex\relax\else%
+\insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+\fi%
{\count10=\lastpenalty %
{\indexdummies % Must do this here, since \bf, etc expand at this stage
\escapechar=`\\%
@@ -1838,8 +2145,9 @@ July\or August\or September\or October\or November\or December\fi
\tex
\dobreak \chapheadingskip {10000}
\catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
- \catcode`\$=\other\catcode`\_=\other
+ \catcode`\$=\other
\catcode`\~=\other
+ \indexbreaks
%
% The following don't help, since the chars were translated
% when the raw index was written, and their fonts were discarded
@@ -1932,23 +2240,32 @@ July\or August\or September\or October\or November\or December\fi
%
% Insert the text of the index entry. TeX will do line-breaking on it.
#1%
- %
- % If we must, put the page number on a line of its own, and fill out
- % this line with blank space. (The \hfil is overwhelmed with the
- % fill leaders glue in \indexdotfill if the page number does fit.)
- \hfil\penalty50
- \null\nobreak\indexdotfill % Have leaders before the page number.
- %
- % The `\ ' here is removed by the implicit \unskip that TeX does as
- % part of (the primitive) \par. Without it, a spurious underfull
- % \hbox ensues.
- \ #2% The page number ends the paragraph.
+ % The following is kluged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \def\tempa{{\rm }}%
+ \def\tempb{#2}%
+ \edef\tempc{\tempa}%
+ \edef\tempd{\tempb}%
+ \ifx\tempc\tempd\ \else%
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ #2% The page number ends the paragraph.
+ \fi%
\par
\endgroup}
% Like \dotfill except takes at least 1 em.
\def\indexdotfill{\cleaders
- \hbox{$\mathsurround=0pt \mkern1.5mu . \mkern1.5mu$}\hskip 1em plus 1fill}
+ \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
\def\primary #1{\line{#1\hfil}}
@@ -2180,13 +2497,13 @@ July\or August\or September\or October\or November\or December\fi
\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
\def\chapterzzz #1{\seccheck{chapter}%
\secno=0 \subsecno=0 \subsubsecno=0
-\global\advance \chapno by 1 \message{Chapter \the\chapno}%
+\global\advance \chapno by 1 \message{\putwordChapter \the\chapno}%
\chapmacro {#1}{\the\chapno}%
\gdef\thissection{#1}%
\gdef\thischaptername{#1}%
% We don't substitute the actual chapter name into \thischapter
% because we don't want its macros evaluated now.
-\xdef\thischapter{Chapter \the\chapno: \noexpand\thischaptername}%
+\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
{\chapternofonts%
\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}%
\escapechar=`\\%
@@ -2202,13 +2519,13 @@ July\or August\or September\or October\or November\or December\fi
\def\appendixzzz #1{\seccheck{appendix}%
\secno=0 \subsecno=0 \subsubsecno=0
\global\advance \appendixno by 1 \message{Appendix \appendixletter}%
-\chapmacro {#1}{Appendix \appendixletter}%
+\chapmacro {#1}{\putwordAppendix{} \appendixletter}%
\gdef\thissection{#1}%
\gdef\thischaptername{#1}%
-\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}%
+\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
{\chapternofonts%
\edef\temp{{\realbackslash chapentry
- {#1}{Appendix \appendixletter}{\noexpand\folio}}}%
+ {#1}{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
\escapechar=`\\%
\write \contentsfile \temp %
\appendixnoderef %
@@ -2567,6 +2884,7 @@ July\or August\or September\or October\or November\or December\fi
\unnumbchapmacro{#1}\def\thischapter{}%
\begingroup % Set up to handle contents files properly.
\catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ \catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
\raggedbottom % Worry more about breakpoints than the bottom.
\advance\hsize by -\contentsrightmargin % Don't use the full line length.
}
@@ -2574,7 +2892,7 @@ July\or August\or September\or October\or November\or December\fi
% Normal (long) toc.
\outer\def\contents{%
- \startcontents{Table of Contents}%
+ \startcontents{\putwordTableofContents}%
\input \jobname.toc
\endgroup
\vfill \eject
@@ -2582,7 +2900,7 @@ July\or August\or September\or October\or November\or December\fi
% And just the chapters.
\outer\def\summarycontents{%
- \startcontents{Short Contents}%
+ \startcontents{\putwordShortContents}%
%
\let\chapentry = \shortchapentry
\let\unnumbchapentry = \shortunnumberedentry
@@ -2621,7 +2939,7 @@ July\or August\or September\or October\or November\or December\fi
% We could simplify the code here by writing out an \appendixentry
% command in the toc file for appendices, instead of using \chapentry
% for both, but it doesn't seem worth it.
-\setbox0 = \hbox{\shortcontrm Appendix }
+\setbox0 = \hbox{\shortcontrm \putwordAppendix }
\newdimen\shortappendixwidth \shortappendixwidth = \wd0
\def\shortchaplabel#1{%
@@ -2775,6 +3093,7 @@ July\or August\or September\or October\or November\or December\fi
\catcode`\>=12
\escapechar=`\\
%
+\let\~=\ptextilde
\let\{=\ptexlbrace
\let\}=\ptexrbrace
\let\.=\ptexdot
@@ -2809,7 +3128,7 @@ July\or August\or September\or October\or November\or December\fi
% Define \obeyedspace to be our active space, whatever it is. This is
% for use in \parsearg.
-{\sepspaces %
+{\sepspaces%
\global\let\obeyedspace= }
% This space is always present above and below environments.
@@ -2949,9 +3268,9 @@ July\or August\or September\or October\or November\or December\fi
\let\Esmallexample = \nonfillfinish
%
% Smaller interline space and fonts for small examples.
- \baselineskip 10pt
+ \setleading{10pt}%
\indexfonts \tt
- \rawbackslash % output the \ character from the current font
+ \rawbackslash % make \ output the \ character from the current font (tt)
\gobble
}
@@ -2987,23 +3306,26 @@ July\or August\or September\or October\or November\or December\fi
\advance\leftskip by 0pt plus 1fill
\gobble}
-% @quotation does normal linebreaking and narrows the margins.
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.
%
\def\quotation{%
-\begingroup\inENV %This group ends at the end of the @quotation body
-{\parskip=0pt % because we will skip by \parskip too, later
-\aboveenvbreak}%
-\singlespace
-\parindent=0pt
-\let\Equotation = \nonfillfinish
-% @cartouche defines \nonarrowing to inhibit narrowing
-% at next level down.
-\ifx\nonarrowing\relax
-\advance \leftskip by \lispnarrowing
-\advance \rightskip by \lispnarrowing
-\exdentamount=\lispnarrowing
-\let\nonarrowing=\relax
-\fi}
+ \begingroup\inENV %This group ends at the end of the @quotation body
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \singlespace
+ \parindent=0pt
+ % We have retained a nonzero parskip for the environment, since we're
+ % doing normal filling. So to avoid extra space below the environment...
+ \def\Equotation{\parskip = 0pt \nonfillfinish}%
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \let\nonarrowing = \relax
+ \fi
+}
\message{defuns,}
% Define formatter for defuns
@@ -3035,6 +3357,9 @@ July\or August\or September\or October\or November\or December\fi
\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+% This is used to turn on special parens
+% but make & act ordinary (given that it's active).
+\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
% Definitions of (, ) and & used in args for functions.
% This is the definition of ( outside of all parentheses.
@@ -3104,7 +3429,7 @@ July\or August\or September\or October\or November\or December\fi
\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
\exdentamount=\defbodyindent
\begingroup %
-\catcode 61=\active %
+\catcode 61=\active % 61 is `='
\obeylines\activeparens\spacesplit#3}
\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
@@ -3147,55 +3472,54 @@ July\or August\or September\or October\or November\or December\fi
\catcode 61=\active %
\obeylines\spacesplit#3}
-\def\defvrparsebody #1#2#3#4 {\begingroup\inENV %
-\medbreak %
-% Define the end token that this defining construct specifies
-% so that it will exit this group.
-\def#1{\endgraf\endgroup\medbreak}%
-\def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup\obeylines\spacesplit{#3{#4}}}
-
-% This seems to work right in all cases.
-\let\deftpparsebody=\defvrparsebody
-% This fails to work. When given `@deftp {Data Type} foo_t',
-% it thinks the type name is just `f'.
-%%% This is the same as all the others except for the last line. We need
-%%% to parse the arguments differently for @deftp, since the ``attributes''
-%%% there are optional.
-%%%
-%%\def\deftpparsebody #1#2#3#4 {\begingroup\inENV %
-%%\medbreak %
-%%% Define the end token that this defining construct specifies
-%%% so that it will exit this group.
-%%\def#1{\endgraf\endgroup\medbreak}%
-%%\def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
-%%\parindent=0in
-%%\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-%%\exdentamount=\defbodyindent
-%%\begingroup\obeylines\parsetpheaderline{#3{#4}}}
-
-%%{\obeylines %
-%% % Parse the type name and any attributes (field names, etc.).
-%% % #1 is the beginning of the macro call that will produce the output,
-%% % i.e., \deftpheader{CLASS}; this is passed from \deftpparsebody.
-%% % #2 is the type name, e.g., `struct termios'.
-%% % #3 is the (possibly empty) attribute list.
-%% %
-%% \gdef\parsetpheaderline#1#2#3^^M{%
-%% \endgroup % Started in \deftpparsebody.
-%% %
-%% % If the attribute list is in fact empty, there will be no space after
-%% % #2; so we can't put a space in our TeX parameter list. But if it
-%% % isn't empty, then #3 will begin with an unwanted space.
-%% \def\theargs{\ignorespaces #3}%
-%% %
-%% % Call the macro to produce the output.
-%% #1{#2}\theargs %
-%% }%
-%%}
+% This is used for \def{tp,vr}parsebody. It could probably be used for
+% some of the others, too, with some judicious conditionals.
+%
+\def\parsebodycommon#1#2#3{%
+ \begingroup\inENV %
+ \medbreak %
+ % Define the end token that this defining construct specifies
+ % so that it will exit this group.
+ \def#1{\endgraf\endgroup\medbreak}%
+ \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
+ \parindent=0in
+ \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines
+}
+
+\def\defvrparsebody#1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \spacesplit{#3{#4}}%
+}
+
+% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
+% type is just `struct', because we lose the braces in `{struct
+% termios}' when \spacesplit reads its undelimited argument. Sigh.
+% \let\deftpparsebody=\defvrparsebody
+%
+% So, to get around this, we put \empty in with the type name. That
+% way, TeX won't find exactly `{...}' as an undelimited argument, and
+% won't strip off the braces.
+%
+\def\deftpparsebody #1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \spacesplit{\parsetpheaderline{#3{#4}}}\empty
+}
+
+% Fine, but then we have to eventually remove the \empty *and* the
+% braces (if any). That's what this does, putting the result in \tptemp.
+%
+\def\removeemptybraces\empty#1\relax{\def\tptemp{#1}}%
+
+% After \spacesplit has done its work, this is called -- #1 is the final
+% thing to call, #2 the type name (which starts with \empty), and #3
+% (which might be empty) the arguments.
+%
+\def\parsetpheaderline#1#2#3{%
+ \removeemptybraces#2\relax
+ #1{\tptemp}{#3}%
+}%
\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV %
\medbreak %
@@ -3244,8 +3568,9 @@ July\or August\or September\or October\or November\or December\fi
\def\deftypefunargs #1{%
% Expand, preventing hyphenation at `-' chars.
% Note that groups don't affect changes in \hyphenchar.
-\functionparens
-\code{#1}%
+% Use \boldbraxnoamp, not \functionparens, so that & is not special.
+\boldbraxnoamp
+\tclose{#1}% avoid \code because of side effects on active chars
\interlinepenalty=10000
\advance\rightskip by 0pt plus 1fil
\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
@@ -3281,7 +3606,7 @@ July\or August\or September\or October\or November\or December\fi
% #1 is the data type, #2 the name, #3 the args.
\def\deftypefunheaderx #1#2 #3\relax{%
\doind {fn}{\code{#2}}% Make entry in function index
-\begingroup\defname {\code{#1} #2}{Function}%
+\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}%
\deftypefunargs {#3}\endgroup %
\catcode 61=\other % Turn off change made in \defparsebody
}
@@ -3290,12 +3615,19 @@ July\or August\or September\or October\or November\or December\fi
\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+% \defheaderxcond#1\relax$$$
+% puts #1 in @code, followed by a space, but does nothing if #1 is null.
+\def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi}
+
% #1 is the classification. #2 is the data type. #3 is the name and args.
\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
% #1 is the classification, #2 the data type, #3 the name, #4 the args.
\def\deftypefnheaderx #1#2#3 #4\relax{%
\doind {fn}{\code{#3}}% Make entry in function index
-\begingroup\defname {\code{#2} #3}{#1}%
+\begingroup
+\normalparens % notably, turn off `&' magic, which prevents
+% at least some C++ text from working
+\defname {\defheaderxcond#2\relax$$$#3}{#1}%
\deftypefunargs {#4}\endgroup %
\catcode 61=\other % Turn off change made in \defparsebody
}
@@ -3423,7 +3755,7 @@ July\or August\or September\or October\or November\or December\fi
% #1 is the data type. #2 is the name.
\def\deftypevarheader #1#2{%
\doind {vr}{\code{#2}}% Make entry in variables index
-\begingroup\defname {\code{#1} #2}{Variable}%
+\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}%
\interlinepenalty=10000
\endgraf\penalty 10000\vskip -\parskip\penalty 10000
\endgroup}
@@ -3433,7 +3765,7 @@ July\or August\or September\or October\or November\or December\fi
\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}%
-\begingroup\defname {\code{#2} #3}{#1}
+\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1}
\interlinepenalty=10000
\endgraf\penalty 10000\vskip -\parskip\penalty 10000
\endgroup}
@@ -3474,17 +3806,17 @@ July\or August\or September\or October\or November\or December\fi
% \setref{foo} defines a cross-reference point named foo.
\def\setref#1{%
-%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-title}{Ytitle}%
\dosetq{#1-pg}{Ypagenumber}%
\dosetq{#1-snt}{Ysectionnumberandtype}}
\def\unnumbsetref#1{%
-%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-title}{Ytitle}%
\dosetq{#1-pg}{Ypagenumber}%
\dosetq{#1-snt}{Ynothing}}
\def\appendixsetref#1{%
-%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-title}{Ytitle}%
\dosetq{#1-pg}{Ypagenumber}%
\dosetq{#1-snt}{Yappendixletterandtype}}
@@ -3494,43 +3826,63 @@ July\or August\or September\or October\or November\or December\fi
% file, #5 the name of the printed manual. All but the node name can be
% omitted.
%
-\def\pxref#1{see \xrefX[#1,,,,,,,]}
-\def\xref#1{See \xrefX[#1,,,,,,,]}
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
\def\ref#1{\xrefX[#1,,,,,,,]}
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup%
-\def\printedmanual{\ignorespaces #5}%
-\def\printednodename{\ignorespaces #3}%
-%
-\setbox1=\hbox{\printedmanual}%
-\setbox0=\hbox{\printednodename}%
-\ifdim \wd0=0pt%
-\def\printednodename{\ignorespaces #1}%
-%%% Uncommment the following line to make the actual chapter or section title
-%%% appear inside the square brackets.
-%\def\printednodename{#1-title}%
-\fi%
-%
-%
-% If we use \unhbox0 and \unhbox1 to print the node names, TeX does
-% not insert empty discretionaries after hyphens, which means that it
-% will not find a line break at a hyphen in a node names. Since some
-% manuals are best written with fairly long node names, containing
-% hyphens, this is a loss. Therefore, we simply give the text of
-% the node name again, so it is as if TeX is seeing it for the first
-% time.
-\ifdim \wd1>0pt
-section ``\printednodename'' in \cite{\printedmanual}%
-\else%
-\turnoffactive%
-\refx{#1-snt}{} [\printednodename], page\tie\refx{#1-pg}{}%
-\fi
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printednodename{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual}%
+ \setbox0=\hbox{\printednodename}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \ifx\SETxref-automatic-section-title\relax %
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1>0pt%
+ % It is in another manual, so we don't have it.
+ \def\printednodename{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printednodename{\refx{#1-title}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printednodename{\ignorespaces #1}%
+ \fi%
+ \fi
+ \def\printednodename{#1-title}%
+ \else
+ % Use the node name inside the square brackets.
+ \def\printednodename{\ignorespaces #1}%
+ \fi
+ \fi
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifdim \wd1 > 0pt
+ \putwordsection{} ``\printednodename'' in \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive \refx{#1-snt}{}}%
+ \space [\printednodename],\space
+ \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+ \fi
\endgroup}
% \dosetq is the interface for calls from other macros
% Use \turnoffactive so that punctuation chars such as underscore
% work in node names.
-\def\dosetq #1#2{{\let\folio=0 \turnoffactive%
+\def\dosetq #1#2{{\let\folio=0 \turnoffactive \auxhat%
\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
\next}}
@@ -3544,26 +3896,26 @@ section ``\printednodename'' in \cite{\printedmanual}%
\def\Ypagenumber{\folio}
-\def\Ytitle{\thischapter}
+\def\Ytitle{\thissection}
\def\Ynothing{}
\def\Ysectionnumberandtype{%
-\ifnum\secno=0 Chapter\xreftie\the\chapno %
-\else \ifnum \subsecno=0 Section\xreftie\the\chapno.\the\secno %
+\ifnum\secno=0 \putwordChapter\xreftie\the\chapno %
+\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno %
\else \ifnum \subsubsecno=0 %
-Section\xreftie\the\chapno.\the\secno.\the\subsecno %
+\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno %
\else %
-Section\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
+\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
\fi \fi \fi }
\def\Yappendixletterandtype{%
-\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{}%
-\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno %
+\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}%
+\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno %
\else \ifnum \subsubsecno=0 %
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
+\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
\else %
-Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
+\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
\fi \fi \fi }
\gdef\xreftie{'tie}
@@ -3651,6 +4003,15 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
\catcode `\&=\other
% `\+ does not work, so use 43.
\catcode 43=\other
+% Make the characters 128-255 be printing characters
+{%
+ \count 1=128
+ \def\loop{%
+ \catcode\count 1=\other
+ \advance\count 1 by 1
+ \ifnum \count 1<256 \loop \fi
+ }%
+}%
% the aux file uses ' as the escape.
% Turn off \ as an escape so we do not lose on
% entries which were dumped with control sequences in their names.
@@ -3660,6 +4021,7 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
\catcode `\{=1 \catcode `\}=2
\catcode `\%=\other
\catcode `\'=0
+\catcode`\^=7 % to make ^^e4 etc usable in xref tags
\catcode `\\=\other
\openin 1 \jobname.aux
\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue
@@ -3846,6 +4208,8 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
\global\tolerance=700
\global\hfuzz=1pt
\global\contentsrightmargin=0pt
+\global\deftypemargin=0pt
+\global\defbodyindent=.5cm
\global\pagewidth=\hsize
\global\pageheight=\vsize
@@ -3875,6 +4239,32 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
\global\pageheight=\vsize
}
+% Allow control of the text dimensions. Parameters in order: textheight;
+% textwidth; \voffset; \hoffset (!); binding offset. All require a dimension;
+% header is additional; added length extends the bottom of the page.
+
+\def\changepagesizes#1#2#3#4#5{
+ \global\vsize= #1
+ \advance\vsize by \topskip
+ \global\voffset= #3
+ \global\hsize= #2
+ \global\outerhsize=\hsize
+ \global\advance\outerhsize by 0.5in
+ \global\outervsize=\vsize
+ \global\advance\outervsize by 0.6in
+ \global\pagewidth=\hsize
+ \global\pageheight=\vsize
+ \global\normaloffset= #4
+ \global\bindingoffset= #5}
+
+% This layout is compatible with Latex on A4 paper.
+
+\def\afourlatex{\changepagesizes{22cm}{15cm}{7mm}{4.6mm}{5mm}}
+
+% Use @afourwide to print on European A4 paper in wide format.
+\def\afourwide{\afourpaper
+\changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}}
+
% Define macros to output various characters with catcode for normal text.
\catcode`\"=\other
\catcode`\~=\other
@@ -3916,6 +4306,7 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
\def~{{\tt \char '176}}
\chardef\hat=`\^
\catcode`\^=\active
+\def\auxhat{\def^{'hat}}
\def^{{\tt \hat}}
\catcode`\_=\active
@@ -3943,21 +4334,19 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
%\catcode 27=\active
%\def^^[{$\diamondsuit$}
-% Used sometimes to turn off (effectively) the active characters
-% even after parsing them.
-\def\turnoffactive{\let"=\normaldoublequote
-\let~=\normaltilde
-\let^=\normalcaret
-\let_=\normalunderscore
-\let|=\normalverticalbar
-\let<=\normalless
-\let>=\normalgreater
-\let+=\normalplus}
-
% Set up an active definition for =, but don't enable it most of the time.
{\catcode`\==\active
\global\def={{\tt \char 61}}}
+\catcode`+=\active
+\catcode`\_=\active
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
\catcode`\@=0
% \rawbackslashxx output one backslash character in current font
@@ -3978,6 +4367,32 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
% \catcode 17=0 % Define control-q
\catcode`\\=\active
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{@let"=@normaldoublequote
+@let\=@realbackslash
+@let~=@normaltilde
+@let^=@normalcaret
+@let_=@normalunderscore
+@let|=@normalverticalbar
+@let<=@normalless
+@let>=@normalgreater
+@let+=@normalplus}
+
+@def@normalturnoffactive{@let"=@normaldoublequote
+@let\=@normalbackslash
+@let~=@normaltilde
+@let^=@normalcaret
+@let_=@normalunderscore
+@let|=@normalverticalbar
+@let<=@normalless
+@let>=@normalgreater
+@let+=@normalplus}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
% That is what \eatinput is for; after that, the `\' should revert to printing
% a backslash.
@@ -3988,8 +4403,11 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
% On the other hand, perhaps the file did not have a `\input texinfo'. Then
% the first `\{ in the file would cause an error. This macro tries to fix
% that, assuming it is called before the first `\' could plausibly occur.
+% Also back turn on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
%
-@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi}
+@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active @catcode`@_=@active}
%% These look ok in all fonts, so just make them not special. The @rm below
%% makes sure that the current font starts out as the newly loaded cmr10
diff --git a/emacs_keymap.c b/emacs_keymap.c
index 849d85f..4ba3858 100644
--- a/emacs_keymap.c
+++ b/emacs_keymap.c
@@ -33,7 +33,7 @@
KEYMAP_ENTRY_ARRAY emacs_standard_keymap = {
/* Control keys. */
- { ISFUNC, (Function *)0x0 }, /* Control-@ */
+ { ISFUNC, rl_set_mark }, /* Control-@ */
{ ISFUNC, rl_beg_of_line }, /* Control-a */
{ ISFUNC, rl_backward }, /* Control-b */
{ ISFUNC, (Function *)0x0 }, /* Control-c */
@@ -62,7 +62,7 @@ KEYMAP_ENTRY_ARRAY emacs_standard_keymap = {
{ ISFUNC, (Function *)0x0 }, /* Control-z */
{ ISKMAP, (Function *)emacs_meta_keymap }, /* Control-[ */
{ ISFUNC, (Function *)0x0 }, /* Control-\ */
- { ISFUNC, (Function *)0x0 }, /* Control-] */
+ { ISFUNC, rl_char_search }, /* Control-] */
{ ISFUNC, (Function *)0x0 }, /* Control-^ */
{ ISFUNC, rl_undo_command }, /* Control-_ */
@@ -358,22 +358,22 @@ KEYMAP_ENTRY_ARRAY emacs_meta_keymap = {
{ ISFUNC, rl_complete }, /* Meta-Control-[ */
{ ISFUNC, (Function *)0x0 }, /* Meta-Control-\ */
- { ISFUNC, (Function *)0x0 }, /* Meta-Control-] */
+ { ISFUNC, rl_backward_char_search }, /* Meta-Control-] */
{ ISFUNC, (Function *)0x0 }, /* Meta-Control-^ */
{ ISFUNC, (Function *)0x0 }, /* Meta-Control-_ */
/* The start of printing characters. */
- { ISFUNC, (Function *)0x0 }, /* Meta-SPACE */
+ { ISFUNC, rl_set_mark }, /* Meta-SPACE */
{ ISFUNC, (Function *)0x0 }, /* Meta-! */
{ ISFUNC, (Function *)0x0 }, /* Meta-" */
- { ISFUNC, (Function *)0x0 }, /* Meta-# */
+ { ISFUNC, rl_insert_comment },/* Meta-# */
{ ISFUNC, (Function *)0x0 }, /* Meta-$ */
{ ISFUNC, (Function *)0x0 }, /* Meta-% */
{ ISFUNC, rl_tilde_expand }, /* Meta-& */
{ ISFUNC, (Function *)0x0 }, /* Meta-' */
{ ISFUNC, (Function *)0x0 }, /* Meta-( */
{ ISFUNC, (Function *)0x0 }, /* Meta-) */
- { ISFUNC, (Function *)0x0 }, /* Meta-* */
+ { ISFUNC, rl_insert_completions }, /* Meta-* */
{ ISFUNC, (Function *)0x0 }, /* Meta-+ */
{ ISFUNC, (Function *)0x0 }, /* Meta-, */
{ ISFUNC, rl_digit_argument }, /* Meta-- */
@@ -396,7 +396,7 @@ KEYMAP_ENTRY_ARRAY emacs_meta_keymap = {
{ ISFUNC, (Function *)0x0 }, /* Meta-: */
{ ISFUNC, (Function *)0x0 }, /* Meta-; */
{ ISFUNC, rl_beginning_of_history }, /* Meta-< */
- { ISFUNC, (Function *)0x0 }, /* Meta-= */
+ { ISFUNC, rl_possible_completions }, /* Meta-= */
{ ISFUNC, rl_end_of_history }, /* Meta-> */
{ ISFUNC, rl_possible_completions }, /* Meta-? */
{ ISFUNC, (Function *)0x0 }, /* Meta-@ */
@@ -632,7 +632,7 @@ KEYMAP_ENTRY_ARRAY emacs_ctlx_keymap = {
{ ISFUNC, rl_undo_command }, /* Control-u */
{ ISFUNC, (Function *)0x0 }, /* Control-v */
{ ISFUNC, (Function *)0x0 }, /* Control-w */
- { ISFUNC, (Function *)0x0 }, /* Control-x */
+ { ISFUNC, rl_exchange_point_and_mark },/* Control-x */
{ ISFUNC, (Function *)0x0 }, /* Control-y */
{ ISFUNC, (Function *)0x0 }, /* Control-z */
{ ISFUNC, (Function *)0x0 }, /* Control-[ */
diff --git a/examples/Makefile.in b/examples/Makefile.in
new file mode 100644
index 0000000..8dd7f62
--- /dev/null
+++ b/examples/Makefile.in
@@ -0,0 +1,37 @@
+# This is the Makefile for the examples subdirectory of readline. -*- text -*-
+#
+srcdir = @srcdir@
+VPATH = .:@srcdir@
+top_srcdir = @top_srcdir@
+BUILD_DIR = .
+
+DEFS = @DEFS@
+CC = @CC@
+CFLAGS = @CFLAGS@
+LOCAL_CFLAGS = @LOCAL_CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I $(srcdir) -I $(top_srcdir) -I..
+
+CCFLAGS = $(DEFS) $(LOCAL_CFLAGS) $(CPPFLAGS) $(INCLUDES) $(CFLAGS)
+LDFLAGS = -g -L..
+
+.c.o:
+ $(CC) $(CCFLAGS) -c $<
+
+EXECUTABLES = fileman rltest rl
+
+all: $(EXECUTABLES)
+
+rl: rl.o
+ $(CC) $(LDFLAGS) -o $@ rl.o -lreadline -ltermcap
+
+fileman: fileman.o
+ $(CC) $(LDFLAGS) -o $@ fileman.o -lreadline -ltermcap
+
+rltest: rltest.o
+ $(CC) $(LDFLAGS) -o $@ rltest.o -lreadline -ltermcap
+
+fileman.o: $(srcdir)/fileman.c
+rltest.o: $(srcdir)/rltest.c
+rl.o: $(srcdir)/rl.c
diff --git a/examples/fileman.c b/examples/fileman.c
index 3ecb9f1..0702a5b 100644
--- a/examples/fileman.c
+++ b/examples/fileman.c
@@ -1,15 +1,38 @@
/* fileman.c -- A tiny application which demonstrates how to use the
GNU Readline library. This application interactively allows users
to manipulate files and their modes. */
+/*
+ * Remove the next line if you're compiling this against an installed
+ * libreadline.a
+ */
+#define READLINE_LIBRARY
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
-#include <stdio.h>
#include <sys/types.h>
+#ifdef HAVE_SYS_FILE_H
#include <sys/file.h>
+#endif
#include <sys/stat.h>
-#include <sys/errno.h>
-#include <readline/readline.h>
-#include <readline/history.h>
+#include <stdio.h>
+#include <errno.h>
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else /* !HAVE_STRING_H */
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#ifdef READLINE_LIBRARY
+# include "readline.h"
+# include "history.h"
+#else
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
extern char *getwd ();
extern char *xmalloc ();
@@ -54,7 +77,7 @@ int done;
char *
dupstr (s)
- int s;
+ char *s;
{
char *r;
@@ -194,10 +217,11 @@ initialize_readline ()
rl_attempted_completion_function = (CPPFunction *)fileman_completion;
}
-/* Attempt to complete on the contents of TEXT. START and END show the
- region of TEXT that contains the word to complete. We can use the
- entire line in case we want to do some simple parsing. Return the
- array of matches, or NULL if there aren't any. */
+/* Attempt to complete on the contents of TEXT. START and END bound the
+ region of rl_line_buffer that contains the word to complete. TEXT is
+ the word to complete. We can use the entire contents of rl_line_buffer
+ in case we want to do some simple parsing. Return the array of matches,
+ or NULL if there aren't any. */
char **
fileman_completion (text, start, end)
char *text;
@@ -303,7 +327,8 @@ com_stat (arg)
printf ("Statistics for `%s':\n", arg);
- printf ("%s has %d link%s, and is %d byte%s in length.\n", arg,
+ printf ("%s has %d link%s, and is %d byte%s in length.\n",
+ arg,
finfo.st_nlink,
(finfo.st_nlink == 1) ? "" : "s",
finfo.st_size,
diff --git a/examples/rl.c b/examples/rl.c
new file mode 100644
index 0000000..6c2f343
--- /dev/null
+++ b/examples/rl.c
@@ -0,0 +1,115 @@
+/*
+ * rl - command-line interface to read a line from the standard input
+ * (or another fd) using readline.
+ *
+ * usage: rl [-p prompt] [-u unit] [-d default]
+ */
+
+/*
+ * Remove the next line if you're compiling this against an installed
+ * libreadline.a
+ */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include "posixstat.h"
+#include "readline.h"
+#include "history.h"
+
+extern int optind;
+extern char *optarg;
+
+extern char *strrchr();
+
+static char *progname;
+static char *deftext;
+
+static int
+set_deftext ()
+{
+ if (deftext)
+ {
+ rl_insert_text (deftext);
+ deftext = (char *)NULL;
+ rl_startup_hook = (Function *)NULL;
+ }
+}
+
+usage()
+{
+ fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default]\n",
+ progname, progname);
+}
+
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *temp, *prompt;
+ struct stat sb;
+ int done, opt, fd;
+ FILE *ifp;
+
+ progname = strrchr(argv[0], '/');
+ if (progname == 0)
+ progname = argv[0];
+ else
+ progname++;
+
+ /* defaults */
+ prompt = "readline$ ";
+ fd = 0;
+ deftext = (char *)0;
+
+ while ((opt = getopt(argc, argv, "p:u:d:")) != EOF)
+ {
+ switch (opt)
+ {
+ case 'p':
+ prompt = optarg;
+ break;
+ case 'u':
+ fd = atoi(optarg);
+ if (fd < 0)
+ {
+ fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg);
+ exit (2);
+ }
+ break;
+ case 'd':
+ deftext = optarg;
+ break;
+ default:
+ usage ();
+ exit (2);
+ }
+ }
+
+ if (fd != 0)
+ {
+ if (fstat (fd, &sb) < 0)
+ {
+ fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd);
+ exit (1);
+ }
+ ifp = fdopen (fd, "r");
+ rl_instream = ifp;
+ }
+
+ if (deftext && *deftext)
+ rl_startup_hook = set_deftext;
+
+ temp = readline (prompt);
+
+ /* Test for EOF. */
+ if (temp == 0)
+ exit (1);
+
+ puts (temp);
+ exit (0);
+}
diff --git a/examples/rltest.c b/examples/rltest.c
new file mode 100644
index 0000000..ff3ad5c
--- /dev/null
+++ b/examples/rltest.c
@@ -0,0 +1,64 @@
+/* **************************************************************** */
+/* */
+/* Testing Readline */
+/* */
+/* **************************************************************** */
+
+/*
+ * Remove the next line if you're compiling this against an installed
+ * libreadline.a
+ */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include "readline.h"
+#include "history.h"
+
+main ()
+{
+ HIST_ENTRY **history_list ();
+ char *temp = (char *)NULL;
+ char *prompt = "readline$ ";
+ int done = 0;
+
+ while (!done)
+ {
+ temp = readline (prompt);
+
+ /* Test for EOF. */
+ if (!temp)
+ exit (1);
+
+ /* If there is anything on the line, print it and remember it. */
+ if (*temp)
+ {
+ fprintf (stderr, "%s\r\n", temp);
+ add_history (temp);
+ }
+
+ /* Check for `command' that we handle. */
+ if (strcmp (temp, "quit") == 0)
+ done = 1;
+
+ if (strcmp (temp, "list") == 0)
+ {
+ HIST_ENTRY **list = history_list ();
+ register int i;
+ if (list)
+ {
+ for (i = 0; list[i]; i++)
+ {
+ fprintf (stderr, "%d: %s\r\n", i, list[i]->line);
+ free (list[i]->line);
+ }
+ free (list);
+ }
+ }
+ free (temp);
+ }
+}
diff --git a/funmap.c b/funmap.c
index 9255974..702fabd 100644
--- a/funmap.c
+++ b/funmap.c
@@ -21,11 +21,11 @@
675 Mass Ave, Cambridge, MA 02139, USA. */
#define READLINE_LIBRARY
-#if defined (STATIC_MALLOC)
-static char *xmalloc (), *xrealloc ();
-#else
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
extern char *xmalloc (), *xrealloc ();
-#endif /* STATIC_MALLOC */
#if !defined (BUFSIZ)
#include <stdio.h>
@@ -40,18 +40,17 @@ extern char *xmalloc (), *xrealloc ();
#include "rlconf.h"
#include "readline.h"
-static int qsort_string_compare ();
+extern int _rl_qsort_string_compare ();
-FUNMAP **funmap = (FUNMAP **)NULL;
-static int funmap_size = 0;
-static int funmap_entry = 0;
+FUNMAP **funmap;
+static int funmap_size;
+static int funmap_entry;
/* After initializing the function map, this is the index of the first
program specific function. */
int funmap_program_specific_entry_start;
static FUNMAP default_funmap[] = {
-
{ "abort", rl_abort },
{ "accept-line", rl_newline },
{ "arrow-key-prefix", rl_arrow_keys },
@@ -64,26 +63,36 @@ static FUNMAP default_funmap[] = {
{ "beginning-of-line", rl_beg_of_line },
{ "call-last-kbd-macro", rl_call_last_kbd_macro },
{ "capitalize-word", rl_capitalize_word },
+ { "character-search", rl_char_search },
+ { "character-search-backward", rl_backward_char_search },
{ "clear-screen", rl_clear_screen },
{ "complete", rl_complete },
+ { "copy-backward-word", rl_copy_backward_word },
+ { "copy-forward-word", rl_copy_forward_word },
+ { "copy-region-as-kill", rl_copy_region_to_kill },
{ "delete-char", rl_delete },
{ "delete-horizontal-space", rl_delete_horizontal_space },
{ "digit-argument", rl_digit_argument },
{ "do-lowercase-version", rl_do_lowercase_version },
{ "downcase-word", rl_downcase_word },
{ "dump-functions", rl_dump_functions },
+ { "dump-macros", rl_dump_macros },
+ { "dump-variables", rl_dump_variables },
{ "emacs-editing-mode", rl_emacs_editing_mode },
{ "end-kbd-macro", rl_end_kbd_macro },
{ "end-of-history", rl_end_of_history },
{ "end-of-line", rl_end_of_line },
+ { "exchange-point-and-mark", rl_exchange_point_and_mark },
{ "forward-char", rl_forward },
{ "forward-search-history", rl_forward_search_history },
{ "forward-word", rl_forward_word },
{ "history-search-backward", rl_history_search_backward },
{ "history-search-forward", rl_history_search_forward },
+ { "insert-comment", rl_insert_comment },
{ "insert-completions", rl_insert_completions },
{ "kill-whole-line", rl_kill_full_line },
{ "kill-line", rl_kill_line },
+ { "kill-region", rl_kill_region },
{ "kill-word", rl_kill_word },
{ "next-history", rl_get_next_history },
{ "non-incremental-forward-search-history", rl_noninc_forward_search },
@@ -98,6 +107,7 @@ static FUNMAP default_funmap[] = {
{ "reverse-search-history", rl_reverse_search_history },
{ "revert-line", rl_revert_line },
{ "self-insert", rl_insert },
+ { "set-mark", rl_set_mark },
{ "start-kbd-macro", rl_start_kbd_macro },
{ "tab-insert", rl_tab_insert },
{ "tilde-expand", rl_tilde_expand },
@@ -118,6 +128,7 @@ static FUNMAP default_funmap[] = {
{ "vi-append-eol", rl_vi_append_eol },
{ "vi-append-mode", rl_vi_append_mode },
{ "vi-arg-digit", rl_vi_arg_digit },
+ { "vi-back-to-indent", rl_vi_back_to_indent },
{ "vi-bWord", rl_vi_bWord },
{ "vi-bracktype", rl_vi_bracktype },
{ "vi-bword", rl_vi_bword },
@@ -126,7 +137,6 @@ static FUNMAP default_funmap[] = {
{ "vi-change-to", rl_vi_change_to },
{ "vi-char-search", rl_vi_char_search },
{ "vi-column", rl_vi_column },
- { "vi-comment", rl_vi_comment },
{ "vi-complete", rl_vi_complete },
{ "vi-delete", rl_vi_delete },
{ "vi-delete-to", rl_vi_delete_to },
@@ -136,8 +146,10 @@ static FUNMAP default_funmap[] = {
{ "vi-eof-maybe", rl_vi_eof_maybe },
{ "vi-eword", rl_vi_eword },
{ "vi-fWord", rl_vi_fWord },
+ { "vi-fetch-history", rl_vi_fetch_history },
{ "vi-first-print", rl_vi_first_print },
{ "vi-fword", rl_vi_fword },
+ { "vi-goto-mark", rl_vi_goto_mark },
{ "vi-insert-beg", rl_vi_insert_beg },
{ "vi-insertion-mode", rl_vi_insertion_mode },
{ "vi-match", rl_vi_match },
@@ -151,6 +163,7 @@ static FUNMAP default_funmap[] = {
{ "vi-replace", rl_vi_replace },
{ "vi-search", rl_vi_search },
{ "vi-search-again", rl_vi_search_again },
+ { "vi-set-mark", rl_vi_set_mark },
{ "vi-subst", rl_vi_subst },
{ "vi-tilde-expand", rl_vi_tilde_expand },
{ "vi-yank-arg", rl_vi_yank_arg },
@@ -160,16 +173,16 @@ static FUNMAP default_funmap[] = {
{(char *)NULL, (Function *)NULL }
};
+int
rl_add_funmap_entry (name, function)
char *name;
Function *function;
{
if (funmap_entry + 2 >= funmap_size)
- if (!funmap)
- funmap = (FUNMAP **)xmalloc ((funmap_size = 80) * sizeof (FUNMAP *));
- else
- funmap =
- (FUNMAP **)xrealloc (funmap, (funmap_size += 80) * sizeof (FUNMAP *));
+ {
+ funmap_size += 64;
+ funmap = (FUNMAP **)xrealloc (funmap, funmap_size * sizeof (FUNMAP *));
+ }
funmap[funmap_entry] = (FUNMAP *)xmalloc (sizeof (FUNMAP));
funmap[funmap_entry]->name = name;
@@ -179,7 +192,7 @@ rl_add_funmap_entry (name, function)
return funmap_entry;
}
-static int funmap_initialized = 0;
+static int funmap_initialized;
/* Make the funmap contain all of the default entries. */
void
@@ -203,46 +216,28 @@ rl_initialize_funmap ()
char **
rl_funmap_names ()
{
- char **result = (char **)NULL;
+ char **result;
int result_size, result_index;
- result_size = result_index = 0;
-
/* Make sure that the function map has been initialized. */
rl_initialize_funmap ();
- for (result_index = 0; funmap[result_index]; result_index++)
+ for (result_index = result_size = 0, result = (char **)NULL; funmap[result_index]; result_index++)
{
if (result_index + 2 > result_size)
{
- if (!result)
- result = (char **)xmalloc ((result_size = 20) * sizeof (char *));
- else
- result = (char **)
- xrealloc (result, (result_size += 20) * sizeof (char *));
+ result_size += 20;
+ result = (char **)xrealloc (result, result_size * sizeof (char *));
}
result[result_index] = funmap[result_index]->name;
result[result_index + 1] = (char *)NULL;
}
- qsort (result, result_index, sizeof (char *), qsort_string_compare);
+ qsort (result, result_index, sizeof (char *), _rl_qsort_string_compare);
return (result);
}
-/* Stupid comparison routine for qsort () ing strings. */
-static int
-qsort_string_compare (s1, s2)
- register char **s1, **s2;
-{
- int r;
-
- r = **s1 - **s2;
- if (r == 0)
- r = strcmp (*s1, *s2);
- return r;
-}
-
/* Things that mean `Control'. */
char *possible_control_prefixes[] = {
"Control-", "C-", "CTRL-", (char *)NULL
@@ -251,49 +246,3 @@ char *possible_control_prefixes[] = {
char *possible_meta_prefixes[] = {
"Meta", "M-", (char *)NULL
};
-
-#if defined (STATIC_MALLOC)
-
-/* **************************************************************** */
-/* */
-/* xmalloc and xrealloc () */
-/* */
-/* **************************************************************** */
-
-static void memory_error_and_abort ();
-
-static char *
-xmalloc (bytes)
- int bytes;
-{
- char *temp = (char *)malloc (bytes);
-
- if (!temp)
- memory_error_and_abort ();
- return (temp);
-}
-
-static char *
-xrealloc (pointer, bytes)
- char *pointer;
- int bytes;
-{
- char *temp;
-
- if (!pointer)
- temp = (char *)malloc (bytes);
- else
- temp = (char *)realloc (pointer, bytes);
-
- if (!temp)
- memory_error_and_abort ();
- return (temp);
-}
-
-static void
-memory_error_and_abort ()
-{
- fprintf (stderr, "history: Out of virtual memory!\n");
- abort ();
-}
-#endif /* STATIC_MALLOC */
diff --git a/histexpand.c b/histexpand.c
new file mode 100644
index 0000000..de71d78
--- /dev/null
+++ b/histexpand.c
@@ -0,0 +1,1321 @@
+/* histexpand.c -- history expansion. */
+
+/* Copyright (C) 1989, 1992 Free Software Foundation, Inc.
+
+ This file contains the GNU History Library (the Library), a set of
+ routines for managing the text of previously typed lines.
+
+ The Library 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.
+
+ The Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#include "history.h"
+#include "histlib.h"
+
+static char error_pointer;
+
+static char *subst_lhs;
+static char *subst_rhs;
+static int subst_lhs_len;
+static int subst_rhs_len;
+
+static char *get_history_word_specifier ();
+static char *history_find_word ();
+
+extern int history_offset;
+
+extern char *single_quote ();
+static char *quote_breaks ();
+
+extern char *xmalloc (), *xrealloc ();
+
+/* Variables exported by this file. */
+/* The character that represents the start of a history expansion
+ request. This is usually `!'. */
+char history_expansion_char = '!';
+
+/* The character that invokes word substitution if found at the start of
+ a line. This is usually `^'. */
+char history_subst_char = '^';
+
+/* During tokenization, if this character is seen as the first character
+ of a word, then it, and all subsequent characters upto a newline are
+ ignored. For a Bourne shell, this should be '#'. Bash special cases
+ the interactive comment character to not be a comment delimiter. */
+char history_comment_char = '\0';
+
+/* The list of characters which inhibit the expansion of text if found
+ immediately following history_expansion_char. */
+char *history_no_expand_chars = " \t\n\r=";
+
+/* If set to a non-zero value, single quotes inhibit history expansion.
+ The default is 0. */
+int history_quotes_inhibit_expansion = 0;
+
+/* If set, this points to a function that is called to verify that a
+ particular history expansion should be performed. */
+Function *history_inhibit_expansion_function;
+
+/* **************************************************************** */
+/* */
+/* History Expansion */
+/* */
+/* **************************************************************** */
+
+/* Hairy history expansion on text, not tokens. This is of general
+ use, and thus belongs in this library. */
+
+/* The last string searched for by a !?string? search. */
+static char *search_string;
+
+/* The last string matched by a !?string? search. */
+static char *search_match;
+
+/* Return the event specified at TEXT + OFFSET modifying OFFSET to
+ point to after the event specifier. Just a pointer to the history
+ line is returned; NULL is returned in the event of a bad specifier.
+ You pass STRING with *INDEX equal to the history_expansion_char that
+ begins this specification.
+ DELIMITING_QUOTE is a character that is allowed to end the string
+ specification for what to search for in addition to the normal
+ characters `:', ` ', `\t', `\n', and sometimes `?'.
+ So you might call this function like:
+ line = get_history_event ("!echo:p", &index, 0); */
+char *
+get_history_event (string, caller_index, delimiting_quote)
+ char *string;
+ int *caller_index;
+ int delimiting_quote;
+{
+ register int i;
+ register char c;
+ HIST_ENTRY *entry;
+ int which, sign, local_index, substring_okay;
+ Function *search_func;
+ char *temp;
+
+ /* The event can be specified in a number of ways.
+
+ !! the previous command
+ !n command line N
+ !-n current command-line minus N
+ !str the most recent command starting with STR
+ !?str[?]
+ the most recent command containing STR
+
+ All values N are determined via HISTORY_BASE. */
+
+ i = *caller_index;
+
+ if (string[i] != history_expansion_char)
+ return ((char *)NULL);
+
+ /* Move on to the specification. */
+ i++;
+
+ sign = 1;
+ substring_okay = 0;
+
+#define RETURN_ENTRY(e, w) \
+ return ((e = history_get (w)) ? e->line : (char *)NULL)
+
+ /* Handle !! case. */
+ if (string[i] == history_expansion_char)
+ {
+ i++;
+ which = history_base + (history_length - 1);
+ *caller_index = i;
+ RETURN_ENTRY (entry, which);
+ }
+
+ /* Hack case of numeric line specification. */
+ if (string[i] == '-')
+ {
+ sign = -1;
+ i++;
+ }
+
+ if (_rl_digit_p (string[i]))
+ {
+ /* Get the extent of the digits and compute the value. */
+ for (which = 0; _rl_digit_p (string[i]); i++)
+ which = (which * 10) + _rl_digit_value (string[i]);
+
+ *caller_index = i;
+
+ if (sign < 0)
+ which = (history_length + history_base) - which;
+
+ RETURN_ENTRY (entry, which);
+ }
+
+ /* This must be something to search for. If the spec begins with
+ a '?', then the string may be anywhere on the line. Otherwise,
+ the string must be found at the start of a line. */
+ if (string[i] == '?')
+ {
+ substring_okay++;
+ i++;
+ }
+
+ /* Only a closing `?' or a newline delimit a substring search string. */
+ for (local_index = i; c = string[i]; i++)
+ if ((!substring_okay && (whitespace (c) || c == ':' ||
+ (history_search_delimiter_chars && member (c, history_search_delimiter_chars)) ||
+ string[i] == delimiting_quote)) ||
+ string[i] == '\n' ||
+ (substring_okay && string[i] == '?'))
+ break;
+
+ which = i - local_index;
+ temp = xmalloc (1 + which);
+ if (which)
+ strncpy (temp, string + local_index, which);
+ temp[which] = '\0';
+
+ if (substring_okay && string[i] == '?')
+ i++;
+
+ *caller_index = i;
+
+#define FAIL_SEARCH() \
+ do { \
+ history_offset = history_length; free (temp) ; return (char *)NULL; \
+ } while (0)
+
+ /* If there is no search string, try to use the previous search string,
+ if one exists. If not, fail immediately. */
+ if (*temp == '\0' && substring_okay)
+ {
+ if (search_string)
+ {
+ free (temp);
+ temp = savestring (search_string);
+ }
+ else
+ FAIL_SEARCH ();
+ }
+
+ search_func = substring_okay ? history_search : history_search_prefix;
+ while (1)
+ {
+ local_index = (*search_func) (temp, -1);
+
+ if (local_index < 0)
+ FAIL_SEARCH ();
+
+ if (local_index == 0 || substring_okay)
+ {
+ entry = current_history ();
+ history_offset = history_length;
+
+ /* If this was a substring search, then remember the
+ string that we matched for word substitution. */
+ if (substring_okay)
+ {
+ FREE (search_string);
+ search_string = temp;
+
+ FREE (search_match);
+ search_match = history_find_word (entry->line, local_index);
+ }
+ else
+ free (temp);
+
+ return (entry->line);
+ }
+
+ if (history_offset)
+ history_offset--;
+ else
+ FAIL_SEARCH ();
+ }
+#undef FAIL_SEARCH
+#undef RETURN_ENTRY
+}
+
+/* Function for extracting single-quoted strings. Used for inhibiting
+ history expansion within single quotes. */
+
+/* Extract the contents of STRING as if it is enclosed in single quotes.
+ SINDEX, when passed in, is the offset of the character immediately
+ following the opening single quote; on exit, SINDEX is left pointing
+ to the closing single quote. */
+static void
+hist_string_extract_single_quoted (string, sindex)
+ char *string;
+ int *sindex;
+{
+ register int i;
+
+ for (i = *sindex; string[i] && string[i] != '\''; i++)
+ ;
+
+ *sindex = i;
+}
+
+static char *
+quote_breaks (s)
+ char *s;
+{
+ register char *p, *r;
+ char *ret;
+ int len = 3;
+
+ for (p = s; p && *p; p++, len++)
+ {
+ if (*p == '\'')
+ len += 3;
+ else if (whitespace (*p) || *p == '\n')
+ len += 2;
+ }
+
+ r = ret = xmalloc (len);
+ *r++ = '\'';
+ for (p = s; p && *p; )
+ {
+ if (*p == '\'')
+ {
+ *r++ = '\'';
+ *r++ = '\\';
+ *r++ = '\'';
+ *r++ = '\'';
+ p++;
+ }
+ else if (whitespace (*p) || *p == '\n')
+ {
+ *r++ = '\'';
+ *r++ = *p++;
+ *r++ = '\'';
+ }
+ else
+ *r++ = *p++;
+ }
+ *r++ = '\'';
+ *r = '\0';
+ return ret;
+}
+
+static char *
+hist_error(s, start, current, errtype)
+ char *s;
+ int start, current, errtype;
+{
+ char *temp, *emsg;
+ int ll, elen;
+
+ ll = current - start;
+
+ switch (errtype)
+ {
+ case EVENT_NOT_FOUND:
+ emsg = "event not found";
+ elen = 15;
+ break;
+ case BAD_WORD_SPEC:
+ emsg = "bad word specifier";
+ elen = 18;
+ break;
+ case SUBST_FAILED:
+ emsg = "substitution failed";
+ elen = 19;
+ break;
+ case BAD_MODIFIER:
+ emsg = "unrecognized history modifier";
+ elen = 29;
+ break;
+ default:
+ emsg = "unknown expansion error";
+ elen = 23;
+ break;
+ }
+
+ temp = xmalloc (ll + elen + 3);
+ strncpy (temp, s + start, ll);
+ temp[ll] = ':';
+ temp[ll + 1] = ' ';
+ strcpy (temp + ll + 2, emsg);
+ return (temp);
+}
+
+/* Get a history substitution string from STR starting at *IPTR
+ and return it. The length is returned in LENPTR.
+
+ A backslash can quote the delimiter. If the string is the
+ empty string, the previous pattern is used. If there is
+ no previous pattern for the lhs, the last history search
+ string is used.
+
+ If IS_RHS is 1, we ignore empty strings and set the pattern
+ to "" anyway. subst_lhs is not changed if the lhs is empty;
+ subst_rhs is allowed to be set to the empty string. */
+
+static char *
+get_subst_pattern (str, iptr, delimiter, is_rhs, lenptr)
+ char *str;
+ int *iptr, delimiter, is_rhs, *lenptr;
+{
+ register int si, i, j, k;
+ char *s = (char *) NULL;
+
+ i = *iptr;
+
+ for (si = i; str[si] && str[si] != delimiter; si++)
+ if (str[si] == '\\' && str[si + 1] == delimiter)
+ si++;
+
+ if (si > i || is_rhs)
+ {
+ s = xmalloc (si - i + 1);
+ for (j = 0, k = i; k < si; j++, k++)
+ {
+ /* Remove a backslash quoting the search string delimiter. */
+ if (str[k] == '\\' && str[k + 1] == delimiter)
+ k++;
+ s[j] = str[k];
+ }
+ s[j] = '\0';
+ if (lenptr)
+ *lenptr = j;
+ }
+
+ i = si;
+ if (str[i])
+ i++;
+ *iptr = i;
+
+ return s;
+}
+
+static void
+postproc_subst_rhs ()
+{
+ char *new;
+ int i, j, new_size;
+
+ new = xmalloc (new_size = subst_rhs_len + subst_lhs_len);
+ for (i = j = 0; i < subst_rhs_len; i++)
+ {
+ if (subst_rhs[i] == '&')
+ {
+ if (j + subst_lhs_len >= new_size)
+ new = xrealloc (new, (new_size = new_size * 2 + subst_lhs_len));
+ strcpy (new + j, subst_lhs);
+ j += subst_lhs_len;
+ }
+ else
+ {
+ /* a single backslash protects the `&' from lhs interpolation */
+ if (subst_rhs[i] == '\\' && subst_rhs[i + 1] == '&')
+ i++;
+ if (j >= new_size)
+ new = xrealloc (new, new_size *= 2);
+ new[j++] = subst_rhs[i];
+ }
+ }
+ new[j] = '\0';
+ free (subst_rhs);
+ subst_rhs = new;
+ subst_rhs_len = j;
+}
+
+/* Expand the bulk of a history specifier starting at STRING[START].
+ Returns 0 if everything is OK, -1 if an error occurred, and 1
+ if the `p' modifier was supplied and the caller should just print
+ the returned string. Returns the new index into string in
+ *END_INDEX_PTR, and the expanded specifier in *RET_STRING. */
+static int
+history_expand_internal (string, start, end_index_ptr, ret_string, current_line)
+ char *string;
+ int start, *end_index_ptr;
+ char **ret_string;
+ char *current_line; /* for !# */
+{
+ int i, n, starting_index;
+ int substitute_globally, want_quotes, print_only;
+ char *event, *temp, *result, *tstr, *t, c, *word_spec;
+ int result_len;
+
+ result = xmalloc (result_len = 128);
+
+ i = start;
+
+ /* If it is followed by something that starts a word specifier,
+ then !! is implied as the event specifier. */
+
+ if (member (string[i + 1], ":$*%^"))
+ {
+ char fake_s[3];
+ int fake_i = 0;
+ i++;
+ fake_s[0] = fake_s[1] = history_expansion_char;
+ fake_s[2] = '\0';
+ event = get_history_event (fake_s, &fake_i, 0);
+ }
+ else if (string[i + 1] == '#')
+ {
+ i += 2;
+ event = current_line;
+ }
+ else
+ {
+ int quoted_search_delimiter = 0;
+
+ /* If the character before this `!' is a double or single
+ quote, then this expansion takes place inside of the
+ quoted string. If we have to search for some text ("!foo"),
+ allow the delimiter to end the search string. */
+ if (i && (string[i - 1] == '\'' || string[i - 1] == '"'))
+ quoted_search_delimiter = string[i - 1];
+ event = get_history_event (string, &i, quoted_search_delimiter);
+ }
+
+ if (event == 0)
+ {
+ *ret_string = hist_error (string, start, i, EVENT_NOT_FOUND);
+ free (result);
+ return (-1);
+ }
+
+ /* If a word specifier is found, then do what that requires. */
+ starting_index = i;
+ word_spec = get_history_word_specifier (string, event, &i);
+
+ /* There is no such thing as a `malformed word specifier'. However,
+ it is possible for a specifier that has no match. In that case,
+ we complain. */
+ if (word_spec == (char *)&error_pointer)
+ {
+ *ret_string = hist_error (string, starting_index, i, BAD_WORD_SPEC);
+ free (result);
+ return (-1);
+ }
+
+ /* If no word specifier, than the thing of interest was the event. */
+ temp = word_spec ? savestring (word_spec) : savestring (event);
+ FREE (word_spec);
+
+ /* Perhaps there are other modifiers involved. Do what they say. */
+ want_quotes = substitute_globally = print_only = 0;
+ starting_index = i;
+
+ while (string[i] == ':')
+ {
+ c = string[i + 1];
+
+ if (c == 'g')
+ {
+ substitute_globally = 1;
+ i++;
+ c = string[i + 1];
+ }
+
+ switch (c)
+ {
+ default:
+ *ret_string = hist_error (string, i+1, i+2, BAD_MODIFIER);
+ free (result);
+ free (temp);
+ return -1;
+
+ case 'q':
+ want_quotes = 'q';
+ break;
+
+ case 'x':
+ want_quotes = 'x';
+ break;
+
+ /* :p means make this the last executed line. So we
+ return an error state after adding this line to the
+ history. */
+ case 'p':
+ print_only++;
+ break;
+
+ /* :t discards all but the last part of the pathname. */
+ case 't':
+ tstr = strrchr (temp, '/');
+ if (tstr)
+ {
+ tstr++;
+ t = savestring (tstr);
+ free (temp);
+ temp = t;
+ }
+ break;
+
+ /* :h discards the last part of a pathname. */
+ case 'h':
+ tstr = strrchr (temp, '/');
+ if (tstr)
+ *tstr = '\0';
+ break;
+
+ /* :r discards the suffix. */
+ case 'r':
+ tstr = strrchr (temp, '.');
+ if (tstr)
+ *tstr = '\0';
+ break;
+
+ /* :e discards everything but the suffix. */
+ case 'e':
+ tstr = strrchr (temp, '.');
+ if (tstr)
+ {
+ t = savestring (tstr);
+ free (temp);
+ temp = t;
+ }
+ break;
+
+ /* :s/this/that substitutes `that' for the first
+ occurrence of `this'. :gs/this/that substitutes `that'
+ for each occurrence of `this'. :& repeats the last
+ substitution. :g& repeats the last substitution
+ globally. */
+
+ case '&':
+ case 's':
+ {
+ char *new_event, *t;
+ int delimiter, failed, si, l_temp;
+
+ if (c == 's')
+ {
+ if (i + 2 < (int)strlen (string))
+ delimiter = string[i + 2];
+ else
+ break; /* no search delimiter */
+
+ i += 3;
+
+ t = get_subst_pattern (string, &i, delimiter, 0, &subst_lhs_len);
+ /* An empty substitution lhs with no previous substitution
+ uses the last search string as the lhs. */
+ if (t)
+ {
+ FREE (subst_lhs);
+ subst_lhs = t;
+ }
+ else if (!subst_lhs)
+ {
+ if (search_string && *search_string)
+ {
+ subst_lhs = savestring (search_string);
+ subst_lhs_len = strlen (subst_lhs);
+ }
+ else
+ {
+ subst_lhs = (char *) NULL;
+ subst_lhs_len = 0;
+ }
+ }
+
+ /* If there is no lhs, the substitution can't succeed. */
+ if (subst_lhs_len == 0)
+ {
+ *ret_string = hist_error (string, starting_index, i, SUBST_FAILED);
+ free (result);
+ free (temp);
+ return -1;
+ }
+
+ FREE (subst_rhs);
+ subst_rhs = get_subst_pattern (string, &i, delimiter, 1, &subst_rhs_len);
+
+ /* If `&' appears in the rhs, it's supposed to be replaced
+ with the lhs. */
+ if (member ('&', subst_rhs))
+ postproc_subst_rhs ();
+ }
+ else
+ i += 2;
+
+ l_temp = strlen (temp);
+ /* Ignore impossible cases. */
+ if (subst_lhs_len > l_temp)
+ {
+ *ret_string = hist_error (string, starting_index, i, SUBST_FAILED);
+ free (result);
+ free (temp);
+ return (-1);
+ }
+
+ /* Find the first occurrence of THIS in TEMP. */
+ si = 0;
+ for (failed = 1; (si + subst_lhs_len) <= l_temp; si++)
+ if (STREQN (temp+si, subst_lhs, subst_lhs_len))
+ {
+ int len = subst_rhs_len - subst_lhs_len + l_temp;
+ new_event = xmalloc (1 + len);
+ strncpy (new_event, temp, si);
+ strncpy (new_event + si, subst_rhs, subst_rhs_len);
+ strncpy (new_event + si + subst_rhs_len,
+ temp + si + subst_lhs_len,
+ l_temp - (si + subst_lhs_len));
+ new_event[len] = '\0';
+ free (temp);
+ temp = new_event;
+
+ failed = 0;
+
+ if (substitute_globally)
+ {
+ si += subst_rhs_len;
+ l_temp = strlen (temp);
+ substitute_globally++;
+ continue;
+ }
+ else
+ break;
+ }
+
+ if (substitute_globally > 1)
+ {
+ substitute_globally = 0;
+ continue; /* don't want to increment i */
+ }
+
+ if (failed == 0)
+ continue; /* don't want to increment i */
+
+ *ret_string = hist_error (string, starting_index, i, SUBST_FAILED);
+ free (result);
+ free (temp);
+ return (-1);
+ }
+ }
+ i += 2;
+ }
+ /* Done with modfiers. */
+ /* Believe it or not, we have to back the pointer up by one. */
+ --i;
+
+ if (want_quotes)
+ {
+ char *x;
+
+ if (want_quotes == 'q')
+ x = single_quote (temp);
+ else if (want_quotes == 'x')
+ x = quote_breaks (temp);
+ else
+ x = savestring (temp);
+
+ free (temp);
+ temp = x;
+ }
+
+ n = strlen (temp);
+ if (n >= result_len)
+ result = xrealloc (result, n + 2);
+ strcpy (result, temp);
+ free (temp);
+
+ *end_index_ptr = i;
+ *ret_string = result;
+ return (print_only);
+}
+
+/* Expand the string STRING, placing the result into OUTPUT, a pointer
+ to a string. Returns:
+
+ -1) If there was an error in expansion.
+ 0) If no expansions took place (or, if the only change in
+ the text was the de-slashifying of the history expansion
+ character)
+ 1) If expansions did take place
+ 2) If the `p' modifier was given and the caller should print the result
+
+ If an error ocurred in expansion, then OUTPUT contains a descriptive
+ error message. */
+
+#define ADD_STRING(s) \
+ do \
+ { \
+ int sl = strlen (s); \
+ j += sl; \
+ if (j >= result_len) \
+ { \
+ while (j >= result_len) \
+ result_len += 128; \
+ result = xrealloc (result, result_len); \
+ } \
+ strcpy (result + j - sl, s); \
+ } \
+ while (0)
+
+#define ADD_CHAR(c) \
+ do \
+ { \
+ if (j >= result_len - 1) \
+ result = xrealloc (result, result_len += 64); \
+ result[j++] = c; \
+ result[j] = '\0'; \
+ } \
+ while (0)
+
+int
+history_expand (hstring, output)
+ char *hstring;
+ char **output;
+{
+ register int j;
+ int i, r, l, passc, cc, modified, eindex, only_printing;
+ char *string;
+
+ /* The output string, and its length. */
+ int result_len;
+ char *result;
+
+ /* Used when adding the string. */
+ char *temp;
+
+ /* Setting the history expansion character to 0 inhibits all
+ history expansion. */
+ if (history_expansion_char == 0)
+ {
+ *output = savestring (hstring);
+ return (0);
+ }
+
+ /* Prepare the buffer for printing error messages. */
+ result = xmalloc (result_len = 256);
+ result[0] = '\0';
+
+ only_printing = modified = 0;
+ l = strlen (hstring);
+
+ /* Grovel the string. Only backslash can quote the history escape
+ character. We also handle arg specifiers. */
+
+ /* Before we grovel forever, see if the history_expansion_char appears
+ anywhere within the text. */
+
+ /* The quick substitution character is a history expansion all right. That
+ is to say, "^this^that^" is equivalent to "!!:s^this^that^", and in fact,
+ that is the substitution that we do. */
+ if (hstring[0] == history_subst_char)
+ {
+ string = xmalloc (l + 5);
+
+ string[0] = string[1] = history_expansion_char;
+ string[2] = ':';
+ string[3] = 's';
+ strcpy (string + 4, hstring);
+ l += 4;
+ }
+ else
+ {
+ string = hstring;
+ /* If not quick substitution, still maybe have to do expansion. */
+
+ /* `!' followed by one of the characters in history_no_expand_chars
+ is NOT an expansion. */
+ for (i = 0; string[i]; i++)
+ {
+ cc = string[i + 1];
+ if (string[i] == history_expansion_char)
+ {
+ if (!cc || member (cc, history_no_expand_chars))
+ continue;
+ /* If the calling application has set
+ history_inhibit_expansion_function to a function that checks
+ for special cases that should not be history expanded,
+ call the function and skip the expansion if it returns a
+ non-zero value. */
+ else if (history_inhibit_expansion_function &&
+ (*history_inhibit_expansion_function) (string, i))
+ continue;
+ else
+ break;
+ }
+ else if (history_quotes_inhibit_expansion && string[i] == '\'')
+ {
+ /* If this is bash, single quotes inhibit history expansion. */
+ i++;
+ hist_string_extract_single_quoted (string, &i);
+ }
+ else if (history_quotes_inhibit_expansion && string[i] == '\\')
+ {
+ /* If this is bash, allow backslashes to quote single
+ quotes and the history expansion character. */
+ if (cc == '\'' || cc == history_expansion_char)
+ i++;
+ }
+ }
+
+ if (string[i] != history_expansion_char)
+ {
+ free (result);
+ *output = savestring (string);
+ return (0);
+ }
+ }
+
+ /* Extract and perform the substitution. */
+ for (passc = i = j = 0; i < l; i++)
+ {
+ int tchar = string[i];
+
+ if (passc)
+ {
+ passc = 0;
+ ADD_CHAR (tchar);
+ continue;
+ }
+
+ if (tchar == history_expansion_char)
+ tchar = -3;
+
+ switch (tchar)
+ {
+ default:
+ ADD_CHAR (string[i]);
+ break;
+
+ case '\\':
+ passc++;
+ ADD_CHAR (tchar);
+ break;
+
+ case '\'':
+ {
+ /* If history_quotes_inhibit_expansion is set, single quotes
+ inhibit history expansion. */
+ if (history_quotes_inhibit_expansion)
+ {
+ int quote, slen;
+
+ quote = i++;
+ hist_string_extract_single_quoted (string, &i);
+
+ slen = i - quote + 2;
+ temp = xmalloc (slen);
+ strncpy (temp, string + quote, slen);
+ temp[slen - 1] = '\0';
+ ADD_STRING (temp);
+ free (temp);
+ }
+ else
+ ADD_CHAR (string[i]);
+ break;
+ }
+
+ case -3: /* history_expansion_char */
+ cc = string[i + 1];
+
+ /* If the history_expansion_char is followed by one of the
+ characters in history_no_expand_chars, then it is not a
+ candidate for expansion of any kind. */
+ if (member (cc, history_no_expand_chars))
+ {
+ ADD_CHAR (string[i]);
+ break;
+ }
+
+#if defined (NO_BANG_HASH_MODIFIERS)
+ /* There is something that is listed as a `word specifier' in csh
+ documentation which means `the expanded text to this point'.
+ That is not a word specifier, it is an event specifier. If we
+ don't want to allow modifiers with `!#', just stick the current
+ output line in again. */
+ if (cc == '#')
+ {
+ if (result)
+ {
+ temp = xmalloc (1 + strlen (result));
+ strcpy (temp, result);
+ ADD_STRING (temp);
+ free (temp);
+ }
+ i++;
+ break;
+ }
+#endif
+
+ r = history_expand_internal (string, i, &eindex, &temp, result);
+ if (r < 0)
+ {
+ *output = temp;
+ free (result);
+ if (string != hstring)
+ free (string);
+ return -1;
+ }
+ else
+ {
+ if (temp)
+ {
+ modified++;
+ if (*temp)
+ ADD_STRING (temp);
+ free (temp);
+ }
+ only_printing = r == 1;
+ i = eindex;
+ }
+ break;
+ }
+ }
+
+ *output = result;
+ if (string != hstring)
+ free (string);
+
+ if (only_printing)
+ {
+ add_history (result);
+ return (2);
+ }
+
+ return (modified != 0);
+}
+
+/* Return a consed string which is the word specified in SPEC, and found
+ in FROM. NULL is returned if there is no spec. The address of
+ ERROR_POINTER is returned if the word specified cannot be found.
+ CALLER_INDEX is the offset in SPEC to start looking; it is updated
+ to point to just after the last character parsed. */
+static char *
+get_history_word_specifier (spec, from, caller_index)
+ char *spec, *from;
+ int *caller_index;
+{
+ register int i = *caller_index;
+ int first, last;
+ int expecting_word_spec = 0;
+ char *result;
+
+ /* The range of words to return doesn't exist yet. */
+ first = last = 0;
+ result = (char *)NULL;
+
+ /* If we found a colon, then this *must* be a word specification. If
+ it isn't, then it is an error. */
+ if (spec[i] == ':')
+ {
+ i++;
+ expecting_word_spec++;
+ }
+
+ /* Handle special cases first. */
+
+ /* `%' is the word last searched for. */
+ if (spec[i] == '%')
+ {
+ *caller_index = i + 1;
+ return (search_match ? savestring (search_match) : savestring (""));
+ }
+
+ /* `*' matches all of the arguments, but not the command. */
+ if (spec[i] == '*')
+ {
+ *caller_index = i + 1;
+ result = history_arg_extract (1, '$', from);
+ return (result ? result : savestring (""));
+ }
+
+ /* `$' is last arg. */
+ if (spec[i] == '$')
+ {
+ *caller_index = i + 1;
+ return (history_arg_extract ('$', '$', from));
+ }
+
+ /* Try to get FIRST and LAST figured out. */
+
+ if (spec[i] == '-')
+ first = 0;
+ else if (spec[i] == '^')
+ first = 1;
+ else if (_rl_digit_p (spec[i]) && expecting_word_spec)
+ {
+ for (first = 0; _rl_digit_p (spec[i]); i++)
+ first = (first * 10) + _rl_digit_value (spec[i]);
+ }
+ else
+ return ((char *)NULL); /* no valid `first' for word specifier */
+
+ if (spec[i] == '^' || spec[i] == '*')
+ {
+ last = (spec[i] == '^') ? 1 : '$'; /* x* abbreviates x-$ */
+ i++;
+ }
+ else if (spec[i] != '-')
+ last = first;
+ else
+ {
+ i++;
+
+ if (_rl_digit_p (spec[i]))
+ {
+ for (last = 0; _rl_digit_p (spec[i]); i++)
+ last = (last * 10) + _rl_digit_value (spec[i]);
+ }
+ else if (spec[i] == '$')
+ {
+ i++;
+ last = '$';
+ }
+ else if (!spec[i] || spec[i] == ':') /* could be modifier separator */
+ last = -1; /* x- abbreviates x-$ omitting word `$' */
+ }
+
+ *caller_index = i;
+
+ if (last >= first || last == '$' || last < 0)
+ result = history_arg_extract (first, last, from);
+
+ return (result ? result : (char *)&error_pointer);
+}
+
+/* Extract the args specified, starting at FIRST, and ending at LAST.
+ The args are taken from STRING. If either FIRST or LAST is < 0,
+ then make that arg count from the right (subtract from the number of
+ tokens, so that FIRST = -1 means the next to last token on the line).
+ If LAST is `$' the last arg from STRING is used. */
+char *
+history_arg_extract (first, last, string)
+ int first, last;
+ char *string;
+{
+ register int i, len;
+ char *result;
+ int size, offset;
+ char **list;
+
+ /* XXX - think about making history_tokenize return a struct array,
+ each struct in array being a string and a length to avoid the
+ calls to strlen below. */
+ if ((list = history_tokenize (string)) == NULL)
+ return ((char *)NULL);
+
+ for (len = 0; list[len]; len++)
+ ;
+
+ if (last < 0)
+ last = len + last - 1;
+
+ if (first < 0)
+ first = len + first - 1;
+
+ if (last == '$')
+ last = len - 1;
+
+ if (first == '$')
+ first = len - 1;
+
+ last++;
+
+ if (first >= len || last > len || first < 0 || last < 0 || first > last)
+ result = ((char *)NULL);
+ else
+ {
+ for (size = 0, i = first; i < last; i++)
+ size += strlen (list[i]) + 1;
+ result = xmalloc (size + 1);
+ result[0] = '\0';
+
+ for (i = first, offset = 0; i < last; i++)
+ {
+ strcpy (result + offset, list[i]);
+ offset += strlen (list[i]);
+ if (i + 1 < last)
+ {
+ result[offset++] = ' ';
+ result[offset] = 0;
+ }
+ }
+ }
+
+ for (i = 0; i < len; i++)
+ free (list[i]);
+ free (list);
+
+ return (result);
+}
+
+#define slashify_in_quotes "\\`\"$"
+
+/* Parse STRING into tokens and return an array of strings. If WIND is
+ not -1 and INDP is not null, we also want the word surrounding index
+ WIND. The position in the returned array of strings is returned in
+ *INDP. */
+static char **
+history_tokenize_internal (string, wind, indp)
+ char *string;
+ int wind, *indp;
+{
+ char **result;
+ register int i, start, result_index, size;
+ int len, delimiter;
+
+ /* Get a token, and stuff it into RESULT. The tokens are split
+ exactly where the shell would split them. */
+ for (i = result_index = size = 0, result = (char **)NULL; string[i]; )
+ {
+ delimiter = 0;
+
+ /* Skip leading whitespace. */
+ for (; string[i] && whitespace (string[i]); i++)
+ ;
+ if (string[i] == 0 || string[i] == history_comment_char)
+ return (result);
+
+ start = i;
+
+ if (member (string[i], "()\n"))
+ {
+ i++;
+ goto got_token;
+ }
+
+ if (member (string[i], "<>;&|$"))
+ {
+ int peek = string[i + 1];
+
+ if (peek == string[i] && peek != '$')
+ {
+ if (peek == '<' && string[i + 2] == '-')
+ i++;
+ i += 2;
+ goto got_token;
+ }
+ else
+ {
+ if ((peek == '&' && (string[i] == '>' || string[i] == '<')) ||
+ ((peek == '>') && (string[i] == '&')) ||
+ ((peek == '(') && (string[i] == '$')))
+ {
+ i += 2;
+ goto got_token;
+ }
+ }
+ if (string[i] != '$')
+ {
+ i++;
+ goto got_token;
+ }
+ }
+
+ /* Get word from string + i; */
+
+ if (member (string[i], "\"'`"))
+ delimiter = string[i++];
+
+ for (; string[i]; i++)
+ {
+ if (string[i] == '\\' && string[i + 1] == '\n')
+ {
+ i++;
+ continue;
+ }
+
+ if (string[i] == '\\' && delimiter != '\'' &&
+ (delimiter != '"' || member (string[i], slashify_in_quotes)))
+ {
+ i++;
+ continue;
+ }
+
+ if (delimiter && string[i] == delimiter)
+ {
+ delimiter = 0;
+ continue;
+ }
+
+ if (!delimiter && (member (string[i], " \t\n;&()|<>")))
+ break;
+
+ if (!delimiter && member (string[i], "\"'`"))
+ delimiter = string[i];
+ }
+
+ got_token:
+
+ /* If we are looking for the word in which the character at a
+ particular index falls, remember it. */
+ if (indp && wind != -1 && wind >= start && wind < i)
+ *indp = result_index;
+
+ len = i - start;
+ if (result_index + 2 >= size)
+ result = (char **)xrealloc (result, ((size += 10) * sizeof (char *)));
+ result[result_index] = xmalloc (1 + len);
+ strncpy (result[result_index], string + start, len);
+ result[result_index][len] = '\0';
+ result[++result_index] = (char *)NULL;
+ }
+
+ return (result);
+}
+
+/* Return an array of tokens, much as the shell might. The tokens are
+ parsed out of STRING. */
+char **
+history_tokenize (string)
+ char *string;
+{
+ return (history_tokenize_internal (string, -1, (int *)NULL));
+}
+
+/* Find and return the word which contains the character at index IND
+ in the history line LINE. Used to save the word matched by the
+ last history !?string? search. */
+static char *
+history_find_word (line, ind)
+ char *line;
+ int ind;
+{
+ char **words, *s;
+ int i, wind;
+
+ words = history_tokenize_internal (line, ind, &wind);
+ if (wind == -1)
+ return ((char *)NULL);
+ s = words[wind];
+ for (i = 0; i < wind; i++)
+ free (words[i]);
+ for (i = wind + 1; words[i]; i++)
+ free (words[i]);
+ free (words);
+ return s;
+}
diff --git a/histfile.c b/histfile.c
new file mode 100644
index 0000000..c3de134
--- /dev/null
+++ b/histfile.c
@@ -0,0 +1,339 @@
+/* histfile.c - functions to manipulate the history file. */
+
+/* Copyright (C) 1989, 1992 Free Software Foundation, Inc.
+
+ This file contains the GNU History Library (the Library), a set of
+ routines for managing the text of previously typed lines.
+
+ The Library 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.
+
+ The Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* The goal is to make the implementation transparent, so that you
+ don't have to know what data types are used, just what functions
+ you can call. I think I have done that. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#include <sys/types.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#if defined (__EMX__)
+# ifndef O_BINARY
+# define O_BINARY 0
+# endif
+#else /* !__EMX__ */
+ /* If we're not compiling for __EMX__, we don't want this at all. Ever. */
+# undef O_BINARY
+# define O_BINARY 0
+#endif /* !__EMX__ */
+
+#include <errno.h>
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+#include "history.h"
+#include "histlib.h"
+
+/* Functions imported from shell.c */
+extern char *get_env_value ();
+
+extern char *xmalloc (), *xrealloc ();
+
+/* Return the string that should be used in the place of this
+ filename. This only matters when you don't specify the
+ filename to read_history (), or write_history (). */
+static char *
+history_filename (filename)
+ char *filename;
+{
+ char *return_val, *home;
+ int home_len;
+
+ return_val = filename ? savestring (filename) : (char *)NULL;
+
+ if (return_val)
+ return (return_val);
+
+ home = get_env_value ("HOME");
+
+ if (home == 0)
+ {
+ home = ".";
+ home_len = 1;
+ }
+ else
+ home_len = strlen (home);
+
+ return_val = xmalloc (2 + home_len + 8); /* strlen(".history") == 8 */
+ strcpy (return_val, home);
+ return_val[home_len] = '/';
+ strcpy (return_val + home_len + 1, ".history");
+
+ return (return_val);
+}
+
+/* Add the contents of FILENAME to the history list, a line at a time.
+ If FILENAME is NULL, then read from ~/.history. Returns 0 if
+ successful, or errno if not. */
+int
+read_history (filename)
+ char *filename;
+{
+ return (read_history_range (filename, 0, -1));
+}
+
+/* Read a range of lines from FILENAME, adding them to the history list.
+ Start reading at the FROM'th line and end at the TO'th. If FROM
+ is zero, start at the beginning. If TO is less than FROM, read
+ until the end of the file. If FILENAME is NULL, then read from
+ ~/.history. Returns 0 if successful, or errno if not. */
+int
+read_history_range (filename, from, to)
+ char *filename;
+ int from, to;
+{
+ register int line_start, line_end;
+ char *input, *buffer = (char *)NULL;
+ int file, current_line;
+ struct stat finfo;
+
+ input = history_filename (filename);
+ file = open (input, O_RDONLY|O_BINARY, 0666);
+
+ if ((file < 0) || (fstat (file, &finfo) == -1))
+ goto error_and_exit;
+
+ buffer = xmalloc ((int)finfo.st_size + 1);
+
+ if (read (file, buffer, finfo.st_size) != finfo.st_size)
+ {
+ error_and_exit:
+ if (file >= 0)
+ close (file);
+
+ FREE (input);
+ FREE (buffer);
+
+ return (errno);
+ }
+
+ close (file);
+
+ /* Set TO to larger than end of file if negative. */
+ if (to < 0)
+ to = finfo.st_size;
+
+ /* Start at beginning of file, work to end. */
+ line_start = line_end = current_line = 0;
+
+ /* Skip lines until we are at FROM. */
+ while (line_start < finfo.st_size && current_line < from)
+ {
+ for (line_end = line_start; line_end < finfo.st_size; line_end++)
+ if (buffer[line_end] == '\n')
+ {
+ current_line++;
+ line_start = line_end + 1;
+ if (current_line == from)
+ break;
+ }
+ }
+
+ /* If there are lines left to gobble, then gobble them now. */
+ for (line_end = line_start; line_end < finfo.st_size; line_end++)
+ if (buffer[line_end] == '\n')
+ {
+ buffer[line_end] = '\0';
+
+ if (buffer[line_start])
+ add_history (buffer + line_start);
+
+ current_line++;
+
+ if (current_line >= to)
+ break;
+
+ line_start = line_end + 1;
+ }
+
+ FREE (input);
+ FREE (buffer);
+
+ return (0);
+}
+
+/* Truncate the history file FNAME, leaving only LINES trailing lines.
+ If FNAME is NULL, then use ~/.history. */
+int
+history_truncate_file (fname, lines)
+ char *fname;
+ register int lines;
+{
+ register int i;
+ int file, chars_read;
+ char *buffer, *filename;
+ struct stat finfo;
+
+ buffer = (char *)NULL;
+ filename = history_filename (fname);
+ file = open (filename, O_RDONLY|O_BINARY, 0666);
+
+ if (file == -1 || fstat (file, &finfo) == -1)
+ goto truncate_exit;
+
+ buffer = xmalloc ((int)finfo.st_size + 1);
+ chars_read = read (file, buffer, finfo.st_size);
+ close (file);
+
+ if (chars_read <= 0)
+ goto truncate_exit;
+
+ /* Count backwards from the end of buffer until we have passed
+ LINES lines. */
+ for (i = chars_read - 1; lines && i; i--)
+ {
+ if (buffer[i] == '\n')
+ lines--;
+ }
+
+ /* If this is the first line, then the file contains exactly the
+ number of lines we want to truncate to, so we don't need to do
+ anything. It's the first line if we don't find a newline between
+ the current value of i and 0. Otherwise, write from the start of
+ this line until the end of the buffer. */
+ for ( ; i; i--)
+ if (buffer[i] == '\n')
+ {
+ i++;
+ break;
+ }
+
+ /* Write only if there are more lines in the file than we want to
+ truncate to. */
+ if (i && ((file = open (filename, O_WRONLY|O_TRUNC|O_BINARY, 0666)) != -1))
+ {
+ write (file, buffer + i, finfo.st_size - i);
+ close (file);
+ }
+
+ truncate_exit:
+
+ FREE (buffer);
+
+ free (filename);
+ return 0;
+}
+
+/* Workhorse function for writing history. Writes NELEMENT entries
+ from the history list to FILENAME. OVERWRITE is non-zero if you
+ wish to replace FILENAME with the entries. */
+static int
+history_do_write (filename, nelements, overwrite)
+ char *filename;
+ int nelements, overwrite;
+{
+ register int i;
+ char *output;
+ int file, mode;
+
+ mode = overwrite ? O_WRONLY|O_CREAT|O_TRUNC|O_BINARY : O_WRONLY|O_APPEND|O_BINARY;
+ output = history_filename (filename);
+
+ if ((file = open (output, mode, 0666)) == -1)
+ {
+ FREE (output);
+ return (errno);
+ }
+
+ if (nelements > history_length)
+ nelements = history_length;
+
+ /* Build a buffer of all the lines to write, and write them in one syscall.
+ Suggested by Peter Ho (peter@robosts.oxford.ac.uk). */
+ {
+ HIST_ENTRY **the_history; /* local */
+ register int j;
+ int buffer_size;
+ char *buffer;
+
+ the_history = history_list ();
+ /* Calculate the total number of bytes to write. */
+ for (buffer_size = 0, i = history_length - nelements; i < history_length; i++)
+ buffer_size += 1 + strlen (the_history[i]->line);
+
+ /* Allocate the buffer, and fill it. */
+ buffer = xmalloc (buffer_size);
+
+ for (j = 0, i = history_length - nelements; i < history_length; i++)
+ {
+ strcpy (buffer + j, the_history[i]->line);
+ j += strlen (the_history[i]->line);
+ buffer[j++] = '\n';
+ }
+
+ write (file, buffer, buffer_size);
+ free (buffer);
+ }
+
+ close (file);
+
+ FREE (output);
+
+ return (0);
+}
+
+/* Append NELEMENT entries to FILENAME. The entries appended are from
+ the end of the list minus NELEMENTs up to the end of the list. */
+int
+append_history (nelements, filename)
+ int nelements;
+ char *filename;
+{
+ return (history_do_write (filename, nelements, HISTORY_APPEND));
+}
+
+/* Overwrite FILENAME with the current history. If FILENAME is NULL,
+ then write the history list to ~/.history. Values returned
+ are as in read_history ().*/
+int
+write_history (filename)
+ char *filename;
+{
+ return (history_do_write (filename, history_length, HISTORY_OVERWRITE));
+}
diff --git a/histlib.h b/histlib.h
new file mode 100644
index 0000000..10a40d7
--- /dev/null
+++ b/histlib.h
@@ -0,0 +1,81 @@
+/* histlib.h -- internal definitions for the history library. */
+/* Copyright (C) 1989, 1992 Free Software Foundation, Inc.
+
+ This file contains the GNU History Library (the Library), a set of
+ routines for managing the text of previously typed lines.
+
+ The Library 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.
+
+ The Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#if !defined (_HISTLIB_H_)
+#define _HISTLIB_H_
+
+/* Function pointers can be declared as (Function *)foo. */
+#if !defined (_FUNCTION_DEF)
+# define _FUNCTION_DEF
+typedef int Function ();
+typedef void VFunction ();
+typedef char *CPFunction ();
+typedef char **CPPFunction ();
+#endif /* _FUNCTION_DEF */
+
+#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0))
+#define STREQN(a, b, n) (((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0))
+
+#ifndef savestring
+# ifndef strcpy
+extern char *strcpy ();
+# endif
+#define savestring(x) strcpy (xmalloc (1 + strlen (x)), (x))
+#endif
+
+#ifndef whitespace
+#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
+#endif
+
+#ifndef _rl_digit_p
+#define _rl_digit_p(c) ((c) >= '0' && (c) <= '9')
+#endif
+
+#ifndef _rl_digit_value
+#define _rl_digit_value(c) ((c) - '0')
+#endif
+
+#ifndef member
+# ifndef strchr
+extern char *strchr ();
+# endif
+#define member(c, s) ((c) ? ((char *)strchr ((s), (c)) != (char *)NULL) : 0)
+#endif
+
+#ifndef FREE
+# define FREE(x) if (x) free (x)
+#endif
+
+/* Possible history errors passed to hist_error. */
+#define EVENT_NOT_FOUND 0
+#define BAD_WORD_SPEC 1
+#define SUBST_FAILED 2
+#define BAD_MODIFIER 3
+
+/* Possible definitions for history starting point specification. */
+#define ANCHORED_SEARCH 1
+#define NON_ANCHORED_SEARCH 0
+
+/* Possible definitions for what style of writing the history file we want. */
+#define HISTORY_APPEND 0
+#define HISTORY_OVERWRITE 1
+
+#endif /* !_HISTLIB_H_ */
diff --git a/history.c b/history.c
index 68e99cf..fb9d68e 100644
--- a/history.c
+++ b/history.c
@@ -26,90 +26,34 @@
#define READLINE_LIBRARY
#if defined (HAVE_CONFIG_H)
-# include "config.h"
+# include <config.h>
#endif
#include <stdio.h>
-#include <sys/types.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-#include <fcntl.h>
+
#if defined (HAVE_STDLIB_H)
# include <stdlib.h>
#else
# include "ansi_stdlib.h"
#endif /* HAVE_STDLIB_H */
+
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
#endif
+
#if defined (HAVE_STRING_H)
# include <string.h>
#else
# include <strings.h>
#endif /* !HAVE_STRING_H */
-#include <errno.h>
-/* Not all systems declare ERRNO in errno.h... and some systems #define it! */
-#if !defined (errno)
-extern int errno;
-#endif /* !errno */
-
-#include "memalloc.h"
#include "history.h"
+#include "histlib.h"
-#if defined (STATIC_MALLOC)
-static char *xmalloc (), *xrealloc ();
-#else
extern char *xmalloc (), *xrealloc ();
-#endif /* STATIC_MALLOC */
-
-#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0))
-#define STREQN(a, b, n) (((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0))
-#ifndef savestring
-# ifndef strcpy
-extern char *strcpy ();
-# endif
-#define savestring(x) strcpy (xmalloc (1 + strlen (x)), (x))
-#endif
-
-#ifndef whitespace
-#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
-#endif
-
-#ifndef digit_p
-#define digit_p(c) ((c) >= '0' && (c) <= '9')
-#endif
-
-#ifndef digit_value
-#define digit_value(c) ((c) - '0')
-#endif
-
-#ifndef member
-# ifndef strchr
-extern char *strchr ();
-# endif
-#define member(c, s) ((c) ? ((char *)strchr ((s), (c)) != (char *)NULL) : 0)
-#endif
-
-/* Possible history errors passed to hist_error. */
-#define EVENT_NOT_FOUND 0
-#define BAD_WORD_SPEC 1
-#define SUBST_FAILED 2
-#define BAD_MODIFIER 3
-
-static char error_pointer;
-
-static char *subst_lhs;
-static char *subst_rhs;
-static int subst_lhs_len = 0;
-static int subst_rhs_len = 0;
-
-static char *get_history_word_specifier ();
-
-#if defined (SHELL)
-extern char *single_quote ();
-#endif
+/* The number of slots to increase the_history by. */
+#define DEFAULT_HISTORY_GROW_SIZE 50
/* **************************************************************** */
/* */
@@ -122,7 +66,7 @@ static HIST_ENTRY **the_history = (HIST_ENTRY **)NULL;
/* Non-zero means that we have enforced a limit on the amount of
history that we save. */
-static int history_stifled = 0;
+static int history_stifled;
/* If HISTORY_STIFLED is non-zero, then this is the maximum number of
entries to remember. */
@@ -130,34 +74,13 @@ int max_input_history;
/* The current location of the interactive history pointer. Just makes
life easier for outside callers. */
-static int history_offset = 0;
+int history_offset;
-/* The number of strings currently stored in the input_history list. */
-int history_length = 0;
+/* The number of strings currently stored in the history list. */
+int history_length;
/* The current number of slots allocated to the input_history. */
-static int history_size = 0;
-
-/* The number of slots to increase the_history by. */
-#define DEFAULT_HISTORY_GROW_SIZE 50
-
-/* The character that represents the start of a history expansion
- request. This is usually `!'. */
-char history_expansion_char = '!';
-
-/* The character that invokes word substitution if found at the start of
- a line. This is usually `^'. */
-char history_subst_char = '^';
-
-/* During tokenization, if this character is seen as the first character
- of a word, then it, and all subsequent characters upto a newline are
- ignored. For a Bourne shell, this should be '#'. Bash special cases
- the interactive comment character to not be a comment delimiter. */
-char history_comment_char = '\0';
-
-/* The list of characters which inhibit the expansion of text if found
- immediately following history_expansion_char. */
-char *history_no_expand_chars = " \t\n\r=";
+static int history_size;
/* The logical `base' of the history array. It defaults to 1. */
int history_base = 1;
@@ -216,6 +139,77 @@ history_total_bytes ()
return (result);
}
+/* Returns the magic number which says what history element we are
+ looking at now. In this implementation, it returns history_offset. */
+int
+where_history ()
+{
+ return (history_offset);
+}
+
+/* Make the current history item be the one at POS, an absolute index.
+ Returns zero if POS is out of range, else non-zero. */
+int
+history_set_pos (pos)
+ int pos;
+{
+ if (pos > history_length || pos < 0 || !the_history)
+ return (0);
+ history_offset = pos;
+ return (1);
+}
+
+/* Return the current history array. The caller has to be carefull, since this
+ is the actual array of data, and could be bashed or made corrupt easily.
+ The array is terminated with a NULL pointer. */
+HIST_ENTRY **
+history_list ()
+{
+ return (the_history);
+}
+
+/* Return the history entry at the current position, as determined by
+ history_offset. If there is no entry there, return a NULL pointer. */
+HIST_ENTRY *
+current_history ()
+{
+ return ((history_offset == history_length) || the_history == 0)
+ ? (HIST_ENTRY *)NULL
+ : the_history[history_offset];
+}
+
+/* Back up history_offset to the previous history entry, and return
+ a pointer to that entry. If there is no previous entry then return
+ a NULL pointer. */
+HIST_ENTRY *
+previous_history ()
+{
+ return history_offset ? the_history[--history_offset] : (HIST_ENTRY *)NULL;
+}
+
+/* Move history_offset forward to the next history entry, and return
+ a pointer to that entry. If there is no next entry then return a
+ NULL pointer. */
+HIST_ENTRY *
+next_history ()
+{
+ return (history_offset == history_length) ? (HIST_ENTRY *)NULL : the_history[++history_offset];
+}
+
+/* Return the history entry which is logically at OFFSET in the history array.
+ OFFSET is relative to history_base. */
+HIST_ENTRY *
+history_get (offset)
+ int offset;
+{
+ int local_index;
+
+ local_index = offset - history_base;
+ return (local_index >= history_length || local_index < 0 || !the_history)
+ ? (HIST_ENTRY *)NULL
+ : the_history[local_index];
+}
+
/* Place STRING at the end of the history list. The data field
is set to NULL. */
void
@@ -245,16 +239,14 @@ add_history (string)
the_history[i] = the_history[i + 1];
history_base++;
-
}
else
{
- if (!history_size)
+ if (history_size == 0)
{
history_size = DEFAULT_HISTORY_GROW_SIZE;
the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *));
history_length = 1;
-
}
else
{
@@ -300,134 +292,6 @@ replace_history_entry (which, line, data)
return (old_value);
}
-/* Returns the magic number which says what history element we are
- looking at now. In this implementation, it returns history_offset. */
-int
-where_history ()
-{
- return (history_offset);
-}
-
-/* Search the history for STRING, starting at history_offset.
- If DIRECTION < 0, then the search is through previous entries, else
- through subsequent. If ANCHORED is non-zero, the string must
- appear at the beginning of a history line, otherwise, the string
- may appear anywhere in the line. If the string is found, then
- current_history () is the history entry, and the value of this
- function is the offset in the line of that history entry that the
- string was found in. Otherwise, nothing is changed, and a -1 is
- returned. */
-
-#define ANCHORED_SEARCH 1
-#define NON_ANCHORED_SEARCH 0
-
-static int
-history_search_internal (string, direction, anchored)
- char *string;
- int direction, anchored;
-{
- register int i, reverse;
- register char *line;
- register int line_index;
- int string_len;
-
- i = history_offset;
- reverse = (direction < 0);
-
- /* Take care of trivial cases first. */
-
- if (!history_length || ((i == history_length) && !reverse))
- return (-1);
-
- if (reverse && (i == history_length))
- i--;
-
-#define NEXT_LINE() do { if (reverse) i--; else i++; } while (0)
-
- string_len = strlen (string);
- while (1)
- {
- /* Search each line in the history list for STRING. */
-
- /* At limit for direction? */
- if ((reverse && i < 0) || (!reverse && i == history_length))
- return (-1);
-
- line = the_history[i]->line;
- line_index = strlen (line);
-
- /* If STRING is longer than line, no match. */
- if (string_len > line_index)
- {
- NEXT_LINE ();
- continue;
- }
-
- /* Handle anchored searches first. */
- if (anchored == ANCHORED_SEARCH)
- {
- if (STREQN (string, line, string_len))
- {
- history_offset = i;
- return (0);
- }
-
- NEXT_LINE ();
- continue;
- }
-
- /* Do substring search. */
- if (reverse)
- {
- line_index -= string_len;
-
- while (line_index >= 0)
- {
- if (STREQN (string, line + line_index, string_len))
- {
- history_offset = i;
- return (line_index);
- }
- line_index--;
- }
- }
- else
- {
- register int limit = line_index - string_len + 1;
- line_index = 0;
-
- while (line_index < limit)
- {
- if (STREQN (string, line + line_index, string_len))
- {
- history_offset = i;
- return (line_index);
- }
- line_index++;
- }
- }
- NEXT_LINE ();
- }
-}
-
-/* Do a non-anchored search for STRING through the history in DIRECTION. */
-int
-history_search (string, direction)
- char *string;
- int direction;
-{
- return (history_search_internal (string, direction, NON_ANCHORED_SEARCH));
-}
-
-/* Do an anchored search for string through the history in DIRECTION. */
-int
-history_search_prefix (string, direction)
- char *string;
- int direction;
-{
- return (history_search_internal (string, direction, ANCHORED_SEARCH));
-}
-
/* Remove history element WHICH from the history. The removed
element is returned to you so you can free the line, data,
and containing structure. */
@@ -466,7 +330,7 @@ stifle_history (max)
register int i, j;
/* This loses because we cannot free the data. */
- for (i = 0; i < (history_length - max); i++)
+ for (i = 0, j = history_length - max; i < j; i++)
{
free (the_history[i]->line);
free (the_history[i]);
@@ -483,21 +347,19 @@ stifle_history (max)
max_input_history = max;
}
-/* Stop stifling the history. This returns the previous amount the history
- was stifled by. The value is positive if the history was stifled, negative
- if it wasn't. */
+/* Stop stifling the history. This returns the previous amount the
+ history was stifled by. The value is positive if the history was
+ stifled, negative if it wasn't. */
int
unstifle_history ()
{
- int result = max_input_history;
-
if (history_stifled)
{
- result = -result;
history_stifled = 0;
+ return (-max_input_history);
}
- return (result);
+ return (max_input_history);
}
int
@@ -506,1666 +368,18 @@ history_is_stifled ()
return (history_stifled);
}
-/* Return the string that should be used in the place of this
- filename. This only matters when you don't specify the
- filename to read_history (), or write_history (). */
-static char *
-history_filename (filename)
- char *filename;
-{
- char *return_val = filename ? savestring (filename) : (char *)NULL;
-
- if (!return_val)
- {
- char *home;
- int home_len;
-
- home = getenv ("HOME");
-
- if (!home)
- home = ".";
-
- home_len = strlen (home);
- /* strlen(".history") == 8 */
- return_val = xmalloc (2 + home_len + 8);
-
- strcpy (return_val, home);
- return_val[home_len] = '/';
- strcpy (return_val + home_len + 1, ".history");
- }
-
- return (return_val);
-}
-
-/* Add the contents of FILENAME to the history list, a line at a time.
- If FILENAME is NULL, then read from ~/.history. Returns 0 if
- successful, or errno if not. */
-int
-read_history (filename)
- char *filename;
-{
- return (read_history_range (filename, 0, -1));
-}
-
-/* Read a range of lines from FILENAME, adding them to the history list.
- Start reading at the FROM'th line and end at the TO'th. If FROM
- is zero, start at the beginning. If TO is less than FROM, read
- until the end of the file. If FILENAME is NULL, then read from
- ~/.history. Returns 0 if successful, or errno if not. */
-int
-read_history_range (filename, from, to)
- char *filename;
- int from, to;
-{
- register int line_start, line_end;
- char *input, *buffer = (char *)NULL;
- int file, current_line;
- struct stat finfo;
-
- input = history_filename (filename);
- file = open (input, O_RDONLY, 0666);
-
- if ((file < 0) || (fstat (file, &finfo) == -1))
- goto error_and_exit;
-
- buffer = xmalloc ((int)finfo.st_size + 1);
-
- if (read (file, buffer, finfo.st_size) != finfo.st_size)
- {
- error_and_exit:
- if (file >= 0)
- close (file);
-
- if (input)
- free (input);
-
- if (buffer)
- free (buffer);
-
- return (errno);
- }
-
- close (file);
-
- /* Set TO to larger than end of file if negative. */
- if (to < 0)
- to = finfo.st_size;
-
- /* Start at beginning of file, work to end. */
- line_start = line_end = current_line = 0;
-
- /* Skip lines until we are at FROM. */
- while (line_start < finfo.st_size && current_line < from)
- {
- for (line_end = line_start; line_end < finfo.st_size; line_end++)
- if (buffer[line_end] == '\n')
- {
- current_line++;
- line_start = line_end + 1;
- if (current_line == from)
- break;
- }
- }
-
- /* If there are lines left to gobble, then gobble them now. */
- for (line_end = line_start; line_end < finfo.st_size; line_end++)
- if (buffer[line_end] == '\n')
- {
- buffer[line_end] = '\0';
-
- if (buffer[line_start])
- add_history (buffer + line_start);
-
- current_line++;
-
- if (current_line >= to)
- break;
-
- line_start = line_end + 1;
- }
-
- if (input)
- free (input);
-
- if (buffer)
- free (buffer);
-
- return (0);
-}
-
-/* Truncate the history file FNAME, leaving only LINES trailing lines.
- If FNAME is NULL, then use ~/.history. */
-int
-history_truncate_file (fname, lines)
- char *fname;
- register int lines;
-{
- register int i;
- int file, chars_read;
- char *buffer = (char *)NULL, *filename;
- struct stat finfo;
-
- filename = history_filename (fname);
- file = open (filename, O_RDONLY, 0666);
-
- if (file == -1 || fstat (file, &finfo) == -1)
- goto truncate_exit;
-
- buffer = xmalloc ((int)finfo.st_size + 1);
- chars_read = read (file, buffer, finfo.st_size);
- close (file);
-
- if (chars_read <= 0)
- goto truncate_exit;
-
- /* Count backwards from the end of buffer until we have passed
- LINES lines. */
- for (i = chars_read - 1; lines && i; i--)
- {
- if (buffer[i] == '\n')
- lines--;
- }
-
- /* If this is the first line, then the file contains exactly the
- number of lines we want to truncate to, so we don't need to do
- anything. It's the first line if we don't find a newline between
- the current value of i and 0. Otherwise, write from the start of
- this line until the end of the buffer. */
- for ( ; i; i--)
- if (buffer[i] == '\n')
- {
- i++;
- break;
- }
-
- /* Write only if there are more lines in the file than we want to
- truncate to. */
- if (i && ((file = open (filename, O_WRONLY|O_TRUNC, 0666)) != -1))
- {
- write (file, buffer + i, finfo.st_size - i);
- close (file);
- }
-
- truncate_exit:
- if (buffer)
- free (buffer);
-
- free (filename);
- return 0;
-}
-
-#define HISTORY_APPEND 0
-#define HISTORY_OVERWRITE 1
-
-/* Workhorse function for writing history. Writes NELEMENT entries
- from the history list to FILENAME. OVERWRITE is non-zero if you
- wish to replace FILENAME with the entries. */
-static int
-history_do_write (filename, nelements, overwrite)
- char *filename;
- int nelements, overwrite;
+void
+clear_history ()
{
register int i;
- char *output = history_filename (filename);
- int file, mode;
-
- mode = overwrite ? O_WRONLY | O_CREAT | O_TRUNC : O_WRONLY | O_APPEND;
- if ((file = open (output, mode, 0666)) == -1)
+ /* This loses because we cannot free the data. */
+ for (i = 0; i < history_length; i++)
{
- if (output)
- free (output);
-
- return (errno);
+ free (the_history[i]->line);
+ free (the_history[i]);
+ the_history[i] = (HIST_ENTRY *)NULL;
}
- if (nelements > history_length)
- nelements = history_length;
-
- /* Build a buffer of all the lines to write, and write them in one syscall.
- Suggested by Peter Ho (peter@robosts.oxford.ac.uk). */
- {
- register int j = 0;
- int buffer_size = 0;
- char *buffer;
-
- /* Calculate the total number of bytes to write. */
- for (i = history_length - nelements; i < history_length; i++)
- buffer_size += 1 + strlen (the_history[i]->line);
-
- /* Allocate the buffer, and fill it. */
- buffer = xmalloc (buffer_size);
-
- for (i = history_length - nelements; i < history_length; i++)
- {
- strcpy (buffer + j, the_history[i]->line);
- j += strlen (the_history[i]->line);
- buffer[j++] = '\n';
- }
-
- write (file, buffer, buffer_size);
- free (buffer);
- }
-
- close (file);
-
- if (output)
- free (output);
-
- return (0);
-}
-
-/* Append NELEMENT entries to FILENAME. The entries appended are from
- the end of the list minus NELEMENTs up to the end of the list. */
-int
-append_history (nelements, filename)
- int nelements;
- char *filename;
-{
- return (history_do_write (filename, nelements, HISTORY_APPEND));
-}
-
-/* Overwrite FILENAME with the current history. If FILENAME is NULL,
- then write the history list to ~/.history. Values returned
- are as in read_history ().*/
-int
-write_history (filename)
- char *filename;
-{
- return (history_do_write (filename, history_length, HISTORY_OVERWRITE));
-}
-
-/* Return the history entry at the current position, as determined by
- history_offset. If there is no entry there, return a NULL pointer. */
-HIST_ENTRY *
-current_history ()
-{
- if ((history_offset == history_length) || !the_history)
- return ((HIST_ENTRY *)NULL);
- else
- return (the_history[history_offset]);
+ history_offset = history_length = 0;
}
-
-/* Back up history_offset to the previous history entry, and return
- a pointer to that entry. If there is no previous entry then return
- a NULL pointer. */
-HIST_ENTRY *
-previous_history ()
-{
- if (!history_offset)
- return ((HIST_ENTRY *)NULL);
- else
- return (the_history[--history_offset]);
-}
-
-/* Move history_offset forward to the next history entry, and return
- a pointer to that entry. If there is no next entry then return a
- NULL pointer. */
-HIST_ENTRY *
-next_history ()
-{
- if (history_offset == history_length)
- return ((HIST_ENTRY *)NULL);
- else
- return (the_history[++history_offset]);
-}
-
-/* Return the current history array. The caller has to be carefull, since this
- is the actual array of data, and could be bashed or made corrupt easily.
- The array is terminated with a NULL pointer. */
-HIST_ENTRY **
-history_list ()
-{
- return (the_history);
-}
-
-/* Return the history entry which is logically at OFFSET in the history array.
- OFFSET is relative to history_base. */
-HIST_ENTRY *
-history_get (offset)
- int offset;
-{
- int local_index = offset - history_base;
-
- if (local_index >= history_length ||
- local_index < 0 ||
- !the_history)
- return ((HIST_ENTRY *)NULL);
- return (the_history[local_index]);
-}
-
-/* Search for STRING in the history list. DIR is < 0 for searching
- backwards. POS is an absolute index into the history list at
- which point to begin searching. */
-int
-history_search_pos (string, dir, pos)
- char *string;
- int dir, pos;
-{
- int ret, old = where_history ();
- history_set_pos (pos);
- if (history_search (string, dir) == -1)
- {
- history_set_pos (old);
- return (-1);
- }
- ret = where_history ();
- history_set_pos (old);
- return ret;
-}
-
-/* Make the current history item be the one at POS, an absolute index.
- Returns zero if POS is out of range, else non-zero. */
-int
-history_set_pos (pos)
- int pos;
-{
- if (pos > history_length || pos < 0 || !the_history)
- return (0);
- history_offset = pos;
- return (1);
-}
-
-
-/* **************************************************************** */
-/* */
-/* History Expansion */
-/* */
-/* **************************************************************** */
-
-/* Hairy history expansion on text, not tokens. This is of general
- use, and thus belongs in this library. */
-
-/* The last string searched for in a !?string? search. */
-static char *search_string = (char *)NULL;
-
-/* Return the event specified at TEXT + OFFSET modifying OFFSET to
- point to after the event specifier. Just a pointer to the history
- line is returned; NULL is returned in the event of a bad specifier.
- You pass STRING with *INDEX equal to the history_expansion_char that
- begins this specification.
- DELIMITING_QUOTE is a character that is allowed to end the string
- specification for what to search for in addition to the normal
- characters `:', ` ', `\t', `\n', and sometimes `?'.
- So you might call this function like:
- line = get_history_event ("!echo:p", &index, 0); */
-char *
-get_history_event (string, caller_index, delimiting_quote)
- char *string;
- int *caller_index;
- int delimiting_quote;
-{
- register int i = *caller_index;
- register char c;
- HIST_ENTRY *entry;
- int which, sign = 1;
- int local_index, search_mode, substring_okay = 0;
- char *temp;
-
- /* The event can be specified in a number of ways.
-
- !! the previous command
- !n command line N
- !-n current command-line minus N
- !str the most recent command starting with STR
- !?str[?]
- the most recent command containing STR
-
- All values N are determined via HISTORY_BASE. */
-
- if (string[i] != history_expansion_char)
- return ((char *)NULL);
-
- /* Move on to the specification. */
- i++;
-
-#define RETURN_ENTRY(e, w) \
- return ((e = history_get (w)) ? e->line : (char *)NULL)
-
- /* Handle !! case. */
- if (string[i] == history_expansion_char)
- {
- i++;
- which = history_base + (history_length - 1);
- *caller_index = i;
- RETURN_ENTRY (entry, which);
- }
-
- /* Hack case of numeric line specification. */
- if (string[i] == '-')
- {
- sign = -1;
- i++;
- }
-
- if (digit_p (string[i]))
- {
- /* Get the extent of the digits and compute the value. */
- for (which = 0; digit_p (string[i]); i++)
- which = (which * 10) + digit_value (string[i]);
-
- *caller_index = i;
-
- if (sign < 0)
- which = (history_length + history_base) - which;
-
- RETURN_ENTRY (entry, which);
- }
-
- /* This must be something to search for. If the spec begins with
- a '?', then the string may be anywhere on the line. Otherwise,
- the string must be found at the start of a line. */
- if (string[i] == '?')
- {
- substring_okay++;
- i++;
- }
-
- /* Only a closing `?' or a newline delimit a substring search string. */
- for (local_index = i; c = string[i]; i++)
- if ((!substring_okay && (whitespace (c) || c == ':' ||
-#if defined (SHELL)
- member (c, ";&()|<>") ||
-#endif /* SHELL */
- string[i] == delimiting_quote)) ||
- string[i] == '\n' ||
- (substring_okay && string[i] == '?'))
- break;
-
- temp = xmalloc (1 + (i - local_index));
- strncpy (temp, &string[local_index], (i - local_index));
- temp[i - local_index] = '\0';
-
- if (substring_okay && string[i] == '?')
- i++;
-
- *caller_index = i;
-
-#define FAIL_SEARCH() \
- do { history_offset = history_length; free (temp) ; return (char *)NULL; } while (0)
-
- search_mode = substring_okay ? NON_ANCHORED_SEARCH : ANCHORED_SEARCH;
- while (1)
- {
- local_index = history_search_internal (temp, -1, search_mode);
-
- if (local_index < 0)
- FAIL_SEARCH ();
-
- if (local_index == 0 || substring_okay)
- {
- entry = current_history ();
- history_offset = history_length;
-
- /* If this was a substring search, then remember the
- string that we matched for word substitution. */
- if (substring_okay)
- {
- if (search_string)
- free (search_string);
- search_string = temp;
- }
- else
- free (temp);
- return (entry->line);
- }
-
- if (history_offset)
- history_offset--;
- else
- FAIL_SEARCH ();
- }
-#undef FAIL_SEARCH
-#undef RETURN_ENTRY
-}
-#if defined (SHELL)
-/* Function for extracting single-quoted strings. Used for inhibiting
- history expansion within single quotes. */
-
-/* Extract the contents of STRING as if it is enclosed in single quotes.
- SINDEX, when passed in, is the offset of the character immediately
- following the opening single quote; on exit, SINDEX is left pointing
- to the closing single quote. */
-static void
-rl_string_extract_single_quoted (string, sindex)
- char *string;
- int *sindex;
-{
- register int i = *sindex;
-
- while (string[i] && string[i] != '\'')
- i++;
-
- *sindex = i;
-}
-
-static char *
-quote_breaks (s)
- char *s;
-{
- register char *p, *r;
- char *ret;
- int len = 3;
-
- for (p = s; p && *p; p++, len++)
- {
- if (*p == '\'')
- len += 3;
- else if (whitespace (*p) || *p == '\n')
- len += 2;
- }
-
- r = ret = xmalloc (len);
- *r++ = '\'';
- for (p = s; p && *p; )
- {
- if (*p == '\'')
- {
- *r++ = '\'';
- *r++ = '\\';
- *r++ = '\'';
- *r++ = '\'';
- p++;
- }
- else if (whitespace (*p) || *p == '\n')
- {
- *r++ = '\'';
- *r++ = *p++;
- *r++ = '\'';
- }
- else
- *r++ = *p++;
- }
- *r++ = '\'';
- *r = '\0';
- return ret;
-}
-#endif /* SHELL */
-
-static char *
-hist_error(s, start, current, errtype)
- char *s;
- int start, current, errtype;
-{
- char *temp, *emsg;
- int ll, elen;
-
- ll = current - start;
-
- switch (errtype)
- {
- case EVENT_NOT_FOUND:
- emsg = "event not found";
- elen = 15;
- break;
- case BAD_WORD_SPEC:
- emsg = "bad word specifier";
- elen = 18;
- break;
- case SUBST_FAILED:
- emsg = "substitution failed";
- elen = 19;
- break;
- case BAD_MODIFIER:
- emsg = "unrecognized history modifier";
- elen = 29;
- break;
- default:
- emsg = "unknown expansion error";
- elen = 23;
- break;
- }
-
- temp = xmalloc (ll + elen + 3);
- strncpy (temp, s + start, ll);
- temp[ll] = ':';
- temp[ll + 1] = ' ';
- strcpy (temp + ll + 2, emsg);
- return (temp);
-}
-
-/* Get a history substitution string from STR starting at *IPTR
- and return it. The length is returned in LENPTR.
-
- A backslash can quote the delimiter. If the string is the
- empty string, the previous pattern is used. If there is
- no previous pattern for the lhs, the last history search
- string is used.
-
- If IS_RHS is 1, we ignore empty strings and set the pattern
- to "" anyway. subst_lhs is not changed if the lhs is empty;
- subst_rhs is allowed to be set to the empty string. */
-
-static char *
-get_subst_pattern (str, iptr, delimiter, is_rhs, lenptr)
- char *str;
- int *iptr, delimiter, is_rhs, *lenptr;
-{
- register int si, i, j, k;
- char *s = (char *) NULL;
-
- i = *iptr;
-
- for (si = i; str[si] && str[si] != delimiter; si++)
- if (str[si] == '\\' && str[si + 1] == delimiter)
- si++;
-
- if (si > i || is_rhs)
- {
- s = xmalloc (si - i + 1);
- for (j = 0, k = i; k < si; j++, k++)
- {
- /* Remove a backslash quoting the search string delimiter. */
- if (str[k] == '\\' && str[k + 1] == delimiter)
- k++;
- s[j] = str[k];
- }
- s[j] = '\0';
- if (lenptr)
- *lenptr = j;
- }
-
- i = si;
- if (str[i])
- i++;
- *iptr = i;
-
- return s;
-}
-
-static void
-postproc_subst_rhs ()
-{
- char *new;
- int i, j, new_size;
-
- new = xmalloc (new_size = subst_rhs_len + subst_lhs_len);
- for (i = j = 0; i < subst_rhs_len; i++)
- {
- if (subst_rhs[i] == '&')
- {
- if (j + subst_lhs_len >= new_size)
- new = xrealloc (new, (new_size = new_size * 2 + subst_lhs_len));
- strcpy (new + j, subst_lhs);
- j += subst_lhs_len;
- }
- else
- {
- /* a single backslash protects the `&' from lhs interpolation */
- if (subst_rhs[i] == '\\' && subst_rhs[i + 1] == '&')
- i++;
- if (j >= new_size)
- new = xrealloc (new, new_size *= 2);
- new[j++] = subst_rhs[i];
- }
- }
- new[j] = '\0';
- free (subst_rhs);
- subst_rhs = new;
- subst_rhs_len = j;
-}
-
-/* Expand the bulk of a history specifier starting at STRING[START].
- Returns 0 if everything is OK, -1 if an error occurred, and 1
- if the `p' modifier was supplied and the caller should just print
- the returned string. Returns the new index into string in
- *END_INDEX_PTR, and the expanded specifier in *RET_STRING. */
-static int
-history_expand_internal (string, start, end_index_ptr, ret_string, current_line)
- char *string;
- int start, *end_index_ptr;
- char **ret_string;
- char *current_line; /* for !# */
-{
- int i, n, starting_index;
- int substitute_globally, want_quotes, print_only;
- char *event, *temp, *result, *tstr, *t, c, *word_spec;
- int result_len;
-
- result = xmalloc (result_len = 128);
-
- i = start;
-
- /* If it is followed by something that starts a word specifier,
- then !! is implied as the event specifier. */
-
- if (member (string[i + 1], ":$*%^"))
- {
- char fake_s[3];
- int fake_i = 0;
- i++;
- fake_s[0] = fake_s[1] = history_expansion_char;
- fake_s[2] = '\0';
- event = get_history_event (fake_s, &fake_i, 0);
- }
- else if (string[i + 1] == '#')
- {
- i += 2;
- event = current_line;
- }
- else
- {
- int quoted_search_delimiter = 0;
-
- /* If the character before this `!' is a double or single
- quote, then this expansion takes place inside of the
- quoted string. If we have to search for some text ("!foo"),
- allow the delimiter to end the search string. */
- if (i && (string[i - 1] == '\'' || string[i - 1] == '"'))
- quoted_search_delimiter = string[i - 1];
- event = get_history_event (string, &i, quoted_search_delimiter);
- }
-
- if (!event)
- {
- *ret_string = hist_error (string, start, i, EVENT_NOT_FOUND);
- free (result);
- return (-1);
- }
-
- /* If a word specifier is found, then do what that requires. */
- starting_index = i;
- word_spec = get_history_word_specifier (string, event, &i);
-
- /* There is no such thing as a `malformed word specifier'. However,
- it is possible for a specifier that has no match. In that case,
- we complain. */
- if (word_spec == (char *)&error_pointer)
- {
- *ret_string = hist_error (string, starting_index, i, BAD_WORD_SPEC);
- free (result);
- return (-1);
- }
-
- /* If no word specifier, than the thing of interest was the event. */
- if (!word_spec)
- temp = savestring (event);
- else
- {
- temp = savestring (word_spec);
- free (word_spec);
- }
-
- /* Perhaps there are other modifiers involved. Do what they say. */
- want_quotes = substitute_globally = print_only = 0;
- starting_index = i;
-
- while (string[i] == ':')
- {
- c = string[i + 1];
-
- if (c == 'g')
- {
- substitute_globally = 1;
- i++;
- c = string[i + 1];
- }
-
- switch (c)
- {
- default:
- *ret_string = hist_error (string, i+1, i+2, BAD_MODIFIER);
- free (result);
- free (temp);
- return -1;
-
-#if defined (SHELL)
- case 'q':
- want_quotes = 'q';
- break;
-
- case 'x':
- want_quotes = 'x';
- break;
-#endif /* SHELL */
-
- /* :p means make this the last executed line. So we
- return an error state after adding this line to the
- history. */
- case 'p':
- print_only++;
- break;
-
- /* :t discards all but the last part of the pathname. */
- case 't':
- tstr = strrchr (temp, '/');
- if (tstr)
- {
- tstr++;
- t = savestring (tstr);
- free (temp);
- temp = t;
- }
- break;
-
- /* :h discards the last part of a pathname. */
- case 'h':
- tstr = strrchr (temp, '/');
- if (tstr)
- *tstr = '\0';
- break;
-
- /* :r discards the suffix. */
- case 'r':
- tstr = strrchr (temp, '.');
- if (tstr)
- *tstr = '\0';
- break;
-
- /* :e discards everything but the suffix. */
- case 'e':
- tstr = strrchr (temp, '.');
- if (tstr)
- {
- t = savestring (tstr);
- free (temp);
- temp = t;
- }
- break;
-
- /* :s/this/that substitutes `that' for the first
- occurrence of `this'. :gs/this/that substitutes `that'
- for each occurrence of `this'. :& repeats the last
- substitution. :g& repeats the last substitution
- globally. */
-
- case '&':
- case 's':
- {
- char *new_event, *t;
- int delimiter, failed, si, l_temp;
-
- if (c == 's')
- {
- if (i + 2 < (int)strlen (string))
- delimiter = string[i + 2];
- else
- break; /* no search delimiter */
-
- i += 3;
-
- t = get_subst_pattern (string, &i, delimiter, 0, &subst_lhs_len);
- /* An empty substitution lhs with no previous substitution
- uses the last search string as the lhs. */
- if (t)
- {
- if (subst_lhs)
- free (subst_lhs);
- subst_lhs = t;
- }
- else if (!subst_lhs)
- {
- if (search_string && *search_string)
- {
- subst_lhs = savestring (search_string);
- subst_lhs_len = strlen (subst_lhs);
- }
- else
- {
- subst_lhs = (char *) NULL;
- subst_lhs_len = 0;
- }
- }
-
- /* If there is no lhs, the substitution can't succeed. */
- if (subst_lhs_len == 0)
- {
- *ret_string = hist_error (string, starting_index, i, SUBST_FAILED);
- free (result);
- free (temp);
- return -1;
- }
-
- if (subst_rhs)
- free (subst_rhs);
- subst_rhs = get_subst_pattern (string, &i, delimiter, 1, &subst_rhs_len);
-
- /* If `&' appears in the rhs, it's supposed to be replaced
- with the lhs. */
- if (member ('&', subst_rhs))
- postproc_subst_rhs ();
- }
- else
- i += 2;
-
- l_temp = strlen (temp);
- /* Ignore impossible cases. */
- if (subst_lhs_len > l_temp)
- {
- *ret_string = hist_error (string, starting_index, i, SUBST_FAILED);
- free (result);
- free (temp);
- return (-1);
- }
-
- /* Find the first occurrence of THIS in TEMP. */
- si = 0;
- for (failed = 1; (si + subst_lhs_len) <= l_temp; si++)
- if (STREQN (temp+si, subst_lhs, subst_lhs_len))
- {
- int len = subst_rhs_len - subst_lhs_len + l_temp;
- new_event = xmalloc (1 + len);
- strncpy (new_event, temp, si);
- strncpy (new_event + si, subst_rhs, subst_rhs_len);
- strncpy (new_event + si + subst_rhs_len,
- temp + si + subst_lhs_len,
- l_temp - (si + subst_lhs_len));
- new_event[len] = '\0';
- free (temp);
- temp = new_event;
-
- failed = 0;
-
- if (substitute_globally)
- {
- si += subst_rhs_len;
- l_temp = strlen (temp);
- substitute_globally++;
- continue;
- }
- else
- break;
- }
-
- if (substitute_globally > 1)
- {
- substitute_globally = 0;
- continue; /* don't want to increment i */
- }
-
- if (failed == 0)
- continue; /* don't want to increment i */
-
- *ret_string = hist_error (string, starting_index, i, SUBST_FAILED);
- free (result);
- free (temp);
- return (-1);
- }
- }
- i += 2;
- }
- /* Done with modfiers. */
- /* Believe it or not, we have to back the pointer up by one. */
- --i;
-
-#if defined (SHELL)
- if (want_quotes)
- {
- char *x;
-
- if (want_quotes == 'q')
- x = single_quote (temp);
- else if (want_quotes == 'x')
- x = quote_breaks (temp);
- else
- x = savestring (temp);
-
- free (temp);
- temp = x;
- }
-#endif /* SHELL */
-
- n = strlen (temp);
- if (n > result_len)
- result = xrealloc (result, n + 2);
- strcpy (result, temp);
- free (temp);
-
- *end_index_ptr = i;
- *ret_string = result;
- return (print_only);
-}
-
-/* Expand the string STRING, placing the result into OUTPUT, a pointer
- to a string. Returns:
-
- -1) If there was an error in expansion.
- 0) If no expansions took place (or, if the only change in
- the text was the de-slashifying of the history expansion
- character)
- 1) If expansions did take place
- 2) If the `p' modifier was given and the caller should print the result
-
- If an error ocurred in expansion, then OUTPUT contains a descriptive
- error message. */
-
-#define ADD_STRING(s) \
- do \
- { \
- int sl = strlen (s); \
- j += sl; \
- if (j >= result_len) \
- { \
- while (j >= result_len) \
- result_len += 128; \
- result = xrealloc (result, result_len); \
- } \
- strcpy (result + j - sl, s); \
- } \
- while (0)
-
-#define ADD_CHAR(c) \
- do \
- { \
- if (j >= result_len - 1) \
- result = xrealloc (result, result_len += 64); \
- result[j++] = c; \
- result[j] = '\0'; \
- } \
- while (0)
-
-int
-history_expand (hstring, output)
- char *hstring;
- char **output;
-{
- register int j;
- int i, r, l, passc, cc, modified, eindex, only_printing;
- char *string;
-
- /* The output string, and its length. */
- int result_len;
- char *result;
-
- /* Used when adding the string. */
- char *temp;
-
- /* Setting the history expansion character to 0 inhibits all
- history expansion. */
- if (history_expansion_char == 0)
- {
- *output = savestring (hstring);
- return (0);
- }
-
- /* Prepare the buffer for printing error messages. */
- result = xmalloc (result_len = 256);
- result[0] = '\0';
-
- only_printing = modified = 0;
- l = strlen (hstring);
-
- /* Grovel the string. Only backslash can quote the history escape
- character. We also handle arg specifiers. */
-
- /* Before we grovel forever, see if the history_expansion_char appears
- anywhere within the text. */
-
- /* The quick substitution character is a history expansion all right. That
- is to say, "^this^that^" is equivalent to "!!:s^this^that^", and in fact,
- that is the substitution that we do. */
- if (hstring[0] == history_subst_char)
- {
- string = xmalloc (l + 5);
-
- string[0] = string[1] = history_expansion_char;
- string[2] = ':';
- string[3] = 's';
- strcpy (string + 4, hstring);
- l += 4;
- }
- else
- {
- string = hstring;
- /* If not quick substitution, still maybe have to do expansion. */
-
- /* `!' followed by one of the characters in history_no_expand_chars
- is NOT an expansion. */
- for (i = 0; string[i]; i++)
- {
- cc = string[i + 1];
- if (string[i] == history_expansion_char)
- {
- if (!cc || member (cc, history_no_expand_chars))
- continue;
-#if defined (SHELL)
- /* The shell uses ! as a pattern negation character
- in globbing [...] expressions, so let those pass
- without expansion. */
- else if (i > 0 && (string[i - 1] == '[') &&
- member (']', string + i + 1))
- continue;
-#endif /* SHELL */
- else
- break;
- }
-#if defined (SHELL)
- else if (string[i] == '\'')
- {
- /* If this is bash, single quotes inhibit history expansion. */
- i++;
- rl_string_extract_single_quoted (string, &i);
- }
- else if (string[i] == '\\')
- {
- /* If this is bash, allow backslashes to quote single
- quotes and
- the history expansion character. */
- if (cc == '\'' || cc == history_expansion_char)
- i++;
- }
-#endif /* SHELL */
- }
-
- if (string[i] != history_expansion_char)
- {
- free (result);
- *output = savestring (string);
- return (0);
- }
- }
-
- /* Extract and perform the substitution. */
- for (passc = i = j = 0; i < l; i++)
- {
- int tchar = string[i];
-
- if (passc)
- {
- passc = 0;
- ADD_CHAR (tchar);
- continue;
- }
-
- if (tchar == history_expansion_char)
- tchar = -3;
-
- switch (tchar)
- {
- default:
- ADD_CHAR (string[i]);
- break;
-
- case '\\':
- passc++;
- ADD_CHAR (tchar);
- break;
-
-#if defined (SHELL)
- case '\'':
- {
- /* If this is bash, single quotes inhibit history expansion. */
- int quote, slen;
-
- quote = i++;
- rl_string_extract_single_quoted (string, &i);
-
- slen = i - quote + 2;
- temp = xmalloc (slen);
- strncpy (temp, string + quote, slen);
- temp[slen - 1] = '\0';
- ADD_STRING (temp);
- free (temp);
- break;
- }
-#endif /* SHELL */
-
- case -3: /* history_expansion_char */
- cc = string[i + 1];
-
- /* If the history_expansion_char is followed by one of the
- characters in history_no_expand_chars, then it is not a
- candidate for expansion of any kind. */
- if (member (cc, history_no_expand_chars))
- {
- ADD_CHAR (string[i]);
- break;
- }
-
-#if defined (NO_BANG_HASH_MODIFIERS)
- /* There is something that is listed as a `word specifier' in csh
- documentation which means `the expanded text to this point'.
- That is not a word specifier, it is an event specifier. If we
- don't want to allow modifiers with `!#', just stick the current
- output line in again. */
- if (cc == '#')
- {
- if (result)
- {
- temp = xmalloc (1 + strlen (result));
- strcpy (temp, result);
- ADD_STRING (temp);
- free (temp);
- }
- i++;
- break;
- }
-#endif
-
- r = history_expand_internal (string, i, &eindex, &temp, result);
- if (r < 0)
- {
- *output = temp;
- free (result);
- if (string != hstring)
- free (string);
- return -1;
- }
- else
- {
- if (temp)
- {
- modified++;
- if (*temp)
- ADD_STRING (temp);
- free (temp);
- }
- only_printing = r == 1;
- i = eindex;
- }
- break;
- }
- }
-
- *output = result;
- if (string != hstring)
- free (string);
-
- if (only_printing)
- {
- add_history (result);
- return (2);
- }
-
- return (modified != 0);
-}
-
-/* Return a consed string which is the word specified in SPEC, and found
- in FROM. NULL is returned if there is no spec. The address of
- ERROR_POINTER is returned if the word specified cannot be found.
- CALLER_INDEX is the offset in SPEC to start looking; it is updated
- to point to just after the last character parsed. */
-static char *
-get_history_word_specifier (spec, from, caller_index)
- char *spec, *from;
- int *caller_index;
-{
- register int i = *caller_index;
- int first, last;
- int expecting_word_spec = 0;
- char *result;
-
- /* The range of words to return doesn't exist yet. */
- first = last = 0;
- result = (char *)NULL;
-
- /* If we found a colon, then this *must* be a word specification. If
- it isn't, then it is an error. */
- if (spec[i] == ':')
- {
- i++;
- expecting_word_spec++;
- }
-
- /* Handle special cases first. */
-
- /* `%' is the word last searched for. */
- if (spec[i] == '%')
- {
- *caller_index = i + 1;
- return (search_string ? savestring (search_string) : savestring (""));
- }
-
- /* `*' matches all of the arguments, but not the command. */
- if (spec[i] == '*')
- {
- *caller_index = i + 1;
- result = history_arg_extract (1, '$', from);
- return (result ? result : savestring (""));
- }
-
- /* `$' is last arg. */
- if (spec[i] == '$')
- {
- *caller_index = i + 1;
- return (history_arg_extract ('$', '$', from));
- }
-
- /* Try to get FIRST and LAST figured out. */
-
- if (spec[i] == '-')
- first = 0;
- else if (spec[i] == '^')
- first = 1;
- else if (digit_p (spec[i]) && expecting_word_spec)
- {
- for (first = 0; digit_p (spec[i]); i++)
- first = (first * 10) + digit_value (spec[i]);
- }
- else
- return ((char *)NULL); /* no valid `first' for word specifier */
-
- if (spec[i] == '^' || spec[i] == '*')
- {
- last = (spec[i] == '^') ? 1 : '$'; /* x* abbreviates x-$ */
- i++;
- }
- else if (spec[i] != '-')
- last = first;
- else
- {
- i++;
-
- if (digit_p (spec[i]))
- {
- for (last = 0; digit_p (spec[i]); i++)
- last = (last * 10) + digit_value (spec[i]);
- }
- else if (spec[i] == '$')
- {
- i++;
- last = '$';
- }
- else if (!spec[i] || spec[i] == ':') /* could be modifier separator */
- last = -1; /* x- abbreviates x-$ omitting word `$' */
- }
-
- *caller_index = i;
-
- if (last >= first || last == '$' || last < 0)
- result = history_arg_extract (first, last, from);
-
- return (result ? result : (char *)&error_pointer);
-}
-
-/* Extract the args specified, starting at FIRST, and ending at LAST.
- The args are taken from STRING. If either FIRST or LAST is < 0,
- then make that arg count from the right (subtract from the number of
- tokens, so that FIRST = -1 means the next to last token on the line).
- If LAST is `$' the last arg from STRING is used. */
-char *
-history_arg_extract (first, last, string)
- int first, last;
- char *string;
-{
- register int i, len;
- char *result = (char *)NULL;
- int size = 0, offset = 0;
- char **list;
-
- /* XXX - think about making history_tokenize return a struct array,
- each struct in array being a string and a length to avoid the
- calls to strlen below. */
- if ((list = history_tokenize (string)) == NULL)
- return ((char *)NULL);
-
- for (len = 0; list[len]; len++)
- ;
-
- if (last < 0)
- last = len + last - 1;
-
- if (first < 0)
- first = len + first - 1;
-
- if (last == '$')
- last = len - 1;
-
- if (first == '$')
- first = len - 1;
-
- last++;
-
- if (first > len || last > len || first < 0 || last < 0)
- result = ((char *)NULL);
- else
- {
- for (size = 0, i = first; i < last; i++)
- size += strlen (list[i]) + 1;
- result = xmalloc (size + 1);
-
- for (i = first; i < last; i++)
- {
- strcpy (result + offset, list[i]);
- offset += strlen (list[i]);
- if (i + 1 < last)
- {
- result[offset++] = ' ';
- result[offset] = 0;
- }
- }
- }
-
- for (i = 0; i < len; i++)
- free (list[i]);
- free (list);
-
- return (result);
-}
-
-#define slashify_in_quotes "\\`\"$"
-
-/* Return an array of tokens, much as the shell might. The tokens are
- parsed out of STRING. */
-char **
-history_tokenize (string)
- char *string;
-{
- char **result = (char **)NULL;
- register int i, start, result_index, size;
- int len;
-
- i = result_index = size = 0;
-
- /* Get a token, and stuff it into RESULT. The tokens are split
- exactly where the shell would split them. */
- while (string[i])
- {
- int delimiter = 0;
-
- /* Skip leading whitespace. */
- for (; string[i] && whitespace (string[i]); i++)
- ;
- if (!string[i] || string[i] == history_comment_char)
- return (result);
-
- start = i;
-
- if (member (string[i], "()\n"))
- {
- i++;
- goto got_token;
- }
-
- if (member (string[i], "<>;&|$"))
- {
- int peek = string[i + 1];
-
- if (peek == string[i] && peek != '$')
- {
- if (peek == '<' && string[i + 2] == '-')
- i++;
- i += 2;
- goto got_token;
- }
- else
- {
- if ((peek == '&' && (string[i] == '>' || string[i] == '<')) ||
- ((peek == '>') && (string[i] == '&')) ||
- ((peek == '(') && (string[i] == '$')))
- {
- i += 2;
- goto got_token;
- }
- }
- if (string[i] != '$')
- {
- i++;
- goto got_token;
- }
- }
-
- /* Get word from string + i; */
-
- if (member (string[i], "\"'`"))
- delimiter = string[i++];
-
- for (; string[i]; i++)
- {
- if (string[i] == '\\' && string[i + 1] == '\n')
- {
- i++;
- continue;
- }
-
- if (string[i] == '\\' && delimiter != '\'' &&
- (delimiter != '"' || member (string[i], slashify_in_quotes)))
- {
- i++;
- continue;
- }
-
- if (delimiter && string[i] == delimiter)
- {
- delimiter = 0;
- continue;
- }
-
- if (!delimiter && (member (string[i], " \t\n;&()|<>")))
- break;
-
- if (!delimiter && member (string[i], "\"'`"))
- delimiter = string[i];
- }
- got_token:
-
- len = i - start;
- if (result_index + 2 >= size)
- result = (char **)xrealloc (result, ((size += 10) * sizeof (char *)));
- result[result_index] = xmalloc (1 + len);
- strncpy (result[result_index], string + start, len);
- result[result_index][len] = '\0';
- result[++result_index] = (char *)NULL;
- }
-
- return (result);
-}
-
-#if defined (STATIC_MALLOC)
-
-/* **************************************************************** */
-/* */
-/* xmalloc and xrealloc () */
-/* */
-/* **************************************************************** */
-
-static void memory_error_and_abort ();
-
-static char *
-xmalloc (bytes)
- int bytes;
-{
- char *temp = (char *)malloc (bytes);
-
- if (!temp)
- memory_error_and_abort ();
- return (temp);
-}
-
-static char *
-xrealloc (pointer, bytes)
- char *pointer;
- int bytes;
-{
- char *temp;
-
- if (!pointer)
- temp = (char *)xmalloc (bytes);
- else
- temp = (char *)realloc (pointer, bytes);
-
- if (!temp)
- memory_error_and_abort ();
-
- return (temp);
-}
-
-static void
-memory_error_and_abort ()
-{
- fprintf (stderr, "history: Out of virtual memory!\n");
- abort ();
-}
-#endif /* STATIC_MALLOC */
-
-/* **************************************************************** */
-/* */
-/* Test Code */
-/* */
-/* **************************************************************** */
-#ifdef TEST
-main ()
-{
- char line[1024], *t;
- int done = 0;
-
- line[0] = 0;
-
- while (!done)
- {
- fprintf (stdout, "history%% ");
- t = gets (line);
-
- if (!t)
- strcpy (line, "quit");
-
- if (line[0])
- {
- char *expansion;
- int result;
-
- using_history ();
-
- result = history_expand (line, &expansion);
- strcpy (line, expansion);
- free (expansion);
- if (result)
- fprintf (stderr, "%s\n", line);
-
- if (result < 0)
- continue;
-
- add_history (line);
- }
-
- if (strcmp (line, "quit") == 0) done = 1;
- if (strcmp (line, "save") == 0) write_history (0);
- if (strcmp (line, "read") == 0) read_history (0);
- if (strcmp (line, "list") == 0)
- {
- register HIST_ENTRY **the_list = history_list ();
- register int i;
-
- if (the_list)
- for (i = 0; the_list[i]; i++)
- fprintf (stdout, "%d: %s\n", i + history_base, the_list[i]->line);
- }
- if (strncmp (line, "delete", strlen ("delete")) == 0)
- {
- int which;
- if ((sscanf (line + strlen ("delete"), "%d", &which)) == 1)
- {
- HIST_ENTRY *entry = remove_history (which);
- if (!entry)
- fprintf (stderr, "No such entry %d\n", which);
- else
- {
- free (entry->line);
- free (entry);
- }
- }
- else
- {
- fprintf (stderr, "non-numeric arg given to `delete'\n");
- }
- }
- }
-}
-
-#endif /* TEST */
-
-/*
-* Local variables:
-* compile-command: "gcc -g -DTEST -o history history.c"
-* end:
-*/
diff --git a/history.h b/history.h
index 745e61c..e49a341 100644
--- a/history.h
+++ b/history.h
@@ -1,4 +1,34 @@
/* History.h -- the names of functions that you can call in history. */
+/* Copyright (C) 1989, 1992 Free Software Foundation, Inc.
+
+ This file contains the GNU History Library (the Library), a set of
+ routines for managing the text of previously typed lines.
+
+ The Library 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.
+
+ The Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef _HISTORY_H_
+#define _HISTORY_H_
+
+#if !defined (_FUNCTION_DEF)
+# define _FUNCTION_DEF
+typedef int Function ();
+typedef void VFunction ();
+typedef char *CPFunction ();
+typedef char **CPPFunction ();
+#endif
/* The structure used to store a history entry. */
typedef struct _hist_entry {
@@ -46,6 +76,9 @@ extern HIST_ENTRY *remove_history ();
invalid WHICH, a NULL pointer is returned. */
extern HIST_ENTRY *replace_history_entry ();
+/* Clear the history list and start over. */
+extern void clear_history ();
+
/* Stifle the history list, remembering only MAX number of entries. */
extern void stifle_history ();
@@ -105,9 +138,10 @@ extern HIST_ENTRY *next_history ();
found in. Otherwise, nothing is changed, and a -1 is returned. */
extern int history_search ();
-extern int history_search_prefix ();
-/* Search the history for @var{string}, starting at history_offset.
+/* Search the history for STRING, starting at history_offset.
The search is anchored: matching lines must begin with string. */
+extern int history_search_prefix ();
+
/* Search for STRING in the history list, starting at POS, an
absolute index into the list. DIR, if negative, says to search
backwards from POS, else forwards.
@@ -178,3 +212,12 @@ extern char history_expansion_char;
extern char history_subst_char;
extern char history_comment_char;
extern char *history_no_expand_chars;
+extern char *history_search_delimiter_chars;
+extern int history_quotes_inhibit_expansion;
+
+/* If set, this function is called to decide whether or not a particular
+ history expansion should be treated as a special case for the calling
+ application and not expanded. */
+extern Function *history_inhibit_expansion_function;
+
+#endif /* !_HISTORY_H_ */
diff --git a/histsearch.c b/histsearch.c
new file mode 100644
index 0000000..a72a68b
--- /dev/null
+++ b/histsearch.c
@@ -0,0 +1,197 @@
+/* histsearch.c -- searching the history list. */
+
+/* Copyright (C) 1989, 1992 Free Software Foundation, Inc.
+
+ This file contains the GNU History Library (the Library), a set of
+ routines for managing the text of previously typed lines.
+
+ The Library 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.
+
+ The Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#include "history.h"
+#include "histlib.h"
+
+/* Variables imported from other history library files. */
+extern int history_offset;
+
+/* The list of alternate characters that can delimit a history search
+ string. */
+char *history_search_delimiter_chars = (char *)NULL;
+
+/* Search the history for STRING, starting at history_offset.
+ If DIRECTION < 0, then the search is through previous entries, else
+ through subsequent. If ANCHORED is non-zero, the string must
+ appear at the beginning of a history line, otherwise, the string
+ may appear anywhere in the line. If the string is found, then
+ current_history () is the history entry, and the value of this
+ function is the offset in the line of that history entry that the
+ string was found in. Otherwise, nothing is changed, and a -1 is
+ returned. */
+
+static int
+history_search_internal (string, direction, anchored)
+ char *string;
+ int direction, anchored;
+{
+ register int i, reverse;
+ register char *line;
+ register int line_index;
+ int string_len;
+ HIST_ENTRY **the_history; /* local */
+
+ i = history_offset;
+ reverse = (direction < 0);
+
+ /* Take care of trivial cases first. */
+ if (string == 0 || *string == '\0')
+ return (-1);
+
+ if (!history_length || ((i == history_length) && !reverse))
+ return (-1);
+
+ if (reverse && (i == history_length))
+ i--;
+
+#define NEXT_LINE() do { if (reverse) i--; else i++; } while (0)
+
+ the_history = history_list ();
+ string_len = strlen (string);
+ while (1)
+ {
+ /* Search each line in the history list for STRING. */
+
+ /* At limit for direction? */
+ if ((reverse && i < 0) || (!reverse && i == history_length))
+ return (-1);
+
+ line = the_history[i]->line;
+ line_index = strlen (line);
+
+ /* If STRING is longer than line, no match. */
+ if (string_len > line_index)
+ {
+ NEXT_LINE ();
+ continue;
+ }
+
+ /* Handle anchored searches first. */
+ if (anchored == ANCHORED_SEARCH)
+ {
+ if (STREQN (string, line, string_len))
+ {
+ history_offset = i;
+ return (0);
+ }
+
+ NEXT_LINE ();
+ continue;
+ }
+
+ /* Do substring search. */
+ if (reverse)
+ {
+ line_index -= string_len;
+
+ while (line_index >= 0)
+ {
+ if (STREQN (string, line + line_index, string_len))
+ {
+ history_offset = i;
+ return (line_index);
+ }
+ line_index--;
+ }
+ }
+ else
+ {
+ register int limit;
+
+ limit = line_index - string_len + 1;
+ line_index = 0;
+
+ while (line_index < limit)
+ {
+ if (STREQN (string, line + line_index, string_len))
+ {
+ history_offset = i;
+ return (line_index);
+ }
+ line_index++;
+ }
+ }
+ NEXT_LINE ();
+ }
+}
+
+/* Do a non-anchored search for STRING through the history in DIRECTION. */
+int
+history_search (string, direction)
+ char *string;
+ int direction;
+{
+ return (history_search_internal (string, direction, NON_ANCHORED_SEARCH));
+}
+
+/* Do an anchored search for string through the history in DIRECTION. */
+int
+history_search_prefix (string, direction)
+ char *string;
+ int direction;
+{
+ return (history_search_internal (string, direction, ANCHORED_SEARCH));
+}
+
+/* Search for STRING in the history list. DIR is < 0 for searching
+ backwards. POS is an absolute index into the history list at
+ which point to begin searching. */
+int
+history_search_pos (string, dir, pos)
+ char *string;
+ int dir, pos;
+{
+ int ret, old;
+
+ old = where_history ();
+ history_set_pos (pos);
+ if (history_search (string, dir) == -1)
+ {
+ history_set_pos (old);
+ return (-1);
+ }
+ ret = where_history ();
+ history_set_pos (old);
+ return ret;
+}
diff --git a/input.c b/input.c
new file mode 100644
index 0000000..7e3c0fe
--- /dev/null
+++ b/input.c
@@ -0,0 +1,449 @@
+/* input.c -- character input functions for readline. */
+
+/* Copyright (C) 1994 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline Library is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2, or
+ (at your option) any later version.
+
+ The GNU Readline Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+# include <sys/file.h>
+#endif /* HAVE_SYS_FILE_H */
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_SELECT)
+# if !defined (HAVE_SYS_SELECT_H) || !defined (M_UNIX)
+# include <sys/time.h>
+# endif
+#endif /* HAVE_SELECT */
+#if defined (HAVE_SYS_SELECT_H)
+# include <sys/select.h>
+#endif
+
+#if defined (FIONREAD_IN_SYS_IOCTL)
+# include <sys/ioctl.h>
+#endif
+
+#include <stdio.h>
+#include <errno.h>
+
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+
+/* What kind of non-blocking I/O do we have? */
+#if !defined (O_NDELAY) && defined (O_NONBLOCK)
+# define O_NDELAY O_NONBLOCK /* Posix style */
+#endif
+
+/* Functions imported from other files in the library. */
+extern char *xmalloc (), *xrealloc ();
+
+/* Variables and functions from macro.c. */
+extern void _rl_add_macro_char ();
+extern void _rl_with_macro_input ();
+extern int _rl_next_macro_key ();
+extern int _rl_defining_kbd_macro;
+
+#if defined (VI_MODE)
+extern void _rl_vi_set_last ();
+extern int _rl_vi_textmod_command ();
+#endif /* VI_MODE */
+
+extern FILE *rl_instream, *rl_outstream;
+extern Function *rl_last_func;
+extern int rl_key_sequence_length;
+extern int rl_pending_input;
+extern int rl_editing_mode;
+
+extern Keymap _rl_keymap;
+
+extern int _rl_convert_meta_chars_to_ascii;
+
+#if defined (__GO32__)
+# include <pc.h>
+#endif /* __GO32__ */
+
+/* Non-null means it is a pointer to a function to run while waiting for
+ character input. */
+Function *rl_event_hook = (Function *)NULL;
+
+Function *rl_getc_function = rl_getc;
+
+/* **************************************************************** */
+/* */
+/* Character Input Buffering */
+/* */
+/* **************************************************************** */
+
+static int pop_index, push_index;
+static unsigned char ibuffer[512];
+static int ibuffer_len = sizeof (ibuffer) - 1;
+
+#define any_typein (push_index != pop_index)
+
+int
+_rl_any_typein ()
+{
+ return any_typein;
+}
+
+/* Add KEY to the buffer of characters to be read. */
+int
+rl_stuff_char (key)
+ int key;
+{
+ if (key == EOF)
+ {
+ key = NEWLINE;
+ rl_pending_input = EOF;
+ }
+ ibuffer[push_index++] = key;
+ if (push_index >= ibuffer_len)
+ push_index = 0;
+ return push_index;
+}
+
+/* Make C be the next command to be executed. */
+int
+rl_execute_next (c)
+ int c;
+{
+ rl_pending_input = c;
+ return 0;
+}
+
+/* Return the amount of space available in the
+ buffer for stuffing characters. */
+static int
+ibuffer_space ()
+{
+ if (pop_index > push_index)
+ return (pop_index - push_index);
+ else
+ return (ibuffer_len - (push_index - pop_index));
+}
+
+/* Get a key from the buffer of characters to be read.
+ Return the key in KEY.
+ Result is KEY if there was a key, or 0 if there wasn't. */
+static int
+rl_get_char (key)
+ int *key;
+{
+ if (push_index == pop_index)
+ return (0);
+
+ *key = ibuffer[pop_index++];
+
+ if (pop_index >= ibuffer_len)
+ pop_index = 0;
+
+ return (1);
+}
+
+/* Stuff KEY into the *front* of the input buffer.
+ Returns non-zero if successful, zero if there is
+ no space left in the buffer. */
+static int
+rl_unget_char (key)
+ int key;
+{
+ if (ibuffer_space ())
+ {
+ pop_index--;
+ if (pop_index < 0)
+ pop_index = ibuffer_len - 1;
+ ibuffer[pop_index] = key;
+ return (1);
+ }
+ return (0);
+}
+
+/* If a character is available to be read, then read it
+ and stuff it into IBUFFER. Otherwise, just return. */
+static void
+rl_gather_tyi ()
+{
+#if defined (__GO32__)
+ char input;
+
+ if (isatty (0) && kbhit () && ibuffer_space ())
+ {
+ int i;
+ i = (*rl_getc_function) (rl_instream);
+ rl_stuff_char (i);
+ }
+#else /* !__GO32__ */
+
+ int tty;
+ register int tem, result;
+ int chars_avail;
+ char input;
+#if defined(HAVE_SELECT)
+ fd_set readfds, exceptfds;
+ struct timeval timeout;
+#endif
+
+ tty = fileno (rl_instream);
+
+#if defined (HAVE_SELECT)
+ FD_ZERO (&readfds);
+ FD_ZERO (&exceptfds);
+ FD_SET (tty, &readfds);
+ FD_SET (tty, &exceptfds);
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 100000; /* 0.1 seconds */
+ if (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) <= 0)
+ return; /* Nothing to read. */
+#endif
+
+ result = -1;
+#if defined (FIONREAD)
+ result = ioctl (tty, FIONREAD, &chars_avail);
+#endif
+
+#if defined (O_NDELAY)
+ if (result == -1)
+ {
+ tem = fcntl (tty, F_GETFL, 0);
+
+ fcntl (tty, F_SETFL, (tem | O_NDELAY));
+ chars_avail = read (tty, &input, 1);
+
+ fcntl (tty, F_SETFL, tem);
+ if (chars_avail == -1 && errno == EAGAIN)
+ return;
+ }
+#endif /* O_NDELAY */
+
+ /* If there's nothing available, don't waste time trying to read
+ something. */
+ if (chars_avail <= 0)
+ return;
+
+ tem = ibuffer_space ();
+
+ if (chars_avail > tem)
+ chars_avail = tem;
+
+ /* One cannot read all of the available input. I can only read a single
+ character at a time, or else programs which require input can be
+ thwarted. If the buffer is larger than one character, I lose.
+ Damn! */
+ if (tem < ibuffer_len)
+ chars_avail = 0;
+
+ if (result != -1)
+ {
+ while (chars_avail--)
+ rl_stuff_char ((*rl_getc_function) (rl_instream));
+ }
+ else
+ {
+ if (chars_avail)
+ rl_stuff_char (input);
+ }
+#endif /* !__GO32__ */
+}
+
+/* Is there input available to be read on the readline input file
+ descriptor? Only works if the system has select(2) or FIONREAD. */
+int
+_rl_input_available ()
+{
+#if defined(HAVE_SELECT)
+ fd_set readfds, exceptfds;
+ struct timeval timeout;
+#endif
+#if defined(FIONREAD)
+ int chars_avail;
+#endif
+ int tty;
+
+ tty = fileno (rl_instream);
+
+#if defined (HAVE_SELECT)
+ FD_ZERO (&readfds);
+ FD_ZERO (&exceptfds);
+ FD_SET (tty, &readfds);
+ FD_SET (tty, &exceptfds);
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 100000; /* 0.1 seconds */
+ return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0);
+#endif
+
+#if defined (FIONREAD)
+ if (ioctl (tty, FIONREAD, &chars_avail) == 0)
+ return (chars_avail);
+#endif
+
+ return 0;
+}
+
+void
+_rl_insert_typein (c)
+ int c;
+{
+ int key, t, i;
+ char *string;
+
+ i = key = 0;
+ string = xmalloc (ibuffer_len + 1);
+ string[i++] = (char) c;
+
+ while ((t = rl_get_char (&key)) &&
+ _rl_keymap[key].type == ISFUNC &&
+ _rl_keymap[key].function == rl_insert)
+ string[i++] = key;
+
+ if (t)
+ rl_unget_char (key);
+
+ string[i] = '\0';
+ rl_insert_text (string);
+ free (string);
+}
+
+/* **************************************************************** */
+/* */
+/* Character Input */
+/* */
+/* **************************************************************** */
+
+/* Read a key, including pending input. */
+int
+rl_read_key ()
+{
+ int c;
+
+ rl_key_sequence_length++;
+
+ if (rl_pending_input)
+ {
+ c = rl_pending_input;
+ rl_pending_input = 0;
+ }
+ else
+ {
+ /* If input is coming from a macro, then use that. */
+ if (c = _rl_next_macro_key ())
+ return (c);
+
+ /* If the user has an event function, then call it periodically. */
+ if (rl_event_hook)
+ {
+ while (rl_event_hook && rl_get_char (&c) == 0)
+ {
+ (*rl_event_hook) ();
+ rl_gather_tyi ();
+ }
+ }
+ else
+ {
+ if (rl_get_char (&c) == 0)
+ c = (*rl_getc_function) (rl_instream);
+ }
+ }
+
+ return (c);
+}
+
+int
+rl_getc (stream)
+ FILE *stream;
+{
+ int result, flags;
+ unsigned char c;
+
+#if defined (__GO32__)
+ if (isatty (0))
+ return (getkey () & 0x7F);
+#endif /* __GO32__ */
+
+ while (1)
+ {
+ result = read (fileno (stream), &c, sizeof (unsigned char));
+
+ if (result == sizeof (unsigned char))
+ return (c);
+
+ /* If zero characters are returned, then the file that we are
+ reading from is empty! Return EOF in that case. */
+ if (result == 0)
+ return (EOF);
+
+#if defined (EWOULDBLOCK)
+ if (errno == EWOULDBLOCK)
+ {
+ if ((flags = fcntl (fileno (stream), F_GETFL, 0)) < 0)
+ return (EOF);
+ if (flags & O_NDELAY)
+ {
+ flags &= ~O_NDELAY;
+ fcntl (fileno (stream), F_SETFL, flags);
+ continue;
+ }
+ continue;
+ }
+#endif /* EWOULDBLOCK */
+
+#if defined (_POSIX_VERSION) && defined (EAGAIN) && defined (O_NONBLOCK)
+ if (errno == EAGAIN)
+ {
+ if ((flags = fcntl (fileno (stream), F_GETFL, 0)) < 0)
+ return (EOF);
+ if (flags & O_NONBLOCK)
+ {
+ flags &= ~O_NONBLOCK;
+ fcntl (fileno (stream), F_SETFL, flags);
+ continue;
+ }
+ }
+#endif /* _POSIX_VERSION && EAGAIN && O_NONBLOCK */
+
+#if !defined (__GO32__)
+ /* If the error that we received was SIGINT, then try again,
+ this is simply an interrupted system call to read ().
+ Otherwise, some error ocurred, also signifying EOF. */
+ if (errno != EINTR)
+ return (EOF);
+#endif /* !__GO32__ */
+ }
+}
diff --git a/isearch.c b/isearch.c
index 1a0193f..9639a63 100644
--- a/isearch.c
+++ b/isearch.c
@@ -26,19 +26,28 @@
675 Mass Ave, Cambridge, MA 02139, USA. */
#define READLINE_LIBRARY
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
#include <stdio.h>
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
#endif
-#include "memalloc.h"
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif
+
+#include "rldefs.h"
#include "readline.h"
#include "history.h"
-#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0))
-#define STREQN(a, b, n) (((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0))
-
/* Variables imported from other files in the readline library. */
extern Keymap _rl_keymap;
extern HIST_ENTRY *saved_line_for_history;
@@ -46,6 +55,14 @@ extern int rl_line_buffer_len;
extern int rl_point, rl_end;
extern char *rl_line_buffer;
+extern void _rl_save_prompt ();
+extern void _rl_restore_prompt ();
+
+extern int rl_execute_next ();
+extern void rl_extend_line_buffer ();
+
+extern int _rl_input_available ();
+
extern char *xmalloc (), *xrealloc ();
static int rl_search_history ();
@@ -56,18 +73,18 @@ static char *prev_line_found;
/* Search backwards through the history looking for a string which is typed
interactively. Start with the current line. */
+int
rl_reverse_search_history (sign, key)
- int sign;
- int key;
+ int sign, key;
{
return (rl_search_history (-sign, key));
}
/* Search forwards through the history looking for a string which is typed
interactively. Start with the current line. */
+int
rl_forward_search_history (sign, key)
- int sign;
- int key;
+ int sign, key;
{
return (rl_search_history (sign, key));
}
@@ -83,29 +100,43 @@ rl_display_search (search_string, reverse_p, where)
int reverse_p, where;
{
char *message;
+ int msglen, searchlen;
- message = xmalloc (1 + (search_string ? strlen (search_string) : 0) + 30);
- *message = '\0';
+ searchlen = (search_string && *search_string) ? strlen (search_string) : 0;
+
+ message = xmalloc (searchlen + 33);
+ msglen = 0;
#if defined (NOTDEF)
if (where != -1)
- sprintf (message, "[%d]", where + history_base);
+ {
+ sprintf (message, "[%d]", where + history_base);
+ msglen = strlen (message);
+ }
#endif /* NOTDEF */
- strcat (message, "(");
+ message[msglen++] = '(';
if (reverse_p)
- strcat (message, "reverse-");
+ {
+ strcpy (message + msglen, "reverse-");
+ msglen += 8;
+ }
- strcat (message, "i-search)`");
+ strcpy (message + msglen, "i-search)`");
+ msglen += 10;
if (search_string)
- strcat (message, search_string);
+ {
+ strcpy (message + msglen, search_string);
+ msglen += searchlen;
+ }
+
+ strcpy (message + msglen, "': ");
- strcat (message, "': ");
rl_message ("%s", message, 0);
free (message);
- rl_redisplay ();
+ (*rl_redisplay_function) ();
}
/* Search through the history looking for an interactively typed string.
@@ -114,8 +145,7 @@ rl_display_search (search_string, reverse_p, where)
backwards. */
static int
rl_search_history (direction, invoking_key)
- int direction;
- int invoking_key;
+ int direction, invoking_key;
{
/* The string that the user types in to search for. */
char *search_string;
@@ -127,19 +157,17 @@ rl_search_history (direction, invoking_key)
int search_string_size;
/* The list of lines to search through. */
- char **lines, *allocated_line = (char *)NULL;
+ char **lines, *allocated_line;
/* The length of LINES. */
int hlen;
/* Where we get LINES from. */
- HIST_ENTRY **hlist = history_list ();
+ HIST_ENTRY **hlist;
- register int i = 0;
- int orig_point = rl_point;
- int orig_line = where_history ();
- int last_found_line = orig_line;
- int c, done = 0, found, failed, sline_len;
+ register int i;
+ int orig_point, orig_line, last_found_line;
+ int c, found, failed, sline_len;
/* The line currently being searched. */
char *sline;
@@ -148,10 +176,17 @@ rl_search_history (direction, invoking_key)
int line_index;
/* Non-zero if we are doing a reverse search. */
- int reverse = (direction < 0);
+ int reverse;
+
+ orig_point = rl_point;
+ last_found_line = orig_line = where_history ();
+ reverse = direction < 0;
+ hlist = history_list ();
+ allocated_line = (char *)NULL;
/* Create an arrary of pointers to the lines that we want to search. */
maybe_replace_line ();
+ i = 0;
if (hlist)
for (i = 0; hlist[i]; i++);
@@ -176,6 +211,8 @@ rl_search_history (direction, invoking_key)
/* The line where we start the search. */
i = orig_line;
+ _rl_save_prompt ();
+
/* Initialize search parameters. */
search_string = xmalloc (search_string_size = 128);
*search_string = '\0';
@@ -192,14 +229,13 @@ rl_search_history (direction, invoking_key)
line_index = rl_point;
found = failed = 0;
- while (!done)
+ for (;;)
{
Function *f = (Function *)NULL;
/* Read a key and decide how to proceed. */
c = rl_read_key ();
- /* Hack C to Do What I Mean. */
if (_rl_keymap[c].type == ISFUNC)
{
f = _rl_keymap[c].function;
@@ -210,78 +246,82 @@ rl_search_history (direction, invoking_key)
c = !reverse ? -1 : -2;
}
- switch (c)
+ /* Let NEWLINE (^J) terminate the search for people who don't like
+ using ESC. ^M can still be used to terminate the search and
+ immediately execute the command. */
+ if (c == ESC || c == NEWLINE)
+ {
+ /* ESC still terminates the search, but if there is pending
+ input or if input arrives within 0.1 seconds (on systems
+ with select(2)) it is used as a prefix character
+ with rl_execute_next. WATCH OUT FOR THIS! This is intended
+ to allow the arrow keys to be used like ^F and ^B are used
+ to terminate the search and execute the movement command. */
+ if (c == ESC && _rl_input_available ()) /* XXX */
+ rl_execute_next (ESC);
+ break;
+ }
+
+ if (c >= 0 && (CTRL_CHAR (c) || META_CHAR (c) || c == RUBOUT))
{
- case ESC:
- done = 1;
- continue;
+ rl_execute_next (c);
+ break;
+ }
+ switch (c)
+ {
case -1:
- if (!search_string_index)
+ if (search_string_index == 0)
continue;
+ else if (reverse)
+ --line_index;
+ else if (line_index != sline_len)
+ ++line_index;
else
- {
- if (reverse)
- --line_index;
- else
- {
- if (line_index != sline_len)
- ++line_index;
- else
- ding ();
- }
- }
+ ding ();
break;
/* switch directions */
case -2:
direction = -direction;
- reverse = (direction < 0);
+ reverse = direction < 0;
break;
case CTRL ('G'):
strcpy (rl_line_buffer, lines[orig_line]);
rl_point = orig_point;
rl_end = strlen (rl_line_buffer);
+ _rl_restore_prompt();
rl_clear_message ();
- free (allocated_line);
+ if (allocated_line)
+ free (allocated_line);
free (lines);
return 0;
default:
- if (CTRL_CHAR (c) || META_CHAR (c) || c == RUBOUT)
+ /* Add character to search string and continue search. */
+ if (search_string_index + 2 >= search_string_size)
{
- rl_execute_next (c);
- done = 1;
- continue;
- }
- else
- {
- /* Add character to search string and continue search. */
- if (search_string_index + 2 >= search_string_size)
- {
- search_string_size += 128;
- search_string = xrealloc (search_string, search_string_size);
- }
- search_string[search_string_index++] = c;
- search_string[search_string_index] = '\0';
- break;
+ search_string_size += 128;
+ search_string = xrealloc (search_string, search_string_size);
}
+ search_string[search_string_index++] = c;
+ search_string[search_string_index] = '\0';
+ break;
}
- found = failed = 0;
- while (1)
+ for (found = failed = 0;;)
{
int limit = sline_len - search_string_index + 1;
/* Search the current line. */
while (reverse ? (line_index >= 0) : (line_index < limit))
{
- if (STREQN(search_string, sline + line_index, search_string_index))
- {
- found++;
- break;
- }
+ if (STREQN (search_string, sline + line_index, search_string_index))
+ {
+ found++;
+ break;
+ }
else
line_index += direction;
}
@@ -314,10 +354,7 @@ rl_search_history (direction, invoking_key)
break;
/* Now set up the line for searching... */
- if (reverse)
- line_index = sline_len - search_string_index;
- else
- line_index = 0;
+ line_index = reverse ? sline_len - search_string_index : 0;
}
if (failed)
@@ -357,6 +394,8 @@ rl_search_history (direction, invoking_key)
/* First put back the original state. */
strcpy (rl_line_buffer, lines[orig_line]);
+ _rl_restore_prompt ();
+
/* Free the search string. */
free (search_string);
@@ -371,7 +410,8 @@ rl_search_history (direction, invoking_key)
rl_point = line_index;
rl_clear_message ();
- free (allocated_line);
+ if (allocated_line)
+ free (allocated_line);
free (lines);
return 0;
diff --git a/keymaps.c b/keymaps.c
index da59b69..9359749 100644
--- a/keymaps.c
+++ b/keymaps.c
@@ -20,6 +20,10 @@
Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define READLINE_LIBRARY
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
#if defined (HAVE_STDLIB_H)
# include <stdlib.h>
#else
@@ -37,11 +41,7 @@
extern int rl_do_lowercase_version ();
extern int rl_rubout (), rl_insert ();
-#if defined (STATIC_MALLOC)
-static char *xmalloc (), *xrealloc ();
-#else
extern char *xmalloc (), *xrealloc ();
-#endif /* STATIC_MALLOC */
/* **************************************************************** */
/* */
@@ -101,11 +101,11 @@ rl_make_keymap ()
newmap = rl_make_bare_keymap ();
/* All ASCII printing characters are self-inserting. */
- for (i = ' '; i < 126; i++)
+ for (i = ' '; i < 127; i++)
newmap[i].function = rl_insert;
newmap[TAB].function = rl_insert;
- newmap[RUBOUT].function = rl_rubout;
+ newmap[RUBOUT].function = rl_rubout; /* RUBOUT == 127 */
newmap[CTRL('H')].function = rl_rubout;
#if KEYMAP_SIZE > 128
@@ -148,49 +148,3 @@ rl_discard_keymap (map)
}
}
}
-
-#if defined (STATIC_MALLOC)
-
-/* **************************************************************** */
-/* */
-/* xmalloc and xrealloc () */
-/* */
-/* **************************************************************** */
-
-static void memory_error_and_abort ();
-
-static char *
-xmalloc (bytes)
- int bytes;
-{
- char *temp = (char *)malloc (bytes);
-
- if (!temp)
- memory_error_and_abort ();
- return (temp);
-}
-
-static char *
-xrealloc (pointer, bytes)
- char *pointer;
- int bytes;
-{
- char *temp;
-
- if (!pointer)
- temp = (char *)malloc (bytes);
- else
- temp = (char *)realloc (pointer, bytes);
-
- if (!temp)
- memory_error_and_abort ();
- return (temp);
-}
-
-static void
-memory_error_and_abort ()
-{
- fprintf (stderr, "readline: Out of virtual memory!\n");
- abort ();
-}
-#endif /* STATIC_MALLOC */
diff --git a/keymaps.h b/keymaps.h
index f0eda3d..f8d0e2e 100644
--- a/keymaps.h
+++ b/keymaps.h
@@ -29,8 +29,8 @@
# include <readline/chardefs.h>
#endif
-#if !defined (__FUNCTION_DEF)
-# define __FUNCTION_DEF
+#if !defined (_FUNCTION_DEF)
+# define _FUNCTION_DEF
typedef int Function ();
typedef void VFunction ();
typedef char *CPFunction ();
diff --git a/kill.c b/kill.c
new file mode 100644
index 0000000..352f37d
--- /dev/null
+++ b/kill.c
@@ -0,0 +1,552 @@
+/* kill.c -- kill ring management. */
+
+/* Copyright (C) 1994 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline Library 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.
+
+ The GNU Readline Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h> /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+extern int _rl_last_command_was_kill;
+extern int rl_editing_mode;
+extern int rl_explicit_arg;
+extern Function *rl_last_func;
+
+extern void _rl_init_argument ();
+extern int _rl_set_mark_at_pos ();
+extern void _rl_fix_point ();
+extern void _rl_abort_internal ();
+
+extern char *xmalloc (), *xrealloc ();
+
+/* **************************************************************** */
+/* */
+/* Killing Mechanism */
+/* */
+/* **************************************************************** */
+
+/* What we assume for a max number of kills. */
+#define DEFAULT_MAX_KILLS 10
+
+/* The real variable to look at to find out when to flush kills. */
+static int rl_max_kills = DEFAULT_MAX_KILLS;
+
+/* Where to store killed text. */
+static char **rl_kill_ring = (char **)NULL;
+
+/* Where we are in the kill ring. */
+static int rl_kill_index;
+
+/* How many slots we have in the kill ring. */
+static int rl_kill_ring_length;
+
+/* How to say that you only want to save a certain amount
+ of kill material. */
+int
+rl_set_retained_kills (num)
+ int num;
+{
+ return 0;
+}
+
+/* Add TEXT to the kill ring, allocating a new kill ring slot as necessary.
+ This uses TEXT directly, so the caller must not free it. If APPEND is
+ non-zero, and the last command was a kill, the text is appended to the
+ current kill ring slot, otherwise prepended. */
+static int
+_rl_copy_to_kill_ring (text, append)
+ char *text;
+ int append;
+{
+ char *old, *new;
+ int slot;
+
+ /* First, find the slot to work with. */
+ if (_rl_last_command_was_kill == 0)
+ {
+ /* Get a new slot. */
+ if (rl_kill_ring == 0)
+ {
+ /* If we don't have any defined, then make one. */
+ rl_kill_ring = (char **)
+ xmalloc (((rl_kill_ring_length = 1) + 1) * sizeof (char *));
+ rl_kill_ring[slot = 0] = (char *)NULL;
+ }
+ else
+ {
+ /* We have to add a new slot on the end, unless we have
+ exceeded the max limit for remembering kills. */
+ slot = rl_kill_ring_length;
+ if (slot == rl_max_kills)
+ {
+ register int i;
+ free (rl_kill_ring[0]);
+ for (i = 0; i < slot; i++)
+ rl_kill_ring[i] = rl_kill_ring[i + 1];
+ }
+ else
+ {
+ slot = rl_kill_ring_length += 1;
+ rl_kill_ring = (char **)xrealloc (rl_kill_ring, slot * sizeof (char *));
+ }
+ rl_kill_ring[--slot] = (char *)NULL;
+ }
+ }
+ else
+ slot = rl_kill_ring_length - 1;
+
+ /* If the last command was a kill, prepend or append. */
+ if (_rl_last_command_was_kill && rl_editing_mode != vi_mode)
+ {
+ old = rl_kill_ring[slot];
+ new = xmalloc (1 + strlen (old) + strlen (text));
+
+ if (append)
+ {
+ strcpy (new, old);
+ strcat (new, text);
+ }
+ else
+ {
+ strcpy (new, text);
+ strcat (new, old);
+ }
+ free (old);
+ free (text);
+ rl_kill_ring[slot] = new;
+ }
+ else
+ rl_kill_ring[slot] = text;
+
+ rl_kill_index = slot;
+ return 0;
+}
+
+/* The way to kill something. This appends or prepends to the last
+ kill, if the last command was a kill command. if FROM is less
+ than TO, then the text is appended, otherwise prepended. If the
+ last command was not a kill command, then a new slot is made for
+ this kill. */
+int
+rl_kill_text (from, to)
+ int from, to;
+{
+ char *text;
+
+ /* Is there anything to kill? */
+ if (from == to)
+ {
+ _rl_last_command_was_kill++;
+ return 0;
+ }
+
+ text = rl_copy_text (from, to);
+
+ /* Delete the copied text from the line. */
+ rl_delete_text (from, to);
+
+ _rl_copy_to_kill_ring (text, from < to);
+
+ _rl_last_command_was_kill++;
+ return 0;
+}
+
+/* Now REMEMBER! In order to do prepending or appending correctly, kill
+ commands always make rl_point's original position be the FROM argument,
+ and rl_point's extent be the TO argument. */
+
+/* **************************************************************** */
+/* */
+/* Killing Commands */
+/* */
+/* **************************************************************** */
+
+/* Delete the word at point, saving the text in the kill ring. */
+int
+rl_kill_word (count, key)
+ int count, key;
+{
+ int orig_point = rl_point;
+
+ if (count < 0)
+ return (rl_backward_kill_word (-count, key));
+ else
+ {
+ rl_forward_word (count, key);
+
+ if (rl_point != orig_point)
+ rl_kill_text (orig_point, rl_point);
+
+ rl_point = orig_point;
+ }
+ return 0;
+}
+
+/* Rubout the word before point, placing it on the kill ring. */
+int
+rl_backward_kill_word (count, ignore)
+ int count, ignore;
+{
+ int orig_point = rl_point;
+
+ if (count < 0)
+ return (rl_kill_word (-count, ignore));
+ else
+ {
+ rl_backward_word (count, ignore);
+
+ if (rl_point != orig_point)
+ rl_kill_text (orig_point, rl_point);
+ }
+ return 0;
+}
+
+/* Kill from here to the end of the line. If DIRECTION is negative, kill
+ back to the line start instead. */
+int
+rl_kill_line (direction, ignore)
+ int direction, ignore;
+{
+ int orig_point = rl_point;
+
+ if (direction < 0)
+ return (rl_backward_kill_line (1, ignore));
+ else
+ {
+ rl_end_of_line (1, ignore);
+ if (orig_point != rl_point)
+ rl_kill_text (orig_point, rl_point);
+ rl_point = orig_point;
+ }
+ return 0;
+}
+
+/* Kill backwards to the start of the line. If DIRECTION is negative, kill
+ forwards to the line end instead. */
+int
+rl_backward_kill_line (direction, ignore)
+ int direction, ignore;
+{
+ int orig_point = rl_point;
+
+ if (direction < 0)
+ return (rl_kill_line (1, ignore));
+ else
+ {
+ if (!rl_point)
+ ding ();
+ else
+ {
+ rl_beg_of_line (1, ignore);
+ rl_kill_text (orig_point, rl_point);
+ }
+ }
+ return 0;
+}
+
+/* Kill the whole line, no matter where point is. */
+int
+rl_kill_full_line (count, ignore)
+ int count, ignore;
+{
+ rl_begin_undo_group ();
+ rl_point = 0;
+ rl_kill_text (rl_point, rl_end);
+ rl_end_undo_group ();
+ return 0;
+}
+
+/* The next two functions mimic unix line editing behaviour, except they
+ save the deleted text on the kill ring. This is safer than not saving
+ it, and since we have a ring, nobody should get screwed. */
+
+/* This does what C-w does in Unix. We can't prevent people from
+ using behaviour that they expect. */
+int
+rl_unix_word_rubout (count, key)
+ int count, key;
+{
+ int orig_point;
+
+ if (rl_point == 0)
+ ding ();
+ else
+ {
+ orig_point = rl_point;
+ if (count <= 0)
+ count = 1;
+
+ while (count--)
+ {
+ while (rl_point && whitespace (rl_line_buffer[rl_point - 1]))
+ rl_point--;
+
+ while (rl_point && (whitespace (rl_line_buffer[rl_point - 1]) == 0))
+ rl_point--;
+ }
+
+ rl_kill_text (orig_point, rl_point);
+ }
+ return 0;
+}
+
+/* Here is C-u doing what Unix does. You don't *have* to use these
+ key-bindings. We have a choice of killing the entire line, or
+ killing from where we are to the start of the line. We choose the
+ latter, because if you are a Unix weenie, then you haven't backspaced
+ into the line at all, and if you aren't, then you know what you are
+ doing. */
+int
+rl_unix_line_discard (count, key)
+ int count, key;
+{
+ if (rl_point == 0)
+ ding ();
+ else
+ {
+ rl_kill_text (rl_point, 0);
+ rl_point = 0;
+ }
+ return 0;
+}
+
+/* Copy the text in the `region' to the kill ring. If DELETE is non-zero,
+ delete the text from the line as well. */
+static int
+region_kill_internal (delete)
+ int delete;
+{
+ char *text;
+
+ if (rl_mark == rl_point)
+ {
+ _rl_last_command_was_kill++;
+ return 0;
+ }
+
+ text = rl_copy_text (rl_point, rl_mark);
+ if (delete)
+ rl_delete_text (rl_point, rl_mark);
+ _rl_copy_to_kill_ring (text, rl_point < rl_mark);
+
+ _rl_last_command_was_kill++;
+ return 0;
+}
+
+/* Copy the text in the region to the kill ring. */
+int
+rl_copy_region_to_kill (count, ignore)
+ int count, ignore;
+{
+ return (region_kill_internal (0));
+}
+
+/* Kill the text between the point and mark. */
+int
+rl_kill_region (count, ignore)
+ int count, ignore;
+{
+ int r;
+
+ r = region_kill_internal (1);
+ _rl_fix_point (1);
+ return r;
+}
+
+/* Copy COUNT words to the kill ring. DIR says which direction we look
+ to find the words. */
+static int
+_rl_copy_word_as_kill (count, dir)
+ int count, dir;
+{
+ int om, op, r;
+
+ om = rl_mark;
+ op = rl_point;
+
+ if (dir > 0)
+ rl_forward_word (count, 0);
+ else
+ rl_backward_word (count, 0);
+
+ rl_mark = rl_point;
+
+ if (dir > 0)
+ rl_backward_word (count, 0);
+ else
+ rl_forward_word (count, 0);
+
+ r = region_kill_internal (0);
+
+ rl_mark = om;
+ rl_point = op;
+
+ return r;
+}
+
+int
+rl_copy_forward_word (count, key)
+ int count, key;
+{
+ if (count < 0)
+ return (rl_copy_backward_word (-count, key));
+
+ return (_rl_copy_word_as_kill (count, 1));
+}
+
+int
+rl_copy_backward_word (count, key)
+ int count, key;
+{
+ if (count < 0)
+ return (rl_copy_forward_word (-count, key));
+
+ return (_rl_copy_word_as_kill (count, -1));
+}
+
+/* Yank back the last killed text. This ignores arguments. */
+int
+rl_yank (count, ignore)
+ int count, ignore;
+{
+ if (rl_kill_ring == 0)
+ {
+ _rl_abort_internal ();
+ return -1;
+ }
+
+ _rl_set_mark_at_pos (rl_point);
+ rl_insert_text (rl_kill_ring[rl_kill_index]);
+ return 0;
+}
+
+/* If the last command was yank, or yank_pop, and the text just
+ before point is identical to the current kill item, then
+ delete that text from the line, rotate the index down, and
+ yank back some other text. */
+int
+rl_yank_pop (count, key)
+ int count, key;
+{
+ int l, n;
+
+ if (((rl_last_func != rl_yank_pop) && (rl_last_func != rl_yank)) ||
+ !rl_kill_ring)
+ {
+ _rl_abort_internal ();
+ return -1;
+ }
+
+ l = strlen (rl_kill_ring[rl_kill_index]);
+ n = rl_point - l;
+ if (n >= 0 && STREQN (rl_line_buffer + n, rl_kill_ring[rl_kill_index], l))
+ {
+ rl_delete_text (n, rl_point);
+ rl_point = n;
+ rl_kill_index--;
+ if (rl_kill_index < 0)
+ rl_kill_index = rl_kill_ring_length - 1;
+ rl_yank (1, 0);
+ return 0;
+ }
+ else
+ {
+ _rl_abort_internal ();
+ return -1;
+ }
+}
+
+/* Yank the COUNTth argument from the previous history line. */
+int
+rl_yank_nth_arg (count, ignore)
+ int count, ignore;
+{
+ register HIST_ENTRY *entry;
+ char *arg;
+
+ entry = previous_history ();
+ if (entry)
+ next_history ();
+ else
+ {
+ ding ();
+ return -1;
+ }
+
+ arg = history_arg_extract (count, count, entry->line);
+ if (!arg || !*arg)
+ {
+ ding ();
+ return -1;
+ }
+
+ rl_begin_undo_group ();
+
+#if defined (VI_MODE)
+ /* Vi mode always inserts a space before yanking the argument, and it
+ inserts it right *after* rl_point. */
+ if (rl_editing_mode == vi_mode)
+ {
+ rl_vi_append_mode (1, ignore);
+ rl_insert_text (" ");
+ }
+#endif /* VI_MODE */
+
+ rl_insert_text (arg);
+ free (arg);
+
+ rl_end_undo_group ();
+ return 0;
+}
+
+/* Yank the last argument from the previous history line. This `knows'
+ how rl_yank_nth_arg treats a count of `$'. With an argument, this
+ behaves the same as rl_yank_nth_arg. */
+int
+rl_yank_last_arg (count, key)
+ int count, key;
+{
+ if (rl_explicit_arg)
+ return (rl_yank_nth_arg (count, key));
+ else
+ return (rl_yank_nth_arg ('$', key));
+}
diff --git a/macro.c b/macro.c
new file mode 100644
index 0000000..f3c442b
--- /dev/null
+++ b/macro.c
@@ -0,0 +1,277 @@
+/* macro.c -- keyboard macros for readline. */
+
+/* Copyright (C) 1994 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline Library 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.
+
+ The GNU Readline Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h> /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
+
+/* Forward definitions. */
+void _rl_push_executing_macro (), _rl_pop_executing_macro ();
+void _rl_add_macro_char ();
+
+/* Extern declarations. */
+extern int rl_explicit_arg;
+extern int rl_key_sequence_length;
+
+extern void _rl_abort_internal ();
+
+extern char *xmalloc (), *xrealloc ();
+
+/* **************************************************************** */
+/* */
+/* Hacking Keyboard Macros */
+/* */
+/* **************************************************************** */
+
+/* Non-zero means to save keys that we dispatch on in a kbd macro. */
+int _rl_defining_kbd_macro = 0;
+
+/* The currently executing macro string. If this is non-zero,
+ then it is a malloc ()'ed string where input is coming from. */
+char *_rl_executing_macro = (char *)NULL;
+
+/* The offset in the above string to the next character to be read. */
+static int executing_macro_index;
+
+/* The current macro string being built. Characters get stuffed
+ in here by add_macro_char (). */
+static char *current_macro = (char *)NULL;
+
+/* The size of the buffer allocated to current_macro. */
+static int current_macro_size;
+
+/* The index at which characters are being added to current_macro. */
+static int current_macro_index;
+
+/* A structure used to save nested macro strings.
+ It is a linked list of string/index for each saved macro. */
+struct saved_macro {
+ struct saved_macro *next;
+ char *string;
+ int sindex;
+};
+
+/* The list of saved macros. */
+static struct saved_macro *macro_list = (struct saved_macro *)NULL;
+
+/* Set up to read subsequent input from STRING.
+ STRING is free ()'ed when we are done with it. */
+void
+_rl_with_macro_input (string)
+ char *string;
+{
+ _rl_push_executing_macro ();
+ _rl_executing_macro = string;
+ executing_macro_index = 0;
+}
+
+/* Return the next character available from a macro, or 0 if
+ there are no macro characters. */
+int
+_rl_next_macro_key ()
+{
+ if (_rl_executing_macro == 0)
+ return (0);
+
+ if (_rl_executing_macro[executing_macro_index] == 0)
+ {
+ _rl_pop_executing_macro ();
+ return (_rl_next_macro_key ());
+ }
+
+ return (_rl_executing_macro[executing_macro_index++]);
+}
+
+/* Save the currently executing macro on a stack of saved macros. */
+void
+_rl_push_executing_macro ()
+{
+ struct saved_macro *saver;
+
+ saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro));
+ saver->next = macro_list;
+ saver->sindex = executing_macro_index;
+ saver->string = _rl_executing_macro;
+
+ macro_list = saver;
+}
+
+/* Discard the current macro, replacing it with the one
+ on the top of the stack of saved macros. */
+void
+_rl_pop_executing_macro ()
+{
+ struct saved_macro *macro;
+
+ if (_rl_executing_macro)
+ free (_rl_executing_macro);
+
+ _rl_executing_macro = (char *)NULL;
+ executing_macro_index = 0;
+
+ if (macro_list)
+ {
+ macro = macro_list;
+ _rl_executing_macro = macro_list->string;
+ executing_macro_index = macro_list->sindex;
+ macro_list = macro_list->next;
+ free (macro);
+ }
+}
+
+/* Add a character to the macro being built. */
+void
+_rl_add_macro_char (c)
+ int c;
+{
+ if (current_macro_index + 1 >= current_macro_size)
+ {
+ if (current_macro == 0)
+ current_macro = xmalloc (current_macro_size = 25);
+ else
+ current_macro = xrealloc (current_macro, current_macro_size += 25);
+ }
+
+ current_macro[current_macro_index++] = c;
+ current_macro[current_macro_index] = '\0';
+}
+
+void
+_rl_kill_kbd_macro ()
+{
+ if (current_macro)
+ {
+ free (current_macro);
+ current_macro = (char *) NULL;
+ }
+ current_macro_size = current_macro_index = 0;
+
+ if (_rl_executing_macro)
+ {
+ free (_rl_executing_macro);
+ _rl_executing_macro = (char *) NULL;
+ }
+ executing_macro_index = 0;
+
+ _rl_defining_kbd_macro = 0;
+}
+
+/* Begin defining a keyboard macro.
+ Keystrokes are recorded as they are executed.
+ End the definition with rl_end_kbd_macro ().
+ If a numeric argument was explicitly typed, then append this
+ definition to the end of the existing macro, and start by
+ re-executing the existing macro. */
+int
+rl_start_kbd_macro (ignore1, ignore2)
+ int ignore1, ignore2;
+{
+ if (_rl_defining_kbd_macro)
+ {
+ _rl_abort_internal ();
+ return -1;
+ }
+
+ if (rl_explicit_arg)
+ {
+ if (current_macro)
+ _rl_with_macro_input (savestring (current_macro));
+ }
+ else
+ current_macro_index = 0;
+
+ _rl_defining_kbd_macro = 1;
+ return 0;
+}
+
+/* Stop defining a keyboard macro.
+ A numeric argument says to execute the macro right now,
+ that many times, counting the definition as the first time. */
+int
+rl_end_kbd_macro (count, ignore)
+ int count, ignore;
+{
+ if (_rl_defining_kbd_macro == 0)
+ {
+ _rl_abort_internal ();
+ return -1;
+ }
+
+ current_macro_index -= rl_key_sequence_length - 1;
+ current_macro[current_macro_index] = '\0';
+
+ _rl_defining_kbd_macro = 0;
+
+ return (rl_call_last_kbd_macro (--count, 0));
+}
+
+/* Execute the most recently defined keyboard macro.
+ COUNT says how many times to execute it. */
+int
+rl_call_last_kbd_macro (count, ignore)
+ int count, ignore;
+{
+ if (current_macro == 0)
+ _rl_abort_internal ();
+
+ if (_rl_defining_kbd_macro)
+ {
+ ding (); /* no recursive macros */
+ current_macro[--current_macro_index] = '\0'; /* erase this char */
+ return 0;
+ }
+
+ while (count--)
+ _rl_with_macro_input (savestring (current_macro));
+ return 0;
+}
+
+void
+rl_push_macro_input (macro)
+ char *macro;
+{
+ _rl_with_macro_input (macro);
+}
diff --git a/nls.c b/nls.c
new file mode 100644
index 0000000..7a00a5f
--- /dev/null
+++ b/nls.c
@@ -0,0 +1,227 @@
+/* nls.c -- skeletal internationalization code. */
+
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline Library 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.
+
+ The GNU Readline Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_LOCALE_H)
+# include <locale.h>
+#endif
+
+#include <ctype.h>
+
+#include "rldefs.h"
+
+extern int _rl_convert_meta_chars_to_ascii;
+extern int _rl_output_meta_chars;
+extern int _rl_meta_flag;
+
+/* Functions imported from shell.c */
+extern char *get_env_value ();
+
+#if !defined (HAVE_SETLOCALE)
+/* A list of legal values for the LANG or LC_CTYPE environment variables.
+ If a locale name in this list is the value for the LC_ALL, LC_CTYPE,
+ or LANG environment variable (using the first of those with a value),
+ readline eight-bit mode is enabled. */
+static char *legal_lang_values[] =
+{
+ "iso88591",
+ "iso88592",
+ "iso88593",
+ "iso88594",
+ "iso88595",
+ "iso88596",
+ "iso88597",
+ "iso88598",
+ "iso88599",
+ "iso885910",
+ "koi8r",
+ 0
+};
+
+static char *normalize_codeset ();
+static char *find_codeset ();
+#endif /* !HAVE_SETLOCALE */
+
+/* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value
+ to decide the defaults for 8-bit character input and output. Returns
+ 1 if we set eight-bit mode. */
+int
+_rl_init_eightbit ()
+{
+/* If we have setlocale(3), just check the current LC_CTYPE category
+ value, and go into eight-bit mode if it's not C or POSIX. */
+#if defined (HAVE_SETLOCALE)
+ char *t;
+
+ /* Set the LC_CTYPE locale category from environment variables. */
+ t = setlocale (LC_CTYPE, "");
+ if (t && *t && (t[0] != 'C' || t[1]) && (STREQ (t, "POSIX") == 0))
+ {
+ _rl_meta_flag = 1;
+ _rl_convert_meta_chars_to_ascii = 0;
+ _rl_output_meta_chars = 1;
+ return (1);
+ }
+ else
+ return (0);
+
+#else /* !HAVE_SETLOCALE */
+ char *lspec, *t;
+ int i;
+
+ /* We don't have setlocale. Finesse it. Check the environment for the
+ appropriate variables and set eight-bit mode if they have the right
+ values. */
+ lspec = get_env_value ("LC_ALL");
+ if (lspec == 0) lspec = get_env_value ("LC_CTYPE");
+ if (lspec == 0) lspec = get_env_value ("LANG");
+ if (lspec == 0 || (t = normalize_codeset (lspec)) == 0)
+ return (0);
+ for (i = 0; t && legal_lang_values[i]; i++)
+ if (STREQ (t, legal_lang_values[i]))
+ {
+ _rl_meta_flag = 1;
+ _rl_convert_meta_chars_to_ascii = 0;
+ _rl_output_meta_chars = 1;
+ break;
+ }
+ free (t);
+ return (legal_lang_values[i] ? 1 : 0);
+
+#endif /* !HAVE_SETLOCALE */
+}
+
+#if !defined (HAVE_SETLOCALE)
+static char *
+normalize_codeset (codeset)
+ char *codeset;
+{
+ size_t namelen, i;
+ int len, all_digits;
+ char *wp, *retval;
+
+ codeset = find_codeset (codeset, &namelen);
+
+ if (codeset == 0)
+ return (codeset);
+
+ all_digits = 1;
+ for (len = 0, i = 0; i < namelen; i++)
+ {
+ if (isalnum (codeset[i]))
+ {
+ len++;
+ all_digits &= isdigit (codeset[i]);
+ }
+ }
+
+ retval = (char *)malloc ((all_digits ? 3 : 0) + len + 1);
+ if (retval == 0)
+ return ((char *)0);
+
+ wp = retval;
+ /* Add `iso' to beginning of an all-digit codeset */
+ if (all_digits)
+ {
+ *wp++ = 'i';
+ *wp++ = 's';
+ *wp++ = 'o';
+ }
+
+ for (i = 0; i < namelen; i++)
+ if (isalpha (codeset[i]))
+ *wp++ = (isupper (codeset[i])) ? tolower (codeset[i]) : codeset[i];
+ else if (isdigit (codeset[i]))
+ *wp++ = codeset[i];
+ *wp = '\0';
+
+ return retval;
+}
+
+/* Isolate codeset portion of locale specification. */
+static char *
+find_codeset (name, lenp)
+ char *name;
+ size_t *lenp;
+{
+ char *cp, *language, *result;
+
+ cp = language = name;
+ result = (char *)0;
+
+ while (*cp && *cp != '_' && *cp != '@' && *cp != '+' && *cp != ',')
+ cp++;
+
+ /* This does not make sense: language has to be specified. As
+ an exception we allow the variable to contain only the codeset
+ name. Perhaps there are funny codeset names. */
+ if (language == cp)
+ {
+ *lenp = strlen (language);
+ result = language;
+ }
+ else
+ {
+ /* Next is the territory. */
+ if (*cp == '_')
+ do
+ ++cp;
+ while (*cp && *cp != '.' && *cp != '@' && *cp != '+' && *cp != ',' && *cp != '_');
+
+ /* Now, finally, is the codeset. */
+ result = cp;
+ if (*cp == '.')
+ do
+ ++cp;
+ while (*cp && *cp != '@');
+
+ if (cp - result > 2)
+ {
+ result++;
+ *lenp = cp - result;
+ }
+ else
+ {
+ *lenp = strlen (language);
+ result = language;
+ }
+ }
+
+ return result;
+}
+#endif /* !HAVE_SETLOCALE */
diff --git a/parens.c b/parens.c
index 57a9777..50683f9 100644
--- a/parens.c
+++ b/parens.c
@@ -1,4 +1,4 @@
-/* parens.c -- Implemenation of matching parenthesis feature. */
+/* parens.c -- Implementation of matching parentheses feature. */
/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
@@ -24,7 +24,9 @@
#include "rlconf.h"
#if !defined (PAREN_MATCHING)
+extern int rl_insert ();
+int
rl_insert_close (count, invoking_key)
int count, invoking_key;
{
@@ -33,25 +35,49 @@ rl_insert_close (count, invoking_key)
#else /* PAREN_MATCHING */
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
#include <stdio.h>
#include <sys/types.h>
-#if defined (FD_SET)
+
+#if defined (FD_SET) && !defined (HAVE_SELECT)
+# define HAVE_SELECT
+#endif
+
+#if defined (HAVE_SELECT)
# include <sys/time.h>
-#endif /* FD_SET */
+#endif /* HAVE_SELECT */
+#if defined (HAVE_SYS_SELECT_H)
+# include <sys/select.h>
+#endif
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else /* !HAVE_STRING_H */
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strchr (), *strrchr ();
+#endif /* !strchr && !__STDC__ */
+
#include "readline.h"
extern int rl_explicit_arg;
/* Non-zero means try to blink the matching open parenthesis when the
close parenthesis is inserted. */
-#if defined (FD_SET)
+#if defined (HAVE_SELECT)
int rl_blink_matching_paren = 1;
-#else /* !FD_SET */
+#else /* !HAVE_SELECT */
int rl_blink_matching_paren = 0;
-#endif /* !FD_SET */
+#endif /* !HAVE_SELECT */
static int find_matching_open ();
+int
rl_insert_close (count, invoking_key)
int count, invoking_key;
{
@@ -59,13 +85,13 @@ rl_insert_close (count, invoking_key)
rl_insert (count, invoking_key);
else
{
-#if defined (FD_SET)
+#if defined (HAVE_SELECT)
int orig_point, match_point, ready;
struct timeval timer;
fd_set readfds;
rl_insert (1, invoking_key);
- rl_redisplay ();
+ (*rl_redisplay_function) ();
match_point =
find_matching_open (rl_line_buffer, rl_point - 2, invoking_key);
@@ -80,12 +106,12 @@ rl_insert_close (count, invoking_key)
orig_point = rl_point;
rl_point = match_point;
- rl_redisplay ();
+ (*rl_redisplay_function) ();
ready = select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer);
rl_point = orig_point;
-#else /* !FD_SET */
+#else /* !HAVE_SELECT */
rl_insert (count, invoking_key);
-#endif /* !FD_SET */
+#endif /* !HAVE_SELECT */
}
return 0;
}
@@ -114,8 +140,8 @@ find_matching_open (string, from, closer)
{
if (delimiter && (string[i] == delimiter))
delimiter = 0;
- else if ((string[i] == '\'') || (string[i] == '"'))
- delimiter = rl_line_buffer[i];
+ else if (rl_basic_quote_characters && strchr (rl_basic_quote_characters, string[i]))
+ delimiter = string[i];
else if (!delimiter && (string[i] == closer))
level++;
else if (!delimiter && (string[i] == opener))
diff --git a/posixdir.h b/posixdir.h
new file mode 100644
index 0000000..7480a93
--- /dev/null
+++ b/posixdir.h
@@ -0,0 +1,49 @@
+/* posixdir.h -- Posix directory reading includes and defines. */
+
+/* Copyright (C) 1987,1991 Free Software Foundation, Inc.
+
+ This file is part of GNU Bash, the Bourne Again SHell.
+
+ Bash 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.
+
+ Bash 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 Bash; see the file COPYING. If not, write to the Free
+ Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* This file should be included instead of <dirent.h> or <sys/dir.h>. */
+
+#if !defined (_POSIXDIR_H_)
+#define _POSIXDIR_H_
+
+#if defined (HAVE_DIRENT_H)
+# include <dirent.h>
+# define D_NAMLEN(d) (strlen ((d)->d_name))
+#else
+# if defined (HAVE_SYS_NDIR_H)
+# include <sys/ndir.h>
+# endif
+# if defined (HAVE_SYS_DIR_H)
+# include <sys/dir.h>
+# endif
+# if defined (HAVE_NDIR_H)
+# include <ndir.h>
+# endif
+# if !defined (dirent)
+# define dirent direct
+# endif /* !dirent */
+# define D_NAMLEN(d) ((d)->d_namlen)
+#endif /* !HAVE_DIRENT_H */
+
+#if defined (STRUCT_DIRENT_HAS_D_INO) && !defined (STRUCT_DIRENT_HAS_D_FILENO)
+# define d_fileno d_ino
+#endif
+
+#endif /* !_POSIXDIR_H_ */
diff --git a/posixjmp.h b/posixjmp.h
new file mode 100644
index 0000000..8703d17
--- /dev/null
+++ b/posixjmp.h
@@ -0,0 +1,20 @@
+/* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */
+
+#ifndef _POSIXJMP_H_
+#define _POSIXJMP_H_
+
+#include <setjmp.h>
+
+/* This *must* be included *after* config.h */
+
+#if defined (HAVE_POSIX_SIGSETJMP)
+# define procenv_t sigjmp_buf
+# undef setjmp
+# define setjmp(x) sigsetjmp((x), 1)
+# undef longjmp
+# define longjmp(x, n) siglongjmp((x), (n))
+#else
+# define procenv_t jmp_buf
+#endif
+
+#endif /* _POSIXJMP_H_ */
diff --git a/posixstat.h b/posixstat.h
index 7d1cece..bfce8c0 100644
--- a/posixstat.h
+++ b/posixstat.h
@@ -21,34 +21,27 @@
/* This file should be included instead of <sys/stat.h>.
It relies on the local sys/stat.h to work though. */
-#if !defined (_POSIXSTAT_H)
-#define _POSIXSTAT_H
+#if !defined (_POSIXSTAT_H_)
+#define _POSIXSTAT_H_
#include <sys/stat.h>
-#if defined (isc386)
-# if !defined (S_IFDIR)
-# define S_IFDIR 0040000
-# endif /* !S_IFDIR */
-# if !defined (S_IFMT)
-# define S_IFMT 0170000
-# endif /* !S_IFMT */
-#endif /* isc386 */
-
-/* This text is taken directly from the Cadmus I was trying to
- compile on:
- the following MACROs are defined for X/OPEN compatibility
- however, is the param correct ??
- #define S_ISBLK(s) ((s.st_mode & S_IFMT) == S_IFBLK)
-
- Well, the answer is no. Thus... */
-#if defined (BrainDeath)
+#if defined (STAT_MACROS_BROKEN)
# undef S_ISBLK
# undef S_ISCHR
# undef S_ISDIR
# undef S_ISFIFO
# undef S_ISREG
-#endif /* BrainDeath */
+# undef S_ISLNK
+#endif /* STAT_MACROS_BROKEN */
+
+/* These are guaranteed to work only on isc386 */
+#if !defined (S_IFDIR) && !defined (S_ISDIR)
+# define S_IFDIR 0040000
+#endif /* !S_IFDIR && !S_ISDIR */
+#if !defined (S_IFMT)
+# define S_IFMT 0170000
+#endif /* !S_IFMT */
/* Posix 1003.1 5.6.1.1 <sys/stat.h> file types */
@@ -114,7 +107,7 @@
/*
* POSIX 1003.1 5.6.1.2 <sys/stat.h> File Modes
*/
-
+
#if !defined (S_IRWXU)
# if !defined (S_IREAD)
# define S_IREAD 00400
@@ -146,4 +139,4 @@
#define S_IWUGO (S_IWUSR | S_IWGRP | S_IWOTH)
#define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
-#endif /* _POSIXSTAT_H */
+#endif /* _POSIXSTAT_H_ */
diff --git a/readline.c b/readline.c
index e15a037..dcd8f81 100644
--- a/readline.c
+++ b/readline.c
@@ -22,13 +22,16 @@
675 Mass Ave, Cambridge, MA 02139, USA. */
#define READLINE_LIBRARY
-#include <stdio.h>
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
#include <sys/types.h>
+#include "posixstat.h"
#include <fcntl.h>
-#if !defined (NO_SYS_FILE)
+#if defined (HAVE_SYS_FILE_H)
# include <sys/file.h>
-#endif /* !NO_SYS_FILE */
-#include <signal.h>
+#endif /* HAVE_SYS_FILE_H */
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
@@ -40,41 +43,80 @@
# include "ansi_stdlib.h"
#endif /* HAVE_STDLIB_H */
-#include <errno.h>
-/* Not all systems declare ERRNO in errno.h... and some systems #define it! */
-#if !defined (errno)
-extern int errno;
-#endif /* !errno */
-
-#include <setjmp.h>
+#if defined (HAVE_LOCALE_H)
+# include <locale.h>
+#endif
-#include "posixstat.h"
+#include <signal.h>
+#include <stdio.h>
+#include "posixjmp.h"
/* System-specific feature definitions and include files. */
#include "rldefs.h"
-#if defined (GWINSZ_IN_SYS_IOCTL) || (defined (VSTATUS) && !defined (SunOS4))
-# include <sys/ioctl.h>
-#endif /* GWINSZ_IN_SYS_IOCTL || VSTATUS */
+#if defined (__EMX__)
+# define INCL_DOSPROCESS
+# include <os2.h>
+#endif /* __EMX__ */
/* Some standard library routines. */
#include "readline.h"
#include "history.h"
+#ifndef RL_LIBRARY_VERSION
+# define RL_LIBRARY_VERSION "2.1-bash"
+#endif
+
+/* Evaluates its arguments multiple times. */
+#define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
+
/* NOTE: Functions and variables prefixed with `_rl_' are
pseudo-global: they are global so they can be shared
between files in the readline library, but are not intended
to be visible to readline callers. */
-/* Functions imported from other files in the library. */
-extern char *tgetstr ();
+/* Variables and functions imported from terminal.c */
+extern int _rl_init_terminal_io ();
+extern void _rl_enable_meta_key ();
+extern int _rl_output_character_function ();
+extern void _rl_get_screen_size ();
+
+extern int _rl_enable_meta;
+extern int _rl_term_autowrap;
+extern int screenwidth, screenheight, screenchars;
+
+/* Variables and functions imported from rltty.c. */
extern void rl_prep_terminal (), rl_deprep_terminal ();
+extern void rltty_set_default_bindings ();
+/* Functions imported from util.c. */
+extern void _rl_abort_internal ();
+extern void rl_extend_line_buffer ();
+extern int alphabetic ();
+
+/* Functions imported from bind.c. */
extern void _rl_bind_if_unbound ();
+extern int rl_set_keymap_from_edit_mode ();
+
+/* Functions imported from input.c. */
+extern int _rl_any_typein ();
+extern void _rl_insert_typein ();
+extern int rl_read_key ();
+
+/* Functions imported from nls.c */
+extern int _rl_init_eightbit ();
+
+/* Functions imported from shell.c */
+extern char *get_env_value ();
/* External redisplay functions and variables from display.c */
extern void _rl_move_vert ();
extern void _rl_update_final ();
+extern void _rl_clear_to_eol ();
+extern void _rl_clear_screen ();
+
+extern void _rl_save_prompt ();
+extern void _rl_restore_prompt ();
extern void _rl_erase_at_end_of_line ();
extern void _rl_move_cursor_relative ();
@@ -83,6 +125,7 @@ extern int _rl_vis_botlin;
extern int _rl_last_c_pos;
extern int _rl_horizontal_scroll_mode;
extern int rl_display_fixed;
+extern int _rl_suppress_redisplay;
extern char *rl_display_prompt;
/* Variables imported from complete.c. */
@@ -91,22 +134,32 @@ extern char *rl_basic_word_break_characters;
extern int rl_completion_query_items;
extern int rl_complete_with_tilde_expansion;
+/* Variables and functions from macro.c. */
+extern void _rl_add_macro_char ();
+extern void _rl_with_macro_input ();
+extern int _rl_next_macro_key ();
+extern int _rl_defining_kbd_macro;
+
#if defined (VI_MODE)
+/* Functions imported from vi_mode.c. */
extern void _rl_vi_set_last ();
extern void _rl_vi_reset_last ();
extern void _rl_vi_done_inserting ();
+extern int _rl_vi_textmod_command ();
+extern void _rl_vi_initialize_line ();
#endif /* VI_MODE */
+extern UNDO_LIST *rl_undo_list;
+extern int _rl_doing_an_undo;
+
/* Forward declarations used in this file. */
void _rl_free_history_entry ();
int _rl_dispatch ();
-void _rl_set_screen_size ();
-int _rl_output_character_function ();
+int _rl_init_argument ();
static char *readline_internal ();
static void readline_initialize_everything ();
-static int init_terminal_io ();
static void start_using_history ();
static void bind_arrow_keys ();
@@ -115,24 +168,20 @@ static void readline_default_bindings ();
#endif /* !__GO32__ */
#if defined (__GO32__)
-# include <sys/pc.h>
+# include <go32.h>
+# include <pc.h>
# undef HANDLE_SIGNALS
#endif /* __GO32__ */
-#if defined (STATIC_MALLOC)
-static char *xmalloc (), *xrealloc ();
-#else
extern char *xmalloc (), *xrealloc ();
-#endif /* STATIC_MALLOC */
-
/* **************************************************************** */
/* */
/* Line editing input utility */
/* */
/* **************************************************************** */
-static char *LibraryVersion = "2.0";
+char *rl_library_version = RL_LIBRARY_VERSION;
/* A pointer to the keymap that is currently in use.
By default, it is the standard emacs keymap. */
@@ -141,8 +190,13 @@ Keymap _rl_keymap = emacs_standard_keymap;
/* The current style of editing. */
int rl_editing_mode = emacs_mode;
+/* Non-zero if we called this function from _rl_dispatch(). It's present
+ so functions can find out whether they were called from a key binding
+ or directly from an application. */
+int rl_dispatching;
+
/* Non-zero if the previous command was a kill command. */
-static int last_command_was_kill = 0;
+int _rl_last_command_was_kill = 0;
/* The current value of the numeric argument specified by the user. */
int rl_numeric_arg = 1;
@@ -154,10 +208,10 @@ int rl_explicit_arg = 0;
int rl_arg_sign = 1;
/* Non-zero means we have been called at least once before. */
-static int rl_initialized = 0;
+static int rl_initialized;
/* If non-zero, this program is running in an EMACS buffer. */
-static int running_in_emacs = 0;
+static int running_in_emacs;
/* The current offset in the current input line. */
int rl_point;
@@ -175,10 +229,10 @@ int rl_done;
Function *rl_last_func = (Function *)NULL;
/* Top level environment for readline_internal (). */
-static jmp_buf readline_top_level;
+procenv_t readline_top_level;
/* The streams we interact with. */
-static FILE *in_stream, *out_stream;
+FILE *_rl_in_stream, *_rl_out_stream;
/* The names of the streams that we do input and output to. */
FILE *rl_instream = (FILE *)NULL;
@@ -222,16 +276,18 @@ int _rl_mark_modified_lines = 0;
AUDIBLE_BELL, or VISIBLE_BELL. */
int _rl_bell_preference = AUDIBLE_BELL;
+/* String inserted into the line by rl_insert_comment (). */
+char *_rl_comment_begin;
+
+/* Keymap holding the function currently being executed. */
+Keymap rl_executing_keymap;
+
/* Line buffer and maintenence. */
char *rl_line_buffer = (char *)NULL;
int rl_line_buffer_len = 0;
-#define DEFAULT_BUFFER_SIZE 256
/* Forward declarations used by the display and termcap code. */
-int term_xn;
-int screenwidth, screenheight, screenchars;
-
/* **************************************************************** */
/* */
/* `Forward' declarations */
@@ -242,9 +298,6 @@ int screenwidth, screenheight, screenchars;
parser directives. */
unsigned char _rl_parsing_conditionalized_out = 0;
-/* Non-zero means to save keys that we dispatch on in a kbd macro. */
-static int defining_kbd_macro = 0;
-
/* Non-zero means to convert characters with the meta bit set to
escape-prefixed characters so we can indirect through
emacs_meta_keymap or vi_escape_keymap. */
@@ -254,10 +307,6 @@ int _rl_convert_meta_chars_to_ascii = 1;
rather than as a meta-prefixed escape sequence. */
int _rl_output_meta_chars = 0;
-/* Non-zero tells rl_delete_text and rl_insert_text to not add to
- the undo list. */
-static int doing_an_undo = 0;
-
/* **************************************************************** */
/* */
/* Top Level Functions */
@@ -267,7 +316,7 @@ static int doing_an_undo = 0;
/* Non-zero means treat 0200 bit in terminal input as Meta bit. */
int _rl_meta_flag = 0; /* Forward declaration */
-/* Read a line of input. Prompt with PROMPT. A NULL PROMPT means
+/* Read a line of input. Prompt with PROMPT. An empty PROMPT means
none. A return value of NULL means that EOF was encountered. */
char *
readline (prompt)
@@ -287,14 +336,14 @@ readline (prompt)
rl_visible_prompt_length = rl_expand_prompt (rl_prompt);
rl_initialize ();
- rl_prep_terminal (_rl_meta_flag);
+ (*rl_prep_term_function) (_rl_meta_flag);
#if defined (HANDLE_SIGNALS)
rl_set_signals ();
#endif
value = readline_internal ();
- rl_deprep_terminal ();
+ (*rl_deprep_term_function) ();
#if defined (HANDLE_SIGNALS)
rl_clear_signals ();
@@ -303,55 +352,98 @@ readline (prompt)
return (value);
}
-/* Read a line of input from the global rl_instream, doing output on
- the global rl_outstream.
- If rl_prompt is non-null, then that is our prompt. */
-static char *
-readline_internal ()
-{
- int lastc, c, eof_found;
-
- in_stream = rl_instream;
- out_stream = rl_outstream;
+#if defined (READLINE_CALLBACKS)
+# define STATIC_CALLBACK
+#else
+# define STATIC_CALLBACK static
+#endif
- lastc = -1;
- eof_found = 0;
+STATIC_CALLBACK void
+readline_internal_setup ()
+{
+ _rl_in_stream = rl_instream;
+ _rl_out_stream = rl_outstream;
if (rl_startup_hook)
(*rl_startup_hook) ();
- if (!readline_echoing_p)
+ if (readline_echoing_p == 0)
{
if (rl_prompt)
{
- fprintf (out_stream, "%s", rl_prompt);
- fflush (out_stream);
+ fprintf (_rl_out_stream, "%s", rl_prompt);
+ fflush (_rl_out_stream);
}
}
else
{
rl_on_new_line ();
- rl_redisplay ();
+ (*rl_redisplay_function) ();
#if defined (VI_MODE)
if (rl_editing_mode == vi_mode)
- rl_vi_insertion_mode ();
+ rl_vi_insertion_mode (1, 0);
#endif /* VI_MODE */
}
+}
+
+STATIC_CALLBACK char *
+readline_internal_teardown (eof)
+ int eof;
+{
+ char *temp;
+ HIST_ENTRY *entry;
+
+ /* Restore the original of this history line, iff the line that we
+ are editing was originally in the history, AND the line has changed. */
+ entry = current_history ();
- while (!rl_done)
+ if (entry && rl_undo_list)
{
- int lk = last_command_was_kill;
- int code;
+ temp = savestring (the_line);
+ rl_revert_line (1, 0);
+ entry = replace_history_entry (where_history (), the_line, (HIST_ENTRY *)NULL);
+ _rl_free_history_entry (entry);
+
+ strcpy (the_line, temp);
+ free (temp);
+ }
+
+ /* At any rate, it is highly likely that this line has an undo list. Get
+ rid of it now. */
+ if (rl_undo_list)
+ free_undo_list ();
+
+ return (eof ? (char *)NULL : savestring (the_line));
+}
+
+STATIC_CALLBACK int
+#if defined (READLINE_CALLBACKS)
+readline_internal_char ()
+#else
+readline_internal_charloop ()
+#endif
+{
+ static int lastc, eof_found;
+ int c, code, lk;
+
+ lastc = -1;
+ eof_found = 0;
+
+#if !defined (READLINE_CALLBACKS)
+ while (rl_done == 0)
+ {
+#endif
+ lk = _rl_last_command_was_kill;
code = setjmp (readline_top_level);
if (code)
- rl_redisplay ();
+ (*rl_redisplay_function) ();
- if (!rl_pending_input)
+ if (rl_pending_input == 0)
{
/* Then initialize the argument and number of keys read. */
- rl_init_argument ();
+ _rl_init_argument ();
rl_key_sequence_length = 0;
}
@@ -365,21 +457,22 @@ readline_internal ()
previous character is interpreted as EOF. */
if (((c == _rl_eof_char && lastc != c) || c == EOF) && !rl_end)
{
+#if defined (READLINE_CALLBACKS)
+ return (rl_done = 1);
+#else
eof_found = 1;
break;
+#endif
}
lastc = c;
_rl_dispatch (c, _rl_keymap);
- /* If there was no change in last_command_was_kill, then no kill
+ /* If there was no change in _rl_last_command_was_kill, then no kill
has taken place. Note that if input is pending we are reading
a prefix command, so nothing has changed yet. */
- if (!rl_pending_input)
- {
- if (lk == last_command_was_kill)
- last_command_was_kill = 0;
- }
+ if (rl_pending_input == 0 && lk == _rl_last_command_was_kill)
+ _rl_last_command_was_kill = 0;
#if defined (VI_MODE)
/* In vi mode, when you exit insert mode, the cursor moves back
@@ -388,232 +481,57 @@ readline_internal ()
rl_vi_check ();
#endif /* VI_MODE */
- if (!rl_done)
- rl_redisplay ();
- }
-
- /* Restore the original of this history line, iff the line that we
- are editing was originally in the history, AND the line has changed. */
- {
- HIST_ENTRY *entry = current_history ();
-
- if (entry && rl_undo_list)
- {
- char *temp = savestring (the_line);
- rl_revert_line ();
- entry = replace_history_entry (where_history (), the_line,
- (HIST_ENTRY *)NULL);
- _rl_free_history_entry (entry);
-
- strcpy (the_line, temp);
- free (temp);
- }
- }
-
- /* At any rate, it is highly likely that this line has an undo list. Get
- rid of it now. */
- if (rl_undo_list)
- free_undo_list ();
-
- if (eof_found)
- return (char *)NULL;
- else
- return (savestring (the_line));
-}
-
-/* **************************************************************** */
-/* */
-/* Character Input Buffering */
-/* */
-/* **************************************************************** */
-
-static int pop_index = 0, push_index = 0, ibuffer_len = 511;
-static unsigned char ibuffer[512];
+ if (rl_done == 0)
+ (*rl_redisplay_function) ();
-/* Non-null means it is a pointer to a function to run while waiting for
- character input. */
-Function *rl_event_hook = (Function *)NULL;
-
-#define any_typein (push_index != pop_index)
-
-/* Add KEY to the buffer of characters to be read. */
-rl_stuff_char (key)
- int key;
-{
- if (key == EOF)
- {
- key = NEWLINE;
- rl_pending_input = EOF;
+#if defined (READLINE_CALLBACKS)
+ return 0;
+#else
}
- ibuffer[push_index++] = key;
- if (push_index >= ibuffer_len)
- push_index = 0;
- return push_index;
-}
-/* Return the amount of space available in the
- buffer for stuffing characters. */
-int
-ibuffer_space ()
-{
- if (pop_index > push_index)
- return (pop_index - push_index);
- else
- return (ibuffer_len - (push_index - pop_index));
+ return (eof_found);
+#endif
}
-/* Get a key from the buffer of characters to be read.
- Return the key in KEY.
- Result is KEY if there was a key, or 0 if there wasn't. */
-int
-rl_get_char (key)
- int *key;
+#if defined (READLINE_CALLBACKS)
+static int
+readline_internal_charloop ()
{
- if (push_index == pop_index)
- return (0);
-
- *key = ibuffer[pop_index++];
+ int eof;
- if (pop_index >= ibuffer_len)
- pop_index = 0;
-
- return (1);
+ while (rl_done == 0)
+ eof = readline_internal_char ();
+ return (eof);
}
+#endif /* READLINE_CALLBACKS */
-/* Stuff KEY into the *front* of the input buffer.
- Returns non-zero if successful, zero if there is
- no space left in the buffer. */
-int
-rl_unget_char (key)
- int key;
+/* Read a line of input from the global rl_instream, doing output on
+ the global rl_outstream.
+ If rl_prompt is non-null, then that is our prompt. */
+static char *
+readline_internal ()
{
- if (ibuffer_space ())
- {
- pop_index--;
- if (pop_index < 0)
- pop_index = ibuffer_len - 1;
- ibuffer[pop_index] = key;
- return (1);
- }
- return (0);
+ int eof;
+
+ readline_internal_setup ();
+ eof = readline_internal_charloop ();
+ return (readline_internal_teardown (eof));
}
-/* If a character is available to be read, then read it
- and stuff it into IBUFFER. Otherwise, just return. */
void
-rl_gather_tyi ()
+_rl_init_line_state ()
{
-#if defined (__GO32__)
- char input;
-
- if (isatty (0))
- {
- int i = rl_getc ();
-
- if (i != EOF)
- rl_stuff_char (i);
- }
- else if (kbhit () && ibuffer_space ())
- rl_stuff_char (getkey ());
-#else /* !__GO32__ */
-
- int tty = fileno (in_stream);
- register int tem, result = -1;
- int chars_avail;
- char input;
-
-#if defined (FIONREAD)
- result = ioctl (tty, FIONREAD, &chars_avail);
-#endif
-
-#if defined (O_NDELAY)
- if (result == -1)
- {
- int flags;
-
- flags = fcntl (tty, F_GETFL, 0);
-
- fcntl (tty, F_SETFL, (flags | O_NDELAY));
- chars_avail = read (tty, &input, 1);
-
- fcntl (tty, F_SETFL, flags);
- if (chars_avail == -1 && errno == EAGAIN)
- return;
- }
-#endif /* O_NDELAY */
-
- /* If there's nothing available, don't waste time trying to read
- something. */
- if (chars_avail == 0)
- return;
-
- tem = ibuffer_space ();
-
- if (chars_avail > tem)
- chars_avail = tem;
-
- /* One cannot read all of the available input. I can only read a single
- character at a time, or else programs which require input can be
- thwarted. If the buffer is larger than one character, I lose.
- Damn! */
- if (tem < ibuffer_len)
- chars_avail = 0;
-
- if (result != -1)
- {
- while (chars_avail--)
- rl_stuff_char (rl_getc (in_stream));
- }
- else
- {
- if (chars_avail)
- rl_stuff_char (input);
- }
-#endif /* !__GO32__ */
+ rl_point = rl_end = 0;
+ the_line = rl_line_buffer;
+ the_line[0] = 0;
}
-static int next_macro_key ();
-/* Read a key, including pending input. */
-int
-rl_read_key ()
+void
+_rl_set_the_line ()
{
- int c;
-
- rl_key_sequence_length++;
-
- if (rl_pending_input)
- {
- c = rl_pending_input;
- rl_pending_input = 0;
- }
- else
- {
- /* If input is coming from a macro, then use that. */
- if (c = next_macro_key ())
- return (c);
-
- /* If the user has an event function, then call it periodically. */
- if (rl_event_hook)
- {
- while (rl_event_hook && !rl_get_char (&c))
- {
- (*rl_event_hook) ();
- rl_gather_tyi ();
- }
- }
- else
- {
- if (!rl_get_char (&c))
- c = rl_getc (in_stream);
- }
- }
-
- return (c);
+ the_line = rl_line_buffer;
}
-/* Found later in this file. */
-static void add_macro_char (), with_macro_input ();
-
/* Do the command associated with KEY in MAP.
If the associated command is really a keymap, then read
another key, and dispatch into that map. */
@@ -622,15 +540,16 @@ _rl_dispatch (key, map)
register int key;
Keymap map;
{
- int r = 0;
-
- if (defining_kbd_macro)
- add_macro_char (key);
+ int r, newkey;
+ char *macro;
+ Function *func;
if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
{
if (map[ESC].type == ISKMAP)
{
+ if (_rl_defining_kbd_macro)
+ _rl_add_macro_char (ESC);
map = FUNCTION_TO_KEYMAP (map, ESC);
key = UNMETA (key);
rl_key_sequence_length += 2;
@@ -641,46 +560,53 @@ _rl_dispatch (key, map)
return 0;
}
+ if (_rl_defining_kbd_macro)
+ _rl_add_macro_char (key);
+
+ r = 0;
switch (map[key].type)
{
case ISFUNC:
- {
- Function *func = map[key].function;
-
- if (func != (Function *)NULL)
- {
- /* Special case rl_do_lowercase_version (). */
- if (func == rl_do_lowercase_version)
- return (_rl_dispatch (to_lower (key), map));
-
- r = (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
-
- /* If we have input pending, then the last command was a prefix
- command. Don't change the state of rl_last_func. Otherwise,
- remember the last command executed in this variable. */
- if (!rl_pending_input)
- rl_last_func = map[key].function;
- }
- else
- {
- rl_abort ();
- return -1;
- }
- }
+ func = map[key].function;
+ if (func != (Function *)NULL)
+ {
+ /* Special case rl_do_lowercase_version (). */
+ if (func == rl_do_lowercase_version)
+ return (_rl_dispatch (_rl_to_lower (key), map));
+
+ rl_executing_keymap = map;
+
+#if 0
+ _rl_suppress_redisplay = (map[key].function == rl_insert) && _rl_input_available ();
+#endif
+
+ rl_dispatching = 1;
+ r = (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
+ rl_dispatching = 0;
+
+ /* If we have input pending, then the last command was a prefix
+ command. Don't change the state of rl_last_func. Otherwise,
+ remember the last command executed in this variable. */
+ if (!rl_pending_input && map[key].function != rl_digit_argument)
+ rl_last_func = map[key].function;
+ }
+ else
+ {
+ _rl_abort_internal ();
+ return -1;
+ }
break;
case ISKMAP:
if (map[key].function != (Function *)NULL)
{
- int newkey;
-
rl_key_sequence_length++;
newkey = rl_read_key ();
r = _rl_dispatch (newkey, FUNCTION_TO_KEYMAP (map, key));
}
else
{
- rl_abort ();
+ _rl_abort_internal ();
return -1;
}
break;
@@ -688,241 +614,30 @@ _rl_dispatch (key, map)
case ISMACR:
if (map[key].function != (Function *)NULL)
{
- char *macro;
-
macro = savestring ((char *)map[key].function);
- with_macro_input (macro);
+ _rl_with_macro_input (macro);
return 0;
}
break;
}
#if defined (VI_MODE)
if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
- rl_vi_textmod_command (key))
+ _rl_vi_textmod_command (key))
_rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
#endif
return (r);
}
-
-/* **************************************************************** */
-/* */
-/* Hacking Keyboard Macros */
-/* */
-/* **************************************************************** */
-
-/* The currently executing macro string. If this is non-zero,
- then it is a malloc ()'ed string where input is coming from. */
-static char *executing_macro = (char *)NULL;
-
-/* The offset in the above string to the next character to be read. */
-static int executing_macro_index = 0;
-
-/* The current macro string being built. Characters get stuffed
- in here by add_macro_char (). */
-static char *current_macro = (char *)NULL;
-
-/* The size of the buffer allocated to current_macro. */
-static int current_macro_size = 0;
-
-/* The index at which characters are being added to current_macro. */
-static int current_macro_index = 0;
-
-/* A structure used to save nested macro strings.
- It is a linked list of string/index for each saved macro. */
-struct saved_macro {
- struct saved_macro *next;
- char *string;
- int sindex;
-};
-
-/* The list of saved macros. */
-struct saved_macro *macro_list = (struct saved_macro *)NULL;
-
-/* Forward declarations of static functions. Thank you C. */
-static void push_executing_macro (), pop_executing_macro ();
-
-/* This one has to be declared earlier in the file. */
-/* static void add_macro_char (); */
-
-/* Set up to read subsequent input from STRING.
- STRING is free ()'ed when we are done with it. */
-static void
-with_macro_input (string)
- char *string;
-{
- push_executing_macro ();
- executing_macro = string;
- executing_macro_index = 0;
-}
-
-/* Return the next character available from a macro, or 0 if
- there are no macro characters. */
-static int
-next_macro_key ()
-{
- if (!executing_macro)
- return (0);
-
- if (!executing_macro[executing_macro_index])
- {
- pop_executing_macro ();
- return (next_macro_key ());
- }
-
- return (executing_macro[executing_macro_index++]);
-}
-
-/* Save the currently executing macro on a stack of saved macros. */
-static void
-push_executing_macro ()
-{
- struct saved_macro *saver;
-
- saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro));
- saver->next = macro_list;
- saver->sindex = executing_macro_index;
- saver->string = executing_macro;
-
- macro_list = saver;
-}
-
-/* Discard the current macro, replacing it with the one
- on the top of the stack of saved macros. */
-static void
-pop_executing_macro ()
-{
- if (executing_macro)
- free (executing_macro);
-
- executing_macro = (char *)NULL;
- executing_macro_index = 0;
-
- if (macro_list)
- {
- struct saved_macro *disposer = macro_list;
- executing_macro = macro_list->string;
- executing_macro_index = macro_list->sindex;
- macro_list = macro_list->next;
- free (disposer);
- }
-}
-
-/* Add a character to the macro being built. */
-static void
-add_macro_char (c)
- int c;
-{
- if (current_macro_index + 1 >= current_macro_size)
- {
- if (!current_macro)
- current_macro = xmalloc (current_macro_size = 25);
- else
- current_macro = xrealloc (current_macro, current_macro_size += 25);
- }
-
- current_macro[current_macro_index++] = c;
- current_macro[current_macro_index] = '\0';
-}
-
-/* Begin defining a keyboard macro.
- Keystrokes are recorded as they are executed.
- End the definition with rl_end_kbd_macro ().
- If a numeric argument was explicitly typed, then append this
- definition to the end of the existing macro, and start by
- re-executing the existing macro. */
-rl_start_kbd_macro (ignore1, ignore2)
- int ignore1, ignore2;
-{
- if (defining_kbd_macro)
- {
- rl_abort ();
- return -1;
- }
-
- if (rl_explicit_arg)
- {
- if (current_macro)
- with_macro_input (savestring (current_macro));
- }
- else
- current_macro_index = 0;
-
- defining_kbd_macro = 1;
- return 0;
-}
-
-/* Stop defining a keyboard macro.
- A numeric argument says to execute the macro right now,
- that many times, counting the definition as the first time. */
-rl_end_kbd_macro (count, ignore)
- int count, ignore;
-{
- if (!defining_kbd_macro)
- {
- rl_abort ();
- return -1;
- }
-
- current_macro_index -= (rl_key_sequence_length - 1);
- current_macro[current_macro_index] = '\0';
-
- defining_kbd_macro = 0;
-
- return (rl_call_last_kbd_macro (--count, 0));
-}
-
-/* Execute the most recently defined keyboard macro.
- COUNT says how many times to execute it. */
-rl_call_last_kbd_macro (count, ignore)
- int count, ignore;
-{
- if (!current_macro)
- rl_abort ();
-
- if (defining_kbd_macro)
- {
- ding (); /* no recursive macros */
- current_macro[--current_macro_index] = '\0'; /* erase this char */
- return 0;
- }
-
- while (count--)
- with_macro_input (savestring (current_macro));
- return 0;
-}
-
-void
-_rl_kill_kbd_macro ()
-{
- if (current_macro)
- {
- free (current_macro);
- current_macro = (char *) NULL;
- }
- current_macro_size = current_macro_index = 0;
-
- if (executing_macro)
- {
- free (executing_macro);
- executing_macro = (char *) NULL;
- }
- executing_macro_index = 0;
-
- defining_kbd_macro = 0;
-}
-
/* **************************************************************** */
/* */
/* Initializations */
/* */
/* **************************************************************** */
-/* Initliaze readline (and terminal if not already). */
+/* Initialize readline (and terminal if not already). */
+int
rl_initialize ()
{
- char *t;
-
/* If we have never been called before, initialize the
terminal and data structures. */
if (!rl_initialized)
@@ -932,23 +647,11 @@ rl_initialize ()
}
/* Initalize the current line information. */
- rl_point = rl_end = 0;
- the_line = rl_line_buffer;
- the_line[0] = 0;
+ _rl_init_line_state ();
/* We aren't done yet. We haven't even gotten started yet! */
rl_done = 0;
- /* Check for LC_CTYPE and use its value to decide the defaults for
- 8-bit character input and output. */
- t = getenv ("LC_CTYPE");
- if (t && (strcmp (t, "iso-8859-1") == 0 || strcmp (t, "iso_8859_1") == 0))
- {
- _rl_meta_flag = 1;
- _rl_convert_meta_chars_to_ascii = 0;
- _rl_output_meta_chars = 1;
- }
-
/* Tell the history routines what is going on. */
start_using_history ();
@@ -961,15 +664,49 @@ rl_initialize ()
/* Parsing of key-bindings begins in an enabled state. */
_rl_parsing_conditionalized_out = 0;
+#if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode)
+ _rl_vi_initialize_line ();
+#endif
+
return 0;
}
+#if defined (__EMX__)
+static void
+_emx_build_environ ()
+{
+ TIB *tibp;
+ PIB *pibp;
+ char *t, **tp;
+ int c;
+
+ DosGetInfoBlocks (&tibp, &pibp);
+ t = pibp->pib_pchenv;
+ for (c = 1; *t; c++)
+ t += strlen (t) + 1;
+ tp = environ = (char **)xmalloc ((c + 1) * sizeof (char *));
+ t = pibp->pib_pchenv;
+ while (*t)
+ {
+ *tp++ = t;
+ t += strlen (t) + 1;
+ }
+ *tp = 0;
+}
+#endif /* __EMX__ */
+
/* Initialize the entire state of the world. */
static void
readline_initialize_everything ()
{
+#if defined (__EMX__)
+ if (environ == 0)
+ _emx_build_environ ();
+#endif
+
/* Find out if we are running in Emacs. */
- running_in_emacs = getenv ("EMACS") != (char *)0;
+ running_in_emacs = get_env_value ("EMACS") != (char *)0;
/* Set up input and output if they are not already set up. */
if (!rl_instream)
@@ -978,17 +715,18 @@ readline_initialize_everything ()
if (!rl_outstream)
rl_outstream = stdout;
- /* Bind in_stream and out_stream immediately. These values may change,
- but they may also be used before readline_internal () is called. */
- in_stream = rl_instream;
- out_stream = rl_outstream;
+ /* Bind _rl_in_stream and _rl_out_stream immediately. These values
+ may change, but they may also be used before readline_internal ()
+ is called. */
+ _rl_in_stream = rl_instream;
+ _rl_out_stream = rl_outstream;
/* Allocate data structures. */
- if (!rl_line_buffer)
+ if (rl_line_buffer == 0)
rl_line_buffer = xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE);
/* Initialize the terminal interface. */
- init_terminal_io ((char *)NULL);
+ _rl_init_terminal_io ((char *)NULL);
#if !defined (__GO32__)
/* Bind tty characters to readline functions. */
@@ -998,11 +736,14 @@ readline_initialize_everything ()
/* Initialize the function names. */
rl_initialize_funmap ();
+ /* Decide whether we should automatically go into eight-bit mode. */
+ _rl_init_eightbit ();
+
/* Read in the init file. */
rl_read_init_file ((char *)NULL);
/* XXX */
- if (_rl_horizontal_scroll_mode && term_xn)
+ if (_rl_horizontal_scroll_mode && _rl_term_autowrap)
{
screenwidth--;
screenchars -= screenheight;
@@ -1015,6 +756,10 @@ readline_initialize_everything ()
/* Try to bind a common arrow key prefix, if not already bound. */
bind_arrow_keys ();
+ /* Enable the meta key, if this terminal has one. */
+ if (_rl_enable_meta)
+ _rl_enable_meta_key ();
+
/* If the completion parser's default word break characters haven't
been set yet, then do so now. */
if (rl_completer_word_break_characters == (char *)NULL)
@@ -1086,46 +831,63 @@ bind_arrow_keys ()
static int
rl_digit_loop ()
{
- int key, c;
+ int key, c, sawminus, sawdigits;
+ _rl_save_prompt ();
+
+ sawminus = sawdigits = 0;
while (1)
{
rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg);
key = c = rl_read_key ();
+ /* If we see a key bound to `universal-argument' after seeing digits,
+ it ends the argument but is otherwise ignored. */
if (_rl_keymap[c].type == ISFUNC &&
_rl_keymap[c].function == rl_universal_argument)
{
- rl_numeric_arg *= 4;
- continue;
- }
- c = UNMETA (c);
- if (digit_p (c))
- {
- if (rl_explicit_arg)
- rl_numeric_arg = (rl_numeric_arg * 10) + (c - '0');
- else
- rl_numeric_arg = (c - '0');
- rl_explicit_arg = 1;
- }
- else
- {
- if (c == '-' && !rl_explicit_arg)
+ if (sawdigits == 0)
{
- rl_numeric_arg = 1;
- rl_arg_sign = -1;
+ rl_numeric_arg *= 4;
+ continue;
}
else
{
+ key = rl_read_key ();
+ _rl_restore_prompt ();
rl_clear_message ();
return (_rl_dispatch (key, _rl_keymap));
}
}
+
+ c = UNMETA (c);
+
+ if (_rl_digit_p (c))
+ {
+ rl_numeric_arg = rl_explicit_arg ? (rl_numeric_arg * 10) + c - '0' : c - '0';
+ sawdigits = rl_explicit_arg = 1;
+ }
+ else if (c == '-' && rl_explicit_arg == 0)
+ {
+ rl_numeric_arg = sawminus = 1;
+ rl_arg_sign = -1;
+ }
+ else
+ {
+ /* Make M-- command equivalent to M--1 command. */
+ if (sawminus && rl_numeric_arg == 1 && rl_explicit_arg == 0)
+ rl_explicit_arg = 1;
+ _rl_restore_prompt ();
+ rl_clear_message ();
+ return (_rl_dispatch (key, _rl_keymap));
+ }
}
+
return 0;
}
/* Add the current digit to the argument in progress. */
+int
rl_digit_argument (ignore, key)
int ignore, key;
{
@@ -1134,16 +896,18 @@ rl_digit_argument (ignore, key)
}
/* What to do when you abort reading an argument. */
+int
rl_discard_argument ()
{
ding ();
rl_clear_message ();
- rl_init_argument ();
+ _rl_init_argument ();
return 0;
}
/* Create a default argument. */
-rl_init_argument ()
+int
+_rl_init_argument ()
{
rl_numeric_arg = rl_arg_sign = 1;
rl_explicit_arg = 0;
@@ -1153,507 +917,14 @@ rl_init_argument ()
/* C-u, universal argument. Multiply the current argument by 4.
Read a key. If the key has nothing to do with arguments, then
dispatch on it. If the key is the abort character then abort. */
-rl_universal_argument ()
-{
- rl_numeric_arg *= 4;
- return (rl_digit_loop ());
-}
-
-/* **************************************************************** */
-/* */
-/* Terminal and Termcap */
-/* */
-/* **************************************************************** */
-
-static char *term_buffer = (char *)NULL;
-static char *term_string_buffer = (char *)NULL;
-
-static int tcap_initialized = 0;
-
-/* Non-zero means this terminal can't really do anything. */
-int dumb_term = 0;
-/* On Solaris2, sys/types.h #includes sys/reg.h, which #defines PC.
- Unfortunately, PC is a global variable used by the termcap library. */
-#undef PC
-
-#if !defined (__linux__)
-/* If this causes problems, remove the `extern'. */
-extern char PC, *BC, *UP;
-#endif /* __linux__ */
-
-/* Some strings to control terminal actions. These are output by tputs (). */
-char *term_goto, *term_clreol, *term_cr, *term_clrpag, *term_backspace;
-char *term_pc;
-
-/* Non-zero if we determine that the terminal can do character insertion. */
-int terminal_can_insert = 0;
-
-/* How to insert characters. */
-char *term_im, *term_ei, *term_ic, *term_ip, *term_IC;
-
-/* How to delete characters. */
-char *term_dc, *term_DC;
-
-#if defined (HACK_TERMCAP_MOTION)
-char *term_forward_char;
-#endif /* HACK_TERMCAP_MOTION */
-
-/* How to go up a line. */
-char *term_up;
-
-/* A visible bell, if the terminal can be made to flash the screen. */
-char *visible_bell;
-
-/* Non-zero means that this terminal has a meta key. */
-int term_has_meta;
-
-/* The string to write to turn on the meta key, if this term has one. */
-char *term_mm;
-
-/* The string to write to turn off the meta key, if this term has one. */
-char *term_mo;
-
-/* The key sequences output by the arrow keys, if this terminal has any. */
-char *term_ku, *term_kd, *term_kr, *term_kl;
-
-/* How to initialize and reset the arrow keys, if this terminal has any. */
-char *term_ks, *term_ke;
-
-/* Re-initialize the terminal considering that the TERM/TERMCAP variable
- has changed. */
-rl_reset_terminal (terminal_name)
- char *terminal_name;
-{
- init_terminal_io (terminal_name);
- return 0;
-}
-
-/* Set readline's idea of the screen size. TTY is a file descriptor open
- to the terminal. If IGNORE_ENV is true, we do not pay attention to the
- values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being
- non-null serve to check whether or not we have initialized termcap. */
-void
-_rl_set_screen_size (tty, ignore_env)
- int tty, ignore_env;
-{
-#if defined (TIOCGWINSZ)
- struct winsize window_size;
-#endif /* TIOCGWINSZ */
-
-#if defined (TIOCGWINSZ)
- if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)
- {
- screenwidth = (int) window_size.ws_col;
- screenheight = (int) window_size.ws_row;
- }
-#endif /* TIOCGWINSZ */
-
- /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV
- is unset. */
- if (screenwidth <= 0)
- {
- char *sw;
-
- if (!ignore_env && (sw = getenv ("COLUMNS")))
- screenwidth = atoi (sw);
-
- if (screenwidth <= 0 && term_string_buffer)
- screenwidth = tgetnum ("co");
- }
-
- /* Environment variable LINES overrides setting of "li" if IGNORE_ENV
- is unset. */
- if (screenheight <= 0)
- {
- char *sh;
-
- if (!ignore_env && (sh = getenv ("LINES")))
- screenheight = atoi (sh);
-
- if (screenheight <= 0 && term_string_buffer)
- screenheight = tgetnum ("li");
- }
-
- /* If all else fails, default to 80x24 terminal. */
- if (screenwidth <= 1)
- screenwidth = 80;
-
- if (screenheight <= 0)
- screenheight = 24;
-
-#if defined (SHELL)
- /* If we're being compiled as part of bash, set the environment
- variables $LINES and $COLUMNS to new values. */
- set_lines_and_columns (screenheight, screenwidth);
-#endif
-
- if (!term_xn)
- screenwidth--;
-
- screenchars = screenwidth * screenheight;
-}
-
-struct _tc_string {
- char *tc_var;
- char **tc_value;
-};
-
-/* This should be kept sorted, just in case we decide to change the
- search algorithm to something smarter. */
-static struct _tc_string tc_strings[] =
-{
- "DC", &term_DC,
- "IC", &term_IC,
- "ce", &term_clreol,
- "cl", &term_clrpag,
- "cr", &term_cr,
- "dc", &term_dc,
- "ei", &term_ei,
- "ic", &term_ic,
- "im", &term_im,
- "kd", &term_kd,
- "kl", &term_kl,
- "kr", &term_kr,
- "ku", &term_ku,
- "ks", &term_ks,
- "ke", &term_ke,
- "le", &term_backspace,
- "mm", &term_mm,
- "mo", &term_mo,
-#if defined (HACK_TERMCAP_MOTION)
- "nd", &term_forward_char,
-#endif
- "pc", &term_pc,
- "up", &term_up,
- "vb", &visible_bell,
-};
-
-#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string))
-
-/* Read the desired terminal capability strings into BP. The capabilities
- are described in the TC_STRINGS table. */
-static void
-get_term_capabilities (bp)
- char **bp;
-{
- register int i;
-
- for (i = 0; i < NUM_TC_STRINGS; i++)
- *(tc_strings[i].tc_value) = tgetstr (tc_strings[i].tc_var, bp);
- tcap_initialized = 1;
-}
-
-static int
-init_terminal_io (terminal_name)
- char *terminal_name;
-{
-#if defined (__GO32__)
- screenwidth = ScreenCols ();
- screenheight = ScreenRows ();
- screenchars = screenwidth * screenheight;
- term_cr = "\r";
- term_im = term_ei = term_ic = term_IC = (char *)NULL;
- term_up = term_dc = term_DC = visible_bell = (char *)NULL;
-
- /* Does the __GO32__ have a meta key? I don't know. */
- term_has_meta = 0;
- term_mm = term_mo = (char *)NULL;
-
- /* It probably has arrow keys, but I don't know what they are. */
- term_ku = term_kd = term_kr = term_kl = (char *)NULL;
-
-#if defined (HACK_TERMCAP_MOTION)
- term_forward_char = (char *)NULL;
-#endif /* HACK_TERMCAP_MOTION */
- terminal_can_insert = term_xn = 0;
- return;
-#else /* !__GO32__ */
-
- char *term, *buffer;
- int tty;
- Keymap xkeymap;
-
- term = terminal_name ? terminal_name : getenv ("TERM");
-
- if (!term_string_buffer)
- term_string_buffer = xmalloc (2048);
-
- if (!term_buffer)
- term_buffer = xmalloc (2048);
-
- buffer = term_string_buffer;
-
- term_clrpag = term_cr = term_clreol = (char *)NULL;
-
- if (!term)
- term = "dumb";
-
- if (tgetent (term_buffer, term) <= 0)
- {
- dumb_term = 1;
- screenwidth = 79;
- screenheight = 24;
- screenchars = 79 * 24;
- term_cr = "\r";
- term_im = term_ei = term_ic = term_IC = (char *)NULL;
- term_up = term_dc = term_DC = visible_bell = (char *)NULL;
- term_ku = term_kd = term_kl = term_kr = (char *)NULL;
-#if defined (HACK_TERMCAP_MOTION)
- term_forward_char = (char *)NULL;
-#endif
- terminal_can_insert = 0;
- return 0;
- }
-
- get_term_capabilities (&buffer);
-
- /* Set up the variables that the termcap library expects the application
- to provide. */
- PC = term_pc ? *term_pc : 0;
- BC = term_backspace;
- UP = term_up;
-
- if (!term_cr)
- term_cr = "\r";
-
- if (rl_instream)
- tty = fileno (rl_instream);
- else
- tty = 0;
-
- screenwidth = screenheight = 0;
-
- term_xn = tgetflag ("am") && tgetflag ("xn");
-
- _rl_set_screen_size (tty, 0);
-
- /* "An application program can assume that the terminal can do
- character insertion if *any one of* the capabilities `IC',
- `im', `ic' or `ip' is provided." But we can't do anything if
- only `ip' is provided, so... */
- terminal_can_insert = (term_IC || term_im || term_ic);
-
- /* Check to see if this terminal has a meta key and clear the capability
- variables if there is none. */
- term_has_meta = (tgetflag ("km") || tgetflag ("MT"));
- if (!term_has_meta)
- {
- term_mm = (char *)NULL;
- term_mo = (char *)NULL;
- }
-
- /* Attempt to find and bind the arrow keys. Do not override already
- bound keys in an overzealous attempt, however. */
- xkeymap = _rl_keymap;
-
- _rl_keymap = emacs_standard_keymap;
- _rl_bind_if_unbound (term_ku, rl_get_previous_history);
- _rl_bind_if_unbound (term_kd, rl_get_next_history);
- _rl_bind_if_unbound (term_kr, rl_forward);
- _rl_bind_if_unbound (term_kl, rl_backward);
-
-#if defined (VI_MODE)
- _rl_keymap = vi_movement_keymap;
- _rl_bind_if_unbound (term_ku, rl_get_previous_history);
- _rl_bind_if_unbound (term_kd, rl_get_next_history);
- _rl_bind_if_unbound (term_kr, rl_forward);
- _rl_bind_if_unbound (term_kl, rl_backward);
-#endif /* VI_MODE */
-
- _rl_keymap = xkeymap;
-
-#endif /* !__GO32__ */
- return 0;
-}
-
-char *
-rl_get_termcap (cap)
- char *cap;
-{
- register int i;
-
- if (tcap_initialized == 0)
- return ((char *)NULL);
- for (i = 0; i < NUM_TC_STRINGS; i++)
- {
- if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0)
- return *(tc_strings[i].tc_value);
- }
- return ((char *)NULL);
-}
-
-/* A function for the use of tputs () */
-int
-_rl_output_character_function (c)
- int c;
-{
- return putc (c, out_stream);
-}
-
-/* Write COUNT characters from STRING to the output stream. */
-void
-_rl_output_some_chars (string, count)
- char *string;
- int count;
-{
- fwrite (string, 1, count, out_stream);
-}
-
-/* Move the cursor back. */
-backspace (count)
- int count;
-{
- register int i;
-
-#if !defined (__GO32__)
- if (term_backspace)
- for (i = 0; i < count; i++)
- tputs (term_backspace, 1, _rl_output_character_function);
- else
-#endif /* !__GO32__ */
- for (i = 0; i < count; i++)
- putc ('\b', out_stream);
- return 0;
-}
-
-/* Move to the start of the next line. */
-crlf ()
-{
-#if defined (NEW_TTY_DRIVER)
- tputs (term_cr, 1, _rl_output_character_function);
-#endif /* NEW_TTY_DRIVER */
- putc ('\n', out_stream);
- return 0;
-}
-
-rl_tty_status (count, key)
- int count, key;
-{
-#if defined (TIOCSTAT)
- ioctl (1, TIOCSTAT, (char *)0);
- rl_refresh_line ();
-#else
- ding ();
-#endif
- return 0;
-}
-
-
-/* **************************************************************** */
-/* */
-/* Utility Functions */
-/* */
-/* **************************************************************** */
-
-/* Return 0 if C is not a member of the class of characters that belong
- in words, or 1 if it is. */
-
-int allow_pathname_alphabetic_chars = 0;
-char *pathname_alphabetic_chars = "/-_=~.#$";
-
-int
-alphabetic (c)
- int c;
-{
- if (pure_alphabetic (c) || (digit_p (c)))
- return (1);
-
- if (allow_pathname_alphabetic_chars)
- return (strchr (pathname_alphabetic_chars, c) != NULL);
- else
- return (0);
-}
-
-/* Ring the terminal bell. */
int
-ding ()
-{
- if (readline_echoing_p)
- {
-#if !defined (__GO32__)
- switch (_rl_bell_preference)
- {
- case NO_BELL:
- default:
- break;
- case VISIBLE_BELL:
- if (visible_bell)
- {
- tputs (visible_bell, 1, _rl_output_character_function);
- break;
- }
- /* FALLTHROUGH */
- case AUDIBLE_BELL:
- fprintf (stderr, "\007");
- fflush (stderr);
- break;
- }
-#else /* __GO32__ */
- fprintf (stderr, "\007");
- fflush (stderr);
-#endif /* __GO32__ */
- return (0);
- }
- return (-1);
-}
-
-/* How to abort things. */
-rl_abort (count, key)
+rl_universal_argument (count, key)
int count, key;
{
- ding ();
- rl_clear_message ();
- rl_init_argument ();
- rl_pending_input = 0;
-
- defining_kbd_macro = 0;
- while (executing_macro)
- pop_executing_macro ();
-
- rl_last_func = (Function *)NULL;
- longjmp (readline_top_level, 1);
-}
-
-/* Return a copy of the string between FROM and TO.
- FROM is inclusive, TO is not. */
-char *
-rl_copy_text (from, to)
- int from, to;
-{
- register int length;
- char *copy;
-
- /* Fix it if the caller is confused. */
- if (from > to)
- {
- int t = from;
- from = to;
- to = t;
- }
-
- length = to - from;
- copy = xmalloc (1 + length);
- strncpy (copy, the_line + from, length);
- copy[length] = '\0';
- return (copy);
-}
-
-/* Increase the size of RL_LINE_BUFFER until it has enough space to hold
- LEN characters. */
-void
-rl_extend_line_buffer (len)
- int len;
-{
- while (len >= rl_line_buffer_len)
- {
- rl_line_buffer_len += DEFAULT_BUFFER_SIZE;
- rl_line_buffer = xrealloc (rl_line_buffer, rl_line_buffer_len);
- }
-
- the_line = rl_line_buffer;
+ rl_numeric_arg *= 4;
+ return (rl_digit_loop ());
}
-
/* **************************************************************** */
/* */
/* Insert and Delete */
@@ -1663,6 +934,7 @@ rl_extend_line_buffer (len)
/* Insert a string of text into the line at point. This is the only
way that you should do insertion. rl_insert () calls this
function. */
+int
rl_insert_text (string)
char *string;
{
@@ -1676,7 +948,7 @@ rl_insert_text (string)
strncpy (the_line + rl_point, string, l);
/* Remember how to undo this if we aren't undoing something. */
- if (!doing_an_undo)
+ if (!_rl_doing_an_undo)
{
/* If possible and desirable, concatenate the undos. */
if ((l == 1) &&
@@ -1696,6 +968,7 @@ rl_insert_text (string)
/* Delete the string between FROM and TO. FROM is
inclusive, TO is not. */
+int
rl_delete_text (from, to)
int from, to;
{
@@ -1704,11 +977,16 @@ rl_delete_text (from, to)
/* Fix it if the caller is confused. */
if (from > to)
+ SWAP (from, to);
+
+ /* fix boundaries */
+ if (to > rl_end)
{
- int t = from;
- from = to;
- to = t;
+ to = rl_end;
+ if (from > to)
+ from = to;
}
+
text = rl_copy_text (from, to);
/* Some versions of strncpy() can't handle overlapping arguments. */
@@ -1717,7 +995,7 @@ rl_delete_text (from, to)
the_line[i] = the_line[i + diff];
/* Remember how to undo this delete. */
- if (!doing_an_undo)
+ if (_rl_doing_an_undo == 0)
rl_add_undo (UNDO_DELETE, from, to, text);
else
free (text);
@@ -1727,7 +1005,28 @@ rl_delete_text (from, to)
return (diff);
}
-
+/* Fix up point so that it is within the line boundaries after killing
+ text. If FIX_MARK_TOO is non-zero, the mark is forced within line
+ boundaries also. */
+
+#define _RL_FIX_POINT(x) \
+ do { \
+ if (x > rl_end) \
+ x = rl_end; \
+ else if (x < 0) \
+ x = 0; \
+ } while (0)
+
+void
+_rl_fix_point (fix_mark_too)
+ int fix_mark_too;
+{
+ _RL_FIX_POINT (rl_point);
+ if (fix_mark_too)
+ _RL_FIX_POINT (rl_mark);
+}
+#undef _RL_FIX_POINT
+
/* **************************************************************** */
/* */
/* Readline character functions */
@@ -1750,7 +1049,6 @@ rl_delete_text (from, to)
The second is the key which invoked this command.
*/
-
/* **************************************************************** */
/* */
/* Movement Commands */
@@ -1763,11 +1061,12 @@ rl_delete_text (from, to)
might as well let rl_redisplay do that job. */
/* Move forward COUNT characters. */
+int
rl_forward (count, key)
int count, key;
{
if (count < 0)
- rl_backward (-count);
+ rl_backward (-count, key);
else if (count > 0)
{
int end = rl_point + count;
@@ -1789,11 +1088,12 @@ rl_forward (count, key)
}
/* Move backward COUNT characters. */
+int
rl_backward (count, key)
int count, key;
{
if (count < 0)
- rl_forward (-count);
+ rl_forward (-count, key);
else if (count > 0)
{
if (rl_point < count)
@@ -1808,6 +1108,7 @@ rl_backward (count, key)
}
/* Move to the beginning of the line. */
+int
rl_beg_of_line (count, key)
int count, key;
{
@@ -1816,6 +1117,7 @@ rl_beg_of_line (count, key)
}
/* Move to the end of the line. */
+int
rl_end_of_line (count, key)
int count, key;
{
@@ -1824,6 +1126,7 @@ rl_end_of_line (count, key)
}
/* Move forward a word. We do what Emacs does. */
+int
rl_forward_word (count, key)
int count, key;
{
@@ -1831,7 +1134,7 @@ rl_forward_word (count, key)
if (count < 0)
{
- rl_backward_word (-count);
+ rl_backward_word (-count, key);
return 0;
}
@@ -1843,7 +1146,7 @@ rl_forward_word (count, key)
/* If we are not in a word, move forward until we are in one.
Then, move forward until we hit a non-alphabetic character. */
c = the_line[rl_point];
- if (!alphabetic (c))
+ if (alphabetic (c) == 0)
{
while (++rl_point < rl_end)
{
@@ -1857,7 +1160,7 @@ rl_forward_word (count, key)
while (++rl_point < rl_end)
{
c = the_line[rl_point];
- if (!alphabetic (c))
+ if (alphabetic (c) == 0)
break;
}
--count;
@@ -1866,6 +1169,7 @@ rl_forward_word (count, key)
}
/* Move backward a word. We do what Emacs does. */
+int
rl_backward_word (count, key)
int count, key;
{
@@ -1873,7 +1177,7 @@ rl_backward_word (count, key)
if (count < 0)
{
- rl_forward_word (-count);
+ rl_forward_word (-count, key);
return 0;
}
@@ -1886,7 +1190,7 @@ rl_backward_word (count, key)
just before point. */
c = the_line[rl_point - 1];
- if (!alphabetic (c))
+ if (alphabetic (c) == 0)
{
while (--rl_point)
{
@@ -1899,7 +1203,7 @@ rl_backward_word (count, key)
while (rl_point)
{
c = the_line[rl_point - 1];
- if (!alphabetic (c))
+ if (alphabetic (c) == 0)
break;
else
--rl_point;
@@ -1910,6 +1214,7 @@ rl_backward_word (count, key)
}
/* Clear the current line. Numeric argument to C-l does this. */
+int
rl_refresh_line ()
{
int curr_line, nleft;
@@ -1939,8 +1244,7 @@ rl_refresh_line ()
memset (row_start + col, 0, (width - col) * 2);
}
#else /* !__GO32__ */
- if (term_clreol)
- tputs (term_clreol, 1, _rl_output_character_function);
+ _rl_clear_to_eol (0); /* arg of 0 means to not use spaces */
#endif /* !__GO32__ */
rl_forced_update_display ();
@@ -1952,6 +1256,7 @@ rl_refresh_line ()
/* C-l typed to a line without quoting clears the screen, and then reprints
the prompt and the current input line. Given a numeric arg, redraw only
the current line. */
+int
rl_clear_screen (count, key)
int count, key;
{
@@ -1961,19 +1266,14 @@ rl_clear_screen (count, key)
return 0;
}
-#if !defined (__GO32__)
- if (term_clrpag)
- tputs (term_clrpag, 1, _rl_output_character_function);
- else
-#endif /* !__GO32__ */
- crlf ();
-
+ _rl_clear_screen (); /* calls termcap function to clear screen */
rl_forced_update_display ();
rl_display_fixed = 1;
return 0;
}
+int
rl_arrow_keys (count, c)
int count, c;
{
@@ -1981,22 +1281,22 @@ rl_arrow_keys (count, c)
ch = rl_read_key ();
- switch (to_upper (ch))
+ switch (_rl_to_upper (ch))
{
case 'A':
- rl_get_previous_history (count);
+ rl_get_previous_history (count, ch);
break;
case 'B':
- rl_get_next_history (count);
+ rl_get_next_history (count, ch);
break;
case 'C':
- rl_forward (count);
+ rl_forward (count, ch);
break;
case 'D':
- rl_backward (count);
+ rl_backward (count, ch);
break;
default:
@@ -2013,6 +1313,7 @@ rl_arrow_keys (count, c)
/* **************************************************************** */
/* Insert the character C at the current location, moving point forward. */
+int
rl_insert (count, c)
int count, c;
{
@@ -2024,7 +1325,7 @@ rl_insert (count, c)
/* If we can optimize, then do it. But don't let people crash
readline because of extra large arguments. */
- if (count > 1 && count < 1024)
+ if (count > 1 && count <= 1024)
{
string = xmalloc (1 + count);
@@ -2061,26 +1362,8 @@ rl_insert (count, c)
If there is pending input, then make a string of all of the
pending characters that are bound to rl_insert, and insert
them all. */
- if (any_typein)
- {
- int key = 0, t;
-
- i = 0;
- string = xmalloc (ibuffer_len + 1);
- string[i++] = c;
-
- while ((t = rl_get_char (&key)) &&
- (_rl_keymap[key].type == ISFUNC &&
- _rl_keymap[key].function == rl_insert))
- string[i++] = key;
-
- if (t)
- rl_unget_char (key);
-
- string[i] = '\0';
- rl_insert_text (string);
- free (string);
- }
+ if (_rl_any_typein ())
+ _rl_insert_typein (c);
else
{
/* Inserting a single character. */
@@ -2094,6 +1377,7 @@ rl_insert (count, c)
}
/* Insert the next typed character verbatim. */
+int
rl_quoted_insert (count, key)
int count, key;
{
@@ -2104,6 +1388,7 @@ rl_quoted_insert (count, key)
}
/* Insert a tab character. */
+int
rl_tab_insert (count, key)
int count, key;
{
@@ -2113,15 +1398,18 @@ rl_tab_insert (count, key)
/* What to do when a NEWLINE is pressed. We accept the whole line.
KEY is the key that invoked this command. I guess it could have
meaning in the future. */
+int
rl_newline (count, key)
int count, key;
{
rl_done = 1;
#if defined (VI_MODE)
- _rl_vi_done_inserting ();
- _rl_vi_reset_last ();
-
+ if (rl_editing_mode == vi_mode)
+ {
+ _rl_vi_done_inserting ();
+ _rl_vi_reset_last ();
+ }
#endif /* VI_MODE */
if (readline_echoing_p)
@@ -2129,22 +1417,11 @@ rl_newline (count, key)
return 0;
}
-rl_clean_up_for_exit ()
-{
- if (readline_echoing_p)
- {
- _rl_move_vert (_rl_vis_botlin);
- _rl_vis_botlin = 0;
- fflush (out_stream);
- rl_restart_output ();
- }
- return 0;
-}
-
/* What to do for some uppercase characters, like meta characters,
and some characters appearing in emacs_ctlx_keymap. This function
is just a stub, you bind keys to it and the code in _rl_dispatch ()
is special cased. */
+int
rl_do_lowercase_version (ignore1, ignore2)
int ignore1, ignore2;
{
@@ -2152,12 +1429,13 @@ rl_do_lowercase_version (ignore1, ignore2)
}
/* Rubout the character behind point. */
+int
rl_rubout (count, key)
int count, key;
{
if (count < 0)
{
- rl_delete (-count);
+ rl_delete (-count, key);
return 0;
}
@@ -2170,7 +1448,7 @@ rl_rubout (count, key)
if (count > 1 || rl_explicit_arg)
{
int orig_point = rl_point;
- rl_backward (count);
+ rl_backward (count, key);
rl_kill_text (orig_point, rl_point);
}
else
@@ -2190,13 +1468,12 @@ rl_rubout (count, key)
/* Delete the character under the cursor. Given a numeric argument,
kill that many characters instead. */
-rl_delete (count, invoking_key)
- int count, invoking_key;
+int
+rl_delete (count, key)
+ int count, key;
{
if (count < 0)
- {
- return (rl_rubout (-count));
- }
+ return (rl_rubout (-count, key));
if (rl_point == rl_end)
{
@@ -2207,7 +1484,7 @@ rl_delete (count, invoking_key)
if (count > 1 || rl_explicit_arg)
{
int orig_point = rl_point;
- rl_forward (count);
+ rl_forward (count, key);
rl_kill_text (orig_point, rl_point);
rl_point = orig_point;
return 0;
@@ -2218,6 +1495,7 @@ rl_delete (count, invoking_key)
}
/* Delete all spaces and tabs around point. */
+int
rl_delete_horizontal_space (count, ignore)
int count, ignore;
{
@@ -2239,67 +1517,24 @@ rl_delete_horizontal_space (count, ignore)
return 0;
}
-
-/* **************************************************************** */
-/* */
-/* Kill commands */
-/* */
-/* **************************************************************** */
-
-/* The next two functions mimic unix line editing behaviour, except they
- save the deleted text on the kill ring. This is safer than not saving
- it, and since we have a ring, nobody should get screwed. */
-
-/* This does what C-w does in Unix. We can't prevent people from
- using behaviour that they expect. */
-rl_unix_word_rubout (count, key)
- int count, key;
-{
- if (!rl_point)
- ding ();
- else
- {
- int orig_point = rl_point;
-
- while (rl_point && whitespace (the_line[rl_point - 1]))
- rl_point--;
-
- while (rl_point && !whitespace (the_line[rl_point - 1]))
- rl_point--;
-
- rl_kill_text (orig_point, rl_point);
- }
- return 0;
-}
+#ifndef RL_COMMENT_BEGIN_DEFAULT
+#define RL_COMMENT_BEGIN_DEFAULT "#"
+#endif
-/* Here is C-u doing what Unix does. You don't *have* to use these
- key-bindings. We have a choice of killing the entire line, or
- killing from where we are to the start of the line. We choose the
- latter, because if you are a Unix weenie, then you haven't backspaced
- into the line at all, and if you aren't, then you know what you are
- doing. */
-rl_unix_line_discard (count, key)
+/* Turn the current line into a comment in shell history.
+ A K*rn shell style function. */
+int
+rl_insert_comment (count, key)
int count, key;
{
- if (!rl_point)
- ding ();
- else
- {
- rl_kill_text (rl_point, 0);
- rl_point = 0;
- }
- return 0;
+ rl_beg_of_line (1, key);
+ rl_insert_text (_rl_comment_begin ? _rl_comment_begin
+ : RL_COMMENT_BEGIN_DEFAULT);
+ (*rl_redisplay_function) ();
+ rl_newline (1, '\n');
+ return (0);
}
-
-/* **************************************************************** */
-/* */
-/* Commands For Typos */
-/* */
-/* **************************************************************** */
-
-/* Random and interesting things in here. */
-
/* **************************************************************** */
/* */
/* Changing Case */
@@ -2314,6 +1549,7 @@ rl_unix_line_discard (count, key)
static int rl_change_case ();
/* Uppercase the word at point. */
+int
rl_upcase_word (count, key)
int count, key;
{
@@ -2321,6 +1557,7 @@ rl_upcase_word (count, key)
}
/* Lowercase the word at point. */
+int
rl_downcase_word (count, key)
int count, key;
{
@@ -2328,6 +1565,7 @@ rl_downcase_word (count, key)
}
/* Upcase the first letter, downcase the rest. */
+int
rl_capitalize_word (count, key)
int count, key;
{
@@ -2343,50 +1581,39 @@ static int
rl_change_case (count, op)
int count, op;
{
- register int start = rl_point, end;
- int state = 0;
+ register int start, end;
+ int inword, c;
- rl_forward_word (count);
+ start = rl_point;
+ rl_forward_word (count, 0);
end = rl_point;
if (count < 0)
- {
- int temp = start;
- start = end;
- end = temp;
- }
+ SWAP (start, end);
/* We are going to modify some text, so let's prepare to undo it. */
rl_modifying (start, end);
- for (; start < end; start++)
+ for (inword = 0; start < end; start++)
{
+ c = the_line[start];
switch (op)
{
case UpCase:
- the_line[start] = to_upper (the_line[start]);
+ the_line[start] = _rl_to_upper (c);
break;
case DownCase:
- the_line[start] = to_lower (the_line[start]);
+ the_line[start] = _rl_to_lower (c);
break;
case CapCase:
- if (state == 0)
- {
- the_line[start] = to_upper (the_line[start]);
- state = 1;
- }
- else
- {
- the_line[start] = to_lower (the_line[start]);
- }
- if (!pure_alphabetic (the_line[start]))
- state = 0;
+ the_line[start] = (inword == 0) ? _rl_to_upper (c) : _rl_to_lower (c);
+ inword = alphabetic (the_line[start]);
break;
default:
- abort ();
+ ding ();
return -1;
}
}
@@ -2401,6 +1628,7 @@ rl_change_case (count, op)
/* **************************************************************** */
/* Transpose the words at point. */
+int
rl_transpose_words (count, key)
int count, key;
{
@@ -2412,13 +1640,13 @@ rl_transpose_words (count, key)
return 0;
/* Find the two words. */
- rl_forward_word (count);
+ rl_forward_word (count, key);
w2_end = rl_point;
- rl_backward_word (1);
+ rl_backward_word (1, key);
w2_beg = rl_point;
- rl_backward_word (count);
+ rl_backward_word (count, key);
w1_beg = rl_point;
- rl_forward_word (1);
+ rl_forward_word (1, key);
w1_end = rl_point;
/* Do some check to make sure that there really are two words. */
@@ -2461,6 +1689,7 @@ rl_transpose_words (count, key)
/* Transpose the characters at point. If point is at the end of the line,
then transpose the characters before point. */
+int
rl_transpose_chars (count, key)
int count, key;
{
@@ -2490,189 +1719,83 @@ rl_transpose_chars (count, key)
rl_delete_text (rl_point, rl_point + 1);
rl_point += count;
- if (rl_point > rl_end)
- rl_point = rl_end;
- else if (rl_point < 0)
- rl_point = 0;
+ _rl_fix_point (0);
rl_insert_text (dummy);
rl_end_undo_group ();
return 0;
}
-
+
/* **************************************************************** */
/* */
-/* Undo, and Undoing */
+/* Character Searching */
/* */
/* **************************************************************** */
-/* The current undo list for THE_LINE. */
-UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL;
-
-/* Remember how to undo something. Concatenate some undos if that
- seems right. */
-void
-rl_add_undo (what, start, end, text)
- enum undo_code what;
- int start, end;
- char *text;
+int
+_rl_char_search_internal (count, dir, schar)
+ int count, dir, schar;
{
- UNDO_LIST *temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST));
- temp->what = what;
- temp->start = start;
- temp->end = end;
- temp->text = text;
- temp->next = rl_undo_list;
- rl_undo_list = temp;
-}
+ int pos, inc;
-/* Free the existing undo list. */
-void
-free_undo_list ()
-{
- while (rl_undo_list)
+ pos = rl_point;
+ inc = (dir < 0) ? -1 : 1;
+ while (count)
{
- UNDO_LIST *release = rl_undo_list;
- rl_undo_list = rl_undo_list->next;
-
- if (release->what == UNDO_DELETE)
- free (release->text);
+ if ((dir < 0 && pos <= 0) || (dir > 0 && pos >= rl_end))
+ {
+ ding ();
+ return -1;
+ }
- free (release);
+ pos += inc;
+ do
+ {
+ if (rl_line_buffer[pos] == schar)
+ {
+ count--;
+ if (dir < 0)
+ rl_point = (dir == BTO) ? pos + 1 : pos;
+ else
+ rl_point = (dir == FTO) ? pos - 1 : pos;
+ break;
+ }
+ }
+ while ((dir < 0) ? pos-- : ++pos < rl_end);
}
- rl_undo_list = (UNDO_LIST *)NULL;
-}
-
-/* Undo the next thing in the list. Return 0 if there
- is nothing to undo, or non-zero if there was. */
-int
-rl_do_undo ()
-{
- UNDO_LIST *release;
- int waiting_for_begin = 0;
-
-undo_thing:
- if (!rl_undo_list)
- return (0);
-
- doing_an_undo = 1;
-
- switch (rl_undo_list->what) {
-
- /* Undoing deletes means inserting some text. */
- case UNDO_DELETE:
- rl_point = rl_undo_list->start;
- rl_insert_text (rl_undo_list->text);
- free (rl_undo_list->text);
- break;
-
- /* Undoing inserts means deleting some text. */
- case UNDO_INSERT:
- rl_delete_text (rl_undo_list->start, rl_undo_list->end);
- rl_point = rl_undo_list->start;
- break;
-
- /* Undoing an END means undoing everything 'til we get to
- a BEGIN. */
- case UNDO_END:
- waiting_for_begin++;
- break;
-
- /* Undoing a BEGIN means that we are done with this group. */
- case UNDO_BEGIN:
- if (waiting_for_begin)
- waiting_for_begin--;
- else
- ding ();
- break;
- }
-
- doing_an_undo = 0;
-
- release = rl_undo_list;
- rl_undo_list = rl_undo_list->next;
- free (release);
-
- if (waiting_for_begin)
- goto undo_thing;
-
- return (1);
-}
-
-/* Begin a group. Subsequent undos are undone as an atomic operation. */
-int
-rl_begin_undo_group ()
-{
- rl_add_undo (UNDO_BEGIN, 0, 0, 0);
- return 0;
-}
-
-/* End an undo group started with rl_begin_undo_group (). */
-int
-rl_end_undo_group ()
-{
- rl_add_undo (UNDO_END, 0, 0, 0);
- return 0;
+ return (0);
}
-/* Save an undo entry for the text from START to END. */
-rl_modifying (start, end)
- int start, end;
+/* Search COUNT times for a character read from the current input stream.
+ FDIR is the direction to search if COUNT is non-negative; otherwise
+ the search goes in BDIR. */
+static int
+_rl_char_search (count, fdir, bdir)
+ int count, fdir, bdir;
{
- if (start > end)
- {
- int t = start;
- start = end;
- end = t;
- }
+ int c;
- if (start != end)
- {
- char *temp = rl_copy_text (start, end);
- rl_begin_undo_group ();
- rl_add_undo (UNDO_DELETE, start, end, temp);
- rl_add_undo (UNDO_INSERT, start, end, (char *)NULL);
- rl_end_undo_group ();
- }
- return 0;
+ c = rl_read_key ();
+ if (count < 0)
+ return (_rl_char_search_internal (-count, bdir, c));
+ else
+ return (_rl_char_search_internal (count, fdir, c));
}
-/* Revert the current line to its previous state. */
int
-rl_revert_line (count, key)
+rl_char_search (count, key)
int count, key;
{
- if (!rl_undo_list)
- ding ();
- else
- {
- while (rl_undo_list)
- rl_do_undo ();
- }
- return 0;
+ return (_rl_char_search (count, FFIND, BFIND));
}
-/* Do some undoing of things that were done. */
int
-rl_undo_command (count, key)
+rl_backward_char_search (count, key)
int count, key;
{
- if (count < 0)
- return 0; /* Nothing to do. */
-
- while (count)
- {
- if (rl_do_undo ())
- count--;
- else
- {
- ding ();
- break;
- }
- }
- return 0;
+ return (_rl_char_search (count, BFIND, FFIND));
}
-
+
/* **************************************************************** */
/* */
/* History Utilities */
@@ -2680,8 +1803,8 @@ rl_undo_command (count, key)
/* **************************************************************** */
/* We already have a history library, and that is what we use to control
- the history features of readline. However, this is our local interface
- to the history mechanism. */
+ the history features of readline. This is our local interface to
+ the history mechanism. */
/* While we are editing the history, this is the saved
version of the original line. */
@@ -2703,7 +1826,7 @@ void
_rl_free_history_entry (entry)
HIST_ENTRY *entry;
{
- if (!entry)
+ if (entry == 0)
return;
if (entry->line)
free (entry->line);
@@ -2711,10 +1834,12 @@ _rl_free_history_entry (entry)
}
/* Perhaps put back the current line if it has changed. */
+int
maybe_replace_line ()
{
- HIST_ENTRY *temp = current_history ();
+ HIST_ENTRY *temp;
+ temp = current_history ();
/* If the current line has changed, save the changes. */
if (temp && ((UNDO_LIST *)(temp->data) != rl_undo_list))
{
@@ -2726,12 +1851,13 @@ maybe_replace_line ()
}
/* Put back the saved_line_for_history if there is one. */
+int
maybe_unsave_line ()
{
+ int line_len;
+
if (saved_line_for_history)
{
- int line_len;
-
line_len = strlen (saved_line_for_history->line);
if (line_len >= rl_line_buffer_len)
@@ -2749,9 +1875,10 @@ maybe_unsave_line ()
}
/* Save the current line in saved_line_for_history. */
+int
maybe_save_line ()
{
- if (!saved_line_for_history)
+ if (saved_line_for_history == 0)
{
saved_line_for_history = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
saved_line_for_history->line = savestring (the_line);
@@ -2759,7 +1886,7 @@ maybe_save_line ()
}
return 0;
}
-
+
/* **************************************************************** */
/* */
/* History Commands */
@@ -2767,13 +1894,15 @@ maybe_save_line ()
/* **************************************************************** */
/* Meta-< goes to the start of the history. */
+int
rl_beginning_of_history (count, key)
int count, key;
{
- return (rl_get_previous_history (1 + where_history ()));
+ return (rl_get_previous_history (1 + where_history (), key));
}
/* Meta-> goes to the end of the history. (The current line). */
+int
rl_end_of_history (count, key)
int count, key;
{
@@ -2784,19 +1913,22 @@ rl_end_of_history (count, key)
}
/* Move down to the next history line. */
+int
rl_get_next_history (count, key)
int count, key;
{
- HIST_ENTRY *temp = (HIST_ENTRY *)NULL;
+ HIST_ENTRY *temp;
+ int line_len;
if (count < 0)
- return (rl_get_previous_history (-count));
+ return (rl_get_previous_history (-count, key));
- if (!count)
+ if (count == 0)
return 0;
maybe_replace_line ();
+ temp = (HIST_ENTRY *)NULL;
while (count)
{
temp = next_history ();
@@ -2805,12 +1937,10 @@ rl_get_next_history (count, key)
--count;
}
- if (!temp)
+ if (temp == 0)
maybe_unsave_line ();
else
{
- int line_len;
-
line_len = strlen (temp->line);
if (line_len >= rl_line_buffer_len)
@@ -2829,16 +1959,17 @@ rl_get_next_history (count, key)
/* Get the previous item out of our interactive history, making it the current
line. If there is no previous history, just ding. */
+int
rl_get_previous_history (count, key)
int count, key;
{
- HIST_ENTRY *old_temp = (HIST_ENTRY *)NULL;
- HIST_ENTRY *temp = (HIST_ENTRY *)NULL;
+ HIST_ENTRY *old_temp, *temp;
+ int line_len;
if (count < 0)
- return (rl_get_next_history (-count));
+ return (rl_get_next_history (-count, key));
- if (!count)
+ if (count == 0)
return 0;
/* If we don't have a line saved, then save this one. */
@@ -2847,13 +1978,14 @@ rl_get_previous_history (count, key)
/* If the current line has changed, save the changes. */
maybe_replace_line ();
+ temp = old_temp = (HIST_ENTRY *)NULL;
while (count)
{
temp = previous_history ();
- if (!temp)
+ if (temp == 0)
break;
- else
- old_temp = temp;
+
+ old_temp = temp;
--count;
}
@@ -2862,12 +1994,10 @@ rl_get_previous_history (count, key)
if (!temp && old_temp)
temp = old_temp;
- if (!temp)
+ if (temp == 0)
ding ();
else
{
- int line_len;
-
line_len = strlen (temp->line);
if (line_len >= rl_line_buffer_len)
@@ -2885,14 +2015,6 @@ rl_get_previous_history (count, key)
return 0;
}
-/* Make C be the next command to be executed. */
-rl_execute_next (c)
- int c;
-{
- rl_pending_input = c;
- return 0;
-}
-
/* **************************************************************** */
/* */
/* The Mark and the Region. */
@@ -2900,7 +2022,8 @@ rl_execute_next (c)
/* **************************************************************** */
/* Set the mark at POSITION. */
-rl_set_mark (position)
+int
+_rl_set_mark_at_pos (position)
int position;
{
if (position > rl_end)
@@ -2910,8 +2033,17 @@ rl_set_mark (position)
return 0;
}
+/* A bindable command to set the mark. */
+int
+rl_set_mark (count, key)
+ int count, key;
+{
+ return (_rl_set_mark_at_pos (rl_explicit_arg ? count : rl_point));
+}
+
/* Exchange the position of mark and point. */
-rl_exchange_mark_and_point (count, key)
+int
+rl_exchange_point_and_mark (count, key)
int count, key;
{
if (rl_mark > rl_end)
@@ -2923,347 +2055,29 @@ rl_exchange_mark_and_point (count, key)
return -1;
}
else
- {
- int temp = rl_point;
+ SWAP (rl_point, rl_mark);
- rl_point = rl_mark;
- rl_mark = temp;
- }
return 0;
}
-
/* **************************************************************** */
/* */
-/* Killing Mechanism */
+/* Editing Modes */
/* */
/* **************************************************************** */
-
-/* What we assume for a max number of kills. */
-#define DEFAULT_MAX_KILLS 10
-
-/* The real variable to look at to find out when to flush kills. */
-int rl_max_kills = DEFAULT_MAX_KILLS;
-
-/* Where to store killed text. */
-char **rl_kill_ring = (char **)NULL;
-
-/* Where we are in the kill ring. */
-int rl_kill_index = 0;
-
-/* How many slots we have in the kill ring. */
-int rl_kill_ring_length = 0;
-
-/* How to say that you only want to save a certain amount
- of kill material. */
-rl_set_retained_kills (num)
- int num;
-{
- return 0;
-}
-
-/* The way to kill something. This appends or prepends to the last
- kill, if the last command was a kill command. if FROM is less
- than TO, then the text is appended, otherwise prepended. If the
- last command was not a kill command, then a new slot is made for
- this kill. */
-rl_kill_text (from, to)
- int from, to;
-{
- int slot;
- char *text;
-
- /* Is there anything to kill? */
- if (from == to)
- {
- last_command_was_kill++;
- return 0;
- }
-
- text = rl_copy_text (from, to);
-
- /* Delete the copied text from the line. */
- rl_delete_text (from, to);
-
- /* First, find the slot to work with. */
- if (!last_command_was_kill)
- {
- /* Get a new slot. */
- if (!rl_kill_ring)
- {
- /* If we don't have any defined, then make one. */
- rl_kill_ring = (char **)
- xmalloc (((rl_kill_ring_length = 1) + 1) * sizeof (char *));
- rl_kill_ring[slot = 0] = (char *)NULL;
- }
- else
- {
- /* We have to add a new slot on the end, unless we have
- exceeded the max limit for remembering kills. */
- slot = rl_kill_ring_length;
- if (slot == rl_max_kills)
- {
- register int i;
- free (rl_kill_ring[0]);
- for (i = 0; i < slot; i++)
- rl_kill_ring[i] = rl_kill_ring[i + 1];
- }
- else
- {
- slot = rl_kill_ring_length += 1;
- rl_kill_ring = (char **)xrealloc (rl_kill_ring, slot * sizeof (char *));
- }
- rl_kill_ring[--slot] = (char *)NULL;
- }
- }
- else
- slot = rl_kill_ring_length - 1;
-
- /* If the last command was a kill, prepend or append. */
- if (last_command_was_kill && rl_editing_mode != vi_mode)
- {
- char *old = rl_kill_ring[slot];
- char *new = xmalloc (1 + strlen (old) + strlen (text));
-
- if (from < to)
- {
- strcpy (new, old);
- strcat (new, text);
- }
- else
- {
- strcpy (new, text);
- strcat (new, old);
- }
- free (old);
- free (text);
- rl_kill_ring[slot] = new;
- }
- else
- {
- rl_kill_ring[slot] = text;
- }
- rl_kill_index = slot;
- last_command_was_kill++;
- return 0;
-}
-
-/* Now REMEMBER! In order to do prepending or appending correctly, kill
- commands always make rl_point's original position be the FROM argument,
- and rl_point's extent be the TO argument. */
-
-/* **************************************************************** */
-/* */
-/* Killing Commands */
-/* */
-/* **************************************************************** */
-
-/* Delete the word at point, saving the text in the kill ring. */
-rl_kill_word (count, key)
- int count, key;
-{
- int orig_point = rl_point;
-
- if (count < 0)
- return (rl_backward_kill_word (-count));
- else
- {
- rl_forward_word (count);
-
- if (rl_point != orig_point)
- rl_kill_text (orig_point, rl_point);
-
- rl_point = orig_point;
- }
- return 0;
-}
-
-/* Rubout the word before point, placing it on the kill ring. */
-rl_backward_kill_word (count, ignore)
- int count, ignore;
-{
- int orig_point = rl_point;
-
- if (count < 0)
- return (rl_kill_word (-count));
- else
- {
- rl_backward_word (count);
-
- if (rl_point != orig_point)
- rl_kill_text (orig_point, rl_point);
- }
- return 0;
-}
-
-/* Kill from here to the end of the line. If DIRECTION is negative, kill
- back to the line start instead. */
-rl_kill_line (direction, ignore)
- int direction, ignore;
-{
- int orig_point = rl_point;
-
- if (direction < 0)
- return (rl_backward_kill_line (1));
- else
- {
- rl_end_of_line ();
- if (orig_point != rl_point)
- rl_kill_text (orig_point, rl_point);
- rl_point = orig_point;
- }
- return 0;
-}
-
-/* Kill backwards to the start of the line. If DIRECTION is negative, kill
- forwards to the line end instead. */
-rl_backward_kill_line (direction, ignore)
- int direction, ignore;
-{
- int orig_point = rl_point;
-
- if (direction < 0)
- return (rl_kill_line (1));
- else
- {
- if (!rl_point)
- ding ();
- else
- {
- rl_beg_of_line ();
- rl_kill_text (orig_point, rl_point);
- }
- }
- return 0;
-}
-
-/* Kill the whole line, no matter where point is. */
-rl_kill_full_line (count, ignore)
- int count, ignore;
-{
- rl_begin_undo_group ();
- rl_point = 0;
- rl_kill_text (rl_point, rl_end);
- rl_end_undo_group ();
- return 0;
-}
-
-/* Yank back the last killed text. This ignores arguments. */
-rl_yank (count, ignore)
- int count, ignore;
-{
- if (!rl_kill_ring)
- {
- rl_abort ();
- return -1;
- }
-
- rl_set_mark (rl_point);
- rl_insert_text (rl_kill_ring[rl_kill_index]);
- return 0;
-}
-
-/* If the last command was yank, or yank_pop, and the text just
- before point is identical to the current kill item, then
- delete that text from the line, rotate the index down, and
- yank back some other text. */
-rl_yank_pop (count, key)
- int count, key;
-{
- int l;
-
- if (((rl_last_func != rl_yank_pop) && (rl_last_func != rl_yank)) ||
- !rl_kill_ring)
- {
- rl_abort ();
- return -1;
- }
-
- l = strlen (rl_kill_ring[rl_kill_index]);
- if (((rl_point - l) >= 0) &&
- (strncmp (the_line + (rl_point - l),
- rl_kill_ring[rl_kill_index], l) == 0))
- {
- rl_delete_text ((rl_point - l), rl_point);
- rl_point -= l;
- rl_kill_index--;
- if (rl_kill_index < 0)
- rl_kill_index = rl_kill_ring_length - 1;
- rl_yank (1, 0);
- return 0;
- }
- else
- {
- rl_abort ();
- return -1;
- }
-}
-
-/* Yank the COUNTth argument from the previous history line. */
-rl_yank_nth_arg (count, ignore)
- int count, ignore;
-{
- register HIST_ENTRY *entry = previous_history ();
- char *arg;
-
- if (entry)
- next_history ();
- else
- {
- ding ();
- return -1;
- }
-
- arg = history_arg_extract (count, count, entry->line);
- if (!arg || !*arg)
- {
- ding ();
- return -1;
- }
-
- rl_begin_undo_group ();
-
-#if defined (VI_MODE)
- /* Vi mode always inserts a space before yanking the argument, and it
- inserts it right *after* rl_point. */
- if (rl_editing_mode == vi_mode)
- {
- rl_vi_append_mode ();
- rl_insert_text (" ");
- }
-#endif /* VI_MODE */
-
- rl_insert_text (arg);
- free (arg);
-
- rl_end_undo_group ();
- return 0;
-}
-
-/* Yank the last argument from the previous history line. This `knows'
- how rl_yank_nth_arg treats a count of `$'. With an argument, this
- behaves the same as rl_yank_nth_arg. */
-int
-rl_yank_last_arg (count, key)
- int count, key;
-{
- if (rl_explicit_arg)
- return (rl_yank_nth_arg (count, key));
- else
- return (rl_yank_nth_arg ('$', key));
-}
-
/* How to toggle back and forth between editing modes. */
+int
rl_vi_editing_mode (count, key)
int count, key;
{
#if defined (VI_MODE)
rl_editing_mode = vi_mode;
- rl_vi_insertion_mode ();
- return 0;
+ rl_vi_insertion_mode (1, key);
#endif /* VI_MODE */
+ return 0;
}
+int
rl_emacs_editing_mode (count, key)
int count, key;
{
@@ -3271,257 +2085,3 @@ rl_emacs_editing_mode (count, key)
_rl_keymap = emacs_standard_keymap;
return 0;
}
-
-
-/* **************************************************************** */
-/* */
-/* USG (System V) Support */
-/* */
-/* **************************************************************** */
-
-int
-rl_getc (stream)
- FILE *stream;
-{
- int result;
- unsigned char c;
-
-#if defined (__GO32__)
- if (isatty (0))
- return (getkey () & 0x7F);
-#endif /* __GO32__ */
-
- while (1)
- {
- result = read (fileno (stream), &c, sizeof (unsigned char));
-
- if (result == sizeof (unsigned char))
- return (c);
-
- /* If zero characters are returned, then the file that we are
- reading from is empty! Return EOF in that case. */
- if (result == 0)
- return (EOF);
-
-#if defined (EWOULDBLOCK)
- if (errno == EWOULDBLOCK)
- {
- int flags;
-
- if ((flags = fcntl (fileno (stream), F_GETFL, 0)) < 0)
- return (EOF);
- if (flags & O_NDELAY)
- {
- flags &= ~O_NDELAY;
- fcntl (fileno (stream), F_SETFL, flags);
- continue;
- }
- continue;
- }
-#endif /* EWOULDBLOCK */
-
-#if defined (_POSIX_VERSION) && defined (EAGAIN) && defined (O_NONBLOCK)
- if (errno == EAGAIN)
- {
- int flags;
-
- if ((flags = fcntl (fileno (stream), F_GETFL, 0)) < 0)
- return (EOF);
- if (flags & O_NONBLOCK)
- {
- flags &= ~O_NONBLOCK;
- fcntl (fileno (stream), F_SETFL, flags);
- continue;
- }
- }
-#endif /* _POSIX_VERSION && EAGAIN && O_NONBLOCK */
-
-#if !defined (__GO32__)
- /* If the error that we received was SIGINT, then try again,
- this is simply an interrupted system call to read ().
- Otherwise, some error ocurred, also signifying EOF. */
- if (errno != EINTR)
- return (EOF);
-#endif /* !__GO32__ */
- }
-}
-
-#if !defined (SHELL)
-#ifdef savestring
-#undef savestring
-#endif
-/* Backwards compatibilty, now that savestring has been removed from
- all `public' readline header files. */
-char *
-savestring (s)
- char *s;
-{
- return ((char *)strcpy (xmalloc (1 + (int)strlen (s)), (s)));
-}
-#endif
-
-/* Function equivalents for the macros defined in chartypes.h. */
-#undef uppercase_p
-int
-uppercase_p (c)
- int c;
-{
- return (isupper (c));
-}
-
-#undef lowercase_p
-int
-lowercase_p (c)
- int c;
-{
- return (islower (c));
-}
-
-#undef pure_alphabetic
-int
-pure_alphabetic (c)
- int c;
-{
- return (isupper (c) || islower (c));
-}
-
-#undef digit_p
-int
-digit_p (c)
- int c;
-{
- return (isdigit (c));
-}
-
-#undef to_lower
-int
-to_lower (c)
- int c;
-{
- return (isupper (c) ? tolower (c) : c);
-}
-
-#undef to_upper
-int
-to_upper (c)
- int c;
-{
- return (islower (c) ? toupper (c) : c);
-}
-
-#undef digit_value
-int
-digit_value (c)
- int c;
-{
- return (isdigit (c) ? c - '0' : c);
-}
-
-#if defined (STATIC_MALLOC)
-
-/* **************************************************************** */
-/* */
-/* xmalloc and xrealloc () */
-/* */
-/* **************************************************************** */
-
-static void memory_error_and_abort ();
-
-static char *
-xmalloc (bytes)
- int bytes;
-{
- char *temp = (char *)malloc (bytes);
-
- if (!temp)
- memory_error_and_abort ();
- return (temp);
-}
-
-static char *
-xrealloc (pointer, bytes)
- char *pointer;
- int bytes;
-{
- char *temp;
-
- if (!pointer)
- temp = (char *)malloc (bytes);
- else
- temp = (char *)realloc (pointer, bytes);
-
- if (!temp)
- memory_error_and_abort ();
-
- return (temp);
-}
-
-static void
-memory_error_and_abort ()
-{
- fprintf (stderr, "readline: Out of virtual memory!\n");
- abort ();
-}
-#endif /* STATIC_MALLOC */
-
-
-/* **************************************************************** */
-/* */
-/* Testing Readline */
-/* */
-/* **************************************************************** */
-
-#if defined (TEST)
-
-main ()
-{
- HIST_ENTRY **history_list ();
- char *temp = (char *)NULL;
- char *prompt = "readline% ";
- int done = 0;
-
- while (!done)
- {
- temp = readline (prompt);
-
- /* Test for EOF. */
- if (!temp)
- exit (1);
-
- /* If there is anything on the line, print it and remember it. */
- if (*temp)
- {
- fprintf (stderr, "%s\r\n", temp);
- add_history (temp);
- }
-
- /* Check for `command' that we handle. */
- if (strcmp (temp, "quit") == 0)
- done = 1;
-
- if (strcmp (temp, "list") == 0)
- {
- HIST_ENTRY **list = history_list ();
- register int i;
- if (list)
- {
- for (i = 0; list[i]; i++)
- {
- fprintf (stderr, "%d: %s\r\n", i, list[i]->line);
- free (list[i]->line);
- }
- free (list);
- }
- }
- free (temp);
- }
-}
-
-#endif /* TEST */
-
-
-/*
- * Local variables:
- * compile-command: "gcc -g -traditional -I. -I.. -DTEST -o readline readline.c keymaps.o funmap.o history.o -ltermcap"
- * end:
- */
diff --git a/readline.h b/readline.h
index b397177..d6c1a5c 100644
--- a/readline.h
+++ b/readline.h
@@ -31,15 +31,44 @@
# include <readline/tilde.h>
#endif
-/* The functions for manipulating the text of the line within readline.
-Most of these functions are bound to keys by default. */
+/* Readline data structures. */
+
+/* Maintaining the state of undo. We remember individual deletes and inserts
+ on a chain of things to do. */
+
+/* The actions that undo knows how to undo. Notice that UNDO_DELETE means
+ to insert some text, and UNDO_INSERT means to delete some text. I.e.,
+ the code tells undo what to undo, not how to undo it. */
+enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END };
+
+/* What an element of THE_UNDO_LIST looks like. */
+typedef struct undo_list {
+ struct undo_list *next;
+ int start, end; /* Where the change took place. */
+ char *text; /* The text to insert, if undoing a delete. */
+ enum undo_code what; /* Delete, Insert, Begin, End. */
+} UNDO_LIST;
+
+/* The current undo list for RL_LINE_BUFFER. */
+extern UNDO_LIST *rl_undo_list;
+
+/* The data structure for mapping textual names to code addresses. */
+typedef struct _funmap {
+ char *name;
+ Function *function;
+} FUNMAP;
+
+extern FUNMAP **funmap;
+
+/* Functions available to bind to key sequences. */
extern int
- rl_tilde_expand (),
+ rl_tilde_expand (), rl_set_mark (), rl_exchange_point_and_mark (),
rl_beg_of_line (), rl_backward (), rl_delete (), rl_end_of_line (),
- rl_forward (), ding (), rl_backward (), rl_newline (), rl_kill_line (),
+ rl_forward (), ding (), rl_newline (), rl_kill_line (),
+ rl_copy_region_to_kill (), rl_kill_region (), rl_char_search (),
rl_clear_screen (), rl_get_next_history (), rl_get_previous_history (),
rl_quoted_insert (), rl_reverse_search_history (), rl_transpose_chars (),
- rl_unix_line_discard (), rl_quoted_insert (), rl_unix_word_rubout (),
+ rl_unix_line_discard (), rl_unix_word_rubout (),
rl_yank (), rl_rubout (), rl_backward_word (), rl_kill_word (),
rl_forward_word (), rl_tab_insert (), rl_yank_pop (), rl_yank_nth_arg (),
rl_backward_kill_word (), rl_backward_kill_line (), rl_transpose_words (),
@@ -49,28 +78,21 @@ extern int
rl_undo_command (), rl_revert_line (), rl_beginning_of_history (),
rl_end_of_history (), rl_forward_search_history (), rl_insert (),
rl_upcase_word (), rl_downcase_word (), rl_capitalize_word (),
- rl_restart_output (), rl_re_read_init_file (), rl_dump_functions (),
+ rl_restart_output (), rl_re_read_init_file (),
+ rl_dump_functions (), rl_dump_variables (), rl_dump_macros (),
rl_delete_horizontal_space (), rl_history_search_forward (),
- rl_history_search_backward (), rl_tty_status (), rl_yank_last_arg ();
-
-/* `Public' utility functions. */
-extern int rl_insert_text (), rl_delete_text (), rl_kill_text ();
-extern int rl_complete_internal ();
-extern int rl_expand_prompt ();
-extern int rl_initialize ();
-extern int rl_set_signals (), rl_clear_signals ();
-extern int rl_init_argument (), rl_digit_argument ();
-extern int rl_read_key (), rl_getc (), rl_stuff_char ();
-extern int maybe_save_line (), maybe_unsave_line (), maybe_replace_line ();
-extern int rl_modifying ();
-
-extern int rl_begin_undo_group (), rl_end_undo_group ();
-extern void rl_add_undo (), free_undo_list ();
-extern int rl_do_undo ();
+ rl_history_search_backward (), rl_tty_status (), rl_yank_last_arg (),
+ rl_insert_comment (), rl_backward_char_search (),
+ rl_copy_forward_word (), rl_copy_backward_word ();
/* Not available unless readline is compiled -DPAREN_MATCHING. */
extern int rl_insert_close ();
+/* Not available unless READLINE_CALLBACKS is defined. */
+extern void rl_callback_handler_install ();
+extern void rl_callback_read_char ();
+extern void rl_callback_handler_remove ();
+
/* These are *both* defined even when VI_MODE is not. */
extern int rl_vi_editing_mode (), rl_emacs_editing_mode ();
@@ -80,13 +102,13 @@ extern int
rl_noninc_forward_search_again (), rl_noninc_reverse_search_again ();
/* Things for vi mode. Not available unless readline is compiled -DVI_MODE. */
-extern int rl_vi_check (), rl_vi_textmod_command ();
+extern int rl_vi_check ();
extern int
- rl_vi_redo (), rl_vi_tilde_expand (),
+ rl_vi_undo (), rl_vi_redo (), rl_vi_tilde_expand (),
rl_vi_movement_mode (), rl_vi_insertion_mode (), rl_vi_arg_digit (),
rl_vi_prev_word (), rl_vi_next_word (), rl_vi_char_search (),
rl_vi_eof_maybe (), rl_vi_append_mode (), rl_vi_put (),
- rl_vi_append_eol (), rl_vi_insert_beg (), rl_vi_delete (), rl_vi_comment (),
+ rl_vi_append_eol (), rl_vi_insert_beg (), rl_vi_delete (),
rl_vi_first_print (), rl_vi_fword (), rl_vi_fWord (), rl_vi_bword (),
rl_vi_bWord (), rl_vi_eword (), rl_vi_eWord (), rl_vi_end_word (),
rl_vi_change_case (), rl_vi_match (), rl_vi_bracktype (),
@@ -94,40 +116,112 @@ extern int
rl_vi_search_again (), rl_vi_subst (), rl_vi_overstrike (),
rl_vi_overstrike_delete (), rl_vi_replace(), rl_vi_column (),
rl_vi_delete_to (), rl_vi_change_to (), rl_vi_yank_to (),
- rl_vi_complete (), rl_vi_fetch_history ();
+ rl_vi_complete (), rl_vi_fetch_history (), rl_vi_set_mark (),
+ rl_vi_goto_mark (), rl_vi_back_to_indent ();
/* Keyboard macro commands. */
extern int rl_start_kbd_macro (), rl_end_kbd_macro ();
extern int rl_call_last_kbd_macro ();
+extern void rl_push_macro_input ();
extern int rl_arrow_keys(), rl_refresh_line ();
-/* Maintaining the state of undo. We remember individual deletes and inserts
- on a chain of things to do. */
+/* **************************************************************** */
+/* */
+/* Well Published Functions */
+/* */
+/* **************************************************************** */
-/* The actions that undo knows how to undo. Notice that UNDO_DELETE means
- to insert some text, and UNDO_INSERT means to delete some text. I.e.,
- the code tells undo what to undo, not how to undo it. */
-enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END };
+/* Readline functions. */
+/* Read a line of input. Prompt with PROMPT. A NULL PROMPT means none. */
+extern char *readline ();
-/* What an element of THE_UNDO_LIST looks like. */
-typedef struct undo_list {
- struct undo_list *next;
- int start, end; /* Where the change took place. */
- char *text; /* The text to insert, if undoing a delete. */
- enum undo_code what; /* Delete, Insert, Begin, End. */
-} UNDO_LIST;
+/* These functions are from bind.c. */
+/* rl_add_defun (char *name, Function *function, int key)
+ Add NAME to the list of named functions. Make FUNCTION
+ be the function that gets called.
+ If KEY is not -1, then bind it. */
+extern int rl_add_defun ();
-/* The current undo list for RL_LINE_BUFFER. */
-extern UNDO_LIST *rl_undo_list;
+extern Keymap rl_make_bare_keymap ();
+extern Keymap rl_copy_keymap ();
+extern Keymap rl_make_keymap ();
+extern void rl_discard_keymap ();
+extern Keymap rl_get_keymap (), rl_get_keymap_by_name ();
+extern void rl_set_keymap ();
+extern char *rl_get_keymap_name ();
-/* The data structure for mapping textual names to code addresses. */
-typedef struct {
- char *name;
- Function *function;
-} FUNMAP;
+extern int rl_bind_key (), rl_bind_key_in_map ();
+extern int rl_unbind_key (), rl_unbind_key_in_map ();
+extern int rl_set_key ();
+extern int rl_generic_bind ();
+extern int rl_parse_and_bind ();
+/* Backwards compatibility, use rl_generic_bind instead. */
+extern int rl_macro_bind (), rl_variable_bind ();
-extern FUNMAP **funmap;
+extern int rl_read_init_file ();
+
+extern Function *rl_named_function (), *rl_function_of_keyseq ();
+extern char **rl_invoking_keyseqs (), **rl_invoking_keyseqs_in_map ();
+extern void rl_function_dumper ();
+extern void rl_variable_dumper ();
+extern void rl_macro_dumper ();
+extern void rl_list_funmap_names ();
+
+/* Undocumented in the texinfo manual; not really useful to programs. */
+extern int rl_translate_keyseq ();
+extern void rl_initialize_funmap ();
+
+/* Functions for undoing. */
+extern int rl_begin_undo_group (), rl_end_undo_group ();
+extern void rl_add_undo (), free_undo_list ();
+extern int rl_do_undo ();
+extern int rl_modifying ();
+
+/* Functions for redisplay. */
+extern void rl_redisplay ();
+extern int rl_forced_update_display ();
+extern int rl_clear_message ();
+extern int rl_reset_line_state ();
+extern int rl_on_new_line ();
+
+#if defined (__STDC__) && defined (USE_VARARGS) && defined (PREFER_STDARG)
+extern int rl_message (const char *, ...);
+#else
+extern int rl_message ();
+#endif
+
+/* Undocumented in texinfo manual. */
+extern int rl_character_len ();
+extern int rl_show_char ();
+extern int crlf ();
+
+/* Modifying text. */
+extern int rl_insert_text (), rl_delete_text ();
+extern int rl_kill_text ();
+extern char *rl_copy_text ();
+
+/* `Public' utility functions. */
+extern int rl_reset_terminal ();
+extern int rl_stuff_char ();
+extern int rl_read_key (), rl_getc ();
+
+extern int rl_initialize ();
+
+/* Undocumented. */
+extern int rl_expand_prompt ();
+extern int rl_set_signals (), rl_clear_signals ();
+extern int maybe_save_line (), maybe_unsave_line (), maybe_replace_line ();
+
+/* Completion functions. */
+/* These functions are from complete.c. */
+extern int rl_complete_internal ();
+
+/* Return an array of strings which are the result of repeatadly calling
+ FUNC with TEXT. */
+extern char **completion_matches ();
+extern char *username_completion_function ();
+extern char *filename_completion_function ();
/* **************************************************************** */
/* */
@@ -135,43 +229,58 @@ extern FUNMAP **funmap;
/* */
/* **************************************************************** */
+/* The version of this incarnation of the readline library. */
+extern char *rl_library_version;
+
/* The name of the calling program. You should initialize this to
whatever was in argv[0]. It is used when parsing conditionals. */
extern char *rl_readline_name;
+/* The prompt readline uses. This is set from the argument to
+ readline (), and should not be assigned to directly. */
+extern char *rl_prompt;
+
/* The line buffer that is in use. */
extern char *rl_line_buffer;
/* The location of point, and end. */
extern int rl_point, rl_end;
+extern int rl_mark;
+
+extern int rl_done;
+
+extern int rl_pending_input;
+
+/* Non-zero if we called this function from _rl_dispatch(). It's present
+ so functions can find out whether they were called from a key binding
+ or directly from an application. */
+int rl_dispatching;
+
/* The name of the terminal to use. */
extern char *rl_terminal_name;
/* The input and output streams. */
extern FILE *rl_instream, *rl_outstream;
-/* The basic list of characters that signal a break between words for the
- completer routine. The initial contents of this variable is what
- breaks words in the shell, i.e. "n\"\\'`@$>". */
-extern char *rl_basic_word_break_characters;
+/* If non-zero, then this is the address of a function to call just
+ before readline_internal () prints the first prompt. */
+extern Function *rl_startup_hook;
-/* The list of characters that signal a break between words for
- rl_complete_internal. The default list is the contents of
- rl_basic_word_break_characters. */
-extern char *rl_completer_word_break_characters;
+/* The address of a function to call periodically while Readline is
+ awaiting character input, or NULL, for no event handling. */
+extern Function *rl_event_hook;
-/* List of characters which can be used to quote a substring of the line.
- Completion occurs on the entire substring, and within the substring
- rl_completer_word_break_characters are treated as any other character,
- unless they also appear within this list. */
-extern char *rl_completer_quote_characters;
+extern Function *rl_getc_function;
+extern VFunction *rl_redisplay_function;
+extern VFunction *rl_prep_term_function;
+extern VFunction *rl_deprep_term_function;
-/* List of characters that are word break characters, but should be left
- in TEXT when it is passed to the completion function. The shell uses
- this to help determine what kind of completing to do. */
-extern char *rl_special_prefixes;
+/* Dispatch variables. */
+extern Keymap rl_executing_keymap;
+extern Keymap rl_binding_keymap;
+/* Completion variables. */
/* Pointer to the generator function for completion_matches ().
NULL means to use filename_entry_function (), the default filename
completer. */
@@ -194,9 +303,32 @@ extern Function *rl_ignore_some_completions_function;
array of strings returned. */
extern CPPFunction *rl_attempted_completion_function;
-/* If non-zero, then this is the address of a function to call just
- before readline_internal () prints the first prompt. */
-extern Function *rl_startup_hook;
+/* The basic list of characters that signal a break between words for the
+ completer routine. The initial contents of this variable is what
+ breaks words in the shell, i.e. "n\"\\'`@$>". */
+extern char *rl_basic_word_break_characters;
+
+/* The list of characters that signal a break between words for
+ rl_complete_internal. The default list is the contents of
+ rl_basic_word_break_characters. */
+extern char *rl_completer_word_break_characters;
+
+/* List of characters which can be used to quote a substring of the line.
+ Completion occurs on the entire substring, and within the substring
+ rl_completer_word_break_characters are treated as any other character,
+ unless they also appear within this list. */
+extern char *rl_completer_quote_characters;
+
+/* List of quote characters which cause a word break. */
+extern char *rl_basic_quote_characters;
+
+/* List of characters that need to be quoted in filenames by the completer. */
+extern char *rl_filename_quote_characters;
+
+/* List of characters that are word break characters, but should be left
+ in TEXT when it is passed to the completion function. The shell uses
+ this to help determine what kind of completing to do. */
+extern char *rl_special_prefixes;
/* If non-zero, then this is the address of a function to call when
completing on a directory name. The function is called with
@@ -206,14 +338,6 @@ extern Function *rl_directory_completion_hook;
/* Backwards compatibility with previous versions of readline. */
#define rl_symbolic_link_hook rl_directory_completion_hook
-/* The address of a function to call periodically while Readline is
- awaiting character input, or NULL, for no event handling. */
-extern Function *rl_event_hook;
-
-/* Non-zero means that modified history lines are preceded
- with an asterisk. */
-extern int rl_show_star;
-
/* Non-zero means that the results of the matches are to be treated
as filenames. This is ALWAYS zero on entry, and can only be changed
within a completion entry finder function. */
@@ -226,62 +350,57 @@ extern int rl_filename_completion_desired;
entry finder function. */
extern int rl_filename_quoting_desired;
+/* Set to a function to quote a filename in an application-specific fashion.
+ Called with the text to quote, the type of match found (single or multiple)
+ and a pointer to the quoting character to be used, which the function can
+ reset if desired. */
+extern CPFunction *rl_filename_quoting_function;
+
+/* Function to call to remove quoting characters from a filename. Called
+ before completion is attempted, so the embedded quotes do not interfere
+ with matching names in the file system. */
+extern CPFunction *rl_filename_dequoting_function;
+
+/* Function to call to decide whether or not a word break character is
+ quoted. If a character is quoted, it does not break words for the
+ completer. */
+extern Function *rl_char_is_quoted_p;
+
/* Non-zero means to suppress normal filename completion after the
user-specified completion function has been called. */
extern int rl_attempted_completion_over;
-/* **************************************************************** */
-/* */
-/* Well Published Functions */
-/* */
-/* **************************************************************** */
-
-/* Read a line of input. Prompt with PROMPT. A NULL PROMPT means none. */
-extern char *readline ();
-
-/* These functions are from complete.c. */
-/* Return an array of strings which are the result of repeatadly calling
- FUNC with TEXT. */
-extern char **completion_matches ();
-extern char *username_completion_function ();
-extern char *filename_completion_function ();
+/* Set to a character describing the type of completion being attempted by
+ rl_complete_internal; available for use by application completion
+ functions. */
+extern int rl_completion_type;
-/* These functions are from bind.c. */
-/* rl_add_defun (char *name, Function *function, int key)
- Add NAME to the list of named functions. Make FUNCTION
- be the function that gets called.
- If KEY is not -1, then bind it. */
-extern int rl_add_defun ();
-extern int rl_bind_key (), rl_bind_key_in_map ();
-extern int rl_unbind_key (), rl_unbind_key_in_map ();
-extern int rl_set_key ();
-extern int rl_macro_bind (), rl_generic_bind (), rl_variable_bind ();
-extern int rl_translate_keyseq ();
-extern Function *rl_named_function (), *rl_function_of_keyseq ();
-extern int rl_parse_and_bind ();
-extern Keymap rl_get_keymap (), rl_get_keymap_by_name ();
-extern void rl_set_keymap ();
-extern char **rl_invoking_keyseqs (), **rl_invoking_keyseqs_in_map ();
-extern void rl_function_dumper ();
-extern int rl_read_init_file ();
+/* Character appended to completed words when at the end of the line. The
+ default is a space. Nothing is added if this is '\0'. */
+extern int rl_completion_append_character;
-/* Functions in funmap.c */
-extern void rl_list_funmap_names ();
-extern void rl_initialize_funmap ();
+/* Up to this many items will be displayed in response to a
+ possible-completions call. After that, we ask the user if she
+ is sure she wants to see them all. The default value is 100. */
+extern int rl_completion_query_items;
-/* Functions in display.c */
-extern void rl_redisplay ();
-extern int rl_message (), rl_clear_message ();
-extern int rl_reset_line_state ();
-extern int rl_character_len ();
-extern int rl_show_char ();
-extern int crlf (), rl_on_new_line ();
-extern int rl_forced_update_display ();
+/* If non-zero, then disallow duplicates in the matches. */
+extern int rl_ignore_completion_duplicates;
+/* If this is non-zero, completion is (temporarily) inhibited, and the
+ completion character will be inserted as any other. */
+extern int rl_inhibit_completion;
+
/* Definitions available for use by readline clients. */
#define RL_PROMPT_START_IGNORE '\001'
#define RL_PROMPT_END_IGNORE '\002'
+/* Possible values for do_replace argument to rl_filename_quoting_function,
+ called by rl_complete_internal. */
+#define NO_MATCH 0
+#define SINGLE_MATCH 1
+#define MULT_MATCH 2
+
#if !defined (savestring)
extern char *savestring (); /* XXX backwards compatibility */
#endif
diff --git a/rlconf.h b/rlconf.h
index 0035b93..8f07db1 100644
--- a/rlconf.h
+++ b/rlconf.h
@@ -51,7 +51,13 @@
over a character when updating the line rather than rewriting it. */
/* #define HACK_TERMCAP_MOTION */
-/* The string inserted by the vi-mode `insert comment' command. */
-#define VI_COMMENT_BEGIN_DEFAULT "#"
+/* The string inserted by the `insert comment' command. */
+#define RL_COMMENT_BEGIN_DEFAULT "#"
+
+/* Define this if you want code that allows readline to be used in an
+ X `callback' style. */
+#if !defined (SHELL)
+# define READLINE_CALLBACKS
+#endif
#endif /* _RLCONF_H_ */
diff --git a/rldefs.h b/rldefs.h
index 249c927..d4aced4 100644
--- a/rldefs.h
+++ b/rldefs.h
@@ -23,119 +23,23 @@
have a copy of the license, write to the Free Software Foundation,
675 Mass Ave, Cambridge, MA 02139, USA. */
-#if !defined (_RLDEFS_H)
-#define _RLDEFS_H
+#if !defined (_RLDEFS_H_)
+#define _RLDEFS_H_
#if defined (HAVE_CONFIG_H)
# include "config.h"
#endif
-#if !defined (PRAGMA_ALLOCA)
-# include "memalloc.h"
-#endif
-
-#define NEW_TTY_DRIVER
-#define HAVE_BSD_SIGNALS
-/* #define USE_XON_XOFF */
-
-#if defined (__linux__) || defined (HAVE_TERMCAP_H)
-# include <termcap.h>
-#endif /* __linux__ || HAVE_TERMCAP_H */
-
-/* Some USG machines have BSD signal handling (sigblock, sigsetmask, etc.) */
-#if defined (USG) && !defined (hpux)
-# undef HAVE_BSD_SIGNALS
-#endif
-
-/* System V machines use termio. */
-#if !defined (_POSIX_VERSION)
-# if defined (USG) || defined (hpux) || defined (Xenix) || defined (sgi) || \
- defined (DGUX) || defined (HAVE_TERMIO_H)
-# undef NEW_TTY_DRIVER
+#if defined (_POSIX_VERSION) && !defined (TERMIOS_MISSING)
+# define TERMIOS_TTY_DRIVER
+#else
+# if defined (HAVE_TERMIO_H)
# define TERMIO_TTY_DRIVER
-# include <termio.h>
-# if !defined (TCOON)
-# define TCOON 1
-# endif
-# endif /* USG || hpux || Xenix || sgi || DUGX || HAVE_TERMIO_H */
-#endif /* !_POSIX_VERSION */
-
-/* Posix systems use termios and the Posix signal functions. */
-#if defined (_POSIX_VERSION)
-# if !defined (TERMIOS_MISSING)
-# undef NEW_TTY_DRIVER
-# define TERMIOS_TTY_DRIVER
-# include <termios.h>
-# endif /* !TERMIOS_MISSING */
-# define HAVE_POSIX_SIGNALS
-# if !defined (O_NDELAY)
-# define O_NDELAY O_NONBLOCK /* Posix-style non-blocking i/o */
-# endif /* O_NDELAY */
-#endif /* _POSIX_VERSION */
-
-/* System V.3 machines have the old 4.1 BSD `reliable' signal interface. */
-#if !defined (HAVE_BSD_SIGNALS) && !defined (HAVE_POSIX_SIGNALS)
-# if defined (USGr3) && !defined (XENIX_22)
-# if !defined (HAVE_USG_SIGHOLD)
-# define HAVE_USG_SIGHOLD
-# endif /* !HAVE_USG_SIGHOLD */
-# endif /* USGr3 && !XENIX_22 */
-#endif /* !HAVE_BSD_SIGNALS && !HAVE_POSIX_SIGNALS */
-
-/* Other (BSD) machines use sgtty. */
-#if defined (NEW_TTY_DRIVER)
-# include <sgtty.h>
+# else
+# define NEW_TTY_DRIVER
+# endif
#endif
-/* Define _POSIX_VDISABLE if we are not using the `new' tty driver and
- it is not already defined. It is used both to determine if a
- special character is disabled and to disable certain special
- characters. Posix systems should set to 0, USG systems to -1. */
-#if !defined (NEW_TTY_DRIVER) && !defined (_POSIX_VDISABLE)
-# if defined (_POSIX_VERSION)
-# define _POSIX_VDISABLE 0
-# else /* !_POSIX_VERSION */
-# define _POSIX_VDISABLE -1
-# endif /* !_POSIX_VERSION */
-#endif /* !NEW_TTY_DRIVER && !_POSIX_VDISABLE */
-
-#if !defined (SHELL) && (defined (_POSIX_VERSION) || defined (USGr3))
-# if !defined (HAVE_DIRENT_H)
-# define HAVE_DIRENT_H
-# endif /* !HAVE_DIRENT_H */
-#endif /* !SHELL && (_POSIX_VERSION || USGr3) */
-
-#if defined (HAVE_DIRENT_H)
-# include <dirent.h>
-# define D_NAMLEN(d) strlen ((d)->d_name)
-#else /* !HAVE_DIRENT_H */
-# define D_NAMLEN(d) ((d)->d_namlen)
-# if defined (USG)
-# if defined (Xenix)
-# include <sys/ndir.h>
-# else /* !Xenix (but USG...) */
-# include "ndir.h"
-# endif /* !Xenix */
-# else /* !USG */
-# include <sys/dir.h>
-# endif /* !USG */
-# if !defined (dirent)
-# define dirent direct
-# endif /* !dirent */
-#endif /* !HAVE_DIRENT_H */
-
-#if defined (USG) && defined (TIOCGWINSZ) && !defined (Linux)
-# if defined (HAVE_SYS_STREAM_H)
-# include <sys/stream.h>
-# endif /* HAVE_SYS_STREAM_H */
-# if defined (HAVE_SYS_PTEM_H)
-# include <sys/ptem.h>
-# endif /* HAVE_SYS_PTEM_H */
-# if defined (HAVE_SYS_PTE_H)
-# include <sys/pte.h>
-# endif /* HAVE_SYS_PTE_H */
-#endif /* USG && TIOCGWINSZ && !Linux */
-
/* Posix macro to check file in statbuf for directory-ness.
This requires that <sys/stat.h> be included before this test. */
#if defined (S_IFDIR) && !defined (S_ISDIR)
@@ -145,12 +49,6 @@
/* Decide which flavor of the header file describing the C library
string functions to include and include it. */
-#if defined (USG) || defined (NeXT)
-# if !defined (HAVE_STRING_H)
-# define HAVE_STRING_H
-# endif /* !HAVE_STRING_H */
-#endif /* USG || NeXT */
-
#if defined (HAVE_STRING_H)
# include <string.h>
#else /* !HAVE_STRING_H */
@@ -161,15 +59,19 @@
extern char *strchr (), *strrchr ();
#endif /* !strchr && !__STDC__ */
-#if defined (HAVE_VARARGS_H)
-# include <varargs.h>
-#endif /* HAVE_VARARGS_H */
+#if defined (PREFER_STDARG)
+# include <stdarg.h>
+#else
+# if defined (PREFER_VARARGS)
+# include <varargs.h>
+# endif
+#endif
-/* This is needed to include support for TIOCGWINSZ and window resizing. */
-#if defined (OSF1) || defined (BSD386) || defined (NetBSD) || \
- defined (__BSD_4_4__) || defined (FreeBSD) || defined (_386BSD) || \
- defined (AIX)
-# define GWINSZ_IN_SYS_IOCTL
+#if defined (HAVE_STRCASECMP)
+#define _rl_stricmp strcasecmp
+#define _rl_strnicmp strncasecmp
+#else
+extern int _rl_stricmp (), _rl_strnicmp ();
#endif
#if !defined (emacs_mode)
@@ -201,7 +103,33 @@ extern char *xmalloc ();
#define AUDIBLE_BELL 1
#define VISIBLE_BELL 2
+/* Definitions used when searching the line for characters. */
+/* NOTE: it is necessary that opposite directions are inverses */
+#define FTO 1 /* forward to */
+#define BTO -1 /* backward to */
+#define FFIND 2 /* forward find */
+#define BFIND -2 /* backward find */
+
+/* Possible values for the found_quote flags word used by the completion
+ functions. It says what kind of (shell-like) quoting we found anywhere
+ in the line. */
+#define RL_QF_SINGLE_QUOTE 0x1
+#define RL_QF_DOUBLE_QUOTE 0x2
+#define RL_QF_BACKSLASH 0x4
+
+/* Default readline line buffer length. */
+#define DEFAULT_BUFFER_SIZE 256
+
+#if !defined (STREQ)
+#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0))
+#define STREQN(a, b, n) (((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0))
+#endif
+
+#if !defined (FREE)
+# define FREE(x) if (x) free (x)
+#endif
+
/* CONFIGURATION SECTION */
#include "rlconf.h"
-#endif /* !_RLDEFS_H */
+#endif /* !_RLDEFS_H_ */
diff --git a/rltty.c b/rltty.c
index ebb8413..8312963 100644
--- a/rltty.c
+++ b/rltty.c
@@ -22,6 +22,10 @@
675 Mass Ave, Cambridge, MA 02139, USA. */
#define READLINE_LIBRARY
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
#include <sys/types.h>
#include <signal.h>
#include <errno.h>
@@ -32,6 +36,12 @@
#endif /* HAVE_UNISTD_H */
#include "rldefs.h"
+
+#if !defined (SHELL) && defined (GWINSZ_IN_SYS_IOCTL)
+# include <sys/ioctl.h>
+#endif /* !SHELL && GWINSZ_IN_SYS_IOCTL */
+
+#include "rltty.h"
#include "readline.h"
#if !defined (errno)
@@ -41,12 +51,20 @@ extern int errno;
extern int readline_echoing_p;
extern int _rl_eof_char;
+extern int _rl_enable_keypad, _rl_enable_meta;
+
+extern void _rl_control_keypad ();
+
#if defined (__GO32__)
-# include <sys/pc.h>
+# include <pc.h>
# undef HANDLE_SIGNALS
#endif /* __GO32__ */
-static int output_was_flushed;
+/* Indirect functions to allow apps control over terminal management. */
+extern void rl_prep_terminal (), rl_deprep_terminal ();
+
+VFunction *rl_prep_term_function = rl_prep_terminal;
+VFunction *rl_deprep_term_function = rl_deprep_terminal;
/* **************************************************************** */
/* */
@@ -62,7 +80,7 @@ static int sigint_oldmask;
# endif /* HAVE_BSD_SIGNALS */
#endif /* !HAVE_POSIX_SIGNALS */
-static int sigint_blocked = 0;
+static int sigint_blocked;
/* Cause SIGINT to not be delivered until the corresponding call to
release_sigint(). */
@@ -113,62 +131,35 @@ release_sigint ()
/* **************************************************************** */
/* */
-/* Controlling the Meta Key and Keypad */
-/* */
-/* **************************************************************** */
-
-extern int term_has_meta;
-extern char *term_mm;
-extern char *term_mo;
-
-extern char *term_ks;
-extern char *term_ke;
-
-static int
-outchar (c)
- int c;
-{
- return putc (c, rl_outstream);
-}
-
-/* Turn on/off the meta key depending on ON. */
-static void
-control_meta_key (on)
- int on;
-{
- if (term_has_meta)
- {
- if (on && term_mm)
- tputs (term_mm, 1, outchar);
- else if (!on && term_mo)
- tputs (term_mo, 1, outchar);
- }
-}
-
-static void
-control_keypad (on)
- int on;
-{
- if (on && term_ks)
- tputs (term_ks, 1, outchar);
- else if (!on && term_ke)
- tputs (term_ke, 1, outchar);
-}
-
-/* **************************************************************** */
-/* */
/* Saving and Restoring the TTY */
/* */
/* **************************************************************** */
/* Non-zero means that the terminal is in a prepped state. */
-static int terminal_prepped = 0;
+static int terminal_prepped;
/* If non-zero, means that this process has called tcflow(fd, TCOOFF)
and output is suspended. */
#if defined (__ksr1__)
-static int ksrflow = 0;
+static int ksrflow;
#endif
+
+#if !defined (SHELL) && defined (TIOCGWINSZ)
+/* Dummy call to force a backgrounded readline to stop before it tries
+ to get the tty settings. */
+static void
+set_winsize (tty)
+ int tty;
+{
+ struct winsize w;
+
+ if (ioctl (tty, TIOCGWINSZ, &w) == 0)
+ (void) ioctl (tty, TIOCSWINSZ, &w);
+}
+#else /* SHELL || !TIOCGWINSZ */
+# define set_winsize(tty)
+#endif /* SHELL || !TIOCGWINSZ */
+
#if defined (NEW_TTY_DRIVER)
/* Values for the `flags' field of a struct bsdtty. This tells which
@@ -200,12 +191,7 @@ get_tty_settings (tty, tiop)
int tty;
TIOTYPE *tiop;
{
-#if !defined (SHELL) && defined (TIOCGWINSZ)
- struct winsize w;
-
- if (ioctl (tty, TIOCGWINSZ, &w) == 0)
- (void) ioctl (tty, TIOCSWINSZ, &w);
-#endif
+ set_winsize (tty);
tiop->flags = tiop->lflag = 0;
@@ -230,6 +216,7 @@ get_tty_settings (tty, tiop)
return 0;
}
+static int
set_tty_settings (tty, tiop)
int tty;
TIOTYPE *tiop;
@@ -356,7 +343,11 @@ prepare_terminal_settings (meta_flag, otio, tiop)
# define TIOTYPE struct termios
# define DRAIN_OUTPUT(fd) tcdrain (fd)
# define GETATTR(tty, tiop) (tcgetattr (tty, tiop))
-# define SETATTR(tty, tiop) (tcsetattr (tty, TCSANOW, tiop))
+# ifdef M_UNIX
+# define SETATTR(tty, tiop) (tcsetattr (tty, TCSANOW, tiop))
+# else
+# define SETATTR(tty, tiop) (tcsetattr (tty, TCSADRAIN, tiop))
+# endif /* !M_UNIX */
#else
# define TIOTYPE struct termio
# define DRAIN_OUTPUT(fd)
@@ -372,28 +363,61 @@ static TIOTYPE otio;
# define OUTPUT_BEING_FLUSHED(tp) 0
#endif
+static void
+rltty_warning (msg)
+ char *msg;
+{
+ fprintf (stderr, "readline: warning: %s\n", msg);
+}
+
+#if defined (_AIX)
+void
+setopost(tp)
+TIOTYPE *tp;
+{
+ if ((tp->c_oflag & OPOST) == 0)
+ {
+ rltty_warning ("turning on OPOST for terminal\r");
+ tp->c_oflag |= OPOST|ONLCR;
+ }
+}
+#endif
+
static int
get_tty_settings (tty, tiop)
int tty;
TIOTYPE *tiop;
{
-#if !defined (SHELL) && defined (TIOCGWINSZ)
- struct winsize w;
+ int ioctl_ret;
+ set_winsize (tty);
- if (ioctl (tty, TIOCGWINSZ, &w) == 0)
- (void) ioctl (tty, TIOCSWINSZ, &w);
-#endif
-
- /* Keep looping if output is being flushed after a ^O (or whatever
- the flush character is). */
- while (GETATTR (tty, tiop) < 0 || OUTPUT_BEING_FLUSHED (tiop))
+ while (1)
{
+ ioctl_ret = GETATTR (tty, tiop);
+ if (ioctl_ret < 0)
+ {
+ if (errno != EINTR)
+ return -1;
+ else
+ continue;
+ }
if (OUTPUT_BEING_FLUSHED (tiop))
- continue;
- if (errno != EINTR)
- return -1;
- errno = 0;
+ {
+#if defined (FLUSHO) && defined (_AIX41)
+ rltty_warning ("turning off output flushing");
+ tiop->c_lflag &= ~FLUSHO;
+ break;
+#else
+ continue;
+#endif
+ }
+ break;
}
+
+#if defined (_AIX)
+ setopost(tiop);
+#endif
+
return 0;
}
@@ -467,12 +491,13 @@ prepare_terminal_settings (meta_flag, otio, tiop)
tiop->c_cc[VMIN] = 1;
tiop->c_cc[VTIME] = 0;
- if (tiop->c_lflag & FLUSHO)
+#if defined (FLUSHO)
+ if (OUTPUT_BEING_FLUSHED (tiop))
{
- output_was_flushed = 1;
tiop->c_lflag &= ~FLUSHO;
otio.c_lflag &= ~FLUSHO;
}
+#endif
/* Turn off characters that we need on Posix systems with job control,
just to be sure. This includes ^Y and ^V. This should not really
@@ -497,7 +522,7 @@ rl_prep_terminal (meta_flag)
int meta_flag;
{
#if !defined (__GO32__)
- int tty = fileno (rl_instream);
+ int tty;
TIOTYPE tio;
if (terminal_prepped)
@@ -506,6 +531,8 @@ rl_prep_terminal (meta_flag)
/* Try to keep this function from being INTerrupted. */
block_sigint ();
+ tty = fileno (rl_instream);
+
if (get_tty_settings (tty, &tio) < 0)
{
release_sigint ();
@@ -522,11 +549,9 @@ rl_prep_terminal (meta_flag)
return;
}
- if (output_was_flushed)
- output_was_flushed = 0;
+ if (_rl_enable_keypad)
+ _rl_control_keypad (1);
- control_meta_key (1);
- control_keypad (1);
fflush (rl_outstream);
terminal_prepped = 1;
@@ -539,23 +564,27 @@ void
rl_deprep_terminal ()
{
#if !defined (__GO32__)
- int tty = fileno (rl_instream);
+ int tty;
if (!terminal_prepped)
return;
- /* Try to keep this function from being INTerrupted. */
+ /* Try to keep this function from being interrupted. */
block_sigint ();
+ tty = fileno (rl_instream);
+
+ if (_rl_enable_keypad)
+ _rl_control_keypad (0);
+
+ fflush (rl_outstream);
+
if (set_tty_settings (tty, &otio) < 0)
{
release_sigint ();
return;
}
- control_meta_key (0);
- control_keypad (0);
- fflush (rl_outstream);
terminal_prepped = 0;
release_sigint ();
@@ -568,6 +597,7 @@ rl_deprep_terminal ()
/* */
/* **************************************************************** */
+int
rl_restart_output (count, key)
int count, key;
{
@@ -600,6 +630,7 @@ rl_restart_output (count, key)
return 0;
}
+int
rl_stop_output (count, key)
int count, key;
{
@@ -626,7 +657,7 @@ rl_stop_output (count, key)
return 0;
}
-
+
/* **************************************************************** */
/* */
/* Default Key Bindings */
diff --git a/rltty.h b/rltty.h
new file mode 100644
index 0000000..3e13704
--- /dev/null
+++ b/rltty.h
@@ -0,0 +1,73 @@
+/* rltty.h - tty driver-related definitions used by some library files. */
+
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+
+ This file contains the Readline Library (the Library), a set of
+ routines for providing Emacs style line input to programs that ask
+ for it.
+
+ The Library 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.
+
+ The Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#if !defined (_RLTTY_H_)
+#define _RLTTY_H
+
+/* Posix systems use termios and the Posix signal functions. */
+#if defined (TERMIOS_TTY_DRIVER)
+# include <termios.h>
+#endif /* TERMIOS_TTY_DRIVER */
+
+/* System V machines use termio. */
+#if defined (TERMIO_TTY_DRIVER)
+# include <termio.h>
+# if !defined (TCOON)
+# define TCOON 1
+# endif
+#endif /* TERMIO_TTY_DRIVER */
+
+/* Other (BSD) machines use sgtty. */
+#if defined (NEW_TTY_DRIVER)
+# include <sgtty.h>
+#endif
+
+/* Stuff for `struct winsize' on various systems. */
+#if defined (HAVE_SYS_STREAM_H)
+# include <sys/stream.h>
+#endif /* HAVE_SYS_STREAM_H */
+#if defined (HAVE_SYS_PTEM_H)
+# include <sys/ptem.h>
+# define _IO_PTEM_H /* work around SVR4.2 1.1.4 bug */
+#endif /* HAVE_SYS_PTEM_H */
+#if defined (HAVE_SYS_PTE_H)
+# include <sys/pte.h>
+#endif /* HAVE_SYS_PTE_H */
+
+/* Define _POSIX_VDISABLE if we are not using the `new' tty driver and
+ it is not already defined. It is used both to determine if a
+ special character is disabled and to disable certain special
+ characters. Posix systems should set to 0, USG systems to -1. */
+#if !defined (NEW_TTY_DRIVER) && !defined (_POSIX_VDISABLE)
+# if defined (_SVR4_VDISABLE)
+# define _POSIX_VDISABLE _SVR4_VDISABLE
+# else
+# if defined (_POSIX_VERSION)
+# define _POSIX_VDISABLE 0
+# else /* !_POSIX_VERSION */
+# define _POSIX_VDISABLE -1
+# endif /* !_POSIX_VERSION */
+# endif /* !_SVR4_DISABLE */
+#endif /* !NEW_TTY_DRIVER && !_POSIX_VDISABLE */
+
+#endif /* _RLTTY_H_ */
diff --git a/search.c b/search.c
index a2b8c5e..3024ee5 100644
--- a/search.c
+++ b/search.c
@@ -22,6 +22,10 @@
675 Mass Ave, Cambridge, MA 02139, USA. */
#define READLINE_LIBRARY
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
#include <sys/types.h>
#include <stdio.h>
@@ -29,21 +33,26 @@
# include <unistd.h>
#endif
-#include "memalloc.h"
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif
+
#include "rldefs.h"
#include "readline.h"
#include "history.h"
-#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0))
-#define STREQN(a, b, n) (((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0))
-
-#define abs(x) (((x) > 0) ? (x) : -(x))
+#ifdef abs
+# undef abs
+#endif
+#define abs(x) (((x) >= 0) ? (x) : -(x))
extern char *xmalloc (), *xrealloc ();
/* Variables imported from readline.c */
extern int rl_point, rl_end, rl_line_buffer_len;
-extern Keymap _rl_keymap;
+extern int rl_editing_mode;
extern char *rl_prompt;
extern char *rl_line_buffer;
extern HIST_ENTRY *saved_line_for_history;
@@ -51,9 +60,12 @@ extern Function *rl_last_func;
/* Functions imported from the rest of the library. */
extern int _rl_free_history_entry ();
+extern char *_rl_make_prompt_for_search ();
+extern void _rl_restore_prompt ();
+extern void rl_extend_line_buffer ();
static char *noninc_search_string = (char *) NULL;
-static int noninc_history_pos = 0;
+static int noninc_history_pos;
static char *prev_line_found = (char *) NULL;
/* Search the history list for STRING starting at absolute history position
@@ -91,10 +103,10 @@ noninc_dosearch (string, dir)
char *string;
int dir;
{
- int oldpos, pos;
+ int oldpos, pos, line_len;
HIST_ENTRY *entry;
- if (string == 0 || *string == 0 || noninc_history_pos < 0)
+ if (string == 0 || *string == '\0' || noninc_history_pos < 0)
{
ding ();
return;
@@ -116,16 +128,15 @@ noninc_dosearch (string, dir)
oldpos = where_history ();
history_set_pos (noninc_history_pos);
entry = current_history ();
+#if defined (VI_MODE)
+ if (rl_editing_mode != vi_mode)
+#endif
history_set_pos (oldpos);
- {
- int line_len;
-
- line_len = strlen (entry->line);
- if (line_len >= rl_line_buffer_len)
- rl_extend_line_buffer (line_len);
- strcpy (rl_line_buffer, entry->line);
- }
+ line_len = strlen (entry->line);
+ if (line_len >= rl_line_buffer_len)
+ rl_extend_line_buffer (line_len);
+ strcpy (rl_line_buffer, entry->line);
rl_undo_list = (UNDO_LIST *)entry->data;
rl_end = strlen (rl_line_buffer);
@@ -147,7 +158,7 @@ noninc_search (dir, pchar)
int dir;
int pchar;
{
- int saved_point, c, pmtlen;
+ int saved_point, c;
char *p;
maybe_save_line ();
@@ -157,17 +168,12 @@ noninc_search (dir, pchar)
rl_line_buffer[0] = 0;
rl_end = rl_point = 0;
- /* XXX - this needs fixing to work with the prompt expansion stuff - XXX */
- pmtlen = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0;
- p = xmalloc (2 + pmtlen);
- if (pmtlen)
- strcpy (p, rl_prompt);
- p[pmtlen] = pchar ? pchar : ':';
- p[pmtlen + 1] = '\0';
-
+ p = _rl_make_prompt_for_search (pchar ? pchar : ':');
rl_message (p, 0, 0);
free (p);
+#define SEARCH_RETURN _rl_restore_prompt (); return
+
/* Read the search string. */
while (c = rl_read_key ())
{
@@ -180,17 +186,17 @@ noninc_search (dir, pchar)
maybe_unsave_line ();
rl_clear_message ();
rl_point = saved_point;
- return;
+ SEARCH_RETURN;
}
- rl_rubout (1);
+ rl_rubout (1, c);
break;
case CTRL('W'):
- rl_unix_word_rubout ();
+ rl_unix_word_rubout (1, c);
break;
case CTRL('U'):
- rl_unix_line_discard ();
+ rl_unix_line_discard (1, c);
break;
case RETURN:
@@ -205,13 +211,13 @@ noninc_search (dir, pchar)
rl_clear_message ();
rl_point = saved_point;
ding ();
- return;
+ SEARCH_RETURN;
default:
rl_insert (1, c);
break;
}
- rl_redisplay ();
+ (*rl_redisplay_function) ();
}
dosearch:
@@ -223,7 +229,7 @@ noninc_search (dir, pchar)
if (!noninc_search_string)
{
ding ();
- return;
+ SEARCH_RETURN;
}
}
else
@@ -235,35 +241,33 @@ noninc_search (dir, pchar)
noninc_search_string = savestring (rl_line_buffer);
}
+ _rl_restore_prompt ();
noninc_dosearch (noninc_search_string, dir);
}
/* Search forward through the history list for a string. If the vi-mode
code calls this, KEY will be `?'. */
+int
rl_noninc_forward_search (count, key)
int count, key;
{
- if (key == '?')
- noninc_search (1, '?');
- else
- noninc_search (1, 0);
+ noninc_search (1, (key == '?') ? '?' : 0);
return 0;
}
/* Reverse search the history list for a string. If the vi-mode code
calls this, KEY will be `/'. */
+int
rl_noninc_reverse_search (count, key)
int count, key;
{
- if (key == '/')
- noninc_search (-1, '/');
- else
- noninc_search (-1, 0);
+ noninc_search (-1, (key == '/') ? '/' : 0);
return 0;
}
/* Search forward through the history list for the last string searched
for. If there is no saved search string, abort. */
+int
rl_noninc_forward_search_again (count, key)
int count, key;
{
@@ -278,6 +282,7 @@ rl_noninc_forward_search_again (count, key)
/* Reverse search in the history list for the last string searched
for. If there is no saved search string, abort. */
+int
rl_noninc_reverse_search_again (count, key)
int count, key;
{
@@ -303,8 +308,14 @@ rl_history_search_internal (count, direction)
while (count)
{
temp = (direction < 0) ? previous_history () : next_history ();
- if (!temp)
+ if (temp == 0)
break;
+ /* On an empty prefix, make this the same as previous-history. */
+ if (rl_point == 0)
+ {
+ count--;
+ continue;
+ }
if (STREQN (rl_line_buffer, temp->line, rl_point))
{
/* Don't find multiple instances of the same line. */
@@ -317,7 +328,7 @@ rl_history_search_internal (count, direction)
}
}
- if (!temp)
+ if (temp == 0)
{
if (direction < 0 && old_temp)
temp = old_temp;
diff --git a/shell.c b/shell.c
new file mode 100644
index 0000000..eb99c72
--- /dev/null
+++ b/shell.c
@@ -0,0 +1,129 @@
+/* shell.c -- readline utility functions that are normally provided by
+ bash when readline is linked as part of the shell. */
+
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline Library 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.
+
+ The GNU Readline Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+extern char *xmalloc (), *xrealloc ();
+
+#if !defined (SHELL)
+
+#ifdef savestring
+#undef savestring
+#endif
+
+/* Backwards compatibility, now that savestring has been removed from
+ all `public' readline header files. */
+char *
+savestring (s)
+ char *s;
+{
+ return ((char *)strcpy (xmalloc (1 + (int)strlen (s)), (s)));
+}
+
+/* Does shell-like quoting using single quotes. */
+char *
+single_quote (string)
+ char *string;
+{
+ register int c;
+ char *result, *r, *s;
+
+ result = (char *)xmalloc (3 + (3 * strlen (string)));
+ r = result;
+ *r++ = '\'';
+
+ for (s = string; s && (c = *s); s++)
+ {
+ *r++ = c;
+
+ if (c == '\'')
+ {
+ *r++ = '\\'; /* insert escaped single quote */
+ *r++ = '\'';
+ *r++ = '\''; /* start new quoted string */
+ }
+ }
+
+ *r++ = '\'';
+ *r = '\0';
+
+ return (result);
+}
+
+/* Set the environment variables LINES and COLUMNS to lines and cols,
+ respectively. */
+void
+set_lines_and_columns (lines, cols)
+ int lines, cols;
+{
+ char *b;
+
+#if defined (HAVE_PUTENV)
+ b = xmalloc (24);
+ sprintf (b, "LINES=%d", lines);
+ putenv (b);
+ b = xmalloc (24);
+ sprintf (b, "COLUMNS=%d", cols);
+ putenv (b);
+#else /* !HAVE_PUTENV */
+# if defined (HAVE_SETENV)
+ b = xmalloc (8);
+ sprintf (b, "%d", lines);
+ setenv ("LINES", b, 1);
+ b = xmalloc (8);
+ sprintf (b, "%d", cols);
+ setenv ("COLUMNS", b, 1);
+# endif /* HAVE_SETENV */
+#endif /* !HAVE_PUTENV */
+}
+
+char *
+get_env_value (varname)
+ char *varname;
+{
+ return ((char *)getenv (varname));
+}
+
+#else /* SHELL */
+extern char *get_string_value ();
+
+char *
+get_env_value (varname)
+ char *varname;
+{
+ return get_string_value (varname);
+}
+#endif /* SHELL */
diff --git a/signals.c b/signals.c
index a9fda5c..e19c22d 100644
--- a/signals.c
+++ b/signals.c
@@ -21,32 +21,18 @@
675 Mass Ave, Cambridge, MA 02139, USA. */
#define READLINE_LIBRARY
-#include <stdio.h>
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h> /* Just for NULL. Yuck. */
#include <sys/types.h>
-#include <fcntl.h>
-#if !defined (NO_SYS_FILE)
-# include <sys/file.h>
-#endif /* !NO_SYS_FILE */
#include <signal.h>
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
-#if defined (HAVE_STDLIB_H)
-# include <stdlib.h>
-#else
-# include "ansi_stdlib.h"
-#endif /* HAVE_STDLIB_H */
-
-#include <errno.h>
-/* Not all systems declare ERRNO in errno.h... and some systems #define it! */
-#if !defined (errno)
-extern int errno;
-#endif /* !errno */
-
-#include "posixstat.h"
-
/* System-specific feature definitions and include files. */
#include "rldefs.h"
@@ -54,89 +40,86 @@ extern int errno;
# include <sys/ioctl.h>
#endif /* GWINSZ_IN_SYS_IOCTL */
+#if defined (__GO32__)
+# undef HANDLE_SIGNALS
+#endif /* __GO32__ */
+
+#if defined (HANDLE_SIGNALS)
/* Some standard library routines. */
#include "readline.h"
#include "history.h"
-static void cr ();
-
extern int readline_echoing_p;
extern int rl_pending_input;
-extern char *term_cr;
-
extern int _rl_meta_flag;
-extern int _rl_output_character_function ();
-
extern void free_undo_list ();
+extern void _rl_get_screen_size ();
+extern void _rl_redisplay_after_sigwinch ();
+extern void _rl_clean_up_for_exit ();
+extern void _rl_kill_kbd_macro ();
+extern void _rl_init_argument ();
+extern void rl_deprep_terminal (), rl_prep_terminal ();
+
+#if !defined (RETSIGTYPE)
+# if defined (VOID_SIGHANDLER)
+# define RETSIGTYPE void
+# else
+# define RETSIGTYPE int
+# endif /* !VOID_SIGHANDLER */
+#endif /* !RETSIGTYPE */
#if defined (VOID_SIGHANDLER)
-# define sighandler void
+# define SIGHANDLER_RETURN return
#else
-# define sighandler int
-#endif /* VOID_SIGHANDLER */
+# define SIGHANDLER_RETURN return (0)
+#endif
/* This typedef is equivalant to the one for Function; it allows us
to say SigHandler *foo = signal (SIGKILL, SIG_IGN); */
-typedef sighandler SigHandler ();
-
-#if defined (__GO32__)
-# undef HANDLE_SIGNALS
-#endif /* __GO32__ */
+typedef RETSIGTYPE SigHandler ();
-#if defined (STATIC_MALLOC)
-static char *xmalloc (), *xrealloc ();
-#else
-extern char *xmalloc (), *xrealloc ();
-#endif /* STATIC_MALLOC */
+static SigHandler *rl_set_sighandler ();
-
/* **************************************************************** */
/* */
/* Signal Handling */
/* */
/* **************************************************************** */
-#if defined (SIGWINCH)
-static SigHandler *old_sigwinch = (SigHandler *)NULL;
+/* If we're not being compiled as part of bash, initialize handlers for
+ and catch the job control signals (SIGTTIN, SIGTTOU, SIGTSTP) and
+ SIGTERM. */
+#if !defined (SHELL)
+# define HANDLE_JOB_SIGNALS
+# define HANDLE_SIGTERM
+#endif /* !SHELL */
-static sighandler
-rl_handle_sigwinch (sig)
- int sig;
-{
- if (readline_echoing_p)
- {
- _rl_set_screen_size (fileno (rl_instream), 1);
+#if defined (HAVE_POSIX_SIGNALS)
+typedef struct sigaction sighandler_cxt;
+# define rl_sigaction(s, nh, oh) sigaction(s, nh, oh)
+#else
+typedef struct { SigHandler *sa_handler; } sighandler_cxt;
+# define sigemptyset(m)
+#endif /* !HAVE_POSIX_SIGNALS */
- cr (); /* was crlf () */
- rl_forced_update_display ();
- }
+static sighandler_cxt old_int, old_alrm;
- if (old_sigwinch &&
- old_sigwinch != (SigHandler *)SIG_IGN &&
- old_sigwinch != (SigHandler *)SIG_DFL)
- (*old_sigwinch) (sig);
-#if !defined (VOID_SIGHANDLER)
- return (0);
-#endif /* VOID_SIGHANDLER */
-}
-#endif /* SIGWINCH */
+#if defined (HANDLE_JOB_SIGNALS)
+static sighandler_cxt old_tstp, old_ttou, old_ttin;
+#endif /* HANDLE_JOB_SIGNALS */
-#if defined (HANDLE_SIGNALS)
-/* Interrupt handling. */
-static SigHandler
- *old_int = (SigHandler *)NULL,
- *old_alrm = (SigHandler *)NULL;
-#if !defined (SHELL)
-static SigHandler
- *old_tstp = (SigHandler *)NULL,
- *old_ttou = (SigHandler *)NULL,
- *old_ttin = (SigHandler *)NULL,
- *old_cont = (SigHandler *)NULL;
-#endif /* !SHELL */
+#if defined (HANDLE_SIGTERM)
+static sighandler_cxt old_term;
+#endif
+
+#if defined (SIGWINCH)
+static sighandler_cxt old_winch;
+#endif
+
+/* Readline signal handler functions. */
-/* Handle an interrupt character. */
-static sighandler
+static RETSIGTYPE
rl_signal_handler (sig)
int sig;
{
@@ -145,15 +128,17 @@ rl_signal_handler (sig)
#else /* !HAVE_POSIX_SIGNALS */
# if defined (HAVE_BSD_SIGNALS)
long omask;
-# endif /* HAVE_BSD_SIGNALS */
+# else /* !HAVE_BSD_SIGNALS */
+ sighandler_cxt dummy_cxt; /* needed for rl_set_sighandler call */
+# endif /* !HAVE_BSD_SIGNALS */
#endif /* !HAVE_POSIX_SIGNALS */
#if !defined (HAVE_BSD_SIGNALS) && !defined (HAVE_POSIX_SIGNALS)
/* Since the signal will not be blocked while we are in the signal
handler, ignore it until rl_clear_signals resets the catcher. */
- if (sig == SIGINT)
- signal (sig, SIG_IGN);
-#endif /* !HAVE_BSD_SIGNALS */
+ if (sig == SIGINT || sig == SIGALRM)
+ rl_set_sighandler (sig, SIG_IGN, &dummy_cxt);
+#endif /* !HAVE_BSD_SIGNALS && !HAVE_POSIX_SIGNALS */
switch (sig)
{
@@ -169,7 +154,7 @@ rl_signal_handler (sig)
}
_rl_kill_kbd_macro ();
rl_clear_message ();
- rl_init_argument ();
+ _rl_init_argument ();
#if defined (SIGTSTP)
case SIGTSTP:
@@ -177,8 +162,9 @@ rl_signal_handler (sig)
case SIGTTIN:
#endif /* SIGTSTP */
case SIGALRM:
- rl_clean_up_for_exit ();
- rl_deprep_terminal ();
+ case SIGTERM:
+ _rl_clean_up_for_exit ();
+ (*rl_deprep_term_function) ();
rl_clear_signals ();
rl_pending_input = 0;
@@ -202,102 +188,176 @@ rl_signal_handler (sig)
# endif /* HAVE_BSD_SIGNALS */
#endif /* !HAVE_POSIX_SIGNALS */
- rl_prep_terminal (_rl_meta_flag);
+ (*rl_prep_term_function) (_rl_meta_flag);
rl_set_signals ();
}
-#if !defined (VOID_SIGHANDLER)
- return (0);
-#endif /* !VOID_SIGHANDLER */
+ SIGHANDLER_RETURN;
}
-#if defined (HAVE_POSIX_SIGNALS)
+#if defined (SIGWINCH)
+static RETSIGTYPE
+rl_handle_sigwinch (sig)
+ int sig;
+{
+ SigHandler *oh;
+
+#if defined (MUST_REINSTALL_SIGHANDLERS)
+ sighandler_cxt dummy_winch;
+
+ /* We don't want to change old_winch -- it holds the state of SIGWINCH
+ disposition set by the calling application. We need this state
+ because we call the application's SIGWINCH handler after updating
+ our own idea of the screen size. */
+ rl_set_sighandler (SIGWINCH, rl_handle_sigwinch, &dummy_winch);
+#endif
+
+ if (readline_echoing_p)
+ {
+ _rl_get_screen_size (fileno (rl_instream), 1);
+ _rl_redisplay_after_sigwinch ();
+ }
+
+ /* If another sigwinch handler has been installed, call it. */
+ oh = (SigHandler *)old_winch.sa_handler;
+ if (oh && oh != (SigHandler *)SIG_IGN && oh != (SigHandler *)SIG_DFL)
+ (*oh) (sig);
+
+ SIGHANDLER_RETURN;
+}
+#endif /* SIGWINCH */
+
+/* Functions to manage signal handling. */
+
+#if !defined (HAVE_POSIX_SIGNALS)
+static int
+rl_sigaction (sig, nh, oh)
+ int sig;
+ sighandler_cxt *nh, *oh;
+{
+ oh->sa_handler = signal (sig, nh->sa_handler);
+ return 0;
+}
+#endif /* !HAVE_POSIX_SIGNALS */
+
+/* Set up a readline-specific signal handler, saving the old signal
+ information in OHANDLER. Return the old signal handler, like
+ signal(). */
static SigHandler *
-rl_set_sighandler (sig, handler)
+rl_set_sighandler (sig, handler, ohandler)
int sig;
SigHandler *handler;
+ sighandler_cxt *ohandler;
{
- struct sigaction act, oact;
+#if defined (HAVE_POSIX_SIGNALS)
+ struct sigaction act;
act.sa_handler = handler;
act.sa_flags = 0;
sigemptyset (&act.sa_mask);
- sigemptyset (&oact.sa_mask);
- sigaction (sig, &act, &oact);
- return (oact.sa_handler);
-}
-
-#else /* !HAVE_POSIX_SIGNALS */
-# define rl_set_sighandler(sig, handler) (SigHandler *)signal (sig, handler)
+ sigemptyset (&ohandler->sa_mask);
+ sigaction (sig, &act, ohandler);
+#else
+ ohandler->sa_handler = (SigHandler *)signal (sig, handler);
#endif /* !HAVE_POSIX_SIGNALS */
+ return (ohandler->sa_handler);
+}
+int
rl_set_signals ()
{
- old_int = (SigHandler *)rl_set_sighandler (SIGINT, rl_signal_handler);
- if (old_int == (SigHandler *)SIG_IGN)
- signal (SIGINT, SIG_IGN);
+ sighandler_cxt dummy;
+ SigHandler *oh;
- old_alrm = (SigHandler *)rl_set_sighandler (SIGALRM, rl_signal_handler);
- if (old_alrm == (SigHandler *)SIG_IGN)
- signal (SIGALRM, SIG_IGN);
+#if defined (HAVE_POSIX_SIGNALS)
+ sigemptyset (&dummy.sa_mask);
+#endif
-#if !defined (SHELL)
+ oh = rl_set_sighandler (SIGINT, rl_signal_handler, &old_int);
+ if (oh == (SigHandler *)SIG_IGN)
+ rl_sigaction (SIGINT, &old_int, &dummy);
+
+ oh = rl_set_sighandler (SIGALRM, rl_signal_handler, &old_alrm);
+ if (oh == (SigHandler *)SIG_IGN)
+ rl_sigaction (SIGALRM, &old_alrm, &dummy);
+#if defined (HAVE_POSIX_SIGNALS) && defined (SA_RESTART)
+ /* If the application using readline has already installed a signal
+ handler with SA_RESTART, SIGALRM will cause reads to be restarted
+ automatically, so readline should just get out of the way. Since
+ we tested for SIG_IGN above, we can just test for SIG_DFL here. */
+ if (oh != (SigHandler *)SIG_DFL && (old_alrm.sa_flags & SA_RESTART))
+ rl_sigaction (SIGALRM, &old_alrm, &dummy);
+#endif /* HAVE_POSIX_SIGNALS */
+
+#if defined (HANDLE_JOB_SIGNALS)
#if defined (SIGTSTP)
- old_tstp = (SigHandler *)rl_set_sighandler (SIGTSTP, rl_signal_handler);
- if (old_tstp == (SigHandler *)SIG_IGN)
- signal (SIGTSTP, SIG_IGN);
+ oh = rl_set_sighandler (SIGTSTP, rl_signal_handler, &old_tstp);
+ if (oh == (SigHandler *)SIG_IGN)
+ rl_sigaction (SIGTSTP, &old_tstp, &dummy);
+#else
+ oh = (SigHandler *)NULL;
#endif /* SIGTSTP */
+
#if defined (SIGTTOU)
- old_ttou = (SigHandler *)rl_set_sighandler (SIGTTOU, rl_signal_handler);
- old_ttin = (SigHandler *)rl_set_sighandler (SIGTTIN, rl_signal_handler);
+ rl_set_sighandler (SIGTTOU, rl_signal_handler, &old_ttou);
+ rl_set_sighandler (SIGTTIN, rl_signal_handler, &old_ttin);
- if (old_tstp == (SigHandler *)SIG_IGN)
+ if (oh == (SigHandler *)SIG_IGN)
{
- signal (SIGTTOU, SIG_IGN);
- signal (SIGTTIN, SIG_IGN);
+ rl_set_sighandler (SIGTTOU, SIG_IGN, &dummy);
+ rl_set_sighandler (SIGTTIN, SIG_IGN, &dummy);
}
#endif /* SIGTTOU */
-#endif /* !SHELL */
+#endif /* HANDLE_JOB_SIGNALS */
+
+#if defined (HANDLE_SIGTERM)
+ /* Handle SIGTERM if we're not being compiled as part of bash. */
+ rl_set_sighandler (SIGTERM, rl_signal_handler, &old_term);
+#endif /* HANDLE_SIGTERM */
#if defined (SIGWINCH)
- old_sigwinch =
- (SigHandler *) rl_set_sighandler (SIGWINCH, rl_handle_sigwinch);
+ rl_set_sighandler (SIGWINCH, rl_handle_sigwinch, &old_winch);
#endif /* SIGWINCH */
+
return 0;
}
+int
rl_clear_signals ()
{
- rl_set_sighandler (SIGINT, old_int);
- rl_set_sighandler (SIGALRM, old_alrm);
+ sighandler_cxt dummy;
-#if !defined (SHELL)
+#if defined (HAVE_POSIX_SIGNALS)
+ sigemptyset (&dummy.sa_mask);
+#endif
+
+ rl_sigaction (SIGINT, &old_int, &dummy);
+ rl_sigaction (SIGALRM, &old_alrm, &dummy);
+
+#if defined (HANDLE_JOB_SIGNALS)
#if defined (SIGTSTP)
- signal (SIGTSTP, old_tstp);
+ rl_sigaction (SIGTSTP, &old_tstp, &dummy);
#endif
#if defined (SIGTTOU)
- signal (SIGTTOU, old_ttou);
- signal (SIGTTIN, old_ttin);
+ rl_sigaction (SIGTTOU, &old_ttou, &dummy);
+ rl_sigaction (SIGTTIN, &old_ttin, &dummy);
#endif /* SIGTTOU */
-#endif /* !SHELL */
+#endif /* HANDLE_JOB_SIGNALS */
+
+#if defined (HANDLE_SIGTERM)
+ rl_sigaction (SIGTERM, &old_term, &dummy);
+#endif /* HANDLE_SIGTERM */
#if defined (SIGWINCH)
- signal (SIGWINCH, old_sigwinch);
+ sigemptyset (&dummy.sa_mask);
+ rl_sigaction (SIGWINCH, &old_winch, &dummy);
#endif
return 0;
}
-
-/* Move to the start of the current line. */
-static void
-cr ()
-{
- if (term_cr)
- tputs (term_cr, 1, _rl_output_character_function);
-}
#endif /* HANDLE_SIGNALS */
diff --git a/support/config.guess b/support/config.guess
new file mode 100755
index 0000000..69e6169
--- /dev/null
+++ b/support/config.guess
@@ -0,0 +1,927 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+elif (test -f /usr/5bin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/usr/5bin
+fi
+
+UNAME=`(uname) 2>/dev/null` || UNAME=unknown
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+RELEASE=`expr "$UNAME_RELEASE" : '[^0-9]*\([0-9]*\)'` # 4
+case "$RELEASE" in
+"") RELEASE=0 ;;
+*) RELEASE=`expr "$RELEASE" + 0` ;;
+esac
+REL_LEVEL=`expr "$UNAME_RELEASE" : '[^0-9]*[0-9]*.\([0-9]*\)'` # 1
+REL_SUBLEVEL=`expr "$UNAME_RELEASE" : '[^0-9]*[0-9]*.[0-9]*.\([0-9]*\)'` # 2
+
+trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
+
+# Some versions of i386 SVR4.2 make `uname' equivalent to `uname -n', which
+# is contrary to all other versions of uname
+if [ -n "$UNAME" ] && [ "$UNAME_S" != "$UNAME" ] && [ "$UNAME_S" = UNIX_SV ]; then
+ UNAME=UNIX_SV
+fi
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ # Begin cases added for Bash
+ alpha:NetBSD:*:*)
+ echo alpha-dec-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ alpha:OpenBSD:*:*)
+ echo alpha-dec-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:NetBSD:*:*)
+ echo ${UNAME_MACHINE}-pc-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ i?86:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-pc-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ i?86:FreeBSD:*:*)
+ echo ${UNAME_MACHINE}-pc-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+ sparc:NetBSD:*:*)
+ echo sparc-unknown-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sparc:OpenBSD:*:*)
+ echo sparc-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ vax:NetBSD:*:*)
+ echo vax-dec-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ vax:OpenBSD:*:*)
+ echo vax-dec-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:machten:*:*)
+ echo mac68k-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ concurrent*:*:*:*)
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo concurrent-concurrent-sysv3
+ else
+ echo concurrent-concurrent-bsd
+ fi
+ exit 0 ;;
+ ppc*:SunOS:5.*:*)
+ echo ppc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sparc:UNIX_SV:4.*:*)
+ echo sparc-unknown-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ mips:UNIX_SV:4.*:*)
+ echo mips-mips-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ mips:OSF*1:*:*)
+ echo mips-mips-osf1
+ exit 0 ;;
+ mips:4.4BSD:*:*)
+ echo mips-mips-bsd4.4
+ exit 0 ;;
+ MIServer-S:SMP_DC.OSx:*:dcosx)
+ echo mips-pyramid-sysv4
+ exit 0 ;;
+ news*:NEWS*:*:*)
+ echo mips-sony-newsos${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:NEXTSTEP:*:*)
+ echo i386-next-nextstep${RELEASE}
+ exit 0 ;;
+ *680?0:NEXTSTEP:*:*)
+ echo m68k-next-nextstep${RELEASE}
+ exit 0 ;;
+ *370:AIX:*:*)
+ echo ibm370-ibm-aix
+ exit 0 ;;
+ ksr1:OSF*1:*:*)
+ echo ksr1-ksr-osf1
+ exit 0 ;;
+ esa:OSF*1:*:* | ESA:OSF*:*:*)
+ echo esa-ibm-osf1
+ exit 0 ;;
+ DNP*:DNIX:*:*)
+ echo m68k-dnix-sysv
+ exit 0 ;;
+ *3b2*:*:*:*)
+ echo we32k-att-sysv3
+ exit 0 ;;
+ *:QNX:*:42*)
+ echo i386-qssl-qnx`echo ${UNAME_VERSION}`
+ exit 0 ;;
+ # end cases added for Bash
+ alpha:OSF1:*:*)
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'`
+ exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit 0 ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-cbm-sysv4
+ exit 0;;
+ amiga:NetBSD:*:*)
+ echo m68k-cbm-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ amiga:OpenBSD:*:*)
+ echo m68k-cbm-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit 0;;
+ Pyramid*:OSx*:*:*|MIS*:OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit 0 ;;
+ NILE:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit 0 ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit 0 ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:NetBSD:*:*)
+ echo m68k-atari-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:OpenBSD:*:*)
+ echo m68k-atari-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:NetBSD:*:*)
+ echo m68k-sun-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:OpenBSD:*:*)
+ echo m68k-sun-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:NetBSD:*:*)
+ echo m68k-apple-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-apple-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit 0 ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ sed 's/^ //' << EOF >dummy.c
+ int main (argc, argv) int argc; char **argv; {
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy \
+ && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit 0 ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerux
+ exit 0 ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit 0 ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit 0 ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+ -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit 0 ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit 0 ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit 0 ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i?86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ sed 's/^ //' << EOF >dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo rs6000-ibm-aix3.2.5
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit 0 ;;
+ *:AIX:*:4)
+ if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ elif grep bos410 /usr/include/stdio.h >/dev/null 2>&1; then
+ IBM_REV=4.1
+ elif grep bos411 /usr/include/stdio.h >/dev/null 2>&1; then
+ IBM_REV=4.1.1
+ else
+ IBM_REV=4.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit 0 ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit 0 ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit 0 ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit 0 ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit 0 ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit 0 ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit 0 ;;
+ 9000/[3478]??:HP-UX:*:*)
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;;
+ 9000/8?? ) HP_ARCH=hppa1.0 ;;
+ esac
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ 3050*:HI-UX:*:*)
+ sed 's/^ //' << EOF >dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo unknown-hitachi-hiuxwe2
+ exit 0 ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit 0 ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit 0 ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit 0 ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit 0 ;;
+ i?86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-pc-osf1mk
+ else
+ echo ${UNAME_MACHINE}-pc-osf1
+ fi
+ exit 0 ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit 0 ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ CRAY*X-MP:*:*:*)
+ echo xmp-cray-unicos
+ exit 0 ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+ exit 0 ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY-2:*:*:*)
+ echo cray2-cray-unicos
+ exit 0 ;;
+ F300:UNIX_System_V:*:*)
+ FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ F301:UNIX_System_V:*:*)
+ echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+ exit 0 ;;
+ hp3[0-9][05]:NetBSD:*:*)
+ echo m68k-hp-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hp3[0-9][05]:OpenBSD:*:*)
+ echo m68k-hp-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:BSD/386:*:* | *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:FreeBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+ *:NetBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ i*:CYGWIN*:*)
+ echo i386-pc-cygwin32
+ exit 0 ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin32
+ exit 0 ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ *:GNU:*:*)
+ echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ *:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us.
+ ld_help_string=`ld --help 2>&1`
+ if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i.86"; then
+ echo "${UNAME_MACHINE}-pc-linux-gnu" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86linux"; then
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86coff"; then
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then
+ echo "${UNAME_MACHINE}-unknown-linux-gnu" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then
+ echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32ppc"; then
+ echo "powerpc-unknown-linux-gnu" ; exit 0
+ elif test "${UNAME_MACHINE}" = "alpha" ; then
+ echo alpha-unknown-linux-gnu ; exit 0
+ elif test "${UNAME_MACHINE}" = "sparc" ; then
+ echo sparc-unknown-linux-gnu ; exit 0
+ else
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or one that does not give us
+ # useful --help. Gcc wants to distinguish between linux-gnuoldld and linux-gnuaout.
+ test ! -d /usr/lib/ldscripts/. \
+ && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+ # Determine whether the default compiler is a.out or elf
+ cat >dummy.c <<EOF
+main(argc, argv)
+int argc;
+char *argv[];
+{
+#ifdef __ELF__
+ printf ("%s-pc-linux-gnu\n", argv[1]);
+#else
+ printf ("%s-pc-linux-gnuaout\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+ i?86:DYNIX/ptx:4*:*)
+ echo i386-sequent-sysv4
+ exit 0 ;;
+ i?86:*:4.*:* | i?86:SYSTEM_V:4.*:* | i[34]86:UNIX_SV:4.*:*)
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ i?86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit 0 ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit 0 ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit 0 ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit 0 ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit 0 ;;
+ M68*:*:R3V[567]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit 0 ;;
+ m68*:LynxOS:2.*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:LynxOS:2.*:*)
+ echo i386-pc-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ *:LynxOS:*:*)
+ echo ${UNAME_MACHINE}-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit 0 ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit 0 ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit 0 ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit 0 ;;
+ R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp9000) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+ printf ("vax-dec-bsd\n"); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+/* Begin cases added for Bash */
+#if defined (tahoe)
+ printf ("tahoe-cci-bsd\n"); exit (0);
+#endif
+
+#if defined (nec_ews)
+# if defined (SYSTYPE_SYSV)
+ printf ("ews4800-nec-sysv4\n"); exit 0;
+# else
+ printf ("ews4800-nec-bsd\n"); exit (0);
+# endif
+#endif
+
+#if defined (sony)
+# if defined (SYSTYPE_SYSV)
+ printf ("mips-sony-sysv4\n"); exit 0;
+# else
+ printf ("mips-sony-bsd\n"); exit (0);
+# endif
+#endif
+
+#if defined (ardent)
+ printf ("titan-ardent-bsd\n"); exit (0);
+#endif
+
+#if defined (stardent)
+ printf ("stardent-stardent-sysv\n"); exit (0);
+#endif
+
+#if defined (ibm032)
+ printf ("ibmrt-ibm-bsd4.3\n"); exit (0);
+#endif
+
+#if defined (sequent) && defined (i386)
+ printf ("i386-sequent-bsd\n"); exit (0);
+#endif
+
+#if defined (qnx) && defined (i386)
+ printf ("i386-pc-qnx\n"); exit (0);
+#endif
+
+#if defined (gould)
+ printf ("gould-gould-bsd\n"); exit (0);
+#endif
+
+#if defined (unixpc)
+ printf ("unixpc-att-sysv\n"); exit (0);
+#endif
+
+#if defined (att386)
+ printf ("i386-att-sysv3\n"); exit (0);
+#endif
+
+#if defined (__m88k) && defined (__UMAXV__)
+ printf ("m88k-encore-sysv3\n"); exit (0);
+#endif
+
+#if defined (drs6000)
+ printf ("drs6000-icl-sysv4.2\n"); exit (0);
+#endif
+
+#if defined (clipper)
+ printf ("clipper-orion-bsd\n"); exit (0);
+#endif
+
+#if defined (is68k)
+ printf ("m68k-isi-bsd\n"); exit (0);
+#endif
+
+#if defined (luna88k)
+ printf ("luna88k-omron-bsd\n"); exit (0);
+#endif
+
+#if defined (butterfly) && defined (BFLY1)
+ printf ("butterfly-bbn-mach\n"); exit (0);
+#endif
+
+#if defined (tower32)
+ printf ("tower32-ncr-sysv4\n"); exit (0);
+#endif
+
+#if defined (MagicStation)
+ printf ("magicstation-unknown-bsd\n"); exit (0);
+#endif
+
+#if defined (scs)
+ printf ("symmetric-scs-bsd4.2\n"); exit (0);
+#endif
+
+#if defined (tandem)
+ printf ("tandem-tandem-sysv\n"); exit (0);
+#endif
+
+#if defined (cadmus)
+ printf ("cadmus-pcs-sysv\n"); exit (0);
+#endif
+
+#if defined (masscomp)
+ printf ("masscomp-masscomp-sysv3\n"); exit (0);
+#endif
+
+#if defined (hbullx20)
+ printf ("hbullx20-bull-sysv3\n"); exit (0);
+#endif
+
+/* End cases added for Bash */
+
+ exit (1);
+}
+EOF
+
+${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
+rm -f dummy.c dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ c34*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ c38*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ c4*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ esac
+fi
+
+# Begin cases added for Bash
+case "$UNAME" in
+uts) echo uts-amdahl-sysv${UNAME_RELEASE}; exit 0 ;;
+esac
+
+if [ -d /usr/amiga ]; then
+ echo m68k-cbm-sysv${UNAME_RELEASE}; exit 0;
+fi
+
+if [ -f /bin/fxc.info ]; then
+ echo fxc-alliant-concentrix
+ exit 0
+fi
+# end cases added for Bash
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/support/config.sub b/support/config.sub
new file mode 100755
index 0000000..e800bb6
--- /dev/null
+++ b/support/config.sub
@@ -0,0 +1,944 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+# Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+ echo Configuration name missing. 1>&2
+ echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+ echo "or $0 ALIAS" 1>&2
+ echo where ALIAS is a recognized configuration type. 1>&2
+ exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+ *local*)
+ echo $1
+ exit 0
+ ;;
+ *)
+ ;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ linux-gnu*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple)
+ os=
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ tahoe | i860 | m68k | m68000 | m88k | ns32k | arm \
+ | arme[lb] | pyramid \
+ | tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \
+ | alpha | we32k | ns16k | clipper | i370 | sh \
+ | powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \
+ | pdp11 | mips64el | mips64orion | mips64orionel \
+ | sparc | sparclet | sparclite | sparc64)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i[3456]86)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \
+ | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
+ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
+ | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
+ | hppa-* | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
+ | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
+ | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \
+ | mips64el-* | mips64orion-* | mips64orionel-* | f301-* \
+ | butterfly-bbn* \
+ | cadmus-* | ews*-nec | ibmrt-ibm* | masscomp-masscomp \
+ | tandem-* | symmetric-* | drs6000-icl | *-*ardent | gould-gould \
+ | concurrent-* | ksr1-* | esa-ibm | fxc-alliant | *370-amdahl \
+ | *-convex)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-cbm
+ ;;
+ amigados)
+ basic_machine=m68k-cbm
+ os=-amigados
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-cbm
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ cray2)
+ basic_machine=cray2-cray
+ os=-unicos
+ ;;
+ [ctj]90-cray)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ hbullx20-bull)
+ basic_machine=m68k-bull
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax | multimax)
+ basic_machine=ns32k-encore
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ ibm032-*)
+ basic_machine=ibmrt-ibm
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i[3456]86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i[3456]86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i[3456]86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i[3456]86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ luna88k-omron* | m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magicstation*)
+ basic_machine=magicstation-unknown
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5)
+ basic_machine=i586-intel
+ ;;
+ pentiumpro | p6)
+ basic_machine=i686-intel
+ ;;
+ pentium-* | p5-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ k5)
+ # We don't have specific support for AMD's K5 yet, so just call it a Pentium
+ basic_machine=i586-amd
+ ;;
+ nexen)
+ # We don't have specific support for Nexgen yet, so just call it a Pentium
+ basic_machine=i586-nexgen
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=rs6000-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ xmp)
+ basic_machine=xmp-cray
+ os=-unicos
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ mips)
+ basic_machine=mips-mips
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sparc)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -unixware* | svr4*)
+ os=-sysv4
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -linux-gnu* | -uxpv* | -qnx* | -powerux)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigados
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f301-fujitsu)
+ os=-uxpv
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -lynxos*)
+ vendor=lynx
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -vxsim* | -vxworks*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
diff --git a/support/install.sh b/support/install.sh
new file mode 100755
index 0000000..ea88212
--- /dev/null
+++ b/support/install.sh
@@ -0,0 +1,235 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+tranformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/support/mkdirs b/support/mkdirs
new file mode 100755
index 0000000..b79d971
--- /dev/null
+++ b/support/mkdirs
@@ -0,0 +1,32 @@
+#! /bin/sh
+#
+# mkdirs - a work-alike for `mkdir -p'
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+for dir
+do
+
+ test -d "$dir" && continue
+
+ tomake=$dir
+ while test -n "$dir" ; do
+ # dir=${dir%/*}
+ # dir=`expr "$dir" ':' '\(/.*\)/[^/]*'`
+ if dir=`expr "$dir" ':' '\(.*\)/[^/]*'`; then
+ tomake="$dir $tomake"
+ else
+ dir=
+ fi
+ done
+
+ for d in $tomake
+ do
+ test -d "$d" && continue
+ echo mkdir "$d"
+ mkdir "$d"
+ done
+done
+
+exit 0
diff --git a/support/mkdist b/support/mkdist
new file mode 100755
index 0000000..0d3d694
--- /dev/null
+++ b/support/mkdist
@@ -0,0 +1,100 @@
+#! /bin/bash -
+#
+# mkdist - make a distribution directory from a master manifest file
+#
+# usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-v] version
+#
+# SRCDIR defaults to src
+# MANIFEST defaults to $SRCDIR/MANIFEST
+#
+
+SRCDIR=src
+ROOTNAME=bash
+
+usage()
+{
+ echo usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-v] version 1>&2
+ exit 2
+}
+
+vmsg()
+{
+ if [ -n "$verbose" ]; then
+ echo mkdist: "$@"
+ fi
+}
+
+while getopts m:s:r:v name
+do
+ case $name in
+ m) MANIFEST=$OPTARG ;;
+ s) SRCDIR=$OPTARG ;;
+ r) ROOTNAME=$OPTARG ;;
+ v) verbose=yes ;;
+ ?) usage ;;
+ esac
+done
+
+: ${MANIFEST:=$SRCDIR/MANIFEST}
+
+vmsg using $MANIFEST
+
+shift $(( $OPTIND - 1 ))
+
+if [ $# -lt 1 ]; then
+ usage
+fi
+
+version=$1
+newdir=${ROOTNAME}-$version
+
+vmsg creating distribution for version $version in $newdir
+
+if [ ! -d $newdir ]; then
+ mkdir $newdir || { echo $0: cannot make directory $newdir 1>&2 ; exit 1; }
+fi
+
+dirmode=755
+filmode=644
+
+while read fname type mode
+do
+ [ -z "$fname" ] && continue
+
+ case "$fname" in
+ \#*) continue ;;
+ esac
+
+ case "$type" in
+ d) mkdir $newdir/$fname ;;
+ f) cp -p $SRCDIR/$fname $newdir/$fname ;;
+ *) echo "unknown file type $type" 1>&2 ;;
+ esac
+
+ if [ -n "$mode" ]; then
+ chmod $mode $newdir/$fname
+ fi
+
+done < $MANIFEST
+
+# cut off the `-alpha' in something like `2.0-alpha', leaving just the
+# numeric version
+#version=${version%%-*}
+
+#case "$version" in
+#*.*.*) vers=${version%.*} ;;
+#*.*) vers=${version} ;;
+#esac
+
+#echo $vers > $newdir/.distribution
+
+#case "$version" in
+#*.*.*) plevel=${version##*.} ;;
+#*) plevel=0 ;;
+#esac
+#[ -z "$plevel" ] && plevel=0
+#echo ${plevel} > $newdir/.patchlevel
+
+vmsg $newdir created
+
+exit 0
diff --git a/tcap.h b/tcap.h
new file mode 100644
index 0000000..acb2d76
--- /dev/null
+++ b/tcap.h
@@ -0,0 +1,60 @@
+/* tcap.h -- termcap library functions and variables. */
+
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+
+ This file contains the Readline Library (the Library), a set of
+ routines for providing Emacs style line input to programs that ask
+ for it.
+
+ The Library 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.
+
+ The Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#if !defined (_RLTCAP_H_)
+#define _RLTCAP_H_
+
+#if defined (HAVE_CONFIG_H)
+# include "config.h"
+#endif
+
+#if defined (HAVE_TERMCAP_H)
+# if defined (__linux__) && !defined (SPEED_T_IN_SYS_TYPES)
+# include "rltty.h"
+# endif
+# include <termcap.h>
+#else
+
+/* On Solaris2, sys/types.h #includes sys/reg.h, which #defines PC.
+ Unfortunately, PC is a global variable used by the termcap library. */
+#ifdef PC
+# undef PC
+#endif
+
+extern char PC;
+extern char *UP, *BC;
+
+extern short ospeed;
+
+extern int tgetent ();
+extern int tgetflag ();
+extern int tgetnum ();
+extern char *tgetstr ();
+
+extern int tputs ();
+
+extern char *tgoto ();
+
+#endif /* HAVE_TERMCAP_H */
+
+#endif /* !_RLTCAP_H_ */
diff --git a/terminal.c b/terminal.c
new file mode 100644
index 0000000..5a8df89
--- /dev/null
+++ b/terminal.c
@@ -0,0 +1,544 @@
+/* terminal.c -- controlling the terminal with termcap. */
+
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline Library 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.
+
+ The GNU Readline Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include "posixstat.h"
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+# include <sys/file.h>
+#endif /* HAVE_SYS_FILE_H */
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_LOCALE_H)
+# include <locale.h>
+#endif
+
+#include <signal.h>
+#include <stdio.h>
+#include <setjmp.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ)
+# include <sys/ioctl.h>
+#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */
+
+#include "rltty.h"
+#include "tcap.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+/* Variables and functions imported from readline.c */
+extern FILE *_rl_in_stream, *_rl_out_stream;
+extern int readline_echoing_p;
+extern int _rl_bell_preference;
+extern Keymap _rl_keymap;
+
+/* Functions imported from bind.c */
+extern void _rl_bind_if_unbound ();
+
+/* Functions imported from shell.c */
+extern void set_lines_and_columns ();
+extern char *get_env_value ();
+
+/* **************************************************************** */
+/* */
+/* Terminal and Termcap */
+/* */
+/* **************************************************************** */
+
+static char *term_buffer = (char *)NULL;
+static char *term_string_buffer = (char *)NULL;
+
+static int tcap_initialized;
+
+/* Non-zero means this terminal can't really do anything. */
+static int dumb_term;
+
+#if !defined (__linux__)
+# if defined (__EMX__) || defined (NEED_EXTERN_PC)
+extern
+# endif /* __EMX__ || NEED_EXTERN_PC */
+char PC, *BC, *UP;
+#endif /* __linux__ */
+
+/* Some strings to control terminal actions. These are output by tputs (). */
+char *term_goto, *term_clreol, *term_cr, *term_clrpag, *term_backspace;
+char *term_pc;
+
+/* Non-zero if we determine that the terminal can do character insertion. */
+int terminal_can_insert = 0;
+
+/* How to insert characters. */
+char *term_im, *term_ei, *term_ic, *term_ip, *term_IC;
+
+/* How to delete characters. */
+char *term_dc, *term_DC;
+
+#if defined (HACK_TERMCAP_MOTION)
+char *term_forward_char;
+#endif /* HACK_TERMCAP_MOTION */
+
+/* How to go up a line. */
+char *term_up;
+
+/* A visible bell, if the terminal can be made to flash the screen. */
+static char *visible_bell;
+
+/* Non-zero means the terminal can auto-wrap lines. */
+int _rl_term_autowrap;
+
+/* Non-zero means that this terminal has a meta key. */
+static int term_has_meta;
+
+/* The sequences to write to turn on and off the meta key, if this
+ terminal has one. */
+static char *term_mm, *term_mo;
+
+/* The key sequences output by the arrow keys, if this terminal has any. */
+static char *term_ku, *term_kd, *term_kr, *term_kl;
+
+/* How to initialize and reset the arrow keys, if this terminal has any. */
+static char *term_ks, *term_ke;
+
+/* The key sequences sent by the Home and End keys, if any. */
+static char *term_kh, *term_kH;
+
+/* Variables that hold the screen dimensions, used by the display code. */
+int screenwidth, screenheight, screenchars;
+
+/* Non-zero means the user wants to enable the keypad. */
+int _rl_enable_keypad;
+
+/* Non-zero means the user wants to enable a meta key. */
+int _rl_enable_meta = 1;
+
+/* Get readline's idea of the screen size. TTY is a file descriptor open
+ to the terminal. If IGNORE_ENV is true, we do not pay attention to the
+ values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being
+ non-null serve to check whether or not we have initialized termcap. */
+void
+_rl_get_screen_size (tty, ignore_env)
+ int tty, ignore_env;
+{
+ char *ss;
+#if defined (TIOCGWINSZ)
+ struct winsize window_size;
+#endif /* TIOCGWINSZ */
+#if defined (__EMX__)
+ int sz[2];
+#endif
+
+#if defined (TIOCGWINSZ)
+ if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)
+ {
+ screenwidth = (int) window_size.ws_col;
+ screenheight = (int) window_size.ws_row;
+ }
+#endif /* TIOCGWINSZ */
+
+#if defined (__EMX__)
+ _scrsize (sz);
+ screenwidth = sz[0];
+ screenheight = sz[1];
+#endif
+
+ /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV
+ is unset. */
+ if (screenwidth <= 0)
+ {
+ if (ignore_env == 0 && (ss = get_env_value ("COLUMNS")))
+ screenwidth = atoi (ss);
+
+ if (screenwidth <= 0 && term_string_buffer)
+ screenwidth = tgetnum ("co");
+ }
+
+ /* Environment variable LINES overrides setting of "li" if IGNORE_ENV
+ is unset. */
+ if (screenheight <= 0)
+ {
+ if (ignore_env == 0 && (ss = get_env_value ("LINES")))
+ screenheight = atoi (ss);
+
+ if (screenheight <= 0 && term_string_buffer)
+ screenheight = tgetnum ("li");
+ }
+
+ /* If all else fails, default to 80x24 terminal. */
+ if (screenwidth <= 1)
+ screenwidth = 80;
+
+ if (screenheight <= 0)
+ screenheight = 24;
+
+ /* If we're being compiled as part of bash, set the environment
+ variables $LINES and $COLUMNS to new values. Otherwise, just
+ do a pair of putenv () or setenv () calls. */
+ set_lines_and_columns (screenheight, screenwidth);
+
+ if (!_rl_term_autowrap)
+ screenwidth--;
+
+ screenchars = screenwidth * screenheight;
+}
+
+void
+_rl_set_screen_size (rows, cols)
+ int rows, cols;
+{
+ screenheight = rows;
+ screenwidth = cols;
+
+ if (_rl_term_autowrap == 0)
+ screenwidth--;
+
+ screenchars = screenwidth * screenheight;
+}
+
+struct _tc_string {
+ char *tc_var;
+ char **tc_value;
+};
+
+/* This should be kept sorted, just in case we decide to change the
+ search algorithm to something smarter. */
+static struct _tc_string tc_strings[] =
+{
+ "DC", &term_DC,
+ "IC", &term_IC,
+ "ce", &term_clreol,
+ "cl", &term_clrpag,
+ "cr", &term_cr,
+ "dc", &term_dc,
+ "ei", &term_ei,
+ "ic", &term_ic,
+ "im", &term_im,
+ "kd", &term_kd,
+ "kh", &term_kh, /* home */
+ "kH", &term_kH, /* end */
+ "kl", &term_kl,
+ "kr", &term_kr,
+ "ku", &term_ku,
+ "ks", &term_ks,
+ "ke", &term_ke,
+ "le", &term_backspace,
+ "mm", &term_mm,
+ "mo", &term_mo,
+#if defined (HACK_TERMCAP_MOTION)
+ "nd", &term_forward_char,
+#endif
+ "pc", &term_pc,
+ "up", &term_up,
+ "vb", &visible_bell,
+};
+
+#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string))
+
+/* Read the desired terminal capability strings into BP. The capabilities
+ are described in the TC_STRINGS table. */
+static void
+get_term_capabilities (bp)
+ char **bp;
+{
+ register int i;
+
+ for (i = 0; i < NUM_TC_STRINGS; i++)
+ *(tc_strings[i].tc_value) = tgetstr (tc_strings[i].tc_var, bp);
+ tcap_initialized = 1;
+}
+
+int
+_rl_init_terminal_io (terminal_name)
+ char *terminal_name;
+{
+#if defined (__GO32__)
+ screenwidth = ScreenCols ();
+ screenheight = ScreenRows ();
+ screenchars = screenwidth * screenheight;
+ term_cr = "\r";
+ term_im = term_ei = term_ic = term_IC = (char *)NULL;
+ term_up = term_dc = term_DC = visible_bell = (char *)NULL;
+
+ /* Does the __GO32__ have a meta key? I don't know. */
+ term_has_meta = 0;
+ term_mm = term_mo = (char *)NULL;
+
+ /* It probably has arrow keys, but I don't know what they are. */
+ term_ku = term_kd = term_kr = term_kl = (char *)NULL;
+
+#if defined (HACK_TERMCAP_MOTION)
+ term_forward_char = (char *)NULL;
+#endif /* HACK_TERMCAP_MOTION */
+ terminal_can_insert = _rl_term_autowrap = 0;
+ return;
+#else /* !__GO32__ */
+
+ char *term, *buffer;
+ int tty;
+ Keymap xkeymap;
+
+ term = terminal_name ? terminal_name : get_env_value ("TERM");
+
+ if (term_string_buffer == 0)
+ term_string_buffer = xmalloc (2032);
+
+ if (term_buffer == 0)
+ term_buffer = xmalloc (4080);
+
+ buffer = term_string_buffer;
+
+ term_clrpag = term_cr = term_clreol = (char *)NULL;
+
+ if (term == 0)
+ term = "dumb";
+
+ if (tgetent (term_buffer, term) <= 0)
+ {
+ dumb_term = 1;
+ screenwidth = 79;
+ screenheight = 24;
+ screenchars = 79 * 24;
+ term_cr = "\r";
+ term_im = term_ei = term_ic = term_IC = (char *)NULL;
+ term_up = term_dc = term_DC = visible_bell = (char *)NULL;
+ term_ku = term_kd = term_kl = term_kr = (char *)NULL;
+#if defined (HACK_TERMCAP_MOTION)
+ term_forward_char = (char *)NULL;
+#endif
+ terminal_can_insert = 0;
+ return 0;
+ }
+
+ get_term_capabilities (&buffer);
+
+ /* Set up the variables that the termcap library expects the application
+ to provide. */
+ PC = term_pc ? *term_pc : 0;
+ BC = term_backspace;
+ UP = term_up;
+
+ if (!term_cr)
+ term_cr = "\r";
+
+ tty = rl_instream ? fileno (rl_instream) : 0;
+
+ screenwidth = screenheight = 0;
+
+ _rl_term_autowrap = tgetflag ("am") && tgetflag ("xn");
+
+ _rl_get_screen_size (tty, 0);
+
+ /* "An application program can assume that the terminal can do
+ character insertion if *any one of* the capabilities `IC',
+ `im', `ic' or `ip' is provided." But we can't do anything if
+ only `ip' is provided, so... */
+ terminal_can_insert = (term_IC || term_im || term_ic);
+
+ /* Check to see if this terminal has a meta key and clear the capability
+ variables if there is none. */
+ term_has_meta = (tgetflag ("km") || tgetflag ("MT"));
+ if (!term_has_meta)
+ term_mm = term_mo = (char *)NULL;
+
+ /* Attempt to find and bind the arrow keys. Do not override already
+ bound keys in an overzealous attempt, however. */
+ xkeymap = _rl_keymap;
+
+ _rl_keymap = emacs_standard_keymap;
+ _rl_bind_if_unbound (term_ku, rl_get_previous_history);
+ _rl_bind_if_unbound (term_kd, rl_get_next_history);
+ _rl_bind_if_unbound (term_kr, rl_forward);
+ _rl_bind_if_unbound (term_kl, rl_backward);
+
+ _rl_bind_if_unbound (term_kh, rl_beg_of_line); /* Home */
+ _rl_bind_if_unbound (term_kH, rl_end_of_line); /* End */
+
+#if defined (VI_MODE)
+ _rl_keymap = vi_movement_keymap;
+ _rl_bind_if_unbound (term_ku, rl_get_previous_history);
+ _rl_bind_if_unbound (term_kd, rl_get_next_history);
+ _rl_bind_if_unbound (term_kr, rl_forward);
+ _rl_bind_if_unbound (term_kl, rl_backward);
+
+ _rl_bind_if_unbound (term_kh, rl_beg_of_line); /* Home */
+ _rl_bind_if_unbound (term_kH, rl_end_of_line); /* End */
+#endif /* VI_MODE */
+
+ _rl_keymap = xkeymap;
+
+#endif /* !__GO32__ */
+ return 0;
+}
+
+char *
+rl_get_termcap (cap)
+ char *cap;
+{
+ register int i;
+
+ if (tcap_initialized == 0)
+ return ((char *)NULL);
+ for (i = 0; i < NUM_TC_STRINGS; i++)
+ {
+ if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0)
+ return *(tc_strings[i].tc_value);
+ }
+ return ((char *)NULL);
+}
+
+/* Re-initialize the terminal considering that the TERM/TERMCAP variable
+ has changed. */
+int
+rl_reset_terminal (terminal_name)
+ char *terminal_name;
+{
+ _rl_init_terminal_io (terminal_name);
+ return 0;
+}
+
+/* A function for the use of tputs () */
+int
+_rl_output_character_function (c)
+ int c;
+{
+ return putc (c, _rl_out_stream);
+}
+
+/* Write COUNT characters from STRING to the output stream. */
+void
+_rl_output_some_chars (string, count)
+ char *string;
+ int count;
+{
+ fwrite (string, 1, count, _rl_out_stream);
+}
+
+/* Move the cursor back. */
+int
+_rl_backspace (count)
+ int count;
+{
+ register int i;
+
+#if !defined (__GO32__)
+ if (term_backspace)
+ for (i = 0; i < count; i++)
+ tputs (term_backspace, 1, _rl_output_character_function);
+ else
+#endif /* !__GO32__ */
+ for (i = 0; i < count; i++)
+ putc ('\b', _rl_out_stream);
+ return 0;
+}
+
+/* Move to the start of the next line. */
+int
+crlf ()
+{
+#if defined (NEW_TTY_DRIVER)
+ if (term_cr)
+ tputs (term_cr, 1, _rl_output_character_function);
+#endif /* NEW_TTY_DRIVER */
+ putc ('\n', _rl_out_stream);
+ return 0;
+}
+
+/* Ring the terminal bell. */
+int
+ding ()
+{
+ if (readline_echoing_p)
+ {
+#if !defined (__GO32__)
+ switch (_rl_bell_preference)
+ {
+ case NO_BELL:
+ default:
+ break;
+ case VISIBLE_BELL:
+ if (visible_bell)
+ {
+ tputs (visible_bell, 1, _rl_output_character_function);
+ break;
+ }
+ /* FALLTHROUGH */
+ case AUDIBLE_BELL:
+ fprintf (stderr, "\007");
+ fflush (stderr);
+ break;
+ }
+#else /* __GO32__ */
+ fprintf (stderr, "\007");
+ fflush (stderr);
+#endif /* __GO32__ */
+ return (0);
+ }
+ return (-1);
+}
+
+/* **************************************************************** */
+/* */
+/* Controlling the Meta Key and Keypad */
+/* */
+/* **************************************************************** */
+
+static int
+outchar (c)
+ int c;
+{
+ return putc (c, rl_outstream);
+}
+
+void
+_rl_enable_meta_key ()
+{
+ if (term_has_meta && term_mm)
+ tputs (term_mm, 1, outchar);
+}
+
+void
+_rl_control_keypad (on)
+ int on;
+{
+ if (on && term_ks)
+ tputs (term_ks, 1, outchar);
+ else if (!on && term_ke)
+ tputs (term_ke, 1, outchar);
+}
diff --git a/tilde.c b/tilde.c
index 89168a0..1d38d9d 100644
--- a/tilde.c
+++ b/tilde.c
@@ -19,7 +19,13 @@
along with Readline; see the file COPYING. If not, write to the Free
Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-#include "memalloc.h"
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
#if defined (HAVE_STRING_H)
# include <string.h>
@@ -33,12 +39,18 @@
# include "ansi_stdlib.h"
#endif /* HAVE_STDLIB_H */
-#include "tilde.h"
+#include <sys/types.h>
#include <pwd.h>
-#if defined (USG) && !defined (HAVE_GETPW_DECLS)
+#include "tilde.h"
+
+#ifdef SHELL
+#include "shell.h"
+#endif
+
+#if !defined (HAVE_GETPW_DECLS)
extern struct passwd *getpwuid (), *getpwnam ();
-#endif /* USG && !defined (HAVE_GETPW_DECLS) */
+#endif /* !HAVE_GETPW_DECLS */
#if !defined (savestring)
extern char *xmalloc ();
@@ -74,6 +86,12 @@ static char *default_prefixes[] =
static char *default_suffixes[] =
{ " ", "\n", (char *)NULL };
+/* If non-null, this contains the address of a function that the application
+ wants called before trying the standard tilde expansions. The function
+ is called with the text sans tilde, and returns a malloc()'ed string
+ which is the expansion, or a NULL pointer if the expansion fails. */
+CPFunction *tilde_expansion_preexpansion_hook = (CPFunction *)NULL;
+
/* If non-null, this contains the address of a function to call if the
standard meaning for expanding a tilde fails. The function is called
with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
@@ -104,7 +122,7 @@ tilde_find_prefix (string, len)
string_len = strlen (string);
*len = 0;
- if (!*string || *string == '~')
+ if (*string == '\0' || *string == '~')
return (0);
if (prefixes)
@@ -131,13 +149,14 @@ tilde_find_suffix (string)
char *string;
{
register int i, j, string_len;
- register char **suffixes = tilde_additional_suffixes;
+ register char **suffixes;
+ suffixes = tilde_additional_suffixes;
string_len = strlen (string);
for (i = 0; i < string_len; i++)
{
- if (string[i] == '/' || !string[i])
+ if (string[i] == '/' /* || !string[i] */)
break;
for (j = 0; suffixes && suffixes[j]; j++)
@@ -149,16 +168,28 @@ tilde_find_suffix (string)
return (i);
}
+#if !defined (SHELL)
+static char *
+get_string_value (varname)
+ char *varname;
+{
+ return ((char *)getenv (varname));
+}
+#endif
+
/* Return a new string which is the result of tilde expanding STRING. */
char *
tilde_expand (string)
char *string;
{
- char *result, *tilde_expand_word ();
+ char *result;
int result_size, result_index;
- result_size = result_index = 0;
- result = (char *)NULL;
+ result_index = result_size = 0;
+ if (result = strchr (string, '~'))
+ result = xmalloc (result_size = (strlen (string) + 16));
+ else
+ result = xmalloc (result_size = strlen (string));
/* Scan through STRING expanding tildes as we come to them. */
while (1)
@@ -172,7 +203,7 @@ tilde_expand (string)
/* Copy the skipped text into the result. */
if ((result_index + start + 1) > result_size)
- result = (char *)xrealloc (result, 1 + (result_size += (start + 20)));
+ result = xrealloc (result, 1 + (result_size += (start + 20)));
strncpy (result + result_index, string, start);
result_index += start;
@@ -189,7 +220,7 @@ tilde_expand (string)
break;
/* Expand the entire tilde word, and copy it into RESULT. */
- tilde_word = (char *)xmalloc (1 + end);
+ tilde_word = xmalloc (1 + end);
strncpy (tilde_word, string, end);
tilde_word[end] = '\0';
string += end;
@@ -199,7 +230,7 @@ tilde_expand (string)
len = strlen (expansion);
if ((result_index + len + 1) > result_size)
- result = (char *)xrealloc (result, 1 + (result_size += (len + 20)));
+ result = xrealloc (result, 1 + (result_size += (len + 20)));
strcpy (result + result_index, expansion);
result_index += len;
@@ -211,97 +242,143 @@ tilde_expand (string)
return (result);
}
+/* Take FNAME and return the tilde prefix we want expanded. If LENP is
+ non-null, the index of the end of the prefix into FNAME is returned in
+ the location it points to. */
+static char *
+isolate_tilde_prefix (fname, lenp)
+ char *fname;
+ int *lenp;
+{
+ char *ret;
+ int i;
+
+ ret = xmalloc (strlen (fname));
+ for (i = 1; fname[i] && fname[i] != '/'; i++)
+ ret[i - 1] = fname[i];
+ ret[i - 1] = '\0';
+ if (lenp)
+ *lenp = i;
+ return ret;
+}
+
+/* Return a string that is PREFIX concatenated with SUFFIX starting at
+ SUFFIND. */
+static char *
+glue_prefix_and_suffix (prefix, suffix, suffind)
+ char *prefix, *suffix;
+ int suffind;
+{
+ char *ret;
+ int plen, slen;
+
+ plen = (prefix && *prefix) ? strlen (prefix) : 0;
+ slen = strlen (suffix + suffind);
+ ret = xmalloc (plen + slen + 1);
+ if (prefix && *prefix)
+ strcpy (ret, prefix);
+ strcpy (ret + plen, suffix + suffind);
+ return ret;
+}
+
+static char *
+get_home_dir ()
+{
+ char *home_dir;
+
+#ifdef SHELL
+ home_dir = (char *)NULL;
+ if (current_user.home_dir == 0)
+ get_current_user_info ();
+ home_dir = current_user.home_dir;
+#else
+ struct passwd *entry;
+
+ home_dir = (char *)NULL;
+ entry = getpwuid (getuid ());
+ if (entry)
+ home_dir = entry->pw_dir;
+#endif
+ return (home_dir);
+}
+
/* Do the work of tilde expansion on FILENAME. FILENAME starts with a
- tilde. If there is no expansion, call tilde_expansion_failure_hook. */
+ tilde. If there is no expansion, call tilde_expansion_failure_hook.
+ This always returns a newly-allocated string, never static storage. */
char *
tilde_expand_word (filename)
char *filename;
{
- char *dirname;
+ char *dirname, *expansion, *username;
+ int user_len;
+ struct passwd *user_entry;
+
+ if (filename == 0)
+ return ((char *)NULL);
- dirname = filename ? savestring (filename) : (char *)NULL;
+ if (*filename != '~')
+ return (savestring (filename));
- if (dirname && *dirname == '~')
+ /* A leading `~/' or a bare `~' is *always* translated to the value of
+ $HOME or the home directory of the current user, regardless of any
+ preexpansion hook. */
+ if (filename[1] == '\0' || filename[1] == '/')
{
- char *temp_name;
- if (!dirname[1] || dirname[1] == '/')
- {
- /* Prepend $HOME to the rest of the string. */
- char *temp_home = (char *)getenv ("HOME");
+ /* Prefix $HOME to the rest of the string. */
+ expansion = get_string_value ("HOME");
- /* If there is no HOME variable, look up the directory in
- the password database. */
- if (!temp_home)
- {
- struct passwd *entry;
+ /* If there is no HOME variable, look up the directory in
+ the password database. */
+ if (expansion == 0)
+ expansion = get_home_dir ();
- entry = getpwuid (getuid ());
- if (entry)
- temp_home = entry->pw_dir;
- }
+ return (glue_prefix_and_suffix (expansion, filename, 1));
+ }
- temp_name = xmalloc (1 + strlen (&dirname[1])
- + (temp_home ? strlen (temp_home) : 0));
- temp_name[0] = '\0';
- if (temp_home)
- strcpy (temp_name, temp_home);
- strcat (temp_name, dirname + 1);
- free (dirname);
- dirname = temp_name;
- }
- else
- {
- char u_name[257];
- struct passwd *user_entry;
- char *username;
- int i, c;
+ username = isolate_tilde_prefix (filename, &user_len);
- username = u_name;
- for (i = 1; c = dirname[i]; i++)
- {
- if (c == '/')
- break;
- else
- username[i - 1] = c;
- }
- username[i - 1] = '\0';
+ if (tilde_expansion_preexpansion_hook)
+ {
+ expansion = (*tilde_expansion_preexpansion_hook) (username);
+ if (expansion)
+ {
+ dirname = glue_prefix_and_suffix (expansion, filename, user_len);
+ free (username);
+ free (expansion);
+ return (dirname);
+ }
+ }
- if (!(user_entry = getpwnam (username)))
- {
- /* If the calling program has a special syntax for
- expanding tildes, and we couldn't find a standard
- expansion, then let them try. */
- if (tilde_expansion_failure_hook)
- {
- char *expansion;
-
- expansion = (*tilde_expansion_failure_hook) (username);
-
- if (expansion)
- {
- temp_name = xmalloc (1 + strlen (expansion)
- + strlen (&dirname[i]));
- strcpy (temp_name, expansion);
- strcat (temp_name, &dirname[i]);
- free (expansion);
- free (dirname);
- dirname = temp_name;
- }
- }
- /* We shouldn't report errors. */
- }
- else
+ /* No preexpansion hook, or the preexpansion hook failed. Look in the
+ password database. */
+ dirname = (char *)NULL;
+ user_entry = getpwnam (username);
+ if (user_entry == 0)
+ {
+ /* If the calling program has a special syntax for expanding tildes,
+ and we couldn't find a standard expansion, then let them try. */
+ if (tilde_expansion_failure_hook)
+ {
+ expansion = (*tilde_expansion_failure_hook) (username);
+ if (expansion)
{
- temp_name = xmalloc (1 + strlen (user_entry->pw_dir)
- + strlen (&dirname[i]));
- strcpy (temp_name, user_entry->pw_dir);
- strcat (temp_name, &dirname[i]);
- free (dirname);
- dirname = temp_name;
+ dirname = glue_prefix_and_suffix (expansion, filename, user_len);
+ free (expansion);
}
- endpwent ();
}
+ free (username);
+ /* If we don't have a failure hook, or if the failure hook did not
+ expand the tilde, return a copy of what we were passed. */
+ if (dirname == 0)
+ dirname = savestring (filename);
+ }
+ else
+ {
+ free (username);
+ dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
}
+
+ endpwent ();
return (dirname);
}
@@ -374,7 +451,7 @@ xrealloc (pointer, bytes)
static void
memory_error_and_abort ()
{
- fprintf (stderr, "readline: Out of virtual memory!\n");
+ fprintf (stderr, "readline: out of virtual memory\n");
abort ();
}
diff --git a/tilde.h b/tilde.h
index 726d081..634b954 100644
--- a/tilde.h
+++ b/tilde.h
@@ -1,17 +1,44 @@
/* tilde.h: Externally available variables and function in libtilde.a. */
-#if !defined (__TILDE_H__)
-# define __TILDE_H__
+/* Copyright (C) 1992 Free Software Foundation, Inc.
+
+ This file contains the Readline Library (the Library), a set of
+ routines for providing Emacs style line input to programs that ask
+ for it.
+
+ The Library 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.
+
+ The Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#if !defined (_TILDE_H_)
+# define _TILDE_H_
/* Function pointers can be declared as (Function *)foo. */
-#if !defined (__FUNCTION_DEF)
-# define __FUNCTION_DEF
+#if !defined (_FUNCTION_DEF)
+# define _FUNCTION_DEF
typedef int Function ();
typedef void VFunction ();
typedef char *CPFunction ();
typedef char **CPPFunction ();
#endif /* _FUNCTION_DEF */
+/* If non-null, this contains the address of a function that the application
+ wants called before trying the standard tilde expansions. The function
+ is called with the text sans tilde, and returns a malloc()'ed string
+ which is the expansion, or a NULL pointer if the expansion fails. */
+extern CPFunction *tilde_expansion_preexpansion_hook;
+
/* If non-null, this contains the address of a function to call if the
standard meaning for expanding a tilde fails. The function is called
with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
@@ -35,4 +62,4 @@ extern char *tilde_expand ();
tilde. If there is no expansion, call tilde_expansion_failure_hook. */
extern char *tilde_expand_word ();
-#endif /* __TILDE_H__ */
+#endif /* _TILDE_H_ */
diff --git a/undo.c b/undo.c
new file mode 100644
index 0000000..28ebcc8
--- /dev/null
+++ b/undo.c
@@ -0,0 +1,260 @@
+/* readline.c -- a general facility for reading lines of input
+ with emacs style editing and completion. */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline Library 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.
+
+ The GNU Readline Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h> /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
+
+/* Non-zero tells rl_delete_text and rl_insert_text to not add to
+ the undo list. */
+int _rl_doing_an_undo = 0;
+
+/* How many unclosed undo groups we currently have. */
+int _rl_undo_group_level = 0;
+
+/* The current undo list for THE_LINE. */
+UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL;
+
+/* **************************************************************** */
+/* */
+/* Undo, and Undoing */
+/* */
+/* **************************************************************** */
+
+/* Remember how to undo something. Concatenate some undos if that
+ seems right. */
+void
+rl_add_undo (what, start, end, text)
+ enum undo_code what;
+ int start, end;
+ char *text;
+{
+ UNDO_LIST *temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST));
+ temp->what = what;
+ temp->start = start;
+ temp->end = end;
+ temp->text = text;
+ temp->next = rl_undo_list;
+ rl_undo_list = temp;
+}
+
+/* Free the existing undo list. */
+void
+free_undo_list ()
+{
+ while (rl_undo_list)
+ {
+ UNDO_LIST *release = rl_undo_list;
+ rl_undo_list = rl_undo_list->next;
+
+ if (release->what == UNDO_DELETE)
+ free (release->text);
+
+ free (release);
+ }
+ rl_undo_list = (UNDO_LIST *)NULL;
+}
+
+/* Undo the next thing in the list. Return 0 if there
+ is nothing to undo, or non-zero if there was. */
+int
+rl_do_undo ()
+{
+ UNDO_LIST *release;
+ int waiting_for_begin = 0;
+ int start, end;
+
+#define TRANS(i) ((i) == -1 ? rl_point : ((i) == -2 ? rl_end : (i)))
+
+ do
+ {
+ if (!rl_undo_list)
+ return (0);
+
+ _rl_doing_an_undo = 1;
+
+ /* To better support vi-mode, a start or end value of -1 means
+ rl_point, and a value of -2 means rl_end. */
+ if (rl_undo_list->what == UNDO_DELETE || rl_undo_list->what == UNDO_INSERT)
+ {
+ start = TRANS (rl_undo_list->start);
+ end = TRANS (rl_undo_list->end);
+ }
+
+ switch (rl_undo_list->what)
+ {
+ /* Undoing deletes means inserting some text. */
+ case UNDO_DELETE:
+ rl_point = start;
+ rl_insert_text (rl_undo_list->text);
+ free (rl_undo_list->text);
+ break;
+
+ /* Undoing inserts means deleting some text. */
+ case UNDO_INSERT:
+ rl_delete_text (start, end);
+ rl_point = start;
+ break;
+
+ /* Undoing an END means undoing everything 'til we get to a BEGIN. */
+ case UNDO_END:
+ waiting_for_begin++;
+ break;
+
+ /* Undoing a BEGIN means that we are done with this group. */
+ case UNDO_BEGIN:
+ if (waiting_for_begin)
+ waiting_for_begin--;
+ else
+ ding ();
+ break;
+ }
+
+ _rl_doing_an_undo = 0;
+
+ release = rl_undo_list;
+ rl_undo_list = rl_undo_list->next;
+ free (release);
+ }
+ while (waiting_for_begin);
+
+ return (1);
+}
+#undef TRANS
+
+int
+_rl_fix_last_undo_of_type (type, start, end)
+ int type, start, end;
+{
+ UNDO_LIST *rl;
+
+ for (rl = rl_undo_list; rl; rl = rl->next)
+ {
+ if (rl->what == type)
+ {
+ rl->start = start;
+ rl->end = end;
+ return 0;
+ }
+ }
+ return 1;
+}
+
+/* Begin a group. Subsequent undos are undone as an atomic operation. */
+int
+rl_begin_undo_group ()
+{
+ rl_add_undo (UNDO_BEGIN, 0, 0, 0);
+ _rl_undo_group_level++;
+ return 0;
+}
+
+/* End an undo group started with rl_begin_undo_group (). */
+int
+rl_end_undo_group ()
+{
+ rl_add_undo (UNDO_END, 0, 0, 0);
+ _rl_undo_group_level--;
+ return 0;
+}
+
+/* Save an undo entry for the text from START to END. */
+int
+rl_modifying (start, end)
+ int start, end;
+{
+ if (start > end)
+ {
+ SWAP (start, end);
+ }
+
+ if (start != end)
+ {
+ char *temp = rl_copy_text (start, end);
+ rl_begin_undo_group ();
+ rl_add_undo (UNDO_DELETE, start, end, temp);
+ rl_add_undo (UNDO_INSERT, start, end, (char *)NULL);
+ rl_end_undo_group ();
+ }
+ return 0;
+}
+
+/* Revert the current line to its previous state. */
+int
+rl_revert_line (count, key)
+ int count, key;
+{
+ if (!rl_undo_list)
+ ding ();
+ else
+ {
+ while (rl_undo_list)
+ rl_do_undo ();
+ }
+ return 0;
+}
+
+/* Do some undoing of things that were done. */
+int
+rl_undo_command (count, key)
+ int count, key;
+{
+ if (count < 0)
+ return 0; /* Nothing to do. */
+
+ while (count)
+ {
+ if (rl_do_undo ())
+ count--;
+ else
+ {
+ ding ();
+ break;
+ }
+ }
+ return 0;
+}
diff --git a/util.c b/util.c
new file mode 100644
index 0000000..d96b29e
--- /dev/null
+++ b/util.c
@@ -0,0 +1,302 @@
+/* util.c -- readline utility functions */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline Library 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.
+
+ The GNU Readline Library 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include "posixjmp.h"
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h> /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+#include <ctype.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+#if defined (TIOCSTAT_IN_SYS_IOCTL)
+# include <sys/ioctl.h>
+#endif /* TIOCSTAT_IN_SYS_IOCTL */
+
+/* Some standard library routines. */
+#include "readline.h"
+
+#define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
+
+/* Pseudo-globals imported from readline.c */
+extern int readline_echoing_p;
+extern procenv_t readline_top_level;
+extern int rl_line_buffer_len;
+extern Function *rl_last_func;
+
+extern int _rl_defining_kbd_macro;
+extern char *_rl_executing_macro;
+
+/* Pseudo-global functions imported from other library files. */
+extern void _rl_pop_executing_macro ();
+extern void _rl_set_the_line ();
+extern void _rl_init_argument ();
+
+extern char *xmalloc (), *xrealloc ();
+
+/* **************************************************************** */
+/* */
+/* Utility Functions */
+/* */
+/* **************************************************************** */
+
+/* Return 0 if C is not a member of the class of characters that belong
+ in words, or 1 if it is. */
+
+int _rl_allow_pathname_alphabetic_chars = 0;
+static char *pathname_alphabetic_chars = "/-_=~.#$";
+
+int
+alphabetic (c)
+ int c;
+{
+ if (ALPHABETIC (c))
+ return (1);
+
+ return (_rl_allow_pathname_alphabetic_chars &&
+ strchr (pathname_alphabetic_chars, c) != NULL);
+}
+
+/* How to abort things. */
+int
+_rl_abort_internal ()
+{
+ ding ();
+ rl_clear_message ();
+ _rl_init_argument ();
+ rl_pending_input = 0;
+
+ _rl_defining_kbd_macro = 0;
+ while (_rl_executing_macro)
+ _rl_pop_executing_macro ();
+
+ rl_last_func = (Function *)NULL;
+ longjmp (readline_top_level, 1);
+ return (0);
+}
+
+int
+rl_abort (count, key)
+ int count, key;
+{
+ return (_rl_abort_internal ());
+}
+
+int
+rl_tty_status (count, key)
+ int count, key;
+{
+#if defined (TIOCSTAT)
+ ioctl (1, TIOCSTAT, (char *)0);
+ rl_refresh_line ();
+#else
+ ding ();
+#endif
+ return 0;
+}
+
+/* Return a copy of the string between FROM and TO.
+ FROM is inclusive, TO is not. */
+char *
+rl_copy_text (from, to)
+ int from, to;
+{
+ register int length;
+ char *copy;
+
+ /* Fix it if the caller is confused. */
+ if (from > to)
+ SWAP (from, to);
+
+ length = to - from;
+ copy = xmalloc (1 + length);
+ strncpy (copy, rl_line_buffer + from, length);
+ copy[length] = '\0';
+ return (copy);
+}
+
+/* Increase the size of RL_LINE_BUFFER until it has enough space to hold
+ LEN characters. */
+void
+rl_extend_line_buffer (len)
+ int len;
+{
+ while (len >= rl_line_buffer_len)
+ {
+ rl_line_buffer_len += DEFAULT_BUFFER_SIZE;
+ rl_line_buffer = xrealloc (rl_line_buffer, rl_line_buffer_len);
+ }
+
+ _rl_set_the_line ();
+}
+
+/* **************************************************************** */
+/* */
+/* String Utility Functions */
+/* */
+/* **************************************************************** */
+
+/* Determine if s2 occurs in s1. If so, return a pointer to the
+ match in s1. The compare is case insensitive. */
+char *
+_rl_strindex (s1, s2)
+ register char *s1, *s2;
+{
+ register int i, l, len;
+
+ for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++)
+ if (_rl_strnicmp (s1 + i, s2, l) == 0)
+ return (s1 + i);
+ return ((char *)NULL);
+}
+
+#if !defined (HAVE_STRCASECMP)
+/* Compare at most COUNT characters from string1 to string2. Case
+ doesn't matter. */
+int
+_rl_strnicmp (string1, string2, count)
+ char *string1, *string2;
+ int count;
+{
+ register char ch1, ch2;
+
+ while (count)
+ {
+ ch1 = *string1++;
+ ch2 = *string2++;
+ if (_rl_to_upper(ch1) == _rl_to_upper(ch2))
+ count--;
+ else
+ break;
+ }
+ return (count);
+}
+
+/* strcmp (), but caseless. */
+int
+_rl_stricmp (string1, string2)
+ char *string1, *string2;
+{
+ register char ch1, ch2;
+
+ while (*string1 && *string2)
+ {
+ ch1 = *string1++;
+ ch2 = *string2++;
+ if (_rl_to_upper(ch1) != _rl_to_upper(ch2))
+ return (1);
+ }
+ return (*string1 - *string2);
+}
+#endif /* !HAVE_STRCASECMP */
+
+/* Stupid comparison routine for qsort () ing strings. */
+int
+_rl_qsort_string_compare (s1, s2)
+ char **s1, **s2;
+{
+#if defined (HAVE_STRCOLL)
+ return (strcoll (*s1, *s2));
+#else
+ int result;
+
+ result = **s1 - **s2;
+ if (result == 0)
+ result = strcmp (*s1, *s2);
+
+ return result;
+#endif
+}
+
+/* Function equivalents for the macros defined in chartypes.h. */
+#undef _rl_uppercase_p
+int
+_rl_uppercase_p (c)
+ int c;
+{
+ return (isupper (c));
+}
+
+#undef _rl_lowercase_p
+int
+_rl_lowercase_p (c)
+ int c;
+{
+ return (islower (c));
+}
+
+#undef _rl_pure_alphabetic
+int
+_rl_pure_alphabetic (c)
+ int c;
+{
+ return (isupper (c) || islower (c));
+}
+
+#undef _rl_digit_p
+int
+_rl_digit_p (c)
+ int c;
+{
+ return (isdigit (c));
+}
+
+#undef _rl_to_lower
+int
+_rl_to_lower (c)
+ int c;
+{
+ return (isupper (c) ? tolower (c) : c);
+}
+
+#undef _rl_to_upper
+int
+_rl_to_upper (c)
+ int c;
+{
+ return (islower (c) ? toupper (c) : c);
+}
+
+#undef _rl_digit_value
+int
+_rl_digit_value (c)
+ int c;
+{
+ return (isdigit (c) ? c - '0' : c);
+}
diff --git a/vi_keymap.c b/vi_keymap.c
index b8b3123..14929a3 100644
--- a/vi_keymap.c
+++ b/vi_keymap.c
@@ -65,13 +65,13 @@ KEYMAP_ENTRY_ARRAY vi_movement_keymap = {
{ ISFUNC, (Function *)0x0 }, /* Control-\ */
{ ISFUNC, (Function *)0x0 }, /* Control-] */
{ ISFUNC, (Function *)0x0 }, /* Control-^ */
- { ISFUNC, rl_undo_command }, /* Control-_ */
+ { ISFUNC, rl_vi_undo }, /* Control-_ */
/* The start of printing characters. */
{ ISFUNC, rl_forward }, /* SPACE */
{ ISFUNC, (Function *)0x0 }, /* ! */
{ ISFUNC, (Function *)0x0 }, /* " */
- { ISFUNC, rl_vi_comment }, /* # */
+ { ISFUNC, rl_insert_comment }, /* # */
{ ISFUNC, rl_end_of_line }, /* $ */
{ ISFUNC, rl_vi_match }, /* % */
{ ISFUNC, rl_vi_tilde_expand }, /* & */
@@ -140,7 +140,7 @@ KEYMAP_ENTRY_ARRAY vi_movement_keymap = {
{ ISFUNC, (Function *)0x0 }, /* ] */
{ ISFUNC, rl_vi_first_print }, /* ^ */
{ ISFUNC, rl_vi_yank_arg }, /* _ */
- { ISFUNC, (Function *)0x0 }, /* ` */
+ { ISFUNC, rl_vi_goto_mark }, /* ` */
/* Lowercase alphabet. */
{ ISFUNC, rl_vi_append_mode }, /* a */
@@ -155,7 +155,7 @@ KEYMAP_ENTRY_ARRAY vi_movement_keymap = {
{ ISFUNC, rl_get_next_history }, /* j */
{ ISFUNC, rl_get_previous_history }, /* k */
{ ISFUNC, rl_forward }, /* l */
- { ISFUNC, (Function *)0x0 }, /* m */
+ { ISFUNC, rl_vi_set_mark }, /* m */
{ ISFUNC, rl_vi_search_again }, /* n */
{ ISFUNC, (Function *)0x0 }, /* o */
{ ISFUNC, rl_vi_put }, /* p */
@@ -163,7 +163,7 @@ KEYMAP_ENTRY_ARRAY vi_movement_keymap = {
{ ISFUNC, rl_vi_change_char }, /* r */
{ ISFUNC, rl_vi_subst }, /* s */
{ ISFUNC, rl_vi_char_search }, /* t */
- { ISFUNC, rl_undo_command }, /* u */
+ { ISFUNC, rl_vi_undo }, /* u */
{ ISFUNC, (Function *)0x0 }, /* v */
{ ISFUNC, rl_vi_next_word }, /* w */
{ ISFUNC, rl_vi_delete }, /* x */
@@ -345,7 +345,7 @@ KEYMAP_ENTRY_ARRAY vi_insertion_keymap = {
{ ISFUNC, rl_insert }, /* Control-\ */
{ ISFUNC, rl_insert }, /* Control-] */
{ ISFUNC, rl_insert }, /* Control-^ */
- { ISFUNC, rl_undo_command }, /* Control-_ */
+ { ISFUNC, rl_vi_undo }, /* Control-_ */
/* The start of printing characters. */
{ ISFUNC, rl_insert }, /* SPACE */
@@ -630,7 +630,7 @@ KEYMAP_ENTRY_ARRAY vi_escape_keymap = {
{ ISFUNC, (Function *)0x0 }, /* Control-\ */
{ ISFUNC, (Function *)0x0 }, /* Control-] */
{ ISFUNC, (Function *)0x0 }, /* Control-^ */
- { ISFUNC, rl_undo_command }, /* Control-_ */
+ { ISFUNC, rl_vi_undo }, /* Control-_ */
/* The start of printing characters. */
{ ISFUNC, (Function *)0x0 }, /* SPACE */
diff --git a/vi_mode.c b/vi_mode.c
index f8975f7..c730296 100644
--- a/vi_mode.c
+++ b/vi_mode.c
@@ -31,6 +31,10 @@
#if defined (VI_MODE)
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
#include <sys/types.h>
#if defined (HAVE_STDLIB_H)
@@ -50,12 +54,12 @@
#include "readline.h"
#include "history.h"
-#ifndef digit_p
-#define digit_p(c) ((c) >= '0' && (c) <= '9')
+#ifndef _rl_digit_p
+#define _rl_digit_p(c) ((c) >= '0' && (c) <= '9')
#endif
-#ifndef digit_value
-#define digit_value(c) ((c) - '0')
+#ifndef _rl_digit_value
+#define _rl_digit_value(c) ((c) - '0')
#endif
#ifndef member
@@ -63,22 +67,14 @@
#endif
#ifndef isident
-#define isident(c) ((pure_alphabetic (c) || digit_p (c) || c == '_'))
+#define isident(c) ((_rl_pure_alphabetic (c) || _rl_digit_p (c) || c == '_'))
#endif
#ifndef exchange
#define exchange(x, y) do {int temp = x; x = y; y = temp;} while (0)
#endif
-#ifndef VI_COMMENT_BEGIN_DEFAULT
-#define VI_COMMENT_BEGIN_DEFAULT "#"
-#endif
-
-#if defined (STATIC_MALLOC)
-static char *xmalloc (), *xrealloc ();
-#else
extern char *xmalloc (), *xrealloc ();
-#endif /* STATIC_MALLOC */
/* Variables imported from readline.c */
extern int rl_point, rl_end, rl_mark, rl_done;
@@ -89,48 +85,64 @@ extern char *rl_prompt;
extern char *rl_line_buffer;
extern int rl_arg_sign;
+extern int _rl_doing_an_undo;
+extern int _rl_undo_group_level;
+
extern void _rl_dispatch ();
+extern int _rl_char_search_internal ();
extern void rl_extend_line_buffer ();
extern int rl_vi_check ();
/* Non-zero means enter insertion mode. */
-static int _rl_vi_doing_insert = 0;
+static int _rl_vi_doing_insert;
-/* String inserted into the line by rl_vi_comment (). */
-char *rl_vi_comment_begin = (char *)NULL;
-
-/* *** UNCLEAN *** */
/* Command keys which do movement for xxx_to commands. */
static char *vi_motion = " hl^$0ftFt;,%wbeWBE|";
/* Keymap used for vi replace characters. Created dynamically since
rarely used. */
-static Keymap vi_replace_map = (Keymap)NULL;
+static Keymap vi_replace_map;
/* The number of characters inserted in the last replace operation. */
-static int vi_replace_count = 0;
+static int vi_replace_count;
/* If non-zero, we have text inserted after a c[motion] command that put
us implicitly into insert mode. Some people want this text to be
attached to the command so that it is `redoable' with `.'. */
-static int vi_continued_command = 0;
+static int vi_continued_command;
+static char *vi_insert_buffer;
+static int vi_insert_buffer_size;
static int _rl_vi_last_command = 'i'; /* default `.' puts you in insert mode */
static int _rl_vi_last_repeat = 1;
static int _rl_vi_last_arg_sign = 1;
-static int _rl_vi_last_motion = 0;
-static int _rl_vi_last_search_char = 0;
-static int _rl_vi_last_replacement = 0;
+static int _rl_vi_last_motion;
+static int _rl_vi_last_search_char;
+static int _rl_vi_last_replacement;
+
+static int _rl_vi_last_key_before_insert;
-static int vi_redoing = 0;
+static int vi_redoing;
/* Text modification commands. These are the `redoable' commands. */
static char *vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~";
+/* Arrays for the saved marks. */
+static int vi_mark_chars[27];
+
static int rl_digit_loop1 ();
void
+_rl_vi_initialize_line ()
+{
+ register int i;
+
+ for (i = 0; i < sizeof (vi_mark_chars) / sizeof (int); i++)
+ vi_mark_chars[i] = -1;
+}
+
+void
_rl_vi_reset_last ()
{
_rl_vi_last_command = 'i';
@@ -150,15 +162,26 @@ _rl_vi_set_last (key, repeat, sign)
/* Is the command C a VI mode text modification command? */
int
-rl_vi_textmod_command (c)
+_rl_vi_textmod_command (c)
int c;
{
return (member (c, vi_textmod));
}
+static void
+_rl_vi_stuff_insert (count)
+ int count;
+{
+ rl_begin_undo_group ();
+ while (count--)
+ rl_insert_text (vi_insert_buffer);
+ rl_end_undo_group ();
+}
+
/* Bound to `.'. Called from command mode, so we know that we have to
redo a text modification command. The default for _rl_vi_last_command
puts you back into insert mode. */
+int
rl_vi_redo (count, c)
int count, c;
{
@@ -169,13 +192,32 @@ rl_vi_redo (count, c)
}
vi_redoing = 1;
- _rl_dispatch (_rl_vi_last_command, _rl_keymap);
+ /* If we're redoing an insert with `i', stuff in the inserted text
+ and do not go into insertion mode. */
+ if (_rl_vi_last_command == 'i' && vi_insert_buffer && *vi_insert_buffer)
+ {
+ _rl_vi_stuff_insert (count);
+ /* And back up point over the last character inserted. */
+ if (rl_point > 0)
+ rl_point--;
+ }
+ else
+ _rl_dispatch (_rl_vi_last_command, _rl_keymap);
vi_redoing = 0;
return (0);
}
+
+/* A placeholder for further expansion. */
+int
+rl_vi_undo (count, key)
+ int count, key;
+{
+ return (rl_undo_command (count, key));
+}
/* Yank the nth arg from the previous line into this line at point. */
+int
rl_vi_yank_arg (count, key)
int count, key;
{
@@ -191,10 +233,11 @@ rl_vi_yank_arg (count, key)
/* With an argument, move back that many history lines, else move to the
beginning of history. */
+int
rl_vi_fetch_history (count, c)
int count, c;
{
- int current = where_history ();
+ int wanted;
/* Giving an argument of n means we want the nth command in the history
file. The command number is interpreted the same way that the bash
@@ -203,11 +246,11 @@ rl_vi_fetch_history (count, c)
output of `history'. */
if (rl_explicit_arg)
{
- int wanted = history_base + current - count;
+ wanted = history_base + where_history () - count;
if (wanted <= 0)
rl_beginning_of_history (0, 0);
else
- rl_get_previous_history (wanted);
+ rl_get_previous_history (wanted, c);
}
else
rl_beginning_of_history (count, 0);
@@ -215,6 +258,7 @@ rl_vi_fetch_history (count, c)
}
/* Search again for the last thing searched for. */
+int
rl_vi_search_again (count, key)
int count, key;
{
@@ -232,6 +276,7 @@ rl_vi_search_again (count, key)
}
/* Do a vi style search. */
+int
rl_vi_search (count, key)
int count, key;
{
@@ -253,6 +298,7 @@ rl_vi_search (count, key)
}
/* Completion, from vi's point of view. */
+int
rl_vi_complete (ignore, key)
int ignore, key;
{
@@ -275,22 +321,24 @@ rl_vi_complete (ignore, key)
if (key == '*' || key == '\\')
{
_rl_vi_set_last (key, 1, rl_arg_sign);
- rl_vi_insertion_mode ();
+ rl_vi_insertion_mode (1, key);
}
return (0);
}
/* Tilde expansion for vi mode. */
+int
rl_vi_tilde_expand (ignore, key)
int ignore, key;
{
rl_tilde_expand (0, key);
_rl_vi_set_last (key, 1, rl_arg_sign); /* XXX */
- rl_vi_insertion_mode ();
+ rl_vi_insertion_mode (1, key);
return (0);
}
/* Previous word in vi mode. */
+int
rl_vi_prev_word (count, key)
int count, key;
{
@@ -303,7 +351,7 @@ rl_vi_prev_word (count, key)
return (0);
}
- if (uppercase_p (key))
+ if (_rl_uppercase_p (key))
rl_vi_bWord (count);
else
rl_vi_bword (count);
@@ -312,6 +360,7 @@ rl_vi_prev_word (count, key)
}
/* Next word in vi mode. */
+int
rl_vi_next_word (count, key)
int count, key;
{
@@ -324,7 +373,7 @@ rl_vi_next_word (count, key)
return (0);
}
- if (uppercase_p (key))
+ if (_rl_uppercase_p (key))
rl_vi_fWord (count);
else
rl_vi_fword (count);
@@ -332,6 +381,7 @@ rl_vi_next_word (count, key)
}
/* Move to the end of the ?next? word. */
+int
rl_vi_end_word (count, key)
int count, key;
{
@@ -341,7 +391,7 @@ rl_vi_end_word (count, key)
return -1;
}
- if (uppercase_p (key))
+ if (_rl_uppercase_p (key))
rl_vi_eWord (count);
else
rl_vi_eword (count);
@@ -349,6 +399,7 @@ rl_vi_end_word (count, key)
}
/* Move forward a word the way that 'W' does. */
+int
rl_vi_fWord (count)
int count;
{
@@ -365,6 +416,7 @@ rl_vi_fWord (count)
return (0);
}
+int
rl_vi_bWord (count)
int count;
{
@@ -388,6 +440,7 @@ rl_vi_bWord (count)
return (0);
}
+int
rl_vi_eWord (count)
int count;
{
@@ -417,6 +470,7 @@ rl_vi_eWord (count)
return (0);
}
+int
rl_vi_fword (count)
int count;
{
@@ -442,6 +496,7 @@ rl_vi_fword (count)
return (0);
}
+int
rl_vi_bword (count)
int count;
{
@@ -480,6 +535,7 @@ rl_vi_bword (count)
return (0);
}
+int
rl_vi_eword (count)
int count;
{
@@ -504,32 +560,36 @@ rl_vi_eword (count)
return (0);
}
+int
rl_vi_insert_beg (count, key)
int count, key;
{
- rl_beg_of_line ();
- rl_vi_insertion_mode ();
+ rl_beg_of_line (1, key);
+ rl_vi_insertion_mode (1, key);
return (0);
}
+int
rl_vi_append_mode (count, key)
int count, key;
{
if (rl_point < rl_end)
rl_point++;
- rl_vi_insertion_mode ();
+ rl_vi_insertion_mode (1, key);
return (0);
}
+int
rl_vi_append_eol (count, key)
int count, key;
{
- rl_end_of_line ();
- rl_vi_append_mode ();
+ rl_end_of_line (1, key);
+ rl_vi_append_mode (1, key);
return (0);
}
/* What to do in the case of C-d. */
+int
rl_vi_eof_maybe (count, c)
int count, c;
{
@@ -540,13 +600,33 @@ rl_vi_eof_maybe (count, c)
/* Switching from one mode to the other really just involves
switching keymaps. */
+int
rl_vi_insertion_mode (count, key)
int count, key;
{
_rl_keymap = vi_insertion_keymap;
+ _rl_vi_last_key_before_insert = key;
return (0);
}
+static void
+_rl_vi_save_insert (up)
+ UNDO_LIST *up;
+{
+ int len, start, end;
+
+ start = up->start;
+ end = up->end;
+ len = end - start + 1;
+ if (len >= vi_insert_buffer_size)
+ {
+ vi_insert_buffer_size += (len + 32) - (len % 32);
+ vi_insert_buffer = xrealloc (vi_insert_buffer, vi_insert_buffer_size);
+ }
+ strncpy (vi_insert_buffer, rl_line_buffer + start, len - 1);
+ vi_insert_buffer[len-1] = '\0';
+}
+
void
_rl_vi_done_inserting ()
{
@@ -555,38 +635,49 @@ _rl_vi_done_inserting ()
rl_end_undo_group ();
/* Now, the text between rl_undo_list->next->start and
rl_undo_list->next->end is what was inserted while in insert
- mode. */
+ mode. It gets copied to VI_INSERT_BUFFER because it depends
+ on absolute indices into the line which may change (though they
+ probably will not). */
_rl_vi_doing_insert = 0;
+ _rl_vi_save_insert (rl_undo_list->next);
vi_continued_command = 1;
}
else
- vi_continued_command = 0;
+ {
+ if (_rl_vi_last_key_before_insert == 'i' && rl_undo_list)
+ _rl_vi_save_insert (rl_undo_list);
+ /* XXX - Other keys probably need to be checked. */
+ else if (_rl_vi_last_key_before_insert == 'C')
+ rl_end_undo_group ();
+ while (_rl_undo_group_level > 0)
+ rl_end_undo_group ();
+ vi_continued_command = 0;
+ }
}
+int
rl_vi_movement_mode (count, key)
int count, key;
{
if (rl_point > 0)
- rl_backward (1);
-
-#if 0
- _rl_vi_reset_last ();
-#endif
+ rl_backward (1, key);
_rl_keymap = vi_movement_keymap;
_rl_vi_done_inserting ();
return (0);
}
+int
rl_vi_arg_digit (count, c)
int count, c;
{
if (c == '0' && rl_numeric_arg == 1 && !rl_explicit_arg)
- return (rl_beg_of_line ());
+ return (rl_beg_of_line (1, c));
else
return (rl_digit_argument (count, c));
}
+int
rl_vi_change_case (count, ignore)
int count, ignore;
{
@@ -598,14 +689,14 @@ rl_vi_change_case (count, ignore)
while (count-- && rl_point < rl_end)
{
- if (uppercase_p (rl_line_buffer[rl_point]))
- c = to_lower (rl_line_buffer[rl_point]);
- else if (lowercase_p (rl_line_buffer[rl_point]))
- c = to_upper (rl_line_buffer[rl_point]);
+ if (_rl_uppercase_p (rl_line_buffer[rl_point]))
+ c = _rl_to_lower (rl_line_buffer[rl_point]);
+ else if (_rl_lowercase_p (rl_line_buffer[rl_point]))
+ c = _rl_to_upper (rl_line_buffer[rl_point]);
else
{
/* Just skip over characters neither upper nor lower case. */
- rl_forward (1);
+ rl_forward (1, c);
continue;
}
@@ -619,22 +710,24 @@ rl_vi_change_case (count, ignore)
rl_vi_check ();
}
else
- rl_forward (1);
+ rl_forward (1, c);
}
return (0);
}
+int
rl_vi_put (count, key)
int count, key;
{
- if (!uppercase_p (key) && (rl_point + 1 <= rl_end))
+ if (!_rl_uppercase_p (key) && (rl_point + 1 <= rl_end))
rl_point++;
rl_yank ();
- rl_backward (1);
+ rl_backward (1, key);
return (0);
}
+int
rl_vi_check ()
{
if (rl_point && rl_point == rl_end)
@@ -642,11 +735,12 @@ rl_vi_check ()
return (0);
}
+int
rl_vi_column (count, key)
int count, key;
{
if (count > rl_end)
- rl_end_of_line ();
+ rl_end_of_line (1, key);
else
rl_point = count - 1;
return (0);
@@ -665,10 +759,10 @@ rl_vi_domove (key, nextkey)
if (!member (c, vi_motion))
{
- if (digit_p (c))
+ if (_rl_digit_p (c))
{
save = rl_numeric_arg;
- rl_numeric_arg = digit_value (c);
+ rl_numeric_arg = _rl_digit_value (c);
rl_digit_loop1 ();
rl_numeric_arg *= save;
c = rl_read_key (); /* real command */
@@ -677,7 +771,7 @@ rl_vi_domove (key, nextkey)
else if (key == c && (key == 'd' || key == 'y' || key == 'c'))
{
rl_mark = rl_end;
- rl_beg_of_line ();
+ rl_beg_of_line (1, c);
_rl_vi_last_motion = c;
return (0);
}
@@ -708,13 +802,13 @@ rl_vi_domove (key, nextkey)
/* rl_vi_f[wW]ord () leaves the cursor on the first character of the next
word. If we are not at the end of the line, and we are on a
non-whitespace character, move back one (presumably to whitespace). */
- if ((to_upper (c) == 'W') && rl_point < rl_end && rl_point > rl_mark &&
+ if ((_rl_to_upper (c) == 'W') && rl_point < rl_end && rl_point > rl_mark &&
!whitespace (rl_line_buffer[rl_point]))
rl_point--;
/* If cw or cW, back up to the end of a word, so the behaviour of ce
or cE is the actual result. Brute-force, no subtlety. */
- if (key == 'c' && rl_point >= rl_mark && (to_upper (c) == 'W'))
+ if (key == 'c' && rl_point >= rl_mark && (_rl_to_upper (c) == 'W'))
{
/* Don't move farther back than where we started. */
while (rl_point > rl_mark && whitespace (rl_line_buffer[rl_point]))
@@ -760,12 +854,12 @@ rl_digit_loop1 ()
}
c = UNMETA (c);
- if (digit_p (c))
+ if (_rl_digit_p (c))
{
if (rl_explicit_arg)
- rl_numeric_arg = (rl_numeric_arg * 10) + digit_value (c);
+ rl_numeric_arg = (rl_numeric_arg * 10) + _rl_digit_value (c);
else
- rl_numeric_arg = digit_value (c);
+ rl_numeric_arg = _rl_digit_value (c);
rl_explicit_arg = 1;
}
else
@@ -778,12 +872,13 @@ rl_digit_loop1 ()
return (0);
}
+int
rl_vi_delete_to (count, key)
int count, key;
{
int c;
- if (uppercase_p (key))
+ if (_rl_uppercase_p (key))
rl_stuff_char ('$');
else if (vi_redoing)
rl_stuff_char (_rl_vi_last_motion);
@@ -796,19 +891,20 @@ rl_vi_delete_to (count, key)
/* These are the motion commands that do not require adjusting the
mark. */
- if ((strchr (" l|h^0%bB", c) == 0) && (rl_mark < rl_end))
+ if ((strchr (" l|h^0bB", c) == 0) && (rl_mark < rl_end))
rl_mark++;
rl_kill_text (rl_point, rl_mark);
return (0);
}
+int
rl_vi_change_to (count, key)
int count, key;
{
int c, start_pos;
- if (uppercase_p (key))
+ if (_rl_uppercase_p (key))
rl_stuff_char ('$');
else if (vi_redoing)
rl_stuff_char (_rl_vi_last_motion);
@@ -824,29 +920,45 @@ rl_vi_change_to (count, key)
/* These are the motion commands that do not require adjusting the
mark. c[wW] are handled by special-case code in rl_vi_domove(),
and already leave the mark at the correct location. */
- if ((strchr (" l|hwW^0%bB", c) == 0) && (rl_mark < rl_end))
+ if ((strchr (" l|hwW^0bB", c) == 0) && (rl_mark < rl_end))
rl_mark++;
/* The cursor never moves with c[wW]. */
- if ((to_upper (c) == 'W') && rl_point < start_pos)
+ if ((_rl_to_upper (c) == 'W') && rl_point < start_pos)
rl_point = start_pos;
- rl_kill_text (rl_point, rl_mark);
-
- rl_begin_undo_group ();
- _rl_vi_doing_insert = 1;
- _rl_vi_set_last (key, count, rl_arg_sign);
- rl_vi_insertion_mode ();
+ if (vi_redoing)
+ {
+ if (vi_insert_buffer && *vi_insert_buffer)
+ rl_begin_undo_group ();
+ rl_delete_text (rl_point, rl_mark);
+ if (vi_insert_buffer && *vi_insert_buffer)
+ {
+ rl_insert_text (vi_insert_buffer);
+ rl_end_undo_group ();
+ }
+ }
+ else
+ {
+ rl_begin_undo_group (); /* to make the `u' command work */
+ rl_kill_text (rl_point, rl_mark);
+ /* `C' does not save the text inserted for undoing or redoing. */
+ if (_rl_uppercase_p (key) == 0)
+ _rl_vi_doing_insert = 1;
+ _rl_vi_set_last (key, count, rl_arg_sign);
+ rl_vi_insertion_mode (1, key);
+ }
return (0);
}
+int
rl_vi_yank_to (count, key)
int count, key;
{
int c, save = rl_point;
- if (uppercase_p (key))
+ if (_rl_uppercase_p (key))
rl_stuff_char ('$');
if (rl_vi_domove (key, &c))
@@ -869,6 +981,7 @@ rl_vi_yank_to (count, key)
return (0);
}
+int
rl_vi_delete (count, key)
int count, key;
{
@@ -888,57 +1001,36 @@ rl_vi_delete (count, key)
rl_kill_text (rl_point, end);
if (rl_point > 0 && rl_point == rl_end)
- rl_backward (1);
+ rl_backward (1, key);
return (0);
}
-/* Turn the current line into a comment in shell history.
- A K*rn shell style function. */
-rl_vi_comment (count, key)
+int
+rl_vi_back_to_indent (count, key)
int count, key;
{
- rl_beg_of_line ();
-
- if (rl_vi_comment_begin != (char *)NULL)
- rl_insert_text (rl_vi_comment_begin);
- else
- rl_insert_text (VI_COMMENT_BEGIN_DEFAULT); /* Default. */
-
- rl_redisplay ();
- rl_newline (1, '\010');
+ rl_beg_of_line (1, key);
+ while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+ rl_point++;
return (0);
}
+int
rl_vi_first_print (count, key)
int count, key;
{
- return (rl_back_to_indent ());
-}
-
-rl_back_to_indent (ignore1, ignore2)
- int ignore1, ignore2;
-{
- rl_beg_of_line ();
- while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
- rl_point++;
- return (0);
+ return (rl_vi_back_to_indent (1, key));
}
-/* NOTE: it is necessary that opposite directions are inverses */
-#define FTO 1 /* forward to */
-#define BTO -1 /* backward to */
-#define FFIND 2 /* forward find */
-#define BFIND -2 /* backward find */
-
+int
rl_vi_char_search (count, key)
int count, key;
{
static char target;
static int orig_dir, dir;
- int pos;
if (key == ';' || key == ',')
- dir = (key == ';' ? orig_dir : -orig_dir);
+ dir = key == ';' ? orig_dir : -orig_dir;
else
{
if (vi_redoing)
@@ -966,71 +1058,11 @@ rl_vi_char_search (count, key)
}
}
- pos = rl_point;
-
- while (count--)
- {
- if (dir < 0)
- {
- if (pos == 0)
- {
- ding ();
- return -1;
- }
-
- pos--;
- do
- {
- if (rl_line_buffer[pos] == target)
- {
- if (dir == BTO)
- rl_point = pos + 1;
- else
- rl_point = pos;
- break;
- }
- }
- while (pos--);
-
- if (pos < 0)
- {
- ding ();
- return -1;
- }
- }
- else
- { /* dir > 0 */
- if (pos >= rl_end)
- {
- ding ();
- return -1;
- }
-
- pos++;
- do
- {
- if (rl_line_buffer[pos] == target)
- {
- if (dir == FTO)
- rl_point = pos - 1;
- else
- rl_point = pos;
- break;
- }
- }
- while (++pos < rl_end);
-
- if (pos >= (rl_end - 1))
- {
- ding ();
- return -1;
- }
- }
- }
- return (0);
+ return (_rl_char_search_internal (count, dir, target));
}
/* Match brackets */
+int
rl_vi_match (ignore, key)
int ignore, key;
{
@@ -1041,7 +1073,7 @@ rl_vi_match (ignore, key)
{
while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0 &&
rl_point < rl_end - 1)
- rl_forward (1);
+ rl_forward (1, key);
if (brack <= 0)
{
@@ -1111,6 +1143,7 @@ rl_vi_bracktype (c)
}
}
+int
rl_vi_change_char (count, key)
int count, key;
{
@@ -1131,37 +1164,51 @@ rl_vi_change_char (count, key)
rl_delete (1, c);
rl_insert (1, c);
if (count == 0)
- rl_backward (1);
+ rl_backward (1, c);
rl_end_undo_group ();
}
return (0);
}
+int
rl_vi_subst (count, key)
int count, key;
{
rl_begin_undo_group ();
- if (uppercase_p (key))
+ if (_rl_uppercase_p (key))
{
- rl_beg_of_line ();
- rl_kill_line (1);
+ rl_beg_of_line (1, key);
+ rl_kill_line (1, key);
}
else
- rl_delete (count, key);
+ rl_delete_text (rl_point, rl_point+count);
rl_end_undo_group ();
_rl_vi_set_last (key, count, rl_arg_sign);
- rl_begin_undo_group ();
- _rl_vi_doing_insert = 1;
- rl_vi_insertion_mode ();
+ if (vi_redoing)
+ {
+ int o = _rl_doing_an_undo;
+
+ _rl_doing_an_undo = 1;
+ if (vi_insert_buffer && *vi_insert_buffer)
+ rl_insert_text (vi_insert_buffer);
+ _rl_doing_an_undo = o;
+ }
+ else
+ {
+ rl_begin_undo_group ();
+ _rl_vi_doing_insert = 1;
+ rl_vi_insertion_mode (1, key);
+ }
return (0);
}
+int
rl_vi_overstrike (count, key)
int count, key;
{
@@ -1191,8 +1238,9 @@ rl_vi_overstrike (count, key)
return (0);
}
-rl_vi_overstrike_delete (count)
- int count;
+int
+rl_vi_overstrike_delete (count, key)
+ int count, key;
{
int i, s;
@@ -1209,7 +1257,7 @@ rl_vi_overstrike_delete (count)
vi_replace_count--;
if (rl_point == s)
- rl_backward (1);
+ rl_backward (1, key);
}
if (vi_replace_count == 0 && _rl_vi_doing_insert)
@@ -1221,6 +1269,7 @@ rl_vi_overstrike_delete (count)
return (0);
}
+int
rl_vi_replace (count, key)
int count, key;
{
@@ -1232,7 +1281,7 @@ rl_vi_replace (count, key)
{
vi_replace_map = rl_make_bare_keymap ();
- for (i = ' '; i < 127; i++)
+ for (i = ' '; i < KEYMAP_SIZE; i++)
vi_replace_map[i].function = rl_vi_overstrike;
vi_replace_map[RUBOUT].function = rl_vi_overstrike_delete;
@@ -1256,6 +1305,7 @@ rl_vi_replace (count, key)
/* Try to complete the word we are standing on or the word that ends with
the previous character. A space matches everything. Word delimiters are
space and ;. */
+int
rl_vi_possible_completions()
{
int save_pos = rl_point;
@@ -1279,51 +1329,50 @@ rl_vi_possible_completions()
}
#endif
-#if defined (STATIC_MALLOC)
-
-/* **************************************************************** */
-/* */
-/* xmalloc and xrealloc () */
-/* */
-/* **************************************************************** */
-
-static void memory_error_and_abort ();
-
-static char *
-xmalloc (bytes)
- int bytes;
+/* Functions to save and restore marks. */
+int
+rl_vi_set_mark (count, key)
+ int count, key;
{
- char *temp = (char *)malloc (bytes);
+ int ch;
- if (!temp)
- memory_error_and_abort ();
- return (temp);
+ ch = rl_read_key ();
+ if (_rl_lowercase_p (ch) == 0)
+ {
+ ding ();
+ return -1;
+ }
+ ch -= 'a';
+ vi_mark_chars[ch] = rl_point;
+ return 0;
}
-static char *
-xrealloc (pointer, bytes)
- char *pointer;
- int bytes;
+int
+rl_vi_goto_mark (count, key)
+ int count, key;
{
- char *temp;
-
- if (!pointer)
- temp = (char *)xmalloc (bytes);
- else
- temp = (char *)realloc (pointer, bytes);
+ int ch;
- if (!temp)
- memory_error_and_abort ();
-
- return (temp);
-}
+ ch = rl_read_key ();
+ if (ch == '`')
+ {
+ rl_point = rl_mark;
+ return 0;
+ }
+ else if (_rl_lowercase_p (ch) == 0)
+ {
+ ding ();
+ return -1;
+ }
-static void
-memory_error_and_abort ()
-{
- fprintf (stderr, "readline: Out of virtual memory!\n");
- abort ();
+ ch -= 'a';
+ if (vi_mark_chars[ch] == -1)
+ {
+ ding ();
+ return -1;
+ }
+ rl_point = vi_mark_chars[ch];
+ return 0;
}
-#endif /* STATIC_MALLOC */
#endif /* VI_MODE */
diff --git a/xmalloc.c b/xmalloc.c
index 4f6dc76..4160651 100644
--- a/xmalloc.c
+++ b/xmalloc.c
@@ -19,8 +19,10 @@
along with Readline; see the file COPYING. If not, write to the Free
Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-#if defined (ALREADY_HAVE_XMALLOC)
-#else
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
#include <stdio.h>
#if defined (HAVE_STDLIB_H)
@@ -44,9 +46,10 @@ char *
xmalloc (bytes)
int bytes;
{
- char *temp = (char *)malloc (bytes);
+ char *temp;
- if (!temp)
+ temp = (char *)malloc (bytes);
+ if (temp == 0)
memory_error_and_abort ("xmalloc");
return (temp);
}
@@ -58,12 +61,9 @@ xrealloc (pointer, bytes)
{
char *temp;
- if (!pointer)
- temp = (char *)malloc (bytes);
- else
- temp = (char *)realloc (pointer, bytes);
+ temp = pointer ? (char *)realloc (pointer, bytes) : (char *)malloc (bytes);
- if (!temp)
+ if (temp == 0)
memory_error_and_abort ("xrealloc");
return (temp);
}
@@ -72,7 +72,16 @@ static void
memory_error_and_abort (fname)
char *fname;
{
- fprintf (stderr, "%s: Out of virtual memory!\n", fname);
- abort ();
+ fprintf (stderr, "%s: out of virtual memory\n", fname);
+ exit (2);
+}
+
+/* Use this as the function to call when adding unwind protects so we
+ don't need to know what free() returns. */
+void
+xfree (string)
+ char *string;
+{
+ if (string)
+ free (string);
}
-#endif /* !ALREADY_HAVE_XMALLOC */