mirror of
https://github.com/vbatts/bvi.git
synced 2024-11-22 00:25:41 +00:00
bvi-1.3.0.src.tar.gz
This commit is contained in:
commit
0220b756fa
80 changed files with 17347 additions and 0 deletions
58
CHANGES
Normal file
58
CHANGES
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
New in release 1.3.0
|
||||||
|
====================
|
||||||
|
|
||||||
|
* a "bmore" program has been added
|
||||||
|
* --with-ncurses option to configure to specify an alternate
|
||||||
|
search path for Ncurses outside the normal include/lib search path.
|
||||||
|
* make uninstall option
|
||||||
|
* Reading of Block Special Files
|
||||||
|
* New Command line options:
|
||||||
|
+cmd
|
||||||
|
-b begin \
|
||||||
|
-e end > for partial file read
|
||||||
|
-s size /
|
||||||
|
* :e# bug fixed
|
||||||
|
* Debian bug #68436 (Buffer overflow in io.c) fixed
|
||||||
|
|
||||||
|
|
||||||
|
New in release 1.2.0
|
||||||
|
====================
|
||||||
|
|
||||||
|
* configuration with GNU autoconfig
|
||||||
|
* CR moves cursor to 1st column
|
||||||
|
* alphabet. order for :set all
|
||||||
|
* new settings:
|
||||||
|
set columns=n
|
||||||
|
set (no)memmove
|
||||||
|
* insert and delete (a, d, i, I, x, X)
|
||||||
|
* vi-syntax for y (yank), overwriting put o
|
||||||
|
* new colon (ex) commands:
|
||||||
|
:undo :delete :global
|
||||||
|
:yank :put :overwrite
|
||||||
|
:insert :change :append
|
||||||
|
* new option:
|
||||||
|
-f script
|
||||||
|
|
||||||
|
|
||||||
|
New in release 1.1.1
|
||||||
|
=====================
|
||||||
|
|
||||||
|
* .bvirc not read in some cases, fixed
|
||||||
|
* ":f newname" does not work, fixed
|
||||||
|
* distribution tar file with no directory, fixed
|
||||||
|
* freebsd and openbsd added to Makefile
|
||||||
|
* undo of D command fixed
|
||||||
|
|
||||||
|
|
||||||
|
New in release 1.1.0
|
||||||
|
=====================
|
||||||
|
|
||||||
|
* A lot of bugfixes
|
||||||
|
* New option ":set offset=n" for counting the addresses beginning
|
||||||
|
with n instead of 0
|
||||||
|
* New bit-wise commands :xor :and :or :not :neg :lshift :rshift
|
||||||
|
:rrotate :lrotate
|
||||||
|
* Byte addressing for colon commands, e.g. ":5,100w foo" writes
|
||||||
|
byte 5 through 100 to file foo
|
||||||
|
* Backwards hex search character % changed to #
|
||||||
|
* Filename substitution with %, e.g. ":w %.new"
|
339
COPYING
Normal file
339
COPYING
Normal file
|
@ -0,0 +1,339 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
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 the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) 19yy <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) 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.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
18
CREDITS
Normal file
18
CREDITS
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
Patches:
|
||||||
|
Guido <guido@bearix.oche.de> sys_errlist
|
||||||
|
Christian "naddy" Weisgerber <naddy@mips.rhein-neckar.de> {Free,Open}BSD
|
||||||
|
Gunnar Larisch <la@softing.com> ^ZZ bug
|
||||||
|
Peter J. Holzer <hjp@wsr.ac.at> setlocale
|
||||||
|
Albert Chin-A-Young <china@thewrittenword.com> Makefile.in
|
||||||
|
Ralf <rks@ffm.tc.iot.dtag.de> AIX fixes
|
||||||
|
Claudio Nieder <claudio@chili.symmetrix.ch> Makefile
|
||||||
|
|
||||||
|
Packages:
|
||||||
|
Christian "naddy" Weisgerber <naddy@mips.rhein-neckar.de> Source RPM
|
||||||
|
Christian Kurz <shorty@jupiter.rhein-neckar.de> Debian package
|
||||||
|
Stijn de Bekker <stijn@debekker.org> Debian package
|
||||||
|
Troy Engel <tengel@sonic.net> i386 RPM package
|
||||||
|
|
||||||
|
Doc:
|
||||||
|
Sven Guckes <guckes@math.fu-berlin.de>
|
||||||
|
Ben <info@leedsnet.com>
|
91
Makefile.in
Normal file
91
Makefile.in
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
# bvi - Binary Visual Editor Makefile
|
||||||
|
#
|
||||||
|
# This is the Makefile for bvi - binary visual editor. If it has the name
|
||||||
|
# "Makefile.in" then it is a template for a Makefile; to generate the actual
|
||||||
|
# Makefile, run "./configure", which is a configuration script generated by the
|
||||||
|
# "autoconf" program (constructs like "@foo@" will get replaced in the
|
||||||
|
# actual Makefile.
|
||||||
|
#
|
||||||
|
# Copyright (c) 1996-2000 by Gerhard Buergmann
|
||||||
|
# Gerhard.Buergmann@altavista.net
|
||||||
|
#
|
||||||
|
# 1996-01-18 V 1.0.0
|
||||||
|
# 1999-01-15 V 1.1.0
|
||||||
|
# 1999-03-03 V 1.1.1
|
||||||
|
# 1999-10-22 V 1.2.0
|
||||||
|
# 2000-05-31 V 1.3.0 beta
|
||||||
|
# 2000-10-01 V 1.3.0 final
|
||||||
|
#
|
||||||
|
###############################################
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
|
||||||
|
bindir = $(DESTDIR)@bindir@
|
||||||
|
mandir = $(DESTDIR)@mandir@
|
||||||
|
datadir = $(DESTDIR)@datadir@
|
||||||
|
|
||||||
|
man1dir = $(mandir)/man1
|
||||||
|
|
||||||
|
OBJS = bvi.o comm.o set.o re.o io.o edit.o recomp.o
|
||||||
|
HEADER = bvi.h set.h
|
||||||
|
BMOBJ = bmore.o bm_unix.o recomp.o
|
||||||
|
CC = @CC@
|
||||||
|
CFLAGS = @CFLAGS@ @CPPFLAGS@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
LDFLAGS= @LDFLAGS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
|
||||||
|
|
||||||
|
all: bvi bmore
|
||||||
|
|
||||||
|
bvi: $(OBJS)
|
||||||
|
$(CC) $(LDFLAGS) -o bvi $(OBJS) $(LIBS)
|
||||||
|
|
||||||
|
bmore: $(BMOBJ)
|
||||||
|
$(CC) $(LDFLAGS) -o bmore $(BMOBJ) $(LIBS)
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(CFLAGS) $(DEFS) -c $<
|
||||||
|
|
||||||
|
bmore.o: bmore.c
|
||||||
|
$(CC) $(CFLAGS) $(DEFS) -DHELPFILE=\"$(datadir)/bmore.help\" -c $<
|
||||||
|
|
||||||
|
|
||||||
|
install: all installdirs
|
||||||
|
@echo "Installing bvi"
|
||||||
|
@$(INSTALL_DATA) bvi.1 bmore.1 $(man1dir)
|
||||||
|
@$(INSTALL_PROGRAM) -s bvi $(bindir)
|
||||||
|
@$(INSTALL_PROGRAM) -s bmore $(bindir)
|
||||||
|
@$(INSTALL_DATA) bmore.help $(datadir)
|
||||||
|
@if [ -f $(bindir)/bview ]; then rm $(bindir)/bview; fi
|
||||||
|
@if [ -f $(bindir)/bvedit ]; then rm $(bindir)/bvedit; fi
|
||||||
|
@ln $(bindir)/bvi $(bindir)/bview
|
||||||
|
@ln $(bindir)/bvi $(bindir)/bvedit
|
||||||
|
|
||||||
|
installdirs:
|
||||||
|
$(SHELL) ${srcdir}/mkinstalldirs $(bindir) $(datadir) $(man1dir)
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
@echo "Uninstalling bvi"
|
||||||
|
@if [ -f $(bindir)/bview ]; then rm $(bindir)/bview; fi
|
||||||
|
@if [ -f $(bindir)/bvedit ]; then rm $(bindir)/bvedit; fi
|
||||||
|
@if [ -f $(bindir)/bvi ]; then rm $(bindir)/bvi; fi
|
||||||
|
@if [ -f $(bindir)/bmore ]; then rm $(bindir)/bmore; fi
|
||||||
|
@if [ -f $(datadir)/bmore.help ]; then rm $(datadir)/bmore.help; fi
|
||||||
|
@if [ -f $(man1dir)/bvi.1 ]; then rm $(man1dir)/bvi.1; fi
|
||||||
|
@if [ -f $(man1dir)/bmore.1 ]; then rm $(man1dir)/bmore.1; fi
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f core *.o bvi bmore a.out
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f Makefile config.cache config.h config.log config.status
|
35
README
Normal file
35
README
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
BVI - Binary visual editor
|
||||||
|
==========================
|
||||||
|
http://bvi.linuxave.net/
|
||||||
|
|
||||||
|
This editor for binary files was written by Gerhard Buergmann
|
||||||
|
and is distributed under the GPL (GNU Public License).
|
||||||
|
|
||||||
|
|
||||||
|
How to compile
|
||||||
|
==============
|
||||||
|
|
||||||
|
gunzip -c bvi-1.3.0.tar.gz | tar xvf -
|
||||||
|
cd bvi-1.3.0
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
HTML documentation in subdirectory html/
|
||||||
|
|
||||||
|
Subscribe to the bvi mailing for support, updates and other news:
|
||||||
|
|
||||||
|
Send a blank email to bvi-subscribe@eGroups.com. You will receive a
|
||||||
|
subscription confirmation message. Simply reply this message and your
|
||||||
|
subscription will be complete.
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
PLEASE send any bug reports (and fixes), code for new features,
|
||||||
|
comments, questions, etc. (even flames) to:
|
||||||
|
|
||||||
|
Gerhard Buergmann
|
||||||
|
Vienna, Austria
|
||||||
|
E-mail: Gerhard.Buergmann@altavista.net
|
||||||
|
|
||||||
|
|
7
acconfig.h
Normal file
7
acconfig.h
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/***** begin user configuration section *****/
|
||||||
|
|
||||||
|
#undef HAVE_NCURSES_H
|
||||||
|
|
||||||
|
#undef HAVE_CURSES_H
|
||||||
|
|
||||||
|
#undef NO_SYSERRL
|
BIN
bc/bmore/BMORE.PRJ
Normal file
BIN
bc/bmore/BMORE.PRJ
Normal file
Binary file not shown.
BIN
bc/bmore/BMORE.TCP
Normal file
BIN
bc/bmore/BMORE.TCP
Normal file
Binary file not shown.
BIN
bc/bmore/TCCONFIG.TC
Normal file
BIN
bc/bmore/TCCONFIG.TC
Normal file
Binary file not shown.
BIN
bc/bmore/TCDEF.DSK
Normal file
BIN
bc/bmore/TCDEF.DSK
Normal file
Binary file not shown.
BIN
bc/bvi/BVI.DSK
Normal file
BIN
bc/bvi/BVI.DSK
Normal file
Binary file not shown.
BIN
bc/bvi/BVI.PRJ
Normal file
BIN
bc/bvi/BVI.PRJ
Normal file
Binary file not shown.
BIN
bc/bvi/TCCONFIG.TC
Normal file
BIN
bc/bvi/TCCONFIG.TC
Normal file
Binary file not shown.
BIN
bc/bvi/TCPICK.TCP
Normal file
BIN
bc/bvi/TCPICK.TCP
Normal file
Binary file not shown.
126
bm_dos.c
Executable file
126
bm_dos.c
Executable file
|
@ -0,0 +1,126 @@
|
||||||
|
/* BM_DOS.C - DOS specific subroutines for BMORE
|
||||||
|
*
|
||||||
|
* 2000-05-10 V 1.3.0 alpha
|
||||||
|
* 2000-07-07 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define DEBUG 1
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bmore.h"
|
||||||
|
|
||||||
|
#define TBUFSIZ 1024
|
||||||
|
|
||||||
|
|
||||||
|
extern off_t bytepos, screen_home;
|
||||||
|
extern FILE *curr_file;
|
||||||
|
/*
|
||||||
|
extern int screenlines;
|
||||||
|
*/
|
||||||
|
|
||||||
|
int got_int;
|
||||||
|
int no_intty, no_tty;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
FILE *dbug;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
initterm()
|
||||||
|
{
|
||||||
|
maxx = 80;
|
||||||
|
maxy = 25;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
set_tty ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
reset_tty ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
sig()
|
||||||
|
{
|
||||||
|
signal(SIGINT, sig);
|
||||||
|
|
||||||
|
got_int = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* doshell() - run a command or an interactive shell
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
doshell(cmd)
|
||||||
|
char *cmd;
|
||||||
|
{
|
||||||
|
system(cmd);
|
||||||
|
printf("\r");
|
||||||
|
clrscr();
|
||||||
|
fseek(curr_file, screen_home, SEEK_SET);
|
||||||
|
bytepos = screen_home;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
home()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
tputs(Home, 1, putch);
|
||||||
|
|
||||||
|
screenlines = 0;
|
||||||
|
*/
|
||||||
|
gotoxy(1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
vgetc()
|
||||||
|
{
|
||||||
|
return ((char)bioskey(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* force clear to end of line
|
||||||
|
*/
|
||||||
|
cleareol()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
tputs(erase_ln, 1, putch);
|
||||||
|
*/
|
||||||
|
clreol();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
beep(void)
|
||||||
|
{
|
||||||
|
putchar(7);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
234
bm_unix.c
Normal file
234
bm_unix.c
Normal file
|
@ -0,0 +1,234 @@
|
||||||
|
/* BM_UNIX.C - Unix specific subroutines for BMORE
|
||||||
|
*
|
||||||
|
* 2000-05-31 V 1.3.0 beta
|
||||||
|
* 2000-10-12 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "bmore.h"
|
||||||
|
#include <termios.h>
|
||||||
|
|
||||||
|
#define TBUFSIZ 1024
|
||||||
|
|
||||||
|
#define stty(fd,argp) tcsetattr(fd,TCSAFLUSH,argp)
|
||||||
|
|
||||||
|
struct termios ostate, nstate;
|
||||||
|
|
||||||
|
|
||||||
|
char *rev_start, *rev_end;/* enter and exit standout mode */
|
||||||
|
char *Home; /* go to home */
|
||||||
|
char *clear_sc; /* clear screen */
|
||||||
|
char *erase_ln; /* erase line */
|
||||||
|
|
||||||
|
extern off_t bytepos, screen_home;
|
||||||
|
extern FILE *curr_file;
|
||||||
|
|
||||||
|
int got_int;
|
||||||
|
int fnum, no_intty, no_tty, slow_tty;
|
||||||
|
int dum_opt, dlines;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A real function, for the tputs routine
|
||||||
|
*/
|
||||||
|
#ifdef NEED_PUTC_CHAR
|
||||||
|
|
||||||
|
int
|
||||||
|
putchr(char ch)
|
||||||
|
{return putchar((int)ch);}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
int
|
||||||
|
putchr(ch)
|
||||||
|
int ch;
|
||||||
|
{return putchar(ch);}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
initterm()
|
||||||
|
{
|
||||||
|
char buf[TBUFSIZ];
|
||||||
|
static char clearbuf[TBUFSIZ];
|
||||||
|
char *term;
|
||||||
|
char *clearptr;
|
||||||
|
|
||||||
|
struct termios nstate;
|
||||||
|
|
||||||
|
no_tty = tcgetattr(fileno(stdout), &ostate);
|
||||||
|
nstate = ostate;
|
||||||
|
nstate.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHOK|ECHONL);
|
||||||
|
nstate.c_cc[VMIN] = 1;
|
||||||
|
nstate.c_cc[VTIME] = 0;
|
||||||
|
tcsetattr(fileno(stdin), TCSADRAIN, &nstate);
|
||||||
|
|
||||||
|
if ((term = getenv("TERM")) == 0 || tgetent(buf, term) <= 0) {
|
||||||
|
printf("Dumb terminal\n");
|
||||||
|
maxx = 80;
|
||||||
|
maxy = 24;
|
||||||
|
} else {
|
||||||
|
maxy = tgetnum("li");
|
||||||
|
maxx = tgetnum("co");
|
||||||
|
}
|
||||||
|
clearptr = clearbuf;
|
||||||
|
erase_ln = tgetstr("ce", &clearptr);
|
||||||
|
clear_sc = tgetstr("cl", &clearptr);
|
||||||
|
rev_start = tgetstr("so", &clearptr);
|
||||||
|
rev_end = tgetstr("se", &clearptr);
|
||||||
|
|
||||||
|
no_intty = tcgetattr(fileno(stdin), &ostate);
|
||||||
|
tcgetattr(fileno(stderr), &ostate);
|
||||||
|
|
||||||
|
nstate = ostate;
|
||||||
|
if (!no_tty)
|
||||||
|
ostate.c_lflag &= ~(ICANON|ECHO);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
set_tty()
|
||||||
|
{
|
||||||
|
ostate.c_lflag &= ~(ICANON|ECHO);
|
||||||
|
stty(fileno(stderr), &ostate);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
reset_tty()
|
||||||
|
{
|
||||||
|
if (no_tty) return;
|
||||||
|
ostate.c_lflag |= ICANON|ECHO;
|
||||||
|
stty(fileno(stderr), &ostate);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
sig()
|
||||||
|
{
|
||||||
|
signal(SIGINT, sig);
|
||||||
|
signal(SIGQUIT, sig);
|
||||||
|
|
||||||
|
got_int = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* doshell() - run a command or an interactive shell
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
doshell(cmd)
|
||||||
|
char *cmd;
|
||||||
|
{
|
||||||
|
char *getenv();
|
||||||
|
char cline[128];
|
||||||
|
|
||||||
|
/*
|
||||||
|
outstr("\r\n");
|
||||||
|
flushbuf();
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (cmd == NULL) {
|
||||||
|
if ((cmd = getenv("SHELL")) == NULL)
|
||||||
|
cmd = "/bin/sh";
|
||||||
|
sprintf(cline, "%s -i", cmd);
|
||||||
|
cmd = cline;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(cmd);
|
||||||
|
reset_tty();
|
||||||
|
|
||||||
|
system(cmd);
|
||||||
|
set_tty();
|
||||||
|
printf("\r");
|
||||||
|
home();
|
||||||
|
fseek(curr_file, screen_home, SEEK_SET);
|
||||||
|
bytepos = screen_home;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
highvideo()
|
||||||
|
{
|
||||||
|
if (rev_start && rev_end)
|
||||||
|
tputs(rev_start, 1, putchr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
normvideo()
|
||||||
|
{
|
||||||
|
if (rev_start && rev_end)
|
||||||
|
tputs(rev_end, 1, putchr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
clrscr()
|
||||||
|
{
|
||||||
|
tputs(clear_sc, 1, putchr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
home()
|
||||||
|
{
|
||||||
|
tputs(Home, 1, putchr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* force clear to end of line */
|
||||||
|
void
|
||||||
|
clreol()
|
||||||
|
{
|
||||||
|
tputs(erase_ln, 1, putchr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
vgetc()
|
||||||
|
{
|
||||||
|
char cha;
|
||||||
|
extern int errno;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
if (read(2, &cha, 1) <= 0) {
|
||||||
|
if (errno != EINTR)
|
||||||
|
exit(2);
|
||||||
|
}
|
||||||
|
return (cha);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef HAVE_MEMMOVE
|
||||||
|
/*
|
||||||
|
* Copy contents of memory (with possible overlapping).
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
memmove(s1, s2, n)
|
||||||
|
char *s1;
|
||||||
|
char *s2;
|
||||||
|
size_t n;
|
||||||
|
{
|
||||||
|
bcopy(s2, s1, n);
|
||||||
|
return(s1);
|
||||||
|
}
|
||||||
|
#endif
|
299
bmore.1
Normal file
299
bmore.1
Normal file
|
@ -0,0 +1,299 @@
|
||||||
|
.TH BMORE 1 "13 June 2000"
|
||||||
|
.SH NAME
|
||||||
|
bmore \- browse through a binary file
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B bmore
|
||||||
|
[
|
||||||
|
.B \-adi
|
||||||
|
] [
|
||||||
|
.B +\fIlinenumber\fP
|
||||||
|
] [
|
||||||
|
.B +/\fIASCII-pattern\fP
|
||||||
|
] [
|
||||||
|
.B +\\\\\fIHex-pattern\fP
|
||||||
|
] [
|
||||||
|
.I filename
|
||||||
|
\&.\|.\|. ]
|
||||||
|
.LP
|
||||||
|
.if n .ti +05i
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.IX "bmore command" "" "\fLbmore\fP \(em browse binary file"
|
||||||
|
.IX "binary file, browse through" \fLbmore\fP
|
||||||
|
.IX file "browse bmore" "" "browse through binary\(em \fLbmore\fP"
|
||||||
|
.IX display "file by screenfuls \(em \fLbmore\fP"
|
||||||
|
.LP
|
||||||
|
.B more
|
||||||
|
is a filter that displays the contents of a binary
|
||||||
|
file
|
||||||
|
on the terminal, one screenful at a time. It normally pauses after
|
||||||
|
each screenful, and prints
|
||||||
|
.B --More--
|
||||||
|
at the bottom of the screen.
|
||||||
|
.B bmore
|
||||||
|
provides a two-line overlap between screens for continuity.
|
||||||
|
If
|
||||||
|
.B bmore
|
||||||
|
is reading from a file rather than a pipe, the percentage of
|
||||||
|
characters displayed so far is also shown.
|
||||||
|
.LP
|
||||||
|
.B bmore
|
||||||
|
scrolls up to display one more screen line in response to a
|
||||||
|
.SM RETURN
|
||||||
|
character; it displays another screenful in response to a
|
||||||
|
.SM SPACE
|
||||||
|
character. Other commands are listed below.
|
||||||
|
.LP
|
||||||
|
The screen is divided in three sections or panes:
|
||||||
|
The byte offset (extreme left), the hex pane (middle),
|
||||||
|
and an ascii pane (right) which shows as printable characters
|
||||||
|
those bytes in the hex pane.
|
||||||
|
On an 80 column terminal there will be sixteen hex values
|
||||||
|
and their ASCII values on each screen line.
|
||||||
|
Note that (as one would expect) the first byte has the offset \*(L'0\*(R' (zero).
|
||||||
|
.LP
|
||||||
|
.B bmore
|
||||||
|
sets the terminal
|
||||||
|
to
|
||||||
|
.I noecho
|
||||||
|
mode, so that the output can be continuous.
|
||||||
|
Commands that you type do not normally show up on your terminal,
|
||||||
|
except for the
|
||||||
|
.B /
|
||||||
|
,
|
||||||
|
.B \\\\
|
||||||
|
and
|
||||||
|
.B !
|
||||||
|
commands.
|
||||||
|
.LP
|
||||||
|
If the standard output is not a terminal,
|
||||||
|
.B more
|
||||||
|
acts just like
|
||||||
|
.BR cat (1V),
|
||||||
|
except that a header is printed before each file in a series.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.B \-a
|
||||||
|
ASCII mode: no hex representation of the contents. Non printable
|
||||||
|
characters are displayed as a dot (.)
|
||||||
|
.TP
|
||||||
|
.B \-d
|
||||||
|
Display error messages rather than ringing the terminal bell if
|
||||||
|
an unrecognized command is used.
|
||||||
|
This is helpful for inexperienced users.
|
||||||
|
.TP
|
||||||
|
.B \-i
|
||||||
|
Ignore case for searching.
|
||||||
|
.TP
|
||||||
|
.BI + linenumber\fP
|
||||||
|
Start up at
|
||||||
|
.IR linenumber .
|
||||||
|
.TP
|
||||||
|
.BI +/ ASCII-pattern\fP
|
||||||
|
Start up at the line containing the regular expression
|
||||||
|
.IR pattern .
|
||||||
|
Note: unlike
|
||||||
|
editors, this construct should
|
||||||
|
.I not
|
||||||
|
end with a
|
||||||
|
.RB ` / '.
|
||||||
|
If it does, then the trailing slash is taken as a character in the
|
||||||
|
search pattern.
|
||||||
|
.TP
|
||||||
|
.br
|
||||||
|
.ne 8
|
||||||
|
.SH USAGE
|
||||||
|
.SS Commands
|
||||||
|
.LP
|
||||||
|
The commands take effect immediately; it is not necessary to
|
||||||
|
type a carriage return.
|
||||||
|
Up to the time when the command character itself is given,
|
||||||
|
the user may type the line kill character to cancel the numerical
|
||||||
|
argument being formed.
|
||||||
|
In addition, the user may type the erase character to redisplay the
|
||||||
|
.RB ` "--More--(\fIxx\fP%)" '
|
||||||
|
message.
|
||||||
|
.LP
|
||||||
|
In the following commands,
|
||||||
|
.I i
|
||||||
|
is a numerical argument
|
||||||
|
.RB ( 1
|
||||||
|
by default).
|
||||||
|
.TP 10
|
||||||
|
.IR i \s-1SPACE\s0
|
||||||
|
Display another screenful, or
|
||||||
|
.I i
|
||||||
|
more lines if
|
||||||
|
.I i
|
||||||
|
is specified.
|
||||||
|
.TP
|
||||||
|
.IR i \s-1RETURN\s0
|
||||||
|
Display another line, or
|
||||||
|
.I i
|
||||||
|
more lines, if specified.
|
||||||
|
.TP
|
||||||
|
.IB i ^D
|
||||||
|
(\s-1CTRL\s0\-D)
|
||||||
|
Display (scroll down) 11 more lines.
|
||||||
|
.I i
|
||||||
|
is given, the scroll size is set to
|
||||||
|
.IR i\| .
|
||||||
|
.TP
|
||||||
|
.IR i d
|
||||||
|
Same as
|
||||||
|
.BR ^D .
|
||||||
|
.TP
|
||||||
|
.IB i z
|
||||||
|
Same as
|
||||||
|
.SM SPACE,
|
||||||
|
except that
|
||||||
|
.IR i\| ,
|
||||||
|
if present, becomes the new default number
|
||||||
|
of lines per screenful.
|
||||||
|
.TP
|
||||||
|
.IB i s
|
||||||
|
Skip
|
||||||
|
.I i\|
|
||||||
|
lines and then print a screenful.
|
||||||
|
.TP
|
||||||
|
.IB i f
|
||||||
|
Skip
|
||||||
|
.I i
|
||||||
|
screenfuls and then print a screenful.
|
||||||
|
.TP
|
||||||
|
.IB i ^B
|
||||||
|
(\s-1CTRL-B\s0)
|
||||||
|
Skip back
|
||||||
|
.I i
|
||||||
|
screenfuls and then print a screenful.
|
||||||
|
.TP
|
||||||
|
.I b
|
||||||
|
Same as
|
||||||
|
.B ^B
|
||||||
|
(\s-1CTRL-D\s0).
|
||||||
|
.TP
|
||||||
|
.B q
|
||||||
|
.PD 0
|
||||||
|
.TP
|
||||||
|
.B Q
|
||||||
|
.PD
|
||||||
|
Exit from
|
||||||
|
.BR more .
|
||||||
|
.TP
|
||||||
|
.B =
|
||||||
|
Display the current line number.
|
||||||
|
.TP
|
||||||
|
.B v
|
||||||
|
Drop into the
|
||||||
|
.BR bvi (1)
|
||||||
|
editor at the current offset of the current
|
||||||
|
file.
|
||||||
|
.TP
|
||||||
|
.B w
|
||||||
|
Drop into the
|
||||||
|
.BR bvi (1)
|
||||||
|
editor at the current offset of the current
|
||||||
|
file. Only the portion of the file displayed on the screen will be loaded.
|
||||||
|
.TP
|
||||||
|
.B h
|
||||||
|
Help. Give a description of all the
|
||||||
|
.B more
|
||||||
|
commands.
|
||||||
|
.TP
|
||||||
|
.IB i / pattern
|
||||||
|
Search for the
|
||||||
|
.IR i\| th
|
||||||
|
occurrence of the regular expression
|
||||||
|
.IR pattern .
|
||||||
|
Display the screenful starting at the file position
|
||||||
|
that contains the
|
||||||
|
.IR i\| th
|
||||||
|
match for the regular expression
|
||||||
|
.IR ASCII-pattern ,
|
||||||
|
or the end of a pipe, whichever comes first. If
|
||||||
|
.B bmore
|
||||||
|
is displaying a file and there is no such match, its position
|
||||||
|
in the file remains unchanged. Regular expressions can be
|
||||||
|
edited using erase and kill characters.
|
||||||
|
Erasing back past the first column cancels the search command.
|
||||||
|
.TP
|
||||||
|
.B \'
|
||||||
|
Single quote. Go to the point from which the last search started.
|
||||||
|
If no search has been performed in the current file,
|
||||||
|
go to the beginning of the file.
|
||||||
|
.TP
|
||||||
|
.BI ! command
|
||||||
|
Invoke a shell to execute
|
||||||
|
.IR command\| .
|
||||||
|
The characters
|
||||||
|
.B %
|
||||||
|
and
|
||||||
|
.BR ! ,
|
||||||
|
when used within
|
||||||
|
.I command
|
||||||
|
are replaced with the current filename
|
||||||
|
and the previous shell command,
|
||||||
|
respectively.
|
||||||
|
If there is no current filename,
|
||||||
|
.B %
|
||||||
|
is not expanded. Prepend a backslash to these characters to
|
||||||
|
escape expansion.
|
||||||
|
.TP
|
||||||
|
.IB i :n
|
||||||
|
Skip to the
|
||||||
|
.IR i\| th
|
||||||
|
next filename given in the command line,
|
||||||
|
or to the last filename in the list if
|
||||||
|
.I i
|
||||||
|
is out of range.
|
||||||
|
.TP
|
||||||
|
.IB i :p
|
||||||
|
Skip to the
|
||||||
|
.IR i\| th
|
||||||
|
previous filename given in the command line,
|
||||||
|
or to the first filename if
|
||||||
|
.I i
|
||||||
|
is out of range.
|
||||||
|
If given while
|
||||||
|
.B more
|
||||||
|
is positioned within a file, go to the
|
||||||
|
beginning of the file.
|
||||||
|
If
|
||||||
|
.B more
|
||||||
|
is reading from a pipe,
|
||||||
|
.B more
|
||||||
|
simply rings the terminal bell.
|
||||||
|
.br
|
||||||
|
.ne 2
|
||||||
|
.TP
|
||||||
|
.B :f
|
||||||
|
Display the current filename and offset number.
|
||||||
|
.br
|
||||||
|
.ne 5
|
||||||
|
.TP
|
||||||
|
.B :q
|
||||||
|
.PD 0
|
||||||
|
.TP
|
||||||
|
.B :Q
|
||||||
|
.PD
|
||||||
|
Exit from
|
||||||
|
.B bmore
|
||||||
|
(same as
|
||||||
|
.B q
|
||||||
|
or
|
||||||
|
.B Q ).
|
||||||
|
.TP
|
||||||
|
.B \&.
|
||||||
|
Dot. Repeat the previous command.
|
||||||
|
.TP
|
||||||
|
.SH FILES
|
||||||
|
.PD 0
|
||||||
|
.TP 20
|
||||||
|
.B /etc/termcap
|
||||||
|
terminal data base
|
||||||
|
.TP
|
||||||
|
.B /usr/local/share/bmore.help
|
||||||
|
help file
|
||||||
|
.PD
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR bvi (1),
|
||||||
|
.BR termcap (5)
|
827
bmore.c
Normal file
827
bmore.c
Normal file
|
@ -0,0 +1,827 @@
|
||||||
|
/* BMORE - binary more
|
||||||
|
*
|
||||||
|
* 1990-01-31 V 1.0.0
|
||||||
|
* 1990-09-04 V 1.1.0
|
||||||
|
* 2000-05-31 V 1.3.0 beta
|
||||||
|
* 2000-10-18 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* Copyright 1990-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_LOCALE_H
|
||||||
|
# include <locale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __MSDOS__
|
||||||
|
# define PRINTF cprintf
|
||||||
|
#else
|
||||||
|
# define PRINTF printf
|
||||||
|
#ifndef HELPFILE
|
||||||
|
# define HELPFILE "/usr/local/lib/bmore.help"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "bmore.h"
|
||||||
|
|
||||||
|
char *copyright = "Copyright (C) 1990-2000 by Gerhard Buergmann";
|
||||||
|
|
||||||
|
int maxx, maxy;
|
||||||
|
char *name = NULL;
|
||||||
|
char sstring[MAXCMD] = "";
|
||||||
|
char string[MAXCMD];
|
||||||
|
FILE *curr_file = NULL, *help_file;
|
||||||
|
int AnzAdd;
|
||||||
|
long precount = -1; /* number preceding command */
|
||||||
|
|
||||||
|
char **files; /* list of input files */
|
||||||
|
int numfiles; /* number of input files */
|
||||||
|
int file_nr = 0; /* number of current input file */
|
||||||
|
|
||||||
|
int arrnum = 0;
|
||||||
|
char numarr[64]; /* string for collecting number */
|
||||||
|
char addr_form[15];
|
||||||
|
|
||||||
|
int ascii_flag = 0;
|
||||||
|
int d_flag = 0;
|
||||||
|
int init_search = 0;
|
||||||
|
char buffer1[MAXCMD], buffer2[MAXCMD];
|
||||||
|
int out_len;
|
||||||
|
int corr = 0, to_print;
|
||||||
|
off_t init_byte = 0;
|
||||||
|
off_t last_search = 0;
|
||||||
|
off_t screen_home, filesize;
|
||||||
|
off_t bytepos, oldpos;
|
||||||
|
int prompt = 1;
|
||||||
|
char helppath[MAXCMD];
|
||||||
|
|
||||||
|
static char *progname;
|
||||||
|
static char cmdbuf[MAXCMD];
|
||||||
|
static int cnt = 0;
|
||||||
|
static int icnt = 0;
|
||||||
|
static int smode;
|
||||||
|
|
||||||
|
char search_pat[BUFFER]; /* / or ? command */
|
||||||
|
char *emptyclass = "Empty byte class '[]' or '[^]'";
|
||||||
|
|
||||||
|
|
||||||
|
/* -a ASCII mode
|
||||||
|
* -d beginners mode
|
||||||
|
* -i ignore case
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
usage()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage: %s [-adi] [+linenum | +/pattern] name1 name2 ...\n", progname);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{
|
||||||
|
int ch, ch1;
|
||||||
|
int colon = 0, last_ch = 0;
|
||||||
|
long last_pre = 0;
|
||||||
|
int lflag, repeat;
|
||||||
|
long count;
|
||||||
|
int i, n = 1;
|
||||||
|
int d_line, r_line, z_line;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __MSDOS__
|
||||||
|
char *poi;
|
||||||
|
|
||||||
|
strcpy(helppath, argv[0]);
|
||||||
|
poi = strrchr(helppath, '\\');
|
||||||
|
*poi = '\0';
|
||||||
|
strcat(helppath, "\\MORE.HLP");
|
||||||
|
#else
|
||||||
|
strncpy(helppath, HELPFILE, MAXCMD - 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_LOCALE_H
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
|
||||||
|
while (n < argc) {
|
||||||
|
switch (argv[n][0]) {
|
||||||
|
case '-':
|
||||||
|
i = 1;
|
||||||
|
while (argv[n][i] != '\0') {
|
||||||
|
switch (argv[n][i]) {
|
||||||
|
case 'a': ascii_flag++;
|
||||||
|
break;
|
||||||
|
case 'd': d_flag++;
|
||||||
|
break;
|
||||||
|
case 'i': ignore_case++;
|
||||||
|
break;
|
||||||
|
default: usage();
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
n++;
|
||||||
|
break;
|
||||||
|
case '+': /* +cmd */
|
||||||
|
if (argv[n][1] == '/' || argv[n][1] == '\\') {
|
||||||
|
init_search = argv[n][1];
|
||||||
|
strcpy(sstring, &argv[n][2]);
|
||||||
|
} else {
|
||||||
|
if (argv[n][1] == '0') {
|
||||||
|
init_byte = (off_t)strtol(argv[n] + 1, NULL, 16);
|
||||||
|
} else {
|
||||||
|
init_byte = (off_t)strtol(argv[n] + 1, NULL, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
n++;
|
||||||
|
break;
|
||||||
|
default: /* must be a file name */
|
||||||
|
name = strdup(argv[n]);
|
||||||
|
files = &(argv[n]);
|
||||||
|
numfiles = argc - n;
|
||||||
|
n = argc;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (numfiles == 0) {
|
||||||
|
curr_file = stdin;
|
||||||
|
if (isatty(fileno(stdin)) != 0) usage();
|
||||||
|
} else {
|
||||||
|
open_file(name);
|
||||||
|
file_nr = 1;
|
||||||
|
fseek(curr_file, init_byte, SEEK_SET);
|
||||||
|
bytepos += init_byte;
|
||||||
|
}
|
||||||
|
screen_home = bytepos;
|
||||||
|
|
||||||
|
initterm();
|
||||||
|
set_tty();
|
||||||
|
maxy -= 2;
|
||||||
|
z_line = maxy;
|
||||||
|
d_line = maxy / 2;
|
||||||
|
r_line = 1;
|
||||||
|
|
||||||
|
AnzAdd = 10;
|
||||||
|
strcpy(addr_form, "%08lX ");
|
||||||
|
|
||||||
|
if (ascii_flag)
|
||||||
|
out_len = ((maxx - AnzAdd - 1) / 4) * 4;
|
||||||
|
else
|
||||||
|
out_len = ((maxx - AnzAdd - 1) / 16) * 4;
|
||||||
|
|
||||||
|
if (init_search)
|
||||||
|
bmsearch(init_search);
|
||||||
|
|
||||||
|
if (no_tty) {
|
||||||
|
while(!printout(1));
|
||||||
|
reset_tty();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if (printout(maxy)) {
|
||||||
|
do_next(1);
|
||||||
|
}
|
||||||
|
/* main loop */
|
||||||
|
do {
|
||||||
|
to_print = 0;
|
||||||
|
if (prompt) {
|
||||||
|
highvideo();
|
||||||
|
PRINTF("--More--");
|
||||||
|
if (prompt == 2) {
|
||||||
|
PRINTF("(Next file: %s)", name);
|
||||||
|
} else if (!no_intty && filesize) {
|
||||||
|
PRINTF("(%d%%)", (int)((bytepos * 100) / filesize));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d_flag) PRINTF("[Press space to continue, 'q' to quit]");
|
||||||
|
normvideo();
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
ch = vgetc();
|
||||||
|
if (prompt == 2) {
|
||||||
|
open_file(name);
|
||||||
|
}
|
||||||
|
prompt = 1;
|
||||||
|
PRINTF("\r");
|
||||||
|
while (ch >= '0' && ch <= '9') {
|
||||||
|
numarr[arrnum++] = ch;
|
||||||
|
ch = vgetc();
|
||||||
|
}
|
||||||
|
numarr[arrnum] = '\0';
|
||||||
|
if (arrnum != 0) precount = strtol(numarr, (char **)NULL, 10);
|
||||||
|
else precount = -1;
|
||||||
|
lflag = arrnum = 0;
|
||||||
|
|
||||||
|
if (ch == '.') {
|
||||||
|
precount = last_pre;
|
||||||
|
ch = last_ch;
|
||||||
|
repeat = 1;
|
||||||
|
} else {
|
||||||
|
last_pre = precount;
|
||||||
|
last_ch = ch;
|
||||||
|
if (ch == ':') colon = vgetc();
|
||||||
|
repeat = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ch) {
|
||||||
|
case ' ': /* Display next k lines of text [current screen size] */
|
||||||
|
if (precount > 0) to_print = precount;
|
||||||
|
else to_print = maxy;
|
||||||
|
break;
|
||||||
|
case 'z': /* Display next k lines of bytes [current screen size]* */
|
||||||
|
if (precount > 0) z_line = precount;
|
||||||
|
to_print = z_line;
|
||||||
|
break;
|
||||||
|
case '\r':
|
||||||
|
case '\n': /* Display next k lines of text [current screen size]* */
|
||||||
|
if (precount > 0) r_line = precount;
|
||||||
|
to_print = r_line;
|
||||||
|
break;
|
||||||
|
case 'q':
|
||||||
|
case 'Q':
|
||||||
|
clreol();
|
||||||
|
reset_tty();
|
||||||
|
exit(0);
|
||||||
|
case ':' :
|
||||||
|
switch (colon) {
|
||||||
|
case 'f':
|
||||||
|
prompt = 0;
|
||||||
|
if (!no_intty)
|
||||||
|
PRINTF("\"%s\" line %lu", name,
|
||||||
|
(unsigned long)(bytepos - out_len));
|
||||||
|
else
|
||||||
|
PRINTF("[Not a file] line %lu",
|
||||||
|
(unsigned long)(bytepos - out_len));
|
||||||
|
fflush(stdout);
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
if (precount < 1) precount = 1;
|
||||||
|
do_next(precount);
|
||||||
|
PRINTF("\r");
|
||||||
|
clreol();
|
||||||
|
PRINTF("\n...Skipping to file %s\r\n\r\n", name);
|
||||||
|
prompt = 2;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
if (precount < 1) precount = 1;
|
||||||
|
do_next(-precount);
|
||||||
|
PRINTF("\r");
|
||||||
|
clreol();
|
||||||
|
PRINTF("\n...Skipping back to file %s\r\n\r\n", name);
|
||||||
|
prompt = 2;
|
||||||
|
break;
|
||||||
|
case 'q':
|
||||||
|
clreol();
|
||||||
|
reset_tty();
|
||||||
|
exit(0);
|
||||||
|
break;
|
||||||
|
case '!':
|
||||||
|
if (!no_intty) {
|
||||||
|
clreol();
|
||||||
|
if (rdline(ch)) break;
|
||||||
|
doshell(sstring);
|
||||||
|
PRINTF("------------------------\r\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
beep();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'd': /* Scroll k lines [current scroll size, initially 11]* */
|
||||||
|
case CTRL('D'):
|
||||||
|
if (precount > 0) d_line = precount;
|
||||||
|
to_print = d_line;
|
||||||
|
break;
|
||||||
|
case CTRL('L'): /*** REDRAW SCREEN ***/
|
||||||
|
if (no_intty) {
|
||||||
|
beep();
|
||||||
|
} else {
|
||||||
|
clrscr();
|
||||||
|
to_print = maxy + 1;
|
||||||
|
fseek(curr_file, screen_home, SEEK_SET);
|
||||||
|
bytepos = screen_home;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'b': /* Skip backwards k screenfuls of text [1] */
|
||||||
|
case CTRL('B'):
|
||||||
|
if (no_intty) {
|
||||||
|
beep();
|
||||||
|
} else {
|
||||||
|
if (precount < 1) precount = 1;
|
||||||
|
PRINTF("...back %ld page", precount);
|
||||||
|
if (precount > 1) {
|
||||||
|
PRINTF("s\r\n");
|
||||||
|
} else {
|
||||||
|
PRINTF("\r\n");
|
||||||
|
}
|
||||||
|
screen_home -= (maxy + 1) * out_len;
|
||||||
|
if (screen_home < 0) screen_home = 0;
|
||||||
|
fseek(curr_file, screen_home, SEEK_SET);
|
||||||
|
bytepos = screen_home;
|
||||||
|
to_print = maxy + 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'f': /* Skip forward k screenfuls of bytes [1] */
|
||||||
|
case 's': /* Skip forward k lines of bytes [1] */
|
||||||
|
if (precount < 1) precount = 1;
|
||||||
|
if (ch == 'f') {
|
||||||
|
count = maxy * precount;
|
||||||
|
} else {
|
||||||
|
count = precount;
|
||||||
|
}
|
||||||
|
putchar('\r');
|
||||||
|
clreol();
|
||||||
|
PRINTF("\n...skipping %ld line", count);
|
||||||
|
if (count > 1) {
|
||||||
|
PRINTF("s\r\n\r\n");
|
||||||
|
} else {
|
||||||
|
PRINTF("\r\n\r\n");
|
||||||
|
}
|
||||||
|
screen_home += (count + maxy) * out_len;
|
||||||
|
fseek(curr_file, screen_home, SEEK_SET);
|
||||||
|
bytepos = screen_home;
|
||||||
|
to_print = maxy;
|
||||||
|
break;
|
||||||
|
case '\\':
|
||||||
|
if (ascii_flag) {
|
||||||
|
beep();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case '/': /**** Search String ****/
|
||||||
|
if (!repeat) {
|
||||||
|
if (rdline(ch)) break;
|
||||||
|
}
|
||||||
|
case 'n': /**** Search Next ****/
|
||||||
|
case 'N':
|
||||||
|
bmsearch(ch);
|
||||||
|
/*
|
||||||
|
to_print--;
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
case '\'':
|
||||||
|
if (no_intty) {
|
||||||
|
beep();
|
||||||
|
} else {
|
||||||
|
bytepos = last_search;
|
||||||
|
fseek(curr_file, bytepos, SEEK_SET);
|
||||||
|
screen_home = bytepos;
|
||||||
|
to_print = maxy;
|
||||||
|
PRINTF("\r");
|
||||||
|
clreol();
|
||||||
|
PRINTF("\n\r\n***Back***\r\n\r\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '=':
|
||||||
|
prompt = 0;
|
||||||
|
clreol();
|
||||||
|
PRINTF("%lX hex %lu dec", (unsigned long)bytepos,
|
||||||
|
(unsigned long)bytepos);
|
||||||
|
fflush(stdout);
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
case 'h':
|
||||||
|
if ((help_file = fopen(helppath, "r")) == NULL) {
|
||||||
|
emsg("Can't open help file");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
while ((ch1 = getc(help_file)) != EOF)
|
||||||
|
putchar(ch1);
|
||||||
|
fclose(help_file);
|
||||||
|
to_print = 0;
|
||||||
|
break;
|
||||||
|
case 'w':
|
||||||
|
case 'v':
|
||||||
|
if (!no_intty) {
|
||||||
|
clreol();
|
||||||
|
if (ch == 'v') {
|
||||||
|
sprintf(string, "bvi +%lu %s",
|
||||||
|
(unsigned long)(screen_home +
|
||||||
|
(maxy + 1) / 2 * out_len), name);
|
||||||
|
} else {
|
||||||
|
if (precount < 1) precount = bytepos - screen_home;
|
||||||
|
sprintf(string, "bvi -b %lu -s %lu %s",
|
||||||
|
(unsigned long)screen_home,
|
||||||
|
(unsigned long)precount, name);
|
||||||
|
}
|
||||||
|
doshell(string);
|
||||||
|
to_print = maxy + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default :
|
||||||
|
if (d_flag) {
|
||||||
|
emsg("[Press 'h' for instructions.]");
|
||||||
|
} else {
|
||||||
|
beep();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (to_print) {
|
||||||
|
if (printout(to_print)) {
|
||||||
|
do_next(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
rdline(ch)
|
||||||
|
int ch;
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
int ch1 = 0;
|
||||||
|
|
||||||
|
clreol();
|
||||||
|
putchar(ch);
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
while (i < MAXCMD) {
|
||||||
|
ch1 = vgetc();
|
||||||
|
if (ch1 == '\n' || ch1 == '\r' || ch1 == ESC) {
|
||||||
|
break;
|
||||||
|
} else if (ch1 == 8) {
|
||||||
|
if (i) {
|
||||||
|
sstring[--i] = '\0';
|
||||||
|
PRINTF("\r%c%s", ch, sstring);
|
||||||
|
clreol();
|
||||||
|
} else {
|
||||||
|
ch1 = ESC;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
putchar(ch1);
|
||||||
|
sstring[i++] = ch1;
|
||||||
|
}
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
if (ch1 == ESC) {
|
||||||
|
putchar('\r');
|
||||||
|
clreol();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (i) sstring[i] = '\0';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
do_next(n)
|
||||||
|
int n;
|
||||||
|
{
|
||||||
|
if (numfiles) {
|
||||||
|
if (n == 1 && file_nr == numfiles) {
|
||||||
|
reset_tty();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if ((file_nr + n) > numfiles)
|
||||||
|
file_nr = numfiles;
|
||||||
|
else if ((file_nr + n) < 1)
|
||||||
|
file_nr = 1;
|
||||||
|
else
|
||||||
|
file_nr += n;
|
||||||
|
prompt = 2;
|
||||||
|
free(name);
|
||||||
|
name = strdup(*(files + file_nr - 1));
|
||||||
|
} else {
|
||||||
|
reset_tty();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
open_file(name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
|
||||||
|
if (stat(name, &buf) > -1) {
|
||||||
|
filesize = buf.st_size;
|
||||||
|
}
|
||||||
|
if (numfiles > 1) {
|
||||||
|
PRINTF("\r");
|
||||||
|
clreol();
|
||||||
|
PRINTF("\n::::::::::::::\r\n%s\r\n::::::::::::::\r\n", name);
|
||||||
|
corr = 2;
|
||||||
|
}
|
||||||
|
if (curr_file != NULL) fclose(curr_file);
|
||||||
|
if ((curr_file = fopen(name, "rb")) == NULL) {
|
||||||
|
reset_tty();
|
||||||
|
perror(name);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
bytepos = screen_home = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
putline(buf, num)
|
||||||
|
char *buf;
|
||||||
|
int num;
|
||||||
|
{
|
||||||
|
int print_pos;
|
||||||
|
unsigned char ch;
|
||||||
|
|
||||||
|
PRINTF(addr_form, bytepos);
|
||||||
|
for (print_pos = 0; print_pos < num; print_pos++) {
|
||||||
|
ch = buf[print_pos];
|
||||||
|
if (!ascii_flag) {
|
||||||
|
PRINTF("%02X ", ch);
|
||||||
|
}
|
||||||
|
++bytepos;
|
||||||
|
if ((ch > 31) && (ch < 127))
|
||||||
|
*(string + print_pos) = ch;
|
||||||
|
else
|
||||||
|
*(string + print_pos) = '.';
|
||||||
|
}
|
||||||
|
*(string + num) = '\0';
|
||||||
|
PRINTF("%s\r\n", string);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
printout(lns)
|
||||||
|
int lns;
|
||||||
|
{
|
||||||
|
int c, num;
|
||||||
|
int doub = 0;
|
||||||
|
static int flag;
|
||||||
|
|
||||||
|
if (corr && (lns > maxy - 2)) lns -= corr;
|
||||||
|
corr = 0;
|
||||||
|
do {
|
||||||
|
for (num = 0; num < out_len; num++) {
|
||||||
|
if ((c = nextchar()) == -1) break;
|
||||||
|
buffer1[num] = c;
|
||||||
|
}
|
||||||
|
if (!num) return 1;
|
||||||
|
if (memcmp(buffer1, buffer2, num) || !bytepos ) {
|
||||||
|
memcpy(buffer2, buffer1, num);
|
||||||
|
putline(buffer2, num);
|
||||||
|
if (!no_tty) flag = TRUE;
|
||||||
|
lns--;
|
||||||
|
} else {
|
||||||
|
if (flag) {
|
||||||
|
clreol();
|
||||||
|
PRINTF("*\r\n");
|
||||||
|
lns--;
|
||||||
|
} else {
|
||||||
|
doub++;
|
||||||
|
}
|
||||||
|
flag = FALSE;
|
||||||
|
bytepos += num;
|
||||||
|
}
|
||||||
|
if (lns == 0) {
|
||||||
|
screen_home = bytepos - ((maxy + 1 + doub) * out_len);
|
||||||
|
if (screen_home < 0) screen_home = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} while(num);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
nextchar()
|
||||||
|
{
|
||||||
|
if (cnt == 0) return fgetc(curr_file);
|
||||||
|
cnt--;
|
||||||
|
return cmdbuf[icnt++] & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
pushback(n, where)
|
||||||
|
int n;
|
||||||
|
char *where;
|
||||||
|
{
|
||||||
|
if (cnt) memmove(cmdbuf + n, cmdbuf, n);
|
||||||
|
memcpy(cmdbuf, where, n);
|
||||||
|
icnt = 0;
|
||||||
|
cnt += n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Return:
|
||||||
|
* -1 EOF
|
||||||
|
* 0 not found at current position
|
||||||
|
* 1 found
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
bmregexec(scan)
|
||||||
|
char *scan;
|
||||||
|
{
|
||||||
|
char *act;
|
||||||
|
int count, test;
|
||||||
|
int l;
|
||||||
|
char act_pat[MAXCMD]; /* found pattern */
|
||||||
|
|
||||||
|
act = act_pat;
|
||||||
|
l = 0;
|
||||||
|
while (*scan != 0) {
|
||||||
|
if ((test = nextchar()) == -1) return -1;
|
||||||
|
*act++ = test;
|
||||||
|
if (++l == MAXCMD) {
|
||||||
|
pushback(l, act_pat);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (ignore_case && smode == ASCII) test = toupper(test);
|
||||||
|
switch (*scan++) {
|
||||||
|
case ONE: /* exactly one character */
|
||||||
|
count = *scan++;
|
||||||
|
if (count == 1) {
|
||||||
|
if (test != *scan) {
|
||||||
|
bytepos++;
|
||||||
|
if (l > 1) pushback(--l, act_pat + 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
scan++;
|
||||||
|
} else if (count > 1) {
|
||||||
|
if (sbracket(test, scan, count)) {
|
||||||
|
bytepos++;
|
||||||
|
if (l > 1) pushback(--l, act_pat + 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
scan += count;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STAR: /* zero or more characters */
|
||||||
|
count = *scan++;
|
||||||
|
if (count == 1) { /* only one character, 0 - n times */
|
||||||
|
while (test == *scan) {
|
||||||
|
if ((test = nextchar()) == -1) return -2;
|
||||||
|
*act++ = test;
|
||||||
|
if (++l == MAXCMD) {
|
||||||
|
pushback(l, act_pat);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (ignore_case && smode == ASCII)
|
||||||
|
test = toupper(test);
|
||||||
|
}
|
||||||
|
pushback(1, --act);
|
||||||
|
l--;
|
||||||
|
scan++;
|
||||||
|
} else if (count > 1) { /* characters in bracket */
|
||||||
|
if (*scan == '^') {
|
||||||
|
do {
|
||||||
|
/* If we found something matching the next part of the expression, we
|
||||||
|
* abandon the search for not-matching characters. */
|
||||||
|
if (bmregexec(scan + count)) {
|
||||||
|
*act++ = test; /* May be wrong case !! */
|
||||||
|
l++;
|
||||||
|
scan += count;
|
||||||
|
bytepos--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sbracket(test, scan, count)) {
|
||||||
|
bytepos++;
|
||||||
|
if (l > 1) pushback(--l, act_pat + 1);
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
if ((test = nextchar()) == -1) return -3;
|
||||||
|
*act++ = test;
|
||||||
|
if (++l == MAXCMD) {
|
||||||
|
pushback(l, act_pat);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (ignore_case && smode == ASCII)
|
||||||
|
test = toupper(test);
|
||||||
|
}
|
||||||
|
} while(1);
|
||||||
|
} else {
|
||||||
|
while(!sbracket(test, scan, count)) {
|
||||||
|
if ((test = nextchar()) == -1) return -4;
|
||||||
|
*act++ = test;
|
||||||
|
if (++l == MAXCMD) {
|
||||||
|
pushback(l, act_pat);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (ignore_case && smode == ASCII)
|
||||||
|
test = toupper(test);
|
||||||
|
}
|
||||||
|
scan += count;
|
||||||
|
pushback(1, --act);
|
||||||
|
l--;
|
||||||
|
}
|
||||||
|
} else { /* ".*" */
|
||||||
|
do {
|
||||||
|
if ((test = nextchar()) == -1) return -5;
|
||||||
|
*act++ = test;
|
||||||
|
if (++l == MAXCMD) {
|
||||||
|
pushback(l, act_pat);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
pushback(1, act - 1);
|
||||||
|
bytepos--;
|
||||||
|
} while (bmregexec(scan) == 0);
|
||||||
|
bytepos++;
|
||||||
|
act--;
|
||||||
|
l--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pushback(l, act_pat);
|
||||||
|
return 1; /* found */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
sbracket(start, scan, count)
|
||||||
|
int start;
|
||||||
|
char *scan;
|
||||||
|
int count;
|
||||||
|
{
|
||||||
|
if (*scan++ == '^') {
|
||||||
|
if (!memchr(scan, start, --count)) return 0;
|
||||||
|
} else {
|
||||||
|
if (memchr(scan, start, --count)) return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
bmsearch(ch)
|
||||||
|
int ch;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (sstring[0] == '\0') {
|
||||||
|
emsg("No previous regular expression");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ch == '/') {
|
||||||
|
if (ascii_comp(search_pat, sstring)) return;
|
||||||
|
}
|
||||||
|
if (ch == '\\') {
|
||||||
|
if (hex_comp(search_pat, sstring)) return;
|
||||||
|
}
|
||||||
|
oldpos = bytepos;
|
||||||
|
last_search = screen_home;
|
||||||
|
if (precount < 1) precount = 1;
|
||||||
|
while (precount--) {
|
||||||
|
while ((i = bmregexec(search_pat)) == 0);
|
||||||
|
if (i == 1) {
|
||||||
|
screen_home = bytepos;
|
||||||
|
to_print = maxy;
|
||||||
|
} else { /* i == -1 -> EOF */
|
||||||
|
if (no_intty) {
|
||||||
|
PRINTF("\r\nPattern not found\r\n");
|
||||||
|
do_next(1);
|
||||||
|
} else {
|
||||||
|
sprintf(string, "Pattern not found %d - %ul", i, (unsigned long)bytepos);
|
||||||
|
emsg(string);
|
||||||
|
/*
|
||||||
|
emsg("Pattern not found");
|
||||||
|
*/
|
||||||
|
bytepos = oldpos;
|
||||||
|
fseek(curr_file, bytepos, SEEK_SET);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (precount) {
|
||||||
|
nextchar();
|
||||||
|
bytepos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (prompt) {
|
||||||
|
PRINTF("\r\n...skipping\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
emsg(s)
|
||||||
|
char *s;
|
||||||
|
{
|
||||||
|
putchar('\r');
|
||||||
|
clreol();
|
||||||
|
highvideo();
|
||||||
|
PRINTF(s);
|
||||||
|
normvideo();
|
||||||
|
fflush(stdout);
|
||||||
|
prompt = 0;
|
||||||
|
}
|
156
bmore.h
Normal file
156
bmore.h
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
/* BMORE.H
|
||||||
|
*
|
||||||
|
* 1996-02-28 V 1.0.0
|
||||||
|
* 1999-01-21 V 1.1.0
|
||||||
|
* 1999-03-17 V 1.1.1
|
||||||
|
* 1999-07-01 V 1.2.0 beta
|
||||||
|
* 1999-08-21 V 1.2.0 final
|
||||||
|
* 2000-05-31 V 1.3.0 beta
|
||||||
|
* 2000-10-04 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
|
#ifdef __MSDOS__
|
||||||
|
# include "patchlev.h"
|
||||||
|
# include "dosconf.h"
|
||||||
|
# include <alloc.h>
|
||||||
|
# include <conio.h>
|
||||||
|
# include <bios.h>
|
||||||
|
#else
|
||||||
|
# include "patchlevel.h"
|
||||||
|
# include "config.h"
|
||||||
|
# include <unistd.h>
|
||||||
|
#if HAVE_NCURSES_H
|
||||||
|
# include <ncurses.h>
|
||||||
|
#else
|
||||||
|
# include <curses.h>
|
||||||
|
#endif
|
||||||
|
#include <term.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* defines for filemode */
|
||||||
|
#define ERROR -1
|
||||||
|
#define REGULAR 0
|
||||||
|
#define NEW 1
|
||||||
|
#define DIRECTORY 2
|
||||||
|
#define CHARACTER_SPECIAL 3
|
||||||
|
#define BLOCK_SPECIAL 4
|
||||||
|
#define PARTIAL 5
|
||||||
|
|
||||||
|
/* regular expressions */
|
||||||
|
#define END 0
|
||||||
|
#define ONE 1
|
||||||
|
#define STAR 2
|
||||||
|
|
||||||
|
#define ASCII 1
|
||||||
|
#define FORWARD 0
|
||||||
|
#define BACKWARD 1
|
||||||
|
#define CR '\r'
|
||||||
|
#define NL '\n'
|
||||||
|
#define BS 8
|
||||||
|
#define ESC 27
|
||||||
|
#define SEARCH 0
|
||||||
|
#define REPLACE 1
|
||||||
|
#ifndef CTRL
|
||||||
|
# define CTRL(n) (n&0x1f)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
# define NULL ((void *)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
# define TRUE 1
|
||||||
|
# define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __MSDOS__
|
||||||
|
# define ANSI
|
||||||
|
# define PTR char huge *
|
||||||
|
# define off_t long
|
||||||
|
# define DELIM '\\'
|
||||||
|
# define strncasecmp strnicmp
|
||||||
|
# define strcasecmp stricmp
|
||||||
|
#else
|
||||||
|
# define PTR char *
|
||||||
|
# define DELIM '/'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MAXCMD 255
|
||||||
|
#define BUFFER 1024
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
extern FILE *debug_fp;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern char *version;
|
||||||
|
|
||||||
|
#ifdef NO_SYSERRL
|
||||||
|
extern char *sys_errlist[];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
extern int maxx, maxy;
|
||||||
|
extern int ignore_case, magic;
|
||||||
|
extern int no_tty, no_intty;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ANSI
|
||||||
|
void initterm(void), set_tty(void), reset_tty(void);
|
||||||
|
void clreol(void), clrscr(void), highvideo(void), normvideo(void);
|
||||||
|
void /* beep(void), */ home(void);
|
||||||
|
void doshell(char *), emsg(char *);
|
||||||
|
void do_next(int);
|
||||||
|
void open_file(char *);
|
||||||
|
void bmsearch(int);
|
||||||
|
void pushback(int, char *);
|
||||||
|
int printout(int), rdline(int);
|
||||||
|
int nextchar(void), vgetc(void);
|
||||||
|
int sbracket(int, char *, int);
|
||||||
|
int bmregexec(char *);
|
||||||
|
int ascii_comp(char *, char *), hex_comp(char *, char *);
|
||||||
|
void putline(char *, int);
|
||||||
|
#else
|
||||||
|
void initterm(), set_tty(), reset_tty();
|
||||||
|
void clreol(), clrscr(), highvideo(), normvideo();
|
||||||
|
void /* beep(), */ home();
|
||||||
|
void doshell(), emsg();
|
||||||
|
void do_next();
|
||||||
|
void open_file();
|
||||||
|
void bmsearch();
|
||||||
|
void pushback();
|
||||||
|
int printout(), rdline();
|
||||||
|
int nextchar(), vgetc();
|
||||||
|
int sbracket();
|
||||||
|
int bmregexec();
|
||||||
|
int ascii_comp(), hex_comp();
|
||||||
|
void putline();
|
||||||
|
#endif
|
26
bmore.help
Normal file
26
bmore.help
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
Most commands optionally preceded by integer argument k. Defaults in brackets.
|
||||||
|
Star (*) indicates argument becomes new default.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
<space> Display next k lines of bytes [current screen size]
|
||||||
|
z Display next k lines of bytes [current screen size]*
|
||||||
|
<return> Display next k lines of bytes [1]*
|
||||||
|
d or ctrl-D Scroll k lines [current scroll size, initially 11]*
|
||||||
|
q or Q or <interrupt> Exit from bmore
|
||||||
|
s Skip forward k lines of bytes [1]
|
||||||
|
f Skip forward k screenfuls of bytes [1]
|
||||||
|
b or ctrl-B Skip backwards k screenfuls of bytes [1]
|
||||||
|
' Go to place where previous search started
|
||||||
|
= Display current byte number
|
||||||
|
/<regular expression> Search for kth occurrence of ascii regular expr [1]
|
||||||
|
\<regular expression> Search for kth occurrence of binary regular expr [1]
|
||||||
|
n Search for kth occurrence of last r.e [1]
|
||||||
|
!<cmd> or :!<cmd> Execute <cmd> in a subshell
|
||||||
|
v Start up bvi at current position
|
||||||
|
w Start up bvi reading only a screenful of bytes [screen]
|
||||||
|
ctrl-L Redraw screen
|
||||||
|
:n Go to kth next file [1]
|
||||||
|
:p Go to kth previous file [1]
|
||||||
|
:f Display current file name and byte position
|
||||||
|
. Repeat previous command
|
||||||
|
-------------------------------------------------------------------------------
|
26
bmore.hlp
Normal file
26
bmore.hlp
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
Most commands optionally preceded by integer argument k. Defaults in brackets.
|
||||||
|
Star (*) indicates argument becomes new default.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
<space> Display next k lines of bytes [current screen size]
|
||||||
|
z Display next k lines of bytes [current screen size]*
|
||||||
|
<return> Display next k lines of bytes [1]*
|
||||||
|
d or ctrl-D Scroll k lines [current scroll size, initially 11]*
|
||||||
|
q or Q or <interrupt> Exit from bmore
|
||||||
|
s Skip forward k lines of bytes [1]
|
||||||
|
f Skip forward k screenfuls of bytes [1]
|
||||||
|
b or ctrl-B Skip backwards k screenfuls of bytes [1]
|
||||||
|
' Go to place where previous search started
|
||||||
|
= Display current byte number
|
||||||
|
/<regular expression> Search for kth occurrence of ascii regular expr [1]
|
||||||
|
\<regular expression> Search for kth occurrence of binary regular expr [1]
|
||||||
|
n Search for kth occurrence of last r.e [1]
|
||||||
|
!<cmd> or :!<cmd> Execute <cmd> in a subshell
|
||||||
|
v Start up bvi at current position
|
||||||
|
w Start up bvi reading only a screenful of bytes [screen]
|
||||||
|
ctrl-L Redraw screen
|
||||||
|
:n Go to kth next file [1]
|
||||||
|
:p Go to kth previous file [1]
|
||||||
|
:f Display current file name and byte position
|
||||||
|
. Repeat previous command
|
||||||
|
-------------------------------------------------------------------------------
|
198
bmore.man
Normal file
198
bmore.man
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BMORE(1) BMORE(1)
|
||||||
|
|
||||||
|
|
||||||
|
NNAAMMEE
|
||||||
|
bmore - browse through a binary file
|
||||||
|
|
||||||
|
SSYYNNOOPPSSIISS
|
||||||
|
bbmmoorree [ --aaddii ] [ ++_l_i_n_e_n_u_m_b_e_r ] [ ++//_A_S_C_I_I_-_p_a_t_t_e_r_n ] [
|
||||||
|
++\\_H_e_x_-_p_a_t_t_e_r_n ] [ _f_i_l_e_n_a_m_e ... ]
|
||||||
|
|
||||||
|
|
||||||
|
DDEESSCCRRIIPPTTIIOONN
|
||||||
|
mmoorree is a filter that displays the contents of a binary
|
||||||
|
file on the terminal, one screenful at a time. It nor
|
||||||
|
mally pauses after each screenful, and prints ----MMoorree---- at
|
||||||
|
the bottom of the screen. bbmmoorree provides a two-line over
|
||||||
|
lap between screens for continuity. If bbmmoorree is reading
|
||||||
|
from a file rather than a pipe, the percentage of charac
|
||||||
|
ters displayed so far is also shown.
|
||||||
|
|
||||||
|
bbmmoorree scrolls up to display one more screen line in
|
||||||
|
response to a RETURN character; it displays another
|
||||||
|
screenful in response to a SPACE character. Other com
|
||||||
|
mands are listed below.
|
||||||
|
|
||||||
|
The screen is divided in three sections or panes: The byte
|
||||||
|
offset (extreme left), the hex pane (middle), and an ascii
|
||||||
|
pane (right) which shows as printable characters those
|
||||||
|
bytes in the hex pane. On an 80 column terminal there
|
||||||
|
will be sixteen hex values and their ASCII values on each
|
||||||
|
screen line. Note that (as one would expect) the first
|
||||||
|
byte has the offset 0 (zero).
|
||||||
|
|
||||||
|
bbmmoorree sets the terminal to _n_o_e_c_h_o mode, so that the output
|
||||||
|
can be continuous. Commands that you type do not normally
|
||||||
|
show up on your terminal, except for the // , \\ and !! com
|
||||||
|
mands.
|
||||||
|
|
||||||
|
If the standard output is not a terminal, mmoorree acts just
|
||||||
|
like ccaatt(1V), except that a header is printed before each
|
||||||
|
file in a series.
|
||||||
|
|
||||||
|
OOPPTTIIOONNSS
|
||||||
|
--aa ASCII mode: no hex representation of the contents.
|
||||||
|
Non printable characters are displayed as a dot (.)
|
||||||
|
|
||||||
|
--dd Display error messages rather than ringing the ter
|
||||||
|
minal bell if an unrecognized command is used.
|
||||||
|
This is helpful for inexperienced users.
|
||||||
|
|
||||||
|
--ii Ignore case for searching.
|
||||||
|
|
||||||
|
++_l_i_n_e_n_u_m_b_e_r
|
||||||
|
Start up at _l_i_n_e_n_u_m_b_e_r.
|
||||||
|
|
||||||
|
++//_A_S_C_I_I_-_p_a_t_t_e_r_n
|
||||||
|
Start up at the line containing the regular
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
13 June 2000 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BMORE(1) BMORE(1)
|
||||||
|
|
||||||
|
|
||||||
|
expression _p_a_t_t_e_r_n. Note: unlike editors, this
|
||||||
|
construct should _n_o_t end with a `//'. If it does,
|
||||||
|
then the trailing slash is taken as a character in
|
||||||
|
the search pattern.
|
||||||
|
|
||||||
|
|
||||||
|
UUSSAAGGEE
|
||||||
|
|
||||||
|
CCoommmmaannddss
|
||||||
|
The commands take effect immediately; it is not necessary
|
||||||
|
to type a carriage return. Up to the time when the com
|
||||||
|
mand character itself is given, the user may type the line
|
||||||
|
kill character to cancel the numerical argument being
|
||||||
|
formed. In addition, the user may type the erase charac
|
||||||
|
ter to redisplay the `----MMoorree----((_x_x%%))' message.
|
||||||
|
|
||||||
|
In the following commands, _i is a numerical argument (11 by
|
||||||
|
default).
|
||||||
|
|
||||||
|
_iSPACE Display another screenful, or _i more lines if _i
|
||||||
|
is specified.
|
||||||
|
|
||||||
|
_iRETURN Display another line, or _i more lines, if speci
|
||||||
|
fied.
|
||||||
|
|
||||||
|
_i^^DD (CTRL-D) Display (scroll down) 11 more lines. _i
|
||||||
|
is given, the scroll size is set to _i.
|
||||||
|
|
||||||
|
_id Same as ^^DD.
|
||||||
|
|
||||||
|
_izz Same as SPACE, except that _i, if present,
|
||||||
|
becomes the new default number of lines per
|
||||||
|
screenful.
|
||||||
|
|
||||||
|
_iss Skip _i lines and then print a screenful.
|
||||||
|
|
||||||
|
_iff Skip _i screenfuls and then print a screenful.
|
||||||
|
|
||||||
|
_i^^BB (CTRL-B) Skip back _i screenfuls and then print a
|
||||||
|
screenful.
|
||||||
|
|
||||||
|
_b Same as ^^BB (CTRL-D).
|
||||||
|
|
||||||
|
qq
|
||||||
|
QQ Exit from mmoorree.
|
||||||
|
|
||||||
|
== Display the current line number.
|
||||||
|
|
||||||
|
vv Drop into the bbvvii(1) editor at the current off
|
||||||
|
set of the current file.
|
||||||
|
|
||||||
|
ww Drop into the bbvvii(1) editor at the current off
|
||||||
|
set of the current file. Only the portion of the
|
||||||
|
file displayed on the screen will be loaded.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
13 June 2000 2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BMORE(1) BMORE(1)
|
||||||
|
|
||||||
|
|
||||||
|
hh Help. Give a description of all the mmoorree com
|
||||||
|
mands.
|
||||||
|
|
||||||
|
_i//_p_a_t_t_e_r_n Search for the _ith occurrence of the regular
|
||||||
|
expression _p_a_t_t_e_r_n. Display the screenful
|
||||||
|
starting at the file position that contains the
|
||||||
|
_ith match for the regular expression _A_S_C_I_I_-_p_a_t_
|
||||||
|
_t_e_r_n, or the end of a pipe, whichever comes
|
||||||
|
first. If bbmmoorree is displaying a file and there
|
||||||
|
is no such match, its position in the file
|
||||||
|
remains unchanged. Regular expressions can be
|
||||||
|
edited using erase and kill characters. Erasing
|
||||||
|
back past the first column cancels the search
|
||||||
|
command.
|
||||||
|
|
||||||
|
´´ Single quote. Go to the point from which the
|
||||||
|
last search started. If no search has been per
|
||||||
|
formed in the current file, go to the beginning
|
||||||
|
of the file.
|
||||||
|
|
||||||
|
!!_c_o_m_m_a_n_d Invoke a shell to execute _c_o_m_m_a_n_d. The charac
|
||||||
|
ters %% and !!, when used within _c_o_m_m_a_n_d are
|
||||||
|
replaced with the current filename and the pre
|
||||||
|
vious shell command, respectively. If there is
|
||||||
|
no current filename, %% is not expanded. Prepend
|
||||||
|
a backslash to these characters to escape expan
|
||||||
|
sion.
|
||||||
|
|
||||||
|
_i::nn Skip to the _ith next filename given in the com
|
||||||
|
mand line, or to the last filename in the list
|
||||||
|
if _i is out of range.
|
||||||
|
|
||||||
|
_i::pp Skip to the _ith previous filename given in the
|
||||||
|
command line, or to the first filename if _i is
|
||||||
|
out of range. If given while mmoorree is positioned
|
||||||
|
within a file, go to the beginning of the file.
|
||||||
|
If mmoorree is reading from a pipe, mmoorree simply
|
||||||
|
rings the terminal bell.
|
||||||
|
|
||||||
|
::ff Display the current filename and offset number.
|
||||||
|
|
||||||
|
::qq
|
||||||
|
::QQ Exit from bbmmoorree (same as qq or QQ ))..
|
||||||
|
|
||||||
|
.. Dot. Repeat the previous command.
|
||||||
|
|
||||||
|
|
||||||
|
FFIILLEESS
|
||||||
|
//eettcc//tteerrmmccaapp terminal data base
|
||||||
|
//uussrr//llooccaall//sshhaarree//bbmmoorree..hheellpp
|
||||||
|
help file
|
||||||
|
|
||||||
|
SSEEEE AALLSSOO
|
||||||
|
bbvvii(1), tteerrmmccaapp(5)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
13 June 2000 3
|
||||||
|
|
||||||
|
|
614
bvi.1
Normal file
614
bvi.1
Normal file
|
@ -0,0 +1,614 @@
|
||||||
|
.rn '' }`
|
||||||
|
''' $RCSfile$$Revision$$Date$
|
||||||
|
'''
|
||||||
|
''' $Log$
|
||||||
|
'''
|
||||||
|
.de Sh
|
||||||
|
.br
|
||||||
|
.if t .Sp
|
||||||
|
.ne 5
|
||||||
|
.PP
|
||||||
|
\fB\\$1\fR
|
||||||
|
.PP
|
||||||
|
..
|
||||||
|
.de Sp
|
||||||
|
.if t .sp .5v
|
||||||
|
.if n .sp
|
||||||
|
..
|
||||||
|
.de Ip
|
||||||
|
.br
|
||||||
|
.ie \\n(.$>=3 .ne \\$3
|
||||||
|
.el .ne 3
|
||||||
|
.IP "\\$1" \\$2
|
||||||
|
..
|
||||||
|
.de Vb
|
||||||
|
.ft CW
|
||||||
|
.nf
|
||||||
|
.ne \\$1
|
||||||
|
..
|
||||||
|
.de Ve
|
||||||
|
.ft R
|
||||||
|
|
||||||
|
.fi
|
||||||
|
..
|
||||||
|
'''
|
||||||
|
'''
|
||||||
|
''' Set up \*(-- to give an unbreakable dash;
|
||||||
|
''' string Tr holds user defined translation string.
|
||||||
|
''' Bell System Logo is used as a dummy character.
|
||||||
|
'''
|
||||||
|
.tr \(*W-|\(bv\*(Tr
|
||||||
|
.ie n \{\
|
||||||
|
.ds -- \(*W-
|
||||||
|
.ds PI pi
|
||||||
|
.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
|
||||||
|
.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
|
||||||
|
.ds L" ""
|
||||||
|
.ds R" ""
|
||||||
|
''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of
|
||||||
|
''' \*(L" and \*(R", except that they are used on ".xx" lines,
|
||||||
|
''' such as .IP and .SH, which do another additional levels of
|
||||||
|
''' double-quote interpretation
|
||||||
|
.ds M" """
|
||||||
|
.ds S" """
|
||||||
|
.ds N" """""
|
||||||
|
.ds T" """""
|
||||||
|
.ds L' '
|
||||||
|
.ds R' '
|
||||||
|
.ds M' '
|
||||||
|
.ds S' '
|
||||||
|
.ds N' '
|
||||||
|
.ds T' '
|
||||||
|
'br\}
|
||||||
|
.el\{\
|
||||||
|
.ds -- \(em\|
|
||||||
|
.tr \*(Tr
|
||||||
|
.ds L" ``
|
||||||
|
.ds R" ''
|
||||||
|
.ds M" ``
|
||||||
|
.ds S" ''
|
||||||
|
.ds N" ``
|
||||||
|
.ds T" ''
|
||||||
|
.ds L' `
|
||||||
|
.ds R' '
|
||||||
|
.ds M' `
|
||||||
|
.ds S' '
|
||||||
|
.ds N' `
|
||||||
|
.ds T' '
|
||||||
|
.ds PI \(*p
|
||||||
|
'br\}
|
||||||
|
.\" If the F register is turned on, we'll generate
|
||||||
|
.\" index entries out stderr for the following things:
|
||||||
|
.\" TH Title
|
||||||
|
.\" SH Header
|
||||||
|
.\" Sh Subsection
|
||||||
|
.\" Ip Item
|
||||||
|
.\" X<> Xref (embedded
|
||||||
|
.\" Of course, you have to process the output yourself
|
||||||
|
.\" in some meaninful fashion.
|
||||||
|
.if \nF \{
|
||||||
|
.de IX
|
||||||
|
.tm Index:\\$1\t\\n%\t"\\$2"
|
||||||
|
..
|
||||||
|
.nr % 0
|
||||||
|
.rr F
|
||||||
|
.\}
|
||||||
|
.TH BVI 1 "BVI Version 1.3.0" "18/Oct/2000" "User Commands"
|
||||||
|
.IX Title "BVI 1"
|
||||||
|
.UC
|
||||||
|
.IX Name "bvi, bview - visual display editor for binary files"
|
||||||
|
.if n .hy 0
|
||||||
|
.if n .na
|
||||||
|
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
|
||||||
|
.de CQ \" put $1 in typewriter font
|
||||||
|
.ft CW
|
||||||
|
'if n "\c
|
||||||
|
'if t \\&\\$1\c
|
||||||
|
'if n \\&\\$1\c
|
||||||
|
'if n \&"
|
||||||
|
\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7
|
||||||
|
'.ft R
|
||||||
|
..
|
||||||
|
.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2
|
||||||
|
. \" AM - accent mark definitions
|
||||||
|
.bd B 3
|
||||||
|
. \" fudge factors for nroff and troff
|
||||||
|
.if n \{\
|
||||||
|
. ds #H 0
|
||||||
|
. ds #V .8m
|
||||||
|
. ds #F .3m
|
||||||
|
. ds #[ \f1
|
||||||
|
. ds #] \fP
|
||||||
|
.\}
|
||||||
|
.if t \{\
|
||||||
|
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
|
||||||
|
. ds #V .6m
|
||||||
|
. ds #F 0
|
||||||
|
. ds #[ \&
|
||||||
|
. ds #] \&
|
||||||
|
.\}
|
||||||
|
. \" simple accents for nroff and troff
|
||||||
|
.if n \{\
|
||||||
|
. ds ' \&
|
||||||
|
. ds ` \&
|
||||||
|
. ds ^ \&
|
||||||
|
. ds , \&
|
||||||
|
. ds ~ ~
|
||||||
|
. ds ? ?
|
||||||
|
. ds ! !
|
||||||
|
. ds /
|
||||||
|
. ds q
|
||||||
|
.\}
|
||||||
|
.if t \{\
|
||||||
|
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
|
||||||
|
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
|
||||||
|
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
|
||||||
|
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
|
||||||
|
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
|
||||||
|
. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10'
|
||||||
|
. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m'
|
||||||
|
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
|
||||||
|
. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10'
|
||||||
|
.\}
|
||||||
|
. \" troff and (daisy-wheel) nroff accents
|
||||||
|
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
|
||||||
|
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
|
||||||
|
.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#]
|
||||||
|
.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u'
|
||||||
|
.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u'
|
||||||
|
.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#]
|
||||||
|
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
|
||||||
|
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
|
||||||
|
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
|
||||||
|
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
|
||||||
|
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
|
||||||
|
.ds ae a\h'-(\w'a'u*4/10)'e
|
||||||
|
.ds Ae A\h'-(\w'A'u*4/10)'E
|
||||||
|
.ds oe o\h'-(\w'o'u*4/10)'e
|
||||||
|
.ds Oe O\h'-(\w'O'u*4/10)'E
|
||||||
|
. \" corrections for vroff
|
||||||
|
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
|
||||||
|
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
|
||||||
|
. \" for low resolution devices (crt and lpr)
|
||||||
|
.if \n(.H>23 .if \n(.V>19 \
|
||||||
|
\{\
|
||||||
|
. ds : e
|
||||||
|
. ds 8 ss
|
||||||
|
. ds v \h'-1'\o'\(aa\(ga'
|
||||||
|
. ds _ \h'-1'^
|
||||||
|
. ds . \h'-1'.
|
||||||
|
. ds 3 3
|
||||||
|
. ds o a
|
||||||
|
. ds d- d\h'-1'\(ga
|
||||||
|
. ds D- D\h'-1'\(hy
|
||||||
|
. ds th \o'bp'
|
||||||
|
. ds Th \o'LP'
|
||||||
|
. ds ae ae
|
||||||
|
. ds Ae AE
|
||||||
|
. ds oe oe
|
||||||
|
. ds Oe OE
|
||||||
|
.\}
|
||||||
|
.rm #[ #] #H #V #F C
|
||||||
|
.SH "NAME"
|
||||||
|
.IX Header "NAME"
|
||||||
|
bvi, bview \- visual editor for binary files
|
||||||
|
.SH "VERSION"
|
||||||
|
.IX Header "VERSION"
|
||||||
|
bvi-1.3.0
|
||||||
|
.SH "SYNOPSIS"
|
||||||
|
.IX Header "SYNOPSIS"
|
||||||
|
\fBbvi\fR\ \ \ [\fB\-R\fR]\ [\fB\-c\fR\ \fIcmd\fR]\ [\fB\-f\fR\ \fIscript\fR]\ [\fB\-b\fR\ \fIbegin\fR]\ [\fB\-e\fR\ \fIend\fR]\ [\fB\-s\fR\ \fIsize\fR]\ \fIfile\fR...
|
||||||
|
\fBbview\fR\ [\fB\-R\fR]\ [\fB\-c\fR\ \fIcmd\fR]\ [\fB\-f\fR\ \fIscript\fR]\ [\fB\-b\fR\ \fIbegin\fR]\ [\fB\-e\fR\ \fIend\fR]\ [\fB\-s\fR\ \fIsize\fR]\ \fIfile\fR...
|
||||||
|
.SH "OPTIONS"
|
||||||
|
.IX Header "OPTIONS"
|
||||||
|
.Ip "\fIfile\fR..." 4
|
||||||
|
.IX Item "\fIfile\fR..."
|
||||||
|
A list of filenames. The first one will be the current file and
|
||||||
|
will be read
|
||||||
|
into the buffer. The cursor will be positioned on the first line of
|
||||||
|
the buffer. You can get to the other files with the ":next" command.
|
||||||
|
.Ip "\fB\-R\fR" 4
|
||||||
|
.IX Item "\fB\-R\fR"
|
||||||
|
\*(L"Readonly": The readonly flag is set for all the files,
|
||||||
|
preventing accidental overwriting with a write command.
|
||||||
|
|
||||||
|
.Ip "\fB\-b\fR \fIbegin\fR" 4
|
||||||
|
.IX Item "\fB\-b\fR \fIbegin\fR"
|
||||||
|
causes bvi to load a file not from the start but from
|
||||||
|
offset \fIbegin\fR.
|
||||||
|
|
||||||
|
.Ip "\fB\-e\fR \fIend\fR" 4
|
||||||
|
.IX Item "\fB\-e\fR \fIend\fR"
|
||||||
|
causes bvi to load a file not till end but till address \fIend\fR.
|
||||||
|
|
||||||
|
.Ip "\fB\-s\fR \fIsize\fR" 4
|
||||||
|
.IX Item "\fB\-s\fR \fIsize\fR"
|
||||||
|
causes bvi not to load the complete file but only \fIsize\fR bytes.
|
||||||
|
|
||||||
|
.Ip "\fB\-c\fR \fIcmd\fR" 4
|
||||||
|
.IX Item "\fB\-c\fR \fIcmd\fR"
|
||||||
|
\fIcmd\fR will be executed after the first
|
||||||
|
file has been read. If the \fIcmd\fR contains
|
||||||
|
spaces it must be enclosed in double quotes
|
||||||
|
(this depends on the shell that is used).
|
||||||
|
.Ip "\fB\-f\fR \fIscript\fR" 4
|
||||||
|
.IX Item "\fB\-f\fR \fIscript\fR"
|
||||||
|
This command provides a means for collecting a series of \*(L"ex\*(R"
|
||||||
|
(colon) commands into a script file, then using this file to edit
|
||||||
|
other files. Since there is no binary stream editor \*(L"bsed\*(R", you
|
||||||
|
can use this option to make several global changes in a binary file.
|
||||||
|
.SH "DESCRIPTION"
|
||||||
|
.IX Header "DESCRIPTION"
|
||||||
|
Bvi stands for \*(L"Binary VIsual editor\*(R".
|
||||||
|
Bvi is a screen oriented editor for binary files;
|
||||||
|
its command set is based on that of the \fIvi\fR\|(1) text editor.
|
||||||
|
As a binary editor does not have the concept of \*(L"lines\*(R"
|
||||||
|
there are differences from Vi commands wherever the latter are
|
||||||
|
line orientate.
|
||||||
|
.SH "COMPARISON"
|
||||||
|
.IX Header "COMPARISON"
|
||||||
|
The main differences between Vi and Bvi are:
|
||||||
|
.PP
|
||||||
|
The screen is divided in three sections or panes:
|
||||||
|
The byte offset (extreme left), the hex pane (middle),
|
||||||
|
and an ascii pane (right) which shows as printable characters
|
||||||
|
those bytes in the hex pane.
|
||||||
|
On an 80 column terminal there will be sixteen hex values
|
||||||
|
and their ASCII values on each screen line.
|
||||||
|
Note that (as one would expect) the first byte has the offset \*(L'0\*(R' (zero).
|
||||||
|
.PP
|
||||||
|
You can toggle between the hex and ascii windows with the tab key (TAB).
|
||||||
|
Toggling between these two windows does not change the current
|
||||||
|
position (offset) within the file.
|
||||||
|
.PP
|
||||||
|
No \*(L"lines\*(R" concept:
|
||||||
|
Files are treated as one long stream of bytes. The characters
|
||||||
|
\*(L"newline\*(R" and \*(L"carriage return\*(R" are not special, id est they
|
||||||
|
never mark the end of lines. Therefore the lines on the screen do not
|
||||||
|
represent lines in the usual way. Data is broken across screen lines
|
||||||
|
arbitarily.
|
||||||
|
As a consequence there are no commands in bvi from ex or vi
|
||||||
|
that are based on line numbers, eg \*(L"dd\*(R", \*(L"yy\*(R", \*(L'C\*(R', \*(L'S\*(R', \*(L'o\*(R', \*(L'O\*(R'.
|
||||||
|
This also changes the meaning of \*(L"range\*(R" before the \*(L":write\*(R" command
|
||||||
|
to a byte offset, ie the command \*(L":100,200w foo\*(R" writes all *bytes*
|
||||||
|
(not lines) from offset 100 to offset 200 to the file \*(L"foo\*(R".
|
||||||
|
.PP
|
||||||
|
No \*(L"text objects":
|
||||||
|
There are also no text-specific arrangements like words,
|
||||||
|
paragraphs, sentences, sections and so on.
|
||||||
|
.PP
|
||||||
|
Extended \*(L"ruler":
|
||||||
|
The bottom line of the screen shows the current address (byte offset)
|
||||||
|
and the current character in these notations:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& octal, hexadecimal, decimal and ascii.
|
||||||
|
.Ve
|
||||||
|
Search patterns:
|
||||||
|
All search commands understand these special characters:
|
||||||
|
.PP
|
||||||
|
.Vb 3
|
||||||
|
\& . any character
|
||||||
|
\& [] set of characters
|
||||||
|
\& * zero or more occurrences of previous char or set
|
||||||
|
.Ve
|
||||||
|
But as there is no concept of lines you cannot use the standard symbols
|
||||||
|
("anchors") for \*(L"begin-of-line\*(R" ('^') and \*(L"end-of-line\*(R" ('$').
|
||||||
|
Searching for the start/end of lines must be done explicitly
|
||||||
|
by adding these special characters to your search pattern
|
||||||
|
using these meta sequences:
|
||||||
|
.PP
|
||||||
|
.Vb 4
|
||||||
|
\& \en newline
|
||||||
|
\& \er return
|
||||||
|
\& \et tab
|
||||||
|
\& \e0 binary zero
|
||||||
|
.Ve
|
||||||
|
Additional search commands:
|
||||||
|
Similar to the text search commands there are additional hex-search
|
||||||
|
functions \*(L'\e\*(R' and \*(L'#\*(R' which allow to search for any byte value.
|
||||||
|
Example: \*(L"\e62 76 69\*(R" will search for the string \*(L"bvi\*(R".
|
||||||
|
Spaces between hex value are optional, so searching
|
||||||
|
for \*(L"6775636B6573\*(R" will find \*(L"guckes\*(R".
|
||||||
|
.PP
|
||||||
|
Changing the length of data (insertion, deletion) moves the data to other addresses;
|
||||||
|
this is bad for many cases (eg. databases, program files) and is
|
||||||
|
thus disabled by default. You can enable this commands by typing
|
||||||
|
.PP
|
||||||
|
\f(CW :set memmove\fR
|
||||||
|
.PP
|
||||||
|
\fBBVI Modes:\fR
|
||||||
|
.PP
|
||||||
|
Command Mode (Normal Mode):
|
||||||
|
.PP
|
||||||
|
Input is treated as command. Note that command mode is the default
|
||||||
|
mode after startup and after escaping from input mode.
|
||||||
|
Use ESC (escape) to cancel a partial (uncompleted) command.
|
||||||
|
.PP
|
||||||
|
Input Mode:
|
||||||
|
.PP
|
||||||
|
Input is treated as replacement of current characters or
|
||||||
|
(after the end of the file) is appended
|
||||||
|
to the current file. This mode is entered from command mode by
|
||||||
|
typing one of \*(L'i\*(R', \*(L'I\*(R', \*(L'A\*(R', \*(L'r\*(R', or \*(L'R\*(R'.
|
||||||
|
You can enter the characters from the keyboard (in the ASCII window) or
|
||||||
|
hexadecimal values (in the HEX window).
|
||||||
|
Type TAB to switch between these two windows.
|
||||||
|
Type ESC to finish the current input and return to command mode.
|
||||||
|
Type CTRL\-C to cancel current command abnormally.
|
||||||
|
.PP
|
||||||
|
Command line mode (Last Line Mode or : mode):
|
||||||
|
.PP
|
||||||
|
Similar to vi, this mode is entered by typing one of the
|
||||||
|
characters
|
||||||
|
: / ? \e # !
|
||||||
|
The command is terminated and executed by typing a carriage
|
||||||
|
return; to cancel a partially typed command, type
|
||||||
|
ESC to cancel the current command and return to command mode.
|
||||||
|
.SH "ENVIRONMENT"
|
||||||
|
.IX Header "ENVIRONMENT"
|
||||||
|
The editor recognizes the environment variable BVIINIT as a
|
||||||
|
command (or list of commands) to run when it starts up. If
|
||||||
|
this variable is undefined, the editor checks for startup
|
||||||
|
commands in the file \fI~/.bvirc\fR file, which you must own.
|
||||||
|
However, if there is a \fI.bvirc\fR owned by you in the current
|
||||||
|
directory, the editor takes its startup commands from this
|
||||||
|
file \- overriding both the file in your home directory and
|
||||||
|
the environment variable.
|
||||||
|
.SH "TERMINOLOGY"
|
||||||
|
.IX Header "TERMINOLOGY"
|
||||||
|
Characters names are abbreviated as follows:
|
||||||
|
Abbr. ASCII name aka
|
||||||
|
CR 010 carriage return
|
||||||
|
^A 001 control-a
|
||||||
|
^H 008 control-h
|
||||||
|
^I 009 control-i aka TAB
|
||||||
|
^U 021 control-u
|
||||||
|
^Z 026 control-z
|
||||||
|
ESC 027 escape aka ESC
|
||||||
|
DEL 127 delete
|
||||||
|
LEFT --- left arrow
|
||||||
|
RIGHT --- right arrow
|
||||||
|
DOWN --- down arrow
|
||||||
|
UP --- up arrow
|
||||||
|
.SH "COMMAND SUMMARY"
|
||||||
|
.IX Header "COMMAND SUMMARY"
|
||||||
|
See the TERMINOLOGY for a summary on key name abbreviations
|
||||||
|
used within the following description of commands.
|
||||||
|
.PP
|
||||||
|
\fBAbstract:\fR
|
||||||
|
Arrow keys move the cursor on the screen within the current window.
|
||||||
|
.PP
|
||||||
|
\fBSample commands:\fR
|
||||||
|
:version show version info
|
||||||
|
<\- v ^ \-> arrow keys move the cursor
|
||||||
|
h j k l same as arrow keys
|
||||||
|
u undo previous change
|
||||||
|
ZZ exit bvi, saving changes
|
||||||
|
:q! quit, discarding changes
|
||||||
|
/\fItext\fR search for \fItext\fR
|
||||||
|
^U ^D scroll up or down
|
||||||
|
.PP
|
||||||
|
\fBCounts before bvi commands:\fR
|
||||||
|
Numbers may be typed as a prefix to some commands.
|
||||||
|
They are interpreted in one of these ways.
|
||||||
|
.PP
|
||||||
|
.Vb 4
|
||||||
|
\& screen column |
|
||||||
|
\& byte of file G
|
||||||
|
\& scroll amount ^D ^U
|
||||||
|
\& repeat effect most of the rest
|
||||||
|
.Ve
|
||||||
|
\fBInterrupting, canceling\fR
|
||||||
|
ESC end insert or incomplete command
|
||||||
|
DEL (delete or rubout) interrupts
|
||||||
|
.PP
|
||||||
|
\fBFile manipulation:\fR
|
||||||
|
ZZ if file modified, write and exit;
|
||||||
|
otherwise, exit
|
||||||
|
:w write changed buffer to file
|
||||||
|
:w! write changed buffer to file, overriding
|
||||||
|
read-only ("forced\*(R" write)
|
||||||
|
:q quit when no changes have been made
|
||||||
|
:q! quit and discard all changes
|
||||||
|
:e \fIfile\fR edit \fIfile\fR
|
||||||
|
:e! re-read current file, discard all changes
|
||||||
|
:e # edit the alternate file
|
||||||
|
:e! # edit the alternate file, discard changes
|
||||||
|
:w \fIfile\fR write current buffer to \fIfile\fR
|
||||||
|
:w! \fIfile\fR write current buffer to \fIfile\fR overriding
|
||||||
|
read-only (this \*(L"overwrites\*(R" the file)
|
||||||
|
:sh run the command as set with option \*(L"shell\*(R",
|
||||||
|
then return
|
||||||
|
:!\fIcmd\fR run the command \fIcmd\fR from \*(L"shell\*(R", then
|
||||||
|
return
|
||||||
|
:n edit next file in the argument list
|
||||||
|
:f show current filename, modified flag,
|
||||||
|
current byte offset, and percentage of
|
||||||
|
current position within buffer
|
||||||
|
^G same as :f
|
||||||
|
.PP
|
||||||
|
\fBAdditional edit commands\fR
|
||||||
|
You can insert/append/change bytes in ASCII/binary/decimal/
|
||||||
|
hexadecimal or octal representation. You can enter several
|
||||||
|
(screen) lines of input. A line with only a period (.) in it
|
||||||
|
will terminate the command. You must not type in values greater
|
||||||
|
than a byte value. This causes an abandonment of the command.
|
||||||
|
Pressing the CR key does not insert a newline \- character into
|
||||||
|
the file. If you use ASCII mode you can use the special characters
|
||||||
|
\en, \er, \et and \e0.
|
||||||
|
.PP
|
||||||
|
.Vb 3
|
||||||
|
\& :i aCR insert bytes (ASCII) at cursor position
|
||||||
|
\& :a bCR append bytes (Binary) at end of file
|
||||||
|
\& :c hCR change bytes (hexadecimal) at cursor position
|
||||||
|
.Ve
|
||||||
|
\fBBit-level operations\fR
|
||||||
|
:and \fIn\fR bitwise \*(L'and\*(R' operation with value \fIn\fR
|
||||||
|
:or \fIn\fR bitwise \*(L'or\*(R' operation with value \fIn\fR
|
||||||
|
:xor \fIn\fR bitwise \*(L'xor\*(R' operation with value \fIn\fR
|
||||||
|
:neg two's complement
|
||||||
|
:not logical negation
|
||||||
|
:sl \fIi\fR shift each byte \fIi\fR bits to the left
|
||||||
|
:sr \fIi\fR shift each byte \fIi\fR bits to the right
|
||||||
|
:rl \fIi\fR rotate each byte \fIi\fR bits to the left
|
||||||
|
:rr \fIi\fR rotate each byte \fIi\fR bits to the right
|
||||||
|
.PP
|
||||||
|
\fBCommand mode addresses\fR
|
||||||
|
:w foo write current buffer to a file
|
||||||
|
named \*(L"foo\*(R"
|
||||||
|
:5,10w foo copy byte 5 through 100 into as
|
||||||
|
file named foo
|
||||||
|
:.,.+20w foo copy the current byte and the next
|
||||||
|
20 bytes to foo
|
||||||
|
:^,'aw foo write all bytes from the beginning
|
||||||
|
through marker \*(L'a\*(R'
|
||||||
|
:/\fIpat\fR/,$ foo search pattern \fIpat\fR and and copy
|
||||||
|
through end of file
|
||||||
|
.PP
|
||||||
|
\fBPositioning within file:\fR
|
||||||
|
^B backward screen
|
||||||
|
^F forward screen
|
||||||
|
^D scroll down half screen
|
||||||
|
^U scroll up half screen
|
||||||
|
\fIn\fRG go to the specified character
|
||||||
|
(end default), where \fIn\fR is a decimal address
|
||||||
|
/\fIpat\fR next line matching \fIpat\fR
|
||||||
|
?\fIpat\fR previous line matching \fIpat\fR
|
||||||
|
\e\fIhex\fR jump to next occurrence of hex string \fIhex\fR
|
||||||
|
#\fIhex\fR jump to previous occurrence of hex string \fIhex\fR
|
||||||
|
n repeat last search command
|
||||||
|
N repeat last search command, but in opposite
|
||||||
|
direction
|
||||||
|
.PP
|
||||||
|
\fBAdjusting the screen:\fR
|
||||||
|
^L clear and redraw screen
|
||||||
|
zCR redraw screen with current line at top of screen
|
||||||
|
z- redraw screen with current line at bottom of
|
||||||
|
screen
|
||||||
|
z. redraw screen with current line at center of
|
||||||
|
screen
|
||||||
|
/\fIpat\fR/z- search for pattern \fIpat\fR and then move currents
|
||||||
|
line to bottom
|
||||||
|
^E scroll screen down 1 line
|
||||||
|
^Y scroll screen up 1 line
|
||||||
|
.PP
|
||||||
|
\fBMarking and returning:\fR
|
||||||
|
m\fIx\fR mark current position with lower-case letter \fIx\fR
|
||||||
|
Note: this command works for all lower-case letters
|
||||||
|
\*(L'\fIx\fR move cursor to mark \fIx\fR in ASCII section
|
||||||
|
`\fIx\fR move cursor to mark \fIx\fR in HEX section
|
||||||
|
\*(L'\*(R' move cursor to previous context in ASCII section
|
||||||
|
`` move cursor to previous context in HEX section
|
||||||
|
|
||||||
|
\fBLine positioning:\fR
|
||||||
|
H jump to first line on screen ("top")
|
||||||
|
L jump to last line on screen ("low")
|
||||||
|
M jump to middle line on screen ("middle")
|
||||||
|
\- jump onto previous line on screen
|
||||||
|
+ jump onto next line on screen
|
||||||
|
CR same as +
|
||||||
|
DOWN or j next line, same column
|
||||||
|
UP or k previous line, same column
|
||||||
|
.PP
|
||||||
|
\fBCharacter positioning:\fR
|
||||||
|
^ first byte in HEX window
|
||||||
|
$ end of screen line
|
||||||
|
l or RIGHT jump onto next byte (within current
|
||||||
|
screen line)
|
||||||
|
h or LEFT jump onto previous byte (within current
|
||||||
|
screen line)
|
||||||
|
^H same as LEFT
|
||||||
|
space same as RIGHT
|
||||||
|
f\fIx\fR find next occurrence of character \fIx\fR
|
||||||
|
F\fIx\fR find previous occurrence of character \fIx\fR
|
||||||
|
\fIn\fR| jump onto \fIn\fRth byte/character within current
|
||||||
|
line
|
||||||
|
.PP
|
||||||
|
\fBStrings:\fR
|
||||||
|
(works similar to the \fIstrings\fR\|(1) command)
|
||||||
|
Note: \*(L"Words\*(R" are defined as strings of \*(L"nonprinting
|
||||||
|
characters\*(R".
|
||||||
|
e jump to next end of word
|
||||||
|
w jump to next begin of word
|
||||||
|
b jump to previous begin of word
|
||||||
|
W forward to next string delimited with a
|
||||||
|
\e0 or \en
|
||||||
|
B back to previous string delimited with a
|
||||||
|
nonprinting char
|
||||||
|
.PP
|
||||||
|
\fBCorrections during insert:\fR
|
||||||
|
^H erase last character (backspace)
|
||||||
|
erase your erase character, same as ^H (backspace)
|
||||||
|
ESC ends insertion, back to command mode
|
||||||
|
.PP
|
||||||
|
\fBAppend and replace:\fR
|
||||||
|
A append at end of file
|
||||||
|
rx replace current bte with char \*(L'x\*(R'
|
||||||
|
R enter replace mode; for all subsequent input,
|
||||||
|
the current byte is overwritten with the next
|
||||||
|
input character; leave replace mode with ESC.
|
||||||
|
.PP
|
||||||
|
\fBMiscellaneous Operations:\fR
|
||||||
|
TAB toggle between ASCII and HEX section
|
||||||
|
.PP
|
||||||
|
\fBYank and Put:\fR
|
||||||
|
3ySPACE yank 3 characters
|
||||||
|
p insert contents of yank buffer
|
||||||
|
o replace text with content of yank buffer
|
||||||
|
P put back at end of file
|
||||||
|
.PP
|
||||||
|
\fBUndo, Redo:\fR
|
||||||
|
u undo last change
|
||||||
|
Note: Only the last change can be undone.
|
||||||
|
Therefore this commands toggles between the
|
||||||
|
last and second-t-last state of the buffer.
|
||||||
|
.PP
|
||||||
|
\fBSetting Options:\fR
|
||||||
|
With the :set command you can set options in bvi
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& Option Default Description
|
||||||
|
.Ve
|
||||||
|
.Vb 19
|
||||||
|
\& autowrite noaw Save current file, if modified, if you
|
||||||
|
\& give a :n, :r or ! command
|
||||||
|
\& columns cm=16 on an 80 character wide terminal
|
||||||
|
\& ignorecase noic Ignores letter case in searching
|
||||||
|
\& magic nomagic Makes . [ * special in patterns
|
||||||
|
\& memmove nomm enables insert and delete commands
|
||||||
|
\& offset of=0 adds an offset to the diplayed addresses
|
||||||
|
\& readonly noro If set, write fails unless you use ! after command
|
||||||
|
\& scroll sc=1/2 window
|
||||||
|
\& Number of lines scrolled by ^U and ^D
|
||||||
|
\& showmode mo Displays statusline on bottom of the screen
|
||||||
|
\& terse noterse Let you obtain shorter error messages
|
||||||
|
\& window window=screensize
|
||||||
|
\& Lines in window, can be reduced at slow terminals
|
||||||
|
\& wordlength wl=4 Length of an ASCII-string found by w, W, b or B
|
||||||
|
\& wrapscan ws Searches wrap around past the end of the file
|
||||||
|
\& unixstyle nous The representation of ascii characters below
|
||||||
|
\& 32 is displayed in the statusline as shown
|
||||||
|
\& in ascii(7) if unset rather in DOS-style (^A)
|
||||||
|
.Ve
|
||||||
|
.SH "AUTHOR"
|
||||||
|
.IX Header "AUTHOR"
|
||||||
|
bvi was developed by Gerhard Buergmann, Vienna, Austria
|
||||||
|
\fIGerhard.Buergmann@altavista.net\fR
|
||||||
|
.SH "WWW"
|
||||||
|
.IX Header "WWW"
|
||||||
|
Bvi\ Homepage:\ \ http://bvi.linuxave.net/
|
||||||
|
Vi\ Pages:\ \ \ \ \ \ http://www.math.fu-berlin.de/~guckes/vi/
|
||||||
|
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (all\ about\ Vi\ and\ its\ clones)
|
||||||
|
.SH "FILES"
|
||||||
|
.IX Header "FILES"
|
||||||
|
\fI\ $HOME/.bvirc\fR\ \ \ \ \ \ \ \ \ \ editor\ startup\ file
|
||||||
|
\fI\ ./.bvirc\fR\ \ \ \ \ \ \ \ \ \ \ \ \ \ editor\ startup\ file
|
||||||
|
.SH "BUGS"
|
||||||
|
.IX Header "BUGS"
|
||||||
|
Bvi does not update the screen when the terminal changes its size.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.IX Header "SEE ALSO"
|
||||||
|
\fIvi\fR\|(1), \fIstrings\fR\|(1), \fIascii\fR\|(5)
|
||||||
|
|
||||||
|
.rn }` ''
|
984
bvi.c
Normal file
984
bvi.c
Normal file
|
@ -0,0 +1,984 @@
|
||||||
|
/* BVI - Binary Visual Editor
|
||||||
|
*
|
||||||
|
* 1996-02-28 V 1.0.0
|
||||||
|
* 1999-01-27 V 1.1.0
|
||||||
|
* 1999-04-22 V 1.1.1
|
||||||
|
* 1999-07-01 V 1.2.0 beta
|
||||||
|
* 1999-10-22 V 1.2.0 final
|
||||||
|
* 2000-05-10 V 1.3.0 alpha
|
||||||
|
* 2000-10-24 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "bvi.h"
|
||||||
|
#include "set.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_LOCALE_H
|
||||||
|
# include <locale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
char *copyright = "Copyright (C) 1996-2000 by Gerhard Buergmann";
|
||||||
|
|
||||||
|
jmp_buf env; /* context for `longjmp' function */
|
||||||
|
|
||||||
|
int loc;
|
||||||
|
int maxx, maxy, x, xx, y;
|
||||||
|
int screen, status;
|
||||||
|
off_t size;
|
||||||
|
PTR mem = NULL;
|
||||||
|
PTR curpos;
|
||||||
|
PTR maxpos;
|
||||||
|
PTR pagepos;
|
||||||
|
PTR spos;
|
||||||
|
char *name = NULL;
|
||||||
|
char *shell;
|
||||||
|
char string[MAXCMD];
|
||||||
|
char cmdstr[MAXCMD + 1] = "";
|
||||||
|
FILE *Ausgabe_Datei;
|
||||||
|
int edits = 0;
|
||||||
|
int AnzAdd, Anzahl, Anzahl3;
|
||||||
|
off_t filesize, memsize, undosize;
|
||||||
|
long precount = -1; /* number preceding command */
|
||||||
|
|
||||||
|
int block_flag = 0;
|
||||||
|
off_t block_begin, block_end, block_size;
|
||||||
|
|
||||||
|
|
||||||
|
char **files; /* list of input files */
|
||||||
|
int numfiles; /* number of input files */
|
||||||
|
int curfile; /* number of the current file */
|
||||||
|
|
||||||
|
int arrnum = 0;
|
||||||
|
char numarr[64]; /* string for collecting number */
|
||||||
|
char rep_buf[BUFFER];
|
||||||
|
|
||||||
|
PTR current;
|
||||||
|
PTR last_motion;
|
||||||
|
PTR current_start;
|
||||||
|
PTR undo_start;
|
||||||
|
off_t undo_count;
|
||||||
|
off_t yanked = 0L;
|
||||||
|
char *yank_buf = NULL;
|
||||||
|
char *undo_buf = NULL;
|
||||||
|
PTR markbuf[26];
|
||||||
|
|
||||||
|
char addr_form[15];
|
||||||
|
|
||||||
|
char *nobytes = "No bytes@in the buffer";
|
||||||
|
|
||||||
|
static char progname[8];
|
||||||
|
static char line[MAXCMD];
|
||||||
|
static int mark;
|
||||||
|
static int scrolly;
|
||||||
|
static int wrstat = 1;
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
usage()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage: %s [-R] [-c cmd | +cmd] [-f script]\n\
|
||||||
|
[-b begin] [-e end] [-s size] file ...\n", progname);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{
|
||||||
|
int ch;
|
||||||
|
int lflag;
|
||||||
|
long count;
|
||||||
|
int n = 1;
|
||||||
|
int script = -1;
|
||||||
|
off_t inaddr;
|
||||||
|
char *poi;
|
||||||
|
|
||||||
|
#ifdef HAVE_LOCALE_H
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
#endif
|
||||||
|
poi = strrchr(argv[0], DELIM);
|
||||||
|
|
||||||
|
if (poi) strncpy(progname, ++poi, 7);
|
||||||
|
else strncpy(progname, argv[0], 7);
|
||||||
|
strtok(progname, ".");
|
||||||
|
|
||||||
|
if (!strcasecmp(progname, "bview")) {
|
||||||
|
params[P_RO].flags |= P_CHANGED;
|
||||||
|
P(P_RO) = TRUE;
|
||||||
|
} else if (!strcasecmp(progname, "bvedit")) {
|
||||||
|
/* This should be the beginners version */
|
||||||
|
}
|
||||||
|
|
||||||
|
while (n < argc) {
|
||||||
|
switch (argv[n][0]) {
|
||||||
|
case '-':
|
||||||
|
if (argv[n][1] == 'R') {
|
||||||
|
params[P_RO].flags |= P_CHANGED;
|
||||||
|
P(P_RO) = TRUE;
|
||||||
|
} else if (argv[n][1] == 'c') {
|
||||||
|
if (argv[n + 1] == NULL) {
|
||||||
|
usage();
|
||||||
|
} else {
|
||||||
|
strcpy(cmdstr, argv[++n]);
|
||||||
|
}
|
||||||
|
} else if (argv[n][1] == 'f') {
|
||||||
|
if (argv[n + 1] == NULL || argv[n + 1][0] == '-') {
|
||||||
|
usage();
|
||||||
|
} else {
|
||||||
|
script = ++n;
|
||||||
|
}
|
||||||
|
} else if (argv[n][1] == 'b') {
|
||||||
|
if (argv[n + 1] == NULL || argv[n + 1][0] == '-') {
|
||||||
|
usage();
|
||||||
|
} else {
|
||||||
|
block_begin = calc_size(argv[++n]);
|
||||||
|
block_flag |= 1;
|
||||||
|
}
|
||||||
|
} else if (argv[n][1] == 'e') {
|
||||||
|
if (argv[n + 1] == NULL || argv[n + 1][0] == '-') {
|
||||||
|
usage();
|
||||||
|
} else {
|
||||||
|
block_end = calc_size(argv[++n]);
|
||||||
|
block_flag |= 2;
|
||||||
|
}
|
||||||
|
} else if (argv[n][1] == 's') {
|
||||||
|
if (argv[n + 1] == NULL || argv[n + 1][0] == '-') {
|
||||||
|
usage();
|
||||||
|
} else {
|
||||||
|
block_size = calc_size(argv[++n]);
|
||||||
|
block_flag |= 4;
|
||||||
|
}
|
||||||
|
} else if (argv[n][1] == 'w') {
|
||||||
|
if (argv[n][2] == '\0') {
|
||||||
|
usage();
|
||||||
|
} else {
|
||||||
|
params[P_LI].flags |= P_CHANGED;
|
||||||
|
P(P_LI) = atoi(argv[n] + 2);
|
||||||
|
}
|
||||||
|
} else usage();
|
||||||
|
n++;
|
||||||
|
break;
|
||||||
|
case '+': /* +cmd */
|
||||||
|
if (argv[n][1] == '\0') {
|
||||||
|
strcpy(cmdstr, "$");
|
||||||
|
} else {
|
||||||
|
strcpy(cmdstr, &argv[n][1]);
|
||||||
|
}
|
||||||
|
n++;
|
||||||
|
break;
|
||||||
|
default: /* must be a file name */
|
||||||
|
name = strdup(argv[n]);
|
||||||
|
files = &(argv[n]);
|
||||||
|
numfiles = argc - n;
|
||||||
|
n = argc;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch (block_flag) {
|
||||||
|
case 2:
|
||||||
|
block_begin = 0;
|
||||||
|
case 1|2:
|
||||||
|
block_size = block_end - block_begin + 1;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
block_begin = 0;
|
||||||
|
case 1|4:
|
||||||
|
block_end = block_begin + block_size - 1;
|
||||||
|
break;
|
||||||
|
case 2|4:
|
||||||
|
block_begin = block_end + 1 - block_size;
|
||||||
|
break;
|
||||||
|
case 1|2|4:
|
||||||
|
if (block_end - block_begin != block_size + 1) {
|
||||||
|
fprintf(stderr, "Ambigous block data\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (block_flag && !numfiles) {
|
||||||
|
fprintf(stderr, "Cannot read a range of a nonexisting file\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (numfiles > 1) fprintf(stderr, "%d files to edit\n", numfiles);
|
||||||
|
curfile = 0;
|
||||||
|
|
||||||
|
/****** Initialisation of curses ******/
|
||||||
|
initscr();
|
||||||
|
attrset(A_NORMAL);
|
||||||
|
|
||||||
|
maxy = LINES;
|
||||||
|
if (params[P_LI].flags & P_CHANGED) maxy = P(P_LI);
|
||||||
|
scrolly = maxy / 2;
|
||||||
|
P(P_SS) = scrolly;
|
||||||
|
P(P_LI) = maxy;
|
||||||
|
maxy--;
|
||||||
|
keypad(stdscr, TRUE);
|
||||||
|
scrollok(stdscr, TRUE);
|
||||||
|
nonl();
|
||||||
|
cbreak();
|
||||||
|
noecho();
|
||||||
|
|
||||||
|
/*
|
||||||
|
AnzAdd = 8;
|
||||||
|
strcpy(addr_form, "%06lX ");
|
||||||
|
*/
|
||||||
|
AnzAdd = 10;
|
||||||
|
strcpy(addr_form, "%08lX ");
|
||||||
|
|
||||||
|
Anzahl = ((COLS - AnzAdd - 1) / 16) * 4;
|
||||||
|
P(P_CM) = Anzahl;
|
||||||
|
maxx = Anzahl * 4 + AnzAdd + 1;
|
||||||
|
Anzahl3 = Anzahl * 3;
|
||||||
|
status = Anzahl3 + Anzahl - 17;
|
||||||
|
screen = Anzahl * (maxy - 1);
|
||||||
|
|
||||||
|
signal(SIGINT, SIG_IGN);
|
||||||
|
filesize = load(name);
|
||||||
|
|
||||||
|
bvi_init(argv[0]);
|
||||||
|
params[P_TT].svalue = terminal;
|
||||||
|
if (block_flag && (P(P_MM) == TRUE)) {
|
||||||
|
P(P_MM) = FALSE;
|
||||||
|
params[P_TT].flags |= P_CHANGED;
|
||||||
|
}
|
||||||
|
if (script > -1)
|
||||||
|
read_rc(argv[script]);
|
||||||
|
if (*cmdstr != '\0')
|
||||||
|
docmdline(cmdstr);
|
||||||
|
|
||||||
|
/* main loop */
|
||||||
|
do {
|
||||||
|
setjmp(env);
|
||||||
|
current = (PTR)(pagepos + y * Anzahl + xpos());
|
||||||
|
if (wrstat) statpos();
|
||||||
|
wrstat = 1;
|
||||||
|
setcur();
|
||||||
|
ch = vgetc();
|
||||||
|
while (ch >= '0' && ch <= '9') {
|
||||||
|
numarr[arrnum++] = ch;
|
||||||
|
ch = vgetc();
|
||||||
|
}
|
||||||
|
numarr[arrnum] = '\0';
|
||||||
|
if (arrnum != 0) precount = strtol(numarr, (char **)NULL, 10);
|
||||||
|
else precount = -1;
|
||||||
|
lflag = arrnum = 0;
|
||||||
|
|
||||||
|
switch (ch) {
|
||||||
|
case '^': x = AnzAdd;
|
||||||
|
loc = HEX;
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
case '0': x = AnzAdd + Anzahl3;
|
||||||
|
loc = ASCII;
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
case '$': x = AnzAdd - 1 + Anzahl3 + Anzahl;
|
||||||
|
loc = ASCII;
|
||||||
|
break;
|
||||||
|
case '\t': toggle();
|
||||||
|
break;
|
||||||
|
case '~': if (precount < 1) precount = 1;
|
||||||
|
sprintf(rep_buf, "%ld~", precount);
|
||||||
|
do_tilde(precount);
|
||||||
|
lflag++;
|
||||||
|
break;
|
||||||
|
case KEY_HOME:
|
||||||
|
case 'H': if (precount > 0) {
|
||||||
|
y = --precount;
|
||||||
|
if (y > maxy - 1) {
|
||||||
|
scrolldown(y - maxy + 1);
|
||||||
|
y = maxy - 1; }
|
||||||
|
} else y = 0;
|
||||||
|
if (loc == HEX) x = AnzAdd;
|
||||||
|
else x = AnzAdd + Anzahl3;
|
||||||
|
break;
|
||||||
|
case 'M': y = maxy / 2;
|
||||||
|
if ((PTR)(pagepos + screen) > maxpos)
|
||||||
|
y = (int)(maxpos - pagepos) / Anzahl / 2;
|
||||||
|
if (loc == HEX) x = AnzAdd;
|
||||||
|
else x = AnzAdd + Anzahl3;
|
||||||
|
break;
|
||||||
|
case KEY_LL:
|
||||||
|
case 'L': if (precount < 1) precount = 1;
|
||||||
|
n = maxy - 1;
|
||||||
|
if ((PTR)((pagepos + screen)) > maxpos)
|
||||||
|
n = (int)(maxpos - pagepos) / Anzahl;
|
||||||
|
if (precount < n) y = n + 1 - precount;
|
||||||
|
if (loc == HEX) x = AnzAdd;
|
||||||
|
else x = AnzAdd + Anzahl3;
|
||||||
|
break;
|
||||||
|
case CTRL('H'):
|
||||||
|
case KEY_BACKSPACE:
|
||||||
|
case KEY_LEFT:
|
||||||
|
case 'h': do {
|
||||||
|
if (x > (AnzAdd + 2) && x < (Anzahl3 + AnzAdd + 1))
|
||||||
|
x -= 3;
|
||||||
|
else
|
||||||
|
if (x > (Anzahl3 + AnzAdd - 2)) x--;
|
||||||
|
} while (--precount > 0);
|
||||||
|
if (x < AnzAdd + Anzahl3) loc = HEX;
|
||||||
|
else loc = ASCII;
|
||||||
|
break;
|
||||||
|
case ' ':
|
||||||
|
case KEY_RIGHT:
|
||||||
|
case 'l': do {
|
||||||
|
if (x < (Anzahl3 + 6)) x += 3;
|
||||||
|
else if (x > (Anzahl3 + 3)
|
||||||
|
&& x < (Anzahl3 + AnzAdd - 1 + Anzahl))
|
||||||
|
x++;
|
||||||
|
} while (--precount > 0);
|
||||||
|
if (x < AnzAdd + Anzahl3) loc = HEX;
|
||||||
|
else loc = ASCII;
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
case KEY_UP :
|
||||||
|
case 'k': do {
|
||||||
|
if (y > 0) y--;
|
||||||
|
else scrollup(1);
|
||||||
|
} while(--precount > 0);
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
case CR: if (loc == HEX) x = AnzAdd;
|
||||||
|
else x = AnzAdd + Anzahl3;
|
||||||
|
case 'j':
|
||||||
|
case CTRL('J'):
|
||||||
|
case CTRL('N'):
|
||||||
|
case KEY_DOWN:
|
||||||
|
do {
|
||||||
|
if ((PTR)((pagepos + (y + 1) * Anzahl)) > maxpos) break;
|
||||||
|
if (y < (maxy - 1)) y++;
|
||||||
|
else scrolldown(1);
|
||||||
|
} while(--precount > 0);
|
||||||
|
break;
|
||||||
|
case '|': if (precount < 1) break;
|
||||||
|
if (loc == ASCII) x = AnzAdd - 1 + Anzahl3 + precount;
|
||||||
|
else x = 5 + 3 * precount;
|
||||||
|
if (x > AnzAdd - 1 + Anzahl3 + Anzahl) {
|
||||||
|
x = AnzAdd - 1 + Anzahl3 + Anzahl;
|
||||||
|
loc = ASCII; }
|
||||||
|
break;
|
||||||
|
case ':' : clearstr();
|
||||||
|
addch(ch);
|
||||||
|
refresh();
|
||||||
|
getcmdstr(cmdstr, 1);
|
||||||
|
if (strlen(cmdstr))
|
||||||
|
docmdline(cmdstr);
|
||||||
|
break;
|
||||||
|
case CTRL('B'):
|
||||||
|
case KEY_PPAGE: /**** Previous Page ****/
|
||||||
|
if (mem <= (PTR)(pagepos - screen)) pagepos -= screen;
|
||||||
|
else pagepos = mem;
|
||||||
|
repaint();
|
||||||
|
break;
|
||||||
|
case CTRL('D'):
|
||||||
|
if (precount > 1) scrolly = precount;
|
||||||
|
scrolldown(scrolly);
|
||||||
|
break;
|
||||||
|
case CTRL('U'):
|
||||||
|
if (precount > 1) scrolly = precount;
|
||||||
|
scrollup(scrolly);
|
||||||
|
break;
|
||||||
|
case CTRL('E'):
|
||||||
|
if (y > 0) y--;
|
||||||
|
scrolldown(1);
|
||||||
|
break;
|
||||||
|
case CTRL('F'):
|
||||||
|
case KEY_NPAGE: /**** Next Page *****/
|
||||||
|
if (maxpos >= (PTR)(pagepos + screen)) {
|
||||||
|
pagepos += screen;
|
||||||
|
current += screen;
|
||||||
|
if (current - mem >= filesize) {
|
||||||
|
current = mem + filesize;
|
||||||
|
setpage((PTR)(mem + filesize - 1L));
|
||||||
|
}
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CTRL('G'):
|
||||||
|
fileinfo(name);
|
||||||
|
wrstat = 0;
|
||||||
|
break;
|
||||||
|
case CTRL('L'): /*** REDRAW SCREEN ***/
|
||||||
|
new_screen();
|
||||||
|
break;
|
||||||
|
case CTRL('Y'):
|
||||||
|
if (y < maxy) y++;
|
||||||
|
scrollup(1);
|
||||||
|
break;
|
||||||
|
case 'A': smsg("APPEND MODE");
|
||||||
|
current = (PTR)(mem + filesize - 1L);
|
||||||
|
setpage(current++);
|
||||||
|
cur_forw(0);
|
||||||
|
setcur();
|
||||||
|
undosize = filesize;
|
||||||
|
undo_count = edit(ch);
|
||||||
|
break;
|
||||||
|
case 'B':
|
||||||
|
case 'b': setpage(backsearch(current, ch));
|
||||||
|
break;
|
||||||
|
case 'e': setpage(end_word(current));
|
||||||
|
break;
|
||||||
|
case ',': do_ft(-1, 0);
|
||||||
|
break;
|
||||||
|
case ';': do_ft(0, 0);
|
||||||
|
break;
|
||||||
|
case 'F':
|
||||||
|
case 'f':
|
||||||
|
case 't':
|
||||||
|
case 'T': do_ft(ch, 0);
|
||||||
|
break;
|
||||||
|
case 'G': last_motion = current;
|
||||||
|
if (precount > -1) {
|
||||||
|
if ((precount < P(P_OF)) ||
|
||||||
|
(precount - P(P_OF)) > (filesize - 1L)) {
|
||||||
|
beep();
|
||||||
|
} else {
|
||||||
|
setpage((PTR)(mem + precount - P(P_OF)));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setpage((PTR)(mem + filesize - 1L));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'g': last_motion = current;
|
||||||
|
msg("Goto Hex Address: ");
|
||||||
|
refresh();
|
||||||
|
getcmdstr(cmdstr, 19);
|
||||||
|
if (cmdstr[0] == '^') {
|
||||||
|
inaddr = P(P_OF);
|
||||||
|
} else if (cmdstr[0] == '$') {
|
||||||
|
inaddr = filesize + P(P_OF) - 1L;
|
||||||
|
} else {
|
||||||
|
long ltmp;
|
||||||
|
sscanf(cmdstr, "%lx", <mp);
|
||||||
|
inaddr = (off_t)ltmp;
|
||||||
|
}
|
||||||
|
if (inaddr < P(P_OF)) break;
|
||||||
|
inaddr -= P(P_OF);
|
||||||
|
if (inaddr < filesize) {
|
||||||
|
setpage(mem + inaddr);
|
||||||
|
} else {
|
||||||
|
if (filesize == 0L) break;
|
||||||
|
sprintf(string, "Max. address of current file : %06lX",
|
||||||
|
(long)(filesize - 1L + P(P_OF)));
|
||||||
|
emsg(string);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
case '/': /**** Search String ****/
|
||||||
|
case '#':
|
||||||
|
case '\\': clearstr();
|
||||||
|
addch(ch);
|
||||||
|
refresh();
|
||||||
|
if (getcmdstr(line, 1)) break;
|
||||||
|
last_motion = current;
|
||||||
|
searching(ch, line, current, maxpos - 1, P(P_WS));
|
||||||
|
break;
|
||||||
|
case 'n': /**** Search Next ****/
|
||||||
|
case 'N': last_motion = current;
|
||||||
|
searching(ch, "", current, maxpos - 1, P(P_WS));
|
||||||
|
break;
|
||||||
|
case 'm': do_mark(vgetc(), current);
|
||||||
|
break;
|
||||||
|
case '\'':
|
||||||
|
case '`': if ((ch == '`' && loc == ASCII) ||
|
||||||
|
(ch == '\'' && loc == HEX))
|
||||||
|
toggle();
|
||||||
|
mark = vgetc();
|
||||||
|
if (mark == '`' || mark == '\'') {
|
||||||
|
setpage(last_motion);
|
||||||
|
last_motion = current;
|
||||||
|
} else {
|
||||||
|
if (mark < 'a' || mark > 'z') {
|
||||||
|
beep(); break;
|
||||||
|
} else if (markbuf[mark - 'a'] == NULL) {
|
||||||
|
beep(); break;
|
||||||
|
}
|
||||||
|
setpage(markbuf[mark - 'a']);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'D': if (precount < 1) precount = 1;
|
||||||
|
sprintf(rep_buf, "%ldD", precount);
|
||||||
|
trunc_cur();
|
||||||
|
break;
|
||||||
|
case 'o': /* overwrite: this is an overwriting put */
|
||||||
|
if (precount < 1) precount = 1;
|
||||||
|
sprintf(rep_buf, "%ldo", precount);
|
||||||
|
do_over(current, yanked, yank_buf);
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
if (precount < 1) precount = 1;
|
||||||
|
if ((undo_count = alloc_buf(yanked, &undo_buf)) == 0L)
|
||||||
|
break;
|
||||||
|
sprintf(rep_buf, "%ldP", precount);
|
||||||
|
if (do_append(yanked, yank_buf)) break;
|
||||||
|
/* we save it not for undo but for the dot command
|
||||||
|
memcpy(undo_buf, yank_buf, yanked);
|
||||||
|
*/
|
||||||
|
repaint();
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
case 'R': if (filesize == 0L) break;
|
||||||
|
sprintf(rep_buf, "%ld%c", precount, ch);
|
||||||
|
undo_count = edit(ch);
|
||||||
|
lflag++;
|
||||||
|
break;
|
||||||
|
case 'u': do_undo();
|
||||||
|
break;
|
||||||
|
case 'W':
|
||||||
|
case 'w': loc = ASCII;
|
||||||
|
setpage(wordsearch(current, ch));
|
||||||
|
break;
|
||||||
|
case 'y': count = range(ch);
|
||||||
|
if (count > 0) {
|
||||||
|
if ((yanked = alloc_buf(count, &yank_buf)) == 0L) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
memcpy(yank_buf, current, yanked);
|
||||||
|
} else if (count < 0) {
|
||||||
|
if ((yanked = alloc_buf(-count, &yank_buf)) == 0L) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
memcpy(yank_buf, current + count, yanked);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
sprintf(string, "%ld bytes yanked", labs(count));
|
||||||
|
msg(string);
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
case 'z': do_z(vgetc());
|
||||||
|
break;
|
||||||
|
case 'Z': if (vgetc() == 'Z') do_exit();
|
||||||
|
else beep();
|
||||||
|
break;
|
||||||
|
case '.':
|
||||||
|
if (!strlen(rep_buf)) {
|
||||||
|
beep();
|
||||||
|
} else {
|
||||||
|
stuffin(rep_buf);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
if P(P_MM) {
|
||||||
|
if (precount < 1) precount = 1;
|
||||||
|
switch (ch) {
|
||||||
|
case 'I':
|
||||||
|
sprintf(rep_buf, "%ldI", precount);
|
||||||
|
current = mem;
|
||||||
|
setpage(mem);
|
||||||
|
repaint();
|
||||||
|
undo_count = edit('i');
|
||||||
|
lflag++;
|
||||||
|
break;
|
||||||
|
/* undo does not work correctly !!! */
|
||||||
|
case 's':
|
||||||
|
sprintf(rep_buf, "%lds", precount);
|
||||||
|
if (do_delete((off_t)precount, current)) break;
|
||||||
|
precount = 1;
|
||||||
|
undo_count = edit('i');
|
||||||
|
lflag++;
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
if (cur_forw(1)) break;
|
||||||
|
current++;
|
||||||
|
case 'i':
|
||||||
|
sprintf(rep_buf, "%ld%c", precount, ch);
|
||||||
|
undo_count = edit(ch);
|
||||||
|
lflag++;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
sprintf(rep_buf, "%ldp", precount);
|
||||||
|
do_put(current, yanked, yank_buf);
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
case 'd':
|
||||||
|
count = range(ch);
|
||||||
|
if (count > 0)
|
||||||
|
do_delete((off_t)count, current);
|
||||||
|
else if (count < 0)
|
||||||
|
do_back(-count, current);
|
||||||
|
if (ch == 'c') {
|
||||||
|
precount = 1;
|
||||||
|
undo_count = edit('i');
|
||||||
|
lflag++;
|
||||||
|
/*
|
||||||
|
} else if (count) {
|
||||||
|
sprintf(string, "%ld bytes deleted", labs(count));
|
||||||
|
msg(string);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'x':
|
||||||
|
sprintf(rep_buf, "%ldx", precount);
|
||||||
|
do_delete((off_t)precount, current);
|
||||||
|
break;
|
||||||
|
case 'X':
|
||||||
|
sprintf(rep_buf, "%ldX", precount);
|
||||||
|
do_back(precount, current);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
flushinp();
|
||||||
|
beep();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (ch) {
|
||||||
|
case 'd':
|
||||||
|
case 'i':
|
||||||
|
case 'I':
|
||||||
|
case 'p':
|
||||||
|
case 'x':
|
||||||
|
case 'X':
|
||||||
|
movebyte();
|
||||||
|
default:
|
||||||
|
flushinp();
|
||||||
|
beep();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lflag) lineout();
|
||||||
|
} while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
off_t
|
||||||
|
calc_size(arg)
|
||||||
|
char *arg;
|
||||||
|
{
|
||||||
|
long val;
|
||||||
|
char *poi;
|
||||||
|
|
||||||
|
if (*arg == '0') {
|
||||||
|
val = strtol(arg, &poi, 16);
|
||||||
|
} else {
|
||||||
|
val = strtol(arg, &poi, 10);
|
||||||
|
}
|
||||||
|
switch (*poi) {
|
||||||
|
case 'k':
|
||||||
|
case 'K': val *= 1024;
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
case 'M': val *= 1048576;
|
||||||
|
break;
|
||||||
|
case '\0': break;
|
||||||
|
default: usage();
|
||||||
|
}
|
||||||
|
return (off_t)val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
trunc_cur()
|
||||||
|
{
|
||||||
|
undosize = filesize;
|
||||||
|
undo_count = (off_t)(maxpos - current);
|
||||||
|
undo_start = current;
|
||||||
|
filesize = pagepos - mem + y * Anzahl + xpos();
|
||||||
|
maxpos = (PTR)(mem + filesize);
|
||||||
|
if (filesize == 0L) {
|
||||||
|
emsg(nobytes);
|
||||||
|
} else cur_back();
|
||||||
|
edits = U_TRUNC;
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
do_append(count, buf)
|
||||||
|
int count;
|
||||||
|
char *buf;
|
||||||
|
{
|
||||||
|
if (filesize + count > memsize) {
|
||||||
|
if (enlarge(count + 100L)) return 1;
|
||||||
|
}
|
||||||
|
memcpy(mem + filesize, buf, count);
|
||||||
|
undo_start = mem + filesize - 1L;
|
||||||
|
setpage(undo_start + count);
|
||||||
|
edits = U_APPEND;
|
||||||
|
undosize = filesize;
|
||||||
|
filesize += count;
|
||||||
|
maxpos += count;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
do_tilde(count)
|
||||||
|
off_t count;
|
||||||
|
{
|
||||||
|
if (filesize == 0L) return;
|
||||||
|
undo_start = current;
|
||||||
|
if (current + count > maxpos) {
|
||||||
|
beep();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((undo_count = alloc_buf(count, &undo_buf)) == 0L)
|
||||||
|
return;
|
||||||
|
memcpy(undo_buf, current, undo_count);
|
||||||
|
while (count--) {
|
||||||
|
if (isupper((int)(*current))) *current = tolower((int)(*current));
|
||||||
|
else if (islower((int)(*current)))
|
||||||
|
*current = toupper((int)(*current));
|
||||||
|
current++;
|
||||||
|
cur_forw(0);
|
||||||
|
}
|
||||||
|
edits = U_TILDE;
|
||||||
|
setcur();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
do_undo()
|
||||||
|
{
|
||||||
|
off_t n, tempsize;
|
||||||
|
char temp;
|
||||||
|
PTR set_cursor;
|
||||||
|
PTR s;
|
||||||
|
PTR d;
|
||||||
|
|
||||||
|
if (undo_count == 0L) {
|
||||||
|
emsg("Nothing to undo");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
set_cursor = undo_start;
|
||||||
|
switch (edits) {
|
||||||
|
case U_EDIT:
|
||||||
|
case U_TILDE:
|
||||||
|
n = undo_count;
|
||||||
|
s = undo_buf;
|
||||||
|
d = undo_start;
|
||||||
|
while (n--) {
|
||||||
|
temp = *d;
|
||||||
|
*d = *s;
|
||||||
|
*s = temp;
|
||||||
|
s++; d++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case U_APPEND:
|
||||||
|
case U_TRUNC:
|
||||||
|
tempsize = filesize;
|
||||||
|
filesize = undosize;
|
||||||
|
undosize = tempsize;
|
||||||
|
maxpos = (PTR)(mem + filesize);
|
||||||
|
if (filesize)
|
||||||
|
set_cursor = maxpos - 1L;
|
||||||
|
else
|
||||||
|
set_cursor = maxpos;
|
||||||
|
break;
|
||||||
|
case U_INSERT:
|
||||||
|
filesize -= undo_count;
|
||||||
|
maxpos -= undo_count;
|
||||||
|
memcpy(undo_buf, undo_start, undo_count);
|
||||||
|
memmove(undo_start, undo_start + undo_count,
|
||||||
|
maxpos - undo_start);
|
||||||
|
edits = U_DELETE;
|
||||||
|
break;
|
||||||
|
case U_BACK:
|
||||||
|
case U_DELETE:
|
||||||
|
filesize += undo_count;
|
||||||
|
maxpos += undo_count;
|
||||||
|
memmove(undo_start + undo_count, undo_start,
|
||||||
|
maxpos - undo_start);
|
||||||
|
memcpy(undo_start, undo_buf, undo_count);
|
||||||
|
edits = U_INSERT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
setpage(set_cursor);
|
||||||
|
if (edits == U_TRUNC && undosize > filesize) cur_back();
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
do_over(loc, n, buf)
|
||||||
|
PTR loc;
|
||||||
|
off_t n;
|
||||||
|
PTR buf;
|
||||||
|
{
|
||||||
|
if (n < 1L) {
|
||||||
|
emsg(nobytes);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (loc + n > maxpos) {
|
||||||
|
beep();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((undo_count = alloc_buf(n, &undo_buf)) == 0L)
|
||||||
|
return;
|
||||||
|
undo_start = loc;
|
||||||
|
memcpy(undo_buf, loc, n);
|
||||||
|
memcpy(loc, buf, n);
|
||||||
|
edits = U_EDIT;
|
||||||
|
setpage(loc + n - 1);
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
do_put(loc, n, buf)
|
||||||
|
PTR loc;
|
||||||
|
off_t n;
|
||||||
|
PTR buf;
|
||||||
|
{
|
||||||
|
if (n < 1L) {
|
||||||
|
emsg(nobytes);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (loc > maxpos) {
|
||||||
|
beep();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (filesize + n > memsize) {
|
||||||
|
if (enlarge(n + 1024)) return;
|
||||||
|
}
|
||||||
|
if ((undo_count = alloc_buf(n, &undo_buf)) == 0L)
|
||||||
|
return;
|
||||||
|
undo_start = loc + 1;
|
||||||
|
edits = U_INSERT;
|
||||||
|
filesize += n;
|
||||||
|
maxpos += n;
|
||||||
|
memmove(undo_start + n, undo_start, maxpos - loc);
|
||||||
|
memcpy(undo_start, buf, n);
|
||||||
|
setpage(loc + n);
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* argument sig not used, because only SIGINT will be catched */
|
||||||
|
void
|
||||||
|
jmpproc(sig)
|
||||||
|
int sig;
|
||||||
|
{
|
||||||
|
if (P(P_EB)) beep();
|
||||||
|
repaint();
|
||||||
|
clearstr();
|
||||||
|
signal(SIGINT, SIG_IGN);
|
||||||
|
longjmp(env, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
off_t
|
||||||
|
range(ch)
|
||||||
|
int ch;
|
||||||
|
{
|
||||||
|
int ch1;
|
||||||
|
long count;
|
||||||
|
|
||||||
|
ch1 = vgetc();
|
||||||
|
while (ch1 >= '0' && ch1 <= '9') {
|
||||||
|
numarr[arrnum++] = ch1;
|
||||||
|
ch1 = vgetc();
|
||||||
|
}
|
||||||
|
numarr[arrnum] = '\0';
|
||||||
|
if (arrnum != 0) count = strtol(numarr, (char **)NULL, 10);
|
||||||
|
else count = 1;
|
||||||
|
arrnum = 0;
|
||||||
|
sprintf(rep_buf, "%ld%c%s%c", precount, ch, numarr, ch1);
|
||||||
|
switch (ch1) {
|
||||||
|
case '/': /**** Search String ****/
|
||||||
|
case '\\':
|
||||||
|
strcat(rep_buf, "\n");
|
||||||
|
clearstr();
|
||||||
|
addch(ch1);
|
||||||
|
refresh();
|
||||||
|
if (getcmdstr(line, 1)) break;
|
||||||
|
end_addr = searching(ch1, line, current, maxpos - 1, FALSE);
|
||||||
|
if (!end_addr) {
|
||||||
|
beep();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return(end_addr - current);
|
||||||
|
case '?':
|
||||||
|
case '#':
|
||||||
|
strcat(rep_buf, "\n");
|
||||||
|
clearstr();
|
||||||
|
addch(ch1);
|
||||||
|
refresh();
|
||||||
|
if (getcmdstr(line, 1)) break;
|
||||||
|
start_addr = searching(ch1, line, current, maxpos - 1, FALSE);
|
||||||
|
if (!start_addr) {
|
||||||
|
beep();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return(start_addr - current);
|
||||||
|
case 'f':
|
||||||
|
case 't':
|
||||||
|
precount = count;
|
||||||
|
end_addr = do_ft(ch1, 1);
|
||||||
|
if (!end_addr) {
|
||||||
|
beep();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (end_addr + 1 - current);
|
||||||
|
case 'F':
|
||||||
|
case 'T':
|
||||||
|
precount = count;
|
||||||
|
start_addr = do_ft(ch1, 1);
|
||||||
|
if (!start_addr) {
|
||||||
|
beep();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (start_addr - current);
|
||||||
|
case '$':
|
||||||
|
trunc_cur();
|
||||||
|
return 0;
|
||||||
|
case 'G':
|
||||||
|
if (count == -1) {
|
||||||
|
trunc_cur();
|
||||||
|
return 0;
|
||||||
|
} else if ((count < P(P_OF)) || (count
|
||||||
|
- (off_t)P(P_OF)) > (filesize - 1L)) {
|
||||||
|
beep();
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
if (mem + count < current) {
|
||||||
|
return(mem + count - current);
|
||||||
|
} else {
|
||||||
|
return(count - (current - mem));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case ' ':
|
||||||
|
return precount;
|
||||||
|
case '`':
|
||||||
|
case '\'':
|
||||||
|
mark = vgetc();
|
||||||
|
if (mark < 'a' || mark > 'z') {
|
||||||
|
beep();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
end_addr = markbuf[mark - 'a'];
|
||||||
|
if (end_addr == NULL) {
|
||||||
|
beep();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (end_addr < current) {
|
||||||
|
return(end_addr - current);
|
||||||
|
} else {
|
||||||
|
return(end_addr - current + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
beep();
|
||||||
|
return 0;
|
||||||
|
}
|
281
bvi.h
Normal file
281
bvi.h
Normal file
|
@ -0,0 +1,281 @@
|
||||||
|
/* BVI.H
|
||||||
|
*
|
||||||
|
* 1996-02-28 V 1.0.0
|
||||||
|
* 1999-01-21 V 1.1.0
|
||||||
|
* 1999-03-17 V 1.1.1
|
||||||
|
* 1999-07-01 V 1.2.0 beta
|
||||||
|
* 1999-08-21 V 1.2.0 final
|
||||||
|
* 2000-05-10 V 1.3.0 alpha
|
||||||
|
* 2000-10-24 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
|
#ifdef __MSDOS__
|
||||||
|
# include "patchlev.h"
|
||||||
|
# include "dosconf.h"
|
||||||
|
# include "doscur.h"
|
||||||
|
# include <alloc.h>
|
||||||
|
#else
|
||||||
|
# include "patchlevel.h"
|
||||||
|
# include "config.h"
|
||||||
|
#if HAVE_NCURSES_H
|
||||||
|
# include <ncurses.h>
|
||||||
|
#else
|
||||||
|
# include <curses.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* defines for filemode */
|
||||||
|
#define ERROR -1
|
||||||
|
#define REGULAR 0
|
||||||
|
#define NEW 1
|
||||||
|
#define DIRECTORY 2
|
||||||
|
#define CHARACTER_SPECIAL 3
|
||||||
|
#define BLOCK_SPECIAL 4
|
||||||
|
#define PARTIAL 5
|
||||||
|
|
||||||
|
/* regular expressions */
|
||||||
|
#define END 0
|
||||||
|
#define ONE 1
|
||||||
|
#define STAR 2
|
||||||
|
|
||||||
|
/* undo modes */
|
||||||
|
#define U_EDIT 1 /* undo o r R */
|
||||||
|
#define U_TRUNC 2 /* undo D */
|
||||||
|
#define U_INSERT 4 /* undo i */
|
||||||
|
#define U_DELETE 8 /* undo x */
|
||||||
|
#define U_BACK 16 /* undo X */
|
||||||
|
#define U_APPEND 32 /* undo P A */
|
||||||
|
#define U_TILDE 64 /* ~ */
|
||||||
|
|
||||||
|
#define S_GLOBAL 0x100
|
||||||
|
|
||||||
|
/* logic modes */
|
||||||
|
#define LSHIFT 1
|
||||||
|
#define RSHIFT 2
|
||||||
|
#define LROTATE 3
|
||||||
|
#define RROTATE 4
|
||||||
|
#define AND 5
|
||||||
|
#define OR 6
|
||||||
|
#define XOR 7
|
||||||
|
#define NEG 8
|
||||||
|
#define NOT 9
|
||||||
|
|
||||||
|
#define HEX 0
|
||||||
|
#define ASCII 1
|
||||||
|
#define FORWARD 0
|
||||||
|
#define BACKWARD 1
|
||||||
|
#define CR '\r'
|
||||||
|
#define NL '\n'
|
||||||
|
#define BS 8
|
||||||
|
#define ESC 27
|
||||||
|
#define SEARCH 0
|
||||||
|
#define REPLACE 1
|
||||||
|
#ifndef CTRL
|
||||||
|
# define CTRL(n) (n&0x1f)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CMDLNG(a,b) (len <= a && len >= b)
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
# define NULL ((void *)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
# define TRUE 1
|
||||||
|
# define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __MSDOS__
|
||||||
|
# define ANSI
|
||||||
|
# define PTR char huge *
|
||||||
|
# define off_t long
|
||||||
|
# define DELIM '\\'
|
||||||
|
# define strncasecmp strnicmp
|
||||||
|
# define strcasecmp stricmp
|
||||||
|
# define memcpy d_memcpy
|
||||||
|
# define memmove d_memmove
|
||||||
|
#else
|
||||||
|
# define PTR char *
|
||||||
|
# define DELIM '/'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MAXCMD 255
|
||||||
|
#define BUFFER 1024
|
||||||
|
|
||||||
|
#define SKIP_WHITE while(*cmd!='\0'&&isspace(*cmd))cmd++;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
extern FILE *debug_fp;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern char *version;
|
||||||
|
|
||||||
|
#ifdef NO_SYSERRL
|
||||||
|
extern char *sys_errlist[];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern char addr_form[];
|
||||||
|
extern char pattern[];
|
||||||
|
extern char rep_buf[];
|
||||||
|
extern int maxx, maxy, x, y;
|
||||||
|
extern int filemode, loc;
|
||||||
|
extern int edits, new;
|
||||||
|
extern int AnzAdd;
|
||||||
|
extern int Anzahl, Anzahl3;
|
||||||
|
extern int addr_flag;
|
||||||
|
extern int ignore_case, magic;
|
||||||
|
extern int screen, status;
|
||||||
|
extern PTR mem;
|
||||||
|
extern PTR maxpos;
|
||||||
|
extern PTR pagepos;
|
||||||
|
extern PTR undo_start;
|
||||||
|
extern PTR current_start;
|
||||||
|
extern PTR curpos;
|
||||||
|
extern PTR current;
|
||||||
|
extern PTR start_addr;
|
||||||
|
extern PTR end_addr;
|
||||||
|
extern char *name, cmdstr[];
|
||||||
|
extern off_t filesize, memsize;
|
||||||
|
extern PTR markbuf[];
|
||||||
|
extern PTR last_motion;
|
||||||
|
extern off_t undo_count;
|
||||||
|
extern off_t yanked;
|
||||||
|
extern off_t undosize;
|
||||||
|
extern char *copyright, *notfound;
|
||||||
|
extern char *terminal;
|
||||||
|
extern char *undo_buf;
|
||||||
|
extern char *yank_buf;
|
||||||
|
extern int repl_count;
|
||||||
|
extern char string[];
|
||||||
|
extern char *shell;
|
||||||
|
extern char *poi;
|
||||||
|
extern int smode;
|
||||||
|
extern int again;
|
||||||
|
extern int block_flag;
|
||||||
|
extern off_t block_begin, block_end, block_size;
|
||||||
|
|
||||||
|
#ifndef S_ISDIR /* POSIX 1003.1 file type tests. */
|
||||||
|
#define S_ISDIR(m) ((m & 0170000) == 0040000) /* directory */
|
||||||
|
#define S_ISCHR(m) ((m & 0170000) == 0020000) /* char special */
|
||||||
|
#define S_ISBLK(m) ((m & 0170000) == 0060000) /* block special */
|
||||||
|
#define S_ISREG(m) ((m & 0170000) == 0100000) /* regular file */
|
||||||
|
#define S_ISFIFO(m) ((m & 0170000) == 0010000) /* fifo */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __MSDOS__
|
||||||
|
void d_memcpy(PTR, PTR, off_t);
|
||||||
|
void d_memmove(PTR, PTR, off_t);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ANSI
|
||||||
|
off_t alloc_buf(off_t, char **), yd_addr(void);
|
||||||
|
off_t range(int);
|
||||||
|
void do_dot(void), do_exit(void), do_shell(void), do_undo(void);
|
||||||
|
void do_tilde(off_t), trunc_cur(void);
|
||||||
|
void do_back(off_t, PTR), do_ins_chg(PTR, char *, int);
|
||||||
|
void do_mark(int, PTR), badcmd(char *), movebyte(void);
|
||||||
|
void docmdline(char *), do_over(PTR, off_t, PTR), do_put(PTR, off_t, PTR);
|
||||||
|
void jmpproc(int), printline(PTR, int);
|
||||||
|
int addfile(char *);
|
||||||
|
int bregexec(PTR, char *);
|
||||||
|
int chk_comm(int);
|
||||||
|
int doecmd(char *, int);
|
||||||
|
int do_append(int, char *), do_logic(int, char *);
|
||||||
|
int do_delete(off_t, PTR);
|
||||||
|
int doset(char *);
|
||||||
|
int do_substitution(int, char *, PTR, PTR);
|
||||||
|
int hexchar(void);
|
||||||
|
int outmsg(char *);
|
||||||
|
PTR searching(int, char *, PTR, PTR, int);
|
||||||
|
PTR wordsearch(PTR, char);
|
||||||
|
PTR backsearch(PTR, char);
|
||||||
|
PTR fsearch(PTR, PTR, char *);
|
||||||
|
PTR rsearch(PTR, PTR, char *);
|
||||||
|
PTR end_word(PTR);
|
||||||
|
PTR calc_addr(char **, PTR);
|
||||||
|
PTR do_ft(int, int);
|
||||||
|
char *patcpy(char *, char *, char);
|
||||||
|
void setpage(PTR), msg(char *), emsg(char *), smsg(char *);
|
||||||
|
void usage(void), bvi_init(char *), statpos(void), setcur(void);
|
||||||
|
void showparms(int), toggle(void), scrolldown(int), scrollup(int);
|
||||||
|
void fileinfo(char *);
|
||||||
|
void clearstr(void), clear_marks(void), repaint(void), new_screen(void);
|
||||||
|
void quit(void), sysemsg(char *), do_z(int), stuffin(char *);
|
||||||
|
off_t edit(int), load(char *);
|
||||||
|
off_t calc_size(char *);
|
||||||
|
int ascii_comp(char *, char *), hex_comp(char *, char *);
|
||||||
|
int cur_forw(int), cur_back(void);
|
||||||
|
int lineout(void), save(char *, PTR, PTR, int);
|
||||||
|
int at_least(char *, char *, int);
|
||||||
|
int vgetc(void), xpos(void), enlarge(off_t);
|
||||||
|
int getcmdstr(char *, int), read_rc(char *);
|
||||||
|
int wait_return(int);
|
||||||
|
#else
|
||||||
|
int addfile();
|
||||||
|
off_t alloc_buf(), yd_addr();
|
||||||
|
off_t range();
|
||||||
|
off_t calc_size();
|
||||||
|
void do_mark(), badcmd(), movebyte();
|
||||||
|
void do_back(), do_ins_chg();
|
||||||
|
void jmpproc(), printline();
|
||||||
|
int chk_comm();
|
||||||
|
void docmdline(), do_over(), do_put();
|
||||||
|
int doecmd();
|
||||||
|
void do_dot(), do_exit(), do_shell(), do_undo();
|
||||||
|
void do_tilde(), trunc_cur();
|
||||||
|
int do_append(), do_logic();
|
||||||
|
int do_delete();
|
||||||
|
int doset();
|
||||||
|
int do_substitution();
|
||||||
|
int hexchar();
|
||||||
|
int outmsg();
|
||||||
|
PTR searching();
|
||||||
|
PTR wordsearch();
|
||||||
|
PTR backsearch();
|
||||||
|
int bregexec();
|
||||||
|
PTR fsearch();
|
||||||
|
PTR rsearch();
|
||||||
|
PTR end_word();
|
||||||
|
PTR calc_addr();
|
||||||
|
PTR do_ft();
|
||||||
|
char *patcpy();
|
||||||
|
void setpage(), msg(), emsg(), smsg();
|
||||||
|
void usage(), bvi_init(), statpos(), setcur();
|
||||||
|
void showparms(), toggle(), scrolldown(), scrollup();
|
||||||
|
void fileinfo();
|
||||||
|
void clearstr(), clear_marks(), new_screen(), repaint();
|
||||||
|
void quit(), sysemsg(), do_z(), stuffin();
|
||||||
|
off_t edit(), load();
|
||||||
|
int ascii_comp(), hex_comp();
|
||||||
|
int cur_forw(), cur_back();
|
||||||
|
int lineout(), save(), at_least(), read_rc();
|
||||||
|
int getcmdstr(), enlarge();
|
||||||
|
int vgetc(), xpos();
|
||||||
|
int wait_return();
|
||||||
|
#endif
|
404
bvi.man
Normal file
404
bvi.man
Normal file
|
@ -0,0 +1,404 @@
|
||||||
|
BVI(1) User Commands BVI(1)
|
||||||
|
|
||||||
|
|
||||||
|
NAME
|
||||||
|
bvi, bview - visual display editor for binary files
|
||||||
|
|
||||||
|
VERSION
|
||||||
|
bvi-1.2.0
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
bvi [-R] [-c cmd] [-f script] file...
|
||||||
|
bview [-R] [-c cmd] [-f script] file...
|
||||||
|
|
||||||
|
OPTIONS
|
||||||
|
file...
|
||||||
|
One or more files. The file argument indicates one or
|
||||||
|
more files to be edited.
|
||||||
|
|
||||||
|
-R "Readonly": The readonly flag is set for all the
|
||||||
|
files, preventing accidental overwriting with a write
|
||||||
|
command.
|
||||||
|
|
||||||
|
-c cmd
|
||||||
|
Execute command cmd. Begin editing by executing the
|
||||||
|
specified editor command (usually a search or
|
||||||
|
positioning command).
|
||||||
|
|
||||||
|
-f script
|
||||||
|
This command provides a means for collecting a series
|
||||||
|
of "ex" (colon) commands into a script file, then
|
||||||
|
using this file to edit other files. Since there is no
|
||||||
|
binary stream editor "bsed", you can use this option
|
||||||
|
to make several global changes in a binary file.
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Bvi stands for "Binary VIsual editor". Bvi is a display
|
||||||
|
oriented editor for binary files; its command set is based
|
||||||
|
on those of the vi(1) texteditor. As a binary editor
|
||||||
|
cannot have the concept of "lines" there are several
|
||||||
|
differences to Vi commands (see COMPARISON).
|
||||||
|
|
||||||
|
COMPARISON
|
||||||
|
The main differences between Vi and Bvi are:
|
||||||
|
|
||||||
|
The screen is divided in three sections/windows: The byte
|
||||||
|
offset (at the left side), the hex window (in the middle),
|
||||||
|
and the ascii window (to the right) which shows the ascii
|
||||||
|
values of those bytes in the hex window. On an 80 column
|
||||||
|
terminal you will therefore see sixteen hex values and
|
||||||
|
their ASCII values on each screen line. Note that the
|
||||||
|
first byte has the offset '0' (zero).
|
||||||
|
|
||||||
|
You can toggle between the hex and ascii windows with the
|
||||||
|
tabulator key (TAB). Toggling between these two windows
|
||||||
|
does not change the current position within the file.
|
||||||
|
|
||||||
|
No "lines" concept: Files are treated as one long series
|
||||||
|
of bytes only. These characters "newline" and "carriage
|
||||||
|
return" thus are not special, ie they do not mark the end
|
||||||
|
of lines. Therefore the lines on the screen do not
|
||||||
|
represent lines in the usual way. Data is broken across
|
||||||
|
screen lines as they happen to fit in. As a consequence
|
||||||
|
there are no commands in bvi from ex or vi that are based
|
||||||
|
on line numbers, eg "dd", "yy", 'C', 'S', 'o', 'O'. This
|
||||||
|
also changes the meaning of "range" before the ":write"
|
||||||
|
command to a byte offset, ie the command ":100,200w foo"
|
||||||
|
writes all *bytes* (not lines) from offset 100 to offset
|
||||||
|
200 to the file "foo".
|
||||||
|
|
||||||
|
No "text objects": There are also no text-specific
|
||||||
|
arrangements like words, paragraphs, sentences, sections
|
||||||
|
and so on.
|
||||||
|
|
||||||
|
Extended "ruler": The bottom line of the screen shows the
|
||||||
|
current address (byte offset) and the current character in
|
||||||
|
these notations:
|
||||||
|
|
||||||
|
octal, hexadecimal, decimal and ascii.
|
||||||
|
|
||||||
|
Search patterns: All search commands understand these
|
||||||
|
special characters:
|
||||||
|
|
||||||
|
. any character
|
||||||
|
[] set of characters
|
||||||
|
* zero or more occurrences of previous char or set
|
||||||
|
|
||||||
|
But as there is no concept of lines you cannot use the
|
||||||
|
standard symbols ("anchors") for "begin-of-line" ('^') and
|
||||||
|
"end-of-line" ('$'). Searching for the start/end of lines
|
||||||
|
must be done explicitly by adding these special characters
|
||||||
|
to your search pattern using these meta sequences:
|
||||||
|
|
||||||
|
\n newline
|
||||||
|
\r return
|
||||||
|
\t tab
|
||||||
|
\0 binary zero
|
||||||
|
|
||||||
|
Additional search commands: Similar to the text search
|
||||||
|
commands there are additional hex-search functions '\' and
|
||||||
|
'#' which allow to search for any byte value. Example:
|
||||||
|
"\62 76 69" will search for the string "bvi". Spaces
|
||||||
|
between hex value are optional, so searching for
|
||||||
|
"6775636B6573" will find "guckes".
|
||||||
|
|
||||||
|
Changing data (insertion, deletion) moves the data to
|
||||||
|
other addresses; this is bad for many cases (eg.
|
||||||
|
databases, program files) and is thus disabled by default.
|
||||||
|
You can enable this commands by typing
|
||||||
|
|
||||||
|
:set memmove
|
||||||
|
|
||||||
|
BVI Modes:
|
||||||
|
|
||||||
|
Command Mode aka Normal Mode:
|
||||||
|
|
||||||
|
Input is treated as commands. Note that command mode is
|
||||||
|
the default mode after startup and when you escape/quit
|
||||||
|
from either command line mode or input mode. Use ESC
|
||||||
|
(escape) to cancel a partial (uncompleted) command.
|
||||||
|
|
||||||
|
Input Mode:
|
||||||
|
|
||||||
|
Input is treated as replacement of current character or is
|
||||||
|
appended to the current file. This mode is entered from
|
||||||
|
command mode by typing either of 'i', 'I', 'A', 'r', or
|
||||||
|
'R'. You can enter the character itself (in the ASCII
|
||||||
|
window) or its hexadecimal value (in the HEX window).
|
||||||
|
Type TAB to switch between these two windows. Type ESC to
|
||||||
|
cancel current command and return to command mode. Type
|
||||||
|
CTRL-C to cancel current command abnormally.
|
||||||
|
|
||||||
|
Command line mode (aka Last Line Mode):
|
||||||
|
|
||||||
|
Reading input for : / ? \ # or !; terminate by typing a
|
||||||
|
carriage return; an interrupt cancels termination. Type
|
||||||
|
ESC to cancel current command and return to command mode.
|
||||||
|
|
||||||
|
ENVIRONMENT
|
||||||
|
The editor recognizes the environment variable BVIINIT as
|
||||||
|
a command (or list of commands) to run when it starts
|
||||||
|
up. If this variable is undefined, the editor checks for
|
||||||
|
startup commands in the file ~/.bvirc file, which you
|
||||||
|
must own. However, if there is a .bvirc owned by you in
|
||||||
|
the current directory, the editor takes its startup
|
||||||
|
commands from this file - overriding both the file in your
|
||||||
|
home directory and the environment variable.
|
||||||
|
|
||||||
|
TERMINOLOGY
|
||||||
|
Characters names are abbreviated as follows:
|
||||||
|
Abbr. ASCII name aka
|
||||||
|
CR 010 carriage return
|
||||||
|
^A 001 control-a
|
||||||
|
^H 008 control-h
|
||||||
|
^I 009 control-i aka TAB
|
||||||
|
^U 021 control-u
|
||||||
|
^Z 026 control-z
|
||||||
|
ESC 027 escape aka ESC
|
||||||
|
DEL 127 delete
|
||||||
|
LEFT --- left arrow
|
||||||
|
RIGHT --- right arrow
|
||||||
|
DOWN --- down arrow
|
||||||
|
UP --- up arrow
|
||||||
|
|
||||||
|
COMMAND SUMMARY
|
||||||
|
See the TERMINOLOGY for a summary on key name
|
||||||
|
abbreviations used within the following description of
|
||||||
|
commands.
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
Arrow keys move the cursor on the screen within the
|
||||||
|
current window.
|
||||||
|
|
||||||
|
Sample commands:
|
||||||
|
:version show version info
|
||||||
|
<- v ^ -> arrow keys move the cursor
|
||||||
|
h j k l same as arrow keys
|
||||||
|
u undo previous change
|
||||||
|
ZZ exit bvi, saving changes
|
||||||
|
:q! quit, discarding changes
|
||||||
|
/text search for text
|
||||||
|
^U ^D scroll up or down
|
||||||
|
|
||||||
|
Counts before bvi commands:
|
||||||
|
Numbers may be typed as a prefix to some commands.
|
||||||
|
They are interpreted in one of these ways.
|
||||||
|
|
||||||
|
screen column |
|
||||||
|
byte of file G
|
||||||
|
scroll amount ^D ^U
|
||||||
|
repeat effect most of the rest
|
||||||
|
|
||||||
|
Interrupting, canceling
|
||||||
|
ESC end insert or incomplete command
|
||||||
|
DEL (delete or rubout) interrupts
|
||||||
|
|
||||||
|
File manipulation:
|
||||||
|
ZZ if file modified, write and exit;
|
||||||
|
otherwise, exit
|
||||||
|
:w write changed buffer to file
|
||||||
|
:w! write changed buffer to file, overriding
|
||||||
|
read-only ("forced" write)
|
||||||
|
:q quit when no changes have been made
|
||||||
|
:q! quit and discard all changes
|
||||||
|
:e file edit file
|
||||||
|
:e! reedit current file, discard all changes
|
||||||
|
:e # edit the alternate file
|
||||||
|
:e! # edit the alternate file, discard changes
|
||||||
|
:w file write current buffer to file
|
||||||
|
:w! file write current buffer to file overriding
|
||||||
|
read-only (this "overwrites" the file)
|
||||||
|
:sh run the command as set with option "shell",
|
||||||
|
then return
|
||||||
|
:!cmd run the command cmd from "shell", then
|
||||||
|
return
|
||||||
|
:n edit next file in the argument list
|
||||||
|
:f show current filename, modified flag,
|
||||||
|
current byte offset, and percentage of
|
||||||
|
current position within buffer
|
||||||
|
^G same as :f
|
||||||
|
|
||||||
|
Additional edit commands
|
||||||
|
You can insert/append/change bytes in
|
||||||
|
ASCII/binary/decimal/ hexadecimal or octal representation.
|
||||||
|
You can enter several (screen) lines of input. A line with
|
||||||
|
only a period (.) in it will terminate the command. You
|
||||||
|
must not type in values greater than a byte value. This
|
||||||
|
causes an abandom of the command. Pressing the CR key
|
||||||
|
does not insert a newline - character into the file. If
|
||||||
|
you use ASCII mode you can use the special characters \n,
|
||||||
|
\r, \t and \0.
|
||||||
|
|
||||||
|
:i aCR insert bytes (ASCII) at cursor position
|
||||||
|
:a bCR append bytes (Binary) at end of file
|
||||||
|
:c hCR change bytes (hexadecimal) at cursor position
|
||||||
|
|
||||||
|
Bit-level operations
|
||||||
|
:and n bitwise 'and' operation with value n
|
||||||
|
:or n bitwise 'or' operation with value n
|
||||||
|
:xor n bitwise 'xor' operation with value n
|
||||||
|
:neg two's complement
|
||||||
|
:not logical negation
|
||||||
|
:sl i shift each byte i bits to the left
|
||||||
|
:sr i shift each byte i bits to the right
|
||||||
|
:rl i rotate each byte i bits to the left
|
||||||
|
:rr i rotate each byte i bits to the right
|
||||||
|
|
||||||
|
Command mode addresses
|
||||||
|
:w foo write current buffer to a file
|
||||||
|
named "foo"
|
||||||
|
:5,10w foo copy byte 5 through 100 into as
|
||||||
|
file named foo
|
||||||
|
:.,.+20w foo copy the current byte and the next
|
||||||
|
20 bytes to foo
|
||||||
|
:^,'aw foo write all bytes from the beginning
|
||||||
|
through marker 'a'
|
||||||
|
:/pat/,$ foo search pattern pat and and copy
|
||||||
|
through end of file
|
||||||
|
|
||||||
|
Positioning within file:
|
||||||
|
^B backward screen
|
||||||
|
^F forward screen
|
||||||
|
^D scroll down half screen
|
||||||
|
^U scroll up half screen
|
||||||
|
nG go to the specified character
|
||||||
|
(end default), where n is a decimal address
|
||||||
|
/pat next line matching pat
|
||||||
|
?pat previous line matching pat
|
||||||
|
\hex jump to next occurrence of hex string hex
|
||||||
|
#hex jump to previous occurrence of hex string hex
|
||||||
|
n repeat last search command
|
||||||
|
N repeat last search command, but in opposite
|
||||||
|
direction
|
||||||
|
|
||||||
|
Adjusting the screen:
|
||||||
|
^L clear and redraw screen
|
||||||
|
zCR redraw screen with current line at top of screen
|
||||||
|
z- redraw screen with current line at bottom of
|
||||||
|
screen
|
||||||
|
z. redraw screen with current line at center of
|
||||||
|
screen
|
||||||
|
/pat/z- search for pattern pat and then move currents
|
||||||
|
line to bottom
|
||||||
|
^E scroll screen down 1 line
|
||||||
|
^Y scroll screen up 1 line
|
||||||
|
|
||||||
|
Marking and returning:
|
||||||
|
mx mark current position with lower-case letter x
|
||||||
|
Note: this command works for all lower-case
|
||||||
|
letters
|
||||||
|
'x move cursor to mark x in ASCII section
|
||||||
|
`x move cursor to mark x in HEX section
|
||||||
|
'' move cursor to previous context in ASCII section
|
||||||
|
`` move cursor to previous context in HEX section
|
||||||
|
|
||||||
|
Line positioning:
|
||||||
|
H jump to first line on screen ("top")
|
||||||
|
L jump to last line on screen ("low")
|
||||||
|
M jump to middle line on screen ("middle")
|
||||||
|
- jump onto previous line on screen
|
||||||
|
+ jump onto next line on screen
|
||||||
|
CR same as +
|
||||||
|
DOWN or j next line, same column
|
||||||
|
UP or k previous line, same column
|
||||||
|
|
||||||
|
Character positioning:
|
||||||
|
^ first byte in HEX window
|
||||||
|
$ end of screen line
|
||||||
|
l or RIGHT jump onto next byte (within current
|
||||||
|
screen line)
|
||||||
|
h or LEFT jump onto previous byte (within current
|
||||||
|
screen line)
|
||||||
|
^H same as LEFT
|
||||||
|
space same as RIGHT
|
||||||
|
fx find next occurrence of character x
|
||||||
|
Fx find previous occurrence of character x
|
||||||
|
n| jump onto nth byte/character within current
|
||||||
|
line
|
||||||
|
|
||||||
|
Strings:
|
||||||
|
(works similar to the strings(1) command)
|
||||||
|
Note: "Words" are defined as strings of "nonprinting
|
||||||
|
characters".
|
||||||
|
e jump to next end of word
|
||||||
|
w jump to next begin of word
|
||||||
|
b jump to previous begin of word
|
||||||
|
W forward to next string delimited with a
|
||||||
|
\0 or \n
|
||||||
|
B back to previous string delimited with a
|
||||||
|
nonprinting char
|
||||||
|
|
||||||
|
Corrections during insert:
|
||||||
|
^H erase last character (backspace)
|
||||||
|
erase your erase character, same as ^H (backspace)
|
||||||
|
ESC ends insertion, back to command mode
|
||||||
|
|
||||||
|
Append and replace:
|
||||||
|
A append at end of file
|
||||||
|
rx replace current bte with char 'x'
|
||||||
|
R enter replace mode; for all subsequent input,
|
||||||
|
the current byte is overwritten with the next
|
||||||
|
input character; leave replace mode with ESC.
|
||||||
|
|
||||||
|
Miscellaneous Operations:
|
||||||
|
TAB toggle between ASCII and HEX section
|
||||||
|
|
||||||
|
Yank and Put:
|
||||||
|
3ySPACE yank 3 characters
|
||||||
|
p insert contents of yank buffer
|
||||||
|
o replace text with content of yank buffer
|
||||||
|
P put back at end of file
|
||||||
|
|
||||||
|
Undo, Redo:
|
||||||
|
u undo last change
|
||||||
|
Note: Only the last change can be undone.
|
||||||
|
Therefore this commands toggles between the
|
||||||
|
last and second-t-last state of the buffer.
|
||||||
|
|
||||||
|
Setting Options:
|
||||||
|
With the :set command you can set options in bvi
|
||||||
|
|
||||||
|
Option Default Description
|
||||||
|
|
||||||
|
autowrite noaw Save current file, if modified, if you
|
||||||
|
give a :n, :r or ! command
|
||||||
|
columns cm=16 on an 80 character wide terminal
|
||||||
|
ignorecase noic Ignores letter case in searching
|
||||||
|
magic nomagic Makes . [ * special in patterns
|
||||||
|
memmove nomm enables insert and delete commands
|
||||||
|
offset of=0 adds an offset to the diplayed addresses
|
||||||
|
readonly noro If set, write fails unless you use ! after command
|
||||||
|
scroll sc=1/2 window
|
||||||
|
Number of lines scrolled by ^U and ^D
|
||||||
|
showmode mo Displays statusline on bottom of the screen
|
||||||
|
terse noterse Let you obtain shorter error messages
|
||||||
|
window window=screensize
|
||||||
|
Lines in window, can be reduced at slow terminals
|
||||||
|
wordlength wl=4 Length of an ASCII-string found by w, W, b or B
|
||||||
|
wrapscan ws Searches wrap around past the end of the file
|
||||||
|
unixstyle nous The representation of ascii characters below
|
||||||
|
32 is displayed in the statusline as shown
|
||||||
|
in ascii(7) if unset rather in DOS-style (^A)
|
||||||
|
|
||||||
|
AUTHOR
|
||||||
|
bvi was developed by Gerhard Buergmann, Vienna, Austria
|
||||||
|
Gerhard.Buergmann@altavista.net
|
||||||
|
|
||||||
|
WWW
|
||||||
|
Bvi Homepage: http://bvi.linuxave.net/
|
||||||
|
Vi Pages: http://www.math.fu-berlin.de/~guckes/vi/
|
||||||
|
(all about Vi and its clones)
|
||||||
|
|
||||||
|
FILES
|
||||||
|
$HOME/.bvirc editor startup file
|
||||||
|
./.bvirc editor startup file
|
||||||
|
|
||||||
|
BUGS
|
||||||
|
Bvi does not update the screen when the terminal changes
|
||||||
|
its size.
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
vi(1), strings(1), ascii(5)
|
||||||
|
|
||||||
|
|
||||||
|
31/Oct/99 BVI Version 1.2.0 8
|
828
comm.c
Normal file
828
comm.c
Normal file
|
@ -0,0 +1,828 @@
|
||||||
|
/* COMM.C - Routines to parse and execute "command line" commands, such as
|
||||||
|
* search or colon commands.
|
||||||
|
*
|
||||||
|
* 1996-01-16 created;
|
||||||
|
* 1998-03-14 V 1.0.1
|
||||||
|
* 1999-02-03 V 1.1.0
|
||||||
|
* 1999-06-22 V 1.2.0 beta
|
||||||
|
* 1999-09-10 V 1.2.0 final
|
||||||
|
* 2000-03-03 V 1.3.0 beta
|
||||||
|
* 2000-07-15 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bvi.h"
|
||||||
|
#include "set.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_FCNTL_H
|
||||||
|
# include <fcntl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __MSDOS__
|
||||||
|
# include <io.h>
|
||||||
|
# include <dir.h>
|
||||||
|
# define WRITE (O_WRONLY|O_CREAT|O_TRUNC|O_BINARY)
|
||||||
|
# define APPEND (O_WRONLY|O_APPEND|O_BINARY)
|
||||||
|
#else
|
||||||
|
# define WRITE (O_WRONLY|O_CREAT|O_TRUNC)
|
||||||
|
# define APPEND (O_WRONLY|O_APPEND)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CMDSZ 256 /* size of the command buffer */
|
||||||
|
#define MAXNAME 10 /* size of a : command name */
|
||||||
|
|
||||||
|
#define NO_ADDR 1
|
||||||
|
#define NO_ARG 8
|
||||||
|
#define ONE_ARG 16
|
||||||
|
#define MAX_ONE_ARG 32
|
||||||
|
#define ONE_FILE 64
|
||||||
|
#define MAX_ONE_FILE 128
|
||||||
|
|
||||||
|
static char *altfile = NULL; /* alternate file */
|
||||||
|
static struct stat buf;
|
||||||
|
static int c_argc = 0;
|
||||||
|
static char *c_argv[9];
|
||||||
|
|
||||||
|
char *nowrtmsg = "No write@since last change (:%s! overrides)";
|
||||||
|
char *morefiles = "more files@to edit";
|
||||||
|
char *ambigous = "Ambigous|Too many file names";
|
||||||
|
char *ambvalue = "Ambigous|Too many values";
|
||||||
|
char *extra = "Extra chars|Extra characters at end of command";
|
||||||
|
char *noaddr = "No address allowed@on this command";
|
||||||
|
char *noval = "No value@for binary operation";
|
||||||
|
int repl_count = -1;
|
||||||
|
int addr_flag;
|
||||||
|
|
||||||
|
PTR start_addr;
|
||||||
|
PTR end_addr;
|
||||||
|
|
||||||
|
extern char *name; /* actual filename */
|
||||||
|
extern char **files; /* used for "next" and "rewind" */
|
||||||
|
extern int numfiles, curfile;
|
||||||
|
extern int errno;
|
||||||
|
|
||||||
|
static char oldbuf[CMDSZ]; /** for :!! command **/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* docmdline() - handle a colon command
|
||||||
|
*
|
||||||
|
* Handles a colon command received interactively by getcmdln() or from
|
||||||
|
* the environment variable "BVIINIT" (or eventually .bvirc).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
docmdline(cmdline)
|
||||||
|
char *cmdline;
|
||||||
|
{
|
||||||
|
char buff[CMDSZ];
|
||||||
|
char cmdbuf[CMDSZ];
|
||||||
|
char cmdname[MAXNAME];
|
||||||
|
char *cmd;
|
||||||
|
char *p;
|
||||||
|
size_t len;
|
||||||
|
int n, ok;
|
||||||
|
int force = 0;
|
||||||
|
int saveflag;
|
||||||
|
|
||||||
|
if (cmdline == NULL) return;
|
||||||
|
if (*cmdline == '"') return; /** comment **/
|
||||||
|
if (strlen(cmdline) > CMDSZ - 2) {
|
||||||
|
emsg("Command too long");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
strcpy(buff, cmdline);
|
||||||
|
cmd = buff;
|
||||||
|
|
||||||
|
/* With no address given, we start at the beginning of the file and
|
||||||
|
* go to the end of the file (not line like in vi).
|
||||||
|
*/
|
||||||
|
addr_flag = 0;
|
||||||
|
start_addr = mem;
|
||||||
|
end_addr = maxpos - 1;
|
||||||
|
SKIP_WHITE
|
||||||
|
if (*cmd == '%') {
|
||||||
|
cmd++;
|
||||||
|
addr_flag = 2;
|
||||||
|
} else {
|
||||||
|
if ((start_addr = calc_addr(&cmd, mem)) == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (*cmd == ',') {
|
||||||
|
cmd++;
|
||||||
|
addr_flag = 1;
|
||||||
|
SKIP_WHITE
|
||||||
|
if ((end_addr = calc_addr(&cmd, maxpos - 1)) == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (addr_flag) {
|
||||||
|
/* if we have only one address */
|
||||||
|
end_addr = start_addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SKIP_WHITE
|
||||||
|
|
||||||
|
if (start_addr > (end_addr + 1)) {
|
||||||
|
emsg("Addr1 > addr2|First address exceeds second");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((end_addr + 1) > maxpos) {
|
||||||
|
emsg("Not that many bytes@in buffer");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (start_addr < mem) {
|
||||||
|
sprintf(string, "Negative address@- first byte is %ld", P(P_OF));
|
||||||
|
emsg(string);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SKIP_WHITE
|
||||||
|
|
||||||
|
/**** End of address range calculation ****/
|
||||||
|
|
||||||
|
if (*cmd == '\0') {
|
||||||
|
setpage(end_addr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
strcpy(cmdbuf, cmd); /* save the unmodified command */
|
||||||
|
|
||||||
|
if (*cmd == '!') {
|
||||||
|
if (*(cmdbuf + 1) == '\0') {
|
||||||
|
emsg("Incomplete shell escape command@- use 'shell' to get a shell");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (*(cmdbuf + 1) == '!') {
|
||||||
|
if (oldbuf[0] != '\0') {
|
||||||
|
strcpy(cmdbuf + 1, oldbuf);
|
||||||
|
msg(oldbuf);
|
||||||
|
} else {
|
||||||
|
emsg("No previous command@to substitute for !");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else sprintf(oldbuf, "\n%s\n", cmdbuf + 1);
|
||||||
|
|
||||||
|
if (P(P_AW)) {
|
||||||
|
save(name, mem, maxpos, WRITE);
|
||||||
|
edits = 0;
|
||||||
|
}
|
||||||
|
if (edits) msg("[No write]|[No write since last change]");
|
||||||
|
savetty();
|
||||||
|
endwin();
|
||||||
|
system(cmdbuf + 1);
|
||||||
|
fprintf(stderr, "[Hit return to continue]");
|
||||||
|
getchar();
|
||||||
|
doupdate();
|
||||||
|
repaint();
|
||||||
|
clearstr();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
n = 0;
|
||||||
|
while (*cmd >= 'a' && *cmd <= 'z') {
|
||||||
|
cmdname[n++] = *cmd++;
|
||||||
|
if (n == MAXNAME) {
|
||||||
|
sprintf(string, "What?|%s: Not an editor command", cmdbuf);
|
||||||
|
emsg(string);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cmdname[n] = '\0';
|
||||||
|
if (*cmd == '!') {
|
||||||
|
force = 1;
|
||||||
|
cmd++;
|
||||||
|
}
|
||||||
|
len = strlen(cmdname);
|
||||||
|
SKIP_WHITE
|
||||||
|
|
||||||
|
if (!strncmp("substitute", cmdname, len) && CMDLNG(10,1)) {
|
||||||
|
repl_count = do_substitution(*cmd, cmd + 1, start_addr, end_addr);
|
||||||
|
if (repl_count == -1) {
|
||||||
|
emsg("No previous substitute re|No previous substitute regular expression");
|
||||||
|
return; /* No prev subst */
|
||||||
|
}
|
||||||
|
repaint();
|
||||||
|
if (!repl_count) {
|
||||||
|
emsg("Fail|Substitute pattern matching failed");
|
||||||
|
} else if (repl_count > 1) {
|
||||||
|
sprintf(string, "%d subs|%d substitutions", repl_count, repl_count);
|
||||||
|
msg(string);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else if (!strncmp("global", cmdname, len) && CMDLNG(6,1)) {
|
||||||
|
current = start_addr - 1;
|
||||||
|
repl_count = 0;
|
||||||
|
addch('\n');
|
||||||
|
while ((current = searching(*cmd, cmd + 1, current,
|
||||||
|
end_addr, FALSE|S_GLOBAL)) != 0L) {
|
||||||
|
addch('\n');
|
||||||
|
printline(current, maxy - 1);
|
||||||
|
repl_count++;
|
||||||
|
if (repl_count == LINES - 2) {
|
||||||
|
if (wait_return(FALSE)) return;
|
||||||
|
repl_count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (repl_count) {
|
||||||
|
wait_return(TRUE);
|
||||||
|
} else {
|
||||||
|
repaint();
|
||||||
|
emsg(notfound);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else if (cmdname[0] == 't') {
|
||||||
|
if (!addr_flag) start_addr = current;
|
||||||
|
cmd = cmdname + 1L;
|
||||||
|
SKIP_WHITE
|
||||||
|
do_mark(*cmd, start_addr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!strncmp("write", cmdname, len) && CMDLNG(5,1)) || !strcmp("wq", cmdname)) {
|
||||||
|
if (*cmd == '>') {
|
||||||
|
if (*(++cmd) == '>') {
|
||||||
|
cmd++;
|
||||||
|
saveflag = APPEND;
|
||||||
|
} else {
|
||||||
|
emsg("Write forms are 'w' and 'w>>'");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (*cmd == '!') {
|
||||||
|
emsg("Not yet implemented");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
saveflag = WRITE;
|
||||||
|
}
|
||||||
|
SKIP_WHITE
|
||||||
|
|
||||||
|
c_argc = 0;
|
||||||
|
if ((c_argv[c_argc] = strtok(cmd, " \t")) != NULL) c_argc++;
|
||||||
|
while ((c_argv[c_argc] = strtok(NULL, " \t")) != NULL) c_argc++;
|
||||||
|
|
||||||
|
if (c_argc > 1) {
|
||||||
|
emsg(ambigous);
|
||||||
|
return; }
|
||||||
|
if (c_argc == 1) {
|
||||||
|
/* change '%' to Filename */
|
||||||
|
while ((p = strchr(c_argv[0], '%')) != NULL && *(p-1) != '\\') {
|
||||||
|
if (name == NULL) {
|
||||||
|
emsg("No filename@to substitute for %");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*p = '\0';
|
||||||
|
strcpy (oldbuf, c_argv[0]);
|
||||||
|
strcat (oldbuf, name);
|
||||||
|
strcat (oldbuf, p + 1);
|
||||||
|
c_argv[0] = oldbuf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (name == NULL && c_argc != 0) name = strdup(c_argv[0]);
|
||||||
|
if (force) {
|
||||||
|
if (c_argc == 0) ok = save(name, start_addr, end_addr, saveflag);
|
||||||
|
else ok = save(c_argv[0], start_addr, end_addr, saveflag);
|
||||||
|
} else {
|
||||||
|
if (c_argc == 0) {
|
||||||
|
if (P(P_RO)) {
|
||||||
|
sprintf(string, "\"%s\" File is read only", name);
|
||||||
|
emsg(string);
|
||||||
|
return;
|
||||||
|
} else ok = save(name, start_addr, end_addr, saveflag);
|
||||||
|
} else {
|
||||||
|
if (!stat(c_argv[0], &buf)) {
|
||||||
|
if (saveflag == WRITE) {
|
||||||
|
sprintf(string, "File exists@- use \"%s! %s\" to overwrite", cmdname, c_argv[0]);
|
||||||
|
emsg(string);
|
||||||
|
return;
|
||||||
|
} else { /* APPEND */
|
||||||
|
/* We can only append to a regular file! */
|
||||||
|
if (S_ISREG(buf.st_mode)) {
|
||||||
|
if (filemode == PARTIAL) filemode = REGULAR;
|
||||||
|
} else if (S_ISBLK(buf.st_mode)) {
|
||||||
|
emsg("Cannot append to a block special file");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ok = save(c_argv[0], start_addr, end_addr, saveflag);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (saveflag == APPEND) {
|
||||||
|
emsg("No such file");
|
||||||
|
return;
|
||||||
|
} else { /* WRITE */
|
||||||
|
/* If we write the block of a partial file to a new file, it will
|
||||||
|
* become a regular file!
|
||||||
|
*/
|
||||||
|
if (filemode == PARTIAL) filemode = REGULAR;
|
||||||
|
ok = save(c_argv[0], start_addr, end_addr, saveflag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!strcmp("wq", cmdname)) {
|
||||||
|
if (ok) quit();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
c_argc = 0;
|
||||||
|
cmd = strtok(cmdbuf, " \t");
|
||||||
|
while ((c_argv[c_argc] = strtok(NULL, " \t")) != NULL) c_argc++;
|
||||||
|
|
||||||
|
if (!strncmp("set", cmdname, len) && CMDLNG(3, 2)) {
|
||||||
|
if (chk_comm(NO_ADDR)) return;
|
||||||
|
if (c_argc == 0) {
|
||||||
|
doset(NULL);
|
||||||
|
} else {
|
||||||
|
for (n = 0; n < c_argc; n++) {
|
||||||
|
if (doset(c_argv[n])) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (!strncmp("args", cmdname, len) && CMDLNG(4, 2)) {
|
||||||
|
if (chk_comm(NO_ADDR|NO_ARG)) return;
|
||||||
|
string[0] = '\0';
|
||||||
|
for (n = 0; n < numfiles; n++) {
|
||||||
|
if (n == curfile) strcat(string, "[");
|
||||||
|
strcat(string, files[n]);
|
||||||
|
if (n == curfile) strcat(string, "]");
|
||||||
|
strcat(string, " ");
|
||||||
|
}
|
||||||
|
msg(string);
|
||||||
|
} else if (!strncmp("source", cmdname, len) && CMDLNG(6, 2)) {
|
||||||
|
if (chk_comm(NO_ADDR|ONE_FILE)) return;
|
||||||
|
if (read_rc(c_argv[0])) sysemsg(c_argv[0]);
|
||||||
|
refresh();
|
||||||
|
} else if (!strncmp("cd", cmdname, len) && CMDLNG(2, 2)) {
|
||||||
|
if (chk_comm(NO_ADDR|ONE_FILE)) return;
|
||||||
|
if (!force) {
|
||||||
|
if (edits) {
|
||||||
|
if (P(P_AW)) {
|
||||||
|
save(name, mem, maxpos, WRITE);
|
||||||
|
edits = 0;
|
||||||
|
} else {
|
||||||
|
sprintf(string, nowrtmsg, "cd");
|
||||||
|
emsg(string);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (c_argc == 0) {
|
||||||
|
sprintf(string, "%c", DELIM);
|
||||||
|
c_argv[0] = string;
|
||||||
|
}
|
||||||
|
if (chdir(c_argv[0])) sysemsg(c_argv[0]);
|
||||||
|
} else if (!strncmp("edit", cmdname, len) && CMDLNG(4, 1)) {
|
||||||
|
/*
|
||||||
|
* The command ":e#" gets expanded to something like ":efile", so
|
||||||
|
* detect that case here.
|
||||||
|
*/
|
||||||
|
if (*cmd == 'e' && c_argc == 0) {
|
||||||
|
if (cmd[1] == '!')
|
||||||
|
(void) doecmd(&cmd[2], TRUE);
|
||||||
|
else
|
||||||
|
(void) doecmd(&cmd[1], FALSE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (chk_comm(NO_ADDR|MAX_ONE_FILE)) return;
|
||||||
|
doecmd(c_argv[0], force);
|
||||||
|
} else if (!strncmp("file", cmdname, len) && CMDLNG(4, 1)) {
|
||||||
|
if (chk_comm(NO_ADDR|MAX_ONE_FILE)) return;
|
||||||
|
if (c_argc != 0) name = strdup(c_argv[0]);
|
||||||
|
fileinfo(name);
|
||||||
|
} else if (!strncmp("read", cmdname, len) && CMDLNG(4, 1)) {
|
||||||
|
if (chk_comm(NO_ADDR|MAX_ONE_FILE)) return;
|
||||||
|
/* read reads a file at EOF */
|
||||||
|
if (c_argc == 0) c_argv[0] = name;
|
||||||
|
if (!addfile(c_argv[0])) {
|
||||||
|
edits = U_TRUNC;
|
||||||
|
undosize = filesize;
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
} else if (!strncmp("xit", cmdname, len) && CMDLNG(3, 1)) {
|
||||||
|
if (chk_comm(NO_ADDR|NO_ARG)) return;
|
||||||
|
do_exit();
|
||||||
|
} else if (!strncmp("next", cmdname, len) && CMDLNG(4, 1)) {
|
||||||
|
if (chk_comm(NO_ADDR|NO_ARG)) return;
|
||||||
|
if (!force) {
|
||||||
|
if (edits) {
|
||||||
|
if (P(P_AW)) {
|
||||||
|
save(name, mem, maxpos, WRITE);
|
||||||
|
edits = 0;
|
||||||
|
} else {
|
||||||
|
sprintf(string, nowrtmsg, "next");
|
||||||
|
emsg(string);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((curfile + 1) < numfiles) {
|
||||||
|
if (force) stuffin(":e! ");
|
||||||
|
else stuffin(":e ");
|
||||||
|
stuffin(files[++curfile]);
|
||||||
|
stuffin("\n");
|
||||||
|
} else
|
||||||
|
emsg("No more files@to edit!");
|
||||||
|
} else if (!strncmp("rewind", cmdname, len) && CMDLNG(6, 3)) {
|
||||||
|
if (chk_comm(NO_ADDR|NO_ARG)) return;
|
||||||
|
if (numfiles <= 1) /* nothing to rewind */
|
||||||
|
return;
|
||||||
|
if (!force) {
|
||||||
|
if (edits) {
|
||||||
|
if (P(P_AW)) {
|
||||||
|
save(name, mem, maxpos, WRITE);
|
||||||
|
edits = 0;
|
||||||
|
} else {
|
||||||
|
sprintf(string, nowrtmsg, "rewind");
|
||||||
|
emsg(string);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
curfile = 0;
|
||||||
|
if (force) stuffin(":e! ");
|
||||||
|
else stuffin(":e ");
|
||||||
|
stuffin(files[0]);
|
||||||
|
stuffin("\n");
|
||||||
|
} else if (!strncmp("append", cmdname, len) && CMDLNG(6, 1)) {
|
||||||
|
if (chk_comm(NO_ADDR|MAX_ONE_ARG)) return;
|
||||||
|
do_ins_chg(start_addr, c_argc == 1 ? c_argv[0] : "a", U_APPEND);
|
||||||
|
} else if (!strncmp("change", cmdname, len) && CMDLNG(6, 1)) {
|
||||||
|
if (chk_comm(MAX_ONE_ARG)) return;
|
||||||
|
if (!addr_flag) start_addr = current;
|
||||||
|
do_ins_chg(start_addr, c_argc == 1 ? c_argv[0] : "a", U_EDIT);
|
||||||
|
} else if (!strncmp("mark", cmdname, len) && CMDLNG(4, 2)) {
|
||||||
|
if (c_argc == 0) { emsg("Mark what?"); return; }
|
||||||
|
if (c_argc > 1 || (strlen(c_argv[0]) > 1)) { emsg(extra); return; }
|
||||||
|
if (!addr_flag) start_addr = current;
|
||||||
|
do_mark(c_argv[0][0], start_addr);
|
||||||
|
} else if (!strncmp("yank", cmdname, len) && CMDLNG(4, 1)) {
|
||||||
|
if ((yanked = yd_addr()) == 0L) return;
|
||||||
|
if ((yanked = alloc_buf(yanked, &yank_buf)) == 0L) return;
|
||||||
|
memcpy(yank_buf, start_addr, yanked);
|
||||||
|
sprintf(string, "%lu bytes", (long)yanked);
|
||||||
|
msg(string);
|
||||||
|
} else if (!strncmp("overwrite", cmdname, len) && CMDLNG(9, 1)) {
|
||||||
|
if (chk_comm(NO_ARG)) return;
|
||||||
|
if (!addr_flag) start_addr = current;
|
||||||
|
do_over(start_addr, yanked, yank_buf);
|
||||||
|
} else if (!strncmp("undo", cmdname, len) && CMDLNG(4, 1)) {
|
||||||
|
if (chk_comm(NO_ADDR|NO_ARG)) return;
|
||||||
|
do_undo();
|
||||||
|
} else if (!strncmp("version", cmdname, len) && CMDLNG(7, 2)) {
|
||||||
|
if (chk_comm(NO_ADDR|NO_ARG)) return;
|
||||||
|
sprintf(string, "bvi version %s %s", VERSION, copyright);
|
||||||
|
msg(string);
|
||||||
|
} else if (!strncmp("shell", cmdname, len) && CMDLNG(5, 2)) {
|
||||||
|
if (chk_comm(NO_ADDR|NO_ARG)) return;
|
||||||
|
do_shell();
|
||||||
|
clear();
|
||||||
|
repaint();
|
||||||
|
clearstr();
|
||||||
|
} else if (!strncmp("quit", cmdname, len) && CMDLNG(4, 1)) {
|
||||||
|
if (chk_comm(NO_ADDR|NO_ARG)) return;
|
||||||
|
if (!force) {
|
||||||
|
if (edits) {
|
||||||
|
sprintf(string, nowrtmsg, "quit");
|
||||||
|
emsg(string);
|
||||||
|
} else {
|
||||||
|
if ((curfile + 1) < numfiles) {
|
||||||
|
sprintf(string, "%d %s", numfiles - curfile - 1, morefiles);
|
||||||
|
emsg(string);
|
||||||
|
} else
|
||||||
|
quit();
|
||||||
|
}
|
||||||
|
} else quit();
|
||||||
|
} else if (!strncmp("sleft", cmdname, len) && CMDLNG(5, 2)) {
|
||||||
|
if (c_argc == 1) {
|
||||||
|
do_logic(LSHIFT, c_argv[0]);
|
||||||
|
} else if (c_argc == 0) {
|
||||||
|
do_logic(LSHIFT, "1");
|
||||||
|
} else { emsg(ambvalue); return; }
|
||||||
|
} else if (!strncmp("sright", cmdname, len) && CMDLNG(6, 2)) {
|
||||||
|
if (c_argc == 1) {
|
||||||
|
do_logic(RSHIFT, c_argv[0]);
|
||||||
|
} else if (c_argc == 0) {
|
||||||
|
do_logic(RSHIFT, "1");
|
||||||
|
} else { emsg(ambvalue); return; }
|
||||||
|
} else if (!strncmp("rleft", cmdname, len) && CMDLNG(5, 2)) {
|
||||||
|
if (c_argc == 1) {
|
||||||
|
do_logic(LROTATE, c_argv[0]);
|
||||||
|
} else if (c_argc == 0) {
|
||||||
|
do_logic(LROTATE, "1");
|
||||||
|
} else { emsg(ambvalue); return; }
|
||||||
|
} else if (!strncmp("rright", cmdname, len) && CMDLNG(6, 2)) {
|
||||||
|
if (c_argc == 1) {
|
||||||
|
do_logic(RROTATE, c_argv[0]);
|
||||||
|
} else if (c_argc == 0) {
|
||||||
|
do_logic(RROTATE, "1");
|
||||||
|
} else { emsg(ambvalue); return; }
|
||||||
|
} else if (!strcmp("and", cmdname)) {
|
||||||
|
if (c_argc == 1) {
|
||||||
|
do_logic(AND, c_argv[0]);
|
||||||
|
} else if (c_argc == 0) {
|
||||||
|
emsg(noval); return;
|
||||||
|
} else { emsg(ambvalue); return; }
|
||||||
|
} else if (!strcmp("or", cmdname)) {
|
||||||
|
if (c_argc == 1) {
|
||||||
|
do_logic(OR, c_argv[0]);
|
||||||
|
} else if (c_argc == 0) {
|
||||||
|
emsg(noval); return;
|
||||||
|
} else { emsg(ambvalue); return; }
|
||||||
|
} else if (!strcmp("xor", cmdname)) {
|
||||||
|
if (c_argc == 1) {
|
||||||
|
do_logic(XOR, c_argv[0]);
|
||||||
|
} else if (c_argc == 0) {
|
||||||
|
emsg(noval); return;
|
||||||
|
} else { emsg(ambvalue); return; }
|
||||||
|
} else if (!strcmp("neg", cmdname)) {
|
||||||
|
if (c_argc != 0) { emsg(extra); return; }
|
||||||
|
do_logic(NEG, "255");
|
||||||
|
} else if (!strcmp("not", cmdname)) {
|
||||||
|
if (c_argc != 0) { emsg(extra); return; }
|
||||||
|
do_logic(NOT, "255");
|
||||||
|
} else {
|
||||||
|
sprintf(string, "What?|%s: Not an editor command", cmd);
|
||||||
|
if P(P_MM) {
|
||||||
|
if (!strncmp("delete", cmdname, len) && CMDLNG(6, 1)) {
|
||||||
|
if ((undo_count = yd_addr()) == 0L) return;
|
||||||
|
do_delete(undo_count, start_addr);
|
||||||
|
sprintf(string, "%lu bytes", (long)undo_count);
|
||||||
|
msg(string);
|
||||||
|
} else if (!strncmp("insert", cmdname, len) && CMDLNG(6, 1)) {
|
||||||
|
if (chk_comm(MAX_ONE_ARG)) return;
|
||||||
|
if (!addr_flag) start_addr = current;
|
||||||
|
do_ins_chg(start_addr - 1, c_argc == 1 ? c_argv[0] : "a", U_INSERT);
|
||||||
|
} else if (!strncmp("put", cmdname, len) && CMDLNG(3, 2)) {
|
||||||
|
if (chk_comm(NO_ARG)) return;
|
||||||
|
if (!addr_flag) start_addr = current;
|
||||||
|
do_put(start_addr, yanked, yank_buf);
|
||||||
|
} else {
|
||||||
|
emsg(string);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!strncmp("delete", cmdname, len) && CMDLNG(6, 1)) {
|
||||||
|
movebyte();
|
||||||
|
} else if (!strncmp("insert", cmdname, len) && CMDLNG(6, 1)) {
|
||||||
|
movebyte();
|
||||||
|
} else if (!strncmp("put", cmdname, len) && CMDLNG(3, 2)) {
|
||||||
|
movebyte();
|
||||||
|
} else {
|
||||||
|
emsg(string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* calculate address range for :yank and :delete command */
|
||||||
|
off_t
|
||||||
|
yd_addr()
|
||||||
|
{
|
||||||
|
off_t count = 0;
|
||||||
|
|
||||||
|
if (c_argc == 0) {
|
||||||
|
switch (addr_flag) {
|
||||||
|
case 0: start_addr = current;
|
||||||
|
case 1: count = 1;
|
||||||
|
break;
|
||||||
|
case 2: count = end_addr - start_addr + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (c_argc == 1) {
|
||||||
|
count = atoi(c_argv[0]);
|
||||||
|
switch (addr_flag) {
|
||||||
|
case 0: start_addr = current;
|
||||||
|
case 1: end_addr = start_addr + count - 1;
|
||||||
|
break;
|
||||||
|
case 2: start_addr = end_addr;
|
||||||
|
end_addr = start_addr + count - 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
emsg(ambvalue);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
do_exit()
|
||||||
|
{
|
||||||
|
if (edits) {
|
||||||
|
if (!save(name, mem, maxpos - 1L, WRITE)) return;
|
||||||
|
}
|
||||||
|
if ((curfile + 1) < numfiles) {
|
||||||
|
sprintf(string, "%d %s", numfiles - curfile - 1, morefiles);
|
||||||
|
emsg(string);
|
||||||
|
} else quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
doecmd(arg, force)
|
||||||
|
char *arg;
|
||||||
|
int force;
|
||||||
|
{
|
||||||
|
char *tmp;
|
||||||
|
|
||||||
|
if (*arg == '\0') arg = NULL;
|
||||||
|
if (!force && edits) {
|
||||||
|
sprintf(string, nowrtmsg, "edit");
|
||||||
|
emsg(string);
|
||||||
|
/*
|
||||||
|
if (altfile)
|
||||||
|
free(altfile);
|
||||||
|
altfile = strdup(arg);
|
||||||
|
*/
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (arg != NULL) {
|
||||||
|
if (name != NULL && !strcmp(arg, name)) {
|
||||||
|
if (!edits || (edits && !force))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if (name != NULL && !strcmp(arg, "#")) {
|
||||||
|
if (altfile == NULL) {
|
||||||
|
emsg("No alternate filename@to substitute for #");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
tmp = name;
|
||||||
|
name = altfile;
|
||||||
|
altfile = tmp;
|
||||||
|
} else {
|
||||||
|
if (altfile) {
|
||||||
|
free(altfile);
|
||||||
|
}
|
||||||
|
altfile = name;
|
||||||
|
name = strdup(arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (name == NULL) {
|
||||||
|
emsg("No file|No current filename");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
edits = 0;
|
||||||
|
filesize = load(name);
|
||||||
|
if (arg == NULL) {
|
||||||
|
setpage(current < maxpos ? current : maxpos - 1L);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
clearstr()
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
move(maxy, 0);
|
||||||
|
for (n = 0; n < maxx; n++) addch(' ');
|
||||||
|
move(maxy, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**** displays an error message *****/
|
||||||
|
void
|
||||||
|
emsg(s)
|
||||||
|
char *s;
|
||||||
|
{
|
||||||
|
int cnt;
|
||||||
|
|
||||||
|
if (P(P_EB)) beep();
|
||||||
|
clearstr();
|
||||||
|
attrset(A_REVERSE);
|
||||||
|
cnt = outmsg(s);
|
||||||
|
attrset(A_NORMAL);
|
||||||
|
if (cnt >= (maxx - 25)) { /* 25 = status */
|
||||||
|
addch('\n');
|
||||||
|
wait_return(TRUE); }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*** System error message *****/
|
||||||
|
void
|
||||||
|
sysemsg(s)
|
||||||
|
char *s;
|
||||||
|
{
|
||||||
|
char string[256];
|
||||||
|
|
||||||
|
sprintf(string, "%s: %s", s, sys_errlist[errno]);
|
||||||
|
emsg(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*** displays mode if showmode set *****/
|
||||||
|
void
|
||||||
|
smsg(s)
|
||||||
|
char *s;
|
||||||
|
{
|
||||||
|
if (P(P_MO)) {
|
||||||
|
msg(s);
|
||||||
|
setcur();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/************* displays s on status line *****************/
|
||||||
|
void
|
||||||
|
msg(s)
|
||||||
|
char *s;
|
||||||
|
{
|
||||||
|
clearstr();
|
||||||
|
if (outmsg(s) >= (maxx - 25)) { /* 25 = status */
|
||||||
|
addch('\n');
|
||||||
|
wait_return(TRUE); }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
outmsg(s)
|
||||||
|
char *s;
|
||||||
|
{
|
||||||
|
char *poi;
|
||||||
|
int cnt = 0;
|
||||||
|
|
||||||
|
move(maxy, 0);
|
||||||
|
poi = strchr(s, '|');
|
||||||
|
|
||||||
|
if (P(P_TE)) {
|
||||||
|
poi = s;
|
||||||
|
while (*poi != '\0' && *poi != '@' && *poi != '|') {
|
||||||
|
addch(*poi++);
|
||||||
|
cnt++; }
|
||||||
|
} else {
|
||||||
|
if (poi) poi++;
|
||||||
|
else poi = s;
|
||||||
|
while (*poi) {
|
||||||
|
if (*poi == '@') addch(' ');
|
||||||
|
else addch(*poi);
|
||||||
|
poi++;
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If flag == TRUE we do a repaint
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wait_return(flag)
|
||||||
|
int flag;
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
signal(SIGINT, jmpproc);
|
||||||
|
clearstr();
|
||||||
|
attrset(A_REVERSE);
|
||||||
|
mvaddstr(maxy, 0, "[Hit return to continue]");
|
||||||
|
attrset(A_NORMAL);
|
||||||
|
refresh();
|
||||||
|
c = getch();
|
||||||
|
if (flag) {
|
||||||
|
clear();
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
clearstr();
|
||||||
|
signal(SIGINT, SIG_IGN);
|
||||||
|
if (c != CR && c != NL && c != ' ' && c != ':' && c != KEY_ENTER) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
chk_comm(flag)
|
||||||
|
int flag;
|
||||||
|
{
|
||||||
|
if ((flag & NO_ADDR) && (addr_flag > 0)) {
|
||||||
|
emsg(noaddr); return 1; }
|
||||||
|
if ((flag & NO_ARG) && (c_argc > 0)) {
|
||||||
|
emsg(extra); return 1; }
|
||||||
|
if ((flag & MAX_ONE_ARG) && (c_argc > 1)) {
|
||||||
|
emsg(ambvalue); return 1; }
|
||||||
|
if ((flag & ONE_FILE) && (c_argc == 0)) {
|
||||||
|
emsg("Missing filename"); return 1; }
|
||||||
|
if ((flag & MAX_ONE_FILE) && (c_argc > 1)) {
|
||||||
|
emsg(ambigous); return 1; }
|
||||||
|
return 0;
|
||||||
|
}
|
883
config.guess
vendored
Executable file
883
config.guess
vendored
Executable file
|
@ -0,0 +1,883 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Attempt to guess a canonical system name.
|
||||||
|
# Copyright (C) 1992, 93, 94, 95, 96, 1997 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
|
||||||
|
fi
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
|
||||||
|
|
||||||
|
# Note: order is significant - the case branches are not exclusive.
|
||||||
|
|
||||||
|
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||||
|
alpha:OSF1:*:*)
|
||||||
|
if test $UNAME_RELEASE = "V4.0"; then
|
||||||
|
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
|
||||||
|
fi
|
||||||
|
# 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.
|
||||||
|
cat <<EOF >dummy.s
|
||||||
|
.globl main
|
||||||
|
.ent main
|
||||||
|
main:
|
||||||
|
.frame \$30,0,\$26,0
|
||||||
|
.prologue 0
|
||||||
|
.long 0x47e03d80 # implver $0
|
||||||
|
lda \$2,259
|
||||||
|
.long 0x47e20c21 # amask $2,$1
|
||||||
|
srl \$1,8,\$2
|
||||||
|
sll \$2,2,\$2
|
||||||
|
sll \$0,3,\$0
|
||||||
|
addl \$1,\$0,\$0
|
||||||
|
addl \$2,\$0,\$0
|
||||||
|
ret \$31,(\$26),1
|
||||||
|
.end main
|
||||||
|
EOF
|
||||||
|
${CC-cc} dummy.s -o dummy 2>/dev/null
|
||||||
|
if test "$?" = 0 ; then
|
||||||
|
./dummy
|
||||||
|
case "$?" in
|
||||||
|
7)
|
||||||
|
UNAME_MACHINE="alpha"
|
||||||
|
;;
|
||||||
|
15)
|
||||||
|
UNAME_MACHINE="alphaev5"
|
||||||
|
;;
|
||||||
|
14)
|
||||||
|
UNAME_MACHINE="alphaev56"
|
||||||
|
;;
|
||||||
|
10)
|
||||||
|
UNAME_MACHINE="alphapca56"
|
||||||
|
;;
|
||||||
|
16)
|
||||||
|
UNAME_MACHINE="alphaev6"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
rm -f dummy.s dummy
|
||||||
|
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr [[A-Z]] [[a-z]]`
|
||||||
|
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-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
arc64:OpenBSD:*:*)
|
||||||
|
echo mips64el-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
arc:OpenBSD:*:*)
|
||||||
|
echo mipsel-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
hkmips:OpenBSD:*:*)
|
||||||
|
echo mips-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
pmax:OpenBSD:*:*)
|
||||||
|
echo mipsel-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
sgi:OpenBSD:*:*)
|
||||||
|
echo mips-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
wgrisc:OpenBSD:*:*)
|
||||||
|
echo mipsel-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
|
||||||
|
echo arm-acorn-riscix${UNAME_RELEASE}
|
||||||
|
exit 0;;
|
||||||
|
arm32:NetBSD:*:*)
|
||||||
|
echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
|
||||||
|
exit 0 ;;
|
||||||
|
SR2?01:HI-UX/MPP:*:*)
|
||||||
|
echo hppa1.1-hitachi-hiuxmpp
|
||||||
|
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 ;;
|
||||||
|
sun*:*:4.2BSD:*)
|
||||||
|
UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
|
||||||
|
test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
|
||||||
|
case "`/bin/arch`" in
|
||||||
|
sun3)
|
||||||
|
echo m68k-sun-sunos${UNAME_RELEASE}
|
||||||
|
;;
|
||||||
|
sun4)
|
||||||
|
echo sparc-sun-sunos${UNAME_RELEASE}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
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-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
sun3*:NetBSD:*:*)
|
||||||
|
echo m68k-sun-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
sun3*:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mac68k:NetBSD:*:*)
|
||||||
|
echo m68k-apple-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mac68k:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mvme68k:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mvme88k:OpenBSD:*:*)
|
||||||
|
echo m88k-unknown-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 ;;
|
||||||
|
2020:CLIX:*:*)
|
||||||
|
echo clipper-intergraph-clix${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-powerunix
|
||||||
|
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`
|
||||||
|
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}-unknown-osf1mk
|
||||||
|
else
|
||||||
|
echo ${UNAME_MACHINE}-unknown-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 ;;
|
||||||
|
hp300:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-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 ;;
|
||||||
|
i*:MINGW*:*)
|
||||||
|
echo i386-pc-mingw32
|
||||||
|
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`
|
||||||
|
ld_supported_emulations=`echo $ld_help_string \
|
||||||
|
| sed -ne '/supported emulations:/!d
|
||||||
|
s/[ ][ ]*/ /g
|
||||||
|
s/.*supported emulations: *//
|
||||||
|
s/ .*//
|
||||||
|
p'`
|
||||||
|
case "$ld_supported_emulations" in
|
||||||
|
i?86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 ;;
|
||||||
|
i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 ;;
|
||||||
|
sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
|
||||||
|
m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
|
||||||
|
elf32ppc) echo "powerpc-unknown-linux-gnu" ; exit 0 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test "${UNAME_MACHINE}" = "alpha" ; then
|
||||||
|
sed 's/^ //' <<EOF >dummy.s
|
||||||
|
.globl main
|
||||||
|
.ent main
|
||||||
|
main:
|
||||||
|
.frame \$30,0,\$26,0
|
||||||
|
.prologue 0
|
||||||
|
.long 0x47e03d80 # implver $0
|
||||||
|
lda \$2,259
|
||||||
|
.long 0x47e20c21 # amask $2,$1
|
||||||
|
srl \$1,8,\$2
|
||||||
|
sll \$2,2,\$2
|
||||||
|
sll \$0,3,\$0
|
||||||
|
addl \$1,\$0,\$0
|
||||||
|
addl \$2,\$0,\$0
|
||||||
|
ret \$31,(\$26),1
|
||||||
|
.end main
|
||||||
|
EOF
|
||||||
|
LIBC=""
|
||||||
|
${CC-cc} dummy.s -o dummy 2>/dev/null
|
||||||
|
if test "$?" = 0 ; then
|
||||||
|
./dummy
|
||||||
|
case "$?" in
|
||||||
|
7)
|
||||||
|
UNAME_MACHINE="alpha"
|
||||||
|
;;
|
||||||
|
15)
|
||||||
|
UNAME_MACHINE="alphaev5"
|
||||||
|
;;
|
||||||
|
14)
|
||||||
|
UNAME_MACHINE="alphaev56"
|
||||||
|
;;
|
||||||
|
10)
|
||||||
|
UNAME_MACHINE="alphapca56"
|
||||||
|
;;
|
||||||
|
16)
|
||||||
|
UNAME_MACHINE="alphaev6"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
objdump --private-headers dummy | \
|
||||||
|
grep ld.so.1 > /dev/null
|
||||||
|
if test "$?" = 0 ; then
|
||||||
|
LIBC="libc1"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
rm -f dummy.s dummy
|
||||||
|
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
|
||||||
|
elif test "${UNAME_MACHINE}" = "mips" ; then
|
||||||
|
cat >dummy.c <<EOF
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{
|
||||||
|
#ifdef __MIPSEB__
|
||||||
|
printf ("%s-unknown-linux-gnu\n", argv[1]);
|
||||||
|
#endif
|
||||||
|
#ifdef __MIPSEL__
|
||||||
|
printf ("%sel-unknown-linux-gnu\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
|
||||||
|
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.
|
||||||
|
# If ld does not provide *any* "supported emulations:"
|
||||||
|
# that means it is gnuoldld.
|
||||||
|
echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
|
||||||
|
test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
|
||||||
|
|
||||||
|
case "${UNAME_MACHINE}" in
|
||||||
|
i?86)
|
||||||
|
VENDOR=pc;
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
VENDOR=unknown;
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
# Determine whether the default compiler is a.out or elf
|
||||||
|
cat >dummy.c <<EOF
|
||||||
|
#include <features.h>
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{
|
||||||
|
#ifdef __ELF__
|
||||||
|
# ifdef __GLIBC__
|
||||||
|
# if __GLIBC__ >= 2
|
||||||
|
printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
|
||||||
|
# else
|
||||||
|
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
printf ("%s-${VENDOR}-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:UNIX_SV:4.2MP:2.*)
|
||||||
|
# Unixware is an offshoot of SVR4, but it has its own version
|
||||||
|
# number series starting with 2...
|
||||||
|
# I am not positive that other SVR4 systems won't match this,
|
||||||
|
# I just have to hope. -- rms.
|
||||||
|
# Use sysv4.2uw... so that sysv4* matches it.
|
||||||
|
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:*:4.*:* | i?86:SYSTEM_V: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 ;;
|
||||||
|
pc:*:*:*)
|
||||||
|
# uname -m prints for DJGPP always 'pc', but it prints nothing about
|
||||||
|
# the processor, so we play safe by assuming i386.
|
||||||
|
echo i386-pc-msdosdjgpp
|
||||||
|
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 ;;
|
||||||
|
m68*:LynxOS:2.*:*)
|
||||||
|
echo m68k-unknown-lynxos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mc68030:UNIX_System_V:4.*:*)
|
||||||
|
echo m68k-atari-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:LynxOS:2.*:*)
|
||||||
|
echo i386-unknown-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 ;;
|
||||||
|
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 ;;
|
||||||
|
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 ;;
|
||||||
|
*: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 ;;
|
||||||
|
news*:NEWS-OS:*:6*)
|
||||||
|
echo mips-sony-newsos6
|
||||||
|
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 ;;
|
||||||
|
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"); 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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
#echo '(Unable to guess system type)' 1>&2
|
||||||
|
|
||||||
|
exit 1
|
45
config.h.in
Normal file
45
config.h.in
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/* config.h.in. Generated automatically from configure.in by autoheader. */
|
||||||
|
|
||||||
|
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||||
|
/* #undef mode_t */
|
||||||
|
|
||||||
|
/* Define to `long' if <sys/types.h> doesn't define. */
|
||||||
|
/* #undef off_t */
|
||||||
|
|
||||||
|
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||||
|
/* #undef pid_t */
|
||||||
|
|
||||||
|
/* Define to `unsigned' if <sys/types.h> doesn't define. */
|
||||||
|
/* #undef size_t */
|
||||||
|
|
||||||
|
/* Define if you have the ANSI C header files. */
|
||||||
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
#undef NO_SYSERRL
|
||||||
|
|
||||||
|
/* Define if you have the memmove function. */
|
||||||
|
#undef HAVE_MEMMOVE
|
||||||
|
|
||||||
|
/* Define if you have the strdup function. */
|
||||||
|
#undef HAVE_STRDUP
|
||||||
|
|
||||||
|
/* Define if you have the strtol function. */
|
||||||
|
#undef HAVE_STRTOL
|
||||||
|
|
||||||
|
/* Define if you have the <curses.h> header file. */
|
||||||
|
#undef HAVE_CURSES_H
|
||||||
|
|
||||||
|
/* Define if you have the <fcntl.h> header file. */
|
||||||
|
#undef HAVE_FCNTL_H
|
||||||
|
|
||||||
|
/* Define if you have the <ncurses.h> header file. */
|
||||||
|
#undef HAVE_NCURSES_H
|
||||||
|
|
||||||
|
/* Define if you have the <unistd.h> header file. */
|
||||||
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
/* Define if you have the ncurses library (-lncurses). */
|
||||||
|
#undef HAVE_LIBNCURSES
|
||||||
|
|
||||||
|
/* Define if your tputs need putc(char) */
|
||||||
|
#undef NEED_PUTC_CHAR
|
954
config.sub
vendored
Executable file
954
config.sub
vendored
Executable file
|
@ -0,0 +1,954 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Configuration validation subroutine script, version 1.1.
|
||||||
|
# Copyright (C) 1991, 92, 93, 94, 95, 96, 1997 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 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
|
||||||
|
| arme[lb] | pyramid | mn10200 | mn10300 \
|
||||||
|
| tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \
|
||||||
|
| alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \
|
||||||
|
| i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
|
||||||
|
| mips64 | mipsel | mips64el | mips64orion | mips64orionel \
|
||||||
|
| mipstx39 | mipstx39el \
|
||||||
|
| sparc | sparclet | sparclite | sparc64 | v850)
|
||||||
|
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-* | m32r-* | m68k-* | m68000-* \
|
||||||
|
| m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
|
||||||
|
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
|
||||||
|
| power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
|
||||||
|
| xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* \
|
||||||
|
| alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \
|
||||||
|
| ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
|
||||||
|
| sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
|
||||||
|
| sparc64-* | mips64-* | mipsel-* \
|
||||||
|
| mips64el-* | mips64orion-* | mips64orionel-* \
|
||||||
|
| mipstx39-* | mipstx39el-* \
|
||||||
|
| f301-*)
|
||||||
|
;;
|
||||||
|
# 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
|
||||||
|
;;
|
||||||
|
amigaos | amigados)
|
||||||
|
basic_machine=m68k-cbm
|
||||||
|
os=-amigaos
|
||||||
|
;;
|
||||||
|
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
|
||||||
|
;;
|
||||||
|
ebmon29k)
|
||||||
|
basic_machine=a29k-amd
|
||||||
|
os=-ebmon
|
||||||
|
;;
|
||||||
|
elxsi)
|
||||||
|
basic_machine=elxsi-elxsi
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
encore | umax | mmax)
|
||||||
|
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
|
||||||
|
;;
|
||||||
|
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
|
||||||
|
;;
|
||||||
|
m88k-omron*)
|
||||||
|
basic_machine=m88k-omron
|
||||||
|
;;
|
||||||
|
magnum | m3230)
|
||||||
|
basic_machine=mips-mips
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
merlin)
|
||||||
|
basic_machine=ns32k-utek
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
miniframe)
|
||||||
|
basic_machine=m68000-convergent
|
||||||
|
;;
|
||||||
|
mipsel*-linux*)
|
||||||
|
basic_machine=mipsel-unknown
|
||||||
|
os=-linux-gnu
|
||||||
|
;;
|
||||||
|
mips*-linux*)
|
||||||
|
basic_machine=mips-unknown
|
||||||
|
os=-linux-gnu
|
||||||
|
;;
|
||||||
|
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
|
||||||
|
;;
|
||||||
|
tx39)
|
||||||
|
basic_machine=mipstx39-unknown
|
||||||
|
;;
|
||||||
|
tx39el)
|
||||||
|
basic_machine=mipstx39el-unknown
|
||||||
|
;;
|
||||||
|
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)
|
||||||
|
if [ x$os = x-linux-gnu ]; then
|
||||||
|
basic_machine=mips-unknown
|
||||||
|
else
|
||||||
|
basic_machine=mips-mips
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
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
|
||||||
|
;;
|
||||||
|
-svr4*)
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
-unixware*)
|
||||||
|
os=-sysv4.2uw
|
||||||
|
;;
|
||||||
|
-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* \
|
||||||
|
| -amigaos* | -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* \
|
||||||
|
| -mingw32* | -linux-gnu* | -uxpv*)
|
||||||
|
# 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=-amigaos
|
||||||
|
;;
|
||||||
|
*-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
|
||||||
|
;;
|
||||||
|
-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
|
88
configure.in
Normal file
88
configure.in
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
AC_INIT(bvi.c)
|
||||||
|
AC_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
|
||||||
|
dnl On SunOS4 systems you have to use the /usr/5bin/cc compiler
|
||||||
|
dnl to get the SYSV curses library:
|
||||||
|
case "$host_os" in
|
||||||
|
sunos4*)
|
||||||
|
AC_MSG_RESULT("using /usr/5bin/cc")
|
||||||
|
CC="/usr/5bin/cc"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
AC_PROG_CC
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
dnl Some curses specials
|
||||||
|
dnl Solaris needs for tputs 'putc(char)' instead of 'putc(int)'
|
||||||
|
case "$host_os" in
|
||||||
|
solaris*)
|
||||||
|
CPPFLAGS="${CPPFLAGS} -D_MSE_INT_H"
|
||||||
|
AC_DEFINE(NEED_PUTC_CHAR)
|
||||||
|
;;
|
||||||
|
hpux9*) DEFS=${DEFS-"-DMINICURSES"}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
dnl Checks for programs.
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
|
||||||
|
dnl Check for typedefs
|
||||||
|
AC_CHECK_SIZEOF(int)
|
||||||
|
AC_CHECK_SIZEOF(long)
|
||||||
|
AC_CHECK_SIZEOF(void *)
|
||||||
|
|
||||||
|
AC_CHECK_TYPE(size_t, unsigned int)
|
||||||
|
AC_CHECK_TYPE(off_t, int)
|
||||||
|
AC_CHECK_TYPE(mode_t, u_short)
|
||||||
|
|
||||||
|
dnl Checks for header files.
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AC_CHECK_HEADERS(fcntl.h termcap.h termio.h termios.h unistd.h)
|
||||||
|
|
||||||
|
dnl Check if ncurses requested
|
||||||
|
_cppflags="${CPPFLAGS}"
|
||||||
|
_ldflags="${LDFLAGS}"
|
||||||
|
|
||||||
|
AC_ARG_WITH(ncurses,
|
||||||
|
[ --with-ncurses[=DIR] path to ncurses],[
|
||||||
|
if test "$withval" != "no"; then
|
||||||
|
CPPFLAGS="${CPPFLAGS} -I$withval/include -I$withval/include/ncurses"
|
||||||
|
LDFLAGS="${LDFLAGS} -L$withval/lib"
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_CHECK_HEADER(ncurses.h,
|
||||||
|
AC_CHECK_LIB(ncurses, initscr,
|
||||||
|
AC_DEFINE(HAVE_NCURSES_H) LIBS="${LIBS} -lncurses",
|
||||||
|
AC_CHECK_LIB(curses, initscr,
|
||||||
|
AC_DEFINE(HAVE_CURSES_H) LIBS="${LIBS} -lcurses",
|
||||||
|
AC_MSG_ERROR([bvi requires the curses library]))),
|
||||||
|
AC_CHECK_HEADER(curses.h,
|
||||||
|
AC_CHECK_LIB(curses, initscr,
|
||||||
|
AC_DEFINE(HAVE_CURSES_H) LIBS="${LIBS} -lcurses",
|
||||||
|
AC_MSG_ERROR([bvi requires the curses library])),
|
||||||
|
AC_MSG_ERROR([bvi requires the curses library])))
|
||||||
|
|
||||||
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
dnl AC_TYPE_SIZE_T
|
||||||
|
|
||||||
|
dnl Checks for library functions.
|
||||||
|
dnl AC_TYPE_SIGNAL
|
||||||
|
AC_CHECK_FUNCS(strdup strtol memmove)
|
||||||
|
|
||||||
|
AC_EGREP_HEADER(sys_errlist, stdio.h, errl=ok, errl=no)
|
||||||
|
AC_EGREP_HEADER(sys_errlist, errno.h, errl=ok,)
|
||||||
|
AC_EGREP_HEADER(sys_errlist, sys/types.h, errl=ok,)
|
||||||
|
if test $errl = no; then
|
||||||
|
AC_DEFINE(NO_SYSERRL)
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
|
||||||
|
AC_OUTPUT(Makefile)
|
27
configure.scan
Normal file
27
configure.scan
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
AC_INIT(bvi.c)
|
||||||
|
|
||||||
|
dnl Checks for programs.
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
AC_PROG_LN_S
|
||||||
|
AC_PROG_MAKE_SET
|
||||||
|
|
||||||
|
dnl Checks for libraries.
|
||||||
|
dnl Replace `main' with a function in -lcurses:
|
||||||
|
AC_CHECK_LIB(curses, main)
|
||||||
|
dnl Replace `main' with a function in -lncurses:
|
||||||
|
AC_CHECK_LIB(ncurses, main)
|
||||||
|
|
||||||
|
dnl Checks for header files.
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AC_CHECK_HEADERS(fcntl.h unistd.h)
|
||||||
|
|
||||||
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
AC_TYPE_SIZE_T
|
||||||
|
|
||||||
|
dnl Checks for library functions.
|
||||||
|
AC_TYPE_SIGNAL
|
||||||
|
AC_CHECK_FUNCS(strdup strtol)
|
||||||
|
|
||||||
|
AC_OUTPUT(Makefile)
|
46
dosconf.h
Normal file
46
dosconf.h
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/* dosconf.h
|
||||||
|
*
|
||||||
|
* 1996-02-28 V 1.0.0
|
||||||
|
* 1999-01-21 V 1.1.0
|
||||||
|
* 1999-03-17 V 1.1.1
|
||||||
|
* 1999-07-01 V 1.2.0 beta
|
||||||
|
* 1999-08-27 V 1.2.0 final
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* Copyright 1996-1969 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define if you have the ANSI C header files. */
|
||||||
|
#define STDC_HEADERS 1
|
||||||
|
|
||||||
|
/* Define if you have the memmove function. */
|
||||||
|
#define HAVE_MEMMOVE 1
|
||||||
|
|
||||||
|
/* Define if you have the strdup function. */
|
||||||
|
#define HAVE_STRDUP 1
|
||||||
|
|
||||||
|
/* Define if you have the strtol function. */
|
||||||
|
#define HAVE_STRTOL 1
|
||||||
|
|
||||||
|
/* Define if you have the <fcntl.h> header file. */
|
||||||
|
#define HAVE_FCNTL_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <locale.h> header file. */
|
||||||
|
#if __TURBOC__ > 0x0400
|
||||||
|
# define HAVE_LOCALE_H 1
|
||||||
|
#endif
|
||||||
|
|
149
doscur.h
Normal file
149
doscur.h
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
/* DOSCUR.H - CURSES.H for TURBO C
|
||||||
|
*
|
||||||
|
* Copyright 1996 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 1996-02-28 V 1.0.0
|
||||||
|
* 1998-04-12 V 1.0.1
|
||||||
|
* 1999-01-14 V 1.1.1
|
||||||
|
* 1999-07-01 V 1.2.0
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <conio.h>
|
||||||
|
#include <dos.h>
|
||||||
|
|
||||||
|
#define TRUE 1
|
||||||
|
#define FALSE 0
|
||||||
|
|
||||||
|
#define ESC 27
|
||||||
|
#define KEY_F0 0x3A00
|
||||||
|
#define KEY_F(n) (KEY_F0+(n<<8))
|
||||||
|
#define KEY_DOWN 0x5000
|
||||||
|
#define KEY_UP 0x4800
|
||||||
|
#define KEY_LEFT 0x4B00
|
||||||
|
#define KEY_RIGHT 0x4D00
|
||||||
|
#define KEY_NPAGE 0x5100
|
||||||
|
#define KEY_PPAGE 0x4900
|
||||||
|
#define KEY_RETURN 0x0d
|
||||||
|
#define KEY_ENTER 0x0a
|
||||||
|
#define KEY_BACKSPACE 0x0E08
|
||||||
|
#define KEY_HOME 0x4700
|
||||||
|
#define KEY_LL 0x4f00 /* HOME DOWN, End */
|
||||||
|
#define KEY_DC 0x5300
|
||||||
|
#define KEY_IC 0x5200
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define A_NORMAL 3
|
||||||
|
#define A_STANDOUT 8
|
||||||
|
#define A_BOLD 8
|
||||||
|
#define A_REVERSE 127
|
||||||
|
#define A_BLINK 128
|
||||||
|
#define A_CHARTEXT 0x00ff
|
||||||
|
#define A_ATTRIBUTES 0xff00
|
||||||
|
|
||||||
|
#define chtype unsigned int
|
||||||
|
|
||||||
|
#define WINDOW text_info
|
||||||
|
|
||||||
|
extern struct WINDOW scr;
|
||||||
|
|
||||||
|
extern int stdscr;
|
||||||
|
|
||||||
|
extern int COLS;
|
||||||
|
extern int LINES;
|
||||||
|
extern int ECHO;
|
||||||
|
extern int NODEL;
|
||||||
|
|
||||||
|
void attrset(int);
|
||||||
|
|
||||||
|
#define initscr() clrscr();window(1,1,COLS,LINES);gettextinfo(&scr)
|
||||||
|
#define newwin(h,b,y,x) window(x+1,y+1,x+b+1,y+h+1);gettextinfo(&scr)
|
||||||
|
#define erasechar() KEY_ERASE
|
||||||
|
#define beep() putch(7)
|
||||||
|
#define flash() putch(7)
|
||||||
|
#define wclrtoeol(w) clreol()
|
||||||
|
#define clrtoeol() clreol()
|
||||||
|
#define werase(w) window(scr.winleft,scr.wintop,scr.winright,scr.winbottom)
|
||||||
|
#define erase() clrscr()
|
||||||
|
#define wclear(w) werase(w)
|
||||||
|
#define clear() clrscr()
|
||||||
|
/*
|
||||||
|
#define wattrset(w,a) textattr(a)
|
||||||
|
#define attrset(a) textattr(a)
|
||||||
|
*/
|
||||||
|
#define standout() highvideo()
|
||||||
|
#define standend() normvideo()
|
||||||
|
#define wmove(w,y,x) gotoxy(x+1,y+1)
|
||||||
|
#define move(y,x) gotoxy(x+1,y+1)
|
||||||
|
#define mvwaddch(w,y,x,c) gotoxy(x+1,y+1);putch(c)
|
||||||
|
#define mvaddch(y,x,c) gotoxy(x+1,y+1);putch(c)
|
||||||
|
#define waddch(w,c) putch(c)
|
||||||
|
#define addch(c) putch(c)
|
||||||
|
#define mvwaddstr(w,y,x,s) gotoxy(x+1,y+1);cputs(s)
|
||||||
|
#define mvaddstr(y,x,s) gotoxy(x+1,y+1);cputs(s)
|
||||||
|
#define waddstr(s) cputs(s)
|
||||||
|
#define addstr(s) cputs(s)
|
||||||
|
#define mvwprintw(w,y,x,s) gotoxy(x+1,y+1);cprintf(s)
|
||||||
|
#define mvprintw(y,x,s,a) gotoxy(x+1,y+1);cprintf(s,a)
|
||||||
|
#define wprintw(w,s) cprintf(s)
|
||||||
|
#define printw cprintf
|
||||||
|
#define getyx(w,y,x) x=wherex()-1;y=wherey()-1
|
||||||
|
#define getbegyx(w,y,x) x=scr.winleft;y=scr.wintop;
|
||||||
|
#define getmaxyx(w,y,x) x=(scr.winright)-(scr.winleft);y=(scr.winbottom)-(scr.wintop)+1
|
||||||
|
#define winsertln() insline()
|
||||||
|
#define insertln() insline()
|
||||||
|
#define wdeleteln(w) delline()
|
||||||
|
#define deleteln() delline()
|
||||||
|
#define mvwgetch(w,y,x) gotoxy(x+1,y+1);ugetch()
|
||||||
|
#define mvgetch(y,x) gotoxy(x+1,y+1);ugetch()
|
||||||
|
#define wgetch(w) ugetch()
|
||||||
|
#define mvwgetstr(w,y,x,s) gotoxy(x+1,y+1);gets(s)
|
||||||
|
#define mvgetstr(y,x,s) gotoxy(x+1,y+1);gets(s)
|
||||||
|
#define wgetstr(w,s) gets(s)
|
||||||
|
/*
|
||||||
|
#define getstr(s) gets(s)
|
||||||
|
*/
|
||||||
|
#define flushinp() fflush(stdin)
|
||||||
|
#define mvwscanw(w,y,x,s) gotoxy(x+1,y+1);cscanf(s)
|
||||||
|
#define mvscanw(y,x,s) gotoxy(x+1,y+1);cscanf(s)
|
||||||
|
#define wscanw(w,s) wscanw(s)
|
||||||
|
#define scanw cscanf
|
||||||
|
#define mvinsch(y,x,c) gotoxy(x+1,y+1);insch(c)
|
||||||
|
|
||||||
|
#define nodelay(w,b) NODEL=b
|
||||||
|
#define echo() ECHO=TRUE
|
||||||
|
#define noecho() ECHO=FALSE
|
||||||
|
|
||||||
|
#define nl()
|
||||||
|
#define nonl()
|
||||||
|
#define keypad(a,b)
|
||||||
|
#define refresh()
|
||||||
|
#define wrefresh(w)
|
||||||
|
#define cbreak()
|
||||||
|
#define endwin()
|
||||||
|
#define raw()
|
||||||
|
#define noraw()
|
||||||
|
#define notimeout(w,t)
|
||||||
|
#define idlok(w,b)
|
||||||
|
#define scrollok(a,b)
|
||||||
|
#define doupdate()
|
||||||
|
#define savetty()
|
||||||
|
#define resetty()
|
||||||
|
|
||||||
|
#define ERR (-1)
|
||||||
|
|
||||||
|
|
464
dosio.c
Normal file
464
dosio.c
Normal file
|
@ -0,0 +1,464 @@
|
||||||
|
/* DOSIO.C - file I/O and alloc subroutines for MSDOS - BVI
|
||||||
|
*
|
||||||
|
* 1996-02-28 V 1.0.0
|
||||||
|
* 1998-04-12 V 1.0.1
|
||||||
|
* 1999-01-14 V 1.1.0
|
||||||
|
* 1999-04-27 V 1.1.1
|
||||||
|
* 1999-07-02 V 1.2.0 beta
|
||||||
|
* 1999-09-01 V 1.2.0 final
|
||||||
|
* 2000-05-02 V 1.3.0 alpha
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <conio.h>
|
||||||
|
#include <alloc.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <bios.h>
|
||||||
|
#include <io.h>
|
||||||
|
#include <mem.h>
|
||||||
|
#include "bvi.h"
|
||||||
|
#include "set.h"
|
||||||
|
|
||||||
|
char *terminal = "ansi";
|
||||||
|
|
||||||
|
extern maxy;
|
||||||
|
struct WINDOW scr;
|
||||||
|
|
||||||
|
int stdscr = 0;
|
||||||
|
|
||||||
|
int COLS = 80;
|
||||||
|
int LINES = 25;
|
||||||
|
int ECHO = TRUE;
|
||||||
|
int NODEL = FALSE;
|
||||||
|
|
||||||
|
static struct stat buf;
|
||||||
|
int filemode;
|
||||||
|
|
||||||
|
int inch(void);
|
||||||
|
|
||||||
|
void
|
||||||
|
attrset(int attr)
|
||||||
|
{
|
||||||
|
switch(attr) {
|
||||||
|
case A_NORMAL: textcolor(P(P_CO) & 0x07);
|
||||||
|
textbackground((P(P_CO) & 0xf0) >> 4);
|
||||||
|
break;
|
||||||
|
case A_BOLD: textcolor((P(P_CO) & 0x07) | 0x08);
|
||||||
|
textbackground((P(P_CO) & 0xf0) >> 4);
|
||||||
|
break;
|
||||||
|
case A_REVERSE: textcolor((P(P_CO) & 0xf0) >> 4);
|
||||||
|
textbackground(P(P_CO) & 0x0f);
|
||||||
|
break;
|
||||||
|
case A_BLINK: textcolor((P(P_CO) & 0xf0) >> 4);
|
||||||
|
textbackground(P(P_CO) & 0x0f);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
getch()
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
|
||||||
|
if (NODEL) if (!kbhit()) return(ERR);
|
||||||
|
x = bioskey(0);
|
||||||
|
if ((x & 0xff) == 0) return(x);
|
||||||
|
else {
|
||||||
|
x &= 0xff;
|
||||||
|
if (ECHO) putch(x);
|
||||||
|
return(x); }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
delch()
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
x = wherex(); y = wherey();
|
||||||
|
movetext(x + 1, y, COLS - x, y, x, y);
|
||||||
|
gotoxy(COLS, y);
|
||||||
|
putch(' ');
|
||||||
|
gotoxy(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
insch(int c)
|
||||||
|
{
|
||||||
|
char line[80];
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
x = wherex(); y = wherey();
|
||||||
|
gettext(x, y, COLS - x, y, line);
|
||||||
|
puttext(x + 1, y, COLS - x + 1, y, line);
|
||||||
|
putch(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
inch()
|
||||||
|
{
|
||||||
|
return peek(0xb800, (wherex() - 1) + (wherey() - 1) * COLS);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
mvinch(int y, int x)
|
||||||
|
{
|
||||||
|
gotoxy(x + 1, y + 1);
|
||||||
|
return inch();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*********** Save the patched file ********************/
|
||||||
|
int
|
||||||
|
save(char *fname, PTR start, PTR end, int flags)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
char string[255];
|
||||||
|
char *newstr;
|
||||||
|
off_t written;
|
||||||
|
off_t filesize;
|
||||||
|
unsigned n, to_write;
|
||||||
|
|
||||||
|
if (!fname) {
|
||||||
|
emsg("No file|No current filename");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (stat(fname, &buf) == -1) {
|
||||||
|
newstr = "[New file] ";
|
||||||
|
} else {
|
||||||
|
if (S_ISDIR(buf.st_mode)) {
|
||||||
|
sprintf(string, "\"%s\" Is a directory", fname);
|
||||||
|
msg(string);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
newstr = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filemode == PARTIAL) flags = O_RDWR;
|
||||||
|
if ((fd = open(fname, flags, 0666)) < 0) {
|
||||||
|
sysemsg(fname);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (filemode == PARTIAL) {
|
||||||
|
if (block_read) {
|
||||||
|
filesize = block_read;
|
||||||
|
sprintf(string, "\"%s\" range %lu-%lu", fname,
|
||||||
|
(unsigned long)block_begin,
|
||||||
|
(unsigned long)(block_begin - 1 + filesize));
|
||||||
|
if (lseek(fd, block_begin, SEEK_SET) < 0) {
|
||||||
|
sysemsg(fname);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
msg("Null range");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
filesize = end - start + 1L;
|
||||||
|
sprintf(string, "\"%s\" %s%lu@bytes", fname, newstr, (long)filesize);
|
||||||
|
}
|
||||||
|
|
||||||
|
written = 0;
|
||||||
|
do {
|
||||||
|
to_write = (filesize - written) > 0xfffe ? 0xfffe : (filesize - written);
|
||||||
|
if ((n = write(fd, start + written, to_write)) == 0xffff) {
|
||||||
|
sysemsg(fname);
|
||||||
|
close(fd);
|
||||||
|
return(0L);
|
||||||
|
}
|
||||||
|
written += (off_t)n;
|
||||||
|
} while (written < filesize);
|
||||||
|
close(fd);
|
||||||
|
edits = 0;
|
||||||
|
msg(string);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
off_t
|
||||||
|
load(char *fname)
|
||||||
|
{
|
||||||
|
int fd = -1;
|
||||||
|
char string[MAXCMD];
|
||||||
|
unsigned chunk, n;
|
||||||
|
|
||||||
|
buf.st_size = filesize = 0L;
|
||||||
|
if (fname != NULL) {
|
||||||
|
if (stat(fname, &buf) == -1) {
|
||||||
|
filemode = NEW;
|
||||||
|
} else if (S_ISDIR(buf.st_mode)) {
|
||||||
|
filemode = DIRECTORY;
|
||||||
|
} else if (S_ISREG(buf.st_mode)) {
|
||||||
|
if ((fd = open(fname, O_RDONLY|O_BINARY)) > 0) {
|
||||||
|
filemode = REGULAR;
|
||||||
|
if (access(fname, 2)) {
|
||||||
|
P(P_RO) = TRUE;
|
||||||
|
params[P_RO].flags |= P_CHANGED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sysemsg(fname);
|
||||||
|
filemode = ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
filemode = NEW;
|
||||||
|
}
|
||||||
|
if (mem != NULL) farfree(mem);
|
||||||
|
if (block_flag) {
|
||||||
|
memsize = block_size + 1000;
|
||||||
|
} else if (filemode == REGULAR) {
|
||||||
|
memsize = buf.st_size + 100;
|
||||||
|
} else {
|
||||||
|
memsize = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (farcoreleft() < memsize) {
|
||||||
|
move(maxy, 0);
|
||||||
|
endwin();
|
||||||
|
printf("\n\nOut of memory\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
mem = (char huge *)farmalloc(memsize);
|
||||||
|
|
||||||
|
clear_marks();
|
||||||
|
if (block_flag && (filemode == REGULAR)) {
|
||||||
|
if (lseek(fd, block_begin, SEEK_SET) < 0) {
|
||||||
|
sysemsg(fname);
|
||||||
|
filemode = ERROR;
|
||||||
|
} else {
|
||||||
|
chunk = block_size > 0xfffe ? 0xfffe : block_size;
|
||||||
|
do {
|
||||||
|
if ((n = read(fd, mem + filesize, chunk)) == 0xffff) {
|
||||||
|
sysemsg(fname);
|
||||||
|
filemode = ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
filesize += (off_t)n;
|
||||||
|
} while (filesize < buf.st_size);
|
||||||
|
if ((filesize == 0) {
|
||||||
|
sprintf(string, "\"%s\" No such range: %lu-%lu", fname,
|
||||||
|
(unsigned long)block_begin, (unsigned long)(block_end));
|
||||||
|
} else {
|
||||||
|
sprintf(string, "\"%s\" range %lu-%lu", fname,
|
||||||
|
(unsigned long)block_begin,
|
||||||
|
(unsigned long)(block_begin + filesize - 1));
|
||||||
|
}
|
||||||
|
filemode = PARTIAL;
|
||||||
|
block_read = filesize;
|
||||||
|
msg(string);
|
||||||
|
P(P_OF) = block_begin;
|
||||||
|
params[P_OF].flags |= P_CHANGED;
|
||||||
|
}
|
||||||
|
} else if (filemode == REGULAR) {
|
||||||
|
chunk = buf.st_size > 0xfffe ? 0xfffe : buf.st_size;
|
||||||
|
do {
|
||||||
|
if ((n = read(fd, mem + filesize, chunk)) == 0xffff) {
|
||||||
|
sysemsg(fname);
|
||||||
|
filemode = ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
filesize += (off_t)n;
|
||||||
|
} while (filesize < buf.st_size);
|
||||||
|
}
|
||||||
|
if (fd > 0) close(fd);
|
||||||
|
if (filemode != REGULAR) {
|
||||||
|
filesize = 0L;
|
||||||
|
}
|
||||||
|
if (fname != NULL) {
|
||||||
|
switch (filemode) {
|
||||||
|
case NEW:
|
||||||
|
sprintf(string, "\"%s\" [New File]", fname);
|
||||||
|
break;
|
||||||
|
case REGULAR:
|
||||||
|
sprintf(string, "\"%s\" %s%lu bytes", fname,
|
||||||
|
P(P_RO) ? "[Read only] " : "", (long)filesize);
|
||||||
|
break;
|
||||||
|
case DIRECTORY:
|
||||||
|
sprintf(string, "\"%s\" Directory", fname);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (filemode != ERROR) msg(string);
|
||||||
|
}
|
||||||
|
pagepos = mem;
|
||||||
|
maxpos = (PTR)(mem + filesize);
|
||||||
|
loc = HEX;
|
||||||
|
x = AnzAdd; y = 0;
|
||||||
|
repaint();
|
||||||
|
return(filesize);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
addfile(char *fname)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
off_t oldsize;
|
||||||
|
unsigned chunk, n;
|
||||||
|
|
||||||
|
if (stat(fname, &buf)) {
|
||||||
|
sysemsg(fname);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if ((fd = open(fname, O_RDONLY)) == -1) {
|
||||||
|
sysemsg(fname);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
oldsize = filesize;
|
||||||
|
if (enlarge(buf.st_size)) return 1;
|
||||||
|
chunk = buf.st_size > 0xfffe ? 0xfffe : buf.st_size;
|
||||||
|
do {
|
||||||
|
if ((n = read(fd, mem + filesize, chunk)) == 0xffff) {
|
||||||
|
sysemsg(fname);
|
||||||
|
filemode = ERROR;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
filesize += (off_t)n;
|
||||||
|
} while (filesize < buf.st_size);
|
||||||
|
maxpos = mem + filesize;
|
||||||
|
close(fd);
|
||||||
|
setpage(mem + oldsize);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
bvi_init(char *dir)
|
||||||
|
{
|
||||||
|
char *poi;
|
||||||
|
char *initstr;
|
||||||
|
char rcpath[255];
|
||||||
|
|
||||||
|
shell = getenv("COMSPEC");
|
||||||
|
if (shell == NULL || *shell == '\0')
|
||||||
|
shell = "COMMAND.COM";
|
||||||
|
|
||||||
|
strcpy(rcpath, dir);
|
||||||
|
poi = strrchr(rcpath, '\\');
|
||||||
|
*poi = '\0';
|
||||||
|
strcat(rcpath, "\\BVI.RC");
|
||||||
|
|
||||||
|
if ((initstr = getenv("BVIINIT")) != NULL) {
|
||||||
|
docmdline(initstr);
|
||||||
|
}
|
||||||
|
read_rc("BVI.RC");
|
||||||
|
read_rc(rcpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
enlarge(off_t add)
|
||||||
|
{
|
||||||
|
PTR newmem;
|
||||||
|
off_t savecur, savepag, savemax, saveundo;
|
||||||
|
|
||||||
|
savecur = curpos - mem;
|
||||||
|
savepag = pagepos - mem;
|
||||||
|
savemax = maxpos - mem;
|
||||||
|
saveundo = undo_start - mem;
|
||||||
|
|
||||||
|
newmem = (PTR)farrealloc(mem, memsize + add);
|
||||||
|
if (newmem == NULL) {
|
||||||
|
emsg("Out of memory");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
mem = newmem;
|
||||||
|
memsize += add;
|
||||||
|
curpos = mem + savecur;
|
||||||
|
pagepos = mem + savepag;
|
||||||
|
maxpos = mem + savemax;
|
||||||
|
undo_start = mem + saveundo;
|
||||||
|
current = curpos + 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
do_shell()
|
||||||
|
{
|
||||||
|
system("");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
off_t
|
||||||
|
alloc_buf(off_t n, char **buffer)
|
||||||
|
{
|
||||||
|
if ((*buffer = (char *)farrealloc(*buffer, n)) == NULL) {
|
||||||
|
emsg("No buffer space available");
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
d_memmove(PTR dest, PTR src, off_t n)
|
||||||
|
{
|
||||||
|
unsigned len;
|
||||||
|
long chunk;
|
||||||
|
PTR source;
|
||||||
|
PTR destin;
|
||||||
|
|
||||||
|
chunk = n;
|
||||||
|
if (dest < src) {
|
||||||
|
/* copy forward */
|
||||||
|
source = src;
|
||||||
|
destin = dest;
|
||||||
|
while (chunk > 0L) {
|
||||||
|
len = chunk > 0x7ffe ? 0x7ffe : chunk;
|
||||||
|
movmem(source, destin, len);
|
||||||
|
chunk -= len;
|
||||||
|
source += len;
|
||||||
|
destin += len;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* copy backward */
|
||||||
|
source = src + n;
|
||||||
|
destin = dest + n;
|
||||||
|
while (chunk > 0L) {
|
||||||
|
len = chunk > 0x7ffe ? 0x7ffe : chunk;
|
||||||
|
chunk -= len;
|
||||||
|
source -= len;
|
||||||
|
destin -= len;
|
||||||
|
movmem(source, destin, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
d_memcpy(PTR dest, PTR src, off_t n)
|
||||||
|
{
|
||||||
|
unsigned len;
|
||||||
|
long chunk;
|
||||||
|
PTR source;
|
||||||
|
PTR destin;
|
||||||
|
|
||||||
|
source = src;
|
||||||
|
destin = dest;
|
||||||
|
chunk = n;
|
||||||
|
while (chunk > 0L) {
|
||||||
|
len = chunk > 0x7ffe ? 0x7ffe : chunk;
|
||||||
|
movmem(source, destin, len);
|
||||||
|
chunk -= len;
|
||||||
|
source += len;
|
||||||
|
destin += len;
|
||||||
|
}
|
||||||
|
}
|
897
edit.c
Normal file
897
edit.c
Normal file
|
@ -0,0 +1,897 @@
|
||||||
|
/* edit - the edit commands
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* 1999-04-19 V 1.1.2
|
||||||
|
* 1999-07-02 V 1.2.0 beta
|
||||||
|
* 1999-10-30 V 1.2.0 final
|
||||||
|
* 2000-05-14 V 1.3.0 alpha
|
||||||
|
* 2000-07-15 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bvi.h"
|
||||||
|
#include "set.h"
|
||||||
|
|
||||||
|
extern int precount;
|
||||||
|
|
||||||
|
char contrd[][4] = {"NUL", " ^A", " ^B", " ^C", " ^D", " ^E", " ^F", "BEL",
|
||||||
|
" BS", "TAB", " NL", "HOM", "CLR", " CR", " ^N", " ^O",
|
||||||
|
" ^P", " ^Q", " ^R", " ^S", " ^T", " ^U", " ^V", " ^W",
|
||||||
|
" ^X", " ^Y", " ^Z", "ESC", " FS", " GS", " RS", " US",
|
||||||
|
"DEL" };
|
||||||
|
char contru[][4] = {"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
|
||||||
|
" BS", " HT", " NL", " VT", " NP", " CR", " SO", " SI",
|
||||||
|
"DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
|
||||||
|
"CAN", " EM", "SUB", "ESC", " FS", " GS", " RS", " US",
|
||||||
|
"DEL" };
|
||||||
|
char tmpbuf[10];
|
||||||
|
char linbuf[256];
|
||||||
|
|
||||||
|
static char getcbuff[BUFFER];
|
||||||
|
static char *getcnext = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
/* mode: ('A') append
|
||||||
|
* ('R') replace one or more different characters
|
||||||
|
* ('r') replace 1 character
|
||||||
|
* ('i') insert characters
|
||||||
|
* ('a') insert after cursor
|
||||||
|
* a precount can be used
|
||||||
|
*
|
||||||
|
* for insert and append we misuse the undo buffer for the inserted
|
||||||
|
* characters (for "." command)
|
||||||
|
*/
|
||||||
|
off_t
|
||||||
|
edit(mode)
|
||||||
|
int mode;
|
||||||
|
{
|
||||||
|
int ch, ch1;
|
||||||
|
size_t len;
|
||||||
|
off_t count = 0L;
|
||||||
|
off_t buffer = BUFFER;
|
||||||
|
off_t psize;
|
||||||
|
|
||||||
|
if (!filesize && mode == 'i') {
|
||||||
|
mode = 'A';
|
||||||
|
}
|
||||||
|
if (mode != 'A' && mode != 'a') {
|
||||||
|
if (current - mem >= filesize) {
|
||||||
|
beep();
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (precount < 1) precount = 1;
|
||||||
|
len = strlen(rep_buf);
|
||||||
|
if (mode == 'r' && current + precount > maxpos) {
|
||||||
|
beep();
|
||||||
|
rep_buf[len] = '\0';
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
if (alloc_buf(buffer, &undo_buf) == 0L) {
|
||||||
|
rep_buf[len] = '\0';
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
switch(mode) {
|
||||||
|
case 'A': edits = U_APPEND;
|
||||||
|
break;
|
||||||
|
case 'R': edits = U_EDIT;
|
||||||
|
smsg("REPLACE MODE");
|
||||||
|
break;
|
||||||
|
case 'r': edits = U_EDIT;
|
||||||
|
smsg("REPLACE 1 CHAR");
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
case 'i': edits = U_INSERT;
|
||||||
|
smsg("INSERT MODE");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
undo_start = current;
|
||||||
|
|
||||||
|
while((ch = vgetc()) != ESC) {
|
||||||
|
ch &= 0xff;
|
||||||
|
rep_buf[len++] = ch;
|
||||||
|
if (ch == '\t') {
|
||||||
|
toggle();
|
||||||
|
setcur();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (ch == KEY_BACKSPACE || ch == CTRL('H')) {
|
||||||
|
if (count > 0) {
|
||||||
|
len--;
|
||||||
|
count--;
|
||||||
|
if (mode == 'A' || mode == 'a' || mode == 'i') {
|
||||||
|
filesize--;
|
||||||
|
maxpos--;
|
||||||
|
}
|
||||||
|
current--;
|
||||||
|
cur_back();
|
||||||
|
setcur();
|
||||||
|
} else beep();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (loc == HEX) {
|
||||||
|
if (isxdigit(ch)) {
|
||||||
|
mvaddch(y, x + 1, ' ');
|
||||||
|
mvaddch(y, x, ch);
|
||||||
|
do {
|
||||||
|
ch1 = vgetc() & 0xff;
|
||||||
|
if (ch1 == ESC) {
|
||||||
|
mvaddch(y, x, ' ');
|
||||||
|
current--;
|
||||||
|
cur_back();
|
||||||
|
goto escape;
|
||||||
|
}
|
||||||
|
if (!isxdigit(ch1)) {
|
||||||
|
beep();
|
||||||
|
ch1 = -1;
|
||||||
|
}
|
||||||
|
} while (ch1 == -1);
|
||||||
|
rep_buf[len++] = ch;
|
||||||
|
mvaddch(y, x + 1, ch1);
|
||||||
|
sprintf(tmpbuf, "%c%c", ch, ch1);
|
||||||
|
sscanf(tmpbuf, "%2x", &ch);
|
||||||
|
} else {
|
||||||
|
beep();
|
||||||
|
len--;
|
||||||
|
goto wrong;
|
||||||
|
}
|
||||||
|
} else { /*** ASCII - Bereich ***/
|
||||||
|
if (isprint(ch)) {
|
||||||
|
mvaddch(y, x, ch);
|
||||||
|
} else {
|
||||||
|
beep();
|
||||||
|
goto wrong;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
curpos = current++;
|
||||||
|
if (mode == 'i' || mode == 'a') {
|
||||||
|
memmove(current, curpos, maxpos - curpos);
|
||||||
|
}
|
||||||
|
if (mode == 'A' || mode == 'i' || mode == 'a') {
|
||||||
|
maxpos++;
|
||||||
|
filesize++;
|
||||||
|
/* NEU
|
||||||
|
undo_buf[count++] = ch;
|
||||||
|
*/
|
||||||
|
count++;
|
||||||
|
} else {
|
||||||
|
undo_buf[count++] = *curpos;
|
||||||
|
}
|
||||||
|
if (count == buffer) {
|
||||||
|
buffer += BUFFER;
|
||||||
|
if (alloc_buf(buffer, &undo_buf) == 0L) {
|
||||||
|
rep_buf[len] = '\0';
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*curpos = (char)ch;
|
||||||
|
cur_forw(0);
|
||||||
|
statpos();
|
||||||
|
if (mode == 'i' || mode == 'a') {
|
||||||
|
repaint();
|
||||||
|
} else {
|
||||||
|
lineout();
|
||||||
|
}
|
||||||
|
setcur();
|
||||||
|
|
||||||
|
if (filesize > memsize - 2L) {
|
||||||
|
if (enlarge(100L)) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((mode != 'A' && mode != 'a') && curpos == maxpos - 1) break;
|
||||||
|
if (mode == 'r') { break; }
|
||||||
|
wrong:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
rep_buf[len++] = ESC;
|
||||||
|
rep_buf[len] = '\0';
|
||||||
|
if (!count) goto escape;
|
||||||
|
|
||||||
|
if (precount > 1) {
|
||||||
|
switch (mode) {
|
||||||
|
case 'i':
|
||||||
|
case 'a':
|
||||||
|
case 'A':
|
||||||
|
psize = count * (precount - 1);
|
||||||
|
if (filesize + psize > memsize - 2L) {
|
||||||
|
if (enlarge(psize + 100L)) return count;
|
||||||
|
}
|
||||||
|
if (psize + count > buffer) {
|
||||||
|
if (alloc_buf(psize + count, &undo_buf) == 0L)
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode == 'i' || mode == 'a') {
|
||||||
|
memmove(current + psize, current, maxpos - curpos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NEU
|
||||||
|
undo_pos = undo_buf + count - 1L;
|
||||||
|
*/
|
||||||
|
while (--precount) {
|
||||||
|
/* NEU
|
||||||
|
memcpy(undo_pos + 1L, undo_pos - count + 1L, count);
|
||||||
|
undo_pos += count;
|
||||||
|
*/
|
||||||
|
memcpy(curpos + 1L, curpos - count + 1L, count);
|
||||||
|
curpos += count;
|
||||||
|
}
|
||||||
|
filesize += psize;
|
||||||
|
count += psize;
|
||||||
|
maxpos += psize;
|
||||||
|
undo_count += psize;
|
||||||
|
current = curpos + 1L;
|
||||||
|
setpage(current);
|
||||||
|
repaint();
|
||||||
|
break;
|
||||||
|
case 'R':
|
||||||
|
if (current + count * (precount - 1) > maxpos) break;
|
||||||
|
psize = count;
|
||||||
|
while (--precount) {
|
||||||
|
memcpy(undo_buf + psize, curpos + 1L, count);
|
||||||
|
psize += count;
|
||||||
|
memcpy(curpos + 1L, curpos - count + 1L, count);
|
||||||
|
curpos += count;
|
||||||
|
}
|
||||||
|
count = psize;
|
||||||
|
setpage(++curpos);
|
||||||
|
repaint();
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
while (--precount) {
|
||||||
|
undo_buf[count++] = *(++curpos);
|
||||||
|
*curpos = (char)ch;
|
||||||
|
cur_forw(0);
|
||||||
|
statpos();
|
||||||
|
lineout();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cur_back();
|
||||||
|
escape:
|
||||||
|
setcur();
|
||||||
|
smsg("");
|
||||||
|
return(count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Do the f, F, t ot T command
|
||||||
|
* If flag == 1 save the character in rep_buf
|
||||||
|
* else setpage()
|
||||||
|
*/
|
||||||
|
PTR
|
||||||
|
do_ft(ch, flag)
|
||||||
|
int ch, flag;
|
||||||
|
{
|
||||||
|
static int chi;
|
||||||
|
static int chp = 1;
|
||||||
|
int dir;
|
||||||
|
size_t n;
|
||||||
|
PTR ptr;
|
||||||
|
|
||||||
|
switch (ch) {
|
||||||
|
case 1: beep();
|
||||||
|
return NULL; /* no previous command */
|
||||||
|
case -1: if (chp == 'f' || chp == 't') dir = BACKWARD;
|
||||||
|
else dir = FORWARD;
|
||||||
|
break; /* same again */
|
||||||
|
case 0: if (chp == 'f' || chp == 't') dir = FORWARD;
|
||||||
|
else dir = BACKWARD;
|
||||||
|
break; /* same again */
|
||||||
|
default: chp = ch;
|
||||||
|
if (chp == 'f' || chp == 't') dir = FORWARD;
|
||||||
|
else dir = BACKWARD;
|
||||||
|
chi = vgetc();
|
||||||
|
if (flag) {
|
||||||
|
n = strlen(rep_buf);
|
||||||
|
rep_buf[n++] = chi;
|
||||||
|
rep_buf[n] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ptr = current;
|
||||||
|
do {
|
||||||
|
if (dir == FORWARD) {
|
||||||
|
do {
|
||||||
|
ptr++;
|
||||||
|
if (ptr > maxpos) break;
|
||||||
|
} while (*ptr != chi);
|
||||||
|
if (ptr > maxpos) break;
|
||||||
|
} else {
|
||||||
|
do {
|
||||||
|
ptr--;
|
||||||
|
if (ptr < mem) break;
|
||||||
|
} while (*ptr != chi);
|
||||||
|
if (ptr < mem) break;
|
||||||
|
}
|
||||||
|
} while (--precount > 0);
|
||||||
|
if (*ptr == chi) {
|
||||||
|
if (loc == HEX) toggle();
|
||||||
|
if (chp == 't') ptr--;
|
||||||
|
if (chp == 'T') ptr++;
|
||||||
|
if (!flag) {
|
||||||
|
setpage(ptr);
|
||||||
|
}
|
||||||
|
return(ptr);
|
||||||
|
}
|
||||||
|
beep();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
do_z(mode)
|
||||||
|
int mode;
|
||||||
|
{
|
||||||
|
switch (mode) {
|
||||||
|
case '.': while (y != maxy / 2) {
|
||||||
|
if (y > maxy / 2) {
|
||||||
|
pagepos += Anzahl;
|
||||||
|
y--;
|
||||||
|
} else {
|
||||||
|
if (pagepos == mem) break;
|
||||||
|
pagepos -= Anzahl;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '-': while (y < maxy - 1) {
|
||||||
|
if (pagepos == mem) break;
|
||||||
|
pagepos -= Anzahl;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '\0':
|
||||||
|
case '\n':
|
||||||
|
case '\r': while (y > 0) {
|
||||||
|
y--;
|
||||||
|
pagepos += Anzahl;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default : beep();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
scrolldown(lns)
|
||||||
|
int lns;
|
||||||
|
{
|
||||||
|
while (lns--) {
|
||||||
|
if (maxpos >= (pagepos + Anzahl)) pagepos += Anzahl;
|
||||||
|
else { beep(); lns = 0; }
|
||||||
|
repaint();
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
scrollup(lns)
|
||||||
|
int lns;
|
||||||
|
{
|
||||||
|
while (lns--) {
|
||||||
|
if (mem <= (PTR)(pagepos - Anzahl)) pagepos -= Anzahl;
|
||||||
|
else { beep(); lns = 0; }
|
||||||
|
repaint();
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
xpos()
|
||||||
|
{
|
||||||
|
if (loc == HEX) return((x - AnzAdd) / 3);
|
||||||
|
else return(x - AnzAdd - Anzahl3);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
toggle()
|
||||||
|
{
|
||||||
|
if (loc == HEX) {
|
||||||
|
x = xpos() + AnzAdd + Anzahl3;
|
||||||
|
loc = ASCII;
|
||||||
|
} else {
|
||||||
|
x = xpos() * 3 + AnzAdd;
|
||||||
|
loc = HEX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
setcur()
|
||||||
|
{
|
||||||
|
move(y, x);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/************* display current position *************/
|
||||||
|
void
|
||||||
|
statpos()
|
||||||
|
{
|
||||||
|
unsigned char Char1;
|
||||||
|
off_t bytepos;
|
||||||
|
char string[30], str[6];
|
||||||
|
|
||||||
|
if (!P(P_MO)) return;
|
||||||
|
bytepos = current - mem;
|
||||||
|
if (bytepos >= filesize) {
|
||||||
|
mvaddstr(maxy, status, " ");
|
||||||
|
return; }
|
||||||
|
Char1 = *(mem + bytepos);
|
||||||
|
|
||||||
|
if (isprint(Char1)) {
|
||||||
|
sprintf(str, "'%c'", Char1);
|
||||||
|
} else if (Char1 < 32) {
|
||||||
|
if (P(P_US)) strcpy(str, contru[Char1]);
|
||||||
|
else strcpy(str, contrd[Char1]);
|
||||||
|
} else if (Char1 == 127) {
|
||||||
|
if (P(P_US)) strcpy(str, contru[32]);
|
||||||
|
else strcpy(str, contrd[32]);
|
||||||
|
} else strcpy(str, " ");
|
||||||
|
|
||||||
|
sprintf(string, "%08lX \\%03o 0x%02X %3d %3s",
|
||||||
|
(long)(bytepos + P(P_OF)), Char1, Char1, Char1, str);
|
||||||
|
attrset(A_BOLD);
|
||||||
|
mvaddstr(maxy, status, string);
|
||||||
|
attrset(A_NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
printline(mempos, scpos)
|
||||||
|
PTR mempos;
|
||||||
|
int scpos;
|
||||||
|
{
|
||||||
|
int print_pos;
|
||||||
|
unsigned char Zeichen;
|
||||||
|
|
||||||
|
if (mempos > maxpos) {
|
||||||
|
strcpy(linbuf, "~ ");
|
||||||
|
} else {
|
||||||
|
sprintf(linbuf, addr_form, (long)(mempos - mem + P(P_OF)));
|
||||||
|
*string = '\0';
|
||||||
|
}
|
||||||
|
for (print_pos = 0; print_pos < Anzahl; print_pos++) {
|
||||||
|
if (mempos + print_pos >= maxpos) {
|
||||||
|
sprintf(tmpbuf, " ");
|
||||||
|
Zeichen = ' ';
|
||||||
|
} else {
|
||||||
|
Zeichen = *(mempos + print_pos);
|
||||||
|
sprintf(tmpbuf, "%02X ", Zeichen);
|
||||||
|
}
|
||||||
|
strcat(linbuf, tmpbuf);
|
||||||
|
if (isprint(Zeichen))
|
||||||
|
*(string + print_pos) = Zeichen;
|
||||||
|
else
|
||||||
|
*(string + print_pos) = '.';
|
||||||
|
}
|
||||||
|
*(string + Anzahl) = '\0';
|
||||||
|
strcat(linbuf, string);
|
||||||
|
mvaddstr(scpos, 0, linbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* displays a line on screen
|
||||||
|
* at pagepos + line y
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
lineout()
|
||||||
|
{
|
||||||
|
off_t Adresse;
|
||||||
|
|
||||||
|
Adresse = pagepos - mem + y * Anzahl;
|
||||||
|
printline(mem + Adresse, y);
|
||||||
|
move(y, x);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
new_screen()
|
||||||
|
{
|
||||||
|
screen = Anzahl * (maxy - 1);
|
||||||
|
clear();
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
repaint() /***** redraw screen *********************/
|
||||||
|
{
|
||||||
|
int save_y;
|
||||||
|
|
||||||
|
save_y = y;
|
||||||
|
for (y = 0; y < maxy; y++) lineout();
|
||||||
|
y = save_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/******* display an arbitrary address on screen *******/
|
||||||
|
void
|
||||||
|
setpage(addr)
|
||||||
|
PTR addr;
|
||||||
|
{
|
||||||
|
if ((addr >= pagepos) && ((addr - pagepos) < screen)) {
|
||||||
|
y = (addr - pagepos) / Anzahl;
|
||||||
|
if (loc == HEX)
|
||||||
|
x = AnzAdd + ((addr - pagepos) - y * Anzahl) * 3;
|
||||||
|
else
|
||||||
|
x = AnzAdd + Anzahl3 + ((addr - pagepos) - y * Anzahl);
|
||||||
|
} else {
|
||||||
|
pagepos = (((addr - mem) / Anzahl) * Anzahl + mem)
|
||||||
|
- (Anzahl * (maxy / 2));
|
||||||
|
if (pagepos < mem) pagepos = mem;
|
||||||
|
y = (addr - pagepos) / Anzahl;
|
||||||
|
if (loc == HEX)
|
||||||
|
x = AnzAdd + ((addr - pagepos) - y * Anzahl) * 3;
|
||||||
|
else
|
||||||
|
x = AnzAdd + Anzahl3 + ((addr - pagepos) - y * Anzahl);
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
cur_forw(check)
|
||||||
|
int check;
|
||||||
|
{
|
||||||
|
if (check) {
|
||||||
|
if (current - mem >= filesize) {
|
||||||
|
beep();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (loc == ASCII) {
|
||||||
|
if (x < AnzAdd - 1 + Anzahl3 + Anzahl) {
|
||||||
|
x++ ;
|
||||||
|
return 0;
|
||||||
|
} else x = AnzAdd + Anzahl3;
|
||||||
|
} else {
|
||||||
|
if (x < 5 + Anzahl3) {
|
||||||
|
x += 3;
|
||||||
|
return 0;
|
||||||
|
} else x = AnzAdd;
|
||||||
|
}
|
||||||
|
statpos();
|
||||||
|
lineout();
|
||||||
|
if (y < maxy - 1) {
|
||||||
|
y++;
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
if (pagepos < (PTR)(mem + filesize)) {
|
||||||
|
pagepos += Anzahl;
|
||||||
|
repaint();
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
beep();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
cur_back()
|
||||||
|
{
|
||||||
|
if (loc == ASCII) {
|
||||||
|
if (x > AnzAdd + Anzahl3) {
|
||||||
|
x-- ;
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
x = AnzAdd - 1 + Anzahl3 + Anzahl;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (x > AnzAdd + 2) {
|
||||||
|
x -= 3;
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
if (current == mem) return 0;
|
||||||
|
x = AnzAdd + Anzahl3 - 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
statpos();
|
||||||
|
lineout();
|
||||||
|
if (y > 0) {
|
||||||
|
y--;
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
if (pagepos > mem) {
|
||||||
|
pagepos -= Anzahl;
|
||||||
|
repaint();
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
beep();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
fileinfo(fname)
|
||||||
|
char *fname;
|
||||||
|
{
|
||||||
|
off_t bytepos;
|
||||||
|
char fstatus[64];
|
||||||
|
|
||||||
|
if (fname) {
|
||||||
|
sprintf(string, "\"%s\" ", fname);
|
||||||
|
} else {
|
||||||
|
strcpy(string, "No file ");
|
||||||
|
}
|
||||||
|
if (filemode != NEW && filemode != REGULAR)
|
||||||
|
strcat(string, "[Not edited] ");
|
||||||
|
if (P(P_RO)) strcat(string, "[Read only] ");
|
||||||
|
if (edits) strcat(string, "[Modified] ");
|
||||||
|
if (filesize) {
|
||||||
|
bytepos = (pagepos + y * Anzahl + xpos()) - mem + 1L;
|
||||||
|
sprintf(fstatus, "byte %lu of %lu --%lu%%--", (long)bytepos,
|
||||||
|
(long)filesize, (long)(bytepos * 100L / filesize));
|
||||||
|
strcat(string, fstatus);
|
||||||
|
} else {
|
||||||
|
strcat(string, " 0 bytes");
|
||||||
|
}
|
||||||
|
msg(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********** END ************/
|
||||||
|
void
|
||||||
|
quit()
|
||||||
|
{
|
||||||
|
move(maxy, 0);
|
||||||
|
endwin();
|
||||||
|
printf("\nbvi version %s %s\n", VERSION, copyright);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
vgetc()
|
||||||
|
{
|
||||||
|
int nextc;
|
||||||
|
|
||||||
|
if (getcnext != NULL) {
|
||||||
|
nextc = *getcnext++;
|
||||||
|
if (*getcnext == '\0') {
|
||||||
|
*getcbuff = '\0';
|
||||||
|
getcnext = NULL;
|
||||||
|
}
|
||||||
|
return(nextc);
|
||||||
|
}
|
||||||
|
return getch();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
stuffin(s)
|
||||||
|
char *s;
|
||||||
|
{
|
||||||
|
if (s == NULL) { /* clear the stuff buffer */
|
||||||
|
getcnext = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (getcnext == NULL) {
|
||||||
|
strcpy(getcbuff, s);
|
||||||
|
getcnext = getcbuff;
|
||||||
|
} else
|
||||||
|
strcat(getcbuff, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
do_back(n, start)
|
||||||
|
off_t n;
|
||||||
|
PTR start;
|
||||||
|
{
|
||||||
|
if (start - n < mem) {
|
||||||
|
beep();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((undo_count = alloc_buf(n, &undo_buf)) == 0L)
|
||||||
|
return;
|
||||||
|
yanked = alloc_buf(n, &yank_buf);
|
||||||
|
edits = U_BACK;
|
||||||
|
undo_start = start - n;
|
||||||
|
memcpy(undo_buf, start - undo_count, undo_count);
|
||||||
|
memcpy(yank_buf, start - undo_count, undo_count);
|
||||||
|
memmove(start - undo_count, start, maxpos - start);
|
||||||
|
filesize -= undo_count;
|
||||||
|
maxpos -= undo_count;
|
||||||
|
setpage(start - undo_count);
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
do_delete(n, start)
|
||||||
|
off_t n;
|
||||||
|
PTR start;
|
||||||
|
{
|
||||||
|
if (n + start > maxpos) {
|
||||||
|
beep();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if ((undo_count = alloc_buf(n, &undo_buf)) == 0L)
|
||||||
|
return 1;
|
||||||
|
yanked = alloc_buf(n, &yank_buf);
|
||||||
|
edits = U_DELETE;
|
||||||
|
undo_start = start;
|
||||||
|
memcpy(undo_buf, start, undo_count);
|
||||||
|
memcpy(yank_buf, start, undo_count);
|
||||||
|
memmove(start, start + undo_count, maxpos - (start + undo_count));
|
||||||
|
filesize -= undo_count;
|
||||||
|
maxpos -= undo_count;
|
||||||
|
if (start == maxpos) {
|
||||||
|
start--;
|
||||||
|
cur_back();
|
||||||
|
}
|
||||||
|
setpage(start);
|
||||||
|
repaint();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The :insert, :append and :change command
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
do_ins_chg(start, arg, mode)
|
||||||
|
PTR start;
|
||||||
|
char *arg;
|
||||||
|
int mode;
|
||||||
|
{
|
||||||
|
int base;
|
||||||
|
off_t buffer = BUFFER;
|
||||||
|
off_t count = 0L;
|
||||||
|
size_t len;
|
||||||
|
long val;
|
||||||
|
char *tempbuf = NULL;
|
||||||
|
char *poi, *epoi;
|
||||||
|
|
||||||
|
if ((mode == U_EDIT) && (current - mem >= filesize)) {
|
||||||
|
beep();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
len = strlen(arg);
|
||||||
|
if (!strncmp("ascii", arg, len) && CMDLNG(5, 1)) {
|
||||||
|
base = 1;
|
||||||
|
} else if (!strncmp("binary", arg, len) && CMDLNG(6, 1)) {
|
||||||
|
base = 2;
|
||||||
|
} else if (!strncmp("octal", arg, len) && CMDLNG(5, 1)) {
|
||||||
|
base = 8;
|
||||||
|
} else if (!strncmp("decimal", arg, len) && CMDLNG(7, 1)) {
|
||||||
|
base = 10;
|
||||||
|
} else if (!strncmp("hexadecimal", arg, len) && CMDLNG(11, 1)) {
|
||||||
|
base = 16;
|
||||||
|
} else {
|
||||||
|
emsg("No such option");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
addch('\n');
|
||||||
|
if (getcmdstr(cmdstr, 0) == 1) {
|
||||||
|
repaint();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (alloc_buf(buffer, &tempbuf) == 0L) return;
|
||||||
|
while(strcmp(cmdstr, ".")) {
|
||||||
|
poi = cmdstr;
|
||||||
|
if (base == 1) { /* ASCII */
|
||||||
|
while (*poi != '\0') {
|
||||||
|
if (*poi == '\\') {
|
||||||
|
switch (*(++poi)) {
|
||||||
|
case 'n': val = '\n'; break;
|
||||||
|
case 'r': val = '\r'; break;
|
||||||
|
case 't': val = '\t'; break;
|
||||||
|
case '0': val = '\0'; break;
|
||||||
|
case '\\': val = '\\'; break;
|
||||||
|
default : val = '\\'; poi--;
|
||||||
|
}
|
||||||
|
poi++;
|
||||||
|
} else {
|
||||||
|
val = *poi++;
|
||||||
|
}
|
||||||
|
*(tempbuf + count++) = val;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
while (isspace(cmdstr[strlen(cmdstr) - 1]))
|
||||||
|
cmdstr[strlen(cmdstr) - 1] = '\0';
|
||||||
|
while (*poi != '\0') {
|
||||||
|
val = strtol(poi, &epoi, base);
|
||||||
|
if (val > 255 || val < 0 || poi == epoi) {
|
||||||
|
repaint();
|
||||||
|
emsg("Invalid value");
|
||||||
|
goto mfree;
|
||||||
|
}
|
||||||
|
poi = epoi;
|
||||||
|
*(tempbuf + count++) = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addch('\n');
|
||||||
|
if (getcmdstr(cmdstr, 0) == 1) {
|
||||||
|
repaint();
|
||||||
|
goto mfree;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count == 0) {
|
||||||
|
repaint();
|
||||||
|
goto mfree;
|
||||||
|
}
|
||||||
|
switch (mode) {
|
||||||
|
case U_INSERT:
|
||||||
|
do_put(start, count, tempbuf);
|
||||||
|
break;
|
||||||
|
case U_EDIT:
|
||||||
|
do_over(start, count, tempbuf);
|
||||||
|
break;
|
||||||
|
case U_APPEND:
|
||||||
|
if ((undo_count = alloc_buf(count, &undo_buf)) == 0L) {
|
||||||
|
repaint();
|
||||||
|
goto mfree;
|
||||||
|
}
|
||||||
|
do_append(count, tempbuf);
|
||||||
|
memcpy(undo_buf, tempbuf, count);
|
||||||
|
repaint();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mfree:
|
||||||
|
#ifdef __MSDOS__
|
||||||
|
farfree(tempbuf);
|
||||||
|
#else
|
||||||
|
free(tempbuf);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
clear_marks()
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
for (n = 0; n < 26; markbuf[n++] = NULL);
|
||||||
|
undo_count = 0;
|
||||||
|
last_motion = mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
do_mark(mark, addr)
|
||||||
|
int mark;
|
||||||
|
PTR addr;
|
||||||
|
{
|
||||||
|
if (mark < 'a' || mark > 'z' || current >= maxpos)
|
||||||
|
return;
|
||||||
|
markbuf[mark - 'a'] = addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
movebyte()
|
||||||
|
{
|
||||||
|
emsg("Command disabled@- use ':set memmove' to enable");
|
||||||
|
}
|
156
html/bmore.html
Normal file
156
html/bmore.html
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: bmore</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<font color="#ffffff" class="thl">bmore<br></font>
|
||||||
|
<a class="ths" href="bmore_cmd.html">Commands</a><br>
|
||||||
|
<a class="ths" href="bmore_opt.html">Options</a><br>
|
||||||
|
<a class="ths" href="man_bmore.html">man - Page</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">bmore</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<STRONG>bmore</STRONG> is a filter that displays the contents of a binary
|
||||||
|
file on the terminal, one screenful at a time. It normally pauses after each
|
||||||
|
screenful, and prints <B>--More--</B> at the bottom of the screen.
|
||||||
|
<STRONG>bmore</STRONG> provides a two-line over lap between screens for
|
||||||
|
continuity. If bmore is reading from a file rather than a pipe,
|
||||||
|
the percentage of characters displayed so far is also shown.
|
||||||
|
<P>
|
||||||
|
<STRONG>bmore</STRONG> scrolls up to display one more screen line in
|
||||||
|
response to a RETURN character; it displays another
|
||||||
|
screenful in response to a SPACE character. Other commands are listed below.
|
||||||
|
<P>
|
||||||
|
The screen is divided in three sections or panes: The byte
|
||||||
|
offset (extreme left), the hex pane (middle), and an ascii
|
||||||
|
pane (right) which shows as printable characters those
|
||||||
|
bytes in the hex pane. On an 80 column terminal there
|
||||||
|
will be sixteen hex values and their ASCII values on each
|
||||||
|
screen line. Note that (as one would expect) the first
|
||||||
|
byte has the offset 0 (zero).
|
||||||
|
<P>
|
||||||
|
<center>
|
||||||
|
<TABLE WIDTH="10" CELLSPACING="0" CELLPADDING="0" BORDER="0">
|
||||||
|
<TR><TD BGCOLOR=#ffccff><PRE CLASS="examp">
|
||||||
|
000000
|
||||||
|
00000C
|
||||||
|
000018
|
||||||
|
000024
|
||||||
|
000030
|
||||||
|
00003C
|
||||||
|
000048
|
||||||
|
000054
|
||||||
|
000060
|
||||||
|
*
|
||||||
|
00016C
|
||||||
|
000178
|
||||||
|
000184
|
||||||
|
000190
|
||||||
|
00009C</PRE></TD><TD BGCOLOR=#ccffcc><PRE CLASS="examp">
|
||||||
|
7F 45 4C 46 01 01
|
||||||
|
00 00 00 00 01 00
|
||||||
|
00 00 00 00 00 00
|
||||||
|
00 00 00 00 34 00
|
||||||
|
0C 00 09 00 00 00
|
||||||
|
00 00 00 00 55 89
|
||||||
|
53 C7 45 A4 00 00
|
||||||
|
00 00 00 83 7D 08
|
||||||
|
8C 02 00 00 E9 6F
|
||||||
|
|
||||||
|
00 00 00 00 6A 03
|
||||||
|
45 08 50 E8 FC FF
|
||||||
|
0C 85 D2 75 17 6A
|
||||||
|
E9 43 02 00 00 8D
|
||||||
|
0C 85 D2 75 0D C7</PRE></TD><TD BGCOLOR=#ccffcc><PRE CLASS="examp">
|
||||||
|
01 00 00 00 00 00
|
||||||
|
03 00 01 00 00 00
|
||||||
|
00 00 0C 07 00 00
|
||||||
|
00 00 00 00 28 00
|
||||||
|
00 00 00 00 00 00
|
||||||
|
E5 83 EC 68 57 56
|
||||||
|
00 00 C7 45 A0 01
|
||||||
|
00 75 13 6A 00 E8
|
||||||
|
02 00 00 8D B4 26
|
||||||
|
|
||||||
|
68 90 00 00 00 8B
|
||||||
|
FF FF 89 C2 83 C4
|
||||||
|
01 E8 60 02 00 00
|
||||||
|
74 26 00 8D BC 27
|
||||||
|
45 A0 00 00 00 00</PRE></TD><TD BGCOLOR=#FFCCCC><PRE CLASS="examp">
|
||||||
|
.ELF........
|
||||||
|
............
|
||||||
|
............
|
||||||
|
....4.....(.
|
||||||
|
............
|
||||||
|
....U....hWV
|
||||||
|
S.E......E..
|
||||||
|
....}..u.j..
|
||||||
|
.....o.....&
|
||||||
|
|
||||||
|
....j.h.....
|
||||||
|
E.P.........
|
||||||
|
...u.j..`...
|
||||||
|
.C....t&...'
|
||||||
|
...u..E.....</PRE></TD></TR>
|
||||||
|
<TR BGCOLOR=#FFFFCC><TD COLSPAN=4 CLASS="examp">
|
||||||
|
<font class="inv">--More--(5%) </font>
|
||||||
|
</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</CENTER>
|
||||||
|
<p>
|
||||||
|
Equal lines will only displayed once, a star (*) is the placeholder
|
||||||
|
for one or more lines equal to the line above.
|
||||||
|
</p>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Fri Oct 13 22:30:06 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
116
html/bmore_cmd.html
Normal file
116
html/bmore_cmd.html
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Commands</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
<font color="#ffffff" class="ths">Commands<br></font>
|
||||||
|
<a class="ths" href="bmore_opt.html">Options</a><br>
|
||||||
|
<a class="ths" href="man_bmore.html">man - Page</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">bmore</font>
|
||||||
|
<br><font class="sub">Commands</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
|
||||||
|
Most commands optionally preceded by integer argument <I>k</I>. Defaults in brackets.
|
||||||
|
Star (*) indicates argument becomes new default.
|
||||||
|
<P>
|
||||||
|
<TABLE>
|
||||||
|
<TR><TH><FONT COLOR=#888888>SPACE</FONT></TH>
|
||||||
|
<TD>Display next <I>k</I> lines of bytes </TD><TD>current screen size</TD></TR>
|
||||||
|
<TR><TH>z</TH><TD>Display next <I>k</I> lines of bytes </TD>
|
||||||
|
<TD>current screen size*</TD></TR>
|
||||||
|
<TR><TH><FONT COLOR=#888888>RETURN</FONT></TH>
|
||||||
|
<TD>Display next <I>k</I> lines of bytes </TD><TD>1*</TD></TR>
|
||||||
|
<TR><TD ALIGN=CENTER><B>d</B> or <B><FONT COLOR=#888888>CTRL</FONT> D</B></TH>
|
||||||
|
<TD>Scroll <I>k</I> lines </TD><TD>current scroll size, initially 11*</TD></TR>
|
||||||
|
<TR><TD ALIGN=CENTER><B>q</B> or <B>Q</B> or Interrupt</TD>
|
||||||
|
<TD>Exit from bmore</TD></TR>
|
||||||
|
<TR><TH>s</TH>
|
||||||
|
<TD>Skip forward <I>k</I> lines of bytes </TD><TD>1</TD></TR>
|
||||||
|
<TR><TH>f</TH>
|
||||||
|
<TD>Skip forward <I>k</I> screenfuls of bytes </TD><TD>1</TD></TR>
|
||||||
|
<TR><TD ALIGN=CENTER><B>b</B> or <B><FONT COLOR=#888888>CTRL</FONT> B</B></TH>
|
||||||
|
<TD>Skip backwards <I>k</I> screenfuls of bytes </TD><TD>1</TD></TR>
|
||||||
|
<TR><TH>'</TH>
|
||||||
|
<TD>Go to place where previous search started</TD></TR>
|
||||||
|
<TR><TH>=</TH>
|
||||||
|
<TD>Display current byte number</TD></TR>
|
||||||
|
<TR><TH>/<FONT COLOR=#FF0000>regular expr</FONT></TH>
|
||||||
|
<TD>Search for <I>k</I><SUP>th</SUP> occurrence of ascii regular expr </TD><TD>1</TD></TR>
|
||||||
|
<TR><TH>\<FONT COLOR=#FF0000>regular expr</FONT></TH>
|
||||||
|
<TD>Search for <I>k</I><SUP>th</SUP> occurrence of binary regular expr </TD><TD>1</TD></TR>
|
||||||
|
<TR><TH>n</TH>
|
||||||
|
<TD>Search for <I>k</I><SUP>th</SUP> occurrence of last r.e </TD><TD>1</TD></TR>
|
||||||
|
<TR><TD ALIGN=CENTER><B>!<I>cmd</I></B> or <B>:!<I>cmd</I></B></TH>
|
||||||
|
<TD>Execute <I>cmd</I> in a subshell</TD></TR>
|
||||||
|
<TR><TH>v</TH>
|
||||||
|
<TD>Start up <B>bvi</B> at current position</TD></TR>
|
||||||
|
<TR><TH>w</TH>
|
||||||
|
<TD>Start up <B>bvi</B> reading only a screenful of bytes</TD><TD>screen</TD></TR>
|
||||||
|
<TR><TH><FONT COLOR=#888888>CTRL</FONT> L</TH>
|
||||||
|
<TD>Redraw screen</TD></TR>
|
||||||
|
<TR><TH>:n</TH>
|
||||||
|
<TD>Go to <I>k</I><SUP>th</SUP> next file</TD><TD>1</TD></TR>
|
||||||
|
<TR><TH>:p</TH>
|
||||||
|
<TD>Go to <I>k</I><SUP>th</SUP> previous file</TD><TD>1</TD></TR>
|
||||||
|
<TR><TH>:f</TH>
|
||||||
|
<TD>Display current file name and byte position</TD></TR>
|
||||||
|
<TR><TH>.</TH>
|
||||||
|
<TD>Repeat previous command</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
<P>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Fri Jun 30 22:05:32 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
133
html/bmore_opt.html
Normal file
133
html/bmore_opt.html
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Command Line Options</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
<a class="ths" href="bmore_cmd.html">Commands</a><br>
|
||||||
|
<font color="#ffffff" class="ths">Options<br></font>
|
||||||
|
<a class="ths" href="man_bmore.html">man - Page</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">bmore</font>
|
||||||
|
<br><font class="sub">Command Line Options</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<table>
|
||||||
|
<tr><th valign="top">-a</th><td>ASCII mode</td></tr>
|
||||||
|
<tr><th valign="top">-d</th><td>Display error messages rather than ringing the
|
||||||
|
terminal bell if an unrecognized command is used.
|
||||||
|
This is helpful for inexperienced users.
|
||||||
|
</td></tr>
|
||||||
|
<tr><th valign="top">-i</th><td>Ignore case for searching.</td></tr>
|
||||||
|
<tr><th valign="top">+<I>linenumber</i></th>
|
||||||
|
<td>Start up at <I>linenumber</i></td></tr>
|
||||||
|
<tr><th valign="top">+/<font color="#FF0000">ASCII-pattern</font></th>
|
||||||
|
<td>Start up at the line containing the regular expression
|
||||||
|
<font color="#FF0000"><b>ASCII-pattern</b></font></td></tr>
|
||||||
|
<tr><th valign="top">+\<font color="#FF0000">HEX-pattern</font></th>
|
||||||
|
<td>Start up at the line containing the regular expression
|
||||||
|
<font color="#FF0000"><b>HEX-pattern</b></font></td></tr>
|
||||||
|
</table>
|
||||||
|
<p>
|
||||||
|
This is the default display:</p>
|
||||||
|
<center>
|
||||||
|
<table width="10" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td bgcolor=#ccFFff>
|
||||||
|
<pre class="examp">
|
||||||
|
00000000 7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 .ELF............
|
||||||
|
00000010 01 00 03 00 01 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||||
|
00000020 F4 60 00 00 00 00 00 00 34 00 00 00 00 00 28 00 .`......4.....(.
|
||||||
|
00000030 0F 00 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||||
|
00000040 55 89 E5 68 04 00 00 00 68 4C 00 00 00 68 00 00 U..h....hL...h..
|
||||||
|
00000050 00 00 E8 FC FF FF FF 6A 01 E8 FC FF FF FF 89 F6 .......j........
|
||||||
|
00000060 55 89 E5 83 EC 14 57 56 53 8B 7D 0C C7 45 FC 00 U.....WVS.}..E..
|
||||||
|
00000070 00 00 00 C7 45 F8 00 00 00 00 C7 45 F4 00 00 00 ....E......E....
|
||||||
|
00000080 00 BE 01 00 00 00 6A 2F 8B 07 50 E8 FC FF FF FF ......j/..P.....
|
||||||
|
00000090 83 C4 08 85 C0 74 09 40 EB 08 8D B6 00 00 00 00 .....t.@........
|
||||||
|
000000A0 8B 07 50 68 04 00 00 00 E8 FC FF FF FF 83 C4 08 ..Ph............
|
||||||
|
000000B0 68 85 00 00 00 68 04 00 00 00 E8 FC FF FF FF 83 h....h..........
|
||||||
|
000000C0 C4 08 39 75 08 0F 8E 35 01 00 00 8B 04 B7 89 45 ..9u...5.......E
|
||||||
|
000000D0 EC 8A 10 80 FA 2B 0F 84 94 00 00 00 80 FA 2D 0F .....+........-.
|
||||||
|
000000E0 85 EB 00 00 00 BB 01 00 00 00 80 78 01 00 0F 84 ...........x....
|
||||||
|
000000F0 D1 00 00 00 8B 4D EC 8A 04 0B 3C 64 74 32 7F 10 .....M....^dt2..</pre>
|
||||||
|
<font class="inv">--More--(5%) </font>
|
||||||
|
</td></tr></table>
|
||||||
|
</center><p>
|
||||||
|
With the <tt><b>-a</b></tt> option the display looks like this:
|
||||||
|
</p>
|
||||||
|
<center>
|
||||||
|
<table width="10" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td bgcolor=#ccFFcc>
|
||||||
|
<pre class="examp">
|
||||||
|
00000000 .ELF....................@...4... .......4. ...(.........4...4...
|
||||||
|
00000040 4...............................................................
|
||||||
|
00000080 .....1...1...............1..............,................4......
|
||||||
|
000000C0 .................................... ... .........../lib/ld-linu
|
||||||
|
00000100 x.so.2..............GNU.................%...8.......4... .......
|
||||||
|
00000140 ........,.......6.......................3...!...........%...1...
|
||||||
|
00000180 ....7..............."...........2...&...+...)...................
|
||||||
|
000001C0 ................................................................
|
||||||
|
00000200 ................................................................
|
||||||
|
00000240 ............................#...........(...................'...
|
||||||
|
00000280 *...$.......-.../.......0.......5...................U...........
|
||||||
|
000002C0 .... .......................g.......(...........................
|
||||||
|
00000300 ............t...-...........5...............o...............$...
|
||||||
|
00000340 ........................$...............4...............D...H...
|
||||||
|
00000380 ....y...T...............d...............t...........1...d.......
|
||||||
|
000003C0 ................................-...................j...........</pre>
|
||||||
|
<font class="inv">--More--(18%) </font>
|
||||||
|
</td></tr></table>
|
||||||
|
</center>
|
||||||
|
<p> </p>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Fri Oct 13 21:38:17 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
11
html/bvi.css
Normal file
11
html/bvi.css
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
TD {font-family: Helvetica, Arial, sans-serif;}
|
||||||
|
TH {font-family: Helvetica, Arial, sans-serif;}
|
||||||
|
STRONG {color:red;}
|
||||||
|
.thl {font-family: Helvetica, Arial Narrow, sans-serif; font-size: 12pt; font-weight: bold; text-decoration:none;}
|
||||||
|
.ths {font-family: Helvetica, Arial Narrow, sans-serif; font-size: 10pt; text-decoration:none;}
|
||||||
|
.btop {text-decoration:none; color:black;}
|
||||||
|
.examp {font-family: Courier, monospace;}
|
||||||
|
.inv {font-family: Courier, monospace; color: rgb(255,255,255); background-color: rgb(0,0,0);}
|
||||||
|
.head {font-family: Helvetica, Arial, sans-serif; font-size: 22pt; font-weight: bold; text-decoration:none;}
|
||||||
|
.sub {font-family: Helvetica, Arial, sans-serif; font-size: 16pt; font-weight: bold;}
|
||||||
|
.new {font-family: Times, serif; font-weight: bold; font-size: 28pt; color: red;}
|
208
html/colon.html
Normal file
208
html/colon.html
Normal file
|
@ -0,0 +1,208 @@
|
||||||
|
<HTML><HEAD>
|
||||||
|
<TITLE>BVI: Colon (ex) Commands</TITLE>
|
||||||
|
<LINK REL=STYLESHEET TYPE="text/css" HREF="bvi.css">
|
||||||
|
</HEAD><BODY BGCOLOR="#ffffff">
|
||||||
|
<A NAME="top"></A>
|
||||||
|
|
||||||
|
<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=0 BORDER=0>
|
||||||
|
<TR><TD WIDTH=99%>
|
||||||
|
<A CLASS=head HREF="overview.html">Command Overview</A>
|
||||||
|
<BR><FONT CLASS=sub>Colon (ex) Commands</FONT>
|
||||||
|
</TD><TD ALIGN=RIGHT VALIGN=BOTTOM WIDTH=116 ROWSPAN=2>
|
||||||
|
<A HREF="index.html">
|
||||||
|
<IMG SRC="gif/bvi_s.gif" ALT="BVI" WIDTH="116" HEIGHT="62" BORDER=0></A>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD VALIGN=BOTTOM>
|
||||||
|
<HR NOSHADE>
|
||||||
|
</TD></TR></TABLE>
|
||||||
|
<P>
|
||||||
|
|
||||||
|
<CENTER>
|
||||||
|
[ <A CLASS="thl" HREF="cursor.html">Cursor Movements</A>
|
||||||
|
| <A CLASS="thl" HREF="edit.html">Edit Cmds</A>
|
||||||
|
| <A CLASS="thl" HREF="yank.html">Yank and Put Cmds</A>
|
||||||
|
| <A CLASS="thl" HREF="set.html">Set Options</A>
|
||||||
|
| Colon (ex) Cmds
|
||||||
|
]
|
||||||
|
</CENTER>
|
||||||
|
<P>
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
When forming a colon command, the first character, the colon, can be
|
||||||
|
followed by zero, one or two addresses. These addresses are byte
|
||||||
|
addresses, in contrast to vi, which uses line addresses.<BR>
|
||||||
|
The byte addresses can be given in decimal notation or, with a
|
||||||
|
leading zero, in hexadecimal notation. If you have specified an
|
||||||
|
address offset (e.g. <B>:set offset=256</B>), this offset has to be
|
||||||
|
added to the byte addresses.<BR>
|
||||||
|
Without an address, the whole file is affected or the current cursor
|
||||||
|
position is used (depending of the command).
|
||||||
|
<P>
|
||||||
|
<CENTER>
|
||||||
|
<TABLE BORDER=1 CELLPADDING=4>
|
||||||
|
<TR><TH>Address</TH><TH>Corresponding bytes</TH></TR>
|
||||||
|
<TR><TH>.</TH><TD>The current byte</TD></TR>
|
||||||
|
<TR><TH>7</TH><TD>The seventh byte of file (if offset=0)</TD></TR>
|
||||||
|
<TR><TH>.-<I>n</I></TH><TD><I>n</I> bytes before the current byte</TD></TR>
|
||||||
|
<TR><TH>.+<I>n</I></TH><TD><I>n</I> bytes after the current byte</TD></TR>
|
||||||
|
<TR><TH>'<I>x</I></TH><TD>The byte marked with <I>x</I></TD></TR>
|
||||||
|
<TR><TH>^</TH><TD>The first byte in file</TD></TR>
|
||||||
|
<TR><TH>$</TH><TD>The last byte</TD></TR>
|
||||||
|
<TR><TH>''</TH><TD>The previous current byte</TD></TR>
|
||||||
|
<TR><TH>/pat/</TH><TD>The first byte that matches <I>pat</I></TD></TR>
|
||||||
|
<TR><TH>#12 A4 6F#</TH><TD>The first byte that matches hex pattern</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</CENTER>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
|
<TABLE WIDTH=100%>
|
||||||
|
<TR BGCOLOR=#CCCCCC><TH WIDTH=20%>Command</TH><TH WIDTH=40%>BVI</TH><TH WIDTH=40%>VI</TH></TR>
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER>File<BR>Commands</TD><TD BGCOLOR=#CCFFCC COLSPAN=2>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD><B>:w</B><BR>
|
||||||
|
<B>:w</B> %.new<BR>
|
||||||
|
<B>:w</B> filename<BR>
|
||||||
|
<B>:w>></B> existingfile<BR>
|
||||||
|
<B>:w!</B> file<BR>
|
||||||
|
<B>:e</B> newfile<BR>
|
||||||
|
<B>:e!</B><BR>
|
||||||
|
<B>:f</B><BR>
|
||||||
|
<B>:f</B> newname<BR>
|
||||||
|
</TD>
|
||||||
|
<TD>Write to the current file<BR>
|
||||||
|
Write to current.new<BR>
|
||||||
|
Write to filename<BR>
|
||||||
|
Append to existing file<BR>
|
||||||
|
Overwrite existing file<BR>
|
||||||
|
Terminate session and edit <I>newfile</I><BR>
|
||||||
|
Reload the current file<BR>
|
||||||
|
Prints current filename and some additional info<BR>
|
||||||
|
Changes the current filename to <I>newname</I>
|
||||||
|
</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER ROWSPAN=2>Substitute<BR>Commands</TD>
|
||||||
|
<TD BGCOLOR=#CCFFCC COLSPAN=2>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD><B>:s/pattern/replace/</B><BR>
|
||||||
|
<B>:s/pattern/replace/g</B><BR>
|
||||||
|
<B>:s/pattern/replace/gc</B></TD>
|
||||||
|
<TD>Search for pattern and replace it once<BR>
|
||||||
|
Search for pattern and replace it global<BR>
|
||||||
|
Search for pattern and replace it global conditional (ask)
|
||||||
|
</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
<TR><TD>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD><B>:s\80 af\ff ff\</B></TD>
|
||||||
|
<TD>Binary search and replace
|
||||||
|
</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
<TD BGCOLOR=#FFCCCC>Not available</TD></TR>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER>Edit<BR>Commands</TD>
|
||||||
|
<TD BGCOLOR=#FFFFFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD VALIGN=TOP><B>:a</B> <I>m</I><BR>
|
||||||
|
<B>:c</B> <I>m</I> <BR>
|
||||||
|
<B>:i</B> <I>m</I></B></TD>
|
||||||
|
<TD>append<BR>
|
||||||
|
change<BR>
|
||||||
|
insert
|
||||||
|
bytes, where <I>m</I> is a(scii), b(inary), d(ecimal), h(exadecimal)
|
||||||
|
or o(ctal). You can type in several (screen) lines of bytes, a line
|
||||||
|
with only a '<B>.</B>' in it terminates the command.
|
||||||
|
</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#FFCCCC>
|
||||||
|
Usually not available in vi but in ex (without the <I>m</I> - modifier).
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER>Logical<BR>Operations</TD>
|
||||||
|
<TD BGCOLOR=#FFFFFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD><B>:and</B> <I>n</I><BR>
|
||||||
|
<B>:or</B> <I>n</I><BR>
|
||||||
|
<B>:xor</B> <I>n</I><BR>
|
||||||
|
<B>:neg<BR>
|
||||||
|
:not<BR>
|
||||||
|
:sl</B> <I>i</I><BR>
|
||||||
|
<B>:sr</B> <I>i</I><BR>
|
||||||
|
<B>:rr</B> <I>i</I><BR>
|
||||||
|
<B>:rl</B> <I>i</I></TD>
|
||||||
|
<TD>and <I>n</I><BR>
|
||||||
|
or <I>n</I><BR>
|
||||||
|
exclusive or <I>n</I><BR>
|
||||||
|
negate<BR>
|
||||||
|
invert<BR>
|
||||||
|
shift left <I>i</I> bits<BR>
|
||||||
|
shift right <I>i</I> bits<BR>
|
||||||
|
rotate left <I>i</I> bits<BR>
|
||||||
|
rotate right <I>i</I> bits
|
||||||
|
</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#FFCCCC>
|
||||||
|
Not available.
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER ROWSPAN=2>Miscellaneous</TD>
|
||||||
|
<TD BGCOLOR=#CCFFCC COLSPAN=2>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD>
|
||||||
|
<B>:g</B>/<I>pat</I>/p<BR>
|
||||||
|
<B>:n<BR>
|
||||||
|
:q<BR>
|
||||||
|
:rew<BR>
|
||||||
|
:sh<BR>
|
||||||
|
:so</B> file<BR>
|
||||||
|
<B>:ve<BR>
|
||||||
|
:x<BR>
|
||||||
|
:!</B> <I>command</I><BR>
|
||||||
|
</TD><TD>
|
||||||
|
Global search for pattern <I>pat</I><BR>
|
||||||
|
Next file to edit<BR>
|
||||||
|
Exit session without saving the file<BR>
|
||||||
|
Rewind to first file<BR>
|
||||||
|
spawn a new shell<BR>
|
||||||
|
Read and execute a file with colon commands<BR>
|
||||||
|
Version of the editor<BR>
|
||||||
|
Exit session, save the file if changed<BR>
|
||||||
|
execute a system <I>command</I><BR>
|
||||||
|
</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD BGCOLOR=#FFCCCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD>Currently not available</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD>
|
||||||
|
<B>:map</B><BR>
|
||||||
|
<B>:unm</B>(ap)<BR>
|
||||||
|
<B>:ab</B>(breviate)<BR>
|
||||||
|
<B>:una</B>(bbreviate)<BR>
|
||||||
|
</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
<P>
|
||||||
|
<CENTER>
|
||||||
|
[ <A CLASS="thl" HREF="cursor.html">Cursor Movements</A>
|
||||||
|
| <A CLASS="thl" HREF="edit.html">Edit Cmds</A>
|
||||||
|
| <A CLASS="thl" HREF="yank.html">Yank and Put Cmds</A>
|
||||||
|
| <A CLASS="thl" HREF="set.html">Set Options</A>
|
||||||
|
| Colon (ex) Cmds
|
||||||
|
]
|
||||||
|
</CENTER>
|
||||||
|
<P>
|
||||||
|
<FONT SIZE=-1>
|
||||||
|
<A CLASS="btop" HREF="#top"><IMG BORDER=0 WIDTH=16 HEIGHT=7 SRC="gif/up.gif"
|
||||||
|
ALT="Back to the top">Back to the top</A>
|
||||||
|
</FONT>
|
||||||
|
<HR NOSHADE>
|
||||||
|
<I>Last update: October 30<SUP>th</SUP> 1999 by Gerhard Bürgmann</I>
|
||||||
|
|
||||||
|
|
||||||
|
</BODY></HTML>
|
116
html/cursor.html
Normal file
116
html/cursor.html
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
<HTML><HEAD>
|
||||||
|
<TITLE>BVI: Cursor Movements</TITLE>
|
||||||
|
<LINK REL=STYLESHEET TYPE="text/css" HREF="bvi.css">
|
||||||
|
</HEAD><BODY BGCOLOR="#ffffff">
|
||||||
|
<A NAME="top"></A>
|
||||||
|
|
||||||
|
<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=0 BORDER=0>
|
||||||
|
<TR><TD WIDTH=99%>
|
||||||
|
<A CLASS=head HREF="overview.html">Command Overview</A>
|
||||||
|
<BR><FONT CLASS=sub>Cursor Movements</FONT>
|
||||||
|
</TD><TD ALIGN=RIGHT VALIGN=BOTTOM WIDTH=116 ROWSPAN=2>
|
||||||
|
<A HREF="index.html">
|
||||||
|
<IMG SRC="gif/bvi_s.gif" ALT="BVI" WIDTH="116" HEIGHT="62" BORDER=0></A>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD VALIGN=BOTTOM>
|
||||||
|
<HR NOSHADE>
|
||||||
|
</TD></TR></TABLE>
|
||||||
|
<P>
|
||||||
|
<CENTER>
|
||||||
|
[ Cursor Movements
|
||||||
|
| <A CLASS="thl" HREF="edit.html">Edit Cmds</A>
|
||||||
|
| <A CLASS="thl" HREF="yank.html">Yank and Put Cmds</A>
|
||||||
|
| <A CLASS="thl" HREF="set.html">Set Options</A>
|
||||||
|
| <A CLASS="thl" HREF="colon.html">Colon (ex) Cmds</A>
|
||||||
|
]
|
||||||
|
</CENTER>
|
||||||
|
<P>
|
||||||
|
<TABLE WIDTH=100%>
|
||||||
|
<TR BGCOLOR=#CCCCCC><TH WIDTH=20%>Command</TH><TH WIDTH=40%>BVI</TH><TH WIDTH=40%>VI</TH></TR>
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER>Cursor<BR>movements</TD><TD BGCOLOR=#CCFFCC COLSPAN=2>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH>h, <FONT COLOR=#888888>ARROW_LEFT</FONT></TH>
|
||||||
|
<TD>move cursor one character to the left</TD></TR>
|
||||||
|
<TR><TH>j, +, ^N, ^J, <FONT COLOR=#888888>ARROW_DOWN</FONT>,
|
||||||
|
<FONT COLOR=#888888>RETURN</FONT>
|
||||||
|
</TH><TD>move cursor down one line</TD></TR>
|
||||||
|
<TR><TH>k, -, <FONT COLOR=#888888>ARROW_UP</FONT></TH>
|
||||||
|
<TD>move cursor up one line</TD></TR>
|
||||||
|
<TR><TH>l, <FONT COLOR=#888888>ARROW_RIGHT</FONT>,
|
||||||
|
<FONT COLOR=#888888>SPACE</FONT>
|
||||||
|
</TH><TD>move cursor one character to the right</TD></TR>
|
||||||
|
<TR><TH>H</TH><TD>move cursor to home position, upper left corner of screen</TD></TR>
|
||||||
|
<TR><TH>M</TH><TD>move cursor to the begin of the middle line of the screen</TD></TR>
|
||||||
|
<TR><TH>L</TH><TD>move cursor to the begin of the last line of the screen</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER>Move to<BR>begin<BR>and end of<BR>(screen) line</TD>
|
||||||
|
<TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH>^</TH><TD>move cursor to the first byte of Hex section</TD></TR>
|
||||||
|
<TR><TH>$</TH><TD>move cursor to the last byte of Ascii section</TD></TR>
|
||||||
|
<TR><TH><FONT COLOR=#888888>TAB</FONT></TH><TD>toggle cursor between the same byte in Hex and Ascii section</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> ^ </TH>
|
||||||
|
<TD>move cursor to the first nonblank character of line</TD></TR>
|
||||||
|
<TR><TH>$</TH><TD>move cursor to end of line</TD></TR>
|
||||||
|
<TR><TH>0</TH><TD>move cursor to the real begin of line</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER>Move<BR>by<BR>words</TD>
|
||||||
|
<TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> w </TH>
|
||||||
|
<TD>forward to next string delimited with a nonprinting char</TD></TR>
|
||||||
|
<TR><TH>b</TH>
|
||||||
|
<TD>back to previous string delimited with a nonprinting char</TD></TR>
|
||||||
|
<TR><TH>e</TH>
|
||||||
|
<TD>end of current word </TD></TR>
|
||||||
|
<TR><TH>W</TH>
|
||||||
|
<TD>forward to next string delimited with a \0 or \n</TD></TR>
|
||||||
|
<TR><TH>B</TH>
|
||||||
|
<TD>back to previous string delimited with a nonprinting char</TD></TR>
|
||||||
|
<TR><TH>E</TH>
|
||||||
|
<TD>end of a blank-delimited word</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> w </TH>
|
||||||
|
<TD>move cursor forward to begin of next word</TD></TR>
|
||||||
|
<TR><TH>e</TH>
|
||||||
|
<TD>move cursor to end of current word</TD></TR>
|
||||||
|
<TR><TH>b</TH>
|
||||||
|
<TD>move cursor back to begin of current or previous word</TD></TR>
|
||||||
|
<TR><TH>W</TH>
|
||||||
|
<TD>move cursor forward to begin of next word, ignoring punctuation</TD>
|
||||||
|
</TR>
|
||||||
|
<TR><TH>B</TH>
|
||||||
|
<TD>move cursor back to begin of last word, ignoring punctuation</TD>
|
||||||
|
</TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
</TABLE>
|
||||||
|
<P>
|
||||||
|
<CENTER>
|
||||||
|
[ Cursor Movements
|
||||||
|
| <A CLASS="thl" HREF="edit.html">Edit Cmds</A>
|
||||||
|
| <A CLASS="thl" HREF="yank.html">Yank and Put Cmds</A>
|
||||||
|
| <A CLASS="thl" HREF="set.html">Set Options</A>
|
||||||
|
| <A CLASS="thl" HREF="colon.html">Colon (ex) Cmds</A>
|
||||||
|
]
|
||||||
|
</CENTER>
|
||||||
|
<P>
|
||||||
|
<FONT SIZE=-1>
|
||||||
|
<A CLASS="btop" HREF="#top"><IMG BORDER=0 WIDTH=16 HEIGHT=7 SRC="gif/up.gif"
|
||||||
|
ALT="Back to the top">Back to the top</A>
|
||||||
|
</FONT>
|
||||||
|
<HR NOSHADE>
|
||||||
|
<I>Last update: October 30<SUP>th</SUP> 1999 by Gerhard Bürgmann</I>
|
||||||
|
|
||||||
|
|
||||||
|
</BODY></HTML>
|
98
html/download.html
Normal file
98
html/download.html
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Download Page</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<font color="#ffffff" class="thl">Download<br></font>
|
||||||
|
<a class="ths" href="new130.html">New in 1.3.0</a><br>
|
||||||
|
<a class="ths" href="new120.html">New in 1.2.0</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Download Page</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
NOTE: All packages are compressed with the GNU gzip program. You
|
||||||
|
can download it from <A HREF="ftp://ftp.gnu.org/gnu/gzip/">ftp://ftp.gnu.org/gnu/gzip/</A>.
|
||||||
|
<P>
|
||||||
|
Current stable release of bvi is <B>1.3.0</B>
|
||||||
|
(Check out what's <A HREF="new130.html">new</A>):
|
||||||
|
<P>
|
||||||
|
<H3>Sources</H3>
|
||||||
|
<UL>
|
||||||
|
<LI><A HREF="http://bvi.linuxave.net/download/bvi-1.3.0.src.tar.gz">bvi-1.3.0.src.tar.gz</A>
|
||||||
|
(147284 bytes)
|
||||||
|
<LI><A HREF="http://bvi.linuxave.net/download/bvi-1.3.0.lsm">bvi-1.3.0.lsm</A>
|
||||||
|
(645 bytes)<P>
|
||||||
|
<LI><A HREF="http://bvi.linuxave.net/download/bvi-1.1.1.src.tar.gz">bvi-1.1.1.src.tar.gz</A>
|
||||||
|
(46168 bytes)
|
||||||
|
</UL>
|
||||||
|
<H3>Executables</H3>
|
||||||
|
<UL>
|
||||||
|
<LI>Linux: <A HREF="http://bvi.linuxave.net/download/bvi-1.3.0-linux_static_elf.gz">bvi-1.3.0-linux_static_elf.gz</A>
|
||||||
|
(109917 bytes)
|
||||||
|
<LI>SunOS 4.1.3_U1: <A HREF="http://bvi.linuxave.net/download/bvi-1.3.0-sun4.gz">bvi-1.3.0-sun4.gz</A>
|
||||||
|
(59357 bytes)
|
||||||
|
<LI>Solaris 2.6: <A HREF="http://bvi.linuxave.net/download/bvi-1.3.0-solaris.gz">bvi-1.3.0-solaris.gz</A>
|
||||||
|
(61368 bytes)
|
||||||
|
<LI>AIX 4.1: <A HREF="download/bvi-1.2.0-aix.gz">bvi-1.2.0-aix.gz</A>
|
||||||
|
(29095 bytes)
|
||||||
|
<LI>IRIX 6.5.5: <A HREF="http://bvi.linuxave.net/download/bvi-1.2.0-irix.gz">bvi-1.2.0-irix.gz</A>
|
||||||
|
(33888 bytes)
|
||||||
|
<LI>HP-UX B.10.20: <A HREF="http://bvi.linuxave.net/download/bvi-1.2.0-hpux.gz">bvi-1.2.0-hpux.gz</A>
|
||||||
|
(36175 bytes)
|
||||||
|
<LI>MSDOS: <A HREF="http://bvi.linuxave.net/download/bvi120.zip">bvi120.zip</A>
|
||||||
|
(43233 bytes)<P>
|
||||||
|
<LI>MSDOS: <A HREF="http://bvi.linuxave.net/download/bvi110.zip">bvi110.zip</A>
|
||||||
|
(44690 bytes)<P>
|
||||||
|
</UL>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: October 23<sup>rd</sup> 22:36:45 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
194
html/edit.html
Normal file
194
html/edit.html
Normal file
|
@ -0,0 +1,194 @@
|
||||||
|
<HTML><HEAD>
|
||||||
|
<TITLE>BVI: Edit Commands</TITLE>
|
||||||
|
<LINK REL=STYLESHEET TYPE="text/css" HREF="bvi.css">
|
||||||
|
</HEAD><BODY BGCOLOR="#ffffff">
|
||||||
|
<A NAME="top"></A>
|
||||||
|
|
||||||
|
<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=0 BORDER=0>
|
||||||
|
<TR><TD WIDTH=99%>
|
||||||
|
<A CLASS=head HREF="overview.html">Command Overview</A>
|
||||||
|
<BR><FONT CLASS=sub>Edit Movements</FONT>
|
||||||
|
</TD><TD ALIGN=RIGHT VALIGN=BOTTOM WIDTH=116 ROWSPAN=2>
|
||||||
|
<A HREF="index.html">
|
||||||
|
<IMG SRC="gif/bvi_s.gif" ALT="BVI" WIDTH="116" HEIGHT="62" BORDER=0></A>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD VALIGN=BOTTOM>
|
||||||
|
<HR NOSHADE>
|
||||||
|
</TD></TR></TABLE>
|
||||||
|
<P>
|
||||||
|
|
||||||
|
<CENTER>
|
||||||
|
[ <A CLASS="thl" HREF="cursor.html">Cursor Movements</A>
|
||||||
|
| Edit Cmds
|
||||||
|
| <A CLASS="thl" HREF="yank.html">Yank and Put Cmds</A>
|
||||||
|
| <A CLASS="thl" HREF="set.html">Set Options</A>
|
||||||
|
| <A CLASS="thl" HREF="colon.html">Colon (ex) Cmds</A>
|
||||||
|
]
|
||||||
|
</CENTER>
|
||||||
|
<P>
|
||||||
|
If you would like to use the insert and delete commands, you have to
|
||||||
|
enable them with the <B>:set memmove</B> option. These commands are
|
||||||
|
locked per default, because you must not move bytes to a different
|
||||||
|
address for many types of binary files (e.g. executables, database files,
|
||||||
|
etc.). If you usually edit files where bytes can be moved, you can add
|
||||||
|
the <B>:set memmove</B> directive to your <B><TT>.bvirc</TT></B> file.
|
||||||
|
<P>
|
||||||
|
<TABLE WIDTH=100%>
|
||||||
|
<TR BGCOLOR=#CCCCCC><TH WIDTH=20%>Command</TH><TH WIDTH=40%>BVI</TH><TH WIDTH=40%>VI</TH></TR>
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER>Replace<BR>bytes</TD><TD BGCOLOR=#CCFFCC COLSPAN=2>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> r </TH>
|
||||||
|
<TD>replace a single byte, no ESC needed</TD></TR>
|
||||||
|
<TR><TH>R</TH>
|
||||||
|
<TD>replace multiple bytes until you type ESC</TD></TR>
|
||||||
|
<TR><TH>~</TH>
|
||||||
|
<TD>toggle between uppercase and lowercase of a byte</TD></TR>
|
||||||
|
</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER>Append<BR>bytes</TD>
|
||||||
|
<TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> A </TH><TD>append bytes at end of file</TD></TR>
|
||||||
|
<TR><TH>D</TH><TD>delete bytes to end of file</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> A </TH><TD>append characters at end of line</TD></TR>
|
||||||
|
<TR><TH>D</TH><TD>delete characters to end of line</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER ROWSPAN=3>Insert<BR>bytes</TD>
|
||||||
|
<TD COLSPAN=2 BGCOLOR=#CCFFCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> i </TH>
|
||||||
|
<TD>insert byte in front of cursor position</TD></TR>
|
||||||
|
<TR><TH>a</TH>
|
||||||
|
<TD>insert byte after cursor position</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> I </TH><TD>insert byte at begin of file</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> I </TH><TD>insert characters at begin of line</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD BGCOLOR=#FFCCCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD ROWSPAN=2>not available</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#FFFFFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH>o</TH><TD>insert new line below current line</TD></TR>
|
||||||
|
<TR><TH>O</TH><TD>insert new line above current line</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER ROWSPAN=4>Delete<BR>bytes</TD>
|
||||||
|
<TD COLSPAN=2 BGCOLOR=#CCFFCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> x </TH>
|
||||||
|
<TD>delete byte at of cursor position</TD></TR>
|
||||||
|
<TR><TH>X</TH><TD>delete byte in front of cursor position</TD></TR>
|
||||||
|
<TR><TH>d<FONT COLOR=#888888>SPACE</FONT></TH><TD>delete byte at cursor position</TD></TR>
|
||||||
|
<TR><TH>df<FONT COLOR=#FF0000>C</FONT></TH>
|
||||||
|
<TD>delete from current position to next character <FONT COLOR=#FF0000>C</FONT></TD></TR>
|
||||||
|
<TR><TH>d/<FONT COLOR=#FF0000>xyz</FONT></TH>
|
||||||
|
<TD>delete from current position to first occurance of matching pattern
|
||||||
|
<FONT COLOR=#FF0000>xyz</FONT>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TH>d?<FONT COLOR=#FF0000>xyz</FONT></TH>
|
||||||
|
<TD>delete from current position to first occurance of matching pattern
|
||||||
|
<FONT COLOR=#FF0000>xyz</FONT> in reverse direction
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TH>d'<FONT COLOR=#FF0000>a</FONT></TH><TD>delete from current position to mark <FONT COLOR=#FF0000>a</FONT></TD></TR>
|
||||||
|
<TR><TH>d<FONT COLOR=#FF0000>n</FONT>G</TH><TD>delete from current position to byte with (decimal) address <FONT COLOR=#FF0000>n</FONT></TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#FFCCCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD ROWSPAN=2>not available, because there are no lines, sentences,
|
||||||
|
paragraphs or sections in a binary file</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#FFFFFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH>dd </TH><TD>delete line</TD></TR>
|
||||||
|
<TR><TH>d)</TH><TD>delete from cursor position through first
|
||||||
|
following end of sentence</TD></TR>
|
||||||
|
<TR><TH>d}</TH><TD>delete from cursor position through first
|
||||||
|
following end of paragraph</TD></TR>
|
||||||
|
<TR><TH>d]</TH><TD>delete from cursor position through first
|
||||||
|
following end of section</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD BGCOLOR=#FFFFFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH>d\<FONT COLOR=#FF0000>6a 56 ff</FONT> </TH>
|
||||||
|
<TD>delete from cursor position to first occurance of hex pattern
|
||||||
|
<FONT COLOR=#FF0000>6a 56 ff</FONT></TD></TR>
|
||||||
|
<TR><TH>d#<FONT COLOR=#FF0000>6a 56 ff</FONT> </TH>
|
||||||
|
<TD>delete from cursor position to first occurance of hex pattern
|
||||||
|
<FONT COLOR=#FF0000>6a 56 ff</FONT> in reverse direction</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#FFCCCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD ROWSPAN=2>not available</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH>D</TH><TD ROWSPAN=2>delete from current position to EOF</TD></TR>
|
||||||
|
<TR><TH> d$ </TH></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH>D</TH><TD ROWSPAN=2>delete from current position to end of line</TD></TR>
|
||||||
|
<TR><TH> d$ </TH></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER ROWSPAN=2>Undo<BR>edits</TD>
|
||||||
|
<TD COLSPAN=2 BGCOLOR=#CCFFCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> u </TH>
|
||||||
|
<TD>Undo the most recent change</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD BGCOLOR=#FFCCCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD ROWSPAN=2>not available</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#FFFFFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> U </TH><TD>Undo all of the changes made to the current line</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
</TABLE>
|
||||||
|
<P>
|
||||||
|
Note that most of the commands can be used with a decimal repeat count in front
|
||||||
|
of the command!
|
||||||
|
<P>
|
||||||
|
<CENTER>
|
||||||
|
[ <A CLASS="thl" HREF="cursor.html">Cursor Movements</A>
|
||||||
|
| Edit Cmds
|
||||||
|
| <A CLASS="thl" HREF="yank.html">Yank and Put Cmds</A>
|
||||||
|
| <A CLASS="thl" HREF="set.html">Set Options</A>
|
||||||
|
| <A CLASS="thl" HREF="colon.html">Colon (ex) Cmds</A>
|
||||||
|
]
|
||||||
|
</CENTER>
|
||||||
|
<P>
|
||||||
|
<FONT SIZE=-1>
|
||||||
|
<A CLASS="btop" HREF="#top"><IMG BORDER=0 WIDTH=16 HEIGHT=7 SRC="gif/up.gif"
|
||||||
|
ALT="Back to the top">Back to the top</A>
|
||||||
|
</FONT>
|
||||||
|
<HR NOSHADE>
|
||||||
|
<I>Last update: September 30<SUP>th</SUP> 1999 by Gerhard Bürgmann</I>
|
||||||
|
|
||||||
|
|
||||||
|
</BODY></HTML>
|
214
html/german.html
Normal file
214
html/german.html
Normal file
|
@ -0,0 +1,214 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Deutsche Beschreibung</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<font color="#ffffff" class="thl">Deutsche Beschreibung<br></font>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Deutsche Beschreibung</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Der BVI (Binary-VI) ist ein Editor für Binärfiles. Seine Kommandos sind
|
||||||
|
weitgehend an den Standard UNIX Editor VI(1) angelehnt. Der Bildschirm
|
||||||
|
ist in einen hexadezimalen und einen ASCII-Bereich geteilt. Einige zusätzliche
|
||||||
|
Kommandos wurden zugefügt, einige Kommandos adaptiert und einige Kommandos,
|
||||||
|
die bei Binärfiles keinen Sinn machen, wurden weggelassen. Für eine
|
||||||
|
Gesamtübersicht siehe Manual Page BVI(1).
|
||||||
|
|
||||||
|
<H2>Zusätzliche Kommandos</H2>
|
||||||
|
|
||||||
|
Eine wichtige Funktion für binäre Files ist das Suchen nach Hexcodes.
|
||||||
|
Dafür gibt es analog zum '/' und '?' - Kommando zusätzlich das '\' und
|
||||||
|
das '#' - Kommando.<BR>
|
||||||
|
|
||||||
|
Beispiel:<BR>
|
||||||
|
\1e f4 56 - Sucht die angegebene Bytefolge in vorwärts-Richtung<BR>
|
||||||
|
#34 5a a4 - Sucht Bytefolge rückwärts.
|
||||||
|
<P>
|
||||||
|
Die normalen Textsuchkommandos sind auch vorhanden, wobei zusätzlich ein
|
||||||
|
Return, Linefeed oder NULL im Suchstring aufscheinen darf (\n \r oder \0).
|
||||||
|
<P>
|
||||||
|
Die Kommandos w, W, b, B (nächstes oder vorhergehendes Wort) wurden insoweit
|
||||||
|
abgeändert, daß sie eher dem STRINGS(1) - Kommando entsprechen, also in
|
||||||
|
einem Binärfile Textstrings suchen. Dabei sucht W und B nach Strings, die
|
||||||
|
mit einem \0 oder \n enden, w und b sucht nach Strings, die mit einem
|
||||||
|
beliebigen, nicht druckbaren Zeichen enden. Die Stringlänge beträgt 4 Zeichen,
|
||||||
|
wobei mit ":set wordlength=x" die Stringlänge auf x Zeichen eingestellt werden
|
||||||
|
kann.
|
||||||
|
<P>
|
||||||
|
Der Bildschirm ist in einen HEX und einen ASCII-Bereich aufgeteilt, wobei
|
||||||
|
jederzeit mit der TAB - Taste von einem Bereich in den anderen gewechselt
|
||||||
|
werden kann (auch im Eingabemodus). Es kann also bei der Eingabe zwischen
|
||||||
|
normalen ASCII-Zeichen und Hex-Eingabe hin- und hergesprungen werden.
|
||||||
|
<P>
|
||||||
|
|
||||||
|
Am unteren Bildrand befindet sich eine Statusanzeige, welche die Adresse des
|
||||||
|
Bytes, auf welchem der Cursor momentan steht, anzeigt. Außerdem wird das Byte
|
||||||
|
in oktaler, hexadezimaler, dezimaler und ASCII-Repräsentation anzeigt. Die
|
||||||
|
ASCII-Anzeige kann von DOS-Style (27 entspricht ^Z) auf UNIX-Style entsprechend
|
||||||
|
Manual Page ASCII(7) umgeschaltet werden (27 entspricht SUB).
|
||||||
|
Kommando ist ":set unixstyle". Die Statusanzeige kann mit ":set noshowmode"
|
||||||
|
ausgeschaltet werden.
|
||||||
|
|
||||||
|
<H2>Regular Expressions</H2>
|
||||||
|
|
||||||
|
Für die Suchkommandos sowohl für Text als auch Hex sind Regular Expressions
|
||||||
|
zulässig, wobei es die Zeichen ^ und $ für Zeilenanfang und Zeilenende nicht
|
||||||
|
gibt. Die Kombination .* ist unzulässig, da sie sich auf jeden Fall auf das
|
||||||
|
Ende des Files beziehen würde.
|
||||||
|
|
||||||
|
<H2>Zeilen</H2>
|
||||||
|
|
||||||
|
Da es in binären Files keine Zeilen gibt (die Darstellung der einzelnen
|
||||||
|
Zeilen am Bildschirm hat keinen Bezug zum File) gibt es keinerlei
|
||||||
|
zeilenorientierte Kommandos (dd, o, O, yy). Ein Kommando
|
||||||
|
wie :s/XXX/UUU/g ändert somit das gesamte File. Zu beachten ist auch, daß
|
||||||
|
:s/XX/UUUU/ nicht die beiden X durch vier U ersetzt, sondern die beiden den
|
||||||
|
X folgenden Zeichen auch durch U überschrieben werden.
|
||||||
|
|
||||||
|
<H2>Editierkommandos</H2>
|
||||||
|
|
||||||
|
Da binäre Files häufig ausführbare Programme oder Datenbankfiles sind,
|
||||||
|
bei denen Bytes nicht einfach an eine andere Adresse verschoben werden
|
||||||
|
dürfen, sind Einfüge- und Löschkommandos (z.B. a, i, x)
|
||||||
|
deaktiviert. Mit dem Kommando <B>:set memmove</B> können sie
|
||||||
|
aktiviert werden.
|
||||||
|
<P>
|
||||||
|
Die Kommandos <B>:a</B> (append), <B>:c</B> (change) und <B>:i</B> (insert)
|
||||||
|
können benutzt werden, um ein oder mehrere Bytes in ASCII, binärer,
|
||||||
|
dezimaler, hexadezimaler oder oktaler Schreibweise einzugeben
|
||||||
|
(a, b, d, h oder o). Es
|
||||||
|
können mehrere (Bildschirm) Zeilen eingegeben werden. Das Kommando
|
||||||
|
wird beendet, sobald eine Zeile, die nur aus einem Punkt besteht,
|
||||||
|
eingegeben wird.
|
||||||
|
<P>
|
||||||
|
Beispiel:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<PRE>
|
||||||
|
:i b
|
||||||
|
1 1001 010101 1111
|
||||||
|
11111 1010 1 0 1
|
||||||
|
.
|
||||||
|
</PRE>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
Zu beachten ist, daß kein Einzelwert den maximalen Byte-Wert (255)
|
||||||
|
überschreiten darf, da sonst die Eingabe abgebrochen wird. Das
|
||||||
|
Drücken der RETURN - Taste führt zu keinem "RETURN" - Zeichen in
|
||||||
|
der Datei, im ASCII - Modus können allerdings die Sonderzeichen
|
||||||
|
\n, \r, \t und \0 benutzt werden.
|
||||||
|
|
||||||
|
<H2>Yank und Put</H2>
|
||||||
|
|
||||||
|
Auch hier gilt eine etwas geänderte Funktion. Das <B>y</B> (yank) -
|
||||||
|
Kommando ist allerdings ab Version 1.2.0 dem Vi angenähert:<BR>
|
||||||
|
<TABLE>
|
||||||
|
<TR><TD>5ySPACE</TD><TD>kopiert 5 Zeichen in den Yank-Buffer</TD></TR>
|
||||||
|
<TR><TD>o</TD><TD>überschreibt an Cursor - Position die folgenden Zeichen
|
||||||
|
mit dem Inhalt des Yank- oder Delete - Puffers</TD></TR>
|
||||||
|
<TR><TD>p</TD><TD>fügt an der Cursor - Position den Inhalt des Yank-
|
||||||
|
oder Delete - Puffers ein.</TD></TR>
|
||||||
|
<TR><TD>P</TD><TD>fügt den Inhalt des Yank- oder Delete - Puffers am Dateiendes
|
||||||
|
an.</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
<P>
|
||||||
|
Das Kommando ":r filename" fügt das angegebene File nicht an der Cursor-
|
||||||
|
Position sondern am Dateiende an.
|
||||||
|
|
||||||
|
<H2>Adressen</H2>
|
||||||
|
|
||||||
|
Das Kommando nG führt nicht zur n. Zeile, sondern zum n. Byte.
|
||||||
|
Die Eingabe der Nummer wird dezimal interpretiert. Um eine Adresse
|
||||||
|
hexdezimal angeben zu können, kann g eingegeben werden. Es erscheint ein
|
||||||
|
Prompt in der Statuszeile, bei dem eine hexadezimale Eingabe erfolgen kann.
|
||||||
|
Das erste Byte hat Adresse 0.<BR>
|
||||||
|
Die Anzeige der Adressen kann mit einem Offset versehen werden
|
||||||
|
(:set offset=256), beispielsweise um für .COM Files in DOS einen Beginn
|
||||||
|
bei Adresse 100Hex anzuzeigen. Wird ein offset=1 angegeben, so ist
|
||||||
|
hat das erste Byte Adresse 1. Das G - Kommando berücksichtigt den Offset.
|
||||||
|
Im Gegensatz dazu zeigt das :f - Kommando immer die Ordnungszahl des
|
||||||
|
Bytes an, beginnend mit 1 ohne Berücksichtigung des Offsets.
|
||||||
|
|
||||||
|
<H2>Bitweise Kommandos</H2>
|
||||||
|
|
||||||
|
Um Manipulationen auf Bit-Ebene durchführen zu können, stehen
|
||||||
|
folgende Kommandos zur Verfügung:
|
||||||
|
<CENTER><TABLE>
|
||||||
|
<TR><TD><B>:rl </B><I>n</I></TD><TD>Rotiert Bits links</TD><TD ROWSPAN=4>
|
||||||
|
<I>n</I> ist eine Zahl zwischen 1 und 7</TD></TR>
|
||||||
|
<TR><TD><B>:rr </B><I>n</I></TD><TD>Rotiert Bits rechts</TD></TR>
|
||||||
|
<TR><TD><B>:sl </B><I>n</I></TD><TD>Schiebt Bits links</TD></TR>
|
||||||
|
<TR><TD><B>:sr </B><I>n</I></TD><TD>Schiebt Bits rechts</TD></TR>
|
||||||
|
<TR><TD><B>:and </B><I>i</I></TD><TD>Und Verknüpfung</TD><TD ROWSPAN=4>
|
||||||
|
<I>i</I> ist eine Zahl zwischen 0 und 255</TD></TR>
|
||||||
|
<TR><TD><B>:or </B><I>i</I></TD><TD>Oder Verknüpfung</TD></TR>
|
||||||
|
<TR><TD><B>:xor </B><I>i</I></TD><TD>Exklusiv-oder Verknüpfung</TD></TR>
|
||||||
|
<TR><TD><B>:not </B></TD><TD>Negiert Bytewert</TD></TR>
|
||||||
|
<TR><TD><B>:neg </B></TD><TD>Zweier-Komplement</TD></TR>
|
||||||
|
</TABLE></CENTER>
|
||||||
|
Wird kein Bereich angegeben, so bezieht sich die Operation auf die gesamte
|
||||||
|
Datei. Es können zwei Adressen in den üblichen Schreibweisen
|
||||||
|
angegeben werden. Normalerweise wird dezimale Eingabe erwartet, bei
|
||||||
|
führender 0 werden die Adressen Hexadezimal interpretiert.
|
||||||
|
<BR>Der Wert <B>i</B> für die logische Verknüpfung kann
|
||||||
|
dezimal, hexadezimal, oder mit führendem <I>B</I> in binärer
|
||||||
|
Schreibweise angegeben werden. Auch bei Eingabe von genau acht 0 und 1
|
||||||
|
Werten wird der Byte - Wert binär interpretiert.<BR>
|
||||||
|
Beispiel:<BR>
|
||||||
|
<BLOCKQUOTE CLASS="examp">
|
||||||
|
<B><TT>:100,500and 01A </TT><FONT COLOR=#AAAAAA>RETURN</FONT></B><BR>
|
||||||
|
<B><TT>:03FA,01000or 00001000 </TT><FONT COLOR=#AAAAAA>RETURN</FONT></B><BR>
|
||||||
|
<B><TT>:.rr 3 </TT><FONT COLOR=#AAAAAA>RETURN</FONT></B><BR>
|
||||||
|
<B><TT>:'a,$sl 1 </TT><FONT COLOR=#AAAAAA>RETURN</FONT></B><BR>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Thu Jun 01 12:00:00 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
BIN
html/gif/bg2.gif
Normal file
BIN
html/gif/bg2.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 86 B |
BIN
html/gif/bvi_m.gif
Normal file
BIN
html/gif/bvi_m.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.8 KiB |
BIN
html/gif/bvi_s.gif
Normal file
BIN
html/gif/bvi_s.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
BIN
html/gif/dcbacks.gif
Normal file
BIN
html/gif/dcbacks.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 869 B |
BIN
html/gif/dot.gif
Normal file
BIN
html/gif/dot.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 42 B |
BIN
html/gif/up.gif
Normal file
BIN
html/gif/up.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 50 B |
122
html/index.html
Normal file
122
html/index.html
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI Home Page</title>
|
||||||
|
<script language="JavaScript">
|
||||||
|
<!--
|
||||||
|
if(top.frames.length!=0){top.location=location;}// -->
|
||||||
|
</script>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
<meta name="description" content="Bvi stands for Binary VIsual editor.
|
||||||
|
Bvi is a display oriented editor for binary files.
|
||||||
|
Its command set is based on those of the vi texteditor.">
|
||||||
|
<meta name="keywords" content="bvi, editor, binary, bmore, decimal, dos, hex,
|
||||||
|
hexadecimal, linux, msdos, octal, patch, more, unix, visual, vi">
|
||||||
|
<meta name="robots" content="INDEX,FOLLOW">
|
||||||
|
<meta name="author" content="Gerhard Buergmann">
|
||||||
|
<meta name="publisher" content="Gerhard Buergmann">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><th width="1%" valign="top"><img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
<p><a class="thl" href="quick.html">
|
||||||
|
Quick Tutorial
|
||||||
|
</a></p>
|
||||||
|
|
||||||
|
<p><a class="thl" href="download.html">
|
||||||
|
Download
|
||||||
|
</a></p>
|
||||||
|
|
||||||
|
<p><a class="thl" href="install.html">
|
||||||
|
Installation
|
||||||
|
</a></p>
|
||||||
|
|
||||||
|
<p><a class="thl" href="overview.html">
|
||||||
|
Command Overview
|
||||||
|
</a></p>
|
||||||
|
|
||||||
|
<p><a class="thl" href="bmore.html">
|
||||||
|
bmore
|
||||||
|
</a></p>
|
||||||
|
|
||||||
|
<p><a class="thl" href="german.html">
|
||||||
|
Deutsche<br>Beschreibung
|
||||||
|
</a></p>
|
||||||
|
|
||||||
|
<p><a class="thl" href="sitemap.html">
|
||||||
|
Sitemap
|
||||||
|
</a></p>
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
<p><a class="thl" href="http://www.math.fu-berlin.de/~guckes/vi/">
|
||||||
|
VI and Clones
|
||||||
|
</a></p>
|
||||||
|
|
||||||
|
<p><a class="thl" href="http://spin.ch/~tpo/linux/hexeds.html">
|
||||||
|
Hex-Editors
|
||||||
|
</a></p>
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
</TH>
|
||||||
|
<td width=1%><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width=99%>
|
||||||
|
<center>
|
||||||
|
<h1>Welcome to the<br>
|
||||||
|
<img src="gif/bvi_m.gif" ALT="bvi" width="232" height="125"><br>
|
||||||
|
Homepage</h1>
|
||||||
|
<b>Here you can find all the informations about <strong>bvi</strong> you need.</B>
|
||||||
|
</center>
|
||||||
|
<hr noshade>
|
||||||
|
The <strong>bvi</strong> is a display-oriented editor for binary files, based on the <strong>vi</strong> texteditor.
|
||||||
|
If you are familiar with <strong>vi</strong>, just start the editor and begin
|
||||||
|
to edit! A <strong>bmore</strong> programm is also included in the package.
|
||||||
|
<br>
|
||||||
|
If you never heard about <strong>vi</strong>, maybe <strong>bvi</strong> is not the best
|
||||||
|
choice for you.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<h3>Original site: <a href="http://bvi.linuxave.net/">http://bvi.linuxave.net</a></h3>
|
||||||
|
</p>
|
||||||
|
You can download source and compiled versions from the
|
||||||
|
<a href="download.html">download page</a>.<br>
|
||||||
|
Check out whats <a href="new130.html">new in 1.3.0</a>!
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<b>Newsgroup:</b> <a href="news:comp.editors">comp.editors</a>
|
||||||
|
</p>
|
||||||
|
<b>Mailing List:</b>
|
||||||
|
<blockquote>
|
||||||
|
To join this list, simply send a blank email to
|
||||||
|
<a href="mailto:bvi-subscribe@egroups.com">bvi-subscribe@eGroups.com</a>.
|
||||||
|
You will receive a subscription confirmation message.
|
||||||
|
Simply reply this message and your subscription will be complete.
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<strong>Bvi</strong> was developed by Gerhard Bürgmann and is published
|
||||||
|
under the GNU Public License. Current stable version is 1.3.0.
|
||||||
|
<strong>Bvi</strong> is running on most UNIX - like operating systems and
|
||||||
|
on MSDOS.
|
||||||
|
<p>
|
||||||
|
If you want to contact me:<br>
|
||||||
|
Gerhard Bürgmann, Vienna / Austria / Europe<br>
|
||||||
|
Email: <a href="mailto:gerhard.buergmann@altavista.net">
|
||||||
|
Gerhard.Buergmann@altavista.net</a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: October 23<sup>rd</sup> 2000 by Gerhard Bürgmann</i>
|
||||||
|
</p>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
</body></html>
|
130
html/install.html
Normal file
130
html/install.html
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Installation</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<font color="#ffffff" class="thl">Installation<br></font>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Installation</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The following steps are necessary to get bvi running:
|
||||||
|
<H2>UNIX</H2>
|
||||||
|
The Unix version of bvi needs the curses (ncurses) library
|
||||||
|
for cursor movement.
|
||||||
|
<OL>
|
||||||
|
<LI>Download the source package from the Download Page
|
||||||
|
<LI>Unzip the package with the command:
|
||||||
|
<PRE CLASS="examp">
|
||||||
|
# gunzip -c bvi-1.3.0.src.tar.gz | tar xvf
|
||||||
|
</PRE>
|
||||||
|
<LI>Change to the directory <TT CLASS="examp">bvi-1.3.0</TT> and type
|
||||||
|
<PRE CLASS="examp">
|
||||||
|
# ./configure
|
||||||
|
# make
|
||||||
|
</PRE>
|
||||||
|
|
||||||
|
<li>Type `<tt class="examp">make install</tt>' for copying the executable files
|
||||||
|
and manual pages to the final directories.
|
||||||
|
<br>
|
||||||
|
By default, `<tt class="examp">make install</tt>' will install the package's files in
|
||||||
|
<tt class="examp">`/usr/local/bin', `/usr/local/man'</tt>, etc.
|
||||||
|
You can specify an
|
||||||
|
installation prefix other than `<tt class="examp">/usr/local</tt>' by giving
|
||||||
|
`<tt class="examp">configure</tt>' the option
|
||||||
|
`<tt class="examp">--prefix=PATH</tt>'. Use the
|
||||||
|
`<tt class="examp">--with-ncurses</tt>' option to configure to specify an
|
||||||
|
alternate search path for Ncurses outside the normal
|
||||||
|
<tt class="examp">include/lib</tt> search path.
|
||||||
|
<p>
|
||||||
|
You will find now four new commands:
|
||||||
|
<pre class="examp">
|
||||||
|
bvi The binary editor
|
||||||
|
bview The readonly version of bvi
|
||||||
|
bedit The beginners version of bvi
|
||||||
|
bmore The binary more program
|
||||||
|
</pre>
|
||||||
|
<li>Use `<tt class="examp">make uninstall</tt>' to remove the installed
|
||||||
|
files from your file system.<br>
|
||||||
|
You can remove the program binaries and object files from the
|
||||||
|
source code directory by typing `<tt class="examp">make clean</tt>'.
|
||||||
|
To also remove the files that `<TT CLASS="examp">configure</tt>' created
|
||||||
|
(so you can compile the package for
|
||||||
|
a different kind of computer), type `<tt class="examp">make distclean</tt>'.
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<H2>MSDOS</H2>
|
||||||
|
You have to convert the sourcefiles from the UNIX textformat to
|
||||||
|
the MSDOS textformat first. This can be done e.g. by loading and
|
||||||
|
saving them with the MSDOS standard editor `edit'.
|
||||||
|
<P>
|
||||||
|
The MSDOS version is using the conio routines of the
|
||||||
|
Borland - C compilers for cursor movement. The <TT>doscur.h</TT>
|
||||||
|
header file substitutes the curses commands.<BR>
|
||||||
|
<strong>Bvi</strong> is using the "HUGE" memory model, <strong>bmore</strong>
|
||||||
|
needs the "TINY" model to
|
||||||
|
be able to convert it to a .COM file.
|
||||||
|
|
||||||
|
<OL>
|
||||||
|
<LI>Download the source package from the Download Page
|
||||||
|
<LI>Unzip the package with the command:
|
||||||
|
<PRE CLASS="examp">
|
||||||
|
gunzip -c bvi-1.3.0.src.tar.gz | tar xvf
|
||||||
|
</PRE>
|
||||||
|
<LI> Load the tcconfig file (located in the <TT>bc</TT> subdirectory
|
||||||
|
for Borland - C).
|
||||||
|
|
||||||
|
<LI> Press F9-Make
|
||||||
|
</OL>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Thu Oct 19 21:31:04 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
171
html/man_bmore.html
Normal file
171
html/man_bmore.html
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
<xmp>
|
||||||
|
BMORE(1) BMORE(1)
|
||||||
|
|
||||||
|
|
||||||
|
NAME
|
||||||
|
bmore - browse through a binary file
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
bmore [ -adi ] [ +linenumber ] [ +/ASCII-pattern ] [
|
||||||
|
+\Hex-pattern ] [ filename ... ]
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
more is a filter that displays the contents of a binary
|
||||||
|
file on the terminal, one screenful at a time. It nor-
|
||||||
|
mally pauses after each screenful, and prints --More-- at
|
||||||
|
the bottom of the screen. bmore provides a two-line over-
|
||||||
|
lap between screens for continuity. If bmore is reading
|
||||||
|
from a file rather than a pipe, the percentage of charac-
|
||||||
|
ters displayed so far is also shown.
|
||||||
|
|
||||||
|
bmore scrolls up to display one more screen line in
|
||||||
|
response to a RETURN character; it displays another
|
||||||
|
screenful in response to a SPACE character. Other com-
|
||||||
|
mands are listed below.
|
||||||
|
|
||||||
|
The screen is divided in three sections or panes: The byte
|
||||||
|
offset (extreme left), the hex pane (middle), and an ascii
|
||||||
|
pane (right) which shows as printable characters those
|
||||||
|
bytes in the hex pane. On an 80 column terminal there
|
||||||
|
will be sixteen hex values and their ASCII values on each
|
||||||
|
screen line. Note that (as one would expect) the first
|
||||||
|
byte has the offset 0 (zero).
|
||||||
|
|
||||||
|
bmore sets the terminal to noecho mode, so that the output
|
||||||
|
can be continuous. Commands that you type do not normally
|
||||||
|
show up on your terminal, except for the / , \ and ! com-
|
||||||
|
mands.
|
||||||
|
|
||||||
|
If the standard output is not a terminal, more acts just
|
||||||
|
like cat(1V), except that a header is printed before each
|
||||||
|
file in a series.
|
||||||
|
|
||||||
|
OPTIONS
|
||||||
|
-a ASCII mode: no hex representation of the contents.
|
||||||
|
Non printable characters are displayed as a dot (.)
|
||||||
|
|
||||||
|
-d Display error messages rather than ringing the ter-
|
||||||
|
minal bell if an unrecognized command is used.
|
||||||
|
This is helpful for inexperienced users.
|
||||||
|
|
||||||
|
-i Ignore case for searching.
|
||||||
|
|
||||||
|
+linenumber
|
||||||
|
Start up at linenumber.
|
||||||
|
|
||||||
|
+/ASCII-pattern
|
||||||
|
Start up at the line containing the regular
|
||||||
|
expression pattern. Note: unlike editors, this
|
||||||
|
construct should not end with a `/'. If it does,
|
||||||
|
then the trailing slash is taken as a character in
|
||||||
|
the search pattern.
|
||||||
|
|
||||||
|
|
||||||
|
USAGE
|
||||||
|
|
||||||
|
Commands
|
||||||
|
The commands take effect immediately; it is not necessary
|
||||||
|
to type a carriage return. Up to the time when the com-
|
||||||
|
mand character itself is given, the user may type the line
|
||||||
|
kill character to cancel the numerical argument being
|
||||||
|
formed. In addition, the user may type the erase charac-
|
||||||
|
ter to redisplay the `--More--(xx%)' message.
|
||||||
|
|
||||||
|
In the following commands, i is a numerical argument (1 by
|
||||||
|
default).
|
||||||
|
|
||||||
|
iSPACE Display another screenful, or i more lines if i
|
||||||
|
is specified.
|
||||||
|
|
||||||
|
iRETURN Display another line, or i more lines, if speci-
|
||||||
|
fied.
|
||||||
|
|
||||||
|
i^D (CTRL-D) Display (scroll down) 11 more lines. i
|
||||||
|
is given, the scroll size is set to i.
|
||||||
|
|
||||||
|
id Same as ^D.
|
||||||
|
|
||||||
|
iz Same as SPACE, except that i, if present,
|
||||||
|
becomes the new default number of lines per
|
||||||
|
screenful.
|
||||||
|
|
||||||
|
is Skip i lines and then print a screenful.
|
||||||
|
|
||||||
|
if Skip i screenfuls and then print a screenful.
|
||||||
|
|
||||||
|
i^B (CTRL-B) Skip back i screenfuls and then print a
|
||||||
|
screenful.
|
||||||
|
|
||||||
|
b Same as ^B (CTRL-D).
|
||||||
|
|
||||||
|
q
|
||||||
|
Q Exit from more.
|
||||||
|
|
||||||
|
= Display the current line number.
|
||||||
|
|
||||||
|
v Drop into the bvi(1) editor at the current off-
|
||||||
|
set of the current file.
|
||||||
|
|
||||||
|
w Drop into the bvi(1) editor at the current off-
|
||||||
|
set of the current file. Only the portion of the
|
||||||
|
file displayed on the screen will be loaded.
|
||||||
|
|
||||||
|
h Help. Give a description of all the more com-
|
||||||
|
mands.
|
||||||
|
|
||||||
|
i/pattern Search for the ith occurrence of the regular
|
||||||
|
expression pattern. Display the screenful
|
||||||
|
starting at the file position that contains the
|
||||||
|
ith match for the regular expression ASCII-pat-
|
||||||
|
tern, or the end of a pipe, whichever comes
|
||||||
|
first. If bmore is displaying a file and there
|
||||||
|
is no such match, its position in the file
|
||||||
|
remains unchanged. Regular expressions can be
|
||||||
|
edited using erase and kill characters. Erasing
|
||||||
|
back past the first column cancels the search
|
||||||
|
command.
|
||||||
|
|
||||||
|
' Single quote. Go to the point from which the
|
||||||
|
last search started. If no search has been per-
|
||||||
|
formed in the current file, go to the beginning
|
||||||
|
of the file.
|
||||||
|
!command Invoke a shell to execute command. The charac-
|
||||||
|
ters % and !, when used within command are
|
||||||
|
replaced with the current filename and the pre-
|
||||||
|
vious shell command, respectively. If there is
|
||||||
|
no current filename, % is not expanded. Prepend
|
||||||
|
a backslash to these characters to escape expan-
|
||||||
|
sion.
|
||||||
|
|
||||||
|
i:n Skip to the ith next filename given in the com-
|
||||||
|
mand line, or to the last filename in the list
|
||||||
|
if i is out of range.
|
||||||
|
|
||||||
|
i:p Skip to the ith previous filename given in the
|
||||||
|
command line, or to the first filename if i is
|
||||||
|
out of range. If given while more is positioned
|
||||||
|
within a file, go to the beginning of the file.
|
||||||
|
If more is reading from a pipe, more simply
|
||||||
|
rings the terminal bell.
|
||||||
|
:f Display the current filename and offset number.
|
||||||
|
|
||||||
|
:q
|
||||||
|
:Q Exit from bmore (same as q or Q ).
|
||||||
|
|
||||||
|
. Dot. Repeat the previous command.
|
||||||
|
|
||||||
|
|
||||||
|
AUTHOR
|
||||||
|
bmore was developed by Gerhard Buergmann, Vienna, Austria
|
||||||
|
Gerhard.Buergmann@altavista.net
|
||||||
|
|
||||||
|
FILES
|
||||||
|
/etc/termcap terminal data base
|
||||||
|
/usr/local/share/bmore.help help file
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
bvi(1), termcap(5)
|
||||||
|
|
||||||
|
|
||||||
|
13/Oct/2000 BMORE Version 1.3.0
|
||||||
|
</xmp>
|
424
html/man_bvi.html
Normal file
424
html/man_bvi.html
Normal file
|
@ -0,0 +1,424 @@
|
||||||
|
<xmp>
|
||||||
|
BVI(1) User Commands BVI(1)
|
||||||
|
|
||||||
|
|
||||||
|
NAME
|
||||||
|
bvi, bview - visual display editor for binary files
|
||||||
|
|
||||||
|
VERSION
|
||||||
|
bvi-1.3.0
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
bvi [-R] [-c cmd] [-b begin] [-e end] [-s size] [-f script] file...
|
||||||
|
bview [-R] [-c cmd] [-b begin] [-e end] [-s size] [-f script] file...
|
||||||
|
|
||||||
|
OPTIONS
|
||||||
|
file...
|
||||||
|
A list of filenames. The first one will be the
|
||||||
|
current file and will be read into the buffer. The
|
||||||
|
cursor will be positioned on the first line of the
|
||||||
|
buffer. You can get to the other files with the
|
||||||
|
":next" command.
|
||||||
|
|
||||||
|
-R "Readonly": The readonly flag is set for all the
|
||||||
|
files, preventing accidental overwriting with a write
|
||||||
|
command.
|
||||||
|
|
||||||
|
-b begin
|
||||||
|
causes bvi to load a file not from the start but from
|
||||||
|
offset {begin}.
|
||||||
|
|
||||||
|
-e end
|
||||||
|
causes bvi to load a file not till end but till address
|
||||||
|
{end}.
|
||||||
|
|
||||||
|
-s size
|
||||||
|
causes bvi not to load the complete file but only
|
||||||
|
{size} bytes.
|
||||||
|
|
||||||
|
-c cmd
|
||||||
|
{cmd} will be executed after the first file has
|
||||||
|
been read. If the {cmd} contains spaces it must
|
||||||
|
be enclosed in double quotes (this depends on the
|
||||||
|
shell that is used).
|
||||||
|
|
||||||
|
-f script
|
||||||
|
This command provides a means for collecting a series
|
||||||
|
of "ex" (colon) commands into a script file, then
|
||||||
|
using this file to edit other files. Since there is no
|
||||||
|
binary stream editor "bsed", you can use this option
|
||||||
|
to make several global changes in a binary file.
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Bvi stands for "Binary VIsual editor". Bvi is a screen
|
||||||
|
oriented editor for binary files; its command set is based
|
||||||
|
on that of the vi(1) text editor. As a binary editor does
|
||||||
|
not have the concept of "lines" there are differences from
|
||||||
|
Vi commands wherever the latter are line orientate.
|
||||||
|
|
||||||
|
COMPARISON
|
||||||
|
The main differences between Vi and Bvi are:
|
||||||
|
|
||||||
|
The screen is divided in three sections or panes: The byte
|
||||||
|
offset (extreme left), the hex pane (middle), and an ascii
|
||||||
|
pane (right) which shows as printable characters those
|
||||||
|
bytes in the hex pane. On an 80 column terminal there
|
||||||
|
will be sixteen hex values and their ASCII values on each
|
||||||
|
screen line. Note that (as one would expect) the first
|
||||||
|
byte has the offset '0' (zero).
|
||||||
|
|
||||||
|
You can toggle between the hex and ascii windows with the
|
||||||
|
tabulator key (TAB). Toggling between these two windows
|
||||||
|
does not change the current position within the file.
|
||||||
|
|
||||||
|
No "lines" concept: Files are treated as one long stream
|
||||||
|
of bytes. The characters "newline" and "carriage return"
|
||||||
|
are not special, id est they never mark the end of lines.
|
||||||
|
Therefore the lines on the screen do not represent lines
|
||||||
|
in the usual way. Data is broken across screen lines
|
||||||
|
arbitarily. As a consequence there are no commands in bvi
|
||||||
|
from ex or vi that are based on line numbers, eg "dd",
|
||||||
|
"yy", 'C', 'S', 'o', 'O'. This also changes the meaning
|
||||||
|
of "range" before the ":write" command to a byte offset,
|
||||||
|
ie the command ":100,200w foo" writes all *bytes* (not
|
||||||
|
lines) from offset 100 to offset 200 to the file "foo".
|
||||||
|
|
||||||
|
No "text objects": There are also no text-specific
|
||||||
|
arrangements like words, paragraphs, sentences, sections
|
||||||
|
and so on.
|
||||||
|
|
||||||
|
Extended "ruler": The bottom line of the screen shows the
|
||||||
|
current address (byte offset) and the current character in
|
||||||
|
these notations:
|
||||||
|
|
||||||
|
octal, hexadecimal, decimal and ascii.
|
||||||
|
|
||||||
|
Search patterns: All search commands understand these
|
||||||
|
special characters:
|
||||||
|
|
||||||
|
. any character
|
||||||
|
[] set of characters
|
||||||
|
* zero or more occurrences of previous char or set
|
||||||
|
|
||||||
|
But as there is no concept of lines you cannot use the
|
||||||
|
standard symbols ("anchors") for "begin-of-line" ('^') and
|
||||||
|
"end-of-line" ('$'). Searching for the start/end of lines
|
||||||
|
must be done explicitly by adding these special characters
|
||||||
|
to your search pattern using these meta sequences:
|
||||||
|
|
||||||
|
\n newline
|
||||||
|
\r return
|
||||||
|
\t tab
|
||||||
|
\0 binary zero
|
||||||
|
|
||||||
|
Additional search commands: Similar to the text search
|
||||||
|
commands there are additional hex-search functions '\' and
|
||||||
|
'#' which allow to search for any byte value. Example:
|
||||||
|
"\62 76 69" will search for the string "bvi". Spaces
|
||||||
|
between hex value are optional, so searching for
|
||||||
|
"6775636B6573" will find "guckes".
|
||||||
|
|
||||||
|
Changing data (insertion, deletion) moves the data to
|
||||||
|
other addresses; this is bad for many cases (eg.
|
||||||
|
databases, program files) and is thus disabled by default.
|
||||||
|
You can enable this commands by typing
|
||||||
|
|
||||||
|
:set memmove
|
||||||
|
|
||||||
|
BVI Modes:
|
||||||
|
|
||||||
|
Command Mode (Normal Mode):
|
||||||
|
|
||||||
|
Input is treated as command. Note that command mode is
|
||||||
|
the default mode after startup and after escaping from
|
||||||
|
input mode. Use ESC (escape) to cancel a partial
|
||||||
|
(uncompleted) command.
|
||||||
|
|
||||||
|
Input Mode:
|
||||||
|
|
||||||
|
Input is treated as replacement of current characters or
|
||||||
|
(after the end of the file) is appended to the current
|
||||||
|
file. This mode is entered from command mode by typing
|
||||||
|
one of 'i', 'I', 'A', 'r', or 'R'. You can enter the
|
||||||
|
characters from the keyboard (in the ASCII window) or
|
||||||
|
hexadecimal values (in the HEX window). Type TAB to
|
||||||
|
switch between these two windows. Type ESC to finish the
|
||||||
|
current input and return to command mode. Type CTRL-C to
|
||||||
|
cancel current command abnormally.
|
||||||
|
|
||||||
|
Command line mode (Last Line Mode or : mode):
|
||||||
|
|
||||||
|
Similar to vi, this mode is entered by typing one of the
|
||||||
|
characters : / ? \ # ! The command is terminated and
|
||||||
|
executed by typing a carriage return; to cancel a
|
||||||
|
partially typed command, type ESC to cancel the current
|
||||||
|
command and return to command mode.
|
||||||
|
|
||||||
|
ENVIRONMENT
|
||||||
|
The editor recognizes the environment variable BVIINIT as
|
||||||
|
a command (or list of commands) to run when it starts
|
||||||
|
up. If this variable is undefined, the editor checks for
|
||||||
|
startup commands in the file ~/.bvirc file, which you
|
||||||
|
must own. However, if there is a .bvirc owned by you in
|
||||||
|
the current directory, the editor takes its startup
|
||||||
|
commands from this file - overriding both the file in your
|
||||||
|
home directory and the environment variable.
|
||||||
|
|
||||||
|
TERMINOLOGY
|
||||||
|
Characters names are abbreviated as follows:
|
||||||
|
Abbr. ASCII name aka
|
||||||
|
CR 010 carriage return
|
||||||
|
^A 001 control-a
|
||||||
|
^H 008 control-h
|
||||||
|
^I 009 control-i aka TAB
|
||||||
|
^U 021 control-u
|
||||||
|
^Z 026 control-z
|
||||||
|
ESC 027 escape aka ESC
|
||||||
|
DEL 127 delete
|
||||||
|
LEFT --- left arrow
|
||||||
|
RIGHT --- right arrow
|
||||||
|
DOWN --- down arrow
|
||||||
|
UP --- up arrow
|
||||||
|
|
||||||
|
COMMAND SUMMARY
|
||||||
|
See the TERMINOLOGY for a summary on key name
|
||||||
|
abbreviations used within the following description of
|
||||||
|
commands.
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
Arrow keys move the cursor on the screen within the
|
||||||
|
current window.
|
||||||
|
|
||||||
|
Sample commands:
|
||||||
|
:version show version info
|
||||||
|
<- v ^ -> arrow keys move the cursor
|
||||||
|
h j k l same as arrow keys
|
||||||
|
u undo previous change
|
||||||
|
ZZ exit bvi, saving changes
|
||||||
|
:q! quit, discarding changes
|
||||||
|
/text search for text
|
||||||
|
^U ^D scroll up or down
|
||||||
|
|
||||||
|
Counts before bvi commands:
|
||||||
|
Numbers may be typed as a prefix to some commands.
|
||||||
|
They are interpreted in one of these ways.
|
||||||
|
|
||||||
|
screen column |
|
||||||
|
byte of file G
|
||||||
|
scroll amount ^D ^U
|
||||||
|
repeat effect most of the rest
|
||||||
|
|
||||||
|
Interrupting, canceling
|
||||||
|
ESC end insert or incomplete command
|
||||||
|
DEL (delete or rubout) interrupts
|
||||||
|
|
||||||
|
File manipulation:
|
||||||
|
ZZ if file modified, write and exit;
|
||||||
|
otherwise, exit
|
||||||
|
:w write changed buffer to file
|
||||||
|
:w! write changed buffer to file, overriding
|
||||||
|
read-only ("forced" write)
|
||||||
|
:q quit when no changes have been made
|
||||||
|
:q! quit and discard all changes
|
||||||
|
:e file edit file
|
||||||
|
:e! reedit current file, discard all changes
|
||||||
|
:e # edit the alternate file
|
||||||
|
:e! # edit the alternate file, discard changes
|
||||||
|
:w file write current buffer to file
|
||||||
|
:w! file write current buffer to file overriding
|
||||||
|
read-only (this "overwrites" the file)
|
||||||
|
:sh run the command as set with option "shell",
|
||||||
|
then return
|
||||||
|
:!cmd run the command cmd from "shell", then
|
||||||
|
return
|
||||||
|
:n edit next file in the argument list
|
||||||
|
:f show current filename, modified flag,
|
||||||
|
current byte offset, and percentage of
|
||||||
|
current position within buffer
|
||||||
|
^G same as :f
|
||||||
|
|
||||||
|
Additional edit commands
|
||||||
|
You can insert/append/change bytes in
|
||||||
|
ASCII/binary/decimal/ hexadecimal or octal representation.
|
||||||
|
You can enter several (screen) lines of input. A line with
|
||||||
|
only a period (.) in it will terminate the command. You
|
||||||
|
must not type in values greater than a byte value. This
|
||||||
|
causes an abandom of the command. Pressing the CR key
|
||||||
|
does not insert a newline - character into the file. If
|
||||||
|
you use ASCII mode you can use the special characters \n,
|
||||||
|
\r, \t and \0.
|
||||||
|
|
||||||
|
:i aCR insert bytes (ASCII) at cursor position
|
||||||
|
:a bCR append bytes (Binary) at end of file
|
||||||
|
:c hCR change bytes (hexadecimal) at cursor position
|
||||||
|
|
||||||
|
Bit-level operations
|
||||||
|
:and n bitwise 'and' operation with value n
|
||||||
|
:or n bitwise 'or' operation with value n
|
||||||
|
:xor n bitwise 'xor' operation with value n
|
||||||
|
:neg two's complement
|
||||||
|
:not logical negation
|
||||||
|
:sl i shift each byte i bits to the left
|
||||||
|
:sr i shift each byte i bits to the right
|
||||||
|
:rl i rotate each byte i bits to the left
|
||||||
|
:rr i rotate each byte i bits to the right
|
||||||
|
|
||||||
|
Command mode addresses
|
||||||
|
:w foo write current buffer to a file
|
||||||
|
named "foo"
|
||||||
|
:5,10w foo copy byte 5 through 100 into as
|
||||||
|
file named foo
|
||||||
|
:.,.+20w foo copy the current byte and the next
|
||||||
|
20 bytes to foo
|
||||||
|
:^,'aw foo write all bytes from the beginning
|
||||||
|
through marker 'a'
|
||||||
|
:/pat/,$ foo search pattern pat and and copy
|
||||||
|
through end of file
|
||||||
|
|
||||||
|
Positioning within file:
|
||||||
|
^B backward screen
|
||||||
|
^F forward screen
|
||||||
|
^D scroll down half screen
|
||||||
|
^U scroll up half screen
|
||||||
|
nG go to the specified character
|
||||||
|
(end default), where n is a decimal address
|
||||||
|
/pat next line matching pat
|
||||||
|
?pat previous line matching pat
|
||||||
|
\hex jump to next occurrence of hex string hex
|
||||||
|
#hex jump to previous occurrence of hex string hex
|
||||||
|
n repeat last search command
|
||||||
|
N repeat last search command, but in opposite
|
||||||
|
direction
|
||||||
|
|
||||||
|
Adjusting the screen:
|
||||||
|
^L clear and redraw screen
|
||||||
|
zCR redraw screen with current line at top of screen
|
||||||
|
z- redraw screen with current line at bottom of
|
||||||
|
screen
|
||||||
|
z. redraw screen with current line at center of
|
||||||
|
screen
|
||||||
|
/pat/z- search for pattern pat and then move currents
|
||||||
|
line to bottom
|
||||||
|
^E scroll screen down 1 line
|
||||||
|
^Y scroll screen up 1 line
|
||||||
|
|
||||||
|
Marking and returning:
|
||||||
|
mx mark current position with lower-case letter x
|
||||||
|
Note: this command works for all lower-case
|
||||||
|
letters
|
||||||
|
'x move cursor to mark x in ASCII section
|
||||||
|
`x move cursor to mark x in HEX section
|
||||||
|
'' move cursor to previous context in ASCII section
|
||||||
|
`` move cursor to previous context in HEX section
|
||||||
|
|
||||||
|
Line positioning:
|
||||||
|
H jump to first line on screen ("top")
|
||||||
|
L jump to last line on screen ("low")
|
||||||
|
M jump to middle line on screen ("middle")
|
||||||
|
- jump onto previous line on screen
|
||||||
|
+ jump onto next line on screen
|
||||||
|
CR same as +
|
||||||
|
DOWN or j next line, same column
|
||||||
|
UP or k previous line, same column
|
||||||
|
|
||||||
|
Character positioning:
|
||||||
|
^ first byte in HEX window
|
||||||
|
$ end of screen line
|
||||||
|
l or RIGHT jump onto next byte (within current
|
||||||
|
screen line)
|
||||||
|
h or LEFT jump onto previous byte (within current
|
||||||
|
screen line)
|
||||||
|
^H same as LEFT
|
||||||
|
space same as RIGHT
|
||||||
|
fx find next occurrence of character x
|
||||||
|
Fx find previous occurrence of character x
|
||||||
|
n| jump onto nth byte/character within current
|
||||||
|
line
|
||||||
|
|
||||||
|
Strings:
|
||||||
|
(works similar to the strings(1) command)
|
||||||
|
Note: "Words" are defined as strings of "nonprinting
|
||||||
|
characters".
|
||||||
|
e jump to next end of word
|
||||||
|
w jump to next begin of word
|
||||||
|
b jump to previous begin of word
|
||||||
|
W forward to next string delimited with a
|
||||||
|
\0 or \n
|
||||||
|
B back to previous string delimited with a
|
||||||
|
nonprinting char
|
||||||
|
|
||||||
|
Corrections during insert:
|
||||||
|
^H erase last character (backspace)
|
||||||
|
erase your erase character, same as ^H (backspace)
|
||||||
|
ESC ends insertion, back to command mode
|
||||||
|
|
||||||
|
Append and replace:
|
||||||
|
A append at end of file
|
||||||
|
rx replace current bte with char 'x'
|
||||||
|
R enter replace mode; for all subsequent input,
|
||||||
|
the current byte is overwritten with the next
|
||||||
|
input character; leave replace mode with ESC.
|
||||||
|
|
||||||
|
Miscellaneous Operations:
|
||||||
|
TAB toggle between ASCII and HEX section
|
||||||
|
|
||||||
|
Yank and Put:
|
||||||
|
3ySPACE yank 3 characters
|
||||||
|
p insert contents of yank buffer
|
||||||
|
o replace text with content of yank buffer
|
||||||
|
P put back at end of file
|
||||||
|
|
||||||
|
Undo, Redo:
|
||||||
|
u undo last change
|
||||||
|
Note: Only the last change can be undone.
|
||||||
|
Therefore this commands toggles between the
|
||||||
|
last and second-t-last state of the buffer.
|
||||||
|
|
||||||
|
Setting Options:
|
||||||
|
With the :set command you can set options in bvi
|
||||||
|
|
||||||
|
Option Default Description
|
||||||
|
|
||||||
|
autowrite noaw Save current file, if modified, if you
|
||||||
|
give a :n, :r or ! command
|
||||||
|
columns cm=16 on an 80 character wide terminal
|
||||||
|
ignorecase noic Ignores letter case in searching
|
||||||
|
magic nomagic Makes . [ * special in patterns
|
||||||
|
memmove nomm enables insert and delete commands
|
||||||
|
offset of=0 adds an offset to the diplayed addresses
|
||||||
|
readonly noro If set, write fails unless you use ! after command
|
||||||
|
scroll sc=1/2 window
|
||||||
|
Number of lines scrolled by ^U and ^D
|
||||||
|
showmode mo Displays statusline on bottom of the screen
|
||||||
|
terse noterse Let you obtain shorter error messages
|
||||||
|
window window=screensize
|
||||||
|
Lines in window, can be reduced at slow terminals
|
||||||
|
wordlength wl=4 Length of an ASCII-string found by w, W, b or B
|
||||||
|
wrapscan ws Searches wrap around past the end of the file
|
||||||
|
unixstyle nous The representation of ascii characters below
|
||||||
|
32 is displayed in the statusline as shown
|
||||||
|
in ascii(7) if unset rather in DOS-style (^A)
|
||||||
|
|
||||||
|
AUTHOR
|
||||||
|
bvi was developed by Gerhard Buergmann, Vienna, Austria
|
||||||
|
Gerhard.Buergmann@altavista.net
|
||||||
|
|
||||||
|
WWW
|
||||||
|
Bvi Homepage: http://bvi.linuxave.net/
|
||||||
|
Vi Pages: http://www.math.fu-berlin.de/~guckes/vi/
|
||||||
|
(all about Vi and its clones)
|
||||||
|
|
||||||
|
FILES
|
||||||
|
$HOME/.bvirc editor startup file
|
||||||
|
./.bvirc editor startup file
|
||||||
|
|
||||||
|
BUGS
|
||||||
|
Bvi does not update the screen when the terminal changes
|
||||||
|
its size.
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
vi(1), strings(1), ascii(5)
|
||||||
|
|
||||||
|
|
||||||
|
13/Oct/2000 BVI Version 1.3.0 8
|
||||||
|
</xmp>
|
154
html/new120.html
Normal file
154
html/new120.html
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: CHANGES in bvi 1.2.0</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
<a class="ths" href="new130.html">New in 1.3.0</a><br>
|
||||||
|
<font color="#ffffff" class="ths">New in 1.2.0<br></font>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">CHANGES in bvi 1.2.0</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<UL>
|
||||||
|
<LI>Configuration with GNU autoconfig
|
||||||
|
<LI>New <B>:set</B> options:
|
||||||
|
<UL>
|
||||||
|
<LI><B>:set columns=n</B><BR>
|
||||||
|
You can set the number of columns on the screen to an
|
||||||
|
arbitrary value. This might be useful if you edit a file
|
||||||
|
with a fixed record length.<BR>
|
||||||
|
Default: max number of columns, divisible by four.<BR>
|
||||||
|
Abbreviation: <B>:set cm=n</B>
|
||||||
|
<LI><B>:set memmove</B>
|
||||||
|
enables the new commands to insert or delete bytes.<BR>
|
||||||
|
Per default this commands are disabled, because e.g. in
|
||||||
|
executable files you must not move bytes.<BR>
|
||||||
|
Default: <B>:set nomemmove</B><BR>
|
||||||
|
Abbreviation: <B>:set mm</B> - <B>:set nomm</B>
|
||||||
|
<LI>The listing for <B>:set all</B> is now in
|
||||||
|
alphabetical order.
|
||||||
|
</UL>
|
||||||
|
<LI>New insert and delete commands:
|
||||||
|
<UL>
|
||||||
|
<LI><B>a</B> inserts after cursor position
|
||||||
|
<LI><B>i</B> inserts on cursor position
|
||||||
|
<LI><B>x</B> deletes byte under cursor
|
||||||
|
<LI><B>X</B> deletes byte before cursor
|
||||||
|
<LI><B>d</B> delete command with modifiers:
|
||||||
|
<UL>
|
||||||
|
<LI><B>d<FONT COLOR=#888888>SPACE</FONT></B> deletes byte under cursor
|
||||||
|
<LI><B>df<FONT COLOR=#FF0000>C</FONT></B> deletes from current position to
|
||||||
|
next character <FONT COLOR=#FF0000>C</FONT>
|
||||||
|
<LI><B>d/<FONT COLOR=#FF0000>xyz</FONT></B> deletes from current position
|
||||||
|
to first matching pattern <FONT COLOR=#FF0000>xyz</FONT>
|
||||||
|
<LI><B>d$</B> deletes from current position to EOF
|
||||||
|
<LI><B>d'<FONT COLOR=#FF0000>a</FONT></B> deletes from current positions
|
||||||
|
to mark <FONT COLOR=#FF0000>a</FONT>
|
||||||
|
<LI><B>d<FONT COLOR=#FF0000>n</FONT>G</B> deletes from current position to
|
||||||
|
byte with (decimal) address <FONT COLOR=#FF0000>n</FONT>
|
||||||
|
</UL>
|
||||||
|
</UL>
|
||||||
|
<LI>New syntax for <B>p</B> (put) command:<BR>
|
||||||
|
In previous versions of <I>bvi</I> the <B>p</B> command did an overwriting
|
||||||
|
"put". Now the bytes are inserted.
|
||||||
|
<LI>New command <B>o</B> (overwrite):<BR>
|
||||||
|
This is an overwriting "put" command. It is the only command in <I>bvi</I>
|
||||||
|
that uses a command key in a complete different way than in <I>vi</I>
|
||||||
|
(<B>o</B> opens a new line in <I>vi</I>).
|
||||||
|
<LI>New syntax for <B>y</B> (yank) command:
|
||||||
|
<UL>
|
||||||
|
<LI><B>y<FONT COLOR=#888888>SPACE</FONT></B> yanks byte under cursor
|
||||||
|
<LI><B>yf<FONT COLOR=#FF0000>C</FONT></B> yanks from current position to next
|
||||||
|
character <FONT COLOR=#FF0000>C</FONT>
|
||||||
|
<LI><B>y/<FONT COLOR=#FF0000>xyz</FONT></B> yanks from current position to
|
||||||
|
first matching pattern <FONT COLOR=#FF0000>xyz</FONT>
|
||||||
|
<LI><B>y$</B> yanks from current position to EOF
|
||||||
|
<LI><B>y'<FONT COLOR=#FF0000>a</FONT></B> yanks from current position to
|
||||||
|
mark <FONT COLOR=#FF0000>a</FONT>
|
||||||
|
<LI><B>y<FONT COLOR=#FF0000>n</FONT>G</B> yanks from current position to
|
||||||
|
byte with (decimal) address <FONT COLOR=#FF0000>n</FONT>
|
||||||
|
</UL>
|
||||||
|
<LI>New ex (colon) commands:
|
||||||
|
<UL>
|
||||||
|
<LI><B>:a(ppend) a(scii)|b(binary)|d(ecimal)|h(exadecimal)|o(ctal)</B>
|
||||||
|
<LI><B>:c(hange) a(scii)|b(binary)|d(ecimal)|h(exadecimal)|o(ctal)</B>
|
||||||
|
<LI><B>:i(nsert) a(scii)|b(binary)|d(ecimal)|h(exadecimal)|o(ctal)</B><BR>
|
||||||
|
The three commands above are used to append or change or insert bytes
|
||||||
|
in the selected representation until you type a line containing only
|
||||||
|
a dot, e.g. insert bytes in binary mode:
|
||||||
|
<PRE>
|
||||||
|
:i b
|
||||||
|
0 010 110 1110010 10 100
|
||||||
|
1 1001 1001 0 0
|
||||||
|
.
|
||||||
|
</PRE>
|
||||||
|
Pressing the <FONT COLOR=#888888>RETURN</FONT> key does <I>not</I> insert
|
||||||
|
a newline - character into the file. If you use <B>:i a</B> (insert
|
||||||
|
ascii) you can use the special characters \n, \r, \t and \0.
|
||||||
|
<LI><B>:d(elete)</B>
|
||||||
|
<LI><B>:g(lobal)</B> does a global search with printing found items
|
||||||
|
<LI><B>:ma(rk)</B>
|
||||||
|
<LI><B>:pu(t)</B> puts yanked bytes into the file
|
||||||
|
<LI><B>:o(verwrite)</B> is an overwriting ":put"
|
||||||
|
<LI><B>:y(ank)</B>
|
||||||
|
</UL>
|
||||||
|
<LI><B>:f newname</B> - bug fixed
|
||||||
|
<LI>new command line option <B><TT>-f script</TT></B>
|
||||||
|
<LI><B>CTRL - C</B> aborts some commands, e.g. search commands
|
||||||
|
<LI>CR moves cursor to 1st column of next screen line
|
||||||
|
<LI>Local settings according to the environment variable LANG
|
||||||
|
will be evaluated (see setlocal(3)).
|
||||||
|
</UL>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Thu Jun 01 12:00:00 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
101
html/new130.html
Normal file
101
html/new130.html
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: CHANGES in bvi 1.3.0</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
<font color="#ffffff" class="ths">New in 1.3.0<br></font>
|
||||||
|
<a class="ths" href="new120.html">New in 1.2.0</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">CHANGES in bvi 1.3.0</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<UL>
|
||||||
|
<LI>In the <FONT FACE="COURIER">configure</FONT> script you can use <FONT FACE="COURIER">--with-ncurses</FONT>
|
||||||
|
option to configure to specify an alternate
|
||||||
|
search path for Ncurses outside the normal include/lib search path.
|
||||||
|
<P>
|
||||||
|
<li>A <FONT FACE="COURIER">make uninstall</font> option has been added
|
||||||
|
<p>
|
||||||
|
<LI>A <STRONG>bmore</STRONG> program has been added. It acts like the BSD - text - more,
|
||||||
|
but for binary files.<P>
|
||||||
|
Additional command line options:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<TT><B>-a</B></TT> ASCII mode
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
Additional (changed) Commands:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<TT><B>v</B></TT> does not invoke vi but bvi<BR>
|
||||||
|
<TT><B>w</B></TT> invokes bvi with only that portion of the file
|
||||||
|
which is displayed on the screen.
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
<LI>New in <STRONG>bvi</STRONG>:
|
||||||
|
<UL>
|
||||||
|
<LI>You can edit now Block Special Files too.
|
||||||
|
<LI>You can read - edit - write files partly.
|
||||||
|
<LI>New Command line options:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<TT><B>+cmd</B></TT><BR>
|
||||||
|
<TT><B>-b</B> begin \</TT><BR>
|
||||||
|
<TT><B>-e</B> end > </TT>for partial file read<BR>
|
||||||
|
<TT><B>-s</B> size /</TT><P>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
<I>begin, end</I> or <I>size</I> can be an integer value (decimal or
|
||||||
|
hexadecimal) or an integer value with an appended <B>k</B> (for
|
||||||
|
multiply by 1024) or <B>m</B> (for multiply by 1.048.576).
|
||||||
|
<LI>:e# bug fixed
|
||||||
|
<li>Debian bug #68436 (Buffer overflow in io.c) fixed
|
||||||
|
</UL>
|
||||||
|
</UL>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Thu Oct 12 20:51:06 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
96
html/overview.html
Normal file
96
html/overview.html
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Command Overview</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<font color="#ffffff" class="thl">Command Overview<br></font>
|
||||||
|
<a class="ths" href="cursor.html">Cursor Movement</a><br>
|
||||||
|
<a class="ths" href="edit.html">Edit Cmds</a><br>
|
||||||
|
<a class="ths" href="yank.html">Yank and Put Cmds</a><br>
|
||||||
|
<a class="ths" href="set.html">Set Options</a><br>
|
||||||
|
<a class="ths" href="colon.html">Colon (ex) Cmds</a><br>
|
||||||
|
<a class="ths" href="man_bvi.html">man - Page</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Command Overview</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
This overview compares bvi commands with the corresponding commands of
|
||||||
|
the standard ascii vi.
|
||||||
|
<P>
|
||||||
|
<CENTER>
|
||||||
|
<TABLE WIDTH=70%>
|
||||||
|
<TR BGCOLOR=#CCCCFF><TD>Commands shown in blue frames are commands which
|
||||||
|
are available in both bvi and vi, but with a slightly different
|
||||||
|
behavior.</TD></TR>
|
||||||
|
<TR BGCOLOR=#CCFFCC><TD>Green frames are used for commands which are
|
||||||
|
equal in both bvi and vi.</TD></TR>
|
||||||
|
<TR BGCOLOR=#FFCCCC><TD>Red frames are used for missing commands</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</CENTER>
|
||||||
|
<P>
|
||||||
|
Special keys are displayed in a gray font, e.g.
|
||||||
|
<FONT COLOR=#AAAAAA><B>RETURN</B></FONT>,
|
||||||
|
<FONT COLOR=#AAAAAA><B>ARROW_UP</B></FONT> or
|
||||||
|
<FONT COLOR=#AAAAAA><B>CTRL</B></FONT>.
|
||||||
|
|
||||||
|
<H3>Topics:</H3>
|
||||||
|
<P>
|
||||||
|
<UL>
|
||||||
|
<LI><A HREF="cursor.html">Cursor Movements</A>
|
||||||
|
<LI><A HREF="edit.html">Edit Commands</A>
|
||||||
|
<LI><A HREF="yank.html">Yank and Put Commands</A>
|
||||||
|
<LI><A HREF="set.html">Set Options</A>
|
||||||
|
<LI><A HREF="colon.html">Colon (ex) Commands</A>
|
||||||
|
</UL>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Thu Jun 01 12:00:00 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
101
html/qt_bit.html
Normal file
101
html/qt_bit.html
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Bit-wise Operations</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
<a class="ths" href="qt_edit.html">Editing Files</a><br>
|
||||||
|
<a class="ths" href="qt_search.html">Search Commands</a><br>
|
||||||
|
<font color="#ffffff" class="ths">Bit-wise Operations<br></font>
|
||||||
|
<a class="ths" href="qt_find.html">Find and Replace</a><br>
|
||||||
|
<a class="ths" href="qt_yank.html">Yank and Put</a><br>
|
||||||
|
<a class="ths" href="qt_set.html">Settings</a><br>
|
||||||
|
<a class="ths" href="qt_partial.html">Partial File Read</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Quick Tutorial</font>
|
||||||
|
<br><font class="sub">Bit-wise Operations</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
To perform logical operations, bvi has a set of bit-level commands.
|
||||||
|
The following commands are available:
|
||||||
|
<CENTER><TABLE>
|
||||||
|
<TR><TD><B>:rl </B><I>n</I></TD><TD>rotate left</TD><TD ROWSPAN=4>
|
||||||
|
<I>n</I> is a number from 1 through 7</TD></TR>
|
||||||
|
<TR><TD><B>:rr </B><I>n</I></TD><TD>rotate right</TD></TR>
|
||||||
|
<TR><TD><B>:sr </B><I>n</I></TD><TD>shift right</TD></TR>
|
||||||
|
<TR><TD><B>:sl </B><I>n</I></TD><TD>shift left</TD></TR>
|
||||||
|
<TR><TD><B>:and </B><I>i</I></TD><TD>and operation</TD><TD ROWSPAN=4>
|
||||||
|
<I>i</I> is a number from 0 through 255</TD></TR>
|
||||||
|
<TR><TD><B>:or </B><I>i</I></TD><TD>or operation</TD></TR>
|
||||||
|
<TR><TD><B>:xor </B><I>i</I></TD><TD>or operation</TD></TR>
|
||||||
|
<TR><TD><B>:not </B></TD><TD>negates operation</TD></TR>
|
||||||
|
<TR><TD><B>:neg </B></TD><TD>negates operation</TD></TR>
|
||||||
|
</TABLE></CENTER>
|
||||||
|
<P>
|
||||||
|
The <I>i</I> value can be entered as a decimal number (0 - 255),
|
||||||
|
a hexadecimal number with a leading zero (0 - 0ff) or a binary number,
|
||||||
|
either with a leading B (B101) or exactly eight digits long (00000101).
|
||||||
|
<P>
|
||||||
|
On default the whole file is affected, but you can use the usual
|
||||||
|
colon command address forms. In contrast to vi the addresses designate
|
||||||
|
not line numbers but byte numbers. These addresses can be enterd in
|
||||||
|
decimal or hexadecimal notation.<BR>
|
||||||
|
Examples:
|
||||||
|
<BLOCKQUOTE CLASS="examp">
|
||||||
|
<B><TT>:100,500and 01A </TT><FONT COLOR=#AAAAAA>RETURN</FONT></B><BR>
|
||||||
|
<B><TT>:03FA,01000or 00001000 </TT><FONT COLOR=#AAAAAA>RETURN</FONT></B><BR>
|
||||||
|
<B><TT>:.rr 3 </TT><FONT COLOR=#AAAAAA>RETURN</FONT></B><BR>
|
||||||
|
<B><TT>:'a,$sl 1 </TT><FONT COLOR=#AAAAAA>RETURN</FONT></B><BR>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Thu Jun 01 12:00:00 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
130
html/qt_edit.html
Normal file
130
html/qt_edit.html
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Editing Files</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
<font color="#ffffff" class="ths">Editing Files<br></font>
|
||||||
|
<a class="ths" href="qt_search.html">Search Commands</a><br>
|
||||||
|
<a class="ths" href="qt_bit.html">Bit-wise Operations</a><br>
|
||||||
|
<a class="ths" href="qt_find.html">Find and Replace</a><br>
|
||||||
|
<a class="ths" href="qt_yank.html">Yank and Put</a><br>
|
||||||
|
<a class="ths" href="qt_set.html">Settings</a><br>
|
||||||
|
<a class="ths" href="qt_partial.html">Partial File Read</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Quick tutorial</font>
|
||||||
|
<br><font class="sub">Editing Files</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Inserting or deleting bytes can be dangerous on some kind of files,
|
||||||
|
because binary files are mostly executables, database files or maybe
|
||||||
|
graphic files. So you must not shift the remaining bytes to another
|
||||||
|
address.
|
||||||
|
Therefor commands for inserting or deleting bytes are disabled by
|
||||||
|
default.
|
||||||
|
You can use the <B>r</B> command to change a single byte, or
|
||||||
|
the <B>R</B> command to replace multiple characters. You can use a
|
||||||
|
numeric prefix for both commands.
|
||||||
|
<P>
|
||||||
|
You can add characters at the end of the file using the <B>A</B> command.
|
||||||
|
If you start with an empty file, you can create a binary file from
|
||||||
|
scratch. If the cursor is in the ASCII section of the screen and you
|
||||||
|
type <B><TT>100Ax</TT><FONT COLOR=#AAAAAA>ESC</FONT></B>, you create a file
|
||||||
|
which contents 100 x'es.
|
||||||
|
<P>
|
||||||
|
The <B>D</B> command can be used to truncate a file at a certain position.
|
||||||
|
Since there are no lines in a binary file, the <B>D</B> command deletes
|
||||||
|
to end of file.
|
||||||
|
<P>
|
||||||
|
If you have to edit a binary file where it does not matter to move bytes
|
||||||
|
to a different address, you can enable the insert and delete commands by
|
||||||
|
typing <B>:set memmove</B>.
|
||||||
|
Now you are able to use the <B>i</B> command for inserting bytes, the
|
||||||
|
<B>x</B> or <B>X</B> command to delete the byte over or before the cursor
|
||||||
|
and those types of <B>d</B> commands, which does not rely on text lines
|
||||||
|
(e.g. <B>d<FONT COLOR=#AAAAAA>SPACE</FONT></B>, <B>df<TT>C</TT>, d/<TT>xyz</TT>,
|
||||||
|
d$, d'a, d<TT>n</TT>G</B>).
|
||||||
|
|
||||||
|
<P>
|
||||||
|
All edits can be undone by pressing the <B>u</B> key.
|
||||||
|
<H4>Using ex (colon) commands</H4>
|
||||||
|
The edit commands of the <B>ex</B> editor are usually not available in
|
||||||
|
standard <B>vi</B> implementations (<TT>:i[nsert], :a[ppend]</TT>
|
||||||
|
and <TT>:c[hange]</TT>). In <B><FONT COLOR=#FF0000>bvi</B></FONT>
|
||||||
|
they <I>are</I> available with extended options. There are five
|
||||||
|
modifiers <TT>a[scii], b[inary], d[ecimal], h[exadecimal]</TT> and
|
||||||
|
<TT>o[ctal]</TT> (ascii is default). Therefor you can insert, append
|
||||||
|
or change data in all five representations.
|
||||||
|
<P>
|
||||||
|
<B>Example:</B><BR>
|
||||||
|
you would like to append a file with data available in decimal
|
||||||
|
representation:
|
||||||
|
<BLOCKQUOTE><PRE CLASS=examp>
|
||||||
|
:a d
|
||||||
|
0 12 3 128 255 17 0 0 255 255
|
||||||
|
23 24 25 128 6 6 6
|
||||||
|
.
|
||||||
|
</PRE></BLOCKQUOTE>
|
||||||
|
A line with only a period (.) in it will terminate the command.
|
||||||
|
<BR>
|
||||||
|
You must not type values greater than a byte value (255 decimal, FF hex).
|
||||||
|
This causes an abandon of the command.<BR>
|
||||||
|
Pressing the <FONT COLOR=#888888>RETURN</FONT> key does <I>not</I> insert
|
||||||
|
a newline - character into the file. If you use <B>:i a</B> (insert
|
||||||
|
ascii) you can use the special characters \n, \r, \t and \0.
|
||||||
|
<P>
|
||||||
|
An additional advantage is, that all typed bytes are inserted into the
|
||||||
|
file at once. If you insert characters in vi - mode, for every byte typed,
|
||||||
|
the whole remaining file has to be moved one position backwards.
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Thu Jun 01 12:00:00 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
113
html/qt_edit.tmp.html
Normal file
113
html/qt_edit.tmp.html
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
<HTML><HEAD>
|
||||||
|
<TITLE>BVI Editing Files</TITLE>
|
||||||
|
<LINK REL=STYLESHEET TYPE="text/css" HREF="bvi.css">
|
||||||
|
</HEAD><BODY BGCOLOR=#ffffff BACKGROUND="gif/bg2.gif">
|
||||||
|
<A NAME="top"></A>
|
||||||
|
|
||||||
|
<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=0>
|
||||||
|
<TR><TD WIDTH=1% VALIGN=TOP ALIGN=CENTER><IMG SRC="gif/dot.gif" WIDTH=130 HEIGHT=1>
|
||||||
|
|
||||||
|
<HR NOSHADE WIDTH=60%>
|
||||||
|
<P>
|
||||||
|
<A CLASS="thl" HREF="index.html">Home</A>
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
<A CLASS="thl" HREF="quick.html">Quick Tutorial</A>
|
||||||
|
<FONT COLOR=#FFFFFF CLASS="ths">Editing Files<BR></FONT>
|
||||||
|
<A CLASS="ths" HREF="qt_search.html">Search Commands</A>
|
||||||
|
<A CLASS="ths" HREF="qt_bit.html">Bit-wise Operations</A>
|
||||||
|
<A CLASS="ths" HREF="qt_find.html">Find and Replace</A>
|
||||||
|
<A CLASS="ths" HREF="qt_yank.html">Yank and Put</A>
|
||||||
|
<A CLASS="ths" HREF="qt_set.html">Settings</A>
|
||||||
|
</P>
|
||||||
|
<P>
|
||||||
|
<A CLASS="thl" HREF="download.html">Download</A>
|
||||||
|
</P>
|
||||||
|
<HR NOSHADE WIDTH=60%>
|
||||||
|
|
||||||
|
</TD>
|
||||||
|
<TD WIDTH=1%><IMG SRC="gif/dot.gif" WIDTH=40 HEIGHT=1></TD>
|
||||||
|
<TD WIDTH=99%>
|
||||||
|
|
||||||
|
<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=0 BORDER=0>
|
||||||
|
<TR><TD WIDTH=99%>
|
||||||
|
<FONT CLASS=head>Quick Tutorial</FONT><BR>
|
||||||
|
<FONT CLASS=sub>Editing Files</FONT>
|
||||||
|
</TD><TD ALIGN=RIGHT VALIGN=BOTTOM WIDTH=116 ROWSPAN=2>
|
||||||
|
<IMG SRC="gif/bvi_s.gif" ALT="BVI" WIDTH="116" HEIGHT="62">
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD VALIGN=BOTTOM>
|
||||||
|
<HR NOSHADE>
|
||||||
|
</TD></TR></TABLE>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
Inserting or deleting bytes can be dangerous on some kind of files,
|
||||||
|
because binary files are mostly executables, database files or maybe
|
||||||
|
graphic files. So you must not shift the remaining bytes to another
|
||||||
|
address.
|
||||||
|
Therefor commands for inserting or deleting bytes are disabled by
|
||||||
|
default.
|
||||||
|
You can use the <B>r</B> command to change a single byte, or
|
||||||
|
the <B>R</B> command to replace multiple characters. You can use a
|
||||||
|
numeric prefix for both commands.
|
||||||
|
<P>
|
||||||
|
You can add characters at the end of the file using the <B>A</B> command.
|
||||||
|
If you start with an empty file, you can create a binary file from
|
||||||
|
scratch. If the cursor is in the ASCII section of the screen and you
|
||||||
|
type <B><TT>100Ax</TT><FONT COLOR=#AAAAAA>ESC</FONT></B>, you create a file
|
||||||
|
which contents 100 x'es.
|
||||||
|
<P>
|
||||||
|
The <B>D</B> command can be used to truncate a file at a certain position.
|
||||||
|
Since there are no lines in a binary file, the <B>D</B> command deletes
|
||||||
|
to end of file.
|
||||||
|
<P>
|
||||||
|
If you have to edit a binary file where it does not matter to move bytes
|
||||||
|
to a different address, you can enable the insert and delete commands by
|
||||||
|
typing <B>:set memmove</B>.
|
||||||
|
Now you are able to use the <B>i</B> command for inserting bytes, the
|
||||||
|
<B>x</B> or <B>X</B> command to delete the byte over or before the cursor
|
||||||
|
and those types of <B>d</B> commands, which does not rely on text lines
|
||||||
|
(e.g. <B>d<FONT COLOR=#AAAAAA>SPACE</FONT></B>, <B>df<TT>C</TT>, d/<TT>xyz</TT>,
|
||||||
|
d$, d'a, d<TT>n</TT>G</B>).
|
||||||
|
|
||||||
|
<P>
|
||||||
|
All edits can be undone by pressing the <B>u</B> key.
|
||||||
|
<H4>Using ex (colon) commands</H4>
|
||||||
|
The edit commands of the <B>ex</B> editor are usually not available in
|
||||||
|
standard <B>vi</B> implementations (<TT>:i[nsert], :a[ppend]</TT>
|
||||||
|
and <TT>:c[hange]</TT>). In <B><FONT COLOR=#FF0000>bvi</B></FONT>
|
||||||
|
they <I>are</I> available with extended options. There are five
|
||||||
|
modifiers <TT>a[scii], b[inary], d[ecimal], h[exadecimal]</TT> and
|
||||||
|
<TT>o[ctal]</TT> (ascii is default). Therefor you can insert, append
|
||||||
|
or change data in all five representations.
|
||||||
|
<P>
|
||||||
|
<B>Example:</B><BR>
|
||||||
|
you would like to append a file with data available in decimal
|
||||||
|
representation:
|
||||||
|
<BLOCKQUOTE><PRE>
|
||||||
|
:a d
|
||||||
|
0 12 3 128 255 17 0 0 255 255
|
||||||
|
23 24 25 128 6 6 6
|
||||||
|
.
|
||||||
|
</PRE></BLOCKQUOTE>
|
||||||
|
A line with only a period (.) in it will terminate the command.
|
||||||
|
<BR>
|
||||||
|
You must not type values greater than a byte value (255 decimal, FF hex).
|
||||||
|
This causes an abandon of the command.<BR>
|
||||||
|
Pressing the <FONT COLOR=#888888>RETURN</FONT> key does <I>not</I> insert
|
||||||
|
a newline - character into the file. If you use <B>:i a</B> (insert
|
||||||
|
ascii) you can use the special characters \n, \r, \t and \0.
|
||||||
|
<P>
|
||||||
|
An additional advantage is, that all typed bytes are inserted into the
|
||||||
|
file at once. If you insert characters in vi - mode, for every byte typed,
|
||||||
|
the whole remaining file has to be moved one position backwards.
|
||||||
|
<P>
|
||||||
|
<FONT SIZE=-1>
|
||||||
|
<A CLASS="btop" HREF="#top"><IMG BORDER=0 WIDTH=16 HEIGHT=7 SRC="gif/up.gif"
|
||||||
|
ALT="Back to the top">Back to the top</A>
|
||||||
|
</FONT>
|
||||||
|
<HR NOSHADE>
|
||||||
|
<I>Last update: 17 - 06 - 2000 by Gerhard Bürgmann</I>
|
||||||
|
</TD></TR></TABLE>
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
98
html/qt_find.html
Normal file
98
html/qt_find.html
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Find and Replace</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
<a class="ths" href="qt_edit.html">Editing Files</a><br>
|
||||||
|
<a class="ths" href="qt_search.html">Search Commands</a><br>
|
||||||
|
<a class="ths" href="qt_bit.html">Bit-wise Operations</a><br>
|
||||||
|
<font color="#ffffff" class="ths">Find and Replace<br></font>
|
||||||
|
<a class="ths" href="qt_yank.html">Yank and Put</a><br>
|
||||||
|
<a class="ths" href="qt_set.html">Settings</a><br>
|
||||||
|
<a class="ths" href="qt_partial.html">Partial File Read</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Quick Tutorial</font>
|
||||||
|
<br><font class="sub">Find and Replace</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The <B><TT CLASS="examp">:s</TT></B> (substitute) command behaves a little bit
|
||||||
|
different to that of vi. If you type a command like this in vi <NOBR>
|
||||||
|
<B><TT CLASS="examp">:s/XXXX/UU/</TT></B></NOBR> then the four XXXX's are
|
||||||
|
replaced by
|
||||||
|
two UU's. This means, the file size decreases and all characters after
|
||||||
|
the replacement are moved to another position in the file. Since bvi
|
||||||
|
does not move characters, only two XX's are replaced by two UU's and
|
||||||
|
the third and fourth X still remains in the file.<BR>
|
||||||
|
Another example:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<B><TT CLASS="examp">:0,500s/Taste\0/Key\0/</TT><FONT COLOR=#AAAAAA>RETURN</FONT></B><BR>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
<P>
|
||||||
|
This command replaces within the first 500 bytes of a file the 0 -
|
||||||
|
terminated ASCII string "<TT CLASS="examp">Taste</TT>"
|
||||||
|
with the 0 - terminated
|
||||||
|
string "<TT CLASS="examp">Key</TT>". After the substitution
|
||||||
|
you will find a
|
||||||
|
character sequence "<TT CLASS="examp">Key\0e\0</TT>" in the file.<BR>
|
||||||
|
CAUTION: If the replace
|
||||||
|
string is longer than the find string, additional bytes are overwritten!
|
||||||
|
<BR>
|
||||||
|
This behaviour will not be changed by setting the
|
||||||
|
<TT CLASS="examp">:set memmove</TT> option!
|
||||||
|
<P>
|
||||||
|
Of course you can do also binary substitutions, similar to the search
|
||||||
|
command. The ability of remembering patterns like <B><TT CLASS="examp">\(pattern\)</TT></B>
|
||||||
|
is currently not implemented.
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Fri Jun 30 22:33:20 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
144
html/qt_partial.html
Normal file
144
html/qt_partial.html
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Partial File Read</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
<a class="ths" href="qt_edit.html">Editing Files</a><br>
|
||||||
|
<a class="ths" href="qt_search.html">Search Commands</a><br>
|
||||||
|
<a class="ths" href="qt_bit.html">Bit-wise Operations</a><br>
|
||||||
|
<a class="ths" href="qt_find.html">Find and Replace</a><br>
|
||||||
|
<a class="ths" href="qt_yank.html">Yank and Put</a><br>
|
||||||
|
<a class="ths" href="qt_set.html">Settings</a><br>
|
||||||
|
<font color="#ffffff" class="ths">Partial File Read<br></font>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Quick Tutorial</font>
|
||||||
|
<br><font class="sub">Partial File Read</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
A new feature of version 1.3.0 is the Partial File Read.
|
||||||
|
If you want to edit a file, you have not to read the file into
|
||||||
|
memory but only the part you want to edit. You can write back this part
|
||||||
|
into the file after editing.
|
||||||
|
<BR>
|
||||||
|
Example:
|
||||||
|
<BR>
|
||||||
|
You have to change only some bytes of the header of a graphic file
|
||||||
|
(e.g. a color). Graphic files can be very large. With the <TT>-s</TT>
|
||||||
|
option you can load only the first kilobyte of the file:
|
||||||
|
<PRE>
|
||||||
|
bvi -s 1000 large.gif
|
||||||
|
</PRE>
|
||||||
|
In this case of course you cannot insert or delete bytes of the file.
|
||||||
|
The editor is set to the <I>no memmove</I> mode. You can write back
|
||||||
|
only as much bytes as you read before. If you add or delete bytes
|
||||||
|
even though, the extra bytes will be ignored or garbage will be
|
||||||
|
written to the file.
|
||||||
|
<P>
|
||||||
|
It is also possible to start not at the begin of the file, but at a
|
||||||
|
certain address. To do this you have to use the option <TT>-b</TT>.
|
||||||
|
You can read the file from this starting point until the end of the file
|
||||||
|
or you can use the <TT>-s</TT> option to specify a size or the
|
||||||
|
<TT>-e</TT> option to specify an end address.
|
||||||
|
<P>
|
||||||
|
If you read the file not from the start an offset will be set to
|
||||||
|
display the correct address at the left side of the screen. If you change this
|
||||||
|
offset with the <TT>:set offset=<I>nnnn</I></TT> command, this has
|
||||||
|
<B>no</B> effect to the write back operation. The edited part of the
|
||||||
|
file will always be written back at the same position, where it was read.
|
||||||
|
<P>
|
||||||
|
In the Linux <TT>/proc</TT> directory there are files which are listed
|
||||||
|
with length 0 in a directory listing. But in reality they have a content.
|
||||||
|
You can read this files, if you use the <TT>-s</TT> option and guess a
|
||||||
|
size. This size should be a little bit larger than the size you expect.
|
||||||
|
<P>
|
||||||
|
The same guidlines can be used, if you load a block device, e.g. a
|
||||||
|
floppy disk.
|
||||||
|
<PRE>
|
||||||
|
bvi -s 1450k /dev/fd0
|
||||||
|
</PRE>
|
||||||
|
After reading the device, you get a message with the value of the
|
||||||
|
real read bytes at the bottom of the screen:
|
||||||
|
<PRE>
|
||||||
|
"/dev/fd0" range 0-1474559
|
||||||
|
</PRE>
|
||||||
|
Note that the <I>size</I> value will be used to allocate memory before
|
||||||
|
reading the file. Therefore do not choose a too large size.<BR>
|
||||||
|
Note further, that <I>1450k</I> in the example above is calculated as
|
||||||
|
<I>1450 * 1024</I> bytes. This gives <I>1484800</I> bytes allocated size.
|
||||||
|
If <STRONG>bvi</STRONG> reads the exact number of bytes you have asked for
|
||||||
|
in the <TT>-s</TT> option, the file may be larger.
|
||||||
|
<P>
|
||||||
|
<B>WARNING:</B>
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
Do not use <STRONG>bvi</STRONG> at mounted disk devices!<BR>
|
||||||
|
Do not edit disk devices, if you don't know exactly what you change!<BR>
|
||||||
|
You may make your disk unreadable by editing it!!
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
<H3>Interaction with <STRONG>bmore</STRONG></H3>
|
||||||
|
You may use <STRONG>bmore</STRONG> to browse through large files or
|
||||||
|
devices. You may use the ASCII - or Hex - search possibilities to
|
||||||
|
locate a certain section of the file.<BR>
|
||||||
|
If you see the desired part of the file on your screen, press <I><B>w</B></I> to
|
||||||
|
read the contents of the file displayed currently on your screen into
|
||||||
|
<STRONG>bvi</STRONG>. You can use a decimal prefix at the <I><B>w</B></I> -
|
||||||
|
command to read more or less bytes than displayed into <STRONG>bvi</STRONG>.
|
||||||
|
<BR>
|
||||||
|
The letter <I><B>w</B></I> is the next letter after <I><B>v</B></I>, which
|
||||||
|
is used in more and bmore to read the whole file into vi or bvi!
|
||||||
|
<P>
|
||||||
|
If you used the <TT>ZZ</TT> or <TT>:w</TT> command, this part of the file will be
|
||||||
|
written back into the original file.
|
||||||
|
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Sun Jul 09 21:57:38 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
115
html/qt_search.html
Normal file
115
html/qt_search.html
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Search Commands</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
<a class="ths" href="qt_edit.html">Editing Files</a><br>
|
||||||
|
<font color="#ffffff" class="ths">Search Commands<br></font>
|
||||||
|
<a class="ths" href="qt_bit.html">Bit-wise Operations</a><br>
|
||||||
|
<a class="ths" href="qt_find.html">Find and Replace</a><br>
|
||||||
|
<a class="ths" href="qt_yank.html">Yank and Put</a><br>
|
||||||
|
<a class="ths" href="qt_set.html">Settings</a><br>
|
||||||
|
<a class="ths" href="qt_partial.html">Partial File Read</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Quick Tutorial</font>
|
||||||
|
<br><font class="sub">Search Commands</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Additional to the well known <B>/</B> and <B>?</B> for searching ASCII
|
||||||
|
strings there are two new commands for searching binary strings. These
|
||||||
|
are the keys <B>\</B> and <B>#</B>.
|
||||||
|
<P>
|
||||||
|
In the ASCII search commands <B>/</B> and <B>?</B> you can use \n, \r,
|
||||||
|
\t and \0. You can also use regular expressions. Do <I>not</I> use
|
||||||
|
<B>^</B> and <B>$</B>, because there are no lines in a binary file.
|
||||||
|
Type <B><TT>/foo\0</TT><FONT COLOR=#AAAAAA>RETURN</FONT></B> to
|
||||||
|
search for the null terminated string <I>foo</I> in the file.
|
||||||
|
<P>
|
||||||
|
In the Hex section you can search for a sequence of bytes in hexadecimal
|
||||||
|
notation, e.g. <NOBR><B><TT>\01 AF 12</TT><FONT COLOR=#AAAAAA>RETURN</FONT></B>,
|
||||||
|
</NOBR> which is the same as <NOBR><B><TT>\01AF12</TT><FONT COLOR=#AAAAAA>
|
||||||
|
RETURN</FONT></B></NOBR>.
|
||||||
|
You can also use regular expressions and quoted ASCII strings. Inside of
|
||||||
|
the quotes no character is treated as a special character!<BR>
|
||||||
|
Example:
|
||||||
|
<B><TT>\01 [^AF DE] "foo" 00 </TT><FONT COLOR=#AAAAAA>RETURN</FONT></B>
|
||||||
|
<BR>
|
||||||
|
This means: Search for a string beginning with 01, the second character
|
||||||
|
must not be a hex <TT>AF</TT> or <TT>DE</TT>, followed by the ASCII
|
||||||
|
characters <TT>foo</TT>, terminated with a binary zero.
|
||||||
|
|
||||||
|
<H3>Global Search</H3>
|
||||||
|
There is also a global search option available, but only with the
|
||||||
|
print option.<BR>
|
||||||
|
Example:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<B><TT>:g/text_pattern/p</TT><FONT COLOR=#AAAAAA>RETURN</FONT></B>
|
||||||
|
<BR>or<BR>
|
||||||
|
<B><TT>:g\hex_pattern\p</TT><FONT COLOR=#AAAAAA>RETURN</FONT></B>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
This commands are displaying all found patterns, one per screen line.
|
||||||
|
Of course you can limit the search to a certain part of the file by
|
||||||
|
specifying the starting and ending address.<BR>
|
||||||
|
Other forms of the global search command
|
||||||
|
are line oriented, therefor <B>not</B> useful for binary files and
|
||||||
|
<B>not implemented</B>, e.g.<BR>
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<TABLE>
|
||||||
|
<TR><TD>:g/pattern/d</TD><TD>Delete all lines containing <I>pattern</I></TD></TR>
|
||||||
|
<TR><TD>:g/pattern/y</TD><TD>Yank all lines containing <I>pattern</I></TD></TR>
|
||||||
|
<TR><TD>:g!/pattern/p</TD><TD>Print all lines <B>not</B> containing <I>pattern</I></TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Thu Jun 01 12:00:00 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
126
html/qt_set.html
Normal file
126
html/qt_set.html
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Settings</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
<a class="ths" href="qt_edit.html">Editing Files</a><br>
|
||||||
|
<a class="ths" href="qt_search.html">Search Commands</a><br>
|
||||||
|
<a class="ths" href="qt_bit.html">Bit-wise Operations</a><br>
|
||||||
|
<a class="ths" href="qt_find.html">Find and Replace</a><br>
|
||||||
|
<a class="ths" href="qt_yank.html">Yank and Put</a><br>
|
||||||
|
<font color="#ffffff" class="ths">Settings<br></font>
|
||||||
|
<a class="ths" href="qt_partial.html">Partial File Read</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Quick Tutorial</font>
|
||||||
|
<br><font class="sub">Settings</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
To customize bvi some additional <B>:set</B> options are
|
||||||
|
available. You can add them to your <B><TT CLASS="examp">.bvirc</TT></B>
|
||||||
|
file, if you need them all the time.
|
||||||
|
|
||||||
|
<H4>columns</H4>
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
You can set the number of columns on the screen to an arbitrary value.
|
||||||
|
This might be useful if you edit a file with a fixed record length.<BR>
|
||||||
|
Default value is the max. number of columns, divisible by four.<BR>
|
||||||
|
Example: <B><TT>:set columns=13<FONT COLOR=#AAAAAA>RETURN</FONT></TT></B><BR>
|
||||||
|
Abbreviation: <B><TT>:set cm=9<FONT COLOR=#AAAAAA>RETURN</FONT></TT></B>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
|
<H4>memmove</H4>
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
This option enables the commands for inserting and deleting bytes.
|
||||||
|
<BR>
|
||||||
|
Default: <B><TT>:set nomemmove<FONT COLOR=#AAAAAA>RETURN</FONT></TT></B><BR>
|
||||||
|
Abbreviation: <B><TT>:set mm<FONT COLOR=#AAAAAA>RETURN</FONT></TT></B>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
|
<H4>offset</H4>
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
You can change the beginning of the displayed byte numbering to a
|
||||||
|
certain number. The default address of the first byte is 0. You can
|
||||||
|
change it to 1 or to any other number by typing:<BR>
|
||||||
|
<B><TT>:set offset=1</TT><FONT COLOR=#AAAAAA>RETURN</FONT></B><BR>
|
||||||
|
You can also use a hexadecimal address, if you type a leading zero:<BR>
|
||||||
|
<B><TT>:set of=01FF</TT><FONT COLOR=#AAAAAA>RETURN</FONT></B><BR>
|
||||||
|
The only commands which are not affected by these numbering is
|
||||||
|
<TT><B>:f</B></TT> or <TT><B><FONT COLOR=#AAAAAA>CTRL</FONT>
|
||||||
|
-G</B></TT>. These commands always
|
||||||
|
designates the first byte in file as 1.
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
|
<H4>unixstyle</H4>
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
The rightmost character in the status line displays the ASCII value of
|
||||||
|
the current byte. For values below 32 you can use the notation used on
|
||||||
|
the ascii(7) man page (like NUL, SOH, STX etc.) if you do a<BR>
|
||||||
|
<B><TT>:set unixstyle<FONT COLOR=#AAAAAA>RETURN</FONT></TT></B> or a<BR>
|
||||||
|
<B><TT>:set us<FONT COLOR=#AAAAAA>RETURN</FONT></TT></B>. If you do a<BR>
|
||||||
|
<B><TT>:set nous<FONT COLOR=#AAAAAA>RETURN</FONT></TT></B> you get a
|
||||||
|
DOS style representation (^A, ^B, ^C etc.).
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
|
<H4>wordlength</H4>
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
This setting is used to define the minimum length of a "word".
|
||||||
|
A "word" is a sequence of ASCII characters within a binary
|
||||||
|
file. The commands <B>w, b, e, W, B</B> and <B>E</B> are affected by
|
||||||
|
this setting.
|
||||||
|
<P>
|
||||||
|
Default: <B><TT>:set wordlength=4<FONT COLOR=#AAAAAA>RETURN</FONT></TT></B><BR>
|
||||||
|
Abbreviation: <B><TT>:set wl=4<FONT COLOR=#AAAAAA>RETURN</FONT></TT></B>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Thu Jun 01 12:00:00 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
132
html/qt_yank.html
Normal file
132
html/qt_yank.html
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Yank and Put</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
<a class="ths" href="qt_edit.html">Editing Files</a><br>
|
||||||
|
<a class="ths" href="qt_search.html">Search Commands</a><br>
|
||||||
|
<a class="ths" href="qt_bit.html">Bit-wise Operations</a><br>
|
||||||
|
<a class="ths" href="qt_find.html">Find and Replace</a><br>
|
||||||
|
<font color="#ffffff" class="ths">Yank and Put<br></font>
|
||||||
|
<a class="ths" href="qt_set.html">Settings</a><br>
|
||||||
|
<a class="ths" href="qt_partial.html">Partial File Read</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Quick Tutorial</font>
|
||||||
|
<br><font class="sub">Yank and Put</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Starting with version 1.2.0 there is a new syntax for the yank and put
|
||||||
|
commands! Yank is now more similare to vi.
|
||||||
|
<P>
|
||||||
|
<TABLE>
|
||||||
|
<TR><TD><B>y<FONT COLOR=#888888>SPACE</FONT></B></TD>
|
||||||
|
<TD>yanks byte under cursor</TD></TR>
|
||||||
|
<TR><TD><B><FONT COLOR=#FF0000>n</FONT>y<FONT COLOR=#888888>SPACE</FONT></B>
|
||||||
|
</TD>
|
||||||
|
<TD>yanks <FONT COLOR=#FF0000>n</FONT> bytes, beginning at cursor
|
||||||
|
position</TD></TR>
|
||||||
|
<TR><TD><B>yf<FONT COLOR=#FF0000>C</FONT></B></TD>
|
||||||
|
<TD>yanks from current position to next
|
||||||
|
character <FONT COLOR=#FF0000>C</FONT></TD></TR>
|
||||||
|
<TR><TD><B>y/<FONT COLOR=#FF0000>xyz</FONT></B></TD>
|
||||||
|
<TD>yanks from current position to first matching
|
||||||
|
pattern <FONT COLOR=#FF0000>xyz</FONT></TD></TR>
|
||||||
|
<TR><TD><B>y$</B></TD><TD>yanks from current position to EOF</TD></TR>
|
||||||
|
<TR><TD><B>y'<FONT COLOR=#FF0000>a</FONT></B></TD>
|
||||||
|
<TD>yanks from current position to mark <FONT COLOR=#FF0000>a</FONT></TD></TR>
|
||||||
|
<TR><TD><B>y<FONT COLOR=#FF0000>n</FONT>G</B></TD>
|
||||||
|
<TD>yanks from current position to byte with (decimal)
|
||||||
|
address <FONT COLOR=#FF0000>n</FONT></TD></TR>
|
||||||
|
<TR><TD><B><TT>o</B></TT></TD>
|
||||||
|
<TD>overwrites the bytes after the cursor with the contents of the yank
|
||||||
|
or delete buffer</TD></TR>
|
||||||
|
<TR><TD><B><TT>p</B></TT></TD><TD>puts the contents of the yank or delete
|
||||||
|
buffer after the cursor</TD></TR>
|
||||||
|
<TR><TD><B><TT>P</B></TT></TD><TD>appends the contents of the buffer to end
|
||||||
|
of file</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
|
||||||
|
<H3>Using ex (colon) Commands</H3>
|
||||||
|
<B>:y</B>(ank)
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<I>yank</I> can be used with one or two addresses specified. One address
|
||||||
|
with no <I>count</I> specified copies the specified byte into the buffer.
|
||||||
|
Two addresses with no <I>count</I> specified copies multiple bytes
|
||||||
|
starting and ending with the specified bytes. Two addresses and a <I>count</I>
|
||||||
|
value copies <I>count</I> bytes starting at the second specified address (the
|
||||||
|
first address is ignored). If no address is specified, the current address
|
||||||
|
ist used by <I>yank</I>.<BR>
|
||||||
|
Examples:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
:<I>start_addr,end_addr</I> y <FONT COLOR=#888888>RETURN</FONT><BR>
|
||||||
|
:<I>start_addr</I> y <I>byte_count</I><FONT COLOR=#888888>RETURN</FONT><BR>
|
||||||
|
:y <I>byte_count</I><FONT COLOR=#888888>RETURN</FONT><BR>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
<P>
|
||||||
|
<B>:pu</B>(t)
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
Restores previously deleted or yanked bytes after the address specified
|
||||||
|
in the <I>put</I> command.
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
<P>
|
||||||
|
<B>:o</B>(verwrite)
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
Overwrites bytes after the specified address with previously deleted or yanked
|
||||||
|
bytes.
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
<P>
|
||||||
|
NOTE: There are currently no namend buffers available.
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Thu Jun 01 12:00:00 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
199
html/quick.html
Normal file
199
html/quick.html
Normal file
|
@ -0,0 +1,199 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Quick Tutorial</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<font color="#ffffff" class="thl">Quick Tutorial<br></font>
|
||||||
|
<a class="ths" href="qt_edit.html">Editing Files</a><br>
|
||||||
|
<a class="ths" href="qt_search.html">Search Commands</a><br>
|
||||||
|
<a class="ths" href="qt_bit.html">Bit-wise Operations</a><br>
|
||||||
|
<a class="ths" href="qt_find.html">Find and Replace</a><br>
|
||||||
|
<a class="ths" href="qt_yank.html">Yank and Put</a><br>
|
||||||
|
<a class="ths" href="qt_set.html">Settings</a><br>
|
||||||
|
<a class="ths" href="qt_partial.html">Partial File Read</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Quick Tutorial</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
This tutorial will explain all commands which behaves different to
|
||||||
|
vi. Note that, if you are on a Linux system, you will probably
|
||||||
|
have an 'improved' version of vi. Bvi is more similar to the standard
|
||||||
|
version.
|
||||||
|
|
||||||
|
<H3>The Screen</H3>
|
||||||
|
<CENTER>
|
||||||
|
<TABLE WIDTH=10 CELLSPACING=0 CELLPADDING=0 BORDER=0>
|
||||||
|
<TR><TD BGCOLOR=#ffccff><PRE CLASS="examp">
|
||||||
|
000000
|
||||||
|
00000C
|
||||||
|
000018
|
||||||
|
000024
|
||||||
|
000030
|
||||||
|
00003C
|
||||||
|
000048
|
||||||
|
000054
|
||||||
|
000060
|
||||||
|
00006C
|
||||||
|
000078
|
||||||
|
000084
|
||||||
|
000090
|
||||||
|
00009C</PRE></TD><TD BGCOLOR=#ccffcc><PRE CLASS="examp">
|
||||||
|
7F <tt class="inv">4</tt>5 4C 46 01 01
|
||||||
|
00 00 00 00 01 00
|
||||||
|
00 00 00 00 00 00
|
||||||
|
00 00 00 00 34 00
|
||||||
|
0C 00 09 00 00 00
|
||||||
|
00 00 00 00 55 89
|
||||||
|
53 C7 45 A4 00 00
|
||||||
|
00 00 00 83 7D 08
|
||||||
|
8C 02 00 00 E9 6F
|
||||||
|
00 00 00 00 6A 03
|
||||||
|
45 08 50 E8 FC FF
|
||||||
|
0C 85 D2 75 17 6A
|
||||||
|
E9 43 02 00 00 8D
|
||||||
|
0C 85 D2 75 0D C7</PRE></TD><TD BGCOLOR=#ccffcc><PRE CLASS="examp">
|
||||||
|
01 00 00 00 00 00
|
||||||
|
03 00 01 00 00 00
|
||||||
|
00 00 0C 07 00 00
|
||||||
|
00 00 00 00 28 00
|
||||||
|
00 00 00 00 00 00
|
||||||
|
E5 83 EC 68 57 56
|
||||||
|
00 00 C7 45 A0 01
|
||||||
|
00 75 13 6A 00 E8
|
||||||
|
02 00 00 8D B4 26
|
||||||
|
68 90 00 00 00 8B
|
||||||
|
FF FF 89 C2 83 C4
|
||||||
|
01 E8 60 02 00 00
|
||||||
|
74 26 00 8D BC 27
|
||||||
|
45 A0 00 00 00 00</PRE></TD><TD BGCOLOR=#FFCCCC><PRE CLASS="examp">
|
||||||
|
.ELF........
|
||||||
|
............
|
||||||
|
............
|
||||||
|
....4.....(.
|
||||||
|
............
|
||||||
|
....U....hWV
|
||||||
|
S.E......E..
|
||||||
|
....}..u.j..
|
||||||
|
.....o.....&
|
||||||
|
....j.h.....
|
||||||
|
E.P.........
|
||||||
|
...u.j..`...
|
||||||
|
.C....t&...'
|
||||||
|
...u..E.....</PRE></TD></TR>
|
||||||
|
<TR BGCOLOR=#FFFFCC><TD COLSPAN=2 CLASS="examp">"set.o" 3500 bytes</TD>
|
||||||
|
<TD COLSPAN=2 ALIGN=RIGHT CLASS="examp"><B>000001 \105 0x45 69 'E'</B></TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</CENTER>
|
||||||
|
<P>
|
||||||
|
The screen is divided into four areas, symbolized by four different
|
||||||
|
colors. The magenta area contents the addresses in hexadecimal
|
||||||
|
notation. The green area contents the values of the edited file in
|
||||||
|
hexadecimal notation. The red area contents the same bytes in ASCII
|
||||||
|
representation. The yellow status line displays on the left side the
|
||||||
|
current status messages and on the right site the current position
|
||||||
|
of the cursor and the value of the byte on this address in octal,
|
||||||
|
hexadecimal, decimal and ASCII notation.
|
||||||
|
<BR>
|
||||||
|
You can toggle between the Hex and ASCII value of the same byte by
|
||||||
|
pressing the <FONT COLOR=#AAAAAA><B>TAB</B></FONT> key both in command
|
||||||
|
and input mode.
|
||||||
|
|
||||||
|
<H3>Command Line Options</H3>
|
||||||
|
There are some additional command line options in <B>bvi</B>:<BR>
|
||||||
|
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<B><TT>-f <I>script</I></TT></B>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
This command provides a means for collecting a series of <I>ex</I>
|
||||||
|
(colon) commands into a script file, then using this file to edit
|
||||||
|
other files. Since there is no binary stream editor <I>bsed</I>, you
|
||||||
|
can use this option to make several global changes in a binary file.
|
||||||
|
You can do this of course with the <i>source</I> command (<B>:so file</B>)
|
||||||
|
from within bvi too.
|
||||||
|
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<B><TT>-b <I>begin</I></TT></B>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
This option causes bvi to load a file not from start but from address
|
||||||
|
<I>begin</I>.
|
||||||
|
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<B><TT>-e <I>end</I></TT></B>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
This option causes bvi to load a file not till end but till address
|
||||||
|
<I>end</I>.
|
||||||
|
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<B><TT>-s <I>size</I></TT></B>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
This option causes bvi not to load the complete file but only <I>size</I>
|
||||||
|
bytes. This option can also be used to read a file reported with a
|
||||||
|
length 0 like some files in the Linux <TT CLASS="examp">/proc</TT>
|
||||||
|
directory.
|
||||||
|
<P>
|
||||||
|
<I>begin, end</I> or <I>size</I> can be an integer value (decimal or
|
||||||
|
hexadecimal) or an integer value with an appended <B>k</B> (for
|
||||||
|
multiply by 1024) or <B>m</B> (for multiply by 1.048.576).
|
||||||
|
<P>
|
||||||
|
You should use at most two of the three address options to avoid ambiguity!
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Not Implemented Commands</H3>
|
||||||
|
<P>
|
||||||
|
<UL>
|
||||||
|
<LI><B><TT>:map</TT></B> and <B><TT>:unmap</TT></B> (Macros)
|
||||||
|
<LI><B><TT>:abbreviate</TT></B> (<B><TT>:ab</TT></B>) and <B><TT>:una</TT></B>
|
||||||
|
<LI>no named buffers.
|
||||||
|
</UL>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Thu Oct 19 20:58:31 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
6
html/rpm.html
Normal file
6
html/rpm.html
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<HTML><HEAD>
|
||||||
|
<TITLE>Source RPM</TITLE>
|
||||||
|
<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://sites.inka.de/~mips/unix/index.html">
|
||||||
|
</HEAD><BODY BGCOLOR=#ffffff>
|
||||||
|
Switching to <A HREF="http://sites.inka.de/mips/unix/index.html">http://sites.inka.de/mips/unix/index.html</A> . . .
|
||||||
|
</BODY></HTML>
|
116
html/set.html
Normal file
116
html/set.html
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
<HTML><HEAD>
|
||||||
|
<TITLE>BVI: Set Commands</TITLE>
|
||||||
|
<LINK REL=STYLESHEET TYPE="text/css" HREF="bvi.css">
|
||||||
|
</HEAD><BODY BGCOLOR="#ffffff">
|
||||||
|
<A NAME="top"></A>
|
||||||
|
|
||||||
|
<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=0 BORDER=0>
|
||||||
|
<TR><TD WIDTH=99%>
|
||||||
|
<A CLASS=head HREF="overview.html">Command Overview</A>
|
||||||
|
<BR><FONT CLASS=sub>Set Commands</FONT>
|
||||||
|
</TD><TD ALIGN=RIGHT VALIGN=BOTTOM WIDTH=116 ROWSPAN=2>
|
||||||
|
<A HREF="index.html">
|
||||||
|
<IMG SRC="gif/bvi_s.gif" ALT="BVI" WIDTH="116" HEIGHT="62" BORDER=0></A>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD VALIGN=BOTTOM>
|
||||||
|
<HR NOSHADE>
|
||||||
|
</TD></TR></TABLE>
|
||||||
|
<P>
|
||||||
|
|
||||||
|
<CENTER>
|
||||||
|
[ <A CLASS="thl" HREF="cursor.html">Cursor Movements</A>
|
||||||
|
| <A CLASS="thl" HREF="edit.html">Edit Cmds</A>
|
||||||
|
| <A CLASS="thl" HREF="yank.html">Yank and Put Cmds</A>
|
||||||
|
| Set Options
|
||||||
|
| <A CLASS="thl" HREF="colon.html">Colon (ex) Cmds</A>
|
||||||
|
]
|
||||||
|
</CENTER>
|
||||||
|
<P>
|
||||||
|
<TABLE WIDTH=100%>
|
||||||
|
<TR BGCOLOR=#CCCCCC><TH WIDTH=20%>Command</TH><TH WIDTH=40%>BVI</TH><TH WIDTH=40%>VI</TH></TR>
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER>Search<BR>settings</TD><TD BGCOLOR=#CCFFCC COLSPAN=2>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD><B>:set wrapscan</B> or <B>:set ws</B><BR>
|
||||||
|
<B>:set nows</B></TD>
|
||||||
|
<TD>When this option is set, pattern searches resulting from a <B>/,
|
||||||
|
?, n, N</B> (<B>#, \</B>) command automatically wrap around to the opposit end of the file
|
||||||
|
and continue whenever the beginning or end of a file is reached.</TD></TR>
|
||||||
|
<TR><TD><B>:set ignorecase</B> or <B>:set ic</B><BR>
|
||||||
|
<B>:set noic</B></TD>
|
||||||
|
<TD>Uppercase and lowercase characters in text are treated identically
|
||||||
|
in regular expression matching</TD></TR>
|
||||||
|
<TR><TD><B>:set magic</B><BR>
|
||||||
|
<B>:set nomagic</B></TD>
|
||||||
|
<TD>Enables metacharacters for use in regular expressions</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER>Display<BR>options</TD><TD BGCOLOR=#CCFFCC COLSPAN=2>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD><B>:set showmode</B><BR>
|
||||||
|
<B>:set noshowmode</B></TD>
|
||||||
|
<TD>Displays a status message in the lowest line on the screen</TD></TR>
|
||||||
|
<TR><TD><B>:set terse</B><BR>
|
||||||
|
<B>:set noterse</B></TD>
|
||||||
|
<TD>The terse option lets you obtain shorter error diagnostics.</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER>File<BR>options</TD><TD BGCOLOR=#CCFFCC COLSPAN=2>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD><B>:set readonly</B> or <B> :set ro</B><BR>
|
||||||
|
<B>:set noro</B></TD>
|
||||||
|
<TD>This option sets the read-only flag for the file being editeds,
|
||||||
|
thus preventing accidental overwriting at the end of the session.</TD></TR>
|
||||||
|
<TR><TD><B>:set autowrite</B> or <B>:set aw</B><BR>
|
||||||
|
<B>:set noaw</B></TD>
|
||||||
|
<TD>Causes the contents of the buffer to be written to the current file
|
||||||
|
if you have modified them and given a <B>:next, :rewind</B> or <B>!</B>
|
||||||
|
command.</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER>bvi<BR>options</TD>
|
||||||
|
<TD BGCOLOR=#FFFFFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD><B>:set columns=13<BR>:set cm=5</B></TD>
|
||||||
|
<TD>You can set the number of bytes displayed in on screenline.
|
||||||
|
Default is max. number divisible by four.</TD></TR>
|
||||||
|
<TR><TD><B>:set memmove<BR>:set nomm</B></TD>
|
||||||
|
<TD>If memmove is set, you can use commands to insert or delete bytes.
|
||||||
|
This can be dangerous for e.g. executable programs.
|
||||||
|
Default is nomemmove.</TD></TR>
|
||||||
|
<TR><TD><B>:set offset=1<BR>:set of=5</B></TD>
|
||||||
|
<TD>An offset is added to all addresses and byte counts. Default
|
||||||
|
address of the first byte is 0.</TD></TR>
|
||||||
|
<TR><TD><B>:set wordlength=5<BR>:set wl=8</B></TD>
|
||||||
|
<TD>Length of an ASCII-string found by <B>w, W, b</B> or <B>B</B></TD></TR>
|
||||||
|
<TR><TD><B>:set unixstyle<BR>:set nous</B></TD>
|
||||||
|
<TD>displays ASCII characters below 32 in the status line in
|
||||||
|
Unix-style instead of DOS-style</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#FFCCCC>
|
||||||
|
Not available.
|
||||||
|
</TD></TR>
|
||||||
|
</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
<CENTER>
|
||||||
|
[ <A CLASS="thl" HREF="cursor.html">Cursor Movements</A>
|
||||||
|
| <A CLASS="thl" HREF="edit.html">Edit Cmds</A>
|
||||||
|
| <A CLASS="thl" HREF="yank.html">Yank and Put Cmds</A>
|
||||||
|
| Set Options
|
||||||
|
| <A CLASS="thl" HREF="colon.html">Colon (ex) Cmds</A>
|
||||||
|
]
|
||||||
|
</CENTER>
|
||||||
|
<P>
|
||||||
|
<FONT SIZE=-1>
|
||||||
|
<A CLASS="btop" HREF="#top"><IMG BORDER=0 WIDTH=16 HEIGHT=7 SRC="gif/up.gif"
|
||||||
|
ALT="Back to the top">Back to the top</A>
|
||||||
|
</FONT>
|
||||||
|
<HR NOSHADE>
|
||||||
|
<I>Last update: October 30<SUP>th</SUP> 1999 by Gerhard Bürgmann</I>
|
||||||
|
|
||||||
|
|
||||||
|
</BODY></HTML>
|
153
html/sitemap.html
Normal file
153
html/sitemap.html
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 3.2 Final//EN">
|
||||||
|
<html><head>
|
||||||
|
<title>BVI: Sitemap</title>
|
||||||
|
<link rel=stylesheet type="text/css" href="bvi.css">
|
||||||
|
</head><body bgcolor="#ffffff" background="gif/bg2.gif">
|
||||||
|
<a name="top"></a>
|
||||||
|
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tr><td width="1%" valign="top" align="center">
|
||||||
|
<img src="gif/dot.gif" width="130" height="1">
|
||||||
|
|
||||||
|
<hr noshade width="60%">
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</p>
|
||||||
|
<hr noshade width="60%">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="1%"><img src="gif/dot.gif" width="40" height="1"></td>
|
||||||
|
<td width="99%">
|
||||||
|
|
||||||
|
<table width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||||
|
<tr><td width="99%">
|
||||||
|
<font class="head">Sitemap</font>
|
||||||
|
</td>
|
||||||
|
<td align="right" valign="bottom" width="116" rowspan="2">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="gif/bvi_s.gif" alt="BVI" width="116"
|
||||||
|
height="62" border="0"></a>
|
||||||
|
</td></tr>
|
||||||
|
<tr><td valign="bottom">
|
||||||
|
<hr noshade>
|
||||||
|
</td></tr></table>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="index.html">Home</a><br>
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
</ul>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="quick.html">Quick Tutorial</a><br>
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="qt_edit.html">Editing Files</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="qt_search.html">Search Commands</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="qt_bit.html">Bit-wise Operations</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="qt_find.html">Find and Replace</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="qt_yank.html">Yank and Put</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="qt_set.html">Settings</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="qt_partial.html">Partial File Read</a><br>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="download.html">Download</a><br>
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="new130.html">New in 1.3.0</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="new120.html">New in 1.2.0</a><br>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="install.html">Installation</a><br>
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
</ul>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="overview.html">Command Overview</a><br>
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="cursor.html">Cursor Movement</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="edit.html">Edit Cmds</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="yank.html">Yank and Put Cmds</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="set.html">Set Options</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="colon.html">Colon (ex) Cmds</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="man_bvi.html">man - Page</a><br>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="bmore.html">bmore</a><br>
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="bmore_cmd.html">Commands</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="bmore_opt.html">Options</a><br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="man_bmore.html">man - Page</a><br>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<li>
|
||||||
|
<a class="thl" href="german.html">Deutsche Beschreibung</a><br>
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
</ul>
|
||||||
|
</ul><p>
|
||||||
|
<p><font size="-1">
|
||||||
|
<a class="btop" href="#top">
|
||||||
|
<img border="0" width="16" height="7" src="gif/up.gif"
|
||||||
|
alt="Back to the top">Back to the top</a>
|
||||||
|
</font>
|
||||||
|
<hr noshade>
|
||||||
|
<i>Last update: Thu Oct 12 20:42:01 CEST 2000 by Gerhard Bürgmann</i>
|
||||||
|
</td></tr></table>
|
||||||
|
</body></html>
|
141
html/yank.html
Normal file
141
html/yank.html
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
<HTML><HEAD>
|
||||||
|
<TITLE>BVI: Yank and Put Commands</TITLE>
|
||||||
|
<LINK REL=STYLESHEET TYPE="text/css" HREF="bvi.css">
|
||||||
|
</HEAD><BODY BGCOLOR="#ffffff">
|
||||||
|
<A NAME="top"></A>
|
||||||
|
|
||||||
|
<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=0 BORDER=0>
|
||||||
|
<TR><TD WIDTH=99%>
|
||||||
|
<A CLASS=head HREF="overview.html">Command Overview</A>
|
||||||
|
<BR><FONT CLASS=sub>Yank and Put Commands</FONT>
|
||||||
|
</TD><TD ALIGN=RIGHT VALIGN=BOTTOM WIDTH=116 ROWSPAN=2>
|
||||||
|
<A HREF="index.html">
|
||||||
|
<IMG SRC="gif/bvi_s.gif" ALT="BVI" WIDTH="116" HEIGHT="62" BORDER=0></A>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD VALIGN=BOTTOM>
|
||||||
|
<HR NOSHADE>
|
||||||
|
</TD></TR></TABLE>
|
||||||
|
<P>
|
||||||
|
|
||||||
|
<CENTER>
|
||||||
|
[ <A CLASS="thl" HREF="cursor.html">Cursor Movements</A>
|
||||||
|
| <A CLASS="thl" HREF="edit.html">Edit Cmds</A>
|
||||||
|
| Yank and Put Cmds
|
||||||
|
| <A CLASS="thl" HREF="set.html">Set Options</A>
|
||||||
|
| <A CLASS="thl" HREF="colon.html">Colon (ex) Cmds</A>
|
||||||
|
]
|
||||||
|
</CENTER>
|
||||||
|
<P>
|
||||||
|
NOTE: the <B>o</B> command (<I>overwriting put</I>) is the only command in
|
||||||
|
bvi that uses a key for a complete different purpose than in vi.
|
||||||
|
<P>
|
||||||
|
<TABLE WIDTH=100%>
|
||||||
|
<TR BGCOLOR=#CCCCCC><TH WIDTH=20%>Command</TH><TH WIDTH=40%>BVI</TH><TH WIDTH=40%>VI</TH></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER ROWSPAN=3>Put<BR>bytes</TD>
|
||||||
|
<TD COLSPAN=2 BGCOLOR=#CCFFCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> p </TH>
|
||||||
|
<TD>put the contents of the yank or delete buffer after cursor position</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> P </TH><TD>append the contents of the yank or delete buffer at EOF</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> P </TH><TD>put the contents of the yank or delete buffer
|
||||||
|
before cursor position</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD BGCOLOR=#FFFFFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> o </TH><TD>overwrite the following bytes with the contents
|
||||||
|
of the yank or delete buffer</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#FFCCCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD ROWSPAN=2>not available</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#CCCCCC ALIGN=CENTER ROWSPAN=4>Yank<BR>bytes</TD>
|
||||||
|
<TD COLSPAN=2 BGCOLOR=#CCFFCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH>y<FONT COLOR=#888888>SPACE</FONT></TH><TD>yank byte at cursor position</TD></TR>
|
||||||
|
<TR><TH>yf<FONT COLOR=#FF0000>C</FONT></TH>
|
||||||
|
<TD>yank from current position to next character <FONT COLOR=#FF0000>C</FONT></TD></TR>
|
||||||
|
<TR><TH>y/<FONT COLOR=#FF0000>xyz</FONT></TH>
|
||||||
|
<TD>yank from current position to matching pattern <FONT COLOR=#FF0000>xyz</FONT>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TH>y?<FONT COLOR=#FF0000>xyz</FONT></TH>
|
||||||
|
<TD>yank from current position to matching pattern <FONT COLOR=#FF0000>xyz</FONT> in reverse direction
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TH>y'<FONT COLOR=#FF0000>a</FONT></TH><TD>yank from current position to mark <FONT COLOR=#FF0000>a</FONT></TD></TR>
|
||||||
|
<TR><TH>y<FONT COLOR=#FF0000>n</FONT>G</TH><TD>yank from current position to byte with (decimal) address <FONT COLOR=#FF0000>n</FONT></TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
|
||||||
|
<TR><TD BGCOLOR=#FFCCCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD ROWSPAN=2>not available</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#FFFFFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH>yy </TH><TD>yank line</TD></TR>
|
||||||
|
<TR><TH>y)</TH><TD>yank from cursor position through first
|
||||||
|
following end of sentence</TD></TR>
|
||||||
|
<TR><TH>y}</TH><TD>yank from cursor position through first
|
||||||
|
following end of paragraph</TD></TR>
|
||||||
|
<TR><TH>y]</TH><TD>yank from cursor position through first
|
||||||
|
following end of section</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD BGCOLOR=#FFFFFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH>y\<FONT COLOR=#FF0000>6a 56 ff</FONT> </TH>
|
||||||
|
<TD>yank from cursor position to first occurance of hex pattern
|
||||||
|
<FONT COLOR=#FF0000>6a 56 ff</FONT></TD></TR>
|
||||||
|
<TR><TH>y#<FONT COLOR=#FF0000>6a 56 ff</FONT> </TH>
|
||||||
|
<TD>yank from cursor position to first occurance of hex pattern
|
||||||
|
<FONT COLOR=#FF0000>6a 56 ff</FONT> in reverse direction</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#FFCCCC>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TD ROWSPAN=2>not available</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> y$ </TH><TD>yank from current position to EOF</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD><TD BGCOLOR=#CCCCFF>
|
||||||
|
<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0>
|
||||||
|
<TR><TH> y$ </TH><TD>yank from current position to end of line</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
<P>
|
||||||
|
Note that most of the commands can be used with a decimal repeat count in front
|
||||||
|
of the command!
|
||||||
|
|
||||||
|
<P>
|
||||||
|
<CENTER>
|
||||||
|
[ <A CLASS="thl" HREF="cursor.html">Cursor Movements</A>
|
||||||
|
| <A CLASS="thl" HREF="edit.html">Edit Cmds</A>
|
||||||
|
| Yank and Put Cmds
|
||||||
|
| <A CLASS="thl" HREF="set.html">Set Options</A>
|
||||||
|
| <A CLASS="thl" HREF="colon.html">Colon (ex) Cmds</A>
|
||||||
|
]
|
||||||
|
</CENTER>
|
||||||
|
<P>
|
||||||
|
<FONT SIZE=-1>
|
||||||
|
<A CLASS="btop" HREF="#top"><IMG BORDER=0 WIDTH=16 HEIGHT=7 SRC="gif/up.gif"
|
||||||
|
ALT="Back to the top">Back to the top</A>
|
||||||
|
</FONT>
|
||||||
|
<HR NOSHADE>
|
||||||
|
<I>Last update: October 30<SUP>th</SUP> 1999 by Gerhard Bürgmann</I>
|
||||||
|
|
||||||
|
|
||||||
|
</BODY></HTML>
|
238
install-sh
Executable file
238
install-sh
Executable file
|
@ -0,0 +1,238 @@
|
||||||
|
#! /bin/sh
|
||||||
|
#
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
# This comes from X11R5.
|
||||||
|
#
|
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
|
# `make' implicit rules from creating a file called install from it
|
||||||
|
# when there is no Makefile.
|
||||||
|
#
|
||||||
|
# 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
|
411
io.c
Normal file
411
io.c
Normal file
|
@ -0,0 +1,411 @@
|
||||||
|
/* IO.C - file in/out and alloc subroutines for BVI
|
||||||
|
*
|
||||||
|
* 1996-02-28 V 1.0.0
|
||||||
|
* 1999-01-20 V 1.1.0
|
||||||
|
* 1999-04-27 V 1.1.1
|
||||||
|
* 1999-07-02 V 1.2.0 beta
|
||||||
|
* 1999-10-15 V 1.2.0 final
|
||||||
|
* 2000-03-23 V 1.3.0 beta
|
||||||
|
* 2000-08-17 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bvi.h"
|
||||||
|
#include "set.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#ifndef SIZE_T_MAX
|
||||||
|
# define SIZE_T_MAX ULONG_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_FCNTL_H
|
||||||
|
# include <fcntl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int filemode;
|
||||||
|
static struct stat buf;
|
||||||
|
static off_t block_read;
|
||||||
|
char *terminal;
|
||||||
|
|
||||||
|
|
||||||
|
/*********** Save the patched file ********************/
|
||||||
|
int
|
||||||
|
save(fname, start, end, flags)
|
||||||
|
char *fname;
|
||||||
|
char *start;
|
||||||
|
char *end;
|
||||||
|
int flags;
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
char string[255];
|
||||||
|
char *newstr;
|
||||||
|
off_t filesize;
|
||||||
|
|
||||||
|
if (!fname) {
|
||||||
|
emsg("No file|No current filename");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (stat(fname, &buf) == -1) {
|
||||||
|
newstr = "[New file] ";
|
||||||
|
} else {
|
||||||
|
if (S_ISDIR(buf.st_mode)) {
|
||||||
|
sprintf(string, "\"%s\" Is a directory", fname);
|
||||||
|
msg(string);
|
||||||
|
return 0;
|
||||||
|
} else if (S_ISCHR(buf.st_mode)) {
|
||||||
|
sprintf(string, "\"%s\" Character special file", fname);
|
||||||
|
msg(string);
|
||||||
|
return 0;
|
||||||
|
} else if (S_ISBLK(buf.st_mode)) {
|
||||||
|
/*
|
||||||
|
sprintf(string, "\"%s\" Block special file", fname);
|
||||||
|
msg(string);
|
||||||
|
return 0;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
newstr = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filemode == PARTIAL) flags = O_RDWR;
|
||||||
|
if ((fd = open(fname, flags, 0666)) < 0) {
|
||||||
|
sysemsg(fname);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (filemode == PARTIAL) {
|
||||||
|
if (block_read) {
|
||||||
|
filesize = block_read;
|
||||||
|
sprintf(string, "\"%s\" range %lu-%lu", fname,
|
||||||
|
(unsigned long)block_begin,
|
||||||
|
(unsigned long)(block_begin - 1 + filesize));
|
||||||
|
if (lseek(fd, block_begin, SEEK_SET) < 0) {
|
||||||
|
sysemsg(fname);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
msg("Null range");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
filesize = end - start + 1L;
|
||||||
|
sprintf(string, "\"%s\" %s%lu bytes", fname, newstr,
|
||||||
|
(unsigned long)filesize);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (write(fd, start, filesize) != filesize) {
|
||||||
|
sysemsg(fname);
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
edits = 0;
|
||||||
|
msg(string);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* loads a file, returns the filesize */
|
||||||
|
off_t
|
||||||
|
load(fname)
|
||||||
|
char *fname;
|
||||||
|
{
|
||||||
|
int fd = -1;
|
||||||
|
char string[MAXCMD];
|
||||||
|
|
||||||
|
buf.st_size = 0L;
|
||||||
|
if (fname != NULL) {
|
||||||
|
sprintf(string, "\"%s\"", fname);
|
||||||
|
msg(string);
|
||||||
|
refresh();
|
||||||
|
if (stat(fname, &buf) == -1) {
|
||||||
|
filemode = NEW;
|
||||||
|
} else if (S_ISDIR(buf.st_mode)) {
|
||||||
|
filemode = DIRECTORY;
|
||||||
|
} else if (S_ISCHR(buf.st_mode)) {
|
||||||
|
filemode = CHARACTER_SPECIAL;
|
||||||
|
} else if (S_ISBLK(buf.st_mode)) {
|
||||||
|
filemode = BLOCK_SPECIAL;
|
||||||
|
if (!block_flag) {
|
||||||
|
block_flag = 1;
|
||||||
|
block_begin = 0;
|
||||||
|
block_size = 1024;
|
||||||
|
block_end = block_begin + block_size - 1;
|
||||||
|
}
|
||||||
|
if ((fd = open(fname, O_RDONLY)) > 0) {
|
||||||
|
P(P_RO) = TRUE;
|
||||||
|
params[P_RO].flags |= P_CHANGED;
|
||||||
|
} else {
|
||||||
|
sysemsg(fname);
|
||||||
|
filemode = ERROR;
|
||||||
|
}
|
||||||
|
} else if (S_ISREG(buf.st_mode)) {
|
||||||
|
if ((unsigned long)buf.st_size > (unsigned long)SIZE_T_MAX) {
|
||||||
|
move(maxy, 0);
|
||||||
|
endwin();
|
||||||
|
printf("File too large\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if ((fd = open(fname, O_RDONLY)) > 0) {
|
||||||
|
filemode = REGULAR;
|
||||||
|
if (access(fname, W_OK)) {
|
||||||
|
P(P_RO) = TRUE;
|
||||||
|
params[P_RO].flags |= P_CHANGED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sysemsg(fname);
|
||||||
|
filemode = ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
filemode = NEW;
|
||||||
|
}
|
||||||
|
if (mem != NULL) free(mem);
|
||||||
|
memsize = 1024;
|
||||||
|
if (block_flag) {
|
||||||
|
memsize += block_size;
|
||||||
|
} else if (filemode == REGULAR) {
|
||||||
|
memsize += buf.st_size;
|
||||||
|
}
|
||||||
|
if ((mem = (char *)malloc(memsize)) == NULL) {
|
||||||
|
move(maxy, 0);
|
||||||
|
endwin();
|
||||||
|
printf("Out of memory\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
clear_marks();
|
||||||
|
|
||||||
|
|
||||||
|
if (block_flag && ((filemode == REGULAR) || (filemode == BLOCK_SPECIAL))) {
|
||||||
|
if (lseek(fd, block_begin, SEEK_SET) < 0) {
|
||||||
|
sysemsg(fname);
|
||||||
|
filemode = ERROR;
|
||||||
|
} else {
|
||||||
|
if ((filesize = read(fd, mem, block_size)) == 0) {
|
||||||
|
sprintf(string, "\"%s\" Empty file", fname);
|
||||||
|
filemode = ERROR;
|
||||||
|
} else {
|
||||||
|
sprintf(string, "\"%s\" range %lu-%lu", fname,
|
||||||
|
(unsigned long)block_begin,
|
||||||
|
(unsigned long)(block_begin + filesize - 1));
|
||||||
|
filemode = PARTIAL;
|
||||||
|
block_read = filesize;
|
||||||
|
P(P_OF) = block_begin;
|
||||||
|
params[P_OF].flags |= P_CHANGED;
|
||||||
|
}
|
||||||
|
msg(string);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
} else if (filemode == REGULAR) {
|
||||||
|
filesize = buf.st_size;
|
||||||
|
if (read(fd, mem, filesize) != filesize) {
|
||||||
|
sysemsg(fname);
|
||||||
|
filemode = ERROR;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
filesize = 0L;
|
||||||
|
}
|
||||||
|
if (fd > 0) close(fd);
|
||||||
|
if (fname != NULL) {
|
||||||
|
switch (filemode) {
|
||||||
|
case NEW:
|
||||||
|
sprintf(string, "\"%s\" [New File]", fname);
|
||||||
|
break;
|
||||||
|
case REGULAR:
|
||||||
|
sprintf(string, "\"%s\" %s%lu bytes", fname,
|
||||||
|
P(P_RO) ? "[Read only] " : "",
|
||||||
|
(unsigned long)filesize);
|
||||||
|
break;
|
||||||
|
case DIRECTORY:
|
||||||
|
sprintf(string, "\"%s\" Directory", fname);
|
||||||
|
break;
|
||||||
|
case CHARACTER_SPECIAL:
|
||||||
|
sprintf(string, "\"%s\" Character special file", fname);
|
||||||
|
break;
|
||||||
|
case BLOCK_SPECIAL:
|
||||||
|
sprintf(string, "\"%s\" Block special file", fname);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (filemode != ERROR) msg(string);
|
||||||
|
}
|
||||||
|
pagepos = mem;
|
||||||
|
maxpos = mem + filesize;
|
||||||
|
loc = HEX;
|
||||||
|
x = AnzAdd; y = 0;
|
||||||
|
repaint();
|
||||||
|
return(filesize);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* argument "dir" not used!
|
||||||
|
* Needed for DOS version only
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
bvi_init(dir)
|
||||||
|
char *dir;
|
||||||
|
{
|
||||||
|
char *initstr;
|
||||||
|
char rcpath[MAXCMD];
|
||||||
|
|
||||||
|
terminal = getenv("TERM");
|
||||||
|
shell = getenv("SHELL");
|
||||||
|
if (shell == NULL || *shell == '\0')
|
||||||
|
shell = "/bin/sh";
|
||||||
|
|
||||||
|
if ((initstr = getenv("BVIINIT")) != NULL) {
|
||||||
|
docmdline(initstr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(rcpath, getenv("HOME"), MAXCMD - 8);
|
||||||
|
rcpath[MAXCMD - 8] = '\0';
|
||||||
|
strcat(rcpath, "/.bvirc");
|
||||||
|
if (stat(rcpath, &buf) == 0) {
|
||||||
|
if (buf.st_uid == getuid()) read_rc(rcpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(rcpath, ".bvirc");
|
||||||
|
if (stat(rcpath, &buf) == 0) {
|
||||||
|
if (buf.st_uid == getuid()) read_rc(rcpath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
enlarge(add)
|
||||||
|
off_t add;
|
||||||
|
{
|
||||||
|
char *newmem;
|
||||||
|
off_t savecur, savepag, savemax, saveundo;
|
||||||
|
|
||||||
|
savecur = curpos - mem;
|
||||||
|
savepag = pagepos - mem;
|
||||||
|
savemax = maxpos - mem;
|
||||||
|
saveundo = undo_start - mem;
|
||||||
|
|
||||||
|
if (mem == NULL) {
|
||||||
|
newmem = malloc(memsize + add);
|
||||||
|
} else {
|
||||||
|
newmem = realloc(mem, memsize + add);
|
||||||
|
}
|
||||||
|
if (newmem == NULL) {
|
||||||
|
emsg("Out of memory");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mem = newmem;
|
||||||
|
memsize += add;
|
||||||
|
curpos = mem + savecur;
|
||||||
|
pagepos = mem + savepag;
|
||||||
|
maxpos = mem + savemax;
|
||||||
|
undo_start = mem + saveundo;
|
||||||
|
current = curpos + 1L;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
do_shell()
|
||||||
|
{
|
||||||
|
addch('\n');
|
||||||
|
savetty();
|
||||||
|
system(shell);
|
||||||
|
resetty();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef HAVE_STRDUP
|
||||||
|
char *
|
||||||
|
strdup(s)
|
||||||
|
char *s;
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
size_t n;
|
||||||
|
|
||||||
|
n = strlen(s) + 1;
|
||||||
|
if ((p = (char *)malloc(n)) != NULL)
|
||||||
|
memcpy(p, s, n);
|
||||||
|
return (p);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef HAVE_MEMMOVE
|
||||||
|
/*
|
||||||
|
* Copy contents of memory (with possible overlapping).
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
memmove(s1, s2, n)
|
||||||
|
char *s1;
|
||||||
|
char *s2;
|
||||||
|
size_t n;
|
||||||
|
{
|
||||||
|
bcopy(s2, s1, n);
|
||||||
|
return(s1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
off_t
|
||||||
|
alloc_buf(n, buffer)
|
||||||
|
off_t n;
|
||||||
|
char **buffer;
|
||||||
|
{
|
||||||
|
if (*buffer == NULL) {
|
||||||
|
*buffer = (char *)malloc(n);
|
||||||
|
} else {
|
||||||
|
*buffer = (char *)realloc(*buffer, n);
|
||||||
|
}
|
||||||
|
if (*buffer == NULL) {
|
||||||
|
emsg("No buffer space available");
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
addfile(fname)
|
||||||
|
char *fname;
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
off_t oldsize;
|
||||||
|
|
||||||
|
if (stat(fname, &buf)) {
|
||||||
|
sysemsg(fname);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if ((fd = open(fname, O_RDONLY)) == -1) {
|
||||||
|
sysemsg(fname);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
oldsize = filesize;
|
||||||
|
if (enlarge(buf.st_size)) return 1;
|
||||||
|
if (read(fd, mem + filesize, buf.st_size) == -1) {
|
||||||
|
sysemsg(fname);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
filesize += buf.st_size;
|
||||||
|
maxpos = mem + filesize;
|
||||||
|
close(fd);
|
||||||
|
setpage(mem + oldsize);
|
||||||
|
return 0;
|
||||||
|
}
|
38
mkinstalldirs
Executable file
38
mkinstalldirs
Executable file
|
@ -0,0 +1,38 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# mkinstalldirs --- make directory hierarchy
|
||||||
|
# Author: Noah Friedman <friedman@prep.ai.mit.edu>
|
||||||
|
# Created: 1993-05-16
|
||||||
|
# Public domain
|
||||||
|
|
||||||
|
# $Id: mkinstalldirs,v 1.12.2.1 1998/12/26 17:32:14 bje Exp $
|
||||||
|
|
||||||
|
errstatus=0
|
||||||
|
|
||||||
|
for file
|
||||||
|
do
|
||||||
|
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
|
||||||
|
shift
|
||||||
|
|
||||||
|
pathcomp=
|
||||||
|
for d
|
||||||
|
do
|
||||||
|
pathcomp="$pathcomp$d"
|
||||||
|
case "$pathcomp" in
|
||||||
|
-* ) pathcomp=./$pathcomp ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test ! -d "$pathcomp"; then
|
||||||
|
echo "mkdir $pathcomp"
|
||||||
|
|
||||||
|
mkdir "$pathcomp" || lasterr=$?
|
||||||
|
|
||||||
|
if test ! -d "$pathcomp"; then
|
||||||
|
errstatus=$lasterr
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
pathcomp="$pathcomp/"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
exit $errstatus
|
1
patchlevel.h
Normal file
1
patchlevel.h
Normal file
|
@ -0,0 +1 @@
|
||||||
|
#define VERSION "1.3.0"
|
640
re.c
Normal file
640
re.c
Normal file
|
@ -0,0 +1,640 @@
|
||||||
|
/* re - regular expression search for bvi
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* 1996-01-06 created;
|
||||||
|
* 1999-01-19 V 1.1.0
|
||||||
|
* 1999-03-17 V 1.1.1
|
||||||
|
* 1999-09-10 V 1.2.0
|
||||||
|
* 2000-04-25 V 1.3.0 beta
|
||||||
|
* 2000-09-29 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* You cannot use a common regexp subroutine, because \0 is a regular
|
||||||
|
* character in a binary string !
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bvi.h"
|
||||||
|
#include "set.h"
|
||||||
|
|
||||||
|
static int sbracket();
|
||||||
|
|
||||||
|
char act_pat[MAXCMD]; /* found pattern */
|
||||||
|
char pattern[MAXCMD + 1];
|
||||||
|
char search_pat[BUFFER]; /* / or ? command */
|
||||||
|
char *notfound = "Fail|Pattern not found";
|
||||||
|
char *noprev = "No previous expression";
|
||||||
|
char *emptyclass = "Bad character class|Empty byte class '[]' or '[^]' cannot match";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
bregexec(start, scan)
|
||||||
|
PTR start;
|
||||||
|
char *scan;
|
||||||
|
{
|
||||||
|
char *act;
|
||||||
|
int count, test;
|
||||||
|
|
||||||
|
act = act_pat;
|
||||||
|
while (*scan != 0) {
|
||||||
|
switch (*scan++) {
|
||||||
|
case ONE: /* exactly one character */
|
||||||
|
count = *scan++;
|
||||||
|
if (P(P_IC) && smode == ASCII) test = toupper(*start);
|
||||||
|
else test = *start;
|
||||||
|
if (count == 1) {
|
||||||
|
if (test != *scan) return 0;
|
||||||
|
scan++;
|
||||||
|
} else if (count > 1) {
|
||||||
|
if (sbracket(test, scan, count)) return 0;
|
||||||
|
scan += count;
|
||||||
|
}
|
||||||
|
*act++ = *start++;
|
||||||
|
break;
|
||||||
|
case STAR: /* zero or more characters */
|
||||||
|
count = *scan++;
|
||||||
|
if (P(P_IC) && smode == ASCII) test = toupper(*start);
|
||||||
|
else test = *start;
|
||||||
|
if (count == 1) { /* only one character, 0 - n times */
|
||||||
|
while(test == *scan) {
|
||||||
|
*act++ = *start++;
|
||||||
|
if (P(P_IC) && smode == ASCII) test = toupper(*start);
|
||||||
|
else test = *start;
|
||||||
|
}
|
||||||
|
scan++;
|
||||||
|
} else if (count > 1) { /* characters in bracket */
|
||||||
|
if (*scan == '^') {
|
||||||
|
while (start < maxpos) {
|
||||||
|
if (bregexec(start, scan + count)) {
|
||||||
|
*act = '\0';
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (sbracket(test, scan, count)) return 0;
|
||||||
|
*act++ = *start++;
|
||||||
|
if (P(P_IC) && smode == ASCII) test = toupper(*start);
|
||||||
|
else test = *start;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
while(!sbracket(test, scan, count)) {
|
||||||
|
*act++ = *start++;
|
||||||
|
if (P(P_IC) && smode == ASCII) test = toupper(*start);
|
||||||
|
else test = *start;
|
||||||
|
}
|
||||||
|
scan += count;
|
||||||
|
}
|
||||||
|
} else { /* ".*" */
|
||||||
|
while (start < maxpos) {
|
||||||
|
if (bregexec(start, scan)) { *act = '\0'; return 1; }
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*act = '\0';
|
||||||
|
return 1; /* found */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
sbracket(start, scan, count)
|
||||||
|
int start;
|
||||||
|
char *scan;
|
||||||
|
int count;
|
||||||
|
{
|
||||||
|
if (*scan++ == '^') {
|
||||||
|
if (!memchr(scan, start, --count)) return 0;
|
||||||
|
} else {
|
||||||
|
if (memchr(scan, start, --count)) return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PTR
|
||||||
|
end_word(start)
|
||||||
|
PTR start;
|
||||||
|
{
|
||||||
|
PTR pos;
|
||||||
|
|
||||||
|
pos = start;
|
||||||
|
if (!isprint(*pos & 0xff)) return start;
|
||||||
|
while (isprint(*pos & 0xff)) if (pos++ > maxpos) return start;
|
||||||
|
return --pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* wordsearch serves the 'W' and 'w' - command
|
||||||
|
*/
|
||||||
|
PTR
|
||||||
|
wordsearch(start, mode)
|
||||||
|
PTR start;
|
||||||
|
char mode;
|
||||||
|
{
|
||||||
|
PTR found;
|
||||||
|
PTR pos;
|
||||||
|
int ccount;
|
||||||
|
|
||||||
|
pos = start + 1;
|
||||||
|
do {
|
||||||
|
while (isprint(*pos & 0xff)) if (pos++ > maxpos) return start;
|
||||||
|
while (!isprint(*pos & 0xff)) if (pos++ > maxpos) return start;
|
||||||
|
found = pos;
|
||||||
|
ccount = 0;
|
||||||
|
while (isprint(*pos & 0xff)) {
|
||||||
|
if (pos++ > maxpos) return start;
|
||||||
|
ccount++; }
|
||||||
|
if (ccount < P(P_WL)) continue;
|
||||||
|
|
||||||
|
if (mode == 'W') {
|
||||||
|
if (*pos == '\0' || *pos == '\n') return found;
|
||||||
|
} else {
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
} while (pos < maxpos);
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* backsearch serves the 'b' and 'B' command
|
||||||
|
*/
|
||||||
|
PTR
|
||||||
|
backsearch(start, mode)
|
||||||
|
PTR start;
|
||||||
|
char mode;
|
||||||
|
{
|
||||||
|
PTR pos;
|
||||||
|
int ccount;
|
||||||
|
|
||||||
|
pos = start - 1;
|
||||||
|
do {
|
||||||
|
if (mode == 'B') {
|
||||||
|
while (*pos != '\0' && *pos != '\n') if (pos-- < mem) return start;
|
||||||
|
} else {
|
||||||
|
while (!isprint(*pos & 0xff)) if (pos-- < mem) return start;
|
||||||
|
}
|
||||||
|
pos--;
|
||||||
|
ccount = 0;
|
||||||
|
while (isprint(*pos & 0xff)) {
|
||||||
|
if (pos-- < mem) return start;
|
||||||
|
ccount++; }
|
||||||
|
if (ccount >= P(P_WL)) return (pos + 1);
|
||||||
|
|
||||||
|
} while (pos > mem);
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* used by :s
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
do_substitution(delim, line, startpos, endpos)
|
||||||
|
int delim;
|
||||||
|
char *line;
|
||||||
|
PTR startpos;
|
||||||
|
PTR endpos;
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
char *found;
|
||||||
|
char *cmd = NULL;
|
||||||
|
int repl_count = 0;
|
||||||
|
int global = 0;
|
||||||
|
int conf = 0;
|
||||||
|
static int direct;
|
||||||
|
static int pat_len = -1;
|
||||||
|
static int ch;
|
||||||
|
static char find_pat[BUFFER];
|
||||||
|
static char repl_pat[MAXCMD];
|
||||||
|
|
||||||
|
ignore_case = P(P_IC);
|
||||||
|
magic = P(P_MA);
|
||||||
|
switch (delim) {
|
||||||
|
case '/':
|
||||||
|
case '?':
|
||||||
|
ch = delim;
|
||||||
|
direct = (ch == '/' ? FORWARD : BACKWARD);
|
||||||
|
cmd = patcpy(pattern, line, ch);
|
||||||
|
if (pattern[0] == '\0') break;
|
||||||
|
if (ascii_comp(find_pat, pattern)) return 0;
|
||||||
|
cmd = patcpy(pattern, cmd, ch); /* Replace Pattern */
|
||||||
|
poi = pattern;
|
||||||
|
pat_len = 0;
|
||||||
|
while (*poi) {
|
||||||
|
if (*poi == '\\') {
|
||||||
|
switch (*(++poi)) {
|
||||||
|
case '0': repl_pat[pat_len++] = '\0'; break;
|
||||||
|
case 'n': repl_pat[pat_len++] = '\n'; break;
|
||||||
|
case 'r': repl_pat[pat_len++] = '\r'; break;
|
||||||
|
case 't': repl_pat[pat_len++] = '\t'; break;
|
||||||
|
case '\\': repl_pat[pat_len++] = '\\'; break;
|
||||||
|
default: sprintf(string,
|
||||||
|
"No such escape sequence \\%c", *poi);
|
||||||
|
emsg(string);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
repl_pat[pat_len++] = *poi;
|
||||||
|
}
|
||||||
|
poi++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '#':
|
||||||
|
case '\\':
|
||||||
|
ch = delim;
|
||||||
|
direct = (ch == '\\' ? FORWARD : BACKWARD);
|
||||||
|
cmd = patcpy(pattern, line, ch);
|
||||||
|
if (hex_comp(find_pat, pattern)) return 0;
|
||||||
|
cmd = patcpy(pattern, cmd, ch); /* Replace Pattern */
|
||||||
|
poi = pattern;
|
||||||
|
pat_len = 0;
|
||||||
|
while (*poi) {
|
||||||
|
if (*poi == ' ' || *poi == '\t') {
|
||||||
|
poi++;
|
||||||
|
} else {
|
||||||
|
if ((n = hexchar()) < 0) {
|
||||||
|
emsg("Badly formed replacement pattern");
|
||||||
|
return 0; }
|
||||||
|
repl_pat[pat_len] = n;
|
||||||
|
pat_len++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '\0':
|
||||||
|
case 'g':
|
||||||
|
case 'c':
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
emsg("Extra chars|Extra characters at end of command");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (pat_len == -1) {
|
||||||
|
emsg("No previous substitute re|No previous substitute to repeat");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (delim != '\0') {
|
||||||
|
if (strchr(cmd, 'g')) global = 1;
|
||||||
|
if (strchr(cmd, 'c')) conf = 1;
|
||||||
|
}
|
||||||
|
if ((strchr("\\#", ch) && loc == ASCII)
|
||||||
|
|| (strchr("/?", ch) && loc == HEX))
|
||||||
|
toggle();
|
||||||
|
|
||||||
|
startpos--;
|
||||||
|
move(maxy, 0);
|
||||||
|
refresh();
|
||||||
|
|
||||||
|
if (global) {
|
||||||
|
if ((undo_count = alloc_buf(endpos - startpos, &undo_buf))) {
|
||||||
|
memcpy(undo_buf, startpos + 1, undo_count);
|
||||||
|
}
|
||||||
|
undo_start = startpos + 1;
|
||||||
|
edits = U_EDIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
AGAIN:
|
||||||
|
if (direct == FORWARD) {
|
||||||
|
found = fsearch(startpos + 1, endpos, find_pat);
|
||||||
|
} else {
|
||||||
|
found = rsearch(startpos - 1, mem, find_pat);
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
if (!repl_count) {
|
||||||
|
if (P(P_WS)) {
|
||||||
|
emsg(notfound);
|
||||||
|
} else {
|
||||||
|
if (P(P_TE))
|
||||||
|
sprintf(string, "No match to %s", direct == FORWARD ? "BOTTOM" : "TOP");
|
||||||
|
else
|
||||||
|
sprintf(string, "Address search hit %s without matching pattern",
|
||||||
|
direct == FORWARD ? "BOTTOM" : "TOP");
|
||||||
|
emsg(string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return repl_count;
|
||||||
|
} else {
|
||||||
|
setpage(found);
|
||||||
|
if (conf) {
|
||||||
|
repaint();
|
||||||
|
msg("Replace?");
|
||||||
|
move(y, x);
|
||||||
|
if (vgetc() != 'y') goto SKIP;
|
||||||
|
}
|
||||||
|
repl_count++;
|
||||||
|
current_start = pagepos + y * Anzahl + xpos();
|
||||||
|
if (!global) {
|
||||||
|
if ((undo_count = alloc_buf(pat_len, &undo_buf))) {
|
||||||
|
memcpy(undo_buf, current_start, undo_count);
|
||||||
|
}
|
||||||
|
undo_start = current_start;
|
||||||
|
edits = U_EDIT;
|
||||||
|
}
|
||||||
|
memcpy(current_start, repl_pat, pat_len);
|
||||||
|
SKIP:
|
||||||
|
if (global) {
|
||||||
|
startpos = found + pat_len - 1;
|
||||||
|
goto AGAIN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return repl_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Used by /, ?, \, #, n or N command
|
||||||
|
* ch is this command
|
||||||
|
* line are the characters after
|
||||||
|
*
|
||||||
|
* return address found
|
||||||
|
*/
|
||||||
|
PTR
|
||||||
|
searching(ch, line, startpos, endpos, flag)
|
||||||
|
int ch;
|
||||||
|
char *line;
|
||||||
|
PTR startpos;
|
||||||
|
PTR endpos;
|
||||||
|
int flag;
|
||||||
|
{
|
||||||
|
char *cmd = NULL;
|
||||||
|
PTR found;
|
||||||
|
int sdir;
|
||||||
|
static char m[2];
|
||||||
|
static int direct;
|
||||||
|
|
||||||
|
if (line[0] == '\0' && again == 0) {
|
||||||
|
emsg(noprev);
|
||||||
|
return 0L; }
|
||||||
|
|
||||||
|
ignore_case = (P(P_IC));
|
||||||
|
magic = P(P_MA);
|
||||||
|
start_addr--;
|
||||||
|
if ((strchr("\\#", ch) && loc == ASCII)
|
||||||
|
|| (strchr("/?", ch) && loc == HEX))
|
||||||
|
toggle();
|
||||||
|
|
||||||
|
if (!strchr("Nn", ch)) {
|
||||||
|
m[0] = ch;
|
||||||
|
m[1] = '\0';
|
||||||
|
switch (ch) {
|
||||||
|
case '/':
|
||||||
|
case '?':
|
||||||
|
direct = (ch == '/' ? FORWARD : BACKWARD);
|
||||||
|
cmd = patcpy(pattern, line, ch);
|
||||||
|
if (pattern[0] != '\0') {
|
||||||
|
if (ascii_comp(search_pat, pattern)) return 0L;
|
||||||
|
again = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '#':
|
||||||
|
case '\\':
|
||||||
|
direct = (ch == '\\' ? FORWARD : BACKWARD);
|
||||||
|
cmd = patcpy(pattern, line, ch);
|
||||||
|
if (pattern[0] != '\0') {
|
||||||
|
if (hex_comp(search_pat, pattern)) break;
|
||||||
|
again = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!again) return 0L;
|
||||||
|
} else {
|
||||||
|
cmd = "";
|
||||||
|
msg(m);
|
||||||
|
}
|
||||||
|
move(maxy, 0);
|
||||||
|
refresh();
|
||||||
|
sdir = (ch == 'N') ? !direct : direct;
|
||||||
|
|
||||||
|
if (sdir == FORWARD) {
|
||||||
|
found = fsearch(startpos + 1, endpos, search_pat);
|
||||||
|
if (flag & S_GLOBAL) return(found);
|
||||||
|
if (!found)
|
||||||
|
if (flag & 1) {
|
||||||
|
msg("Search wrapped BOTTOM|Search wrapped around BOTTOM of buffer");
|
||||||
|
found = fsearch(mem, startpos, search_pat);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
found = rsearch(startpos - 1, mem, search_pat);
|
||||||
|
if (flag & S_GLOBAL) return(found);
|
||||||
|
if (!found)
|
||||||
|
if (flag & 1) {
|
||||||
|
msg("Search wrapped TOP|Search wrapped around TOP of buffer");
|
||||||
|
found = rsearch(endpos, startpos, search_pat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
if (flag & 1) {
|
||||||
|
emsg(notfound);
|
||||||
|
} else {
|
||||||
|
if (P(P_TE))
|
||||||
|
sprintf(string, "No match to %s", sdir == FORWARD ? "BOTTOM" : "TOP");
|
||||||
|
else
|
||||||
|
sprintf(string, "Address search hit %s without matching pattern",
|
||||||
|
sdir == FORWARD ? "BOTTOM" : "TOP");
|
||||||
|
emsg(string);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setpage(found);
|
||||||
|
if (cmd) {
|
||||||
|
switch(*cmd) {
|
||||||
|
case 'z': do_z(*++cmd);
|
||||||
|
break;
|
||||||
|
case 's': do_substitution(ch, cmd + 2, found, endpos);
|
||||||
|
repaint();
|
||||||
|
break;
|
||||||
|
case ';': searching(*(cmd + 1), cmd + 2, found, maxpos - 1, flag);
|
||||||
|
case '\0': break;
|
||||||
|
default: beep();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Copies a string from s2 to s1, up to delim or 0
|
||||||
|
* returns pointer to next character
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
patcpy(s1, s2, delim)
|
||||||
|
char *s1, *s2;
|
||||||
|
char delim;
|
||||||
|
{
|
||||||
|
while (*s2 != '\0' && *s2 != delim) {
|
||||||
|
if (*s2 == '\\' && *(s2 + 1) == delim) s2++;
|
||||||
|
*s1++ = *s2++;
|
||||||
|
}
|
||||||
|
*s1 = '\0';
|
||||||
|
if (*s2 == delim) s2++;
|
||||||
|
return s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PTR
|
||||||
|
fsearch(start, end, smem)
|
||||||
|
PTR start;
|
||||||
|
PTR end;
|
||||||
|
char *smem;
|
||||||
|
{
|
||||||
|
PTR spos;
|
||||||
|
|
||||||
|
signal(SIGINT, jmpproc);
|
||||||
|
for (spos = start; spos <= end; spos++) {
|
||||||
|
if (bregexec(spos, smem)) {
|
||||||
|
signal(SIGINT, SIG_IGN);
|
||||||
|
return(spos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
signal(SIGINT, SIG_IGN);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PTR
|
||||||
|
rsearch(start, end, smem)
|
||||||
|
PTR start;
|
||||||
|
PTR end;
|
||||||
|
char *smem;
|
||||||
|
{
|
||||||
|
PTR spos;
|
||||||
|
|
||||||
|
signal(SIGINT, jmpproc);
|
||||||
|
for (spos = start; spos >= end; spos--) {
|
||||||
|
if (bregexec(spos, smem)) {
|
||||||
|
signal(SIGINT, SIG_IGN);
|
||||||
|
return(spos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
signal(SIGINT, SIG_IGN);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Calculates an address of a colon command
|
||||||
|
* returns NULL on error or default_address, if nothing found
|
||||||
|
*/
|
||||||
|
PTR
|
||||||
|
calc_addr(pointer, def_addr)
|
||||||
|
char **pointer;
|
||||||
|
PTR def_addr;
|
||||||
|
{
|
||||||
|
PTR addr;
|
||||||
|
int ch, mark;
|
||||||
|
char *cmd;
|
||||||
|
|
||||||
|
cmd = *pointer;
|
||||||
|
addr = def_addr;
|
||||||
|
SKIP_WHITE
|
||||||
|
if (*cmd >= '1' && *cmd <= '9') {
|
||||||
|
addr = mem + strtol(cmd, &cmd, 10) - P(P_OF);
|
||||||
|
} else {
|
||||||
|
ch = *cmd;
|
||||||
|
switch (ch) {
|
||||||
|
case '.': /* Current position */
|
||||||
|
addr = current;
|
||||||
|
cmd++;
|
||||||
|
break;
|
||||||
|
case '^':
|
||||||
|
addr = mem;
|
||||||
|
cmd++;
|
||||||
|
break;
|
||||||
|
case '$':
|
||||||
|
addr = maxpos - 1;
|
||||||
|
cmd++;
|
||||||
|
break;
|
||||||
|
case '\'': /* Mark */
|
||||||
|
mark = (*++cmd);
|
||||||
|
if (mark == '\'') {
|
||||||
|
addr = last_motion;
|
||||||
|
cmd++;
|
||||||
|
break;
|
||||||
|
} else if (mark < 'a' || mark > 'z') {
|
||||||
|
emsg("Marks are ' and a-z");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (markbuf[mark - 'a'] == NULL) {
|
||||||
|
emsg("Mark not defined");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
addr = markbuf[mark - 'a'];
|
||||||
|
cmd++;
|
||||||
|
break;
|
||||||
|
case '\\':
|
||||||
|
case '/':
|
||||||
|
cmd = patcpy(pattern, cmd + 1, ch);
|
||||||
|
if (pattern[0] == '\0' && again == 0) {
|
||||||
|
emsg(noprev);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (pattern[0] != '\0') {
|
||||||
|
again = 1;
|
||||||
|
if (ch == '/') {
|
||||||
|
if (ascii_comp(search_pat, pattern)) return NULL;
|
||||||
|
} else {
|
||||||
|
if (hex_comp(search_pat, pattern)) return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addr = fsearch(mem, maxpos - 1, search_pat);
|
||||||
|
break;
|
||||||
|
case '#':
|
||||||
|
case '?':
|
||||||
|
cmd = patcpy(pattern, cmd + 1, ch);
|
||||||
|
if (pattern[0] == '\0' && again == 0) {
|
||||||
|
emsg(noprev);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (pattern[0] != '\0') {
|
||||||
|
again = 1;
|
||||||
|
if (ch == '?') {
|
||||||
|
if (ascii_comp(search_pat, pattern)) return NULL;
|
||||||
|
} else {
|
||||||
|
if (hex_comp(search_pat, pattern)) return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addr = rsearch(maxpos - 1, mem, search_pat);
|
||||||
|
break;
|
||||||
|
case '0':
|
||||||
|
addr = mem + strtol(cmd, &cmd, 16) - P(P_OF);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SKIP_WHITE
|
||||||
|
while (*cmd == '+' || *cmd == '-') {
|
||||||
|
if (*cmd == '+') {
|
||||||
|
cmd++;
|
||||||
|
SKIP_WHITE
|
||||||
|
if (*cmd >= '1' && *cmd <= '9') {
|
||||||
|
addr += strtol(cmd, &cmd, 10);
|
||||||
|
} else if (*cmd == '0') {
|
||||||
|
addr += strtol(cmd, &cmd, 16);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cmd++;
|
||||||
|
SKIP_WHITE
|
||||||
|
if (*cmd >= '1' && *cmd <= '9') {
|
||||||
|
addr -= strtol(cmd, &cmd, 10);
|
||||||
|
} else if (*cmd == '0') {
|
||||||
|
addr -= strtol(cmd, &cmd, 16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SKIP_WHITE
|
||||||
|
}
|
||||||
|
if (*pointer != cmd) {
|
||||||
|
*pointer = cmd;
|
||||||
|
addr_flag++;
|
||||||
|
}
|
||||||
|
return addr;
|
||||||
|
}
|
279
recomp.c
Normal file
279
recomp.c
Normal file
|
@ -0,0 +1,279 @@
|
||||||
|
/* recomp - regular expression compiler
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* 1996-01-06 created;
|
||||||
|
* 2000-04-25 V 1.3.0 beta
|
||||||
|
* 2000-07-12 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* You cannot use a common regexp subroutine, because \0 is a regular
|
||||||
|
* character in a binary string !
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "bvi.h"
|
||||||
|
#include "set.h"
|
||||||
|
|
||||||
|
|
||||||
|
char *poi;
|
||||||
|
int smode;
|
||||||
|
int again = 0;
|
||||||
|
int magic = 1;
|
||||||
|
int ignore_case = 0;
|
||||||
|
|
||||||
|
extern long bytepos;
|
||||||
|
extern int ignore_case;
|
||||||
|
extern char *emptyclass;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compiling an ASCII sequence to a regex string
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ascii_comp(smem, pattern)
|
||||||
|
char *smem;
|
||||||
|
char *pattern;
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
char *comp;
|
||||||
|
char cc, cc1;
|
||||||
|
char *counter;
|
||||||
|
int count;
|
||||||
|
int bracket, dot;
|
||||||
|
|
||||||
|
comp = smem;
|
||||||
|
poi = pattern;
|
||||||
|
while (*poi != END) {
|
||||||
|
bracket = FALSE;
|
||||||
|
if (magic) {
|
||||||
|
if (*poi == '[') bracket = TRUE;
|
||||||
|
} else {
|
||||||
|
if (*poi == '\\' && *(poi + 1) == '[') {
|
||||||
|
bracket = TRUE;
|
||||||
|
poi++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bracket) {
|
||||||
|
if (!(end = strchr(poi, ']'))) {
|
||||||
|
emsg("Missing ]");
|
||||||
|
return 1; }
|
||||||
|
poi++;
|
||||||
|
if (*poi == ']' || (*poi == '^' && *(poi + 1) == ']')) {
|
||||||
|
emsg(emptyclass);
|
||||||
|
return 1; }
|
||||||
|
if (magic) {
|
||||||
|
if (*(end + 1) == '*') *comp++ = STAR;
|
||||||
|
else *comp++ = ONE;
|
||||||
|
} else {
|
||||||
|
if (*(end + 1) == '\\' && *(end + 2) == '*') *comp++ = STAR;
|
||||||
|
else *comp++ = ONE;
|
||||||
|
}
|
||||||
|
count = 0;
|
||||||
|
counter = comp;
|
||||||
|
comp++;
|
||||||
|
if (*poi != '^') {
|
||||||
|
*comp++ = '\0';
|
||||||
|
count++; }
|
||||||
|
|
||||||
|
while (end > poi) {
|
||||||
|
if (*poi == '-') {
|
||||||
|
if (ignore_case) {
|
||||||
|
cc = toupper(*(poi - 1));
|
||||||
|
cc1 = toupper(*(poi + 1));
|
||||||
|
} else {
|
||||||
|
cc = *(poi - 1);
|
||||||
|
cc1 = *(poi + 1);
|
||||||
|
}
|
||||||
|
while (cc <= cc1) {
|
||||||
|
*comp++ = cc++;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
poi++; poi++;
|
||||||
|
} else {
|
||||||
|
count++;
|
||||||
|
if (ignore_case)
|
||||||
|
*comp++ = toupper(*poi++);
|
||||||
|
else
|
||||||
|
*comp++ = *poi++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
poi++;
|
||||||
|
*counter = count;
|
||||||
|
} else {
|
||||||
|
dot = FALSE;
|
||||||
|
if (magic) {
|
||||||
|
if (*poi == '.') dot = TRUE;
|
||||||
|
} else {
|
||||||
|
if (*poi == '\\' && *(poi + 1) == '.') {
|
||||||
|
dot = TRUE; poi++; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*poi == '\\') {
|
||||||
|
switch (*(poi + 1)) {
|
||||||
|
case 'n': *++poi = '\n'; break;
|
||||||
|
case 'r': *++poi = '\r'; break;
|
||||||
|
case 't': *++poi = '\t'; break;
|
||||||
|
case '0': *++poi = '\0'; break;
|
||||||
|
default : ++poi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (magic)
|
||||||
|
if (*(poi + 1) == '*') *comp++ = STAR;
|
||||||
|
else *comp++ = ONE;
|
||||||
|
else
|
||||||
|
if (*(poi + 1) == '\\' && *(poi + 2) == '*') *comp++ = STAR;
|
||||||
|
else *comp++ = ONE;
|
||||||
|
|
||||||
|
if (dot) {
|
||||||
|
*comp++ = 0;
|
||||||
|
poi++;
|
||||||
|
} else {
|
||||||
|
*comp++ = 1;
|
||||||
|
if (ignore_case)
|
||||||
|
*comp++ = toupper(*poi++);
|
||||||
|
else
|
||||||
|
*comp++ = *poi++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (magic) {
|
||||||
|
if (*poi == '*') poi++;
|
||||||
|
} else {
|
||||||
|
if (*poi == '\\' && *(poi + 1) == '*') { poi++; poi++; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*comp = END;
|
||||||
|
smode = ASCII;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compiling a hex expression to a regex string
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
hex_comp(smem, pattern)
|
||||||
|
char *smem;
|
||||||
|
char *pattern;
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
char *comp;
|
||||||
|
int cc, ccm;
|
||||||
|
char *counter;
|
||||||
|
int count, nr;
|
||||||
|
|
||||||
|
comp = smem;
|
||||||
|
poi = pattern;
|
||||||
|
while (*poi != END) {
|
||||||
|
while (*poi == ' ' || *poi == '\t') poi++;
|
||||||
|
if (*poi == '[') {
|
||||||
|
if (!(end = strchr(poi, ']'))) {
|
||||||
|
emsg("Missing ]");
|
||||||
|
return 1; }
|
||||||
|
poi++;
|
||||||
|
while (*poi == ' ' || *poi == '\t') poi++;
|
||||||
|
|
||||||
|
if (*poi == ']' || (*poi == '^' && *(poi + 1) == ']')) {
|
||||||
|
emsg(emptyclass);
|
||||||
|
return 1; }
|
||||||
|
if (*(end + 1) == '*') *comp++ = STAR;
|
||||||
|
else *comp++ = ONE;
|
||||||
|
count = 1;
|
||||||
|
counter = comp;
|
||||||
|
comp++;
|
||||||
|
if (*poi == '^')
|
||||||
|
*comp++ = *poi++;
|
||||||
|
else
|
||||||
|
*comp++ = '\0';
|
||||||
|
while (end > poi) {
|
||||||
|
if (*poi == ' ' || *poi == '\t') poi++;
|
||||||
|
else if (*poi == '-') {
|
||||||
|
cc = *(comp - 1);
|
||||||
|
poi++;
|
||||||
|
if ((ccm = hexchar()) < 0) return 1;
|
||||||
|
while (cc <= ccm) {
|
||||||
|
*comp++ = cc++;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
poi++; poi++;
|
||||||
|
} else {
|
||||||
|
if ((nr = hexchar()) < 0) return 1;
|
||||||
|
count++;
|
||||||
|
*comp++ = nr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
poi++;
|
||||||
|
*counter = count;
|
||||||
|
if (*poi == '*') poi++;
|
||||||
|
} else if (*poi == '"') {
|
||||||
|
poi++;
|
||||||
|
if (!(end = strchr(poi, '"'))) {
|
||||||
|
/*
|
||||||
|
emsg("Missing '\"'");
|
||||||
|
return 1;
|
||||||
|
*/
|
||||||
|
end = poi + strlen(poi);
|
||||||
|
}
|
||||||
|
while (end > poi) {
|
||||||
|
*comp++ = 1;
|
||||||
|
*comp++ = 1;
|
||||||
|
if (ignore_case)
|
||||||
|
*comp++ = toupper(*poi++);
|
||||||
|
else
|
||||||
|
*comp++ = *poi++;
|
||||||
|
}
|
||||||
|
poi++;
|
||||||
|
} else {
|
||||||
|
if (*poi == '.') {
|
||||||
|
if (*(poi + 1) == '*') { *comp++ = STAR; poi++; }
|
||||||
|
else *comp++ = ONE;
|
||||||
|
*comp++ = 0;
|
||||||
|
poi++;
|
||||||
|
} else {
|
||||||
|
if ((nr = hexchar()) < 0) return 1;
|
||||||
|
if (*poi == '*') { poi++; *comp++ = STAR; }
|
||||||
|
else *comp++ = ONE;
|
||||||
|
*comp++ = 1;
|
||||||
|
*comp++ = nr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*comp = END;
|
||||||
|
smode = HEX;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
hexchar()
|
||||||
|
{
|
||||||
|
int nr;
|
||||||
|
char tmpbuf[3];
|
||||||
|
|
||||||
|
if (isxdigit(*poi)) {
|
||||||
|
tmpbuf[0] = *poi++;
|
||||||
|
tmpbuf[1] = '\0';
|
||||||
|
if (isxdigit(*poi)) tmpbuf[1] = *poi++;
|
||||||
|
tmpbuf[2] = '\0';
|
||||||
|
sscanf(tmpbuf, "%2x", &nr);
|
||||||
|
while (*poi == ' ' || *poi == '\t') poi++;
|
||||||
|
return nr;
|
||||||
|
} else {
|
||||||
|
emsg("Bad hex character@in expression");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
373
set.c
Normal file
373
set.c
Normal file
|
@ -0,0 +1,373 @@
|
||||||
|
/* SET.C - performing :set - command
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* 1996-02-29 created;
|
||||||
|
* 1998-03-14 V 1.0.1
|
||||||
|
* 1999-01-14 V 1.1.0
|
||||||
|
* 1999-03-17 V 1.1.1
|
||||||
|
* 1999-07-02 V 1.2.0 beta
|
||||||
|
* 1999-08-14 V 1.2.0 final
|
||||||
|
* 2000-07-15 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bvi.h"
|
||||||
|
#include "set.h"
|
||||||
|
|
||||||
|
static int from_file = 0;
|
||||||
|
static FILE *ffp;
|
||||||
|
static char fbuf[256];
|
||||||
|
static char buf[64];
|
||||||
|
|
||||||
|
struct param params[] = {
|
||||||
|
{ "autowrite", "aw", FALSE, "", P_BOOL },
|
||||||
|
{ "columns", "cm", 16, "", P_NUM },
|
||||||
|
{ "errorbells", "eb", FALSE, "", P_BOOL },
|
||||||
|
{ "ignorecase", "ic", FALSE, "", P_BOOL },
|
||||||
|
{ "magic", "ma", TRUE, "", P_BOOL },
|
||||||
|
{ "memmove", "mm", FALSE, "", P_BOOL },
|
||||||
|
{ "offset", "of", 0, "", P_NUM },
|
||||||
|
{ "readonly", "ro", FALSE, "", P_BOOL },
|
||||||
|
{ "scroll", "scroll", 12, "", P_NUM },
|
||||||
|
{ "showmode", "mo", TRUE, "", P_BOOL },
|
||||||
|
{ "term", "term", 0, "", P_TEXT },
|
||||||
|
{ "terse", "terse", FALSE, "", P_BOOL },
|
||||||
|
{ "unixstyle", "us", FALSE, "", P_BOOL },
|
||||||
|
{ "window", "window", 25, "", P_NUM },
|
||||||
|
{ "wordlength", "wl", 4, "", P_NUM },
|
||||||
|
{ "wrapscan", "ws", TRUE, "", P_BOOL },
|
||||||
|
#ifdef __MSDOS__
|
||||||
|
{ "color", "co", 7, "", P_NUM },
|
||||||
|
#endif
|
||||||
|
{ "", "", 0, "", 0, } /* end marker */
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
int
|
||||||
|
doset(arg)
|
||||||
|
char *arg; /* parameter string */
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *s;
|
||||||
|
int did_window = FALSE;
|
||||||
|
int state = TRUE; /* new state of boolean parms. */
|
||||||
|
char string[80];
|
||||||
|
|
||||||
|
if (arg == NULL) {
|
||||||
|
showparms(FALSE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!strcmp(arg, "all")) {
|
||||||
|
showparms(TRUE);
|
||||||
|
return 0; }
|
||||||
|
if (!strncmp(arg, "no", 2)) {
|
||||||
|
state = FALSE;
|
||||||
|
arg += 2; }
|
||||||
|
|
||||||
|
for (i = 0; params[i].fullname[0] != '\0'; i++) {
|
||||||
|
s = params[i].fullname;
|
||||||
|
if (strncmp(arg, s, strlen(s)) == 0) /* matched full name */
|
||||||
|
break;
|
||||||
|
s = params[i].shortname;
|
||||||
|
if (strncmp(arg, s, strlen(s)) == 0) /* matched short name */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params[i].fullname[0] != '\0') { /* found a match */
|
||||||
|
if (arg[strlen(s)] == '?') {
|
||||||
|
if (params[i].flags & P_BOOL)
|
||||||
|
sprintf(buf, " %s%s",
|
||||||
|
(params[i].nvalue ? " " : "no"), params[i].fullname);
|
||||||
|
else if (params[i].flags & P_TEXT)
|
||||||
|
sprintf(buf, " %s=%s", params[i].fullname,
|
||||||
|
params[i].svalue);
|
||||||
|
else
|
||||||
|
sprintf(buf, " %s=%ld", params[i].fullname,
|
||||||
|
params[i].nvalue);
|
||||||
|
msg(buf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!strcmp(params[i].fullname, "term")) {
|
||||||
|
emsg("Can't change type of terminal from within bvi");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (params[i].flags & P_NUM) {
|
||||||
|
if ((i == P_LI) || (i == P_OF)) did_window++;
|
||||||
|
if (arg[strlen(s)] != '=' || state == FALSE) {
|
||||||
|
sprintf(string, "Option %s is not a toggle",
|
||||||
|
params[i].fullname);
|
||||||
|
emsg(string);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
s = arg + strlen(s) + 1;
|
||||||
|
if (*s == '0') {
|
||||||
|
params[i].nvalue = strtol(s, &s, 16);
|
||||||
|
} else {
|
||||||
|
params[i].nvalue = strtol(s, &s, 10);
|
||||||
|
}
|
||||||
|
params[i].flags |= P_CHANGED;
|
||||||
|
#ifdef __MSDOS__
|
||||||
|
if (i == P_CO) {
|
||||||
|
textcolor(P(P_CO) & 0x07);
|
||||||
|
textbackground((P(P_CO) & 0xf0) >> 4);
|
||||||
|
clrscr();
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (i == P_CM) {
|
||||||
|
if (((COLS - AnzAdd - 1) / 4) >= P(P_CM)) {
|
||||||
|
Anzahl = P(P_CM);
|
||||||
|
} else {
|
||||||
|
Anzahl = P(P_CM) = ((COLS - AnzAdd - 1) / 4);
|
||||||
|
}
|
||||||
|
maxx = Anzahl * 4 + AnzAdd + 1;
|
||||||
|
Anzahl3 = Anzahl * 3;
|
||||||
|
status = Anzahl3 + Anzahl - 17;
|
||||||
|
screen = Anzahl * (maxy - 1);
|
||||||
|
did_window++;
|
||||||
|
stuffin("H"); /* set cursor at HOME */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { /* boolean */
|
||||||
|
if (arg[strlen(s)] == '=') {
|
||||||
|
emsg("Invalid set of boolean parameter");
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
params[i].nvalue = state;
|
||||||
|
params[i].flags |= P_CHANGED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
emsg("No such option@- `set all' gives all option values");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (did_window) {
|
||||||
|
maxy = P(P_LI) - 1;
|
||||||
|
new_screen();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* show ALL parameters */
|
||||||
|
void
|
||||||
|
showparms(all)
|
||||||
|
int all;
|
||||||
|
{
|
||||||
|
struct param *p;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
n = 2;
|
||||||
|
msg("Parameters:\n");
|
||||||
|
for (p = ¶ms[0]; p->fullname[0] != '\0' ;p++) {
|
||||||
|
if (!all && ((p->flags & P_CHANGED) == 0))
|
||||||
|
continue;
|
||||||
|
if (p->flags & P_BOOL)
|
||||||
|
sprintf(buf, " %s%s\n",
|
||||||
|
(p->nvalue ? " " : "no"), p->fullname);
|
||||||
|
else if (p->flags & P_TEXT)
|
||||||
|
sprintf(buf, " %s=%s\n", p->fullname, p->svalue);
|
||||||
|
else
|
||||||
|
sprintf(buf, " %s=%ld\n", p->fullname, p->nvalue);
|
||||||
|
|
||||||
|
msg(buf);
|
||||||
|
n++;
|
||||||
|
if (n == params[P_LI].nvalue) {
|
||||||
|
if (wait_return(FALSE)) return;
|
||||||
|
n = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wait_return(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* reads the init file (.bvirc) */
|
||||||
|
int
|
||||||
|
read_rc(fn)
|
||||||
|
char *fn;
|
||||||
|
{
|
||||||
|
if((ffp = fopen(fn, "r")) == NULL) return -1;
|
||||||
|
from_file = 1;
|
||||||
|
while(fgets(fbuf, 255, ffp) != NULL) {
|
||||||
|
strtok(fbuf, "\n\r");
|
||||||
|
docmdline(fbuf);
|
||||||
|
}
|
||||||
|
fclose(ffp);
|
||||||
|
from_file = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
do_logic(mode, str)
|
||||||
|
int mode;
|
||||||
|
char *str;
|
||||||
|
{
|
||||||
|
int a, b;
|
||||||
|
int value;
|
||||||
|
size_t n;
|
||||||
|
char *err_str ="Invalid value@for bit manipulation";
|
||||||
|
|
||||||
|
if (mode==LSHIFT || mode==RSHIFT || mode==LROTATE || mode==RROTATE) {
|
||||||
|
value = atoi(str);
|
||||||
|
if (value < 1 || value > 8) {
|
||||||
|
emsg(err_str);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (strlen(str) == 8) {
|
||||||
|
value = strtol(str, NULL, 2);
|
||||||
|
for (n = 0; n < 8; n++) {
|
||||||
|
if (str[n] != '0' && str[n] != '1') {
|
||||||
|
value = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (str[0] == 'b' || str[0] == 'B') {
|
||||||
|
value = strtol(str + 1, NULL, 2);
|
||||||
|
} else if (str[0] == '0') {
|
||||||
|
value = strtol(str, NULL, 16);
|
||||||
|
for (n = 0; n < strlen(str); n++) {
|
||||||
|
if (!isxdigit(str[n])) {
|
||||||
|
value = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
value = atoi(str);
|
||||||
|
}
|
||||||
|
if (value < 0 || value > 255) {
|
||||||
|
emsg(err_str);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((undo_count = alloc_buf(end_addr - start_addr + 1, &undo_buf))) {
|
||||||
|
memcpy(undo_buf, start_addr, undo_count);
|
||||||
|
}
|
||||||
|
undo_start = start_addr;
|
||||||
|
edits = U_EDIT;
|
||||||
|
while(start_addr <= end_addr) {
|
||||||
|
a = *start_addr;
|
||||||
|
a &= 0xff;
|
||||||
|
switch(mode) {
|
||||||
|
case LSHIFT: a <<= value;
|
||||||
|
break;
|
||||||
|
case RSHIFT: a >>= value;
|
||||||
|
break;
|
||||||
|
case LROTATE: a <<= value;
|
||||||
|
b = a >> 8;
|
||||||
|
a |= b;
|
||||||
|
break;
|
||||||
|
case RROTATE:
|
||||||
|
b = a << 8;
|
||||||
|
a |= b;
|
||||||
|
a >>= value;
|
||||||
|
/*
|
||||||
|
b = a << (8 - value);
|
||||||
|
a >>= value;
|
||||||
|
a |= b;
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
case AND: a &= value;
|
||||||
|
break;
|
||||||
|
case OR: a |= value;
|
||||||
|
break;
|
||||||
|
case XOR:
|
||||||
|
case NOT: a ^= value;
|
||||||
|
break;
|
||||||
|
case NEG: a ^= value;
|
||||||
|
a++; /* Is this true */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*start_addr++ = (char)(a & 0xff);
|
||||||
|
}
|
||||||
|
repaint();
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
getcmdstr(p, x)
|
||||||
|
char *p;
|
||||||
|
int x;
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
int n;
|
||||||
|
char *buff, *q;
|
||||||
|
|
||||||
|
if (from_file) {
|
||||||
|
if(fgets(p, 255, ffp) != NULL) {
|
||||||
|
strtok(p, "\n\r");
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
signal(SIGINT, jmpproc);
|
||||||
|
buff = p;
|
||||||
|
move(maxy, x);
|
||||||
|
do {
|
||||||
|
switch (c = vgetc()) {
|
||||||
|
case CTRL('H'):
|
||||||
|
case KEY_BACKSPACE:
|
||||||
|
case KEY_LEFT:
|
||||||
|
if (p > buff) {
|
||||||
|
p--;
|
||||||
|
move(maxy, x);
|
||||||
|
n = x;
|
||||||
|
for (q = buff; q < p ;q++) {
|
||||||
|
addch(*q);
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
addch(' ');
|
||||||
|
move(maxy, n);
|
||||||
|
} else {
|
||||||
|
*buff = '\0';
|
||||||
|
msg("");
|
||||||
|
signal(SIGINT, SIG_IGN);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ESC: /* abandon command */
|
||||||
|
*buff = '\0';
|
||||||
|
msg("");
|
||||||
|
signal(SIGINT, SIG_IGN);
|
||||||
|
return 1;
|
||||||
|
#if NL != KEY_ENTER
|
||||||
|
case NL:
|
||||||
|
#endif
|
||||||
|
#if CR != KEY_ENTER
|
||||||
|
case CR:
|
||||||
|
#endif
|
||||||
|
case KEY_ENTER:
|
||||||
|
break;
|
||||||
|
default: /* a normal character */
|
||||||
|
addch(c);
|
||||||
|
*p++ = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
refresh();
|
||||||
|
} while (c != NL && c != CR && c != KEY_ENTER);
|
||||||
|
|
||||||
|
*p = '\0';
|
||||||
|
signal(SIGINT, SIG_IGN);
|
||||||
|
return 0;
|
||||||
|
}
|
72
set.h
Normal file
72
set.h
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
/* SET.H
|
||||||
|
*
|
||||||
|
* NOTE: Edit this file with tabstop=4 !
|
||||||
|
*
|
||||||
|
* Copyright 1996-2000 by Gerhard Buergmann
|
||||||
|
* Gerhard.Buergmann@altavista.net
|
||||||
|
*
|
||||||
|
* 1998-03-14 V 1.0.0
|
||||||
|
* 1999-01-14 V 1.1.0
|
||||||
|
* 1999-03-23 V 1.1.1
|
||||||
|
* 1999-07-02 V 1.2.0 beta
|
||||||
|
* 1999-08-14 V 1.2.0 final
|
||||||
|
* 2000-08-21 V 1.3.0 final
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* See file COPYING for information on distribution conditions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
struct param {
|
||||||
|
char *fullname; /* full parameter name */
|
||||||
|
char *shortname; /* permissible abbreviation */
|
||||||
|
long nvalue;
|
||||||
|
char *svalue;
|
||||||
|
int flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct param params[];
|
||||||
|
|
||||||
|
#define P_BOOL 0x01 /* the parameter is boolean */
|
||||||
|
#define P_NUM 0x02 /* the parameter is numeric */
|
||||||
|
#define P_TEXT 0x04 /* the paameter is text */
|
||||||
|
#define P_CHANGED 0x08 /* the parameter has been changed */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following are the indices in the params array for each parameter
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* parameters
|
||||||
|
*/
|
||||||
|
#define P_AW 0 /* Autowrite */
|
||||||
|
#define P_CM 1 /* Columns */
|
||||||
|
#define P_EB 2 /* error bells */
|
||||||
|
#define P_IC 3 /* ignore case in searches */
|
||||||
|
#define P_MA 4 /* Magic characters in reg expr */
|
||||||
|
#define P_MM 5 /* move bytes in file */
|
||||||
|
#define P_OF 6 /* address offset */
|
||||||
|
#define P_RO 7 /* Readonly */
|
||||||
|
#define P_SS 8 /* scroll size */
|
||||||
|
#define P_MO 9 /* show mode */
|
||||||
|
#define P_TT 10 /* Terminal type */
|
||||||
|
#define P_TE 11 /* Terse (short messages) */
|
||||||
|
#define P_US 12 /* Unix-Style of ASCII representation */
|
||||||
|
#define P_LI 13 /* lines */
|
||||||
|
#define P_WL 14 /* Wordlength for w, W, b, B command */
|
||||||
|
#define P_WS 15 /* wrapscan */
|
||||||
|
#define P_CO 16 /* color/attribute setting */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macro to get the value of a parameter
|
||||||
|
*/
|
||||||
|
#define P(n) (params[n].nvalue)
|
Loading…
Reference in a new issue