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:
Peter Wemm 1996-11-01 06:45:43 +00:00
parent f1460870b9
commit b8ba871bd9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/vendor/nvi/dist/; revision=19304
413 changed files with 69896 additions and 74858 deletions

160
contrib/nvi/FAQ Normal file
View 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
View 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.

View File

@ -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
View 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.

View 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

View 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
View 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.

View 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 */

View 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
View 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
View 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

View 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
View 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

File diff suppressed because it is too large Load Diff

View 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
View 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
View 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

View 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
View 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

View 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

View 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

View 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
View 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.

View File

@ -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
View 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

View 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"

View 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
=========================

View File

@ -0,0 +1 @@
J.G. Vons <Gert-Jan.Vons@ocegr.fr>

317
contrib/nvi/catalog/english Normal file
View 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

View 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"

View 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
=========================

View File

@ -0,0 +1 @@
Keith Bostic <bostic@cs.berkeley.edu>

317
contrib/nvi/catalog/french Normal file
View File

@ -0,0 +1,317 @@
VI_MESSAGE_CATALOG
Dpassement de longueur de ligneX
impossible de supprimer la ligne %luX
impossible d'ajouter … la ligne %luX
impossible d'insrer devant la ligne %luX
impossible de stocker la ligne %luX
impossible d'obtenir la derniŠre ligneX
Erreur : impossible de rcuprer la ligne %luX
Fichier journalX
Aucune connexion n'tant effectue, impossible d'annulerX
Aucune action … annulerX
Aucune connexion n'tant effectue, impossible d'annulerX
Aucune connexion n'tant effectue, reprise actualise impossibleX
Aucune action … refaireX
%s/%d : Erreur d'criture de journalX
L'entre et la sortie Vi standards doivent ˆtre un terminalX
Marque %s : non dfinieX
Marque %s : la ligne a t supprimeX
Marque %s : la position du curseur n'existe plusX
Erreur : X
nouveau fichierX
le nom a changX
modifiX
non modifiX
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 dfautX
Utilisation : %sX
Dfinition : pas d'option %s : 'tout dfinir' donne toutes les valeurs optionnellesX
Dfinition : option [no]%s ne prend pas de valeurX
Dfinition : l'option %s n'est pas boolenneX
Dfinition : option %s : %sX
Dfinition : option %s : %s : Dpassement de valeurX
Dfinition : option %s : %s n'est pas un nombre valideX
Dfinition : l'option %s n'est pas boolenneX
Les colonnes de l'cran sont trop petites, infrieures … %dX
Les colonnes de l'cran sont trop grandes, suprieures … %dX
Les lignes de l'cran sont trop courtes, infrieures … %dX
Les lignes de l'cran sont trop longues, suprieures … %dX
L'option lisp n'est pas implmenteX
Les messages ne sont pas dsactivs : %sX
Les messages ne sont pas activs : %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 dfaut est videX
Le tampon %s est videX
Les fichiers dont le nom contient des caractŠres de saut de ligne sont irrcuprablesX
Impossible de rcuprer les modifications si la session choueX
Copie en cours du fichier pour rcupration...X
La prservation a chou : %sX
Impossible de rcuprer les modifications si la session choueX
La sauvegarde du fichier a chou : %sX
Copie en cours du fichier pour rcupration...X
Les renseignements sur l'identit %u de l'utilisateur sont introuvablesX
Impossible de verrouiller le fichier de rcuprationX
Dbordement de tampon du fichier de rcuprationX
Fichier de rcuprationX
%s : Fichier de rcupration malformX
%s : Fichier de rcupration malformX
Aucun fichier nomm %s … rcuprer, que vous puissiez lireX
Il existe des versions rcuprables antrieures … ce fichierX
Vous avez d'autres fichiers … rcuprerX
pas d'envoi d'email : %sX
Fichier vide, rien … rechercherX
Fin de fichier atteinte sans trouver le motifX
Pas de motif de recherche prcdentX
Motif introuvableX
Dbut du fichier atteint sans trouver le motifX
La recherche est revenue … son point de dpartX
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 zroX
%s : mauvaise spcification de ligneX
Erreur de tableau de syntaxe interne (%s: %s)X
Utilisation : %sX
%s : tampon temporaire non librX
Dcalage de drapeau hors de la ligne 1X
Dcalage de drapeau hors de la fin du fichierX
@ avec plage, en cours d'excution quand le fichier/l'cran a changX
Commande Global/v en cours d'excution quand le fichier/l'cran a changX
La commande ex a chou : commandes en attente abandonnesX
La commande ex a chou : les touches affectes sont abandonnesX
La deuxiŠme adresse est plus petite que la premiŠreX
Aucun nom de marque fourniX
\\ pas suivi par / ou ?X
Rfrence … un numro de ligne infrieure … 0X
La commande %s est inconnueX
Dpassement de la valeur adresseX
Dpassement ngatif 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'abrviations … afficherX
Les abrviations doivent finir par un caractŠre"motX
Les abrviations ne peuvent pas contenir de tabulations ni d'espacesX
Les abrviations ne peuvent pas contenir un mlange de caractŠres mot/non-mot, sauf … la finX
"%s" n'est pas une abrviationX
La commande Vi a chou : Les touches affectes ont t abandonnesX
Plus de fichiers … diterX
Pas de fichiers prcdents … diterX
Pas de fichiers prcdents … rembobinerX
Pas de liste de fichiers … afficherX
Pas de commande prcdente … 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 rpertoire d'origineX
Nouveau rpertoire en cours : %sX
Pas de tampon de coupure … afficherX
La commande %s ne peut pas ˆtre utilise … l'intrieur d'une commande globale ou commande vX
%s/%s : chec de source : ni vous ni le super-utilisateur n'ˆtes les propritaires X
%s/%s : chec de source : vous n'ˆtes pas le propritaireX
%s/%s : chec de source : peut ˆtre crit par un utilisateur autre que le propritaireX
%s : chec de source : ni vous ni le super-utilisateur n'ˆtes les propritairesX
%s : chec de source : vous n'ˆtes pas le propritaireX
%s : chec de source : peut ˆtre crit par un utilisateur autre que le propritaireX
Pas de lignes suivantes … joindreX
Pas d'entres de mappage d'entreX
Pas d'entres de mappage de commandesX
Le caractŠre %s ne peut pas ˆtre remappX
"%s" n'est pas actuellement mappX
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'intrieur de la plage … dplacerX
La commande ouverte ncessite que l'option ouverte soit dfinieX
La commande ouverte n'est pas encore implmenteX
La prservation de ce fichier est impossibleX
Fichier prservX
%s: tendu dans trop de noms de fichiersX
Vous ne pouvez lire que les fichiers standards et les canaux de transmission nommsX
%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 … excuterX
Option de largeur de dcalage dfinie sur 0X
Compter dpassementX
Compter dpassement ngatifX
Expression standard spcifie; drapeau r superfluX
Vous ne pouvez pas en mode vi, combiner les drapeaux #, l et p avec le drapeau cX
Aucune correspondance trouveX
Aucune marque prcdente entreX
Moins de %s entres 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 Entre pour continuer :X
%s : marque introuvableX
%s : marque corrompue en %sX
%s : le numro de ligne de la marque dpasse la fin du fichierX
La pile de marques est videX
%s : motif de recherche introuvableX
%d fichiers supplmentaires … diterX
Le tampon %s est vide
Confirmer les changements ? [n]X
InterrompuX
Pas de tampon prcdent … excuterX
Pas d'expression standard prcdenteX
La commande %s ncessite qu'un fichier ait dj… t lu en mmoireX
Utilisation : %sX
La commande visuelle ncessite que l'option ouverte soit dfinieX
Fichier videX
Pas de recherche prcdente F, f, T ou tX
%s introuvableX
Pas de fichier prcdent … 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, dcalage de ligne et/ou commande zX
Pas de motif de recherche prcdentX
La recherche est revenue … son point de dpartX
L'abrviation a dpass la limite de l'expansion : caractŠres abandonnsX
CaractŠre non valide ; guillemet pour saisirX
Dj… au dbut de l'insertionX
Plus de caractŠres … effacerX
Dplacement hors de fin de fichierX
Dplacement hors de fin de ligneX
Aucun mouvement de curseur n'a t effectuX
Dj… au dbut du fichierX
Dplacement hors du dbut du fichierX
Dj… dans la premiŠre colonneX
Les tampons doivent ˆtre spcifis avant la commandeX
Dj… … la fin du fichierX
Dj… … la fin de la ligneX
%s n'est pas une commande viX
Utilisation : %sX
Pas de caractŠres … supprimerX
La commande Q ncessite une interface terminal exX
Pas de commande … rpterX
Le fichier est videX
Vous ne pouvez pas utiliser %s comme commande de dplacementX
Dj… en mode commandeX
Le curseur n'est pas dans un motX
Valeur optionnelle de fenˆtre trop grande, maximum est %uX
AjouterX
ChangerX
CommandeX
InsrerX
RemplacerX
Dplacement hors de la fin d'cranX
Dplacement hors du dbut d'cranX
L'cran doit ˆtre suprieur … %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 affichX
L'cran ne peut ˆtre rduit qu'… %d rangsX
L'cran n'est pas auto-rductibleX
L'cran n'est pas auto-extensibleX
Vous ne pouvez pas mettre cet cran en attenteX
Interrompu : les touches affectes ont t abandonnesX
vi : le tampon temporaire n' a pas t librX
Ce terminal n'a pas de touche %sX
Vous ne pouvez spcifier qu'un seul tamponX
Nombre suprieur … %luX
InterrompuX
Impossible de crer un fichier temporaireX
Avertissement : %s n'est pas un fichier standardX
%s dj… 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 rcemment que cet exemplaire; utiliser ! pour outrepasserX
%s: fichier modifi plus rcemment que cet exemplaireX
%s: interdiction d'criture non disponibleX
Ecriture en cours...X
%s: AVERTISSEMENT : FICHIER TRONQUEX
PremiŠre marque de ce groupe dj… 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 propritaireX
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 redmarrX
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 ncessite l'interface de terminal exX
Entre de mode entre ex.X
La commande a chou, aucun fichier n'a encore t lu.X
cont?X
Evnement imprvu de caractŠreX
Evnement imprvu de fin-de-fichierX
Pas de correspondances pour cette requˆteX
Evnement imprvu d'interruptionX
Evnement quitter imprvuX
Evnement imprvu de rafraŒchissementX
La derniŠre marque de ce groupe a dj… t atteinteX
La commande %s ncessite l'interface de terminal exX
Cette forme de %s n'est pas reconnue quand l'option d'dition protge est activeX
Evnement imprvu de chaŒneX
Evnement imprvu de dlai impartiX
Evnement d'criture imprvuX
Les expansions du shell ne sont pas reconnues quand l'option d'dition protge est activeX
La commande %s n'est pas reconnue quand l'option d'dition protge est activeX
Dfinition : l'option %s ne peut pas ˆtre dsactiveX
Affichage trop petit.X
ajoutX
changX
supprimX
jointX
dplacX
dcalX
coupX
ligneX
lignesX
Vi n'a pas t charg avec un interprtateur TclX
Ficher modifi depuis le dernier enregistrement.X
L'expansion du shell a chouX
Pas d'option d'dition %s spcifieX
Vi n'a pas t charg avec un interprtateur PerlX
Pas de commande ex … excuterX
Entrez <CR> pour excuter une commande, :q pour quitterX
Utiliser "cscope help" pour obtenir de l'aideX
Aucune connexion cscope n'est lanceX
%s : type de recherche inconnu : utiliser un des %sX
%d : Il n'existe pas de telle session cscopeX
Dfinition : l'option %s ne peut jamais ˆtre activeX
Dfinition : l'option %s ne peut jamais ˆtre dfinie sur 0X
%s: joints : %lu lignes, %lu caractŠresX
vnement imprvu de redimensionnementX
%d fichiers … diterX

