Import of nvi-1.79, minus a few bits that we dont need (eg: postscript
files, curses, db, regex etc that we already have). The other glue will follow shortly. Obtained from: Keith Bostic <bostic@bostic.com>
This commit is contained in:
parent
f1460870b9
commit
b8ba871bd9
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor/nvi/dist/; revision=19304
160
contrib/nvi/FAQ
Normal file
160
contrib/nvi/FAQ
Normal file
@ -0,0 +1,160 @@
|
||||
@(#)FAQ 8.13 (Berkeley) 10/14/96
|
||||
|
||||
Q: How can I get vi to display my character set?
|
||||
A: Vi uses the C library routine isprint(3) to determine if a character
|
||||
is printable, or should be displayed as an octal or hexadecimal value
|
||||
on the screen. Generally, if vi is displaying printable characters
|
||||
in octal/hexadecimal forms, your environment is not configured correctly.
|
||||
Try looking at the man pages that allow you to configure your locale.
|
||||
For example, to configure an ISO 8859-1 locale under Solaris using csh,
|
||||
you would do:
|
||||
|
||||
setenv LANG C
|
||||
setenv LC_CTYPE iso_8859_1
|
||||
|
||||
Other LC_CTYPE systems/values that I'm told work:
|
||||
|
||||
System Value
|
||||
====== =====
|
||||
FreeBSD lt_LN.ISO_8859-1
|
||||
HP-UX 9.X american.iso88591
|
||||
HP-UX 10.X en_US.iso88591
|
||||
SunOS 4.X iso_8859_1
|
||||
SunOS 5.X iso_8859_1
|
||||
|
||||
If there's no other solution, you can use the print and noprint edit
|
||||
options of vi to specify that a specific character is printable or not
|
||||
printable.
|
||||
|
||||
Q: My map won't work!
|
||||
A: One thing that you should immediately check if a vi map doesn't work
|
||||
is if depends on the final cursor position after a P or p command.
|
||||
Historic vi's were inconsistent as to the final position of the cursor,
|
||||
and, to make matter worse, the final cursor position also depended on
|
||||
whether the put text came from a named or unnamed buffer! Vi follows
|
||||
the POSIX 1003.2 standard on this one, and makes this consistent, always
|
||||
placing the cursor on the first character.
|
||||
|
||||
Q: I'm using ksh or csh as my vi edit option shell value, and file
|
||||
expansions don't work right!
|
||||
A: The problem may be in your ksh or csh startup files, e.g., .cshrc. Vi
|
||||
executes the shell to do name expansion, and the shell generally reads
|
||||
its startup files. If the startup files are not correctly configured
|
||||
for non-interactive use, e.g., they always echo a prompt to the screen,
|
||||
vi will be unable to parse the output and things will not work
|
||||
correctly.
|
||||
|
||||
Q: How does the iclower edit option differ from the ignorecase (i.e. ic)
|
||||
edit option?
|
||||
A: The difference is that the ignorecase edit option always ignores the
|
||||
case of letters in the Regular Expression (RE), and the iclower edit
|
||||
option only ignores the case if there are no upper-case letters in the
|
||||
RE. If any upper-case letters appear in the Regular Expression, then
|
||||
it will be treated case-sensitively, as if the ignorecase edit option
|
||||
was not set.
|
||||
|
||||
Q: When I edit binary files, vi appends a <newline> to the last line!
|
||||
A: This is historic practice for vi, and further, it's required by the
|
||||
POSIX 1003.2 standard. My intent is to provide a command line and/or
|
||||
edit option to turn this behavior off when I switch to version 2.0 of
|
||||
the Berkeley DB package.
|
||||
|
||||
Q: My cursor keys don't work when I'm in text input mode!
|
||||
A: A common problem over slow links is that the set of characters sent by
|
||||
the cursor keys don't arrive close enough together for vi to understand
|
||||
that they are a single keystroke, and not separate keystrokes. Try
|
||||
increasing the value of the escapetime edit option, which will cause
|
||||
vi to wait longer before deciding that the <escape> character that
|
||||
starts cursor key sequences doesn't have any characters following it.
|
||||
|
||||
Q: When I edit some files, vi seems to hang forever, and I have to kill it.
|
||||
A: Vi uses flock(2) and fcntl(2) to do file locking. When it attempts to
|
||||
acquired a lock for a file on an NFS mounted filesystem, it can hang
|
||||
for a very long (perhaps infinite) period of time. Turning off the
|
||||
"lock" edit option will keep vi from attempting to acquire any locks
|
||||
on the files you edit.
|
||||
|
||||
Q: When I compile vi I get lots of warnings about pointer assignments
|
||||
being incompatible!
|
||||
A: Vi is partially written to support wide characters. When this code
|
||||
interfaces with the code that doesn't yet support wide characters,
|
||||
the pointer types clash. This will hopefully be fixed in the near
|
||||
future, but I've been saying that for awhile, now.
|
||||
|
||||
Q: I get jumpy scrolling behavior in the screen!
|
||||
A: This is almost certainly a problem with the system's terminfo or
|
||||
termcap information for your terminal. If the terminfo/termcap entry
|
||||
doesn't have the settable scrolling region capabilities, or the more
|
||||
powerful scrolling commands, these behaviors can result. Historic
|
||||
implementations of vi, and some of the vi clones, don't suffer from
|
||||
this problem because they wrote their own screen support instead of
|
||||
using the curses library.
|
||||
|
||||
The solution is to find a good terminfo or termcap entry for your
|
||||
terminal, which will fix the problem for all of the applications on
|
||||
your system, not just vi. Eric Raymond maintains the freely
|
||||
redistributable termcap/terminfo entries. They can be downloaded
|
||||
from http://www.ccil.org/~esr/ncurses.html, or you can contact him
|
||||
at esr@snark.thyrsus.com.
|
||||
|
||||
Q: The entire screen repaints on every keystroke!
|
||||
A: Your system's curses implementation is broken. You should use the
|
||||
curses implementation provided with vi or a curses replacement such
|
||||
as ncurses. Eric Raymond is one of the maintainers of the freely
|
||||
redistributable ncurses package. You can download ncurses from
|
||||
http://www.ccil.org/~esr/ncurses.html, or you can contact him at
|
||||
esr@snark.thyrsus.com.
|
||||
|
||||
Q: When I use vi on a Sun console (terminal type sun-34) the screen
|
||||
is occasionally trashed, usually when exiting vi!
|
||||
A: The Sun console can't handle the 'al' capability of the termcap
|
||||
entry (the il1 capability of terminfo entries). If you delete that
|
||||
entry from your terminfo/termcap information everything should work
|
||||
correctly.
|
||||
|
||||
Q: I don't have a version of ctags (or I have ctags, but it doesn't tag
|
||||
nearly enough things)!
|
||||
A: There's a version of ctags available on the 4.4BSD-Lite distributions,
|
||||
as well as the FreeBSD, NetBSD, Linux and GNU distributions. Or, you
|
||||
might want to try Exuberant Ctags:
|
||||
|
||||
Title: Exuberant Ctags
|
||||
Version: 1.3
|
||||
Entered-date: 16JUN96
|
||||
Description:
|
||||
A better ctags which generates tags for all possible tag types:
|
||||
macro definitions, enumerated values (values inside enum{...}),
|
||||
function and method definitions, enum/struct/union tags, external
|
||||
function prototypes (optional), typedefs, and variable
|
||||
declarations. It is far less easily fooled by code containing #if
|
||||
preprocessor conditional constructs, using a conditional path
|
||||
selection algorithm to resolve complicated choices, and a
|
||||
fall-back algorithm when this one fails. Can also be used to print
|
||||
out a list of selected objects found in source files.
|
||||
Keywords: ctags, tags, exuberant
|
||||
Author: darren@sirsi.com (Darren Hiebert)
|
||||
darren@hiwaay.net (Darren Hiebert)
|
||||
Maintained-by: darren@sirsi.com (Darren Hiebert)
|
||||
darren@hiwaay.net (Darren Hiebert)
|
||||
Primary-site: sunsite.unc.edu /pub/Linux/devel/lang/c
|
||||
27kB ctags-1.3.tar.gz
|
||||
Alternate-site: ftp.halcyon.com /local/gvr
|
||||
27kB ctags-1.3.tar.gz
|
||||
Original-site:
|
||||
Platforms: UNIX, MSDOS, WindowsNT, Windows95, OS/2, Amiga
|
||||
Copying-policy: Public domain
|
||||
|
||||
Q: When I update a file I already have open, and use :e to reread it, I
|
||||
get nul's for the rest of the file!
|
||||
A: Your system's implementation of mmap(2) has a bug; you will have to
|
||||
exit vi and re-execute it.
|
||||
|
||||
Q: Where can I get cscope?
|
||||
A: Cscope is available on UNIXWare System V Release 4.0 variants such as
|
||||
Sun Solaris 2.x (/opt/SUNWspro/bin) and UNIXWare System V Release 4.1.
|
||||
|
||||
You can buy version 13.3 source with an unrestricted license for $400
|
||||
from AT&T Software Solutions by calling +1-800-462-8146. Binary
|
||||
redistribution of cscope is an additional $1500, one-time flat fee.
|
||||
|
||||
For more information, see http://www.unipress.com/att/new/cscope.html.
|
128
contrib/nvi/LAYOUT
Normal file
128
contrib/nvi/LAYOUT
Normal file
@ -0,0 +1,128 @@
|
||||
# @(#)LAYOUT 8.12 (Berkeley) 10/10/96
|
||||
|
||||
LAYOUT
|
||||
This file: the layout of the nvi sources.
|
||||
|
||||
LICENSE
|
||||
Nvi's copyright notice and conditions for redistribution.
|
||||
|
||||
README
|
||||
Welcome message and basic information.
|
||||
|
||||
build/
|
||||
The build/configuration directory for nvi. See build/README for
|
||||
more information.
|
||||
|
||||
catalog/
|
||||
Support for message catalogs for nvi. See catalog/README for more
|
||||
information.
|
||||
|
||||
cl/
|
||||
Source files for nvi's curses screen support.
|
||||
|
||||
clib/
|
||||
Replacement source files for C library functions.
|
||||
|
||||
common/
|
||||
Source files for pieces of code that are shared by ex and vi,
|
||||
e.g., searching and logging code or code translating line numbers
|
||||
into requests to the dbopen(3) database code. It also has the
|
||||
interface code for modifying "records" in the underlying database.
|
||||
|
||||
curses/
|
||||
A stripped-down replacement curses library. Do not try and use
|
||||
this library outside of nvi, many standard curses functions have
|
||||
been removed because nvi doesn't use them. See build/README for
|
||||
more information.
|
||||
|
||||
db/
|
||||
A stripped-down replacement DB library. Do not try and use this
|
||||
library outside of nvi, many standard DB functions have been
|
||||
removed because nvi doesn't use them. See db/README for more
|
||||
information.
|
||||
|
||||
docs/
|
||||
Ex/vi documentation, both current and historic.
|
||||
|
||||
USD.doc/
|
||||
[USD stands for "User's Supplementary Documents".]
|
||||
|
||||
edit/ Roff source for "Edit: A tutorial". This document
|
||||
was USD:14 in the 4.3BSD manuals, but was not
|
||||
distributed with 4.4BSD.
|
||||
|
||||
exref/ Roff source for "Ex Reference Manual -- Version
|
||||
3.7". This document was USD:16 in the 4.3BSD
|
||||
manuals, and USD tabbed 12 in the 4.4BSD manuals.
|
||||
|
||||
vi.man/ Roff source for a UNIX manual page for nex/nvi.
|
||||
An updated version of the 4.4BSD manual page.
|
||||
|
||||
vi.ref/ Roff source for the nex/nvi reference document.
|
||||
An updated version of the 4.4BSD document, USD
|
||||
tabbed 13.
|
||||
|
||||
vitut/ Roff source for "An Introduction to Display
|
||||
Editing with Vi". This document was USD:15 in
|
||||
the 4.3BSD manuals, but was not distributed with
|
||||
4.4BSD. It includes the historic "Vi Quick
|
||||
Reference" card.
|
||||
|
||||
|
||||
PostScript preformatted versions of the nex/nvi reference
|
||||
manual and manual page are in the files named with a ".ps"
|
||||
suffix, in their respective source directories. Flat text
|
||||
preformatted versions of the nex/nvi reference manual and
|
||||
manual page are in the files named with a ".txt" suffix,
|
||||
in their respective source directories.
|
||||
|
||||
changelog -- Log of changes from version to version.
|
||||
features -- Todo list, suggested features list.
|
||||
internals/
|
||||
autowrite -- Vi autowrite option discussion.
|
||||
context -- Previous context marks discussion.
|
||||
gdb.script -- GDB debugging scripts.
|
||||
input -- Vi maps, executable buffers, and input discussion.
|
||||
openmode -- Open mode behaviors.
|
||||
quoting -- Vi quoting discussion.
|
||||
structures -- Out-of-date nvi internal structure description.
|
||||
tutorial/ -- Historic vi tutorial(s), of unknown quality.
|
||||
|
||||
ex/
|
||||
The ex source code. Because vi has the colon command, lots of
|
||||
this code is used by vi. Generally, if functionality is shared
|
||||
by both ex and vi, it's in the ex directory. If it's vi only,
|
||||
it's in the vi directory. Files are generally named by the
|
||||
command(s) they support, but occasionally with a name that
|
||||
describes their functionality.
|
||||
|
||||
version.h -- Version information.
|
||||
|
||||
include/
|
||||
Replacement include files:
|
||||
|
||||
bitstring.h -- The 4.4BSD bitstring operations.
|
||||
sys/queue.h -- The 4.4BSD queue operations.
|
||||
|
||||
perl_api/
|
||||
Source code supporting the Perl scripting language for nvi.
|
||||
|
||||
perl_scripts/
|
||||
Scripts for Perl included with nvi.
|
||||
|
||||
regex/
|
||||
Henry Spencer's POSIX 1003.2 regular expression (RE) library.
|
||||
|
||||
tcl_api/
|
||||
Source code supporting the Tcl scripting language for nvi.
|
||||
|
||||
tcl_scripts/
|
||||
Scripts for Tcl included with nvi.
|
||||
|
||||
tk/
|
||||
Source files for nvi's Tk screen support.
|
||||
|
||||
init.tcl -- Vi startup tcl script.
|
||||
|
||||
vi/
|
||||
The vi source code.
|
@ -1,6 +1,14 @@
|
||||
The vi program is freely redistributable. You are welcome to copy, modify
|
||||
and share it with others under the conditions listed in this file. If any
|
||||
company (not any individual!) finds vi sufficiently useful that you would
|
||||
have purchased it, or if any company wishes to redistribute it, contributions
|
||||
to the authors would be appreciated.
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1991, 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@ -29,17 +37,4 @@
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)script.h 8.2 (Berkeley) 4/17/94
|
||||
*/
|
||||
|
||||
struct _script {
|
||||
pid_t sh_pid; /* Shell pid. */
|
||||
int sh_master; /* Master pty fd. */
|
||||
int sh_slave; /* Slave pty fd. */
|
||||
char *sh_prompt; /* Prompt. */
|
||||
size_t sh_prompt_len; /* Prompt length. */
|
||||
char sh_name[64]; /* Pty name */
|
||||
struct winsize sh_win; /* Window size. */
|
||||
struct termios sh_term; /* Terminal information. */
|
||||
};
|
113
contrib/nvi/README
Normal file
113
contrib/nvi/README
Normal file
@ -0,0 +1,113 @@
|
||||
# @(#)README 8.147 (Berkeley) 10/19/96
|
||||
|
||||
This is the README for nex/nvi, a freely redistributable implementation
|
||||
of the ex/vi text editors originally distributed as part of the Fourth
|
||||
Berkeley Software Distribution (4BSD), by the University of California,
|
||||
Berkeley.
|
||||
|
||||
The source code for nex/nvi can be retrieved by using anonymous ftp to
|
||||
ftp.cs.berkeley.edu. The file ucb/4bsd/nvi.tar.gz is the gzip'd archive,
|
||||
of version 1.71 of nex/nvi. This version is believed to be stable and
|
||||
problem free. The file ucb/4bsd/nvi-###.ALPHA.tar.gz is a gzip'd archive
|
||||
of the current alpha-test release of nex/nvi. This version reflects the
|
||||
current development tree, and will be more likely to have problems.
|
||||
|
||||
See the file:
|
||||
build/README for information on building nvi.
|
||||
LAYOUT for a description of where everything is.
|
||||
LICENSE for the copyright and redistribution terms.
|
||||
|
||||
If you have any questions about nex/nvi, problems with it, or concerns
|
||||
about the conditions for redistribution, please contact me:
|
||||
|
||||
Keith Bostic +1-508-287-4781
|
||||
394 E. Riding Dr. bostic@bostic.com
|
||||
Carlisle, MA 01741
|
||||
USA
|
||||
|
||||
Keith Bostic
|
||||
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
o This software is several years old and is the product of many folks' work.
|
||||
|
||||
This software was originally derived from software contributed to
|
||||
the University of California, Berkeley by Steve Kirkendall, the
|
||||
author of the vi clone elvis. Without his work, this work would
|
||||
have been far more difficult.
|
||||
|
||||
IEEE POSIX 1003.2 style regular expression support is courtesy of
|
||||
Henry Spencer, for which I am *very* grateful.
|
||||
|
||||
Elan Amir did the original 4BSD curses work that made it possible
|
||||
to support a full-screen editor using curses.
|
||||
|
||||
George Neville-Neil added the Tcl interpreter, and the initial
|
||||
interpreter design was his.
|
||||
|
||||
Sven Verdoolaege added the Perl interpreter.
|
||||
|
||||
Rob Mayoff provided the original Cscope support.
|
||||
|
||||
o Many, many people suggested enhancements, and provided bug reports and
|
||||
testing, far too many to individually thank.
|
||||
|
||||
o From the original vi acknowledgements, by William Joy and Mark Horton:
|
||||
|
||||
Bruce Englar encouraged the early development of this display
|
||||
editor. Peter Kessler helped bring sanity to version 2's
|
||||
command layout. Bill Joy wrote versions 1 and 2.0 through 2.7,
|
||||
and created the framework that users see in the present editor.
|
||||
Mark Horton added macros and other features and made the editor
|
||||
work on a large number of terminals and Unix systems.
|
||||
|
||||
o And...
|
||||
The financial support of UUNET Communications Services is gratefully
|
||||
acknowledged.
|
||||
|
||||
=-=-=-=-=-=-=-=-=-=-=
|
||||
o Status:
|
||||
|
||||
This software is in beta test, and it's pretty stable. Almost all of the
|
||||
historic functionality in ex/vi is there, the only major missing pieces
|
||||
are open mode and the lisp edit option.
|
||||
|
||||
Nvi is largely 8-bit clean. This isn't difficult to fix, and was left in
|
||||
during initial development to keep things simple. Wide character support
|
||||
will be integrated at the same time that it is made fully 8-bit clean.
|
||||
|
||||
There aren't a lot of new features in nex/nvi, but there are a few things
|
||||
you might like. The "Additional Features" section of the reference work
|
||||
(docs/USD.doc/vi.ref/vi.ref.txt, docs/USD.doc/vi.ref/vi.ref.ps) has more
|
||||
information.
|
||||
|
||||
=-=-=-=-=-=-=-=-=-=-=
|
||||
o Debugging:
|
||||
|
||||
Code fixes are greatly appreciated, of course, but if you can't provide
|
||||
them, please email me as much information as you can as to how I might
|
||||
reproduce the bug, and I'll try to fix it locally. Stack traces of core
|
||||
dumps are only rarely helpful -- an example file with a set of keystrokes
|
||||
that causes the problem is almost invariably necessary. I know it's
|
||||
annoying, but simply playing with the bug until you can reproduce it at
|
||||
will, with minimal keystrokes, is immensely helpful to me.
|
||||
|
||||
Please include the following in the bug report;
|
||||
|
||||
o The version of nvi you're running (use :version to get it).
|
||||
o The row/column dimensions of the screen (80 x 32).
|
||||
o Unless you're confident that they're not part of the problem,
|
||||
your startup files (.exrc, .nexrc) and the environment variable
|
||||
(EXINIT, NEXINIT) values. (Cutting and pasting the output
|
||||
of ":set all" is usually sufficient.)
|
||||
|
||||
If you want to do your own debugging, recompile the program with DEBUG
|
||||
defined. (Configuring with --enable-debug will do this for you.) This
|
||||
turns on the additional command-line option -D, that takes either s or w
|
||||
as an argument. The option -Ds causes nvi to ignore the EXINIT and
|
||||
.exrc files on startup, and -Dw causes nvi to print out the process id
|
||||
and wait for you to enter a <carriage-return> to continue.
|
||||
|
||||
If you're running a memory checker (e.g. Purify) on nvi, you will first
|
||||
want to recompile everything with "-DPURIFY" set in the CFLAGS. This
|
||||
initializes allocated pages in the DB code, and free's allocated memory
|
||||
at the end of the nvi execution.
|
473
contrib/nvi/build/ExtUtils/Embed.pm
Normal file
473
contrib/nvi/build/ExtUtils/Embed.pm
Normal file
@ -0,0 +1,473 @@
|
||||
# $Id: Embed.pm,v 1.17 1996/07/02 13:48:17 dougm Exp $
|
||||
require 5.002;
|
||||
|
||||
package ExtUtils::Embed;
|
||||
require Exporter;
|
||||
require FileHandle;
|
||||
use Config;
|
||||
use Getopt::Std;
|
||||
|
||||
#Only when we need them
|
||||
#require ExtUtils::MakeMaker;
|
||||
#require ExtUtils::Liblist;
|
||||
|
||||
use vars qw(@ISA @EXPORT $VERSION
|
||||
@Extensions $Verbose $lib_ext
|
||||
$opt_o $opt_s
|
||||
);
|
||||
use strict;
|
||||
|
||||
$VERSION = sprintf("%d.%02d", q$Revision: 1.17 $ =~ /(\d+)\.(\d+)/);
|
||||
#for the namespace change
|
||||
$Devel::embed::VERSION = "99.99";
|
||||
|
||||
sub Version { $VERSION; }
|
||||
|
||||
@ISA = qw(Exporter);
|
||||
@EXPORT = qw(&xsinit &ldopts
|
||||
&ccopts &ccflags &ccdlflags &perl_inc
|
||||
&xsi_header &xsi_protos &xsi_body);
|
||||
|
||||
#let's have Miniperl borrow from us instead
|
||||
#require ExtUtils::Miniperl;
|
||||
#*canon = \&ExtUtils::Miniperl::canon;
|
||||
|
||||
$Verbose = 0;
|
||||
$lib_ext = $Config{lib_ext} || '.a';
|
||||
|
||||
sub xsinit {
|
||||
my($file, $std, $mods) = @_;
|
||||
my($fh,@mods,%seen);
|
||||
$file ||= "perlxsi.c";
|
||||
|
||||
if (@_) {
|
||||
@mods = @$mods if $mods;
|
||||
}
|
||||
else {
|
||||
getopts('o:s:');
|
||||
$file = $opt_o if defined $opt_o;
|
||||
$std = $opt_s if defined $opt_s;
|
||||
@mods = @ARGV;
|
||||
}
|
||||
$std = 1 unless scalar @mods;
|
||||
|
||||
if ($file eq "STDOUT") {
|
||||
$fh = \*STDOUT;
|
||||
}
|
||||
else {
|
||||
$fh = new FileHandle "> $file";
|
||||
}
|
||||
|
||||
push(@mods, static_ext()) if defined $std;
|
||||
@mods = grep(!$seen{$_}++, @mods);
|
||||
|
||||
print $fh &xsi_header();
|
||||
print $fh "EXTERN_C void xs_init _((void));\n\n";
|
||||
print $fh &xsi_protos(@mods);
|
||||
|
||||
print $fh "\nEXTERN_C void\nxs_init()\n{\n";
|
||||
print $fh &xsi_body(@mods);
|
||||
print $fh "}\n";
|
||||
|
||||
}
|
||||
|
||||
sub xsi_header {
|
||||
return <<EOF;
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <EXTERN.h>
|
||||
#include <perl.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
# ifndef EXTERN_C
|
||||
# define EXTERN_C extern "C"
|
||||
# endif
|
||||
#else
|
||||
# ifndef EXTERN_C
|
||||
# define EXTERN_C extern
|
||||
# endif
|
||||
#endif
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
sub xsi_protos {
|
||||
my(@exts) = @_;
|
||||
my(@retval,%seen);
|
||||
|
||||
foreach $_ (@exts){
|
||||
my($pname) = canon('/', $_);
|
||||
my($mname, $cname);
|
||||
($mname = $pname) =~ s!/!::!g;
|
||||
($cname = $pname) =~ s!/!__!g;
|
||||
my($ccode) = "EXTERN_C void boot_${cname} _((CV* cv));\n";
|
||||
next if $seen{$ccode}++;
|
||||
push(@retval, $ccode);
|
||||
}
|
||||
return join '', @retval;
|
||||
}
|
||||
|
||||
sub xsi_body {
|
||||
my(@exts) = @_;
|
||||
my($pname,@retval,%seen);
|
||||
my($dl) = canon('/','DynaLoader');
|
||||
push(@retval, "\tdXSUB_SYS;\n") if $] > 5.002;
|
||||
push(@retval, "\tchar *file = __FILE__;\n\n");
|
||||
|
||||
foreach $_ (@exts){
|
||||
my($pname) = canon('/', $_);
|
||||
my($mname, $cname, $ccode);
|
||||
($mname = $pname) =~ s!/!::!g;
|
||||
($cname = $pname) =~ s!/!__!g;
|
||||
if ($pname eq $dl){
|
||||
# Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'!
|
||||
# boot_DynaLoader is called directly in DynaLoader.pm
|
||||
$ccode = "\t/* DynaLoader is a special case */\n\tnewXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n";
|
||||
push(@retval, $ccode) unless $seen{$ccode}++;
|
||||
} else {
|
||||
$ccode = "\tnewXS(\"${mname}::bootstrap\", boot_${cname}, file);\n";
|
||||
push(@retval, $ccode) unless $seen{$ccode}++;
|
||||
}
|
||||
}
|
||||
return join '', @retval;
|
||||
}
|
||||
|
||||
sub static_ext {
|
||||
unless (scalar @Extensions) {
|
||||
@Extensions = sort split /\s+/, $Config{static_ext};
|
||||
unshift @Extensions, qw(DynaLoader);
|
||||
}
|
||||
@Extensions;
|
||||
}
|
||||
|
||||
sub ldopts {
|
||||
require ExtUtils::MakeMaker;
|
||||
require ExtUtils::Liblist;
|
||||
my($std,$mods,$link_args,$path) = @_;
|
||||
my(@mods,@link_args,@argv);
|
||||
my($dllib,$config_libs,@potential_libs,@path);
|
||||
local($") = ' ' unless $" eq ' ';
|
||||
my $MM = bless {} => 'MY';
|
||||
if (scalar @_) {
|
||||
@link_args = @$link_args if $link_args;
|
||||
@mods = @$mods if $mods;
|
||||
}
|
||||
else {
|
||||
@argv = @ARGV;
|
||||
#hmm
|
||||
while($_ = shift @argv) {
|
||||
/^-std$/ && do { $std = 1; next; };
|
||||
/^--$/ && do { @link_args = @argv; last; };
|
||||
/^-I(.*)/ && do { $path = $1 || shift @argv; next; };
|
||||
push(@mods, $_);
|
||||
}
|
||||
}
|
||||
$std = 1 unless scalar @link_args;
|
||||
@path = $path ? split(/:/, $path) : @INC;
|
||||
|
||||
push(@potential_libs, @link_args) if scalar @link_args;
|
||||
push(@potential_libs, $Config{libs}) if defined $std;
|
||||
|
||||
push(@mods, static_ext()) if $std;
|
||||
|
||||
my($mod,@ns,$root,$sub,$extra,$archive,@archives);
|
||||
print STDERR "Searching (@path) for archives\n" if $Verbose;
|
||||
foreach $mod (@mods) {
|
||||
@ns = split('::', $mod);
|
||||
$sub = $ns[-1];
|
||||
$root = $MM->catdir(@ns);
|
||||
|
||||
print STDERR "searching for '$sub${lib_ext}'\n" if $Verbose;
|
||||
foreach (@path) {
|
||||
next unless -e ($archive = $MM->catdir($_,"auto",$root,"$sub$lib_ext"));
|
||||
push @archives, $archive;
|
||||
if(-e ($extra = $MM->catdir($_,"auto",$root,"extralibs.ld"))) {
|
||||
local(*FH);
|
||||
if(open(FH, $extra)) {
|
||||
my($libs) = <FH>; chomp $libs;
|
||||
push @potential_libs, split /\s+/, $libs;
|
||||
}
|
||||
else {
|
||||
warn "Couldn't open '$extra'";
|
||||
}
|
||||
}
|
||||
last;
|
||||
}
|
||||
}
|
||||
#print STDERR "\@potential_libs = @potential_libs\n";
|
||||
|
||||
my($extralibs, $bsloadlibs, $ldloadlibs, $ld_run_path) =
|
||||
$MM->ext(join ' ',
|
||||
$MM->catdir("-L$Config{archlib}", "CORE"), " -lperl",
|
||||
@potential_libs);
|
||||
|
||||
my $ld_or_bs = $bsloadlibs || $ldloadlibs;
|
||||
print STDERR "bs: $bsloadlibs ** ld: $ldloadlibs" if $Verbose;
|
||||
my $linkage = "$Config{ldflags} @archives $ld_or_bs";
|
||||
print STDERR "ldopts: '$linkage'\n" if $Verbose;
|
||||
|
||||
return $linkage if scalar @_;
|
||||
print "$linkage\n";
|
||||
}
|
||||
|
||||
sub ccflags {
|
||||
print " $Config{ccflags} ";
|
||||
}
|
||||
|
||||
sub ccdlflags {
|
||||
print " $Config{ccdlflags} ";
|
||||
}
|
||||
|
||||
sub perl_inc {
|
||||
print " -I$Config{archlib}/CORE ";
|
||||
}
|
||||
|
||||
sub ccopts {
|
||||
ccflags;
|
||||
ccdlflags;
|
||||
perl_inc;
|
||||
}
|
||||
|
||||
sub canon {
|
||||
my($as, @ext) = @_;
|
||||
foreach(@ext) {
|
||||
# might be X::Y or lib/auto/X/Y/Y.a
|
||||
next if s!::!/!g;
|
||||
s:^(lib|ext)/(auto/)?::;
|
||||
s:/\w+\.\w+$::;
|
||||
}
|
||||
grep(s:/:$as:, @ext) if ($as ne '/');
|
||||
@ext;
|
||||
}
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
ExtUtils::Embed - Utilities for embedding Perl in C/C++ applications
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
|
||||
perl -MExtUtils::Embed -e xsinit
|
||||
perl -MExtUtils::Embed -e ldopts
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
ExtUtils::Embed provides utility functions for embedding a Perl interpreter
|
||||
and extensions in your C/C++ applications.
|
||||
Typically, an application B<Makefile> will invoke ExtUtils::Embed
|
||||
functions while building your application.
|
||||
|
||||
=head1 @EXPORT
|
||||
|
||||
ExtUtils::Embed exports the following functions:
|
||||
|
||||
L<xsinit()>, L<ldopts()>, L<ccopts()>, L<perl_inc()>, L<ccflags()>,
|
||||
L<ccdlflags()>, L<xsi_header()>, L<xsi_protos()>, L<xsi_body()>
|
||||
|
||||
=head1 FUNCTIONS
|
||||
|
||||
=item xsinit()
|
||||
|
||||
Generate C/C++ code for the XS intializer function.
|
||||
|
||||
When invoked as C<`perl -MExtUtils::Embed -e xsinit --`>
|
||||
the following options are recognized:
|
||||
|
||||
B<-o> <output filename> (Defaults to B<perlxsi.c>)
|
||||
|
||||
B<-o STDOUT> will print to STDOUT.
|
||||
|
||||
B<-std> (Write code for extensions that are linked with the current Perl.)
|
||||
|
||||
Any additional arguments are expected to be names of modules
|
||||
to generate code for.
|
||||
|
||||
When invoked with parameters the following are accepted and optional:
|
||||
|
||||
C<xsinit($filename,$std,[@modules])>
|
||||
|
||||
Where,
|
||||
|
||||
B<$filename> is equivalent to the B<-o> option.
|
||||
|
||||
B<$std> is boolean, equivalent to the B<-std> option.
|
||||
|
||||
B<[@modules]> is an array ref, same as additional arguments mentioned above.
|
||||
|
||||
=item Examples
|
||||
|
||||
|
||||
perl -MExtUtils::Embed -e xsinit -- -o xsinit.c Socket
|
||||
|
||||
|
||||
This will generate code with an B<xs_init> function that glues the perl B<Socket::bootstrap> function
|
||||
to the C B<boot_Socket> function and writes it to a file named "xsinit.c".
|
||||
|
||||
Note that B<DynaLoader> is a special case where it must call B<boot_DynaLoader> directly.
|
||||
|
||||
perl -MExtUtils::Embed -e xsinit
|
||||
|
||||
|
||||
This will generate code for linking with B<DynaLoader> and
|
||||
each static extension found in B<$Config{static_ext}>.
|
||||
The code is written to the default file name B<perlxsi.c>.
|
||||
|
||||
|
||||
perl -MExtUtils::Embed -e xsinit -- -o xsinit.c -std DBI DBD::Oracle
|
||||
|
||||
|
||||
Here, code is written for all the currently linked extensions along with code
|
||||
for B<DBI> and B<DBD::Oracle>.
|
||||
|
||||
If you have a working B<DynaLoader> then there is rarely any need to statically link in any
|
||||
other extensions.
|
||||
|
||||
=item ldopts()
|
||||
|
||||
Output arguments for linking the Perl library and extensions to your
|
||||
application.
|
||||
|
||||
When invoked as C<`perl -MExtUtils::Embed -e ldopts --`>
|
||||
the following options are recognized:
|
||||
|
||||
B<-std>
|
||||
|
||||
Output arguments for linking the Perl library and any extensions linked
|
||||
with the current Perl.
|
||||
|
||||
B<-I> <path1:path2>
|
||||
|
||||
Search path for ModuleName.a archives.
|
||||
Default path is B<@INC>.
|
||||
Library archives are expected to be found as
|
||||
B</some/path/auto/ModuleName/ModuleName.a>
|
||||
For example, when looking for B<Socket.a> relative to a search path,
|
||||
we should find B<auto/Socket/Socket.a>
|
||||
|
||||
When looking for B<DBD::Oracle> relative to a search path,
|
||||
we should find B<auto/DBD/Oracle/Oracle.a>
|
||||
|
||||
Keep in mind, you can always supply B</my/own/path/ModuleName.a>
|
||||
as an additional linker argument.
|
||||
|
||||
B<--> <list of linker args>
|
||||
|
||||
Additional linker arguments to be considered.
|
||||
|
||||
Any additional arguments found before the B<--> token
|
||||
are expected to be names of modules to generate code for.
|
||||
|
||||
When invoked with parameters the following are accepted and optional:
|
||||
|
||||
C<ldopts($std,[@modules],[@link_args],$path)>
|
||||
|
||||
Where,
|
||||
|
||||
B<$std> is boolean, equivalent to the B<-std> option.
|
||||
|
||||
B<[@modules]> is equivalent to additional arguments found before the B<--> token.
|
||||
|
||||
B<[@link_args]> is equivalent to arguments found after the B<--> token.
|
||||
|
||||
B<$path> is equivalent to the B<-I> option.
|
||||
|
||||
In addition, when ldopts is called with parameters, it will return the argument string
|
||||
rather than print it to STDOUT.
|
||||
|
||||
=item Examples
|
||||
|
||||
|
||||
perl -MExtUtils::Embed -e ldopts
|
||||
|
||||
|
||||
This will print arguments for linking with B<libperl.a>, B<DynaLoader> and
|
||||
extensions found in B<$Config{static_ext}>. This includes libraries
|
||||
found in B<$Config{libs}> and the first ModuleName.a library
|
||||
for each extension that is found by searching B<@INC> or the path
|
||||
specifed by the B<-I> option.
|
||||
In addition, when ModuleName.a is found, additional linker arguments
|
||||
are picked up from the B<extralibs.ld> file in the same directory.
|
||||
|
||||
|
||||
perl -MExtUtils::Embed -e ldopts -- -std Socket
|
||||
|
||||
|
||||
This will do the same as the above example, along with printing additional arguments for linking with the B<Socket> extension.
|
||||
|
||||
|
||||
perl -MExtUtils::Embed -e ldopts -- DynaLoader
|
||||
|
||||
|
||||
This will print arguments for linking with just the B<DynaLoader> extension
|
||||
and B<libperl.a>.
|
||||
|
||||
|
||||
perl -MExtUtils::Embed -e ldopts -- -std Msql -- -L/usr/msql/lib -lmsql
|
||||
|
||||
|
||||
Any arguments after the second '--' token are additional linker
|
||||
arguments that will be examined for potential conflict. If there is no
|
||||
conflict, the additional arguments will be part of the output.
|
||||
|
||||
|
||||
=item perl_inc()
|
||||
|
||||
For including perl header files this function simply prints:
|
||||
|
||||
-I $Config{archlib}/CORE
|
||||
|
||||
So, rather than having to say:
|
||||
|
||||
perl -MConfig -e 'print "-I $Config{archlib}/CORE"'
|
||||
|
||||
Just say:
|
||||
|
||||
perl -MExtUtils::Embed -e perl_inc
|
||||
|
||||
=item ccflags(), ccdlflags()
|
||||
|
||||
These functions simply print $Config{ccflags} and $Config{ccdlflags}
|
||||
|
||||
=item ccopts()
|
||||
|
||||
This function combines perl_inc(), ccflags() and ccdlflags() into one.
|
||||
|
||||
=item xsi_header()
|
||||
|
||||
This function simply returns a string defining the same B<EXTERN_C> macro as
|
||||
B<perlmain.c> along with #including B<perl.h> and B<EXTERN.h>.
|
||||
|
||||
=item xsi_protos(@modules)
|
||||
|
||||
This function returns a string of B<boot_$ModuleName> prototypes for each @modules.
|
||||
|
||||
=item xsi_body(@modules)
|
||||
|
||||
This function returns a string of calls to B<newXS()> that glue the module B<bootstrap>
|
||||
function to B<boot_ModuleName> for each @modules.
|
||||
|
||||
B<xsinit()> uses the xsi_* functions to generate most of it's code.
|
||||
|
||||
=head1 EXAMPLES
|
||||
|
||||
For examples on how to use B<ExtUtils::Embed> for building C/C++ applications
|
||||
with embedded perl, see the eg/ directory and the I<perlembed> man page.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
the I<perlembed> man page
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Doug MacEachern <dougm@osf.org>
|
||||
|
||||
Based on ideas from Tim Bunce <Tim.Bunce@ig.co.uk> and
|
||||
B<minimod.pl> by Andreas Koenig <k@anna.in-berlin.de> and Tim Bunce.
|
||||
|
||||
=cut
|
||||
|
630
contrib/nvi/build/Makefile.in
Normal file
630
contrib/nvi/build/Makefile.in
Normal file
@ -0,0 +1,630 @@
|
||||
# @(#)Makefile.in 8.75 (Berkeley) 10/23/96
|
||||
|
||||
srcdir= @srcdir@/..
|
||||
CC= @CC@
|
||||
OPTFLAG=@OPTFLAG@
|
||||
CFLAGS= -c $(OPTFLAG) @CFLAGS@ -I. -I$(srcdir)/include @CPPFLAGS@
|
||||
LDFLAGS=@LDFLAGS@
|
||||
PERL= @vi_cv_path_perl@
|
||||
PERLLIB=@vi_cv_perllib@
|
||||
SHRPENV=@shrpenv@
|
||||
|
||||
# Objects
|
||||
COBJS= addbytes.o addch.o box.o clear.o clrtobot.o clrtoeol.o \
|
||||
cr_put.o ctrace.o cur_hash.o curses.o delch.o deleteln.o delwin.o \
|
||||
erase.o fullname.o getch.o getstr.o id_subwins.o idlok.o initscr.o \
|
||||
insch.o insertln.o longname.o move.o mvwin.o newwin.o overlay.o \
|
||||
overwrite.o putchar.o refresh.o scroll.o setterm.o standout.o \
|
||||
toucholap.o touchwin.o tscroll.o tstp.o tty.o unctrl.o waddnstr.o
|
||||
CLOBJS= cl_bsd.o cl_funcs.o cl_main.o cl_read.o cl_screen.o cl_term.o
|
||||
DBOBJS= db.o mpool.o \
|
||||
bt_close.o bt_conv.o bt_debug.o bt_delete.o bt_get.o bt_open.o \
|
||||
bt_overflow.o bt_page.o bt_put.o bt_search.o bt_seq.o \
|
||||
bt_split.o bt_utils.o \
|
||||
rec_close.o rec_delete.o rec_get.o rec_open.o rec_put.o \
|
||||
rec_search.o rec_seq.o rec_utils.o
|
||||
REOBJS= regcomp.o regerror.o regexec.o regfree.o
|
||||
TKOBJS= tk_funcs.o tk_main.o tk_read.o tk_screen.o tk_term.o tk_util.o
|
||||
VIOBJS= cut.o delete.o ex.o ex_abbrev.o ex_append.o ex_args.o ex_argv.o \
|
||||
ex_at.o ex_bang.o ex_cd.o ex_cmd.o ex_cscope.o ex_delete.o \
|
||||
ex_display.o ex_edit.o ex_equal.o ex_file.o ex_filter.o \
|
||||
ex_global.o ex_init.o ex_join.o ex_map.o ex_mark.o ex_mkexrc.o \
|
||||
ex_move.o ex_open.o ex_perl.o ex_preserve.o ex_print.o ex_put.o \
|
||||
ex_quit.o ex_read.o ex_screen.o ex_script.o ex_set.o ex_shell.o \
|
||||
ex_shift.o ex_source.o ex_stop.o ex_subst.o ex_tag.o ex_tcl.o \
|
||||
ex_txt.o ex_undo.o ex_usage.o ex_util.o ex_version.o ex_visual.o \
|
||||
ex_write.o ex_yank.o ex_z.o exf.o getc.o key.o line.o log.o main.o \
|
||||
mark.o msg.o options.o options_f.o put.o recover.o screen.o \
|
||||
search.o seq.o util.o v_at.o v_ch.o v_cmd.o v_delete.o v_ex.o \
|
||||
v_increment.o v_init.o v_itxt.o v_left.o v_mark.o v_match.o \
|
||||
v_paragraph.o v_put.o v_redraw.o v_replace.o v_right.o v_screen.o \
|
||||
v_scroll.o v_search.o v_section.o v_sentence.o v_status.o v_txt.o \
|
||||
v_ulcase.o v_undo.o v_util.o v_word.o v_xchar.o v_yank.o v_z.o \
|
||||
v_zexit.o vi.o vs_line.o vs_msg.o vs_refresh.o vs_relative.o \
|
||||
vs_smap.o vs_split.o
|
||||
|
||||
all: nvi @tknvi@
|
||||
|
||||
NVIALL= $(CLOBJS) $(VIOBJS) @cobjs@ @LIBOBJS@
|
||||
nvi nex: $(NVIALL)
|
||||
$(SHRPENV) $(CC) $(LDFLAGS) -o $@ $(NVIALL) @LIBS@
|
||||
-rm -f nex
|
||||
ln $@ nex
|
||||
|
||||
TKALL= $(TKOBJS) $(VIOBJS) @LIBOBJS@
|
||||
tknvi: $(TKALL)
|
||||
$(SHRPENV) $(CC) $(LDFLAGS) -o $@ $(TKALL) @TKLIBS@
|
||||
|
||||
chmod= @vi_cv_path_chmod@
|
||||
cp= @vi_cv_path_cp@
|
||||
ln= @vi_cv_path_ln@
|
||||
mkdir= @vi_cv_path_mkdir@
|
||||
rm= @vi_cv_path_rm@
|
||||
strip= @vi_cv_path_strip@
|
||||
|
||||
prefix= @prefix@
|
||||
bindir= @bindir@
|
||||
datadir=@datadir@
|
||||
mandir= @mandir@
|
||||
exec_prefix=@exec_prefix@
|
||||
|
||||
dmode= 755
|
||||
emode= 555
|
||||
fmode= 444
|
||||
|
||||
transform=@program_transform_name@
|
||||
|
||||
install: all install_common
|
||||
@echo "Installing vi, ex, view: $(bindir) ..."
|
||||
[ -d $(bindir) ] || \
|
||||
($(mkdir) $(bindir) && $(chmod) $(dmode) $(bindir))
|
||||
cd $(bindir) && $(rm) -f `echo vi | sed '$(transform)'`
|
||||
$(cp) nvi $(bindir)/`echo vi | sed '$(transform)'`
|
||||
cd $(bindir) && [ -f $(strip) ] && \
|
||||
$(strip) `echo vi | sed '$(transform)'`
|
||||
cd $(bindir) && $(chmod) $(emode) `echo vi | sed '$(transform)'`
|
||||
cd $(bindir) && $(rm) -f `echo ex | sed '$(transform)'`
|
||||
cd $(bindir) && $(rm) -f `echo view | sed '$(transform)'`
|
||||
cd $(bindir) && $(ln) \
|
||||
`echo vi | sed '$(transform)'` `echo ex | sed '$(transform)'`
|
||||
cd $(bindir) && $(ln) \
|
||||
`echo vi | sed '$(transform)'` `echo view | sed '$(transform)'`
|
||||
[ -d $(mandir) ] || \
|
||||
($(mkdir) $(mandir) && $(chmod) $(dmode) $(mandir))
|
||||
[ -d $(mandir)/cat1 ] || \
|
||||
($(mkdir) $(mandir)/cat1 && $(chmod) $(dmode) $(mandir)/cat1)
|
||||
@echo "Installing man pages: $(mandir) ..."
|
||||
cd $(mandir)/cat1 && $(rm) -f `echo vi.0 | sed '$(transform)'`
|
||||
$(cp) $(srcdir)/docs/USD.doc/vi.man/vi.0 \
|
||||
$(mandir)/cat1/`echo vi.0 | sed '$(transform)'`
|
||||
cd $(mandir)/cat1 && $(chmod) $(fmode) `echo vi.0 | sed '$(transform)'`
|
||||
cd $(mandir)/cat1 && $(rm) -f `echo ex.0 | sed '$(transform)'`
|
||||
cd $(mandir)/cat1 && $(rm) -f `echo view.0 | sed '$(transform)'`
|
||||
cd $(mandir)/cat1 && $(ln) \
|
||||
`echo vi.0 | sed '$(transform)'` `echo ex.0 | sed '$(transform)'`
|
||||
cd $(mandir)/cat1 && $(ln) \
|
||||
`echo vi.0 | sed '$(transform)'` `echo view.0 | sed '$(transform)'`
|
||||
[ -d $(mandir)/man1 ] || \
|
||||
($(mkdir) $(mandir)/man1 && $(chmod) $(dmode) $(mandir)/man1)
|
||||
cd $(mandir)/man1 && $(rm) -f `echo vi.1 | sed '$(transform)'`
|
||||
$(cp) $(srcdir)/docs/USD.doc/vi.man/vi.1 \
|
||||
$(mandir)/man1/`echo vi.1 | sed '$(transform)'`
|
||||
cd $(mandir)/man1 && $(chmod) $(fmode) `echo vi.1 | sed '$(transform)'`
|
||||
cd $(mandir)/man1 && $(rm) -f `echo ex.1 | sed '$(transform)'`
|
||||
cd $(mandir)/man1 && $(rm) -f `echo view.1 | sed '$(transform)'`
|
||||
cd $(mandir)/man1 && $(ln) \
|
||||
`echo vi.1 | sed '$(transform)'` `echo ex.1 | sed '$(transform)'`
|
||||
cd $(mandir)/man1 && $(ln) \
|
||||
`echo vi.1 | sed '$(transform)'` `echo view.1 | sed '$(transform)'`
|
||||
|
||||
cat= dutch english french german ru_SU.KOI8-R spanish swedish
|
||||
install_common:
|
||||
[ -f $(chmod) ]
|
||||
[ -f $(cp) ]
|
||||
[ -f $(ln) ]
|
||||
[ -f $(mkdir) ]
|
||||
[ -f $(rm) ]
|
||||
[ -d $(prefix) ] || \
|
||||
($(mkdir) $(prefix) && $(chmod) $(dmode) $(prefix))
|
||||
[ -d $(exec_prefix) ] || \
|
||||
($(mkdir) $(exec_prefix) && $(chmod) $(dmode) $(exec_prefix))
|
||||
[ -d $(datadir) ] || \
|
||||
($(mkdir) $(datadir) && $(chmod) $(dmode) $(datadir))
|
||||
$(rm) -rf $(datadir)/vi
|
||||
$(mkdir) $(datadir)/vi && $(chmod) $(dmode) $(datadir)/vi
|
||||
@echo "Installing message catalogs: $(datadir)/vi/catalog ..."
|
||||
$(mkdir) $(datadir)/vi/catalog && \
|
||||
$(chmod) $(dmode) $(datadir)/vi/catalog
|
||||
(cd $(srcdir)/catalog && $(cp) $(cat) $(datadir)/vi/catalog && \
|
||||
cd $(datadir)/vi/catalog && $(chmod) $(fmode) *)
|
||||
@echo "Installing Perl scripts: $(datadir)/vi/perl ..."
|
||||
$(mkdir) $(datadir)/vi/perl && $(chmod) $(dmode) $(datadir)/vi/perl
|
||||
[ -f VI.pm ] && $(cp) VI.pm $(datadir)/vi/perl && \
|
||||
cd $(datadir)/vi/perl && $(chmod) $(fmode) VI.pm)
|
||||
(cd $(srcdir)/perl_scripts && $(cp) *.pl $(datadir)/vi/perl && \
|
||||
cd $(datadir)/vi/perl && $(chmod) $(fmode) *.pl)
|
||||
@echo "Installing Tcl scripts: $(datadir)/vi/tcl ..."
|
||||
$(mkdir) $(datadir)/vi/tcl && $(chmod) $(dmode) $(datadir)/vi/tcl
|
||||
(cd $(srcdir)/tcl_scripts && $(cp) *.tcl $(datadir)/vi/tcl && \
|
||||
cd $(datadir)/vi/tcl && $(chmod) $(fmode) *.tcl)
|
||||
@echo "Installing recover script: $(datadir)/vi/recover ..."
|
||||
($(cp) recover $(datadir)/vi/recover && \
|
||||
$(chmod) $(emode) $(datadir)/vi/recover)
|
||||
|
||||
uninstall:
|
||||
$(rm) -rf $(datadir)/vi
|
||||
cd $(bindir) && $(rm) -f `echo ex | sed '$(transform)'`
|
||||
cd $(bindir) && $(rm) -f `echo vi | sed '$(transform)'`
|
||||
cd $(bindir) && $(rm) -f `echo view | sed '$(transform)'`
|
||||
cd $(mandir)/cat1 && $(rm) -f `echo ex.0 | sed '$(transform)'`
|
||||
cd $(mandir)/cat1 && $(rm) -f `echo vi.0 | sed '$(transform)'`
|
||||
cd $(mandir)/cat1 && $(rm) -f `echo view.0 | sed '$(transform)'`
|
||||
cd $(mandir)/man1 && $(rm) -f `echo ex.1 | sed '$(transform)'`
|
||||
cd $(mandir)/man1 && $(rm) -f `echo vi.1 | sed '$(transform)'`
|
||||
cd $(mandir)/man1 && $(rm) -f `echo view.1 | sed '$(transform)'`
|
||||
|
||||
docs:
|
||||
cd $(srcdir)/docs/USD.doc/vi.ref && $(MAKE)
|
||||
cd $(srcdir)/docs/USD.doc/vi.man && $(MAKE)
|
||||
cd $(srcdir)/docs/USD.doc/edit && $(MAKE)
|
||||
cd $(srcdir)/docs/USD.doc/exref && $(MAKE)
|
||||
cd $(srcdir)/docs/USD.doc/vitut && $(MAKE)
|
||||
|
||||
clean:
|
||||
-rm -f *.core *.o memcpy.c perl.c
|
||||
-rm -f nex nvi tknvi core
|
||||
-rm -f $(COBJS) $(CLOBJS) $(DBOBJS) $(REOBJS)
|
||||
-rm -f $(TKOBJS) $(VIOBJS)
|
||||
|
||||
cleandocs:
|
||||
cd $(srcdir)/docs/USD.doc/vi.ref && $(MAKE) clean
|
||||
cd $(srcdir)/docs/USD.doc/vi.man && $(MAKE) clean
|
||||
cd $(srcdir)/docs/USD.doc/edit && $(MAKE) clean
|
||||
cd $(srcdir)/docs/USD.doc/exref && $(MAKE) clean
|
||||
cd $(srcdir)/docs/USD.doc/vitut && $(MAKE) clean
|
||||
|
||||
distclean maintainer-clean realclean: clean cleandocs
|
||||
-rm -f Makefile config.cache config.h config.log config.status
|
||||
-rm -f pathnames.h port.h
|
||||
|
||||
# Vi curses sources.
|
||||
cl_bsd.o: $(srcdir)/cl/cl_bsd.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
cl_funcs.o: $(srcdir)/cl/cl_funcs.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
cl_main.o: $(srcdir)/cl/cl_main.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
cl_read.o: $(srcdir)/cl/cl_read.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
cl_screen.o: $(srcdir)/cl/cl_screen.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
cl_term.o: $(srcdir)/cl/cl_term.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
|
||||
# Vi Tk sources.
|
||||
tk_funcs.o: $(srcdir)/tk/tk_funcs.c
|
||||
$(CC) $(CFLAGS) @XINCS@ $?
|
||||
tk_main.o: $(srcdir)/tk/tk_main.c
|
||||
$(CC) $(CFLAGS) @XINCS@ $?
|
||||
tk_read.o: $(srcdir)/tk/tk_read.c
|
||||
$(CC) $(CFLAGS) @XINCS@ $?
|
||||
tk_screen.o: $(srcdir)/tk/tk_screen.c
|
||||
$(CC) $(CFLAGS) @XINCS@ $?
|
||||
tk_term.o: $(srcdir)/tk/tk_term.c
|
||||
$(CC) $(CFLAGS) @XINCS@ $?
|
||||
tk_util.o: $(srcdir)/tk/tk_util.c
|
||||
$(CC) $(CFLAGS) @XINCS@ $?
|
||||
|
||||
# Vi Tcl/Perl interpreter sources.
|
||||
api.o: $(srcdir)/common/api.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
perl.c: $(srcdir)/perl_api/perl.xs $(srcdir)/perl_api/typemap
|
||||
echo "#define _PATH_PERLSCRIPTS \"$(datadir)/vi/perl\"" > $@
|
||||
$(PERL) $(PERLLIB)/ExtUtils/xsubpp -typemap \
|
||||
$(PERLLIB)/ExtUtils/typemap $(srcdir)/perl_api/perl.xs >> $@
|
||||
($(PERL) -ne 'print "sub $$1 {\$$curscr->$$1(\@_)}\n" \
|
||||
if /newXS\("VI::([^":]*)"/;' $@ ; echo "1;") > VI.pm
|
||||
perl.o: perl.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
perlsfio.o: $(srcdir)/perl_api/perlsfio.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
tcl.o: $(srcdir)/tcl_api/tcl.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
|
||||
# Vi sources.
|
||||
cut.o: $(srcdir)/common/cut.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
delete.o: $(srcdir)/common/delete.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
exf.o: $(srcdir)/common/exf.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
key.o: $(srcdir)/common/key.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
line.o: $(srcdir)/common/line.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
log.o: $(srcdir)/common/log.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
main.o: $(srcdir)/common/main.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
mark.o: $(srcdir)/common/mark.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
msg.o: $(srcdir)/common/msg.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
options.o: $(srcdir)/common/options.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
options_f.o: $(srcdir)/common/options_f.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
put.o: $(srcdir)/common/put.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
screen.o: $(srcdir)/common/screen.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
search.o: $(srcdir)/common/search.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
seq.o: $(srcdir)/common/seq.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
recover.o: $(srcdir)/common/recover.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
util.o: $(srcdir)/common/util.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex.o: $(srcdir)/ex/ex.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_abbrev.o: $(srcdir)/ex/ex_abbrev.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_append.o: $(srcdir)/ex/ex_append.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_args.o: $(srcdir)/ex/ex_args.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_argv.o: $(srcdir)/ex/ex_argv.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_at.o: $(srcdir)/ex/ex_at.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_bang.o: $(srcdir)/ex/ex_bang.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_cd.o: $(srcdir)/ex/ex_cd.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_cmd.o: $(srcdir)/ex/ex_cmd.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_cscope.o: $(srcdir)/ex/ex_cscope.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_delete.o: $(srcdir)/ex/ex_delete.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_digraph.o: $(srcdir)/ex/ex_digraph.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_display.o: $(srcdir)/ex/ex_display.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_edit.o: $(srcdir)/ex/ex_edit.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_equal.o: $(srcdir)/ex/ex_equal.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_file.o: $(srcdir)/ex/ex_file.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_filter.o: $(srcdir)/ex/ex_filter.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_global.o: $(srcdir)/ex/ex_global.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_init.o: $(srcdir)/ex/ex_init.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_join.o: $(srcdir)/ex/ex_join.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_map.o: $(srcdir)/ex/ex_map.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_mark.o: $(srcdir)/ex/ex_mark.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_mkexrc.o: $(srcdir)/ex/ex_mkexrc.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_move.o: $(srcdir)/ex/ex_move.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_open.o: $(srcdir)/ex/ex_open.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_perl.o: $(srcdir)/ex/ex_perl.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_preserve.o: $(srcdir)/ex/ex_preserve.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_print.o: $(srcdir)/ex/ex_print.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_put.o: $(srcdir)/ex/ex_put.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_quit.o: $(srcdir)/ex/ex_quit.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_read.o: $(srcdir)/ex/ex_read.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_screen.o: $(srcdir)/ex/ex_screen.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_script.o: $(srcdir)/ex/ex_script.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_set.o: $(srcdir)/ex/ex_set.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_shell.o: $(srcdir)/ex/ex_shell.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_shift.o: $(srcdir)/ex/ex_shift.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_source.o: $(srcdir)/ex/ex_source.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_stop.o: $(srcdir)/ex/ex_stop.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_subst.o: $(srcdir)/ex/ex_subst.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_tag.o: $(srcdir)/ex/ex_tag.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_tcl.o: $(srcdir)/ex/ex_tcl.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_txt.o: $(srcdir)/ex/ex_txt.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_undo.o: $(srcdir)/ex/ex_undo.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_usage.o: $(srcdir)/ex/ex_usage.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_util.o: $(srcdir)/ex/ex_util.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_version.o: $(srcdir)/ex/ex_version.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_visual.o: $(srcdir)/ex/ex_visual.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_write.o: $(srcdir)/ex/ex_write.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_yank.o: $(srcdir)/ex/ex_yank.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
ex_z.o: $(srcdir)/ex/ex_z.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
getc.o: $(srcdir)/vi/getc.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_at.o: $(srcdir)/vi/v_at.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_ch.o: $(srcdir)/vi/v_ch.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_cmd.o: $(srcdir)/vi/v_cmd.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_delete.o: $(srcdir)/vi/v_delete.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_ex.o: $(srcdir)/vi/v_ex.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_increment.o: $(srcdir)/vi/v_increment.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_init.o: $(srcdir)/vi/v_init.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_itxt.o: $(srcdir)/vi/v_itxt.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_left.o: $(srcdir)/vi/v_left.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_mark.o: $(srcdir)/vi/v_mark.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_match.o: $(srcdir)/vi/v_match.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_paragraph.o: $(srcdir)/vi/v_paragraph.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_put.o: $(srcdir)/vi/v_put.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_redraw.o: $(srcdir)/vi/v_redraw.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_replace.o: $(srcdir)/vi/v_replace.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_right.o: $(srcdir)/vi/v_right.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_screen.o: $(srcdir)/vi/v_screen.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_scroll.o: $(srcdir)/vi/v_scroll.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_search.o: $(srcdir)/vi/v_search.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_section.o: $(srcdir)/vi/v_section.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_sentence.o: $(srcdir)/vi/v_sentence.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_status.o: $(srcdir)/vi/v_status.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_txt.o: $(srcdir)/vi/v_txt.c
|
||||
$(CC) -c @no_op_OPTFLAG@ @CFLAGS@ -I. -I$(srcdir)/include @CPPFLAGS@ $?
|
||||
v_ulcase.o: $(srcdir)/vi/v_ulcase.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_undo.o: $(srcdir)/vi/v_undo.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_util.o: $(srcdir)/vi/v_util.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_word.o: $(srcdir)/vi/v_word.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_xchar.o: $(srcdir)/vi/v_xchar.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_yank.o: $(srcdir)/vi/v_yank.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_z.o: $(srcdir)/vi/v_z.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
v_zexit.o: $(srcdir)/vi/v_zexit.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
vi.o: $(srcdir)/vi/vi.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
vs_line.o: $(srcdir)/vi/vs_line.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
vs_msg.o: $(srcdir)/vi/vs_msg.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
vs_refresh.o: $(srcdir)/vi/vs_refresh.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
vs_relative.o: $(srcdir)/vi/vs_relative.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
vs_smap.o: $(srcdir)/vi/vs_smap.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
vs_split.o: $(srcdir)/vi/vs_split.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
|
||||
addbytes.o: $(srcdir)/curses/addbytes.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
addch.o: $(srcdir)/curses/addch.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
box.o: $(srcdir)/curses/box.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
clear.o: $(srcdir)/curses/clear.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
clrtobot.o: $(srcdir)/curses/clrtobot.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
clrtoeol.o: $(srcdir)/curses/clrtoeol.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
cr_put.o: $(srcdir)/curses/cr_put.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
ctrace.o: $(srcdir)/curses/ctrace.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
cur_hash.o: $(srcdir)/curses/cur_hash.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
curses.o: $(srcdir)/curses/curses.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
delch.o: $(srcdir)/curses/delch.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
deleteln.o: $(srcdir)/curses/deleteln.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
delwin.o: $(srcdir)/curses/delwin.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
erase.o: $(srcdir)/curses/erase.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
fullname.o: $(srcdir)/curses/fullname.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
getch.o: $(srcdir)/curses/getch.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
getstr.o: $(srcdir)/curses/getstr.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
id_subwins.o: $(srcdir)/curses/id_subwins.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
idlok.o: $(srcdir)/curses/idlok.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
initscr.o: $(srcdir)/curses/initscr.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
insch.o: $(srcdir)/curses/insch.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
insertln.o: $(srcdir)/curses/insertln.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
longname.o: $(srcdir)/curses/longname.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
move.o: $(srcdir)/curses/move.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
mvwin.o: $(srcdir)/curses/mvwin.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
newwin.o: $(srcdir)/curses/newwin.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
overlay.o: $(srcdir)/curses/overlay.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
overwrite.o: $(srcdir)/curses/overwrite.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
putchar.o: $(srcdir)/curses/putchar.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
refresh.o: $(srcdir)/curses/refresh.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
scroll.o: $(srcdir)/curses/scroll.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
setterm.o: $(srcdir)/curses/setterm.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
standout.o: $(srcdir)/curses/standout.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
toucholap.o: $(srcdir)/curses/toucholap.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
touchwin.o: $(srcdir)/curses/touchwin.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
tscroll.o: $(srcdir)/curses/tscroll.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
tstp.o: $(srcdir)/curses/tstp.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
tty.o: $(srcdir)/curses/tty.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
unctrl.o: $(srcdir)/curses/unctrl.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
waddnstr.o: $(srcdir)/curses/waddnstr.c
|
||||
$(CC) -D_CURSES_PRIVATE $(CFLAGS) $?
|
||||
|
||||
# DB sources.
|
||||
db.o: $(srcdir)/db/db/db.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) $?
|
||||
mpool.o: $(srcdir)/db/mpool/mpool.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/mpool $?
|
||||
bt_close.o: $(srcdir)/db/btree/bt_close.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
bt_conv.o: $(srcdir)/db/btree/bt_conv.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
bt_debug.o: $(srcdir)/db/btree/bt_debug.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
bt_delete.o: $(srcdir)/db/btree/bt_delete.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
bt_get.o: $(srcdir)/db/btree/bt_get.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
bt_open.o: $(srcdir)/db/btree/bt_open.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
bt_overflow.o: $(srcdir)/db/btree/bt_overflow.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
bt_page.o: $(srcdir)/db/btree/bt_page.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
bt_put.o: $(srcdir)/db/btree/bt_put.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
bt_search.o: $(srcdir)/db/btree/bt_search.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
bt_seq.o: $(srcdir)/db/btree/bt_seq.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
bt_split.o: $(srcdir)/db/btree/bt_split.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
bt_utils.o: $(srcdir)/db/btree/bt_utils.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $?
|
||||
rec_close.o: $(srcdir)/db/recno/rec_close.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $?
|
||||
rec_delete.o: $(srcdir)/db/recno/rec_delete.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $?
|
||||
rec_get.o: $(srcdir)/db/recno/rec_get.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $?
|
||||
rec_open.o: $(srcdir)/db/recno/rec_open.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $?
|
||||
rec_put.o: $(srcdir)/db/recno/rec_put.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $?
|
||||
rec_search.o: $(srcdir)/db/recno/rec_search.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $?
|
||||
rec_seq.o: $(srcdir)/db/recno/rec_seq.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $?
|
||||
rec_utils.o: $(srcdir)/db/recno/rec_utils.c
|
||||
$(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $?
|
||||
|
||||
# Regular Expressions sources.
|
||||
regcomp.o: $(srcdir)/regex/regcomp.c
|
||||
$(CC) -D__REGEX_PRIVATE $(CFLAGS) $?
|
||||
regerror.o: $(srcdir)/regex/regerror.c
|
||||
$(CC) -D__REGEX_PRIVATE $(CFLAGS) $?
|
||||
regexec.o: $(srcdir)/regex/regexec.c
|
||||
$(CC) -D__REGEX_PRIVATE $(CFLAGS) $?
|
||||
regfree.o: $(srcdir)/regex/regfree.c
|
||||
$(CC) -D__REGEX_PRIVATE $(CFLAGS) $?
|
||||
|
||||
# Random replacement and workaround sources.
|
||||
addnstr.o: $(srcdir)/clib/addnstr.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
bsearch.o: $(srcdir)/clib/bsearch.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
env.o: $(srcdir)/clib/env.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
fchmod.o: $(srcdir)/clib/fchmod.c
|
||||
$(CC) $(CFLAGS) $(INC) $?
|
||||
gethostname.o: $(srcdir)/clib/gethostname.c
|
||||
$(CC) $(CFLAGS) $(INC) $?
|
||||
getopt.o: $(srcdir)/clib/getopt.c
|
||||
$(CC) $(CFLAGS) $(INC) $?
|
||||
memchr.o: $(srcdir)/clib/memchr.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
memcpy.o: $(srcdir)/clib/memmove.c
|
||||
$(cp) $? memcpy.c
|
||||
$(CC) $(CFLAGS) -DMEMCOPY memcpy.c
|
||||
memmove.o: $(srcdir)/clib/memmove.c
|
||||
$(CC) $(CFLAGS) -DMEMMOVE $?
|
||||
memset.o: $(srcdir)/clib/memset.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
mkstemp.o: $(srcdir)/clib/mkstemp.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
mmap.o: $(srcdir)/clib/mmap.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
realloc.o: $(srcdir)/clib/realloc.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
snprintf.o: $(srcdir)/clib/snprintf.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
strdup.o: $(srcdir)/clib/strdup.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
strerror.o: $(srcdir)/clib/strerror.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
strpbrk.o: $(srcdir)/clib/strpbrk.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
strsep.o: $(srcdir)/clib/strsep.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
strtol.o: $(srcdir)/clib/strtol.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
strtoul.o: $(srcdir)/clib/strtoul.c
|
||||
$(CC) $(CFLAGS) $?
|
||||
vsnprintf.o: $(srcdir)/clib/vsnprintf.c
|
||||
$(CC) $(CFLAGS) $?
|
369
contrib/nvi/build/README
Normal file
369
contrib/nvi/build/README
Normal file
@ -0,0 +1,369 @@
|
||||
# @(#)README 8.26 (Berkeley) 10/19/96
|
||||
|
||||
Nvi uses the GNU autoconf program for configuration and compilation. You
|
||||
should enter:
|
||||
|
||||
configure
|
||||
make
|
||||
|
||||
and nvi will configure the system and build one or two binaries: nvi and
|
||||
tknvi. You can use any path to the configure script, e.g., to build for
|
||||
an x86 architecture, I suggest that you do:
|
||||
|
||||
mkdir build.x86
|
||||
cd build.x86
|
||||
../build/configure
|
||||
make
|
||||
|
||||
There are options that you can specify to the configure command. See
|
||||
the next section for a description of these options.
|
||||
|
||||
If you want to rebuild or reconfigure nvi, for example, because you change
|
||||
your mind as to the curses library that you want to use, create a new
|
||||
directory and reconfigure it using "configure" and whatever options you
|
||||
choose, don't try to selectively edit the files.
|
||||
|
||||
By default, nvi is installed as "vi", with hard links to "ex" and "view".
|
||||
To install them using different names, use the configure program options.
|
||||
For example, to install them as "nvi", "nex" and "nview", use:
|
||||
|
||||
configure --program-prefix=n
|
||||
|
||||
See the section below on installation for details.
|
||||
|
||||
Note, if you're building nvi on a LynxOS system, you should read the
|
||||
README.LynxOS file in this directory for additional build instructions
|
||||
that are specific to that operating system.
|
||||
|
||||
If you have trouble with this procedure, send email to the addresses
|
||||
listed in ../README. In that email, please provide a complete script
|
||||
of the output for all of the above commands that you entered.
|
||||
|
||||
=-=-=-=-=-=-=
|
||||
NVI'S OPTIONS TO THE CONFIGURE PROGRAM
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
There are many options that you can enter to the configuration program.
|
||||
To see a complete list of the options, enter "configure --help". Only
|
||||
a few of them are nvi specific. These options are as follows:
|
||||
|
||||
--disable-curses DON'T use the nvi-provided curses routines.
|
||||
--disable-db DON'T use the nvi-provided DB routines.
|
||||
--disable-re DON'T use the nvi-provided RE routines.
|
||||
--enable-debug Build a debugging version.
|
||||
--enable-perlinterp Include a Perl interpreter in vi.
|
||||
--enable-tclinterp Include a Tk/Tcl interpreter in vi.
|
||||
--enable-tknvi Build a Tk/Tcl front-end for vi.
|
||||
|
||||
disable-curses:
|
||||
By default, nvi loads its own implementation of the curses
|
||||
routines (which are a stripped-down version of the 4.4BSD curses
|
||||
library). If you have your own curses library implementation and
|
||||
you want to use it instead, enter:
|
||||
|
||||
--disable-curses
|
||||
|
||||
as an argument to configure, and the curses routines will be taken
|
||||
from whatever libraries you load. Note: System V based curses
|
||||
implementations are usually broken. See the last section of this
|
||||
README for further information about nvi and the curses library.
|
||||
|
||||
disable-db:
|
||||
By default, nvi loads its own versions of the Berkeley DB routines
|
||||
(which are a stripped-down version of DB 1.85). If you have your
|
||||
own version of the Berkeley DB routines and you want to use them
|
||||
instead, enter:
|
||||
|
||||
--disable-db
|
||||
|
||||
as an argument to configure, and the DB routines will be taken
|
||||
from whatever libraries you load. Make sure that the DB routines
|
||||
you use are at least version 1.85 or later.
|
||||
|
||||
disable-re:
|
||||
By default, nvi loads its own versions of the POSIX 1003.2 Regular
|
||||
Expression routines (which are Henry Spencer's implementation).
|
||||
If your C library contains an implementation of the POSIX 1003.2
|
||||
RE routines (note, this is NOT the same as the historic UNIX RE
|
||||
routines), and you want to use them instead, enter:
|
||||
|
||||
--disable-re
|
||||
|
||||
as an argument to configure, and the RE routines will be taken
|
||||
from whatever libraries you load. Please ensure that your RE
|
||||
routines implement Henry Spencer's extensions for doing vi-style
|
||||
"word" searches.
|
||||
|
||||
enable-debug:
|
||||
If you want to build nvi with no optimization (i.e. without -O
|
||||
as a compiler flag), with -g as a compiler flag, and with DEBUG
|
||||
defined during compilation, enter:
|
||||
|
||||
--enable-debug
|
||||
|
||||
as an argument to configure.
|
||||
|
||||
enable-perlinterp:
|
||||
If you have the Perl 5 libraries and you want to compile in the
|
||||
Perl interpreter, enter:
|
||||
|
||||
--enable-perlinterp
|
||||
|
||||
as an argument to configure. (Note: this is NOT possible with
|
||||
Perl 4, or even with Perl 5 versions earlier than 5.002.)
|
||||
|
||||
enable-tclinterp:
|
||||
If you have the Tk/Tcl libraries and you want to compile in the
|
||||
Tcl/Tk interpreter, enter:
|
||||
|
||||
--enable-tclinterp
|
||||
|
||||
as an argument to configure. If your Tk/Tcl include files and
|
||||
libraries aren't in the standard library and include locations,
|
||||
see the next section of this README file for more information.
|
||||
|
||||
enable-tknvi:
|
||||
If you have the Tk/Tcl libraries and you want to build the Tcl/Tk
|
||||
nvi front-end, enter:
|
||||
|
||||
--enable-tknvi
|
||||
|
||||
as an argument to configure. If your Tk/Tcl include files and
|
||||
libraries aren't in the standard library and include locations,
|
||||
see the next section of this README file for more information.
|
||||
|
||||
=-=-=-=-=-=-=
|
||||
ADDING OR CHANGING COMPILERS, OR COMPILE OR LOAD LINE FLAGS
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
If you want to use a specific compiler, specify the CC environment
|
||||
variable before running configure. For example:
|
||||
|
||||
env CC=gcc configure
|
||||
|
||||
Using anything other than the native compiler will almost certainly
|
||||
mean that you'll want to check the compile and load line flags, too.
|
||||
|
||||
If you want to specify additional load line flags, specify the ADDLDFLAGS
|
||||
environment variable before running configure. For example:
|
||||
|
||||
env ADDLDFLAGS="-Q" configure
|
||||
|
||||
would specify the -Q flag in the load line when the nvi programs are
|
||||
loaded.
|
||||
|
||||
If you don't want configure to use the default load line flags for the
|
||||
system, specify the LDFLAGS environment variable before running configure.
|
||||
For example:
|
||||
|
||||
env LDFLAGS="-32" configure
|
||||
|
||||
will cause configure to set the load line flags to "-32", and not set
|
||||
them based on the current system.
|
||||
|
||||
If you want to specify additional compile line flags, specify the
|
||||
ADDCPPFLAGS environment variable before running configure. For example:
|
||||
|
||||
env ADDCPPFLAGS="-I../foo" configure
|
||||
|
||||
would cause the compiler to be passed the -I../foo flag when compiling
|
||||
test programs during configuration as well as when building nvi object
|
||||
files.
|
||||
|
||||
If you don't want configure to use the default compile line flags for the
|
||||
system, specify the CPPFLAGS environment variable before running configure.
|
||||
For example:
|
||||
|
||||
env CPPFLAGS="-I.." configure
|
||||
|
||||
will cause configure to use "-I.." as the compile line flags instead of
|
||||
the default values.
|
||||
|
||||
=-=-=-=-=-=-=
|
||||
ADDING LIBRARIES AND INCLUDE FILES
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
If the Tk/Tcl or any other include files or libraries are in non-standard
|
||||
places on your system, you will need to specify the directory path where
|
||||
they can be found.
|
||||
|
||||
If you want to specify additional library paths, set the ADDLIBS environment
|
||||
variable before running configure. For example:
|
||||
|
||||
env ADDLIBS="-L/a/b -L/e/f -ldb" configure
|
||||
|
||||
would specify two additional directories to search for libraries, /a/b
|
||||
and /e/f, and one additional library to load, "db".
|
||||
|
||||
If you want to specify additional include paths, specify the ADDCPPFLAGS
|
||||
environment variable before running configure. For example:
|
||||
|
||||
env ADDCPPFLAGS="-I/usr/local/include" LIBS="-ldb" configure
|
||||
|
||||
would search /usr/local/include for include files, as well as load the db
|
||||
library as described above.
|
||||
|
||||
As a final example, let's say that you've downloaded ncurses from the net
|
||||
and you've built it in a directory named ncurses which is at the same
|
||||
level in the filesystem hierarchy as nvi. You would enter something like:
|
||||
|
||||
env ADDCPPFLAGS="-I../../ncurses/include" \
|
||||
ADDLIBS="-L../../ncurses/libraries" configure
|
||||
|
||||
to cause nvi to look for the curses include files and the curses library
|
||||
in the ncurses environment.
|
||||
|
||||
Notes:
|
||||
Make sure that you prepend -L to any library directory names, and
|
||||
that you prepend -I to any include file directory names! Also,
|
||||
make sure that you quote the paths as shown above, i.e. with
|
||||
single or double quotes around the values you're specifying for
|
||||
ADDCPPFLAGS and ADDLIBS.
|
||||
|
||||
=-=-=-=-=-=
|
||||
You should NOT need to add any libraries or include files to load
|
||||
the Perl5 interpreter. The configure script will obtain that
|
||||
information directly from the Perl5 program. This means that the
|
||||
configure script must be able to find perl in its path. It looks
|
||||
for "perl5" first, and then "perl". If you're building a Perl
|
||||
interpreter and neither is found, it's a fatal error.
|
||||
|
||||
=-=-=-=-=-=
|
||||
You do not need to specify additional libraries to load Tk/Tcl,
|
||||
Perl or curses, as the nvi configuration script adds the
|
||||
appropriate libraries to the load line whenever you specify
|
||||
--enable-tknvi or other Perl or Tk/Tcl related option, or build
|
||||
the Tk/Tcl or curses version of nvi. The library names that are
|
||||
automatically loaded are as follows:
|
||||
|
||||
for Perl: -lperl
|
||||
for Tk/Tcl: -ltk -ltcl -lm
|
||||
for curses: -lcurses
|
||||
|
||||
In addition, the configure script loads:
|
||||
|
||||
... the X libraries when loading the Tk/Tcl libraries,
|
||||
if they exist.
|
||||
|
||||
... the -ltermcap or -ltermlib libraries when loading
|
||||
any curses library, if they exist.
|
||||
|
||||
=-=-=-=-=-=
|
||||
The env command is available on most systems, and simply sets one
|
||||
or more environment variables before running a command. If the
|
||||
env command is not available to you, you can set the environment
|
||||
variables in your shell before running configure. For example,
|
||||
in sh or ksh, you could do:
|
||||
|
||||
ADDLIBS="-L/a/b -L/e/f -ldb" configure
|
||||
|
||||
and in csh or tcsh, you could do:
|
||||
|
||||
setenv ADDLIBS "-L/a/b -L/e/f -ldb"
|
||||
configure
|
||||
|
||||
See your shell manual page for further information.
|
||||
|
||||
=-=-=-=-=-=-=
|
||||
INSTALLING NVI
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Nvi installs the following files into the following locations, with
|
||||
the following default values:
|
||||
|
||||
Variables: Default value:
|
||||
prefix /usr/local
|
||||
exec_prefix $(prefix)
|
||||
bindir $(prefix)/bin
|
||||
datadir $(prefix)/share
|
||||
mandir $(prefix)/man
|
||||
|
||||
File(s): Default location
|
||||
----------------------------------------
|
||||
vi $(bindir)/vi
|
||||
vi.1 $(mandir)/man1/vi.1
|
||||
vi.0 $(mandir)/cat1/vi.0
|
||||
Perl scripts $(datadir)/vi/perl/
|
||||
Tcl scripts $(datadir)/vi/tcl/
|
||||
Message Catalogs $(datadir)/vi/catalog/
|
||||
|
||||
Notes:
|
||||
There are two hard links to the vi program, named ex and view.
|
||||
Similarly, there are two hard links to the unformatted vi manual
|
||||
page, named ex.1 and view.1, and two hard links to the formatted
|
||||
manual page, named ex.0 and view.0. These links are created when
|
||||
the program and man pages are installed.
|
||||
|
||||
If you want to install vi, ex, view and the man pages as nvi, nex,
|
||||
nview, use the configure option --program-prefix=n. Other, more
|
||||
complex transformations are possible -- use configure --help to
|
||||
see more options.
|
||||
|
||||
To move the entire installation tree somewhere besides /usr/local,
|
||||
change the value of both "exec_prefix" and "prefix". To move the
|
||||
binaries to a different place, change the value of "bindir".
|
||||
Similarly, to put the datafiles (the message catalogs, Perl and
|
||||
Tcl scripts) or the man pages in a different place, change the
|
||||
value of "datadir" or "mandir". These values can be changed as
|
||||
part of configuration:
|
||||
|
||||
configure --exec_prefix=/usr/contrib --prefix=/usr/share
|
||||
|
||||
or when doing the install itself:
|
||||
|
||||
make exec_prefix=/usr/contrib prefix=/usr/contrib install
|
||||
|
||||
The datafile directory (e.g., /usr/local/share/vi by default) is
|
||||
completely removed and then recreated as part of the installation
|
||||
process.
|
||||
|
||||
=-=-=-=-=-=-=
|
||||
NVI AND THE CURSES LIBRARY
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
The major portability problem for nvi is selecting a curses library.
|
||||
Unfortunately, it is common to find broken versions of curses -- the
|
||||
original System V curses was broken, resulting in all vendors whose
|
||||
implementations are derived from System V having broken implementations
|
||||
in turn.
|
||||
|
||||
For this reason, BY DEFAULT, nvi uses the stripped-down curses library
|
||||
that's included in its distribution. Of course, it would be preferable
|
||||
to use the vendor's curses library, or one of the newer implementations
|
||||
of curses, e.g., ncurses.
|
||||
|
||||
To use the vendor's curses library, specify the:
|
||||
|
||||
--disable-curses
|
||||
|
||||
argument to the configure command. If you use the vendor's or other
|
||||
curses library, and you see any of the following symptoms:
|
||||
|
||||
+ Core dumps in curses routines.
|
||||
+ Missing routines when compiling.
|
||||
+ Repainting the wrong characters on the screen.
|
||||
+ Displaying inverse video in the wrong places.
|
||||
+ Failure to reset your terminal to the correct modes on exit.
|
||||
|
||||
you have a broken curses implementation, and you should reconfigure nvi
|
||||
to use another curses library or the curses library provided with nvi.
|
||||
|
||||
There are two alternative sources for curses libraries:
|
||||
|
||||
#1: Compile the 4BSD curses library from any of the recent BSD
|
||||
releases: FreeBSD, NetBSD or 4.4BSD-Lite release 2. These
|
||||
libraries should be able to support nvi.
|
||||
|
||||
#2: Retrieve and build the ncurses library. This library is not
|
||||
recommended unreservedly, at least for now, for two reasons.
|
||||
First, it can't be built on any system where the compiler
|
||||
doesn't support function prototypes. Second, it currently has
|
||||
a few bugs in its support for nvi. It mostly works, but it's
|
||||
still not quite right.
|
||||
|
||||
One final note. If you see the following symptoms:
|
||||
|
||||
+ Line-by-line screen repainting instead of scrolling.
|
||||
|
||||
it usually means that your termcap or terminfo information is insufficient
|
||||
for the terminal.
|
320
contrib/nvi/build/README.LynxOS
Normal file
320
contrib/nvi/build/README.LynxOS
Normal file
@ -0,0 +1,320 @@
|
||||
README.LynxOS
|
||||
=============
|
||||
|
||||
Written by Ronald F. Guilmette <rfg@monkeys.com>
|
||||
|
||||
Last modified Wed Aug 14 23:10:07 PDT 1996
|
||||
------------------------------------------
|
||||
|
||||
0. Introduction
|
||||
---------------
|
||||
|
||||
This file describes how to build and install the Berkeley nvi editor for
|
||||
the LynxOS 2.4.0 operating system.
|
||||
|
||||
LynxOS 2.4.0 is available for a variety of different hardware platforms, in
|
||||
particular, x86, m680x0, Sparc, and PowerPC. I have successfully built nvi
|
||||
on all four of these flavors of LynxOS by following the procedures given in
|
||||
this file.
|
||||
|
||||
Note that these procedures may not work on versions of LynxOS prior to 2.4.0.
|
||||
(As I understand it, a good deal of work went into making the 2.4.0 release
|
||||
more POSIX-compliant, and I have no idea what build glitches, if any, you
|
||||
might encounter if you try to build nvi on a pre-2.4.0 version of LynxOS.)
|
||||
|
||||
There are basically four steps to configuring, building, and installing nvi
|
||||
on LynxOS, namely:
|
||||
|
||||
1. Get setup to use the proper C compiler.
|
||||
2. Replace your installed `tr' program.
|
||||
3. Fix your system include files.
|
||||
4. Do a normal configure, build, and install of nvi.
|
||||
|
||||
These steps are described in separate sections below.
|
||||
|
||||
1. Get Setup to Use the Proper C Compiler
|
||||
------------------------------------------
|
||||
|
||||
The first step when building nvi on LynxOS is to set your $PATH environment
|
||||
variable properly so that the gcc 2.x compiler appears first on your path,
|
||||
prior to the older (and less robust) gcc 1.xx compiler (typically installed
|
||||
as /bin/gcc) and/or the old Lynx proprietary C compiler (typically installed
|
||||
as /bin/cc), both of which may also be present on your system.
|
||||
|
||||
Note that for most operating systems, the configure script for nvi tries
|
||||
to use whatever compiler you have installed (and in your $PATH) as "cc",
|
||||
however in the special case of LynxOS, the configure script will auto-
|
||||
matically try to find a "gcc" program on your $PATH in preference to a
|
||||
compiler called "cc". If the nvi configure script only find a compiler
|
||||
called "cc", that's OK. It will still try to see if that is really just
|
||||
the GNU C compiler installed under the name "cc".
|
||||
|
||||
Regardless of the name however (be it "gcc" or "cc") the first C compiler
|
||||
in your $PATH should be some _recent_ (i.e. 2.0 or later) version of the
|
||||
GNU C compiler... and the nvi configure script now checks that this is the
|
||||
case, and fails if it isn't.
|
||||
|
||||
Oddly enough, LynxOS 2.4.0 (and some prior versions) shipped with as many
|
||||
as three different C compilers installed, so it is important to set your
|
||||
$PATH environment variable carfully in order to get the proper C compiler
|
||||
to appear first in your $PATH. You want to avoid having either the /bin/gcc
|
||||
compiler or the /bin/cc compiler be the first C compiler in your $PATH.
|
||||
|
||||
To make sure that the GNU C version 2.x compiler which was shipped with your
|
||||
LynxOS system appears first on your path, you will need to either set your
|
||||
$PATH variable (for sh/bash/ksh users) or your $path variable (for csh/tcsh
|
||||
users). You can, of course, just do this at the shell command prompt, but
|
||||
it is probably better to actually edit this change into your .profile file
|
||||
(for sh/bash/ksh users) or into your .cshrc file (for csh/tcsh users).
|
||||
|
||||
The pathname of the directory that contains the GNU C version 2.x compiler
|
||||
is (unfortunately) dependent upon the exact type of LynxOS system you have.
|
||||
|
||||
For LynxOS 2.4.0 on x86 systems, gcc 2.x is located in:
|
||||
|
||||
/cygnus/94q4-lynxos-x86/bin
|
||||
|
||||
For LynxOS 2.4.0 on m680x0 systems, gcc 2.x is located in:
|
||||
|
||||
/cygnus/94q4-lynxos-68k/bin
|
||||
|
||||
For LynxOS 2.4.0 on Sparc systems, gcc 2.x is located in:
|
||||
|
||||
/cygnus/94q4-lynxos-usparc/bin
|
||||
|
||||
For LynxOS 2.4.0 on PowerPC systems, gcc 2.x is located in:
|
||||
|
||||
/cygnus/95q2-lynxos-ppc/bin
|
||||
|
||||
(Note also that these locations may change in LynxOS 2.5.x and beyond.)
|
||||
|
||||
Anyway, it is imperative that you setup your $PATH environment variable
|
||||
(*before* you do the configure step for nvi) so that the GNU C version 2.x
|
||||
compiler appears in your $PATH before either the /bin/cc or /bin/gcc
|
||||
compilers (if present). If you fail to do this, the configure step for
|
||||
nvi will fail, because the compiler script actually checks (now) that the
|
||||
compiler you are using (if your are on a LynxOS system) is gcc 2.0 or
|
||||
later.
|
||||
|
||||
To make absolutely sure that you will be configuring and building nvi with
|
||||
the proper C compiler (i.e. the GNU C version 2.x compiler on your system)
|
||||
you should add the directory name listed above for your specific system type
|
||||
to your $PATH setting in your $HOME/.profile file. (For csh/tcsh users, you
|
||||
will instead want to add the relevant directory name to the setting of your
|
||||
$path variable in your ~/.cshrc file.) Once you have added the proper direc-
|
||||
tory name (from the list given above) to your $HOME/.profile file (or to your
|
||||
~/.cshrc file, if you are using csh or tcsh) you should log out completely
|
||||
and then log back into the system just to make sure your new $PATH/$path
|
||||
setting takes effect properly.
|
||||
|
||||
When you finish making this adjustment to your $PATH (or $path), the most
|
||||
up-to-date version of gcc on your system should be available to you as the
|
||||
first `gcc' program on your $PATH. You should verify that this is indeed the
|
||||
case simply by typing `gcc -v' and then checking the version number reported
|
||||
by the compiler. It should say either "2.6-94q4" or (on PowerPC systems) it
|
||||
should say "2.6-95q2". If you don't get these results, try again to set your
|
||||
$PATH (or $path) until you do. You won't be able to build nvi until you are
|
||||
properly setup to use gcc version 2.0 or later.
|
||||
|
||||
Performing the steps shown above will insure that your subsequent configura-
|
||||
tion and build steps for nvi will make use of the most up-to-date version of
|
||||
gcc that was shipped with your Lynx operating system. (Note that the versions
|
||||
of gcc which are currently shipping with LynxOS 2.4.0 are also somewhat out-
|
||||
of-date themselves, but they are still quite a bit newer and more bug-free
|
||||
and ANSI conformant that those other two C compilers, /bin/cc and /bin/gcc,
|
||||
which also ship with LynxOS 2.4.0.)
|
||||
|
||||
(Note: At present, LynxOS version 2.4.0 is the latest officially released
|
||||
version of LynxOS, and all of the above information is accurate and correct
|
||||
for LynxOS 2.4.0 as of the time of this writing. However it is rumored that
|
||||
future releases of LynxOS may provide a still newer version of gcc, and that
|
||||
it may be located in the /usr/bin directory. Thus, if you are building nvi
|
||||
for some LynxOS version later than 2.4.0, you may wish to check and see if
|
||||
your system has a program called /usr/bin/gcc, and use that version of gcc,
|
||||
if available, rather than the one suggested above.)
|
||||
|
||||
2. Replace Your Installed `tr' Program
|
||||
---------------------------------------
|
||||
|
||||
The `tr' program which comes bundled with LynxOS 2.4.0 (as /bin/tr) has a
|
||||
somewhat obscure bug which just happens to be tickled by almost all GNU
|
||||
`autoconf' generated `configure' scripts (including the one that nowadays
|
||||
comes bundled with nvi). Using the stock /bin/tr program on LynxOS when
|
||||
executing such `configure' scripts _will_ cause these scripts to malfunction
|
||||
in various ways. It is therefore imperative that you replace your LynxOS
|
||||
/bin/tr program with a properly working version of the `tr' command _before_
|
||||
you even try to configure nvi. (You can tell if your `tr' program has the
|
||||
bug by executng the command "echo ab- | tr ab- ABC". If this yields the
|
||||
string "Ab-" then you have the bug. If it yields "ABC" then you don't.)
|
||||
|
||||
You can obtain sources for a working version of the `tr' command as part of
|
||||
the GNU `textutils' package (the latest version of which, at the time of this
|
||||
writing, is 1.19). The GNU textutils package is available for downloading
|
||||
from prep.ai.mit.edu in the pub/gnu directory. Look for the file named
|
||||
textutils-1.19.tar.gz, or an even more recent version of textutils, if one
|
||||
is available. Fetch it, gunzip it, untar it, and follow the directions in
|
||||
the INSTALL file included in the tar file to build and install the entire
|
||||
textutils set of utility programs (which includes a working `tr' program).
|
||||
Then just make sure that the GNU version of `tr' appears on your $PATH
|
||||
_before_ the LynxOS version of `tr' (i.e. /bin/tr). Be sure to do this
|
||||
step _before_ you start to configure nvi.
|
||||
|
||||
When building the textutils set of programs, I suggest that you use the most
|
||||
up-to-date C compiler available on your system (as described above). Also,
|
||||
note that it will be important for you to AVOID using the -O (optimize)
|
||||
compiler option when building the GNU textutils package, even if you are
|
||||
using the most up-to-date version of gcc which shipped with your system.
|
||||
If you try to use -O when building the textutils package on an x86 with
|
||||
the Cygnus 94q4 C compiler, you will end up with a `tr' program which will
|
||||
malfunction even worse than the one you are trying to replace! If you use
|
||||
-O when building the textutils package on LynxOS on the PowerPC (using the
|
||||
Cygnus 95q2 C compiler) you will just get yourself a compiler crash. So
|
||||
just don't use -O when building textutils. You can avoid using -O by in-
|
||||
voking make in the textutils directory as follows:
|
||||
|
||||
make CFLAGS="-g"
|
||||
|
||||
(Note: At present, LynxOS version 2.4.0 is the latest officially released
|
||||
version of LynxOS, and all of the above information is accurate and correct
|
||||
for LynxOS 2.4.0 as of the time of this writing. However it is rumored that
|
||||
the bug in the /bin/tr program will be fixed in future releases of LynxOS,
|
||||
so if you have a version of LynxOS later than 2.4.0, you may wish to check
|
||||
and see if your /bin/tr program even has the problematic bug before bothering
|
||||
with all of this.)
|
||||
|
||||
|
||||
3. Fix Your System Include Files
|
||||
---------------------------------
|
||||
|
||||
If you are building nvi on a PowerPC system, it is also important that you
|
||||
apply the patches given at the end of this file to your /usr/include files.
|
||||
(Note that you will have to be root in order to do this.) Two of the patches
|
||||
included below fix a pair of serious bugs in the /usr/include/stdarg.h file
|
||||
on the PowerPC, and you really _do_ want to have these bugs fixed anyway,
|
||||
because without these fixes, anything that you compile which uses <stdarg.h>
|
||||
will very likely malfunction at run-time.
|
||||
|
||||
Regardless of which LynxOS platform you are using (i.e. x86, PowerPC, Sparc,
|
||||
or m680x0) you may want to apply all of the system include files patches that
|
||||
are included below anyway. Doing so will clean up a few minor problems with
|
||||
the relevant system include files (i.e. <stdarg.h>, <ioctl.h>, and <wait.h>)
|
||||
and this step will also prevent a few warnings which you would otherwise get
|
||||
during the build of nvi.
|
||||
|
||||
You can apply all of the patches given at the end of this file simply by
|
||||
doing the following:
|
||||
|
||||
su root
|
||||
cd /usr/include
|
||||
/bin/patch < this-file
|
||||
|
||||
Where `this-file' is the actual full pathname of the file you are now reading,
|
||||
wherever it may reside on your own system.
|
||||
|
||||
(Note: At present, LynxOS version 2.4.0 is the latest officially released
|
||||
version of LynxOS, and all of the above information is accurate and correct
|
||||
for LynxOS 2.4.0 as of the time of this writing. However it is rumored that
|
||||
future releases of LynxOS may incorporate some or all of the important system
|
||||
include file fixes provided below. Thus, if you are building nvi for some
|
||||
LynxOS version later than 2.4.0, you should probably go ahead and try to
|
||||
apply the patches given below to your system include files, and then just
|
||||
don't worry about it if these patches seem to have already been applied.)
|
||||
|
||||
|
||||
4. A Brief Note about Sendmail
|
||||
-------------------------------
|
||||
|
||||
I should mention also that LynxOS does not normally ship with the `sendmail'
|
||||
mail transfer program installed, either under /usr/lib/ or anywhere else for
|
||||
that matter. This isn't really a big problem, but nvi normally wants and
|
||||
expects to have a sendmail program available so that it can send users notifi-
|
||||
cations (by mail) whenever a partially edited file is preserved by the editor
|
||||
in response to a sudden system crash, a sudden system shutdown, or an unexpect-
|
||||
ed serial-line hangup. You can configure and build nvi without any sendmail
|
||||
program installed on your system, but you will get warnings about its absence
|
||||
when you are doing the initial configure step prior to actually building nvi.
|
||||
If you want to have a fully-functional nvi which does send out notification
|
||||
messages (by mail) whenever partially edited files are preserved during a
|
||||
serial line hangup or system crash, then you should get the BSD sendmail
|
||||
sources (via ftp from ftp.cs.berkeley.edu), build and install sendmail, and
|
||||
then reconfigure, rebuild, and reinstall nvi.
|
||||
|
||||
Please contact me at the E-mail address below if you experience any problems in
|
||||
building or using nvi on LynxOS. I make no guarrantees, but I may be willing
|
||||
to try to help.
|
||||
|
||||
Ron Guilmette
|
||||
Roseville, California
|
||||
<rfg@monkeys.com>
|
||||
August 14, 1996
|
||||
|
||||
|
||||
cut here for LynxOS 2.4.0 system include files patches
|
||||
-----------------------------------------------------------------------------
|
||||
*** wait.h Fri Apr 26 10:02:45 1996
|
||||
--- wait.h Sun May 19 05:36:50 1996
|
||||
***************
|
||||
*** 94,104 ****
|
||||
/* Function prototypes */
|
||||
#ifndef __LYNXOS
|
||||
- #ifdef _POSIX_SOURCE
|
||||
extern pid_t wait _AP((int *));
|
||||
extern pid_t waitpid _AP((pid_t, int *, int));
|
||||
! #else
|
||||
! extern int wait _AP((union wait *));
|
||||
! extern int waitpid _AP((int, union wait *, int));
|
||||
! extern int wait3 _AP((union wait *, int, struct rusage *));
|
||||
#endif
|
||||
#endif /* !__LYNXOS */
|
||||
--- 94,101 ----
|
||||
/* Function prototypes */
|
||||
#ifndef __LYNXOS
|
||||
extern pid_t wait _AP((int *));
|
||||
extern pid_t waitpid _AP((pid_t, int *, int));
|
||||
! #ifndef _POSIX_SOURCE
|
||||
! extern int wait3 _AP((int *, int, struct rusage *));
|
||||
#endif
|
||||
#endif /* !__LYNXOS */
|
||||
*** ioctl.h Fri Apr 26 16:50:51 1996
|
||||
--- ioctl.h Sat May 18 17:55:16 1996
|
||||
***************
|
||||
*** 572,576 ****
|
||||
|
||||
#ifndef __LYNXOS
|
||||
! extern int ioctl _AP((int, int, char *));
|
||||
#endif
|
||||
|
||||
--- 572,576 ----
|
||||
|
||||
#ifndef __LYNXOS
|
||||
! extern int ioctl _AP((int, int, ...));
|
||||
#endif
|
||||
|
||||
*** stdarg.h Fri Apr 26 16:51:02 1996
|
||||
--- stdarg.h Sat May 18 19:34:13 1996
|
||||
***************
|
||||
*** 88,92 ****
|
||||
(((sizeof(TYPE) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
|
||||
|
||||
! #define va_start(AP, LASTARG) (AP = ((char *) __builtin_next_arg ()))
|
||||
|
||||
void va_end(va_list); /* Defined in libgcc.a */
|
||||
--- 88,92 ----
|
||||
(((sizeof(TYPE) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
|
||||
|
||||
! #define va_start(AP, LASTARG) (AP = ((char *) __builtin_next_arg (LASTARG)))
|
||||
|
||||
void va_end(va_list); /* Defined in libgcc.a */
|
||||
***************
|
||||
*** 162,166 ****
|
||||
(((sizeof(TYPE) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
|
||||
|
||||
! #define va_start(AP, LASTARG) (AP = ((char *) __builtin_next_arg ()))
|
||||
|
||||
void va_end(va_list); /* Defined in libgcc.a */
|
||||
--- 162,166 ----
|
||||
(((sizeof(TYPE) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
|
||||
|
||||
! #define va_start(AP, LASTARG) (AP = ((char *) __builtin_next_arg (LASTARG)))
|
||||
|
||||
void va_end(va_list); /* Defined in libgcc.a */
|
82
contrib/nvi/build/acconfig.h
Normal file
82
contrib/nvi/build/acconfig.h
Normal file
@ -0,0 +1,82 @@
|
||||
/* @(#)acconfig.h 8.18 (Berkeley) 7/2/96 */
|
||||
|
||||
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||
#undef ssize_t
|
||||
|
||||
/* Define if you want a debugging version. */
|
||||
#undef DEBUG
|
||||
|
||||
/* Define if you have a System V-style (broken) gettimeofday. */
|
||||
#undef HAVE_BROKEN_GETTIMEOFDAY
|
||||
|
||||
/* Define if you have a Ultrix-style (broken) vdisable. */
|
||||
#undef HAVE_BROKEN_VDISABLE
|
||||
|
||||
/* Define if you have a BSD version of curses. */
|
||||
#undef HAVE_BSD_CURSES
|
||||
|
||||
/* Define if you have the curses(3) addnstr function. */
|
||||
#undef HAVE_CURSES_ADDNSTR
|
||||
|
||||
/* Define if you have the curses(3) beep function. */
|
||||
#undef HAVE_CURSES_BEEP
|
||||
|
||||
/* Define if you have the curses(3) flash function. */
|
||||
#undef HAVE_CURSES_FLASH
|
||||
|
||||
/* Define if you have the curses(3) idlok function. */
|
||||
#undef HAVE_CURSES_IDLOK
|
||||
|
||||
/* Define if you have the curses(3) keypad function. */
|
||||
#undef HAVE_CURSES_KEYPAD
|
||||
|
||||
/* Define if you have the curses(3) newterm function. */
|
||||
#undef HAVE_CURSES_NEWTERM
|
||||
|
||||
/* Define if you have the curses(3) setupterm function. */
|
||||
#undef HAVE_CURSES_SETUPTERM
|
||||
|
||||
/* Define if you have the curses(3) tigetstr/tigetnum functions. */
|
||||
#undef HAVE_CURSES_TIGETSTR
|
||||
|
||||
/* Define if you have the DB __hash_open call in the C library. */
|
||||
#undef HAVE_DB_HASH_OPEN
|
||||
|
||||
/* Define if you have the chsize(2) system call. */
|
||||
#undef HAVE_FTRUNCATE_CHSIZE
|
||||
|
||||
/* Define if you have the ftruncate(2) system call. */
|
||||
#undef HAVE_FTRUNCATE_FTRUNCATE
|
||||
|
||||
/* Define if you have fcntl(2) style locking. */
|
||||
#undef HAVE_LOCK_FCNTL
|
||||
|
||||
/* Define if you have flock(2) style locking. */
|
||||
#undef HAVE_LOCK_FLOCK
|
||||
|
||||
/* Define if you want to compile in the Perl interpreter. */
|
||||
#undef HAVE_PERL_INTERP
|
||||
|
||||
/* Define if your Perl is at least 5.003_01. */
|
||||
#undef HAVE_PERL_5_003_01
|
||||
|
||||
/* Define if you have the Berkeley style revoke(2) system call. */
|
||||
#undef HAVE_REVOKE
|
||||
|
||||
/* Define if you have the Berkeley style strsep(3) function. */
|
||||
#undef HAVE_STRSEP
|
||||
|
||||
/* Define if you have <sys/mman.h> */
|
||||
#undef HAVE_SYS_MMAN_H
|
||||
|
||||
/* Define if you have <sys/select.h> */
|
||||
#undef HAVE_SYS_SELECT_H
|
||||
|
||||
/* Define if you have the System V style pty calls. */
|
||||
#undef HAVE_SYS5_PTY
|
||||
|
||||
/* Define if you want to compile in the Tcl interpreter. */
|
||||
#undef HAVE_TCL_INTERP
|
||||
|
||||
/* Define if your sprintf returns a pointer, not a length. */
|
||||
#undef SPRINTF_RET_CHARPNT
|
17
contrib/nvi/build/aclocal.m4
vendored
Normal file
17
contrib/nvi/build/aclocal.m4
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
AC_DEFUN(AM_SANITY_CHECK_CC,
|
||||
[dnl Derived from macros from Bruno Haible and from Cygnus.
|
||||
AC_MSG_CHECKING([whether the compiler ($CC $CFLAGS $LDFLAGS) actually works])
|
||||
AC_LANG_SAVE
|
||||
AC_LANG_C
|
||||
AC_TRY_RUN([main() { exit(0); }],
|
||||
am_cv_prog_cc_works=yes, am_cv_prog_cc_works=no,
|
||||
dnl When crosscompiling, just try linking.
|
||||
AC_TRY_LINK([], [], am_cv_prog_cc_works=yes,
|
||||
am_cv_prog_cc_works=no))
|
||||
AC_LANG_RESTORE
|
||||
case "$am_cv_prog_cc_works" in
|
||||
*no) AC_MSG_ERROR([Installation or configuration problem: C compiler cannot create executables.]) ;;
|
||||
*yes) ;;
|
||||
esac
|
||||
AC_MSG_RESULT(yes)
|
||||
])dnl
|
571
contrib/nvi/build/config.guess
vendored
Executable file
571
contrib/nvi/build/config.guess
vendored
Executable file
@ -0,0 +1,571 @@
|
||||
#! /bin/sh
|
||||
# Attempt to guess a canonical system name.
|
||||
# Copyright (C) 1992, 1993, 1994, 1995 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:V*:*)
|
||||
# After 1.2, OSF1 uses "V1.3" for uname -r.
|
||||
echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^V//'`
|
||||
exit 0 ;;
|
||||
alpha:OSF1:*:*)
|
||||
# 1.2 uses "1.2" for uname -r.
|
||||
echo alpha-dec-osf${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
21064:Windows_NT:50:3)
|
||||
echo alpha-dec-winnt3.5
|
||||
exit 0 ;;
|
||||
amiga:NetBSD:*:*)
|
||||
echo m68k-cbm-netbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
|
||||
echo arm-acorn-riscix${UNAME_RELEASE}
|
||||
exit 0;;
|
||||
Pyramid*:OSx*:*:*)
|
||||
if test "`(/bin/universe) 2>/dev/null`" = att ; then
|
||||
echo pyramid-pyramid-sysv3
|
||||
else
|
||||
echo pyramid-pyramid-bsd
|
||||
fi
|
||||
exit 0 ;;
|
||||
sun4*:SunOS:5.*:*)
|
||||
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit 0 ;;
|
||||
i86pc:SunOS:5.*:*)
|
||||
echo i386-unknown-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 ;;
|
||||
atari*:NetBSD:*:*)
|
||||
echo m68k-atari-netbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
sun3*:NetBSD:*:*)
|
||||
echo m68k-sun-netbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
mac68k:NetBSD:*:*)
|
||||
echo m68k-apple-netbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
RISC*:ULTRIX:*:*)
|
||||
echo mips-dec-ultrix${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
VAX*:ULTRIX*:*:*)
|
||||
echo vax-dec-ultrix${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
mips:*:4*:UMIPS)
|
||||
echo mips-mips-riscos4sysv
|
||||
exit 0 ;;
|
||||
mips:*:5*:RISCos)
|
||||
echo mips-mips-riscos${UNAME_RELEASE}
|
||||
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:*:*)
|
||||
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
|
||||
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?[79] ) 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 ;;
|
||||
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*C90:*:*:*)
|
||||
echo c90-cray-unicos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
CRAY-2:*:*:*)
|
||||
echo cray2-cray-unicos
|
||||
exit 0 ;;
|
||||
hp3[0-9][05]:NetBSD:*:*)
|
||||
echo m68k-hp-netbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
i?86:BSD/386:*:* | *:BSD/OS:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-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 ;;
|
||||
*:GNU:*:*)
|
||||
echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
|
||||
exit 0 ;;
|
||||
*:Linux:*:*)
|
||||
# The BFD linker knows what the default object file format is, so
|
||||
# first see if it will tell us.
|
||||
ld_help_string=`ld --help 2>&1`
|
||||
if echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: elf_i?86"; then
|
||||
echo "${UNAME_MACHINE}-unknown-linux" ; exit 0
|
||||
elif echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i?86linux"; then
|
||||
echo "${UNAME_MACHINE}-unknown-linuxaout" ; exit 0
|
||||
elif echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i?86coff"; then
|
||||
echo "${UNAME_MACHINE}-unknown-linuxcoff" ; exit 0
|
||||
elif test "${UNAME_MACHINE}" = "alpha" ; then
|
||||
echo alpha-unknown-linux ; exit 0
|
||||
else
|
||||
# Either a pre-BFD a.out linker (linuxoldld) or one that does not give us
|
||||
# useful --help. Gcc wants to distinguish between linuxoldld and linuxaout.
|
||||
test ! -d /usr/lib/ldscripts/. \
|
||||
&& echo "${UNAME_MACHINE}-unknown-linuxoldld" && exit 0
|
||||
# Determine whether the default compiler is a.out or elf
|
||||
cat >dummy.c <<EOF
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
#ifdef __ELF__
|
||||
printf ("%s-unknown-linux\n", argv[1]);
|
||||
#else
|
||||
printf ("%s-unknown-linuxaout\n", argv[1]);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
|
||||
rm -f dummy.c dummy
|
||||
fi ;;
|
||||
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
|
||||
# are messed up and put the nodename in both sysname and nodename.
|
||||
i?86:DYNIX/ptx:4*:*)
|
||||
echo i386-sequent-sysv4
|
||||
exit 0 ;;
|
||||
i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
|
||||
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
|
||||
echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
|
||||
else
|
||||
echo ${UNAME_MACHINE}-unknown-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}-unknown-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
|
||||
echo ${UNAME_MACHINE}-unknown-sco$UNAME_REL
|
||||
else
|
||||
echo ${UNAME_MACHINE}-unknown-sysv32
|
||||
fi
|
||||
exit 0 ;;
|
||||
Intel:Mach:3*:*)
|
||||
echo i386-unknown-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 ;;
|
||||
M680?0:*:R3V[567]*:*)
|
||||
test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
|
||||
3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0)
|
||||
uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||
&& echo i486-ncr-sysv4.3 && exit 0 ;;
|
||||
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
|
||||
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 ;;
|
||||
mc68*: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.*:* | uSPARC2:LynxOS:2.*:*)
|
||||
echo sparc-unknown-lynxos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
PowerPC:LynxOS:2.*:*)
|
||||
echo powerpc-unknown-lynxos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
RM*:SINIX-*:*:*)
|
||||
echo mips-sni-sysv4
|
||||
exit 0 ;;
|
||||
*FTX*)
|
||||
echo i860-stratus-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 ;;
|
||||
mc68*:A/UX:*:*)
|
||||
echo m68k-apple-aux${UNAME_RELEASE}
|
||||
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%s\n", __ARCHITECTURE__, version==2 ? "2" : "3");
|
||||
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-unknown-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
|
179
contrib/nvi/build/config.h.in
Normal file
179
contrib/nvi/build/config.h.in
Normal file
@ -0,0 +1,179 @@
|
||||
/* config.h.in. Generated automatically from configure.in by autoheader. */
|
||||
|
||||
/* Define to empty if the keyword does not work. */
|
||||
#undef const
|
||||
|
||||
/* Define if you have a working `mmap' system call. */
|
||||
#undef HAVE_MMAP
|
||||
|
||||
/* Define if your struct stat has st_blksize. */
|
||||
#undef HAVE_ST_BLKSIZE
|
||||
|
||||
/* Define if you have <vfork.h>. */
|
||||
#undef HAVE_VFORK_H
|
||||
|
||||
/* 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
|
||||
|
||||
/* Define if your <sys/time.h> declares struct tm. */
|
||||
#undef TM_IN_SYS_TIME
|
||||
|
||||
/* Define vfork as fork if vfork does not work. */
|
||||
#undef vfork
|
||||
|
||||
/* Define if your processor stores words with the most significant
|
||||
byte first (like Motorola and SPARC, unlike Intel and VAX). */
|
||||
#undef WORDS_BIGENDIAN
|
||||
|
||||
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||
#undef ssize_t
|
||||
|
||||
/* Define if you want a debugging version. */
|
||||
#undef DEBUG
|
||||
|
||||
/* Define if you have a System V-style (broken) gettimeofday. */
|
||||
#undef HAVE_BROKEN_GETTIMEOFDAY
|
||||
|
||||
/* Define if you have a Ultrix-style (broken) vdisable. */
|
||||
#undef HAVE_BROKEN_VDISABLE
|
||||
|
||||
/* Define if you have a BSD version of curses. */
|
||||
#undef HAVE_BSD_CURSES
|
||||
|
||||
/* Define if you have the curses(3) addnstr function. */
|
||||
#undef HAVE_CURSES_ADDNSTR
|
||||
|
||||
/* Define if you have the curses(3) beep function. */
|
||||
#undef HAVE_CURSES_BEEP
|
||||
|
||||
/* Define if you have the curses(3) flash function. */
|
||||
#undef HAVE_CURSES_FLASH
|
||||
|
||||
/* Define if you have the curses(3) idlok function. */
|
||||
#undef HAVE_CURSES_IDLOK
|
||||
|
||||
/* Define if you have the curses(3) keypad function. */
|
||||
#undef HAVE_CURSES_KEYPAD
|
||||
|
||||
/* Define if you have the curses(3) newterm function. */
|
||||
#undef HAVE_CURSES_NEWTERM
|
||||
|
||||
/* Define if you have the curses(3) setupterm function. */
|
||||
#undef HAVE_CURSES_SETUPTERM
|
||||
|
||||
/* Define if you have the curses(3) tigetstr/tigetnum functions. */
|
||||
#undef HAVE_CURSES_TIGETSTR
|
||||
|
||||
/* Define if you have the chsize(2) system call. */
|
||||
#undef HAVE_FTRUNCATE_CHSIZE
|
||||
|
||||
/* Define if you have the ftruncate(2) system call. */
|
||||
#undef HAVE_FTRUNCATE_FTRUNCATE
|
||||
|
||||
/* Define if you have fcntl(2) style locking. */
|
||||
#undef HAVE_LOCK_FCNTL
|
||||
|
||||
/* Define if you have flock(2) style locking. */
|
||||
#undef HAVE_LOCK_FLOCK
|
||||
|
||||
/* Define if you want to compile in the Perl interpreter. */
|
||||
#undef HAVE_PERL_INTERP
|
||||
|
||||
/* Define if your Perl is at least 5.003_01. */
|
||||
#undef HAVE_PERL_5_003_01
|
||||
|
||||
/* Define if you have the Berkeley style revoke(2) system call. */
|
||||
#undef HAVE_REVOKE
|
||||
|
||||
/* Define if you have <sys/mman.h> */
|
||||
#undef HAVE_SYS_MMAN_H
|
||||
|
||||
/* Define if you have <sys/select.h> */
|
||||
#undef HAVE_SYS_SELECT_H
|
||||
|
||||
/* Define if you have the System V style pty calls. */
|
||||
#undef HAVE_SYS5_PTY
|
||||
|
||||
/* Define if you want to compile in the Tcl interpreter. */
|
||||
#undef HAVE_TCL_INTERP
|
||||
|
||||
/* Define if your sprintf returns a pointer, not a length. */
|
||||
#undef SPRINTF_RET_CHARPNT
|
||||
|
||||
/* Define if you have the bsearch function. */
|
||||
#undef HAVE_BSEARCH
|
||||
|
||||
/* Define if you have the gethostname function. */
|
||||
#undef HAVE_GETHOSTNAME
|
||||
|
||||
/* Define if you have the getopt function. */
|
||||
#undef HAVE_GETOPT
|
||||
|
||||
/* Define if you have the getpagesize function. */
|
||||
#undef HAVE_GETPAGESIZE
|
||||
|
||||
/* Define if you have the memchr function. */
|
||||
#undef HAVE_MEMCHR
|
||||
|
||||
/* Define if you have the memcpy function. */
|
||||
#undef HAVE_MEMCPY
|
||||
|
||||
/* Define if you have the memmove function. */
|
||||
#undef HAVE_MEMMOVE
|
||||
|
||||
/* Define if you have the memset function. */
|
||||
#undef HAVE_MEMSET
|
||||
|
||||
/* Define if you have the mkstemp function. */
|
||||
#undef HAVE_MKSTEMP
|
||||
|
||||
/* Define if you have the mmap function. */
|
||||
#undef HAVE_MMAP
|
||||
|
||||
/* Define if you have the select function. */
|
||||
#undef HAVE_SELECT
|
||||
|
||||
/* Define if you have the setenv function. */
|
||||
#undef HAVE_SETENV
|
||||
|
||||
/* Define if you have the snprintf function. */
|
||||
#undef HAVE_SNPRINTF
|
||||
|
||||
/* Define if you have the strdup function. */
|
||||
#undef HAVE_STRDUP
|
||||
|
||||
/* Define if you have the strerror function. */
|
||||
#undef HAVE_STRERROR
|
||||
|
||||
/* Define if you have the strpbrk function. */
|
||||
#undef HAVE_STRPBRK
|
||||
|
||||
/* Define if you have the strsep function. */
|
||||
#undef HAVE_STRSEP
|
||||
|
||||
/* Define if you have the strtol function. */
|
||||
#undef HAVE_STRTOL
|
||||
|
||||
/* Define if you have the strtoul function. */
|
||||
#undef HAVE_STRTOUL
|
||||
|
||||
/* Define if you have the unsetenv function. */
|
||||
#undef HAVE_UNSETENV
|
||||
|
||||
/* Define if you have the valloc function. */
|
||||
#undef HAVE_VALLOC
|
||||
|
||||
/* Define if you have the vsnprintf function. */
|
||||
#undef HAVE_VSNPRINTF
|
872
contrib/nvi/build/config.sub
vendored
Executable file
872
contrib/nvi/build/config.sub
vendored
Executable file
@ -0,0 +1,872 @@
|
||||
#! /bin/sh
|
||||
# Configuration validation subroutine script, version 1.1.
|
||||
# Copyright (C) 1991, 1992, 1993, 1994, 1995 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
|
||||
# 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 (if any).
|
||||
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
|
||||
if [ $basic_machine != $1 ]
|
||||
then os=`echo $1 | sed 's/.*-/-/'`
|
||||
else os=; fi
|
||||
|
||||
### 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 )
|
||||
os=
|
||||
basic_machine=$1
|
||||
;;
|
||||
-hiux*)
|
||||
os=-hiuxwe2
|
||||
;;
|
||||
-sco4)
|
||||
os=-sco3.2v4
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
|
||||
;;
|
||||
-sco3.2.[4-9]*)
|
||||
os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
|
||||
;;
|
||||
-sco3.2v[4-9]*)
|
||||
# Don't forget version if it is 3.2v4 or newer.
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
|
||||
;;
|
||||
-sco*)
|
||||
os=-sco3.2v2
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
|
||||
;;
|
||||
-isc)
|
||||
os=-isc2.2
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
|
||||
;;
|
||||
-clix*)
|
||||
basic_machine=clipper-intergraph
|
||||
;;
|
||||
-isc*)
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
|
||||
;;
|
||||
-lynx*)
|
||||
os=-lynxos
|
||||
;;
|
||||
-ptx*)
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
|
||||
;;
|
||||
-windowsnt*)
|
||||
os=`echo $os | sed -e 's/windowsnt/winnt/'`
|
||||
;;
|
||||
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 | i[345]86 | i860 | m68k | m68000 | m88k | ns32k | arm \
|
||||
| arme[lb] | pyramid \
|
||||
| tron | a29k | 580 | i960 | h8300 | hppa1.0 | hppa1.1 \
|
||||
| alpha | we32k | ns16k | clipper | sparclite | i370 | sh \
|
||||
| powerpc | powerpcle | sparc64 | 1750a | dsp16xx | mips64 | mipsel \
|
||||
| pdp11 | mips64el | mips64orion | mips64orionel \
|
||||
| sparc)
|
||||
basic_machine=$basic_machine-unknown
|
||||
;;
|
||||
# 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[345]86-* | i860-* | m68k-* | m68000-* | m88k-* \
|
||||
| sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
|
||||
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
|
||||
| none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
|
||||
| hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
|
||||
| pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
|
||||
| pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \
|
||||
| mips64el-* | mips64orion-* | mips64orionel-*)
|
||||
;;
|
||||
# Recognize the various machine names and aliases which stand
|
||||
# for a CPU type and a company and sometimes even an OS.
|
||||
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
|
||||
basic_machine=m68000-att
|
||||
;;
|
||||
3b*)
|
||||
basic_machine=we32k-att
|
||||
;;
|
||||
alliant | fx80)
|
||||
basic_machine=fx80-alliant
|
||||
;;
|
||||
altos | altos3068)
|
||||
basic_machine=m68k-altos
|
||||
;;
|
||||
am29k)
|
||||
basic_machine=a29k-none
|
||||
os=-bsd
|
||||
;;
|
||||
amdahl)
|
||||
basic_machine=580-amdahl
|
||||
os=-sysv
|
||||
;;
|
||||
amiga | amiga-*)
|
||||
basic_machine=m68k-cbm
|
||||
;;
|
||||
amigados)
|
||||
basic_machine=m68k-cbm
|
||||
os=-amigados
|
||||
;;
|
||||
amigaunix | amix)
|
||||
basic_machine=m68k-cbm
|
||||
os=-sysv4
|
||||
;;
|
||||
apollo68)
|
||||
basic_machine=m68k-apollo
|
||||
os=-sysv
|
||||
;;
|
||||
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
|
||||
;;
|
||||
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
|
||||
;;
|
||||
i370-ibm* | ibm*)
|
||||
basic_machine=i370-ibm
|
||||
os=-mvs
|
||||
;;
|
||||
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
|
||||
i[345]86v32)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
|
||||
os=-sysv32
|
||||
;;
|
||||
i[345]86v4*)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
|
||||
os=-sysv4
|
||||
;;
|
||||
i[345]86v)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
|
||||
os=-sysv
|
||||
;;
|
||||
i[345]86sol2)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
|
||||
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
|
||||
;;
|
||||
mac | macintosh)
|
||||
basic_machine=m68k-apple
|
||||
;;
|
||||
magnum | m3230)
|
||||
basic_machine=mips-mips
|
||||
os=-sysv
|
||||
;;
|
||||
merlin)
|
||||
basic_machine=ns32k-utek
|
||||
os=-sysv
|
||||
;;
|
||||
miniframe)
|
||||
basic_machine=m68000-convergent
|
||||
;;
|
||||
mips3*-*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
|
||||
;;
|
||||
mips3*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
|
||||
;;
|
||||
ncr3000)
|
||||
basic_machine=i486-ncr
|
||||
os=-sysv4
|
||||
;;
|
||||
news | news700 | news800 | news900)
|
||||
basic_machine=m68k-sony
|
||||
os=-newsos
|
||||
;;
|
||||
news1000)
|
||||
basic_machine=m68030-sony
|
||||
os=-newsos
|
||||
;;
|
||||
news-3600 | risc-news)
|
||||
basic_machine=mips-sony
|
||||
os=-newsos
|
||||
;;
|
||||
next | m*-next )
|
||||
basic_machine=m68k-next
|
||||
case $os in
|
||||
-nextstep* )
|
||||
;;
|
||||
-ns2*)
|
||||
os=-nextstep2
|
||||
;;
|
||||
*)
|
||||
os=-nextstep3
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
nh3000)
|
||||
basic_machine=m68k-harris
|
||||
os=-cxux
|
||||
;;
|
||||
nh[45]000)
|
||||
basic_machine=m88k-harris
|
||||
os=-cxux
|
||||
;;
|
||||
nindy960)
|
||||
basic_machine=i960-intel
|
||||
os=-nindy
|
||||
;;
|
||||
np1)
|
||||
basic_machine=np1-gould
|
||||
;;
|
||||
pa-hitachi)
|
||||
basic_machine=hppa1.1-hitachi
|
||||
os=-hiuxwe2
|
||||
;;
|
||||
paragon)
|
||||
basic_machine=i860-intel
|
||||
os=-osf
|
||||
;;
|
||||
pbd)
|
||||
basic_machine=sparc-tti
|
||||
;;
|
||||
pbb)
|
||||
basic_machine=m68k-tti
|
||||
;;
|
||||
pc532 | pc532-*)
|
||||
basic_machine=ns32k-pc532
|
||||
;;
|
||||
pentium | p5 | p6)
|
||||
# We don't have specific support for the Intel Pentium (p6) followon yet, so just call it a Pentium
|
||||
basic_machine=i586-intel
|
||||
;;
|
||||
pentium-* | p5-* | p6-*)
|
||||
# We don't have specific support for the Intel Pentium (p6) followon yet, so just call it a Pentium
|
||||
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
k5)
|
||||
# We don't have specific support for AMD's K5 yet, so just call it a Pentium
|
||||
basic_machine=i586-amd
|
||||
;;
|
||||
nexen)
|
||||
# We don't have specific support for Nexgen yet, so just call it a Pentium
|
||||
basic_machine=i586-nexgen
|
||||
;;
|
||||
pn)
|
||||
basic_machine=pn-gould
|
||||
;;
|
||||
power) basic_machine=rs6000-ibm
|
||||
;;
|
||||
ppc) basic_machine=powerpc-unknown
|
||||
;;
|
||||
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppcle | powerpclittle | ppc-le | powerpc-little)
|
||||
basic_machine=powerpcle-unknown
|
||||
;;
|
||||
ppcle-* | powerpclittle-*)
|
||||
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ps2)
|
||||
basic_machine=i386-ibm
|
||||
;;
|
||||
rm[46]00)
|
||||
basic_machine=mips-siemens
|
||||
;;
|
||||
rtpc | rtpc-*)
|
||||
basic_machine=romp-ibm
|
||||
;;
|
||||
sequent)
|
||||
basic_machine=i386-sequent
|
||||
;;
|
||||
sh)
|
||||
basic_machine=sh-hitachi
|
||||
os=-hms
|
||||
;;
|
||||
sps7)
|
||||
basic_machine=m68k-bull
|
||||
os=-sysv2
|
||||
;;
|
||||
spur)
|
||||
basic_machine=spur-unknown
|
||||
;;
|
||||
sun2)
|
||||
basic_machine=m68000-sun
|
||||
;;
|
||||
sun2os3)
|
||||
basic_machine=m68000-sun
|
||||
os=-sunos3
|
||||
;;
|
||||
sun2os4)
|
||||
basic_machine=m68000-sun
|
||||
os=-sunos4
|
||||
;;
|
||||
sun3os3)
|
||||
basic_machine=m68k-sun
|
||||
os=-sunos3
|
||||
;;
|
||||
sun3os4)
|
||||
basic_machine=m68k-sun
|
||||
os=-sunos4
|
||||
;;
|
||||
sun4os3)
|
||||
basic_machine=sparc-sun
|
||||
os=-sunos3
|
||||
;;
|
||||
sun4os4)
|
||||
basic_machine=sparc-sun
|
||||
os=-sunos4
|
||||
;;
|
||||
sun4sol2)
|
||||
basic_machine=sparc-sun
|
||||
os=-solaris2
|
||||
;;
|
||||
sun3 | sun3-*)
|
||||
basic_machine=m68k-sun
|
||||
;;
|
||||
sun4)
|
||||
basic_machine=sparc-sun
|
||||
;;
|
||||
sun386 | sun386i | roadrunner)
|
||||
basic_machine=i386-sun
|
||||
;;
|
||||
symmetry)
|
||||
basic_machine=i386-sequent
|
||||
os=-dynix
|
||||
;;
|
||||
tower | tower-32)
|
||||
basic_machine=m68k-ncr
|
||||
;;
|
||||
udi29k)
|
||||
basic_machine=a29k-amd
|
||||
os=-udi
|
||||
;;
|
||||
ultra3)
|
||||
basic_machine=a29k-nyu
|
||||
os=-sym1
|
||||
;;
|
||||
vaxv)
|
||||
basic_machine=vax-dec
|
||||
os=-sysv
|
||||
;;
|
||||
vms)
|
||||
basic_machine=vax-dec
|
||||
os=-vms
|
||||
;;
|
||||
vxworks960)
|
||||
basic_machine=i960-wrs
|
||||
os=-vxworks
|
||||
;;
|
||||
vxworks68)
|
||||
basic_machine=m68k-wrs
|
||||
os=-vxworks
|
||||
;;
|
||||
vxworks29k)
|
||||
basic_machine=a29k-wrs
|
||||
os=-vxworks
|
||||
;;
|
||||
xmp)
|
||||
basic_machine=xmp-cray
|
||||
os=-unicos
|
||||
;;
|
||||
xps | xps100)
|
||||
basic_machine=xps100-honeywell
|
||||
;;
|
||||
none)
|
||||
basic_machine=none-none
|
||||
os=-none
|
||||
;;
|
||||
|
||||
# Here we handle the default manufacturer of certain CPU types. It is in
|
||||
# some cases the only manufacturer, in others, it is the most popular.
|
||||
mips)
|
||||
basic_machine=mips-mips
|
||||
;;
|
||||
romp)
|
||||
basic_machine=romp-ibm
|
||||
;;
|
||||
rs6000)
|
||||
basic_machine=rs6000-ibm
|
||||
;;
|
||||
vax)
|
||||
basic_machine=vax-dec
|
||||
;;
|
||||
pdp11)
|
||||
basic_machine=pdp11-dec
|
||||
;;
|
||||
we32k)
|
||||
basic_machine=we32k-att
|
||||
;;
|
||||
sparc)
|
||||
basic_machine=sparc-sun
|
||||
;;
|
||||
cydra)
|
||||
basic_machine=cydra-cydrome
|
||||
;;
|
||||
orion)
|
||||
basic_machine=orion-highlevel
|
||||
;;
|
||||
orion105)
|
||||
basic_machine=clipper-highlevel
|
||||
;;
|
||||
*)
|
||||
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Here we canonicalize certain aliases for manufacturers.
|
||||
case $basic_machine in
|
||||
*-digital*)
|
||||
basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
|
||||
;;
|
||||
*-commodore*)
|
||||
basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
# Decode manufacturer-specific aliases for certain operating systems.
|
||||
|
||||
if [ x"$os" != x"" ]
|
||||
then
|
||||
case $os in
|
||||
# -solaris* is a basic system type, with this one exception.
|
||||
-solaris1 | -solaris1.*)
|
||||
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
||||
;;
|
||||
-solaris)
|
||||
os=-solaris2
|
||||
;;
|
||||
-unixware* | svr4*)
|
||||
os=-sysv4
|
||||
;;
|
||||
-gnu/linux*)
|
||||
os=`echo $os | sed -e 's|gnu/linux|linux|'`
|
||||
;;
|
||||
# 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[345]* \
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
|
||||
| -amigados* | -msdos* | -newsos* | -unicos* | -aos* \
|
||||
| -nindy* | -vxworks* | -ebmon* | -hms* | -mvs* | -clix* \
|
||||
| -riscos* | -linux* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||
| -hiux* | -386bsd* | -netbsd* | -freebsd* | -riscix* \
|
||||
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
|
||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||
| -udi* | -eabi* | -lites* )
|
||||
# Remember, each alternative MUST END IN *, to match a version number.
|
||||
;;
|
||||
-aux*)
|
||||
;;
|
||||
-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
|
||||
;;
|
||||
# Preserve the version number of sinix5.
|
||||
-sinix5.*)
|
||||
os=`echo $os | sed -e 's|sinix|sysv|'`
|
||||
;;
|
||||
-sinix*)
|
||||
os=-sysv4
|
||||
;;
|
||||
-triton*)
|
||||
os=-sysv3
|
||||
;;
|
||||
-oss*)
|
||||
os=-sysv3
|
||||
;;
|
||||
-svr4)
|
||||
os=-sysv4
|
||||
;;
|
||||
-svr3)
|
||||
os=-sysv3
|
||||
;;
|
||||
-sysvr4)
|
||||
os=-sysv4
|
||||
;;
|
||||
# This must come after -sysvr4.
|
||||
-sysv*)
|
||||
;;
|
||||
-xenix)
|
||||
os=-xenix
|
||||
;;
|
||||
-none)
|
||||
;;
|
||||
*)
|
||||
# Get rid of the `-' at the beginning of $os.
|
||||
os=`echo $os | sed 's/[^-]*-//'`
|
||||
echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
else
|
||||
|
||||
# Here we handle the default operating systems that come with various machines.
|
||||
# The value should be what the vendor currently ships out the door with their
|
||||
# machine or put another way, the most popular os provided with the machine.
|
||||
|
||||
# Note that if you're going to try to match "-MANUFACTURER" here (say,
|
||||
# "-sun"), then you have to tell the case statement up towards the top
|
||||
# that MANUFACTURER isn't an operating system. Otherwise, code above
|
||||
# will signal an error saying that MANUFACTURER isn't an operating
|
||||
# system, and we'll never get to this point.
|
||||
|
||||
case $basic_machine in
|
||||
*-acorn)
|
||||
os=-riscix1.2
|
||||
;;
|
||||
arm*-semi)
|
||||
os=-aout
|
||||
;;
|
||||
pdp11-*)
|
||||
os=-none
|
||||
;;
|
||||
*-dec | vax-*)
|
||||
os=-ultrix4.2
|
||||
;;
|
||||
m68*-apollo)
|
||||
os=-domain
|
||||
;;
|
||||
i386-sun)
|
||||
os=-sunos4.0.2
|
||||
;;
|
||||
m68000-sun)
|
||||
os=-sunos3
|
||||
# This also exists in the configure program, but was not the
|
||||
# default.
|
||||
# os=-sunos4
|
||||
;;
|
||||
*-tti) # must be before sparc entry or we get the wrong os.
|
||||
os=-sysv3
|
||||
;;
|
||||
sparc-* | *-sun)
|
||||
os=-sunos4.1.1
|
||||
;;
|
||||
*-ibm)
|
||||
os=-aix
|
||||
;;
|
||||
*-hp)
|
||||
os=-hpux
|
||||
;;
|
||||
*-hitachi)
|
||||
os=-hiux
|
||||
;;
|
||||
i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
|
||||
os=-sysv
|
||||
;;
|
||||
*-cbm)
|
||||
os=-amigados
|
||||
;;
|
||||
*-dg)
|
||||
os=-dgux
|
||||
;;
|
||||
*-dolphin)
|
||||
os=-sysv3
|
||||
;;
|
||||
m68k-ccur)
|
||||
os=-rtu
|
||||
;;
|
||||
m88k-omron*)
|
||||
os=-luna
|
||||
;;
|
||||
*-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
|
||||
;;
|
||||
*)
|
||||
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
|
||||
;;
|
||||
-vxworks*)
|
||||
vendor=wrs
|
||||
;;
|
||||
-aux*)
|
||||
vendor=apple
|
||||
;;
|
||||
esac
|
||||
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
|
||||
;;
|
||||
esac
|
||||
|
||||
echo $basic_machine$os
|
4446
contrib/nvi/build/configure
vendored
Executable file
4446
contrib/nvi/build/configure
vendored
Executable file
File diff suppressed because it is too large
Load Diff
725
contrib/nvi/build/configure.in
Normal file
725
contrib/nvi/build/configure.in
Normal file
@ -0,0 +1,725 @@
|
||||
dnl @(#)configure.in 8.134 (Berkeley) 10/15/96
|
||||
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_INIT(../common/main.c)
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
dnl Configure setup.
|
||||
AC_PROG_INSTALL()
|
||||
AC_CANONICAL_HOST
|
||||
AC_ARG_PROGRAM()
|
||||
|
||||
dnl If the user wants a debugging environment, set OPTFLAG now. (Some
|
||||
dnl compilers won't mix optimizing and debug flags.)
|
||||
AC_MSG_CHECKING(if --enable-debug option specified)
|
||||
AC_ARG_ENABLE(debug,
|
||||
[ --enable-debug Build a debugging version.],
|
||||
[vi_cv_debug="yes"], [vi_cv_debug="no"])
|
||||
if test "$vi_cv_debug" = yes; then
|
||||
AC_DEFINE(DEBUG)
|
||||
OPTFLAG=${OPTFLAG-"-g"}
|
||||
no_op_OPTFLAG=${no_op_OPTFLAG-"-g"}
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_debug)
|
||||
|
||||
dnl This is where we handle stuff that autoconf can't handle.
|
||||
dnl XXX
|
||||
dnl Don't override anything if it's already set from the environment.
|
||||
|
||||
dnl Compiler, preprocessor and load flags.
|
||||
dnl AUX: -ZP disables _BSD_SOURCE et al, but enables POSIX at link time.
|
||||
dnl LynxOS: We check for gcc 2.x or better, the gcc 1 that was shipped with
|
||||
dnl LynxOS historically wasn't good enough.
|
||||
AC_SUBST(CPPFLAGS)
|
||||
case "$host_os" in
|
||||
aix3.2.5) OPTFLAG=${OPTFLAG-"-O"};;
|
||||
aix4.1*) CFLAGS=${CFLAGS-"-qstrict"}
|
||||
OPTFLAG=${OPTFLAG-"-O3"};;
|
||||
aux*) CPPFLAGS=${CPPFLAGS-"-ZP -D_BSD_SOURCE -D_SYSV_SOURCE -D_AUX_SOURCE"}
|
||||
LDFLAGS=${LDFLAGS-"-ZP"}
|
||||
OPTFLAG=${OPTFLAG-"-O"};;
|
||||
bsd4.4) OPTFLAG=${OPTFLAG-"-O2"};;
|
||||
bsdi*) CC=${CC-"shlicc"}
|
||||
OPTFLAG=${OPTFLAG-"-O2"};;
|
||||
irix6*) OPTFLAG=${OPTFLAG-"-O2"};;
|
||||
irix*) OPTFLAG=${OPTFLAG-"-O2"};;
|
||||
lynxos*) AC_PROG_CC()
|
||||
AC_MSG_CHECKING([for GNU C (gcc) version 2.x])
|
||||
ac_cv_gcc_vers=`${CC-cc} -v 2>&1 | \
|
||||
grep "gcc version " | sed 's/.*version //'`
|
||||
ac_cv_gcc_major=`echo "$ac_cv_gcc_vers" | sed 's/\..*//'`
|
||||
if test "$ac_cv_gcc_major" = "2" ; then
|
||||
AC_MSG_RESULT(yes)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
echo "Fatal error: Nvi requires gcc 2.x to build on LynxOS."
|
||||
echo "See build/README.LynxOS for more information."
|
||||
exit 1
|
||||
fi;;
|
||||
nextstep3) CPPFLAGS=${CPPFLAGS-"-w -pipe -posix"}
|
||||
LDFLAGS=${LDFLAGS-"-posix"}
|
||||
OPTFLAG=${OPTFLAG-"-O9"};;
|
||||
osf*) CFLAGS=${CFLAGS-"-Olimit 1000"};;
|
||||
solaris*) no_op_OPTFLAG=${no_op_OPTFLAG-""};;
|
||||
sunos*) no_op_OPTFLAG=${no_op_OPTFLAG-""};;
|
||||
esac
|
||||
|
||||
dnl The default compiler is cc.
|
||||
AC_SUBST(CC)
|
||||
CC=${CC-cc}
|
||||
|
||||
dnl The default OPTFLAG is -O
|
||||
AC_SUBST(OPTFLAG)
|
||||
OPTFLAG=${OPTFLAG-"-O"}
|
||||
|
||||
dnl The SunOS/Solaris compiler can't optimize vi/v_txt.c; the symptom is
|
||||
dnl that the command 35i==<esc> turns into an infinite loop.
|
||||
AC_SUBST(no_op_OPTFLAG)
|
||||
no_op_OPTFLAG=${no_op_OPTFLAG-"$OPTFLAG"}
|
||||
|
||||
dnl Libraries.
|
||||
case "$host_os" in
|
||||
bsdi2.1) LIBS=${LIBS-"-lipc"};;
|
||||
dgux*) LIBS=${LIBS-"-ldgc"};;
|
||||
irix6*) LIBS=${LIBS-"-lbsd"};;
|
||||
irix*) LIBS=${LIBS-"-lc_s -lbsd"};;
|
||||
isc*) LIBS=${LIBS-"-lcposix -linet"};;
|
||||
netbsd1*) LIBS=${LIBS-"-lcrypt"};;
|
||||
ptx*) LIBS=${LIBS-"-lseq -linet -lsocket"};;
|
||||
sco3.2*) LIBS=${LIBS-"-lsocket"};;
|
||||
sinix*) LIBS=${LIBS-"-lelf -lc"};;
|
||||
solaris*) LIBS=${LIBS-"-lsocket -lnsl -ldl"}
|
||||
RLIBS=yes;;
|
||||
wgs*) LIBS=${LIBS-"-lnsl"};;
|
||||
esac
|
||||
|
||||
dnl A/UX has a broken getopt(3), strpbrk(3).
|
||||
case "$host_os" in
|
||||
aux*) LIBOBJS="getopt.o strpbrk.o $LIBOBJS";;
|
||||
esac
|
||||
|
||||
dnl Ultrix has a broken POSIX.1 VDISABLE value.
|
||||
case "$host_os" in
|
||||
ultrix*) AC_DEFINE(HAVE_BROKEN_VDISABLE);;
|
||||
esac
|
||||
|
||||
dnl The user may have additional CPP information.
|
||||
CPPFLAGS="$ADDCPPFLAGS $CPPFLAGS"
|
||||
|
||||
dnl The user may have additional load line information.
|
||||
LDFLAGS="$ADDLDFLAGS $LDFLAGS"
|
||||
|
||||
dnl The user may have additional library information.
|
||||
LIBS="$ADDLIBS $LIBS"
|
||||
|
||||
dnl Check to see if it's going to work.
|
||||
AM_SANITY_CHECK_CC
|
||||
|
||||
dnl Checks for programs.
|
||||
PATH="$PATH:/usr/bin:/usr/sbin:/sbin:/etc:/usr/etc:/usr/lib:/usr/ucblib:"
|
||||
|
||||
dnl Check for the shell path.
|
||||
AC_PATH_PROG(vi_cv_path_shell, sh, no)
|
||||
if test "$vi_cv_path_shell" = no; then
|
||||
echo "Fatal error: the shell utility not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
dnl Check for the sendmail path.
|
||||
AC_PATH_PROG(vi_cv_path_sendmail, sendmail, no)
|
||||
if test "$vi_cv_path_sendmail" = no; then
|
||||
echo "WARNING: The sendmail utility was not found!"
|
||||
echo "WARNING: Users will not be told of saved files."
|
||||
fi
|
||||
|
||||
dnl Check for the perl5/perl path.
|
||||
AC_SUBST(vi_cv_path_perl)
|
||||
AC_PATH_PROGS(vi_cv_path_perl, perl5 perl, no)
|
||||
|
||||
dnl Check for the "preserve" path.
|
||||
dnl Historically, nvi has used /var/tmp/vi.recover. The Linux filesystem
|
||||
dnl standard (FSSTND) uses /var/preserve; we add the vi.recover directory
|
||||
dnl beneath it so that we don't have name collisions with other editors.
|
||||
dnl Other systems have /var/preserve as well, so we test first for an already
|
||||
dnl existing name, and then use the first one that's writeable.
|
||||
AC_SUBST(vi_cv_path_preserve)
|
||||
AC_MSG_CHECKING(for preserve directory)
|
||||
AC_CACHE_VAL(vi_cv_path_preserve, [dnl
|
||||
dirlist="/var/preserve /var/tmp /usr/tmp"
|
||||
vi_cv_path_preserve=no
|
||||
for i in $dirlist; do
|
||||
if test -d $i/vi.recover; then
|
||||
vi_cv_path_preserve=$i/vi.recover
|
||||
break;
|
||||
fi
|
||||
done
|
||||
if test "$vi_cv_path_preserve" = no; then
|
||||
for i in $dirlist; do
|
||||
if test -d $i -a -w $i; then
|
||||
vi_cv_path_preserve=$i/vi.recover
|
||||
break;
|
||||
fi
|
||||
done
|
||||
|
||||
fi])
|
||||
if test "$vi_cv_path_preserve" = no; then
|
||||
echo "Fatal error: no writeable preserve directory found."
|
||||
exit 1
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_path_preserve)
|
||||
|
||||
dnl Check for programs used for installation
|
||||
AC_PATH_PROG(vi_cv_path_chmod, chmod, missing_chmod)
|
||||
AC_PATH_PROG(vi_cv_path_cp, cp, missing_cp)
|
||||
AC_PATH_PROG(vi_cv_path_ln, ln, missing_ln)
|
||||
AC_PATH_PROG(vi_cv_path_mkdir, mkdir, missing_mkdir)
|
||||
AC_PATH_PROG(vi_cv_path_rm, rm, missing_rm)
|
||||
AC_PATH_PROG(vi_cv_path_strip, strip, missing_strip)
|
||||
|
||||
dnl Checks for libraries.
|
||||
dnl Find the X libraries and includes.
|
||||
AC_PATH_X
|
||||
AC_SUBST(XINCS)
|
||||
if test "$no_x" != yes; then
|
||||
if test "X$x_libraries" != "X"; then
|
||||
if test "X$RLIBS" = "Xyes"; then
|
||||
XLIBS="-R$x_libraries -L$x_libraries $XLIBS"
|
||||
else
|
||||
XLIBS="-L$x_libraries $XLIBS"
|
||||
fi
|
||||
fi
|
||||
XLIBS="$XLIBS -lX11"
|
||||
if test "X$x_includes" != "X"; then
|
||||
XINCS="-I$x_includes"
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl If the user wants a Perl interpreter in nvi, load it.
|
||||
AC_SUBST(shrpenv)
|
||||
AC_SUBST(vi_cv_perllib)
|
||||
AC_MSG_CHECKING(if --enable-perlinterp option specified)
|
||||
AC_ARG_ENABLE(perlinterp,
|
||||
[ --enable-perlinterp Include a Perl interpreter in vi.],
|
||||
[vi_cv_perlinterp="yes"], [vi_cv_perlinterp="no"])
|
||||
AC_MSG_RESULT($vi_cv_perlinterp)
|
||||
if test "$vi_cv_perlinterp" = "yes"; then
|
||||
if test "$vi_cv_path_perl" = no; then
|
||||
echo "Fatal error: no perl5 utility found."
|
||||
exit 1
|
||||
fi
|
||||
$vi_cv_path_perl -e 'require 5.002' || {
|
||||
echo "Fatal error: perl5 must be version 5.002 or later."
|
||||
exit 1
|
||||
}
|
||||
$vi_cv_path_perl -e 'close(STDERR);require 5.003_01' &&
|
||||
AC_DEFINE(HAVE_PERL_5_003_01)
|
||||
|
||||
eval `$vi_cv_path_perl -V:shrpenv`
|
||||
if test "X$shrpenv" = "XUNKNOWN"; then # pre 5.003_04
|
||||
shrpenv=""
|
||||
fi
|
||||
vi_cv_perllib=`$vi_cv_path_perl -MConfig -e 'print $Config{privlib}'`
|
||||
perlcppflags=`$vi_cv_path_perl -Mlib=$srcdir -MExtUtils::Embed \
|
||||
-e 'ccflags;perl_inc'`
|
||||
if test "X$perlcppflags" != "X"; then
|
||||
CPPFLAGS="$perlcppflags $CPPFLAGS"
|
||||
fi
|
||||
perllibs=`cd $srcdir;$vi_cv_path_perl -MExtUtils::Embed \
|
||||
-e 'ldopts'`
|
||||
if test "X$perllibs" != "X"; then
|
||||
LIBS="$perllibs $LIBS"
|
||||
fi
|
||||
perlldflags=`cd $srcdir;$vi_cv_path_perl -MExtUtils::Embed \
|
||||
-e 'ccdlflags'`
|
||||
if test "X$perlldflags" != "X"; then
|
||||
LDFLAGS="$perlldflags $LDFLAGS"
|
||||
fi
|
||||
LIBOBJS="perl.o perlsfio.o $LIBOBJS"
|
||||
AC_DEFINE(HAVE_PERL_INTERP)
|
||||
fi
|
||||
|
||||
dnl If the user wants a Tk/Tcl front-end for nvi, build it.
|
||||
AC_SUBST(tknvi)
|
||||
AC_SUBST(TKLIBS)
|
||||
AC_MSG_CHECKING(if --enable-tknvi option specified)
|
||||
AC_ARG_ENABLE(tknvi,
|
||||
[ --enable-tknvi Build a Tk/Tcl front-end for vi.],
|
||||
[vi_cv_tknvi="yes"], [vi_cv_tknvi="no"])
|
||||
AC_MSG_RESULT($vi_cv_tknvi)
|
||||
if test "$vi_cv_tknvi" = "yes"; then
|
||||
tknvi=tknvi
|
||||
TKLIBS="-ltk -ltcl -lm $XLIBS $LIBS"
|
||||
fi
|
||||
|
||||
dnl If the user wants a Tk/Tcl interpreter in nvi, load it.
|
||||
AC_MSG_CHECKING(if --enable-tclinterp option specified)
|
||||
AC_ARG_ENABLE(tclinterp,
|
||||
[ --enable-tclinterp Include a Tk/Tcl interpreter in vi.],
|
||||
[vi_cv_tclinterp="yes"], [vi_cv_tclinterp="no"])
|
||||
AC_MSG_RESULT($vi_cv_tclinterp)
|
||||
if test "$vi_cv_tclinterp" = "yes"; then
|
||||
LIBOBJS="tcl.o $LIBOBJS"
|
||||
LIBS="-ltk -ltcl -lm $XLIBS $LIBS"
|
||||
AC_DEFINE(HAVE_TCL_INTERP)
|
||||
fi
|
||||
|
||||
dnl Make sure that we can find a Tk/Tcl library.
|
||||
if test "$vi_cv_tknvi" = "yes" || test "$vi_cv_tclinterp" = "yes"; then
|
||||
AC_CHECK_LIB(tcl, main,
|
||||
[vi_cv_tkfatal="no"], [vi_cv_tkfatal="yes"], -ltk -lm)
|
||||
if test "$vi_cv_tkfatal" = "yes"; then
|
||||
echo "Fatal error: no Tk/Tcl library; see the section"
|
||||
echo "ADDING LIBRARIES AND INCLUDE FILES in the README file."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl Both Tcl/Tk and Perl interpreters need the vi api code.
|
||||
if test "$vi_cv_tclinterp" = yes || test "$vi_cv_perlinterp" = yes; then
|
||||
LIBOBJS="api.o $LIBOBJS"
|
||||
fi
|
||||
|
||||
dnl Check for the termcap/termlib library. Compile in nvi's curses routines
|
||||
dnl unless the user specifies otherwise. These two checks must occur in the
|
||||
dnl current order, and -lcurses must be loaded before -ltermcap/-ltermlib.
|
||||
AC_CHECK_LIB(termlib, tgetent,
|
||||
[vi_cv_termlib=-ltermlib], [vi_cv_termlib=no])
|
||||
if test "$vi_cv_termlib" = no; then
|
||||
AC_CHECK_LIB(termcap, tgetent,
|
||||
[vi_cv_termlib=-ltermcap], [vi_cv_termlib=no])
|
||||
fi
|
||||
if test "$vi_cv_termlib" != no; then
|
||||
LIBS="$vi_cv_termlib $LIBS"
|
||||
fi
|
||||
AC_SUBST(cobjs)
|
||||
AC_MSG_CHECKING(if --disable-curses option specified)
|
||||
AC_ARG_ENABLE(curses,
|
||||
[ --disable-curses DON'T use the nvi-provided curses routines.],
|
||||
[vi_cv_curses="other curses"], [vi_cv_curses="bundled curses"])
|
||||
AC_MSG_RESULT($vi_cv_curses)
|
||||
case "$vi_cv_curses" in
|
||||
"bundled curses")
|
||||
CPPFLAGS="-I\$(srcdir)/curses $CPPFLAGS"
|
||||
cobjs="\$(COBJS)";;
|
||||
"other curses")
|
||||
LIBS="-lcurses $LIBS";;
|
||||
esac
|
||||
|
||||
dnl Checks for header files.
|
||||
AC_MSG_CHECKING(for sys/mman.h)
|
||||
AC_CACHE_VAL(vi_cv_include_sys_mman, [dnl
|
||||
AC_TRY_CPP([#include <sys/mman.h>],
|
||||
[vi_cv_include_sys_mman=yes], [vi_cv_include_sys_mman=no])])
|
||||
if test "$vi_cv_include_sys_mman" = yes; then
|
||||
AC_DEFINE(HAVE_SYS_MMAN_H)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_include_sys_mman)
|
||||
|
||||
AC_MSG_CHECKING(for sys/select.h)
|
||||
AC_CACHE_VAL(vi_cv_include_sys_select, [dnl
|
||||
AC_TRY_CPP([#include <sys/select.h>],
|
||||
[vi_cv_include_sys_select=yes], [vi_cv_include_sys_select=no])])
|
||||
if test "$vi_cv_include_sys_select" = yes; then
|
||||
AC_DEFINE(HAVE_SYS_SELECT_H)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_include_sys_select)
|
||||
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_CHECK_TYPE(ssize_t, int)
|
||||
AC_C_BIGENDIAN
|
||||
AC_C_CONST
|
||||
AC_STRUCT_ST_BLKSIZE
|
||||
AC_TYPE_MODE_T
|
||||
AC_TYPE_OFF_T
|
||||
AC_TYPE_PID_T
|
||||
AC_TYPE_SIZE_T
|
||||
AC_STRUCT_TM
|
||||
|
||||
dnl Checks for library functions.
|
||||
AC_CHECK_FUNCS(bsearch gethostname getopt memchr memcpy memmove memset)
|
||||
AC_REPLACE_FUNCS(bsearch gethostname getopt memchr memcpy memmove memset)
|
||||
AC_CHECK_FUNCS(mkstemp mmap snprintf strdup strerror strpbrk strtol)
|
||||
AC_REPLACE_FUNCS(mkstemp mmap snprintf strdup strerror strpbrk strtol)
|
||||
AC_CHECK_FUNCS(strtoul vsnprintf)
|
||||
AC_REPLACE_FUNCS(strtoul vsnprintf)
|
||||
|
||||
AC_CHECK_FUNCS(select)
|
||||
AC_CHECK_FUNCS(setenv, [need_env=no], [need_env=yes])
|
||||
AC_CHECK_FUNCS(strsep, [need_strsep=no], [need_strsep=yes])
|
||||
AC_CHECK_FUNCS(unsetenv,, [need_env=yes])
|
||||
|
||||
AC_FUNC_MMAP
|
||||
AC_FUNC_VFORK
|
||||
|
||||
dnl If we needed setenv or unsetenv, add in the clib/env.c replacement file.
|
||||
if test "$need_env" = yes; then
|
||||
LIBOBJS="env.o $LIBOBJS"
|
||||
fi
|
||||
|
||||
dnl If we need strsep, add it and define it so we get a prototype.
|
||||
if test "$need_strsep" = yes; then
|
||||
LIBOBJS="strsep.o $LIBOBJS"
|
||||
fi
|
||||
|
||||
dnl Check for fcntl/flock
|
||||
dnl Use flock preferentially, since it has cleaner semantics and won't
|
||||
dnl hang up the editor.
|
||||
dnl XXX
|
||||
dnl Ultrix has a broken fcntl, but a working flock.
|
||||
dnl IRIX and DGUX have a broken flock, but working fcntl.
|
||||
AC_MSG_CHECKING(for fcntl/flock)
|
||||
AC_CACHE_VAL(vi_cv_lock, [dnl
|
||||
vi_cv_lock=none
|
||||
case "$host_os" in
|
||||
dgux*);;
|
||||
irix*);;
|
||||
*)
|
||||
AC_TRY_LINK([#include <fcntl.h>], [flock(0, 0);],
|
||||
[vi_cv_lock=flock]);;
|
||||
esac
|
||||
if test "$vi_cv_lock" = none; then
|
||||
AC_TRY_LINK([#include <fcntl.h>], [fcntl(0, F_SETLK, 0);],
|
||||
[vi_cv_lock=fcntl])
|
||||
fi])
|
||||
|
||||
if test "$vi_cv_lock" = flock; then
|
||||
AC_DEFINE(HAVE_LOCK_FLOCK)
|
||||
fi
|
||||
if test "$vi_cv_lock" = fcntl; then
|
||||
AC_DEFINE(HAVE_LOCK_FCNTL)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_lock)
|
||||
|
||||
dnl Check for ftruncate/chsize
|
||||
AC_MSG_CHECKING(for ftruncate/chsize)
|
||||
AC_CACHE_VAL(vi_cv_ftruncate, [dnl
|
||||
AC_TRY_LINK([#include <unistd.h>], [ftruncate(0, 0);],
|
||||
[vi_cv_ftruncate=ftruncate],
|
||||
AC_TRY_LINK([#include <unistd.h>], [chsize(0, 0);],
|
||||
[vi_cv_ftruncate=chsize], [vi_cv_ftruncate=no]))])
|
||||
if test "$vi_cv_ftruncate" = ftruncate; then
|
||||
AC_DEFINE(HAVE_FTRUNCATE_FTRUNCATE)
|
||||
fi
|
||||
if test "$vi_cv_ftruncate" = chsize; then
|
||||
AC_DEFINE(HAVE_FTRUNCATE_CHSIZE)
|
||||
fi
|
||||
if test "$vi_cv_ftruncate" = no; then
|
||||
echo
|
||||
echo "Fatal error: no file truncation system call."
|
||||
exit 1
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_ftruncate)
|
||||
|
||||
dnl Check for the tigetstr/tigetnum functions.
|
||||
AC_MSG_CHECKING(for tigetstr/tigetnum)
|
||||
AC_CACHE_VAL(vi_cv_have_curses_tigetstr, [dnl
|
||||
AC_TRY_LINK([#include <curses.h>], [tigetstr(0);],
|
||||
[vi_cv_have_curses_tigetstr=yes],
|
||||
[vi_cv_have_curses_tigetstr=no])])
|
||||
if test "$vi_cv_have_curses_tigetstr" = yes; then
|
||||
AC_DEFINE(HAVE_CURSES_TIGETSTR)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_have_curses_tigetstr)
|
||||
|
||||
dnl Check for potentially missing curses functions in system or user-specified
|
||||
dnl libraries. We also have to guess at whether the specified library is a
|
||||
dnl BSD or System V style curses. Use the newterm function, all System V
|
||||
dnl curses implementations have it, none, as far as I know, of the BSD ones do.
|
||||
if test "$vi_cv_curses" = "bundled curses"; then
|
||||
AC_DEFINE(HAVE_BSD_CURSES)
|
||||
AC_DEFINE(HAVE_CURSES_ADDNSTR)
|
||||
AC_DEFINE(HAVE_CURSES_IDLOK)
|
||||
else
|
||||
dnl Check for the addnstr function.
|
||||
AC_MSG_CHECKING(for addnstr)
|
||||
AC_CACHE_VAL(vi_cv_have_curses_addnstr, [dnl
|
||||
AC_TRY_LINK([#include <curses.h>], [addnstr(0, 0);],
|
||||
[vi_cv_have_curses_addnstr=yes],
|
||||
[vi_cv_have_curses_addnstr=no])])
|
||||
if test "$vi_cv_have_curses_addnstr" = yes; then
|
||||
AC_DEFINE(HAVE_CURSES_ADDNSTR)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_have_curses_addnstr)
|
||||
|
||||
dnl Check for the beep function.
|
||||
AC_MSG_CHECKING(for beep)
|
||||
AC_CACHE_VAL(vi_cv_have_curses_beep, [dnl
|
||||
AC_TRY_LINK([#include <curses.h>], [beep();],
|
||||
[vi_cv_have_curses_beep=yes],
|
||||
[vi_cv_have_curses_beep=no])])
|
||||
if test "$vi_cv_have_curses_beep" = yes; then
|
||||
AC_DEFINE(HAVE_CURSES_BEEP)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_have_curses_beep)
|
||||
|
||||
dnl Check for the flash function.
|
||||
AC_MSG_CHECKING(for flash)
|
||||
AC_CACHE_VAL(vi_cv_have_curses_flash, [dnl
|
||||
AC_TRY_LINK([#include <curses.h>], [flash();],
|
||||
[vi_cv_have_curses_flash=yes],
|
||||
[vi_cv_have_curses_flash=no])])
|
||||
if test "$vi_cv_have_curses_flash" = yes; then
|
||||
AC_DEFINE(HAVE_CURSES_FLASH)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_have_curses_flash)
|
||||
|
||||
dnl Check for the idlok function.
|
||||
AC_MSG_CHECKING(for idlok)
|
||||
AC_CACHE_VAL(vi_cv_have_curses_idlok, [dnl
|
||||
AC_TRY_LINK([#include <curses.h>], [idlok(0, 0);],
|
||||
[vi_cv_have_curses_idlok=yes],
|
||||
[vi_cv_have_curses_idlok=no])])
|
||||
if test "$vi_cv_have_curses_idlok" = yes; then
|
||||
AC_DEFINE(HAVE_CURSES_IDLOK)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_have_curses_idlok)
|
||||
|
||||
dnl Check for the keypad function.
|
||||
AC_MSG_CHECKING(for keypad)
|
||||
AC_CACHE_VAL(vi_cv_have_curses_keypad, [dnl
|
||||
AC_TRY_LINK([#include <curses.h>], [keypad(0, 0);],
|
||||
[vi_cv_have_curses_keypad=yes],
|
||||
[vi_cv_have_curses_keypad=no])])
|
||||
if test "$vi_cv_have_curses_keypad" = yes; then
|
||||
AC_DEFINE(HAVE_CURSES_KEYPAD)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_have_curses_keypad)
|
||||
|
||||
dnl Check for the newterm function.
|
||||
AC_MSG_CHECKING(for newterm)
|
||||
AC_CACHE_VAL(vi_cv_have_curses_newterm, [dnl
|
||||
AC_TRY_LINK([#include <curses.h>], [newterm(0, 0, 0);],
|
||||
[vi_cv_have_curses_newterm=yes],
|
||||
[vi_cv_have_curses_newterm=no])])
|
||||
if test "$vi_cv_have_curses_newterm" = yes; then
|
||||
AC_DEFINE(HAVE_CURSES_NEWTERM)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_have_curses_newterm)
|
||||
|
||||
if test "$vi_cv_have_curses_newterm" = no; then
|
||||
AC_DEFINE(HAVE_BSD_CURSES)
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl Check for the setupterm function. We make this check regardless of
|
||||
dnl using the system library, because it may be part of the underlying
|
||||
dnl termcap/termlib support, and we want to use the local one.
|
||||
AC_MSG_CHECKING(for setupterm)
|
||||
AC_CACHE_VAL(vi_cv_have_curses_setupterm, [dnl
|
||||
AC_TRY_LINK([#include <curses.h>], [setupterm(0, 0, 0);],
|
||||
[vi_cv_have_curses_setupterm=yes],
|
||||
[vi_cv_have_curses_setupterm=no])])
|
||||
if test "$vi_cv_have_curses_setupterm" = yes; then
|
||||
AC_DEFINE(HAVE_CURSES_SETUPTERM)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_have_curses_setupterm)
|
||||
|
||||
dnl Some moron decided to drop off an argument from the gettimeofday call,
|
||||
dnl without changing the name.
|
||||
AC_MSG_CHECKING(for broken gettimeofday system call)
|
||||
AC_CACHE_VAL(vi_cv_gettimeofday, [dnl
|
||||
AC_TRY_LINK([#include <sys/types.h>
|
||||
#include <sys/time.h>], [gettimeofday(0, 0);],
|
||||
[vi_cv_gettimeofday=okay], [vi_cv_gettimeofday=broken])])
|
||||
if test "$vi_cv_gettimeofday" = broken; then
|
||||
AC_DEFINE(HAVE_BROKEN_GETTIMEOFDAY)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_gettimeofday)
|
||||
|
||||
dnl Check for which version of openpty to use, System V or Berkeley.
|
||||
AC_MSG_CHECKING(for System V pty calls)
|
||||
AC_CACHE_VAL(vi_cv_sys5_pty, [dnl
|
||||
AC_TRY_LINK(, [grantpt(0);],
|
||||
[vi_cv_sys5_pty=yes], [vi_cv_sys5_pty=no])])
|
||||
if test "$vi_cv_sys5_pty" = yes; then
|
||||
AC_DEFINE(HAVE_SYS5_PTY)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_sys5_pty)
|
||||
|
||||
dnl Check for the revoke system call.
|
||||
AC_MSG_CHECKING(for revoke system call)
|
||||
AC_CACHE_VAL(vi_cv_revoke, [dnl
|
||||
AC_TRY_LINK(, [revoke("a");],
|
||||
[vi_cv_revoke=yes], [vi_cv_revoke=no])])
|
||||
if test "$vi_cv_revoke" = yes; then
|
||||
AC_DEFINE(HAVE_REVOKE)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_revoke)
|
||||
|
||||
dnl Some versions of sprintf return a pointer to the first argument instead
|
||||
dnl of a character count. We assume that the return value of snprintf and
|
||||
dnl vsprintf etc. will be the same as sprintf, and check the easy one.
|
||||
AC_MSG_CHECKING(for int type sprintf return value)
|
||||
AC_CACHE_VAL(vi_cv_sprintf_count, [dnl
|
||||
AC_TRY_RUN([main(){char buf[20]; exit(sprintf(buf, "XXX") != 3);}],
|
||||
[vi_cv_sprintf_count=yes], [vi_cv_sprintf_count=no])])
|
||||
if test "$vi_cv_sprintf_count" = no; then
|
||||
AC_DEFINE(SPRINTF_RET_CHARPNT)
|
||||
fi
|
||||
AC_MSG_RESULT($vi_cv_sprintf_count)
|
||||
|
||||
dnl We compile in nvi's DB routines unless the user specifies otherwise.
|
||||
AC_MSG_CHECKING(if --disable-db option specified)
|
||||
AC_ARG_ENABLE(db,
|
||||
[ --disable-db DON'T use the nvi-provided DB routines.],
|
||||
[vi_cv_db_lib="other DB"], [vi_cv_db_lib="bundled DB"])
|
||||
AC_MSG_RESULT($vi_cv_db_lib)
|
||||
case "$vi_cv_db_lib" in
|
||||
"bundled DB")
|
||||
CPPFLAGS="-I\$(srcdir)/db/include $CPPFLAGS"
|
||||
LIBOBJS="\$(DBOBJS) $LIBOBJS";;
|
||||
"other DB")
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl We compile in nvi's RE routines unless the user specifies otherwise.
|
||||
AC_MSG_CHECKING(if --disable-re option specified)
|
||||
AC_ARG_ENABLE(re,
|
||||
[ --disable-re DON'T use the nvi-provided RE routines.],
|
||||
[vi_cv_re_lib="other RE"], [vi_cv_re_lib="bundled RE"])
|
||||
AC_MSG_RESULT($vi_cv_re_lib)
|
||||
case "$vi_cv_re_lib" in
|
||||
"bundled RE")
|
||||
CPPFLAGS="-I\$(srcdir)/regex $CPPFLAGS"
|
||||
LIBOBJS="\$(REOBJS) $LIBOBJS";;
|
||||
"other RE")
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl Check for the standard shorthand types.
|
||||
AC_SUBST(u_char_decl)
|
||||
AC_MSG_CHECKING(for u_char)
|
||||
AC_CACHE_VAL(vi_cv_uchar, [dnl
|
||||
AC_TRY_COMPILE([#include <sys/types.h>], u_char foo;,
|
||||
[vi_cv_uchar=yes], [vi_cv_uchar=no])])
|
||||
AC_MSG_RESULT($vi_cv_uchar)
|
||||
if test "$vi_cv_uchar" = no; then
|
||||
u_char_decl="typedef unsigned char u_char;"
|
||||
fi
|
||||
|
||||
AC_SUBST(u_short_decl)
|
||||
AC_MSG_CHECKING(for u_short)
|
||||
AC_CACHE_VAL(vi_cv_ushort, [dnl
|
||||
AC_TRY_COMPILE([#include <sys/types.h>], u_short foo;,
|
||||
[vi_cv_ushort=yes], [vi_cv_ushort=no])])
|
||||
AC_MSG_RESULT($vi_cv_ushort)
|
||||
if test "$vi_cv_ushort" = no; then
|
||||
u_short_decl="typedef unsigned short u_short;"
|
||||
fi
|
||||
|
||||
AC_SUBST(u_int_decl)
|
||||
AC_MSG_CHECKING(for u_int)
|
||||
AC_CACHE_VAL(vi_cv_uint, [dnl
|
||||
AC_TRY_COMPILE([#include <sys/types.h>], u_int foo;,
|
||||
[vi_cv_uint=yes], [vi_cv_uint=no])])
|
||||
AC_MSG_RESULT($vi_cv_uint)
|
||||
if test "$vi_cv_uint" = no; then
|
||||
u_int_decl="typedef unsigned int u_int;"
|
||||
fi
|
||||
|
||||
AC_SUBST(u_long_decl)
|
||||
AC_MSG_CHECKING(for u_long)
|
||||
AC_CACHE_VAL(vi_cv_ulong, [dnl
|
||||
AC_TRY_COMPILE([#include <sys/types.h>], u_long foo;,
|
||||
[vi_cv_ulong=yes], [vi_cv_ulong=no])])
|
||||
AC_MSG_RESULT($vi_cv_ulong)
|
||||
if test "$vi_cv_ulong" = no; then
|
||||
u_long_decl="typedef unsigned long u_long;"
|
||||
fi
|
||||
|
||||
dnl DB/Vi use specific integer sizes.
|
||||
AC_SUBST(u_int8_decl)
|
||||
AC_MSG_CHECKING(for u_int8_t)
|
||||
AC_CACHE_VAL(vi_cv_uint8, [dnl
|
||||
AC_TRY_COMPILE([#include <sys/types.h>], u_int8_t foo;,
|
||||
[vi_cv_uint8=yes],
|
||||
AC_TRY_RUN([main(){exit(sizeof(unsigned char) != 1);}],
|
||||
[vi_cv_uint8="unsigned char"], [vi_cv_uint8=no]))])
|
||||
AC_MSG_RESULT($vi_cv_uint8)
|
||||
if test "$vi_cv_uint8" = no; then
|
||||
echo
|
||||
echo "Fatal error: no unsigned, 8-bit integral type."
|
||||
exit 1
|
||||
fi
|
||||
if test "$vi_cv_uint8" != yes; then
|
||||
u_int8_decl="typedef $vi_cv_uint8 u_int8_t;"
|
||||
fi
|
||||
|
||||
AC_SUBST(u_int16_decl)
|
||||
AC_MSG_CHECKING(for u_int16_t)
|
||||
AC_CACHE_VAL(vi_cv_uint16, [dnl
|
||||
AC_TRY_COMPILE([#include <sys/types.h>], u_int16_t foo;,
|
||||
[vi_cv_uint16=yes],
|
||||
AC_TRY_RUN([main(){exit(sizeof(unsigned short) != 2);}],
|
||||
[vi_cv_uint16="unsigned short"],
|
||||
AC_TRY_RUN([main(){exit(sizeof(unsigned int) != 2);}],
|
||||
[vi_cv_uint16="unsigned int"], [vi_cv_uint16=no])))])
|
||||
AC_MSG_RESULT($vi_cv_uint16)
|
||||
if test "$vi_cv_uint16" = no; then
|
||||
echo
|
||||
echo "Fatal error: no unsigned, 16-bit integral type."
|
||||
exit 1
|
||||
fi
|
||||
if test "$vi_cv_uint16" != yes; then
|
||||
u_int16_decl="typedef $vi_cv_uint16 u_int16_t;"
|
||||
fi
|
||||
|
||||
AC_SUBST(int16_decl)
|
||||
AC_MSG_CHECKING(for int16_t)
|
||||
AC_CACHE_VAL(vi_cv_int16, [dnl
|
||||
AC_TRY_COMPILE([#include <sys/types.h>], int16_t foo;,
|
||||
[vi_cv_int16=yes],
|
||||
AC_TRY_RUN([main(){exit(sizeof(short) != 2);}],
|
||||
[vi_cv_int16="short"],
|
||||
AC_TRY_RUN([main(){exit(sizeof(int) != 2);}],
|
||||
[vi_cv_int16="int"], [vi_cv_int16=no])))])
|
||||
AC_MSG_RESULT($vi_cv_int16)
|
||||
if test "$vi_cv_int16" = no; then
|
||||
echo
|
||||
echo "Fatal error: no signed, 16-bit integral type."
|
||||
exit 1
|
||||
fi
|
||||
if test "$vi_cv_int16" != yes; then
|
||||
int16_decl="typedef $vi_cv_int16 int16_t;"
|
||||
fi
|
||||
|
||||
AC_SUBST(u_int32_decl)
|
||||
AC_MSG_CHECKING(for u_int32_t)
|
||||
AC_CACHE_VAL(vi_cv_uint32, [dnl
|
||||
AC_TRY_COMPILE([#include <sys/types.h>], u_int32_t foo;,
|
||||
[vi_cv_uint32=yes],
|
||||
AC_TRY_RUN([main(){exit(sizeof(unsigned int) != 4);}],
|
||||
[vi_cv_uint32="unsigned int"],
|
||||
AC_TRY_RUN([main(){exit(sizeof(unsigned long) != 4);}],
|
||||
[vi_cv_uint32="unsigned long"], [vi_cv_uint32=no])))])
|
||||
AC_MSG_RESULT($vi_cv_uint32)
|
||||
if test "$vi_cv_uint32" = no; then
|
||||
echo
|
||||
echo "Fatal error: no unsigned, 32-bit integral type."
|
||||
exit 1
|
||||
fi
|
||||
if test "$vi_cv_uint32" != yes; then
|
||||
u_int32_decl="typedef $vi_cv_uint32 u_int32_t;"
|
||||
fi
|
||||
|
||||
AC_SUBST(int32_decl)
|
||||
AC_MSG_CHECKING(for int32_t)
|
||||
AC_CACHE_VAL(vi_cv_int32, [dnl
|
||||
AC_TRY_COMPILE([#include <sys/types.h>], int32_t foo;,
|
||||
[vi_cv_int32=yes],
|
||||
AC_TRY_RUN([main(){exit(sizeof(int) != 4);}],
|
||||
[vi_cv_int32="int"],
|
||||
AC_TRY_RUN([main(){exit(sizeof(long) != 4);}],
|
||||
[vi_cv_int32="long"], [vi_cv_int32=no])))])
|
||||
AC_MSG_RESULT($vi_cv_int32)
|
||||
if test "$vi_cv_int32" = no; then
|
||||
echo
|
||||
echo "Fatal error: no signed, 32-bit integral type."
|
||||
exit 1
|
||||
fi
|
||||
if test "$vi_cv_int32" != yes; then
|
||||
int32_decl="typedef $vi_cv_int32 int32_t;"
|
||||
fi
|
||||
|
||||
AC_OUTPUT(Makefile port.h:port.h.in
|
||||
pathnames.h:pathnames.h.in recover:recover.in)
|
84
contrib/nvi/build/distrib
Normal file
84
contrib/nvi/build/distrib
Normal file
@ -0,0 +1,84 @@
|
||||
#! /bin/sh
|
||||
# @(#)distrib 8.11 (Berkeley) 10/23/96
|
||||
|
||||
# Clean
|
||||
#make -f Makefile.in clean
|
||||
#rm -f configure config.h.in
|
||||
|
||||
# Build autoconf structure.
|
||||
echo "Running autoheader"
|
||||
autoheader 2>&1 | sed '/warning: AC_TRY_RUN called without default/d'
|
||||
chmod 444 config.h.in
|
||||
echo "Running autoconf"
|
||||
autoconf 2>&1 | sed '/warning: AC_TRY_RUN called without default/d'
|
||||
chmod 555 configure config.guess config.sub install-sh
|
||||
|
||||
# Build include files.
|
||||
f=../include/cl_extern.h
|
||||
echo "Building $f"
|
||||
rm -f $f
|
||||
sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../cl/*.c > $f
|
||||
chmod 444 $f
|
||||
|
||||
f=../include/com_extern.h
|
||||
echo "Building $f"
|
||||
rm -f $f
|
||||
sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../clib/*.c ../common/*.c > $f
|
||||
chmod 444 $f
|
||||
|
||||
f=../include/ex_def.h
|
||||
echo "Building $f"
|
||||
rm -f $f
|
||||
awk -f ../ex/ex.awk ../ex/ex_cmd.c > $f
|
||||
chmod 444 $f
|
||||
|
||||
f=../include/ex_extern.h
|
||||
echo "Building $f"
|
||||
rm -f $f
|
||||
sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../ex/*.c > $f
|
||||
chmod 444 $f
|
||||
|
||||
if [ -d ../ip ]; then
|
||||
f=../include/ip_extern.h
|
||||
echo "Building $f"
|
||||
rm -f $f
|
||||
sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../ip/*.c > $f
|
||||
chmod 444 $f
|
||||
fi
|
||||
|
||||
f=../include/options_def.h
|
||||
echo "Building $f"
|
||||
rm -f $f
|
||||
awk -f ../common/options.awk ../common/options.c > $f
|
||||
chmod 444 $f
|
||||
|
||||
f=../include/perl_extern.h
|
||||
echo "Building $f"
|
||||
rm -f $f
|
||||
sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../perl_api/*.xs ../perl_api/*.c > $f
|
||||
chmod 444 $f
|
||||
|
||||
f=../include/tcl_extern.h
|
||||
echo "Building $f"
|
||||
rm -f $f
|
||||
sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../tcl_api/*.c > $f
|
||||
chmod 444 $f
|
||||
|
||||
f=../include/tk_extern.h
|
||||
echo "Building $f"
|
||||
rm -f $f
|
||||
sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../tk/*.c > $f
|
||||
chmod 444 $f
|
||||
|
||||
f=../include/vi_extern.h
|
||||
echo "Building $f"
|
||||
rm -f $f
|
||||
sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../vi/*.c > $f
|
||||
chmod 444 $f
|
||||
|
||||
# Build tags files.
|
||||
echo "Building tags files"
|
||||
rm -f tags
|
||||
ctags -w -d ../cl/*.[ch] ../common/*.[ch] ../ex/*.[ch] ../perl_api/*.[ch] \
|
||||
../tcl_api/*.[ch] ../tk/*.[ch] ../vi/*.[ch]
|
||||
chmod 444 tags
|
238
contrib/nvi/build/install-sh
Executable file
238
contrib/nvi/build/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
|
45
contrib/nvi/build/pathnames.h.in
Normal file
45
contrib/nvi/build/pathnames.h.in
Normal file
@ -0,0 +1,45 @@
|
||||
/* @(#)pathnames.h.in 8.4 (Berkeley) 6/26/96 */
|
||||
|
||||
#ifndef _PATH_BSHELL
|
||||
#define _PATH_BSHELL "@vi_cv_path_shell@"
|
||||
#endif
|
||||
|
||||
#ifndef _PATH_EXRC
|
||||
#define _PATH_EXRC ".exrc"
|
||||
#endif
|
||||
|
||||
#ifndef _PATH_MSGCAT
|
||||
#define _PATH_MSGCAT "./"
|
||||
#endif
|
||||
|
||||
#ifndef _PATH_NEXRC
|
||||
#define _PATH_NEXRC ".nexrc"
|
||||
#endif
|
||||
|
||||
#ifndef _PATH_PRESERVE
|
||||
#define _PATH_PRESERVE "@vi_cv_path_preserve@"
|
||||
#endif
|
||||
|
||||
#ifndef _PATH_SYSV_PTY
|
||||
#define _PATH_SYSV_PTY "/dev/ptmx"
|
||||
#endif
|
||||
|
||||
#ifndef _PATH_SENDMAIL
|
||||
#define _PATH_SENDMAIL "@vi_cv_path_sendmail@"
|
||||
#endif
|
||||
|
||||
#ifndef _PATH_SYSEXRC
|
||||
#define _PATH_SYSEXRC "/etc/vi.exrc"
|
||||
#endif
|
||||
|
||||
#ifndef _PATH_TAGS
|
||||
#define _PATH_TAGS "tags"
|
||||
#endif
|
||||
|
||||
#ifndef _PATH_TMP
|
||||
#define _PATH_TMP "/tmp"
|
||||
#endif
|
||||
|
||||
#ifndef _PATH_TTY
|
||||
#define _PATH_TTY "/dev/tty"
|
||||
#endif
|
185
contrib/nvi/build/port.h.in
Normal file
185
contrib/nvi/build/port.h.in
Normal file
@ -0,0 +1,185 @@
|
||||
/* @(#)port.h.in 8.13 (Berkeley) 6/12/96 */
|
||||
|
||||
/*
|
||||
* Declare the basic types, if they aren't already declared. Named and
|
||||
* some system's db.h files protect them with __BIT_TYPES_DEFINED__.
|
||||
*/
|
||||
#ifndef __BIT_TYPES_DEFINED__
|
||||
#define __BIT_TYPES_DEFINED__
|
||||
@u_int8_decl@
|
||||
@int16_decl@
|
||||
@u_int16_decl@
|
||||
@int32_decl@
|
||||
@u_int32_decl@
|
||||
#endif
|
||||
|
||||
@u_char_decl@
|
||||
@u_short_decl@
|
||||
@u_int_decl@
|
||||
@u_long_decl@
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* Handle function prototypes. This steps on name space that vi doesn't
|
||||
* control, but all of the other solutions are worse.
|
||||
*/
|
||||
#undef __P
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
#define __P(protos) protos /* ANSI C prototypes */
|
||||
#else
|
||||
#define __P(protos) () /* K&R C preprocessor */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* Some versions of System V changed the number of arguments to gettimeofday
|
||||
* without changing the name.
|
||||
*/
|
||||
#ifdef HAVE_BROKEN_GETTIMEOFDAY
|
||||
#define gettimeofday(tv, tz) gettimeofday(tv)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* If we don't have mmap, we fake it with read and write, but we'll
|
||||
* still need the header information.
|
||||
*/
|
||||
#ifndef HAVE_SYS_MMAN_H
|
||||
#define MAP_SHARED 1 /* share changes */
|
||||
#define MAP_PRIVATE 2 /* changes are private */
|
||||
#define PROT_READ 0x1 /* pages can be read */
|
||||
#define PROT_WRITE 0x2 /* pages can be written */
|
||||
#define PROT_EXEC 0x4 /* pages can be executed */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* POSIX 1003.1 names for file descriptors.
|
||||
*/
|
||||
#ifndef STDERR_FILENO
|
||||
#define STDIN_FILENO 0 /* ANSI C #defines */
|
||||
#define STDOUT_FILENO 1
|
||||
#define STDERR_FILENO 2
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* POSIX 1003.1 names for seek settings.
|
||||
*/
|
||||
#ifndef SEEK_END
|
||||
#define SEEK_SET 0 /* POSIX 1003.1 seek values */
|
||||
#define SEEK_CUR 1
|
||||
#define SEEK_END 2
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Hack _POSIX_VDISABLE to \377 since Ultrix doesn't honor _POSIX_VDISABLE
|
||||
* (treats it as ^@). The symptom is that the ^@ keystroke immediately
|
||||
* drops core.
|
||||
*/
|
||||
#ifdef HAVE_BROKEN_VDISABLE
|
||||
#undef _POSIX_VDISABLE
|
||||
#define _POSIX_VDISABLE ((unsigned char)'\377')
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* POSIX 1003.1 tty disabling character.
|
||||
*/
|
||||
#ifndef _POSIX_VDISABLE
|
||||
#define _POSIX_VDISABLE 0 /* Some systems used 0. */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* 4.4BSD extension to only set the software termios bits.
|
||||
*/
|
||||
#ifndef TCSASOFT /* 4.4BSD extension. */
|
||||
#define TCSASOFT 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* POSIX 1003.1 maximum path length.
|
||||
*/
|
||||
#ifndef MAXPATHLEN
|
||||
#ifdef PATH_MAX
|
||||
#define MAXPATHLEN PATH_MAX
|
||||
#else
|
||||
#define MAXPATHLEN 1024
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* MIN, MAX, historically in <sys/param.h>
|
||||
*/
|
||||
#ifndef MAX
|
||||
#define MAX(_a,_b) ((_a)<(_b)?(_b):(_a))
|
||||
#endif
|
||||
#ifndef MIN
|
||||
#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* "DB" isn't always portable, and we want the private information.
|
||||
*/
|
||||
#define DB L__DB
|
||||
#undef pgno_t /* IRIX has its own version. */
|
||||
#define pgno_t L__db_pgno_t
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* 4.4BSD extension to provide lock values in the open(2) call.
|
||||
*/
|
||||
#ifndef O_EXLOCK
|
||||
#define O_EXLOCK 0
|
||||
#endif
|
||||
|
||||
#ifndef O_SHLOCK
|
||||
#define O_SHLOCK 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* POSIX 1003.1 bad file format errno.
|
||||
*/
|
||||
#ifndef EFTYPE
|
||||
#define EFTYPE EINVAL
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* POSIX 1003.2 RE length limit.
|
||||
*/
|
||||
#ifndef _POSIX2_RE_DUP_MAX
|
||||
#define _POSIX2_RE_DUP_MAX 255
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* 4.4BSD extension to determine if a program dropped core from the exit
|
||||
* status.
|
||||
*/
|
||||
#ifndef WCOREDUMP
|
||||
#define WCOREDUMP(a) 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* Endian-ness of the machine.
|
||||
*/
|
||||
#if !defined(LITTLE_ENDIAN)
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#endif
|
||||
#if !defined(BIG_ENDIAN)
|
||||
#define BIG_ENDIAN 4321
|
||||
#endif
|
||||
#if !defined(BYTE_ORDER)
|
||||
#if WORDS_BIGENDIAN == 1
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#else
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#endif
|
||||
#endif
|
49
contrib/nvi/build/recover.in
Normal file
49
contrib/nvi/build/recover.in
Normal file
@ -0,0 +1,49 @@
|
||||
#!/bin/sh -
|
||||
#
|
||||
# @(#)recover.in 8.8 (Berkeley) 10/10/96
|
||||
#
|
||||
# Script to recover nvi edit sessions.
|
||||
|
||||
RECDIR="@vi_cv_path_preserve@"
|
||||
SENDMAIL="@vi_cv_path_sendmail@"
|
||||
|
||||
echo 'Recovering nvi editor sessions.'
|
||||
|
||||
# Check editor backup files.
|
||||
vibackup=`echo $RECDIR/vi.*`
|
||||
if [ "$vibackup" != "$RECDIR/vi.*" ]; then
|
||||
for i in $vibackup; do
|
||||
# Only test files that are readable.
|
||||
if test ! -r $i; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# Unmodified nvi editor backup files either have the
|
||||
# execute bit set or are zero length. Delete them.
|
||||
if test -x $i -o ! -s $i; then
|
||||
rm $i
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# It is possible to get incomplete recovery files, if the editor crashes
|
||||
# at the right time.
|
||||
virecovery=`echo $RECDIR/recover.*`
|
||||
if [ "$virecovery" != "$RECDIR/recover.*" ]; then
|
||||
for i in $virecovery; do
|
||||
# Only test files that are readable.
|
||||
if test ! -r $i; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# Delete any recovery files that are zero length, corrupted,
|
||||
# or that have no corresponding backup file. Else send mail
|
||||
# to the user.
|
||||
recfile=`awk '/^X-vi-recover-path:/{print $2}' < $i`
|
||||
if test -n "$recfile" -a -s "$recfile"; then
|
||||
$SENDMAIL -t < $i
|
||||
else
|
||||
rm $i
|
||||
fi
|
||||
done
|
||||
fi
|
58
contrib/nvi/build/spell.ok
Normal file
58
contrib/nvi/build/spell.ok
Normal file
@ -0,0 +1,58 @@
|
||||
ADDCPPFLAGS
|
||||
ADDLDFLAGS
|
||||
ADDLIBS
|
||||
CPPFLAGS
|
||||
FreeBSD
|
||||
LDFLAGS
|
||||
LIBS
|
||||
Lite
|
||||
NVI
|
||||
NVI'S
|
||||
NetBSD
|
||||
Nvi
|
||||
POSIX
|
||||
Perl
|
||||
README
|
||||
Tcl
|
||||
Tk
|
||||
asnvi
|
||||
asvi
|
||||
autoconf
|
||||
bindir
|
||||
cd
|
||||
contrib
|
||||
csh
|
||||
datadir
|
||||
datafiles
|
||||
db
|
||||
distclean
|
||||
env
|
||||
filesystem
|
||||
foo
|
||||
gcc
|
||||
ksh
|
||||
lcurses
|
||||
ldb
|
||||
lm
|
||||
lperl
|
||||
ltcl
|
||||
ltermcap
|
||||
ltermlib
|
||||
ltk
|
||||
mandir
|
||||
mkdir
|
||||
ncurses
|
||||
nex
|
||||
nvi
|
||||
nview
|
||||
perl
|
||||
perlinterp
|
||||
setenv
|
||||
sh
|
||||
tcl
|
||||
tclinterp
|
||||
tcsh
|
||||
terminfo
|
||||
tknvi
|
||||
usr
|
||||
vi
|
84
contrib/nvi/catalog/Makefile
Normal file
84
contrib/nvi/catalog/Makefile
Normal file
@ -0,0 +1,84 @@
|
||||
# @(#)Makefile 8.29 (Berkeley) 10/19/96
|
||||
|
||||
CAT= dutch english french german ru_SU.KOI8-R spanish swedish
|
||||
FILES= ../cl/*.c ../common/*.c ../ex/*.c ../tk/*.c ../vi/*.c
|
||||
|
||||
all: dump ${CAT}
|
||||
|
||||
${CAT}: english.base
|
||||
@echo "... $@"; \
|
||||
rm -f $@; \
|
||||
sort -u $@.base | \
|
||||
awk '{ \
|
||||
if ($$1 == 1) { \
|
||||
print "\nMESSAGE NUMBER 1 IS NOT LEGAL"; \
|
||||
exit 1; \
|
||||
} \
|
||||
if (++nline > $$1) { \
|
||||
print "DUPLICATE MESSAGE NUMBER " $$1; \
|
||||
exit 1; \
|
||||
} \
|
||||
for (; nline < $$1; ++nline) \
|
||||
print ""; \
|
||||
print $0; \
|
||||
}' | \
|
||||
sed -e '1s/^/VI_MESSAGE_CATALOG/' \
|
||||
-e '/"/s/^[^"]*"//' \
|
||||
-e '1!s/"$$/X/' > $@; \
|
||||
chmod 444 $@; \
|
||||
if grep DUPLICATE $@ > /dev/null; then \
|
||||
grep DUPLICATE $@; \
|
||||
fi; \
|
||||
if grep 'NOT LEGAL' $@ > /dev/null; then \
|
||||
grep 'NOT LEGAL' $@; \
|
||||
fi
|
||||
|
||||
CHK= dutch.check english.check french.check german.check \
|
||||
ru_SU.KOI8-R.check spanish.check swedish.check
|
||||
check: ${CHK}
|
||||
${CHK}: ${CAT}
|
||||
@echo "... $@"; \
|
||||
f=`basename $@ .check`; \
|
||||
(echo "Unused message id's (this is okay):"; \
|
||||
awk '{ \
|
||||
while (++nline < $$1) \
|
||||
printf "%03d\n", nline; \
|
||||
}' < $$f.base; \
|
||||
echo =========================; \
|
||||
echo "MISSING ERROR MESSAGES (Please add!):"; \
|
||||
awk '{print $$1}' < $$f.base | sort -u > __ck1; \
|
||||
awk '{print $$1}' < english.base | sort -u > __ck2; \
|
||||
comm -13 __ck1 __ck2; \
|
||||
echo =========================; \
|
||||
echo "Extra error messages (just delete them):"; \
|
||||
comm -23 __ck1 __ck2; \
|
||||
echo =========================; \
|
||||
echo "MESSAGES WITH THE SAME MESSAGE ID's (FIX!):"; \
|
||||
for j in \
|
||||
`sed '/^$$/d' < $$f.base | sort -u | \
|
||||
awk '{print $$1}' | uniq -d`; do \
|
||||
egrep $$j $$f.base; \
|
||||
done; \
|
||||
echo =========================; \
|
||||
echo "Duplicate messages, both id and message (this is okay):"; \
|
||||
sed '/^$$/d' < $$f.base | sort | uniq -c | \
|
||||
awk '$$1 != 1 { print $$0 }' | sort -n; \
|
||||
echo =========================; \
|
||||
echo "Duplicate messages, just message (this is okay):"; \
|
||||
sed '/^$$/d' < $$f | sort | uniq -c | \
|
||||
awk '$$1 != 1 { print $$0 }' | sort -n; \
|
||||
echo =========================) > $@
|
||||
|
||||
english.base: dump ${FILES} #Makefile
|
||||
./dump ${FILES} |\
|
||||
sed -e '/|/!d' \
|
||||
-e 's/|/ "/' \
|
||||
-e 's/^"//' \
|
||||
-e 's/\\"/"/g' |\
|
||||
sort -n > $@
|
||||
|
||||
dump: dump.c
|
||||
${CC} -O -o dump dump.c
|
||||
|
||||
clean:
|
||||
rm -f dump dump.o ${CAT} english.base *.check __ck1 __ck2
|
166
contrib/nvi/catalog/README
Normal file
166
contrib/nvi/catalog/README
Normal file
@ -0,0 +1,166 @@
|
||||
# @(#)README 8.4 (Berkeley) 11/22/94
|
||||
|
||||
Generally, all non-system error and informational messages in nvi are
|
||||
catalog messages, i.e. they can be tailored to a specific langauge.
|
||||
Command strings, usage strings, system errors and other "known text"
|
||||
are not. It would certainly be possible to internationalize all the
|
||||
text strings in nvi, but it's unclear that it's the right thing to do.
|
||||
|
||||
First, there's no portable way to do message catalogs. The System V
|
||||
scheme is a reasonable choice, but none of the 4BSD derived systems
|
||||
support it. So, catalogs are completely implemented within nvi, and
|
||||
don't require any library support.
|
||||
|
||||
Message catalogs in nvi are fairly simple. Every catalog message
|
||||
consists of two parts -- an initial number followed by a pipe (`|')
|
||||
character, followed by the English text for the message. For example:
|
||||
|
||||
msgq(sp, M_ERR, "001|This is an error message");
|
||||
|
||||
would be a typical message.
|
||||
|
||||
When the msgq() routine is called, if the user has specified a message
|
||||
catalog and the format string (the third argument) has a leading number,
|
||||
then it is converted to a record number, and that record is retrieved
|
||||
from the message catalog and used as a replacement format string. If
|
||||
the record can't be retrieved for any reason, the English text is displayed
|
||||
instead.
|
||||
|
||||
Each message format string MUST map into the English format string, i.e.
|
||||
it can't display more or different arguments than the English one.
|
||||
|
||||
For example:
|
||||
|
||||
msgq(sp, M_ERR, "002|Error: %d %x", arg1, arg2);
|
||||
|
||||
is a format string that displays two arguments. It is possible, however,
|
||||
to reorder the arguments or to not display all of them. The convention
|
||||
nvi uses is the System V printf(3) convention, i.e. "%[0-9]*$" is the name
|
||||
of a specific, numbered argument. For example:
|
||||
|
||||
msgq(sp, M_ERR, "002|Error: %2$d %1$x", arg1, arg2);
|
||||
|
||||
displays the arguments in reverse order.
|
||||
|
||||
If the system supports this convention in its library printf routines
|
||||
(as specified by the test #define NL_ARGMAX), nvi uses those routines.
|
||||
Otherwise, there is some serious magic going on in common/msg.c to make
|
||||
this all work.
|
||||
|
||||
Arguments to the msgq function are required to contain ONLY printable
|
||||
characters. No further translation is done by the msgq routine before
|
||||
displaying the message on the screen. For example, in the msgq call:
|
||||
|
||||
msgq(sp, M_ERR, "003|File: %s", file_name);
|
||||
|
||||
"file_name" must contain only printable characters. The routine
|
||||
msg_print() returns a printable version of a string in allocated
|
||||
memory. For example:
|
||||
|
||||
char *p;
|
||||
|
||||
p = msg_print(sp, file_name);
|
||||
msgq(sp, M_ERR, M("003", "File: %s"), p);
|
||||
FREE_SPACE(sp, p, 0);
|
||||
|
||||
makes sure that "file_name" is printable before calling the msgq
|
||||
routine.
|
||||
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
The message catalogs themselves are maintained in two files. The first
|
||||
is the "base file" which contains two fields, a record number and the
|
||||
message itself. All base files are named using the convention
|
||||
"vi_<language>.base", e.g. the English one is "vi_english.base". For
|
||||
example:
|
||||
|
||||
002 "Unable to create temporary file"
|
||||
003 "Warning: %s is not a regular file"
|
||||
004 "%s already locked, session is read-only"
|
||||
005 "%s: remove"
|
||||
006 "%s: close"
|
||||
007 "%s: remove"
|
||||
008 "%s: remove"
|
||||
009 "Read-only file, not written; use ! to override"
|
||||
010 "Read-only file, not written"
|
||||
|
||||
are the first few lines of the current vi_english.base file. Note that
|
||||
message #1 is missing -- the first message of each catalog is a special
|
||||
one, so that nvi can recognize message catalog files. It's added by the
|
||||
Makefile script that creates the second version of the message catalog.
|
||||
|
||||
The second file is the file used by nvi to access messages, and is a list
|
||||
of the messages, one per line:
|
||||
|
||||
VI_MESSAGE_CATALOG
|
||||
Unable to create temporary fileX
|
||||
Warning: %s is not a regular fileX
|
||||
%s already locked, session is read-onlyX
|
||||
%s: removeX
|
||||
%s: closeX
|
||||
%s: removeX
|
||||
%s: removeX
|
||||
Read-only file, not written; use ! to overrideX
|
||||
Read-only file, not writtenX
|
||||
|
||||
Note that all messages have had a trailing 'X' character appended. This
|
||||
is to provide nvi a place to store a trailing nul for the message so that
|
||||
C library routines that expect one won't be disappointed.
|
||||
|
||||
These files are named for their language, e.g. "vi_english". The second
|
||||
files are automatically created from the first files.
|
||||
|
||||
To create a new catalog for nvi:
|
||||
|
||||
Copy the file vi_english.base to a file that you can modify , e.g. "cp
|
||||
vi_english.base vi_german.base". For each of the messages in the file,
|
||||
replace the message with the string that you want to use. To find out
|
||||
what the arguments to a message are, I'm afraid you'll have to search
|
||||
the source code for the message number. You can find them fairly quickly
|
||||
by doing:
|
||||
|
||||
cd ..; egrep '123\|' */*.[chys]
|
||||
|
||||
I'm sorry that there's not an easier way, but I couldn't think of
|
||||
anything that wasn't a lot of work.
|
||||
|
||||
If, for some reason, you don't have the file vi_english.base, or you
|
||||
have new sources for which you want to create a new base catalog, you
|
||||
can create it by running the command "make english" in the catalog
|
||||
directory.
|
||||
|
||||
Once you've translated all of the strings, then add your catalog to the
|
||||
"CAT=" line of the Makefile, and run the command "make catalog". This
|
||||
will create the second (and corresponding) file for each file named
|
||||
<language>.base.
|
||||
|
||||
Don't worry about missing line numbers, i.e. base files that look like:
|
||||
|
||||
005 Message number 5.
|
||||
007 Message number 7.
|
||||
|
||||
This simply means that a message was deleted during the course of nvi's
|
||||
development. It will be taken care of automatically when you create
|
||||
the second form of the file.
|
||||
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
If you add new messages to the nvi sources, you can check your work by
|
||||
doing "make english; make check". The "make check" target lists unused
|
||||
message numbers, duplicate message numbers, and duplicate messages.
|
||||
Unused message numbers are only useful if you are condensing messages.
|
||||
Duplicate message numbers are a serious problem and have to be fixed.
|
||||
Duplicate messages are only interesting if a message appears often enough
|
||||
that it's worth creating a routine so that the string is only need in
|
||||
a single place.
|
||||
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
To select a catalog when running nvi, set the "msgcat" option. If the
|
||||
value of this option ends with a '/', it is treated as the name of a
|
||||
directory that contains a message catalog "vi_XXXX", where XXXX is the
|
||||
value of the LANG environmental variable, if it's set, or the value of
|
||||
the LC_MESSAGES environmental variable if it's not. If neither of those
|
||||
environmental variables are set, or if the option doesn't end in a '/',
|
||||
the option is treated as the full path name of the message catalog to use.
|
||||
|
||||
If any messages are missing from the catalog, the backup text (English)
|
||||
is used instead.
|
@ -32,72 +32,83 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)ex_undo.c 8.7 (Berkeley) 8/9/94";
|
||||
static char copyright[] =
|
||||
"@(#) Copyright (c) 1992, 1993, 1994\n\
|
||||
The Regents of the University of California. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)dump.c 8.1 (Berkeley) 8/31/94";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <termios.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
|
||||
#include "vi.h"
|
||||
#include "excmd.h"
|
||||
|
||||
/*
|
||||
* ex_undo -- u
|
||||
* Undo the last change.
|
||||
*/
|
||||
int
|
||||
ex_undo(sp, ep, cmdp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
EXCMDARG *cmdp;
|
||||
static void
|
||||
parse(fp)
|
||||
FILE *fp;
|
||||
{
|
||||
MARK m;
|
||||
int ch, s1, s2, s3;
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* Historic undo always set the previous context mark.
|
||||
*/
|
||||
m.lno = sp->lno;
|
||||
m.cno = sp->cno;
|
||||
if (mark_set(sp, ep, ABSMARK1, &m, 1))
|
||||
return (1);
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* Multiple undo isn't available in ex, as there's no '.' command.
|
||||
* Whether 'u' is undo or redo is toggled each time, unless there
|
||||
* was a change since the last undo, in which case it's an undo.
|
||||
*/
|
||||
if (!F_ISSET(ep, F_UNDO)) {
|
||||
F_SET(ep, F_UNDO);
|
||||
ep->lundo = FORWARD;
|
||||
}
|
||||
switch (ep->lundo) {
|
||||
case BACKWARD:
|
||||
if (log_forward(sp, ep, &m))
|
||||
return (1);
|
||||
ep->lundo = FORWARD;
|
||||
break;
|
||||
case FORWARD:
|
||||
if (log_backward(sp, ep, &m))
|
||||
return (1);
|
||||
ep->lundo = BACKWARD;
|
||||
break;
|
||||
case NOTSET:
|
||||
abort();
|
||||
}
|
||||
sp->lno = m.lno;
|
||||
sp->cno = m.cno;
|
||||
return (0);
|
||||
#define TESTD(s) { \
|
||||
if ((s = getc(fp)) == EOF) \
|
||||
return; \
|
||||
if (!isdigit(s)) \
|
||||
continue; \
|
||||
}
|
||||
#define TESTP { \
|
||||
if ((ch = getc(fp)) == EOF) \
|
||||
return; \
|
||||
if (ch != '|') \
|
||||
continue; \
|
||||
}
|
||||
#define MOVEC(t) { \
|
||||
do { \
|
||||
if ((ch = getc(fp)) == EOF) \
|
||||
return; \
|
||||
} while (ch != (t)); \
|
||||
}
|
||||
for (;;) {
|
||||
MOVEC('"');
|
||||
TESTD(s1);
|
||||
TESTD(s2);
|
||||
TESTD(s3);
|
||||
TESTP;
|
||||
putchar('"');
|
||||
putchar(s1);
|
||||
putchar(s2);
|
||||
putchar(s3);
|
||||
putchar('|');
|
||||
for (;;) { /* dump to end quote. */
|
||||
if ((ch = getc(fp)) == EOF)
|
||||
return;
|
||||
putchar(ch);
|
||||
if (ch == '"')
|
||||
break;
|
||||
if (ch == '\\') {
|
||||
if ((ch = getc(fp)) == EOF)
|
||||
return;
|
||||
putchar(ch);
|
||||
}
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
FILE *fp;
|
||||
|
||||
for (; *argv != NULL; ++argv) {
|
||||
if ((fp = fopen(*argv, "r")) == NULL) {
|
||||
perror(*argv);
|
||||
exit (1);
|
||||
}
|
||||
parse(fp);
|
||||
(void)fclose(fp);
|
||||
}
|
||||
exit (0);
|
||||
}
|
317
contrib/nvi/catalog/dutch
Normal file
317
contrib/nvi/catalog/dutch
Normal file
@ -0,0 +1,317 @@
|
||||
VI_MESSAGE_CATALOG
|
||||
regel te langX
|
||||
kan regel %lu niet verwijderenX
|
||||
kan niet toevoegen aan regel %luX
|
||||
kan niet invoegen vooraan regel %luX
|
||||
kan regel %lu niet opslaanX
|
||||
kan laatste regel niet lezenX
|
||||
Fout: kan regel %lu niet vindenX
|
||||
log bestandX
|
||||
Er vindt geen logging plaats, kan wijzigingen niet ongedaan makenX
|
||||
geen wijzigingen om ongedaan te makenX
|
||||
Er vindt geen logging plaats, kan wijzigingen niet ongedaan makenX
|
||||
Er vindt geen logging plaats, herhaling niet mogelijkX
|
||||
geen wijzigingen om te herhalenX
|
||||
%s/%d: schrijven naar log misluktX
|
||||
Vi's standaard invoer en uitvoer moeten aan een terminal gekoppeld zijnX
|
||||
Merk %s: niet gezetX
|
||||
Merk %s: de regel is verwijderdX
|
||||
Merk %s: de cursor positie bestaat niet meerX
|
||||
Fout: X
|
||||
nieuw bestandX
|
||||
naam veranderdX
|
||||
gewijzigdX
|
||||
ongewijzigdX
|
||||
NIET BEVEILIGDX
|
||||
niet schrijfbaarX
|
||||
regel %lu uit %lu [%ld%%]X
|
||||
leeg bestandX
|
||||
regel %luX
|
||||
Het bestand %s is geen message catalogX
|
||||
Niet in staat om de standaard %s optie in te stellenX
|
||||
Gebruik: %sX
|
||||
set: optie %s onbekend: 'set all' laat alle opties zienX
|
||||
set: [no]%s optie kan geen waarde hebbenX
|
||||
set: %s optie moet een waarde hebbenX
|
||||
set: %s optie: %sX
|
||||
set: %s optie: %s: getal is te grootX
|
||||
set: %s optie: %s is een ongeldige waardeX
|
||||
set: %s optie moet een waarde hebbenX
|
||||
Te weinig kolommen op het scherm, minder dan %dX
|
||||
Aantal kolommen te groot, meer dan %dX
|
||||
Te weinig regels op het scherm, minder dan %dX
|
||||
Aantal regels te groot, meer dan %dX
|
||||
De lisp optie is niet ondersteundX
|
||||
messages niet uitgeschakeld: %sX
|
||||
messages niet geactiveerd: %sX
|
||||
|
||||
De paragraph optie moet karakter paren bevattenX
|
||||
De section optie moet karakter paren bevattenX
|
||||
|
||||
|
||||
|
||||
De standaard buffer is leegX
|
||||
Buffer %s is leegX
|
||||
Bestanden met newlines in de naam kunnen niet hersteld wordenX
|
||||
Wijzigingen kunnen niet ongedaan gemaakt worden als deze sessie misluktX
|
||||
Bestand wordt gecopieerd voor herstel...X
|
||||
Herstel mechanisme werkt niet: %sX
|
||||
Wijzigingen kunnen niet ongedaan gemaakt worden als deze sessie misluktX
|
||||
Kon bestand niet veilig stellen: %sX
|
||||
Bestand wordt gecopieerd voor herstel...X
|
||||
Informatie met betrekking tot gebruiker nummer %u niet gevondenX
|
||||
Kan herstel bestand niet beveiligenX
|
||||
herstel buffer overgelopenX
|
||||
herstel bestandX
|
||||
%s: verminkt herstel bestandX
|
||||
%s: verminkt herstel bestandX
|
||||
U heeft geen bestand genaamd %s te herstellenX
|
||||
U kan eerdere versies van dit bestand herstellenX
|
||||
U kan nog meer bestanden herstellenX
|
||||
kan geen email versturen: %sX
|
||||
Bestand leeg; niets om te doorzoekenX
|
||||
Einde van het bestand bereikt zonder dat het patroon gevonden isX
|
||||
Geen vorig zoek patroonX
|
||||
Patroon niet gevondenX
|
||||
Begin van het bestand bereikt zonder dat het patroon gevonden isX
|
||||
Zoek-operatie omgeslagenX
|
||||
Bezig met zoeken...X
|
||||
Geen niet-printbaar karakter gevondenX
|
||||
Onbekend commandoX
|
||||
|
||||
Commando niet beschikbaar in ex modeX
|
||||
Aantal mag niet nul zijnX
|
||||
%s: ongeldige regel aanduidingX
|
||||
Interne fout in syntax tabel (%s: %s)X
|
||||
Gebruik: %sX
|
||||
%s: tijdelijke buffer niet vrijgegevenX
|
||||
Vlag offset voor regel 1X
|
||||
Vlag offset voorbij bestands eindeX
|
||||
bestand/scherm veranderd tijdens uitvoeren van @ in een blokX
|
||||
bestand/scherm veranderd tijdens uitvoeren van globaal/v commandoX
|
||||
Ex commando mislukt: rest van commando(s) genegeerdX
|
||||
Ex commando mislukt: gemappede toetsen genegeerdX
|
||||
Het tweede adres is kleiner dan het eersteX
|
||||
Geen merk naam opgegevenX
|
||||
\\ niet gevolgd door / of ?X
|
||||
Referentie aan een regel nummer kleiner dan 0X
|
||||
Het %s commando is onbekendX
|
||||
Adres waarde te grootX
|
||||
Adres waarde te kleinX
|
||||
Ongeldige adres combinatieX
|
||||
Ongeldig adres: slechts %lu regels in het bestand aanwezigX
|
||||
Ongeldig adres: het bestand is leegX
|
||||
Het %s commando staat het adres 0 niet toeX
|
||||
Geen afkortingen om weer te gevenX
|
||||
Afkortingen moeten eindigen met een "woord" letterX
|
||||
Afkortingen mogen geen tabulaties of spaties bevattenX
|
||||
Afkortingen mogen geen woord/niet-woord karakters mengen, behalve aan het eindeX
|
||||
"%s" is geen afkortingX
|
||||
Vi commando mislukt: gemappede toetsen genegeerdX
|
||||
Dit is het laatste bestandX
|
||||
Dit is het eerste bestandX
|
||||
Dit is het eerste bestandX
|
||||
lijst met bestanden is leegX
|
||||
Geen voorgaand commando om "!" te vervangenX
|
||||
Geen bestandsnaam voor %%X
|
||||
Geen bestandsnaam voor #X
|
||||
Fout: execl: %sX
|
||||
I/O fout: %sX
|
||||
Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forcerenX
|
||||
Kan uw home directory niet vindenX
|
||||
Nieuwe huidige directory: %sX
|
||||
Geen cut buffers aanwezigX
|
||||
Het %s commando kan niet gebruikt worden in een globaal of v commandoX
|
||||
%s/%s: niet gelezen: noch U noch root is de eigenaarX
|
||||
%s/%s: niet gelezen: U bent niet de eigenaarX
|
||||
%s/%s: niet gelezen: kan gewijzigd worden door andere gebruikersX
|
||||
%s: niet gelezen: noch U noch root is de eigenaar"X
|
||||
%s: niet gelezen: U bent niet de eigenaarX
|
||||
%s: niet gelezen: kan gewijzigd worden door andere gebruikersX
|
||||
Geen volgende regel om samen te voegenX
|
||||
Geen input map entriesX
|
||||
Geen command map entriesX
|
||||
Het %s karakter kan niet ge-remapped wordenX
|
||||
"%s" is niet gemappedX
|
||||
Merk naam moet een enkel karakter zijnX
|
||||
%s bestaat al, niet weggeschreven; gebruik ! om het te forcerenX
|
||||
Nieuw .exrc bestand: %s. X
|
||||
doel regel ligt in het blokX
|
||||
Het open commando vereist dat de open optie actief isX
|
||||
Het open commando is nog niet ondersteundX
|
||||
Kan dit bestand niet veilig stellenX
|
||||
Bestand veilig gesteldX
|
||||
%s resulteert in te veel bestandsnamenX
|
||||
Alleen echte bestanden en named pipes kunnen gelezen wordenX
|
||||
%s: lees beveiliging niet beschikbaarX
|
||||
Bezig met lezen...X
|
||||
%s: %lu regels, %lu karaktersX
|
||||
Geen achtergrond schermen aanwezigX
|
||||
Het script commando is alleen beschikbaar in vi modeX
|
||||
Geen comando om uit te voerenX
|
||||
shiftwidth optie op 0 gezetX
|
||||
Count te grootX
|
||||
Count te kleinX
|
||||
Reguliere expressie opgegeven; r vlag heeft geen betekenisX
|
||||
De #, l en p vlaggen kunnen niet gecombineerd worden met de c vlag in vi modeX
|
||||
Geen match gevondenX
|
||||
Geen voorafgaande tag aanwezigX
|
||||
Minder dan %s elementen op de tags stapel; gebruik :display t[ags]X
|
||||
Geen bestand genaamd %s op de tags stapel; gebruik :display t[ags]X
|
||||
Kies Enter om door te gaan: X
|
||||
%s: tag niet gevondenX
|
||||
%s: verminkte tag in %sX
|
||||
%s: Het regel nummer van deze tag is voorbij het einde van het bestandX
|
||||
De tags stapel is leegX
|
||||
%s: zoek patroon niet gevondenX
|
||||
%d andere bestanden te wijzigenX
|
||||
Buffer %s is leegX
|
||||
Bevestig wijziging? [n]X
|
||||
OnderbrokenX
|
||||
Geen voorafgaande buffer om uit te voerenX
|
||||
Geen vorige reguliere expressieX
|
||||
Het %s commando vereist dat er een bestand geladen isX
|
||||
Gebruik: %sX
|
||||
Het visual commando vereist dat de open optie actief isX
|
||||
|
||||
Leeg bestandX
|
||||
Geen voorafgaand F, f, T of t zoek commandoX
|
||||
%s niet gevondenX
|
||||
Geen voorafgaand bestand te bewerkenX
|
||||
Cursor niet op een getalX
|
||||
Getal wordt te grootX
|
||||
Getal wordt te kleinX
|
||||
Geen overeenkomstig karakter op deze regelX
|
||||
Overeenkomstig karakter niet gevondenX
|
||||
Geen karakters te vervangenX
|
||||
Geen ander scherm aanwezigX
|
||||
Karakters achter het zoek patroon, de regel offset, en/of het z commandoX
|
||||
Geen voorafgaand zoek patroonX
|
||||
Zoekopdracht na omslag teruggekeerd op originele positieX
|
||||
Afkorting overschrijdt expansie limiet: karakters genegeerdX
|
||||
Ongeldig karakter; quote to enterX
|
||||
Reeds aan het begin van de invoerX
|
||||
Niet meer karakters te verwijderenX
|
||||
Verplaatsing voorbij het einde van het bestandX
|
||||
Verplaatsing voorbij het einde van de regelX
|
||||
Cursor niet verplaatstX
|
||||
Reeds aan het begin van het bestandX
|
||||
Verplaatsing voorbij het begin van het bestandX
|
||||
Reeds in de eerste kolomX
|
||||
Buffers moeten voor het commando opgegeven wordenX
|
||||
Reeds bij het einde van het bestandX
|
||||
Reeds bij het einde van de regelX
|
||||
%s is geen vi commandoX
|
||||
Gebruik: %sX
|
||||
Geen karakters te verwijderenX
|
||||
Het Q commando vereist de ex terminal interfaceX
|
||||
Geen commando om te herhalenX
|
||||
Het bestand is leegX
|
||||
%s mag niet gebruikt worden als een verplaatsings commandoX
|
||||
Al in commando modeX
|
||||
Cursor niet in een woordX
|
||||
|
||||
Windows optie waarde is te groot, maximum is %uX
|
||||
ToevoegenX
|
||||
VeranderenX
|
||||
CommandoX
|
||||
InvoegenX
|
||||
VervangenX
|
||||
Verplaatsing voorbij het eind van het schermX
|
||||
Verplaatsing voorbij het begin van het schermX
|
||||
Scherm moet meer dan %d regels hebben om het te kunnen splitsenX
|
||||
Er zijn geen achtergrond schermenX
|
||||
Er is geen achtergrond scherm waarin U bestand %s aan het bewerken bentX
|
||||
U kan uw enige scherm niet in de achtergrond zettenX
|
||||
Het scherm kan slechts verkleind worden tot %d regelsX
|
||||
Het scherm kan niet kleinerX
|
||||
Het scherm kan niet groterX
|
||||
|
||||
Dit scherm kan niet gesuspend wordenX
|
||||
Onderbroken: gemappede toetsen genegeerdX
|
||||
vi: tijdelijke buffer niet vrijgegevenX
|
||||
Deze terminal heeft geen %s toetsX
|
||||
Er kan slechts een buffer opgegeven wordenX
|
||||
Getal groter dan %luX
|
||||
OnderbrokenX
|
||||
Aanmaken van tijdelijk bestand is misluktX
|
||||
Waarschuwing: %s is geen regulier bestandX
|
||||
%s is al geopend, bestand is in deze sessie niet schrijfbaarX
|
||||
%s: verwijdering misluktX
|
||||
%s: sluiting misluktX
|
||||
%s: verwijdering misluktX
|
||||
%s: verwijdering misluktX
|
||||
Bestand niet schrijfbaar, niet weggeschreven; gebruik ! om het te forcerenX
|
||||
Bestand niet schrijfbaar, niet weggeschrevenX
|
||||
%s bestaat al, niet weggeschreven; gebruik ! om het te forcerenX
|
||||
%s bestaat al, niet weggeschrevenX
|
||||
Gebruik ! om een incompleet bestand weg te schrijvenX
|
||||
Bestand incompleet, niet weggeschrevenX
|
||||
%s: bestand op disk nieuwer dan deze versie; gebruik ! om het te forcerenX
|
||||
%s: bestand op disk nieuwer dan deze versieX
|
||||
%s: schrijf beveiliging niet beschikbaarX
|
||||
Bezig met schrijven...X
|
||||
%s: WAARSCHUWING: BESTAND INCOMPLEETX
|
||||
Reeds op de eerste tag van deze groepX
|
||||
%s: nieuw bestand: %lu regels, %lu karaktersX
|
||||
%s: %lu regels, %lu karaktersX
|
||||
%s resulteert in te veel bestandsnamenX
|
||||
%s: geen normaal bestandX
|
||||
%s: U bent niet de eigenaarX
|
||||
%s: kan gewijzigd worden door andere gebruikersX
|
||||
Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forcerenX
|
||||
Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik :edit! om het te forcerenX
|
||||
Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forcerenX
|
||||
Tijdelijk bestand; exit negeert wijzigingenX
|
||||
Bestand niet schrijfbaar, wijzigingen niet automatisch weggeschrevenX
|
||||
log opnieuw gestartX
|
||||
Bevestig? [ynq]X
|
||||
Druk op een toets om door te gaan: X
|
||||
Druk op een toets om door te gaan [: voor meer ex commandos]: X
|
||||
Druk op een toets om door te gaan [q om te stoppen]: X
|
||||
Deze vorm van %s vereist de ex terminal interfaceX
|
||||
Entering ex input mode.X
|
||||
Commando mislukt, nog geen bestand geladen.X
|
||||
doorgaan?X
|
||||
Onverwacht character eventX
|
||||
Onverwacht end-of-file eventX
|
||||
Geen match gevonden voor dit patroonX
|
||||
Onverwacht interrupt eventX
|
||||
Onverwacht quit eventX
|
||||
Onverwacht repaint eventX
|
||||
Reeds op de laatste tag van deze groepX
|
||||
Het %s command vereist de ex terminal interfaceX
|
||||
Deze vorm van %s is niet ondersteund als de secure edit optie actief isX
|
||||
Onverwacht string eventX
|
||||
Onverwacht timeout eventX
|
||||
Onverwacht write eventX
|
||||
|
||||
Shell expansies zijn niet ondersteund als de secure edit optie actief isX
|
||||
Het %s commando is niet ondersteund als de secure edit optie actief isX
|
||||
set: %s mag niet uitgezet wordenX
|
||||
Scherm te klein.X
|
||||
toegevoegdX
|
||||
gewijzigdX
|
||||
verwijderdX
|
||||
samengevoegdX
|
||||
verplaatstX
|
||||
verschovenX
|
||||
gebufferdX
|
||||
regelX
|
||||
regelsX
|
||||
Vi was niet geladen met een Tcl interpreterX
|
||||
Bestand gewijzigd sinds het de laatste keer weg is geschreven.X
|
||||
Shell expansie misluktX
|
||||
Geen %s edit optie opgegevenX
|
||||
Vi was niet geladen met een Perl interpreterX
|
||||
Geen ex commando om uit te voerenX
|
||||
Kies <CR> om commando uit te voeren, :q om te stoppenX
|
||||
Gebruik "cscope help" voor uitlegX
|
||||
Nog geen cscope connectie aanwezigX
|
||||
%s: onbekend zoek type: gebruik een van %sX
|
||||
%d: onbekende cscope sessieX
|
||||
set: de %s optie mag nooit aangezet wordenX
|
||||
set: de %s optie mag nooit op 0 gezet wordenX
|
||||
%s: toegevoegd: %lu regels, %lu karaktersX
|
||||
Onverwacht resize eventX
|
||||
%d bestanden te wijzigenX
|
307
contrib/nvi/catalog/dutch.base
Normal file
307
contrib/nvi/catalog/dutch.base
Normal file
@ -0,0 +1,307 @@
|
||||
002 "regel te lang"
|
||||
003 "kan regel %lu niet verwijderen"
|
||||
004 "kan niet toevoegen aan regel %lu"
|
||||
005 "kan niet invoegen vooraan regel %lu"
|
||||
006 "kan regel %lu niet opslaan"
|
||||
007 "kan laatste regel niet lezen"
|
||||
008 "Fout: kan regel %lu niet vinden"
|
||||
009 "log bestand"
|
||||
010 "Er vindt geen logging plaats, kan wijzigingen niet ongedaan maken"
|
||||
011 "geen wijzigingen om ongedaan te maken"
|
||||
012 "Er vindt geen logging plaats, kan wijzigingen niet ongedaan maken"
|
||||
013 "Er vindt geen logging plaats, herhaling niet mogelijk"
|
||||
014 "geen wijzigingen om te herhalen"
|
||||
015 "%s/%d: schrijven naar log mislukt"
|
||||
016 "Vi's standaard invoer en uitvoer moeten aan een terminal gekoppeld zijn"
|
||||
017 "Merk %s: niet gezet"
|
||||
018 "Merk %s: de regel is verwijderd"
|
||||
019 "Merk %s: de cursor positie bestaat niet meer"
|
||||
020 "Fout: "
|
||||
021 "nieuw bestand"
|
||||
022 "naam veranderd"
|
||||
023 "gewijzigd"
|
||||
024 "ongewijzigd"
|
||||
025 "NIET BEVEILIGD"
|
||||
026 "niet schrijfbaar"
|
||||
027 "regel %lu uit %lu [%ld%%]"
|
||||
028 "leeg bestand"
|
||||
029 "regel %lu"
|
||||
030 "Het bestand %s is geen message catalog"
|
||||
031 "Niet in staat om de standaard %s optie in te stellen"
|
||||
032 "Gebruik: %s"
|
||||
033 "set: optie %s onbekend: 'set all' laat alle opties zien"
|
||||
034 "set: [no]%s optie kan geen waarde hebben"
|
||||
035 "set: %s optie moet een waarde hebben"
|
||||
036 "set: %s optie: %s"
|
||||
037 "set: %s optie: %s: getal is te groot"
|
||||
038 "set: %s optie: %s is een ongeldige waarde"
|
||||
039 "set: %s optie moet een waarde hebben"
|
||||
040 "Te weinig kolommen op het scherm, minder dan %d"
|
||||
041 "Aantal kolommen te groot, meer dan %d"
|
||||
042 "Te weinig regels op het scherm, minder dan %d"
|
||||
043 "Aantal regels te groot, meer dan %d"
|
||||
044 "De lisp optie is niet ondersteund"
|
||||
045 "messages niet uitgeschakeld: %s"
|
||||
046 "messages niet geactiveerd: %s"
|
||||
048 "De paragraph optie moet karakter paren bevatten"
|
||||
049 "De section optie moet karakter paren bevatten"
|
||||
053 "De standaard buffer is leeg"
|
||||
054 "Buffer %s is leeg"
|
||||
055 "Bestanden met newlines in de naam kunnen niet hersteld worden"
|
||||
056 "Wijzigingen kunnen niet ongedaan gemaakt worden als deze sessie mislukt"
|
||||
057 "Bestand wordt gecopieerd voor herstel..."
|
||||
058 "Herstel mechanisme werkt niet: %s"
|
||||
059 "Wijzigingen kunnen niet ongedaan gemaakt worden als deze sessie mislukt"
|
||||
060 "Kon bestand niet veilig stellen: %s"
|
||||
061 "Bestand wordt gecopieerd voor herstel..."
|
||||
062 "Informatie met betrekking tot gebruiker nummer %u niet gevonden"
|
||||
063 "Kan herstel bestand niet beveiligen"
|
||||
064 "herstel buffer overgelopen"
|
||||
065 "herstel bestand"
|
||||
066 "%s: verminkt herstel bestand"
|
||||
067 "%s: verminkt herstel bestand"
|
||||
068 "U heeft geen bestand genaamd %s te herstellen"
|
||||
069 "U kan eerdere versies van dit bestand herstellen"
|
||||
070 "U kan nog meer bestanden herstellen"
|
||||
071 "kan geen email versturen: %s"
|
||||
072 "Bestand leeg; niets om te doorzoeken"
|
||||
073 "Einde van het bestand bereikt zonder dat het patroon gevonden is"
|
||||
074 "Geen vorig zoek patroon"
|
||||
075 "Patroon niet gevonden"
|
||||
076 "Begin van het bestand bereikt zonder dat het patroon gevonden is"
|
||||
077 "Zoek-operatie omgeslagen"
|
||||
078 "Bezig met zoeken..."
|
||||
079 "Geen niet-printbaar karakter gevonden"
|
||||
080 "Onbekend commando"
|
||||
082 "Commando niet beschikbaar in ex mode"
|
||||
083 "Aantal mag niet nul zijn"
|
||||
084 "%s: ongeldige regel aanduiding"
|
||||
085 "Interne fout in syntax tabel (%s: %s)"
|
||||
086 "Gebruik: %s"
|
||||
087 "%s: tijdelijke buffer niet vrijgegeven"
|
||||
088 "Vlag offset voor regel 1"
|
||||
089 "Vlag offset voorbij bestands einde"
|
||||
090 "bestand/scherm veranderd tijdens uitvoeren van @ in een blok"
|
||||
091 "bestand/scherm veranderd tijdens uitvoeren van globaal/v commando"
|
||||
092 "Ex commando mislukt: rest van commando(s) genegeerd"
|
||||
093 "Ex commando mislukt: gemappede toetsen genegeerd"
|
||||
094 "Het tweede adres is kleiner dan het eerste"
|
||||
095 "Geen merk naam opgegeven"
|
||||
096 "\\ niet gevolgd door / of ?"
|
||||
097 "Referentie aan een regel nummer kleiner dan 0"
|
||||
098 "Het %s commando is onbekend"
|
||||
099 "Adres waarde te groot"
|
||||
100 "Adres waarde te klein"
|
||||
101 "Ongeldige adres combinatie"
|
||||
102 "Ongeldig adres: slechts %lu regels in het bestand aanwezig"
|
||||
103 "Ongeldig adres: het bestand is leeg"
|
||||
104 "Het %s commando staat het adres 0 niet toe"
|
||||
105 "Geen afkortingen om weer te geven"
|
||||
106 "Afkortingen moeten eindigen met een "woord" letter"
|
||||
107 "Afkortingen mogen geen tabulaties of spaties bevatten"
|
||||
108 "Afkortingen mogen geen woord/niet-woord karakters mengen, behalve aan het einde"
|
||||
109 ""%s" is geen afkorting"
|
||||
110 "Vi commando mislukt: gemappede toetsen genegeerd"
|
||||
111 "Dit is het laatste bestand"
|
||||
112 "Dit is het eerste bestand"
|
||||
113 "Dit is het eerste bestand"
|
||||
114 "lijst met bestanden is leeg"
|
||||
115 "Geen voorgaand commando om "!" te vervangen"
|
||||
116 "Geen bestandsnaam voor %%"
|
||||
117 "Geen bestandsnaam voor #"
|
||||
118 "Fout: execl: %s"
|
||||
119 "I/O fout: %s"
|
||||
120 "Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forceren"
|
||||
121 "Kan uw home directory niet vinden"
|
||||
122 "Nieuwe huidige directory: %s"
|
||||
123 "Geen cut buffers aanwezig"
|
||||
124 "Het %s commando kan niet gebruikt worden in een globaal of v commando"
|
||||
125 "%s/%s: niet gelezen: noch U noch root is de eigenaar"
|
||||
126 "%s/%s: niet gelezen: U bent niet de eigenaar"
|
||||
127 "%s/%s: niet gelezen: kan gewijzigd worden door andere gebruikers"
|
||||
128 "%s: niet gelezen: noch U noch root is de eigenaar""
|
||||
129 "%s: niet gelezen: U bent niet de eigenaar"
|
||||
130 "%s: niet gelezen: kan gewijzigd worden door andere gebruikers"
|
||||
131 "Geen volgende regel om samen te voegen"
|
||||
132 "Geen input map entries"
|
||||
133 "Geen command map entries"
|
||||
134 "Het %s karakter kan niet ge-remapped worden"
|
||||
135 ""%s" is niet gemapped"
|
||||
136 "Merk naam moet een enkel karakter zijn"
|
||||
137 "%s bestaat al, niet weggeschreven; gebruik ! om het te forceren"
|
||||
138 "Nieuw .exrc bestand: %s. "
|
||||
139 "doel regel ligt in het blok"
|
||||
140 "Het open commando vereist dat de open optie actief is"
|
||||
141 "Het open commando is nog niet ondersteund"
|
||||
142 "Kan dit bestand niet veilig stellen"
|
||||
143 "Bestand veilig gesteld"
|
||||
144 "%s resulteert in te veel bestandsnamen"
|
||||
145 "Alleen echte bestanden en named pipes kunnen gelezen worden"
|
||||
146 "%s: lees beveiliging niet beschikbaar"
|
||||
147 "Bezig met lezen..."
|
||||
148 "%s: %lu regels, %lu karakters"
|
||||
149 "Geen achtergrond schermen aanwezig"
|
||||
150 "Het script commando is alleen beschikbaar in vi mode"
|
||||
151 "Geen comando om uit te voeren"
|
||||
152 "shiftwidth optie op 0 gezet"
|
||||
153 "Count te groot"
|
||||
154 "Count te klein"
|
||||
155 "Reguliere expressie opgegeven; r vlag heeft geen betekenis"
|
||||
156 "De #, l en p vlaggen kunnen niet gecombineerd worden met de c vlag in vi mode"
|
||||
157 "Geen match gevonden"
|
||||
158 "Geen voorafgaande tag aanwezig"
|
||||
159 "Minder dan %s elementen op de tags stapel; gebruik :display t[ags]"
|
||||
160 "Geen bestand genaamd %s op de tags stapel; gebruik :display t[ags]"
|
||||
161 "Kies Enter om door te gaan: "
|
||||
162 "%s: tag niet gevonden"
|
||||
163 "%s: verminkte tag in %s"
|
||||
164 "%s: Het regel nummer van deze tag is voorbij het einde van het bestand"
|
||||
165 "De tags stapel is leeg"
|
||||
166 "%s: zoek patroon niet gevonden"
|
||||
167 "%d andere bestanden te wijzigen"
|
||||
168 "Buffer %s is leeg"
|
||||
169 "Bevestig wijziging? [n]"
|
||||
170 "Onderbroken"
|
||||
171 "Geen voorafgaande buffer om uit te voeren"
|
||||
172 "Geen vorige reguliere expressie"
|
||||
173 "Het %s commando vereist dat er een bestand geladen is"
|
||||
174 "Gebruik: %s"
|
||||
175 "Het visual commando vereist dat de open optie actief is"
|
||||
177 "Leeg bestand"
|
||||
178 "Geen voorafgaand F, f, T of t zoek commando"
|
||||
179 "%s niet gevonden"
|
||||
180 "Geen voorafgaand bestand te bewerken"
|
||||
181 "Cursor niet op een getal"
|
||||
182 "Getal wordt te groot"
|
||||
183 "Getal wordt te klein"
|
||||
184 "Geen overeenkomstig karakter op deze regel"
|
||||
185 "Overeenkomstig karakter niet gevonden"
|
||||
186 "Geen karakters te vervangen"
|
||||
187 "Geen ander scherm aanwezig"
|
||||
188 "Karakters achter het zoek patroon, de regel offset, en/of het z commando"
|
||||
189 "Geen voorafgaand zoek patroon"
|
||||
190 "Zoekopdracht na omslag teruggekeerd op originele positie"
|
||||
191 "Afkorting overschrijdt expansie limiet: karakters genegeerd"
|
||||
192 "Ongeldig karakter; quote to enter"
|
||||
193 "Reeds aan het begin van de invoer"
|
||||
194 "Niet meer karakters te verwijderen"
|
||||
195 "Verplaatsing voorbij het einde van het bestand"
|
||||
196 "Verplaatsing voorbij het einde van de regel"
|
||||
197 "Cursor niet verplaatst"
|
||||
198 "Reeds aan het begin van het bestand"
|
||||
199 "Verplaatsing voorbij het begin van het bestand"
|
||||
200 "Reeds in de eerste kolom"
|
||||
201 "Buffers moeten voor het commando opgegeven worden"
|
||||
202 "Reeds bij het einde van het bestand"
|
||||
203 "Reeds bij het einde van de regel"
|
||||
204 "%s is geen vi commando"
|
||||
205 "Gebruik: %s"
|
||||
206 "Geen karakters te verwijderen"
|
||||
207 "Het Q commando vereist de ex terminal interface"
|
||||
208 "Geen commando om te herhalen"
|
||||
209 "Het bestand is leeg"
|
||||
210 "%s mag niet gebruikt worden als een verplaatsings commando"
|
||||
211 "Al in commando mode"
|
||||
212 "Cursor niet in een woord"
|
||||
214 "Windows optie waarde is te groot, maximum is %u"
|
||||
215 "Toevoegen"
|
||||
216 "Veranderen"
|
||||
217 "Commando"
|
||||
218 "Invoegen"
|
||||
219 "Vervangen"
|
||||
220 "Verplaatsing voorbij het eind van het scherm"
|
||||
221 "Verplaatsing voorbij het begin van het scherm"
|
||||
222 "Scherm moet meer dan %d regels hebben om het te kunnen splitsen"
|
||||
223 "Er zijn geen achtergrond schermen"
|
||||
224 "Er is geen achtergrond scherm waarin U bestand %s aan het bewerken bent"
|
||||
225 "U kan uw enige scherm niet in de achtergrond zetten"
|
||||
226 "Het scherm kan slechts verkleind worden tot %d regels"
|
||||
227 "Het scherm kan niet kleiner"
|
||||
228 "Het scherm kan niet groter"
|
||||
230 "Dit scherm kan niet gesuspend worden"
|
||||
231 "Onderbroken: gemappede toetsen genegeerd"
|
||||
232 "vi: tijdelijke buffer niet vrijgegeven"
|
||||
233 "Deze terminal heeft geen %s toets"
|
||||
234 "Er kan slechts een buffer opgegeven worden"
|
||||
235 "Getal groter dan %lu"
|
||||
236 "Onderbroken"
|
||||
237 "Aanmaken van tijdelijk bestand is mislukt"
|
||||
238 "Waarschuwing: %s is geen regulier bestand"
|
||||
239 "%s is al geopend, bestand is in deze sessie niet schrijfbaar"
|
||||
240 "%s: verwijdering mislukt"
|
||||
241 "%s: sluiting mislukt"
|
||||
242 "%s: verwijdering mislukt"
|
||||
243 "%s: verwijdering mislukt"
|
||||
244 "Bestand niet schrijfbaar, niet weggeschreven; gebruik ! om het te forceren"
|
||||
245 "Bestand niet schrijfbaar, niet weggeschreven"
|
||||
246 "%s bestaat al, niet weggeschreven; gebruik ! om het te forceren"
|
||||
247 "%s bestaat al, niet weggeschreven"
|
||||
248 "Gebruik ! om een incompleet bestand weg te schrijven"
|
||||
249 "Bestand incompleet, niet weggeschreven"
|
||||
250 "%s: bestand op disk nieuwer dan deze versie; gebruik ! om het te forceren"
|
||||
251 "%s: bestand op disk nieuwer dan deze versie"
|
||||
252 "%s: schrijf beveiliging niet beschikbaar"
|
||||
253 "Bezig met schrijven..."
|
||||
254 "%s: WAARSCHUWING: BESTAND INCOMPLEET"
|
||||
255 "Reeds op de eerste tag van deze groep"
|
||||
256 "%s: nieuw bestand: %lu regels, %lu karakters"
|
||||
257 "%s: %lu regels, %lu karakters"
|
||||
258 "%s resulteert in te veel bestandsnamen"
|
||||
259 "%s: geen normaal bestand"
|
||||
260 "%s: U bent niet de eigenaar"
|
||||
261 "%s: kan gewijzigd worden door andere gebruikers"
|
||||
262 "Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forceren"
|
||||
263 "Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik :edit! om het te forceren"
|
||||
264 "Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forceren"
|
||||
265 "Tijdelijk bestand; exit negeert wijzigingen"
|
||||
266 "Bestand niet schrijfbaar, wijzigingen niet automatisch weggeschreven"
|
||||
267 "log opnieuw gestart"
|
||||
268 "Bevestig? [ynq]"
|
||||
269 "Druk op een toets om door te gaan: "
|
||||
270 "Druk op een toets om door te gaan [: voor meer ex commandos]: "
|
||||
271 "Druk op een toets om door te gaan [q om te stoppen]: "
|
||||
272 "Deze vorm van %s vereist de ex terminal interface"
|
||||
273 "Entering ex input mode."
|
||||
274 "Commando mislukt, nog geen bestand geladen."
|
||||
275 " doorgaan?"
|
||||
276 "Onverwacht character event"
|
||||
277 "Onverwacht end-of-file event"
|
||||
278 "Geen match gevonden voor dit patroon"
|
||||
279 "Onverwacht interrupt event"
|
||||
280 "Onverwacht quit event"
|
||||
281 "Onverwacht repaint event"
|
||||
282 "Reeds op de laatste tag van deze groep"
|
||||
283 "Het %s command vereist de ex terminal interface"
|
||||
284 "Deze vorm van %s is niet ondersteund als de secure edit optie actief is"
|
||||
285 "Onverwacht string event"
|
||||
286 "Onverwacht timeout event"
|
||||
287 "Onverwacht write event"
|
||||
289 "Shell expansies zijn niet ondersteund als de secure edit optie actief is"
|
||||
290 "Het %s commando is niet ondersteund als de secure edit optie actief is"
|
||||
291 "set: %s mag niet uitgezet worden"
|
||||
292 "Scherm te klein."
|
||||
293 "toegevoegd"
|
||||
294 "gewijzigd"
|
||||
295 "verwijderd"
|
||||
296 "samengevoegd"
|
||||
297 "verplaatst"
|
||||
298 "verschoven"
|
||||
299 "gebufferd"
|
||||
300 "regel"
|
||||
301 "regels"
|
||||
302 "Vi was niet geladen met een Tcl interpreter"
|
||||
303 "Bestand gewijzigd sinds het de laatste keer weg is geschreven."
|
||||
304 "Shell expansie mislukt"
|
||||
305 "Geen %s edit optie opgegeven"
|
||||
306 "Vi was niet geladen met een Perl interpreter"
|
||||
307 "Geen ex commando om uit te voeren"
|
||||
308 "Kies <CR> om commando uit te voeren, :q om te stoppen"
|
||||
309 "Gebruik "cscope help" voor uitleg"
|
||||
310 "Nog geen cscope connectie aanwezig"
|
||||
311 "%s: onbekend zoek type: gebruik een van %s"
|
||||
312 "%d: onbekende cscope sessie"
|
||||
313 "set: de %s optie mag nooit aangezet worden"
|
||||
314 "set: de %s optie mag nooit op 0 gezet worden"
|
||||
315 "%s: toegevoegd: %lu regels, %lu karakters"
|
||||
316 "Onverwacht resize event"
|
||||
317 "%d bestanden te wijzigen"
|
37
contrib/nvi/catalog/dutch.check
Normal file
37
contrib/nvi/catalog/dutch.check
Normal file
@ -0,0 +1,37 @@
|
||||
Unused message id's (this is okay):
|
||||
001
|
||||
047
|
||||
050
|
||||
051
|
||||
052
|
||||
081
|
||||
176
|
||||
213
|
||||
229
|
||||
288
|
||||
=========================
|
||||
MISSING ERROR MESSAGES (Please add!):
|
||||
=========================
|
||||
Extra error messages (just delete them):
|
||||
=========================
|
||||
MESSAGES WITH THE SAME MESSAGE ID's (FIX!):
|
||||
=========================
|
||||
Duplicate messages, both id and message (this is okay):
|
||||
=========================
|
||||
Duplicate messages, just message (this is okay):
|
||||
2 %s bestaat al, niet weggeschreven; gebruik ! om het te forcerenX
|
||||
2 %s resulteert in te veel bestandsnamenX
|
||||
2 %s: %lu regels, %lu karaktersX
|
||||
2 %s: verminkt herstel bestandX
|
||||
2 Bestand wordt gecopieerd voor herstel...X
|
||||
2 Buffer %s is leegX
|
||||
2 Dit is het eerste bestandX
|
||||
2 Er vindt geen logging plaats, kan wijzigingen niet ongedaan makenX
|
||||
2 OnderbrokenX
|
||||
2 Wijzigingen kunnen niet ongedaan gemaakt worden als deze sessie misluktX
|
||||
2 gewijzigdX
|
||||
2 set: %s optie moet een waarde hebbenX
|
||||
3 %s: verwijdering misluktX
|
||||
3 Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forcerenX
|
||||
4 Gebruik: %sX
|
||||
=========================
|
1
contrib/nvi/catalog/dutch.owner
Normal file
1
contrib/nvi/catalog/dutch.owner
Normal file
@ -0,0 +1 @@
|
||||
J.G. Vons <Gert-Jan.Vons@ocegr.fr>
|
317
contrib/nvi/catalog/english
Normal file
317
contrib/nvi/catalog/english
Normal file
@ -0,0 +1,317 @@
|
||||
VI_MESSAGE_CATALOG
|
||||
Line length overflowX
|
||||
unable to delete line %luX
|
||||
unable to append to line %luX
|
||||
unable to insert at line %luX
|
||||
unable to store line %luX
|
||||
unable to get last lineX
|
||||
Error: unable to retrieve line %luX
|
||||
Log fileX
|
||||
Logging not being performed, undo not possibleX
|
||||
No changes to undoX
|
||||
Logging not being performed, undo not possibleX
|
||||
Logging not being performed, roll-forward not possibleX
|
||||
No changes to re-doX
|
||||
%s/%d: log put errorX
|
||||
Vi's standard input and output must be a terminalX
|
||||
Mark %s: not setX
|
||||
Mark %s: the line was deletedX
|
||||
Mark %s: cursor position no longer existsX
|
||||
Error: X
|
||||
new fileX
|
||||
name changedX
|
||||
modifiedX
|
||||
unmodifiedX
|
||||
UNLOCKEDX
|
||||
readonlyX
|
||||
line %lu of %lu [%ld%%]X
|
||||
empty fileX
|
||||
line %luX
|
||||
The file %s is not a message catalogX
|
||||
Unable to set default %s optionX
|
||||
Usage: %sX
|
||||
set: no %s option: 'set all' gives all option valuesX
|
||||
set: [no]%s option doesn't take a valueX
|
||||
set: %s option isn't a booleanX
|
||||
set: %s option: %sX
|
||||
set: %s option: %s: value overflowX
|
||||
set: %s option: %s is an illegal numberX
|
||||
set: %s option isn't a booleanX
|
||||
Screen columns too small, less than %dX
|
||||
Screen columns too large, greater than %dX
|
||||
Screen lines too small, less than %dX
|
||||
Screen lines too large, greater than %dX
|
||||
The lisp option is not implementedX
|
||||
messages not turned off: %sX
|
||||
messages not turned on: %sX
|
||||
|
||||
The paragraph option must be in two character groupsX
|
||||
The section option must be in two character groupsX
|
||||
|
||||
|
||||
|
||||
The default buffer is emptyX
|
||||
Buffer %s is emptyX
|
||||
Files with newlines in the name are unrecoverableX
|
||||
Modifications not recoverable if the session failsX
|
||||
Copying file for recovery...X
|
||||
Preservation failed: %sX
|
||||
Modifications not recoverable if the session failsX
|
||||
File backup failed: %sX
|
||||
Copying file for recovery...X
|
||||
Information on user id %u not foundX
|
||||
Unable to lock recovery fileX
|
||||
Recovery file buffer overrunX
|
||||
Recovery fileX
|
||||
%s: malformed recovery fileX
|
||||
%s: malformed recovery fileX
|
||||
No files named %s, readable by you, to recoverX
|
||||
There are older versions of this file for you to recoverX
|
||||
There are other files for you to recoverX
|
||||
not sending email: %sX
|
||||
File empty; nothing to searchX
|
||||
Reached end-of-file without finding the patternX
|
||||
No previous search patternX
|
||||
Pattern not foundX
|
||||
Reached top-of-file without finding the patternX
|
||||
Search wrappedX
|
||||
Searching...X
|
||||
No non-printable character foundX
|
||||
Unknown command nameX
|
||||
|
||||
%s: command not available in ex modeX
|
||||
Count may not be zeroX
|
||||
%s: bad line specificationX
|
||||
Internal syntax table error (%s: %s)X
|
||||
Usage: %sX
|
||||
%s: temporary buffer not releasedX
|
||||
Flag offset to before line 1X
|
||||
Flag offset past end-of-fileX
|
||||
@ with range running when the file/screen changedX
|
||||
Global/v command running when the file/screen changedX
|
||||
Ex command failed: pending commands discardedX
|
||||
Ex command failed: mapped keys discardedX
|
||||
The second address is smaller than the firstX
|
||||
No mark name suppliedX
|
||||
\\ not followed by / or ?X
|
||||
Reference to a line number less than 0X
|
||||
The %s command is unknownX
|
||||
Address value overflowX
|
||||
Address value underflowX
|
||||
Illegal address combinationX
|
||||
Illegal address: only %lu lines in the fileX
|
||||
Illegal address: the file is emptyX
|
||||
The %s command doesn't permit an address of 0X
|
||||
No abbreviations to displayX
|
||||
Abbreviations must end with a "word" characterX
|
||||
Abbreviations may not contain tabs or spacesX
|
||||
Abbreviations may not mix word/non-word characters, except at the endX
|
||||
"%s" is not an abbreviationX
|
||||
Vi command failed: mapped keys discardedX
|
||||
No more files to editX
|
||||
No previous files to editX
|
||||
No previous files to rewindX
|
||||
No file list to displayX
|
||||
No previous command to replace "!"X
|
||||
No filename to substitute for %%X
|
||||
No filename to substitute for #X
|
||||
Error: execl: %sX
|
||||
I/O error: %sX
|
||||
File modified since last complete write; write or use ! to overrideX
|
||||
Unable to find home directory locationX
|
||||
New current directory: %sX
|
||||
No cut buffers to displayX
|
||||
The %s command can't be used as part of a global or v commandX
|
||||
%s/%s: not sourced: not owned by you or rootX
|
||||
%s/%s: not sourced: not owned by youX
|
||||
%s/%s: not sourced: writeable by a user other than the ownerX
|
||||
%s: not sourced: not owned by you or rootX
|
||||
%s: not sourced: not owned by youX
|
||||
%s: not sourced: writeable by a user other than the ownerX
|
||||
No following lines to joinX
|
||||
No input map entriesX
|
||||
No command map entriesX
|
||||
The %s character may not be remappedX
|
||||
"%s" isn't currently mappedX
|
||||
Mark names must be a single characterX
|
||||
%s exists, not written; use ! to overrideX
|
||||
New exrc file: %sX
|
||||
Destination line is inside move rangeX
|
||||
The open command requires that the open option be setX
|
||||
The open command is not yet implementedX
|
||||
Preservation of this file not possibleX
|
||||
File preservedX
|
||||
%s: expanded into too many file namesX
|
||||
Only regular files and named pipes may be readX
|
||||
%s: read lock was unavailableX
|
||||
Reading...X
|
||||
%s: %lu lines, %lu charactersX
|
||||
No background screens to displayX
|
||||
The script command is only available in vi modeX
|
||||
No command to executeX
|
||||
shiftwidth option set to 0X
|
||||
Count overflowX
|
||||
Count underflowX
|
||||
Regular expression specified; r flag meaninglessX
|
||||
The #, l and p flags may not be combined with the c flag in vi modeX
|
||||
No match foundX
|
||||
No previous tag enteredX
|
||||
Less than %s entries on the tags stack; use :display t[ags]X
|
||||
No file %s on the tags stack to return to; use :display t[ags]X
|
||||
Press Enter to continue: X
|
||||
%s: tag not foundX
|
||||
%s: corrupted tag in %sX
|
||||
%s: the tag's line number is past the end of the fileX
|
||||
The tags stack is emptyX
|
||||
%s: search pattern not foundX
|
||||
%d more files to editX
|
||||
Buffer %s is emptyX
|
||||
Confirm change? [n]X
|
||||
InterruptedX
|
||||
No previous buffer to executeX
|
||||
No previous regular expressionX
|
||||
The %s command requires that a file have already been read inX
|
||||
Usage: %sX
|
||||
The visual command requires that the open option be setX
|
||||
|
||||
Empty fileX
|
||||
No previous F, f, T or t searchX
|
||||
%s not foundX
|
||||
No previous file to editX
|
||||
Cursor not in a numberX
|
||||
Resulting number too largeX
|
||||
Resulting number too smallX
|
||||
No match character on this lineX
|
||||
Matching character not foundX
|
||||
No characters to replaceX
|
||||
No other screen to switch toX
|
||||
Characters after search string, line offset and/or z commandX
|
||||
No previous search patternX
|
||||
Search wrapped to original positionX
|
||||
Abbreviation exceeded expansion limit: characters discardedX
|
||||
Illegal character; quote to enterX
|
||||
Already at the beginning of the insertX
|
||||
No more characters to eraseX
|
||||
Movement past the end-of-fileX
|
||||
Movement past the end-of-lineX
|
||||
No cursor movement madeX
|
||||
Already at the beginning of the fileX
|
||||
Movement past the beginning of the fileX
|
||||
Already in the first columnX
|
||||
Buffers should be specified before the commandX
|
||||
Already at end-of-fileX
|
||||
Already at end-of-lineX
|
||||
%s isn't a vi commandX
|
||||
Usage: %sX
|
||||
No characters to deleteX
|
||||
The Q command requires the ex terminal interfaceX
|
||||
No command to repeatX
|
||||
The file is emptyX
|
||||
%s may not be used as a motion commandX
|
||||
Already in command modeX
|
||||
Cursor not in a wordX
|
||||
|
||||
Windows option value is too large, max is %uX
|
||||
AppendX
|
||||
ChangeX
|
||||
CommandX
|
||||
InsertX
|
||||
ReplaceX
|
||||
Movement past the end-of-screenX
|
||||
Movement past the beginning-of-screenX
|
||||
Screen must be larger than %d lines to splitX
|
||||
There are no background screensX
|
||||
There's no background screen editing a file named %sX
|
||||
You may not background your only displayed screenX
|
||||
The screen can only shrink to %d rowsX
|
||||
The screen cannot shrinkX
|
||||
The screen cannot growX
|
||||
|
||||
This screen may not be suspendedX
|
||||
Interrupted: mapped keys discardedX
|
||||
vi: temporary buffer not releasedX
|
||||
This terminal has no %s keyX
|
||||
Only one buffer may be specifiedX
|
||||
Number larger than %luX
|
||||
InterruptedX
|
||||
Unable to create temporary fileX
|
||||
Warning: %s is not a regular fileX
|
||||
%s already locked, session is read-onlyX
|
||||
%s: removeX
|
||||
%s: closeX
|
||||
%s: removeX
|
||||
%s: removeX
|
||||
Read-only file, not written; use ! to overrideX
|
||||
Read-only file, not writtenX
|
||||
%s exists, not written; use ! to overrideX
|
||||
%s exists, not writtenX
|
||||
Partial file, not written; use ! to overrideX
|
||||
Partial file, not writtenX
|
||||
%s: file modified more recently than this copy; use ! to overrideX
|
||||
%s: file modified more recently than this copyX
|
||||
%s: write lock was unavailableX
|
||||
Writing...X
|
||||
%s: WARNING: FILE TRUNCATEDX
|
||||
Already at the first tag of this groupX
|
||||
%s: new file: %lu lines, %lu charactersX
|
||||
%s: %lu lines, %lu charactersX
|
||||
%s expanded into too many file namesX
|
||||
%s: not a regular fileX
|
||||
%s: not owned by youX
|
||||
%s: accessible by a user other than the ownerX
|
||||
File modified since last complete write; write or use ! to overrideX
|
||||
File modified since last complete write; write or use :edit! to overrideX
|
||||
File modified since last complete write; write or use ! to overrideX
|
||||
File is a temporary; exit will discard modificationsX
|
||||
File readonly, modifications not auto-writtenX
|
||||
Log restartedX
|
||||
confirm? [ynq]X
|
||||
Press any key to continue: X
|
||||
Press any key to continue [: to enter more ex commands]: X
|
||||
Press any key to continue [q to quit]: X
|
||||
That form of %s requires the ex terminal interfaceX
|
||||
Entering ex input mode.X
|
||||
Command failed, no file read in yet.X
|
||||
cont?X
|
||||
Unexpected character eventX
|
||||
Unexpected end-of-file eventX
|
||||
No matches for queryX
|
||||
Unexpected interrupt eventX
|
||||
Unexpected quit eventX
|
||||
Unexpected repaint eventX
|
||||
Already at the last tag of this groupX
|
||||
The %s command requires the ex terminal interfaceX
|
||||
That form of %s is not supported when the secure edit option is setX
|
||||
Unexpected string eventX
|
||||
Unexpected timeout eventX
|
||||
Unexpected write eventX
|
||||
|
||||
Shell expansions not supported when the secure edit option is setX
|
||||
The %s command is not supported when the secure edit option is setX
|
||||
set: the %s option may not be turned offX
|
||||
Display too small.X
|
||||
addedX
|
||||
changedX
|
||||
deletedX
|
||||
joinedX
|
||||
movedX
|
||||
shiftedX
|
||||
yankedX
|
||||
lineX
|
||||
linesX
|
||||
Vi was not loaded with a Tcl interpreterX
|
||||
File modified since last write.X
|
||||
Shell expansion failedX
|
||||
No %s edit option specifiedX
|
||||
Vi was not loaded with a Perl interpreterX
|
||||
No ex command to executeX
|
||||
Enter <CR> to execute a command, :q to exitX
|
||||
Use "cscope help" for helpX
|
||||
No cscope connections runningX
|
||||
%s: unknown search type: use one of %sX
|
||||
%d: no such cscope sessionX
|
||||
set: the %s option may never be turned onX
|
||||
set: the %s option may never be set to 0X
|
||||
%s: appended: %lu lines, %lu charactersX
|
||||
Unexpected resize eventX
|
||||
%d files to editX
|
309
contrib/nvi/catalog/english.base
Normal file
309
contrib/nvi/catalog/english.base
Normal file
@ -0,0 +1,309 @@
|
||||
002 "Line length overflow"
|
||||
003 "unable to delete line %lu"
|
||||
004 "unable to append to line %lu"
|
||||
005 "unable to insert at line %lu"
|
||||
006 "unable to store line %lu"
|
||||
007 "unable to get last line"
|
||||
008 "Error: unable to retrieve line %lu"
|
||||
009 "Log file"
|
||||
010 "Logging not being performed, undo not possible"
|
||||
011 "No changes to undo"
|
||||
012 "Logging not being performed, undo not possible"
|
||||
013 "Logging not being performed, roll-forward not possible"
|
||||
014 "No changes to re-do"
|
||||
015 "%s/%d: log put error"
|
||||
016 "Vi's standard input and output must be a terminal"
|
||||
017 "Mark %s: not set"
|
||||
018 "Mark %s: the line was deleted"
|
||||
019 "Mark %s: cursor position no longer exists"
|
||||
020 "Error: "
|
||||
021 "new file"
|
||||
022 "name changed"
|
||||
023 "modified"
|
||||
024 "unmodified"
|
||||
025 "UNLOCKED"
|
||||
026 "readonly"
|
||||
027 "line %lu of %lu [%ld%%]"
|
||||
028 "empty file"
|
||||
029 "line %lu"
|
||||
030 "The file %s is not a message catalog"
|
||||
031 "Unable to set default %s option"
|
||||
032 "Usage: %s"
|
||||
033 "set: no %s option: 'set all' gives all option values"
|
||||
034 "set: [no]%s option doesn't take a value"
|
||||
035 "set: %s option isn't a boolean"
|
||||
036 "set: %s option: %s"
|
||||
037 "set: %s option: %s: value overflow"
|
||||
038 "set: %s option: %s is an illegal number"
|
||||
039 "set: %s option isn't a boolean"
|
||||
040 "Screen columns too small, less than %d"
|
||||
041 "Screen columns too large, greater than %d"
|
||||
042 "Screen lines too small, less than %d"
|
||||
043 "Screen lines too large, greater than %d"
|
||||
044 "The lisp option is not implemented"
|
||||
045 "messages not turned off: %s"
|
||||
046 "messages not turned on: %s"
|
||||
048 "The paragraph option must be in two character groups"
|
||||
049 "The section option must be in two character groups"
|
||||
053 "The default buffer is empty"
|
||||
054 "Buffer %s is empty"
|
||||
055 "Files with newlines in the name are unrecoverable"
|
||||
056 "Modifications not recoverable if the session fails"
|
||||
057 "Copying file for recovery..."
|
||||
058 "Preservation failed: %s"
|
||||
059 "Modifications not recoverable if the session fails"
|
||||
060 "File backup failed: %s"
|
||||
061 "Copying file for recovery..."
|
||||
062 "Information on user id %u not found"
|
||||
063 "Unable to lock recovery file"
|
||||
064 "Recovery file buffer overrun"
|
||||
065 "Recovery file"
|
||||
066 "%s: malformed recovery file"
|
||||
067 "%s: malformed recovery file"
|
||||
068 "No files named %s, readable by you, to recover"
|
||||
069 "There are older versions of this file for you to recover"
|
||||
070 "There are other files for you to recover"
|
||||
071 "not sending email: %s"
|
||||
072 "File empty; nothing to search"
|
||||
073 "Reached end-of-file without finding the pattern"
|
||||
074 "No previous search pattern"
|
||||
075 "Pattern not found"
|
||||
076 "Reached top-of-file without finding the pattern"
|
||||
077 "Search wrapped"
|
||||
078 "Searching..."
|
||||
079 "No non-printable character found"
|
||||
080 "Unknown command name"
|
||||
082 "%s: command not available in ex mode"
|
||||
083 "Count may not be zero"
|
||||
084 "%s: bad line specification"
|
||||
085 "Internal syntax table error (%s: %s)"
|
||||
086 "Usage: %s"
|
||||
087 "%s: temporary buffer not released"
|
||||
088 "Flag offset to before line 1"
|
||||
089 "Flag offset past end-of-file"
|
||||
090 "@ with range running when the file/screen changed"
|
||||
091 "Global/v command running when the file/screen changed"
|
||||
092 "Ex command failed: pending commands discarded"
|
||||
093 "Ex command failed: mapped keys discarded"
|
||||
094 "The second address is smaller than the first"
|
||||
095 "No mark name supplied"
|
||||
096 "\\ not followed by / or ?"
|
||||
097 "Reference to a line number less than 0"
|
||||
098 "The %s command is unknown"
|
||||
099 "Address value overflow"
|
||||
100 "Address value underflow"
|
||||
101 "Illegal address combination"
|
||||
102 "Illegal address: only %lu lines in the file"
|
||||
103 "Illegal address: the file is empty"
|
||||
104 "The %s command doesn't permit an address of 0"
|
||||
105 "No abbreviations to display"
|
||||
106 "Abbreviations must end with a "word" character"
|
||||
107 "Abbreviations may not contain tabs or spaces"
|
||||
108 "Abbreviations may not mix word/non-word characters, except at the end"
|
||||
109 ""%s" is not an abbreviation"
|
||||
110 "Vi command failed: mapped keys discarded"
|
||||
111 "No more files to edit"
|
||||
112 "No previous files to edit"
|
||||
113 "No previous files to rewind"
|
||||
114 "No file list to display"
|
||||
115 "No previous command to replace "!""
|
||||
116 "No filename to substitute for %%"
|
||||
117 "No filename to substitute for #"
|
||||
118 "Error: execl: %s"
|
||||
119 "I/O error: %s"
|
||||
120 "File modified since last complete write; write or use ! to override"
|
||||
121 "Unable to find home directory location"
|
||||
122 "New current directory: %s"
|
||||
123 "No cut buffers to display"
|
||||
124 "The %s command can't be used as part of a global or v command"
|
||||
125 "%s/%s: not sourced: not owned by you or root"
|
||||
126 "%s/%s: not sourced: not owned by you"
|
||||
127 "%s/%s: not sourced: writeable by a user other than the owner"
|
||||
128 "%s: not sourced: not owned by you or root"
|
||||
129 "%s: not sourced: not owned by you"
|
||||
130 "%s: not sourced: writeable by a user other than the owner"
|
||||
131 "No following lines to join"
|
||||
132 "No input map entries"
|
||||
133 "No command map entries"
|
||||
134 "The %s character may not be remapped"
|
||||
135 ""%s" isn't currently mapped"
|
||||
136 "Mark names must be a single character"
|
||||
137 "%s exists, not written; use ! to override"
|
||||
138 "New exrc file: %s"
|
||||
139 "Destination line is inside move range"
|
||||
140 "The open command requires that the open option be set"
|
||||
141 "The open command is not yet implemented"
|
||||
142 "Preservation of this file not possible"
|
||||
143 "File preserved"
|
||||
144 "%s: expanded into too many file names"
|
||||
145 "Only regular files and named pipes may be read"
|
||||
146 "%s: read lock was unavailable"
|
||||
147 "Reading..."
|
||||
148 "%s: %lu lines, %lu characters"
|
||||
149 "No background screens to display"
|
||||
150 "The script command is only available in vi mode"
|
||||
151 "No command to execute"
|
||||
152 "shiftwidth option set to 0"
|
||||
153 "Count overflow"
|
||||
154 "Count underflow"
|
||||
155 "Regular expression specified; r flag meaningless"
|
||||
156 "The #, l and p flags may not be combined with the c flag in vi mode"
|
||||
157 "No match found"
|
||||
158 "No previous tag entered"
|
||||
159 "Less than %s entries on the tags stack; use :display t[ags]"
|
||||
160 "No file %s on the tags stack to return to; use :display t[ags]"
|
||||
161 "Press Enter to continue: "
|
||||
162 "%s: tag not found"
|
||||
163 "%s: corrupted tag in %s"
|
||||
164 "%s: the tag's line number is past the end of the file"
|
||||
165 "The tags stack is empty"
|
||||
166 "%s: search pattern not found"
|
||||
167 "%d more files to edit"
|
||||
168 "Buffer %s is empty"
|
||||
169 "Confirm change? [n]"
|
||||
170 "Interrupted"
|
||||
171 "No previous buffer to execute"
|
||||
172 "No previous regular expression"
|
||||
173 "The %s command requires that a file have already been read in"
|
||||
174 "Usage: %s"
|
||||
175 "The visual command requires that the open option be set"
|
||||
177 "Empty file"
|
||||
178 "No previous F, f, T or t search"
|
||||
179 "%s not found"
|
||||
180 "No previous file to edit"
|
||||
181 "Cursor not in a number"
|
||||
182 "Resulting number too large"
|
||||
183 "Resulting number too small"
|
||||
184 "No match character on this line"
|
||||
185 "Matching character not found"
|
||||
186 "No characters to replace"
|
||||
187 "No other screen to switch to"
|
||||
188 "Characters after search string, line offset and/or z command"
|
||||
189 "No previous search pattern"
|
||||
190 "Search wrapped to original position"
|
||||
191 "Abbreviation exceeded expansion limit: characters discarded"
|
||||
192 "Illegal character; quote to enter"
|
||||
193 "Already at the beginning of the insert"
|
||||
194 "No more characters to erase"
|
||||
195 "Movement past the end-of-file"
|
||||
196 "Movement past the end-of-line"
|
||||
197 "No cursor movement made"
|
||||
198 "Already at the beginning of the file"
|
||||
199 "Movement past the beginning of the file"
|
||||
200 "Already in the first column"
|
||||
201 "Buffers should be specified before the command"
|
||||
202 "Already at end-of-file"
|
||||
203 "Already at end-of-line"
|
||||
204 "%s isn't a vi command"
|
||||
205 "Usage: %s"
|
||||
206 "No characters to delete"
|
||||
207 "The Q command requires the ex terminal interface"
|
||||
208 "No command to repeat"
|
||||
209 "The file is empty"
|
||||
209 "The file is empty"
|
||||
210 "%s may not be used as a motion command"
|
||||
211 "Already in command mode"
|
||||
212 "Cursor not in a word"
|
||||
214 "Windows option value is too large, max is %u"
|
||||
215 "Append"
|
||||
216 "Change"
|
||||
217 "Command"
|
||||
218 "Insert"
|
||||
219 "Replace"
|
||||
220 "Movement past the end-of-screen"
|
||||
221 "Movement past the beginning-of-screen"
|
||||
222 "Screen must be larger than %d lines to split"
|
||||
223 "There are no background screens"
|
||||
224 "There's no background screen editing a file named %s"
|
||||
225 "You may not background your only displayed screen"
|
||||
226 "The screen can only shrink to %d rows"
|
||||
227 "The screen cannot shrink"
|
||||
228 "The screen cannot grow"
|
||||
230 "This screen may not be suspended"
|
||||
231 "Interrupted: mapped keys discarded"
|
||||
232 "vi: temporary buffer not released"
|
||||
233 "This terminal has no %s key"
|
||||
234 "Only one buffer may be specified"
|
||||
235 "Number larger than %lu"
|
||||
236 "Interrupted"
|
||||
237 "Unable to create temporary file"
|
||||
238 "Warning: %s is not a regular file"
|
||||
239 "%s already locked, session is read-only"
|
||||
240 "%s: remove"
|
||||
241 "%s: close"
|
||||
242 "%s: remove"
|
||||
243 "%s: remove"
|
||||
244 "Read-only file, not written; use ! to override"
|
||||
245 "Read-only file, not written"
|
||||
246 "%s exists, not written; use ! to override"
|
||||
247 "%s exists, not written"
|
||||
248 "Partial file, not written; use ! to override"
|
||||
249 "Partial file, not written"
|
||||
250 "%s: file modified more recently than this copy; use ! to override"
|
||||
251 "%s: file modified more recently than this copy"
|
||||
252 "%s: write lock was unavailable"
|
||||
253 "Writing..."
|
||||
254 "%s: WARNING: FILE TRUNCATED"
|
||||
255 "Already at the first tag of this group"
|
||||
256 "%s: new file: %lu lines, %lu characters"
|
||||
257 "%s: %lu lines, %lu characters"
|
||||
258 "%s expanded into too many file names"
|
||||
259 "%s: not a regular file"
|
||||
260 "%s: not owned by you"
|
||||
261 "%s: accessible by a user other than the owner"
|
||||
262 "File modified since last complete write; write or use ! to override"
|
||||
263 "File modified since last complete write; write or use :edit! to override"
|
||||
264 "File modified since last complete write; write or use ! to override"
|
||||
265 "File is a temporary; exit will discard modifications"
|
||||
266 "File readonly, modifications not auto-written"
|
||||
267 "Log restarted"
|
||||
268 "confirm? [ynq]"
|
||||
269 "Press any key to continue: "
|
||||
270 "Press any key to continue [: to enter more ex commands]: "
|
||||
271 "Press any key to continue [q to quit]: "
|
||||
272 "That form of %s requires the ex terminal interface"
|
||||
273 "Entering ex input mode."
|
||||
274 "Command failed, no file read in yet."
|
||||
275 " cont?"
|
||||
276 "Unexpected character event"
|
||||
277 "Unexpected end-of-file event"
|
||||
278 "No matches for query"
|
||||
279 "Unexpected interrupt event"
|
||||
280 "Unexpected quit event"
|
||||
281 "Unexpected repaint event"
|
||||
282 "Already at the last tag of this group"
|
||||
283 "The %s command requires the ex terminal interface"
|
||||
284 "That form of %s is not supported when the secure edit option is set"
|
||||
285 "Unexpected string event"
|
||||
286 "Unexpected timeout event"
|
||||
287 "Unexpected write event"
|
||||
289 "Shell expansions not supported when the secure edit option is set"
|
||||
290 "The %s command is not supported when the secure edit option is set"
|
||||
291 "set: the %s option may not be turned off"
|
||||
292 "Display too small."
|
||||
293 "added"
|
||||
294 "changed"
|
||||
295 "deleted"
|
||||
296 "joined"
|
||||
297 "moved"
|
||||
298 "shifted"
|
||||
299 "yanked"
|
||||
300 "line"
|
||||
301 "lines"
|
||||
302 "Vi was not loaded with a Tcl interpreter"
|
||||
303 "File modified since last write."
|
||||
304 "Shell expansion failed"
|
||||
304 "Shell expansion failed"
|
||||
305 "No %s edit option specified"
|
||||
306 "Vi was not loaded with a Perl interpreter"
|
||||
307 "No ex command to execute"
|
||||
308 "Enter <CR> to execute a command, :q to exit"
|
||||
309 "Use "cscope help" for help"
|
||||
310 "No cscope connections running"
|
||||
311 "%s: unknown search type: use one of %s"
|
||||
312 "%d: no such cscope session"
|
||||
313 "set: the %s option may never be turned on"
|
||||
314 "set: the %s option may never be set to 0"
|
||||
315 "%s: appended: %lu lines, %lu characters"
|
||||
316 "Unexpected resize event"
|
||||
317 "%d files to edit"
|
36
contrib/nvi/catalog/english.check
Normal file
36
contrib/nvi/catalog/english.check
Normal file
@ -0,0 +1,36 @@
|
||||
Unused message id's (this is okay):
|
||||
001
|
||||
047
|
||||
050
|
||||
051
|
||||
052
|
||||
081
|
||||
176
|
||||
229
|
||||
288
|
||||
=========================
|
||||
MISSING ERROR MESSAGES (Please add!):
|
||||
=========================
|
||||
Extra error messages (just delete them):
|
||||
=========================
|
||||
MESSAGES WITH THE SAME MESSAGE ID's (FIX!):
|
||||
=========================
|
||||
Duplicate messages, both id and message (this is okay):
|
||||
2 209 "The file is empty"
|
||||
2 304 "Shell expansion failed"
|
||||
=========================
|
||||
Duplicate messages, just message (this is okay):
|
||||
2 %s exists, not written; use ! to overrideX
|
||||
2 %s: %lu lines, %lu charactersX
|
||||
2 %s: malformed recovery fileX
|
||||
2 Buffer %s is emptyX
|
||||
2 Copying file for recovery...X
|
||||
2 InterruptedX
|
||||
2 Logging not being performed, undo not possibleX
|
||||
2 Modifications not recoverable if the session failsX
|
||||
2 No previous search patternX
|
||||
2 set: %s option isn't a booleanX
|
||||
3 %s: removeX
|
||||
3 File modified since last complete write; write or use ! to overrideX
|
||||
4 Usage: %sX
|
||||
=========================
|
1
contrib/nvi/catalog/english.owner
Normal file
1
contrib/nvi/catalog/english.owner
Normal file
@ -0,0 +1 @@
|
||||
Keith Bostic <bostic@cs.berkeley.edu>
|
317
contrib/nvi/catalog/french
Normal file
317
contrib/nvi/catalog/french
Normal file
@ -0,0 +1,317 @@
|
||||
VI_MESSAGE_CATALOG
|
||||
D‚passement de longueur de ligneX
|
||||
impossible de supprimer la ligne %luX
|
||||
impossible d'ajouter … la ligne %luX
|
||||
impossible d'ins‚rer devant la ligne %luX
|
||||
impossible de stocker la ligne %luX
|
||||
impossible d'obtenir la derniŠre ligneX
|
||||
Erreur : impossible de r‚cup‚rer la ligne %luX
|
||||
Fichier journalX
|
||||
Aucune connexion n'‚tant effectu‚e, impossible d'annulerX
|
||||
Aucune action … annulerX
|
||||
Aucune connexion n'‚tant effectu‚e, impossible d'annulerX
|
||||
Aucune connexion n'‚tant effectu‚e, reprise actualis‚e impossibleX
|
||||
Aucune action … refaireX
|
||||
%s/%d : Erreur d'‚criture de journalX
|
||||
L'entr‚e et la sortie Vi standards doivent ˆtre un terminalX
|
||||
Marque %s : non d‚finieX
|
||||
Marque %s : la ligne a ‚t‚ supprim‚eX
|
||||
Marque %s : la position du curseur n'existe plusX
|
||||
Erreur : X
|
||||
nouveau fichierX
|
||||
le nom a chang‚X
|
||||
modifi‚X
|
||||
non modifi‚X
|
||||
DEVERROUILLEX
|
||||
lecture seuleX
|
||||
ligne %lu de %lu [%ld%%]X
|
||||
fichier videX
|
||||
ligne %luX
|
||||
Ce fichier %s n'est pas un catalogue de messagesX
|
||||
Impossible de configurer option %s par d‚fautX
|
||||
Utilisation : %sX
|
||||
D‚finition : pas d'option %s : 'tout d‚finir' donne toutes les valeurs optionnellesX
|
||||
D‚finition : option [no]%s ne prend pas de valeurX
|
||||
D‚finition : l'option %s n'est pas bool‚enneX
|
||||
D‚finition : option %s : %sX
|
||||
D‚finition : option %s : %s : D‚passement de valeurX
|
||||
D‚finition : option %s : %s n'est pas un nombre valideX
|
||||
D‚finition : l'option %s n'est pas bool‚enneX
|
||||
Les colonnes de l'‚cran sont trop petites, inf‚rieures … %dX
|
||||
Les colonnes de l'‚cran sont trop grandes, sup‚rieures … %dX
|
||||
Les lignes de l'‚cran sont trop courtes, inf‚rieures … %dX
|
||||
Les lignes de l'‚cran sont trop longues, sup‚rieures … %dX
|
||||
L'option lisp n'est pas impl‚ment‚eX
|
||||
Les messages ne sont pas d‚sactiv‚s : %sX
|
||||
Les messages ne sont pas activ‚s : %sX
|
||||
|
||||
L'option de paragraphe doit ˆtre en groupe de deux caractŠresX
|
||||
L'option de section doit ˆtre en groupe de deux caractŠresX
|
||||
|
||||
|
||||
|
||||
Le tampon par d‚faut est videX
|
||||
Le tampon %s est videX
|
||||
Les fichiers dont le nom contient des caractŠres de saut de ligne sont irr‚cup‚rablesX
|
||||
Impossible de r‚cup‚rer les modifications si la session ‚choueX
|
||||
Copie en cours du fichier pour r‚cup‚ration...X
|
||||
La pr‚servation a ‚chou‚ : %sX
|
||||
Impossible de r‚cup‚rer les modifications si la session ‚choueX
|
||||
La sauvegarde du fichier a ‚chou‚ : %sX
|
||||
Copie en cours du fichier pour r‚cup‚ration...X
|
||||
Les renseignements sur l'identit‚ %u de l'utilisateur sont introuvablesX
|
||||
Impossible de verrouiller le fichier de r‚cup‚rationX
|
||||
D‚bordement de tampon du fichier de r‚cup‚rationX
|
||||
Fichier de r‚cup‚rationX
|
||||
%s : Fichier de r‚cup‚ration malform‚X
|
||||
%s : Fichier de r‚cup‚ration malform‚X
|
||||
Aucun fichier nomm‚ %s … r‚cup‚rer, que vous puissiez lireX
|
||||
Il existe des versions r‚cup‚rables ant‚rieures … ce fichierX
|
||||
Vous avez d'autres fichiers … r‚cup‚rerX
|
||||
pas d'envoi d'email : %sX
|
||||
Fichier vide, rien … rechercherX
|
||||
Fin de fichier atteinte sans trouver le motifX
|
||||
Pas de motif de recherche pr‚c‚dentX
|
||||
Motif introuvableX
|
||||
D‚but du fichier atteint sans trouver le motifX
|
||||
La recherche est revenue … son point de d‚partX
|
||||
Recherche en cours...X
|
||||
CaractŠre non-imprimable introuvableX
|
||||
Nom de commande inconnuX
|
||||
|
||||
%s : Commande non disponible en ex modeX
|
||||
Le compte ne peut ˆtre z‚roX
|
||||
%s : mauvaise sp‚cification de ligneX
|
||||
Erreur de tableau de syntaxe interne (%s: %s)X
|
||||
Utilisation : %sX
|
||||
%s : tampon temporaire non lib‚r‚X
|
||||
D‚calage de drapeau hors de la ligne 1X
|
||||
D‚calage de drapeau hors de la fin du fichierX
|
||||
@ avec plage, en cours d'ex‚cution quand le fichier/l'‚cran a chang‚X
|
||||
Commande Global/v en cours d'ex‚cution quand le fichier/l'‚cran a chang‚X
|
||||
La commande ex a ‚chou‚ : commandes en attente abandonn‚esX
|
||||
La commande ex a ‚chou‚ : les touches affect‚es sont abandonn‚esX
|
||||
La deuxiŠme adresse est plus petite que la premiŠreX
|
||||
Aucun nom de marque fourniX
|
||||
\\ pas suivi par / ou ?X
|
||||
R‚f‚rence … un num‚ro de ligne inf‚rieure … 0X
|
||||
La commande %s est inconnueX
|
||||
D‚passement de la valeur adresseX
|
||||
D‚passement n‚gatif de la valeur adresseX
|
||||
Combinaison d'adresse non valideX
|
||||
Adresse non valide : il n'y a que des lignes %lu dans le fichierX
|
||||
Adresse non valide : le fichier est videX
|
||||
La commande %s ne permet pas une adresse de 0X
|
||||
Pas d'abr‚viations … afficherX
|
||||
Les abr‚viations doivent finir par un caractŠre"motX
|
||||
Les abr‚viations ne peuvent pas contenir de tabulations ni d'espacesX
|
||||
Les abr‚viations ne peuvent pas contenir un m‚lange de caractŠres mot/non-mot, sauf … la finX
|
||||
"%s" n'est pas une abr‚viationX
|
||||
La commande Vi a ‚chou‚ : Les touches affect‚es ont ‚t‚ abandonn‚esX
|
||||
Plus de fichiers … ‚diterX
|
||||
Pas de fichiers pr‚c‚dents … ‚diterX
|
||||
Pas de fichiers pr‚c‚dents … rembobinerX
|
||||
Pas de liste de fichiers … afficherX
|
||||
Pas de commande pr‚c‚dente … remplacer"!"X
|
||||
Pas de nom de fichier … substituer … %%X
|
||||
Pas de nom de fichier … substituer … #X
|
||||
Erreur : execl : %sX
|
||||
Erreur E/S : %sX
|
||||
Fichier modifi‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser ! pour outrepasserX
|
||||
Impossible de trouver l'emplacement du r‚pertoire d'origineX
|
||||
Nouveau r‚pertoire en cours : %sX
|
||||
Pas de tampon de coupure … afficherX
|
||||
La commande %s ne peut pas ˆtre utilis‚e … l'int‚rieur d'une commande globale ou commande vX
|
||||
%s/%s : ‚chec de source : ni vous ni le super-utilisateur n'ˆtes les propri‚taires X
|
||||
%s/%s : ‚chec de source : vous n'ˆtes pas le propri‚taireX
|
||||
%s/%s : ‚chec de source : peut ˆtre ‚crit par un utilisateur autre que le propri‚taireX
|
||||
%s : ‚chec de source : ni vous ni le super-utilisateur n'ˆtes les propri‚tairesX
|
||||
%s : ‚chec de source : vous n'ˆtes pas le propri‚taireX
|
||||
%s : ‚chec de source : peut ˆtre ‚crit par un utilisateur autre que le propri‚taireX
|
||||
Pas de lignes suivantes … joindreX
|
||||
Pas d'entr‚es de mappage d'entr‚eX
|
||||
Pas d'entr‚es de mappage de commandesX
|
||||
Le caractŠre %s ne peut pas ˆtre remapp‚X
|
||||
"%s" n'est pas actuellement mapp‚X
|
||||
Les noms de marque ne doivent avoir qu'un caractŠreX
|
||||
%s existe, non enregistr‚; utiliser ! pour outrepasserX
|
||||
Nouveau fichier exrc : %sX
|
||||
La ligne de destination est … l'int‚rieur de la plage … d‚placerX
|
||||
La commande ouverte n‚cessite que l'option ouverte soit d‚finieX
|
||||
La commande ouverte n'est pas encore impl‚ment‚eX
|
||||
La pr‚servation de ce fichier est impossibleX
|
||||
Fichier pr‚serv‚X
|
||||
%s: ‚tendu dans trop de noms de fichiersX
|
||||
Vous ne pouvez lire que les fichiers standards et les canaux de transmission nomm‚sX
|
||||
%s: Interdiction de lecture non disponibleX
|
||||
Lecture en cours...X
|
||||
%s: %lu lignes, %lu caractŠresX
|
||||
Pas d'‚crans d'arriŠre-plan … afficherX
|
||||
La commande script n'est disponible qu'en mode viX
|
||||
Pas de commande … ex‚cuterX
|
||||
Option de largeur de d‚calage d‚finie sur 0X
|
||||
Compter d‚passementX
|
||||
Compter d‚passement n‚gatifX
|
||||
Expression standard sp‚cifi‚e; drapeau r superfluX
|
||||
Vous ne pouvez pas en mode vi, combiner les drapeaux #, l et p avec le drapeau cX
|
||||
Aucune correspondance trouv‚eX
|
||||
Aucune marque pr‚c‚dente entr‚eX
|
||||
Moins de %s entr‚es dans la pile de marques ; utilisez t[ags]X
|
||||
Pas de fichier %s vers lequel retourner dans la pile de marques ; utiliser : affichage t[ags]X
|
||||
Appuyez sur Entr‚e pour continuer :X
|
||||
%s : marque introuvableX
|
||||
%s : marque corrompue en %sX
|
||||
%s : le num‚ro de ligne de la marque d‚passe la fin du fichierX
|
||||
La pile de marques est videX
|
||||
%s : motif de recherche introuvableX
|
||||
%d fichiers suppl‚mentaires … ‚diterX
|
||||
Le tampon %s est vide
|
||||
Confirmer les changements ? [n]X
|
||||
InterrompuX
|
||||
Pas de tampon pr‚c‚dent … ex‚cuterX
|
||||
Pas d'expression standard pr‚c‚denteX
|
||||
La commande %s n‚cessite qu'un fichier ait d‚j… ‚t‚ lu en m‚moireX
|
||||
Utilisation : %sX
|
||||
La commande visuelle n‚cessite que l'option ouverte soit d‚finieX
|
||||
|
||||
Fichier videX
|
||||
Pas de recherche pr‚c‚dente F, f, T ou tX
|
||||
%s introuvableX
|
||||
Pas de fichier pr‚c‚dent … ‚diterX
|
||||
Le curseur n'est pas dans un nombreX
|
||||
Le nombre obtenu est trop grandX
|
||||
Le nombre obtenu est trop petitX
|
||||
Pas de correspondance de caractŠre sur cette ligneX
|
||||
CaractŠre correspondant introuvableX
|
||||
Pas de caractŠres … remplacerX
|
||||
Pas d'autre ‚cran vers lequel basculerX
|
||||
CaractŠres aprŠs la chaŒne de recherche, d‚calage de ligne et/ou commande zX
|
||||
Pas de motif de recherche pr‚c‚dentX
|
||||
La recherche est revenue … son point de d‚partX
|
||||
L'abr‚viation a d‚pass‚ la limite de l'expansion : caractŠres abandonn‚sX
|
||||
CaractŠre non valide ; guillemet pour saisirX
|
||||
D‚j… au d‚but de l'insertionX
|
||||
Plus de caractŠres … effacerX
|
||||
D‚placement hors de fin de fichierX
|
||||
D‚placement hors de fin de ligneX
|
||||
Aucun mouvement de curseur n'a ‚t‚ effectu‚X
|
||||
D‚j… au d‚but du fichierX
|
||||
D‚placement hors du d‚but du fichierX
|
||||
D‚j… dans la premiŠre colonneX
|
||||
Les tampons doivent ˆtre sp‚cifi‚s avant la commandeX
|
||||
D‚j… … la fin du fichierX
|
||||
D‚j… … la fin de la ligneX
|
||||
%s n'est pas une commande viX
|
||||
Utilisation : %sX
|
||||
Pas de caractŠres … supprimerX
|
||||
La commande Q n‚cessite une interface terminal exX
|
||||
Pas de commande … r‚p‚terX
|
||||
Le fichier est videX
|
||||
Vous ne pouvez pas utiliser %s comme commande de d‚placementX
|
||||
D‚j… en mode commandeX
|
||||
Le curseur n'est pas dans un motX
|
||||
|
||||
Valeur optionnelle de fenˆtre trop grande, maximum est %uX
|
||||
AjouterX
|
||||
ChangerX
|
||||
CommandeX
|
||||
Ins‚rerX
|
||||
RemplacerX
|
||||
D‚placement hors de la fin d'‚cranX
|
||||
D‚placement hors du d‚but d'‚cranX
|
||||
L'‚cran doit ˆtre sup‚rieur … %d lignes pour se fractionnerX
|
||||
Il n'y a pas d'‚cran d'arriŠre-planX
|
||||
Il n'y a pas d'‚cran d'arriŠre-plan qui ‚dite un fichier nomm‚ %sX
|
||||
Vous ne pouvez pas mettre … l'arriŠre-plan votre seul ‚cran affich‚X
|
||||
L'‚cran ne peut ˆtre r‚duit qu'… %d rangsX
|
||||
L'‚cran n'est pas auto-r‚ductibleX
|
||||
L'‚cran n'est pas auto-extensibleX
|
||||
|
||||
Vous ne pouvez pas mettre cet ‚cran en attenteX
|
||||
Interrompu : les touches affect‚es ont ‚t‚ abandonn‚esX
|
||||
vi : le tampon temporaire n' a pas ‚t‚ lib‚r‚X
|
||||
Ce terminal n'a pas de touche %sX
|
||||
Vous ne pouvez sp‚cifier qu'un seul tamponX
|
||||
Nombre sup‚rieur … %luX
|
||||
InterrompuX
|
||||
Impossible de cr‚er un fichier temporaireX
|
||||
Avertissement : %s n'est pas un fichier standardX
|
||||
%s d‚j… verrouill‚, session en lecture seuleX
|
||||
%s: supprimerX
|
||||
%s: fermerX
|
||||
%s: supprimerX
|
||||
%s: supprimerX
|
||||
Fichier en lecture seule, pas ‚crit, utiliser ! pour outrepasserX
|
||||
Fichier en lecture seule, pas ‚critX
|
||||
%s existe, pas ‚crit; utiliser ! pour outrepasserX
|
||||
%s existe, pas ‚critX
|
||||
Fichier partiel, pas ‚crit; utiliser ! pour outrepasserX
|
||||
Fichier partiel, pas ‚critX
|
||||
%s: fichier modifi‚ plus r‚cemment que cet exemplaire; utiliser ! pour outrepasserX
|
||||
%s: fichier modifi‚ plus r‚cemment que cet exemplaireX
|
||||
%s: interdiction d'‚criture non disponibleX
|
||||
Ecriture en cours...X
|
||||
%s: AVERTISSEMENT : FICHIER TRONQUEX
|
||||
PremiŠre marque de ce groupe d‚j… atteinteX
|
||||
%s: nouveau fichier : %lu lignes, %lu caractŠresX
|
||||
%s: %lu lignes, %lu caractŠresX
|
||||
%s ‚tendue … trop de noms de fichiersX
|
||||
%s: pas un fichier standardX
|
||||
%s: ne vous appartient pasX
|
||||
%s: accessible par un utilisateur autre que son propri‚taireX
|
||||
Fichier modif‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser ! pour outrepasser X
|
||||
Fichier modif‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser :edit! pour outrepasserX
|
||||
Fichier modif‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser ! pour outrepasserX
|
||||
Fichier temporaire ; quitter annulera les modificationsX
|
||||
Fichier en lecture seule ; les modifications ne sont pas ‚crites automatiquementX
|
||||
Journal red‚marr‚X
|
||||
confirmer ? [ynq]X
|
||||
Appuyez sur n'importe quelle touche pour continuer : X
|
||||
Appuyez sur n'importe quelle touche pour continuer [: pour entrer plus de commandes ex] : X
|
||||
Appuyez sur n'importe quelle touche pour continuer [q pour Quitter]: X
|
||||
Cette forme de %s n‚cessite l'interface de terminal exX
|
||||
Entr‚e de mode entr‚e ex.X
|
||||
La commande a ‚chou‚, aucun fichier n'a encore ‚t‚ lu.X
|
||||
cont?X
|
||||
Ev‚nement impr‚vu de caractŠreX
|
||||
Ev‚nement impr‚vu de fin-de-fichierX
|
||||
Pas de correspondances pour cette requˆteX
|
||||
Ev‚nement impr‚vu d'interruptionX
|
||||
Ev‚nement quitter impr‚vuX
|
||||
Ev‚nement impr‚vu de rafraŒchissementX
|
||||
La derniŠre marque de ce groupe a d‚j… ‚t‚ atteinteX
|
||||
La commande %s n‚cessite l'interface de terminal exX
|
||||
Cette forme de %s n'est pas reconnue quand l'option d'‚dition prot‚g‚e est activ‚eX
|
||||
Ev‚nement impr‚vu de chaŒneX
|
||||
Ev‚nement impr‚vu de d‚lai impartiX
|
||||
Ev‚nement d'‚criture impr‚vuX
|
||||
|
||||
Les expansions du shell ne sont pas reconnues quand l'option d'‚dition prot‚g‚e est activ‚eX
|
||||
La commande %s n'est pas reconnue quand l'option d'‚dition prot‚g‚e est activ‚eX
|
||||
D‚finition : l'option %s ne peut pas ˆtre d‚sactiv‚eX
|
||||
Affichage trop petit.X
|
||||
ajout‚X
|
||||
chang‚X
|
||||
supprim‚X
|
||||
jointX
|
||||
d‚plac‚X
|
||||
d‚cal‚X
|
||||
coup‚X
|
||||
ligneX
|
||||
lignesX
|
||||
Vi n'a pas ‚t‚ charg‚ avec un interpr‚tateur TclX
|
||||
Ficher modifi‚ depuis le dernier enregistrement.X
|
||||
L'expansion du shell a ‚chou‚X
|
||||
Pas d'option d'‚dition %s sp‚cifi‚eX
|
||||
Vi n'a pas ‚t‚ charg‚ avec un interpr‚tateur PerlX
|
||||
Pas de commande ex … ex‚cuterX
|
||||
Entrez <CR> pour ex‚cuter une commande, :q pour quitterX
|
||||
Utiliser "cscope help" pour obtenir de l'aideX
|
||||
Aucune connexion cscope n'est lanc‚eX
|
||||
%s : type de recherche inconnu : utiliser un des %sX
|
||||
%d : Il n'existe pas de telle session cscopeX
|
||||
D‚finition : l'option %s ne peut jamais ˆtre activ‚eX
|
||||
D‚finition : l'option %s ne peut jamais ˆtre d‚finie sur 0X
|
||||
%s: joints : %lu lignes, %lu caractŠresX
|
||||
‚v‚nement impr‚vu de redimensionnementX
|
||||
%d fichiers … ‚diterX
|
309
contrib/nvi/catalog/french.base
Normal file
309
contrib/nvi/catalog/french.base
Normal file
@ -0,0 +1,309 @@
|
||||
002 "D‚passement de longueur de ligne"
|
||||
003 "impossible de supprimer la ligne %lu"
|
||||
004 "impossible d'ajouter … la ligne %lu"
|
||||
005 "impossible d'ins‚rer devant la ligne %lu"
|
||||
006 "impossible de stocker la ligne %lu"
|
||||
007 "impossible d'obtenir la derniŠre ligne"
|
||||
008 "Erreur : impossible de r‚cup‚rer la ligne %lu"
|
||||
009 "Fichier journal"
|
||||
010 "Aucune connexion n'‚tant effectu‚e, impossible d'annuler"
|
||||
011 "Aucune action … annuler"
|
||||
012 "Aucune connexion n'‚tant effectu‚e, impossible d'annuler"
|
||||
013 "Aucune connexion n'‚tant effectu‚e, reprise actualis‚e impossible"
|
||||
014 "Aucune action … refaire"
|
||||
015 "%s/%d : Erreur d'‚criture de journal"
|
||||
016 "L'entr‚e et la sortie Vi standards doivent ˆtre un terminal"
|
||||
017 "Marque %s : non d‚finie"
|
||||
018 "Marque %s : la ligne a ‚t‚ supprim‚e"
|
||||
019 "Marque %s : la position du curseur n'existe plus"
|
||||
020 "Erreur : "
|
||||
021 "nouveau fichier"
|
||||
022 "le nom a chang‚"
|
||||
023 "modifi‚"
|
||||
024 "non modifi‚"
|
||||
025 "DEVERROUILLE"
|
||||
026 "lecture seule"
|
||||
027 "ligne %lu de %lu [%ld%%]"
|
||||
028 "fichier vide"
|
||||
029 "ligne %lu"
|
||||
030 "Ce fichier %s n'est pas un catalogue de messages"
|
||||
031 "Impossible de configurer option %s par d‚faut"
|
||||
032 "Utilisation : %s"
|
||||
033 "D‚finition : pas d'option %s : 'tout d‚finir' donne toutes les valeurs optionnelles"
|
||||
034 "D‚finition : option [no]%s ne prend pas de valeur"
|
||||
035 "D‚finition : l'option %s n'est pas bool‚enne"
|
||||
036 "D‚finition : option %s : %s"
|
||||
037 "D‚finition : option %s : %s : D‚passement de valeur"
|
||||
038 "D‚finition : option %s : %s n'est pas un nombre valide"
|
||||
039 "D‚finition : l'option %s n'est pas bool‚enne"
|
||||
040 "Les colonnes de l'‚cran sont trop petites, inf‚rieures … %d"
|
||||
041 "Les colonnes de l'‚cran sont trop grandes, sup‚rieures … %d"
|
||||
042 "Les lignes de l'‚cran sont trop courtes, inf‚rieures … %d"
|
||||
043 "Les lignes de l'‚cran sont trop longues, sup‚rieures … %d"
|
||||
044 "L'option lisp n'est pas impl‚ment‚e"
|
||||
045 "Les messages ne sont pas d‚sactiv‚s : %s"
|
||||
046 "Les messages ne sont pas activ‚s : %s"
|
||||
048 "L'option de paragraphe doit ˆtre en groupe de deux caractŠres"
|
||||
049 "L'option de section doit ˆtre en groupe de deux caractŠres"
|
||||
053 "Le tampon par d‚faut est vide"
|
||||
054 "Le tampon %s est vide"
|
||||
055 "Les fichiers dont le nom contient des caractŠres de saut de ligne sont irr‚cup‚rables"
|
||||
056 "Impossible de r‚cup‚rer les modifications si la session ‚choue"
|
||||
057 "Copie en cours du fichier pour r‚cup‚ration..."
|
||||
058 "La pr‚servation a ‚chou‚ : %s"
|
||||
059 "Impossible de r‚cup‚rer les modifications si la session ‚choue"
|
||||
060 "La sauvegarde du fichier a ‚chou‚ : %s"
|
||||
061 "Copie en cours du fichier pour r‚cup‚ration..."
|
||||
062 "Les renseignements sur l'identit‚ %u de l'utilisateur sont introuvables"
|
||||
063 "Impossible de verrouiller le fichier de r‚cup‚ration"
|
||||
064 "D‚bordement de tampon du fichier de r‚cup‚ration"
|
||||
065 "Fichier de r‚cup‚ration"
|
||||
066 "%s : Fichier de r‚cup‚ration malform‚"
|
||||
067 "%s : Fichier de r‚cup‚ration malform‚"
|
||||
068 "Aucun fichier nomm‚ %s … r‚cup‚rer, que vous puissiez lire"
|
||||
069 "Il existe des versions r‚cup‚rables ant‚rieures … ce fichier"
|
||||
070 "Vous avez d'autres fichiers … r‚cup‚rer"
|
||||
071 "pas d'envoi d'email : %s"
|
||||
072 "Fichier vide, rien … rechercher"
|
||||
073 "Fin de fichier atteinte sans trouver le motif"
|
||||
074 "Pas de motif de recherche pr‚c‚dent"
|
||||
075 "Motif introuvable"
|
||||
076 "D‚but du fichier atteint sans trouver le motif"
|
||||
077 "La recherche est revenue … son point de d‚part"
|
||||
078 "Recherche en cours..."
|
||||
079 "CaractŠre non-imprimable introuvable"
|
||||
080 "Nom de commande inconnu"
|
||||
082 "%s : Commande non disponible en ex mode"
|
||||
083 "Le compte ne peut ˆtre z‚ro"
|
||||
084 "%s : mauvaise sp‚cification de ligne"
|
||||
085 "Erreur de tableau de syntaxe interne (%s: %s)"
|
||||
086 "Utilisation : %s"
|
||||
087 "%s : tampon temporaire non lib‚r‚"
|
||||
088 "D‚calage de drapeau hors de la ligne 1"
|
||||
089 "D‚calage de drapeau hors de la fin du fichier"
|
||||
090 "@ avec plage, en cours d'ex‚cution quand le fichier/l'‚cran a chang‚"
|
||||
091 "Commande Global/v en cours d'ex‚cution quand le fichier/l'‚cran a chang‚"
|
||||
092 "La commande ex a ‚chou‚ : commandes en attente abandonn‚es"
|
||||
093 "La commande ex a ‚chou‚ : les touches affect‚es sont abandonn‚es"
|
||||
094 "La deuxiŠme adresse est plus petite que la premiŠre"
|
||||
095 "Aucun nom de marque fourni"
|
||||
096 "\\ pas suivi par / ou ?"
|
||||
097 "R‚f‚rence … un num‚ro de ligne inf‚rieure … 0"
|
||||
098 "La commande %s est inconnue"
|
||||
099 "D‚passement de la valeur adresse"
|
||||
100 "D‚passement n‚gatif de la valeur adresse"
|
||||
101 "Combinaison d'adresse non valide"
|
||||
102 "Adresse non valide : il n'y a que des lignes %lu dans le fichier"
|
||||
103 "Adresse non valide : le fichier est vide"
|
||||
104 "La commande %s ne permet pas une adresse de 0"
|
||||
105 "Pas d'abr‚viations … afficher"
|
||||
106 "Les abr‚viations doivent finir par un caractŠre"mot"
|
||||
107 "Les abr‚viations ne peuvent pas contenir de tabulations ni d'espaces"
|
||||
108 "Les abr‚viations ne peuvent pas contenir un m‚lange de caractŠres mot/non-mot, sauf … la fin"
|
||||
109 ""%s" n'est pas une abr‚viation"
|
||||
110 "La commande Vi a ‚chou‚ : Les touches affect‚es ont ‚t‚ abandonn‚es"
|
||||
111 "Plus de fichiers … ‚diter"
|
||||
112 "Pas de fichiers pr‚c‚dents … ‚diter"
|
||||
113 "Pas de fichiers pr‚c‚dents … rembobiner"
|
||||
114 "Pas de liste de fichiers … afficher"
|
||||
115 "Pas de commande pr‚c‚dente … remplacer"!""
|
||||
116 "Pas de nom de fichier … substituer … %%"
|
||||
117 "Pas de nom de fichier … substituer … #"
|
||||
118 "Erreur : execl : %s"
|
||||
119 "Erreur E/S : %s"
|
||||
120 "Fichier modifi‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser ! pour outrepasser"
|
||||
121 "Impossible de trouver l'emplacement du r‚pertoire d'origine"
|
||||
122 "Nouveau r‚pertoire en cours : %s"
|
||||
123 "Pas de tampon de coupure … afficher"
|
||||
124 "La commande %s ne peut pas ˆtre utilis‚e … l'int‚rieur d'une commande globale ou commande v"
|
||||
125 "%s/%s : ‚chec de source : ni vous ni le super-utilisateur n'ˆtes les propri‚taires "
|
||||
126 "%s/%s : ‚chec de source : vous n'ˆtes pas le propri‚taire"
|
||||
127 "%s/%s : ‚chec de source : peut ˆtre ‚crit par un utilisateur autre que le propri‚taire"
|
||||
128 "%s : ‚chec de source : ni vous ni le super-utilisateur n'ˆtes les propri‚taires"
|
||||
129 "%s : ‚chec de source : vous n'ˆtes pas le propri‚taire"
|
||||
130 "%s : ‚chec de source : peut ˆtre ‚crit par un utilisateur autre que le propri‚taire"
|
||||
131 "Pas de lignes suivantes … joindre"
|
||||
132 "Pas d'entr‚es de mappage d'entr‚e"
|
||||
133 "Pas d'entr‚es de mappage de commandes"
|
||||
134 "Le caractŠre %s ne peut pas ˆtre remapp‚"
|
||||
135 ""%s" n'est pas actuellement mapp‚"
|
||||
136 "Les noms de marque ne doivent avoir qu'un caractŠre"
|
||||
137 "%s existe, non enregistr‚; utiliser ! pour outrepasser"
|
||||
138 "Nouveau fichier exrc : %s"
|
||||
139 "La ligne de destination est … l'int‚rieur de la plage … d‚placer"
|
||||
140 "La commande ouverte n‚cessite que l'option ouverte soit d‚finie"
|
||||
141 "La commande ouverte n'est pas encore impl‚ment‚e"
|
||||
142 "La pr‚servation de ce fichier est impossible"
|
||||
143 "Fichier pr‚serv‚"
|
||||
144 "%s: ‚tendu dans trop de noms de fichiers"
|
||||
145 "Vous ne pouvez lire que les fichiers standards et les canaux de transmission nomm‚s"
|
||||
146 "%s: Interdiction de lecture non disponible"
|
||||
147 "Lecture en cours..."
|
||||
148 "%s: %lu lignes, %lu caractŠres"
|
||||
149 "Pas d'‚crans d'arriŠre-plan … afficher"
|
||||
150 "La commande script n'est disponible qu'en mode vi"
|
||||
151 "Pas de commande … ex‚cuter"
|
||||
152 "Option de largeur de d‚calage d‚finie sur 0"
|
||||
153 "Compter d‚passement"
|
||||
154 "Compter d‚passement n‚gatif"
|
||||
155 "Expression standard sp‚cifi‚e; drapeau r superflu"
|
||||
156 "Vous ne pouvez pas en mode vi, combiner les drapeaux #, l et p avec le drapeau c"
|
||||
157 "Aucune correspondance trouv‚e"
|
||||
158 "Aucune marque pr‚c‚dente entr‚e"
|
||||
159 "Moins de %s entr‚es dans la pile de marques ; utilisez t[ags]"
|
||||
160 "Pas de fichier %s vers lequel retourner dans la pile de marques ; utiliser : affichage t[ags]"
|
||||
161 "Appuyez sur Entr‚e pour continuer :"
|
||||
162 "%s : marque introuvable"
|
||||
163 "%s : marque corrompue en %s"
|
||||
164 "%s : le num‚ro de ligne de la marque d‚passe la fin du fichier"
|
||||
165 "La pile de marques est vide"
|
||||
166 "%s : motif de recherche introuvable"
|
||||
167 "%d fichiers suppl‚mentaires … ‚diter"
|
||||
168 "Le tampon %s est vide
|
||||
169 "Confirmer les changements ? [n]"
|
||||
170 "Interrompu"
|
||||
171 "Pas de tampon pr‚c‚dent … ex‚cuter"
|
||||
172 "Pas d'expression standard pr‚c‚dente"
|
||||
173 "La commande %s n‚cessite qu'un fichier ait d‚j… ‚t‚ lu en m‚moire"
|
||||
174 "Utilisation : %s"
|
||||
175 "La commande visuelle n‚cessite que l'option ouverte soit d‚finie"
|
||||
177 "Fichier vide"
|
||||
178 "Pas de recherche pr‚c‚dente F, f, T ou t"
|
||||
179 "%s introuvable"
|
||||
180 "Pas de fichier pr‚c‚dent … ‚diter"
|
||||
181 "Le curseur n'est pas dans un nombre"
|
||||
182 "Le nombre obtenu est trop grand"
|
||||
183 "Le nombre obtenu est trop petit"
|
||||
184 "Pas de correspondance de caractŠre sur cette ligne"
|
||||
185 "CaractŠre correspondant introuvable"
|
||||
186 "Pas de caractŠres … remplacer"
|
||||
187 "Pas d'autre ‚cran vers lequel basculer"
|
||||
188 "CaractŠres aprŠs la chaŒne de recherche, d‚calage de ligne et/ou commande z"
|
||||
189 "Pas de motif de recherche pr‚c‚dent"
|
||||
190 "La recherche est revenue … son point de d‚part"
|
||||
191 "L'abr‚viation a d‚pass‚ la limite de l'expansion : caractŠres abandonn‚s"
|
||||
192 "CaractŠre non valide ; guillemet pour saisir"
|
||||
193 "D‚j… au d‚but de l'insertion"
|
||||
194 "Plus de caractŠres … effacer"
|
||||
195 "D‚placement hors de fin de fichier"
|
||||
196 "D‚placement hors de fin de ligne"
|
||||
197 "Aucun mouvement de curseur n'a ‚t‚ effectu‚"
|
||||
198 "D‚j… au d‚but du fichier"
|
||||
199 "D‚placement hors du d‚but du fichier"
|
||||
200 "D‚j… dans la premiŠre colonne"
|
||||
201 "Les tampons doivent ˆtre sp‚cifi‚s avant la commande"
|
||||
202 "D‚j… … la fin du fichier"
|
||||
203 "D‚j… … la fin de la ligne"
|
||||
204 "%s n'est pas une commande vi"
|
||||
205 "Utilisation : %s"
|
||||
206 "Pas de caractŠres … supprimer"
|
||||
207 "La commande Q n‚cessite une interface terminal ex"
|
||||
208 "Pas de commande … r‚p‚ter"
|
||||
209 "Le fichier est vide"
|
||||
209 "Le fichier est vide"
|
||||
210 "Vous ne pouvez pas utiliser %s comme commande de d‚placement"
|
||||
211 "D‚j… en mode commande"
|
||||
212 "Le curseur n'est pas dans un mot"
|
||||
214 "Valeur optionnelle de fenˆtre trop grande, maximum est %u"
|
||||
215 "Ajouter"
|
||||
216 "Changer"
|
||||
217 "Commande"
|
||||
218 "Ins‚rer"
|
||||
219 "Remplacer"
|
||||
220 "D‚placement hors de la fin d'‚cran"
|
||||
221 "D‚placement hors du d‚but d'‚cran"
|
||||
222 "L'‚cran doit ˆtre sup‚rieur … %d lignes pour se fractionner"
|
||||
223 "Il n'y a pas d'‚cran d'arriŠre-plan"
|
||||
224 "Il n'y a pas d'‚cran d'arriŠre-plan qui ‚dite un fichier nomm‚ %s"
|
||||
225 "Vous ne pouvez pas mettre … l'arriŠre-plan votre seul ‚cran affich‚"
|
||||
226 "L'‚cran ne peut ˆtre r‚duit qu'… %d rangs"
|
||||
227 "L'‚cran n'est pas auto-r‚ductible"
|
||||
228 "L'‚cran n'est pas auto-extensible"
|
||||
230 "Vous ne pouvez pas mettre cet ‚cran en attente"
|
||||
231 "Interrompu : les touches affect‚es ont ‚t‚ abandonn‚es"
|
||||
232 "vi : le tampon temporaire n' a pas ‚t‚ lib‚r‚"
|
||||
233 "Ce terminal n'a pas de touche %s"
|
||||
234 "Vous ne pouvez sp‚cifier qu'un seul tampon"
|
||||
235 "Nombre sup‚rieur … %lu"
|
||||
236 "Interrompu"
|
||||
237 "Impossible de cr‚er un fichier temporaire"
|
||||
238 "Avertissement : %s n'est pas un fichier standard"
|
||||
239 "%s d‚j… verrouill‚, session en lecture seule"
|
||||
240 "%s: supprimer"
|
||||
241 "%s: fermer"
|
||||
242 "%s: supprimer"
|
||||
243 "%s: supprimer"
|
||||
244 "Fichier en lecture seule, pas ‚crit, utiliser ! pour outrepasser"
|
||||
245 "Fichier en lecture seule, pas ‚crit"
|
||||
246 "%s existe, pas ‚crit; utiliser ! pour outrepasser"
|
||||
247 "%s existe, pas ‚crit"
|
||||
248 "Fichier partiel, pas ‚crit; utiliser ! pour outrepasser"
|
||||
249 "Fichier partiel, pas ‚crit"
|
||||
250 "%s: fichier modifi‚ plus r‚cemment que cet exemplaire; utiliser ! pour outrepasser"
|
||||
251 "%s: fichier modifi‚ plus r‚cemment que cet exemplaire"
|
||||
252 "%s: interdiction d'‚criture non disponible"
|
||||
253 "Ecriture en cours..."
|
||||
254 "%s: AVERTISSEMENT : FICHIER TRONQUE"
|
||||
255 "PremiŠre marque de ce groupe d‚j… atteinte"
|
||||
256 "%s: nouveau fichier : %lu lignes, %lu caractŠres"
|
||||
257 "%s: %lu lignes, %lu caractŠres"
|
||||
258 "%s ‚tendue … trop de noms de fichiers"
|
||||
259 "%s: pas un fichier standard"
|
||||
260 "%s: ne vous appartient pas"
|
||||
261 "%s: accessible par un utilisateur autre que son propri‚taire"
|
||||
262 "Fichier modif‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser ! pour outrepasser "
|
||||
263 "Fichier modif‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser :edit! pour outrepasser"
|
||||
264 "Fichier modif‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser ! pour outrepasser"
|
||||
265 "Fichier temporaire ; quitter annulera les modifications"
|
||||
266 "Fichier en lecture seule ; les modifications ne sont pas ‚crites automatiquement"
|
||||
267 "Journal red‚marr‚"
|
||||
268 "confirmer ? [ynq]"
|
||||
269 "Appuyez sur n'importe quelle touche pour continuer : "
|
||||
270 "Appuyez sur n'importe quelle touche pour continuer [: pour entrer plus de commandes ex] : "
|
||||
271 "Appuyez sur n'importe quelle touche pour continuer [q pour Quitter]: "
|
||||
272 "Cette forme de %s n‚cessite l'interface de terminal ex"
|
||||
273 "Entr‚e de mode entr‚e ex."
|
||||
274 "La commande a ‚chou‚, aucun fichier n'a encore ‚t‚ lu."
|
||||
275 "cont?"
|
||||
276 "Ev‚nement impr‚vu de caractŠre"
|
||||
277 "Ev‚nement impr‚vu de fin-de-fichier"
|
||||
278 "Pas de correspondances pour cette requˆte"
|
||||
279 "Ev‚nement impr‚vu d'interruption"
|
||||
280 "Ev‚nement quitter impr‚vu"
|
||||
281 "Ev‚nement impr‚vu de rafraŒchissement"
|
||||
282 "La derniŠre marque de ce groupe a d‚j… ‚t‚ atteinte"
|
||||
283 "La commande %s n‚cessite l'interface de terminal ex"
|
||||
284 "Cette forme de %s n'est pas reconnue quand l'option d'‚dition prot‚g‚e est activ‚e"
|
||||
285 "Ev‚nement impr‚vu de chaŒne"
|
||||
286 "Ev‚nement impr‚vu de d‚lai imparti"
|
||||
287 "Ev‚nement d'‚criture impr‚vu"
|
||||
289 "Les expansions du shell ne sont pas reconnues quand l'option d'‚dition prot‚g‚e est activ‚e"
|
||||
290 "La commande %s n'est pas reconnue quand l'option d'‚dition prot‚g‚e est activ‚e"
|
||||
291 "D‚finition : l'option %s ne peut pas ˆtre d‚sactiv‚e"
|
||||
292 "Affichage trop petit."
|
||||
293 "ajout‚"
|
||||
294 "chang‚"
|
||||
295 "supprim‚"
|
||||
296 "joint"
|
||||
297 "d‚plac‚"
|
||||
298 "d‚cal‚"
|
||||
299 "coup‚"
|
||||
300 "ligne"
|
||||
301 "lignes"
|
||||
302 "Vi n'a pas ‚t‚ charg‚ avec un interpr‚tateur Tcl"
|
||||
303 "Ficher modifi‚ depuis le dernier enregistrement."
|
||||
304 "L'expansion du shell a ‚chou‚"
|
||||
304 "L'expansion du shell a ‚chou‚"
|
||||
305 "Pas d'option d'‚dition %s sp‚cifi‚e"
|
||||
306 "Vi n'a pas ‚t‚ charg‚ avec un interpr‚tateur Perl"
|
||||
307 "Pas de commande ex … ex‚cuter"
|
||||
308 "Entrez <CR> pour ex‚cuter une commande, :q pour quitter"
|
||||
309 "Utiliser "cscope help" pour obtenir de l'aide"
|
||||
310 "Aucune connexion cscope n'est lanc‚e"
|
||||
311 "%s : type de recherche inconnu : utiliser un des %s"
|
||||
312 "%d : Il n'existe pas de telle session cscope"
|
||||
313 "D‚finition : l'option %s ne peut jamais ˆtre activ‚e"
|
||||
314 "D‚finition : l'option %s ne peut jamais ˆtre d‚finie sur 0"
|
||||
315 "%s: joints : %lu lignes, %lu caractŠres"
|
||||
316 "‚v‚nement impr‚vu de redimensionnement"
|
||||
317 "%d fichiers … ‚diter"
|
34
contrib/nvi/catalog/french.check
Normal file
34
contrib/nvi/catalog/french.check
Normal file
@ -0,0 +1,34 @@
|
||||
Unused message id's (this is okay):
|
||||
001
|
||||
047
|
||||
050
|
||||
051
|
||||
052
|
||||
081
|
||||
176
|
||||
229
|
||||
288
|
||||
=========================
|
||||
MISSING ERROR MESSAGES (Please add!):
|
||||
=========================
|
||||
Extra error messages (just delete them):
|
||||
=========================
|
||||
MESSAGES WITH THE SAME MESSAGE ID's (FIX!):
|
||||
=========================
|
||||
Duplicate messages, both id and message (this is okay):
|
||||
2 209 "Le fichier est vide"
|
||||
2 304 "L'expansion du shell a ‚chou‚"
|
||||
=========================
|
||||
Duplicate messages, just message (this is okay):
|
||||
2 %s : Fichier de r‚cup‚ration malform‚X
|
||||
2 %s: %lu lignes, %lu caractŠresX
|
||||
2 Aucune connexion n'‚tant effectu‚e, impossible d'annulerX
|
||||
2 Copie en cours du fichier pour r‚cup‚ration...X
|
||||
2 D‚finition : l'option %s n'est pas bool‚enneX
|
||||
2 Impossible de r‚cup‚rer les modifications si la session ‚choueX
|
||||
2 InterrompuX
|
||||
2 La recherche est revenue … son point de d‚partX
|
||||
2 Pas de motif de recherche pr‚c‚dentX
|
||||
3 %s: supprimerX
|
||||
4 Utilisation : %sX
|
||||
=========================
|
317
contrib/nvi/catalog/german
Normal file
317
contrib/nvi/catalog/german
Normal file
@ -0,0 +1,317 @@
|
||||
VI_MESSAGE_CATALOG
|
||||
Zeilenlaengen UeberlaufX
|
||||
kann Zeile %lu nicht loeschenX
|
||||
kann an Zeile %lu nicht anfuegenX
|
||||
kann in Zeile %lu nicht einfuegenX
|
||||
kann Zeile %lu nicht speichernX
|
||||
kann letzte Zeile nicht lesenX
|
||||
Fehler: kann Zeile %lu nicht wiederherstellenX
|
||||
ProtokolldateiX
|
||||
Keine Protokollierung aktiv, rueckgaengig machen nicht moeglichX
|
||||
Keine Aenderungen rueckgaengig zu machenX
|
||||
Keine Protokollierung aktiv, rueckgaengig machen nicht moeglichX
|
||||
Keine Protokollierung aktiv, Wiederholung von Aenderungen nicht moeglichX
|
||||
Keine Aenderungen zu wiederholenX
|
||||
%s/%d: ProtokollschreibfehlerX
|
||||
Vi's Standardein- und ausgabe muss ein Terminal seinX
|
||||
Marke %s: nicht gesetztX
|
||||
Marke %s: die Zeile wurde geloeschtX
|
||||
Marke %s: Cursorposition existiert nicht mehrX
|
||||
Fehler: X
|
||||
neue DateiX
|
||||
Name geaendertX
|
||||
geaendertX
|
||||
nicht geaendertX
|
||||
NICHT GELOCKEDX
|
||||
nur zum LesenX
|
||||
Zeile %lu von %lu [%ld%%]X
|
||||
leere DateiX
|
||||
Zeile %luX
|
||||
Die Datei %s ist kein MeldungskatalogX
|
||||
Setzen der Voreinstellung fuer %s Option nicht moeglichX
|
||||
Benutzung: %sX
|
||||
set: keine %s Option: 'set all' zeigt alle Optionen mit Werten anX
|
||||
set: der [no]%s Option kann kein Wert zugewiesen werdenX
|
||||
set: %s ist keine boolsche OptionX
|
||||
set: %s Option: %sX
|
||||
set: %s Option: %s: Wert UeberlaufX
|
||||
set: %s Option: %s ist eine ungueltige ZahlX
|
||||
set: %s ist keine boolsche OptionX
|
||||
Anzeige hat zu wenig Spalten, weniger als %dX
|
||||
Anzeige hat zu viele Spalten, mehr als %dX
|
||||
Anzeige hat zu wenig Zeilen, weniger als %dX
|
||||
Anzeige hat zu viele Zeilen, mehr als %dX
|
||||
Die lisp Option ist nicht implementiertX
|
||||
Messages nicht abgeschalten: %sX
|
||||
Messages nicht eingeschalten: %sX
|
||||
|
||||
Die paragraph Option muss Gruppen zu zwei Zeichen enthaltenX
|
||||
Die section Option muss Gruppen zu zwei Zeichen enthaltenX
|
||||
|
||||
|
||||
|
||||
Der Standardpuffer ist leerX
|
||||
Puffer %s ist leerX
|
||||
Dateien mit newlines im Namen sind nicht wiederherstellbarX
|
||||
Aenderungen nicht wiederherstellbar falls die Editorsitzung schief gehtX
|
||||
kopiere Datei fuer Wiederherstellung ...X
|
||||
Rettungsmechanismus funktioniert nicht: %sX
|
||||
Aenderungen nicht wiederherstellbar falls die Editorsitzung schief gehtX
|
||||
Sicherung der Datei gescheitert: %sX
|
||||
kopiere Datei fuer Wiederherstellung ...X
|
||||
Informationen ueber den Benutzer mit id %u nicht gefundenX
|
||||
Wiederherstellungsdatei kann nicht gesperrt werdenX
|
||||
Puffer der Wiederherstellungsdatei uebergelaufenX
|
||||
WiederherstellungsdateiX
|
||||
%s: Wiederherstellungsdatei hat falsches FormatX
|
||||
%s: Wiederherstellungsdatei hat falsches FormatX
|
||||
Keine von Ihnen lesbaren Dateien mit Namen %s zum WiederherstellenX
|
||||
Es gibt aeltere Versionen dieser Datei von Ihnen zum WiederherstellenX
|
||||
Sie haben noch andere Dateien zum WiederherstellenX
|
||||
schicke keine email: %sX
|
||||
Datei leer; nichts zu suchenX
|
||||
Dateiende erreicht, ohne das Suchmuster zu findenX
|
||||
Kein altes SuchmusterX
|
||||
Suchmuster nicht gefundenX
|
||||
Dateianfang erreicht, ohne das Suchmuster zu findenX
|
||||
Suche umgeschlagenX
|
||||
suche ...X
|
||||
Keine nichtdruckbaren Zeichen gefundenX
|
||||
Unbekannter KommandonameX
|
||||
|
||||
%s: Kommando im ex Modus nicht verfuegbarX
|
||||
Count darf nicht Null seinX
|
||||
%s: falsche ZeilenangabeX
|
||||
Interner Syntaxtabellenfehler (%s: %s)X
|
||||
Benutzung: %sX
|
||||
%s: temporaerer Puffer nicht freigegebenX
|
||||
Flagoffset vor Zeile 1X
|
||||
Flagoffset hinter dem DateiendeX
|
||||
@ mit Bereich lief als Datei/Anzeige geaendert wurdeX
|
||||
globales oder v-Kommando lief als Datei/Anzeige geaendert wurdeX
|
||||
Ex Kommando misslungen: restliche Kommandoeingabe ignoriertX
|
||||
Ex Kommando misslungen: umdefinierte Tasten ungueltigX
|
||||
Die zweite Adresse ist kleiner als die ersteX
|
||||
Kein Markenname angegebenX
|
||||
\\ ohne folgenden / oder ?X
|
||||
Referenz auf eine negative ZeilennummerX
|
||||
Das Kommando %s ist unbekanntX
|
||||
Adresswert zu grossX
|
||||
Adresswert zu kleinX
|
||||
Ungueltige AdresskombinationX
|
||||
Ungueltige Adresse: nur %lu Zeilen in der DateiX
|
||||
Ungueltige Adresse: die Datei ist leerX
|
||||
Das Kommando %s erlaubt keine Adresse 0X
|
||||
Keine Abkuerzungen zum AnzeigenX
|
||||
Abkuerzungen muessen mit einem "Wort"-Zeichen endenX
|
||||
Abkuerzungen duerfen keine Tabulator- oder Leerzeichen enthaltenX
|
||||
In Abkuerzungen duerfen ausser am Ende Wort- und Nicht-Wort-Zeichen nicht gemischt werdenX
|
||||
"%s" ist keine AbkuerzungX
|
||||
Vi Kommando misslungen: umdefinierte Tasten ungueltigX
|
||||
Keine weiteren Dateien zu edierenX
|
||||
Keine vorhergehenden Dateien zu edierenX
|
||||
Keine vorhergehenden Dateien fuer rewindX
|
||||
Keine Dateiliste zum AnzeigenX
|
||||
Kein vorhergehendes Kommando um "!" zu ersetzenX
|
||||
Kein Dateiname fuer %%X
|
||||
Kein Dateiname fuer #X
|
||||
Fehler: execl: %sX
|
||||
I/O Fehler: %sX
|
||||
Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorierenX
|
||||
Kann Homedirectory nicht bestimmenX
|
||||
Neues aktuelles Directory: %sX
|
||||
Keine Puffer anzuzeigenX
|
||||
Das Kommando %s kann nicht als Teil eines global oder v Kommandos verwendet werdenX
|
||||
%s/%s: nicht gelesen: gehoehrt weder Ihnen noch rootX
|
||||
%s/%s: nicht gelesen: gehoehrt nicht IhnenX
|
||||
%s/%s: nicht gelesen: anderer Benutzer als Eigentuemer hat SchreibrechtX
|
||||
%s: nicht gelesen: gehoehrt weder Ihnen noch rootX
|
||||
%s: nicht gelesen: gehoehrt nicht IhnenX
|
||||
%s: nicht gelesen: anderer Benutzer als Eigentuemer hat SchreibrechtX
|
||||
Keine folgenden Zeilen zum VerbindenX
|
||||
Kein Eingabe-Map EintragX
|
||||
Kein Kommando-Map EintragX
|
||||
Das %s Zeichen kann nicht umgemappt werdenX
|
||||
"%s" ist momentan nicht gemapptX
|
||||
Markennamen muessen einzelne Buchstaben seinX
|
||||
%s existiert, nicht geschrieben; verwende ! zum UeberschreibenX
|
||||
Neue .exrc Datei: %s. X
|
||||
Zielzeile ist innerhalb des VerschiebebereichsX
|
||||
Das open Kommando verlangt, dass die open Option gesetzt istX
|
||||
Das open Kommando ist nocht nicht implementiertX
|
||||
Rettung dieser Datei nicht moeglichX
|
||||
Datei gerettetX
|
||||
%s wurde in zu viele Dateinamen expandiertX
|
||||
Nur regulaere Dateien und named pipes koennen gelesen werdenX
|
||||
%s: Lesesperrung war nicht moeglichX
|
||||
lese ...X
|
||||
%s: %lu Zeilen, %lu ZeichenX
|
||||
Keine Hintegrundanzeigen vorhandenX
|
||||
Das script Kommando ist nur im vi Modus verfuegbarX
|
||||
Kein Kommando auszufuehrenX
|
||||
shiftwidth Option auf 0 gesetztX
|
||||
Count ueberlaufX
|
||||
Count unterlaufX
|
||||
Regulaerer Ausdruck angegeben; r Flag bedeutungslosX
|
||||
Die #, l und p Flags koennen im vi Modus nicht mit dem c Flag kombiniert werdenX
|
||||
Keine Uebereinstimmung gefundenX
|
||||
Kein vorhergehender 'tag' angegebenX
|
||||
Weniger als %s Eintraege auf dem 'tag'-Stack; verwende :display t[ags]X
|
||||
Keine Datei namens %s auf dem 'tag'-Stack; verwende :display t[ags]X
|
||||
Druecke Enter um fortzufahren: X
|
||||
%s: 'tag' nicht gefundenX
|
||||
%s: kaputter 'tag' in %sX
|
||||
%s: die Zeilennummer des 'tag' ist hinter dem DateiendeX
|
||||
Der 'tag' Stack ist leerX
|
||||
%s: Suchmuster nicht gefundenX
|
||||
%d weitere Dateien zu edierenX
|
||||
Puffer %s ist leerX
|
||||
Bestaetige Aenderung [n]X
|
||||
Unterbrochen.X
|
||||
Kein vorhergehender Puffer zum AusfuehrenX
|
||||
Kein vorhergehender regulaerer AusdruckX
|
||||
Das Kommando %s verlangt, dass bereits eine Datei eingelesen wurdeX
|
||||
Benutzung: %sX
|
||||
Das visual Kommando verlangt dass die open Option gesetzt istX
|
||||
|
||||
Leere DateiX
|
||||
Keine vorhergehende F, f, T oder t SucheX
|
||||
%s nicht gefundenX
|
||||
Keine vorhergehende Datei zu edierenX
|
||||
Cursor nicht auf einer ZahlX
|
||||
Sich ergebende Zahl ist zu grossX
|
||||
Sich ergebende Zahl ist zu kleinX
|
||||
Kein korrespondierendes Zeichen in dieser ZeileX
|
||||
Korrespondierendes Zeichen nicht gefundenX
|
||||
Keine Zeichen zu ersetzenX
|
||||
Keine andere Anzeige zum HinschaltenX
|
||||
Zeichen nach Suchmuster, Zeilenoffset und/oder z KommandoX
|
||||
Kein altes SuchmusterX
|
||||
Suche zur urspruenglichen Position umgeschlagenX
|
||||
Abkuerzung ueberschreitet Expansionsgrenze: Zeichen weggelassenX
|
||||
Nicht erlaubtes Zeichen; maskiere zum EingebenX
|
||||
Bereits am Anfang der EingabeX
|
||||
Keine weiteren Zeichen zu loeschenX
|
||||
Bewegung hinter das DateiendeX
|
||||
Bewegung hinter das ZeilenendeX
|
||||
Keine Cursorbewegung gemachtX
|
||||
Bereits am DateianfangX
|
||||
Bewegung vor den DateianfangX
|
||||
Bereits in der ersten SpalteX
|
||||
Puffer sollen vor dem Kommando angegeben werdenX
|
||||
Bereits am DateiendeX
|
||||
Bereits am ZeilenendeX
|
||||
%s ist kein vi KommandoX
|
||||
Benutzung: %sX
|
||||
Keine Zeichen zu loeschenX
|
||||
Das Q Kommando benoetigt das ex Terminal InterfaceX
|
||||
Kein Kommando zu wiederholenX
|
||||
Die Datei ist leerX
|
||||
%s kann nicht als Bewegungskommando verwendet werdenX
|
||||
Bereits im Kommando-ModusX
|
||||
Cursor nicht auf einem WortX
|
||||
|
||||
Wert der Window Option ist zu gross, max ist %uX
|
||||
AnfuegenX
|
||||
AendernX
|
||||
KommandoX
|
||||
EinfuegenX
|
||||
ErsetzenX
|
||||
Bewegung hinter das AnzeigenendeX
|
||||
Bewegung vor den AnzeigenanfangX
|
||||
Anzeige muss zum Zerlegen groesser als %d seinX
|
||||
Keine Hintergrundanzeigen vorhandenX
|
||||
Es gibt keine Hintergrundanzeige die eine Datei namens %s ediertX
|
||||
Die einzige dargestellte Anzeige kann nicht in den Hintergrund gebracht werdenX
|
||||
Die Anzeige kann nur auf %d Zeilen verkleinert werdenX
|
||||
Die Anzeige kann nicht verkleinert werdenX
|
||||
Die Anzeige kann nicht vergroessert werdenX
|
||||
|
||||
Diese Anzeige kann nicht gestopped werdenX
|
||||
Unterbrochen: umdefinierte Tasten ungueltigX
|
||||
vi: temporaerer Puffer nicht freigegebenX
|
||||
Dieses Terminal hat keine %s TasteX
|
||||
es kann nur ein Puffer angegeben werdenX
|
||||
Zahl groesser als %luX
|
||||
UnterbrochenX
|
||||
Nicht moeglich temporaere Datei anzulegenX
|
||||
Warnung: %s ist keine regulaere DateiX
|
||||
%s ist bereits gesperrt, nur-lese EditorsitzungX
|
||||
%s: loeschenX
|
||||
%s: schliessenX
|
||||
%s: loeschenX
|
||||
%s: loeschenX
|
||||
Nur-lese Datei, nicht geschrieben; verwende ! zum UeberschreibenX
|
||||
Nur-lese Datei, nicht geschriebenX
|
||||
%s existiert, nicht geschrieben; verwende ! zum UeberschreibenX
|
||||
%s existiert, nicht geschriebenX
|
||||
Teil der Datei, nicht geschrieben; verwende ! zum UeberschreibenX
|
||||
Teil der Datei, nicht geschriebenX
|
||||
%s: Datei wurde spaeter als diese Kopie veraendert; verwende ! zum UeberschreibenX
|
||||
%s: Datei wurde spaeter als diese Kopie veraendertX
|
||||
%s: Schreibsperrung war nicht moeglichX
|
||||
schreibe ...X
|
||||
%s: WARNUNG: DATEI ABGESCHNITTENX
|
||||
Bereits am ersten 'tag' dieser GruppeX
|
||||
%s: neue Datei: %lu Zeilen, %lu ZeichenX
|
||||
%s: %lu Zeilen, %lu ZeichenX
|
||||
%s wurde in zu viele Dateinamen expandiertX
|
||||
%s: keine regulaere DateiX
|
||||
%s: gehoehrt nicht IhnenX
|
||||
%s: anderer Benutzer als Eigentuemer hat ZugriffX
|
||||
Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorierenX
|
||||
Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende :edit! zum ignorierenX
|
||||
Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorierenX
|
||||
Datei ist temporaer; beim Verlassen gehen die Aenderungen verlorenX
|
||||
Nur-lese Datei, Aenderungen werden nicht automatisch geschriebenX
|
||||
Portokollierung neu begonnenX
|
||||
bestaetigen [ynq]X
|
||||
Druecke beliebige Taste um fortzufahrenX
|
||||
Druecke beliebige Taste um fortzufahren [: um weitere Kommandos einzugeben]: X
|
||||
Druecke beliebige Taste um fortzufahren [q zum Verlassen]: X
|
||||
Diese Form von %s benoetigt das ex Terminal-InterfaceX
|
||||
Gehe in ex Eingabe-Modus.\nX
|
||||
Kommando schief gelaufen, noch keine Datei eingelesenX
|
||||
weiter?X
|
||||
unerwartetes Zeichen - EreignisX
|
||||
unerwartetes Dateiende - EreignisX
|
||||
Keine Position zum Anspringen gefundenX
|
||||
unerwartetes Unterbrechungs - EreignisX
|
||||
unerwartetes Verlassen - EreignisX
|
||||
unerwartetes Wiederherstellungs - EreignisX
|
||||
Bereits am letzten 'tag' dieser GruppeX
|
||||
Das %s Kommando benoetigt das ex Terminal-InterfaceX
|
||||
Diese Form von %s wird nicht unterstuetzt wenn die 'secure edit' - Option gesetzt istX
|
||||
unerwartetes Zeichenketten - EreignisX
|
||||
unerwartetes timeout - EreignisX
|
||||
unerwartetes Schreibe - EreignisX
|
||||
|
||||
Shell Expandierungen nicht unterstuetzt wenn die 'secure edit' - Option gesetzt istX
|
||||
Das %s Kommando wird nicht unterstuetzt wenn die 'secure edit' - Option gesetzt istX
|
||||
set: %s kann nicht ausgeschaltet werdenX
|
||||
Anzeige zu klein.X
|
||||
angefuegtX
|
||||
geaendertX
|
||||
geloeschtX
|
||||
verbundenX
|
||||
verschobenX
|
||||
geschobenX
|
||||
in Puffer geschriebenX
|
||||
ZeileX
|
||||
ZeilenX
|
||||
Vi wurde nicht mit dem Tcl Interpreter gelinktX
|
||||
Datei wurde seit dem letzten Schreiben veraendert.X
|
||||
Shell Expansion nicht geklapptX
|
||||
Es ist keine %s Edieroption angegebenX
|
||||
Vi wurde nicht mit einem Perl Interpreter geladenX
|
||||
Kein ex Kommando auszufuehrenX
|
||||
Druecke <CR> um ein Kommando auszufuehren, :q zum verlassenX
|
||||
Verwende "cscope help" fuer HilestellungX
|
||||
Keine cscope Verbindung aktivX
|
||||
%s: unbekannter Suchtyp: verwende einen aus %sX
|
||||
%d: keine solche cscope VerbindungX
|
||||
set: die %s Option kann nicht eingeschaltet werdenX
|
||||
set: die %s Option kann nicht auf 0 gesetzt werdenX
|
||||
%s: angefuegt: %lu Zeilen, %lu ZeichenX
|
||||
unerwartetes Groessenveraenderungs - EreignisX
|
||||
%d Dateien zu edierenX
|
307
contrib/nvi/catalog/german.base
Normal file
307
contrib/nvi/catalog/german.base
Normal file
@ -0,0 +1,307 @@
|
||||
002 "Zeilenlaengen Ueberlauf"
|
||||
003 "kann Zeile %lu nicht loeschen"
|
||||
004 "kann an Zeile %lu nicht anfuegen"
|
||||
005 "kann in Zeile %lu nicht einfuegen"
|
||||
006 "kann Zeile %lu nicht speichern"
|
||||
007 "kann letzte Zeile nicht lesen"
|
||||
008 "Fehler: kann Zeile %lu nicht wiederherstellen"
|
||||
009 "Protokolldatei"
|
||||
010 "Keine Protokollierung aktiv, rueckgaengig machen nicht moeglich"
|
||||
011 "Keine Aenderungen rueckgaengig zu machen"
|
||||
012 "Keine Protokollierung aktiv, rueckgaengig machen nicht moeglich"
|
||||
013 "Keine Protokollierung aktiv, Wiederholung von Aenderungen nicht moeglich"
|
||||
014 "Keine Aenderungen zu wiederholen"
|
||||
015 "%s/%d: Protokollschreibfehler"
|
||||
016 "Vi's Standardein- und ausgabe muss ein Terminal sein"
|
||||
017 "Marke %s: nicht gesetzt"
|
||||
018 "Marke %s: die Zeile wurde geloescht"
|
||||
019 "Marke %s: Cursorposition existiert nicht mehr"
|
||||
020 "Fehler: "
|
||||
021 "neue Datei"
|
||||
022 "Name geaendert"
|
||||
023 "geaendert"
|
||||
024 "nicht geaendert"
|
||||
025 "NICHT GELOCKED"
|
||||
026 "nur zum Lesen"
|
||||
027 "Zeile %lu von %lu [%ld%%]"
|
||||
028 "leere Datei"
|
||||
029 "Zeile %lu"
|
||||
030 "Die Datei %s ist kein Meldungskatalog"
|
||||
031 "Setzen der Voreinstellung fuer %s Option nicht moeglich"
|
||||
032 "Benutzung: %s"
|
||||
033 "set: keine %s Option: 'set all' zeigt alle Optionen mit Werten an"
|
||||
034 "set: der [no]%s Option kann kein Wert zugewiesen werden"
|
||||
035 "set: %s ist keine boolsche Option"
|
||||
036 "set: %s Option: %s"
|
||||
037 "set: %s Option: %s: Wert Ueberlauf"
|
||||
038 "set: %s Option: %s ist eine ungueltige Zahl"
|
||||
039 "set: %s ist keine boolsche Option"
|
||||
040 "Anzeige hat zu wenig Spalten, weniger als %d"
|
||||
041 "Anzeige hat zu viele Spalten, mehr als %d"
|
||||
042 "Anzeige hat zu wenig Zeilen, weniger als %d"
|
||||
043 "Anzeige hat zu viele Zeilen, mehr als %d"
|
||||
044 "Die lisp Option ist nicht implementiert"
|
||||
045 "Messages nicht abgeschalten: %s"
|
||||
046 "Messages nicht eingeschalten: %s"
|
||||
048 "Die paragraph Option muss Gruppen zu zwei Zeichen enthalten"
|
||||
049 "Die section Option muss Gruppen zu zwei Zeichen enthalten"
|
||||
053 "Der Standardpuffer ist leer"
|
||||
054 "Puffer %s ist leer"
|
||||
055 "Dateien mit newlines im Namen sind nicht wiederherstellbar"
|
||||
056 "Aenderungen nicht wiederherstellbar falls die Editorsitzung schief geht"
|
||||
057 "kopiere Datei fuer Wiederherstellung ..."
|
||||
058 "Rettungsmechanismus funktioniert nicht: %s"
|
||||
059 "Aenderungen nicht wiederherstellbar falls die Editorsitzung schief geht"
|
||||
060 "Sicherung der Datei gescheitert: %s"
|
||||
061 "kopiere Datei fuer Wiederherstellung ..."
|
||||
062 "Informationen ueber den Benutzer mit id %u nicht gefunden"
|
||||
063 "Wiederherstellungsdatei kann nicht gesperrt werden"
|
||||
064 "Puffer der Wiederherstellungsdatei uebergelaufen"
|
||||
065 "Wiederherstellungsdatei"
|
||||
066 "%s: Wiederherstellungsdatei hat falsches Format"
|
||||
067 "%s: Wiederherstellungsdatei hat falsches Format"
|
||||
068 "Keine von Ihnen lesbaren Dateien mit Namen %s zum Wiederherstellen"
|
||||
069 "Es gibt aeltere Versionen dieser Datei von Ihnen zum Wiederherstellen"
|
||||
070 "Sie haben noch andere Dateien zum Wiederherstellen"
|
||||
071 "schicke keine email: %s"
|
||||
072 "Datei leer; nichts zu suchen"
|
||||
073 "Dateiende erreicht, ohne das Suchmuster zu finden"
|
||||
074 "Kein altes Suchmuster"
|
||||
075 "Suchmuster nicht gefunden"
|
||||
076 "Dateianfang erreicht, ohne das Suchmuster zu finden"
|
||||
077 "Suche umgeschlagen"
|
||||
078 "suche ..."
|
||||
079 "Keine nichtdruckbaren Zeichen gefunden"
|
||||
080 "Unbekannter Kommandoname"
|
||||
082 "%s: Kommando im ex Modus nicht verfuegbar"
|
||||
083 "Count darf nicht Null sein"
|
||||
084 "%s: falsche Zeilenangabe"
|
||||
085 "Interner Syntaxtabellenfehler (%s: %s)"
|
||||
086 "Benutzung: %s"
|
||||
087 "%s: temporaerer Puffer nicht freigegeben"
|
||||
088 "Flagoffset vor Zeile 1"
|
||||
089 "Flagoffset hinter dem Dateiende"
|
||||
090 "@ mit Bereich lief als Datei/Anzeige geaendert wurde"
|
||||
091 "globales oder v-Kommando lief als Datei/Anzeige geaendert wurde"
|
||||
092 "Ex Kommando misslungen: restliche Kommandoeingabe ignoriert"
|
||||
093 "Ex Kommando misslungen: umdefinierte Tasten ungueltig"
|
||||
094 "Die zweite Adresse ist kleiner als die erste"
|
||||
095 "Kein Markenname angegeben"
|
||||
096 "\\ ohne folgenden / oder ?"
|
||||
097 "Referenz auf eine negative Zeilennummer"
|
||||
098 "Das Kommando %s ist unbekannt"
|
||||
099 "Adresswert zu gross"
|
||||
100 "Adresswert zu klein"
|
||||
101 "Ungueltige Adresskombination"
|
||||
102 "Ungueltige Adresse: nur %lu Zeilen in der Datei"
|
||||
103 "Ungueltige Adresse: die Datei ist leer"
|
||||
104 "Das Kommando %s erlaubt keine Adresse 0"
|
||||
105 "Keine Abkuerzungen zum Anzeigen"
|
||||
106 "Abkuerzungen muessen mit einem "Wort"-Zeichen enden"
|
||||
107 "Abkuerzungen duerfen keine Tabulator- oder Leerzeichen enthalten"
|
||||
108 "In Abkuerzungen duerfen ausser am Ende Wort- und Nicht-Wort-Zeichen nicht gemischt werden"
|
||||
109 ""%s" ist keine Abkuerzung"
|
||||
110 "Vi Kommando misslungen: umdefinierte Tasten ungueltig"
|
||||
111 "Keine weiteren Dateien zu edieren"
|
||||
112 "Keine vorhergehenden Dateien zu edieren"
|
||||
113 "Keine vorhergehenden Dateien fuer rewind"
|
||||
114 "Keine Dateiliste zum Anzeigen"
|
||||
115 "Kein vorhergehendes Kommando um "!" zu ersetzen"
|
||||
116 "Kein Dateiname fuer %%"
|
||||
117 "Kein Dateiname fuer #"
|
||||
118 "Fehler: execl: %s"
|
||||
119 "I/O Fehler: %s"
|
||||
120 "Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorieren"
|
||||
121 "Kann Homedirectory nicht bestimmen"
|
||||
122 "Neues aktuelles Directory: %s"
|
||||
123 "Keine Puffer anzuzeigen"
|
||||
124 "Das Kommando %s kann nicht als Teil eines global oder v Kommandos verwendet werden"
|
||||
125 "%s/%s: nicht gelesen: gehoehrt weder Ihnen noch root"
|
||||
126 "%s/%s: nicht gelesen: gehoehrt nicht Ihnen"
|
||||
127 "%s/%s: nicht gelesen: anderer Benutzer als Eigentuemer hat Schreibrecht"
|
||||
128 "%s: nicht gelesen: gehoehrt weder Ihnen noch root"
|
||||
129 "%s: nicht gelesen: gehoehrt nicht Ihnen"
|
||||
130 "%s: nicht gelesen: anderer Benutzer als Eigentuemer hat Schreibrecht"
|
||||
131 "Keine folgenden Zeilen zum Verbinden"
|
||||
132 "Kein Eingabe-Map Eintrag"
|
||||
133 "Kein Kommando-Map Eintrag"
|
||||
134 "Das %s Zeichen kann nicht umgemappt werden"
|
||||
135 ""%s" ist momentan nicht gemappt"
|
||||
136 "Markennamen muessen einzelne Buchstaben sein"
|
||||
137 "%s existiert, nicht geschrieben; verwende ! zum Ueberschreiben"
|
||||
138 "Neue .exrc Datei: %s. "
|
||||
139 "Zielzeile ist innerhalb des Verschiebebereichs"
|
||||
140 "Das open Kommando verlangt, dass die open Option gesetzt ist"
|
||||
141 "Das open Kommando ist nocht nicht implementiert"
|
||||
142 "Rettung dieser Datei nicht moeglich"
|
||||
143 "Datei gerettet"
|
||||
144 "%s wurde in zu viele Dateinamen expandiert"
|
||||
145 "Nur regulaere Dateien und named pipes koennen gelesen werden"
|
||||
146 "%s: Lesesperrung war nicht moeglich"
|
||||
147 "lese ..."
|
||||
148 "%s: %lu Zeilen, %lu Zeichen"
|
||||
149 "Keine Hintegrundanzeigen vorhanden"
|
||||
150 "Das script Kommando ist nur im vi Modus verfuegbar"
|
||||
151 "Kein Kommando auszufuehren"
|
||||
152 "shiftwidth Option auf 0 gesetzt"
|
||||
153 "Count ueberlauf"
|
||||
154 "Count unterlauf"
|
||||
155 "Regulaerer Ausdruck angegeben; r Flag bedeutungslos"
|
||||
156 "Die #, l und p Flags koennen im vi Modus nicht mit dem c Flag kombiniert werden"
|
||||
157 "Keine Uebereinstimmung gefunden"
|
||||
158 "Kein vorhergehender 'tag' angegeben"
|
||||
159 "Weniger als %s Eintraege auf dem 'tag'-Stack; verwende :display t[ags]"
|
||||
160 "Keine Datei namens %s auf dem 'tag'-Stack; verwende :display t[ags]"
|
||||
161 "Druecke Enter um fortzufahren: "
|
||||
162 "%s: 'tag' nicht gefunden"
|
||||
163 "%s: kaputter 'tag' in %s"
|
||||
164 "%s: die Zeilennummer des 'tag' ist hinter dem Dateiende"
|
||||
165 "Der 'tag' Stack ist leer"
|
||||
166 "%s: Suchmuster nicht gefunden"
|
||||
167 "%d weitere Dateien zu edieren"
|
||||
168 "Puffer %s ist leer"
|
||||
169 "Bestaetige Aenderung [n]"
|
||||
170 "Unterbrochen."
|
||||
171 "Kein vorhergehender Puffer zum Ausfuehren"
|
||||
172 "Kein vorhergehender regulaerer Ausdruck"
|
||||
173 "Das Kommando %s verlangt, dass bereits eine Datei eingelesen wurde"
|
||||
174 "Benutzung: %s"
|
||||
175 "Das visual Kommando verlangt dass die open Option gesetzt ist"
|
||||
177 "Leere Datei"
|
||||
178 "Keine vorhergehende F, f, T oder t Suche"
|
||||
179 "%s nicht gefunden"
|
||||
180 "Keine vorhergehende Datei zu edieren"
|
||||
181 "Cursor nicht auf einer Zahl"
|
||||
182 "Sich ergebende Zahl ist zu gross"
|
||||
183 "Sich ergebende Zahl ist zu klein"
|
||||
184 "Kein korrespondierendes Zeichen in dieser Zeile"
|
||||
185 "Korrespondierendes Zeichen nicht gefunden"
|
||||
186 "Keine Zeichen zu ersetzen"
|
||||
187 "Keine andere Anzeige zum Hinschalten"
|
||||
188 "Zeichen nach Suchmuster, Zeilenoffset und/oder z Kommando"
|
||||
189 "Kein altes Suchmuster"
|
||||
190 "Suche zur urspruenglichen Position umgeschlagen"
|
||||
191 "Abkuerzung ueberschreitet Expansionsgrenze: Zeichen weggelassen"
|
||||
192 "Nicht erlaubtes Zeichen; maskiere zum Eingeben"
|
||||
193 "Bereits am Anfang der Eingabe"
|
||||
194 "Keine weiteren Zeichen zu loeschen"
|
||||
195 "Bewegung hinter das Dateiende"
|
||||
196 "Bewegung hinter das Zeilenende"
|
||||
197 "Keine Cursorbewegung gemacht"
|
||||
198 "Bereits am Dateianfang"
|
||||
199 "Bewegung vor den Dateianfang"
|
||||
200 "Bereits in der ersten Spalte"
|
||||
201 "Puffer sollen vor dem Kommando angegeben werden"
|
||||
202 "Bereits am Dateiende"
|
||||
203 "Bereits am Zeilenende"
|
||||
204 "%s ist kein vi Kommando"
|
||||
205 "Benutzung: %s"
|
||||
206 "Keine Zeichen zu loeschen"
|
||||
207 "Das Q Kommando benoetigt das ex Terminal Interface"
|
||||
208 "Kein Kommando zu wiederholen"
|
||||
209 "Die Datei ist leer"
|
||||
210 "%s kann nicht als Bewegungskommando verwendet werden"
|
||||
211 "Bereits im Kommando-Modus"
|
||||
212 " Cursor nicht auf einem Wort"
|
||||
214 "Wert der Window Option ist zu gross, max ist %u"
|
||||
215 "Anfuegen"
|
||||
216 "Aendern"
|
||||
217 "Kommando"
|
||||
218 "Einfuegen"
|
||||
219 "Ersetzen"
|
||||
220 "Bewegung hinter das Anzeigenende"
|
||||
221 "Bewegung vor den Anzeigenanfang"
|
||||
222 "Anzeige muss zum Zerlegen groesser als %d sein"
|
||||
223 "Keine Hintergrundanzeigen vorhanden"
|
||||
224 "Es gibt keine Hintergrundanzeige die eine Datei namens %s ediert"
|
||||
225 "Die einzige dargestellte Anzeige kann nicht in den Hintergrund gebracht werden"
|
||||
226 "Die Anzeige kann nur auf %d Zeilen verkleinert werden"
|
||||
227 "Die Anzeige kann nicht verkleinert werden"
|
||||
228 "Die Anzeige kann nicht vergroessert werden"
|
||||
230 "Diese Anzeige kann nicht gestopped werden"
|
||||
231 "Unterbrochen: umdefinierte Tasten ungueltig"
|
||||
232 "vi: temporaerer Puffer nicht freigegeben"
|
||||
233 "Dieses Terminal hat keine %s Taste"
|
||||
234 "es kann nur ein Puffer angegeben werden"
|
||||
235 "Zahl groesser als %lu"
|
||||
236 "Unterbrochen"
|
||||
237 "Nicht moeglich temporaere Datei anzulegen"
|
||||
238 "Warnung: %s ist keine regulaere Datei"
|
||||
239 "%s ist bereits gesperrt, nur-lese Editorsitzung"
|
||||
240 "%s: loeschen"
|
||||
241 "%s: schliessen"
|
||||
242 "%s: loeschen"
|
||||
243 "%s: loeschen"
|
||||
244 "Nur-lese Datei, nicht geschrieben; verwende ! zum Ueberschreiben"
|
||||
245 "Nur-lese Datei, nicht geschrieben"
|
||||
246 "%s existiert, nicht geschrieben; verwende ! zum Ueberschreiben"
|
||||
247 "%s existiert, nicht geschrieben"
|
||||
248 "Teil der Datei, nicht geschrieben; verwende ! zum Ueberschreiben"
|
||||
249 "Teil der Datei, nicht geschrieben"
|
||||
250 "%s: Datei wurde spaeter als diese Kopie veraendert; verwende ! zum Ueberschreiben"
|
||||
251 "%s: Datei wurde spaeter als diese Kopie veraendert"
|
||||
252 "%s: Schreibsperrung war nicht moeglich"
|
||||
253 "schreibe ..."
|
||||
254 "%s: WARNUNG: DATEI ABGESCHNITTEN"
|
||||
255 "Bereits am ersten 'tag' dieser Gruppe"
|
||||
256 "%s: neue Datei: %lu Zeilen, %lu Zeichen"
|
||||
257 "%s: %lu Zeilen, %lu Zeichen"
|
||||
258 "%s wurde in zu viele Dateinamen expandiert"
|
||||
259 "%s: keine regulaere Datei"
|
||||
260 "%s: gehoehrt nicht Ihnen"
|
||||
261 "%s: anderer Benutzer als Eigentuemer hat Zugriff"
|
||||
262 "Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorieren"
|
||||
263 "Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende :edit! zum ignorieren"
|
||||
264 "Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorieren"
|
||||
265 "Datei ist temporaer; beim Verlassen gehen die Aenderungen verloren"
|
||||
266 "Nur-lese Datei, Aenderungen werden nicht automatisch geschrieben"
|
||||
267 "Portokollierung neu begonnen"
|
||||
268 "bestaetigen [ynq]"
|
||||
269 "Druecke beliebige Taste um fortzufahren"
|
||||
270 "Druecke beliebige Taste um fortzufahren [: um weitere Kommandos einzugeben]: "
|
||||
271 "Druecke beliebige Taste um fortzufahren [q zum Verlassen]: "
|
||||
272 "Diese Form von %s benoetigt das ex Terminal-Interface"
|
||||
273 "Gehe in ex Eingabe-Modus.\n"
|
||||
274 "Kommando schief gelaufen, noch keine Datei eingelesen"
|
||||
275 " weiter?"
|
||||
276 "unerwartetes Zeichen - Ereignis"
|
||||
277 "unerwartetes Dateiende - Ereignis"
|
||||
278 "Keine Position zum Anspringen gefunden"
|
||||
279 "unerwartetes Unterbrechungs - Ereignis"
|
||||
280 "unerwartetes Verlassen - Ereignis"
|
||||
281 "unerwartetes Wiederherstellungs - Ereignis"
|
||||
282 "Bereits am letzten 'tag' dieser Gruppe"
|
||||
283 "Das %s Kommando benoetigt das ex Terminal-Interface"
|
||||
284 "Diese Form von %s wird nicht unterstuetzt wenn die 'secure edit' - Option gesetzt ist"
|
||||
285 "unerwartetes Zeichenketten - Ereignis"
|
||||
286 "unerwartetes timeout - Ereignis"
|
||||
287 "unerwartetes Schreibe - Ereignis"
|
||||
289 "Shell Expandierungen nicht unterstuetzt wenn die 'secure edit' - Option gesetzt ist"
|
||||
290 "Das %s Kommando wird nicht unterstuetzt wenn die 'secure edit' - Option gesetzt ist"
|
||||
291 "set: %s kann nicht ausgeschaltet werden"
|
||||
292 "Anzeige zu klein."
|
||||
293 "angefuegt"
|
||||
294 "geaendert"
|
||||
295 "geloescht"
|
||||
296 "verbunden"
|
||||
297 "verschoben"
|
||||
298 "geschoben"
|
||||
299 "in Puffer geschrieben"
|
||||
300 "Zeile"
|
||||
301 "Zeilen"
|
||||
302 "Vi wurde nicht mit dem Tcl Interpreter gelinkt"
|
||||
303 "Datei wurde seit dem letzten Schreiben veraendert."
|
||||
304 "Shell Expansion nicht geklappt"
|
||||
305 "Es ist keine %s Edieroption angegeben"
|
||||
306 "Vi wurde nicht mit einem Perl Interpreter geladen"
|
||||
307 "Kein ex Kommando auszufuehren"
|
||||
308 "Druecke <CR> um ein Kommando auszufuehren, :q zum verlassen"
|
||||
309 "Verwende "cscope help" fuer Hilestellung"
|
||||
310 "Keine cscope Verbindung aktiv"
|
||||
311 "%s: unbekannter Suchtyp: verwende einen aus %s"
|
||||
312 "%d: keine solche cscope Verbindung"
|
||||
313 "set: die %s Option kann nicht eingeschaltet werden"
|
||||
314 "set: die %s Option kann nicht auf 0 gesetzt werden"
|
||||
315 "%s: angefuegt: %lu Zeilen, %lu Zeichen"
|
||||
316 "unerwartetes Groessenveraenderungs - Ereignis"
|
||||
317 "%d Dateien zu edieren"
|
36
contrib/nvi/catalog/german.check
Normal file
36
contrib/nvi/catalog/german.check
Normal file
@ -0,0 +1,36 @@
|
||||
Unused message id's (this is okay):
|
||||
001
|
||||
047
|
||||
050
|
||||
051
|
||||
052
|
||||
081
|
||||
176
|
||||
213
|
||||
229
|
||||
288
|
||||
=========================
|
||||
MISSING ERROR MESSAGES (Please add!):
|
||||
=========================
|
||||
Extra error messages (just delete them):
|
||||
=========================
|
||||
MESSAGES WITH THE SAME MESSAGE ID's (FIX!):
|
||||
=========================
|
||||
Duplicate messages, both id and message (this is okay):
|
||||
=========================
|
||||
Duplicate messages, just message (this is okay):
|
||||
2 %s existiert, nicht geschrieben; verwende ! zum UeberschreibenX
|
||||
2 %s wurde in zu viele Dateinamen expandiertX
|
||||
2 %s: %lu Zeilen, %lu ZeichenX
|
||||
2 %s: Wiederherstellungsdatei hat falsches FormatX
|
||||
2 Aenderungen nicht wiederherstellbar falls die Editorsitzung schief gehtX
|
||||
2 Kein altes SuchmusterX
|
||||
2 Keine Protokollierung aktiv, rueckgaengig machen nicht moeglichX
|
||||
2 Puffer %s ist leerX
|
||||
2 geaendertX
|
||||
2 kopiere Datei fuer Wiederherstellung ...X
|
||||
2 set: %s ist keine boolsche OptionX
|
||||
3 %s: loeschenX
|
||||
3 Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorierenX
|
||||
4 Benutzung: %sX
|
||||
=========================
|
1
contrib/nvi/catalog/german.owner
Normal file
1
contrib/nvi/catalog/german.owner
Normal file
@ -0,0 +1 @@
|
||||
Bernhard Daeubler <daeb@physik.uni-ulm.de>
|
267
contrib/nvi/catalog/ru_RU.KOI8-R
Normal file
267
contrib/nvi/catalog/ru_RU.KOI8-R
Normal file
@ -0,0 +1,267 @@
|
||||
VI_MESSAGE_CATALOG
|
||||
pEREPOLNENIE ZNA^ENIQ DLINY STROKIX
|
||||
%s/%d: NEWOZMOVNO UDALITX STROKU %uX
|
||||
%s/%d: NEWOZMOVNO DOBAWITX K STROKE %uX
|
||||
%s/%d: NEWOZMOVNO WSTAWITX W STROKU %uX
|
||||
%s/%d: NEWOZMOVNO SOHRANITX STROKU %uX
|
||||
%s/%d: NEWOZMOVNO DOSTATX POSLEDN@@ STROKUX
|
||||
|
||||
fAJL ZAPISEJX
|
||||
zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDUX
|
||||
nET IZMENENIJ DLQ OTMENYX
|
||||
zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDUX
|
||||
zAPISI NE WELISX, NEWOZMOVNO PROSMOTRETX WPEREDX
|
||||
nET IZMENENIJ DLQ PEREDELKIX
|
||||
%s/%d: O[IBKA PRI ZAPISI PROTOKOLAX
|
||||
sTANDARTNYJ WWOD/WYWOD DLQ VI DOLVEN BYTX TERMINALX
|
||||
oTMETKA %s: NE USTANOWLENAX
|
||||
oTMETKA %s: STROKA BYLA UDALENAX
|
||||
oTMETKA %s: POZICII KURSORA BOLX[E NE SU]ESTWUETX
|
||||
o[IBKA:X
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
fAJL %s NE QWLQETSQ KATALOGOM SOOB]ENIJX
|
||||
nEWOZMOVNO USTANOWITX OPCI@ %s PO UMOL^ANI@X
|
||||
iSPOLXZOWANIE: %sX
|
||||
oPCII %s NET: 'set all' POKAZYWAET WSE WOZMOVNYE OPCIIX
|
||||
set: [no]%s NE PRINIMAET TAKOGO ZNA^ENIQX
|
||||
set: %s OPCIQ NE QWLQETSQ DWOI^NOJX
|
||||
|
||||
|
||||
set: NEPRAWILXNOE ZNA^ENIE %sX
|
||||
set: %s OPCIQ NE QWLQETSQ DWOI^NOJX
|
||||
kOLI^ESTWO KOLONOK \KRANA SLI[KOM MALO, MENX[E ^EM %dX
|
||||
kOLI^ESTWO KOLONOK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %dX
|
||||
kOLI^ESTWO STROK \KRANA SLI[KOM MALO, MENX[E ^EM %dX
|
||||
kOLI^ESTWO STROK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %dX
|
||||
oPCIQ lisp OTSUTSTWUETX
|
||||
sOOB]ENIQ NE WYKL@^ENY: %sX
|
||||
sOOB]ENIQ NE WKL@^ENY: %sX
|
||||
oPCIQ modeline(s) NE MOVET BYTX PEREUSTANOWLENAX
|
||||
oPCIQ paragraph DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMIX
|
||||
oPCIQ section DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMIX
|
||||
oPCIQ shiftwidth NE MOVET BYTX USTANOWLENA NA 0X
|
||||
oPCIQ sourceany NE MOVET BYTX USTANOWLENAX
|
||||
tABULQCIQ NE MOVET BYTX USTANOWLENA NA 0X
|
||||
sTARTOWYJ BUFER PUSTX
|
||||
bUFER %s PUSTX
|
||||
fAJLY S SIMWOLAMI PEREWODA STROKI W IMENI NE MOGUT BYTX WOSSTANOWLENYX
|
||||
iZMENENIQ NE SOHRANENY PRI KRAHE SESSIIX
|
||||
|
||||
sOHRANENIE NE UDALOSX: %sX
|
||||
iZMENENIQ NE SOHRANQ@TSQ PRI OBRYWE SESSIIX
|
||||
sOHRANENIE KOPII FAJLA NE UDALOSX: %sX
|
||||
|
||||
iNFORMACII NA POLXZOWATELQ %u NE NAJDENOX
|
||||
nEWOZMOVNO ZA]ITITX SPASENNYJ FAJLX
|
||||
bUFER WOSSTANOWLENNOGO FAJLA PEREPOLNENX
|
||||
wOSSTANOWLENNYJ FAJLX
|
||||
%s: NE DO KONCA WOSSTANOWLENNYJ FAJLX
|
||||
%s: NE DO KONCA WOSSTANOWLENNYJ FAJLX
|
||||
fAJLOW S IMENEM %s, KOTORYE wY MOVETE ^ITATX, NE SU]ESTWUETX
|
||||
eSTX STARYE WERSII FAJLA, KOTORYE MOVNO WOSSTANOWITXX
|
||||
sU]ESTWU@T DRUGIE FAJLY, KOTORYE MOVNO WOSSTANOWITXX
|
||||
E-mail NE POSLAN: %sX
|
||||
fAJL PUST - ISKATX NE^EGOX
|
||||
dOSTIGNUT KONEC FAJLA BEZ NAHOVDENIQ OBRAZCA POISKAX
|
||||
nE ZADAN OBRAZEC POISKAX
|
||||
oBRAZEC POISKA NE NAJDENX
|
||||
dOSTUPNO NA^ALO FAJLA BEZ NAHOVDENIQ OBRAZCA POISKAX
|
||||
pOISK ZACIKLENX
|
||||
|
||||
nEPE^ATNYH SIMWOLOW NE NAJDENOX
|
||||
nEIZWESTNAQ KOMANDAX
|
||||
|
||||
kOMANDA NE DOSTUPNA W REVIME exX
|
||||
s^ET^IK NE MOVET BYTX NULEMX
|
||||
%s: NEPRAWILXNOE UKAZANIE STROKIX
|
||||
wNUTRENNQQ O[IBKA W SINTAKSISE (%s: %s)X
|
||||
iSPOLXZOWANIE: %sX
|
||||
%s: WREMENNYJ BUFER NE ISPOLXZOWANX
|
||||
mETKA POSTAWLENA PERED STROKOJ 1X
|
||||
mETKA POSTAWLENA POSLE KONCA FAJLAX
|
||||
|
||||
|
||||
kOMANDA ex NE UDALASX: PARAMETRY KOMANDY ZABYTYX
|
||||
|
||||
wTOROJ ADRES MENX[E ^EM PERWYJX
|
||||
nE UKAZANO NAZWANIE OTMETKIX
|
||||
\\ NE ZAWER[AETSQ / ILI ?X
|
||||
sSYLKA K STROKE S NOMEROM MENX[E 0X
|
||||
kOMANDA %s NEIZWESTNAX
|
||||
pEREPOLNENIE ZNA^ENIQ ADRESAX
|
||||
nEDOBOR ZNA^ENIQ ADRESAX
|
||||
nEDOPUSTIMAQ KOMBINACIQ W ADRESEX
|
||||
nEPRAWILXNYJ ADRES: WSEGO %lu STROK W FAJLEX
|
||||
nEPRAWILXNYJ ADRES: FAJL PUSTX
|
||||
kOMMANDA %s NE MOVET ISPOLXZOWATX ADRES 0X
|
||||
aBBREWIATURY OTSUTSTWU@TX
|
||||
aBBREWIATURY DOLVNY ZAKAN^IWATXSQ SIMWOLOM "word"X
|
||||
aBBREWIATURY NE MOGUT SODERVATX SIMWOLOY TABLQCII ILI PROBELYX
|
||||
aBBREWIATURY NE MOGUT SO^ETATXSQ S SIMWOLAMI SLOW/NE-SLOW, ZA ISKL@^ENIEM KONCA STROKIX
|
||||
"%s" NE QWLQETSQ ABBREWIATUROJX
|
||||
|
||||
fAJLOW DLQ REDAKTIROWANIQ BOLX[E NETX
|
||||
oTSUTSTWIE PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQX
|
||||
oTSUTSTWIE PREDYDU]EGO FAJLA DLQ PROSMOTRA NAZADX
|
||||
nET FAJLOWX
|
||||
oTSUTSTWIE PREDYDU]EJ KOMANDY DLQ ZAMENY "!"X
|
||||
oTSUTSTWIE ZAMENY DLQ %%X
|
||||
oTSUTSTWIE ZAMENY DLQ #X
|
||||
o[IBKA: execl: %sX
|
||||
o[IBKA WWODA/WYWODA: %sX
|
||||
fAJL IZMENEN S MOMENTA POSLEDNEJ POLNOJ ZAPISI: ISPOLXZUJTE ! DLQ OBHODAX
|
||||
nEWOZMOVNO NAJTI DOMA[NIJ KATALOGX
|
||||
nOWYJ KATALOG: %sX
|
||||
nET WYREZANYH BUFEROWX
|
||||
kOMANDA %s NE MOVET BYTX ISPOLXZOWANA WNUTRI OB]EJ KOMANDYX
|
||||
%s/%s: NE OTKRYT: NE PRINADLEVIT wAM ILI root-UX
|
||||
%s/%s: NE OTKRYT: NE PRINADLEVIT wAMX
|
||||
%s/%s: NE OTKRYT: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEMX
|
||||
%s/%s: NE S^ITAN: NE PRINADLEVIT wAM ILI root-UX
|
||||
%s/%s: NE S^ITAN: NE PRINADLEVIT wAMX
|
||||
%s/%s: NE S^ITAN: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEMX
|
||||
pOSLEDU@]IE STROKI OTSUTSTWU@TX
|
||||
oTSUTSTWIE PARAMETROW WWODAX
|
||||
oTSUTSTWIE PARAMETROW KOMANDYX
|
||||
sIMWOL %s NE MOVET BYTX PEREZAPOMNENX
|
||||
"%s" NA DANNYJ MOMENT NE OTME^ENX
|
||||
iMQ METKI DOLVNO BYTX ODNIM SIMWOLOMX
|
||||
%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODAX
|
||||
nOWYJ FAJL .exrc: %sX
|
||||
sTROKA PERENOSA NAHODITSQ WNUTRI PARAMETROW PERENOSAX
|
||||
kOMANDA open PODRAZUMEWAET USTANOWKU OPCII openX
|
||||
kOMANDA open NE REALIZOWANAX
|
||||
zA]ITA FAJLA NEWOZMOVNAX
|
||||
fAJL ZA]I]ENX
|
||||
%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOWX
|
||||
|
||||
%s: ZA]ITA NA ^TENIE BYLA NEDOSTUPNAX
|
||||
|
||||
%s: %lu STROK, %lu SIMWOLOWX
|
||||
nET TENEWYH OKONX
|
||||
kOMANDA script ISPOLXZUETSQ TOLXKO W REVIME viX
|
||||
nET KOMANDY DLQ ISPOLNENIQX
|
||||
oPCIQ shiftwidth USTANOWLENA NA 0X
|
||||
pEREPOLNENIE S^ET^IKAX
|
||||
cIKL WYPOLNEN NE DO KONCAX
|
||||
uKAZANO REGULQRNOE WYRAVENIE: FLAG r NE NUVENX
|
||||
fLAGI #, l I p NE MOGUT BYTX OB_EDINENY S FLAGOM c W REVIME viX
|
||||
sOWPADENIJ NETX
|
||||
mETKA OTSUTSTWUETX
|
||||
w STEKE METOK ZAPISEJ MENX[E, ^EM %s, ISPOLXZUJTE :display t[ags]X
|
||||
fAJLA S IMENEM %s W STEKE METOK NET; ISPOLXZUJTE :display t[ags]X
|
||||
|
||||
%s: METKA NE NAJDENAX
|
||||
%s: PLOHAQ METKA W %sX
|
||||
|
||||
sTEK METOK PUSTX
|
||||
%s: ISKOMAQ PEREMENNAQ NE NAJDENAX
|
||||
|
||||
bUFER %s PUSTX
|
||||
|
||||
pRERWANOX
|
||||
oTSUTSTWIE BUFERA DLQ ISPOLXZOWANIQX
|
||||
nET PREDIDU]EGO REGULQRNOGO WYRAVENIQX
|
||||
kOMANDA %s PODRAZUMEWAET NALI^IE PRO^TENNOGO FAJLAX
|
||||
iSPOLXZOWANIE: %sX
|
||||
kOMANDA visual PODRAZUMEWAET OBQZATELXNU@ USTANOWKU OPCII openX
|
||||
%s RAS[IRILSQ DO SLI[KOM BOLX[OGO KOLI^ESTWA FAJLOWX
|
||||
pUSTOJ FAJLX
|
||||
nET PREDYDU]EGO POISKA F, f, T, ILI tX
|
||||
%s NE NAJDENOX
|
||||
nET PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQX
|
||||
kURSOR STOIT NE NA CIFREX
|
||||
pOLU^ENNOE ^ISLO SLI[KOM WELIKOX
|
||||
pOLU^ENNOE ^ISLO SLI[KOM MALOX
|
||||
pODHODQ]EGO SIMWOLA NET NA \TOJ STROKEX
|
||||
pODHODQ]IJ SIMWOL NE NAJDENX
|
||||
nET SIMWOLOW DLQ UDALENIQX
|
||||
dRUGOGO \KRANA NE SU]ESTWUETX
|
||||
sIMWOLY POSLE STROKI DLQ POISKA I/ILI PEREBOR STROKIX
|
||||
pRO[LYJ OBRAZEC POISKA OTSUTSTWUETX
|
||||
pOISK ZAWER[ILSQ NA NA^ALXNOJ POZICIIX
|
||||
|
||||
sIMWOL NEPRAWILEN; ZAKL@^EN W KAWY^KI DLQ WWODAX
|
||||
uVE NA NA^ALE WSTAWKIX
|
||||
nET SIMWOLOW DLQ UDALENIQX
|
||||
pEREDWIVENIE ZA KONEC FAJLAX
|
||||
pEREDWIVENIE ZA KONEC STROKIX
|
||||
dWIVENIE STROKI NE SDELANOX
|
||||
uVE NA NA^ALE FAJLAX
|
||||
dWIVENIE KURSORA ZA NA^ALO FAJLAX
|
||||
uVE W PERWOJ KOLONKEX
|
||||
bUFERY DOLVNY BYTX UKAZANY DO WYPOLNENIQ KOMANDYX
|
||||
uVE NA KONCE FAJLAX
|
||||
uVE NA KONSE STROKIX
|
||||
%s NE QWLQETSQ KOMANDOJ VIX
|
||||
iSPOLXZOWANIE: %sX
|
||||
nET SIMWOLOW DLQ UDALENIQX
|
||||
|
||||
nET KOMANDY DLQ POWTORAX
|
||||
|
||||
kOMANDA %s NE MOVET BYTX ISPOLXZOWANA KAK KOMANDA PRODWIVENIQX
|
||||
~ISLO BOLX[E ^EM %luX
|
||||
|
||||
|
||||
zNA^ENIE KOLI^ESTWA OKON SLI[KOM WELIKO, MAKSIMALXNOE ZNA^ENIE = %uX
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dWIVENIE KURSORA ZA KONEC \KRANAX
|
||||
dWIVENIE KURSORA ZA NA^ALO \KRANAX
|
||||
|
||||
tENEWYH OKON NETX
|
||||
nE SU]ESTWUET TENEWOGO OKNA S REDAKTIROWANIEM FAJLA %sX
|
||||
wY NE MOVETE SDELATX EDINSTWENNOE OKNO TENEWYMX
|
||||
|KRAN MOVET BYTX SVATX
|
||||
|KRAN NE MOVET BYTX SVATX
|
||||
|KRAN NE MOVET BYTX RAS[IRENX
|
||||
|
||||
|
||||
|
||||
|
||||
dANNYJ TIP TERMINALA NE IMEET KLAWI[I %sX
|
||||
|
||||
|
||||
|
||||
nEWOZMOVNO SOZDATX WREMENNYJ FAJLX
|
||||
wNIMANIE: %s SPECIALXNYJ FAJLX
|
||||
%s UVE ZABLOKIROWAN, DOSTUPEN TOLXKO NA ^TENIEX
|
||||
%s: UDALENX
|
||||
%s: ZAKRYTX
|
||||
%s: UDALENX
|
||||
%s: UDALENX
|
||||
fAJL TOLXKO DLQ ^TENIQ, NE ZAPISAN: iSPOLXZUJTE ! DLQ OBHODAX
|
||||
fAJL TOLXKO DLQ ^TENIQ, NE ZAPISANX
|
||||
%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODAX
|
||||
%s SU]ESTWUET, NE ZAPISANX
|
||||
iSPOLXZUJTE ! DLQ ^ASTI^NOJ ZAPISI FAJLAX
|
||||
~ASTX FAJLA, FAJL NE ZAPISANX
|
||||
%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQ: ISPOLXZUJTE ! DLQ OBHODAX
|
||||
%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQX
|
||||
%s: ZA]ITA NA ZAPISX BYLA NEDOSTUPNAX
|
||||
|
||||
%s: wnimanie: fajl use~enX
|
||||
|
||||
%s: NOWYJ FAJL: %lu STROK, %lu SIMWOLOWX
|
||||
%s: %lu STROK, %lu SIMWOLOWX
|
||||
%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOWX
|
||||
%s SPECIALXNYJ FAJLX
|
||||
%s: NE PRINADLEVIT wAMX
|
||||
%s: DOSTUPEN NE TOLXKO wAMX
|
||||
fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODAX
|
||||
fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE :edit DLQ OBHODAX
|
||||
fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODAX
|
||||
fAJL WREMENNYJ: WYHOD SOTRET L@BYE IZMENENIQX
|
||||
|
||||
zAPISI NA^ATY ZANOWOX
|
219
contrib/nvi/catalog/ru_RU.KOI8-R.base
Normal file
219
contrib/nvi/catalog/ru_RU.KOI8-R.base
Normal file
@ -0,0 +1,219 @@
|
||||
002 "pEREPOLNENIE ZNA^ENIQ DLINY STROKI"
|
||||
003 "%s/%d: NEWOZMOVNO UDALITX STROKU %u"
|
||||
004 "%s/%d: NEWOZMOVNO DOBAWITX K STROKE %u"
|
||||
005 "%s/%d: NEWOZMOVNO WSTAWITX W STROKU %u"
|
||||
006 "%s/%d: NEWOZMOVNO SOHRANITX STROKU %u"
|
||||
007 "%s/%d: NEWOZMOVNO DOSTATX POSLEDN@@ STROKU"
|
||||
009 "fAJL ZAPISEJ"
|
||||
010 "zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDU"
|
||||
011 "nET IZMENENIJ DLQ OTMENY"
|
||||
012 "zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDU"
|
||||
013 "zAPISI NE WELISX, NEWOZMOVNO PROSMOTRETX WPERED"
|
||||
014 "nET IZMENENIJ DLQ PEREDELKI"
|
||||
015 "%s/%d: O[IBKA PRI ZAPISI PROTOKOLA"
|
||||
016 "sTANDARTNYJ WWOD/WYWOD DLQ VI DOLVEN BYTX TERMINAL"
|
||||
017 "oTMETKA %s: NE USTANOWLENA"
|
||||
018 "oTMETKA %s: STROKA BYLA UDALENA"
|
||||
019 "oTMETKA %s: POZICII KURSORA BOLX[E NE SU]ESTWUET"
|
||||
020 "o[IBKA:"
|
||||
030 "fAJL %s NE QWLQETSQ KATALOGOM SOOB]ENIJ"
|
||||
031 "nEWOZMOVNO USTANOWITX OPCI@ %s PO UMOL^ANI@"
|
||||
032 "iSPOLXZOWANIE: %s"
|
||||
033 "oPCII %s NET: 'set all' POKAZYWAET WSE WOZMOVNYE OPCII"
|
||||
034 "set: [no]%s NE PRINIMAET TAKOGO ZNA^ENIQ"
|
||||
035 "set: %s OPCIQ NE QWLQETSQ DWOI^NOJ"
|
||||
038 "set: NEPRAWILXNOE ZNA^ENIE %s"
|
||||
039 "set: %s OPCIQ NE QWLQETSQ DWOI^NOJ"
|
||||
040 "kOLI^ESTWO KOLONOK \KRANA SLI[KOM MALO, MENX[E ^EM %d"
|
||||
041 "kOLI^ESTWO KOLONOK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %d"
|
||||
042 "kOLI^ESTWO STROK \KRANA SLI[KOM MALO, MENX[E ^EM %d"
|
||||
043 "kOLI^ESTWO STROK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %d"
|
||||
044 "oPCIQ lisp OTSUTSTWUET"
|
||||
045 "sOOB]ENIQ NE WYKL@^ENY: %s"
|
||||
046 "sOOB]ENIQ NE WKL@^ENY: %s"
|
||||
047 "oPCIQ modeline(s) NE MOVET BYTX PEREUSTANOWLENA"
|
||||
048 "oPCIQ paragraph DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMI"
|
||||
049 "oPCIQ section DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMI"
|
||||
050 "oPCIQ shiftwidth NE MOVET BYTX USTANOWLENA NA 0"
|
||||
051 "oPCIQ sourceany NE MOVET BYTX USTANOWLENA"
|
||||
052 "tABULQCIQ NE MOVET BYTX USTANOWLENA NA 0"
|
||||
053 "sTARTOWYJ BUFER PUST"
|
||||
054 "bUFER %s PUST"
|
||||
055 "fAJLY S SIMWOLAMI PEREWODA STROKI W IMENI NE MOGUT BYTX WOSSTANOWLENY"
|
||||
056 "iZMENENIQ NE SOHRANENY PRI KRAHE SESSII"
|
||||
058 "sOHRANENIE NE UDALOSX: %s"
|
||||
059 "iZMENENIQ NE SOHRANQ@TSQ PRI OBRYWE SESSII"
|
||||
060 "sOHRANENIE KOPII FAJLA NE UDALOSX: %s"
|
||||
062 "iNFORMACII NA POLXZOWATELQ %u NE NAJDENO"
|
||||
063 "nEWOZMOVNO ZA]ITITX SPASENNYJ FAJL"
|
||||
064 "bUFER WOSSTANOWLENNOGO FAJLA PEREPOLNEN"
|
||||
065 "wOSSTANOWLENNYJ FAJL"
|
||||
066 "%s: NE DO KONCA WOSSTANOWLENNYJ FAJL"
|
||||
067 "%s: NE DO KONCA WOSSTANOWLENNYJ FAJL"
|
||||
068 "fAJLOW S IMENEM %s, KOTORYE wY MOVETE ^ITATX, NE SU]ESTWUET"
|
||||
069 "eSTX STARYE WERSII FAJLA, KOTORYE MOVNO WOSSTANOWITX"
|
||||
070 "sU]ESTWU@T DRUGIE FAJLY, KOTORYE MOVNO WOSSTANOWITX"
|
||||
071 "E-mail NE POSLAN: %s"
|
||||
072 "fAJL PUST - ISKATX NE^EGO"
|
||||
073 "dOSTIGNUT KONEC FAJLA BEZ NAHOVDENIQ OBRAZCA POISKA"
|
||||
074 "nE ZADAN OBRAZEC POISKA"
|
||||
075 "oBRAZEC POISKA NE NAJDEN"
|
||||
076 "dOSTUPNO NA^ALO FAJLA BEZ NAHOVDENIQ OBRAZCA POISKA"
|
||||
077 "pOISK ZACIKLEN"
|
||||
079 "nEPE^ATNYH SIMWOLOW NE NAJDENO"
|
||||
080 "nEIZWESTNAQ KOMANDA"
|
||||
082 "kOMANDA NE DOSTUPNA W REVIME ex"
|
||||
083 "s^ET^IK NE MOVET BYTX NULEM"
|
||||
084 "%s: NEPRAWILXNOE UKAZANIE STROKI"
|
||||
085 "wNUTRENNQQ O[IBKA W SINTAKSISE (%s: %s)"
|
||||
086 "iSPOLXZOWANIE: %s"
|
||||
087 "%s: WREMENNYJ BUFER NE ISPOLXZOWAN"
|
||||
088 "mETKA POSTAWLENA PERED STROKOJ 1"
|
||||
089 "mETKA POSTAWLENA POSLE KONCA FAJLA"
|
||||
092 "kOMANDA ex NE UDALASX: PARAMETRY KOMANDY ZABYTY"
|
||||
094 "wTOROJ ADRES MENX[E ^EM PERWYJ"
|
||||
095 "nE UKAZANO NAZWANIE OTMETKI"
|
||||
096 "\\ NE ZAWER[AETSQ / ILI ?"
|
||||
097 "sSYLKA K STROKE S NOMEROM MENX[E 0"
|
||||
098 "kOMANDA %s NEIZWESTNA"
|
||||
099 "pEREPOLNENIE ZNA^ENIQ ADRESA"
|
||||
100 "nEDOBOR ZNA^ENIQ ADRESA"
|
||||
101 "nEDOPUSTIMAQ KOMBINACIQ W ADRESE"
|
||||
102 "nEPRAWILXNYJ ADRES: WSEGO %lu STROK W FAJLE"
|
||||
103 "nEPRAWILXNYJ ADRES: FAJL PUST"
|
||||
104 "kOMMANDA %s NE MOVET ISPOLXZOWATX ADRES 0"
|
||||
105 "aBBREWIATURY OTSUTSTWU@T"
|
||||
106 "aBBREWIATURY DOLVNY ZAKAN^IWATXSQ SIMWOLOM "word""
|
||||
107 "aBBREWIATURY NE MOGUT SODERVATX SIMWOLOY TABLQCII ILI PROBELY"
|
||||
108 "aBBREWIATURY NE MOGUT SO^ETATXSQ S SIMWOLAMI SLOW/NE-SLOW, ZA ISKL@^ENIEM KONCA STROKI"
|
||||
109 ""%s" NE QWLQETSQ ABBREWIATUROJ"
|
||||
111 "fAJLOW DLQ REDAKTIROWANIQ BOLX[E NET"
|
||||
112 "oTSUTSTWIE PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQ"
|
||||
113 "oTSUTSTWIE PREDYDU]EGO FAJLA DLQ PROSMOTRA NAZAD"
|
||||
114 "nET FAJLOW"
|
||||
115 "oTSUTSTWIE PREDYDU]EJ KOMANDY DLQ ZAMENY "!""
|
||||
116 "oTSUTSTWIE ZAMENY DLQ %%"
|
||||
117 "oTSUTSTWIE ZAMENY DLQ #"
|
||||
118 "o[IBKA: execl: %s"
|
||||
119 "o[IBKA WWODA/WYWODA: %s"
|
||||
120 "fAJL IZMENEN S MOMENTA POSLEDNEJ POLNOJ ZAPISI: ISPOLXZUJTE ! DLQ OBHODA"
|
||||
121 "nEWOZMOVNO NAJTI DOMA[NIJ KATALOG"
|
||||
122 "nOWYJ KATALOG: %s"
|
||||
123 "nET WYREZANYH BUFEROW"
|
||||
124 "kOMANDA %s NE MOVET BYTX ISPOLXZOWANA WNUTRI OB]EJ KOMANDY"
|
||||
125 "%s/%s: NE OTKRYT: NE PRINADLEVIT wAM ILI root-U"
|
||||
126 "%s/%s: NE OTKRYT: NE PRINADLEVIT wAM"
|
||||
127 "%s/%s: NE OTKRYT: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEM"
|
||||
128 "%s/%s: NE S^ITAN: NE PRINADLEVIT wAM ILI root-U"
|
||||
129 "%s/%s: NE S^ITAN: NE PRINADLEVIT wAM"
|
||||
130 "%s/%s: NE S^ITAN: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEM"
|
||||
131 "pOSLEDU@]IE STROKI OTSUTSTWU@T"
|
||||
132 "oTSUTSTWIE PARAMETROW WWODA"
|
||||
133 "oTSUTSTWIE PARAMETROW KOMANDY"
|
||||
134 "sIMWOL %s NE MOVET BYTX PEREZAPOMNEN"
|
||||
135 ""%s" NA DANNYJ MOMENT NE OTME^EN"
|
||||
136 "iMQ METKI DOLVNO BYTX ODNIM SIMWOLOM"
|
||||
137 "%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODA"
|
||||
138 "nOWYJ FAJL .exrc: %s"
|
||||
139 "sTROKA PERENOSA NAHODITSQ WNUTRI PARAMETROW PERENOSA"
|
||||
140 "kOMANDA open PODRAZUMEWAET USTANOWKU OPCII open"
|
||||
141 "kOMANDA open NE REALIZOWANA"
|
||||
142 "zA]ITA FAJLA NEWOZMOVNA"
|
||||
143 "fAJL ZA]I]EN"
|
||||
144 "%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOW"
|
||||
146 "%s: ZA]ITA NA ^TENIE BYLA NEDOSTUPNA"
|
||||
148 "%s: %lu STROK, %lu SIMWOLOW"
|
||||
149 "nET TENEWYH OKON"
|
||||
150 "kOMANDA script ISPOLXZUETSQ TOLXKO W REVIME vi"
|
||||
151 "nET KOMANDY DLQ ISPOLNENIQ"
|
||||
152 "oPCIQ shiftwidth USTANOWLENA NA 0"
|
||||
153 "pEREPOLNENIE S^ET^IKA"
|
||||
154 "cIKL WYPOLNEN NE DO KONCA"
|
||||
155 "uKAZANO REGULQRNOE WYRAVENIE: FLAG r NE NUVEN"
|
||||
156 "fLAGI #, l I p NE MOGUT BYTX OB_EDINENY S FLAGOM c W REVIME vi"
|
||||
157 "sOWPADENIJ NET"
|
||||
158 "mETKA OTSUTSTWUET"
|
||||
159 "w STEKE METOK ZAPISEJ MENX[E, ^EM %s, ISPOLXZUJTE :display t[ags]"
|
||||
160 "fAJLA S IMENEM %s W STEKE METOK NET; ISPOLXZUJTE :display t[ags]"
|
||||
162 "%s: METKA NE NAJDENA"
|
||||
163 "%s: PLOHAQ METKA W %s"
|
||||
165 "sTEK METOK PUST"
|
||||
166 "%s: ISKOMAQ PEREMENNAQ NE NAJDENA"
|
||||
168 "bUFER %s PUST"
|
||||
170 "pRERWANO"
|
||||
171 "oTSUTSTWIE BUFERA DLQ ISPOLXZOWANIQ"
|
||||
172 "nET PREDIDU]EGO REGULQRNOGO WYRAVENIQ"
|
||||
173 "kOMANDA %s PODRAZUMEWAET NALI^IE PRO^TENNOGO FAJLA"
|
||||
174 "iSPOLXZOWANIE: %s"
|
||||
175 "kOMANDA visual PODRAZUMEWAET OBQZATELXNU@ USTANOWKU OPCII open"
|
||||
176 "%s RAS[IRILSQ DO SLI[KOM BOLX[OGO KOLI^ESTWA FAJLOW"
|
||||
177 "pUSTOJ FAJL"
|
||||
178 "nET PREDYDU]EGO POISKA F, f, T, ILI t"
|
||||
179 "%s NE NAJDENO"
|
||||
180 "nET PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQ"
|
||||
181 "kURSOR STOIT NE NA CIFRE"
|
||||
182 "pOLU^ENNOE ^ISLO SLI[KOM WELIKO"
|
||||
183 "pOLU^ENNOE ^ISLO SLI[KOM MALO"
|
||||
184 "pODHODQ]EGO SIMWOLA NET NA \TOJ STROKE"
|
||||
185 "pODHODQ]IJ SIMWOL NE NAJDEN"
|
||||
186 "nET SIMWOLOW DLQ UDALENIQ"
|
||||
187 "dRUGOGO \KRANA NE SU]ESTWUET"
|
||||
188 "sIMWOLY POSLE STROKI DLQ POISKA I/ILI PEREBOR STROKI"
|
||||
189 "pRO[LYJ OBRAZEC POISKA OTSUTSTWUET"
|
||||
190 "pOISK ZAWER[ILSQ NA NA^ALXNOJ POZICII"
|
||||
192 "sIMWOL NEPRAWILEN; ZAKL@^EN W KAWY^KI DLQ WWODA"
|
||||
193 "uVE NA NA^ALE WSTAWKI"
|
||||
194 "nET SIMWOLOW DLQ UDALENIQ"
|
||||
195 "pEREDWIVENIE ZA KONEC FAJLA"
|
||||
196 "pEREDWIVENIE ZA KONEC STROKI"
|
||||
197 "dWIVENIE STROKI NE SDELANO"
|
||||
198 "uVE NA NA^ALE FAJLA"
|
||||
199 "dWIVENIE KURSORA ZA NA^ALO FAJLA"
|
||||
200 "uVE W PERWOJ KOLONKE"
|
||||
201 "bUFERY DOLVNY BYTX UKAZANY DO WYPOLNENIQ KOMANDY"
|
||||
202 "uVE NA KONCE FAJLA"
|
||||
203 "uVE NA KONSE STROKI"
|
||||
204 "%s NE QWLQETSQ KOMANDOJ VI"
|
||||
205 "iSPOLXZOWANIE: %s"
|
||||
206 "nET SIMWOLOW DLQ UDALENIQ"
|
||||
208 "nET KOMANDY DLQ POWTORA"
|
||||
210 "kOMANDA %s NE MOVET BYTX ISPOLXZOWANA KAK KOMANDA PRODWIVENIQ"
|
||||
211 "~ISLO BOLX[E ^EM %lu"
|
||||
214 "zNA^ENIE KOLI^ESTWA OKON SLI[KOM WELIKO, MAKSIMALXNOE ZNA^ENIE = %u"
|
||||
220 "dWIVENIE KURSORA ZA KONEC \KRANA"
|
||||
221 "dWIVENIE KURSORA ZA NA^ALO \KRANA"
|
||||
223 "tENEWYH OKON NET"
|
||||
224 "nE SU]ESTWUET TENEWOGO OKNA S REDAKTIROWANIEM FAJLA %s"
|
||||
225 "wY NE MOVETE SDELATX EDINSTWENNOE OKNO TENEWYM"
|
||||
226 "|KRAN MOVET BYTX SVAT"
|
||||
227 "|KRAN NE MOVET BYTX SVAT"
|
||||
228 "|KRAN NE MOVET BYTX RAS[IREN"
|
||||
233 "dANNYJ TIP TERMINALA NE IMEET KLAWI[I %s"
|
||||
237 "nEWOZMOVNO SOZDATX WREMENNYJ FAJL"
|
||||
238 "wNIMANIE: %s SPECIALXNYJ FAJL"
|
||||
239 "%s UVE ZABLOKIROWAN, DOSTUPEN TOLXKO NA ^TENIE"
|
||||
240 "%s: UDALEN"
|
||||
241 "%s: ZAKRYT"
|
||||
242 "%s: UDALEN"
|
||||
243 "%s: UDALEN"
|
||||
244 "fAJL TOLXKO DLQ ^TENIQ, NE ZAPISAN: iSPOLXZUJTE ! DLQ OBHODA"
|
||||
245 "fAJL TOLXKO DLQ ^TENIQ, NE ZAPISAN"
|
||||
246 "%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODA"
|
||||
247 "%s SU]ESTWUET, NE ZAPISAN"
|
||||
248 "iSPOLXZUJTE ! DLQ ^ASTI^NOJ ZAPISI FAJLA"
|
||||
249 "~ASTX FAJLA, FAJL NE ZAPISAN"
|
||||
250 "%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQ: ISPOLXZUJTE ! DLQ OBHODA"
|
||||
251 "%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQ"
|
||||
252 "%s: ZA]ITA NA ZAPISX BYLA NEDOSTUPNA"
|
||||
254 "%s: wnimanie: fajl use~en"
|
||||
256 "%s: NOWYJ FAJL: %lu STROK, %lu SIMWOLOW"
|
||||
257 "%s: %lu STROK, %lu SIMWOLOW"
|
||||
258 "%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOW"
|
||||
259 "%s SPECIALXNYJ FAJL"
|
||||
260 "%s: NE PRINADLEVIT wAM"
|
||||
261 "%s: DOSTUPEN NE TOLXKO wAM"
|
||||
262 "fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODA"
|
||||
263 "fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE :edit DLQ OBHODA"
|
||||
264 "fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODA"
|
||||
265 "fAJL WREMENNYJ: WYHOD SOTRET L@BYE IZMENENIQ"
|
||||
267 "zAPISI NA^ATY ZANOWO"
|
169
contrib/nvi/catalog/ru_RU.KOI8-R.check
Normal file
169
contrib/nvi/catalog/ru_RU.KOI8-R.check
Normal file
@ -0,0 +1,169 @@
|
||||
Unused message id's (this is okay):
|
||||
001
|
||||
008
|
||||
021
|
||||
022
|
||||
023
|
||||
024
|
||||
025
|
||||
026
|
||||
027
|
||||
028
|
||||
029
|
||||
036
|
||||
037
|
||||
057
|
||||
061
|
||||
078
|
||||
081
|
||||
090
|
||||
091
|
||||
093
|
||||
110
|
||||
145
|
||||
147
|
||||
161
|
||||
164
|
||||
167
|
||||
169
|
||||
191
|
||||
207
|
||||
209
|
||||
212
|
||||
213
|
||||
215
|
||||
216
|
||||
217
|
||||
218
|
||||
219
|
||||
222
|
||||
229
|
||||
230
|
||||
231
|
||||
232
|
||||
234
|
||||
235
|
||||
236
|
||||
253
|
||||
255
|
||||
266
|
||||
=========================
|
||||
MISSING ERROR MESSAGES (Please add!):
|
||||
008
|
||||
021
|
||||
022
|
||||
023
|
||||
024
|
||||
025
|
||||
026
|
||||
027
|
||||
028
|
||||
029
|
||||
036
|
||||
037
|
||||
057
|
||||
061
|
||||
078
|
||||
090
|
||||
091
|
||||
093
|
||||
110
|
||||
145
|
||||
147
|
||||
161
|
||||
164
|
||||
167
|
||||
169
|
||||
191
|
||||
207
|
||||
209
|
||||
212
|
||||
215
|
||||
216
|
||||
217
|
||||
218
|
||||
219
|
||||
222
|
||||
230
|
||||
231
|
||||
232
|
||||
234
|
||||
235
|
||||
236
|
||||
253
|
||||
255
|
||||
266
|
||||
268
|
||||
269
|
||||
270
|
||||
271
|
||||
272
|
||||
273
|
||||
274
|
||||
275
|
||||
276
|
||||
277
|
||||
278
|
||||
279
|
||||
280
|
||||
281
|
||||
282
|
||||
283
|
||||
284
|
||||
285
|
||||
286
|
||||
287
|
||||
289
|
||||
290
|
||||
291
|
||||
292
|
||||
293
|
||||
294
|
||||
295
|
||||
296
|
||||
297
|
||||
298
|
||||
299
|
||||
300
|
||||
301
|
||||
302
|
||||
303
|
||||
304
|
||||
305
|
||||
306
|
||||
307
|
||||
308
|
||||
309
|
||||
310
|
||||
311
|
||||
312
|
||||
313
|
||||
314
|
||||
315
|
||||
316
|
||||
317
|
||||
=========================
|
||||
Extra error messages (just delete them):
|
||||
047
|
||||
050
|
||||
051
|
||||
052
|
||||
176
|
||||
=========================
|
||||
MESSAGES WITH THE SAME MESSAGE ID's (FIX!):
|
||||
=========================
|
||||
Duplicate messages, both id and message (this is okay):
|
||||
=========================
|
||||
Duplicate messages, just message (this is okay):
|
||||
2 %s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOWX
|
||||
2 %s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODAX
|
||||
2 %s: %lu STROK, %lu SIMWOLOWX
|
||||
2 %s: NE DO KONCA WOSSTANOWLENNYJ FAJLX
|
||||
2 bUFER %s PUSTX
|
||||
2 fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODAX
|
||||
2 set: %s OPCIQ NE QWLQETSQ DWOI^NOJX
|
||||
2 zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDUX
|
||||
3 %s: UDALENX
|
||||
3 nET SIMWOLOW DLQ UDALENIQX
|
||||
4 iSPOLXZOWANIE: %sX
|
||||
=========================
|
1
contrib/nvi/catalog/ru_RU.KOI8-R.owner
Normal file
1
contrib/nvi/catalog/ru_RU.KOI8-R.owner
Normal file
@ -0,0 +1 @@
|
||||
Dima Ruban <dima@demos.su>
|
267
contrib/nvi/catalog/ru_SU.KOI8-R
Normal file
267
contrib/nvi/catalog/ru_SU.KOI8-R
Normal file
@ -0,0 +1,267 @@
|
||||
VI_MESSAGE_CATALOG
|
||||
pEREPOLNENIE ZNA^ENIQ DLINY STROKIX
|
||||
%s/%d: NEWOZMOVNO UDALITX STROKU %uX
|
||||
%s/%d: NEWOZMOVNO DOBAWITX K STROKE %uX
|
||||
%s/%d: NEWOZMOVNO WSTAWITX W STROKU %uX
|
||||
%s/%d: NEWOZMOVNO SOHRANITX STROKU %uX
|
||||
%s/%d: NEWOZMOVNO DOSTATX POSLEDN@@ STROKUX
|
||||
|
||||
fAJL ZAPISEJX
|
||||
zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDUX
|
||||
nET IZMENENIJ DLQ OTMENYX
|
||||
zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDUX
|
||||
zAPISI NE WELISX, NEWOZMOVNO PROSMOTRETX WPEREDX
|
||||
nET IZMENENIJ DLQ PEREDELKIX
|
||||
%s/%d: O[IBKA PRI ZAPISI PROTOKOLAX
|
||||
sTANDARTNYJ WWOD/WYWOD DLQ VI DOLVEN BYTX TERMINALX
|
||||
oTMETKA %s: NE USTANOWLENAX
|
||||
oTMETKA %s: STROKA BYLA UDALENAX
|
||||
oTMETKA %s: POZICII KURSORA BOLX[E NE SU]ESTWUETX
|
||||
o[IBKA:X
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
fAJL %s NE QWLQETSQ KATALOGOM SOOB]ENIJX
|
||||
nEWOZMOVNO USTANOWITX OPCI@ %s PO UMOL^ANI@X
|
||||
iSPOLXZOWANIE: %sX
|
||||
oPCII %s NET: 'set all' POKAZYWAET WSE WOZMOVNYE OPCIIX
|
||||
set: [no]%s NE PRINIMAET TAKOGO ZNA^ENIQX
|
||||
set: %s OPCIQ NE QWLQETSQ DWOI^NOJX
|
||||
|
||||
|
||||
set: NEPRAWILXNOE ZNA^ENIE %sX
|
||||
set: %s OPCIQ NE QWLQETSQ DWOI^NOJX
|
||||
kOLI^ESTWO KOLONOK \KRANA SLI[KOM MALO, MENX[E ^EM %dX
|
||||
kOLI^ESTWO KOLONOK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %dX
|
||||
kOLI^ESTWO STROK \KRANA SLI[KOM MALO, MENX[E ^EM %dX
|
||||
kOLI^ESTWO STROK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %dX
|
||||
oPCIQ lisp OTSUTSTWUETX
|
||||
sOOB]ENIQ NE WYKL@^ENY: %sX
|
||||
sOOB]ENIQ NE WKL@^ENY: %sX
|
||||
oPCIQ modeline(s) NE MOVET BYTX PEREUSTANOWLENAX
|
||||
oPCIQ paragraph DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMIX
|
||||
oPCIQ section DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMIX
|
||||
oPCIQ shiftwidth NE MOVET BYTX USTANOWLENA NA 0X
|
||||
oPCIQ sourceany NE MOVET BYTX USTANOWLENAX
|
||||
tABULQCIQ NE MOVET BYTX USTANOWLENA NA 0X
|
||||
sTARTOWYJ BUFER PUSTX
|
||||
bUFER %s PUSTX
|
||||
fAJLY S SIMWOLAMI PEREWODA STROKI W IMENI NE MOGUT BYTX WOSSTANOWLENYX
|
||||
iZMENENIQ NE SOHRANENY PRI KRAHE SESSIIX
|
||||
|
||||
sOHRANENIE NE UDALOSX: %sX
|
||||
iZMENENIQ NE SOHRANQ@TSQ PRI OBRYWE SESSIIX
|
||||
sOHRANENIE KOPII FAJLA NE UDALOSX: %sX
|
||||
|
||||
iNFORMACII NA POLXZOWATELQ %u NE NAJDENOX
|
||||
nEWOZMOVNO ZA]ITITX SPASENNYJ FAJLX
|
||||
bUFER WOSSTANOWLENNOGO FAJLA PEREPOLNENX
|
||||
wOSSTANOWLENNYJ FAJLX
|
||||
%s: NE DO KONCA WOSSTANOWLENNYJ FAJLX
|
||||
%s: NE DO KONCA WOSSTANOWLENNYJ FAJLX
|
||||
fAJLOW S IMENEM %s, KOTORYE wY MOVETE ^ITATX, NE SU]ESTWUETX
|
||||
eSTX STARYE WERSII FAJLA, KOTORYE MOVNO WOSSTANOWITXX
|
||||
sU]ESTWU@T DRUGIE FAJLY, KOTORYE MOVNO WOSSTANOWITXX
|
||||
E-mail NE POSLAN: %sX
|
||||
fAJL PUST - ISKATX NE^EGOX
|
||||
dOSTIGNUT KONEC FAJLA BEZ NAHOVDENIQ OBRAZCA POISKAX
|
||||
nE ZADAN OBRAZEC POISKAX
|
||||
oBRAZEC POISKA NE NAJDENX
|
||||
dOSTUPNO NA^ALO FAJLA BEZ NAHOVDENIQ OBRAZCA POISKAX
|
||||
pOISK ZACIKLENX
|
||||
|
||||
nEPE^ATNYH SIMWOLOW NE NAJDENOX
|
||||
nEIZWESTNAQ KOMANDAX
|
||||
|
||||
kOMANDA NE DOSTUPNA W REVIME exX
|
||||
s^ET^IK NE MOVET BYTX NULEMX
|
||||
%s: NEPRAWILXNOE UKAZANIE STROKIX
|
||||
wNUTRENNQQ O[IBKA W SINTAKSISE (%s: %s)X
|
||||
iSPOLXZOWANIE: %sX
|
||||
%s: WREMENNYJ BUFER NE ISPOLXZOWANX
|
||||
mETKA POSTAWLENA PERED STROKOJ 1X
|
||||
mETKA POSTAWLENA POSLE KONCA FAJLAX
|
||||
|
||||
|
||||
kOMANDA ex NE UDALASX: PARAMETRY KOMANDY ZABYTYX
|
||||
|
||||
wTOROJ ADRES MENX[E ^EM PERWYJX
|
||||
nE UKAZANO NAZWANIE OTMETKIX
|
||||
\\ NE ZAWER[AETSQ / ILI ?X
|
||||
sSYLKA K STROKE S NOMEROM MENX[E 0X
|
||||
kOMANDA %s NEIZWESTNAX
|
||||
pEREPOLNENIE ZNA^ENIQ ADRESAX
|
||||
nEDOBOR ZNA^ENIQ ADRESAX
|
||||
nEDOPUSTIMAQ KOMBINACIQ W ADRESEX
|
||||
nEPRAWILXNYJ ADRES: WSEGO %lu STROK W FAJLEX
|
||||
nEPRAWILXNYJ ADRES: FAJL PUSTX
|
||||
kOMMANDA %s NE MOVET ISPOLXZOWATX ADRES 0X
|
||||
aBBREWIATURY OTSUTSTWU@TX
|
||||
aBBREWIATURY DOLVNY ZAKAN^IWATXSQ SIMWOLOM "word"X
|
||||
aBBREWIATURY NE MOGUT SODERVATX SIMWOLOY TABLQCII ILI PROBELYX
|
||||
aBBREWIATURY NE MOGUT SO^ETATXSQ S SIMWOLAMI SLOW/NE-SLOW, ZA ISKL@^ENIEM KONCA STROKIX
|
||||
"%s" NE QWLQETSQ ABBREWIATUROJX
|
||||
|
||||
fAJLOW DLQ REDAKTIROWANIQ BOLX[E NETX
|
||||
oTSUTSTWIE PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQX
|
||||
oTSUTSTWIE PREDYDU]EGO FAJLA DLQ PROSMOTRA NAZADX
|
||||
nET FAJLOWX
|
||||
oTSUTSTWIE PREDYDU]EJ KOMANDY DLQ ZAMENY "!"X
|
||||
oTSUTSTWIE ZAMENY DLQ %%X
|
||||
oTSUTSTWIE ZAMENY DLQ #X
|
||||
o[IBKA: execl: %sX
|
||||
o[IBKA WWODA/WYWODA: %sX
|
||||
fAJL IZMENEN S MOMENTA POSLEDNEJ POLNOJ ZAPISI: ISPOLXZUJTE ! DLQ OBHODAX
|
||||
nEWOZMOVNO NAJTI DOMA[NIJ KATALOGX
|
||||
nOWYJ KATALOG: %sX
|
||||
nET WYREZANYH BUFEROWX
|
||||
kOMANDA %s NE MOVET BYTX ISPOLXZOWANA WNUTRI OB]EJ KOMANDYX
|
||||
%s/%s: NE OTKRYT: NE PRINADLEVIT wAM ILI root-UX
|
||||
%s/%s: NE OTKRYT: NE PRINADLEVIT wAMX
|
||||
%s/%s: NE OTKRYT: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEMX
|
||||
%s/%s: NE S^ITAN: NE PRINADLEVIT wAM ILI root-UX
|
||||
%s/%s: NE S^ITAN: NE PRINADLEVIT wAMX
|
||||
%s/%s: NE S^ITAN: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEMX
|
||||
pOSLEDU@]IE STROKI OTSUTSTWU@TX
|
||||
oTSUTSTWIE PARAMETROW WWODAX
|
||||
oTSUTSTWIE PARAMETROW KOMANDYX
|
||||
sIMWOL %s NE MOVET BYTX PEREZAPOMNENX
|
||||
"%s" NA DANNYJ MOMENT NE OTME^ENX
|
||||
iMQ METKI DOLVNO BYTX ODNIM SIMWOLOMX
|
||||
%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODAX
|
||||
nOWYJ FAJL .exrc: %sX
|
||||
sTROKA PERENOSA NAHODITSQ WNUTRI PARAMETROW PERENOSAX
|
||||
kOMANDA open PODRAZUMEWAET USTANOWKU OPCII openX
|
||||
kOMANDA open NE REALIZOWANAX
|
||||
zA]ITA FAJLA NEWOZMOVNAX
|
||||
fAJL ZA]I]ENX
|
||||
%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOWX
|
||||
|
||||
%s: ZA]ITA NA ^TENIE BYLA NEDOSTUPNAX
|
||||
|
||||
%s: %lu STROK, %lu SIMWOLOWX
|
||||
nET TENEWYH OKONX
|
||||
kOMANDA script ISPOLXZUETSQ TOLXKO W REVIME viX
|
||||
nET KOMANDY DLQ ISPOLNENIQX
|
||||
oPCIQ shiftwidth USTANOWLENA NA 0X
|
||||
pEREPOLNENIE S^ET^IKAX
|
||||
cIKL WYPOLNEN NE DO KONCAX
|
||||
uKAZANO REGULQRNOE WYRAVENIE: FLAG r NE NUVENX
|
||||
fLAGI #, l I p NE MOGUT BYTX OB_EDINENY S FLAGOM c W REVIME viX
|
||||
sOWPADENIJ NETX
|
||||
mETKA OTSUTSTWUETX
|
||||
w STEKE METOK ZAPISEJ MENX[E, ^EM %s, ISPOLXZUJTE :display t[ags]X
|
||||
fAJLA S IMENEM %s W STEKE METOK NET; ISPOLXZUJTE :display t[ags]X
|
||||
|
||||
%s: METKA NE NAJDENAX
|
||||
%s: PLOHAQ METKA W %sX
|
||||
|
||||
sTEK METOK PUSTX
|
||||
%s: ISKOMAQ PEREMENNAQ NE NAJDENAX
|
||||
|
||||
bUFER %s PUSTX
|
||||
|
||||
pRERWANOX
|
||||
oTSUTSTWIE BUFERA DLQ ISPOLXZOWANIQX
|
||||
nET PREDIDU]EGO REGULQRNOGO WYRAVENIQX
|
||||
kOMANDA %s PODRAZUMEWAET NALI^IE PRO^TENNOGO FAJLAX
|
||||
iSPOLXZOWANIE: %sX
|
||||
kOMANDA visual PODRAZUMEWAET OBQZATELXNU@ USTANOWKU OPCII openX
|
||||
%s RAS[IRILSQ DO SLI[KOM BOLX[OGO KOLI^ESTWA FAJLOWX
|
||||
pUSTOJ FAJLX
|
||||
nET PREDYDU]EGO POISKA F, f, T, ILI tX
|
||||
%s NE NAJDENOX
|
||||
nET PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQX
|
||||
kURSOR STOIT NE NA CIFREX
|
||||
pOLU^ENNOE ^ISLO SLI[KOM WELIKOX
|
||||
pOLU^ENNOE ^ISLO SLI[KOM MALOX
|
||||
pODHODQ]EGO SIMWOLA NET NA \TOJ STROKEX
|
||||
pODHODQ]IJ SIMWOL NE NAJDENX
|
||||
nET SIMWOLOW DLQ UDALENIQX
|
||||
dRUGOGO \KRANA NE SU]ESTWUETX
|
||||
sIMWOLY POSLE STROKI DLQ POISKA I/ILI PEREBOR STROKIX
|
||||
pRO[LYJ OBRAZEC POISKA OTSUTSTWUETX
|
||||
pOISK ZAWER[ILSQ NA NA^ALXNOJ POZICIIX
|
||||
|
||||
sIMWOL NEPRAWILEN; ZAKL@^EN W KAWY^KI DLQ WWODAX
|
||||
uVE NA NA^ALE WSTAWKIX
|
||||
nET SIMWOLOW DLQ UDALENIQX
|
||||
pEREDWIVENIE ZA KONEC FAJLAX
|
||||
pEREDWIVENIE ZA KONEC STROKIX
|
||||
dWIVENIE STROKI NE SDELANOX
|
||||
uVE NA NA^ALE FAJLAX
|
||||
dWIVENIE KURSORA ZA NA^ALO FAJLAX
|
||||
uVE W PERWOJ KOLONKEX
|
||||
bUFERY DOLVNY BYTX UKAZANY DO WYPOLNENIQ KOMANDYX
|
||||
uVE NA KONCE FAJLAX
|
||||
uVE NA KONSE STROKIX
|
||||
%s NE QWLQETSQ KOMANDOJ VIX
|
||||
iSPOLXZOWANIE: %sX
|
||||
nET SIMWOLOW DLQ UDALENIQX
|
||||
|
||||
nET KOMANDY DLQ POWTORAX
|
||||
|
||||
kOMANDA %s NE MOVET BYTX ISPOLXZOWANA KAK KOMANDA PRODWIVENIQX
|
||||
~ISLO BOLX[E ^EM %luX
|
||||
|
||||
|
||||
zNA^ENIE KOLI^ESTWA OKON SLI[KOM WELIKO, MAKSIMALXNOE ZNA^ENIE = %uX
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dWIVENIE KURSORA ZA KONEC \KRANAX
|
||||
dWIVENIE KURSORA ZA NA^ALO \KRANAX
|
||||
|
||||
tENEWYH OKON NETX
|
||||
nE SU]ESTWUET TENEWOGO OKNA S REDAKTIROWANIEM FAJLA %sX
|
||||
wY NE MOVETE SDELATX EDINSTWENNOE OKNO TENEWYMX
|
||||
|KRAN MOVET BYTX SVATX
|
||||
|KRAN NE MOVET BYTX SVATX
|
||||
|KRAN NE MOVET BYTX RAS[IRENX
|
||||
|
||||
|
||||
|
||||
|
||||
dANNYJ TIP TERMINALA NE IMEET KLAWI[I %sX
|
||||
|
||||
|
||||
|
||||
nEWOZMOVNO SOZDATX WREMENNYJ FAJLX
|
||||
wNIMANIE: %s SPECIALXNYJ FAJLX
|
||||
%s UVE ZABLOKIROWAN, DOSTUPEN TOLXKO NA ^TENIEX
|
||||
%s: UDALENX
|
||||
%s: ZAKRYTX
|
||||
%s: UDALENX
|
||||
%s: UDALENX
|
||||
fAJL TOLXKO DLQ ^TENIQ, NE ZAPISAN: iSPOLXZUJTE ! DLQ OBHODAX
|
||||
fAJL TOLXKO DLQ ^TENIQ, NE ZAPISANX
|
||||
%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODAX
|
||||
%s SU]ESTWUET, NE ZAPISANX
|
||||
iSPOLXZUJTE ! DLQ ^ASTI^NOJ ZAPISI FAJLAX
|
||||
~ASTX FAJLA, FAJL NE ZAPISANX
|
||||
%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQ: ISPOLXZUJTE ! DLQ OBHODAX
|
||||
%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQX
|
||||
%s: ZA]ITA NA ZAPISX BYLA NEDOSTUPNAX
|
||||
|
||||
%s: wnimanie: fajl use~enX
|
||||
|
||||
%s: NOWYJ FAJL: %lu STROK, %lu SIMWOLOWX
|
||||
%s: %lu STROK, %lu SIMWOLOWX
|
||||
%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOWX
|
||||
%s SPECIALXNYJ FAJLX
|
||||
%s: NE PRINADLEVIT wAMX
|
||||
%s: DOSTUPEN NE TOLXKO wAMX
|
||||
fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODAX
|
||||
fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE :edit DLQ OBHODAX
|
||||
fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODAX
|
||||
fAJL WREMENNYJ: WYHOD SOTRET L@BYE IZMENENIQX
|
||||
|
||||
zAPISI NA^ATY ZANOWOX
|
219
contrib/nvi/catalog/ru_SU.KOI8-R.base
Normal file
219
contrib/nvi/catalog/ru_SU.KOI8-R.base
Normal file
@ -0,0 +1,219 @@
|
||||
002 "pEREPOLNENIE ZNA^ENIQ DLINY STROKI"
|
||||
003 "%s/%d: NEWOZMOVNO UDALITX STROKU %u"
|
||||
004 "%s/%d: NEWOZMOVNO DOBAWITX K STROKE %u"
|
||||
005 "%s/%d: NEWOZMOVNO WSTAWITX W STROKU %u"
|
||||
006 "%s/%d: NEWOZMOVNO SOHRANITX STROKU %u"
|
||||
007 "%s/%d: NEWOZMOVNO DOSTATX POSLEDN@@ STROKU"
|
||||
009 "fAJL ZAPISEJ"
|
||||
010 "zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDU"
|
||||
011 "nET IZMENENIJ DLQ OTMENY"
|
||||
012 "zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDU"
|
||||
013 "zAPISI NE WELISX, NEWOZMOVNO PROSMOTRETX WPERED"
|
||||
014 "nET IZMENENIJ DLQ PEREDELKI"
|
||||
015 "%s/%d: O[IBKA PRI ZAPISI PROTOKOLA"
|
||||
016 "sTANDARTNYJ WWOD/WYWOD DLQ VI DOLVEN BYTX TERMINAL"
|
||||
017 "oTMETKA %s: NE USTANOWLENA"
|
||||
018 "oTMETKA %s: STROKA BYLA UDALENA"
|
||||
019 "oTMETKA %s: POZICII KURSORA BOLX[E NE SU]ESTWUET"
|
||||
020 "o[IBKA:"
|
||||
030 "fAJL %s NE QWLQETSQ KATALOGOM SOOB]ENIJ"
|
||||
031 "nEWOZMOVNO USTANOWITX OPCI@ %s PO UMOL^ANI@"
|
||||
032 "iSPOLXZOWANIE: %s"
|
||||
033 "oPCII %s NET: 'set all' POKAZYWAET WSE WOZMOVNYE OPCII"
|
||||
034 "set: [no]%s NE PRINIMAET TAKOGO ZNA^ENIQ"
|
||||
035 "set: %s OPCIQ NE QWLQETSQ DWOI^NOJ"
|
||||
038 "set: NEPRAWILXNOE ZNA^ENIE %s"
|
||||
039 "set: %s OPCIQ NE QWLQETSQ DWOI^NOJ"
|
||||
040 "kOLI^ESTWO KOLONOK \KRANA SLI[KOM MALO, MENX[E ^EM %d"
|
||||
041 "kOLI^ESTWO KOLONOK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %d"
|
||||
042 "kOLI^ESTWO STROK \KRANA SLI[KOM MALO, MENX[E ^EM %d"
|
||||
043 "kOLI^ESTWO STROK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %d"
|
||||
044 "oPCIQ lisp OTSUTSTWUET"
|
||||
045 "sOOB]ENIQ NE WYKL@^ENY: %s"
|
||||
046 "sOOB]ENIQ NE WKL@^ENY: %s"
|
||||
047 "oPCIQ modeline(s) NE MOVET BYTX PEREUSTANOWLENA"
|
||||
048 "oPCIQ paragraph DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMI"
|
||||
049 "oPCIQ section DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMI"
|
||||
050 "oPCIQ shiftwidth NE MOVET BYTX USTANOWLENA NA 0"
|
||||
051 "oPCIQ sourceany NE MOVET BYTX USTANOWLENA"
|
||||
052 "tABULQCIQ NE MOVET BYTX USTANOWLENA NA 0"
|
||||
053 "sTARTOWYJ BUFER PUST"
|
||||
054 "bUFER %s PUST"
|
||||
055 "fAJLY S SIMWOLAMI PEREWODA STROKI W IMENI NE MOGUT BYTX WOSSTANOWLENY"
|
||||
056 "iZMENENIQ NE SOHRANENY PRI KRAHE SESSII"
|
||||
058 "sOHRANENIE NE UDALOSX: %s"
|
||||
059 "iZMENENIQ NE SOHRANQ@TSQ PRI OBRYWE SESSII"
|
||||
060 "sOHRANENIE KOPII FAJLA NE UDALOSX: %s"
|
||||
062 "iNFORMACII NA POLXZOWATELQ %u NE NAJDENO"
|
||||
063 "nEWOZMOVNO ZA]ITITX SPASENNYJ FAJL"
|
||||
064 "bUFER WOSSTANOWLENNOGO FAJLA PEREPOLNEN"
|
||||
065 "wOSSTANOWLENNYJ FAJL"
|
||||
066 "%s: NE DO KONCA WOSSTANOWLENNYJ FAJL"
|
||||
067 "%s: NE DO KONCA WOSSTANOWLENNYJ FAJL"
|
||||
068 "fAJLOW S IMENEM %s, KOTORYE wY MOVETE ^ITATX, NE SU]ESTWUET"
|
||||
069 "eSTX STARYE WERSII FAJLA, KOTORYE MOVNO WOSSTANOWITX"
|
||||
070 "sU]ESTWU@T DRUGIE FAJLY, KOTORYE MOVNO WOSSTANOWITX"
|
||||
071 "E-mail NE POSLAN: %s"
|
||||
072 "fAJL PUST - ISKATX NE^EGO"
|
||||
073 "dOSTIGNUT KONEC FAJLA BEZ NAHOVDENIQ OBRAZCA POISKA"
|
||||
074 "nE ZADAN OBRAZEC POISKA"
|
||||
075 "oBRAZEC POISKA NE NAJDEN"
|
||||
076 "dOSTUPNO NA^ALO FAJLA BEZ NAHOVDENIQ OBRAZCA POISKA"
|
||||
077 "pOISK ZACIKLEN"
|
||||
079 "nEPE^ATNYH SIMWOLOW NE NAJDENO"
|
||||
080 "nEIZWESTNAQ KOMANDA"
|
||||
082 "kOMANDA NE DOSTUPNA W REVIME ex"
|
||||
083 "s^ET^IK NE MOVET BYTX NULEM"
|
||||
084 "%s: NEPRAWILXNOE UKAZANIE STROKI"
|
||||
085 "wNUTRENNQQ O[IBKA W SINTAKSISE (%s: %s)"
|
||||
086 "iSPOLXZOWANIE: %s"
|
||||
087 "%s: WREMENNYJ BUFER NE ISPOLXZOWAN"
|
||||
088 "mETKA POSTAWLENA PERED STROKOJ 1"
|
||||
089 "mETKA POSTAWLENA POSLE KONCA FAJLA"
|
||||
092 "kOMANDA ex NE UDALASX: PARAMETRY KOMANDY ZABYTY"
|
||||
094 "wTOROJ ADRES MENX[E ^EM PERWYJ"
|
||||
095 "nE UKAZANO NAZWANIE OTMETKI"
|
||||
096 "\\ NE ZAWER[AETSQ / ILI ?"
|
||||
097 "sSYLKA K STROKE S NOMEROM MENX[E 0"
|
||||
098 "kOMANDA %s NEIZWESTNA"
|
||||
099 "pEREPOLNENIE ZNA^ENIQ ADRESA"
|
||||
100 "nEDOBOR ZNA^ENIQ ADRESA"
|
||||
101 "nEDOPUSTIMAQ KOMBINACIQ W ADRESE"
|
||||
102 "nEPRAWILXNYJ ADRES: WSEGO %lu STROK W FAJLE"
|
||||
103 "nEPRAWILXNYJ ADRES: FAJL PUST"
|
||||
104 "kOMMANDA %s NE MOVET ISPOLXZOWATX ADRES 0"
|
||||
105 "aBBREWIATURY OTSUTSTWU@T"
|
||||
106 "aBBREWIATURY DOLVNY ZAKAN^IWATXSQ SIMWOLOM "word""
|
||||
107 "aBBREWIATURY NE MOGUT SODERVATX SIMWOLOY TABLQCII ILI PROBELY"
|
||||
108 "aBBREWIATURY NE MOGUT SO^ETATXSQ S SIMWOLAMI SLOW/NE-SLOW, ZA ISKL@^ENIEM KONCA STROKI"
|
||||
109 ""%s" NE QWLQETSQ ABBREWIATUROJ"
|
||||
111 "fAJLOW DLQ REDAKTIROWANIQ BOLX[E NET"
|
||||
112 "oTSUTSTWIE PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQ"
|
||||
113 "oTSUTSTWIE PREDYDU]EGO FAJLA DLQ PROSMOTRA NAZAD"
|
||||
114 "nET FAJLOW"
|
||||
115 "oTSUTSTWIE PREDYDU]EJ KOMANDY DLQ ZAMENY "!""
|
||||
116 "oTSUTSTWIE ZAMENY DLQ %%"
|
||||
117 "oTSUTSTWIE ZAMENY DLQ #"
|
||||
118 "o[IBKA: execl: %s"
|
||||
119 "o[IBKA WWODA/WYWODA: %s"
|
||||
120 "fAJL IZMENEN S MOMENTA POSLEDNEJ POLNOJ ZAPISI: ISPOLXZUJTE ! DLQ OBHODA"
|
||||
121 "nEWOZMOVNO NAJTI DOMA[NIJ KATALOG"
|
||||
122 "nOWYJ KATALOG: %s"
|
||||
123 "nET WYREZANYH BUFEROW"
|
||||
124 "kOMANDA %s NE MOVET BYTX ISPOLXZOWANA WNUTRI OB]EJ KOMANDY"
|
||||
125 "%s/%s: NE OTKRYT: NE PRINADLEVIT wAM ILI root-U"
|
||||
126 "%s/%s: NE OTKRYT: NE PRINADLEVIT wAM"
|
||||
127 "%s/%s: NE OTKRYT: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEM"
|
||||
128 "%s/%s: NE S^ITAN: NE PRINADLEVIT wAM ILI root-U"
|
||||
129 "%s/%s: NE S^ITAN: NE PRINADLEVIT wAM"
|
||||
130 "%s/%s: NE S^ITAN: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEM"
|
||||
131 "pOSLEDU@]IE STROKI OTSUTSTWU@T"
|
||||
132 "oTSUTSTWIE PARAMETROW WWODA"
|
||||
133 "oTSUTSTWIE PARAMETROW KOMANDY"
|
||||
134 "sIMWOL %s NE MOVET BYTX PEREZAPOMNEN"
|
||||
135 ""%s" NA DANNYJ MOMENT NE OTME^EN"
|
||||
136 "iMQ METKI DOLVNO BYTX ODNIM SIMWOLOM"
|
||||
137 "%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODA"
|
||||
138 "nOWYJ FAJL .exrc: %s"
|
||||
139 "sTROKA PERENOSA NAHODITSQ WNUTRI PARAMETROW PERENOSA"
|
||||
140 "kOMANDA open PODRAZUMEWAET USTANOWKU OPCII open"
|
||||
141 "kOMANDA open NE REALIZOWANA"
|
||||
142 "zA]ITA FAJLA NEWOZMOVNA"
|
||||
143 "fAJL ZA]I]EN"
|
||||
144 "%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOW"
|
||||
146 "%s: ZA]ITA NA ^TENIE BYLA NEDOSTUPNA"
|
||||
148 "%s: %lu STROK, %lu SIMWOLOW"
|
||||
149 "nET TENEWYH OKON"
|
||||
150 "kOMANDA script ISPOLXZUETSQ TOLXKO W REVIME vi"
|
||||
151 "nET KOMANDY DLQ ISPOLNENIQ"
|
||||
152 "oPCIQ shiftwidth USTANOWLENA NA 0"
|
||||
153 "pEREPOLNENIE S^ET^IKA"
|
||||
154 "cIKL WYPOLNEN NE DO KONCA"
|
||||
155 "uKAZANO REGULQRNOE WYRAVENIE: FLAG r NE NUVEN"
|
||||
156 "fLAGI #, l I p NE MOGUT BYTX OB_EDINENY S FLAGOM c W REVIME vi"
|
||||
157 "sOWPADENIJ NET"
|
||||
158 "mETKA OTSUTSTWUET"
|
||||
159 "w STEKE METOK ZAPISEJ MENX[E, ^EM %s, ISPOLXZUJTE :display t[ags]"
|
||||
160 "fAJLA S IMENEM %s W STEKE METOK NET; ISPOLXZUJTE :display t[ags]"
|
||||
162 "%s: METKA NE NAJDENA"
|
||||
163 "%s: PLOHAQ METKA W %s"
|
||||
165 "sTEK METOK PUST"
|
||||
166 "%s: ISKOMAQ PEREMENNAQ NE NAJDENA"
|
||||
168 "bUFER %s PUST"
|
||||
170 "pRERWANO"
|
||||
171 "oTSUTSTWIE BUFERA DLQ ISPOLXZOWANIQ"
|
||||
172 "nET PREDIDU]EGO REGULQRNOGO WYRAVENIQ"
|
||||
173 "kOMANDA %s PODRAZUMEWAET NALI^IE PRO^TENNOGO FAJLA"
|
||||
174 "iSPOLXZOWANIE: %s"
|
||||
175 "kOMANDA visual PODRAZUMEWAET OBQZATELXNU@ USTANOWKU OPCII open"
|
||||
176 "%s RAS[IRILSQ DO SLI[KOM BOLX[OGO KOLI^ESTWA FAJLOW"
|
||||
177 "pUSTOJ FAJL"
|
||||
178 "nET PREDYDU]EGO POISKA F, f, T, ILI t"
|
||||
179 "%s NE NAJDENO"
|
||||
180 "nET PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQ"
|
||||
181 "kURSOR STOIT NE NA CIFRE"
|
||||
182 "pOLU^ENNOE ^ISLO SLI[KOM WELIKO"
|
||||
183 "pOLU^ENNOE ^ISLO SLI[KOM MALO"
|
||||
184 "pODHODQ]EGO SIMWOLA NET NA \TOJ STROKE"
|
||||
185 "pODHODQ]IJ SIMWOL NE NAJDEN"
|
||||
186 "nET SIMWOLOW DLQ UDALENIQ"
|
||||
187 "dRUGOGO \KRANA NE SU]ESTWUET"
|
||||
188 "sIMWOLY POSLE STROKI DLQ POISKA I/ILI PEREBOR STROKI"
|
||||
189 "pRO[LYJ OBRAZEC POISKA OTSUTSTWUET"
|
||||
190 "pOISK ZAWER[ILSQ NA NA^ALXNOJ POZICII"
|
||||
192 "sIMWOL NEPRAWILEN; ZAKL@^EN W KAWY^KI DLQ WWODA"
|
||||
193 "uVE NA NA^ALE WSTAWKI"
|
||||
194 "nET SIMWOLOW DLQ UDALENIQ"
|
||||
195 "pEREDWIVENIE ZA KONEC FAJLA"
|
||||
196 "pEREDWIVENIE ZA KONEC STROKI"
|
||||
197 "dWIVENIE STROKI NE SDELANO"
|
||||
198 "uVE NA NA^ALE FAJLA"
|
||||
199 "dWIVENIE KURSORA ZA NA^ALO FAJLA"
|
||||
200 "uVE W PERWOJ KOLONKE"
|
||||
201 "bUFERY DOLVNY BYTX UKAZANY DO WYPOLNENIQ KOMANDY"
|
||||
202 "uVE NA KONCE FAJLA"
|
||||
203 "uVE NA KONSE STROKI"
|
||||
204 "%s NE QWLQETSQ KOMANDOJ VI"
|
||||
205 "iSPOLXZOWANIE: %s"
|
||||
206 "nET SIMWOLOW DLQ UDALENIQ"
|
||||
208 "nET KOMANDY DLQ POWTORA"
|
||||
210 "kOMANDA %s NE MOVET BYTX ISPOLXZOWANA KAK KOMANDA PRODWIVENIQ"
|
||||
211 "~ISLO BOLX[E ^EM %lu"
|
||||
214 "zNA^ENIE KOLI^ESTWA OKON SLI[KOM WELIKO, MAKSIMALXNOE ZNA^ENIE = %u"
|
||||
220 "dWIVENIE KURSORA ZA KONEC \KRANA"
|
||||
221 "dWIVENIE KURSORA ZA NA^ALO \KRANA"
|
||||
223 "tENEWYH OKON NET"
|
||||
224 "nE SU]ESTWUET TENEWOGO OKNA S REDAKTIROWANIEM FAJLA %s"
|
||||
225 "wY NE MOVETE SDELATX EDINSTWENNOE OKNO TENEWYM"
|
||||
226 "|KRAN MOVET BYTX SVAT"
|
||||
227 "|KRAN NE MOVET BYTX SVAT"
|
||||
228 "|KRAN NE MOVET BYTX RAS[IREN"
|
||||
233 "dANNYJ TIP TERMINALA NE IMEET KLAWI[I %s"
|
||||
237 "nEWOZMOVNO SOZDATX WREMENNYJ FAJL"
|
||||
238 "wNIMANIE: %s SPECIALXNYJ FAJL"
|
||||
239 "%s UVE ZABLOKIROWAN, DOSTUPEN TOLXKO NA ^TENIE"
|
||||
240 "%s: UDALEN"
|
||||
241 "%s: ZAKRYT"
|
||||
242 "%s: UDALEN"
|
||||
243 "%s: UDALEN"
|
||||
244 "fAJL TOLXKO DLQ ^TENIQ, NE ZAPISAN: iSPOLXZUJTE ! DLQ OBHODA"
|
||||
245 "fAJL TOLXKO DLQ ^TENIQ, NE ZAPISAN"
|
||||
246 "%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODA"
|
||||
247 "%s SU]ESTWUET, NE ZAPISAN"
|
||||
248 "iSPOLXZUJTE ! DLQ ^ASTI^NOJ ZAPISI FAJLA"
|
||||
249 "~ASTX FAJLA, FAJL NE ZAPISAN"
|
||||
250 "%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQ: ISPOLXZUJTE ! DLQ OBHODA"
|
||||
251 "%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQ"
|
||||
252 "%s: ZA]ITA NA ZAPISX BYLA NEDOSTUPNA"
|
||||
254 "%s: wnimanie: fajl use~en"
|
||||
256 "%s: NOWYJ FAJL: %lu STROK, %lu SIMWOLOW"
|
||||
257 "%s: %lu STROK, %lu SIMWOLOW"
|
||||
258 "%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOW"
|
||||
259 "%s SPECIALXNYJ FAJL"
|
||||
260 "%s: NE PRINADLEVIT wAM"
|
||||
261 "%s: DOSTUPEN NE TOLXKO wAM"
|
||||
262 "fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODA"
|
||||
263 "fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE :edit DLQ OBHODA"
|
||||
264 "fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODA"
|
||||
265 "fAJL WREMENNYJ: WYHOD SOTRET L@BYE IZMENENIQ"
|
||||
267 "zAPISI NA^ATY ZANOWO"
|
169
contrib/nvi/catalog/ru_SU.KOI8-R.check
Normal file
169
contrib/nvi/catalog/ru_SU.KOI8-R.check
Normal file
@ -0,0 +1,169 @@
|
||||
Unused message id's (this is okay):
|
||||
001
|
||||
008
|
||||
021
|
||||
022
|
||||
023
|
||||
024
|
||||
025
|
||||
026
|
||||
027
|
||||
028
|
||||
029
|
||||
036
|
||||
037
|
||||
057
|
||||
061
|
||||
078
|
||||
081
|
||||
090
|
||||
091
|
||||
093
|
||||
110
|
||||
145
|
||||
147
|
||||
161
|
||||
164
|
||||
167
|
||||
169
|
||||
191
|
||||
207
|
||||
209
|
||||
212
|
||||
213
|
||||
215
|
||||
216
|
||||
217
|
||||
218
|
||||
219
|
||||
222
|
||||
229
|
||||
230
|
||||
231
|
||||
232
|
||||
234
|
||||
235
|
||||
236
|
||||
253
|
||||
255
|
||||
266
|
||||
=========================
|
||||
MISSING ERROR MESSAGES (Please add!):
|
||||
008
|
||||
021
|
||||
022
|
||||
023
|
||||
024
|
||||
025
|
||||
026
|
||||
027
|
||||
028
|
||||
029
|
||||
036
|
||||
037
|
||||
057
|
||||
061
|
||||
078
|
||||
090
|
||||
091
|
||||
093
|
||||
110
|
||||
145
|
||||
147
|
||||
161
|
||||
164
|
||||
167
|
||||
169
|
||||
191
|
||||
207
|
||||
209
|
||||
212
|
||||
215
|
||||
216
|
||||
217
|
||||
218
|
||||
219
|
||||
222
|
||||
230
|
||||
231
|
||||
232
|
||||
234
|
||||
235
|
||||
236
|
||||
253
|
||||
255
|
||||
266
|
||||
268
|
||||
269
|
||||
270
|
||||
271
|
||||
272
|
||||
273
|
||||
274
|
||||
275
|
||||
276
|
||||
277
|
||||
278
|
||||
279
|
||||
280
|
||||
281
|
||||
282
|
||||
283
|
||||
284
|
||||
285
|
||||
286
|
||||
287
|
||||
289
|
||||
290
|
||||
291
|
||||
292
|
||||
293
|
||||
294
|
||||
295
|
||||
296
|
||||
297
|
||||
298
|
||||
299
|
||||
300
|
||||
301
|
||||
302
|
||||
303
|
||||
304
|
||||
305
|
||||
306
|
||||
307
|
||||
308
|
||||
309
|
||||
310
|
||||
311
|
||||
312
|
||||
313
|
||||
314
|
||||
315
|
||||
316
|
||||
317
|
||||
=========================
|
||||
Extra error messages (just delete them):
|
||||
047
|
||||
050
|
||||
051
|
||||
052
|
||||
176
|
||||
=========================
|
||||
MESSAGES WITH THE SAME MESSAGE ID's (FIX!):
|
||||
=========================
|
||||
Duplicate messages, both id and message (this is okay):
|
||||
=========================
|
||||
Duplicate messages, just message (this is okay):
|
||||
2 %s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOWX
|
||||
2 %s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODAX
|
||||
2 %s: %lu STROK, %lu SIMWOLOWX
|
||||
2 %s: NE DO KONCA WOSSTANOWLENNYJ FAJLX
|
||||
2 bUFER %s PUSTX
|
||||
2 fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODAX
|
||||
2 set: %s OPCIQ NE QWLQETSQ DWOI^NOJX
|
||||
2 zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDUX
|
||||
3 %s: UDALENX
|
||||
3 nET SIMWOLOW DLQ UDALENIQX
|
||||
4 iSPOLXZOWANIE: %sX
|
||||
=========================
|
1
contrib/nvi/catalog/ru_SU.KOI8-R.owner
Normal file
1
contrib/nvi/catalog/ru_SU.KOI8-R.owner
Normal file
@ -0,0 +1 @@
|
||||
Dima Ruban <dima@demos.su>
|
317
contrib/nvi/catalog/spanish
Normal file
317
contrib/nvi/catalog/spanish
Normal file
@ -0,0 +1,317 @@
|
||||
VI_MESSAGE_CATALOG
|
||||
Desbordamiento de longitud de l¡neaX
|
||||
no se puede borrar la l¡nea %luX
|
||||
no se puede a¤adir la l¡nea %luX
|
||||
no se puede insertar en la l¡nea %luX
|
||||
no se puede guardar la l¡nea %luX
|
||||
no se puede obtener la £ltima l¡neaX
|
||||
Error: no se puede recuperar la l¡nea %luX
|
||||
Archivo de logX
|
||||
No se realiza log, no se puede deshacerX
|
||||
No hay cambios para deshacerX
|
||||
No se realiza log, no se puede deshacerX
|
||||
No se realiza log, no se puede remontar hacia adelanteX
|
||||
No hay cambios para rehacerX
|
||||
%s/%d: error de logX
|
||||
La entrada y salida est ndar de Vi debe ser una terminalX
|
||||
Marcar %s: no determinadoX
|
||||
Marcar %s: se borr¢ la l¡neaX
|
||||
Marcar %s: la posici¢n del cursor ya no existeX
|
||||
Error: X
|
||||
nuevo archivoX
|
||||
nombre cambiadoX
|
||||
modificadoX
|
||||
no modificadoX
|
||||
DESTRABADOX
|
||||
lectura solamenteX
|
||||
l¡nea %lu de %lu [%ld%%]X
|
||||
archivo vac¡oX
|
||||
l¡nea %luX
|
||||
El archivo %s no es un cat logo de mensajesX
|
||||
No se puede determinar la opci¢n por omisi¢n %sX
|
||||
Uso: %sX
|
||||
determinar: no hay opci¢n %s: 'determinar todo' establece todos los valores de opci¢nX
|
||||
determinar: [no] hay opci¢n %s no tiene valorX
|
||||
determinar: opci¢n %s no es booleanoX
|
||||
determinar: opci¢n %s: %sX
|
||||
determinar: opci¢n %s: %s: desbordamiento de valoresX
|
||||
determinar: opci¢n %s: %s es un n£mero ilegalX
|
||||
determinar: opci¢n %s no es booleanoX
|
||||
Las columnas en pantalla son demasiado peque¤as, menos de %dX
|
||||
Las columnas en pantalla son demasiado grandes, m s de %dX
|
||||
Las l¡neas en pantalla son demasiado peque¤as, menos de %dX
|
||||
Las l¡neas en pantalla son demasiado grandes, m s de %dX
|
||||
La opci¢n lisp no est implementadaX
|
||||
mensajes no desconectados: %sX
|
||||
mensajes no conectados: %sX
|
||||
|
||||
La opci¢n de p rrafo debe estar en dos grupos de caracteresX
|
||||
La opci¢n de secci¢n debe estar en dos grupos de caracteresX
|
||||
|
||||
|
||||
|
||||
El buffer por omisi¢n est vac¡oX
|
||||
El buffer %s est vac¡oX
|
||||
Los archivos con nuevas l¡neas en el nombre son irrecuperablesX
|
||||
Las modificaciones no pueden recuperarse si la sesi¢n fallaX
|
||||
Copiando archivo para recuperaci¢n...X
|
||||
Preservaci¢n fracasada: %sX
|
||||
Las modificaciones no pueden recuperarse si la sesi¢n fallaX
|
||||
Archivo de respaldo fracasado: %sX
|
||||
Copiando archivo para recuperaci¢n...X
|
||||
Informaci¢n sobre identificaci¢n del usuario %u no encontradaX
|
||||
No se puede trabar archivo de recuperaci¢nX
|
||||
Desbordamiento de buffer de archivo de recuperaci¢nX
|
||||
Archivo de recuperaci¢nX
|
||||
%s: archivo de recuperaci¢n defectuosoX
|
||||
%s: archivo de recuperaci¢n defectuosoX
|
||||
No hay archivos denominados %s, que usted pueda leer, para recuperarX
|
||||
Existen versiones m s antiguas de este archivo que usted puede recuperarX
|
||||
Existen otros archivos que usted puede recuperarX
|
||||
no env¡a email: %sX
|
||||
Archivo vac¡o; no hay nada para buscarX
|
||||
Se alcanz¢ el final del archivo sin encontrar el patr¢nX
|
||||
No hay patr¢n anterior de b£squedaX
|
||||
No se encontr¢ el patr¢nX
|
||||
Se alcanz¢ el principio del archivo sin encontrar el patr¢nX
|
||||
B£squeda reiniciadaX
|
||||
Buscando...X
|
||||
No se encontr¢ ning£n car cter no imprimibleX
|
||||
Nombre de comando desconocidoX
|
||||
|
||||
%s: comando no disponible en modalidad exX
|
||||
La cuenta no puede ser ceroX
|
||||
%s: mala especificaci¢n de l¡neaX
|
||||
Error interno de tabla de sintaxis (%s: %s)X
|
||||
Uso: %sX
|
||||
%s: buffer temporario no liberadoX
|
||||
Desplazamiento de marcador a antes de la l¡nea 1X
|
||||
Desplazamiento de marcador m s all del final del archivoX
|
||||
@ con rango que corre cuando se cambia el archivo/la pantallaX
|
||||
Comando global/v que corre cuando se cambia el archivo/la pantallaX
|
||||
Comando Ex fracasado: comandos pendientes descartadosX
|
||||
Comando Ex fracasado: teclas mapeadas descartadasX
|
||||
La segunda direcci¢n es m s peque¤a que la primeraX
|
||||
No se suministra nombre de marcaX
|
||||
\\ no es seguido por / o ?X
|
||||
Referencia a un n£mero de l¡nea menor que 0X
|
||||
El comando %s es desconocidoX
|
||||
Desbordamiento de valor de direcci¢nX
|
||||
Subdesbordamiento de valor de direcci¢nX
|
||||
Combinaci¢n de direcci¢n ilegalX
|
||||
Direcci¢n ilegal: s¢lo %lu l¡neas en el archivoX
|
||||
Direcci¢n ilegal: el archivo est vac¡oX
|
||||
El comando %s no permite una direcci¢n de 0X
|
||||
No hay abreviaturas para visualizarX
|
||||
Las abreviaturas deben terminar con un car cter de \"palabra\" X
|
||||
Las abreviaturas no pueden contener tabs o espaciosX
|
||||
Las abreviaturas no pueden mezclar caracteres palabra/no-palabra, salvo al finalX
|
||||
\"%s\" no es una abreviaturaX
|
||||
Comando Vi fracasado: teclas mapeadas descartadasX
|
||||
No hay m s archivos para editarX
|
||||
No hay archivos anteriores para editarX
|
||||
No hay archivos anteriores para rebobinarX
|
||||
No hay lista de archivos para visualizarX
|
||||
No hay un comando anterior para reemplazar a \"!\"X
|
||||
No hay nombre de archivo para sustituir por %%X
|
||||
No hay nombre de archivo para sustituir por #X
|
||||
Error: execl: %sX
|
||||
Error de E/S: %sX
|
||||
Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterarX
|
||||
No se puede encontrar la ubicaci¢n del directorio inicialX
|
||||
Nuevo directorio actual: %sX
|
||||
No hay buffers sueltos para visualizarX
|
||||
El comando %s no puede usarse como parte de un comando global o vX
|
||||
%s/%s: sin fuente: no le pertenece a usted o a ra¡zX
|
||||
%s/%s: sin fuente: no le pertenece a ustedX
|
||||
%s/%s: sin fuente: puede ser escrito por un usuario que no sea el propietarioX
|
||||
%s: sin fuente: no le pertenece a usted o a ra¡zX
|
||||
%s: sin fuente: no le pertenece a ustedX
|
||||
%s: sin fuente: puede ser escrito por un usuario que no sea el propietarioX
|
||||
No hay l¡neas siguientes para unirX
|
||||
No hay anotaciones de mapa de entradaX
|
||||
No hay anotaciones de mapa de comandoX
|
||||
El car cter %s no puede remapearseX
|
||||
\"%s\" no est mapeado actualmenteX
|
||||
Marca de nombres debe ser un s¢lo car cterX
|
||||
%s existe, no est escrito; usar ! para alterarX
|
||||
Nuevo archivo exrc: %sX
|
||||
La l¡nea de destino se encuentra dentro del rango de movimientoX
|
||||
El comando abierto requiere que se determine la opci¢n abiertaX
|
||||
El comando abierto no se ha implementado a£nX
|
||||
No es posible preservar este archivoX
|
||||
Archivo preservadoX
|
||||
%s: expandido a demasiados nombres de archivoX
|
||||
S¢lo pueden leerse los archivos regulares y los conductos nombradosX
|
||||
%s: traba de lectura no disponibleX
|
||||
Leyendo...X
|
||||
%s: %lu l¡neas, %lu caracteresX
|
||||
No hay pantallas de fondo para mostrarX
|
||||
El comando de script s¢lo est disponible en modalidad viX
|
||||
No hay comando para ejecutarX
|
||||
opci¢n de ancho de desplazamiento en 0X
|
||||
Desbordamiento de cuentaX
|
||||
Subdesbordamiento de cuentaX
|
||||
Expresi¢n regular especificada; marcador r no tiene significadoX
|
||||
Los marcadores #, l y p no pueden combinarse con el marcador c en la modalidad viX
|
||||
No se encontr¢ coincidenciaX
|
||||
No se ingres¢ un identificador anteriorX
|
||||
Se encontraron menos de %s anotaciones en la pila de identificadores; usar :visualizar i[dentificadores]X
|
||||
No hay archivo %s en la pila de identificadores al que se pueda volver; usar :visualizar i[dentificadores]"
|
||||
Presionar Intro para continuar: X
|
||||
%s: no se encontr¢ el identificadorX
|
||||
%s: identificador corrompido en %sX
|
||||
%s: el n£mero de l¡nea del identificador es posterior al final del archivoX
|
||||
La pila de identificadores est vac¡aX
|
||||
%s: patr¢n de b£squeda no encontradoX
|
||||
%d archivos m s para editarX
|
||||
El buffer %s est vac¡oX
|
||||
¨Confirmar cambio? [n]X
|
||||
InterrumpidoX
|
||||
No hay buffer anterior para ejecutarX
|
||||
No hay expresi¢n regular anteriorX
|
||||
El comando %s requiere que se haya le¡do un archivoX
|
||||
Uso: %sX
|
||||
El comando visual requiere que se determine la opci¢n abiertaX
|
||||
|
||||
Archivo vac¡oX
|
||||
No hay b£squeda F, f, T o t anteriorX
|
||||
%s no se encontr¢X
|
||||
No hay archivo anterior para editarX
|
||||
El cursor no est en un n£meroX
|
||||
El n£mero resultante es demasiado grandeX
|
||||
El n£mero resultante es demasiado peque¤oX
|
||||
No hay car cter coincidente en esta l¡neaX
|
||||
No se encontr¢ un car cter coincidenteX
|
||||
No hay caracteres para reemplazarX
|
||||
No hay otra pantalla a la que se pueda pasarX
|
||||
Caracteres despu‚s de cadena de b£squeda, desplazamiento de l¡nea y/o comando zX
|
||||
No hay patr¢n anterior de b£squedaX
|
||||
B£squeda vuelve a la posici¢n inicialX
|
||||
Se super¢ el l¡mite de expansi¢n de abreviatura: se descartaron caracteresX
|
||||
Car cter ilegal; mencionar para entrarX
|
||||
Ya se encuentra al principio de la inserci¢nX
|
||||
No hay m s caracteres para borrarX
|
||||
Movimiento m s all del final del archivoX
|
||||
Movimiento m s all del final de la l¡neaX
|
||||
No hay movimiento del cursorX
|
||||
Ya se encuentra al principio del archivoX
|
||||
Movimiento m s all del principio del archivoX
|
||||
Ya se encuentra en la primera columnaX
|
||||
Los buffers deben especificarse antes del comandoX
|
||||
Ya se encuentra al final del archivoX
|
||||
Ya se encuentra al final de la l¡neaX
|
||||
%s no es un comando viX
|
||||
Uso: %sX
|
||||
No hay caracteres para borrarX
|
||||
El comando Q requiere la interfase de terminal exX
|
||||
No hay comando para repetirX
|
||||
El archivo est vac¡oX
|
||||
%s no puede usarse como comando de movimientoX
|
||||
Ya se encuentra en modalidad de comandoX
|
||||
El cursor no se encuentra en una palabraX
|
||||
|
||||
El valor de opci¢n de Windows es demasiado grande, el m x. es %uX
|
||||
A¤adirX
|
||||
CambiarX
|
||||
ComandoX
|
||||
InsertarX
|
||||
ReemplazarX
|
||||
El movimiento va m s all del final de la pantallaX
|
||||
El movimiento va m s all del principio de la pantallaX
|
||||
La pantalla debe tener m s de %d l¡neas para dividirseX
|
||||
No hay pantallas de fondoX
|
||||
No hay pantalla de fondo editando un archivo denominado %sX
|
||||
No se puede poner fondo a la £nica pantalla que se visualizaX
|
||||
La pantalla s¢lo puede reducirse a %d hilerasX
|
||||
La pantalla no puede reducirseX
|
||||
La pantalla no puede aumentarseX
|
||||
|
||||
Esta pantalla no puede suspenderseX
|
||||
Interrumpido: teclas mapeadas descartadasX
|
||||
vi: buffer temporario no liberadoX
|
||||
Esta terminal no tiene tecla %sX
|
||||
S¢lo un buffer puede especificarseX
|
||||
N£mero mayor que %luX
|
||||
InterrumpidoX
|
||||
No se puede crear archivo temporarioX
|
||||
Advertencia: %s no es un archivo regularX
|
||||
%s ya se encuentra trabado, la sesi¢n es de lectura solamenteX
|
||||
%s: eliminarX
|
||||
%s: cerrarX
|
||||
%s: eliminarX
|
||||
%s: eliminarX
|
||||
Archivo de lectura solamente, no escrito; usar ! para alterarX
|
||||
Archivo de lectura solamente, no escritoX
|
||||
%s existe, no escrito; usar ! para alterarX
|
||||
%s existe, no escritoX
|
||||
Archivo parcial, no escrito; usar ! para alterarX
|
||||
Archivo parcial, no escritoX
|
||||
%s: archivo modificado m s recientemente que esta copia; usar ! para alterarX
|
||||
%s: archivo modificado m s recientemente que esta copiaX
|
||||
%s: la traba de escritura no estaba disponibleX
|
||||
Escribiendo...X
|
||||
%s: ADVERTENCIA: ARCHIVO TRUNCADOX
|
||||
Ya se encuentra en el primer identificador de este grupoX
|
||||
%s: nuevo archivo: %lu l¡neas, %lu caracteresX
|
||||
%s: %lu l¡neas, %lu caracteresX
|
||||
%s expandido a demasiados nombres de archivosX
|
||||
%s: no es un archivo regularX
|
||||
%s: no le perteneceX
|
||||
%s: accesible por un usuario que no sea el propietarioX
|
||||
Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterarX
|
||||
Archivo modificado desde la £ltima escritura completa; escribir o usar :editar! para alterarX
|
||||
Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterarX
|
||||
El archivo es temporario; al salir se descartar n las modificacionesX
|
||||
Archivo de lectura solamente, las modificaciones no se autoescribenX
|
||||
Se reinici¢ el logX
|
||||
confirmar? [snq]X
|
||||
Presionar cualquier tecla para continuar: X
|
||||
Presionar cualquier tecla para continuar [: para ingresar m s comandos ex]: X
|
||||
Presionar cualquier tecla para continuar [q para salir]: X
|
||||
Esta forma de %s requiere la interfase terminal exX
|
||||
Ingresando en la modalidad de entrada ex.X
|
||||
Comando fracasado, no hay archivo le¡do aun.X
|
||||
cont?X
|
||||
Evento inesperado de car cterX
|
||||
Evento inesperado de final de archivoX
|
||||
No hay coincidencias para consultaX
|
||||
Evento inesperado de interrupci¢nX
|
||||
Evento inesperado de salidaX
|
||||
Evento inesperado de repinturaX
|
||||
Ya se encuentra en el £ltimo identificador de este grupoX
|
||||
El comando %s requiere la interfase terminal exX
|
||||
Esta forma de %s no se encuentra soportada cuando se determina la opci¢n de edici¢n seguraX
|
||||
Evento inesperado de cadenaX
|
||||
Evento inesperado de tiempo excedidoX
|
||||
Evento inesperado de escrituraX
|
||||
|
||||
Las expansiones de shell no se encuentran soportadas cuando se determina la opci¢n de edici¢n seguraX
|
||||
El comando %s no se encuentra soportado cuando se determina la opci¢n de edici¢n seguraX
|
||||
determinar: la opci¢n %s puede no estar desconectadaX
|
||||
El monitor es demasiado peque¤o.X
|
||||
agregadoX
|
||||
cambiadoX
|
||||
borradoX
|
||||
unidoX
|
||||
movidoX
|
||||
desplazadoX
|
||||
arrancadoX
|
||||
l¡neaX
|
||||
l¡neasX
|
||||
Vi no se carg¢ con un int‚rprete TclX
|
||||
Archivo modificado desde la £ltima escritura.X
|
||||
Expansi¢n de shell fracasadaX
|
||||
No hay opci¢n de edici¢n %s especificadaX
|
||||
Vi no se carg¢ con un int‚rprete PerlX
|
||||
No hay comando ex para ejecutarX
|
||||
Ingresar <CR> para ejecutar un comando, :q para salirX
|
||||
Usar \"cscope ayuda\" para obtener ayudaX
|
||||
No hay conexiones cscope corriendoX
|
||||
%s: tipo de b£squeda desconocido: usar uno de %sX
|
||||
%d: no existe esta sesi¢n cscopeX
|
||||
determinar: la opci¢n %s no puede conectarse nuncaX
|
||||
determinar: la opci¢n %s no puede determinarse nunca en 0X
|
||||
%s: a¤adido: %lu l¡neas, %lu caracteresX
|
||||
Evento inesperado de modificaci¢n de tama¤oX
|
||||
%d archivos para editarX
|
309
contrib/nvi/catalog/spanish.base
Normal file
309
contrib/nvi/catalog/spanish.base
Normal file
@ -0,0 +1,309 @@
|
||||
002 "Desbordamiento de longitud de l¡nea"
|
||||
003 "no se puede borrar la l¡nea %lu"
|
||||
004 "no se puede a¤adir la l¡nea %lu"
|
||||
005 "no se puede insertar en la l¡nea %lu"
|
||||
006 "no se puede guardar la l¡nea %lu"
|
||||
007 "no se puede obtener la £ltima l¡nea"
|
||||
008 "Error: no se puede recuperar la l¡nea %lu"
|
||||
009 "Archivo de log"
|
||||
010 "No se realiza log, no se puede deshacer"
|
||||
011 "No hay cambios para deshacer"
|
||||
012 "No se realiza log, no se puede deshacer"
|
||||
013 "No se realiza log, no se puede remontar hacia adelante"
|
||||
014 "No hay cambios para rehacer"
|
||||
015 "%s/%d: error de log"
|
||||
016 "La entrada y salida est ndar de Vi debe ser una terminal"
|
||||
017 "Marcar %s: no determinado"
|
||||
018 "Marcar %s: se borr¢ la l¡nea"
|
||||
019 "Marcar %s: la posici¢n del cursor ya no existe"
|
||||
020 "Error: "
|
||||
021 "nuevo archivo"
|
||||
022 "nombre cambiado"
|
||||
023 "modificado"
|
||||
024 "no modificado"
|
||||
025 "DESTRABADO"
|
||||
026 "lectura solamente"
|
||||
027 "l¡nea %lu de %lu [%ld%%]"
|
||||
028 "archivo vac¡o"
|
||||
029 "l¡nea %lu"
|
||||
030 "El archivo %s no es un cat logo de mensajes"
|
||||
031 "No se puede determinar la opci¢n por omisi¢n %s"
|
||||
032 "Uso: %s"
|
||||
033 "determinar: no hay opci¢n %s: 'determinar todo' establece todos los valores de opci¢n"
|
||||
034 "determinar: [no] hay opci¢n %s no tiene valor"
|
||||
035 "determinar: opci¢n %s no es booleano"
|
||||
036 "determinar: opci¢n %s: %s"
|
||||
037 "determinar: opci¢n %s: %s: desbordamiento de valores"
|
||||
038 "determinar: opci¢n %s: %s es un n£mero ilegal"
|
||||
039 "determinar: opci¢n %s no es booleano"
|
||||
040 "Las columnas en pantalla son demasiado peque¤as, menos de %d"
|
||||
041 "Las columnas en pantalla son demasiado grandes, m s de %d"
|
||||
042 "Las l¡neas en pantalla son demasiado peque¤as, menos de %d"
|
||||
043 "Las l¡neas en pantalla son demasiado grandes, m s de %d"
|
||||
044 "La opci¢n lisp no est implementada"
|
||||
045 "mensajes no desconectados: %s"
|
||||
046 "mensajes no conectados: %s"
|
||||
048 "La opci¢n de p rrafo debe estar en dos grupos de caracteres"
|
||||
049 "La opci¢n de secci¢n debe estar en dos grupos de caracteres"
|
||||
053 "El buffer por omisi¢n est vac¡o"
|
||||
054 "El buffer %s est vac¡o"
|
||||
055 "Los archivos con nuevas l¡neas en el nombre son irrecuperables"
|
||||
056 "Las modificaciones no pueden recuperarse si la sesi¢n falla"
|
||||
057 "Copiando archivo para recuperaci¢n..."
|
||||
058 "Preservaci¢n fracasada: %s"
|
||||
059 "Las modificaciones no pueden recuperarse si la sesi¢n falla"
|
||||
060 "Archivo de respaldo fracasado: %s"
|
||||
061 "Copiando archivo para recuperaci¢n..."
|
||||
062 "Informaci¢n sobre identificaci¢n del usuario %u no encontrada"
|
||||
063 "No se puede trabar archivo de recuperaci¢n"
|
||||
064 "Desbordamiento de buffer de archivo de recuperaci¢n"
|
||||
065 "Archivo de recuperaci¢n"
|
||||
066 "%s: archivo de recuperaci¢n defectuoso"
|
||||
067 "%s: archivo de recuperaci¢n defectuoso"
|
||||
068 "No hay archivos denominados %s, que usted pueda leer, para recuperar"
|
||||
069 "Existen versiones m s antiguas de este archivo que usted puede recuperar"
|
||||
070 "Existen otros archivos que usted puede recuperar"
|
||||
071 "no env¡a email: %s"
|
||||
072 "Archivo vac¡o; no hay nada para buscar"
|
||||
073 "Se alcanz¢ el final del archivo sin encontrar el patr¢n"
|
||||
074 "No hay patr¢n anterior de b£squeda"
|
||||
075 "No se encontr¢ el patr¢n"
|
||||
076 " Se alcanz¢ el principio del archivo sin encontrar el patr¢n"
|
||||
077 "B£squeda reiniciada"
|
||||
078 "Buscando..."
|
||||
079 "No se encontr¢ ning£n car cter no imprimible"
|
||||
080 "Nombre de comando desconocido"
|
||||
082 "%s: comando no disponible en modalidad ex"
|
||||
083 "La cuenta no puede ser cero"
|
||||
084 "%s: mala especificaci¢n de l¡nea"
|
||||
085 "Error interno de tabla de sintaxis (%s: %s)"
|
||||
086 "Uso: %s"
|
||||
087 "%s: buffer temporario no liberado"
|
||||
088 "Desplazamiento de marcador a antes de la l¡nea 1"
|
||||
089 "Desplazamiento de marcador m s all del final del archivo"
|
||||
090 "@ con rango que corre cuando se cambia el archivo/la pantalla"
|
||||
091 "Comando global/v que corre cuando se cambia el archivo/la pantalla"
|
||||
092 "Comando Ex fracasado: comandos pendientes descartados"
|
||||
093 "Comando Ex fracasado: teclas mapeadas descartadas"
|
||||
094 "La segunda direcci¢n es m s peque¤a que la primera"
|
||||
095 "No se suministra nombre de marca"
|
||||
096 "\\ no es seguido por / o ?"
|
||||
097 "Referencia a un n£mero de l¡nea menor que 0"
|
||||
098 "El comando %s es desconocido"
|
||||
099 "Desbordamiento de valor de direcci¢n"
|
||||
100 "Subdesbordamiento de valor de direcci¢n"
|
||||
101 "Combinaci¢n de direcci¢n ilegal"
|
||||
102 "Direcci¢n ilegal: s¢lo %lu l¡neas en el archivo"
|
||||
103 "Direcci¢n ilegal: el archivo est vac¡o"
|
||||
104 "El comando %s no permite una direcci¢n de 0"
|
||||
105 "No hay abreviaturas para visualizar"
|
||||
106 "Las abreviaturas deben terminar con un car cter de \"palabra\" "
|
||||
107 "Las abreviaturas no pueden contener tabs o espacios"
|
||||
108 "Las abreviaturas no pueden mezclar caracteres palabra/no-palabra, salvo al final"
|
||||
109 "\"%s\" no es una abreviatura"
|
||||
110 "Comando Vi fracasado: teclas mapeadas descartadas"
|
||||
111 "No hay m s archivos para editar"
|
||||
112 "No hay archivos anteriores para editar"
|
||||
113 "No hay archivos anteriores para rebobinar"
|
||||
114 "No hay lista de archivos para visualizar"
|
||||
115 "No hay un comando anterior para reemplazar a \"!\""
|
||||
116 "No hay nombre de archivo para sustituir por %%"
|
||||
117 "No hay nombre de archivo para sustituir por #"
|
||||
118 "Error: execl: %s"
|
||||
119 "Error de E/S: %s"
|
||||
120 "Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterar"
|
||||
121 "No se puede encontrar la ubicaci¢n del directorio inicial"
|
||||
122 "Nuevo directorio actual: %s"
|
||||
123 "No hay buffers sueltos para visualizar"
|
||||
124 "El comando %s no puede usarse como parte de un comando global o v"
|
||||
125 "%s/%s: sin fuente: no le pertenece a usted o a ra¡z"
|
||||
126 "%s/%s: sin fuente: no le pertenece a usted"
|
||||
127 "%s/%s: sin fuente: puede ser escrito por un usuario que no sea el propietario"
|
||||
128 "%s: sin fuente: no le pertenece a usted o a ra¡z"
|
||||
129 "%s: sin fuente: no le pertenece a usted"
|
||||
130 "%s: sin fuente: puede ser escrito por un usuario que no sea el propietario"
|
||||
131 "No hay l¡neas siguientes para unir"
|
||||
132 "No hay anotaciones de mapa de entrada"
|
||||
133 "No hay anotaciones de mapa de comando"
|
||||
134 "El car cter %s no puede remapearse"
|
||||
135 "\"%s\" no est mapeado actualmente"
|
||||
136 "Marca de nombres debe ser un s¢lo car cter"
|
||||
137 "%s existe, no est escrito; usar ! para alterar"
|
||||
138 "Nuevo archivo exrc: %s"
|
||||
139 "La l¡nea de destino se encuentra dentro del rango de movimiento"
|
||||
140 "El comando abierto requiere que se determine la opci¢n abierta"
|
||||
141 "El comando abierto no se ha implementado a£n"
|
||||
142 "No es posible preservar este archivo"
|
||||
143 "Archivo preservado"
|
||||
144 "%s: expandido a demasiados nombres de archivo"
|
||||
145 "S¢lo pueden leerse los archivos regulares y los conductos nombrados"
|
||||
146 "%s: traba de lectura no disponible"
|
||||
147 "Leyendo..."
|
||||
148 "%s: %lu l¡neas, %lu caracteres"
|
||||
149 "No hay pantallas de fondo para mostrar"
|
||||
150 "El comando de script s¢lo est disponible en modalidad vi"
|
||||
151 "No hay comando para ejecutar"
|
||||
152 "opci¢n de ancho de desplazamiento en 0"
|
||||
153 "Desbordamiento de cuenta"
|
||||
154 "Subdesbordamiento de cuenta"
|
||||
155 "Expresi¢n regular especificada; marcador r no tiene significado"
|
||||
156 "Los marcadores #, l y p no pueden combinarse con el marcador c en la modalidad vi"
|
||||
157 "No se encontr¢ coincidencia"
|
||||
158 "No se ingres¢ un identificador anterior"
|
||||
159 "Se encontraron menos de %s anotaciones en la pila de identificadores; usar :visualizar i[dentificadores]"
|
||||
160 "No hay archivo %s en la pila de identificadores al que se pueda volver; usar :visualizar i[dentificadores]"
|
||||
161 "Presionar Intro para continuar: "
|
||||
162 "%s: no se encontr¢ el identificador"
|
||||
163 "%s: identificador corrompido en %s"
|
||||
164 "%s: el n£mero de l¡nea del identificador es posterior al final del archivo"
|
||||
165 "La pila de identificadores est vac¡a"
|
||||
166 "%s: patr¢n de b£squeda no encontrado"
|
||||
167 "%d archivos m s para editar"
|
||||
168 "El buffer %s est vac¡o"
|
||||
169 "¨Confirmar cambio? [n]"
|
||||
170 "Interrumpido"
|
||||
171 "No hay buffer anterior para ejecutar"
|
||||
172 "No hay expresi¢n regular anterior"
|
||||
173 "El comando %s requiere que se haya le¡do un archivo"
|
||||
174 "Uso: %s"
|
||||
175 "El comando visual requiere que se determine la opci¢n abierta"
|
||||
177 "Archivo vac¡o"
|
||||
178 "No hay b£squeda F, f, T o t anterior"
|
||||
179 "%s no se encontr¢"
|
||||
180 "No hay archivo anterior para editar"
|
||||
181 "El cursor no est en un n£mero"
|
||||
182 "El n£mero resultante es demasiado grande"
|
||||
183 " El n£mero resultante es demasiado peque¤o"
|
||||
184 "No hay car cter coincidente en esta l¡nea"
|
||||
185 "No se encontr¢ un car cter coincidente"
|
||||
186 "No hay caracteres para reemplazar"
|
||||
187 "No hay otra pantalla a la que se pueda pasar"
|
||||
188 "Caracteres despu‚s de cadena de b£squeda, desplazamiento de l¡nea y/o comando z"
|
||||
189 "No hay patr¢n anterior de b£squeda"
|
||||
190 "B£squeda vuelve a la posici¢n inicial"
|
||||
191 "Se super¢ el l¡mite de expansi¢n de abreviatura: se descartaron caracteres"
|
||||
192 "Car cter ilegal; mencionar para entrar"
|
||||
193 "Ya se encuentra al principio de la inserci¢n"
|
||||
194 "No hay m s caracteres para borrar"
|
||||
195 "Movimiento m s all del final del archivo"
|
||||
196 "Movimiento m s all del final de la l¡nea"
|
||||
197 "No hay movimiento del cursor"
|
||||
198 "Ya se encuentra al principio del archivo"
|
||||
199 "Movimiento m s all del principio del archivo"
|
||||
200 "Ya se encuentra en la primera columna"
|
||||
201 "Los buffers deben especificarse antes del comando"
|
||||
202 "Ya se encuentra al final del archivo"
|
||||
203 "Ya se encuentra al final de la l¡nea"
|
||||
204 "%s no es un comando vi"
|
||||
205 "Uso: %s"
|
||||
206 "No hay caracteres para borrar"
|
||||
207 "El comando Q requiere la interfase de terminal ex"
|
||||
208 "No hay comando para repetir"
|
||||
209 "El archivo est vac¡o"
|
||||
209 "El archivo est vac¡o"
|
||||
210 "%s no puede usarse como comando de movimiento"
|
||||
211 "Ya se encuentra en modalidad de comando"
|
||||
212 "El cursor no se encuentra en una palabra"
|
||||
214 "El valor de opci¢n de Windows es demasiado grande, el m x. es %u"
|
||||
215 "A¤adir"
|
||||
216 "Cambiar"
|
||||
217 "Comando"
|
||||
218 "Insertar"
|
||||
219 "Reemplazar"
|
||||
220 "El movimiento va m s all del final de la pantalla"
|
||||
221 "El movimiento va m s all del principio de la pantalla"
|
||||
222 "La pantalla debe tener m s de %d l¡neas para dividirse"
|
||||
223 "No hay pantallas de fondo"
|
||||
224 "No hay pantalla de fondo editando un archivo denominado %s"
|
||||
225 "No se puede poner fondo a la £nica pantalla que se visualiza"
|
||||
226 "La pantalla s¢lo puede reducirse a %d hileras"
|
||||
227 "La pantalla no puede reducirse"
|
||||
228 "La pantalla no puede aumentarse"
|
||||
230 "Esta pantalla no puede suspenderse"
|
||||
231 "Interrumpido: teclas mapeadas descartadas"
|
||||
232 "vi: buffer temporario no liberado"
|
||||
233 "Esta terminal no tiene tecla %s"
|
||||
234 "S¢lo un buffer puede especificarse"
|
||||
235 "N£mero mayor que %lu"
|
||||
236 "Interrumpido"
|
||||
237 "No se puede crear archivo temporario"
|
||||
238 "Advertencia: %s no es un archivo regular"
|
||||
239 "%s ya se encuentra trabado, la sesi¢n es de lectura solamente"
|
||||
240 "%s: eliminar"
|
||||
241 "%s: cerrar"
|
||||
242 "%s: eliminar"
|
||||
243 "%s: eliminar"
|
||||
244 "Archivo de lectura solamente, no escrito; usar ! para alterar"
|
||||
245 " Archivo de lectura solamente, no escrito"
|
||||
246 "%s existe, no escrito; usar ! para alterar"
|
||||
247 "%s existe, no escrito"
|
||||
248 "Archivo parcial, no escrito; usar ! para alterar"
|
||||
249 "Archivo parcial, no escrito"
|
||||
250 "%s: archivo modificado m s recientemente que esta copia; usar ! para alterar"
|
||||
251 "%s: archivo modificado m s recientemente que esta copia"
|
||||
252 "%s: la traba de escritura no estaba disponible"
|
||||
253 "Escribiendo..."
|
||||
254 "%s: ADVERTENCIA: ARCHIVO TRUNCADO"
|
||||
255 "Ya se encuentra en el primer identificador de este grupo"
|
||||
256 "%s: nuevo archivo: %lu l¡neas, %lu caracteres"
|
||||
257 "%s: %lu l¡neas, %lu caracteres"
|
||||
258 "%s expandido a demasiados nombres de archivos"
|
||||
259 "%s: no es un archivo regular"
|
||||
260 "%s: no le pertenece"
|
||||
261 "%s: accesible por un usuario que no sea el propietario"
|
||||
262 "Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterar"
|
||||
263 "Archivo modificado desde la £ltima escritura completa; escribir o usar :editar! para alterar"
|
||||
264 "Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterar"
|
||||
265 "El archivo es temporario; al salir se descartar n las modificaciones"
|
||||
266 "Archivo de lectura solamente, las modificaciones no se autoescriben"
|
||||
267 "Se reinici¢ el log"
|
||||
268 "confirmar? [snq]"
|
||||
269 "Presionar cualquier tecla para continuar: "
|
||||
270 "Presionar cualquier tecla para continuar [: para ingresar m s comandos ex]: "
|
||||
271 "Presionar cualquier tecla para continuar [q para salir]: "
|
||||
272 "Esta forma de %s requiere la interfase terminal ex"
|
||||
273 "Ingresando en la modalidad de entrada ex."
|
||||
274 "Comando fracasado, no hay archivo le¡do aun."
|
||||
275 " cont?"
|
||||
276 "Evento inesperado de car cter"
|
||||
277 "Evento inesperado de final de archivo"
|
||||
278 "No hay coincidencias para consulta"
|
||||
279 "Evento inesperado de interrupci¢n"
|
||||
280 "Evento inesperado de salida"
|
||||
281 "Evento inesperado de repintura"
|
||||
282 "Ya se encuentra en el £ltimo identificador de este grupo"
|
||||
283 "El comando %s requiere la interfase terminal ex"
|
||||
284 "Esta forma de %s no se encuentra soportada cuando se determina la opci¢n de edici¢n segura"
|
||||
285 "Evento inesperado de cadena"
|
||||
286 "Evento inesperado de tiempo excedido"
|
||||
287 "Evento inesperado de escritura"
|
||||
289 "Las expansiones de shell no se encuentran soportadas cuando se determina la opci¢n de edici¢n segura"
|
||||
290 "El comando %s no se encuentra soportado cuando se determina la opci¢n de edici¢n segura"
|
||||
291 "determinar: la opci¢n %s puede no estar desconectada"
|
||||
292 "El monitor es demasiado peque¤o."
|
||||
293 "agregado"
|
||||
294 "cambiado"
|
||||
295 "borrado"
|
||||
296 "unido"
|
||||
297 "movido"
|
||||
298 "desplazado"
|
||||
299 "arrancado"
|
||||
300 "l¡nea"
|
||||
301 "l¡neas"
|
||||
302 "Vi no se carg¢ con un int‚rprete Tcl"
|
||||
303 "Archivo modificado desde la £ltima escritura."
|
||||
304 "Expansi¢n de shell fracasada"
|
||||
304 "Expansi¢n de shell fracasada"
|
||||
305 "No hay opci¢n de edici¢n %s especificada"
|
||||
306 "Vi no se carg¢ con un int‚rprete Perl"
|
||||
307 "No hay comando ex para ejecutar"
|
||||
308 "Ingresar <CR> para ejecutar un comando, :q para salir"
|
||||
309 "Usar \"cscope ayuda\" para obtener ayuda"
|
||||
310 "No hay conexiones cscope corriendo"
|
||||
311 "%s: tipo de b£squeda desconocido: usar uno de %s"
|
||||
312 "%d: no existe esta sesi¢n cscope"
|
||||
313 "determinar: la opci¢n %s no puede conectarse nunca"
|
||||
314 "determinar: la opci¢n %s no puede determinarse nunca en 0"
|
||||
315 "%s: a¤adido: %lu l¡neas, %lu caracteres"
|
||||
316 "Evento inesperado de modificaci¢n de tama¤o"
|
||||
317 "%d archivos para editar"
|
35
contrib/nvi/catalog/spanish.check
Normal file
35
contrib/nvi/catalog/spanish.check
Normal file
@ -0,0 +1,35 @@
|
||||
Unused message id's (this is okay):
|
||||
001
|
||||
047
|
||||
050
|
||||
051
|
||||
052
|
||||
081
|
||||
176
|
||||
229
|
||||
288
|
||||
=========================
|
||||
MISSING ERROR MESSAGES (Please add!):
|
||||
=========================
|
||||
Extra error messages (just delete them):
|
||||
=========================
|
||||
MESSAGES WITH THE SAME MESSAGE ID's (FIX!):
|
||||
=========================
|
||||
Duplicate messages, both id and message (this is okay):
|
||||
2 209 "El archivo est vac¡o"
|
||||
2 304 "Expansi¢n de shell fracasada"
|
||||
=========================
|
||||
Duplicate messages, just message (this is okay):
|
||||
2 %s: %lu l¡neas, %lu caracteresX
|
||||
2 %s: archivo de recuperaci¢n defectuosoX
|
||||
2 Copiando archivo para recuperaci¢n...X
|
||||
2 El buffer %s est vac¡oX
|
||||
2 InterrumpidoX
|
||||
2 Las modificaciones no pueden recuperarse si la sesi¢n fallaX
|
||||
2 No hay patr¢n anterior de b£squedaX
|
||||
2 No se realiza log, no se puede deshacerX
|
||||
2 determinar: opci¢n %s no es booleanoX
|
||||
3 %s: eliminarX
|
||||
3 Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterarX
|
||||
4 Uso: %sX
|
||||
=========================
|
19
contrib/nvi/catalog/spell.ok
Normal file
19
contrib/nvi/catalog/spell.ok
Normal file
@ -0,0 +1,19 @@
|
||||
ARGMAX
|
||||
LC
|
||||
NL
|
||||
XXXX
|
||||
arg1
|
||||
arg2
|
||||
chys
|
||||
english
|
||||
english.base
|
||||
german.base
|
||||
langauge
|
||||
msg
|
||||
msg.c
|
||||
msgcat
|
||||
msgq
|
||||
nvi
|
||||
nvi's
|
||||
pathname
|
||||
sp
|
317
contrib/nvi/catalog/swedish
Normal file
317
contrib/nvi/catalog/swedish
Normal file
@ -0,0 +1,317 @@
|
||||
VI_MESSAGE_CATALOG
|
||||
För långa raderX
|
||||
kan inte ta bort rad %luX
|
||||
kan inte lägga till på rad %luX
|
||||
kan inte sätta in på rad %luX
|
||||
kan inte lagra rad %luX
|
||||
kan inte hämta sista radenX
|
||||
Fel: kan inte hämta rad %luX
|
||||
LoggningsfilX
|
||||
Loggning utförs inte, ångra är inte möjligtX
|
||||
Inga ändringar att ångraX
|
||||
Loggning utförs inte, ångra är inte möjligtX
|
||||
Loggning utförs inte, ångra ångra är inte möjligtX
|
||||
Inga ändringar att återgöraX
|
||||
%s/%d: fel vid loggningX
|
||||
Vi:s standard in och ut måste gå till en terminalX
|
||||
Markering %s: inte sattX
|
||||
Markering %s: raden har tagits bortX
|
||||
Markering %s: markörpositionen finns inte längreX
|
||||
Fel: X
|
||||
ny filX
|
||||
namnet ändradesX
|
||||
ändradX
|
||||
oförändradX
|
||||
OLÅSTX
|
||||
inte skrivbarX
|
||||
rad %lu av %lu [%ld%%]X
|
||||
tom filX
|
||||
rad %luX
|
||||
Filen %s är ingen meddelandekatalogX
|
||||
Kan inte sätta standardvärde för %s flagganX
|
||||
Användning: %sX
|
||||
set: %s är en okänd flagga: "set all" visar alla flaggorX
|
||||
set: [no]%s flaggan kan inte ges ett värdeX
|
||||
set: %s flaggan är inte boleanskX
|
||||
set: %s flaggan: %sX
|
||||
set: %s flaggan: %s: för stort värdeX
|
||||
set: %s flaggan: %s är ett otillåtet talX
|
||||
set: %s flaggan är inte boleanskX
|
||||
Fönsterkolumnerna är för få, mindre än %dX
|
||||
Fönsterkolumnerna är för många, fler än %dX
|
||||
Fönsterraderna är för få, mindre än %dX
|
||||
Fönsterraderna är för många, fler än %dX
|
||||
Lisp flaggan är inte implementeradX
|
||||
meddelanden är inte avslagna: %sX
|
||||
meddelanden är inte påslagna: %sX
|
||||
|
||||
Paragraph flaggan måste ges i teckengrupper om tvåX
|
||||
Section flaggan måste ges i teckengrupper om tvåX
|
||||
|
||||
|
||||
|
||||
Standardbufferten är tomX
|
||||
Buffer %s är tomX
|
||||
Filer med radmatning i namnet kan inte återskapasX
|
||||
Ändringar kan inte återskapas om programmet krascharX
|
||||
Kopierar filen för återskapning...X
|
||||
Säkerhetskopiering misslyckades: %sX
|
||||
Ändringar kan inte återskapas om programmet krascharX
|
||||
Misslyckades att säkerhetskopiera filen: %sX
|
||||
Kopierar filen för återskapning...X
|
||||
Kan inte hitta information om användaridentitet %uX
|
||||
Kan inte låsa återskapningsfilenX
|
||||
Återskapningsfilens buffer överskrivenX
|
||||
ÅterskapningsfilX
|
||||
%s: Återskapningsfilen är korruptX
|
||||
%s: Återskapningsfilen är korruptX
|
||||
Det finns ingen fil %s, läsbar av dig, att återskapaX
|
||||
Det finns äldre versioner av denna fil som du kan återskapaX
|
||||
Det finns andra filer du kan återskapaX
|
||||
skickar inte email: %sX
|
||||
Filen är tom; inget att söka iX
|
||||
Kom till slutet på filen utan att hitta söksträngenX
|
||||
Ingen tidigare söksträngX
|
||||
Hittar inte söksträngenX
|
||||
Kom till början av filen utan att hitta söksträngenX
|
||||
Sökningen slog runtX
|
||||
Söker...X
|
||||
Inga icke skrivbara tecken funnaX
|
||||
Okänt kommandonamnX
|
||||
|
||||
%s: kommandot är inte tillgängligt i "ex" lägeX
|
||||
Talet får inte vara nollX
|
||||
%s: Ogiltig radspecifikationX
|
||||
Fel i intern syntaxtabell (%s: %s)X
|
||||
Användning: %sX
|
||||
%s: temporärbuffert inte frisläpptX
|
||||
Offset är före rad 1X
|
||||
Offset är efter slutet på filenX
|
||||
@ med intervall exekverades när filen/fönstret ändradesX
|
||||
Global/v kommando exekverades när filen/fönstret ändradesX
|
||||
Ex kommando misslyckades: efterföljande kommandon ignoreradeX
|
||||
Ex kommando misslyckades: omdefinierade tangenter ignoreradeX
|
||||
Den andra adressen är mindre än den förstaX
|
||||
Inget namn på markering givetX
|
||||
\\ följs inte av / eller ?X
|
||||
Referens till ett radnummer mindre än 0X
|
||||
%s kommandot är inte käntX
|
||||
Värdet på adressen är för stortX
|
||||
Värdet på adressen är för litetX
|
||||
Otillåten adresskombinationX
|
||||
Otillåten adress: bara %lu rader finns i filenX
|
||||
Otillåten adress: filen är tomX
|
||||
%s kommandot tillåter inte en adress som är 0X
|
||||
Inga förkortningar att visaX
|
||||
Förkortningar måste sluta med ett "ord" teckenX
|
||||
Förkortningar kan inte innehålla mellanslag eller tabX
|
||||
Förkortningar kan inte blanda "ord"/"icke ord" tecken, utom i slutetX
|
||||
"%s" är ingen förkortningX
|
||||
Vi kommando misslyckades: omdefinierade tangenter ignoreradeX
|
||||
Inga fler filer att editeraX
|
||||
Inga tidigare filer att editeraX
|
||||
Inga tidigare filer att spela tillbakaX
|
||||
Ingen fillista att visaX
|
||||
Inget tidigare kommando att ersätta "!" medX
|
||||
Inget filnamn att ersätta %% medX
|
||||
Inget filnamn att ersätta # medX
|
||||
Fel: execl: %sX
|
||||
I/O fel: %sX
|
||||
Filen ändrad efter sista skrivning; spara eller använd !X
|
||||
Kan inte hitta hemkatalogX
|
||||
Ny nuvarande katalog: %sX
|
||||
Inga "cut buffers" att visaX
|
||||
%s kommandot kan inte används som del i ett "global" eller v kommandoX
|
||||
%s/%s: inte läst: varken du eller root är ägareX
|
||||
%s/%s: inte läst: du är inte ägareX
|
||||
%s/%s: inte läst: skrivbar av annan än ägarenX
|
||||
%s: inte läst: varken du eller root är ägareX
|
||||
%s: inte läst: du är inte ägareX
|
||||
%s: inte läst: skrivbar av annan än ägarenX
|
||||
Ingen nästa rad att sätta ihop medX
|
||||
Det finns inget i inmatningsmappningenX
|
||||
Det finns inget i kommandomappningenX
|
||||
%s tecknet kan inte mappas omX
|
||||
"%s" är inte ommappat just nuX
|
||||
Namn på markeringar måste vara ett tecken långaX
|
||||
%s finns, inget sparat; använd ! för att sparaX
|
||||
Ny exrc fil: %sX
|
||||
Målraden ligger inne i området som ska flyttasX
|
||||
Open kommandot kräver att open flaggan är sattX
|
||||
Open kommandot är inte implementerat ännuX
|
||||
Säkerhetskopiering av filen är inte möjligtX
|
||||
Filen säkerhetskopieradX
|
||||
%s expanderade till för många filnamnX
|
||||
Endast vanliga filer och namngivna rör kan läsasX
|
||||
%s: läslåset är otillgängligtX
|
||||
Läser...X
|
||||
%s: %lu rader, %lu teckenX
|
||||
Inga bakgrundsfönster att visaX
|
||||
Script kommandot finns bara i "vi" lägeX
|
||||
Inget kommando att exekveraX
|
||||
shiftwidth flaggan satt till 0X
|
||||
Talet har för stort värdeX
|
||||
Talet har för litet värdeX
|
||||
Reguljärt uttryck är givet; r flaggan är meningslösX
|
||||
#, l och p flaggorna kan inte kombineras med c flaggan i "vi" lägeX
|
||||
Ingen matchande text funnenX
|
||||
Inget tidigare märke har givitsX
|
||||
Det är färre än %s märken i stacken; använd :display t[ags]X
|
||||
Det finns ingen fil %s i märkesstacken; använd :display t[ags]X
|
||||
Tryck Enter för att fortsätta: X
|
||||
%s: märke inte funnetX
|
||||
%s: korrupt märke i %sX
|
||||
%s: märkets radnummer är bortom filslutetX
|
||||
Märkesstacken är tomX
|
||||
%s: söksträngen inte funnenX
|
||||
%d filer till att editeraX
|
||||
Buffert %s är tomX
|
||||
Bekräfta ändring? [n]X
|
||||
AvbrutenX
|
||||
Ingen tidigare buffert att exekveraX
|
||||
Inget tidigare reguljärt uttryckX
|
||||
%s kommandot kräver att en fil redan lästs inX
|
||||
Användning: %sX
|
||||
Visual kommandot kräver att open flaggan är sattX
|
||||
|
||||
Tom filX
|
||||
Ingen tidigare F, f, T eller t sökningX
|
||||
%s inte funnenX
|
||||
Ingen tidigare fil att editeraX
|
||||
Markören är inte i ett talX
|
||||
Det resulterande talet är för stortX
|
||||
Det resulterande talet är för litetX
|
||||
Inget matchande tecken på denna radX
|
||||
Matchande tecken inte funnetX
|
||||
Det finns inga tecken att ersättaX
|
||||
Det finns inget fönster att byta tillX
|
||||
Tecken efter söksträng, radoffset och/eller z kommandotX
|
||||
Ingen tidigare söksträngX
|
||||
Sökningen slog runt till ursprungliga positionenX
|
||||
Förkortning överskred expanderingsgränsen: tecken har tagits bortX
|
||||
Ogiltigt tecken; använd "quote" för att sätta inX
|
||||
Redan i början på insättningenX
|
||||
Inga fler tecken att ta bortX
|
||||
Försök att gå bortom slutet på filenX
|
||||
Försök att gå bortom slutet på radenX
|
||||
Ingen förflyttning gjordX
|
||||
Redan i början på filenX
|
||||
Försök att gå före början på filenX
|
||||
Redan i första kolumnenX
|
||||
Buffertar måste anges före kommandotX
|
||||
Redan i slutet av filenX
|
||||
Redan på slutet av radenX
|
||||
%s är inte ett "vi" kommandoX
|
||||
Användning: %sX
|
||||
Inga tecken att ta bortX
|
||||
Q kommandot kräver "ex" i terminallägeX
|
||||
Inget kommando att repeteraX
|
||||
Filen är tomX
|
||||
%s kan inte användas som ett förflyttningskommandoX
|
||||
Redan i kommando lägeX
|
||||
Markören är inte i ett ordX
|
||||
|
||||
Windows flaggans värde är för stor, största värde är %uX
|
||||
Lägg tillX
|
||||
ÄndraX
|
||||
KommandoX
|
||||
Sätt inX
|
||||
ErsättX
|
||||
Förflyttning bortom fönsterslutX
|
||||
Förflyttning till före fönstrets börjanX
|
||||
Fönstret måste vara större än %d rader för delningX
|
||||
Det finns inga fönster i bakgrundenX
|
||||
Det finns inget fönster i bakgrunden som editerar filen %sX
|
||||
Du får inte sätta ditt enda synliga fönster i bakgrundenX
|
||||
Fönstret kan bara krympa till %d raderX
|
||||
Fönstret kan inte krympaX
|
||||
Fönstret kan inte växaX
|
||||
|
||||
Detta fönster kan inte pausasX
|
||||
Avbrutet: omdefinierade tangenter ignoreradeX
|
||||
vi: temporärbuffertar inte frisläpptaX
|
||||
Denna terminal har ingen %s tangentX
|
||||
Endast en buffert kan angesX
|
||||
Talet är större än %luX
|
||||
AvbrutetX
|
||||
Kan inte skapa temporär filX
|
||||
Warning: %s är inte en normal filX
|
||||
%s är redan låst, detta blir en icke skrivbar sessionX
|
||||
%s: ta bortX
|
||||
%s: stängX
|
||||
%s: ta bortX
|
||||
%s: ta bortX
|
||||
Ej skrivbar fil, filen inte sparad; använd ! för att skriva överX
|
||||
Ej skrivbar fil, filen inte sparadX
|
||||
%s finns, ej sparad; använd ! för att utföra operationenX
|
||||
%s finns, filen inte sparadX
|
||||
Ofullständig fil, filen inte sparad, använd ! för att skriva överX
|
||||
Ofullständig fil, filen inte sparadX
|
||||
%s: filen ändrad efter denna kopia togs; använd ! för att utföra operationenX
|
||||
%s: filen ändrad efter denna kopia togsX
|
||||
%s: skrivlåset är otillgängligtX
|
||||
Skriver...X
|
||||
%s: VARNING: FILEN TRUNKERADX
|
||||
Redan vid första märket i denna gruppX
|
||||
%s: ny fil: %lu rader, %lu teckenX
|
||||
%s: %lu rader, %lu teckenX
|
||||
%s expanderade till för många filnamnX
|
||||
%s är inte en normal filX
|
||||
%s ägs inte av digX
|
||||
%s är åtkomstbar av andra än ägarenX
|
||||
Filen har ändrats efter den sparats; spara eller använd !X
|
||||
Filen har ändrats efter den sparats; spara eller använd :edit!X
|
||||
Filen har ändrats efter den sparats; spara eller använd !X
|
||||
Filen är temporär; exit kastar bort ändringarnaX
|
||||
Ej skrivbar fil, ändringar har inte automatsparatsX
|
||||
Loggningen startar omX
|
||||
bekräfta? [ynq]X
|
||||
Tryck på en tangent för att fortsätta: X
|
||||
Tryck på en tangent för att fortsätta [: för att ge fler kommandon]: X
|
||||
Tryck på en tangent för att fortsätta [q för att avsluta]: X
|
||||
Den formen av %s kräver "ex" i terminallägeX
|
||||
Går till "ex" inmatningsläge.X
|
||||
Kommandot misslyckades, ingen fil inläst ännu.X
|
||||
forts?X
|
||||
Oväntad teckenhändelseX
|
||||
Oväntad filslutshändelseX
|
||||
Sökningen hittade ingentingX
|
||||
Oväntad avbrottshändelseX
|
||||
Oväntad avslutningshändelseX
|
||||
Oväntad omritningshändelseX
|
||||
Redan vid sista märket i denna gruppX
|
||||
%s kommandot kräver "ex" i terminallägeX
|
||||
Den formen av %s är inte tillgänglig när secure edit flaggan är sattX
|
||||
Oväntad stränghändelseX
|
||||
Oväntad tidshändelseX
|
||||
Oväntad skrivhändelseX
|
||||
|
||||
Skalexpansion är inte tillgänglig när secure edit flaggan är sattX
|
||||
%s kommandot är inte tillgänglig när secure edit flaggan är sattX
|
||||
set: %s kan inte slås avX
|
||||
Fönstret för litet.X
|
||||
tillagdaX
|
||||
ändradeX
|
||||
borttagnaX
|
||||
ihopsattaX
|
||||
flyttadeX
|
||||
flyttadeX
|
||||
inklistradeX
|
||||
radX
|
||||
raderX
|
||||
Vi har inte länkats med en Tcl tolkX
|
||||
Filen har ändrats efter den sparats.X
|
||||
Skalexpansion misslyckadesX
|
||||
Ingen %s edit flagga givenX
|
||||
Vi har inte länkats med en Perl tolkX
|
||||
Inga "ex" kommandon att exekveraX
|
||||
Tryck <CR> för att exekvera kommando, :q för att avslutaX
|
||||
Gör "cscope help" för hjälpX
|
||||
Inga cscope kopplingar körsX
|
||||
%s: okänd söktyp: använd en av %sX
|
||||
%d: ingen sådan cscope sessionX
|
||||
set: %s flaggan får aldrig slås påX
|
||||
set: %s flaggan får aldrig sättas till 0X
|
||||
%s: tillagt: %lu rader, %lu teckenX
|
||||
Oväntad storleksändringX
|
||||
%d filer att editeraX
|
307
contrib/nvi/catalog/swedish.base
Normal file
307
contrib/nvi/catalog/swedish.base
Normal file
@ -0,0 +1,307 @@
|
||||
002 "För långa rader"
|
||||
003 "kan inte ta bort rad %lu"
|
||||
004 "kan inte lägga till på rad %lu"
|
||||
005 "kan inte sätta in på rad %lu"
|
||||
006 "kan inte lagra rad %lu"
|
||||
007 "kan inte hämta sista raden"
|
||||
008 "Fel: kan inte hämta rad %lu"
|
||||
009 "Loggningsfil"
|
||||
010 "Loggning utförs inte, ångra är inte möjligt"
|
||||
011 "Inga ändringar att ångra"
|
||||
012 "Loggning utförs inte, ångra är inte möjligt"
|
||||
013 "Loggning utförs inte, ångra ångra är inte möjligt"
|
||||
014 "Inga ändringar att återgöra"
|
||||
015 "%s/%d: fel vid loggning"
|
||||
016 "Vi:s standard in och ut måste gå till en terminal"
|
||||
017 "Markering %s: inte satt"
|
||||
018 "Markering %s: raden har tagits bort"
|
||||
019 "Markering %s: markörpositionen finns inte längre"
|
||||
020 "Fel: "
|
||||
021 "ny fil"
|
||||
022 "namnet ändrades"
|
||||
023 "ändrad"
|
||||
024 "oförändrad"
|
||||
025 "OLÅST"
|
||||
026 "inte skrivbar"
|
||||
027 "rad %lu av %lu [%ld%%]"
|
||||
028 "tom fil"
|
||||
029 "rad %lu"
|
||||
030 "Filen %s är ingen meddelandekatalog"
|
||||
031 "Kan inte sätta standardvärde för %s flaggan"
|
||||
032 "Användning: %s"
|
||||
033 "set: %s är en okänd flagga: "set all" visar alla flaggor"
|
||||
034 "set: [no]%s flaggan kan inte ges ett värde"
|
||||
035 "set: %s flaggan är inte boleansk"
|
||||
036 "set: %s flaggan: %s"
|
||||
037 "set: %s flaggan: %s: för stort värde"
|
||||
038 "set: %s flaggan: %s är ett otillåtet tal"
|
||||
039 "set: %s flaggan är inte boleansk"
|
||||
040 "Fönsterkolumnerna är för få, mindre än %d"
|
||||
041 "Fönsterkolumnerna är för många, fler än %d"
|
||||
042 "Fönsterraderna är för få, mindre än %d"
|
||||
043 "Fönsterraderna är för många, fler än %d"
|
||||
044 "Lisp flaggan är inte implementerad"
|
||||
045 "meddelanden är inte avslagna: %s"
|
||||
046 "meddelanden är inte påslagna: %s"
|
||||
048 "Paragraph flaggan måste ges i teckengrupper om två"
|
||||
049 "Section flaggan måste ges i teckengrupper om två"
|
||||
053 "Standardbufferten är tom"
|
||||
054 "Buffer %s är tom"
|
||||
055 "Filer med radmatning i namnet kan inte återskapas"
|
||||
056 "Ändringar kan inte återskapas om programmet kraschar"
|
||||
057 "Kopierar filen för återskapning..."
|
||||
058 "Säkerhetskopiering misslyckades: %s"
|
||||
059 "Ändringar kan inte återskapas om programmet kraschar"
|
||||
060 "Misslyckades att säkerhetskopiera filen: %s"
|
||||
061 "Kopierar filen för återskapning..."
|
||||
062 "Kan inte hitta information om användaridentitet %u"
|
||||
063 "Kan inte låsa återskapningsfilen"
|
||||
064 "Återskapningsfilens buffer överskriven"
|
||||
065 "Återskapningsfil"
|
||||
066 "%s: Återskapningsfilen är korrupt"
|
||||
067 "%s: Återskapningsfilen är korrupt"
|
||||
068 "Det finns ingen fil %s, läsbar av dig, att återskapa"
|
||||
069 "Det finns äldre versioner av denna fil som du kan återskapa"
|
||||
070 "Det finns andra filer du kan återskapa"
|
||||
071 "skickar inte email: %s"
|
||||
072 "Filen är tom; inget att söka i"
|
||||
073 "Kom till slutet på filen utan att hitta söksträngen"
|
||||
074 "Ingen tidigare söksträng"
|
||||
075 "Hittar inte söksträngen"
|
||||
076 "Kom till början av filen utan att hitta söksträngen"
|
||||
077 "Sökningen slog runt"
|
||||
078 "Söker..."
|
||||
079 "Inga icke skrivbara tecken funna"
|
||||
080 "Okänt kommandonamn"
|
||||
082 "%s: kommandot är inte tillgängligt i "ex" läge"
|
||||
083 "Talet får inte vara noll"
|
||||
084 "%s: Ogiltig radspecifikation"
|
||||
085 "Fel i intern syntaxtabell (%s: %s)"
|
||||
086 "Användning: %s"
|
||||
087 "%s: temporärbuffert inte frisläppt"
|
||||
088 "Offset är före rad 1"
|
||||
089 "Offset är efter slutet på filen"
|
||||
090 "@ med intervall exekverades när filen/fönstret ändrades"
|
||||
091 "Global/v kommando exekverades när filen/fönstret ändrades"
|
||||
092 "Ex kommando misslyckades: efterföljande kommandon ignorerade"
|
||||
093 "Ex kommando misslyckades: omdefinierade tangenter ignorerade"
|
||||
094 "Den andra adressen är mindre än den första"
|
||||
095 "Inget namn på markering givet"
|
||||
096 "\\ följs inte av / eller ?"
|
||||
097 "Referens till ett radnummer mindre än 0"
|
||||
098 "%s kommandot är inte känt"
|
||||
099 "Värdet på adressen är för stort"
|
||||
100 "Värdet på adressen är för litet"
|
||||
101 "Otillåten adresskombination"
|
||||
102 "Otillåten adress: bara %lu rader finns i filen"
|
||||
103 "Otillåten adress: filen är tom"
|
||||
104 "%s kommandot tillåter inte en adress som är 0"
|
||||
105 "Inga förkortningar att visa"
|
||||
106 "Förkortningar måste sluta med ett "ord" tecken"
|
||||
107 "Förkortningar kan inte innehålla mellanslag eller tab"
|
||||
108 "Förkortningar kan inte blanda "ord"/"icke ord" tecken, utom i slutet"
|
||||
109 ""%s" är ingen förkortning"
|
||||
110 "Vi kommando misslyckades: omdefinierade tangenter ignorerade"
|
||||
111 "Inga fler filer att editera"
|
||||
112 "Inga tidigare filer att editera"
|
||||
113 "Inga tidigare filer att spela tillbaka"
|
||||
114 "Ingen fillista att visa"
|
||||
115 "Inget tidigare kommando att ersätta "!" med"
|
||||
116 "Inget filnamn att ersätta %% med"
|
||||
117 "Inget filnamn att ersätta # med"
|
||||
118 "Fel: execl: %s"
|
||||
119 "I/O fel: %s"
|
||||
120 "Filen ändrad efter sista skrivning; spara eller använd !"
|
||||
121 "Kan inte hitta hemkatalog"
|
||||
122 "Ny nuvarande katalog: %s"
|
||||
123 "Inga "cut buffers" att visa"
|
||||
124 "%s kommandot kan inte används som del i ett "global" eller v kommando"
|
||||
125 "%s/%s: inte läst: varken du eller root är ägare"
|
||||
126 "%s/%s: inte läst: du är inte ägare"
|
||||
127 "%s/%s: inte läst: skrivbar av annan än ägaren"
|
||||
128 "%s: inte läst: varken du eller root är ägare"
|
||||
129 "%s: inte läst: du är inte ägare"
|
||||
130 "%s: inte läst: skrivbar av annan än ägaren"
|
||||
131 "Ingen nästa rad att sätta ihop med"
|
||||
132 "Det finns inget i inmatningsmappningen"
|
||||
133 "Det finns inget i kommandomappningen"
|
||||
134 "%s tecknet kan inte mappas om"
|
||||
135 ""%s" är inte ommappat just nu"
|
||||
136 "Namn på markeringar måste vara ett tecken långa"
|
||||
137 "%s finns, inget sparat; använd ! för att spara"
|
||||
138 "Ny exrc fil: %s"
|
||||
139 "Målraden ligger inne i området som ska flyttas"
|
||||
140 "Open kommandot kräver att open flaggan är satt"
|
||||
141 "Open kommandot är inte implementerat ännu"
|
||||
142 "Säkerhetskopiering av filen är inte möjligt"
|
||||
143 "Filen säkerhetskopierad"
|
||||
144 "%s expanderade till för många filnamn"
|
||||
145 "Endast vanliga filer och namngivna rör kan läsas"
|
||||
146 "%s: läslåset är otillgängligt"
|
||||
147 "Läser..."
|
||||
148 "%s: %lu rader, %lu tecken"
|
||||
149 "Inga bakgrundsfönster att visa"
|
||||
150 "Script kommandot finns bara i "vi" läge"
|
||||
151 "Inget kommando att exekvera"
|
||||
152 "shiftwidth flaggan satt till 0"
|
||||
153 "Talet har för stort värde"
|
||||
154 "Talet har för litet värde"
|
||||
155 "Reguljärt uttryck är givet; r flaggan är meningslös"
|
||||
156 "#, l och p flaggorna kan inte kombineras med c flaggan i "vi" läge"
|
||||
157 "Ingen matchande text funnen"
|
||||
158 "Inget tidigare märke har givits"
|
||||
159 "Det är färre än %s märken i stacken; använd :display t[ags]"
|
||||
160 "Det finns ingen fil %s i märkesstacken; använd :display t[ags]"
|
||||
161 "Tryck Enter för att fortsätta: "
|
||||
162 "%s: märke inte funnet"
|
||||
163 "%s: korrupt märke i %s"
|
||||
164 "%s: märkets radnummer är bortom filslutet"
|
||||
165 "Märkesstacken är tom"
|
||||
166 "%s: söksträngen inte funnen"
|
||||
167 "%d filer till att editera"
|
||||
168 "Buffert %s är tom"
|
||||
169 "Bekräfta ändring? [n]"
|
||||
170 "Avbruten"
|
||||
171 "Ingen tidigare buffert att exekvera"
|
||||
172 "Inget tidigare reguljärt uttryck"
|
||||
173 "%s kommandot kräver att en fil redan lästs in"
|
||||
174 "Användning: %s"
|
||||
175 "Visual kommandot kräver att open flaggan är satt"
|
||||
177 "Tom fil"
|
||||
178 "Ingen tidigare F, f, T eller t sökning"
|
||||
179 "%s inte funnen"
|
||||
180 "Ingen tidigare fil att editera"
|
||||
181 "Markören är inte i ett tal"
|
||||
182 "Det resulterande talet är för stort"
|
||||
183 "Det resulterande talet är för litet"
|
||||
184 "Inget matchande tecken på denna rad"
|
||||
185 "Matchande tecken inte funnet"
|
||||
186 "Det finns inga tecken att ersätta"
|
||||
187 "Det finns inget fönster att byta till"
|
||||
188 "Tecken efter söksträng, radoffset och/eller z kommandot"
|
||||
189 "Ingen tidigare söksträng"
|
||||
190 "Sökningen slog runt till ursprungliga positionen"
|
||||
191 "Förkortning överskred expanderingsgränsen: tecken har tagits bort"
|
||||
192 "Ogiltigt tecken; använd "quote" för att sätta in"
|
||||
193 "Redan i början på insättningen"
|
||||
194 "Inga fler tecken att ta bort"
|
||||
195 "Försök att gå bortom slutet på filen"
|
||||
196 "Försök att gå bortom slutet på raden"
|
||||
197 "Ingen förflyttning gjord"
|
||||
198 "Redan i början på filen"
|
||||
199 "Försök att gå före början på filen"
|
||||
200 "Redan i första kolumnen"
|
||||
201 "Buffertar måste anges före kommandot"
|
||||
202 "Redan i slutet av filen"
|
||||
203 "Redan på slutet av raden"
|
||||
204 "%s är inte ett "vi" kommando"
|
||||
205 "Användning: %s"
|
||||
206 "Inga tecken att ta bort"
|
||||
207 "Q kommandot kräver "ex" i terminalläge"
|
||||
208 "Inget kommando att repetera"
|
||||
209 "Filen är tom"
|
||||
210 "%s kan inte användas som ett förflyttningskommando"
|
||||
211 "Redan i kommando läge"
|
||||
212 "Markören är inte i ett ord"
|
||||
214 "Windows flaggans värde är för stor, största värde är %u"
|
||||
215 "Lägg till"
|
||||
216 "Ändra"
|
||||
217 "Kommando"
|
||||
218 "Sätt in"
|
||||
219 "Ersätt"
|
||||
220 "Förflyttning bortom fönsterslut"
|
||||
221 "Förflyttning till före fönstrets början"
|
||||
222 "Fönstret måste vara större än %d rader för delning"
|
||||
223 "Det finns inga fönster i bakgrunden"
|
||||
224 "Det finns inget fönster i bakgrunden som editerar filen %s"
|
||||
225 "Du får inte sätta ditt enda synliga fönster i bakgrunden"
|
||||
226 "Fönstret kan bara krympa till %d rader"
|
||||
227 "Fönstret kan inte krympa"
|
||||
228 "Fönstret kan inte växa"
|
||||
230 "Detta fönster kan inte pausas"
|
||||
231 "Avbrutet: omdefinierade tangenter ignorerade"
|
||||
232 "vi: temporärbuffertar inte frisläppta"
|
||||
233 "Denna terminal har ingen %s tangent"
|
||||
234 "Endast en buffert kan anges"
|
||||
235 "Talet är större än %lu"
|
||||
236 "Avbrutet"
|
||||
237 "Kan inte skapa temporär fil"
|
||||
238 "Warning: %s är inte en normal fil"
|
||||
239 "%s är redan låst, detta blir en icke skrivbar session"
|
||||
240 "%s: ta bort"
|
||||
241 "%s: stäng"
|
||||
242 "%s: ta bort"
|
||||
243 "%s: ta bort"
|
||||
244 "Ej skrivbar fil, filen inte sparad; använd ! för att skriva över"
|
||||
245 "Ej skrivbar fil, filen inte sparad"
|
||||
246 "%s finns, ej sparad; använd ! för att utföra operationen"
|
||||
247 "%s finns, filen inte sparad"
|
||||
248 "Ofullständig fil, filen inte sparad, använd ! för att skriva över"
|
||||
249 "Ofullständig fil, filen inte sparad"
|
||||
250 "%s: filen ändrad efter denna kopia togs; använd ! för att utföra operationen"
|
||||
251 "%s: filen ändrad efter denna kopia togs"
|
||||
252 "%s: skrivlåset är otillgängligt"
|
||||
253 "Skriver..."
|
||||
254 "%s: VARNING: FILEN TRUNKERAD"
|
||||
255 "Redan vid första märket i denna grupp"
|
||||
256 "%s: ny fil: %lu rader, %lu tecken"
|
||||
257 "%s: %lu rader, %lu tecken"
|
||||
258 "%s expanderade till för många filnamn"
|
||||
259 "%s är inte en normal fil"
|
||||
260 "%s ägs inte av dig"
|
||||
261 "%s är åtkomstbar av andra än ägaren"
|
||||
262 "Filen har ändrats efter den sparats; spara eller använd !"
|
||||
263 "Filen har ändrats efter den sparats; spara eller använd :edit!"
|
||||
264 "Filen har ändrats efter den sparats; spara eller använd !"
|
||||
265 "Filen är temporär; exit kastar bort ändringarna"
|
||||
266 "Ej skrivbar fil, ändringar har inte automatsparats"
|
||||
267 "Loggningen startar om"
|
||||
268 "bekräfta? [ynq]"
|
||||
269 "Tryck på en tangent för att fortsätta: "
|
||||
270 "Tryck på en tangent för att fortsätta [: för att ge fler kommandon]: "
|
||||
271 "Tryck på en tangent för att fortsätta [q för att avsluta]: "
|
||||
272 "Den formen av %s kräver "ex" i terminalläge"
|
||||
273 "Går till "ex" inmatningsläge."
|
||||
274 "Kommandot misslyckades, ingen fil inläst ännu."
|
||||
275 " forts?"
|
||||
276 "Oväntad teckenhändelse"
|
||||
277 "Oväntad filslutshändelse"
|
||||
278 "Sökningen hittade ingenting"
|
||||
279 "Oväntad avbrottshändelse"
|
||||
280 "Oväntad avslutningshändelse"
|
||||
281 "Oväntad omritningshändelse"
|
||||
282 "Redan vid sista märket i denna grupp"
|
||||
283 "%s kommandot kräver "ex" i terminalläge"
|
||||
284 "Den formen av %s är inte tillgänglig när secure edit flaggan är satt"
|
||||
285 "Oväntad stränghändelse"
|
||||
286 "Oväntad tidshändelse"
|
||||
287 "Oväntad skrivhändelse"
|
||||
289 "Skalexpansion är inte tillgänglig när secure edit flaggan är satt"
|
||||
290 "%s kommandot är inte tillgänglig när secure edit flaggan är satt"
|
||||
291 "set: %s kan inte slås av"
|
||||
292 "Fönstret för litet."
|
||||
293 "tillagda"
|
||||
294 "ändrade"
|
||||
295 "borttagna"
|
||||
296 "ihopsatta"
|
||||
297 "flyttade"
|
||||
298 "flyttade"
|
||||
299 "inklistrade"
|
||||
300 "rad"
|
||||
301 "rader"
|
||||
302 "Vi har inte länkats med en Tcl tolk"
|
||||
303 "Filen har ändrats efter den sparats."
|
||||
304 "Skalexpansion misslyckades"
|
||||
305 "Ingen %s edit flagga given"
|
||||
306 "Vi har inte länkats med en Perl tolk"
|
||||
307 "Inga "ex" kommandon att exekvera"
|
||||
308 "Tryck <CR> för att exekvera kommando, :q för att avsluta"
|
||||
309 "Gör "cscope help" för hjälp"
|
||||
310 "Inga cscope kopplingar körs"
|
||||
311 "%s: okänd söktyp: använd en av %s"
|
||||
312 "%d: ingen sådan cscope session"
|
||||
313 "set: %s flaggan får aldrig slås på"
|
||||
314 "set: %s flaggan får aldrig sättas till 0"
|
||||
315 "%s: tillagt: %lu rader, %lu tecken"
|
||||
316 "Oväntad storleksändring"
|
||||
317 "%d filer att editera"
|
34
contrib/nvi/catalog/swedish.check
Normal file
34
contrib/nvi/catalog/swedish.check
Normal file
@ -0,0 +1,34 @@
|
||||
Unused message id's (this is okay):
|
||||
001
|
||||
047
|
||||
050
|
||||
051
|
||||
052
|
||||
081
|
||||
176
|
||||
213
|
||||
229
|
||||
288
|
||||
=========================
|
||||
MISSING ERROR MESSAGES (Please add!):
|
||||
=========================
|
||||
Extra error messages (just delete them):
|
||||
=========================
|
||||
MESSAGES WITH THE SAME MESSAGE ID's (FIX!):
|
||||
=========================
|
||||
Duplicate messages, both id and message (this is okay):
|
||||
=========================
|
||||
Duplicate messages, just message (this is okay):
|
||||
2 %s expanderade till för många filnamnX
|
||||
2 %s: %lu rader, %lu teckenX
|
||||
2 %s: Återskapningsfilen är korruptX
|
||||
2 Filen har ändrats efter den sparats; spara eller använd !X
|
||||
2 Ingen tidigare söksträngX
|
||||
2 Kopierar filen för återskapning...X
|
||||
2 Loggning utförs inte, ångra är inte möjligtX
|
||||
2 flyttadeX
|
||||
2 set: %s flaggan är inte boleanskX
|
||||
2 Ändringar kan inte återskapas om programmet krascharX
|
||||
3 %s: ta bortX
|
||||
4 Användning: %sX
|
||||
=========================
|
1
contrib/nvi/catalog/swedish.owner
Normal file
1
contrib/nvi/catalog/swedish.owner
Normal file
@ -0,0 +1 @@
|
||||
Jan Djarv <jan.djarv@mbox200.swipnet.se>
|
174
contrib/nvi/cl/README.signal
Normal file
174
contrib/nvi/cl/README.signal
Normal file
@ -0,0 +1,174 @@
|
||||
# @(#)README.signal 10.1 (Berkeley) 6/23/95
|
||||
|
||||
There are six (normally) asynchronous actions about which vi cares:
|
||||
SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGTSTP and SIGWINCH.
|
||||
|
||||
The assumptions:
|
||||
1: The DB routines are not reentrant.
|
||||
2: The curses routines may not be reentrant.
|
||||
3: Neither DB nor curses will restart system calls.
|
||||
|
||||
XXX
|
||||
Note, most C library functions don't restart system calls. So, we should
|
||||
*probably* start blocking around any imported function that we don't know
|
||||
doesn't make a system call. This is going to be a genuine annoyance...
|
||||
|
||||
SIGHUP, SIGTERM
|
||||
Used for file recovery. The DB routines can't be reentered, nor
|
||||
can they handle interrupted system calls, so the vi routines that
|
||||
call DB block signals. This means that DB routines could be
|
||||
called at interrupt time, if necessary.
|
||||
|
||||
SIGQUIT
|
||||
Disabled by the signal initialization routines. Historically, ^\
|
||||
switched vi into ex mode, and we continue that practice.
|
||||
|
||||
SIGWINCH:
|
||||
The interrupt routine sets a global bit which is checked by the
|
||||
key-read routine, so there are no reentrancy issues. This means
|
||||
that the screen will not resize until vi runs out of keys, but
|
||||
that doesn't seem like a problem.
|
||||
|
||||
SIGINT and SIGTSTP are a much more difficult issue to resolve. Vi has
|
||||
to permit the user to interrupt long-running operations. Generally, a
|
||||
search, substitution or read/write is done on a large file, or, the user
|
||||
creates a key mapping with an infinite loop. This problem will become
|
||||
worse as more complex semantics are added to vi, especially things like
|
||||
making it a pure text widget. There are four major solutions on the table,
|
||||
each of which have minor permutations.
|
||||
|
||||
1: Run in raw mode.
|
||||
|
||||
The up side is that there's no asynchronous behavior to worry about,
|
||||
and obviously no reentrancy problems. The down side is that it's easy
|
||||
to misinterpret characters (e.g. :w big_file^Mi^V^C is going to look
|
||||
like an interrupt) and it's easy to get into places where we won't see
|
||||
interrupt characters (e.g. ":map a ixx^[hxxaXXX" infinitely loops in
|
||||
historic implementations of vi). Periodically reading the terminal
|
||||
input buffer might solve the latter problem, but it's not going to be
|
||||
pretty.
|
||||
|
||||
Also, we're going to be checking for ^C's and ^Z's both, all over
|
||||
the place -- I hate to litter the source code with that. For example,
|
||||
the historic version of vi didn't permit you to suspend the screen if
|
||||
you were on the colon command line. This isn't right. ^Z isn't a vi
|
||||
command, it's a terminal event. (Dammit.)
|
||||
|
||||
2: Run in cbreak mode. There are two problems in this area. First, the
|
||||
current curses implementations (both System V and Berkeley) don't give
|
||||
you clean cbreak modes. For example, the IEXTEN bit is left on, turning
|
||||
on DISCARD and LNEXT. To clarify, what vi WANTS is 8-bit clean, with
|
||||
the exception that flow control and signals are turned on, and curses
|
||||
cbreak mode doesn't give you this.
|
||||
|
||||
We can either set raw mode and twiddle the tty, or cbreak mode and
|
||||
twiddle the tty. I chose to use raw mode, on the grounds that raw
|
||||
mode is better defined and I'm less likely to be surprised by a curses
|
||||
implementation down the road. The twiddling consists of setting ISIG,
|
||||
IXON/IXOFF, and disabling some of the interrupt characters (see the
|
||||
comments in cl_init.c). This is all found in historic System V (SVID
|
||||
3) and POSIX 1003.1-1992, so it should be fairly portable.
|
||||
|
||||
The second problem is that vi permits you to enter literal signal
|
||||
characters, e.g. ^V^C. There are two possible solutions. First, you
|
||||
can turn off signals when you get a ^V, but that means that a network
|
||||
packet containing ^V and ^C will lose, since the ^C may take effect
|
||||
before vi reads the ^V. (This is particularly problematic if you're
|
||||
talking over a protocol that recognizes signals locally and sends OOB
|
||||
packets when it sees them.) Second, you can turn the ^C into a literal
|
||||
character in vi, but that means that there's a race between entering
|
||||
^V<character>^C, i.e. the sequence may end up being ^V^C<character>.
|
||||
Also, the second solution doesn't work for flow control characters, as
|
||||
they aren't delivered to the program as signals.
|
||||
|
||||
Generally, this is what historic vi did. (It didn't have the curses
|
||||
problems because it didn't use curses.) It entered signals following
|
||||
^V characters into the input stream, (which is why there's no way to
|
||||
enter a literal flow control character).
|
||||
|
||||
3: Run in mostly raw mode; turn signals on when doing an operation the
|
||||
user might want to interrupt, but leave them off most of the time.
|
||||
|
||||
This works well for things like file reads and writes. This doesn't
|
||||
work well for trying to detect infinite maps. The problem is that
|
||||
you can write the code so that you don't have to turn on interrupts
|
||||
per keystroke, but the code isn't pretty and it's hard to make sure
|
||||
that an optimization doesn't cover up an infinite loop. This also
|
||||
requires interaction or state between the vi parser and the key
|
||||
reading routines, as an infinite loop may still be returning keys
|
||||
to the parser.
|
||||
|
||||
Also, if the user inserts an interrupt into the tty queue while the
|
||||
interrupts are turned off, the key won't be treated as an interrupt,
|
||||
and requiring the user to pound the keyboard to catch an interrupt
|
||||
window is nasty.
|
||||
|
||||
4: Run in mostly raw mode, leaving signals on all of the time. Done
|
||||
by setting raw mode, and twiddling the tty's termios ISIG bit.
|
||||
|
||||
This works well for the interrupt cases, because the code only has
|
||||
to check to see if the interrupt flag has been set, and can otherwise
|
||||
ignore signals. It's also less likely that we'll miss a case, and we
|
||||
don't have to worry about synchronizing between the vi parser and the
|
||||
key read routines.
|
||||
|
||||
The down side is that we have to turn signals off if the user wants
|
||||
to enter a literal character (e.g. ^V^C). If the user enters the
|
||||
combination fast enough, or as part of a single network packet,
|
||||
the text input routines will treat it as a signal instead of as a
|
||||
literal character. To some extent, we have this problem already,
|
||||
since we turn off flow control so that the user can enter literal
|
||||
XON/XOFF characters.
|
||||
|
||||
This is probably the easiest to code, and provides the smoothest
|
||||
programming interface.
|
||||
|
||||
There are a couple of other problems to consider.
|
||||
|
||||
First, System V's curses doesn't handle SIGTSTP correctly. If you use the
|
||||
newterm() interface, the TSTP signal will leave you in raw mode, and the
|
||||
final endwin() will leave you in the correct shell mode. If you use the
|
||||
initscr() interface, the TSTP signal will return you to the correct shell
|
||||
mode, but the final endwin() will leave you in raw mode. There you have
|
||||
it: proof that drug testing is not making any significant headway in the
|
||||
computer industry. The 4BSD curses is deficient in that it does not have
|
||||
an interface to the terminal keypad. So, regardless, we have to do our
|
||||
own SIGTSTP handling.
|
||||
|
||||
The problem with this is that if we do our own SIGTSTP handling, in either
|
||||
models #3 or #4, we're going to have to call curses routines at interrupt
|
||||
time, which means that we might be reentering curses, which is something we
|
||||
don't want to do.
|
||||
|
||||
Second, SIGTSTP has its own little problems. It's broadcast to the entire
|
||||
process group, not sent to a single process. The scenario goes something
|
||||
like this: the shell execs the mail program, which execs vi. The user hits
|
||||
^Z, and all three programs get the signal, in some random order. The mail
|
||||
program goes to sleep immediately (since it probably didn't have a SIGTSTP
|
||||
handler in place). The shell gets a SIGCHLD, does a wait, and finds out
|
||||
that the only child in its foreground process group (of which it's aware)
|
||||
is asleep. It then optionally resets the terminal (because the modes aren't
|
||||
how it left them), and starts prompting the user for input. The problem is
|
||||
that somewhere in the middle of all of this, vi is resetting the terminal,
|
||||
and getting ready to send a SIGTSTP to the process group in order to put
|
||||
itself to sleep. There's a solution to all of this: when vi starts, it puts
|
||||
itself into its own process group, and then only it (and possible child
|
||||
processes) receive the SIGTSTP. This permits it to clean up the terminal
|
||||
and switch back to the original process group, where it sends that process
|
||||
group a SIGTSTP, putting everyone to sleep and waking the shell.
|
||||
|
||||
Third, handing SIGTSTP asynchronously is further complicated by the child
|
||||
processes vi may fork off. If vi calls ex, ex resets the terminal and
|
||||
starts running some filter, and SIGTSTP stops them both, vi has to know
|
||||
when it restarts that it can't repaint the screen until ex's child has
|
||||
finished running. This is solveable, but it's annoying.
|
||||
|
||||
Well, somebody had to make a decision, and this is the way it's going to be
|
||||
(unless I get talked out of it). SIGINT is handled asynchronously, so
|
||||
that we can pretty much guarantee that the user can interrupt any operation
|
||||
at any time. SIGTSTP is handled synchronously, so that we don't have to
|
||||
reenter curses and so that we don't have to play the process group games.
|
||||
^Z is recognized in the standard text input and command modes. (^Z should
|
||||
also be recognized during operations that may potentially take a long time.
|
||||
The simplest solution is probably to twiddle the tty, install a handler for
|
||||
SIGTSTP, and then restore normal tty modes when the operation is complete.)
|
78
contrib/nvi/cl/cl.h
Normal file
78
contrib/nvi/cl/cl.h
Normal file
@ -0,0 +1,78 @@
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*
|
||||
* @(#)cl.h 10.19 (Berkeley) 9/24/96
|
||||
*/
|
||||
|
||||
typedef struct _cl_private {
|
||||
CHAR_T ibuf[256]; /* Input keys. */
|
||||
|
||||
int eof_count; /* EOF count. */
|
||||
|
||||
struct termios orig; /* Original terminal values. */
|
||||
struct termios ex_enter;/* Terminal values to enter ex. */
|
||||
struct termios vi_enter;/* Terminal values to enter vi. */
|
||||
|
||||
char *el; /* Clear to EOL terminal string. */
|
||||
char *cup; /* Cursor movement terminal string. */
|
||||
char *cuu1; /* Cursor up terminal string. */
|
||||
char *rmso, *smso; /* Inverse video terminal strings. */
|
||||
char *smcup, *rmcup; /* Terminal start/stop strings. */
|
||||
|
||||
int killersig; /* Killer signal. */
|
||||
#define INDX_HUP 0
|
||||
#define INDX_INT 1
|
||||
#define INDX_TERM 2
|
||||
#define INDX_WINCH 3
|
||||
#define INDX_MAX 4 /* Original signal information. */
|
||||
struct sigaction oact[INDX_MAX];
|
||||
|
||||
enum { /* Tty group write mode. */
|
||||
TGW_UNKNOWN=0, TGW_SET, TGW_UNSET } tgw;
|
||||
|
||||
enum { /* Terminal initialization strings. */
|
||||
TE_SENT=0, TI_SENT } ti_te;
|
||||
|
||||
#define CL_IN_EX 0x0001 /* Currently running ex. */
|
||||
#define CL_RENAME 0x0002 /* X11 xterm icon/window renamed. */
|
||||
#define CL_RENAME_OK 0x0004 /* User wants the windows renamed. */
|
||||
#define CL_SCR_EX_INIT 0x0008 /* Ex screen initialized. */
|
||||
#define CL_SCR_VI_INIT 0x0010 /* Vi screen initialized. */
|
||||
#define CL_SIGHUP 0x0020 /* SIGHUP arrived. */
|
||||
#define CL_SIGINT 0x0040 /* SIGINT arrived. */
|
||||
#define CL_SIGTERM 0x0080 /* SIGTERM arrived. */
|
||||
#define CL_SIGWINCH 0x0100 /* SIGWINCH arrived. */
|
||||
#define CL_STDIN_TTY 0x0200 /* Talking to a terminal. */
|
||||
u_int32_t flags;
|
||||
} CL_PRIVATE;
|
||||
|
||||
#define CLP(sp) ((CL_PRIVATE *)((sp)->gp->cl_private))
|
||||
#define GCLP(gp) ((CL_PRIVATE *)gp->cl_private)
|
||||
|
||||
/* Return possibilities from the keyboard read routine. */
|
||||
typedef enum { INP_OK=0, INP_EOF, INP_ERR, INP_INTR, INP_TIMEOUT } input_t;
|
||||
|
||||
/* The screen line relative to a specific window. */
|
||||
#define RLNO(sp, lno) (sp)->woff + (lno)
|
||||
|
||||
/* X11 xterm escape sequence to rename the icon/window. */
|
||||
#define XTERM_RENAME "\033]0;%s\007"
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* Some implementations of curses.h don't define these for us. Used for
|
||||
* compatibility only.
|
||||
*/
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
#include "cl_extern.h"
|
345
contrib/nvi/cl/cl_bsd.c
Normal file
345
contrib/nvi/cl/cl_bsd.c
Normal file
@ -0,0 +1,345 @@
|
||||
/*-
|
||||
* Copyright (c) 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)cl_bsd.c 8.29 (Berkeley) 7/1/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <ctype.h>
|
||||
#include <curses.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../common/common.h"
|
||||
#include "../vi/vi.h"
|
||||
#include "cl.h"
|
||||
|
||||
static char *ke; /* Keypad on. */
|
||||
static char *ks; /* Keypad off. */
|
||||
static char *vb; /* Visible bell string. */
|
||||
|
||||
/*
|
||||
* HP's support the entire System V curses package except for the tigetstr
|
||||
* and tigetnum functions. Ultrix supports the BSD curses package except
|
||||
* for the idlok function. Cthulu only knows why. Break things up into a
|
||||
* minimal set of functions.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_CURSES_ADDNSTR
|
||||
/*
|
||||
* addnstr --
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_CURSES_ADDNSTR
|
||||
* PUBLIC: int addnstr __P((char *, int));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
addnstr(s, n)
|
||||
char *s;
|
||||
int n;
|
||||
{
|
||||
int ch;
|
||||
|
||||
while (n-- && (ch = *s++))
|
||||
addch(ch);
|
||||
return (OK);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_CURSES_BEEP
|
||||
/*
|
||||
* beep --
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_CURSES_BEEP
|
||||
* PUBLIC: void beep __P((void));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
void
|
||||
beep()
|
||||
{
|
||||
(void)write(1, "\007", 1); /* '\a' */
|
||||
}
|
||||
#endif /* !HAVE_CURSES_BEEP */
|
||||
|
||||
#ifndef HAVE_CURSES_FLASH
|
||||
/*
|
||||
* flash --
|
||||
* Flash the screen.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_CURSES_FLASH
|
||||
* PUBLIC: void flash __P((void));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
void
|
||||
flash()
|
||||
{
|
||||
if (vb != NULL) {
|
||||
(void)tputs(vb, 1, cl_putchar);
|
||||
(void)fflush(stdout);
|
||||
} else
|
||||
beep();
|
||||
}
|
||||
#endif /* !HAVE_CURSES_FLASH */
|
||||
|
||||
#ifndef HAVE_CURSES_IDLOK
|
||||
/*
|
||||
* idlok --
|
||||
* Turn on/off hardware line insert/delete.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_CURSES_IDLOK
|
||||
* PUBLIC: void idlok __P((WINDOW *, int));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
void
|
||||
idlok(win, bf)
|
||||
WINDOW *win;
|
||||
int bf;
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif /* !HAVE_CURSES_IDLOK */
|
||||
|
||||
#ifndef HAVE_CURSES_KEYPAD
|
||||
/*
|
||||
* keypad --
|
||||
* Put the keypad/cursor arrows into or out of application mode.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_CURSES_KEYPAD
|
||||
* PUBLIC: int keypad __P((void *, int));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
keypad(a, on)
|
||||
void *a;
|
||||
int on;
|
||||
{
|
||||
char *p;
|
||||
|
||||
if ((p = tigetstr(on ? "smkx" : "rmkx")) != (char *)-1) {
|
||||
(void)tputs(p, 0, cl_putchar);
|
||||
(void)fflush(stdout);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
#endif /* !HAVE_CURSES_KEYPAD */
|
||||
|
||||
#ifndef HAVE_CURSES_NEWTERM
|
||||
/*
|
||||
* newterm --
|
||||
* Create a new curses screen.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_CURSES_NEWTERM
|
||||
* PUBLIC: void *newterm __P((const char *, FILE *, FILE *));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
void *
|
||||
newterm(a, b, c)
|
||||
const char *a;
|
||||
FILE *b, *c;
|
||||
{
|
||||
return (initscr());
|
||||
}
|
||||
#endif /* !HAVE_CURSES_NEWTERM */
|
||||
|
||||
#ifndef HAVE_CURSES_SETUPTERM
|
||||
/*
|
||||
* setupterm --
|
||||
* Set up terminal.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_CURSES_SETUPTERM
|
||||
* PUBLIC: void setupterm __P((char *, int, int *));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
void
|
||||
setupterm(ttype, fno, errp)
|
||||
char *ttype;
|
||||
int fno, *errp;
|
||||
{
|
||||
static char buf[2048];
|
||||
char *p;
|
||||
|
||||
if ((*errp = tgetent(buf, ttype)) > 0) {
|
||||
if (ke != NULL)
|
||||
free(ke);
|
||||
ke = ((p = tigetstr("rmkx")) == (char *)-1) ?
|
||||
NULL : strdup(p);
|
||||
if (ks != NULL)
|
||||
free(ks);
|
||||
ks = ((p = tigetstr("smkx")) == (char *)-1) ?
|
||||
NULL : strdup(p);
|
||||
if (vb != NULL)
|
||||
free(vb);
|
||||
vb = ((p = tigetstr("flash")) == (char *)-1) ?
|
||||
NULL : strdup(p);
|
||||
}
|
||||
}
|
||||
#endif /* !HAVE_CURSES_SETUPTERM */
|
||||
|
||||
#ifndef HAVE_CURSES_TIGETSTR
|
||||
/* Terminfo-to-termcap translation table. */
|
||||
typedef struct _tl {
|
||||
char *terminfo; /* Terminfo name. */
|
||||
char *termcap; /* Termcap name. */
|
||||
} TL;
|
||||
static const TL list[] = {
|
||||
"cols", "co", /* Terminal columns. */
|
||||
"cup", "cm", /* Cursor up. */
|
||||
"cuu1", "up", /* Cursor up. */
|
||||
"el", "ce", /* Clear to end-of-line. */
|
||||
"flash", "vb", /* Visible bell. */
|
||||
"kcub1", "kl", /* Cursor left. */
|
||||
"kcud1", "kd", /* Cursor down. */
|
||||
"kcuf1", "kr", /* Cursor right. */
|
||||
"kcuu1", "ku", /* Cursor up. */
|
||||
"kdch1", "kD", /* Delete character. */
|
||||
"kdl1", "kL", /* Delete line. */
|
||||
"ked", "kS", /* Delete to end of screen. */
|
||||
"kel", "kE", /* Delete to eol. */
|
||||
"khome", "kh", /* Go to sol. */
|
||||
"kich1", "kI", /* Insert at cursor. */
|
||||
"kil1", "kA", /* Insert line. */
|
||||
"kind", "kF", /* Scroll down. */
|
||||
"kll", "kH", /* Go to eol. */
|
||||
"knp", "kN", /* Page down. */
|
||||
"kpp", "kP", /* Page up. */
|
||||
"kri", "kR", /* Scroll up. */
|
||||
"lines", "li", /* Terminal lines. */
|
||||
"rmcup", "te", /* Terminal end string. */
|
||||
"rmkx", "ke", /* Exit "keypad-transmit" mode. */
|
||||
"rmso", "se", /* Standout end. */
|
||||
"smcup", "ti", /* Terminal initialization string. */
|
||||
"smkx", "ks", /* Enter "keypad-transmit" mode. */
|
||||
"smso", "so", /* Standout begin. */
|
||||
};
|
||||
|
||||
#ifdef _AIX
|
||||
/*
|
||||
* AIX's implementation for function keys greater than 10 is different and
|
||||
* only goes as far as 36.
|
||||
*/
|
||||
static const char codes[] = {
|
||||
/* 0-10 */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ';',
|
||||
/* 11-20 */ '<', '>', '!', '@', '#', '$', '%', '^', '&', '*',
|
||||
/* 21-30 */ '(', ')', '-', '_', '+', ',', ':', '?', '[', ']',
|
||||
/* 31-36 */ '{', '}', '|', '~', '/', '='
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* Historically, the 4BSD termcap code didn't support functions keys greater
|
||||
* than 9. This was silently enforced -- asking for key k12 would return the
|
||||
* value for k1. We try and get around this by using the tables specified in
|
||||
* the terminfo(TI_ENV) man page from the 3rd Edition SVID. This assumes the
|
||||
* implementors of any System V compatibility code or an extended termcap used
|
||||
* those codes.
|
||||
*/
|
||||
static const char codes[] = {
|
||||
/* 0-10 */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ';',
|
||||
/* 11-19 */ '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
/* 20-63 */ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
|
||||
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||
};
|
||||
#endif /* _AIX */
|
||||
|
||||
/*
|
||||
* lcmp --
|
||||
* list comparison routine for bsearch.
|
||||
*/
|
||||
static int
|
||||
lcmp(a, b)
|
||||
const void *a, *b;
|
||||
{
|
||||
return (strcmp(a, ((TL *)b)->terminfo));
|
||||
}
|
||||
|
||||
/*
|
||||
* tigetstr --
|
||||
*
|
||||
* Vendors put the prototype for tigetstr into random include files, including
|
||||
* <term.h>, which we can't include because it makes other systems unhappy.
|
||||
* Try and work around the problem, since we only care about the return value.
|
||||
*
|
||||
* PUBLIC: #ifdef HAVE_CURSES_TIGETSTR
|
||||
* PUBLIC: char *tigetstr();
|
||||
* PUBLIC: #else
|
||||
* PUBLIC: char *tigetstr __P((char *));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
char *
|
||||
tigetstr(name)
|
||||
char *name;
|
||||
{
|
||||
static char sbuf[256];
|
||||
TL *tlp;
|
||||
int n;
|
||||
char *p, keyname[3];
|
||||
|
||||
if ((tlp = bsearch(name,
|
||||
list, sizeof(list) / sizeof(TL), sizeof(TL), lcmp)) == NULL) {
|
||||
#ifdef _AIX
|
||||
if (name[0] == 'k' &&
|
||||
name[1] == 'f' && (n = atoi(name + 2)) <= 36) {
|
||||
keyname[0] = 'k';
|
||||
keyname[1] = codes[n];
|
||||
keyname[2] = '\0';
|
||||
#else
|
||||
if (name[0] == 'k' &&
|
||||
name[1] == 'f' && (n = atoi(name + 2)) <= 63) {
|
||||
keyname[0] = n <= 10 ? 'k' : 'F';
|
||||
keyname[1] = codes[n];
|
||||
keyname[2] = '\0';
|
||||
#endif
|
||||
name = keyname;
|
||||
}
|
||||
} else
|
||||
name = tlp->termcap;
|
||||
|
||||
p = sbuf;
|
||||
#ifdef _AIX
|
||||
return ((p = tgetstr(name, &p)) == NULL ? (char *)-1 : strcpy(sbuf, p));
|
||||
#else
|
||||
return (tgetstr(name, &p) == NULL ? (char *)-1 : sbuf);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* tigetnum --
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_CURSES_TIGETSTR
|
||||
* PUBLIC: int tigetnum __P((char *));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
tigetnum(name)
|
||||
char *name;
|
||||
{
|
||||
TL *tlp;
|
||||
int val;
|
||||
|
||||
if ((tlp = bsearch(name,
|
||||
list, sizeof(list) / sizeof(TL), sizeof(TL), lcmp)) != NULL) {
|
||||
name = tlp->termcap;
|
||||
}
|
||||
|
||||
return ((val = tgetnum(name)) == -1 ? -2 : val);
|
||||
}
|
||||
#endif /* !HAVE_CURSES_TIGETSTR */
|
704
contrib/nvi/cl/cl_funcs.c
Normal file
704
contrib/nvi/cl/cl_funcs.c
Normal file
@ -0,0 +1,704 @@
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)cl_funcs.c 10.50 (Berkeley) 9/24/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <ctype.h>
|
||||
#include <curses.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../common/common.h"
|
||||
#include "../vi/vi.h"
|
||||
#include "cl.h"
|
||||
|
||||
/*
|
||||
* cl_addstr --
|
||||
* Add len bytes from the string at the cursor, advancing the cursor.
|
||||
*
|
||||
* PUBLIC: int cl_addstr __P((SCR *, const char *, size_t));
|
||||
*/
|
||||
int
|
||||
cl_addstr(sp, str, len)
|
||||
SCR *sp;
|
||||
const char *str;
|
||||
size_t len;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
size_t oldy, oldx;
|
||||
int iv;
|
||||
|
||||
clp = CLP(sp);
|
||||
|
||||
/*
|
||||
* If ex isn't in control, it's the last line of the screen and
|
||||
* it's a split screen, use inverse video.
|
||||
*/
|
||||
iv = 0;
|
||||
getyx(stdscr, oldy, oldx);
|
||||
if (!F_ISSET(sp, SC_SCR_EXWROTE) &&
|
||||
oldy == RLNO(sp, LASTLINE(sp)) && IS_SPLIT(sp)) {
|
||||
iv = 1;
|
||||
(void)standout();
|
||||
}
|
||||
|
||||
if (addnstr(str, len) == ERR)
|
||||
return (1);
|
||||
|
||||
if (iv)
|
||||
(void)standend();
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_attr --
|
||||
* Toggle a screen attribute on/off.
|
||||
*
|
||||
* PUBLIC: int cl_attr __P((SCR *, scr_attr_t, int));
|
||||
*/
|
||||
int
|
||||
cl_attr(sp, attribute, on)
|
||||
SCR *sp;
|
||||
scr_attr_t attribute;
|
||||
int on;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
|
||||
clp = CLP(sp);
|
||||
|
||||
switch (attribute) {
|
||||
case SA_ALTERNATE:
|
||||
/*
|
||||
* !!!
|
||||
* There's a major layering violation here. The problem is that the
|
||||
* X11 xterm screen has what's known as an "alternate" screen. Some
|
||||
* xterm termcap/terminfo entries include sequences to switch to/from
|
||||
* that alternate screen as part of the ti/te (smcup/rmcup) strings.
|
||||
* Vi runs in the alternate screen, so that you are returned to the
|
||||
* same screen contents on exit from vi that you had when you entered
|
||||
* vi. Further, when you run :shell, or :!date or similar ex commands,
|
||||
* you also see the original screen contents. This wasn't deliberate
|
||||
* on vi's part, it's just that it historically sent terminal init/end
|
||||
* sequences at those times, and the addition of the alternate screen
|
||||
* sequences to the strings changed the behavior of vi. The problem
|
||||
* caused by this is that we don't want to switch back to the alternate
|
||||
* screen while getting a new command from the user, when the user is
|
||||
* continuing to enter ex commands, e.g.:
|
||||
*
|
||||
* :!date <<< switch to original screen
|
||||
* [Hit return to continue] <<< prompt user to continue
|
||||
* :command <<< get command from user
|
||||
*
|
||||
* Note that the :command input is a true vi input mode, e.g., input
|
||||
* maps and abbreviations are being done. So, we need to be able to
|
||||
* switch back into the vi screen mode, without flashing the screen.
|
||||
*
|
||||
* To make matters worse, the curses initscr() and endwin() calls will
|
||||
* do this automatically -- so, this attribute isn't as controlled by
|
||||
* the higher level screen as closely as one might like.
|
||||
*/
|
||||
if (on) {
|
||||
if (clp->ti_te != TI_SENT) {
|
||||
clp->ti_te = TI_SENT;
|
||||
if (clp->smcup == NULL)
|
||||
(void)cl_getcap(sp, "smcup", &clp->smcup);
|
||||
if (clp->smcup != NULL)
|
||||
(void)tputs(clp->smcup, 1, cl_putchar);
|
||||
}
|
||||
} else
|
||||
if (clp->ti_te != TE_SENT) {
|
||||
clp->ti_te = TE_SENT;
|
||||
if (clp->rmcup == NULL)
|
||||
(void)cl_getcap(sp, "rmcup", &clp->rmcup);
|
||||
if (clp->rmcup != NULL)
|
||||
(void)tputs(clp->rmcup, 1, cl_putchar);
|
||||
(void)fflush(stdout);
|
||||
}
|
||||
(void)fflush(stdout);
|
||||
break;
|
||||
case SA_INVERSE:
|
||||
if (F_ISSET(sp, SC_EX | SC_SCR_EXWROTE)) {
|
||||
if (clp->smso == NULL)
|
||||
return (1);
|
||||
if (on)
|
||||
(void)tputs(clp->smso, 1, cl_putchar);
|
||||
else
|
||||
(void)tputs(clp->rmso, 1, cl_putchar);
|
||||
(void)fflush(stdout);
|
||||
} else {
|
||||
if (on)
|
||||
(void)standout();
|
||||
else
|
||||
(void)standend();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_baud --
|
||||
* Return the baud rate.
|
||||
*
|
||||
* PUBLIC: int cl_baud __P((SCR *, u_long *));
|
||||
*/
|
||||
int
|
||||
cl_baud(sp, ratep)
|
||||
SCR *sp;
|
||||
u_long *ratep;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* There's no portable way to get a "baud rate" -- cfgetospeed(3)
|
||||
* returns the value associated with some #define, which we may
|
||||
* never have heard of, or which may be a purely local speed. Vi
|
||||
* only cares if it's SLOW (w300), slow (w1200) or fast (w9600).
|
||||
* Try and detect the slow ones, and default to fast.
|
||||
*/
|
||||
clp = CLP(sp);
|
||||
switch (cfgetospeed(&clp->orig)) {
|
||||
case B50:
|
||||
case B75:
|
||||
case B110:
|
||||
case B134:
|
||||
case B150:
|
||||
case B200:
|
||||
case B300:
|
||||
case B600:
|
||||
*ratep = 600;
|
||||
break;
|
||||
case B1200:
|
||||
*ratep = 1200;
|
||||
break;
|
||||
default:
|
||||
*ratep = 9600;
|
||||
break;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_bell --
|
||||
* Ring the bell/flash the screen.
|
||||
*
|
||||
* PUBLIC: int cl_bell __P((SCR *));
|
||||
*/
|
||||
int
|
||||
cl_bell(sp)
|
||||
SCR *sp;
|
||||
{
|
||||
if (F_ISSET(sp, SC_EX | SC_SCR_EXWROTE))
|
||||
(void)write(STDOUT_FILENO, "\07", 1); /* \a */
|
||||
else {
|
||||
/*
|
||||
* Vi has an edit option which determines if the terminal
|
||||
* should be beeped or the screen flashed.
|
||||
*/
|
||||
if (O_ISSET(sp, O_FLASH))
|
||||
(void)flash();
|
||||
else
|
||||
(void)beep();
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_clrtoeol --
|
||||
* Clear from the current cursor to the end of the line.
|
||||
*
|
||||
* PUBLIC: int cl_clrtoeol __P((SCR *));
|
||||
*/
|
||||
int
|
||||
cl_clrtoeol(sp)
|
||||
SCR *sp;
|
||||
{
|
||||
return (clrtoeol() == ERR);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_cursor --
|
||||
* Return the current cursor position.
|
||||
*
|
||||
* PUBLIC: int cl_cursor __P((SCR *, size_t *, size_t *));
|
||||
*/
|
||||
int
|
||||
cl_cursor(sp, yp, xp)
|
||||
SCR *sp;
|
||||
size_t *yp, *xp;
|
||||
{
|
||||
/*
|
||||
* The curses screen support splits a single underlying curses screen
|
||||
* into multiple screens to support split screen semantics. For this
|
||||
* reason the returned value must be adjusted to be relative to the
|
||||
* current screen, and not absolute. Screens that implement the split
|
||||
* using physically distinct screens won't need this hack.
|
||||
*/
|
||||
getyx(stdscr, *yp, *xp);
|
||||
*yp -= sp->woff;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_deleteln --
|
||||
* Delete the current line, scrolling all lines below it.
|
||||
*
|
||||
* PUBLIC: int cl_deleteln __P((SCR *));
|
||||
*/
|
||||
int
|
||||
cl_deleteln(sp)
|
||||
SCR *sp;
|
||||
{
|
||||
CHAR_T ch;
|
||||
CL_PRIVATE *clp;
|
||||
size_t col, lno, spcnt, oldy, oldx;
|
||||
|
||||
clp = CLP(sp);
|
||||
|
||||
/*
|
||||
* This clause is required because the curses screen uses reverse
|
||||
* video to delimit split screens. If the screen does not do this,
|
||||
* this code won't be necessary.
|
||||
*
|
||||
* If the bottom line was in reverse video, rewrite it in normal
|
||||
* video before it's scrolled.
|
||||
*
|
||||
* Check for the existence of a chgat function; XSI requires it, but
|
||||
* historic implementations of System V curses don't. If it's not
|
||||
* a #define, we'll fall back to doing it by hand, which is slow but
|
||||
* acceptable.
|
||||
*
|
||||
* By hand means walking through the line, retrieving and rewriting
|
||||
* each character. Curses has no EOL marker, so track strings of
|
||||
* spaces, and copy the trailing spaces only if there's a non-space
|
||||
* character following.
|
||||
*/
|
||||
if (!F_ISSET(sp, SC_SCR_EXWROTE) && IS_SPLIT(sp)) {
|
||||
getyx(stdscr, oldy, oldx);
|
||||
#ifdef mvchgat
|
||||
mvchgat(RLNO(sp, LASTLINE(sp)), 0, -1, A_NORMAL, 0, NULL);
|
||||
#else
|
||||
for (lno = RLNO(sp, LASTLINE(sp)), col = spcnt = 0;;) {
|
||||
(void)move(lno, col);
|
||||
ch = winch(stdscr);
|
||||
if (isblank(ch))
|
||||
++spcnt;
|
||||
else {
|
||||
(void)move(lno, col - spcnt);
|
||||
for (; spcnt > 0; --spcnt)
|
||||
(void)addch(' ');
|
||||
(void)addch(ch);
|
||||
}
|
||||
if (++col >= sp->cols)
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
(void)move(oldy, oldx);
|
||||
}
|
||||
|
||||
/*
|
||||
* The bottom line is expected to be blank after this operation,
|
||||
* and other screens must support that semantic.
|
||||
*/
|
||||
return (deleteln() == ERR);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_ex_adjust --
|
||||
* Adjust the screen for ex. This routine is purely for standalone
|
||||
* ex programs. All special purpose, all special case.
|
||||
*
|
||||
* PUBLIC: int cl_ex_adjust __P((SCR *, exadj_t));
|
||||
*/
|
||||
int
|
||||
cl_ex_adjust(sp, action)
|
||||
SCR *sp;
|
||||
exadj_t action;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
int cnt;
|
||||
|
||||
clp = CLP(sp);
|
||||
switch (action) {
|
||||
case EX_TERM_SCROLL:
|
||||
/* Move the cursor up one line if that's possible. */
|
||||
if (clp->cuu1 != NULL)
|
||||
(void)tputs(clp->cuu1, 1, cl_putchar);
|
||||
else if (clp->cup != NULL)
|
||||
(void)tputs(tgoto(clp->cup,
|
||||
0, LINES - 2), 1, cl_putchar);
|
||||
else
|
||||
return (0);
|
||||
/* FALLTHROUGH */
|
||||
case EX_TERM_CE:
|
||||
/* Clear the line. */
|
||||
if (clp->el != NULL) {
|
||||
(void)putchar('\r');
|
||||
(void)tputs(clp->el, 1, cl_putchar);
|
||||
} else {
|
||||
/*
|
||||
* Historically, ex didn't erase the line, so, if the
|
||||
* displayed line was only a single glyph, and <eof>
|
||||
* was more than one glyph, the output would not fully
|
||||
* overwrite the user's input. To fix this, output
|
||||
* the maxiumum character number of spaces. Note,
|
||||
* this won't help if the user entered extra prompt
|
||||
* or <blank> characters before the command character.
|
||||
* We'd have to do a lot of work to make that work, and
|
||||
* it's almost certainly not worth the effort.
|
||||
*/
|
||||
for (cnt = 0; cnt < MAX_CHARACTER_COLUMNS; ++cnt)
|
||||
(void)putchar('\b');
|
||||
for (cnt = 0; cnt < MAX_CHARACTER_COLUMNS; ++cnt)
|
||||
(void)putchar(' ');
|
||||
(void)putchar('\r');
|
||||
(void)fflush(stdout);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_insertln --
|
||||
* Push down the current line, discarding the bottom line.
|
||||
*
|
||||
* PUBLIC: int cl_insertln __P((SCR *));
|
||||
*/
|
||||
int
|
||||
cl_insertln(sp)
|
||||
SCR *sp;
|
||||
{
|
||||
/*
|
||||
* The current line is expected to be blank after this operation,
|
||||
* and the screen must support that semantic.
|
||||
*/
|
||||
return (insertln() == ERR);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_keyval --
|
||||
* Return the value for a special key.
|
||||
*
|
||||
* PUBLIC: int cl_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *));
|
||||
*/
|
||||
int
|
||||
cl_keyval(sp, val, chp, dnep)
|
||||
SCR *sp;
|
||||
scr_keyval_t val;
|
||||
CHAR_T *chp;
|
||||
int *dnep;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
|
||||
/*
|
||||
* VEOF, VERASE and VKILL are required by POSIX 1003.1-1990,
|
||||
* VWERASE is a 4BSD extension.
|
||||
*/
|
||||
clp = CLP(sp);
|
||||
switch (val) {
|
||||
case KEY_VEOF:
|
||||
*dnep = (*chp = clp->orig.c_cc[VEOF]) == _POSIX_VDISABLE;
|
||||
break;
|
||||
case KEY_VERASE:
|
||||
*dnep = (*chp = clp->orig.c_cc[VERASE]) == _POSIX_VDISABLE;
|
||||
break;
|
||||
case KEY_VKILL:
|
||||
*dnep = (*chp = clp->orig.c_cc[VKILL]) == _POSIX_VDISABLE;
|
||||
break;
|
||||
#ifdef VWERASE
|
||||
case KEY_VWERASE:
|
||||
*dnep = (*chp = clp->orig.c_cc[VWERASE]) == _POSIX_VDISABLE;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
*dnep = 1;
|
||||
break;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_move --
|
||||
* Move the cursor.
|
||||
*
|
||||
* PUBLIC: int cl_move __P((SCR *, size_t, size_t));
|
||||
*/
|
||||
int
|
||||
cl_move(sp, lno, cno)
|
||||
SCR *sp;
|
||||
size_t lno, cno;
|
||||
{
|
||||
/* See the comment in cl_cursor. */
|
||||
if (move(RLNO(sp, lno), cno) == ERR) {
|
||||
msgq(sp, M_ERR,
|
||||
"Error: move: l(%u) c(%u) o(%u)", lno, cno, sp->woff);
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_refresh --
|
||||
* Refresh the screen.
|
||||
*
|
||||
* PUBLIC: int cl_refresh __P((SCR *, int));
|
||||
*/
|
||||
int
|
||||
cl_refresh(sp, repaint)
|
||||
SCR *sp;
|
||||
int repaint;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
|
||||
clp = CLP(sp);
|
||||
|
||||
/*
|
||||
* If we received a killer signal, we're done, there's no point
|
||||
* in refreshing the screen.
|
||||
*/
|
||||
if (clp->killersig)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* If repaint is set, the editor is telling us that we don't know
|
||||
* what's on the screen, so we have to repaint from scratch.
|
||||
*
|
||||
* In the curses library, doing wrefresh(curscr) is okay, but the
|
||||
* screen flashes when we then apply the refresh() to bring it up
|
||||
* to date. So, use clearok().
|
||||
*/
|
||||
if (repaint)
|
||||
clearok(curscr, 1);
|
||||
return (refresh() == ERR);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_rename --
|
||||
* Rename the file.
|
||||
*
|
||||
* PUBLIC: int cl_rename __P((SCR *, char *, int));
|
||||
*/
|
||||
int
|
||||
cl_rename(sp, name, on)
|
||||
SCR *sp;
|
||||
char *name;
|
||||
int on;
|
||||
{
|
||||
GS *gp;
|
||||
CL_PRIVATE *clp;
|
||||
char *ttype;
|
||||
|
||||
gp = sp->gp;
|
||||
clp = CLP(sp);
|
||||
|
||||
ttype = OG_STR(gp, GO_TERM);
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* We can only rename windows for xterm.
|
||||
*/
|
||||
if (on) {
|
||||
if (F_ISSET(clp, CL_RENAME_OK) &&
|
||||
!strncmp(ttype, "xterm", sizeof("xterm") - 1)) {
|
||||
F_SET(clp, CL_RENAME);
|
||||
(void)printf(XTERM_RENAME, name);
|
||||
(void)fflush(stdout);
|
||||
}
|
||||
} else
|
||||
if (F_ISSET(clp, CL_RENAME)) {
|
||||
F_CLR(clp, CL_RENAME);
|
||||
(void)printf(XTERM_RENAME, ttype);
|
||||
(void)fflush(stdout);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_suspend --
|
||||
* Suspend a screen.
|
||||
*
|
||||
* PUBLIC: int cl_suspend __P((SCR *, int *));
|
||||
*/
|
||||
int
|
||||
cl_suspend(sp, allowedp)
|
||||
SCR *sp;
|
||||
int *allowedp;
|
||||
{
|
||||
struct termios t;
|
||||
CL_PRIVATE *clp;
|
||||
GS *gp;
|
||||
size_t oldy, oldx;
|
||||
int changed;
|
||||
|
||||
gp = sp->gp;
|
||||
clp = CLP(sp);
|
||||
*allowedp = 1;
|
||||
|
||||
/*
|
||||
* The ex implementation of this function isn't needed by screens not
|
||||
* supporting ex commands that require full terminal canonical mode
|
||||
* (e.g. :suspend).
|
||||
*
|
||||
* The vi implementation of this function isn't needed by screens not
|
||||
* supporting vi process suspension, i.e. any screen that isn't backed
|
||||
* by a UNIX shell.
|
||||
*
|
||||
* Setting allowedp to 0 will cause the editor to reject the command.
|
||||
*/
|
||||
if (F_ISSET(sp, SC_EX)) {
|
||||
/* Save the terminal settings, and restore the original ones. */
|
||||
if (F_ISSET(clp, CL_STDIN_TTY)) {
|
||||
(void)tcgetattr(STDIN_FILENO, &t);
|
||||
(void)tcsetattr(STDIN_FILENO,
|
||||
TCSASOFT | TCSADRAIN, &clp->orig);
|
||||
}
|
||||
|
||||
/* Stop the process group. */
|
||||
(void)kill(0, SIGTSTP);
|
||||
|
||||
/* Time passes ... */
|
||||
|
||||
/* Restore terminal settings. */
|
||||
if (F_ISSET(clp, CL_STDIN_TTY))
|
||||
(void)tcsetattr(STDIN_FILENO, TCSASOFT | TCSADRAIN, &t);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Move to the lower left-hand corner of the screen.
|
||||
*
|
||||
* XXX
|
||||
* Not sure this is necessary in System V implementations, but it
|
||||
* shouldn't hurt.
|
||||
*/
|
||||
getyx(stdscr, oldy, oldx);
|
||||
(void)move(LINES - 1, 0);
|
||||
(void)refresh();
|
||||
|
||||
/*
|
||||
* Temporarily end the screen. System V introduced a semantic where
|
||||
* endwin() could be restarted. We use it because restarting curses
|
||||
* from scratch often fails in System V. 4BSD curses didn't support
|
||||
* restarting after endwin(), so we have to do what clean up we can
|
||||
* without calling it.
|
||||
*/
|
||||
#ifdef HAVE_BSD_CURSES
|
||||
/* Save the terminal settings. */
|
||||
(void)tcgetattr(STDIN_FILENO, &t);
|
||||
#endif
|
||||
|
||||
/* Restore the cursor keys to normal mode. */
|
||||
(void)keypad(stdscr, FALSE);
|
||||
|
||||
/* Restore the window name. */
|
||||
(void)cl_rename(sp, NULL, 0);
|
||||
|
||||
#ifdef HAVE_BSD_CURSES
|
||||
(void)cl_attr(sp, SA_ALTERNATE, 0);
|
||||
#else
|
||||
(void)endwin();
|
||||
#endif
|
||||
/*
|
||||
* XXX
|
||||
* Restore the original terminal settings. This is bad -- the
|
||||
* reset can cause character loss from the tty queue. However,
|
||||
* we can't call endwin() in BSD curses implementations, and too
|
||||
* many System V curses implementations don't get it right.
|
||||
*/
|
||||
(void)tcsetattr(STDIN_FILENO, TCSADRAIN | TCSASOFT, &clp->orig);
|
||||
|
||||
/* Stop the process group. */
|
||||
(void)kill(0, SIGTSTP);
|
||||
|
||||
/* Time passes ... */
|
||||
|
||||
/*
|
||||
* If we received a killer signal, we're done. Leave everything
|
||||
* unchanged. In addition, the terminal has already been reset
|
||||
* correctly, so leave it alone.
|
||||
*/
|
||||
if (clp->killersig) {
|
||||
F_CLR(clp, CL_SCR_EX_INIT | CL_SCR_VI_INIT);
|
||||
return (0);
|
||||
}
|
||||
|
||||
#ifdef HAVE_BSD_CURSES
|
||||
/* Restore terminal settings. */
|
||||
if (F_ISSET(clp, CL_STDIN_TTY))
|
||||
(void)tcsetattr(STDIN_FILENO, TCSASOFT | TCSADRAIN, &t);
|
||||
|
||||
(void)cl_attr(sp, SA_ALTERNATE, 1);
|
||||
#endif
|
||||
|
||||
/* Set the window name. */
|
||||
(void)cl_rename(sp, sp->frp->name, 1);
|
||||
|
||||
/* Put the cursor keys into application mode. */
|
||||
(void)keypad(stdscr, TRUE);
|
||||
|
||||
/* Refresh and repaint the screen. */
|
||||
(void)move(oldy, oldx);
|
||||
(void)cl_refresh(sp, 1);
|
||||
|
||||
/* If the screen changed size, set the SIGWINCH bit. */
|
||||
if (cl_ssize(sp, 1, NULL, NULL, &changed))
|
||||
return (1);
|
||||
if (changed)
|
||||
F_SET(CLP(sp), CL_SIGWINCH);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_usage --
|
||||
* Print out the curses usage messages.
|
||||
*
|
||||
* PUBLIC: void cl_usage __P((void));
|
||||
*/
|
||||
void
|
||||
cl_usage()
|
||||
{
|
||||
#define USAGE "\
|
||||
usage: ex [-eFRrSsv] [-c command] [-t tag] [-w size] [file ...]\n\
|
||||
usage: vi [-eFlRrSv] [-c command] [-t tag] [-w size] [file ...]\n"
|
||||
(void)fprintf(stderr, "%s", USAGE);
|
||||
#undef USAGE
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
/*
|
||||
* gdbrefresh --
|
||||
* Stub routine so can flush out curses screen changes using gdb.
|
||||
*/
|
||||
int
|
||||
gdbrefresh()
|
||||
{
|
||||
refresh();
|
||||
return (0); /* XXX Convince gdb to run it. */
|
||||
}
|
||||
#endif
|
471
contrib/nvi/cl/cl_main.c
Normal file
471
contrib/nvi/cl/cl_main.c
Normal file
@ -0,0 +1,471 @@
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)cl_main.c 10.36 (Berkeley) 10/14/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <curses.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../common/common.h"
|
||||
#ifdef RUNNING_IP
|
||||
#include "../ip/ip.h"
|
||||
#endif
|
||||
#include "cl.h"
|
||||
#include "pathnames.h"
|
||||
|
||||
GS *__global_list; /* GLOBAL: List of screens. */
|
||||
sigset_t __sigblockset; /* GLOBAL: Blocked signals. */
|
||||
|
||||
static void cl_func_std __P((GS *));
|
||||
static CL_PRIVATE *cl_init __P((GS *));
|
||||
static GS *gs_init __P((char *));
|
||||
static void perr __P((char *, char *));
|
||||
static int setsig __P((int, struct sigaction *, void (*)(int)));
|
||||
static void sig_end __P((GS *));
|
||||
static void term_init __P((char *, char *));
|
||||
|
||||
/*
|
||||
* main --
|
||||
* This is the main loop for the standalone curses editor.
|
||||
*/
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
static int reenter;
|
||||
CL_PRIVATE *clp;
|
||||
GS *gp;
|
||||
size_t rows, cols;
|
||||
int rval;
|
||||
char *ip_arg, **p_av, **t_av, *ttype;
|
||||
|
||||
/* If loaded at 0 and jumping through a NULL pointer, stop. */
|
||||
if (reenter++)
|
||||
abort();
|
||||
|
||||
/* Create and initialize the global structure. */
|
||||
__global_list = gp = gs_init(argv[0]);
|
||||
|
||||
/*
|
||||
* Strip out any arguments that vi isn't going to understand. There's
|
||||
* no way to portably call getopt twice, so arguments parsed here must
|
||||
* be removed from the argument list.
|
||||
*/
|
||||
#ifdef RUNNING_IP
|
||||
ip_arg = NULL;
|
||||
for (p_av = t_av = argv;;) {
|
||||
if (*t_av == NULL) {
|
||||
*p_av = NULL;
|
||||
break;
|
||||
}
|
||||
if (!strcmp(*t_av, "--")) {
|
||||
while ((*p_av++ = *t_av++) != NULL);
|
||||
break;
|
||||
}
|
||||
if (!memcmp(*t_av, "-I", sizeof("-I") - 1)) {
|
||||
if (t_av[0][2] != '\0') {
|
||||
ip_arg = t_av[0] + 2;
|
||||
++t_av;
|
||||
--argc;
|
||||
continue;
|
||||
}
|
||||
if (t_av[1] != NULL) {
|
||||
ip_arg = t_av[1];
|
||||
t_av += 2;
|
||||
argc -= 2;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
*p_av++ = *t_av++;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we're being called as an editor library, we're done here, we
|
||||
* get loaded with the curses screen, we don't share much code.
|
||||
*/
|
||||
if (ip_arg != NULL)
|
||||
exit (ip_main(argc, argv, gp, ip_arg));
|
||||
#else
|
||||
ip_arg = argv[0];
|
||||
#endif
|
||||
|
||||
/* Create and initialize the CL_PRIVATE structure. */
|
||||
clp = cl_init(gp);
|
||||
|
||||
/*
|
||||
* Initialize the terminal information.
|
||||
*
|
||||
* We have to know what terminal it is from the start, since we may
|
||||
* have to use termcap/terminfo to find out how big the screen is.
|
||||
*/
|
||||
if ((ttype = getenv("TERM")) == NULL)
|
||||
ttype = "unknown";
|
||||
term_init(gp->progname, ttype);
|
||||
|
||||
/* Add the terminal type to the global structure. */
|
||||
if ((OG_D_STR(gp, GO_TERM) =
|
||||
OG_STR(gp, GO_TERM) = strdup(ttype)) == NULL)
|
||||
perr(gp->progname, NULL);
|
||||
|
||||
/* Figure out how big the screen is. */
|
||||
if (cl_ssize(NULL, 0, &rows, &cols, NULL))
|
||||
exit (1);
|
||||
|
||||
/* Add the rows and columns to the global structure. */
|
||||
OG_VAL(gp, GO_LINES) = OG_D_VAL(gp, GO_LINES) = rows;
|
||||
OG_VAL(gp, GO_COLUMNS) = OG_D_VAL(gp, GO_COLUMNS) = cols;
|
||||
|
||||
/* Ex wants stdout to be buffered. */
|
||||
(void)setvbuf(stdout, NULL, _IOFBF, 0);
|
||||
|
||||
/* Start catching signals. */
|
||||
if (sig_init(gp, NULL))
|
||||
exit (1);
|
||||
|
||||
/* Run ex/vi. */
|
||||
rval = editor(gp, argc, argv);
|
||||
|
||||
/* Clean up signals. */
|
||||
sig_end(gp);
|
||||
|
||||
/* Clean up the terminal. */
|
||||
(void)cl_quit(gp);
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* Reset the O_MESG option.
|
||||
*/
|
||||
if (clp->tgw != TGW_UNKNOWN)
|
||||
(void)cl_omesg(NULL, clp, clp->tgw == TGW_SET);
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* Reset the X11 xterm icon/window name.
|
||||
*/
|
||||
if (F_ISSET(clp, CL_RENAME)) {
|
||||
(void)printf(XTERM_RENAME, ttype);
|
||||
(void)fflush(stdout);
|
||||
}
|
||||
|
||||
/* If a killer signal arrived, pretend we just got it. */
|
||||
if (clp->killersig) {
|
||||
(void)signal(clp->killersig, SIG_DFL);
|
||||
(void)kill(getpid(), clp->killersig);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
/* Free the global and CL private areas. */
|
||||
#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY)
|
||||
free(clp);
|
||||
free(gp);
|
||||
#endif
|
||||
|
||||
exit (rval);
|
||||
}
|
||||
|
||||
/*
|
||||
* gs_init --
|
||||
* Create and partially initialize the GS structure.
|
||||
*/
|
||||
static GS *
|
||||
gs_init(name)
|
||||
char *name;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
GS *gp;
|
||||
char *p;
|
||||
|
||||
/* Figure out what our name is. */
|
||||
if ((p = strrchr(name, '/')) != NULL)
|
||||
name = p + 1;
|
||||
|
||||
/* Allocate the global structure. */
|
||||
CALLOC_NOMSG(NULL, gp, GS *, 1, sizeof(GS));
|
||||
if (gp == NULL)
|
||||
perr(name, NULL);
|
||||
|
||||
|
||||
gp->progname = name;
|
||||
return (gp);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_init --
|
||||
* Create and partially initialize the CL structure.
|
||||
*/
|
||||
static CL_PRIVATE *
|
||||
cl_init(gp)
|
||||
GS *gp;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
int fd;
|
||||
|
||||
/* Allocate the CL private structure. */
|
||||
CALLOC_NOMSG(NULL, clp, CL_PRIVATE *, 1, sizeof(CL_PRIVATE));
|
||||
if (clp == NULL)
|
||||
perr(gp->progname, NULL);
|
||||
gp->cl_private = clp;
|
||||
|
||||
/*
|
||||
* Set the CL_STDIN_TTY flag. It's purpose is to avoid setting
|
||||
* and resetting the tty if the input isn't from there. We also
|
||||
* use the same test to determine if we're running a script or
|
||||
* not.
|
||||
*/
|
||||
if (isatty(STDIN_FILENO))
|
||||
F_SET(clp, CL_STDIN_TTY);
|
||||
else
|
||||
F_SET(gp, G_SCRIPTED);
|
||||
|
||||
/*
|
||||
* We expect that if we've lost our controlling terminal that the
|
||||
* open() (but not the tcgetattr()) will fail.
|
||||
*/
|
||||
if (F_ISSET(clp, CL_STDIN_TTY)) {
|
||||
if (tcgetattr(STDIN_FILENO, &clp->orig) == -1)
|
||||
goto tcfail;
|
||||
} else if ((fd = open(_PATH_TTY, O_RDONLY, 0)) != -1) {
|
||||
if (tcgetattr(fd, &clp->orig) == -1) {
|
||||
tcfail: perr(gp->progname, "tcgetattr");
|
||||
exit (1);
|
||||
}
|
||||
(void)close(fd);
|
||||
}
|
||||
|
||||
/* Initialize the list of curses functions. */
|
||||
cl_func_std(gp);
|
||||
|
||||
return (clp);
|
||||
}
|
||||
|
||||
/*
|
||||
* term_init --
|
||||
* Initialize terminal information.
|
||||
*/
|
||||
static void
|
||||
term_init(name, ttype)
|
||||
char *name, *ttype;
|
||||
{
|
||||
int err;
|
||||
|
||||
/* Set up the terminal database information. */
|
||||
setupterm(ttype, STDOUT_FILENO, &err);
|
||||
switch (err) {
|
||||
case -1:
|
||||
(void)fprintf(stderr,
|
||||
"%s: No terminal database found\n", name);
|
||||
exit (1);
|
||||
case 0:
|
||||
(void)fprintf(stderr,
|
||||
"%s: %s: unknown terminal type\n", name, ttype);
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
#define GLOBAL_CLP \
|
||||
CL_PRIVATE *clp = GCLP(__global_list);
|
||||
static void
|
||||
h_hup(signo)
|
||||
int signo;
|
||||
{
|
||||
GLOBAL_CLP;
|
||||
|
||||
F_SET(clp, CL_SIGHUP);
|
||||
clp->killersig = SIGHUP;
|
||||
}
|
||||
|
||||
static void
|
||||
h_int(signo)
|
||||
int signo;
|
||||
{
|
||||
GLOBAL_CLP;
|
||||
|
||||
F_SET(clp, CL_SIGINT);
|
||||
}
|
||||
|
||||
static void
|
||||
h_term(signo)
|
||||
int signo;
|
||||
{
|
||||
GLOBAL_CLP;
|
||||
|
||||
F_SET(clp, CL_SIGTERM);
|
||||
clp->killersig = SIGTERM;
|
||||
}
|
||||
|
||||
static void
|
||||
h_winch(signo)
|
||||
int signo;
|
||||
{
|
||||
GLOBAL_CLP;
|
||||
|
||||
F_SET(clp, CL_SIGWINCH);
|
||||
}
|
||||
#undef GLOBAL_CLP
|
||||
|
||||
/*
|
||||
* sig_init --
|
||||
* Initialize signals.
|
||||
*
|
||||
* PUBLIC: int sig_init __P((GS *, SCR *));
|
||||
*/
|
||||
int
|
||||
sig_init(gp, sp)
|
||||
GS *gp;
|
||||
SCR *sp;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
|
||||
clp = GCLP(gp);
|
||||
|
||||
if (sp == NULL) {
|
||||
(void)sigemptyset(&__sigblockset);
|
||||
if (sigaddset(&__sigblockset, SIGHUP) ||
|
||||
setsig(SIGHUP, &clp->oact[INDX_HUP], h_hup) ||
|
||||
sigaddset(&__sigblockset, SIGINT) ||
|
||||
setsig(SIGINT, &clp->oact[INDX_INT], h_int) ||
|
||||
sigaddset(&__sigblockset, SIGTERM) ||
|
||||
setsig(SIGTERM, &clp->oact[INDX_TERM], h_term)
|
||||
#ifdef SIGWINCH
|
||||
||
|
||||
sigaddset(&__sigblockset, SIGWINCH) ||
|
||||
setsig(SIGWINCH, &clp->oact[INDX_WINCH], h_winch)
|
||||
#endif
|
||||
) {
|
||||
perr(gp->progname, NULL);
|
||||
return (1);
|
||||
}
|
||||
} else
|
||||
if (setsig(SIGHUP, NULL, h_hup) ||
|
||||
setsig(SIGINT, NULL, h_int) ||
|
||||
setsig(SIGTERM, NULL, h_term)
|
||||
#ifdef SIGWINCH
|
||||
||
|
||||
setsig(SIGWINCH, NULL, h_winch)
|
||||
#endif
|
||||
) {
|
||||
msgq(sp, M_SYSERR, "signal-reset");
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* setsig --
|
||||
* Set a signal handler.
|
||||
*/
|
||||
static int
|
||||
setsig(signo, oactp, handler)
|
||||
int signo;
|
||||
struct sigaction *oactp;
|
||||
void (*handler) __P((int));
|
||||
{
|
||||
struct sigaction act;
|
||||
|
||||
/*
|
||||
* Use sigaction(2), not signal(3), since we don't always want to
|
||||
* restart system calls. The example is when waiting for a command
|
||||
* mode keystroke and SIGWINCH arrives. Besides, you can't portably
|
||||
* restart system calls (thanks, POSIX!). On the other hand, you
|
||||
* can't portably NOT restart system calls (thanks, Sun!). SunOS
|
||||
* used SA_INTERRUPT as their extension to NOT restart read calls.
|
||||
* We sure hope nobody else used it for anything else. Mom told me
|
||||
* there'd be days like this. She just never told me that there'd
|
||||
* be so many.
|
||||
*/
|
||||
act.sa_handler = handler;
|
||||
sigemptyset(&act.sa_mask);
|
||||
|
||||
#ifdef SA_INTERRUPT
|
||||
act.sa_flags = SA_INTERRUPT;
|
||||
#else
|
||||
act.sa_flags = 0;
|
||||
#endif
|
||||
return (sigaction(signo, &act, oactp));
|
||||
}
|
||||
|
||||
/*
|
||||
* sig_end --
|
||||
* End signal setup.
|
||||
*/
|
||||
static void
|
||||
sig_end(gp)
|
||||
GS *gp;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
|
||||
clp = GCLP(gp);
|
||||
(void)sigaction(SIGHUP, NULL, &clp->oact[INDX_HUP]);
|
||||
(void)sigaction(SIGINT, NULL, &clp->oact[INDX_INT]);
|
||||
(void)sigaction(SIGTERM, NULL, &clp->oact[INDX_TERM]);
|
||||
#ifdef SIGWINCH
|
||||
(void)sigaction(SIGWINCH, NULL, &clp->oact[INDX_WINCH]);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_func_std --
|
||||
* Initialize the standard curses functions.
|
||||
*/
|
||||
static void
|
||||
cl_func_std(gp)
|
||||
GS *gp;
|
||||
{
|
||||
gp->scr_addstr = cl_addstr;
|
||||
gp->scr_attr = cl_attr;
|
||||
gp->scr_baud = cl_baud;
|
||||
gp->scr_bell = cl_bell;
|
||||
gp->scr_busy = NULL;
|
||||
gp->scr_clrtoeol = cl_clrtoeol;
|
||||
gp->scr_cursor = cl_cursor;
|
||||
gp->scr_deleteln = cl_deleteln;
|
||||
gp->scr_event = cl_event;
|
||||
gp->scr_ex_adjust = cl_ex_adjust;
|
||||
gp->scr_fmap = cl_fmap;
|
||||
gp->scr_insertln = cl_insertln;
|
||||
gp->scr_keyval = cl_keyval;
|
||||
gp->scr_move = cl_move;
|
||||
gp->scr_msg = NULL;
|
||||
gp->scr_optchange = cl_optchange;
|
||||
gp->scr_refresh = cl_refresh;
|
||||
gp->scr_rename = cl_rename;
|
||||
gp->scr_screen = cl_screen;
|
||||
gp->scr_suspend = cl_suspend;
|
||||
gp->scr_usage = cl_usage;
|
||||
}
|
||||
|
||||
/*
|
||||
* perr --
|
||||
* Print system error.
|
||||
*/
|
||||
static void
|
||||
perr(name, msg)
|
||||
char *name, *msg;
|
||||
{
|
||||
(void)fprintf(stderr, "%s:", name);
|
||||
if (msg != NULL)
|
||||
(void)fprintf(stderr, "%s:", msg);
|
||||
(void)fprintf(stderr, "%s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
334
contrib/nvi/cl/cl_read.c
Normal file
334
contrib/nvi/cl/cl_read.c
Normal file
@ -0,0 +1,334 @@
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)cl_read.c 10.15 (Berkeley) 9/24/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#ifdef HAVE_SYS_SELECT_H
|
||||
#include <sys/select.h>
|
||||
#endif
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <curses.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../common/common.h"
|
||||
#include "../ex/script.h"
|
||||
#include "cl.h"
|
||||
|
||||
static input_t cl_read __P((SCR *,
|
||||
u_int32_t, CHAR_T *, size_t, int *, struct timeval *));
|
||||
static int cl_resize __P((SCR *, size_t, size_t));
|
||||
|
||||
/*
|
||||
* cl_event --
|
||||
* Return a single event.
|
||||
*
|
||||
* PUBLIC: int cl_event __P((SCR *, EVENT *, u_int32_t, int));
|
||||
*/
|
||||
int
|
||||
cl_event(sp, evp, flags, ms)
|
||||
SCR *sp;
|
||||
EVENT *evp;
|
||||
u_int32_t flags;
|
||||
int ms;
|
||||
{
|
||||
struct timeval t, *tp;
|
||||
CL_PRIVATE *clp;
|
||||
size_t lines, columns;
|
||||
int changed, nr;
|
||||
|
||||
/*
|
||||
* Queue signal based events. We never clear SIGHUP or SIGTERM events,
|
||||
* so that we just keep returning them until the editor dies.
|
||||
*/
|
||||
clp = CLP(sp);
|
||||
retest: if (LF_ISSET(EC_INTERRUPT) || F_ISSET(clp, CL_SIGINT)) {
|
||||
if (F_ISSET(clp, CL_SIGINT)) {
|
||||
F_CLR(clp, CL_SIGINT);
|
||||
evp->e_event = E_INTERRUPT;
|
||||
} else
|
||||
evp->e_event = E_TIMEOUT;
|
||||
return (0);
|
||||
}
|
||||
if (F_ISSET(clp, CL_SIGHUP | CL_SIGTERM | CL_SIGWINCH)) {
|
||||
if (F_ISSET(clp, CL_SIGHUP)) {
|
||||
evp->e_event = E_SIGHUP;
|
||||
return (0);
|
||||
}
|
||||
if (F_ISSET(clp, CL_SIGTERM)) {
|
||||
evp->e_event = E_SIGTERM;
|
||||
return (0);
|
||||
}
|
||||
if (F_ISSET(clp, CL_SIGWINCH)) {
|
||||
F_CLR(clp, CL_SIGWINCH);
|
||||
if (cl_ssize(sp, 1, &lines, &columns, &changed))
|
||||
return (1);
|
||||
if (changed) {
|
||||
(void)cl_resize(sp, lines, columns);
|
||||
evp->e_event = E_WRESIZE;
|
||||
return (0);
|
||||
}
|
||||
/* No real change, ignore the signal. */
|
||||
}
|
||||
}
|
||||
|
||||
/* Set timer. */
|
||||
if (ms == 0)
|
||||
tp = NULL;
|
||||
else {
|
||||
t.tv_sec = ms / 1000;
|
||||
t.tv_usec = (ms % 1000) * 1000;
|
||||
tp = &t;
|
||||
}
|
||||
|
||||
/* Read input characters. */
|
||||
switch (cl_read(sp, LF_ISSET(EC_QUOTED | EC_RAW),
|
||||
clp->ibuf, sizeof(clp->ibuf), &nr, tp)) {
|
||||
case INP_OK:
|
||||
evp->e_csp = clp->ibuf;
|
||||
evp->e_len = nr;
|
||||
evp->e_event = E_STRING;
|
||||
break;
|
||||
case INP_EOF:
|
||||
evp->e_event = E_EOF;
|
||||
break;
|
||||
case INP_ERR:
|
||||
evp->e_event = E_ERR;
|
||||
break;
|
||||
case INP_INTR:
|
||||
goto retest;
|
||||
case INP_TIMEOUT:
|
||||
evp->e_event = E_TIMEOUT;
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_read --
|
||||
* Read characters from the input.
|
||||
*/
|
||||
static input_t
|
||||
cl_read(sp, flags, bp, blen, nrp, tp)
|
||||
SCR *sp;
|
||||
u_int32_t flags;
|
||||
CHAR_T *bp;
|
||||
size_t blen;
|
||||
int *nrp;
|
||||
struct timeval *tp;
|
||||
{
|
||||
struct termios term1, term2;
|
||||
struct timeval poll;
|
||||
CL_PRIVATE *clp;
|
||||
GS *gp;
|
||||
SCR *tsp;
|
||||
fd_set rdfd;
|
||||
input_t rval;
|
||||
int maxfd, nr, term_reset;
|
||||
|
||||
gp = sp->gp;
|
||||
clp = CLP(sp);
|
||||
term_reset = 0;
|
||||
|
||||
/*
|
||||
* 1: A read from a file or a pipe. In this case, the reads
|
||||
* never timeout regardless. This means that we can hang
|
||||
* when trying to complete a map, but we're going to hang
|
||||
* on the next read anyway.
|
||||
*/
|
||||
if (!F_ISSET(clp, CL_STDIN_TTY)) {
|
||||
switch (nr = read(STDIN_FILENO, bp, blen)) {
|
||||
case 0:
|
||||
return (INP_EOF);
|
||||
case -1:
|
||||
goto err;
|
||||
default:
|
||||
*nrp = nr;
|
||||
return (INP_OK);
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
/*
|
||||
* 2: A read with an associated timeout, e.g., trying to complete
|
||||
* a map sequence. If input exists, we fall into #3.
|
||||
*/
|
||||
FD_ZERO(&rdfd);
|
||||
poll.tv_sec = 0;
|
||||
poll.tv_usec = 0;
|
||||
if (tp != NULL) {
|
||||
FD_SET(STDIN_FILENO, &rdfd);
|
||||
switch (select(STDIN_FILENO + 1,
|
||||
&rdfd, NULL, NULL, tp == NULL ? &poll : tp)) {
|
||||
case 0:
|
||||
return (INP_TIMEOUT);
|
||||
case -1:
|
||||
goto err;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The user can enter a key in the editor to quote a character. If we
|
||||
* get here and the next key is supposed to be quoted, do what we can.
|
||||
* Reset the tty so that the user can enter a ^C, ^Q, ^S. There's an
|
||||
* obvious race here, when the key has already been entered, but there's
|
||||
* nothing that we can do to fix that problem.
|
||||
*
|
||||
* The editor can ask for the next literal character even thought it's
|
||||
* generally running in line-at-a-time mode. Do what we can.
|
||||
*/
|
||||
if (LF_ISSET(EC_QUOTED | EC_RAW) && !tcgetattr(STDIN_FILENO, &term1)) {
|
||||
term_reset = 1;
|
||||
if (LF_ISSET(EC_QUOTED)) {
|
||||
term2 = term1;
|
||||
term2.c_lflag &= ~ISIG;
|
||||
term2.c_iflag &= ~(IXON | IXOFF);
|
||||
(void)tcsetattr(STDIN_FILENO,
|
||||
TCSASOFT | TCSADRAIN, &term2);
|
||||
} else
|
||||
(void)tcsetattr(STDIN_FILENO,
|
||||
TCSASOFT | TCSADRAIN, &clp->vi_enter);
|
||||
}
|
||||
|
||||
/*
|
||||
* 3: Wait for input.
|
||||
*
|
||||
* Select on the command input and scripting window file descriptors.
|
||||
* It's ugly that we wait on scripting file descriptors here, but it's
|
||||
* the only way to keep from locking out scripting windows.
|
||||
*/
|
||||
if (F_ISSET(gp, G_SCRWIN)) {
|
||||
loop: FD_ZERO(&rdfd);
|
||||
FD_SET(STDIN_FILENO, &rdfd);
|
||||
maxfd = STDIN_FILENO;
|
||||
for (tsp = gp->dq.cqh_first;
|
||||
tsp != (void *)&gp->dq; tsp = tsp->q.cqe_next)
|
||||
if (F_ISSET(sp, SC_SCRIPT)) {
|
||||
FD_SET(sp->script->sh_master, &rdfd);
|
||||
if (sp->script->sh_master > maxfd)
|
||||
maxfd = sp->script->sh_master;
|
||||
}
|
||||
switch (select(maxfd + 1, &rdfd, NULL, NULL, NULL)) {
|
||||
case 0:
|
||||
abort();
|
||||
case -1:
|
||||
goto err;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (!FD_ISSET(STDIN_FILENO, &rdfd)) {
|
||||
if (sscr_input(sp))
|
||||
return (INP_ERR);
|
||||
goto loop;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 4: Read the input.
|
||||
*
|
||||
* !!!
|
||||
* What's going on here is some scary stuff. Ex runs the terminal in
|
||||
* canonical mode. So, the <newline> character terminating a line of
|
||||
* input is returned in the buffer, but a trailing <EOF> character is
|
||||
* not similarly included. As ex uses 0<EOF> and ^<EOF> as autoindent
|
||||
* commands, it has to see the trailing <EOF> characters to determine
|
||||
* the difference between the user entering "0ab" and "0<EOF>ab". We
|
||||
* leave an extra slot in the buffer, so that we can add a trailing
|
||||
* <EOF> character if the buffer isn't terminated by a <newline>. We
|
||||
* lose if the buffer is too small for the line and exactly N characters
|
||||
* are entered followed by an <EOF> character.
|
||||
*/
|
||||
#define ONE_FOR_EOF 1
|
||||
switch (nr = read(STDIN_FILENO, bp, blen - ONE_FOR_EOF)) {
|
||||
case 0: /* EOF. */
|
||||
/*
|
||||
* ^D in canonical mode returns a read of 0, i.e. EOF. EOF is
|
||||
* a valid command, but we don't want to loop forever because
|
||||
* the terminal driver is returning EOF because the user has
|
||||
* disconnected. The editor will almost certainly try to write
|
||||
* something before this fires, which should kill us, but You
|
||||
* Never Know.
|
||||
*/
|
||||
if (++clp->eof_count < 50) {
|
||||
bp[0] = clp->orig.c_cc[VEOF];
|
||||
*nrp = 1;
|
||||
rval = INP_OK;
|
||||
|
||||
} else
|
||||
rval = INP_EOF;
|
||||
break;
|
||||
case -1: /* Error or interrupt. */
|
||||
err: if (errno == EINTR)
|
||||
rval = INP_INTR;
|
||||
else {
|
||||
rval = INP_ERR;
|
||||
msgq(sp, M_SYSERR, "input");
|
||||
}
|
||||
break;
|
||||
default: /* Input characters. */
|
||||
if (F_ISSET(sp, SC_EX) && bp[nr - 1] != '\n')
|
||||
bp[nr++] = clp->orig.c_cc[VEOF];
|
||||
*nrp = nr;
|
||||
clp->eof_count = 0;
|
||||
rval = INP_OK;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Restore the terminal state if it was modified. */
|
||||
if (term_reset)
|
||||
(void)tcsetattr(STDIN_FILENO, TCSASOFT | TCSADRAIN, &term1);
|
||||
return (rval);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_resize --
|
||||
* Reset the options for a resize event.
|
||||
*/
|
||||
static int
|
||||
cl_resize(sp, lines, columns)
|
||||
SCR *sp;
|
||||
size_t lines, columns;
|
||||
{
|
||||
ARGS *argv[2], a, b;
|
||||
char b1[1024];
|
||||
|
||||
a.bp = b1;
|
||||
b.bp = NULL;
|
||||
a.len = b.len = 0;
|
||||
argv[0] = &a;
|
||||
argv[1] = &b;
|
||||
|
||||
(void)snprintf(b1, sizeof(b1), "lines=%lu", (u_long)lines);
|
||||
a.len = strlen(b1);
|
||||
if (opts_set(sp, argv, NULL))
|
||||
return (1);
|
||||
(void)snprintf(b1, sizeof(b1), "columns=%lu", (u_long)columns);
|
||||
a.len = strlen(b1);
|
||||
if (opts_set(sp, argv, NULL))
|
||||
return (1);
|
||||
return (0);
|
||||
}
|
581
contrib/nvi/cl/cl_screen.c
Normal file
581
contrib/nvi/cl/cl_screen.c
Normal file
@ -0,0 +1,581 @@
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)cl_screen.c 10.49 (Berkeley) 9/24/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <curses.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../common/common.h"
|
||||
#include "cl.h"
|
||||
|
||||
static int cl_ex_end __P((GS *));
|
||||
static int cl_ex_init __P((SCR *));
|
||||
static void cl_freecap __P((CL_PRIVATE *));
|
||||
static int cl_vi_end __P((GS *));
|
||||
static int cl_vi_init __P((SCR *));
|
||||
static int cl_putenv __P((char *, char *, u_long));
|
||||
|
||||
/*
|
||||
* cl_screen --
|
||||
* Switch screen types.
|
||||
*
|
||||
* PUBLIC: int cl_screen __P((SCR *, u_int32_t));
|
||||
*/
|
||||
int
|
||||
cl_screen(sp, flags)
|
||||
SCR *sp;
|
||||
u_int32_t flags;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
GS *gp;
|
||||
|
||||
gp = sp->gp;
|
||||
clp = CLP(sp);
|
||||
|
||||
/* See if the current information is incorrect. */
|
||||
if (F_ISSET(gp, G_SRESTART)) {
|
||||
if (cl_quit(gp))
|
||||
return (1);
|
||||
F_CLR(gp, G_SRESTART);
|
||||
}
|
||||
|
||||
/* See if we're already in the right mode. */
|
||||
if (LF_ISSET(SC_EX) && F_ISSET(sp, SC_SCR_EX) ||
|
||||
LF_ISSET(SC_VI) && F_ISSET(sp, SC_SCR_VI))
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Fake leaving ex mode.
|
||||
*
|
||||
* We don't actually exit ex or vi mode unless forced (e.g. by a window
|
||||
* size change). This is because many curses implementations can't be
|
||||
* called twice in a single program. Plus, it's faster. If the editor
|
||||
* "leaves" vi to enter ex, when it exits ex we'll just fall back into
|
||||
* vi.
|
||||
*/
|
||||
if (F_ISSET(sp, SC_SCR_EX))
|
||||
F_CLR(sp, SC_SCR_EX);
|
||||
|
||||
/*
|
||||
* Fake leaving vi mode.
|
||||
*
|
||||
* Clear out the rest of the screen if we're in the middle of a split
|
||||
* screen. Move to the last line in the current screen -- this makes
|
||||
* terminal scrolling happen naturally. Note: *don't* move past the
|
||||
* end of the screen, as there are ex commands (e.g., :read ! cat file)
|
||||
* that don't want to. Don't clear the info line, its contents may be
|
||||
* valid, e.g. :file|append.
|
||||
*/
|
||||
if (F_ISSET(sp, SC_SCR_VI)) {
|
||||
F_CLR(sp, SC_SCR_VI);
|
||||
|
||||
if (sp->q.cqe_next != (void *)&gp->dq) {
|
||||
(void)move(RLNO(sp, sp->rows), 0);
|
||||
clrtobot();
|
||||
}
|
||||
(void)move(RLNO(sp, sp->rows) - 1, 0);
|
||||
refresh();
|
||||
}
|
||||
|
||||
/* Enter the requested mode. */
|
||||
if (LF_ISSET(SC_EX)) {
|
||||
if (cl_ex_init(sp))
|
||||
return (1);
|
||||
F_SET(clp, CL_IN_EX | CL_SCR_EX_INIT);
|
||||
|
||||
/*
|
||||
* If doing an ex screen for ex mode, move to the last line
|
||||
* on the screen.
|
||||
*/
|
||||
if (F_ISSET(sp, SC_EX) && clp->cup != NULL)
|
||||
tputs(tgoto(clp->cup,
|
||||
0, O_VAL(sp, O_LINES) - 1), 1, cl_putchar);
|
||||
} else {
|
||||
if (cl_vi_init(sp))
|
||||
return (1);
|
||||
F_CLR(clp, CL_IN_EX);
|
||||
F_SET(clp, CL_SCR_VI_INIT);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_quit --
|
||||
* Shutdown the screens.
|
||||
*
|
||||
* PUBLIC: int cl_quit __P((GS *));
|
||||
*/
|
||||
int
|
||||
cl_quit(gp)
|
||||
GS *gp;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
int rval;
|
||||
|
||||
rval = 0;
|
||||
clp = GCLP(gp);
|
||||
|
||||
/*
|
||||
* If we weren't really running, ignore it. This happens if the
|
||||
* screen changes size before we've called curses.
|
||||
*/
|
||||
if (!F_ISSET(clp, CL_SCR_EX_INIT | CL_SCR_VI_INIT))
|
||||
return (0);
|
||||
|
||||
/* Clean up the terminal mappings. */
|
||||
if (cl_term_end(gp))
|
||||
rval = 1;
|
||||
|
||||
/* Really leave vi mode. */
|
||||
if (F_ISSET(clp, CL_STDIN_TTY) &&
|
||||
F_ISSET(clp, CL_SCR_VI_INIT) && cl_vi_end(gp))
|
||||
rval = 1;
|
||||
|
||||
/* Really leave ex mode. */
|
||||
if (F_ISSET(clp, CL_STDIN_TTY) &&
|
||||
F_ISSET(clp, CL_SCR_EX_INIT) && cl_ex_end(gp))
|
||||
rval = 1;
|
||||
|
||||
/*
|
||||
* If we were running ex when we quit, or we're using an implementation
|
||||
* of curses where endwin() doesn't get this right, restore the original
|
||||
* terminal modes.
|
||||
*
|
||||
* XXX
|
||||
* We always do this because it's too hard to figure out what curses
|
||||
* implementations get it wrong. It may discard type-ahead characters
|
||||
* from the tty queue.
|
||||
*/
|
||||
(void)tcsetattr(STDIN_FILENO, TCSADRAIN | TCSASOFT, &clp->orig);
|
||||
|
||||
F_CLR(clp, CL_SCR_EX_INIT | CL_SCR_VI_INIT);
|
||||
return (rval);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_vi_init --
|
||||
* Initialize the curses vi screen.
|
||||
*/
|
||||
static int
|
||||
cl_vi_init(sp)
|
||||
SCR *sp;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
GS *gp;
|
||||
char *o_cols, *o_lines, *o_term, *ttype;
|
||||
|
||||
gp = sp->gp;
|
||||
clp = CLP(sp);
|
||||
|
||||
/* If already initialized, just set the terminal modes. */
|
||||
if (F_ISSET(clp, CL_SCR_VI_INIT))
|
||||
goto fast;
|
||||
|
||||
/* Curses vi always reads from (and writes to) a terminal. */
|
||||
if (!F_ISSET(clp, CL_STDIN_TTY) || !isatty(STDOUT_FILENO)) {
|
||||
msgq(sp, M_ERR,
|
||||
"016|Vi's standard input and output must be a terminal");
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* We'll need a terminal type. */
|
||||
if (opts_empty(sp, O_TERM, 0))
|
||||
return (1);
|
||||
ttype = O_STR(sp, O_TERM);
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* Changing the row/column and terminal values is done by putting them
|
||||
* into the environment, which is then read by curses. What this loses
|
||||
* in ugliness, it makes up for in stupidity. We can't simply put the
|
||||
* values into the environment ourselves, because in the presence of a
|
||||
* kernel mechanism for returning the window size, entering values into
|
||||
* the environment will screw up future screen resizing events, e.g. if
|
||||
* the user enters a :shell command and then resizes their window. So,
|
||||
* if they weren't already in the environment, we make sure to delete
|
||||
* them immediately after setting them.
|
||||
*
|
||||
* XXX
|
||||
* Putting the TERM variable into the environment is necessary, even
|
||||
* though we're using newterm() here. We may be using initscr() as
|
||||
* the underlying function.
|
||||
*/
|
||||
o_term = getenv("TERM");
|
||||
cl_putenv("TERM", ttype, 0);
|
||||
o_lines = getenv("LINES");
|
||||
cl_putenv("LINES", NULL, (u_long)O_VAL(sp, O_LINES));
|
||||
o_cols = getenv("COLUMNS");
|
||||
cl_putenv("COLUMNS", NULL, (u_long)O_VAL(sp, O_COLUMNS));
|
||||
|
||||
/*
|
||||
* We don't care about the SCREEN reference returned by newterm, we
|
||||
* never have more than one SCREEN at a time.
|
||||
*
|
||||
* XXX
|
||||
* The SunOS initscr() can't be called twice. Don't even think about
|
||||
* using it. It fails in subtle ways (e.g. select(2) on fileno(stdin)
|
||||
* stops working). (The SVID notes that applications should only call
|
||||
* initscr() once.)
|
||||
*
|
||||
* XXX
|
||||
* The HP/UX newterm doesn't support the NULL first argument, so we
|
||||
* have to specify the terminal type.
|
||||
*/
|
||||
errno = 0;
|
||||
if (newterm(ttype, stdout, stdin) == NULL) {
|
||||
if (errno)
|
||||
msgq(sp, M_SYSERR, "%s", ttype);
|
||||
else
|
||||
msgq(sp, M_ERR, "%s: unknown terminal type", ttype);
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (o_term == NULL)
|
||||
unsetenv("TERM");
|
||||
if (o_lines == NULL)
|
||||
unsetenv("LINES");
|
||||
if (o_cols == NULL)
|
||||
unsetenv("COLUMNS");
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* Someone got let out alone without adult supervision -- the SunOS
|
||||
* newterm resets the signal handlers. There's a race, but it's not
|
||||
* worth closing.
|
||||
*/
|
||||
(void)sig_init(sp->gp, sp);
|
||||
|
||||
/*
|
||||
* We use raw mode. What we want is 8-bit clean, however, signals
|
||||
* and flow control should continue to work. Admittedly, it sounds
|
||||
* like cbreak, but it isn't. Using cbreak() can get you additional
|
||||
* things like IEXTEN, which turns on flags like DISCARD and LNEXT.
|
||||
*
|
||||
* !!!
|
||||
* If raw isn't turning off echo and newlines, something's wrong.
|
||||
* However, it shouldn't hurt.
|
||||
*/
|
||||
noecho(); /* No character echo. */
|
||||
nonl(); /* No CR/NL translation. */
|
||||
raw(); /* 8-bit clean. */
|
||||
idlok(stdscr, 1); /* Use hardware insert/delete line. */
|
||||
|
||||
/* Put the cursor keys into application mode. */
|
||||
(void)keypad(stdscr, TRUE);
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* The screen TI sequence just got sent. See the comment in
|
||||
* cl_funcs.c:cl_attr().
|
||||
*/
|
||||
clp->ti_te = TI_SENT;
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* Historic implementations of curses handled SIGTSTP signals
|
||||
* in one of three ways. They either:
|
||||
*
|
||||
* 1: Set their own handler, regardless.
|
||||
* 2: Did not set a handler if a handler was already installed.
|
||||
* 3: Set their own handler, but then called any previously set
|
||||
* handler after completing their own cleanup.
|
||||
*
|
||||
* We don't try and figure out which behavior is in place, we force
|
||||
* it to SIG_DFL after initializing the curses interface, which means
|
||||
* that curses isn't going to take the signal. Since curses isn't
|
||||
* reentrant (i.e., the whole curses SIGTSTP interface is a fantasy),
|
||||
* we're doing The Right Thing.
|
||||
*/
|
||||
(void)signal(SIGTSTP, SIG_DFL);
|
||||
|
||||
/*
|
||||
* If flow control was on, turn it back on. Turn signals on. ISIG
|
||||
* turns on VINTR, VQUIT, VDSUSP and VSUSP. The main curses code
|
||||
* already installed a handler for VINTR. We're going to disable the
|
||||
* other three.
|
||||
*
|
||||
* XXX
|
||||
* We want to use ^Y as a vi scrolling command. If the user has the
|
||||
* DSUSP character set to ^Y (common practice) clean it up. As it's
|
||||
* equally possible that the user has VDSUSP set to 'a', we disable
|
||||
* it regardless. It doesn't make much sense to suspend vi at read,
|
||||
* so I don't think anyone will care. Alternatively, we could look
|
||||
* it up in the table of legal command characters and turn it off if
|
||||
* it matches one. VDSUSP wasn't in POSIX 1003.1-1990, so we test for
|
||||
* it.
|
||||
*
|
||||
* XXX
|
||||
* We don't check to see if the user had signals enabled originally.
|
||||
* If they didn't, it's unclear what we're supposed to do here, but
|
||||
* it's also pretty unlikely.
|
||||
*/
|
||||
if (tcgetattr(STDIN_FILENO, &clp->vi_enter)) {
|
||||
msgq(sp, M_SYSERR, "tcgetattr");
|
||||
goto err;
|
||||
}
|
||||
if (clp->orig.c_iflag & IXON)
|
||||
clp->vi_enter.c_iflag |= IXON;
|
||||
if (clp->orig.c_iflag & IXOFF)
|
||||
clp->vi_enter.c_iflag |= IXOFF;
|
||||
|
||||
clp->vi_enter.c_lflag |= ISIG;
|
||||
#ifdef VDSUSP
|
||||
clp->vi_enter.c_cc[VDSUSP] = _POSIX_VDISABLE;
|
||||
#endif
|
||||
clp->vi_enter.c_cc[VQUIT] = _POSIX_VDISABLE;
|
||||
clp->vi_enter.c_cc[VSUSP] = _POSIX_VDISABLE;
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* OSF/1 doesn't turn off the <discard>, <literal-next> or <status>
|
||||
* characters when curses switches into raw mode. It should be OK
|
||||
* to do it explicitly for everyone.
|
||||
*/
|
||||
#ifdef VDISCARD
|
||||
clp->vi_enter.c_cc[VDISCARD] = _POSIX_VDISABLE;
|
||||
#endif
|
||||
#ifdef VLNEXT
|
||||
clp->vi_enter.c_cc[VLNEXT] = _POSIX_VDISABLE;
|
||||
#endif
|
||||
#ifdef VSTATUS
|
||||
clp->vi_enter.c_cc[VSTATUS] = _POSIX_VDISABLE;
|
||||
#endif
|
||||
|
||||
/* Initialize terminal based information. */
|
||||
if (cl_term_init(sp))
|
||||
goto err;
|
||||
|
||||
fast: /* Set the terminal modes. */
|
||||
if (tcsetattr(STDIN_FILENO, TCSASOFT | TCSADRAIN, &clp->vi_enter)) {
|
||||
msgq(sp, M_SYSERR, "tcsetattr");
|
||||
err: (void)cl_vi_end(sp->gp);
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_vi_end --
|
||||
* Shutdown the vi screen.
|
||||
*/
|
||||
static int
|
||||
cl_vi_end(gp)
|
||||
GS *gp;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
|
||||
clp = GCLP(gp);
|
||||
|
||||
/* Restore the cursor keys to normal mode. */
|
||||
(void)keypad(stdscr, FALSE);
|
||||
|
||||
/*
|
||||
* If we were running vi when we quit, scroll the screen up a single
|
||||
* line so we don't lose any information.
|
||||
*
|
||||
* Move to the bottom of the window (some endwin implementations don't
|
||||
* do this for you).
|
||||
*/
|
||||
if (!F_ISSET(clp, CL_IN_EX)) {
|
||||
(void)move(0, 0);
|
||||
(void)deleteln();
|
||||
(void)move(LINES - 1, 0);
|
||||
(void)refresh();
|
||||
}
|
||||
|
||||
cl_freecap(clp);
|
||||
|
||||
/* End curses window. */
|
||||
(void)endwin();
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* The screen TE sequence just got sent. See the comment in
|
||||
* cl_funcs.c:cl_attr().
|
||||
*/
|
||||
clp->ti_te = TE_SENT;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_ex_init --
|
||||
* Initialize the ex screen.
|
||||
*/
|
||||
static int
|
||||
cl_ex_init(sp)
|
||||
SCR *sp;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
|
||||
clp = CLP(sp);
|
||||
|
||||
/* If already initialized, just set the terminal modes. */
|
||||
if (F_ISSET(clp, CL_SCR_EX_INIT))
|
||||
goto fast;
|
||||
|
||||
/* If not reading from a file, we're done. */
|
||||
if (!F_ISSET(clp, CL_STDIN_TTY))
|
||||
return (0);
|
||||
|
||||
/* Get the ex termcap/terminfo strings. */
|
||||
(void)cl_getcap(sp, "cup", &clp->cup);
|
||||
(void)cl_getcap(sp, "smso", &clp->smso);
|
||||
(void)cl_getcap(sp, "rmso", &clp->rmso);
|
||||
(void)cl_getcap(sp, "el", &clp->el);
|
||||
(void)cl_getcap(sp, "cuu1", &clp->cuu1);
|
||||
|
||||
/* Enter_standout_mode and exit_standout_mode are paired. */
|
||||
if (clp->smso == NULL || clp->rmso == NULL) {
|
||||
if (clp->smso != NULL) {
|
||||
free(clp->smso);
|
||||
clp->smso = NULL;
|
||||
}
|
||||
if (clp->rmso != NULL) {
|
||||
free(clp->rmso);
|
||||
clp->rmso = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Turn on canonical mode, with normal input and output processing.
|
||||
* Start with the original terminal settings as the user probably
|
||||
* had them (including any local extensions) set correctly for the
|
||||
* current terminal.
|
||||
*
|
||||
* !!!
|
||||
* We can't get everything that we need portably; for example, ONLCR,
|
||||
* mapping <newline> to <carriage-return> on output isn't required
|
||||
* by POSIX 1003.1b-1993. If this turns out to be a problem, then
|
||||
* we'll either have to play some games on the mapping, or we'll have
|
||||
* to make all ex printf's output \r\n instead of \n.
|
||||
*/
|
||||
clp->ex_enter = clp->orig;
|
||||
clp->ex_enter.c_lflag |= ECHO | ECHOE | ECHOK | ICANON | IEXTEN | ISIG;
|
||||
#ifdef ECHOCTL
|
||||
clp->ex_enter.c_lflag |= ECHOCTL;
|
||||
#endif
|
||||
#ifdef ECHOKE
|
||||
clp->ex_enter.c_lflag |= ECHOKE;
|
||||
#endif
|
||||
clp->ex_enter.c_iflag |= ICRNL;
|
||||
clp->ex_enter.c_oflag |= OPOST;
|
||||
#ifdef ONLCR
|
||||
clp->ex_enter.c_oflag |= ONLCR;
|
||||
#endif
|
||||
|
||||
fast: if (tcsetattr(STDIN_FILENO, TCSADRAIN | TCSASOFT, &clp->ex_enter)) {
|
||||
msgq(sp, M_SYSERR, "tcsetattr");
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_ex_end --
|
||||
* Shutdown the ex screen.
|
||||
*/
|
||||
static int
|
||||
cl_ex_end(gp)
|
||||
GS *gp;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
|
||||
clp = GCLP(gp);
|
||||
|
||||
cl_freecap(clp);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_getcap --
|
||||
* Retrieve termcap/terminfo strings.
|
||||
*
|
||||
* PUBLIC: int cl_getcap __P((SCR *, char *, char **));
|
||||
*/
|
||||
int
|
||||
cl_getcap(sp, name, elementp)
|
||||
SCR *sp;
|
||||
char *name, **elementp;
|
||||
{
|
||||
size_t len;
|
||||
char *t;
|
||||
|
||||
if ((t = tigetstr(name)) != NULL &&
|
||||
t != (char *)-1 && (len = strlen(t)) != 0) {
|
||||
MALLOC_RET(sp, *elementp, char *, len + 1);
|
||||
memmove(*elementp, t, len + 1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_freecap --
|
||||
* Free any allocated termcap/terminfo strings.
|
||||
*/
|
||||
static void
|
||||
cl_freecap(clp)
|
||||
CL_PRIVATE *clp;
|
||||
{
|
||||
if (clp->el != NULL) {
|
||||
free(clp->el);
|
||||
clp->el = NULL;
|
||||
}
|
||||
if (clp->cup != NULL) {
|
||||
free(clp->cup);
|
||||
clp->cup = NULL;
|
||||
}
|
||||
if (clp->cuu1 != NULL) {
|
||||
free(clp->cuu1);
|
||||
clp->cuu1 = NULL;
|
||||
}
|
||||
if (clp->rmso != NULL) {
|
||||
free(clp->rmso);
|
||||
clp->rmso = NULL;
|
||||
}
|
||||
if (clp->smso != NULL) {
|
||||
free(clp->smso);
|
||||
clp->smso = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_putenv --
|
||||
* Put a value into the environment.
|
||||
*/
|
||||
static int
|
||||
cl_putenv(name, str, value)
|
||||
char *name, *str;
|
||||
u_long value;
|
||||
|
||||
{
|
||||
char buf[40];
|
||||
|
||||
if (str == NULL) {
|
||||
(void)snprintf(buf, sizeof(buf), "%lu", value);
|
||||
return (setenv(name, buf, 1));
|
||||
} else
|
||||
return (setenv(name, str, 1));
|
||||
}
|
459
contrib/nvi/cl/cl_term.c
Normal file
459
contrib/nvi/cl/cl_term.c
Normal file
@ -0,0 +1,459 @@
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)cl_term.c 10.22 (Berkeley) 9/15/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <curses.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../common/common.h"
|
||||
#include "cl.h"
|
||||
|
||||
static int cl_pfmap __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t));
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* THIS REQUIRES THAT ALL SCREENS SHARE A TERMINAL TYPE.
|
||||
*/
|
||||
typedef struct _tklist {
|
||||
char *ts; /* Key's termcap string. */
|
||||
char *output; /* Corresponding vi command. */
|
||||
char *name; /* Name. */
|
||||
u_char value; /* Special value (for lookup). */
|
||||
} TKLIST;
|
||||
static TKLIST const c_tklist[] = { /* Command mappings. */
|
||||
{"kil1", "O", "insert line"},
|
||||
{"kdch1", "x", "delete character"},
|
||||
{"kcud1", "j", "cursor down"},
|
||||
{"kel", "D", "delete to eol"},
|
||||
{"kind", "\004", "scroll down"}, /* ^D */
|
||||
{"kll", "$", "go to eol"},
|
||||
{"khome", "^", "go to sol"},
|
||||
{"kich1", "i", "insert at cursor"},
|
||||
{"kdl1", "dd", "delete line"},
|
||||
{"kcub1", "h", "cursor left"},
|
||||
{"knp", "\006", "page down"}, /* ^F */
|
||||
{"kpp", "\002", "page up"}, /* ^B */
|
||||
{"kri", "\025", "scroll up"}, /* ^U */
|
||||
{"ked", "dG", "delete to end of screen"},
|
||||
{"kcuf1", "l", "cursor right"},
|
||||
{"kcuu1", "k", "cursor up"},
|
||||
{NULL},
|
||||
};
|
||||
static TKLIST const m1_tklist[] = { /* Input mappings (lookup). */
|
||||
{NULL},
|
||||
};
|
||||
static TKLIST const m2_tklist[] = { /* Input mappings (set or delete). */
|
||||
{"kcud1", "\033ja", "cursor down"}, /* ^[ja */
|
||||
{"kcub1", "\033ha", "cursor left"}, /* ^[ha */
|
||||
{"kcuu1", "\033ka", "cursor up"}, /* ^[ka */
|
||||
{"kcuf1", "\033la", "cursor right"}, /* ^[la */
|
||||
{NULL},
|
||||
};
|
||||
|
||||
/*
|
||||
* cl_term_init --
|
||||
* Initialize the special keys defined by the termcap/terminfo entry.
|
||||
*
|
||||
* PUBLIC: int cl_term_init __P((SCR *));
|
||||
*/
|
||||
int
|
||||
cl_term_init(sp)
|
||||
SCR *sp;
|
||||
{
|
||||
KEYLIST *kp;
|
||||
SEQ *qp;
|
||||
TKLIST const *tkp;
|
||||
char *t;
|
||||
|
||||
/* Command mappings. */
|
||||
for (tkp = c_tklist; tkp->name != NULL; ++tkp) {
|
||||
if ((t = tigetstr(tkp->ts)) == NULL || t == (char *)-1)
|
||||
continue;
|
||||
if (seq_set(sp, tkp->name, strlen(tkp->name), t, strlen(t),
|
||||
tkp->output, strlen(tkp->output), SEQ_COMMAND,
|
||||
SEQ_NOOVERWRITE | SEQ_SCREEN))
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* Input mappings needing to be looked up. */
|
||||
for (tkp = m1_tklist; tkp->name != NULL; ++tkp) {
|
||||
if ((t = tigetstr(tkp->ts)) == NULL || t == (char *)-1)
|
||||
continue;
|
||||
for (kp = keylist;; ++kp)
|
||||
if (kp->value == tkp->value)
|
||||
break;
|
||||
if (kp == NULL)
|
||||
continue;
|
||||
if (seq_set(sp, tkp->name, strlen(tkp->name), t, strlen(t),
|
||||
&kp->ch, 1, SEQ_INPUT, SEQ_NOOVERWRITE | SEQ_SCREEN))
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* Input mappings that are already set or are text deletions. */
|
||||
for (tkp = m2_tklist; tkp->name != NULL; ++tkp) {
|
||||
if ((t = tigetstr(tkp->ts)) == NULL || t == (char *)-1)
|
||||
continue;
|
||||
/*
|
||||
* !!!
|
||||
* Some terminals' <cursor_left> keys send single <backspace>
|
||||
* characters. This is okay in command mapping, but not okay
|
||||
* in input mapping. That combination is the only one we'll
|
||||
* ever see, hopefully, so kluge it here for now.
|
||||
*/
|
||||
if (!strcmp(t, "\b"))
|
||||
continue;
|
||||
if (tkp->output == NULL) {
|
||||
if (seq_set(sp, tkp->name, strlen(tkp->name),
|
||||
t, strlen(t), NULL, 0,
|
||||
SEQ_INPUT, SEQ_NOOVERWRITE | SEQ_SCREEN))
|
||||
return (1);
|
||||
} else
|
||||
if (seq_set(sp, tkp->name, strlen(tkp->name),
|
||||
t, strlen(t), tkp->output, strlen(tkp->output),
|
||||
SEQ_INPUT, SEQ_NOOVERWRITE | SEQ_SCREEN))
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Rework any function key mappings that were set before the
|
||||
* screen was initialized.
|
||||
*/
|
||||
for (qp = sp->gp->seqq.lh_first; qp != NULL; qp = qp->q.le_next)
|
||||
if (F_ISSET(qp, SEQ_FUNCMAP))
|
||||
(void)cl_pfmap(sp, qp->stype,
|
||||
qp->input, qp->ilen, qp->output, qp->olen);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_term_end --
|
||||
* End the special keys defined by the termcap/terminfo entry.
|
||||
*
|
||||
* PUBLIC: int cl_term_end __P((GS *));
|
||||
*/
|
||||
int
|
||||
cl_term_end(gp)
|
||||
GS *gp;
|
||||
{
|
||||
SEQ *qp, *nqp;
|
||||
|
||||
/* Delete screen specific mappings. */
|
||||
for (qp = gp->seqq.lh_first; qp != NULL; qp = nqp) {
|
||||
nqp = qp->q.le_next;
|
||||
if (F_ISSET(qp, SEQ_SCREEN))
|
||||
(void)seq_mdel(qp);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_fmap --
|
||||
* Map a function key.
|
||||
*
|
||||
* PUBLIC: int cl_fmap __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t));
|
||||
*/
|
||||
int
|
||||
cl_fmap(sp, stype, from, flen, to, tlen)
|
||||
SCR *sp;
|
||||
seq_t stype;
|
||||
CHAR_T *from, *to;
|
||||
size_t flen, tlen;
|
||||
{
|
||||
/* Ignore until the screen is running, do the real work then. */
|
||||
if (F_ISSET(sp, SC_VI) && !F_ISSET(sp, SC_SCR_VI))
|
||||
return (0);
|
||||
if (F_ISSET(sp, SC_EX) && !F_ISSET(sp, SC_SCR_EX))
|
||||
return (0);
|
||||
|
||||
return (cl_pfmap(sp, stype, from, flen, to, tlen));
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_pfmap --
|
||||
* Map a function key (private version).
|
||||
*/
|
||||
static int
|
||||
cl_pfmap(sp, stype, from, flen, to, tlen)
|
||||
SCR *sp;
|
||||
seq_t stype;
|
||||
CHAR_T *from, *to;
|
||||
size_t flen, tlen;
|
||||
{
|
||||
size_t nlen;
|
||||
char *p, keyname[64];
|
||||
|
||||
(void)snprintf(keyname, sizeof(keyname), "kf%d", atoi(from + 1));
|
||||
if ((p = tigetstr(keyname)) == NULL ||
|
||||
p == (char *)-1 || strlen(p) == 0)
|
||||
p = NULL;
|
||||
if (p == NULL) {
|
||||
msgq_str(sp, M_ERR, from, "233|This terminal has no %s key");
|
||||
return (1);
|
||||
}
|
||||
|
||||
nlen = snprintf(keyname,
|
||||
sizeof(keyname), "function key %d", atoi(from + 1));
|
||||
return (seq_set(sp, keyname, nlen,
|
||||
p, strlen(p), to, tlen, stype, SEQ_NOOVERWRITE | SEQ_SCREEN));
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_optchange --
|
||||
* Curses screen specific "option changed" routine.
|
||||
*
|
||||
* PUBLIC: int cl_optchange __P((SCR *, int, char *, u_long *));
|
||||
*/
|
||||
int
|
||||
cl_optchange(sp, opt, str, valp)
|
||||
SCR *sp;
|
||||
int opt;
|
||||
char *str;
|
||||
u_long *valp;
|
||||
{
|
||||
CL_PRIVATE *clp;
|
||||
|
||||
clp = CLP(sp);
|
||||
|
||||
switch (opt) {
|
||||
case O_COLUMNS:
|
||||
case O_LINES:
|
||||
case O_TERM:
|
||||
/*
|
||||
* Changing the columns, lines or terminal require that
|
||||
* we restart the screen.
|
||||
*/
|
||||
F_SET(sp->gp, G_SRESTART);
|
||||
F_CLR(sp, SC_SCR_EX | SC_SCR_VI);
|
||||
break;
|
||||
case O_MESG:
|
||||
(void)cl_omesg(sp, clp, !*valp);
|
||||
break;
|
||||
case O_WINDOWNAME:
|
||||
if (*valp) {
|
||||
F_CLR(clp, CL_RENAME_OK);
|
||||
|
||||
(void)cl_rename(sp, NULL, 0);
|
||||
} else {
|
||||
F_SET(clp, CL_RENAME_OK);
|
||||
|
||||
/*
|
||||
* If the screen is live, i.e. we're not reading the
|
||||
* .exrc file, update the window.
|
||||
*/
|
||||
if (sp->frp != NULL && sp->frp->name != NULL)
|
||||
(void)cl_rename(sp, sp->frp->name, 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_omesg --
|
||||
* Turn the tty write permission on or off.
|
||||
*
|
||||
* PUBLIC: int cl_omesg __P((SCR *, CL_PRIVATE *, int));
|
||||
*/
|
||||
int
|
||||
cl_omesg(sp, clp, on)
|
||||
SCR *sp;
|
||||
CL_PRIVATE *clp;
|
||||
int on;
|
||||
{
|
||||
struct stat sb;
|
||||
char *tty;
|
||||
|
||||
/* Find the tty, get the current permissions. */
|
||||
if ((tty = ttyname(STDERR_FILENO)) == NULL) {
|
||||
if (sp != NULL)
|
||||
msgq(sp, M_SYSERR, "stderr");
|
||||
return (1);
|
||||
}
|
||||
if (stat(tty, &sb) < 0) {
|
||||
if (sp != NULL)
|
||||
msgq(sp, M_SYSERR, "%s", tty);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* Save the original status if it's unknown. */
|
||||
if (clp->tgw == TGW_UNKNOWN)
|
||||
clp->tgw = sb.st_mode & S_IWGRP ? TGW_SET : TGW_UNSET;
|
||||
|
||||
/* Toggle the permissions. */
|
||||
if (on) {
|
||||
if (chmod(tty, sb.st_mode | S_IWGRP) < 0) {
|
||||
if (sp != NULL)
|
||||
msgq(sp, M_SYSERR,
|
||||
"046|messages not turned on: %s", tty);
|
||||
return (1);
|
||||
}
|
||||
} else
|
||||
if (chmod(tty, sb.st_mode & ~S_IWGRP) < 0) {
|
||||
if (sp != NULL)
|
||||
msgq(sp, M_SYSERR,
|
||||
"045|messages not turned off: %s", tty);
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_ssize --
|
||||
* Return the terminal size.
|
||||
*
|
||||
* PUBLIC: int cl_ssize __P((SCR *, int, size_t *, size_t *, int *));
|
||||
*/
|
||||
int
|
||||
cl_ssize(sp, sigwinch, rowp, colp, changedp)
|
||||
SCR *sp;
|
||||
int sigwinch;
|
||||
size_t *rowp, *colp;
|
||||
int *changedp;
|
||||
{
|
||||
#ifdef TIOCGWINSZ
|
||||
struct winsize win;
|
||||
#endif
|
||||
size_t col, row;
|
||||
int rval;
|
||||
char *p;
|
||||
|
||||
/* Assume it's changed. */
|
||||
if (changedp != NULL)
|
||||
*changedp = 1;
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* sp may be NULL.
|
||||
*
|
||||
* Get the screen rows and columns. If the values are wrong, it's
|
||||
* not a big deal -- as soon as the user sets them explicitly the
|
||||
* environment will be set and the screen package will use the new
|
||||
* values.
|
||||
*
|
||||
* Try TIOCGWINSZ.
|
||||
*/
|
||||
row = col = 0;
|
||||
#ifdef TIOCGWINSZ
|
||||
if (ioctl(STDERR_FILENO, TIOCGWINSZ, &win) != -1) {
|
||||
row = win.ws_row;
|
||||
col = win.ws_col;
|
||||
}
|
||||
#endif
|
||||
/* If here because of suspend or a signal, only trust TIOCGWINSZ. */
|
||||
if (sigwinch) {
|
||||
/*
|
||||
* Somebody didn't get TIOCGWINSZ right, or has suspend
|
||||
* without window resizing support. The user just lost,
|
||||
* but there's nothing we can do.
|
||||
*/
|
||||
if (row == 0 || col == 0) {
|
||||
if (changedp != NULL)
|
||||
*changedp = 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* SunOS systems deliver SIGWINCH when windows are uncovered
|
||||
* as well as when they change size. In addition, we call
|
||||
* here when continuing after being suspended since the window
|
||||
* may have changed size. Since we don't want to background
|
||||
* all of the screens just because the window was uncovered,
|
||||
* ignore the signal if there's no change.
|
||||
*/
|
||||
if (sp != NULL &&
|
||||
row == O_VAL(sp, O_LINES) && col == O_VAL(sp, O_COLUMNS)) {
|
||||
if (changedp != NULL)
|
||||
*changedp = 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (rowp != NULL)
|
||||
*rowp = row;
|
||||
if (colp != NULL)
|
||||
*colp = col;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* If TIOCGWINSZ failed, or had entries of 0, try termcap. This
|
||||
* routine is called before any termcap or terminal information
|
||||
* has been set up. If there's no TERM environmental variable set,
|
||||
* let it go, at least ex can run.
|
||||
*/
|
||||
if (row == 0 || col == 0) {
|
||||
if ((p = getenv("TERM")) == NULL)
|
||||
goto noterm;
|
||||
if (row == 0)
|
||||
if ((rval = tigetnum("lines")) < 0)
|
||||
msgq(sp, M_SYSERR, "tigetnum: lines");
|
||||
else
|
||||
row = rval;
|
||||
if (col == 0)
|
||||
if ((rval = tigetnum("cols")) < 0)
|
||||
msgq(sp, M_SYSERR, "tigetnum: cols");
|
||||
else
|
||||
col = rval;
|
||||
}
|
||||
|
||||
/* If nothing else, well, it's probably a VT100. */
|
||||
noterm: if (row == 0)
|
||||
row = 24;
|
||||
if (col == 0)
|
||||
col = 80;
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* POSIX 1003.2 requires the environment to override everything.
|
||||
* Often, people can get nvi to stop messing up their screen by
|
||||
* deleting the LINES and COLUMNS environment variables from their
|
||||
* dot-files.
|
||||
*/
|
||||
if ((p = getenv("LINES")) != NULL)
|
||||
row = strtol(p, NULL, 10);
|
||||
if ((p = getenv("COLUMNS")) != NULL)
|
||||
col = strtol(p, NULL, 10);
|
||||
|
||||
if (rowp != NULL)
|
||||
*rowp = row;
|
||||
if (colp != NULL)
|
||||
*colp = col;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cl_putchar --
|
||||
* Function version of putchar, for tputs.
|
||||
*
|
||||
* PUBLIC: int cl_putchar __P((int));
|
||||
*/
|
||||
int
|
||||
cl_putchar(ch)
|
||||
int ch;
|
||||
{
|
||||
return (putchar(ch));
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
/*
|
||||
* Copyright (c) 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -31,99 +31,60 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)ex_abbrev.c 8.12 (Berkeley) 8/14/94";
|
||||
#endif /* not lint */
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)bsearch.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <termios.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
|
||||
#include "vi.h"
|
||||
#include "excmd.h"
|
||||
#include "../vi/vcmd.h"
|
||||
#include "port.h"
|
||||
|
||||
/*
|
||||
* ex_abbr -- :abbreviate [key replacement]
|
||||
* Create an abbreviation or display abbreviations.
|
||||
* Perform a binary search.
|
||||
*
|
||||
* The code below is a bit sneaky. After a comparison fails, we
|
||||
* divide the work in half by moving either left or right. If lim
|
||||
* is odd, moving left simply involves halving lim: e.g., when lim
|
||||
* is 5 we look at item 2, so we change lim to 2 so that we will
|
||||
* look at items 0 & 1. If lim is even, the same applies. If lim
|
||||
* is odd, moving right again involes halving lim, this time moving
|
||||
* the base up one item past p: e.g., when lim is 5 we change base
|
||||
* to item 3 and make lim 2 so that we will look at items 3 and 4.
|
||||
* If lim is even, however, we have to shrink it by one before
|
||||
* halving: e.g., when lim is 4, we still looked at item 2, so we
|
||||
* have to make lim 3, then halve, obtaining 1, so that we will only
|
||||
* look at item 3.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_BSEARCH
|
||||
* PUBLIC: void *bsearch __P((const void *, const void *, size_t,
|
||||
* PUBLIC: size_t, int (*)(const void *, const void *)));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
ex_abbr(sp, ep, cmdp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
EXCMDARG *cmdp;
|
||||
void *
|
||||
bsearch(key, base0, nmemb, size, compar)
|
||||
register const void *key;
|
||||
const void *base0;
|
||||
size_t nmemb;
|
||||
register size_t size;
|
||||
register int (*compar) __P((const void *, const void *));
|
||||
{
|
||||
CHAR_T *p;
|
||||
size_t len;
|
||||
register const char *base = base0;
|
||||
register size_t lim;
|
||||
register int cmp;
|
||||
register const void *p;
|
||||
|
||||
switch (cmdp->argc) {
|
||||
case 0:
|
||||
if (seq_dump(sp, SEQ_ABBREV, 0) == 0)
|
||||
msgq(sp, M_INFO, "No abbreviations to display");
|
||||
return (0);
|
||||
case 2:
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
for (lim = nmemb; lim != 0; lim >>= 1) {
|
||||
p = base + (lim >> 1) * size;
|
||||
cmp = (*compar)(key, p);
|
||||
if (cmp == 0)
|
||||
return ((void *)p);
|
||||
if (cmp > 0) { /* key > p: move right */
|
||||
base = (char *)p + size;
|
||||
lim--;
|
||||
} /* else move left */
|
||||
}
|
||||
|
||||
/* Check for illegal characters. */
|
||||
for (p = cmdp->argv[0]->bp, len = cmdp->argv[0]->len; len--; ++p)
|
||||
if (!inword(*p)) {
|
||||
msgq(sp, M_ERR,
|
||||
"%s may not be part of an abbreviated word",
|
||||
KEY_NAME(sp, *p));
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (seq_set(sp, NULL, 0, cmdp->argv[0]->bp, cmdp->argv[0]->len,
|
||||
cmdp->argv[1]->bp, cmdp->argv[1]->len, SEQ_ABBREV, SEQ_USERDEF))
|
||||
return (1);
|
||||
|
||||
F_SET(sp->gp, G_ABBREV);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* ex_unabbr -- :unabbreviate key
|
||||
* Delete an abbreviation.
|
||||
*/
|
||||
int
|
||||
ex_unabbr(sp, ep, cmdp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
EXCMDARG *cmdp;
|
||||
{
|
||||
ARGS *ap;
|
||||
|
||||
ap = cmdp->argv[0];
|
||||
if (!F_ISSET(sp->gp, G_ABBREV) ||
|
||||
seq_delete(sp, ap->bp, ap->len, SEQ_ABBREV)) {
|
||||
msgq(sp, M_ERR, "\"%s\" is not an abbreviation", ap->bp);
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* abbr_save --
|
||||
* Save the abbreviation sequences to a file.
|
||||
*/
|
||||
int
|
||||
abbr_save(sp, fp)
|
||||
SCR *sp;
|
||||
FILE *fp;
|
||||
{
|
||||
return (seq_save(sp, fp, "abbreviate ", SEQ_ABBREV));
|
||||
return (NULL);
|
||||
}
|
160
contrib/nvi/clib/env.c
Normal file
160
contrib/nvi/clib/env.c
Normal file
@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Copyright (c) 1987, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)getenv.c 8.1 (Berkeley) 6/4/93";
|
||||
static const char sccsid[] = "@(#)setenv.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* __findenv --
|
||||
* Returns pointer to value associated with name, if any, else NULL.
|
||||
* Sets offset to be the offset of the name/value combination in the
|
||||
* environmental array, for use by setenv(3) and unsetenv(3).
|
||||
* Explicitly removes '=' in argument name.
|
||||
*
|
||||
* This routine *should* be a static; don't use it.
|
||||
*/
|
||||
static char *
|
||||
__findenv(name, offset)
|
||||
register char *name;
|
||||
int *offset;
|
||||
{
|
||||
extern char **environ;
|
||||
register int len;
|
||||
register char *np;
|
||||
register char **p, *c;
|
||||
|
||||
if (name == NULL || environ == NULL)
|
||||
return (NULL);
|
||||
for (np = name; *np && *np != '='; ++np)
|
||||
continue;
|
||||
len = np - name;
|
||||
for (p = environ; (c = *p) != NULL; ++p)
|
||||
if (strncmp(c, name, len) == 0 && c[len] == '=') {
|
||||
*offset = p - environ;
|
||||
return (c + len + 1);
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
#ifndef HAVE_SETENV
|
||||
/*
|
||||
* setenv --
|
||||
* Set the value of the environmental variable "name" to be
|
||||
* "value". If rewrite is set, replace any current value.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_SETENV
|
||||
* PUBLIC: int setenv __P((const char *, const char *, int));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
setenv(name, value, rewrite)
|
||||
register char *name;
|
||||
register char *value;
|
||||
int rewrite;
|
||||
{
|
||||
extern char **environ;
|
||||
static int alloced; /* if allocated space before */
|
||||
register char *c;
|
||||
int l_value, offset;
|
||||
|
||||
if (*value == '=') /* no `=' in value */
|
||||
++value;
|
||||
l_value = strlen(value);
|
||||
if ((c = __findenv(name, &offset))) { /* find if already exists */
|
||||
if (!rewrite)
|
||||
return (0);
|
||||
if (strlen(c) >= l_value) { /* old larger; copy over */
|
||||
while (*c++ = *value++);
|
||||
return (0);
|
||||
}
|
||||
} else { /* create new slot */
|
||||
register int cnt;
|
||||
register char **p;
|
||||
|
||||
for (p = environ, cnt = 0; *p; ++p, ++cnt);
|
||||
if (alloced) { /* just increase size */
|
||||
environ = (char **)realloc((char *)environ,
|
||||
(size_t)(sizeof(char *) * (cnt + 2)));
|
||||
if (!environ)
|
||||
return (-1);
|
||||
}
|
||||
else { /* get new space */
|
||||
alloced = 1; /* copy old entries into it */
|
||||
p = malloc((size_t)(sizeof(char *) * (cnt + 2)));
|
||||
if (!p)
|
||||
return (-1);
|
||||
memmove(p, environ, cnt * sizeof(char *));
|
||||
environ = p;
|
||||
}
|
||||
environ[cnt + 1] = NULL;
|
||||
offset = cnt;
|
||||
}
|
||||
for (c = (char *)name; *c && *c != '='; ++c); /* no `=' in name */
|
||||
if (!(environ[offset] = /* name + `=' + value */
|
||||
malloc((size_t)((int)(c - name) + l_value + 2))))
|
||||
return (-1);
|
||||
for (c = environ[offset]; (*c = *name++) && *c != '='; ++c);
|
||||
for (*c++ = '='; *c++ = *value++;);
|
||||
return (0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_UNSETENV
|
||||
/*
|
||||
* unsetenv(name) --
|
||||
* Delete environmental variable "name".
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_UNSETENV
|
||||
* PUBLIC: void unsetenv __P((const char *));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
void
|
||||
unsetenv(name)
|
||||
char *name;
|
||||
{
|
||||
extern char **environ;
|
||||
register char **p;
|
||||
int offset;
|
||||
|
||||
while (__findenv(name, &offset)) /* if set multiple times */
|
||||
for (p = &environ[offset];; ++p)
|
||||
if (!(*p = *(p + 1)))
|
||||
break;
|
||||
}
|
||||
#endif
|
22
contrib/nvi/clib/gethostname.c
Normal file
22
contrib/nvi/clib/gethostname.c
Normal file
@ -0,0 +1,22 @@
|
||||
#include "config.h"
|
||||
|
||||
/*
|
||||
* Solaris doesn't include the gethostname call by default.
|
||||
*/
|
||||
#include <sys/utsname.h>
|
||||
#include <sys/systeminfo.h>
|
||||
|
||||
#include <netdb.h>
|
||||
|
||||
/*
|
||||
* PUBLIC: #ifndef HAVE_GETHOSTNAME
|
||||
* PUBLIC: int gethostname __P((char *, int));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
gethostname(host, len)
|
||||
char *host;
|
||||
int len;
|
||||
{
|
||||
return (sysinfo(SI_HOSTNAME, host, len) == -1 ? -1 : 0);
|
||||
}
|
130
contrib/nvi/clib/getopt.c
Normal file
130
contrib/nvi/clib/getopt.c
Normal file
@ -0,0 +1,130 @@
|
||||
/*
|
||||
* Copyright (c) 1987, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)getopt.c 8.2 (Berkeley) 4/2/94";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
int opterr = 1, /* if error message should be printed */
|
||||
optind = 1, /* index into parent argv vector */
|
||||
optopt, /* character checked for validity */
|
||||
optreset; /* reset getopt */
|
||||
char *optarg; /* argument associated with option */
|
||||
|
||||
#define BADCH (int)'?'
|
||||
#define BADARG (int)':'
|
||||
#define EMSG ""
|
||||
|
||||
/*
|
||||
* getopt --
|
||||
* Parse argc/argv argument vector.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_GETOPT
|
||||
* PUBLIC: int getopt __P((int, char * const *, const char *));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
getopt(nargc, nargv, ostr)
|
||||
int nargc;
|
||||
char * const *nargv;
|
||||
const char *ostr;
|
||||
{
|
||||
static char *progname;
|
||||
static char *place = EMSG; /* option letter processing */
|
||||
char *oli; /* option letter list index */
|
||||
|
||||
if (!progname) {
|
||||
if ((progname = strrchr(*nargv, '/')) == NULL)
|
||||
progname = *nargv;
|
||||
else
|
||||
++progname;
|
||||
}
|
||||
|
||||
if (optreset || !*place) { /* update scanning pointer */
|
||||
optreset = 0;
|
||||
if (optind >= nargc || *(place = nargv[optind]) != '-') {
|
||||
place = EMSG;
|
||||
return (EOF);
|
||||
}
|
||||
if (place[1] && *++place == '-') { /* found "--" */
|
||||
++optind;
|
||||
place = EMSG;
|
||||
return (EOF);
|
||||
}
|
||||
} /* option letter okay? */
|
||||
if ((optopt = (int)*place++) == (int)':' ||
|
||||
!(oli = strchr(ostr, optopt))) {
|
||||
/*
|
||||
* if the user didn't specify '-' as an option,
|
||||
* assume it means EOF.
|
||||
*/
|
||||
if (optopt == (int)'-')
|
||||
return (EOF);
|
||||
if (!*place)
|
||||
++optind;
|
||||
if (opterr && *ostr != ':')
|
||||
(void)fprintf(stderr,
|
||||
"%s: illegal option -- %c\n", progname, optopt);
|
||||
return (BADCH);
|
||||
}
|
||||
if (*++oli != ':') { /* don't need argument */
|
||||
optarg = NULL;
|
||||
if (!*place)
|
||||
++optind;
|
||||
}
|
||||
else { /* need an argument */
|
||||
if (*place) /* no white space */
|
||||
optarg = place;
|
||||
else if (nargc <= ++optind) { /* no arg */
|
||||
place = EMSG;
|
||||
if (*ostr == ':')
|
||||
return (BADARG);
|
||||
if (opterr)
|
||||
(void)fprintf(stderr,
|
||||
"%s: option requires an argument -- %c\n",
|
||||
progname, optopt);
|
||||
return (BADCH);
|
||||
}
|
||||
else /* white space */
|
||||
optarg = nargv[optind];
|
||||
place = EMSG;
|
||||
++optind;
|
||||
}
|
||||
return (optopt); /* dump back option letter */
|
||||
}
|
@ -1,7 +1,10 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* Copyright (c) 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Chris Torek.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
@ -31,36 +34,32 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)ex_source.c 8.5 (Berkeley) 8/8/94";
|
||||
#endif /* not lint */
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)memchr.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <termios.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
|
||||
#include "vi.h"
|
||||
#include "excmd.h"
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* ex_source -- :source file
|
||||
* Execute ex commands from a file.
|
||||
* PUBLIC: #ifndef HAVE_MEMCHR
|
||||
* PUBLIC: void *memchr __P((const void *, int, size_t));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
ex_source(sp, ep, cmdp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
EXCMDARG *cmdp;
|
||||
void *
|
||||
memchr(s, c, n)
|
||||
const void *s;
|
||||
register unsigned char c;
|
||||
register size_t n;
|
||||
{
|
||||
return (ex_cfile(sp, ep, cmdp->argv[0]->bp, 0));
|
||||
if (n != 0) {
|
||||
register const unsigned char *p = s;
|
||||
|
||||
do {
|
||||
if (*p++ == c)
|
||||
return ((void *)(p - 1));
|
||||
} while (--n != 0);
|
||||
}
|
||||
return (NULL);
|
||||
}
|
147
contrib/nvi/clib/memmove.c
Normal file
147
contrib/nvi/clib/memmove.c
Normal file
@ -0,0 +1,147 @@
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Chris Torek.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)bcopy.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* sizeof(word) MUST BE A POWER OF TWO
|
||||
* SO THAT wmask BELOW IS ALL ONES
|
||||
*/
|
||||
typedef int word; /* "word" used for optimal copy speed */
|
||||
|
||||
#define wsize sizeof(word)
|
||||
#define wmask (wsize - 1)
|
||||
|
||||
/*
|
||||
* Copy a block of memory, handling overlap.
|
||||
* This is the routine that actually implements
|
||||
* (the portable versions of) bcopy, memcpy, and memmove.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_MEMCPY
|
||||
* PUBLIC: void *memcpy __P((void *, const void *, size_t));
|
||||
* PUBLIC: #endif
|
||||
* PUBLIC: #ifndef HAVE_MEMMOVE
|
||||
* PUBLIC: void *memmove __P((void *, const void *, size_t));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
#ifdef MEMCOPY
|
||||
void *
|
||||
memcpy(dst0, src0, length)
|
||||
#else
|
||||
#ifdef MEMMOVE
|
||||
void *
|
||||
memmove(dst0, src0, length)
|
||||
#else
|
||||
void
|
||||
bcopy(src0, dst0, length)
|
||||
#endif
|
||||
#endif
|
||||
void *dst0;
|
||||
const void *src0;
|
||||
register size_t length;
|
||||
{
|
||||
register char *dst = dst0;
|
||||
register const char *src = src0;
|
||||
register size_t t;
|
||||
|
||||
if (length == 0 || dst == src) /* nothing to do */
|
||||
goto done;
|
||||
|
||||
/*
|
||||
* Macros: loop-t-times; and loop-t-times, t>0
|
||||
*/
|
||||
#define TLOOP(s) if (t) TLOOP1(s)
|
||||
#define TLOOP1(s) do { s; } while (--t)
|
||||
|
||||
if ((unsigned long)dst < (unsigned long)src) {
|
||||
/*
|
||||
* Copy forward.
|
||||
*/
|
||||
t = (int)src; /* only need low bits */
|
||||
if ((t | (int)dst) & wmask) {
|
||||
/*
|
||||
* Try to align operands. This cannot be done
|
||||
* unless the low bits match.
|
||||
*/
|
||||
if ((t ^ (int)dst) & wmask || length < wsize)
|
||||
t = length;
|
||||
else
|
||||
t = wsize - (t & wmask);
|
||||
length -= t;
|
||||
TLOOP1(*dst++ = *src++);
|
||||
}
|
||||
/*
|
||||
* Copy whole words, then mop up any trailing bytes.
|
||||
*/
|
||||
t = length / wsize;
|
||||
TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize);
|
||||
t = length & wmask;
|
||||
TLOOP(*dst++ = *src++);
|
||||
} else {
|
||||
/*
|
||||
* Copy backwards. Otherwise essentially the same.
|
||||
* Alignment works as before, except that it takes
|
||||
* (t&wmask) bytes to align, not wsize-(t&wmask).
|
||||
*/
|
||||
src += length;
|
||||
dst += length;
|
||||
t = (int)src;
|
||||
if ((t | (int)dst) & wmask) {
|
||||
if ((t ^ (int)dst) & wmask || length <= wsize)
|
||||
t = length;
|
||||
else
|
||||
t &= wmask;
|
||||
length -= t;
|
||||
TLOOP1(*--dst = *--src);
|
||||
}
|
||||
t = length / wsize;
|
||||
TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src);
|
||||
t = length & wmask;
|
||||
TLOOP(*--dst = *--src);
|
||||
}
|
||||
done:
|
||||
#if defined(MEMCOPY) || defined(MEMMOVE)
|
||||
return (dst0);
|
||||
#else
|
||||
return;
|
||||
#endif
|
||||
}
|
137
contrib/nvi/clib/memset.c
Normal file
137
contrib/nvi/clib/memset.c
Normal file
@ -0,0 +1,137 @@
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Mike Hibler and Chris Torek.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)memset.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* PUBLIC: #ifndef HAVE_MEMSET
|
||||
* PUBLIC: void *memset __P((void *, int, size_t));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
#define wsize sizeof(u_int)
|
||||
#define wmask (wsize - 1)
|
||||
|
||||
#ifdef BZERO
|
||||
#define RETURN return
|
||||
#define VAL 0
|
||||
#define WIDEVAL 0
|
||||
|
||||
void
|
||||
bzero(dst0, length)
|
||||
void *dst0;
|
||||
register size_t length;
|
||||
#else
|
||||
#define RETURN return (dst0)
|
||||
#define VAL c0
|
||||
#define WIDEVAL c
|
||||
|
||||
void *
|
||||
memset(dst0, c0, length)
|
||||
void *dst0;
|
||||
register int c0;
|
||||
register size_t length;
|
||||
#endif
|
||||
{
|
||||
register size_t t;
|
||||
register u_int c;
|
||||
register u_char *dst;
|
||||
|
||||
dst = dst0;
|
||||
/*
|
||||
* If not enough words, just fill bytes. A length >= 2 words
|
||||
* guarantees that at least one of them is `complete' after
|
||||
* any necessary alignment. For instance:
|
||||
*
|
||||
* |-----------|-----------|-----------|
|
||||
* |00|01|02|03|04|05|06|07|08|09|0A|00|
|
||||
* ^---------------------^
|
||||
* dst dst+length-1
|
||||
*
|
||||
* but we use a minimum of 3 here since the overhead of the code
|
||||
* to do word writes is substantial.
|
||||
*/
|
||||
if (length < 3 * wsize) {
|
||||
while (length != 0) {
|
||||
*dst++ = VAL;
|
||||
--length;
|
||||
}
|
||||
RETURN;
|
||||
}
|
||||
|
||||
#ifndef BZERO
|
||||
if ((c = (u_char)c0) != 0) { /* Fill the word. */
|
||||
c = (c << 8) | c; /* u_int is 16 bits. */
|
||||
#if UINT_MAX > 0xffff
|
||||
c = (c << 16) | c; /* u_int is 32 bits. */
|
||||
#endif
|
||||
#if UINT_MAX > 0xffffffff
|
||||
c = (c << 32) | c; /* u_int is 64 bits. */
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
/* Align destination by filling in bytes. */
|
||||
if ((t = (int)dst & wmask) != 0) {
|
||||
t = wsize - t;
|
||||
length -= t;
|
||||
do {
|
||||
*dst++ = VAL;
|
||||
} while (--t != 0);
|
||||
}
|
||||
|
||||
/* Fill words. Length was >= 2*words so we know t >= 1 here. */
|
||||
t = length / wsize;
|
||||
do {
|
||||
*(u_int *)dst = WIDEVAL;
|
||||
dst += wsize;
|
||||
} while (--t != 0);
|
||||
|
||||
/* Mop up trailing bytes, if any. */
|
||||
t = length & wmask;
|
||||
if (t != 0)
|
||||
do {
|
||||
*dst++ = VAL;
|
||||
} while (--t != 0);
|
||||
RETURN;
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994
|
||||
/*
|
||||
* Copyright (c) 1987, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -31,98 +31,103 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)ex_preserve.c 8.12 (Berkeley) 8/4/94";
|
||||
#endif /* not lint */
|
||||
#include "config.h"
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
|
||||
#include "vi.h"
|
||||
#include "excmd.h"
|
||||
static int _gettemp();
|
||||
|
||||
/*
|
||||
* ex_preserve -- :pre[serve]
|
||||
* Push the file to recovery.
|
||||
* PUBLIC: #ifndef HAVE_MKSTEMP
|
||||
* PUBLIC: int mkstemp __P((char *));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
ex_preserve(sp, ep, cmdp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
EXCMDARG *cmdp;
|
||||
mkstemp(path)
|
||||
char *path;
|
||||
{
|
||||
recno_t lno;
|
||||
int fd;
|
||||
|
||||
if (!F_ISSET(ep, F_RCV_ON)) {
|
||||
msgq(sp, M_ERR, "Preservation of this file not possible");
|
||||
return (1);
|
||||
return (_gettemp(path, &fd) ? fd : -1);
|
||||
}
|
||||
|
||||
char *
|
||||
mktemp(path)
|
||||
char *path;
|
||||
{
|
||||
return(_gettemp(path, (int *)NULL) ? path : (char *)NULL);
|
||||
}
|
||||
|
||||
static
|
||||
_gettemp(path, doopen)
|
||||
char *path;
|
||||
register int *doopen;
|
||||
{
|
||||
extern int errno;
|
||||
register char *start, *trv;
|
||||
struct stat sbuf;
|
||||
u_int pid;
|
||||
|
||||
pid = getpid();
|
||||
for (trv = path; *trv; ++trv); /* extra X's get set to 0's */
|
||||
while (*--trv == 'X') {
|
||||
*trv = (pid % 10) + '0';
|
||||
pid /= 10;
|
||||
}
|
||||
|
||||
/* If recovery not initialized, do so. */
|
||||
if (F_ISSET(ep, F_FIRSTMODIFY) && rcv_init(sp, ep))
|
||||
return (1);
|
||||
|
||||
/* Force the file to be read in, in case it hasn't yet. */
|
||||
if (file_lline(sp, ep, &lno))
|
||||
return (1);
|
||||
|
||||
/* Sync to disk. */
|
||||
if (rcv_sync(sp, ep, RCV_SNAPSHOT))
|
||||
return (1);
|
||||
|
||||
msgq(sp, M_INFO, "File preserved");
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* ex_recover -- :rec[over][!] file
|
||||
*
|
||||
* Recover the file.
|
||||
*/
|
||||
int
|
||||
ex_recover(sp, ep, cmdp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
EXCMDARG *cmdp;
|
||||
{
|
||||
ARGS *ap;
|
||||
FREF *frp;
|
||||
|
||||
ap = cmdp->argv[0];
|
||||
|
||||
/* Set the alternate file name. */
|
||||
set_alt_name(sp, ap->bp);
|
||||
|
||||
/*
|
||||
* Check for modifications. Autowrite did not historically
|
||||
* affect :recover.
|
||||
* check the target directory; if you have six X's and it
|
||||
* doesn't exist this runs for a *very* long time.
|
||||
*/
|
||||
if (file_m2(sp, ep, F_ISSET(cmdp, E_FORCE)))
|
||||
return (1);
|
||||
for (start = trv + 1;; --trv) {
|
||||
if (trv <= path)
|
||||
break;
|
||||
if (*trv == '/') {
|
||||
*trv = '\0';
|
||||
if (stat(path, &sbuf))
|
||||
return(0);
|
||||
if (!S_ISDIR(sbuf.st_mode)) {
|
||||
errno = ENOTDIR;
|
||||
return(0);
|
||||
}
|
||||
*trv = '/';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get a file structure for the file. */
|
||||
if ((frp = file_add(sp, ap->bp)) == NULL)
|
||||
return (1);
|
||||
for (;;) {
|
||||
if (doopen) {
|
||||
if ((*doopen =
|
||||
open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0)
|
||||
return(1);
|
||||
if (errno != EEXIST)
|
||||
return(0);
|
||||
}
|
||||
else if (stat(path, &sbuf))
|
||||
return(errno == ENOENT ? 1 : 0);
|
||||
|
||||
/* Set the recover bit. */
|
||||
F_SET(frp, FR_RECOVER);
|
||||
|
||||
/* Switch files. */
|
||||
if (file_init(sp, frp, NULL, F_ISSET(cmdp, E_FORCE)))
|
||||
return (1);
|
||||
F_SET(sp, S_FSWITCH);
|
||||
return (0);
|
||||
/* tricky little algorithm for backward compatibility */
|
||||
for (trv = start;;) {
|
||||
if (!*trv)
|
||||
return(0);
|
||||
if (*trv == 'z')
|
||||
*trv++ = 'a';
|
||||
else {
|
||||
if (isdigit(*trv))
|
||||
*trv = 'a';
|
||||
else
|
||||
++*trv;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*NOTREACHED*/
|
||||
}
|
50
contrib/nvi/clib/mmap.c
Normal file
50
contrib/nvi/clib/mmap.c
Normal file
@ -0,0 +1,50 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/*
|
||||
* This function fakes mmap() by reading `len' bytes from the file descriptor
|
||||
* `fd' and returning a pointer to that memory. The "mapped" region can later
|
||||
* be deallocated with munmap().
|
||||
*
|
||||
* Note: ONLY reading is supported and only reading of the exact size of the
|
||||
* file will work.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_MMAP
|
||||
* PUBLIC: char *mmap __P((char *, size_t, int, int, int, off_t));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
char *
|
||||
mmap(addr, len, prot, flags, fd, off)
|
||||
char *addr;
|
||||
size_t len;
|
||||
int prot, flags, fd;
|
||||
off_t off;
|
||||
{
|
||||
char *ptr;
|
||||
|
||||
if ((ptr = (char *)malloc(len)) == 0)
|
||||
return ((char *)-1);
|
||||
if (read(fd, ptr, len) < 0) {
|
||||
free(ptr);
|
||||
return ((char *)-1);
|
||||
}
|
||||
return (ptr);
|
||||
}
|
||||
|
||||
/*
|
||||
* PUBLIC: #ifndef HAVE_MMAP
|
||||
* PUBLIC: int munmap __P((char *, size_t));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
munmap(addr, len)
|
||||
char *addr;
|
||||
size_t len;
|
||||
{
|
||||
free(addr);
|
||||
return (0);
|
||||
}
|
45
contrib/nvi/clib/snprintf.c
Normal file
45
contrib/nvi/clib/snprintf.c
Normal file
@ -0,0 +1,45 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef __STDC__
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
#include <varargs.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* PUBLIC: #ifndef HAVE_SNPRINTF
|
||||
* PUBLIC: int snprintf __P((char *, size_t, const char *, ...));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
#ifdef __STDC__
|
||||
snprintf(char *str, size_t n, const char *fmt, ...)
|
||||
#else
|
||||
snprintf(str, n, fmt, va_alist)
|
||||
char *str;
|
||||
size_t n;
|
||||
const char *fmt;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list ap;
|
||||
int rval;
|
||||
#ifdef __STDC__
|
||||
va_start(ap, fmt);
|
||||
#else
|
||||
va_start(ap);
|
||||
#endif
|
||||
#ifdef SPRINTF_RET_CHARPNT
|
||||
(void)vsprintf(str, fmt, ap);
|
||||
va_end(ap);
|
||||
return (strlen(str));
|
||||
#else
|
||||
rval = vsprintf(str, fmt, ap);
|
||||
va_end(ap);
|
||||
return (rval);
|
||||
#endif
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
/*
|
||||
* Copyright (c) 1988, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -31,37 +31,33 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)v_redraw.c 8.4 (Berkeley) 3/8/94";
|
||||
#endif /* not lint */
|
||||
#include "config.h"
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)strdup.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <termios.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
|
||||
#include "vi.h"
|
||||
#include "vcmd.h"
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* v_redraw -- ^R
|
||||
* Redraw the screen.
|
||||
* PUBLIC: #ifndef HAVE_STRDUP
|
||||
* PUBLIC: char *strdup __P((const char *));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
v_redraw(sp, ep, vp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
VICMDARG *vp;
|
||||
char *
|
||||
strdup(str)
|
||||
const char *str;
|
||||
{
|
||||
F_SET(sp, S_REFRESH);
|
||||
return (0);
|
||||
size_t len;
|
||||
char *copy;
|
||||
|
||||
len = strlen(str) + 1;
|
||||
if (!(copy = malloc((u_int)len)))
|
||||
return (NULL);
|
||||
memcpy(copy, str, len);
|
||||
return (copy);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
/*
|
||||
* Copyright (c) 1988, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -31,45 +31,44 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)v_stop.c 8.7 (Berkeley) 3/8/94";
|
||||
#endif /* not lint */
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)strerror.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
|
||||
#include "vi.h"
|
||||
#include "vcmd.h"
|
||||
|
||||
/*
|
||||
* v_stop -- ^Z
|
||||
* Suspend vi.
|
||||
* PUBLIC: #ifndef HAVE_STRERROR
|
||||
* PUBLIC: char *strerror __P((int));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
v_stop(sp, ep, vp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
VICMDARG *vp;
|
||||
char *
|
||||
strerror(num)
|
||||
int num;
|
||||
{
|
||||
/* If autowrite is set, write out the file. */
|
||||
if (F_ISSET(ep, F_MODIFIED) && O_ISSET(sp, O_AUTOWRITE)) {
|
||||
if (file_write(sp, ep, NULL, NULL, NULL, FS_ALL))
|
||||
return (1);
|
||||
if (sp->s_refresh(sp, ep))
|
||||
return (1);
|
||||
extern int sys_nerr;
|
||||
extern char *sys_errlist[];
|
||||
#define UPREFIX "Unknown error: "
|
||||
static char ebuf[40] = UPREFIX; /* 64-bit number + slop */
|
||||
register unsigned int errnum;
|
||||
register char *p, *t;
|
||||
char tmp[40];
|
||||
|
||||
errnum = num; /* convert to unsigned */
|
||||
if (errnum < sys_nerr)
|
||||
return(sys_errlist[errnum]);
|
||||
|
||||
/* Do this by hand, so we don't include stdio(3). */
|
||||
t = tmp;
|
||||
do {
|
||||
*t++ = "0123456789"[errnum % 10];
|
||||
} while (errnum /= 10);
|
||||
for (p = ebuf + sizeof(UPREFIX) - 1;;) {
|
||||
*p++ = *--t;
|
||||
if (t <= tmp)
|
||||
break;
|
||||
}
|
||||
return (sp->s_suspend(sp));
|
||||
return(ebuf);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
/*
|
||||
* Copyright (c) 1985, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -31,40 +31,32 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)ex_set.c 8.4 (Berkeley) 7/22/94";
|
||||
#endif /* not lint */
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)strpbrk.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <termios.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
|
||||
#include "vi.h"
|
||||
#include "excmd.h"
|
||||
|
||||
int
|
||||
ex_set(sp, ep, cmdp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
EXCMDARG *cmdp;
|
||||
/*
|
||||
* Find the first occurrence in s1 of a character in s2 (excluding NUL).
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_STRPBRK
|
||||
* PUBLIC: char *strpbrk __P((const char *, const char *));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
char *
|
||||
strpbrk(s1, s2)
|
||||
register const char *s1, *s2;
|
||||
{
|
||||
switch(cmdp->argc) {
|
||||
case 0:
|
||||
opts_dump(sp, CHANGED_DISPLAY);
|
||||
break;
|
||||
default:
|
||||
opts_set(sp, cmdp->cmd->usage, cmdp->argv);
|
||||
break;
|
||||
register const char *scanp;
|
||||
register int c, sc;
|
||||
|
||||
while ((c = *s1++) != 0) {
|
||||
for (scanp = s2; (sc = *scanp++) != 0;)
|
||||
if (sc == c)
|
||||
return ((char *)(s1 - 1));
|
||||
}
|
||||
return (0);
|
||||
return (NULL);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* Copyright (c) 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -31,48 +31,55 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)ex_put.c 8.6 (Berkeley) 7/23/94";
|
||||
#endif /* not lint */
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)strsep.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
|
||||
#include "vi.h"
|
||||
#include "excmd.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/*
|
||||
* ex_put -- [line] pu[t] [buffer]
|
||||
* Get next token from string *stringp, where tokens are possibly-empty
|
||||
* strings separated by characters from delim.
|
||||
*
|
||||
* Append a cut buffer into the file.
|
||||
* Writes NULs into the string at *stringp to end tokens.
|
||||
* delim need not remain constant from call to call.
|
||||
* On return, *stringp points past the last NUL written (if there might
|
||||
* be further tokens), or is NULL (if there are definitely no more tokens).
|
||||
*
|
||||
* If *stringp is NULL, strsep returns NULL.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_STRSEP
|
||||
* PUBLIC: char *strsep __P((char **, const char *));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
ex_put(sp, ep, cmdp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
EXCMDARG *cmdp;
|
||||
char *
|
||||
strsep(stringp, delim)
|
||||
register char **stringp;
|
||||
register const char *delim;
|
||||
{
|
||||
MARK m;
|
||||
register char *s;
|
||||
register const char *spanp;
|
||||
register int c, sc;
|
||||
char *tok;
|
||||
|
||||
m.lno = sp->lno;
|
||||
m.cno = sp->cno;
|
||||
if (put(sp, ep, NULL, F_ISSET(cmdp, E_BUFFER) ? &cmdp->buffer : NULL,
|
||||
&cmdp->addr1, &m, 1))
|
||||
return (1);
|
||||
sp->lno = m.lno;
|
||||
sp->cno = m.cno;
|
||||
return (0);
|
||||
if ((s = *stringp) == NULL)
|
||||
return (NULL);
|
||||
for (tok = s;;) {
|
||||
c = *s++;
|
||||
spanp = delim;
|
||||
do {
|
||||
if ((sc = *spanp++) == c) {
|
||||
if (c == 0)
|
||||
s = NULL;
|
||||
else
|
||||
s[-1] = 0;
|
||||
*stringp = s;
|
||||
return (tok);
|
||||
}
|
||||
} while (sc != 0);
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
134
contrib/nvi/clib/strtol.c
Normal file
134
contrib/nvi/clib/strtol.c
Normal file
@ -0,0 +1,134 @@
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)strtol.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <limits.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/*
|
||||
* Convert a string to a long integer.
|
||||
*
|
||||
* Ignores `locale' stuff. Assumes that the upper and lower case
|
||||
* alphabets and digits are each contiguous.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_STRTOL
|
||||
* PUBLIC: long strtol __P((const char *, char **, int));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
long
|
||||
strtol(nptr, endptr, base)
|
||||
const char *nptr;
|
||||
char **endptr;
|
||||
register int base;
|
||||
{
|
||||
register const char *s = nptr;
|
||||
register unsigned long acc;
|
||||
register int c;
|
||||
register unsigned long cutoff;
|
||||
register int neg = 0, any, cutlim;
|
||||
|
||||
/*
|
||||
* Skip white space and pick up leading +/- sign if any.
|
||||
* If base is 0, allow 0x for hex and 0 for octal, else
|
||||
* assume decimal; if base is already 16, allow 0x.
|
||||
*/
|
||||
do {
|
||||
c = *s++;
|
||||
} while (isspace(c));
|
||||
if (c == '-') {
|
||||
neg = 1;
|
||||
c = *s++;
|
||||
} else if (c == '+')
|
||||
c = *s++;
|
||||
if ((base == 0 || base == 16) &&
|
||||
c == '0' && (*s == 'x' || *s == 'X')) {
|
||||
c = s[1];
|
||||
s += 2;
|
||||
base = 16;
|
||||
}
|
||||
if (base == 0)
|
||||
base = c == '0' ? 8 : 10;
|
||||
|
||||
/*
|
||||
* Compute the cutoff value between legal numbers and illegal
|
||||
* numbers. That is the largest legal value, divided by the
|
||||
* base. An input number that is greater than this value, if
|
||||
* followed by a legal input character, is too big. One that
|
||||
* is equal to this value may be valid or not; the limit
|
||||
* between valid and invalid numbers is then based on the last
|
||||
* digit. For instance, if the range for longs is
|
||||
* [-2147483648..2147483647] and the input base is 10,
|
||||
* cutoff will be set to 214748364 and cutlim to either
|
||||
* 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
|
||||
* a value > 214748364, or equal but the next digit is > 7 (or 8),
|
||||
* the number is too big, and we will return a range error.
|
||||
*
|
||||
* Set any if any `digits' consumed; make it negative to indicate
|
||||
* overflow.
|
||||
*/
|
||||
cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX;
|
||||
cutlim = cutoff % (unsigned long)base;
|
||||
cutoff /= (unsigned long)base;
|
||||
for (acc = 0, any = 0;; c = *s++) {
|
||||
if (isdigit(c))
|
||||
c -= '0';
|
||||
else if (isalpha(c))
|
||||
c -= isupper(c) ? 'A' - 10 : 'a' - 10;
|
||||
else
|
||||
break;
|
||||
if (c >= base)
|
||||
break;
|
||||
if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
|
||||
any = -1;
|
||||
else {
|
||||
any = 1;
|
||||
acc *= base;
|
||||
acc += c;
|
||||
}
|
||||
}
|
||||
if (any < 0) {
|
||||
acc = neg ? LONG_MIN : LONG_MAX;
|
||||
errno = ERANGE;
|
||||
} else if (neg)
|
||||
acc = -acc;
|
||||
if (endptr != 0)
|
||||
*endptr = (char *)(any ? s - 1 : nptr);
|
||||
return (acc);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
/*
|
||||
* Copyright (c) 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -31,73 +31,83 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)ex_file.c 8.10 (Berkeley) 8/8/94";
|
||||
#endif /* not lint */
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
|
||||
#include "vi.h"
|
||||
#include "excmd.h"
|
||||
|
||||
/*
|
||||
* ex_file -- :f[ile] [name]
|
||||
* Change the file's name and display the status line.
|
||||
* Convert a string to an unsigned long integer.
|
||||
*
|
||||
* Ignores `locale' stuff. Assumes that the upper and lower case
|
||||
* alphabets and digits are each contiguous.
|
||||
*
|
||||
* PUBLIC: #ifndef HAVE_STRTOUL
|
||||
* PUBLIC: unsigned long strtoul __P((const char *, char **, int));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
ex_file(sp, ep, cmdp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
EXCMDARG *cmdp;
|
||||
unsigned long
|
||||
strtoul(nptr, endptr, base)
|
||||
const char *nptr;
|
||||
char **endptr;
|
||||
register int base;
|
||||
{
|
||||
CHAR_T *p;
|
||||
FREF *frp;
|
||||
register const char *s = nptr;
|
||||
register unsigned long acc;
|
||||
register int c;
|
||||
register unsigned long cutoff;
|
||||
register int neg = 0, any, cutlim;
|
||||
|
||||
switch (cmdp->argc) {
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
frp = sp->frp;
|
||||
|
||||
/* Make sure can allocate enough space. */
|
||||
if ((p = v_strdup(sp,
|
||||
cmdp->argv[0]->bp, cmdp->argv[0]->len)) == NULL)
|
||||
return (1);
|
||||
|
||||
/* If already have a file name, it becomes the alternate. */
|
||||
if (!F_ISSET(frp, FR_TMPFILE))
|
||||
set_alt_name(sp, frp->name);
|
||||
|
||||
/* Free the previous name. */
|
||||
free(frp->name);
|
||||
frp->name = p;
|
||||
|
||||
/*
|
||||
* The read-only bit follows the file name; clear it.
|
||||
* The file has a real name, it's no longer a temporary.
|
||||
*/
|
||||
F_CLR(frp, FR_RDONLY | FR_TMPFILE);
|
||||
|
||||
/* Have to force a write if the file exists, next time. */
|
||||
F_SET(frp, FR_NAMECHANGE);
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
/*
|
||||
* See strtol for comments as to the logic used.
|
||||
*/
|
||||
do {
|
||||
c = *s++;
|
||||
} while (isspace(c));
|
||||
if (c == '-') {
|
||||
neg = 1;
|
||||
c = *s++;
|
||||
} else if (c == '+')
|
||||
c = *s++;
|
||||
if ((base == 0 || base == 16) &&
|
||||
c == '0' && (*s == 'x' || *s == 'X')) {
|
||||
c = s[1];
|
||||
s += 2;
|
||||
base = 16;
|
||||
}
|
||||
return (msg_status(sp, ep, sp->lno, 1));
|
||||
if (base == 0)
|
||||
base = c == '0' ? 8 : 10;
|
||||
cutoff = (unsigned long)ULONG_MAX / (unsigned long)base;
|
||||
cutlim = (unsigned long)ULONG_MAX % (unsigned long)base;
|
||||
for (acc = 0, any = 0;; c = *s++) {
|
||||
if (isdigit(c))
|
||||
c -= '0';
|
||||
else if (isalpha(c))
|
||||
c -= isupper(c) ? 'A' - 10 : 'a' - 10;
|
||||
else
|
||||
break;
|
||||
if (c >= base)
|
||||
break;
|
||||
if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
|
||||
any = -1;
|
||||
else {
|
||||
any = 1;
|
||||
acc *= base;
|
||||
acc += c;
|
||||
}
|
||||
}
|
||||
if (any < 0) {
|
||||
acc = ULONG_MAX;
|
||||
errno = ERANGE;
|
||||
} else if (neg)
|
||||
acc = -acc;
|
||||
if (endptr != 0)
|
||||
*endptr = (char *)(any ? s - 1 : nptr);
|
||||
return (acc);
|
||||
}
|
31
contrib/nvi/clib/vsnprintf.c
Normal file
31
contrib/nvi/clib/vsnprintf.c
Normal file
@ -0,0 +1,31 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef __STDC__
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
#include <varargs.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* PUBLIC: #ifndef HAVE_VSNPRINTF
|
||||
* PUBLIC: int vsnprintf __P((char *, size_t, const char *, ...));
|
||||
* PUBLIC: #endif
|
||||
*/
|
||||
int
|
||||
vsnprintf(str, n, fmt, ap)
|
||||
char *str;
|
||||
size_t n;
|
||||
const char *fmt;
|
||||
va_list ap;
|
||||
{
|
||||
#ifdef SPRINTF_RET_CHARPNT
|
||||
(void)vsprintf(str, fmt, ap);
|
||||
return (strlen(str));
|
||||
#else
|
||||
return (vsprintf(str, fmt, ap));
|
||||
#endif
|
||||
}
|
525
contrib/nvi/common/api.c
Normal file
525
contrib/nvi/common/api.c
Normal file
@ -0,0 +1,525 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1992, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
* Copyright (c) 1995
|
||||
* George V. Neville-Neil. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)api.c 8.26 (Berkeley) 10/14/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../common/common.h"
|
||||
|
||||
extern GS *__global_list; /* XXX */
|
||||
|
||||
/*
|
||||
* api_fscreen --
|
||||
* Return a pointer to the screen specified by the screen id
|
||||
* or a file name.
|
||||
*
|
||||
* PUBLIC: SCR *api_fscreen __P((int, char *));
|
||||
*/
|
||||
SCR *
|
||||
api_fscreen(id, name)
|
||||
int id;
|
||||
char *name;
|
||||
{
|
||||
GS *gp;
|
||||
SCR *tsp;
|
||||
|
||||
gp = __global_list;
|
||||
|
||||
/* Search the displayed list. */
|
||||
for (tsp = gp->dq.cqh_first;
|
||||
tsp != (void *)&gp->dq; tsp = tsp->q.cqe_next)
|
||||
if (name == NULL) {
|
||||
if (id == tsp->id)
|
||||
return (tsp);
|
||||
} else if (!strcmp(name, tsp->frp->name))
|
||||
return (tsp);
|
||||
|
||||
/* Search the hidden list. */
|
||||
for (tsp = gp->hq.cqh_first;
|
||||
tsp != (void *)&gp->hq; tsp = tsp->q.cqe_next)
|
||||
if (name == NULL) {
|
||||
if (id == tsp->id)
|
||||
return (tsp);
|
||||
} else if (!strcmp(name, tsp->frp->name))
|
||||
return (tsp);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* api_aline --
|
||||
* Append a line.
|
||||
*
|
||||
* PUBLIC: int api_aline __P((SCR *, recno_t, char *, size_t));
|
||||
*/
|
||||
int
|
||||
api_aline(sp, lno, line, len)
|
||||
SCR *sp;
|
||||
recno_t lno;
|
||||
char *line;
|
||||
size_t len;
|
||||
{
|
||||
return (db_append(sp, 1, lno, line, len));
|
||||
}
|
||||
|
||||
/*
|
||||
* api_dline --
|
||||
* Delete a line.
|
||||
*
|
||||
* PUBLIC: int api_dline __P((SCR *, recno_t));
|
||||
*/
|
||||
int
|
||||
api_dline(sp, lno)
|
||||
SCR *sp;
|
||||
recno_t lno;
|
||||
{
|
||||
return (db_delete(sp, lno));
|
||||
}
|
||||
|
||||
/*
|
||||
* api_gline --
|
||||
* Get a line.
|
||||
*
|
||||
* PUBLIC: int api_gline __P((SCR *, recno_t, char **, size_t *));
|
||||
*/
|
||||
int
|
||||
api_gline(sp, lno, linepp, lenp)
|
||||
SCR *sp;
|
||||
recno_t lno;
|
||||
char **linepp;
|
||||
size_t *lenp;
|
||||
{
|
||||
int isempty;
|
||||
|
||||
if (db_eget(sp, lno, linepp, lenp, &isempty)) {
|
||||
if (isempty)
|
||||
msgq(sp, M_ERR, "209|The file is empty");
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* api_iline --
|
||||
* Insert a line.
|
||||
*
|
||||
* PUBLIC: int api_iline __P((SCR *, recno_t, char *, size_t));
|
||||
*/
|
||||
int
|
||||
api_iline(sp, lno, line, len)
|
||||
SCR *sp;
|
||||
recno_t lno;
|
||||
char *line;
|
||||
size_t len;
|
||||
{
|
||||
return (db_insert(sp, lno, line, len));
|
||||
}
|
||||
|
||||
/*
|
||||
* api_lline --
|
||||
* Return the line number of the last line in the file.
|
||||
*
|
||||
* PUBLIC: int api_lline __P((SCR *, recno_t *));
|
||||
*/
|
||||
int
|
||||
api_lline(sp, lnop)
|
||||
SCR *sp;
|
||||
recno_t *lnop;
|
||||
{
|
||||
return (db_last(sp, lnop));
|
||||
}
|
||||
|
||||
/*
|
||||
* api_sline --
|
||||
* Set a line.
|
||||
*
|
||||
* PUBLIC: int api_sline __P((SCR *, recno_t, char *, size_t));
|
||||
*/
|
||||
int
|
||||
api_sline(sp, lno, line, len)
|
||||
SCR *sp;
|
||||
recno_t lno;
|
||||
char *line;
|
||||
size_t len;
|
||||
{
|
||||
return (db_set(sp, lno, line, len));
|
||||
}
|
||||
|
||||
/*
|
||||
* api_getmark --
|
||||
* Get the mark.
|
||||
*
|
||||
* PUBLIC: int api_getmark __P((SCR *, int, MARK *));
|
||||
*/
|
||||
int
|
||||
api_getmark(sp, markname, mp)
|
||||
SCR *sp;
|
||||
int markname;
|
||||
MARK *mp;
|
||||
{
|
||||
return (mark_get(sp, (ARG_CHAR_T)markname, mp, M_ERR));
|
||||
}
|
||||
|
||||
/*
|
||||
* api_setmark --
|
||||
* Set the mark.
|
||||
*
|
||||
* PUBLIC: int api_setmark __P((SCR *, int, MARK *));
|
||||
*/
|
||||
int
|
||||
api_setmark(sp, markname, mp)
|
||||
SCR *sp;
|
||||
int markname;
|
||||
MARK *mp;
|
||||
{
|
||||
return (mark_set(sp, (ARG_CHAR_T)markname, mp, 1));
|
||||
}
|
||||
|
||||
/*
|
||||
* api_nextmark --
|
||||
* Return the first mark if next not set, otherwise return the
|
||||
* subsequent mark.
|
||||
*
|
||||
* PUBLIC: int api_nextmark __P((SCR *, int, char *));
|
||||
*/
|
||||
int
|
||||
api_nextmark(sp, next, namep)
|
||||
SCR *sp;
|
||||
int next;
|
||||
char *namep;
|
||||
{
|
||||
LMARK *mp;
|
||||
|
||||
mp = sp->ep->marks.lh_first;
|
||||
if (next)
|
||||
for (; mp != NULL; mp = mp->q.le_next)
|
||||
if (mp->name == *namep) {
|
||||
mp = mp->q.le_next;
|
||||
break;
|
||||
}
|
||||
if (mp == NULL)
|
||||
return (1);
|
||||
*namep = mp->name;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* api_getcursor --
|
||||
* Get the cursor.
|
||||
*
|
||||
* PUBLIC: int api_getcursor __P((SCR *, MARK *));
|
||||
*/
|
||||
int
|
||||
api_getcursor(sp, mp)
|
||||
SCR *sp;
|
||||
MARK *mp;
|
||||
{
|
||||
mp->lno = sp->lno;
|
||||
mp->cno = sp->cno;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* api_setcursor --
|
||||
* Set the cursor.
|
||||
*
|
||||
* PUBLIC: int api_setcursor __P((SCR *, MARK *));
|
||||
*/
|
||||
int
|
||||
api_setcursor(sp, mp)
|
||||
SCR *sp;
|
||||
MARK *mp;
|
||||
{
|
||||
size_t len;
|
||||
|
||||
if (db_get(sp, mp->lno, DBG_FATAL, NULL, &len))
|
||||
return (1);
|
||||
if (mp->cno < 0 || mp->cno > len) {
|
||||
msgq(sp, M_ERR, "Cursor set to nonexistent column");
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* Set the cursor. */
|
||||
sp->lno = mp->lno;
|
||||
sp->cno = mp->cno;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* api_emessage --
|
||||
* Print an error message.
|
||||
*
|
||||
* PUBLIC: void api_emessage __P((SCR *, char *));
|
||||
*/
|
||||
void
|
||||
api_emessage(sp, text)
|
||||
SCR *sp;
|
||||
char *text;
|
||||
{
|
||||
msgq(sp, M_ERR, "%s", text);
|
||||
}
|
||||
|
||||
/*
|
||||
* api_imessage --
|
||||
* Print an informational message.
|
||||
*
|
||||
* PUBLIC: void api_imessage __P((SCR *, char *));
|
||||
*/
|
||||
void
|
||||
api_imessage(sp, text)
|
||||
SCR *sp;
|
||||
char *text;
|
||||
{
|
||||
msgq(sp, M_INFO, "%s", text);
|
||||
}
|
||||
|
||||
/*
|
||||
* api_edit
|
||||
* Create a new screen and return its id
|
||||
* or edit a new file in the current screen.
|
||||
*
|
||||
* PUBLIC: int api_edit __P((SCR *, char *, SCR **, int));
|
||||
*/
|
||||
int
|
||||
api_edit(sp, file, spp, newscreen)
|
||||
SCR *sp;
|
||||
char *file;
|
||||
SCR **spp;
|
||||
int newscreen;
|
||||
{
|
||||
ARGS *ap[2], a;
|
||||
EXCMD cmd;
|
||||
|
||||
if (file) {
|
||||
ex_cinit(&cmd, C_EDIT, 0, OOBLNO, OOBLNO, 0, ap);
|
||||
ex_cadd(&cmd, &a, file, strlen(file));
|
||||
} else
|
||||
ex_cinit(&cmd, C_EDIT, 0, OOBLNO, OOBLNO, 0, NULL);
|
||||
if (newscreen)
|
||||
cmd.flags |= E_NEWSCREEN; /* XXX */
|
||||
if (cmd.cmd->fn(sp, &cmd))
|
||||
return (1);
|
||||
*spp = sp->nextdisp;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* api_escreen
|
||||
* End a screen.
|
||||
*
|
||||
* PUBLIC: int api_escreen __P((SCR *));
|
||||
*/
|
||||
int
|
||||
api_escreen(sp)
|
||||
SCR *sp;
|
||||
{
|
||||
EXCMD cmd;
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* If the interpreter exits anything other than the current
|
||||
* screen, vi isn't going to update everything correctly.
|
||||
*/
|
||||
ex_cinit(&cmd, C_QUIT, 0, OOBLNO, OOBLNO, 0, NULL);
|
||||
return (cmd.cmd->fn(sp, &cmd));
|
||||
}
|
||||
|
||||
/*
|
||||
* api_swscreen --
|
||||
* Switch to a new screen.
|
||||
*
|
||||
* PUBLIC: int api_swscreen __P((SCR *, SCR *));
|
||||
*/
|
||||
int
|
||||
api_swscreen(sp, new)
|
||||
SCR *sp, *new;
|
||||
{
|
||||
/*
|
||||
* XXX
|
||||
* If the interpreter switches from anything other than the
|
||||
* current screen, vi isn't going to update everything correctly.
|
||||
*/
|
||||
sp->nextdisp = new;
|
||||
F_SET(sp, SC_SSWITCH);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* api_map --
|
||||
* Map a key.
|
||||
*
|
||||
* PUBLIC: int api_map __P((SCR *, char *, char *, size_t));
|
||||
*/
|
||||
int
|
||||
api_map(sp, name, map, len)
|
||||
SCR *sp;
|
||||
char *name, *map;
|
||||
size_t len;
|
||||
{
|
||||
ARGS *ap[3], a, b;
|
||||
EXCMD cmd;
|
||||
|
||||
ex_cinit(&cmd, C_MAP, 0, OOBLNO, OOBLNO, 0, ap);
|
||||
ex_cadd(&cmd, &a, name, strlen(name));
|
||||
ex_cadd(&cmd, &b, map, len);
|
||||
return (cmd.cmd->fn(sp, &cmd));
|
||||
}
|
||||
|
||||
/*
|
||||
* api_unmap --
|
||||
* Unmap a key.
|
||||
*
|
||||
* PUBLIC: int api_unmap __P((SCR *, char *));
|
||||
*/
|
||||
int
|
||||
api_unmap(sp, name)
|
||||
SCR *sp;
|
||||
char *name;
|
||||
{
|
||||
ARGS *ap[2], a;
|
||||
EXCMD cmd;
|
||||
|
||||
ex_cinit(&cmd, C_UNMAP, 0, OOBLNO, OOBLNO, 0, ap);
|
||||
ex_cadd(&cmd, &a, name, strlen(name));
|
||||
return (cmd.cmd->fn(sp, &cmd));
|
||||
}
|
||||
|
||||
/*
|
||||
* api_opts_get --
|
||||
* Return a option value as a string, in allocated memory.
|
||||
* If the option is of type boolean, boolvalue is (un)set
|
||||
* according to the value; otherwise boolvalue is -1.
|
||||
*
|
||||
* PUBLIC: int api_opts_get __P((SCR *, char *, char **, int *));
|
||||
*/
|
||||
int
|
||||
api_opts_get(sp, name, value, boolvalue)
|
||||
SCR *sp;
|
||||
char *name, **value;
|
||||
int *boolvalue;
|
||||
{
|
||||
OPTLIST const *op;
|
||||
int offset;
|
||||
|
||||
if ((op = opts_search(name)) == NULL) {
|
||||
opts_nomatch(sp, name);
|
||||
return (1);
|
||||
}
|
||||
|
||||
offset = op - optlist;
|
||||
if (boolvalue != NULL)
|
||||
*boolvalue = -1;
|
||||
switch (op->type) {
|
||||
case OPT_0BOOL:
|
||||
case OPT_1BOOL:
|
||||
MALLOC_RET(sp, *value, char *, strlen(op->name) + 2 + 1);
|
||||
(void)sprintf(*value,
|
||||
"%s%s", O_ISSET(sp, offset) ? "" : "no", op->name);
|
||||
if (boolvalue != NULL)
|
||||
*boolvalue = O_ISSET(sp, offset);
|
||||
break;
|
||||
case OPT_NUM:
|
||||
MALLOC_RET(sp, *value, char *, 20);
|
||||
(void)sprintf(*value, "%lu", (u_long)O_VAL(sp, offset));
|
||||
break;
|
||||
case OPT_STR:
|
||||
if (O_STR(sp, offset) == NULL) {
|
||||
MALLOC_RET(sp, *value, char *, 2);
|
||||
value[0] = '\0';
|
||||
} else {
|
||||
MALLOC_RET(sp,
|
||||
*value, char *, strlen(O_STR(sp, offset)) + 1);
|
||||
(void)sprintf(*value, "%s", O_STR(sp, offset));
|
||||
}
|
||||
break;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* api_opts_set --
|
||||
* Set options.
|
||||
*
|
||||
* PUBLIC: int api_opts_set __P((SCR *, char *, char *, u_long, int));
|
||||
*/
|
||||
int
|
||||
api_opts_set(sp, name, str_value, num_value, bool_value)
|
||||
SCR *sp;
|
||||
char *name, *str_value;
|
||||
u_long num_value;
|
||||
int bool_value;
|
||||
{
|
||||
ARGS *ap[2], a, b;
|
||||
OPTLIST const *op;
|
||||
int rval;
|
||||
size_t blen;
|
||||
char *bp;
|
||||
|
||||
if ((op = opts_search(name)) == NULL) {
|
||||
opts_nomatch(sp, name);
|
||||
return (1);
|
||||
}
|
||||
|
||||
switch (op->type) {
|
||||
case OPT_0BOOL:
|
||||
case OPT_1BOOL:
|
||||
GET_SPACE_RET(sp, bp, blen, 64);
|
||||
a.len = snprintf(bp, 64, "%s%s", bool_value ? "" : "no", name);
|
||||
break;
|
||||
case OPT_NUM:
|
||||
GET_SPACE_RET(sp, bp, blen, 64);
|
||||
a.len = snprintf(bp, 64, "%s=%lu", name, num_value);
|
||||
break;
|
||||
case OPT_STR:
|
||||
GET_SPACE_RET(sp, bp, blen, 1024);
|
||||
a.len = snprintf(bp, 1024, "%s=%s", name, str_value);
|
||||
break;
|
||||
}
|
||||
a.bp = bp;
|
||||
b.len = 0;
|
||||
b.bp = NULL;
|
||||
ap[0] = &a;
|
||||
ap[1] = &b;
|
||||
rval = opts_set(sp, ap, NULL);
|
||||
|
||||
FREE_SPACE(sp, bp, blen);
|
||||
|
||||
return (rval);
|
||||
}
|
||||
|
||||
/*
|
||||
* api_run_str --
|
||||
* Execute a string as an ex command.
|
||||
*
|
||||
* PUBLIC: int api_run_str __P((SCR *, char *));
|
||||
*/
|
||||
int
|
||||
api_run_str(sp, cmd)
|
||||
SCR *sp;
|
||||
char *cmd;
|
||||
{
|
||||
return (ex_run_str(sp, NULL, cmd, strlen(cmd), 0, 0));
|
||||
}
|
29
contrib/nvi/common/args.h
Normal file
29
contrib/nvi/common/args.h
Normal file
@ -0,0 +1,29 @@
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*
|
||||
* @(#)args.h 10.2 (Berkeley) 3/6/96
|
||||
*/
|
||||
|
||||
/*
|
||||
* Structure for building "argc/argv" vector of arguments.
|
||||
*
|
||||
* !!!
|
||||
* All arguments are nul terminated as well as having an associated length.
|
||||
* The argument vector is NOT necessarily NULL terminated. The proper way
|
||||
* to check the number of arguments is to use the argc value in the EXCMDARG
|
||||
* structure or to walk the array until an ARGS structure with a length of 0
|
||||
* is found.
|
||||
*/
|
||||
typedef struct _args {
|
||||
CHAR_T *bp; /* Argument. */
|
||||
size_t blen; /* Buffer length. */
|
||||
size_t len; /* Argument length. */
|
||||
|
||||
#define A_ALLOCATED 0x01 /* If allocated space. */
|
||||
u_int8_t flags;
|
||||
} ARGS;
|
96
contrib/nvi/common/common.h
Normal file
96
contrib/nvi/common/common.h
Normal file
@ -0,0 +1,96 @@
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1991, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*
|
||||
* @(#)common.h 10.13 (Berkeley) 9/25/96
|
||||
*/
|
||||
|
||||
/*
|
||||
* Porting information built at configuration time. Included before
|
||||
* any of nvi's include files.
|
||||
*/
|
||||
#include "port.h"
|
||||
|
||||
/*
|
||||
* Pseudo-local includes. These are files that are unlikely to exist
|
||||
* on most machines to which we're porting vi, and we want to include
|
||||
* them in a very specific order, regardless.
|
||||
*/
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
|
||||
/*
|
||||
* Forward structure declarations. Not pretty, but the include files
|
||||
* are far too interrelated for a clean solution.
|
||||
*/
|
||||
typedef struct _cb CB;
|
||||
typedef struct _csc CSC;
|
||||
typedef struct _event EVENT;
|
||||
typedef struct _excmd EXCMD;
|
||||
typedef struct _exf EXF;
|
||||
typedef struct _fref FREF;
|
||||
typedef struct _gs GS;
|
||||
typedef struct _lmark LMARK;
|
||||
typedef struct _mark MARK;
|
||||
typedef struct _msg MSGS;
|
||||
typedef struct _option OPTION;
|
||||
typedef struct _optlist OPTLIST;
|
||||
typedef struct _scr SCR;
|
||||
typedef struct _script SCRIPT;
|
||||
typedef struct _seq SEQ;
|
||||
typedef struct _tag TAG;
|
||||
typedef struct _tagf TAGF;
|
||||
typedef struct _tagq TAGQ;
|
||||
typedef struct _text TEXT;
|
||||
|
||||
/* Autoindent state. */
|
||||
typedef enum { C_NOTSET, C_CARATSET, C_NOCHANGE, C_ZEROSET } carat_t;
|
||||
|
||||
/* Busy message types. */
|
||||
typedef enum { BUSY_ON = 1, BUSY_OFF, BUSY_UPDATE } busy_t;
|
||||
|
||||
/*
|
||||
* Routines that return a confirmation return:
|
||||
*
|
||||
* CONF_NO User answered no.
|
||||
* CONF_QUIT User answered quit, eof or an error.
|
||||
* CONF_YES User answered yes.
|
||||
*/
|
||||
typedef enum { CONF_NO, CONF_QUIT, CONF_YES } conf_t;
|
||||
|
||||
/* Directions. */
|
||||
typedef enum { NOTSET, FORWARD, BACKWARD } dir_t;
|
||||
|
||||
/* Line operations. */
|
||||
typedef enum { LINE_APPEND, LINE_DELETE, LINE_INSERT, LINE_RESET } lnop_t;
|
||||
|
||||
/* Lock return values. */
|
||||
typedef enum { LOCK_FAILED, LOCK_SUCCESS, LOCK_UNAVAIL } lockr_t;
|
||||
|
||||
/* Sequence types. */
|
||||
typedef enum { SEQ_ABBREV, SEQ_COMMAND, SEQ_INPUT } seq_t;
|
||||
|
||||
/*
|
||||
* Local includes.
|
||||
*/
|
||||
#include "key.h" /* Required by args.h. */
|
||||
#include "args.h" /* Required by options.h. */
|
||||
#include "options.h" /* Required by screen.h. */
|
||||
|
||||
#include "msg.h" /* Required by gs.h. */
|
||||
#include "cut.h" /* Required by gs.h. */
|
||||
#include "seq.h" /* Required by screen.h. */
|
||||
#include "util.h" /* Required by ex.h. */
|
||||
#include "mark.h" /* Required by gs.h. */
|
||||
#include "../ex/ex.h" /* Required by gs.h. */
|
||||
#include "gs.h" /* Required by screen.h. */
|
||||
#include "screen.h" /* Required by exf.h. */
|
||||
#include "exf.h"
|
||||
#include "log.h"
|
||||
#include "mem.h"
|
||||
|
||||
#include "com_extern.h"
|
@ -1,62 +1,33 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1992, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)cut.c 8.32 (Berkeley) 7/28/94";
|
||||
static const char sccsid[] = "@(#)cut.c 10.10 (Berkeley) 9/15/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
#include "common.h"
|
||||
|
||||
#include "vi.h"
|
||||
|
||||
static int cb_rotate __P((SCR *));
|
||||
static void cb_rotate __P((SCR *));
|
||||
|
||||
/*
|
||||
* cut --
|
||||
@ -89,14 +60,15 @@ static int cb_rotate __P((SCR *));
|
||||
* and, in the latter case, the text was appended to the buffer instead of
|
||||
* replacing the contents. Hopefully it's not worth getting right, and here
|
||||
* we just treat the numeric buffers like any other named buffer.
|
||||
*
|
||||
* PUBLIC: int cut __P((SCR *, CHAR_T *, MARK *, MARK *, int));
|
||||
*/
|
||||
int
|
||||
cut(sp, ep, namep, fm, tm, flags)
|
||||
cut(sp, namep, fm, tm, flags)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
CHAR_T *namep;
|
||||
int flags;
|
||||
MARK *fm, *tm;
|
||||
int flags;
|
||||
{
|
||||
CB *cbp;
|
||||
CHAR_T name;
|
||||
@ -169,30 +141,26 @@ namecb: CBNAME(sp, cbp, name);
|
||||
if (LF_ISSET(CUT_LINEMODE)) {
|
||||
cbp->flags |= CB_LMODE;
|
||||
for (lno = fm->lno; lno <= tm->lno; ++lno)
|
||||
if (cut_line(sp, ep, lno, 0, 0, cbp))
|
||||
if (cut_line(sp, lno, 0, 0, cbp))
|
||||
goto cut_line_err;
|
||||
} else {
|
||||
/*
|
||||
* Get the first line. A length of 0 causes cut_line
|
||||
* to cut from the MARK to the end of the line.
|
||||
*/
|
||||
if (cut_line(sp, ep, fm->lno, fm->cno, fm->lno != tm->lno ?
|
||||
if (cut_line(sp, fm->lno, fm->cno, fm->lno != tm->lno ?
|
||||
ENTIRE_LINE : (tm->cno - fm->cno) + 1, cbp))
|
||||
goto cut_line_err;
|
||||
|
||||
/* Get the intermediate lines. */
|
||||
for (lno = fm->lno; ++lno < tm->lno;)
|
||||
if (cut_line(sp, ep, lno, 0, ENTIRE_LINE, cbp))
|
||||
if (cut_line(sp, lno, 0, ENTIRE_LINE, cbp))
|
||||
goto cut_line_err;
|
||||
|
||||
/* Get the last line. */
|
||||
if (tm->lno != fm->lno &&
|
||||
cut_line(sp, ep, lno, 0, tm->cno + 1, cbp)) {
|
||||
cut_line_err: text_lfree(&cbp->textq);
|
||||
cbp->len = 0;
|
||||
cbp->flags = 0;
|
||||
return (1);
|
||||
}
|
||||
cut_line(sp, lno, 0, tm->cno + 1, cbp))
|
||||
goto cut_line_err;
|
||||
}
|
||||
|
||||
append = 0; /* Only append to the named buffer. */
|
||||
@ -210,13 +178,19 @@ cut_line_err: text_lfree(&cbp->textq);
|
||||
goto copyloop;
|
||||
}
|
||||
return (0);
|
||||
|
||||
cut_line_err:
|
||||
text_lfree(&cbp->textq);
|
||||
cbp->len = 0;
|
||||
cbp->flags = 0;
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* cb_rotate --
|
||||
* Rotate the numbered buffers up one.
|
||||
*/
|
||||
static int
|
||||
static void
|
||||
cb_rotate(sp)
|
||||
SCR *sp;
|
||||
{
|
||||
@ -256,19 +230,19 @@ cb_rotate(sp)
|
||||
if (del_cbp != NULL) {
|
||||
LIST_REMOVE(del_cbp, q);
|
||||
text_lfree(&del_cbp->textq);
|
||||
FREE(del_cbp, sizeof(CB));
|
||||
free(del_cbp);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cut_line --
|
||||
* Cut a portion of a single line.
|
||||
*
|
||||
* PUBLIC: int cut_line __P((SCR *, recno_t, size_t, size_t, CB *));
|
||||
*/
|
||||
int
|
||||
cut_line(sp, ep, lno, fcno, clen, cbp)
|
||||
cut_line(sp, lno, fcno, clen, cbp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
recno_t lno;
|
||||
size_t fcno, clen;
|
||||
CB *cbp;
|
||||
@ -278,10 +252,8 @@ cut_line(sp, ep, lno, fcno, clen, cbp)
|
||||
char *p;
|
||||
|
||||
/* Get the line. */
|
||||
if ((p = file_gline(sp, ep, lno, &len)) == NULL) {
|
||||
GETLINE_ERR(sp, lno);
|
||||
if (db_get(sp, lno, DBG_FATAL, &p, &len))
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* Create a TEXT structure that can hold the entire line. */
|
||||
if ((tp = text_init(sp, NULL, 0, len)) == NULL)
|
||||
@ -294,7 +266,7 @@ cut_line(sp, ep, lno, fcno, clen, cbp)
|
||||
if (len != 0) {
|
||||
if (clen == 0)
|
||||
clen = len - fcno;
|
||||
memmove(tp->lb, p + fcno, clen);
|
||||
memcpy(tp->lb, p + fcno, clen);
|
||||
tp->len = clen;
|
||||
}
|
||||
|
||||
@ -305,9 +277,37 @@ cut_line(sp, ep, lno, fcno, clen, cbp)
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* cut_close --
|
||||
* Discard all cut buffers.
|
||||
*
|
||||
* PUBLIC: void cut_close __P((GS *));
|
||||
*/
|
||||
void
|
||||
cut_close(gp)
|
||||
GS *gp;
|
||||
{
|
||||
CB *cbp;
|
||||
|
||||
/* Free cut buffer list. */
|
||||
while ((cbp = gp->cutq.lh_first) != NULL) {
|
||||
if (cbp->textq.cqh_first != (void *)&cbp->textq)
|
||||
text_lfree(&cbp->textq);
|
||||
LIST_REMOVE(cbp, q);
|
||||
free(cbp);
|
||||
}
|
||||
|
||||
/* Free default cut storage. */
|
||||
cbp = &gp->dcb_store;
|
||||
if (cbp->textq.cqh_first != (void *)&cbp->textq)
|
||||
text_lfree(&cbp->textq);
|
||||
}
|
||||
|
||||
/*
|
||||
* text_init --
|
||||
* Allocate a new TEXT structure.
|
||||
*
|
||||
* PUBLIC: TEXT *text_init __P((SCR *, const char *, size_t, size_t));
|
||||
*/
|
||||
TEXT *
|
||||
text_init(sp, p, len, total_len)
|
||||
@ -320,7 +320,7 @@ text_init(sp, p, len, total_len)
|
||||
CALLOC(sp, tp, TEXT *, 1, sizeof(TEXT));
|
||||
if (tp == NULL)
|
||||
return (NULL);
|
||||
/* ANSI C doesn't define a call to malloc(2) for 0 bytes. */
|
||||
/* ANSI C doesn't define a call to malloc(3) for 0 bytes. */
|
||||
if ((tp->lb_len = total_len) != 0) {
|
||||
MALLOC(sp, tp->lb, CHAR_T *, tp->lb_len);
|
||||
if (tp->lb == NULL) {
|
||||
@ -328,7 +328,7 @@ text_init(sp, p, len, total_len)
|
||||
return (NULL);
|
||||
}
|
||||
if (p != NULL && len != 0)
|
||||
memmove(tp->lb, p, len);
|
||||
memcpy(tp->lb, p, len);
|
||||
}
|
||||
tp->len = len;
|
||||
return (tp);
|
||||
@ -337,6 +337,8 @@ text_init(sp, p, len, total_len)
|
||||
/*
|
||||
* text_lfree --
|
||||
* Free a chain of text structures.
|
||||
*
|
||||
* PUBLIC: void text_lfree __P((TEXTH *));
|
||||
*/
|
||||
void
|
||||
text_lfree(headp)
|
||||
@ -353,14 +355,14 @@ text_lfree(headp)
|
||||
/*
|
||||
* text_free --
|
||||
* Free a text structure.
|
||||
*
|
||||
* PUBLIC: void text_free __P((TEXT *));
|
||||
*/
|
||||
void
|
||||
text_free(tp)
|
||||
TEXT *tp;
|
||||
{
|
||||
if (tp->lb != NULL)
|
||||
FREE(tp->lb, tp->lb_len);
|
||||
if (tp->wd != NULL)
|
||||
FREE(tp->wd, tp->wd_len);
|
||||
FREE(tp, sizeof(TEXT));
|
||||
free(tp->lb);
|
||||
free(tp);
|
||||
}
|
77
contrib/nvi/common/cut.h
Normal file
77
contrib/nvi/common/cut.h
Normal file
@ -0,0 +1,77 @@
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1991, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*
|
||||
* @(#)cut.h 10.5 (Berkeley) 4/3/96
|
||||
*/
|
||||
|
||||
typedef struct _texth TEXTH; /* TEXT list head structure. */
|
||||
CIRCLEQ_HEAD(_texth, _text);
|
||||
|
||||
/* Cut buffers. */
|
||||
struct _cb {
|
||||
LIST_ENTRY(_cb) q; /* Linked list of cut buffers. */
|
||||
TEXTH textq; /* Linked list of TEXT structures. */
|
||||
CHAR_T name; /* Cut buffer name. */
|
||||
size_t len; /* Total length of cut text. */
|
||||
|
||||
#define CB_LMODE 0x01 /* Cut was in line mode. */
|
||||
u_int8_t flags;
|
||||
};
|
||||
|
||||
/* Lines/blocks of text. */
|
||||
struct _text { /* Text: a linked list of lines. */
|
||||
CIRCLEQ_ENTRY(_text) q; /* Linked list of text structures. */
|
||||
char *lb; /* Line buffer. */
|
||||
size_t lb_len; /* Line buffer length. */
|
||||
size_t len; /* Line length. */
|
||||
|
||||
/* These fields are used by the vi text input routine. */
|
||||
recno_t lno; /* 1-N: file line. */
|
||||
size_t cno; /* 0-N: file character in line. */
|
||||
size_t ai; /* 0-N: autoindent bytes. */
|
||||
size_t insert; /* 0-N: bytes to insert (push). */
|
||||
size_t offset; /* 0-N: initial, unerasable chars. */
|
||||
size_t owrite; /* 0-N: chars to overwrite. */
|
||||
size_t R_erase; /* 0-N: 'R' erase count. */
|
||||
size_t sv_cno; /* 0-N: Saved line cursor. */
|
||||
size_t sv_len; /* 0-N: Saved line length. */
|
||||
|
||||
/*
|
||||
* These fields returns information from the vi text input routine.
|
||||
*
|
||||
* The termination condition. Note, this field is only valid if the
|
||||
* text input routine returns success.
|
||||
* TERM_BS: User backspaced over the prompt.
|
||||
* TERM_CEDIT: User entered <edit-char>.
|
||||
* TERM_CR: User entered <carriage-return>; no data.
|
||||
* TERM_ESC: User entered <escape>; no data.
|
||||
* TERM_OK: Data available.
|
||||
* TERM_SEARCH: Incremental search.
|
||||
*/
|
||||
enum {
|
||||
TERM_BS, TERM_CEDIT, TERM_CR, TERM_ESC, TERM_OK, TERM_SEARCH
|
||||
} term;
|
||||
};
|
||||
|
||||
/*
|
||||
* Get named buffer 'name'.
|
||||
* Translate upper-case buffer names to lower-case buffer names.
|
||||
*/
|
||||
#define CBNAME(sp, cbp, nch) { \
|
||||
CHAR_T L__name; \
|
||||
L__name = isupper(nch) ? tolower(nch) : (nch); \
|
||||
for (cbp = sp->gp->cutq.lh_first; \
|
||||
cbp != NULL; cbp = cbp->q.le_next) \
|
||||
if (cbp->name == L__name) \
|
||||
break; \
|
||||
}
|
||||
|
||||
/* Flags to the cut() routine. */
|
||||
#define CUT_LINEMODE 0x01 /* Cut in line mode. */
|
||||
#define CUT_NUMOPT 0x02 /* Numeric buffer: optional. */
|
||||
#define CUT_NUMREQ 0x04 /* Numeric buffer: required. */
|
160
contrib/nvi/common/delete.c
Normal file
160
contrib/nvi/common/delete.c
Normal file
@ -0,0 +1,160 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1992, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)delete.c 10.12 (Berkeley) 10/23/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/*
|
||||
* del --
|
||||
* Delete a range of text.
|
||||
*
|
||||
* PUBLIC: int del __P((SCR *, MARK *, MARK *, int));
|
||||
*/
|
||||
int
|
||||
del(sp, fm, tm, lmode)
|
||||
SCR *sp;
|
||||
MARK *fm, *tm;
|
||||
int lmode;
|
||||
{
|
||||
recno_t lno;
|
||||
size_t blen, len, nlen, tlen;
|
||||
char *bp, *p;
|
||||
int eof, rval;
|
||||
|
||||
bp = NULL;
|
||||
|
||||
/* Case 1 -- delete in line mode. */
|
||||
if (lmode) {
|
||||
for (lno = tm->lno; lno >= fm->lno; --lno) {
|
||||
if (db_delete(sp, lno))
|
||||
return (1);
|
||||
++sp->rptlines[L_DELETED];
|
||||
if (lno % INTERRUPT_CHECK == 0 && INTERRUPTED(sp))
|
||||
break;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
* Case 2 -- delete to EOF. This is a special case because it's
|
||||
* easier to pick it off than try and find it in the other cases.
|
||||
*/
|
||||
if (db_last(sp, &lno))
|
||||
return (1);
|
||||
if (tm->lno >= lno) {
|
||||
if (tm->lno == lno) {
|
||||
if (db_get(sp, lno, DBG_FATAL, &p, &len))
|
||||
return (1);
|
||||
eof = tm->cno >= len ? 1 : 0;
|
||||
} else
|
||||
eof = 1;
|
||||
if (eof) {
|
||||
for (lno = tm->lno; lno > fm->lno; --lno) {
|
||||
if (db_delete(sp, lno))
|
||||
return (1);
|
||||
++sp->rptlines[L_DELETED];
|
||||
if (lno %
|
||||
INTERRUPT_CHECK == 0 && INTERRUPTED(sp))
|
||||
break;
|
||||
}
|
||||
if (db_get(sp, fm->lno, DBG_FATAL, &p, &len))
|
||||
return (1);
|
||||
GET_SPACE_RET(sp, bp, blen, fm->cno);
|
||||
memcpy(bp, p, fm->cno);
|
||||
if (db_set(sp, fm->lno, bp, fm->cno))
|
||||
return (1);
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
/* Case 3 -- delete within a single line. */
|
||||
if (tm->lno == fm->lno) {
|
||||
if (db_get(sp, fm->lno, DBG_FATAL, &p, &len))
|
||||
return (1);
|
||||
GET_SPACE_RET(sp, bp, blen, len);
|
||||
if (fm->cno != 0)
|
||||
memcpy(bp, p, fm->cno);
|
||||
memcpy(bp + fm->cno, p + (tm->cno + 1), len - (tm->cno + 1));
|
||||
if (db_set(sp, fm->lno,
|
||||
bp, len - ((tm->cno - fm->cno) + 1)))
|
||||
goto err;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
* Case 4 -- delete over multiple lines.
|
||||
*
|
||||
* Copy the start partial line into place.
|
||||
*/
|
||||
if ((tlen = fm->cno) != 0) {
|
||||
if (db_get(sp, fm->lno, DBG_FATAL, &p, NULL))
|
||||
return (1);
|
||||
GET_SPACE_RET(sp, bp, blen, tlen + 256);
|
||||
memcpy(bp, p, tlen);
|
||||
}
|
||||
|
||||
/* Copy the end partial line into place. */
|
||||
if (db_get(sp, tm->lno, DBG_FATAL, &p, &len))
|
||||
goto err;
|
||||
if (len != 0 && tm->cno != len - 1) {
|
||||
/*
|
||||
* XXX
|
||||
* We can overflow memory here, if the total length is greater
|
||||
* than SIZE_T_MAX. The only portable way I've found to test
|
||||
* is depending on the overflow being less than the value.
|
||||
*/
|
||||
nlen = (len - (tm->cno + 1)) + tlen;
|
||||
if (tlen > nlen) {
|
||||
msgq(sp, M_ERR, "002|Line length overflow");
|
||||
goto err;
|
||||
}
|
||||
if (tlen == 0) {
|
||||
GET_SPACE_RET(sp, bp, blen, nlen);
|
||||
} else
|
||||
ADD_SPACE_RET(sp, bp, blen, nlen);
|
||||
|
||||
memcpy(bp + tlen, p + (tm->cno + 1), len - (tm->cno + 1));
|
||||
tlen += len - (tm->cno + 1);
|
||||
}
|
||||
|
||||
/* Set the current line. */
|
||||
if (db_set(sp, fm->lno, bp, tlen))
|
||||
goto err;
|
||||
|
||||
/* Delete the last and intermediate lines. */
|
||||
for (lno = tm->lno; lno > fm->lno; --lno) {
|
||||
if (db_delete(sp, lno))
|
||||
goto err;
|
||||
++sp->rptlines[L_DELETED];
|
||||
if (lno % INTERRUPT_CHECK == 0 && INTERRUPTED(sp))
|
||||
break;
|
||||
}
|
||||
|
||||
done: rval = 0;
|
||||
if (0)
|
||||
err: rval = 1;
|
||||
if (bp != NULL)
|
||||
FREE_SPACE(sp, bp, blen);
|
||||
return (rval);
|
||||
}
|
1498
contrib/nvi/common/exf.c
Normal file
1498
contrib/nvi/common/exf.c
Normal file
File diff suppressed because it is too large
Load Diff
82
contrib/nvi/common/exf.h
Normal file
82
contrib/nvi/common/exf.h
Normal file
@ -0,0 +1,82 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1992, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*
|
||||
* @(#)exf.h 10.7 (Berkeley) 7/9/96
|
||||
*/
|
||||
/* Undo direction. */
|
||||
/*
|
||||
* exf --
|
||||
* The file structure.
|
||||
*/
|
||||
struct _exf {
|
||||
int refcnt; /* Reference count. */
|
||||
|
||||
/* Underlying database state. */
|
||||
DB *db; /* File db structure. */
|
||||
char *c_lp; /* Cached line. */
|
||||
size_t c_len; /* Cached line length. */
|
||||
recno_t c_lno; /* Cached line number. */
|
||||
recno_t c_nlines; /* Cached lines in the file. */
|
||||
|
||||
DB *log; /* Log db structure. */
|
||||
char *l_lp; /* Log buffer. */
|
||||
size_t l_len; /* Log buffer length. */
|
||||
recno_t l_high; /* Log last + 1 record number. */
|
||||
recno_t l_cur; /* Log current record number. */
|
||||
MARK l_cursor; /* Log cursor position. */
|
||||
dir_t lundo; /* Last undo direction. */
|
||||
|
||||
LIST_HEAD(_markh, _lmark) marks;/* Linked list of file MARK's. */
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* Mtime should be a struct timespec, but time_t is more portable.
|
||||
*/
|
||||
dev_t mdev; /* Device. */
|
||||
ino_t minode; /* Inode. */
|
||||
time_t mtime; /* Last modification time. */
|
||||
|
||||
int fcntl_fd; /* Fcntl locking fd; see exf.c. */
|
||||
|
||||
/*
|
||||
* Recovery in general, and these fields specifically, are described
|
||||
* in recover.c.
|
||||
*/
|
||||
#define RCV_PERIOD 120 /* Sync every two minutes. */
|
||||
char *rcv_path; /* Recover file name. */
|
||||
char *rcv_mpath; /* Recover mail file name. */
|
||||
int rcv_fd; /* Locked mail file descriptor. */
|
||||
|
||||
#define F_DEVSET 0x001 /* mdev/minode fields initialized. */
|
||||
#define F_FIRSTMODIFY 0x002 /* File not yet modified. */
|
||||
#define F_MODIFIED 0x004 /* File is currently dirty. */
|
||||
#define F_MULTILOCK 0x008 /* Multiple processes running, lock. */
|
||||
#define F_NOLOG 0x010 /* Logging turned off. */
|
||||
#define F_RCV_NORM 0x020 /* Don't delete recovery files. */
|
||||
#define F_RCV_ON 0x040 /* Recovery is possible. */
|
||||
#define F_UNDO 0x080 /* No change since last undo. */
|
||||
u_int8_t flags;
|
||||
};
|
||||
|
||||
/* Flags to db_get(). */
|
||||
#define DBG_FATAL 0x001 /* If DNE, error message. */
|
||||
#define DBG_NOCACHE 0x002 /* Ignore the front-end cache. */
|
||||
|
||||
/* Flags to file_init() and file_write(). */
|
||||
#define FS_ALL 0x001 /* Write the entire file. */
|
||||
#define FS_APPEND 0x002 /* Append to the file. */
|
||||
#define FS_FORCE 0x004 /* Force is set. */
|
||||
#define FS_OPENERR 0x008 /* Open failed, try it again. */
|
||||
#define FS_POSSIBLE 0x010 /* Force could have been set. */
|
||||
#define FS_SETALT 0x020 /* Set alternate file name. */
|
||||
|
||||
/* Flags to rcv_sync(). */
|
||||
#define RCV_EMAIL 0x01 /* Send the user email, IFF file modified. */
|
||||
#define RCV_ENDSESSION 0x02 /* End the file session. */
|
||||
#define RCV_PRESERVE 0x04 /* Preserve backup file, IFF file modified. */
|
||||
#define RCV_SNAPSHOT 0x08 /* Snapshot the recovery, and send email. */
|
210
contrib/nvi/common/gs.h
Normal file
210
contrib/nvi/common/gs.h
Normal file
@ -0,0 +1,210 @@
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*
|
||||
* @(#)gs.h 10.34 (Berkeley) 9/24/96
|
||||
*/
|
||||
|
||||
#define TEMPORARY_FILE_STRING "/tmp" /* Default temporary file name. */
|
||||
|
||||
/*
|
||||
* File reference structure (FREF). The structure contains the name of the
|
||||
* file, along with the information that follows the name.
|
||||
*
|
||||
* !!!
|
||||
* The read-only bit follows the file name, not the file itself.
|
||||
*/
|
||||
struct _fref {
|
||||
CIRCLEQ_ENTRY(_fref) q; /* Linked list of file references. */
|
||||
char *name; /* File name. */
|
||||
char *tname; /* Backing temporary file name. */
|
||||
|
||||
recno_t lno; /* 1-N: file cursor line. */
|
||||
size_t cno; /* 0-N: file cursor column. */
|
||||
|
||||
#define FR_CURSORSET 0x0001 /* If lno/cno values valid. */
|
||||
#define FR_DONTDELETE 0x0002 /* Don't delete the temporary file. */
|
||||
#define FR_EXNAMED 0x0004 /* Read/write renamed the file. */
|
||||
#define FR_NAMECHANGE 0x0008 /* If the name changed. */
|
||||
#define FR_NEWFILE 0x0010 /* File doesn't really exist yet. */
|
||||
#define FR_RECOVER 0x0020 /* File is being recovered. */
|
||||
#define FR_TMPEXIT 0x0040 /* Modified temporary file, no exit. */
|
||||
#define FR_TMPFILE 0x0080 /* If file has no name. */
|
||||
#define FR_UNLOCKED 0x0100 /* File couldn't be locked. */
|
||||
u_int16_t flags;
|
||||
};
|
||||
|
||||
/* Action arguments to scr_exadjust(). */
|
||||
typedef enum { EX_TERM_CE, EX_TERM_SCROLL } exadj_t;
|
||||
|
||||
/* Screen attribute arguments to scr_attr(). */
|
||||
typedef enum { SA_ALTERNATE, SA_INVERSE } scr_attr_t;
|
||||
|
||||
/* Key type arguments to scr_keyval(). */
|
||||
typedef enum { KEY_VEOF, KEY_VERASE, KEY_VKILL, KEY_VWERASE } scr_keyval_t;
|
||||
|
||||
/*
|
||||
* GS:
|
||||
*
|
||||
* Structure that describes global state of the running program.
|
||||
*/
|
||||
struct _gs {
|
||||
char *progname; /* Programe name. */
|
||||
|
||||
int id; /* Last allocated screen id. */
|
||||
CIRCLEQ_HEAD(_dqh, _scr) dq; /* Displayed screens. */
|
||||
CIRCLEQ_HEAD(_hqh, _scr) hq; /* Hidden screens. */
|
||||
|
||||
SCR *ccl_sp; /* Colon command-line screen. */
|
||||
|
||||
void *perl_interp; /* Perl interpreter. */
|
||||
void *tcl_interp; /* Tcl_Interp *: Tcl interpreter. */
|
||||
|
||||
void *cl_private; /* Curses support private area. */
|
||||
void *ip_private; /* IP support private area. */
|
||||
void *tk_private; /* Tk/Tcl support private area. */
|
||||
|
||||
/* File references. */
|
||||
CIRCLEQ_HEAD(_frefh, _fref) frefq;
|
||||
|
||||
#define GO_COLUMNS 0 /* Global options: columns. */
|
||||
#define GO_LINES 1 /* Global options: lines. */
|
||||
#define GO_SECURE 2 /* Global options: secure. */
|
||||
#define GO_TERM 3 /* Global options: terminal type. */
|
||||
OPTION opts[GO_TERM + 1];
|
||||
|
||||
DB *msg; /* Message catalog DB. */
|
||||
MSGH msgq; /* User message list. */
|
||||
#define DEFAULT_NOPRINT '\1' /* Emergency non-printable character. */
|
||||
CHAR_T noprint; /* Cached, unprintable character. */
|
||||
|
||||
char *tmp_bp; /* Temporary buffer. */
|
||||
size_t tmp_blen; /* Temporary buffer size. */
|
||||
|
||||
/*
|
||||
* Ex command structures (EXCMD). Defined here because ex commands
|
||||
* exist outside of any particular screen or file.
|
||||
*/
|
||||
#define EXCMD_RUNNING(gp) ((gp)->ecq.lh_first->clen != 0)
|
||||
LIST_HEAD(_excmdh, _excmd) ecq; /* Ex command linked list. */
|
||||
EXCMD excmd; /* Default ex command structure. */
|
||||
char *if_name; /* Current associated file. */
|
||||
recno_t if_lno; /* Current associated line number. */
|
||||
|
||||
char *c_option; /* Ex initial, command-line command. */
|
||||
|
||||
#ifdef DEBUG
|
||||
FILE *tracefp; /* Trace file pointer. */
|
||||
#endif
|
||||
|
||||
EVENT *i_event; /* Array of input events. */
|
||||
size_t i_nelem; /* Number of array elements. */
|
||||
size_t i_cnt; /* Count of events. */
|
||||
size_t i_next; /* Offset of next event. */
|
||||
|
||||
CB *dcbp; /* Default cut buffer pointer. */
|
||||
CB dcb_store; /* Default cut buffer storage. */
|
||||
LIST_HEAD(_cuth, _cb) cutq; /* Linked list of cut buffers. */
|
||||
|
||||
#define MAX_BIT_SEQ 128 /* Max + 1 fast check character. */
|
||||
LIST_HEAD(_seqh, _seq) seqq; /* Linked list of maps, abbrevs. */
|
||||
bitstr_t bit_decl(seqb, MAX_BIT_SEQ);
|
||||
|
||||
#define MAX_FAST_KEY 254 /* Max fast check character.*/
|
||||
#define KEY_LEN(sp, ch) \
|
||||
((unsigned char)(ch) <= MAX_FAST_KEY ? \
|
||||
sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch))
|
||||
#define KEY_NAME(sp, ch) \
|
||||
((unsigned char)(ch) <= MAX_FAST_KEY ? \
|
||||
sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch))
|
||||
struct {
|
||||
CHAR_T name[MAX_CHARACTER_COLUMNS + 1];
|
||||
u_int8_t len;
|
||||
} cname[MAX_FAST_KEY + 1]; /* Fast lookup table. */
|
||||
|
||||
#define KEY_VAL(sp, ch) \
|
||||
((unsigned char)(ch) <= MAX_FAST_KEY ? \
|
||||
sp->gp->special_key[(unsigned char)ch] : \
|
||||
(unsigned char)(ch) > sp->gp->max_special ? 0 : v_key_val(sp,ch))
|
||||
CHAR_T max_special; /* Max special character. */
|
||||
u_char /* Fast lookup table. */
|
||||
special_key[MAX_FAST_KEY + 1];
|
||||
|
||||
/* Flags. */
|
||||
#define G_ABBREV 0x0001 /* If have abbreviations. */
|
||||
#define G_BELLSCHED 0x0002 /* Bell scheduled. */
|
||||
#define G_INTERRUPTED 0x0004 /* Interrupted. */
|
||||
#define G_RECOVER_SET 0x0008 /* Recover system initialized. */
|
||||
#define G_SCRIPTED 0x0010 /* Ex script session. */
|
||||
#define G_SCRWIN 0x0020 /* Scripting windows running. */
|
||||
#define G_SNAPSHOT 0x0040 /* Always snapshot files. */
|
||||
#define G_SRESTART 0x0080 /* Screen restarted. */
|
||||
#define G_TMP_INUSE 0x0100 /* Temporary buffer in use. */
|
||||
u_int32_t flags;
|
||||
|
||||
/* Screen interface functions. */
|
||||
/* Add a string to the screen. */
|
||||
int (*scr_addstr) __P((SCR *, const char *, size_t));
|
||||
/* Toggle a screen attribute. */
|
||||
int (*scr_attr) __P((SCR *, scr_attr_t, int));
|
||||
/* Terminal baud rate. */
|
||||
int (*scr_baud) __P((SCR *, u_long *));
|
||||
/* Beep/bell/flash the terminal. */
|
||||
int (*scr_bell) __P((SCR *));
|
||||
/* Display a busy message. */
|
||||
void (*scr_busy) __P((SCR *, const char *, busy_t));
|
||||
/* Clear to the end of the line. */
|
||||
int (*scr_clrtoeol) __P((SCR *));
|
||||
/* Return the cursor location. */
|
||||
int (*scr_cursor) __P((SCR *, size_t *, size_t *));
|
||||
/* Delete a line. */
|
||||
int (*scr_deleteln) __P((SCR *));
|
||||
/* Get a keyboard event. */
|
||||
int (*scr_event) __P((SCR *, EVENT *, u_int32_t, int));
|
||||
/* Ex: screen adjustment routine. */
|
||||
int (*scr_ex_adjust) __P((SCR *, exadj_t));
|
||||
int (*scr_fmap) /* Set a function key. */
|
||||
__P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t));
|
||||
/* Get terminal key value. */
|
||||
int (*scr_keyval) __P((SCR *, scr_keyval_t, CHAR_T *, int *));
|
||||
/* Insert a line. */
|
||||
int (*scr_insertln) __P((SCR *));
|
||||
/* Handle an option change. */
|
||||
int (*scr_optchange) __P((SCR *, int, char *, u_long *));
|
||||
/* Move the cursor. */
|
||||
int (*scr_move) __P((SCR *, size_t, size_t));
|
||||
/* Message or ex output. */
|
||||
void (*scr_msg) __P((SCR *, mtype_t, char *, size_t));
|
||||
/* Refresh the screen. */
|
||||
int (*scr_refresh) __P((SCR *, int));
|
||||
/* Rename the file. */
|
||||
int (*scr_rename) __P((SCR *, char *, int));
|
||||
/* Set the screen type. */
|
||||
int (*scr_screen) __P((SCR *, u_int32_t));
|
||||
/* Suspend the editor. */
|
||||
int (*scr_suspend) __P((SCR *, int *));
|
||||
/* Print usage message. */
|
||||
void (*scr_usage) __P((void));
|
||||
};
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* Block signals if there are asynchronous events. Used to keep DB system calls
|
||||
* from being interrupted and not restarted, as that will result in consistency
|
||||
* problems. This should be handled by DB.
|
||||
*/
|
||||
#ifdef BLOCK_SIGNALS
|
||||
#include <signal.h>
|
||||
extern sigset_t __sigblockset;
|
||||
#define SIGBLOCK \
|
||||
(void)sigprocmask(SIG_BLOCK, &__sigblockset, NULL)
|
||||
#define SIGUNBLOCK \
|
||||
(void)sigprocmask(SIG_UNBLOCK, &__sigblockset, NULL);
|
||||
#else
|
||||
#define SIGBLOCK
|
||||
#define SIGUNBLOCK
|
||||
#endif
|
865
contrib/nvi/common/key.c
Normal file
865
contrib/nvi/common/key.c
Normal file
@ -0,0 +1,865 @@
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1991, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)key.c 10.33 (Berkeley) 9/24/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <locale.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "../vi/vi.h"
|
||||
|
||||
static int v_event_append __P((SCR *, EVENT *));
|
||||
static int v_event_grow __P((SCR *, int));
|
||||
static int v_key_cmp __P((const void *, const void *));
|
||||
static void v_keyval __P((SCR *, int, scr_keyval_t));
|
||||
static void v_sync __P((SCR *, int));
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* Historic vi always used:
|
||||
*
|
||||
* ^D: autoindent deletion
|
||||
* ^H: last character deletion
|
||||
* ^W: last word deletion
|
||||
* ^Q: quote the next character (if not used in flow control).
|
||||
* ^V: quote the next character
|
||||
*
|
||||
* regardless of the user's choices for these characters. The user's erase
|
||||
* and kill characters worked in addition to these characters. Nvi wires
|
||||
* down the above characters, but in addition permits the VEOF, VERASE, VKILL
|
||||
* and VWERASE characters described by the user's termios structure.
|
||||
*
|
||||
* Ex was not consistent with this scheme, as it historically ran in tty
|
||||
* cooked mode. This meant that the scroll command and autoindent erase
|
||||
* characters were mapped to the user's EOF character, and the character
|
||||
* and word deletion characters were the user's tty character and word
|
||||
* deletion characters. This implementation makes it all consistent, as
|
||||
* described above for vi.
|
||||
*
|
||||
* !!!
|
||||
* This means that all screens share a special key set.
|
||||
*/
|
||||
KEYLIST keylist[] = {
|
||||
{K_BACKSLASH, '\\'}, /* \ */
|
||||
{K_CARAT, '^'}, /* ^ */
|
||||
{K_CNTRLD, '\004'}, /* ^D */
|
||||
{K_CNTRLR, '\022'}, /* ^R */
|
||||
{K_CNTRLT, '\024'}, /* ^T */
|
||||
{K_CNTRLZ, '\032'}, /* ^Z */
|
||||
{K_COLON, ':'}, /* : */
|
||||
{K_CR, '\r'}, /* \r */
|
||||
{K_ESCAPE, '\033'}, /* ^[ */
|
||||
{K_FORMFEED, '\f'}, /* \f */
|
||||
{K_HEXCHAR, '\030'}, /* ^X */
|
||||
{K_NL, '\n'}, /* \n */
|
||||
{K_RIGHTBRACE, '}'}, /* } */
|
||||
{K_RIGHTPAREN, ')'}, /* ) */
|
||||
{K_TAB, '\t'}, /* \t */
|
||||
{K_VERASE, '\b'}, /* \b */
|
||||
{K_VKILL, '\025'}, /* ^U */
|
||||
{K_VLNEXT, '\021'}, /* ^Q */
|
||||
{K_VLNEXT, '\026'}, /* ^V */
|
||||
{K_VWERASE, '\027'}, /* ^W */
|
||||
{K_ZERO, '0'}, /* 0 */
|
||||
|
||||
#define ADDITIONAL_CHARACTERS 4
|
||||
{K_NOTUSED, 0}, /* VEOF, VERASE, VKILL, VWERASE */
|
||||
{K_NOTUSED, 0},
|
||||
{K_NOTUSED, 0},
|
||||
{K_NOTUSED, 0},
|
||||
};
|
||||
static int nkeylist =
|
||||
(sizeof(keylist) / sizeof(keylist[0])) - ADDITIONAL_CHARACTERS;
|
||||
|
||||
/*
|
||||
* v_key_init --
|
||||
* Initialize the special key lookup table.
|
||||
*
|
||||
* PUBLIC: int v_key_init __P((SCR *));
|
||||
*/
|
||||
int
|
||||
v_key_init(sp)
|
||||
SCR *sp;
|
||||
{
|
||||
CHAR_T ch;
|
||||
GS *gp;
|
||||
KEYLIST *kp;
|
||||
int cnt;
|
||||
|
||||
gp = sp->gp;
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* 8-bit only, for now. Recompilation should get you any 8-bit
|
||||
* character set, as long as nul isn't a character.
|
||||
*/
|
||||
(void)setlocale(LC_ALL, "");
|
||||
#if __linux__
|
||||
/*
|
||||
* In libc 4.5.26, setlocale(LC_ALL, ""), doesn't setup the table
|
||||
* for ctype(3c) correctly. This bug is fixed in libc 4.6.x.
|
||||
*
|
||||
* This code works around this problem for libc 4.5.x users.
|
||||
* Note that this code is harmless if you're using libc 4.6.x.
|
||||
*/
|
||||
(void)setlocale(LC_CTYPE, "");
|
||||
#endif
|
||||
v_key_ilookup(sp);
|
||||
|
||||
v_keyval(sp, K_CNTRLD, KEY_VEOF);
|
||||
v_keyval(sp, K_VERASE, KEY_VERASE);
|
||||
v_keyval(sp, K_VKILL, KEY_VKILL);
|
||||
v_keyval(sp, K_VWERASE, KEY_VWERASE);
|
||||
|
||||
/* Sort the special key list. */
|
||||
qsort(keylist, nkeylist, sizeof(keylist[0]), v_key_cmp);
|
||||
|
||||
/* Initialize the fast lookup table. */
|
||||
for (gp->max_special = 0, kp = keylist, cnt = nkeylist; cnt--; ++kp) {
|
||||
if (gp->max_special < kp->value)
|
||||
gp->max_special = kp->value;
|
||||
if (kp->ch <= MAX_FAST_KEY)
|
||||
gp->special_key[kp->ch] = kp->value;
|
||||
}
|
||||
|
||||
/* Find a non-printable character to use as a message separator. */
|
||||
for (ch = 1; ch <= MAX_CHAR_T; ++ch)
|
||||
if (!isprint(ch)) {
|
||||
gp->noprint = ch;
|
||||
break;
|
||||
}
|
||||
if (ch != gp->noprint) {
|
||||
msgq(sp, M_ERR, "079|No non-printable character found");
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* v_keyval --
|
||||
* Set key values.
|
||||
*
|
||||
* We've left some open slots in the keylist table, and if these values exist,
|
||||
* we put them into place. Note, they may reset (or duplicate) values already
|
||||
* in the table, so we check for that first.
|
||||
*/
|
||||
static void
|
||||
v_keyval(sp, val, name)
|
||||
SCR *sp;
|
||||
int val;
|
||||
scr_keyval_t name;
|
||||
{
|
||||
KEYLIST *kp;
|
||||
CHAR_T ch;
|
||||
int dne;
|
||||
|
||||
/* Get the key's value from the screen. */
|
||||
if (sp->gp->scr_keyval(sp, name, &ch, &dne))
|
||||
return;
|
||||
if (dne)
|
||||
return;
|
||||
|
||||
/* Check for duplication. */
|
||||
for (kp = keylist; kp->value != K_NOTUSED; ++kp)
|
||||
if (kp->ch == ch) {
|
||||
kp->value = val;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Add a new entry. */
|
||||
if (kp->value == K_NOTUSED) {
|
||||
keylist[nkeylist].ch = ch;
|
||||
keylist[nkeylist].value = val;
|
||||
++nkeylist;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* v_key_ilookup --
|
||||
* Build the fast-lookup key display array.
|
||||
*
|
||||
* PUBLIC: void v_key_ilookup __P((SCR *));
|
||||
*/
|
||||
void
|
||||
v_key_ilookup(sp)
|
||||
SCR *sp;
|
||||
{
|
||||
CHAR_T ch, *p, *t;
|
||||
GS *gp;
|
||||
size_t len;
|
||||
|
||||
for (gp = sp->gp, ch = 0; ch <= MAX_FAST_KEY; ++ch)
|
||||
for (p = gp->cname[ch].name, t = v_key_name(sp, ch),
|
||||
len = gp->cname[ch].len = sp->clen; len--;)
|
||||
*p++ = *t++;
|
||||
}
|
||||
|
||||
/*
|
||||
* v_key_len --
|
||||
* Return the length of the string that will display the key.
|
||||
* This routine is the backup for the KEY_LEN() macro.
|
||||
*
|
||||
* PUBLIC: size_t v_key_len __P((SCR *, ARG_CHAR_T));
|
||||
*/
|
||||
size_t
|
||||
v_key_len(sp, ch)
|
||||
SCR *sp;
|
||||
ARG_CHAR_T ch;
|
||||
{
|
||||
(void)v_key_name(sp, ch);
|
||||
return (sp->clen);
|
||||
}
|
||||
|
||||
/*
|
||||
* v_key_name --
|
||||
* Return the string that will display the key. This routine
|
||||
* is the backup for the KEY_NAME() macro.
|
||||
*
|
||||
* PUBLIC: CHAR_T *v_key_name __P((SCR *, ARG_CHAR_T));
|
||||
*/
|
||||
CHAR_T *
|
||||
v_key_name(sp, ach)
|
||||
SCR *sp;
|
||||
ARG_CHAR_T ach;
|
||||
{
|
||||
static const CHAR_T hexdigit[] = "0123456789abcdef";
|
||||
static const CHAR_T octdigit[] = "01234567";
|
||||
CHAR_T ch, *chp, mask;
|
||||
size_t len;
|
||||
int cnt, shift;
|
||||
|
||||
ch = ach;
|
||||
|
||||
/* See if the character was explicitly declared printable or not. */
|
||||
if ((chp = O_STR(sp, O_PRINT)) != NULL)
|
||||
for (; *chp != '\0'; ++chp)
|
||||
if (*chp == ch)
|
||||
goto pr;
|
||||
if ((chp = O_STR(sp, O_NOPRINT)) != NULL)
|
||||
for (; *chp != '\0'; ++chp)
|
||||
if (*chp == ch)
|
||||
goto nopr;
|
||||
|
||||
/*
|
||||
* Historical (ARPA standard) mappings. Printable characters are left
|
||||
* alone. Control characters less than 0x20 are represented as '^'
|
||||
* followed by the character offset from the '@' character in the ASCII
|
||||
* character set. Del (0x7f) is represented as '^' followed by '?'.
|
||||
*
|
||||
* XXX
|
||||
* The following code depends on the current locale being identical to
|
||||
* the ASCII map from 0x40 to 0x5f (since 0x1f + 0x40 == 0x5f). I'm
|
||||
* told that this is a reasonable assumption...
|
||||
*
|
||||
* XXX
|
||||
* This code will only work with CHAR_T's that are multiples of 8-bit
|
||||
* bytes.
|
||||
*
|
||||
* XXX
|
||||
* NB: There's an assumption here that all printable characters take
|
||||
* up a single column on the screen. This is not always correct.
|
||||
*/
|
||||
if (isprint(ch)) {
|
||||
pr: sp->cname[0] = ch;
|
||||
len = 1;
|
||||
goto done;
|
||||
}
|
||||
nopr: if (iscntrl(ch) && (ch < 0x20 || ch == 0x7f)) {
|
||||
sp->cname[0] = '^';
|
||||
sp->cname[1] = ch == 0x7f ? '?' : '@' + ch;
|
||||
len = 2;
|
||||
} else if (O_ISSET(sp, O_OCTAL)) {
|
||||
#define BITS (sizeof(CHAR_T) * 8)
|
||||
#define SHIFT (BITS - BITS % 3)
|
||||
#define TOPMASK (BITS % 3 == 2 ? 3 : 1) << (BITS - BITS % 3)
|
||||
sp->cname[0] = '\\';
|
||||
sp->cname[1] = octdigit[(ch & TOPMASK) >> SHIFT];
|
||||
shift = SHIFT - 3;
|
||||
for (len = 2, mask = 7 << (SHIFT - 3),
|
||||
cnt = BITS / 3; cnt-- > 0; mask >>= 3, shift -= 3)
|
||||
sp->cname[len++] = octdigit[(ch & mask) >> shift];
|
||||
} else {
|
||||
sp->cname[0] = '\\';
|
||||
sp->cname[1] = 'x';
|
||||
for (len = 2, chp = (u_int8_t *)&ch,
|
||||
cnt = sizeof(CHAR_T); cnt-- > 0; ++chp) {
|
||||
sp->cname[len++] = hexdigit[(*chp & 0xf0) >> 4];
|
||||
sp->cname[len++] = hexdigit[*chp & 0x0f];
|
||||
}
|
||||
}
|
||||
done: sp->cname[sp->clen = len] = '\0';
|
||||
return (sp->cname);
|
||||
}
|
||||
|
||||
/*
|
||||
* v_key_val --
|
||||
* Fill in the value for a key. This routine is the backup
|
||||
* for the KEY_VAL() macro.
|
||||
*
|
||||
* PUBLIC: int v_key_val __P((SCR *, ARG_CHAR_T));
|
||||
*/
|
||||
int
|
||||
v_key_val(sp, ch)
|
||||
SCR *sp;
|
||||
ARG_CHAR_T ch;
|
||||
{
|
||||
KEYLIST k, *kp;
|
||||
|
||||
k.ch = ch;
|
||||
kp = bsearch(&k, keylist, nkeylist, sizeof(keylist[0]), v_key_cmp);
|
||||
return (kp == NULL ? K_NOTUSED : kp->value);
|
||||
}
|
||||
|
||||
/*
|
||||
* v_event_push --
|
||||
* Push events/keys onto the front of the buffer.
|
||||
*
|
||||
* There is a single input buffer in ex/vi. Characters are put onto the
|
||||
* end of the buffer by the terminal input routines, and pushed onto the
|
||||
* front of the buffer by various other functions in ex/vi. Each key has
|
||||
* an associated flag value, which indicates if it has already been quoted,
|
||||
* and if it is the result of a mapping or an abbreviation.
|
||||
*
|
||||
* PUBLIC: int v_event_push __P((SCR *, EVENT *, CHAR_T *, size_t, u_int));
|
||||
*/
|
||||
int
|
||||
v_event_push(sp, p_evp, p_s, nitems, flags)
|
||||
SCR *sp;
|
||||
EVENT *p_evp; /* Push event. */
|
||||
CHAR_T *p_s; /* Push characters. */
|
||||
size_t nitems; /* Number of items to push. */
|
||||
u_int flags; /* CH_* flags. */
|
||||
{
|
||||
EVENT *evp;
|
||||
GS *gp;
|
||||
size_t total;
|
||||
|
||||
/* If we have room, stuff the items into the buffer. */
|
||||
gp = sp->gp;
|
||||
if (nitems <= gp->i_next ||
|
||||
(gp->i_event != NULL && gp->i_cnt == 0 && nitems <= gp->i_nelem)) {
|
||||
if (gp->i_cnt != 0)
|
||||
gp->i_next -= nitems;
|
||||
goto copy;
|
||||
}
|
||||
|
||||
/*
|
||||
* If there are currently items in the queue, shift them up,
|
||||
* leaving some extra room. Get enough space plus a little
|
||||
* extra.
|
||||
*/
|
||||
#define TERM_PUSH_SHIFT 30
|
||||
total = gp->i_cnt + gp->i_next + nitems + TERM_PUSH_SHIFT;
|
||||
if (total >= gp->i_nelem && v_event_grow(sp, MAX(total, 64)))
|
||||
return (1);
|
||||
if (gp->i_cnt)
|
||||
MEMMOVE(gp->i_event + TERM_PUSH_SHIFT + nitems,
|
||||
gp->i_event + gp->i_next, gp->i_cnt);
|
||||
gp->i_next = TERM_PUSH_SHIFT;
|
||||
|
||||
/* Put the new items into the queue. */
|
||||
copy: gp->i_cnt += nitems;
|
||||
for (evp = gp->i_event + gp->i_next; nitems--; ++evp) {
|
||||
if (p_evp != NULL)
|
||||
*evp = *p_evp++;
|
||||
else {
|
||||
evp->e_event = E_CHARACTER;
|
||||
evp->e_c = *p_s++;
|
||||
evp->e_value = KEY_VAL(sp, evp->e_c);
|
||||
F_INIT(&evp->e_ch, flags);
|
||||
}
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* v_event_append --
|
||||
* Append events onto the tail of the buffer.
|
||||
*/
|
||||
static int
|
||||
v_event_append(sp, argp)
|
||||
SCR *sp;
|
||||
EVENT *argp;
|
||||
{
|
||||
CHAR_T *s; /* Characters. */
|
||||
EVENT *evp;
|
||||
GS *gp;
|
||||
size_t nevents; /* Number of events. */
|
||||
|
||||
/* Grow the buffer as necessary. */
|
||||
nevents = argp->e_event == E_STRING ? argp->e_len : 1;
|
||||
gp = sp->gp;
|
||||
if (gp->i_event == NULL ||
|
||||
nevents > gp->i_nelem - (gp->i_next + gp->i_cnt))
|
||||
v_event_grow(sp, MAX(nevents, 64));
|
||||
evp = gp->i_event + gp->i_next + gp->i_cnt;
|
||||
gp->i_cnt += nevents;
|
||||
|
||||
/* Transform strings of characters into single events. */
|
||||
if (argp->e_event == E_STRING)
|
||||
for (s = argp->e_csp; nevents--; ++evp) {
|
||||
evp->e_event = E_CHARACTER;
|
||||
evp->e_c = *s++;
|
||||
evp->e_value = KEY_VAL(sp, evp->e_c);
|
||||
evp->e_flags = 0;
|
||||
}
|
||||
else
|
||||
*evp = *argp;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Remove events from the queue. */
|
||||
#define QREM(len) { \
|
||||
if ((gp->i_cnt -= len) == 0) \
|
||||
gp->i_next = 0; \
|
||||
else \
|
||||
gp->i_next += len; \
|
||||
}
|
||||
|
||||
/*
|
||||
* v_event_get --
|
||||
* Return the next event.
|
||||
*
|
||||
* !!!
|
||||
* The flag EC_NODIGIT probably needs some explanation. First, the idea of
|
||||
* mapping keys is that one or more keystrokes act like a function key.
|
||||
* What's going on is that vi is reading a number, and the character following
|
||||
* the number may or may not be mapped (EC_MAPCOMMAND). For example, if the
|
||||
* user is entering the z command, a valid command is "z40+", and we don't want
|
||||
* to map the '+', i.e. if '+' is mapped to "xxx", we don't want to change it
|
||||
* into "z40xxx". However, if the user enters "35x", we want to put all of the
|
||||
* characters through the mapping code.
|
||||
*
|
||||
* Historical practice is a bit muddled here. (Surprise!) It always permitted
|
||||
* mapping digits as long as they weren't the first character of the map, e.g.
|
||||
* ":map ^A1 xxx" was okay. It also permitted the mapping of the digits 1-9
|
||||
* (the digit 0 was a special case as it doesn't indicate the start of a count)
|
||||
* as the first character of the map, but then ignored those mappings. While
|
||||
* it's probably stupid to map digits, vi isn't your mother.
|
||||
*
|
||||
* The way this works is that the EC_MAPNODIGIT causes term_key to return the
|
||||
* end-of-digit without "looking" at the next character, i.e. leaving it as the
|
||||
* user entered it. Presumably, the next term_key call will tell us how the
|
||||
* user wants it handled.
|
||||
*
|
||||
* There is one more complication. Users might map keys to digits, and, as
|
||||
* it's described above, the commands:
|
||||
*
|
||||
* :map g 1G
|
||||
* d2g
|
||||
*
|
||||
* would return the keys "d2<end-of-digits>1G", when the user probably wanted
|
||||
* "d21<end-of-digits>G". So, if a map starts off with a digit we continue as
|
||||
* before, otherwise, we pretend we haven't mapped the character, and return
|
||||
* <end-of-digits>.
|
||||
*
|
||||
* Now that that's out of the way, let's talk about Energizer Bunny macros.
|
||||
* It's easy to create macros that expand to a loop, e.g. map x 3x. It's
|
||||
* fairly easy to detect this example, because it's all internal to term_key.
|
||||
* If we're expanding a macro and it gets big enough, at some point we can
|
||||
* assume it's looping and kill it. The examples that are tough are the ones
|
||||
* where the parser is involved, e.g. map x "ayyx"byy. We do an expansion
|
||||
* on 'x', and get "ayyx"byy. We then return the first 4 characters, and then
|
||||
* find the looping macro again. There is no way that we can detect this
|
||||
* without doing a full parse of the command, because the character that might
|
||||
* cause the loop (in this case 'x') may be a literal character, e.g. the map
|
||||
* map x "ayy"xyy"byy is perfectly legal and won't cause a loop.
|
||||
*
|
||||
* Historic vi tried to detect looping macros by disallowing obvious cases in
|
||||
* the map command, maps that that ended with the same letter as they started
|
||||
* (which wrongly disallowed "map x 'x"), and detecting macros that expanded
|
||||
* too many times before keys were returned to the command parser. It didn't
|
||||
* get many (most?) of the tricky cases right, however, and it was certainly
|
||||
* possible to create macros that ran forever. And, even if it did figure out
|
||||
* what was going on, the user was usually tossed into ex mode. Finally, any
|
||||
* changes made before vi realized that the macro was recursing were left in
|
||||
* place. We recover gracefully, but the only recourse the user has in an
|
||||
* infinite macro loop is to interrupt.
|
||||
*
|
||||
* !!!
|
||||
* It is historic practice that mapping characters to themselves as the first
|
||||
* part of the mapped string was legal, and did not cause infinite loops, i.e.
|
||||
* ":map! { {^M^T" and ":map n nz." were known to work. The initial, matching
|
||||
* characters were returned instead of being remapped.
|
||||
*
|
||||
* !!!
|
||||
* It is also historic practice that the macro "map ] ]]^" caused a single ]
|
||||
* keypress to behave as the command ]] (the ^ got the map past the vi check
|
||||
* for "tail recursion"). Conversely, the mapping "map n nn^" went recursive.
|
||||
* What happened was that, in the historic vi, maps were expanded as the keys
|
||||
* were retrieved, but not all at once and not centrally. So, the keypress ]
|
||||
* pushed ]]^ on the stack, and then the first ] from the stack was passed to
|
||||
* the ]] command code. The ]] command then retrieved a key without entering
|
||||
* the mapping code. This could bite us anytime a user has a map that depends
|
||||
* on secondary keys NOT being mapped. I can't see any possible way to make
|
||||
* this work in here without the complete abandonment of Rationality Itself.
|
||||
*
|
||||
* XXX
|
||||
* The final issue is recovery. It would be possible to undo all of the work
|
||||
* that was done by the macro if we entered a record into the log so that we
|
||||
* knew when the macro started, and, in fact, this might be worth doing at some
|
||||
* point. Given that this might make the log grow unacceptably (consider that
|
||||
* cursor keys are done with maps), for now we leave any changes made in place.
|
||||
*
|
||||
* PUBLIC: int v_event_get __P((SCR *, EVENT *, int, u_int32_t));
|
||||
*/
|
||||
int
|
||||
v_event_get(sp, argp, timeout, flags)
|
||||
SCR *sp;
|
||||
EVENT *argp;
|
||||
int timeout;
|
||||
u_int32_t flags;
|
||||
{
|
||||
EVENT *evp, ev;
|
||||
GS *gp;
|
||||
SEQ *qp;
|
||||
int init_nomap, ispartial, istimeout, remap_cnt;
|
||||
|
||||
gp = sp->gp;
|
||||
|
||||
/* If simply checking for interrupts, argp may be NULL. */
|
||||
if (argp == NULL)
|
||||
argp = &ev;
|
||||
|
||||
retry: istimeout = remap_cnt = 0;
|
||||
|
||||
/*
|
||||
* If the queue isn't empty and we're timing out for characters,
|
||||
* return immediately.
|
||||
*/
|
||||
if (gp->i_cnt != 0 && LF_ISSET(EC_TIMEOUT))
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* If the queue is empty, we're checking for interrupts, or we're
|
||||
* timing out for characters, get more events.
|
||||
*/
|
||||
if (gp->i_cnt == 0 || LF_ISSET(EC_INTERRUPT | EC_TIMEOUT)) {
|
||||
/*
|
||||
* If we're reading new characters, check any scripting
|
||||
* windows for input.
|
||||
*/
|
||||
if (F_ISSET(gp, G_SCRWIN) && sscr_input(sp))
|
||||
return (1);
|
||||
loop: if (gp->scr_event(sp, argp,
|
||||
LF_ISSET(EC_INTERRUPT | EC_QUOTED | EC_RAW), timeout))
|
||||
return (1);
|
||||
switch (argp->e_event) {
|
||||
case E_ERR:
|
||||
case E_SIGHUP:
|
||||
case E_SIGTERM:
|
||||
/*
|
||||
* Fatal conditions cause the file to be synced to
|
||||
* disk immediately.
|
||||
*/
|
||||
v_sync(sp, RCV_ENDSESSION | RCV_PRESERVE |
|
||||
(argp->e_event == E_SIGTERM ? 0: RCV_EMAIL));
|
||||
return (1);
|
||||
case E_TIMEOUT:
|
||||
istimeout = 1;
|
||||
break;
|
||||
case E_INTERRUPT:
|
||||
/* Set the global interrupt flag. */
|
||||
F_SET(sp->gp, G_INTERRUPTED);
|
||||
|
||||
/*
|
||||
* If the caller was interested in interrupts, return
|
||||
* immediately.
|
||||
*/
|
||||
if (LF_ISSET(EC_INTERRUPT))
|
||||
return (0);
|
||||
goto append;
|
||||
default:
|
||||
append: if (v_event_append(sp, argp))
|
||||
return (1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If the caller was only interested in interrupts or timeouts, return
|
||||
* immediately. (We may have gotten characters, and that's okay, they
|
||||
* were queued up for later use.)
|
||||
*/
|
||||
if (LF_ISSET(EC_INTERRUPT | EC_TIMEOUT))
|
||||
return (0);
|
||||
|
||||
newmap: evp = &gp->i_event[gp->i_next];
|
||||
|
||||
/*
|
||||
* If the next event in the queue isn't a character event, return
|
||||
* it, we're done.
|
||||
*/
|
||||
if (evp->e_event != E_CHARACTER) {
|
||||
*argp = *evp;
|
||||
QREM(1);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the key isn't mappable because:
|
||||
*
|
||||
* + ... the timeout has expired
|
||||
* + ... it's not a mappable key
|
||||
* + ... neither the command or input map flags are set
|
||||
* + ... there are no maps that can apply to it
|
||||
*
|
||||
* return it forthwith.
|
||||
*/
|
||||
if (istimeout || F_ISSET(&evp->e_ch, CH_NOMAP) ||
|
||||
!LF_ISSET(EC_MAPCOMMAND | EC_MAPINPUT) ||
|
||||
evp->e_c < MAX_BIT_SEQ && !bit_test(gp->seqb, evp->e_c))
|
||||
goto nomap;
|
||||
|
||||
/* Search the map. */
|
||||
qp = seq_find(sp, NULL, evp, NULL, gp->i_cnt,
|
||||
LF_ISSET(EC_MAPCOMMAND) ? SEQ_COMMAND : SEQ_INPUT, &ispartial);
|
||||
|
||||
/*
|
||||
* If get a partial match, get more characters and retry the map.
|
||||
* If time out without further characters, return the characters
|
||||
* unmapped.
|
||||
*
|
||||
* !!!
|
||||
* <escape> characters are a problem. Cursor keys start with <escape>
|
||||
* characters, so there's almost always a map in place that begins with
|
||||
* an <escape> character. If we timeout <escape> keys in the same way
|
||||
* that we timeout other keys, the user will get a noticeable pause as
|
||||
* they enter <escape> to terminate input mode. If key timeout is set
|
||||
* for a slow link, users will get an even longer pause. Nvi used to
|
||||
* simply timeout <escape> characters at 1/10th of a second, but this
|
||||
* loses over PPP links where the latency is greater than 100Ms.
|
||||
*/
|
||||
if (ispartial) {
|
||||
if (O_ISSET(sp, O_TIMEOUT))
|
||||
timeout = (evp->e_value == K_ESCAPE ?
|
||||
O_VAL(sp, O_ESCAPETIME) :
|
||||
O_VAL(sp, O_KEYTIME)) * 100;
|
||||
else
|
||||
timeout = 0;
|
||||
goto loop;
|
||||
}
|
||||
|
||||
/* If no map, return the character. */
|
||||
if (qp == NULL) {
|
||||
nomap: if (!isdigit(evp->e_c) && LF_ISSET(EC_MAPNODIGIT))
|
||||
goto not_digit;
|
||||
*argp = *evp;
|
||||
QREM(1);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* If looking for the end of a digit string, and the first character
|
||||
* of the map is it, pretend we haven't seen the character.
|
||||
*/
|
||||
if (LF_ISSET(EC_MAPNODIGIT) &&
|
||||
qp->output != NULL && !isdigit(qp->output[0])) {
|
||||
not_digit: argp->e_c = CH_NOT_DIGIT;
|
||||
argp->e_value = K_NOTUSED;
|
||||
argp->e_event = E_CHARACTER;
|
||||
F_INIT(&argp->e_ch, 0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Find out if the initial segments are identical. */
|
||||
init_nomap = !e_memcmp(qp->output, &gp->i_event[gp->i_next], qp->ilen);
|
||||
|
||||
/* Delete the mapped characters from the queue. */
|
||||
QREM(qp->ilen);
|
||||
|
||||
/* If keys mapped to nothing, go get more. */
|
||||
if (qp->output == NULL)
|
||||
goto retry;
|
||||
|
||||
/* If remapping characters... */
|
||||
if (O_ISSET(sp, O_REMAP)) {
|
||||
/*
|
||||
* Periodically check for interrupts. Always check the first
|
||||
* time through, because it's possible to set up a map that
|
||||
* will return a character every time, but will expand to more,
|
||||
* e.g. "map! a aaaa" will always return a 'a', but we'll never
|
||||
* get anywhere useful.
|
||||
*/
|
||||
if ((++remap_cnt == 1 || remap_cnt % 10 == 0) &&
|
||||
(gp->scr_event(sp, &ev,
|
||||
EC_INTERRUPT, 0) || ev.e_event == E_INTERRUPT)) {
|
||||
F_SET(sp->gp, G_INTERRUPTED);
|
||||
argp->e_event = E_INTERRUPT;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* If an initial part of the characters mapped, they are not
|
||||
* further remapped -- return the first one. Push the rest
|
||||
* of the characters, or all of the characters if no initial
|
||||
* part mapped, back on the queue.
|
||||
*/
|
||||
if (init_nomap) {
|
||||
if (v_event_push(sp, NULL, qp->output + qp->ilen,
|
||||
qp->olen - qp->ilen, CH_MAPPED))
|
||||
return (1);
|
||||
if (v_event_push(sp, NULL,
|
||||
qp->output, qp->ilen, CH_NOMAP | CH_MAPPED))
|
||||
return (1);
|
||||
evp = &gp->i_event[gp->i_next];
|
||||
goto nomap;
|
||||
}
|
||||
if (v_event_push(sp, NULL, qp->output, qp->olen, CH_MAPPED))
|
||||
return (1);
|
||||
goto newmap;
|
||||
}
|
||||
|
||||
/* Else, push the characters on the queue and return one. */
|
||||
if (v_event_push(sp, NULL, qp->output, qp->olen, CH_MAPPED | CH_NOMAP))
|
||||
return (1);
|
||||
|
||||
goto nomap;
|
||||
}
|
||||
|
||||
/*
|
||||
* v_sync --
|
||||
* Walk the screen lists, sync'ing files to their backup copies.
|
||||
*/
|
||||
static void
|
||||
v_sync(sp, flags)
|
||||
SCR *sp;
|
||||
int flags;
|
||||
{
|
||||
GS *gp;
|
||||
|
||||
gp = sp->gp;
|
||||
for (sp = gp->dq.cqh_first; sp != (void *)&gp->dq; sp = sp->q.cqe_next)
|
||||
rcv_sync(sp, flags);
|
||||
for (sp = gp->hq.cqh_first; sp != (void *)&gp->hq; sp = sp->q.cqe_next)
|
||||
rcv_sync(sp, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* v_event_err --
|
||||
* Unexpected event.
|
||||
*
|
||||
* PUBLIC: void v_event_err __P((SCR *, EVENT *));
|
||||
*/
|
||||
void
|
||||
v_event_err(sp, evp)
|
||||
SCR *sp;
|
||||
EVENT *evp;
|
||||
{
|
||||
switch (evp->e_event) {
|
||||
case E_CHARACTER:
|
||||
msgq(sp, M_ERR, "276|Unexpected character event");
|
||||
break;
|
||||
case E_EOF:
|
||||
msgq(sp, M_ERR, "277|Unexpected end-of-file event");
|
||||
break;
|
||||
case E_INTERRUPT:
|
||||
msgq(sp, M_ERR, "279|Unexpected interrupt event");
|
||||
break;
|
||||
case E_QUIT:
|
||||
msgq(sp, M_ERR, "280|Unexpected quit event");
|
||||
break;
|
||||
case E_REPAINT:
|
||||
msgq(sp, M_ERR, "281|Unexpected repaint event");
|
||||
break;
|
||||
case E_STRING:
|
||||
msgq(sp, M_ERR, "285|Unexpected string event");
|
||||
break;
|
||||
case E_TIMEOUT:
|
||||
msgq(sp, M_ERR, "286|Unexpected timeout event");
|
||||
break;
|
||||
case E_WRESIZE:
|
||||
msgq(sp, M_ERR, "316|Unexpected resize event");
|
||||
break;
|
||||
case E_WRITE:
|
||||
msgq(sp, M_ERR, "287|Unexpected write event");
|
||||
break;
|
||||
|
||||
/*
|
||||
* Theoretically, none of these can occur, as they're handled at the
|
||||
* top editor level.
|
||||
*/
|
||||
case E_ERR:
|
||||
case E_SIGHUP:
|
||||
case E_SIGTERM:
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
|
||||
/* Free any allocated memory. */
|
||||
if (evp->e_asp != NULL)
|
||||
free(evp->e_asp);
|
||||
}
|
||||
|
||||
/*
|
||||
* v_event_flush --
|
||||
* Flush any flagged keys, returning if any keys were flushed.
|
||||
*
|
||||
* PUBLIC: int v_event_flush __P((SCR *, u_int));
|
||||
*/
|
||||
int
|
||||
v_event_flush(sp, flags)
|
||||
SCR *sp;
|
||||
u_int flags;
|
||||
{
|
||||
GS *gp;
|
||||
int rval;
|
||||
|
||||
for (rval = 0, gp = sp->gp; gp->i_cnt != 0 &&
|
||||
F_ISSET(&gp->i_event[gp->i_next].e_ch, flags); rval = 1)
|
||||
QREM(1);
|
||||
return (rval);
|
||||
}
|
||||
|
||||
/*
|
||||
* v_event_grow --
|
||||
* Grow the terminal queue.
|
||||
*/
|
||||
static int
|
||||
v_event_grow(sp, add)
|
||||
SCR *sp;
|
||||
int add;
|
||||
{
|
||||
GS *gp;
|
||||
size_t new_nelem, olen;
|
||||
|
||||
gp = sp->gp;
|
||||
new_nelem = gp->i_nelem + add;
|
||||
olen = gp->i_nelem * sizeof(gp->i_event[0]);
|
||||
BINC_RET(sp, gp->i_event, olen, new_nelem * sizeof(gp->i_event[0]));
|
||||
gp->i_nelem = olen / sizeof(gp->i_event[0]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* v_key_cmp --
|
||||
* Compare two keys for sorting.
|
||||
*/
|
||||
static int
|
||||
v_key_cmp(ap, bp)
|
||||
const void *ap, *bp;
|
||||
{
|
||||
return (((KEYLIST *)ap)->ch - ((KEYLIST *)bp)->ch);
|
||||
}
|
222
contrib/nvi/common/key.h
Normal file
222
contrib/nvi/common/key.h
Normal file
@ -0,0 +1,222 @@
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1991, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*
|
||||
* @(#)key.h 10.18 (Berkeley) 6/30/96
|
||||
*/
|
||||
|
||||
/*
|
||||
* Fundamental character types.
|
||||
*
|
||||
* CHAR_T An integral type that can hold any character.
|
||||
* ARG_CHAR_T The type of a CHAR_T when passed as an argument using
|
||||
* traditional promotion rules. It should also be able
|
||||
* to be compared against any CHAR_T for equality without
|
||||
* problems.
|
||||
* MAX_CHAR_T The maximum value of any character.
|
||||
*
|
||||
* If no integral type can hold a character, don't even try the port.
|
||||
*/
|
||||
typedef u_char CHAR_T;
|
||||
typedef u_int ARG_CHAR_T;
|
||||
#define MAX_CHAR_T 0xff
|
||||
|
||||
/* The maximum number of columns any character can take up on a screen. */
|
||||
#define MAX_CHARACTER_COLUMNS 4
|
||||
|
||||
/*
|
||||
* Event types.
|
||||
*
|
||||
* The program structure depends on the event loop being able to return
|
||||
* E_EOF/E_ERR multiple times -- eventually enough things will end due
|
||||
* to the events that vi will reach the command level for the screen, at
|
||||
* which point the exit flags will be set and vi will exit.
|
||||
*/
|
||||
typedef enum {
|
||||
E_NOTUSED = 0, /* Not set. */
|
||||
E_CHARACTER, /* Input character: e_c set. */
|
||||
E_EOF, /* End of input (NOT ^D). */
|
||||
E_ERR, /* Input error. */
|
||||
E_INTERRUPT, /* Interrupt. */
|
||||
E_QUIT, /* Quit. */
|
||||
E_REPAINT, /* Repaint: e_flno, e_tlno set. */
|
||||
E_SIGHUP, /* SIGHUP. */
|
||||
E_SIGTERM, /* SIGTERM. */
|
||||
E_STRING, /* Input string: e_csp, e_len set. */
|
||||
E_TIMEOUT, /* Timeout. */
|
||||
E_WRESIZE, /* Window resize. */
|
||||
E_WRITE /* Write. */
|
||||
} e_event_t;
|
||||
|
||||
/*
|
||||
* Character values.
|
||||
*/
|
||||
typedef enum {
|
||||
K_NOTUSED = 0, /* Not set. */
|
||||
K_BACKSLASH, /* \ */
|
||||
K_CARAT, /* ^ */
|
||||
K_CNTRLD, /* ^D */
|
||||
K_CNTRLR, /* ^R */
|
||||
K_CNTRLT, /* ^T */
|
||||
K_CNTRLZ, /* ^Z */
|
||||
K_COLON, /* : */
|
||||
K_CR, /* \r */
|
||||
K_ESCAPE, /* ^[ */
|
||||
K_FORMFEED, /* \f */
|
||||
K_HEXCHAR, /* ^X */
|
||||
K_NL, /* \n */
|
||||
K_RIGHTBRACE, /* } */
|
||||
K_RIGHTPAREN, /* ) */
|
||||
K_TAB, /* \t */
|
||||
K_VERASE, /* set from tty: default ^H */
|
||||
K_VKILL, /* set from tty: default ^U */
|
||||
K_VLNEXT, /* set from tty: default ^V */
|
||||
K_VWERASE, /* set from tty: default ^W */
|
||||
K_ZERO /* 0 */
|
||||
} e_key_t;
|
||||
|
||||
struct _event {
|
||||
TAILQ_ENTRY(_event) q; /* Linked list of events. */
|
||||
e_event_t e_event; /* Event type. */
|
||||
union {
|
||||
struct { /* Input character. */
|
||||
CHAR_T c; /* Character. */
|
||||
e_key_t value; /* Key type. */
|
||||
|
||||
#define CH_ABBREVIATED 0x01 /* Character is from an abbreviation. */
|
||||
#define CH_MAPPED 0x02 /* Character is from a map. */
|
||||
#define CH_NOMAP 0x04 /* Do not map the character. */
|
||||
#define CH_QUOTED 0x08 /* Character is already quoted. */
|
||||
u_int8_t flags;
|
||||
} _e_ch;
|
||||
#define e_ch _u_event._e_ch /* !!! The structure, not the char. */
|
||||
#define e_c _u_event._e_ch.c
|
||||
#define e_value _u_event._e_ch.value
|
||||
#define e_flags _u_event._e_ch.flags
|
||||
|
||||
struct { /* Screen position, size. */
|
||||
size_t lno1; /* Line number. */
|
||||
size_t cno1; /* Column number. */
|
||||
size_t lno2; /* Line number. */
|
||||
size_t cno2; /* Column number. */
|
||||
} _e_mark;
|
||||
#define e_lno _u_event._e_mark.lno1 /* Single location. */
|
||||
#define e_cno _u_event._e_mark.cno1
|
||||
#define e_flno _u_event._e_mark.lno1 /* Text region. */
|
||||
#define e_fcno _u_event._e_mark.cno1
|
||||
#define e_tlno _u_event._e_mark.lno2
|
||||
#define e_tcno _u_event._e_mark.cno2
|
||||
|
||||
struct { /* Input string. */
|
||||
CHAR_T *asp; /* Allocated string. */
|
||||
CHAR_T *csp; /* String. */
|
||||
size_t len; /* String length. */
|
||||
} _e_str;
|
||||
#define e_asp _u_event._e_str.asp
|
||||
#define e_csp _u_event._e_str.csp
|
||||
#define e_len _u_event._e_str.len
|
||||
} _u_event;
|
||||
};
|
||||
|
||||
typedef struct _keylist {
|
||||
e_key_t value; /* Special value. */
|
||||
CHAR_T ch; /* Key. */
|
||||
} KEYLIST;
|
||||
extern KEYLIST keylist[];
|
||||
|
||||
/* Return if more keys in queue. */
|
||||
#define KEYS_WAITING(sp) ((sp)->gp->i_cnt != 0)
|
||||
#define MAPPED_KEYS_WAITING(sp) \
|
||||
(KEYS_WAITING(sp) && \
|
||||
F_ISSET(&sp->gp->i_event[sp->gp->i_next].e_ch, CH_MAPPED))
|
||||
|
||||
/*
|
||||
* Ex/vi commands are generally separated by whitespace characters. We
|
||||
* can't use the standard isspace(3) macro because it returns true for
|
||||
* characters like ^K in the ASCII character set. The 4.4BSD isblank(3)
|
||||
* macro does exactly what we want, but it's not portable yet.
|
||||
*
|
||||
* XXX
|
||||
* Note side effect, ch is evaluated multiple times.
|
||||
*/
|
||||
#ifndef isblank
|
||||
#define isblank(ch) ((ch) == ' ' || (ch) == '\t')
|
||||
#endif
|
||||
|
||||
/* The "standard" tab width, for displaying things to users. */
|
||||
#define STANDARD_TAB 6
|
||||
|
||||
/* Various special characters, messages. */
|
||||
#define CH_BSEARCH '?' /* Backward search prompt. */
|
||||
#define CH_CURSOR ' ' /* Cursor character. */
|
||||
#define CH_ENDMARK '$' /* End of a range. */
|
||||
#define CH_EXPROMPT ':' /* Ex prompt. */
|
||||
#define CH_FSEARCH '/' /* Forward search prompt. */
|
||||
#define CH_HEX '\030' /* Leading hex character. */
|
||||
#define CH_LITERAL '\026' /* ASCII ^V. */
|
||||
#define CH_NO 'n' /* No. */
|
||||
#define CH_NOT_DIGIT 'a' /* A non-isdigit() character. */
|
||||
#define CH_QUIT 'q' /* Quit. */
|
||||
#define CH_YES 'y' /* Yes. */
|
||||
|
||||
/*
|
||||
* Checking for interrupts means that we look at the bit that gets set if the
|
||||
* screen code supports asynchronous events, and call back into the event code
|
||||
* so that non-asynchronous screens get a chance to post the interrupt.
|
||||
*
|
||||
* INTERRUPT_CHECK is the number of lines "operated" on before checking for
|
||||
* interrupts.
|
||||
*/
|
||||
#define INTERRUPT_CHECK 100
|
||||
#define INTERRUPTED(sp) \
|
||||
(F_ISSET((sp)->gp, G_INTERRUPTED) || \
|
||||
(!v_event_get(sp, NULL, 0, EC_INTERRUPT) && \
|
||||
F_ISSET((sp)->gp, G_INTERRUPTED)))
|
||||
#define CLR_INTERRUPT(sp) \
|
||||
F_CLR((sp)->gp, G_INTERRUPTED)
|
||||
|
||||
/* Flags describing types of characters being requested. */
|
||||
#define EC_INTERRUPT 0x001 /* Checking for interrupts. */
|
||||
#define EC_MAPCOMMAND 0x002 /* Apply the command map. */
|
||||
#define EC_MAPINPUT 0x004 /* Apply the input map. */
|
||||
#define EC_MAPNODIGIT 0x008 /* Return to a digit. */
|
||||
#define EC_QUOTED 0x010 /* Try to quote next character */
|
||||
#define EC_RAW 0x020 /* Any next character. XXX: not used. */
|
||||
#define EC_TIMEOUT 0x040 /* Timeout to next character. */
|
||||
|
||||
/* Flags describing text input special cases. */
|
||||
#define TXT_ADDNEWLINE 0x00000001 /* Replay starts on a new line. */
|
||||
#define TXT_AICHARS 0x00000002 /* Leading autoindent chars. */
|
||||
#define TXT_ALTWERASE 0x00000004 /* Option: altwerase. */
|
||||
#define TXT_APPENDEOL 0x00000008 /* Appending after EOL. */
|
||||
#define TXT_AUTOINDENT 0x00000010 /* Autoindent set this line. */
|
||||
#define TXT_BACKSLASH 0x00000020 /* Backslashes escape characters. */
|
||||
#define TXT_BEAUTIFY 0x00000040 /* Only printable characters. */
|
||||
#define TXT_BS 0x00000080 /* Backspace returns the buffer. */
|
||||
#define TXT_CEDIT 0x00000100 /* Can return TERM_CEDIT. */
|
||||
#define TXT_CNTRLD 0x00000200 /* Control-D is a command. */
|
||||
#define TXT_CNTRLT 0x00000400 /* Control-T is an indent special. */
|
||||
#define TXT_CR 0x00000800 /* CR returns the buffer. */
|
||||
#define TXT_DOTTERM 0x00001000 /* Leading '.' terminates the input. */
|
||||
#define TXT_EMARK 0x00002000 /* End of replacement mark. */
|
||||
#define TXT_EOFCHAR 0x00004000 /* ICANON set, return EOF character. */
|
||||
#define TXT_ESCAPE 0x00008000 /* Escape returns the buffer. */
|
||||
#define TXT_FILEC 0x00010000 /* Option: filec. */
|
||||
#define TXT_INFOLINE 0x00020000 /* Editing the info line. */
|
||||
#define TXT_MAPINPUT 0x00040000 /* Apply the input map. */
|
||||
#define TXT_NLECHO 0x00080000 /* Echo the newline. */
|
||||
#define TXT_NUMBER 0x00100000 /* Number the line. */
|
||||
#define TXT_OVERWRITE 0x00200000 /* Overwrite characters. */
|
||||
#define TXT_PROMPT 0x00400000 /* Display a prompt. */
|
||||
#define TXT_RECORD 0x00800000 /* Record for replay. */
|
||||
#define TXT_REPLACE 0x01000000 /* Replace; don't delete overwrite. */
|
||||
#define TXT_REPLAY 0x02000000 /* Replay the last input. */
|
||||
#define TXT_RESOLVE 0x04000000 /* Resolve the text into the file. */
|
||||
#define TXT_SEARCHINCR 0x08000000 /* Incremental search. */
|
||||
#define TXT_SHOWMATCH 0x10000000 /* Option: showmatch. */
|
||||
#define TXT_TTYWERASE 0x20000000 /* Option: ttywerase. */
|
||||
#define TXT_WRAPMARGIN 0x40000000 /* Option: wrapmargin. */
|
576
contrib/nvi/common/line.c
Normal file
576
contrib/nvi/common/line.c
Normal file
@ -0,0 +1,576 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1992, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)line.c 10.21 (Berkeley) 9/15/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "../vi/vi.h"
|
||||
|
||||
static int scr_update __P((SCR *, recno_t, lnop_t, int));
|
||||
|
||||
/*
|
||||
* db_eget --
|
||||
* Front-end to db_get, special case handling for empty files.
|
||||
*
|
||||
* PUBLIC: int db_eget __P((SCR *, recno_t, char **, size_t *, int *));
|
||||
*/
|
||||
int
|
||||
db_eget(sp, lno, pp, lenp, isemptyp)
|
||||
SCR *sp;
|
||||
recno_t lno; /* Line number. */
|
||||
char **pp; /* Pointer store. */
|
||||
size_t *lenp; /* Length store. */
|
||||
int *isemptyp;
|
||||
{
|
||||
recno_t l1;
|
||||
|
||||
if (isemptyp != NULL)
|
||||
*isemptyp = 0;
|
||||
|
||||
/* If the line exists, simply return it. */
|
||||
if (!db_get(sp, lno, 0, pp, lenp))
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* If the user asked for line 0 or line 1, i.e. the only possible
|
||||
* line in an empty file, find the last line of the file; db_last
|
||||
* fails loudly.
|
||||
*/
|
||||
if ((lno == 0 || lno == 1) && db_last(sp, &l1))
|
||||
return (1);
|
||||
|
||||
/* If the file isn't empty, fail loudly. */
|
||||
if (lno != 0 && lno != 1 || l1 != 0) {
|
||||
db_err(sp, lno);
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (isemptyp != NULL)
|
||||
*isemptyp = 1;
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* db_get --
|
||||
* Look in the text buffers for a line, followed by the cache, followed
|
||||
* by the database.
|
||||
*
|
||||
* PUBLIC: int db_get __P((SCR *, recno_t, u_int32_t, char **, size_t *));
|
||||
*/
|
||||
int
|
||||
db_get(sp, lno, flags, pp, lenp)
|
||||
SCR *sp;
|
||||
recno_t lno; /* Line number. */
|
||||
u_int32_t flags;
|
||||
char **pp; /* Pointer store. */
|
||||
size_t *lenp; /* Length store. */
|
||||
{
|
||||
DBT data, key;
|
||||
EXF *ep;
|
||||
TEXT *tp;
|
||||
recno_t l1, l2;
|
||||
|
||||
/*
|
||||
* The underlying recno stuff handles zero by returning NULL, but
|
||||
* have to have an OOB condition for the look-aside into the input
|
||||
* buffer anyway.
|
||||
*/
|
||||
if (lno == 0)
|
||||
goto err1;
|
||||
|
||||
/* Check for no underlying file. */
|
||||
if ((ep = sp->ep) == NULL) {
|
||||
ex_emsg(sp, NULL, EXM_NOFILEYET);
|
||||
goto err3;
|
||||
}
|
||||
|
||||
if (LF_ISSET(DBG_NOCACHE))
|
||||
goto nocache;
|
||||
|
||||
/*
|
||||
* Look-aside into the TEXT buffers and see if the line we want
|
||||
* is there.
|
||||
*/
|
||||
if (F_ISSET(sp, SC_TINPUT)) {
|
||||
l1 = ((TEXT *)sp->tiq.cqh_first)->lno;
|
||||
l2 = ((TEXT *)sp->tiq.cqh_last)->lno;
|
||||
if (l1 <= lno && l2 >= lno) {
|
||||
#if defined(DEBUG) && 0
|
||||
TRACE(sp, "retrieve TEXT buffer line %lu\n", (u_long)lno);
|
||||
#endif
|
||||
for (tp = sp->tiq.cqh_first;
|
||||
tp->lno != lno; tp = tp->q.cqe_next);
|
||||
if (lenp != NULL)
|
||||
*lenp = tp->len;
|
||||
if (pp != NULL)
|
||||
*pp = tp->lb;
|
||||
return (0);
|
||||
}
|
||||
/*
|
||||
* Adjust the line number for the number of lines used
|
||||
* by the text input buffers.
|
||||
*/
|
||||
if (lno > l2)
|
||||
lno -= l2 - l1;
|
||||
}
|
||||
|
||||
/* Look-aside into the cache, and see if the line we want is there. */
|
||||
if (lno == ep->c_lno) {
|
||||
#if defined(DEBUG) && 0
|
||||
TRACE(sp, "retrieve cached line %lu\n", (u_long)lno);
|
||||
#endif
|
||||
if (lenp != NULL)
|
||||
*lenp = ep->c_len;
|
||||
if (pp != NULL)
|
||||
*pp = ep->c_lp;
|
||||
return (0);
|
||||
}
|
||||
ep->c_lno = OOBLNO;
|
||||
|
||||
nocache:
|
||||
/* Get the line from the underlying database. */
|
||||
key.data = &lno;
|
||||
key.size = sizeof(lno);
|
||||
switch (ep->db->get(ep->db, &key, &data, 0)) {
|
||||
case -1:
|
||||
goto err2;
|
||||
case 1:
|
||||
err1: if (LF_ISSET(DBG_FATAL))
|
||||
err2: db_err(sp, lno);
|
||||
err3: if (lenp != NULL)
|
||||
*lenp = 0;
|
||||
if (pp != NULL)
|
||||
*pp = NULL;
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* Reset the cache. */
|
||||
ep->c_lno = lno;
|
||||
ep->c_len = data.size;
|
||||
ep->c_lp = data.data;
|
||||
|
||||
#if defined(DEBUG) && 0
|
||||
TRACE(sp, "retrieve DB line %lu\n", (u_long)lno);
|
||||
#endif
|
||||
if (lenp != NULL)
|
||||
*lenp = data.size;
|
||||
if (pp != NULL)
|
||||
*pp = ep->c_lp;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* db_delete --
|
||||
* Delete a line from the file.
|
||||
*
|
||||
* PUBLIC: int db_delete __P((SCR *, recno_t));
|
||||
*/
|
||||
int
|
||||
db_delete(sp, lno)
|
||||
SCR *sp;
|
||||
recno_t lno;
|
||||
{
|
||||
DBT key;
|
||||
EXF *ep;
|
||||
|
||||
#if defined(DEBUG) && 0
|
||||
TRACE(sp, "delete line %lu\n", (u_long)lno);
|
||||
#endif
|
||||
/* Check for no underlying file. */
|
||||
if ((ep = sp->ep) == NULL) {
|
||||
ex_emsg(sp, NULL, EXM_NOFILEYET);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* Update marks, @ and global commands. */
|
||||
if (mark_insdel(sp, LINE_DELETE, lno))
|
||||
return (1);
|
||||
if (ex_g_insdel(sp, LINE_DELETE, lno))
|
||||
return (1);
|
||||
|
||||
/* Log change. */
|
||||
log_line(sp, lno, LOG_LINE_DELETE);
|
||||
|
||||
/* Update file. */
|
||||
key.data = &lno;
|
||||
key.size = sizeof(lno);
|
||||
SIGBLOCK;
|
||||
if (ep->db->del(ep->db, &key, 0) == 1) {
|
||||
msgq(sp, M_SYSERR,
|
||||
"003|unable to delete line %lu", (u_long)lno);
|
||||
return (1);
|
||||
}
|
||||
SIGUNBLOCK;
|
||||
|
||||
/* Flush the cache, update line count, before screen update. */
|
||||
if (lno <= ep->c_lno)
|
||||
ep->c_lno = OOBLNO;
|
||||
if (ep->c_nlines != OOBLNO)
|
||||
--ep->c_nlines;
|
||||
|
||||
/* File now modified. */
|
||||
if (F_ISSET(ep, F_FIRSTMODIFY))
|
||||
(void)rcv_init(sp);
|
||||
F_SET(ep, F_MODIFIED);
|
||||
|
||||
/* Update screen. */
|
||||
return (scr_update(sp, lno, LINE_DELETE, 1));
|
||||
}
|
||||
|
||||
/*
|
||||
* db_append --
|
||||
* Append a line into the file.
|
||||
*
|
||||
* PUBLIC: int db_append __P((SCR *, int, recno_t, char *, size_t));
|
||||
*/
|
||||
int
|
||||
db_append(sp, update, lno, p, len)
|
||||
SCR *sp;
|
||||
int update;
|
||||
recno_t lno;
|
||||
char *p;
|
||||
size_t len;
|
||||
{
|
||||
DBT data, key;
|
||||
EXF *ep;
|
||||
int rval;
|
||||
|
||||
#if defined(DEBUG) && 0
|
||||
TRACE(sp, "append to %lu: len %u {%.*s}\n", lno, len, MIN(len, 20), p);
|
||||
#endif
|
||||
/* Check for no underlying file. */
|
||||
if ((ep = sp->ep) == NULL) {
|
||||
ex_emsg(sp, NULL, EXM_NOFILEYET);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* Update file. */
|
||||
key.data = &lno;
|
||||
key.size = sizeof(lno);
|
||||
data.data = p;
|
||||
data.size = len;
|
||||
SIGBLOCK;
|
||||
if (ep->db->put(ep->db, &key, &data, R_IAFTER) == -1) {
|
||||
msgq(sp, M_SYSERR,
|
||||
"004|unable to append to line %lu", (u_long)lno);
|
||||
return (1);
|
||||
}
|
||||
SIGUNBLOCK;
|
||||
|
||||
/* Flush the cache, update line count, before screen update. */
|
||||
if (lno < ep->c_lno)
|
||||
ep->c_lno = OOBLNO;
|
||||
if (ep->c_nlines != OOBLNO)
|
||||
++ep->c_nlines;
|
||||
|
||||
/* File now dirty. */
|
||||
if (F_ISSET(ep, F_FIRSTMODIFY))
|
||||
(void)rcv_init(sp);
|
||||
F_SET(ep, F_MODIFIED);
|
||||
|
||||
/* Log change. */
|
||||
log_line(sp, lno + 1, LOG_LINE_APPEND);
|
||||
|
||||
/* Update marks, @ and global commands. */
|
||||
rval = 0;
|
||||
if (mark_insdel(sp, LINE_INSERT, lno + 1))
|
||||
rval = 1;
|
||||
if (ex_g_insdel(sp, LINE_INSERT, lno + 1))
|
||||
rval = 1;
|
||||
|
||||
/*
|
||||
* Update screen.
|
||||
*
|
||||
* XXX
|
||||
* Nasty hack. If multiple lines are input by the user, they aren't
|
||||
* committed until an <ESC> is entered. The problem is the screen was
|
||||
* updated/scrolled as each line was entered. So, when this routine
|
||||
* is called to copy the new lines from the cut buffer into the file,
|
||||
* it has to know not to update the screen again.
|
||||
*/
|
||||
return (scr_update(sp, lno, LINE_APPEND, update) || rval);
|
||||
}
|
||||
|
||||
/*
|
||||
* db_insert --
|
||||
* Insert a line into the file.
|
||||
*
|
||||
* PUBLIC: int db_insert __P((SCR *, recno_t, char *, size_t));
|
||||
*/
|
||||
int
|
||||
db_insert(sp, lno, p, len)
|
||||
SCR *sp;
|
||||
recno_t lno;
|
||||
char *p;
|
||||
size_t len;
|
||||
{
|
||||
DBT data, key;
|
||||
EXF *ep;
|
||||
int rval;
|
||||
|
||||
#if defined(DEBUG) && 0
|
||||
TRACE(sp, "insert before %lu: len %lu {%.*s}\n",
|
||||
(u_long)lno, (u_long)len, MIN(len, 20), p);
|
||||
#endif
|
||||
/* Check for no underlying file. */
|
||||
if ((ep = sp->ep) == NULL) {
|
||||
ex_emsg(sp, NULL, EXM_NOFILEYET);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* Update file. */
|
||||
key.data = &lno;
|
||||
key.size = sizeof(lno);
|
||||
data.data = p;
|
||||
data.size = len;
|
||||
SIGBLOCK;
|
||||
if (ep->db->put(ep->db, &key, &data, R_IBEFORE) == -1) {
|
||||
msgq(sp, M_SYSERR,
|
||||
"005|unable to insert at line %lu", (u_long)lno);
|
||||
return (1);
|
||||
}
|
||||
SIGUNBLOCK;
|
||||
|
||||
/* Flush the cache, update line count, before screen update. */
|
||||
if (lno >= ep->c_lno)
|
||||
ep->c_lno = OOBLNO;
|
||||
if (ep->c_nlines != OOBLNO)
|
||||
++ep->c_nlines;
|
||||
|
||||
/* File now dirty. */
|
||||
if (F_ISSET(ep, F_FIRSTMODIFY))
|
||||
(void)rcv_init(sp);
|
||||
F_SET(ep, F_MODIFIED);
|
||||
|
||||
/* Log change. */
|
||||
log_line(sp, lno, LOG_LINE_INSERT);
|
||||
|
||||
/* Update marks, @ and global commands. */
|
||||
rval = 0;
|
||||
if (mark_insdel(sp, LINE_INSERT, lno))
|
||||
rval = 1;
|
||||
if (ex_g_insdel(sp, LINE_INSERT, lno))
|
||||
rval = 1;
|
||||
|
||||
/* Update screen. */
|
||||
return (scr_update(sp, lno, LINE_INSERT, 1) || rval);
|
||||
}
|
||||
|
||||
/*
|
||||
* db_set --
|
||||
* Store a line in the file.
|
||||
*
|
||||
* PUBLIC: int db_set __P((SCR *, recno_t, char *, size_t));
|
||||
*/
|
||||
int
|
||||
db_set(sp, lno, p, len)
|
||||
SCR *sp;
|
||||
recno_t lno;
|
||||
char *p;
|
||||
size_t len;
|
||||
{
|
||||
DBT data, key;
|
||||
EXF *ep;
|
||||
|
||||
#if defined(DEBUG) && 0
|
||||
TRACE(sp, "replace line %lu: len %lu {%.*s}\n",
|
||||
(u_long)lno, (u_long)len, MIN(len, 20), p);
|
||||
#endif
|
||||
|
||||
/* Check for no underlying file. */
|
||||
if ((ep = sp->ep) == NULL) {
|
||||
ex_emsg(sp, NULL, EXM_NOFILEYET);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* Log before change. */
|
||||
log_line(sp, lno, LOG_LINE_RESET_B);
|
||||
|
||||
/* Update file. */
|
||||
key.data = &lno;
|
||||
key.size = sizeof(lno);
|
||||
data.data = p;
|
||||
data.size = len;
|
||||
SIGBLOCK;
|
||||
if (ep->db->put(ep->db, &key, &data, 0) == -1) {
|
||||
msgq(sp, M_SYSERR,
|
||||
"006|unable to store line %lu", (u_long)lno);
|
||||
return (1);
|
||||
}
|
||||
SIGUNBLOCK;
|
||||
|
||||
/* Flush the cache, before logging or screen update. */
|
||||
if (lno == ep->c_lno)
|
||||
ep->c_lno = OOBLNO;
|
||||
|
||||
/* File now dirty. */
|
||||
if (F_ISSET(ep, F_FIRSTMODIFY))
|
||||
(void)rcv_init(sp);
|
||||
F_SET(ep, F_MODIFIED);
|
||||
|
||||
/* Log after change. */
|
||||
log_line(sp, lno, LOG_LINE_RESET_F);
|
||||
|
||||
/* Update screen. */
|
||||
return (scr_update(sp, lno, LINE_RESET, 1));
|
||||
}
|
||||
|
||||
/*
|
||||
* db_exist --
|
||||
* Return if a line exists.
|
||||
*
|
||||
* PUBLIC: int db_exist __P((SCR *, recno_t));
|
||||
*/
|
||||
int
|
||||
db_exist(sp, lno)
|
||||
SCR *sp;
|
||||
recno_t lno;
|
||||
{
|
||||
EXF *ep;
|
||||
|
||||
/* Check for no underlying file. */
|
||||
if ((ep = sp->ep) == NULL) {
|
||||
ex_emsg(sp, NULL, EXM_NOFILEYET);
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (lno == OOBLNO)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Check the last-line number cache. Adjust the cached line
|
||||
* number for the lines used by the text input buffers.
|
||||
*/
|
||||
if (ep->c_nlines != OOBLNO)
|
||||
return (lno <= (F_ISSET(sp, SC_TINPUT) ?
|
||||
ep->c_nlines + (((TEXT *)sp->tiq.cqh_last)->lno -
|
||||
((TEXT *)sp->tiq.cqh_first)->lno) : ep->c_nlines));
|
||||
|
||||
/* Go get the line. */
|
||||
return (!db_get(sp, lno, 0, NULL, NULL));
|
||||
}
|
||||
|
||||
/*
|
||||
* db_last --
|
||||
* Return the number of lines in the file.
|
||||
*
|
||||
* PUBLIC: int db_last __P((SCR *, recno_t *));
|
||||
*/
|
||||
int
|
||||
db_last(sp, lnop)
|
||||
SCR *sp;
|
||||
recno_t *lnop;
|
||||
{
|
||||
DBT data, key;
|
||||
EXF *ep;
|
||||
recno_t lno;
|
||||
|
||||
/* Check for no underlying file. */
|
||||
if ((ep = sp->ep) == NULL) {
|
||||
ex_emsg(sp, NULL, EXM_NOFILEYET);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the last-line number cache. Adjust the cached line
|
||||
* number for the lines used by the text input buffers.
|
||||
*/
|
||||
if (ep->c_nlines != OOBLNO) {
|
||||
*lnop = ep->c_nlines;
|
||||
if (F_ISSET(sp, SC_TINPUT))
|
||||
*lnop += ((TEXT *)sp->tiq.cqh_last)->lno -
|
||||
((TEXT *)sp->tiq.cqh_first)->lno;
|
||||
return (0);
|
||||
}
|
||||
|
||||
key.data = &lno;
|
||||
key.size = sizeof(lno);
|
||||
|
||||
switch (ep->db->seq(ep->db, &key, &data, R_LAST)) {
|
||||
case -1:
|
||||
msgq(sp, M_SYSERR, "007|unable to get last line");
|
||||
*lnop = 0;
|
||||
return (1);
|
||||
case 1:
|
||||
*lnop = 0;
|
||||
return (0);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Fill the cache. */
|
||||
memcpy(&lno, key.data, sizeof(lno));
|
||||
ep->c_nlines = ep->c_lno = lno;
|
||||
ep->c_len = data.size;
|
||||
ep->c_lp = data.data;
|
||||
|
||||
/* Return the value. */
|
||||
*lnop = (F_ISSET(sp, SC_TINPUT) &&
|
||||
((TEXT *)sp->tiq.cqh_last)->lno > lno ?
|
||||
((TEXT *)sp->tiq.cqh_last)->lno : lno);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* db_err --
|
||||
* Report a line error.
|
||||
*
|
||||
* PUBLIC: void db_err __P((SCR *, recno_t));
|
||||
*/
|
||||
void
|
||||
db_err(sp, lno)
|
||||
SCR *sp;
|
||||
recno_t lno;
|
||||
{
|
||||
msgq(sp, M_ERR,
|
||||
"008|Error: unable to retrieve line %lu", (u_long)lno);
|
||||
}
|
||||
|
||||
/*
|
||||
* scr_update --
|
||||
* Update all of the screens that are backed by the file that
|
||||
* just changed.
|
||||
*/
|
||||
static int
|
||||
scr_update(sp, lno, op, current)
|
||||
SCR *sp;
|
||||
recno_t lno;
|
||||
lnop_t op;
|
||||
int current;
|
||||
{
|
||||
EXF *ep;
|
||||
SCR *tsp;
|
||||
|
||||
if (F_ISSET(sp, SC_EX))
|
||||
return (0);
|
||||
|
||||
ep = sp->ep;
|
||||
if (ep->refcnt != 1)
|
||||
for (tsp = sp->gp->dq.cqh_first;
|
||||
tsp != (void *)&sp->gp->dq; tsp = tsp->q.cqe_next)
|
||||
if (sp != tsp && tsp->ep == ep)
|
||||
if (vs_change(tsp, lno, op))
|
||||
return (1);
|
||||
return (current ? vs_change(sp, lno, op) : 0);
|
||||
}
|
@ -1,60 +1,31 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1992, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)log.c 8.16 (Berkeley) 5/21/94";
|
||||
static const char sccsid[] = "@(#)log.c 10.8 (Berkeley) 3/6/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
|
||||
#include "vi.h"
|
||||
#include "common.h"
|
||||
|
||||
/*
|
||||
* The log consists of records, each containing a type byte and a variable
|
||||
@ -91,24 +62,23 @@ static char sccsid[] = "@(#)log.c 8.16 (Berkeley) 5/21/94";
|
||||
* behaved that way.
|
||||
*/
|
||||
|
||||
static int log_cursor1 __P((SCR *, EXF *, int));
|
||||
static int log_cursor1 __P((SCR *, int));
|
||||
static void log_err __P((SCR *, char *, int));
|
||||
#if defined(DEBUG) && 0
|
||||
static void log_trace __P((SCR *, char *, recno_t, u_char *));
|
||||
#endif
|
||||
|
||||
/* Try and restart the log on failure, i.e. if we run out of memory. */
|
||||
#define LOG_ERR { \
|
||||
msgq(sp, M_ERR, "Error: %s/%d: put log error: %s", \
|
||||
tail(__FILE__), __LINE__, strerror(errno)); \
|
||||
(void)ep->log->close(ep->log); \
|
||||
if (!log_init(sp, ep)) \
|
||||
msgq(sp, M_ERR, "Log restarted"); \
|
||||
log_err(sp, __FILE__, __LINE__); \
|
||||
return (1); \
|
||||
}
|
||||
|
||||
/*
|
||||
* log_init --
|
||||
* Initialize the logging subsystem.
|
||||
*
|
||||
* PUBLIC: int log_init __P((SCR *, EXF *));
|
||||
*/
|
||||
int
|
||||
log_init(sp, ep)
|
||||
@ -116,6 +86,9 @@ log_init(sp, ep)
|
||||
EXF *ep;
|
||||
{
|
||||
/*
|
||||
* !!!
|
||||
* ep MAY NOT BE THE SAME AS sp->ep, DON'T USE THE LATTER.
|
||||
*
|
||||
* Initialize the buffer. The logging subsystem has its own
|
||||
* buffers because the global ones are almost by definition
|
||||
* going to be in use when the log runs.
|
||||
@ -129,7 +102,7 @@ log_init(sp, ep)
|
||||
ep->log = dbopen(NULL, O_CREAT | O_NONBLOCK | O_RDWR,
|
||||
S_IRUSR | S_IWUSR, DB_RECNO, NULL);
|
||||
if (ep->log == NULL) {
|
||||
msgq(sp, M_ERR, "log db: %s", strerror(errno));
|
||||
msgq(sp, M_SYSERR, "009|Log file");
|
||||
F_SET(ep, F_NOLOG);
|
||||
return (1);
|
||||
}
|
||||
@ -140,12 +113,18 @@ log_init(sp, ep)
|
||||
/*
|
||||
* log_end --
|
||||
* Close the logging subsystem.
|
||||
*
|
||||
* PUBLIC: int log_end __P((SCR *, EXF *));
|
||||
*/
|
||||
int
|
||||
log_end(sp, ep)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
{
|
||||
/*
|
||||
* !!!
|
||||
* ep MAY NOT BE THE SAME AS sp->ep, DON'T USE THE LATTER.
|
||||
*/
|
||||
if (ep->log != NULL) {
|
||||
(void)(ep->log->close)(ep->log);
|
||||
ep->log = NULL;
|
||||
@ -164,12 +143,19 @@ log_end(sp, ep)
|
||||
/*
|
||||
* log_cursor --
|
||||
* Log the current cursor position, starting an event.
|
||||
*
|
||||
* PUBLIC: int log_cursor __P((SCR *));
|
||||
*/
|
||||
int
|
||||
log_cursor(sp, ep)
|
||||
log_cursor(sp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
{
|
||||
EXF *ep;
|
||||
|
||||
ep = sp->ep;
|
||||
if (F_ISSET(ep, F_NOLOG))
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* If any changes were made since the last cursor init,
|
||||
* put out the ending cursor record.
|
||||
@ -177,7 +163,7 @@ log_cursor(sp, ep)
|
||||
if (ep->l_cursor.lno == OOBLNO) {
|
||||
ep->l_cursor.lno = sp->lno;
|
||||
ep->l_cursor.cno = sp->cno;
|
||||
return (log_cursor1(sp, ep, LOG_CURSOR_END));
|
||||
return (log_cursor1(sp, LOG_CURSOR_END));
|
||||
}
|
||||
ep->l_cursor.lno = sp->lno;
|
||||
ep->l_cursor.cno = sp->cno;
|
||||
@ -189,13 +175,14 @@ log_cursor(sp, ep)
|
||||
* Actually push a cursor record out.
|
||||
*/
|
||||
static int
|
||||
log_cursor1(sp, ep, type)
|
||||
log_cursor1(sp, type)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
int type;
|
||||
{
|
||||
DBT data, key;
|
||||
EXF *ep;
|
||||
|
||||
ep = sp->ep;
|
||||
BINC_RET(sp, ep->l_lp, ep->l_len, sizeof(u_char) + sizeof(MARK));
|
||||
ep->l_lp[0] = type;
|
||||
memmove(ep->l_lp + sizeof(u_char), &ep->l_cursor, sizeof(MARK));
|
||||
@ -221,18 +208,21 @@ log_cursor1(sp, ep, type)
|
||||
/*
|
||||
* log_line --
|
||||
* Log a line change.
|
||||
*
|
||||
* PUBLIC: int log_line __P((SCR *, recno_t, u_int));
|
||||
*/
|
||||
int
|
||||
log_line(sp, ep, lno, action)
|
||||
log_line(sp, lno, action)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
recno_t lno;
|
||||
u_int action;
|
||||
{
|
||||
DBT data, key;
|
||||
EXF *ep;
|
||||
size_t len;
|
||||
char *lp;
|
||||
|
||||
ep = sp->ep;
|
||||
if (F_ISSET(ep, F_NOLOG))
|
||||
return (0);
|
||||
|
||||
@ -246,7 +236,7 @@ log_line(sp, ep, lno, action)
|
||||
|
||||
/* Put out one initial cursor record per set of changes. */
|
||||
if (ep->l_cursor.lno != OOBLNO) {
|
||||
if (log_cursor1(sp, ep, LOG_CURSOR_INIT))
|
||||
if (log_cursor1(sp, LOG_CURSOR_INIT))
|
||||
return (1);
|
||||
ep->l_cursor.lno = OOBLNO;
|
||||
}
|
||||
@ -258,19 +248,17 @@ log_line(sp, ep, lno, action)
|
||||
* so fake an empty length line.
|
||||
*/
|
||||
if (action == LOG_LINE_RESET_B) {
|
||||
if ((lp = file_rline(sp, ep, lno, &len)) == NULL) {
|
||||
if (db_get(sp, lno, DBG_NOCACHE, &lp, &len)) {
|
||||
if (lno != 1) {
|
||||
GETLINE_ERR(sp, lno);
|
||||
db_err(sp, lno);
|
||||
return (1);
|
||||
}
|
||||
len = 0;
|
||||
lp = "";
|
||||
}
|
||||
} else
|
||||
if ((lp = file_gline(sp, ep, lno, &len)) == NULL) {
|
||||
GETLINE_ERR(sp, lno);
|
||||
if (db_get(sp, lno, DBG_FATAL, &lp, &len))
|
||||
return (1);
|
||||
}
|
||||
BINC_RET(sp,
|
||||
ep->l_lp, ep->l_len, len + sizeof(u_char) + sizeof(recno_t));
|
||||
ep->l_lp[0] = action;
|
||||
@ -320,21 +308,24 @@ log_line(sp, ep, lno, action)
|
||||
* aren't any operations that just put out a log record -- this
|
||||
* would mean that undo operations would only reset marks, and not
|
||||
* cause any other change.
|
||||
*
|
||||
* PUBLIC: int log_mark __P((SCR *, LMARK *));
|
||||
*/
|
||||
int
|
||||
log_mark(sp, ep, lmp)
|
||||
log_mark(sp, lmp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
LMARK *lmp;
|
||||
{
|
||||
DBT data, key;
|
||||
EXF *ep;
|
||||
|
||||
ep = sp->ep;
|
||||
if (F_ISSET(ep, F_NOLOG))
|
||||
return (0);
|
||||
|
||||
/* Put out one initial cursor record per set of changes. */
|
||||
if (ep->l_cursor.lno != OOBLNO) {
|
||||
if (log_cursor1(sp, ep, LOG_CURSOR_INIT))
|
||||
if (log_cursor1(sp, LOG_CURSOR_INIT))
|
||||
return (1);
|
||||
ep->l_cursor.lno = OOBLNO;
|
||||
}
|
||||
@ -363,28 +354,31 @@ log_mark(sp, ep, lmp)
|
||||
/*
|
||||
* Log_backward --
|
||||
* Roll the log backward one operation.
|
||||
*
|
||||
* PUBLIC: int log_backward __P((SCR *, MARK *));
|
||||
*/
|
||||
int
|
||||
log_backward(sp, ep, rp)
|
||||
log_backward(sp, rp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
MARK *rp;
|
||||
{
|
||||
DBT key, data;
|
||||
EXF *ep;
|
||||
LMARK lm;
|
||||
MARK m;
|
||||
recno_t lno;
|
||||
int didop;
|
||||
u_char *p;
|
||||
|
||||
ep = sp->ep;
|
||||
if (F_ISSET(ep, F_NOLOG)) {
|
||||
msgq(sp, M_ERR,
|
||||
"Logging not being performed, undo not possible");
|
||||
"010|Logging not being performed, undo not possible");
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (ep->l_cur == 1) {
|
||||
msgq(sp, M_BERR, "No changes to undo");
|
||||
msgq(sp, M_BERR, "011|No changes to undo");
|
||||
return (1);
|
||||
}
|
||||
|
||||
@ -413,14 +407,14 @@ log_backward(sp, ep, rp)
|
||||
case LOG_LINE_INSERT:
|
||||
didop = 1;
|
||||
memmove(&lno, p + sizeof(u_char), sizeof(recno_t));
|
||||
if (file_dline(sp, ep, lno))
|
||||
if (db_delete(sp, lno))
|
||||
goto err;
|
||||
++sp->rptlines[L_DELETED];
|
||||
break;
|
||||
case LOG_LINE_DELETE:
|
||||
didop = 1;
|
||||
memmove(&lno, p + sizeof(u_char), sizeof(recno_t));
|
||||
if (file_iline(sp, ep, lno, p + sizeof(u_char) +
|
||||
if (db_insert(sp, lno, p + sizeof(u_char) +
|
||||
sizeof(recno_t), data.size - sizeof(u_char) -
|
||||
sizeof(recno_t)))
|
||||
goto err;
|
||||
@ -431,7 +425,7 @@ log_backward(sp, ep, rp)
|
||||
case LOG_LINE_RESET_B:
|
||||
didop = 1;
|
||||
memmove(&lno, p + sizeof(u_char), sizeof(recno_t));
|
||||
if (file_sline(sp, ep, lno, p + sizeof(u_char) +
|
||||
if (db_set(sp, lno, p + sizeof(u_char) +
|
||||
sizeof(recno_t), data.size - sizeof(u_char) -
|
||||
sizeof(recno_t)))
|
||||
goto err;
|
||||
@ -445,7 +439,7 @@ log_backward(sp, ep, rp)
|
||||
memmove(&lm, p + sizeof(u_char), sizeof(LMARK));
|
||||
m.lno = lm.lno;
|
||||
m.cno = lm.cno;
|
||||
if (mark_set(sp, ep, lm.name, &m, 0))
|
||||
if (mark_set(sp, lm.name, &m, 0))
|
||||
goto err;
|
||||
break;
|
||||
default:
|
||||
@ -466,21 +460,24 @@ err: F_CLR(ep, F_NOLOG);
|
||||
* unless a change was made. If you do a change, move off the line,
|
||||
* then move back on and do a 'U', the line will be restored to the way
|
||||
* it was before the original change.
|
||||
*
|
||||
* PUBLIC: int log_setline __P((SCR *));
|
||||
*/
|
||||
int
|
||||
log_setline(sp, ep)
|
||||
log_setline(sp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
{
|
||||
DBT key, data;
|
||||
EXF *ep;
|
||||
LMARK lm;
|
||||
MARK m;
|
||||
recno_t lno;
|
||||
u_char *p;
|
||||
|
||||
ep = sp->ep;
|
||||
if (F_ISSET(ep, F_NOLOG)) {
|
||||
msgq(sp, M_ERR,
|
||||
"Logging not being performed, undo not possible");
|
||||
"012|Logging not being performed, undo not possible");
|
||||
return (1);
|
||||
}
|
||||
|
||||
@ -523,7 +520,7 @@ log_setline(sp, ep)
|
||||
case LOG_LINE_RESET_B:
|
||||
memmove(&lno, p + sizeof(u_char), sizeof(recno_t));
|
||||
if (lno == sp->lno &&
|
||||
file_sline(sp, ep, lno, p + sizeof(u_char) +
|
||||
db_set(sp, lno, p + sizeof(u_char) +
|
||||
sizeof(recno_t), data.size - sizeof(u_char) -
|
||||
sizeof(recno_t)))
|
||||
goto err;
|
||||
@ -535,7 +532,7 @@ log_setline(sp, ep)
|
||||
memmove(&lm, p + sizeof(u_char), sizeof(LMARK));
|
||||
m.lno = lm.lno;
|
||||
m.cno = lm.cno;
|
||||
if (mark_set(sp, ep, lm.name, &m, 0))
|
||||
if (mark_set(sp, lm.name, &m, 0))
|
||||
goto err;
|
||||
break;
|
||||
default:
|
||||
@ -550,28 +547,31 @@ err: F_CLR(ep, F_NOLOG);
|
||||
/*
|
||||
* Log_forward --
|
||||
* Roll the log forward one operation.
|
||||
*
|
||||
* PUBLIC: int log_forward __P((SCR *, MARK *));
|
||||
*/
|
||||
int
|
||||
log_forward(sp, ep, rp)
|
||||
log_forward(sp, rp)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
MARK *rp;
|
||||
{
|
||||
DBT key, data;
|
||||
EXF *ep;
|
||||
LMARK lm;
|
||||
MARK m;
|
||||
recno_t lno;
|
||||
int didop;
|
||||
u_char *p;
|
||||
|
||||
ep = sp->ep;
|
||||
if (F_ISSET(ep, F_NOLOG)) {
|
||||
msgq(sp, M_ERR,
|
||||
"Logging not being performed, roll-forward not possible");
|
||||
"013|Logging not being performed, roll-forward not possible");
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (ep->l_cur == ep->l_high) {
|
||||
msgq(sp, M_BERR, "No changes to re-do");
|
||||
msgq(sp, M_BERR, "014|No changes to re-do");
|
||||
return (1);
|
||||
}
|
||||
|
||||
@ -601,7 +601,7 @@ log_forward(sp, ep, rp)
|
||||
case LOG_LINE_INSERT:
|
||||
didop = 1;
|
||||
memmove(&lno, p + sizeof(u_char), sizeof(recno_t));
|
||||
if (file_iline(sp, ep, lno, p + sizeof(u_char) +
|
||||
if (db_insert(sp, lno, p + sizeof(u_char) +
|
||||
sizeof(recno_t), data.size - sizeof(u_char) -
|
||||
sizeof(recno_t)))
|
||||
goto err;
|
||||
@ -610,7 +610,7 @@ log_forward(sp, ep, rp)
|
||||
case LOG_LINE_DELETE:
|
||||
didop = 1;
|
||||
memmove(&lno, p + sizeof(u_char), sizeof(recno_t));
|
||||
if (file_dline(sp, ep, lno))
|
||||
if (db_delete(sp, lno))
|
||||
goto err;
|
||||
++sp->rptlines[L_DELETED];
|
||||
break;
|
||||
@ -619,7 +619,7 @@ log_forward(sp, ep, rp)
|
||||
case LOG_LINE_RESET_F:
|
||||
didop = 1;
|
||||
memmove(&lno, p + sizeof(u_char), sizeof(recno_t));
|
||||
if (file_sline(sp, ep, lno, p + sizeof(u_char) +
|
||||
if (db_set(sp, lno, p + sizeof(u_char) +
|
||||
sizeof(recno_t), data.size - sizeof(u_char) -
|
||||
sizeof(recno_t)))
|
||||
goto err;
|
||||
@ -633,7 +633,7 @@ log_forward(sp, ep, rp)
|
||||
memmove(&lm, p + sizeof(u_char), sizeof(LMARK));
|
||||
m.lno = lm.lno;
|
||||
m.cno = lm.cno;
|
||||
if (mark_set(sp, ep, lm.name, &m, 0))
|
||||
if (mark_set(sp, lm.name, &m, 0))
|
||||
goto err;
|
||||
break;
|
||||
default:
|
||||
@ -645,6 +645,25 @@ err: F_CLR(ep, F_NOLOG);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* log_err --
|
||||
* Try and restart the log on failure, i.e. if we run out of memory.
|
||||
*/
|
||||
static void
|
||||
log_err(sp, file, line)
|
||||
SCR *sp;
|
||||
char *file;
|
||||
int line;
|
||||
{
|
||||
EXF *ep;
|
||||
|
||||
msgq(sp, M_SYSERR, "015|%s/%d: log put error", tail(file), line);
|
||||
ep = sp->ep;
|
||||
(void)ep->log->close(ep->log);
|
||||
if (!log_init(sp, ep))
|
||||
msgq(sp, M_ERR, "267|Log restarted");
|
||||
}
|
||||
|
||||
#if defined(DEBUG) && 0
|
||||
static void
|
||||
log_trace(sp, msg, rno, p)
|
20
contrib/nvi/common/log.h
Normal file
20
contrib/nvi/common/log.h
Normal file
@ -0,0 +1,20 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1992, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*
|
||||
* @(#)log.h 10.2 (Berkeley) 3/6/96
|
||||
*/
|
||||
|
||||
#define LOG_NOTYPE 0
|
||||
#define LOG_CURSOR_INIT 1
|
||||
#define LOG_CURSOR_END 2
|
||||
#define LOG_LINE_APPEND 3
|
||||
#define LOG_LINE_DELETE 4
|
||||
#define LOG_LINE_INSERT 5
|
||||
#define LOG_LINE_RESET_F 6
|
||||
#define LOG_LINE_RESET_B 7
|
||||
#define LOG_MARK 8
|
617
contrib/nvi/common/main.c
Normal file
617
contrib/nvi/common/main.c
Normal file
@ -0,0 +1,617 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1992, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char copyright[] =
|
||||
"@(#) Copyright (c) 1992, 1993, 1994\n\
|
||||
The Regents of the University of California. All rights reserved.\n\
|
||||
@(#) Copyright (c) 1992, 1993, 1994, 1995, 1996\n\
|
||||
Keith Bostic. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)main.c 10.48 (Berkeley) 10/11/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "../vi/vi.h"
|
||||
#include "pathnames.h"
|
||||
|
||||
static void attach __P((GS *));
|
||||
static void v_estr __P((char *, int, char *));
|
||||
static int v_obsolete __P((char *, char *[]));
|
||||
|
||||
/*
|
||||
* editor --
|
||||
* Main editor routine.
|
||||
*
|
||||
* PUBLIC: int editor __P((GS *, int, char *[]));
|
||||
*/
|
||||
int
|
||||
editor(gp, argc, argv)
|
||||
GS *gp;
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
extern int optind;
|
||||
extern char *optarg;
|
||||
const char *p;
|
||||
EVENT ev;
|
||||
FREF *frp;
|
||||
SCR *sp;
|
||||
size_t len;
|
||||
u_int flags;
|
||||
int ch, flagchk, lflag, secure, startup, readonly, rval, silent;
|
||||
char *tag_f, *wsizearg, path[256];
|
||||
|
||||
/* Initialize the busy routine, if not defined by the screen. */
|
||||
if (gp->scr_busy == NULL)
|
||||
gp->scr_busy = vs_busy;
|
||||
/* Initialize the message routine, if not defined by the screen. */
|
||||
if (gp->scr_msg == NULL)
|
||||
gp->scr_msg = vs_msg;
|
||||
|
||||
/* Common global structure initialization. */
|
||||
CIRCLEQ_INIT(&gp->dq);
|
||||
CIRCLEQ_INIT(&gp->hq);
|
||||
LIST_INIT(&gp->ecq);
|
||||
LIST_INSERT_HEAD(&gp->ecq, &gp->excmd, q);
|
||||
gp->noprint = DEFAULT_NOPRINT;
|
||||
|
||||
/* Structures shared by screens so stored in the GS structure. */
|
||||
CIRCLEQ_INIT(&gp->frefq);
|
||||
CIRCLEQ_INIT(&gp->dcb_store.textq);
|
||||
LIST_INIT(&gp->cutq);
|
||||
LIST_INIT(&gp->seqq);
|
||||
|
||||
/* Set initial screen type and mode based on the program name. */
|
||||
readonly = 0;
|
||||
if (!strcmp(gp->progname, "ex") || !strcmp(gp->progname, "nex"))
|
||||
LF_INIT(SC_EX);
|
||||
else {
|
||||
/* Nview, view are readonly. */
|
||||
if (!strcmp(gp->progname, "nview") ||
|
||||
!strcmp(gp->progname, "view"))
|
||||
readonly = 1;
|
||||
|
||||
/* Vi is the default. */
|
||||
LF_INIT(SC_VI);
|
||||
}
|
||||
|
||||
/* Convert old-style arguments into new-style ones. */
|
||||
if (v_obsolete(gp->progname, argv))
|
||||
return (1);
|
||||
|
||||
/* Parse the arguments. */
|
||||
flagchk = '\0';
|
||||
tag_f = wsizearg = NULL;
|
||||
lflag = secure = silent = 0;
|
||||
startup = 1;
|
||||
|
||||
/* Set the file snapshot flag. */
|
||||
F_SET(gp, G_SNAPSHOT);
|
||||
|
||||
#ifdef DEBUG
|
||||
while ((ch = getopt(argc, argv, "c:D:eFlRrSsT:t:vw:")) != EOF)
|
||||
#else
|
||||
while ((ch = getopt(argc, argv, "c:eFlRrSst:vw:")) != EOF)
|
||||
#endif
|
||||
switch (ch) {
|
||||
case 'c': /* Run the command. */
|
||||
/*
|
||||
* XXX
|
||||
* We should support multiple -c options.
|
||||
*/
|
||||
if (gp->c_option != NULL) {
|
||||
v_estr(gp->progname, 0,
|
||||
"only one -c command may be specified.");
|
||||
return (1);
|
||||
}
|
||||
gp->c_option = optarg;
|
||||
break;
|
||||
#ifdef DEBUG
|
||||
case 'D':
|
||||
switch (optarg[0]) {
|
||||
case 's':
|
||||
startup = 0;
|
||||
break;
|
||||
case 'w':
|
||||
attach(gp);
|
||||
break;
|
||||
default:
|
||||
v_estr(gp->progname, 0,
|
||||
"usage: -D requires s or w argument.");
|
||||
return (1);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case 'e': /* Ex mode. */
|
||||
LF_CLR(SC_VI);
|
||||
LF_SET(SC_EX);
|
||||
break;
|
||||
case 'F': /* No snapshot. */
|
||||
F_CLR(gp, G_SNAPSHOT);
|
||||
break;
|
||||
case 'l': /* Set lisp, showmatch options. */
|
||||
lflag = 1;
|
||||
break;
|
||||
case 'R': /* Readonly. */
|
||||
readonly = 1;
|
||||
break;
|
||||
case 'r': /* Recover. */
|
||||
if (flagchk == 't') {
|
||||
v_estr(gp->progname, 0,
|
||||
"only one of -r and -t may be specified.");
|
||||
return (1);
|
||||
}
|
||||
flagchk = 'r';
|
||||
break;
|
||||
case 'S':
|
||||
secure = 1;
|
||||
break;
|
||||
case 's':
|
||||
silent = 1;
|
||||
break;
|
||||
#ifdef DEBUG
|
||||
case 'T': /* Trace. */
|
||||
if ((gp->tracefp = fopen(optarg, "w")) == NULL) {
|
||||
v_estr(gp->progname, errno, optarg);
|
||||
goto err;
|
||||
}
|
||||
(void)fprintf(gp->tracefp,
|
||||
"\n===\ntrace: open %s\n", optarg);
|
||||
break;
|
||||
#endif
|
||||
case 't': /* Tag. */
|
||||
if (flagchk == 'r') {
|
||||
v_estr(gp->progname, 0,
|
||||
"only one of -r and -t may be specified.");
|
||||
return (1);
|
||||
}
|
||||
if (flagchk == 't') {
|
||||
v_estr(gp->progname, 0,
|
||||
"only one tag file may be specified.");
|
||||
return (1);
|
||||
}
|
||||
flagchk = 't';
|
||||
tag_f = optarg;
|
||||
break;
|
||||
case 'v': /* Vi mode. */
|
||||
LF_CLR(SC_EX);
|
||||
LF_SET(SC_VI);
|
||||
break;
|
||||
case 'w':
|
||||
wsizearg = optarg;
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
(void)gp->scr_usage();
|
||||
return (1);
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
/*
|
||||
* -s option is only meaningful to ex.
|
||||
*
|
||||
* If not reading from a terminal, it's like -s was specified.
|
||||
*/
|
||||
if (silent && !LF_ISSET(SC_EX)) {
|
||||
v_estr(gp->progname, 0, "-s option is only applicable to ex.");
|
||||
goto err;
|
||||
}
|
||||
if (LF_ISSET(SC_EX) && F_ISSET(gp, G_SCRIPTED))
|
||||
silent = 1;
|
||||
|
||||
/*
|
||||
* Build and initialize the first/current screen. This is a bit
|
||||
* tricky. If an error is returned, we may or may not have a
|
||||
* screen structure. If we have a screen structure, put it on a
|
||||
* display queue so that the error messages get displayed.
|
||||
*
|
||||
* !!!
|
||||
* Everything we do until we go interactive is done in ex mode.
|
||||
*/
|
||||
if (screen_init(gp, NULL, &sp)) {
|
||||
if (sp != NULL)
|
||||
CIRCLEQ_INSERT_HEAD(&gp->dq, sp, q);
|
||||
goto err;
|
||||
}
|
||||
F_SET(sp, SC_EX);
|
||||
CIRCLEQ_INSERT_HEAD(&gp->dq, sp, q);
|
||||
|
||||
if (v_key_init(sp)) /* Special key initialization. */
|
||||
goto err;
|
||||
|
||||
{ int oargs[5], *oargp = oargs;
|
||||
if (lflag) { /* Command-line options. */
|
||||
*oargp++ = O_LISP;
|
||||
*oargp++ = O_SHOWMATCH;
|
||||
}
|
||||
if (readonly)
|
||||
*oargp++ = O_READONLY;
|
||||
if (secure)
|
||||
*oargp++ = O_SECURE;
|
||||
*oargp = -1; /* Options initialization. */
|
||||
if (opts_init(sp, oargs))
|
||||
goto err;
|
||||
}
|
||||
if (wsizearg != NULL) {
|
||||
ARGS *av[2], a, b;
|
||||
(void)snprintf(path, sizeof(path), "window=%s", wsizearg);
|
||||
a.bp = (CHAR_T *)path;
|
||||
a.len = strlen(path);
|
||||
b.bp = NULL;
|
||||
b.len = 0;
|
||||
av[0] = &a;
|
||||
av[1] = &b;
|
||||
(void)opts_set(sp, av, NULL);
|
||||
}
|
||||
if (silent) { /* Ex batch mode option values. */
|
||||
O_CLR(sp, O_AUTOPRINT);
|
||||
O_CLR(sp, O_PROMPT);
|
||||
O_CLR(sp, O_VERBOSE);
|
||||
O_CLR(sp, O_WARN);
|
||||
F_SET(sp, SC_EX_SILENT);
|
||||
}
|
||||
|
||||
sp->rows = O_VAL(sp, O_LINES); /* Make ex formatting work. */
|
||||
sp->cols = O_VAL(sp, O_COLUMNS);
|
||||
|
||||
if (!silent && startup) { /* Read EXINIT, exrc files. */
|
||||
if (ex_exrc(sp))
|
||||
goto err;
|
||||
if (F_ISSET(sp, SC_EXIT | SC_EXIT_FORCE)) {
|
||||
if (screen_end(sp))
|
||||
goto err;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* List recovery files if -r specified without file arguments.
|
||||
* Note, options must be initialized and startup information
|
||||
* read before doing this.
|
||||
*/
|
||||
if (flagchk == 'r' && argv[0] == NULL) {
|
||||
if (rcv_list(sp))
|
||||
goto err;
|
||||
if (screen_end(sp))
|
||||
goto err;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* Initialize the default ^D, ^U scrolling value here, after the
|
||||
* user has had every opportunity to set the window option.
|
||||
*
|
||||
* It's historic practice that changing the value of the window
|
||||
* option did not alter the default scrolling value, only giving
|
||||
* a count to ^D/^U did that.
|
||||
*/
|
||||
sp->defscroll = (O_VAL(sp, O_WINDOW) + 1) / 2;
|
||||
|
||||
/*
|
||||
* If we don't have a command-line option, switch into the right
|
||||
* editor now, so that we position default files correctly, and
|
||||
* so that any tags file file-already-locked messages are in the
|
||||
* vi screen, not the ex screen.
|
||||
*
|
||||
* XXX
|
||||
* If we have a command-line option, the error message can end
|
||||
* up in the wrong place, but I think that the combination is
|
||||
* unlikely.
|
||||
*/
|
||||
if (gp->c_option == NULL) {
|
||||
F_CLR(sp, SC_EX | SC_VI);
|
||||
F_SET(sp, LF_ISSET(SC_EX | SC_VI));
|
||||
}
|
||||
|
||||
/* Open a tag file if specified. */
|
||||
if (tag_f != NULL && ex_tag_first(sp, tag_f))
|
||||
goto err;
|
||||
|
||||
/*
|
||||
* Append any remaining arguments as file names. Files are recovery
|
||||
* files if -r specified. If the tag option or ex startup commands
|
||||
* loaded a file, then any file arguments are going to come after it.
|
||||
*/
|
||||
if (*argv != NULL) {
|
||||
if (sp->frp != NULL) {
|
||||
/* Cheat -- we know we have an extra argv slot. */
|
||||
MALLOC_NOMSG(sp,
|
||||
*--argv, char *, strlen(sp->frp->name) + 1);
|
||||
if (*argv == NULL) {
|
||||
v_estr(gp->progname, errno, NULL);
|
||||
goto err;
|
||||
}
|
||||
(void)strcpy(*argv, sp->frp->name);
|
||||
}
|
||||
sp->argv = sp->cargv = argv;
|
||||
F_SET(sp, SC_ARGNOFREE);
|
||||
if (flagchk == 'r')
|
||||
F_SET(sp, SC_ARGRECOVER);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the ex startup commands and or/the tag option haven't already
|
||||
* created a file, create one. If no command-line files were given,
|
||||
* use a temporary file.
|
||||
*/
|
||||
if (sp->frp == NULL) {
|
||||
if (sp->argv == NULL) {
|
||||
if ((frp = file_add(sp, NULL)) == NULL)
|
||||
goto err;
|
||||
} else {
|
||||
if ((frp = file_add(sp, (CHAR_T *)sp->argv[0])) == NULL)
|
||||
goto err;
|
||||
if (F_ISSET(sp, SC_ARGRECOVER))
|
||||
F_SET(frp, FR_RECOVER);
|
||||
}
|
||||
|
||||
if (file_init(sp, frp, NULL, 0))
|
||||
goto err;
|
||||
if (EXCMD_RUNNING(gp)) {
|
||||
(void)ex_cmd(sp);
|
||||
if (F_ISSET(sp, SC_EXIT | SC_EXIT_FORCE)) {
|
||||
if (screen_end(sp))
|
||||
goto err;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Check to see if we need to wait for ex. If SC_SCR_EX is set, ex
|
||||
* was forced to initialize the screen during startup. We'd like to
|
||||
* wait for a single character from the user, but we can't because
|
||||
* we're not in raw mode. We can't switch to raw mode because the
|
||||
* vi initialization will switch to xterm's alternate screen, causing
|
||||
* us to lose the messages we're pausing to make sure the user read.
|
||||
* So, wait for a complete line.
|
||||
*/
|
||||
if (F_ISSET(sp, SC_SCR_EX)) {
|
||||
p = msg_cmsg(sp, CMSG_CONT_R, &len);
|
||||
(void)write(STDOUT_FILENO, p, len);
|
||||
for (;;) {
|
||||
if (v_event_get(sp, &ev, 0, 0))
|
||||
goto err;
|
||||
if (ev.e_event == E_INTERRUPT ||
|
||||
ev.e_event == E_CHARACTER &&
|
||||
(ev.e_value == K_CR || ev.e_value == K_NL))
|
||||
break;
|
||||
(void)gp->scr_bell(sp);
|
||||
}
|
||||
}
|
||||
|
||||
/* Switch into the right editor, regardless. */
|
||||
F_CLR(sp, SC_EX | SC_VI);
|
||||
F_SET(sp, LF_ISSET(SC_EX | SC_VI) | SC_STATUS_CNT);
|
||||
|
||||
/*
|
||||
* Main edit loop. Vi handles split screens itself, we only return
|
||||
* here when switching editor modes or restarting the screen.
|
||||
*/
|
||||
while (sp != NULL)
|
||||
if (F_ISSET(sp, SC_EX) ? ex(&sp) : vi(&sp))
|
||||
goto err;
|
||||
|
||||
done: rval = 0;
|
||||
if (0)
|
||||
err: rval = 1;
|
||||
|
||||
/* Clean out the global structure. */
|
||||
v_end(gp);
|
||||
|
||||
return (rval);
|
||||
}
|
||||
|
||||
/*
|
||||
* v_end --
|
||||
* End the program, discarding screens and most of the global area.
|
||||
*
|
||||
* PUBLIC: void v_end __P((GS *));
|
||||
*/
|
||||
void
|
||||
v_end(gp)
|
||||
GS *gp;
|
||||
{
|
||||
MSGS *mp;
|
||||
SCR *sp;
|
||||
|
||||
/* If there are any remaining screens, kill them off. */
|
||||
if (gp->ccl_sp != NULL) {
|
||||
(void)file_end(gp->ccl_sp, NULL, 1);
|
||||
(void)screen_end(gp->ccl_sp);
|
||||
}
|
||||
while ((sp = gp->dq.cqh_first) != (void *)&gp->dq)
|
||||
(void)screen_end(sp);
|
||||
while ((sp = gp->hq.cqh_first) != (void *)&gp->hq)
|
||||
(void)screen_end(sp);
|
||||
|
||||
#ifdef HAVE_PERL_INTERP
|
||||
perl_end(gp);
|
||||
#endif
|
||||
|
||||
#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY)
|
||||
{ FREF *frp;
|
||||
/* Free FREF's. */
|
||||
while ((frp = gp->frefq.cqh_first) != (FREF *)&gp->frefq) {
|
||||
CIRCLEQ_REMOVE(&gp->frefq, frp, q);
|
||||
if (frp->name != NULL)
|
||||
free(frp->name);
|
||||
if (frp->tname != NULL)
|
||||
free(frp->tname);
|
||||
free(frp);
|
||||
}
|
||||
}
|
||||
|
||||
/* Free key input queue. */
|
||||
if (gp->i_event != NULL)
|
||||
free(gp->i_event);
|
||||
|
||||
/* Free cut buffers. */
|
||||
cut_close(gp);
|
||||
|
||||
/* Free map sequences. */
|
||||
seq_close(gp);
|
||||
|
||||
/* Free default buffer storage. */
|
||||
(void)text_lfree(&gp->dcb_store.textq);
|
||||
|
||||
/* Close message catalogs. */
|
||||
msg_close(gp);
|
||||
#endif
|
||||
|
||||
/* Ring the bell if scheduled. */
|
||||
if (F_ISSET(gp, G_BELLSCHED))
|
||||
(void)fprintf(stderr, "\07"); /* \a */
|
||||
|
||||
/*
|
||||
* Flush any remaining messages. If a message is here, it's almost
|
||||
* certainly the message about the event that killed us (although
|
||||
* it's possible that the user is sourcing a file that exits from the
|
||||
* editor).
|
||||
*/
|
||||
while ((mp = gp->msgq.lh_first) != NULL) {
|
||||
(void)fprintf(stderr, "%s%.*s",
|
||||
mp->mtype == M_ERR ? "ex/vi: " : "", (int)mp->len, mp->buf);
|
||||
LIST_REMOVE(mp, q);
|
||||
#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY)
|
||||
free(mp->buf);
|
||||
free(mp);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY)
|
||||
/* Free any temporary space. */
|
||||
if (gp->tmp_bp != NULL)
|
||||
free(gp->tmp_bp);
|
||||
|
||||
#if defined(DEBUG)
|
||||
/* Close debugging file descriptor. */
|
||||
if (gp->tracefp != NULL)
|
||||
(void)fclose(gp->tracefp);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* v_obsolete --
|
||||
* Convert historic arguments into something getopt(3) will like.
|
||||
*/
|
||||
static int
|
||||
v_obsolete(name, argv)
|
||||
char *name, *argv[];
|
||||
{
|
||||
size_t len;
|
||||
char *p;
|
||||
|
||||
/*
|
||||
* Translate old style arguments into something getopt will like.
|
||||
* Make sure it's not text space memory, because ex modifies the
|
||||
* strings.
|
||||
* Change "+" into "-c$".
|
||||
* Change "+<anything else>" into "-c<anything else>".
|
||||
* Change "-" into "-s"
|
||||
* The c, T, t and w options take arguments so they can't be
|
||||
* special arguments.
|
||||
*
|
||||
* Stop if we find "--" as an argument, the user may want to edit
|
||||
* a file named "+foo".
|
||||
*/
|
||||
while (*++argv && strcmp(argv[0], "--"))
|
||||
if (argv[0][0] == '+') {
|
||||
if (argv[0][1] == '\0') {
|
||||
MALLOC_NOMSG(NULL, argv[0], char *, 4);
|
||||
if (argv[0] == NULL)
|
||||
goto nomem;
|
||||
(void)strcpy(argv[0], "-c$");
|
||||
} else {
|
||||
p = argv[0];
|
||||
len = strlen(argv[0]);
|
||||
MALLOC_NOMSG(NULL, argv[0], char *, len + 2);
|
||||
if (argv[0] == NULL)
|
||||
goto nomem;
|
||||
argv[0][0] = '-';
|
||||
argv[0][1] = 'c';
|
||||
(void)strcpy(argv[0] + 2, p + 1);
|
||||
}
|
||||
} else if (argv[0][0] == '-')
|
||||
if (argv[0][1] == '\0') {
|
||||
MALLOC_NOMSG(NULL, argv[0], char *, 3);
|
||||
if (argv[0] == NULL) {
|
||||
nomem: v_estr(name, errno, NULL);
|
||||
return (1);
|
||||
}
|
||||
(void)strcpy(argv[0], "-s");
|
||||
} else
|
||||
if ((argv[0][1] == 'c' || argv[0][1] == 'T' ||
|
||||
argv[0][1] == 't' || argv[0][1] == 'w') &&
|
||||
argv[0][2] == '\0')
|
||||
++argv;
|
||||
return (0);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
static void
|
||||
attach(gp)
|
||||
GS *gp;
|
||||
{
|
||||
int fd;
|
||||
char ch;
|
||||
|
||||
if ((fd = open(_PATH_TTY, O_RDONLY, 0)) < 0) {
|
||||
v_estr(gp->progname, errno, _PATH_TTY);
|
||||
return;
|
||||
}
|
||||
|
||||
(void)printf("process %lu waiting, enter <CR> to continue: ",
|
||||
(u_long)getpid());
|
||||
(void)fflush(stdout);
|
||||
|
||||
do {
|
||||
if (read(fd, &ch, 1) != 1) {
|
||||
(void)close(fd);
|
||||
return;
|
||||
}
|
||||
} while (ch != '\n' && ch != '\r');
|
||||
(void)close(fd);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
v_estr(name, eno, msg)
|
||||
char *name, *msg;
|
||||
int eno;
|
||||
{
|
||||
(void)fprintf(stderr, "%s", name);
|
||||
if (msg != NULL)
|
||||
(void)fprintf(stderr, ": %s", msg);
|
||||
if (eno)
|
||||
(void)fprintf(stderr, ": %s", strerror(errno));
|
||||
(void)fprintf(stderr, "\n");
|
||||
}
|
@ -1,60 +1,31 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1992, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)mark.c 8.19 (Berkeley) 5/21/94";
|
||||
static const char sccsid[] = "@(#)mark.c 10.13 (Berkeley) 7/19/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
|
||||
#include "compat.h"
|
||||
#include <db.h>
|
||||
#include <regex.h>
|
||||
#include "common.h"
|
||||
|
||||
#include "vi.h"
|
||||
|
||||
static LMARK *mark_find __P((SCR *, EXF *, ARG_CHAR_T));
|
||||
static LMARK *mark_find __P((SCR *, ARG_CHAR_T));
|
||||
|
||||
/*
|
||||
* Marks are maintained in a key sorted doubly linked list. We can't
|
||||
@ -70,7 +41,7 @@ static LMARK *mark_find __P((SCR *, EXF *, ARG_CHAR_T));
|
||||
* if we've given the line to v_ntext.c:v_ntext() for editing. Historic vi
|
||||
* would move to the first non-blank on the line when the mark location was
|
||||
* past the end of the line. This can be complicated by deleting to a mark
|
||||
* that has disappeared using the ` command. Historic vi vi treated this as
|
||||
* that has disappeared using the ` command. Historic vi treated this as
|
||||
* a line-mode motion and deleted the line. This implementation complains to
|
||||
* the user.
|
||||
*
|
||||
@ -90,30 +61,29 @@ static LMARK *mark_find __P((SCR *, EXF *, ARG_CHAR_T));
|
||||
/*
|
||||
* mark_init --
|
||||
* Set up the marks.
|
||||
*
|
||||
* PUBLIC: int mark_init __P((SCR *, EXF *));
|
||||
*/
|
||||
int
|
||||
mark_init(sp, ep)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
{
|
||||
LMARK *lmp;
|
||||
|
||||
/*
|
||||
* Make sure the marks have been set up. If they
|
||||
* haven't, do so, and create the absolute mark.
|
||||
* !!!
|
||||
* ep MAY NOT BE THE SAME AS sp->ep, DON'T USE THE LATTER.
|
||||
*
|
||||
* Set up the marks.
|
||||
*/
|
||||
MALLOC_RET(sp, lmp, LMARK *, sizeof(LMARK));
|
||||
lmp->lno = 1;
|
||||
lmp->cno = 0;
|
||||
lmp->name = ABSMARK1;
|
||||
lmp->flags = 0;
|
||||
LIST_INSERT_HEAD(&ep->marks, lmp, q);
|
||||
LIST_INIT(&ep->marks);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* mark_end --
|
||||
* Free up the marks.
|
||||
*
|
||||
* PUBLIC: int mark_end __P((SCR *, EXF *));
|
||||
*/
|
||||
int
|
||||
mark_end(sp, ep)
|
||||
@ -122,9 +92,13 @@ mark_end(sp, ep)
|
||||
{
|
||||
LMARK *lmp;
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* ep MAY NOT BE THE SAME AS sp->ep, DON'T USE THE LATTER.
|
||||
*/
|
||||
while ((lmp = ep->marks.lh_first) != NULL) {
|
||||
LIST_REMOVE(lmp, q);
|
||||
FREE(lmp, sizeof(LMARK));
|
||||
free(lmp);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
@ -132,33 +106,40 @@ mark_end(sp, ep)
|
||||
/*
|
||||
* mark_get --
|
||||
* Get the location referenced by a mark.
|
||||
*
|
||||
* PUBLIC: int mark_get __P((SCR *, ARG_CHAR_T, MARK *, mtype_t));
|
||||
*/
|
||||
int
|
||||
mark_get(sp, ep, key, mp)
|
||||
mark_get(sp, key, mp, mtype)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
ARG_CHAR_T key;
|
||||
MARK *mp;
|
||||
mtype_t mtype;
|
||||
{
|
||||
LMARK *lmp;
|
||||
size_t len;
|
||||
|
||||
if (key == ABSMARK2)
|
||||
key = ABSMARK1;
|
||||
|
||||
lmp = mark_find(sp, ep, key);
|
||||
lmp = mark_find(sp, key);
|
||||
if (lmp == NULL || lmp->name != key) {
|
||||
msgq(sp, M_BERR, "Mark %s: not set", KEY_NAME(sp, key));
|
||||
msgq(sp, mtype, "017|Mark %s: not set", KEY_NAME(sp, key));
|
||||
return (1);
|
||||
}
|
||||
if (F_ISSET(lmp, MARK_DELETED)) {
|
||||
msgq(sp, M_BERR,
|
||||
"Mark %s: the line was deleted", KEY_NAME(sp, key));
|
||||
msgq(sp, mtype,
|
||||
"018|Mark %s: the line was deleted", KEY_NAME(sp, key));
|
||||
return (1);
|
||||
}
|
||||
if (file_gline(sp, ep, lmp->lno, &len) == NULL ||
|
||||
lmp->cno > len || lmp->cno == len && len != 0) {
|
||||
msgq(sp, M_BERR, "Mark %s: cursor position no longer exists",
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* The absolute mark is initialized to lno 1/cno 0, and historically
|
||||
* you could use it in an empty file. Make such a mark always work.
|
||||
*/
|
||||
if ((lmp->lno != 1 || lmp->cno != 0) && !db_exist(sp, lmp->lno)) {
|
||||
msgq(sp, mtype,
|
||||
"019|Mark %s: cursor position no longer exists",
|
||||
KEY_NAME(sp, key));
|
||||
return (1);
|
||||
}
|
||||
@ -170,11 +151,12 @@ mark_get(sp, ep, key, mp)
|
||||
/*
|
||||
* mark_set --
|
||||
* Set the location referenced by a mark.
|
||||
*
|
||||
* PUBLIC: int mark_set __P((SCR *, ARG_CHAR_T, MARK *, int));
|
||||
*/
|
||||
int
|
||||
mark_set(sp, ep, key, value, userset)
|
||||
mark_set(sp, key, value, userset)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
ARG_CHAR_T key;
|
||||
MARK *value;
|
||||
int userset;
|
||||
@ -190,11 +172,11 @@ mark_set(sp, ep, key, value, userset)
|
||||
* an undo, and we set it if it's not already set or if it was set
|
||||
* by a previous undo.
|
||||
*/
|
||||
lmp = mark_find(sp, ep, key);
|
||||
lmp = mark_find(sp, key);
|
||||
if (lmp == NULL || lmp->name != key) {
|
||||
MALLOC_RET(sp, lmt, LMARK *, sizeof(LMARK));
|
||||
if (lmp == NULL) {
|
||||
LIST_INSERT_HEAD(&ep->marks, lmt, q);
|
||||
LIST_INSERT_HEAD(&sp->ep->marks, lmt, q);
|
||||
} else
|
||||
LIST_INSERT_AFTER(lmp, lmt, q);
|
||||
lmp = lmt;
|
||||
@ -215,9 +197,8 @@ mark_set(sp, ep, key, value, userset)
|
||||
* where it would go.
|
||||
*/
|
||||
static LMARK *
|
||||
mark_find(sp, ep, key)
|
||||
mark_find(sp, key)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
ARG_CHAR_T key;
|
||||
{
|
||||
LMARK *lmp, *lastlmp;
|
||||
@ -226,7 +207,7 @@ mark_find(sp, ep, key)
|
||||
* Return the requested mark or the slot immediately before
|
||||
* where it should go.
|
||||
*/
|
||||
for (lastlmp = NULL, lmp = ep->marks.lh_first;
|
||||
for (lastlmp = NULL, lmp = sp->ep->marks.lh_first;
|
||||
lmp != NULL; lastlmp = lmp, lmp = lmp->q.le_next)
|
||||
if (lmp->name >= key)
|
||||
return (lmp->name == key ? lmp : lastlmp);
|
||||
@ -236,37 +217,61 @@ mark_find(sp, ep, key)
|
||||
/*
|
||||
* mark_insdel --
|
||||
* Update the marks based on an insertion or deletion.
|
||||
*
|
||||
* PUBLIC: int mark_insdel __P((SCR *, lnop_t, recno_t));
|
||||
*/
|
||||
void
|
||||
mark_insdel(sp, ep, op, lno)
|
||||
int
|
||||
mark_insdel(sp, op, lno)
|
||||
SCR *sp;
|
||||
EXF *ep;
|
||||
enum operation op;
|
||||
lnop_t op;
|
||||
recno_t lno;
|
||||
{
|
||||
LMARK *lmp;
|
||||
recno_t lline;
|
||||
|
||||
switch (op) {
|
||||
case LINE_APPEND:
|
||||
return;
|
||||
/* All insert/append operations are done as inserts. */
|
||||
abort();
|
||||
case LINE_DELETE:
|
||||
for (lmp = ep->marks.lh_first;
|
||||
for (lmp = sp->ep->marks.lh_first;
|
||||
lmp != NULL; lmp = lmp->q.le_next)
|
||||
if (lmp->lno >= lno)
|
||||
if (lmp->lno == lno) {
|
||||
F_SET(lmp, MARK_DELETED);
|
||||
(void)log_mark(sp, ep, lmp);
|
||||
(void)log_mark(sp, lmp);
|
||||
} else
|
||||
--lmp->lno;
|
||||
return;
|
||||
break;
|
||||
case LINE_INSERT:
|
||||
for (lmp = ep->marks.lh_first;
|
||||
/*
|
||||
* XXX
|
||||
* Very nasty special case. If the file was empty, then we're
|
||||
* adding the first line, which is a replacement. So, we don't
|
||||
* modify the marks. This is a hack to make:
|
||||
*
|
||||
* mz:r!echo foo<carriage-return>'z
|
||||
*
|
||||
* work, i.e. historically you could mark the "line" in an empty
|
||||
* file and replace it, and continue to use the mark. Insane,
|
||||
* well, yes, I know, but someone complained.
|
||||
*
|
||||
* Check for line #2 before going to the end of the file.
|
||||
*/
|
||||
if (!db_exist(sp, 2)) {
|
||||
if (db_last(sp, &lline))
|
||||
return (1);
|
||||
if (lline == 1)
|
||||
return (0);
|
||||
}
|
||||
|
||||
for (lmp = sp->ep->marks.lh_first;
|
||||
lmp != NULL; lmp = lmp->q.le_next)
|
||||
if (lmp->lno >= lno)
|
||||
++lmp->lno;
|
||||
return;
|
||||
break;
|
||||
case LINE_RESET:
|
||||
return;
|
||||
break;
|
||||
}
|
||||
/* NOTREACHED */
|
||||
return (0);
|
||||
}
|
42
contrib/nvi/common/mark.h
Normal file
42
contrib/nvi/common/mark.h
Normal file
@ -0,0 +1,42 @@
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1992, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*
|
||||
* @(#)mark.h 10.3 (Berkeley) 3/6/96
|
||||
*/
|
||||
|
||||
/*
|
||||
* The MARK and LMARK structures define positions in the file. There are
|
||||
* two structures because the mark subroutines are the only places where
|
||||
* anything cares about something other than line and column.
|
||||
*
|
||||
* Because of the different interfaces used by the db(3) package, curses,
|
||||
* and users, the line number is 1 based and the column number is 0 based.
|
||||
* Additionally, it is known that the out-of-band line number is less than
|
||||
* any legal line number. The line number is of type recno_t, as that's
|
||||
* the underlying type of the database. The column number is of type size_t,
|
||||
* guaranteeing that we can malloc a line.
|
||||
*/
|
||||
struct _mark {
|
||||
#define OOBLNO 0 /* Out-of-band line number. */
|
||||
recno_t lno; /* Line number. */
|
||||
size_t cno; /* Column number. */
|
||||
};
|
||||
|
||||
struct _lmark {
|
||||
LIST_ENTRY(_lmark) q; /* Linked list of marks. */
|
||||
recno_t lno; /* Line number. */
|
||||
size_t cno; /* Column number. */
|
||||
CHAR_T name; /* Mark name. */
|
||||
|
||||
#define MARK_DELETED 0x01 /* Mark was deleted. */
|
||||
#define MARK_USERSET 0x02 /* User set this mark. */
|
||||
u_int8_t flags;
|
||||
};
|
||||
|
||||
#define ABSMARK1 '\'' /* Absolute mark name. */
|
||||
#define ABSMARK2 '`' /* Absolute mark name. */
|
168
contrib/nvi/common/mem.h
Normal file
168
contrib/nvi/common/mem.h
Normal file
@ -0,0 +1,168 @@
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*
|
||||
* @(#)mem.h 10.7 (Berkeley) 3/30/96
|
||||
*/
|
||||
|
||||
/* Increase the size of a malloc'd buffer. Two versions, one that
|
||||
* returns, one that jumps to an error label.
|
||||
*/
|
||||
#define BINC_GOTO(sp, lp, llen, nlen) { \
|
||||
void *L__bincp; \
|
||||
if ((nlen) > llen) { \
|
||||
if ((L__bincp = binc(sp, lp, &(llen), nlen)) == NULL) \
|
||||
goto alloc_err; \
|
||||
/* \
|
||||
* !!! \
|
||||
* Possible pointer conversion. \
|
||||
*/ \
|
||||
lp = L__bincp; \
|
||||
} \
|
||||
}
|
||||
#define BINC_RET(sp, lp, llen, nlen) { \
|
||||
void *L__bincp; \
|
||||
if ((nlen) > llen) { \
|
||||
if ((L__bincp = binc(sp, lp, &(llen), nlen)) == NULL) \
|
||||
return (1); \
|
||||
/* \
|
||||
* !!! \
|
||||
* Possible pointer conversion. \
|
||||
*/ \
|
||||
lp = L__bincp; \
|
||||
} \
|
||||
}
|
||||
|
||||
/*
|
||||
* Get some temporary space, preferably from the global temporary buffer,
|
||||
* from a malloc'd buffer otherwise. Two versions, one that returns, one
|
||||
* that jumps to an error label.
|
||||
*/
|
||||
#define GET_SPACE_GOTO(sp, bp, blen, nlen) { \
|
||||
GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \
|
||||
if (L__gp == NULL || F_ISSET(L__gp, G_TMP_INUSE)) { \
|
||||
bp = NULL; \
|
||||
blen = 0; \
|
||||
BINC_GOTO(sp, bp, blen, nlen); \
|
||||
} else { \
|
||||
BINC_GOTO(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \
|
||||
bp = L__gp->tmp_bp; \
|
||||
blen = L__gp->tmp_blen; \
|
||||
F_SET(L__gp, G_TMP_INUSE); \
|
||||
} \
|
||||
}
|
||||
#define GET_SPACE_RET(sp, bp, blen, nlen) { \
|
||||
GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \
|
||||
if (L__gp == NULL || F_ISSET(L__gp, G_TMP_INUSE)) { \
|
||||
bp = NULL; \
|
||||
blen = 0; \
|
||||
BINC_RET(sp, bp, blen, nlen); \
|
||||
} else { \
|
||||
BINC_RET(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \
|
||||
bp = L__gp->tmp_bp; \
|
||||
blen = L__gp->tmp_blen; \
|
||||
F_SET(L__gp, G_TMP_INUSE); \
|
||||
} \
|
||||
}
|
||||
|
||||
/*
|
||||
* Add space to a GET_SPACE returned buffer. Two versions, one that
|
||||
* returns, one that jumps to an error label.
|
||||
*/
|
||||
#define ADD_SPACE_GOTO(sp, bp, blen, nlen) { \
|
||||
GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \
|
||||
if (L__gp == NULL || bp == L__gp->tmp_bp) { \
|
||||
F_CLR(L__gp, G_TMP_INUSE); \
|
||||
BINC_GOTO(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \
|
||||
bp = L__gp->tmp_bp; \
|
||||
blen = L__gp->tmp_blen; \
|
||||
F_SET(L__gp, G_TMP_INUSE); \
|
||||
} else \
|
||||
BINC_GOTO(sp, bp, blen, nlen); \
|
||||
}
|
||||
#define ADD_SPACE_RET(sp, bp, blen, nlen) { \
|
||||
GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \
|
||||
if (L__gp == NULL || bp == L__gp->tmp_bp) { \
|
||||
F_CLR(L__gp, G_TMP_INUSE); \
|
||||
BINC_RET(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \
|
||||
bp = L__gp->tmp_bp; \
|
||||
blen = L__gp->tmp_blen; \
|
||||
F_SET(L__gp, G_TMP_INUSE); \
|
||||
} else \
|
||||
BINC_RET(sp, bp, blen, nlen); \
|
||||
}
|
||||
|
||||
/* Free a GET_SPACE returned buffer. */
|
||||
#define FREE_SPACE(sp, bp, blen) { \
|
||||
GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \
|
||||
if (L__gp != NULL && bp == L__gp->tmp_bp) \
|
||||
F_CLR(L__gp, G_TMP_INUSE); \
|
||||
else \
|
||||
free(bp); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Malloc a buffer, casting the return pointer. Various versions.
|
||||
*
|
||||
* !!!
|
||||
* The cast should be unnecessary, malloc(3) and friends return void *'s,
|
||||
* which is all we need. However, some systems that nvi needs to run on
|
||||
* don't do it right yet, resulting in the compiler printing out roughly
|
||||
* a million warnings. After awhile, it seemed easier to put the casts
|
||||
* in instead of explaining it all the time.
|
||||
*/
|
||||
#define CALLOC(sp, p, cast, nmemb, size) { \
|
||||
if ((p = (cast)calloc(nmemb, size)) == NULL) \
|
||||
msgq(sp, M_SYSERR, NULL); \
|
||||
}
|
||||
#define CALLOC_GOTO(sp, p, cast, nmemb, size) { \
|
||||
if ((p = (cast)calloc(nmemb, size)) == NULL) \
|
||||
goto alloc_err; \
|
||||
}
|
||||
#define CALLOC_NOMSG(sp, p, cast, nmemb, size) { \
|
||||
p = (cast)calloc(nmemb, size); \
|
||||
}
|
||||
#define CALLOC_RET(sp, p, cast, nmemb, size) { \
|
||||
if ((p = (cast)calloc(nmemb, size)) == NULL) { \
|
||||
msgq(sp, M_SYSERR, NULL); \
|
||||
return (1); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define MALLOC(sp, p, cast, size) { \
|
||||
if ((p = (cast)malloc(size)) == NULL) \
|
||||
msgq(sp, M_SYSERR, NULL); \
|
||||
}
|
||||
#define MALLOC_GOTO(sp, p, cast, size) { \
|
||||
if ((p = (cast)malloc(size)) == NULL) \
|
||||
goto alloc_err; \
|
||||
}
|
||||
#define MALLOC_NOMSG(sp, p, cast, size) { \
|
||||
p = (cast)malloc(size); \
|
||||
}
|
||||
#define MALLOC_RET(sp, p, cast, size) { \
|
||||
if ((p = (cast)malloc(size)) == NULL) { \
|
||||
msgq(sp, M_SYSERR, NULL); \
|
||||
return (1); \
|
||||
} \
|
||||
}
|
||||
/*
|
||||
* XXX
|
||||
* Don't depend on realloc(NULL, size) working.
|
||||
*/
|
||||
#define REALLOC(sp, p, cast, size) { \
|
||||
if ((p = (cast)(p == NULL ? \
|
||||
malloc(size) : realloc(p, size))) == NULL) \
|
||||
msgq(sp, M_SYSERR, NULL); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Versions of memmove(3) and memset(3) that use the size of the
|
||||
* initial pointer to figure out how much memory to manipulate.
|
||||
*/
|
||||
#define MEMMOVE(p, t, len) memmove(p, t, (len) * sizeof(*(p)))
|
||||
#define MEMSET(p, value, len) memset(p, value, (len) * sizeof(*(p)))
|
895
contrib/nvi/common/msg.c
Normal file
895
contrib/nvi/common/msg.c
Normal file
@ -0,0 +1,895 @@
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1991, 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)msg.c 10.48 (Berkeley) 9/15/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h> /* XXX: param.h may not have included types.h */
|
||||
#include <sys/queue.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <bitstring.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef __STDC__
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
#include <varargs.h>
|
||||
#endif
|
||||
|
||||
#include "common.h"
|
||||
#include "../vi/vi.h"
|
||||
|
||||
/*
|
||||
* msgq --
|
||||
* Display a message.
|
||||
*
|
||||
* PUBLIC: void msgq __P((SCR *, mtype_t, const char *, ...));
|
||||
*/
|
||||
void
|
||||
#ifdef __STDC__
|
||||
msgq(SCR *sp, mtype_t mt, const char *fmt, ...)
|
||||
#else
|
||||
msgq(sp, mt, fmt, va_alist)
|
||||
SCR *sp;
|
||||
mtype_t mt;
|
||||
const char *fmt;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
#ifndef NL_ARGMAX
|
||||
#define __NL_ARGMAX 20 /* Set to 9 by System V. */
|
||||
struct {
|
||||
const char *str; /* String pointer. */
|
||||
size_t arg; /* Argument number. */
|
||||
size_t prefix; /* Prefix string length. */
|
||||
size_t skip; /* Skipped string length. */
|
||||
size_t suffix; /* Suffix string length. */
|
||||
} str[__NL_ARGMAX];
|
||||
#endif
|
||||
static int reenter; /* STATIC: Re-entrancy check. */
|
||||
CHAR_T ch;
|
||||
GS *gp;
|
||||
size_t blen, cnt1, cnt2, len, mlen, nlen, soff;
|
||||
const char *p, *t, *u;
|
||||
char *bp, *mp, *rbp, *s_rbp;
|
||||
va_list ap;
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* It's possible to enter msg when there's no screen to hold the
|
||||
* message. If sp is NULL, ignore the special cases and put the
|
||||
* message out to stderr.
|
||||
*/
|
||||
if (sp == NULL) {
|
||||
gp = NULL;
|
||||
if (mt == M_BERR)
|
||||
mt = M_ERR;
|
||||
else if (mt == M_VINFO)
|
||||
mt = M_INFO;
|
||||
} else {
|
||||
gp = sp->gp;
|
||||
switch (mt) {
|
||||
case M_BERR:
|
||||
if (F_ISSET(sp, SC_VI) && !O_ISSET(sp, O_VERBOSE)) {
|
||||
F_SET(gp, G_BELLSCHED);
|
||||
return;
|
||||
}
|
||||
mt = M_ERR;
|
||||
break;
|
||||
case M_VINFO:
|
||||
if (!O_ISSET(sp, O_VERBOSE))
|
||||
return;
|
||||
mt = M_INFO;
|
||||
/* FALLTHROUGH */
|
||||
case M_INFO:
|
||||
if (F_ISSET(sp, SC_EX_SILENT))
|
||||
return;
|
||||
break;
|
||||
case M_ERR:
|
||||
case M_SYSERR:
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* It's possible to reenter msg when it allocates space. We're
|
||||
* probably dead anyway, but there's no reason to drop core.
|
||||
*
|
||||
* XXX
|
||||
* Yes, there's a race, but it should only be two instructions.
|
||||
*/
|
||||
if (reenter++)
|
||||
return;
|
||||
|
||||
/* Get space for the message. */
|
||||
nlen = 1024;
|
||||
if (0) {
|
||||
retry: FREE_SPACE(sp, bp, blen);
|
||||
nlen *= 2;
|
||||
}
|
||||
bp = NULL;
|
||||
blen = 0;
|
||||
GET_SPACE_GOTO(sp, bp, blen, nlen);
|
||||
|
||||
/*
|
||||
* Error prefix.
|
||||
*
|
||||
* mp: pointer to the current next character to be written
|
||||
* mlen: length of the already written characters
|
||||
* blen: total length of the buffer
|
||||
*/
|
||||
#define REM (blen - mlen)
|
||||
mp = bp;
|
||||
mlen = 0;
|
||||
if (mt == M_SYSERR) {
|
||||
p = msg_cat(sp, "020|Error: ", &len);
|
||||
if (REM < len)
|
||||
goto retry;
|
||||
memcpy(mp, p, len);
|
||||
mp += len;
|
||||
mlen += len;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we're running an ex command that the user didn't enter, display
|
||||
* the file name and line number prefix.
|
||||
*/
|
||||
if ((mt == M_ERR || mt == M_SYSERR) &&
|
||||
sp != NULL && gp != NULL && gp->if_name != NULL) {
|
||||
for (p = gp->if_name; *p != '\0'; ++p) {
|
||||
len = snprintf(mp, REM, "%s", KEY_NAME(sp, *p));
|
||||
mp += len;
|
||||
if ((mlen += len) > blen)
|
||||
goto retry;
|
||||
}
|
||||
len = snprintf(mp, REM, ", %d: ", gp->if_lno);
|
||||
mp += len;
|
||||
if ((mlen += len) > blen)
|
||||
goto retry;
|
||||
}
|
||||
|
||||
/* If nothing to format, we're done. */
|
||||
if (fmt == NULL)
|
||||
goto nofmt;
|
||||
fmt = msg_cat(sp, fmt, NULL);
|
||||
|
||||
#ifndef NL_ARGMAX
|
||||
/*
|
||||
* Nvi should run on machines that don't support the numbered argument
|
||||
* specifications (%[digit]*$). We do this by reformatting the string
|
||||
* so that we can hand it to vsprintf(3) and it will use the arguments
|
||||
* in the right order. When vsprintf returns, we put the string back
|
||||
* into the right order. It's undefined, according to SVID III, to mix
|
||||
* numbered argument specifications with the standard style arguments,
|
||||
* so this should be safe.
|
||||
*
|
||||
* In addition, we also need a character that is known to not occur in
|
||||
* any vi message, for separating the parts of the string. As callers
|
||||
* of msgq are responsible for making sure that all the non-printable
|
||||
* characters are formatted for printing before calling msgq, we use a
|
||||
* random non-printable character selected at terminal initialization
|
||||
* time. This code isn't fast by any means, but as messages should be
|
||||
* relatively short and normally have only a few arguments, it won't be
|
||||
* too bad. Regardless, nobody has come up with any other solution.
|
||||
*
|
||||
* The result of this loop is an array of pointers into the message
|
||||
* string, with associated lengths and argument numbers. The array
|
||||
* is in the "correct" order, and the arg field contains the argument
|
||||
* order.
|
||||
*/
|
||||
for (p = fmt, soff = 0; soff < __NL_ARGMAX;) {
|
||||
for (t = p; *p != '\0' && *p != '%'; ++p);
|
||||
if (*p == '\0')
|
||||
break;
|
||||
++p;
|
||||
if (!isdigit(*p)) {
|
||||
if (*p == '%')
|
||||
++p;
|
||||
continue;
|
||||
}
|
||||
for (u = p; *++p != '\0' && isdigit(*p););
|
||||
if (*p != '$')
|
||||
continue;
|
||||
|
||||
/* Up to, and including the % character. */
|
||||
str[soff].str = t;
|
||||
str[soff].prefix = u - t;
|
||||
|
||||
/* Up to, and including the $ character. */
|
||||
str[soff].arg = atoi(u);
|
||||
str[soff].skip = (p - u) + 1;
|
||||
if (str[soff].arg >= __NL_ARGMAX)
|
||||
goto ret;
|
||||
|
||||
/* Up to, and including the conversion character. */
|
||||
for (u = p; (ch = *++p) != '\0';)
|
||||
if (isalpha(ch) &&
|
||||
strchr("diouxXfeEgGcspn", ch) != NULL)
|
||||
break;
|
||||
str[soff].suffix = p - u;
|
||||
if (ch != '\0')
|
||||
++p;
|
||||
++soff;
|
||||
}
|
||||
|
||||
/* If no magic strings, we're done. */
|
||||
if (soff == 0)
|
||||
goto format;
|
||||
|
||||
/* Get space for the reordered strings. */
|
||||
if ((rbp = malloc(nlen)) == NULL)
|
||||
goto ret;
|
||||
s_rbp = rbp;
|
||||
|
||||
/*
|
||||
* Reorder the strings into the message string based on argument
|
||||
* order.
|
||||
*
|
||||
* !!!
|
||||
* We ignore arguments that are out of order, i.e. if we don't find
|
||||
* an argument, we continue. Assume (almost certainly incorrectly)
|
||||
* that whoever created the string knew what they were doing.
|
||||
*
|
||||
* !!!
|
||||
* Brute force "sort", but since we don't expect more than one or two
|
||||
* arguments in a string, the setup cost of a fast sort will be more
|
||||
* expensive than the loop.
|
||||
*/
|
||||
for (cnt1 = 1; cnt1 <= soff; ++cnt1)
|
||||
for (cnt2 = 0; cnt2 < soff; ++cnt2)
|
||||
if (cnt1 == str[cnt2].arg) {
|
||||
memmove(s_rbp, str[cnt2].str, str[cnt2].prefix);
|
||||
memmove(s_rbp + str[cnt2].prefix,
|
||||
str[cnt2].str + str[cnt2].prefix +
|
||||
str[cnt2].skip, str[cnt2].suffix);
|
||||
s_rbp += str[cnt2].prefix + str[cnt2].suffix;
|
||||
*s_rbp++ =
|
||||
gp == NULL ? DEFAULT_NOPRINT : gp->noprint;
|
||||
break;
|
||||
}
|
||||
*s_rbp = '\0';
|
||||
fmt = rbp;
|
||||
#endif
|
||||
|
||||
format: /* Format the arguments into the string. */
|
||||
#ifdef __STDC__
|
||||
va_start(ap, fmt);
|
||||
#else
|
||||
va_start(ap);
|
||||
#endif
|
||||
len = vsnprintf(mp, REM, fmt, ap);
|
||||
va_end(ap);
|
||||
if (len >= nlen)
|
||||
goto retry;
|
||||
|
||||
#ifndef NL_ARGMAX
|
||||
if (soff == 0)
|
||||
goto nofmt;
|
||||
|
||||
/*
|
||||
* Go through the resulting string, and, for each separator character
|
||||
* separated string, enter its new starting position and length in the
|
||||
* array.
|
||||
*/
|
||||
for (p = t = mp, cnt1 = 1,
|
||||
ch = gp == NULL ? DEFAULT_NOPRINT : gp->noprint; *p != '\0'; ++p)
|
||||
if (*p == ch) {
|
||||
for (cnt2 = 0; cnt2 < soff; ++cnt2)
|
||||
if (str[cnt2].arg == cnt1)
|
||||
break;
|
||||
str[cnt2].str = t;
|
||||
str[cnt2].prefix = p - t;
|
||||
t = p + 1;
|
||||
++cnt1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reorder the strings once again, putting them back into the
|
||||
* message buffer.
|
||||
*
|
||||
* !!!
|
||||
* Note, the length of the message gets decremented once for
|
||||
* each substring, when we discard the separator character.
|
||||
*/
|
||||
for (s_rbp = rbp, cnt1 = 0; cnt1 < soff; ++cnt1) {
|
||||
memmove(rbp, str[cnt1].str, str[cnt1].prefix);
|
||||
rbp += str[cnt1].prefix;
|
||||
--len;
|
||||
}
|
||||
memmove(mp, s_rbp, rbp - s_rbp);
|
||||
|
||||
/* Free the reordered string memory. */
|
||||
free(s_rbp);
|
||||
#endif
|
||||
|
||||
nofmt: mp += len;
|
||||
if ((mlen += len) > blen)
|
||||
goto retry;
|
||||
if (mt == M_SYSERR) {
|
||||
len = snprintf(mp, REM, ": %s", strerror(errno));
|
||||
mp += len;
|
||||
if ((mlen += len) > blen)
|
||||
goto retry;
|
||||
mt = M_ERR;
|
||||
}
|
||||
|
||||
/* Add trailing newline. */
|
||||
if ((mlen += 1) > blen)
|
||||
goto retry;
|
||||
*mp = '\n';
|
||||
|
||||
if (sp != NULL)
|
||||
(void)ex_fflush(sp);
|
||||
if (gp != NULL)
|
||||
gp->scr_msg(sp, mt, bp, mlen);
|
||||
else
|
||||
(void)fprintf(stderr, "%.*s", (int)mlen, bp);
|
||||
|
||||
/* Cleanup. */
|
||||
ret: FREE_SPACE(sp, bp, blen);
|
||||
alloc_err:
|
||||
reenter = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* msgq_str --
|
||||
* Display a message with an embedded string.
|
||||
*
|
||||
* PUBLIC: void msgq_str __P((SCR *, mtype_t, char *, char *));
|
||||
*/
|
||||
void
|
||||
msgq_str(sp, mtype, str, fmt)
|
||||
SCR *sp;
|
||||
mtype_t mtype;
|
||||
char *str, *fmt;
|
||||
{
|
||||
int nf, sv_errno;
|
||||
char *p;
|
||||
|
||||
if (str == NULL) {
|
||||
msgq(sp, mtype, fmt);
|
||||
return;
|
||||
}
|
||||
|
||||
sv_errno = errno;
|
||||
p = msg_print(sp, str, &nf);
|
||||
errno = sv_errno;
|
||||
msgq(sp, mtype, fmt, p);
|
||||
if (nf)
|
||||
FREE_SPACE(sp, p, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* mod_rpt --
|
||||
* Report on the lines that changed.
|
||||
*
|
||||
* !!!
|
||||
* Historic vi documentation (USD:15-8) claimed that "The editor will also
|
||||
* always tell you when a change you make affects text which you cannot see."
|
||||
* This wasn't true -- edit a large file and do "100d|1". We don't implement
|
||||
* this semantic since it requires tracking each line that changes during a
|
||||
* command instead of just keeping count.
|
||||
*
|
||||
* Line counts weren't right in historic vi, either. For example, given the
|
||||
* file:
|
||||
* abc
|
||||
* def
|
||||
* the command 2d}, from the 'b' would report that two lines were deleted,
|
||||
* not one.
|
||||
*
|
||||
* PUBLIC: void mod_rpt __P((SCR *));
|
||||
*/
|
||||
void
|
||||
mod_rpt(sp)
|
||||
SCR *sp;
|
||||
{
|
||||
static char * const action[] = {
|
||||
"293|added",
|
||||
"294|changed",
|
||||
"295|deleted",
|
||||
"296|joined",
|
||||
"297|moved",
|
||||
"298|shifted",
|
||||
"299|yanked",
|
||||
};
|
||||
static char * const lines[] = {
|
||||
"300|line",
|
||||
"301|lines",
|
||||
};
|
||||
recno_t total;
|
||||
u_long rptval;
|
||||
int first, cnt;
|
||||
size_t blen, len, tlen;
|
||||
const char *t;
|
||||
char * const *ap;
|
||||
char *bp, *p;
|
||||
|
||||
/* Change reports are turned off in batch mode. */
|
||||
if (F_ISSET(sp, SC_EX_SILENT))
|
||||
return;
|
||||
|
||||
/* Reset changing line number. */
|
||||
sp->rptlchange = OOBLNO;
|
||||
|
||||
/*
|
||||
* Don't build a message if not enough changed.
|
||||
*
|
||||
* !!!
|
||||
* And now, a vi clone test. Historically, vi reported if the number
|
||||
* of changed lines was > than the value, not >=, unless it was a yank
|
||||
* command, which used >=. No lie. Furthermore, an action was never
|
||||
* reported for a single line action. This is consistent for actions
|
||||
* other than yank, but yank didn't report single line actions even if
|
||||
* the report edit option was set to 1. In addition, setting report to
|
||||
* 0 in the 4BSD historic vi was equivalent to setting it to 1, for an
|
||||
* unknown reason (this bug was fixed in System III/V at some point).
|
||||
* I got complaints, so nvi conforms to System III/V historic practice
|
||||
* except that we report a yank of 1 line if report is set to 1.
|
||||
*/
|
||||
#define ARSIZE(a) sizeof(a) / sizeof (*a)
|
||||
#define MAXNUM 25
|
||||
rptval = O_VAL(sp, O_REPORT);
|
||||
for (cnt = 0, total = 0; cnt < ARSIZE(action); ++cnt)
|
||||
total += sp->rptlines[cnt];
|
||||
if (total == 0)
|
||||
return;
|
||||
if (total <= rptval && sp->rptlines[L_YANKED] < rptval) {
|
||||
for (cnt = 0; cnt < ARSIZE(action); ++cnt)
|
||||
sp->rptlines[cnt] = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Build and display the message. */
|
||||
GET_SPACE_GOTO(sp, bp, blen, sizeof(action) * MAXNUM + 1);
|
||||
for (p = bp, first = 1, tlen = 0,
|
||||
ap = action, cnt = 0; cnt < ARSIZE(action); ++ap, ++cnt)
|
||||
if (sp->rptlines[cnt] != 0) {
|
||||
if (first)
|
||||
first = 0;
|
||||
else {
|
||||
*p++ = ';';
|
||||
*p++ = ' ';
|
||||
tlen += 2;
|
||||
}
|
||||
len = snprintf(p, MAXNUM, "%lu ", sp->rptlines[cnt]);
|
||||
p += len;
|
||||
tlen += len;
|
||||
t = msg_cat(sp,
|
||||
lines[sp->rptlines[cnt] == 1 ? 0 : 1], &len);
|
||||
memcpy(p, t, len);
|
||||
p += len;
|
||||
tlen += len;
|
||||
*p++ = ' ';
|
||||
++tlen;
|
||||
t = msg_cat(sp, *ap, &len);
|
||||
memcpy(p, t, len);
|
||||
p += len;
|
||||
tlen += len;
|
||||
sp->rptlines[cnt] = 0;
|
||||
}
|
||||
|
||||
/* Add trailing newline. */
|
||||
*p = '\n';
|
||||
++tlen;
|
||||
|
||||
(void)ex_fflush(sp);
|
||||
sp->gp->scr_msg(sp, M_INFO, bp, tlen);
|
||||
|
||||
FREE_SPACE(sp, bp, blen);
|
||||
alloc_err:
|
||||
return;
|
||||
|
||||
#undef ARSIZE
|
||||
#undef MAXNUM
|
||||
}
|
||||
|
||||
/*
|
||||
* msgq_status --
|
||||
* Report on the file's status.
|
||||
*
|
||||
* PUBLIC: void msgq_status __P((SCR *, recno_t, u_int));
|
||||
*/
|
||||
void
|
||||
msgq_status(sp, lno, flags)
|
||||
SCR *sp;
|
||||
recno_t lno;
|
||||
u_int flags;
|
||||
{
|
||||
static int poisoned;
|
||||
recno_t last;
|
||||
size_t blen, len;
|
||||
int cnt, needsep;
|
||||
const char *t;
|
||||
char **ap, *bp, *np, *p, *s;
|
||||
|
||||
/* Get sufficient memory. */
|
||||
len = strlen(sp->frp->name);
|
||||
GET_SPACE_GOTO(sp, bp, blen, len * MAX_CHARACTER_COLUMNS + 128);
|
||||
p = bp;
|
||||
|
||||
/* Copy in the filename. */
|
||||
for (p = bp, t = sp->frp->name; *t != '\0'; ++t) {
|
||||
len = KEY_LEN(sp, *t);
|
||||
memcpy(p, KEY_NAME(sp, *t), len);
|
||||
p += len;
|
||||
}
|
||||
np = p;
|
||||
*p++ = ':';
|
||||
*p++ = ' ';
|
||||
|
||||
/* Copy in the argument count. */
|
||||
if (F_ISSET(sp, SC_STATUS_CNT) && sp->argv != NULL) {
|
||||
for (cnt = 0, ap = sp->argv; *ap != NULL; ++ap, ++cnt);
|
||||
if (cnt > 1) {
|
||||
(void)sprintf(p,
|
||||
msg_cat(sp, "317|%d files to edit", NULL), cnt);
|
||||
p += strlen(p);
|
||||
*p++ = ':';
|
||||
*p++ = ' ';
|
||||
}
|
||||
F_CLR(sp, SC_STATUS_CNT);
|
||||
}
|
||||
|
||||
/*
|
||||
* See nvi/exf.c:file_init() for a description of how and when the
|
||||
* read-only bit is set.
|
||||
*
|
||||
* !!!
|
||||
* The historic display for "name changed" was "[Not edited]".
|
||||
*/
|
||||
needsep = 0;
|
||||
if (F_ISSET(sp->frp, FR_NEWFILE)) {
|
||||
F_CLR(sp->frp, FR_NEWFILE);
|
||||
t = msg_cat(sp, "021|new file", &len);
|
||||
memcpy(p, t, len);
|
||||
p += len;
|
||||
needsep = 1;
|
||||
} else {
|
||||
if (F_ISSET(sp->frp, FR_NAMECHANGE)) {
|
||||
t = msg_cat(sp, "022|name changed", &len);
|
||||
memcpy(p, t, len);
|
||||
p += len;
|
||||
needsep = 1;
|
||||
}
|
||||
if (needsep) {
|
||||
*p++ = ',';
|
||||
*p++ = ' ';
|
||||
}
|
||||
if (F_ISSET(sp->ep, F_MODIFIED))
|
||||
t = msg_cat(sp, "023|modified", &len);
|
||||
else
|
||||
t = msg_cat(sp, "024|unmodified", &len);
|
||||
memcpy(p, t, len);
|
||||
p += len;
|
||||
needsep = 1;
|
||||
}
|
||||
if (F_ISSET(sp->frp, FR_UNLOCKED)) {
|
||||
if (needsep) {
|
||||
*p++ = ',';
|
||||
*p++ = ' ';
|
||||
}
|
||||
t = msg_cat(sp, "025|UNLOCKED", &len);
|
||||
memcpy(p, t, len);
|
||||
p += len;
|
||||
needsep = 1;
|
||||
}
|
||||
if (O_ISSET(sp, O_READONLY)) {
|
||||
if (needsep) {
|
||||
*p++ = ',';
|
||||
*p++ = ' ';
|
||||
}
|
||||
t = msg_cat(sp, "026|readonly", &len);
|
||||
memcpy(p, t, len);
|
||||
p += len;
|
||||
needsep = 1;
|
||||
}
|
||||
if (needsep) {
|
||||
*p++ = ':';
|
||||
*p++ = ' ';
|
||||
}
|
||||
if (LF_ISSET(MSTAT_SHOWLAST)) {
|
||||
if (db_last(sp, &last))
|
||||
return;
|
||||
if (last == 0) {
|
||||
t = msg_cat(sp, "028|empty file", &len);
|
||||
memcpy(p, t, len);
|
||||
p += len;
|
||||
} else {
|
||||
t = msg_cat(sp, "027|line %lu of %lu [%ld%%]", &len);
|
||||
(void)sprintf(p, t, lno, last, (lno * 100) / last);
|
||||
p += strlen(p);
|
||||
}
|
||||
} else {
|
||||
t = msg_cat(sp, "029|line %lu", &len);
|
||||
(void)sprintf(p, t, lno);
|
||||
p += strlen(p);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
(void)sprintf(p, " (pid %lu)", (u_long)getpid());
|
||||
p += strlen(p);
|
||||
#endif
|
||||
*p++ = '\n';
|
||||
len = p - bp;
|
||||
|
||||
/*
|
||||
* There's a nasty problem with long path names. Cscope and tags files
|
||||
* can result in long paths and vi will request a continuation key from
|
||||
* the user as soon as it starts the screen. Unfortunately, the user
|
||||
* has already typed ahead, and chaos results. If we assume that the
|
||||
* characters in the filenames and informational messages only take a
|
||||
* single screen column each, we can trim the filename.
|
||||
*
|
||||
* XXX
|
||||
* Status lines get put up at fairly awkward times. For example, when
|
||||
* you do a filter read (e.g., :read ! echo foo) in the top screen of a
|
||||
* split screen, we have to repaint the status lines for all the screens
|
||||
* below the top screen. We don't want users having to enter continue
|
||||
* characters for those screens. Make it really hard to screw this up.
|
||||
*/
|
||||
s = bp;
|
||||
if (LF_ISSET(MSTAT_TRUNCATE) && len > sp->cols) {
|
||||
for (; s < np && (*s != '/' || (p - s) > sp->cols - 3); ++s);
|
||||
if (s == np) {
|
||||
s = p - (sp->cols - 5);
|
||||
*--s = ' ';
|
||||
}
|
||||
*--s = '.';
|
||||
*--s = '.';
|
||||
*--s = '.';
|
||||
len = p - s;
|
||||
}
|
||||
|
||||
/* Flush any waiting ex messages. */
|
||||
(void)ex_fflush(sp);
|
||||
|
||||
sp->gp->scr_msg(sp, M_INFO, s, len);
|
||||
|
||||
FREE_SPACE(sp, bp, blen);
|
||||
alloc_err:
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* msg_open --
|
||||
* Open the message catalogs.
|
||||
*
|
||||
* PUBLIC: int msg_open __P((SCR *, char *));
|
||||
*/
|
||||
int
|
||||
msg_open(sp, file)
|
||||
SCR *sp;
|
||||
char *file;
|
||||
{
|
||||
/*
|
||||
* !!!
|
||||
* Assume that the first file opened is the system default, and that
|
||||
* all subsequent ones user defined. Only display error messages
|
||||
* if we can't open the user defined ones -- it's useful to know if
|
||||
* the system one wasn't there, but if nvi is being shipped with an
|
||||
* installed system, the file will be there, if it's not, then the
|
||||
* message will be repeated every time nvi is started up.
|
||||
*/
|
||||
static int first = 1;
|
||||
DB *db;
|
||||
DBT data, key;
|
||||
recno_t msgno;
|
||||
char *p, *t, buf[MAXPATHLEN];
|
||||
|
||||
if ((p = strrchr(file, '/')) != NULL && p[1] == '\0' &&
|
||||
((t = getenv("LC_MESSAGES")) != NULL && t[0] != '\0' ||
|
||||
(t = getenv("LANG")) != NULL && t[0] != '\0')) {
|
||||
(void)snprintf(buf, sizeof(buf), "%s%s", file, t);
|
||||
p = buf;
|
||||
} else
|
||||
p = file;
|
||||
if ((db = dbopen(p,
|
||||
O_NONBLOCK | O_RDONLY, 0, DB_RECNO, NULL)) == NULL) {
|
||||
if (first) {
|
||||
first = 0;
|
||||
return (1);
|
||||
}
|
||||
msgq_str(sp, M_SYSERR, p, "%s");
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Test record 1 for the magic string. The msgq call is here so
|
||||
* the message catalog build finds it.
|
||||
*/
|
||||
#define VMC "VI_MESSAGE_CATALOG"
|
||||
key.data = &msgno;
|
||||
key.size = sizeof(recno_t);
|
||||
msgno = 1;
|
||||
if (db->get(db, &key, &data, 0) != 0 ||
|
||||
data.size != sizeof(VMC) - 1 ||
|
||||
memcmp(data.data, VMC, sizeof(VMC) - 1)) {
|
||||
(void)db->close(db);
|
||||
if (first) {
|
||||
first = 0;
|
||||
return (1);
|
||||
}
|
||||
msgq_str(sp, M_ERR, p,
|
||||
"030|The file %s is not a message catalog");
|
||||
return (1);
|
||||
}
|
||||
first = 0;
|
||||
|
||||
if (sp->gp->msg != NULL)
|
||||
(void)sp->gp->msg->close(sp->gp->msg);
|
||||
sp->gp->msg = db;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* msg_close --
|
||||
* Close the message catalogs.
|
||||
*
|
||||
* PUBLIC: void msg_close __P((GS *));
|
||||
*/
|
||||
void
|
||||
msg_close(gp)
|
||||
GS *gp;
|
||||
{
|
||||
if (gp->msg != NULL)
|
||||
(void)gp->msg->close(gp->msg);
|
||||
}
|
||||
|
||||
/*
|
||||
* msg_cont --
|
||||
* Return common continuation messages.
|
||||
*
|
||||
* PUBLIC: const char *msg_cmsg __P((SCR *, cmsg_t, size_t *));
|
||||
*/
|
||||
const char *
|
||||
msg_cmsg(sp, which, lenp)
|
||||
SCR *sp;
|
||||
cmsg_t which;
|
||||
size_t *lenp;
|
||||
{
|
||||
switch (which) {
|
||||
case CMSG_CONF:
|
||||
return (msg_cat(sp, "268|confirm? [ynq]", lenp));
|
||||
case CMSG_CONT:
|
||||
return (msg_cat(sp, "269|Press any key to continue: ", lenp));
|
||||
case CMSG_CONT_EX:
|
||||
return (msg_cat(sp,
|
||||
"270|Press any key to continue [: to enter more ex commands]: ",
|
||||
lenp));
|
||||
case CMSG_CONT_R:
|
||||
return (msg_cat(sp, "161|Press Enter to continue: ", lenp));
|
||||
case CMSG_CONT_S:
|
||||
return (msg_cat(sp, "275| cont?", lenp));
|
||||
case CMSG_CONT_Q:
|
||||
return (msg_cat(sp,
|
||||
"271|Press any key to continue [q to quit]: ", lenp));
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
/*
|
||||
* msg_cat --
|
||||
* Return a single message from the catalog, plus its length.
|
||||
*
|
||||
* !!!
|
||||
* Only a single catalog message can be accessed at a time, if multiple
|
||||
* ones are needed, they must be copied into local memory.
|
||||
*
|
||||
* PUBLIC: const char *msg_cat __P((SCR *, const char *, size_t *));
|
||||
*/
|
||||
const char *
|
||||
msg_cat(sp, str, lenp)
|
||||
SCR *sp;
|
||||
const char *str;
|
||||
size_t *lenp;
|
||||
{
|
||||
GS *gp;
|
||||
DBT data, key;
|
||||
recno_t msgno;
|
||||
|
||||
/*
|
||||
* If it's not a catalog message, i.e. has doesn't have a leading
|
||||
* number and '|' symbol, we're done.
|
||||
*/
|
||||
if (isdigit(str[0]) &&
|
||||
isdigit(str[1]) && isdigit(str[2]) && str[3] == '|') {
|
||||
key.data = &msgno;
|
||||
key.size = sizeof(recno_t);
|
||||
msgno = atoi(str);
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* Really sleazy hack -- we put an extra character on the
|
||||
* end of the format string, and then we change it to be
|
||||
* the nul termination of the string. There ought to be
|
||||
* a better way. Once we can allocate multiple temporary
|
||||
* memory buffers, maybe we can use one of them instead.
|
||||
*/
|
||||
gp = sp == NULL ? NULL : sp->gp;
|
||||
if (gp != NULL && gp->msg != NULL &&
|
||||
gp->msg->get(gp->msg, &key, &data, 0) == 0 &&
|
||||
data.size != 0) {
|
||||
if (lenp != NULL)
|
||||
*lenp = data.size - 1;
|
||||
((char *)data.data)[data.size - 1] = '\0';
|
||||
return (data.data);
|
||||
}
|
||||
str = &str[4];
|
||||
}
|
||||
if (lenp != NULL)
|
||||
*lenp = strlen(str);
|
||||
return (str);
|
||||
}
|
||||
|
||||
/*
|
||||
* msg_print --
|
||||
* Return a printable version of a string, in allocated memory.
|
||||
*
|
||||
* PUBLIC: char *msg_print __P((SCR *, const char *, int *));
|
||||
*/
|
||||
char *
|
||||
msg_print(sp, s, needfree)
|
||||
SCR *sp;
|
||||
const char *s;
|
||||
int *needfree;
|
||||
{
|
||||
size_t blen, nlen;
|
||||
const char *cp;
|
||||
char *bp, *ep, *p, *t;
|
||||
|
||||
*needfree = 0;
|
||||
|
||||
for (cp = s; *cp != '\0'; ++cp)
|
||||
if (!isprint(*cp))
|
||||
break;
|
||||
if (*cp == '\0')
|
||||
return ((char *)s); /* SAFE: needfree set to 0. */
|
||||
|
||||
nlen = 0;
|
||||
if (0) {
|
||||
retry: if (sp == NULL)
|
||||
free(bp);
|
||||
else
|
||||
FREE_SPACE(sp, bp, blen);
|
||||
needfree = 0;
|
||||
}
|
||||
nlen += 256;
|
||||
if (sp == NULL) {
|
||||
if ((bp = malloc(nlen)) == NULL)
|
||||
goto alloc_err;
|
||||
} else
|
||||
GET_SPACE_GOTO(sp, bp, blen, nlen);
|
||||
if (0) {
|
||||
alloc_err: return ("");
|
||||
}
|
||||
*needfree = 1;
|
||||
|
||||
for (p = bp, ep = (bp + blen) - 1, cp = s; *cp != '\0' && p < ep; ++cp)
|
||||
for (t = KEY_NAME(sp, *cp); *t != '\0' && p < ep; *p++ = *t++);
|
||||
if (p == ep)
|
||||
goto retry;
|
||||
*p = '\0';
|
||||
return (bp);
|
||||
}
|
65
contrib/nvi/common/msg.h
Normal file
65
contrib/nvi/common/msg.h
Normal file
@ -0,0 +1,65 @@
|
||||
/*-
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* Copyright (c) 1993, 1994, 1995, 1996
|
||||
* Keith Bostic. All rights reserved.
|
||||
*
|
||||
* See the LICENSE file for redistribution information.
|
||||
*
|
||||
* @(#)msg.h 10.10 (Berkeley) 5/10/96
|
||||
*/
|
||||
|
||||
/*
|
||||
* Common messages (continuation or confirmation).
|
||||
*/
|
||||
typedef enum {
|
||||
CMSG_CONF, CMSG_CONT, CMSG_CONT_EX,
|
||||
CMSG_CONT_R, CMSG_CONT_S, CMSG_CONT_Q } cmsg_t;
|
||||
|
||||
/*
|
||||
* Message types.
|
||||
*
|
||||
* !!!
|
||||
* In historical vi, O_VERBOSE didn't exist, and O_TERSE made the error
|
||||
* messages shorter. In this implementation, O_TERSE has no effect and
|
||||
* O_VERBOSE results in informational displays about common errors, for
|
||||
* naive users.
|
||||
*
|
||||
* M_NONE Display to the user, no reformatting, no nothing.
|
||||
*
|
||||
* M_BERR Error: M_ERR if O_VERBOSE, else bell.
|
||||
* M_ERR Error: Display in inverse video.
|
||||
* M_INFO Info: Display in normal video.
|
||||
* M_SYSERR Error: M_ERR, using strerror(3) message.
|
||||
* M_VINFO Info: M_INFO if O_VERBOSE, else ignore.
|
||||
*
|
||||
* The underlying message display routines only need to know about M_NONE,
|
||||
* M_ERR and M_INFO -- all the other message types are converted into one
|
||||
* of them by the message routines.
|
||||
*/
|
||||
typedef enum {
|
||||
M_NONE = 1, M_BERR, M_ERR, M_INFO, M_SYSERR, M_VINFO } mtype_t;
|
||||
|
||||
/*
|
||||
* There are major problems with error messages being generated by routines
|
||||
* preparing the screen to display error messages. It's possible for the
|
||||
* editor to generate messages before we have a screen in which to display
|
||||
* them, or during the transition between ex (and vi startup) and a true vi.
|
||||
* There's a queue in the global area to hold them.
|
||||
*
|
||||
* If SC_EX/SC_VI is set, that's the mode that the editor is in. If the flag
|
||||
* S_SCREEN_READY is set, that means that the screen is prepared to display
|
||||
* messages.
|
||||
*/
|
||||
typedef struct _msgh MSGH; /* MSGS list head structure. */
|
||||
LIST_HEAD(_msgh, _msg);
|
||||
struct _msg {
|
||||
LIST_ENTRY(_msg) q; /* Linked list of messages. */
|
||||
mtype_t mtype; /* Message type: M_NONE, M_ERR, M_INFO. */
|
||||
char *buf; /* Message buffer. */
|
||||
size_t len; /* Message length. */
|
||||
};
|
||||
|
||||
/* Flags to msgq_status(). */
|
||||
#define MSTAT_SHOWLAST 0x01 /* Show the line number of the last line. */
|
||||
#define MSTAT_TRUNCATE 0x02 /* Truncate the file name if it's too long. */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user