View File

@ -0,0 +1,309 @@
002 "Dpassement de longueur de ligne"
003 "impossible de supprimer la ligne %lu"
004 "impossible d'ajouter … la ligne %lu"
005 "impossible d'insrer devant la ligne %lu"
006 "impossible de stocker la ligne %lu"
007 "impossible d'obtenir la derniŠre ligne"
008 "Erreur : impossible de rcuprer la ligne %lu"
009 "Fichier journal"
010 "Aucune connexion n'tant effectue, impossible d'annuler"
011 "Aucune action … annuler"
012 "Aucune connexion n'tant effectue, impossible d'annuler"
013 "Aucune connexion n'tant effectue, reprise actualise impossible"
014 "Aucune action … refaire"
015 "%s/%d : Erreur d'criture de journal"
016 "L'entre et la sortie Vi standards doivent ˆtre un terminal"
017 "Marque %s : non dfinie"
018 "Marque %s : la ligne a t supprime"
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 dfaut"
032 "Utilisation : %s"
033 "Dfinition : pas d'option %s : 'tout dfinir' donne toutes les valeurs optionnelles"
034 "Dfinition : option [no]%s ne prend pas de valeur"
035 "Dfinition : l'option %s n'est pas boolenne"
036 "Dfinition : option %s : %s"
037 "Dfinition : option %s : %s : Dpassement de valeur"
038 "Dfinition : option %s : %s n'est pas un nombre valide"
039 "Dfinition : l'option %s n'est pas boolenne"
040 "Les colonnes de l'cran sont trop petites, infrieures … %d"
041 "Les colonnes de l'cran sont trop grandes, suprieures … %d"
042 "Les lignes de l'cran sont trop courtes, infrieures … %d"
043 "Les lignes de l'cran sont trop longues, suprieures … %d"
044 "L'option lisp n'est pas implmente"
045 "Les messages ne sont pas dsactivs : %s"
046 "Les messages ne sont pas activs : %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 dfaut est vide"
054 "Le tampon %s est vide"
055 "Les fichiers dont le nom contient des caractŠres de saut de ligne sont irrcuprables"
056 "Impossible de rcuprer les modifications si la session choue"
057 "Copie en cours du fichier pour rcupration..."
058 "La prservation a chou : %s"
059 "Impossible de rcuprer les modifications si la session choue"
060 "La sauvegarde du fichier a chou : %s"
061 "Copie en cours du fichier pour rcupration..."
062 "Les renseignements sur l'identit %u de l'utilisateur sont introuvables"
063 "Impossible de verrouiller le fichier de rcupration"
064 "Dbordement de tampon du fichier de rcupration"
065 "Fichier de rcupration"
066 "%s : Fichier de rcupration malform"
067 "%s : Fichier de rcupration malform"
068 "Aucun fichier nomm %s … rcuprer, que vous puissiez lire"
069 "Il existe des versions rcuprables antrieures … ce fichier"
070 "Vous avez d'autres fichiers … rcuprer"
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 prcdent"
075 "Motif introuvable"
076 "Dbut du fichier atteint sans trouver le motif"
077 "La recherche est revenue … son point de dpart"
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 zro"
084 "%s : mauvaise spcification de ligne"
085 "Erreur de tableau de syntaxe interne (%s: %s)"
086 "Utilisation : %s"
087 "%s : tampon temporaire non libr"
088 "Dcalage de drapeau hors de la ligne 1"
089 "Dcalage de drapeau hors de la fin du fichier"
090 "@ avec plage, en cours d'excution quand le fichier/l'cran a chang"
091 "Commande Global/v en cours d'excution quand le fichier/l'cran a chang"
092 "La commande ex a chou : commandes en attente abandonnes"
093 "La commande ex a chou : les touches affectes sont abandonnes"
094 "La deuxiŠme adresse est plus petite que la premiŠre"
095 "Aucun nom de marque fourni"
096 "\\ pas suivi par / ou ?"
097 "Rfrence … un numro de ligne infrieure … 0"
098 "La commande %s est inconnue"
099 "Dpassement de la valeur adresse"
100 "Dpassement ngatif 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'abrviations … afficher"
106 "Les abrviations doivent finir par un caractŠre"mot"
107 "Les abrviations ne peuvent pas contenir de tabulations ni d'espaces"
108 "Les abrviations ne peuvent pas contenir un mlange de caractŠres mot/non-mot, sauf … la fin"
109 ""%s" n'est pas une abrviation"
110 "La commande Vi a chou : Les touches affectes ont t abandonnes"
111 "Plus de fichiers … diter"
112 "Pas de fichiers prcdents … diter"
113 "Pas de fichiers prcdents … rembobiner"
114 "Pas de liste de fichiers … afficher"
115 "Pas de commande prcdente … 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 rpertoire d'origine"
122 "Nouveau rpertoire en cours : %s"
123 "Pas de tampon de coupure … afficher"
124 "La commande %s ne peut pas ˆtre utilise … l'intrieur d'une commande globale ou commande v"
125 "%s/%s : chec de source : ni vous ni le super-utilisateur n'ˆtes les propritaires "
126 "%s/%s : chec de source : vous n'ˆtes pas le propritaire"
127 "%s/%s : chec de source : peut ˆtre crit par un utilisateur autre que le propritaire"
128 "%s : chec de source : ni vous ni le super-utilisateur n'ˆtes les propritaires"
129 "%s : chec de source : vous n'ˆtes pas le propritaire"
130 "%s : chec de source : peut ˆtre crit par un utilisateur autre que le propritaire"
131 "Pas de lignes suivantes … joindre"
132 "Pas d'entres de mappage d'entre"
133 "Pas d'entres 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'intrieur de la plage … dplacer"
140 "La commande ouverte ncessite que l'option ouverte soit dfinie"
141 "La commande ouverte n'est pas encore implmente"
142 "La prservation de ce fichier est impossible"
143 "Fichier prserv"
144 "%s: tendu dans trop de noms de fichiers"
145 "Vous ne pouvez lire que les fichiers standards et les canaux de transmission nomms"
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 … excuter"
152 "Option de largeur de dcalage dfinie sur 0"
153 "Compter dpassement"
154 "Compter dpassement ngatif"
155 "Expression standard spcifie; drapeau r superflu"
156 "Vous ne pouvez pas en mode vi, combiner les drapeaux #, l et p avec le drapeau c"
157 "Aucune correspondance trouve"
158 "Aucune marque prcdente entre"
159 "Moins de %s entres 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 Entre pour continuer :"
162 "%s : marque introuvable"
163 "%s : marque corrompue en %s"
164 "%s : le numro de ligne de la marque dpasse la fin du fichier"
165 "La pile de marques est vide"
166 "%s : motif de recherche introuvable"
167 "%d fichiers supplmentaires … diter"
168 "Le tampon %s est vide
169 "Confirmer les changements ? [n]"
170 "Interrompu"
171 "Pas de tampon prcdent … excuter"
172 "Pas d'expression standard prcdente"
173 "La commande %s ncessite qu'un fichier ait dj… t lu en mmoire"
174 "Utilisation : %s"
175 "La commande visuelle ncessite que l'option ouverte soit dfinie"
177 "Fichier vide"
178 "Pas de recherche prcdente F, f, T ou t"
179 "%s introuvable"
180 "Pas de fichier prcdent … 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, dcalage de ligne et/ou commande z"
189 "Pas de motif de recherche prcdent"
190 "La recherche est revenue … son point de dpart"
191 "L'abrviation a dpass la limite de l'expansion : caractŠres abandonns"
192 "CaractŠre non valide ; guillemet pour saisir"
193 "Dj… au dbut de l'insertion"
194 "Plus de caractŠres … effacer"
195 "Dplacement hors de fin de fichier"
196 "Dplacement hors de fin de ligne"
197 "Aucun mouvement de curseur n'a t effectu"
198 "Dj… au dbut du fichier"
199 "Dplacement hors du dbut du fichier"
200 "Dj… dans la premiŠre colonne"
201 "Les tampons doivent ˆtre spcifis avant la commande"
202 "Dj… … la fin du fichier"
203 "Dj… … 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 ncessite une interface terminal ex"
208 "Pas de commande … rpter"
209 "Le fichier est vide"
209 "Le fichier est vide"
210 "Vous ne pouvez pas utiliser %s comme commande de dplacement"
211 "Dj… 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 "Insrer"
219 "Remplacer"
220 "Dplacement hors de la fin d'cran"
221 "Dplacement hors du dbut d'cran"
222 "L'cran doit ˆtre suprieur … %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 rduit qu'… %d rangs"
227 "L'cran n'est pas auto-rductible"
228 "L'cran n'est pas auto-extensible"
230 "Vous ne pouvez pas mettre cet cran en attente"
231 "Interrompu : les touches affectes ont t abandonnes"
232 "vi : le tampon temporaire n' a pas t libr"
233 "Ce terminal n'a pas de touche %s"
234 "Vous ne pouvez spcifier qu'un seul tampon"
235 "Nombre suprieur … %lu"
236 "Interrompu"
237 "Impossible de crer un fichier temporaire"
238 "Avertissement : %s n'est pas un fichier standard"
239 "%s dj… 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 rcemment que cet exemplaire; utiliser ! pour outrepasser"
251 "%s: fichier modifi plus rcemment 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 dj… 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 propritaire"
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 redmarr"
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 ncessite l'interface de terminal ex"
273 "Entre de mode entre ex."
274 "La commande a chou, aucun fichier n'a encore t lu."
275 "cont?"
276 "Evnement imprvu de caractŠre"
277 "Evnement imprvu de fin-de-fichier"
278 "Pas de correspondances pour cette requˆte"
279 "Evnement imprvu d'interruption"
280 "Evnement quitter imprvu"
281 "Evnement imprvu de rafraŒchissement"
282 "La derniŠre marque de ce groupe a dj… t atteinte"
283 "La commande %s ncessite l'interface de terminal ex"
284 "Cette forme de %s n'est pas reconnue quand l'option d'dition protge est active"
285 "Evnement imprvu de chaŒne"
286 "Evnement imprvu de dlai imparti"
287 "Evnement d'criture imprvu"
289 "Les expansions du shell ne sont pas reconnues quand l'option d'dition protge est active"
290 "La commande %s n'est pas reconnue quand l'option d'dition protge est active"
291 "Dfinition : l'option %s ne peut pas ˆtre dsactive"
292 "Affichage trop petit."
293 "ajout"
294 "chang"
295 "supprim"
296 "joint"
297 "dplac"
298 "dcal"
299 "coup"
300 "ligne"
301 "lignes"
302 "Vi n'a pas t charg avec un interprtateur 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 spcifie"
306 "Vi n'a pas t charg avec un interprtateur Perl"
307 "Pas de commande ex … excuter"
308 "Entrez <CR> pour excuter une commande, :q pour quitter"
309 "Utiliser "cscope help" pour obtenir de l'aide"
310 "Aucune connexion cscope n'est lance"
311 "%s : type de recherche inconnu : utiliser un des %s"
312 "%d : Il n'existe pas de telle session cscope"
313 "Dfinition : l'option %s ne peut jamais ˆtre active"
314 "Dfinition : l'option %s ne peut jamais ˆtre dfinie sur 0"
315 "%s: joints : %lu lignes, %lu caractŠres"
316 "vnement imprvu de redimensionnement"
317 "%d fichiers … diter"

View 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 rcupration malformX
2 %s: %lu lignes, %lu caractŠresX
2 Aucune connexion n'tant effectue, impossible d'annulerX
2 Copie en cours du fichier pour rcupration...X
2 Dfinition : l'option %s n'est pas boolenneX
2 Impossible de rcuprer les modifications si la session choueX
2 InterrompuX
2 La recherche est revenue … son point de dpartX
2 Pas de motif de recherche prcdentX
3 %s: supprimerX
4 Utilisation : %sX
=========================

317
contrib/nvi/catalog/german Normal file
View 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

View 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"

View 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
=========================

View File

@ -0,0 +1 @@
Bernhard Daeubler <daeb@physik.uni-ulm.de>

View 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

View 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"

View 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
=========================

View File

@ -0,0 +1 @@
Dima Ruban <dima@demos.su>

View 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

View 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"

View 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
=========================

View File

@ -0,0 +1 @@
Dima Ruban <dima@demos.su>

317
contrib/nvi/catalog/spanish Normal file
View 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 despus 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 intrprete 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 intrprete 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

View 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 despus 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 intrprete 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 intrprete 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"

View 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
=========================

View 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
View 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

View 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"

View 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
=========================

View File

@ -0,0 +1 @@
Jan Djarv <jan.djarv@mbox200.swipnet.se>

View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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));
}

View File

@ -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
View 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

View 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
View 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 */
}

View File

@ -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
View 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
View 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;
}

View File

@ -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
View 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);
}

View 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
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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
View 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);
}

View File

@ -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);
}

View 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
View 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
View 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;

View 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"

View File

@ -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;
@ -128,7 +100,7 @@ cut(sp, ep, namep, fm, tm, flags)
append = copy_one = copy_def = 0;
if (namep != NULL) {
name = *namep;
if (LF_ISSET(CUT_NUMREQ) || LF_ISSET(CUT_NUMOPT) &&
if (LF_ISSET(CUT_NUMREQ) || LF_ISSET(CUT_NUMOPT) &&
(LF_ISSET(CUT_LINEMODE) || fm->lno != tm->lno)) {
copy_one = 1;
cb_rotate(sp);
@ -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
View 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
View 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

File diff suppressed because it is too large Load Diff

82
contrib/nvi/common/exf.h Normal file
View 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
View 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
View 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
View 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
View 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);
}

View File

@ -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
View 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
View 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");
}

View File

@ -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
View 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
View 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
View 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
View 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