Update nvi-1.79 to 2.1.1-4334a8297f

This is the gsoc-2011 project to clean up and backport multibyte support
from other nvi forks in a form we can use.

USE_WIDECHAR is on unless building for the rescue crunchgen. This should
allow editing in the native locale encoding.

USE_ICONV depends on make.conf having 'WITH_ICONV=YES' for now.  This
adds the ability to do things like edit a KOI8-R file while having $LANG
set to (say) en_US.UTF-8.  iconv is used to transcode the characters for
display.

Other points:
* It uses gencat and catopen/etc instead of homegrown msg catalog stuff.
* A lot of stuff has been trimmed out, eg: the perl and tcl bindings which
  we could never use in base anyway.
* It uses ncursesw when in widechar mode.  This could be interesting.

GSoC info: http://www.google-melange.com/gsoc/proposal/review/google/gsoc2011/zy/1
Repo at: https://github.com/lichray/nvi2

Obtained from:  Zhihao Yuan <lichray@gmail.com>
This commit is contained in:
peter 2013-08-11 20:03:12 +00:00
parent 324febaf01
commit 5f2a1d6536
269 changed files with 13014 additions and 30422 deletions

View File

@ -1331,7 +1331,8 @@ build-tools: .MAKE
usr.bin/awk \
lib/libmagic \
usr.bin/mkesdb_static \
usr.bin/mkcsmapper_static
usr.bin/mkcsmapper_static \
usr.bin/vi/catalog
${_+_}@${ECHODIR} "===> ${_tool} (obj,build-tools)"; \
cd ${.CURDIR}/${_tool} && \
${MAKE} DIRPRFX=${_tool}/ obj && \

View File

@ -1,160 +0,0 @@
@(#)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.

View File

@ -1,128 +0,0 @@
# @(#)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,14 +1,19 @@
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.
/*-
* $Id: LICENSE,v 8.18 2011/07/10 11:58:35 zy Exp $
*/
The following are the copyrights and redistribution conditions that apply
to this copy of the Vi software.
/*
* Copyright (c) 1991, 1992, 1993, 1994
* The Regents of the University of California. All rights reserved.
* Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996
* Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
* Keith Bostic. All rights reserved.
* Copyright (c) 1999, 2000
* Sven Verdoolaege. All rights reserved.
* Copyright (c) 2011
* Zhihao Yuan. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -18,11 +23,7 @@ to the authors would be appreciated.
* 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
* 3. 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.
*

View File

@ -1,31 +1,32 @@
# @(#)README 8.147 (Berkeley) 10/19/96
# $Id: README,v 9.0 2012/10/07 09:13:54 zy Exp $
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.
This is version 2.1.1 (2012-10-07) of nex/nvi, a reimplementation 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.
The directory layout is as follows:
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.
LICENSE ....... Copyright, use and redistribution information.
README ........ This file.
build ......... Build directory.
catalog ....... Message catalogs; see catalog/README.
cl ............ Vi interface to the curses(3) library.
common ........ Code shared by ex and vi.
docs .......... Ex/vi documentation, both current and historic.
ex ............ Ex source code.
regex ......... Modified regex library with wide character support.
vi ............ Vi source code.
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
o Nvi was written by Keith Bostic, and the last version is 1.79. After that,
Keith Bostic
Sven Verdoolaege added the iconv support and the DB3 locking.
Jun-ichiro itojun Hagino developed the file encoding detection
techniques in his nvi-m17n.
The following acknowledgments were written by Keith Bostic:
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
o This software is several years old and is the product of many folks' work.
@ -63,51 +64,3 @@ o From the original vi acknowledgements, by William Joy and Mark Horton:
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

@ -1,473 +0,0 @@
# $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

@ -1,630 +0,0 @@
# @(#)Makefile.in 8.75 (Berkeley) 10/23/96
srcdir= @srcdir@/..
CC= @CC@
OPTFLAG=@OPTFLAG@
CFLAGS= -c $(OPTFLAG) @CFLAGS@ -I. -I$(srcdir)/include @CPPFLAGS@ -DGTAGS
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) $?

View File

@ -1,369 +0,0 @@
# @(#)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

@ -1,320 +0,0 @@
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

@ -1,82 +0,0 @@
/* @(#)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

View File

@ -1,17 +0,0 @@
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

View File

@ -1,571 +0,0 @@
#! /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

@ -1,179 +0,0 @@
/* 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

View File

@ -1,872 +0,0 @@
#! /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

File diff suppressed because it is too large Load Diff

View File

@ -1,725 +0,0 @@
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)

View File

@ -1,84 +0,0 @@
#! /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

View File

@ -1,238 +0,0 @@
#!/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

@ -1,45 +0,0 @@
/* @(#)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

View File

@ -1,185 +0,0 @@
/* @(#)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

@ -1,49 +0,0 @@
#!/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

@ -1,58 +0,0 @@
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

@ -1,7 +1,8 @@
# @(#)Makefile 8.29 (Berkeley) 10/19/96
# $Id: Makefile,v 9.0 2012/10/19 15:13:11 zy Exp $
CAT= dutch english french german polish ru_SU.KOI8-R spanish swedish
FILES= ../cl/*.c ../common/*.c ../ex/*.c ../tk/*.c ../vi/*.c
CAT= dutch english french german polish ru_RU.KOI8-R spanish swedish \
uk_UA.KOI8-U zh_CN.GB2312
FILES= ../cl/*.c ../common/*.c ../ex/*.c ../vi/*.c
all: dump ${CAT}
@ -18,13 +19,10 @@ ${CAT}: english.base
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/' > $@; \
sed -e '1s/^/$$set 1~$$quote "~/; 1y/~/\n/' | \
gencat $@ /dev/stdin; \
chmod 444 $@; \
if grep DUPLICATE $@ > /dev/null; then \
grep DUPLICATE $@; \
@ -34,7 +32,8 @@ ${CAT}: english.base
fi
CHK= dutch.check english.check french.check german.check \
polish.check ru_SU.KOI8-R.check spanish.check swedish.check
polish.check ru_RU.KOI8-R.check spanish.check swedish.check \
uk_UA.KOI8-U.check zh_CN.GB2312.check
check: ${CHK}
${CHK}: ${CAT}
@echo "... $@"; \
@ -63,19 +62,14 @@ ${CHK}: ${CAT}
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 > $@
-e 's/^"//' |\
sort -nu > $@
dump: dump.c
${CC} -O -o dump dump.c

View File

@ -1,15 +1,9 @@
# @(#)README 8.4 (Berkeley) 11/22/94
# $Id: README,v 9.0 2012/10/19 17:06:15 zy Exp $
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.
Command strings, usage strings, system errors and other 'known text'
are not.
Message catalogs in nvi are fairly simple. Every catalog message
consists of two parts -- an initial number followed by a pipe (`|')
@ -33,19 +27,7 @@ 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.
is a format string that displays two arguments.
Arguments to the msgq function are required to contain ONLY printable
characters. No further translation is done by the msgq routine before
@ -54,14 +36,16 @@ 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:
msg_print() returns a printable version of a string; the third argument
indicates whether the string needs to be freed. For example:
char *p;
int nf;
p = msg_print(sp, file_name);
msgq(sp, M_ERR, M("003", "File: %s"), p);
FREE_SPACE(sp, p, 0);
p = msg_print(sp, file_name, &nf);
msgq(sp, M_ERR, "003|File: %s", p);
if (nf)
FREE_SPACE(sp, p, 0);
makes sure that "file_name" is printable before calling the msgq
routine.
@ -71,63 +55,40 @@ 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
"<language>.base", e.g. the English one is "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"
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"
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.
are the first few lines of the current english.base file.
The second file is the file used by nvi to access messages, and is a list
of the messages, one per line:
Before this file being converted to the second file, the POSIX formatted
message catalog file, by gencat(1), two lines:
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
$set 1
$quote "
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.
will be inserted before the base text to setup the set_id and the quote
character. So the double-quote needs to be escaped by a backslash to be
included in a message; same as the backslash itself.
These files are named for their language, e.g. "vi_english". The second
files are automatically created from the first files.
These files are named for their language, e.g. "english". However, a
locale(1) name is also recommended.
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:
Copy the file english.base to a file that you can modify , e.g. "cp
english.base german.base". For each of the messages in the file,
replace the message with the string that you want to use. If you have
doubts about the meaning of a message, just email me.
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.
A latest english.base can be created from source 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
@ -156,11 +117,11 @@ 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.
directory that contains a message catalog "$LC_MESSAGES", which is set
through the LC_MESSAGES environment variable but returned by setlocale(3).
Check the output of locale(1) to validate such a value. 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

@ -105,10 +105,10 @@ main(argc, argv)
for (; *argv != NULL; ++argv) {
if ((fp = fopen(*argv, "r")) == NULL) {
perror(*argv);
exit (1);
return (1);
}
parse(fp);
(void)fclose(fp);
}
exit (0);
return (0);
}

View File

@ -1,317 +0,0 @@
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

@ -43,8 +43,7 @@
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"
047 "De %s 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"
@ -97,16 +96,16 @@
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"
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"
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"
115 "Geen voorgaand commando om \"!\" te vervangen"
116 "Geen bestandsnaam voor %%"
117 "Geen bestandsnaam voor #"
118 "Fout: execl: %s"
@ -119,14 +118,14 @@
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""
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"
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. "
@ -296,7 +295,7 @@
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"
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"

View File

@ -1,37 +0,0 @@
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

@ -1,317 +0,0 @@
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

@ -1,309 +0,0 @@
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

@ -1,36 +0,0 @@
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

@ -1,317 +0,0 @@
VI_MESSAGE_CATALOG
Dépassement de longueur de ligneX
impossible de supprimer la ligne %luX
impossible d'ajouter à la ligne %luX
impossible d'insérer devant la ligne %luX
impossible de stocker la ligne %luX
impossible d'obtenir la dernière ligneX
Erreur : impossible de récupérer la ligne %luX
Fichier journalX
Aucune journalisation n'étant effectuée, impossible d'annulerX
Aucune action à annulerX
Aucune journalisation n'étant effectuée, impossible d'annulerX
Aucune journalisation n'étant effectuée, reprise actualisée impossibleX
Aucune action à refaireX
%s/%d : Erreur d'écriture de journalX
L'entrée et la sortie Vi standards doivent être un terminalX
Marque %s : non définieX
Marque %s : la ligne a été suppriméeX
Marque %s : la position du curseur n'existe plusX
Erreur : X
nouveau fichierX
le nom a changéX
modifiéX
non modifiéX
DÉVERROUILLÉX
lecture seuleX
ligne %lu de %lu [%ld%%]X
fichier videX
ligne %luX
Ce fichier %s n'est pas un catalogue de messagesX
Impossible de configurer option %s par défautX
Utilisation : %sX
Définition : pas d'option %s : 'set all' donne toutes les valeurs optionnellesX
Définition : option [no]%s ne prend pas de valeurX
Définition : l'option %s n'est pas booléenneX
Définition : option %s : %sX
Définition : option %s : %s : Dépassement de valeurX
Définition : option %s : %s n'est pas un nombre valideX
Définition : l'option %s n'est pas booléenneX
Les colonnes de l'écran sont trop petites, inférieures à %dX
Les colonnes de l'écran sont trop grandes, supérieures à %dX
Les lignes de l'écran sont trop courtes, inférieures à %dX
Les lignes de l'écran sont trop longues, supérieures à %dX
L'option lisp n'est pas implémentéeX
Les messages ne sont pas désactivés : %sX
Les messages ne sont pas activés : %sX
L'option de paragraphe doit être en groupe de deux caractèresX
L'option de section doit être en groupe de deux caractèresX
Le tampon par défaut est videX
Le tampon %s est videX
Les fichiers dont le nom contient des caractères de saut de ligne sont irrécupérablesX
Impossible de récupérer les modifications si la session échoueX
Copie en cours du fichier pour récupération...X
La préservation a échoué : %sX
Impossible de récupérer les modifications si la session échoueX
La sauvegarde du fichier a échoué : %sX
Copie en cours du fichier pour récupération...X
Les renseignements sur l'identité %u de l'utilisateur sont introuvablesX
Impossible de verrouiller le fichier de récupérationX
Débordement de tampon du fichier de récupérationX
Fichier de récupérationX
%s : Fichier de récupération malforméX
%s : Fichier de récupération malforméX
Aucun fichier nommé %s à récupérer, que vous puissiez lireX
Il existe des versions récupérables antérieures à ce fichierX
Vous avez d'autres fichiers à récupérerX
pas d'envoi d'email : %sX
Fichier vide, rien à rechercherX
Fin de fichier atteinte sans trouver le motifX
Pas de motif de recherche précédentX
Motif introuvableX
Début du fichier atteint sans trouver le motifX
La recherche est revenue à son point de départX
Recherche en cours...X
Caractère non-imprimable introuvableX
Nom de commande inconnuX
%s : Commande non disponible en ex modeX
Le compteur ne peut être zéroX
%s : mauvaise spécification de ligneX
Erreur de tableau de syntaxe interne (%s: %s)X
Utilisation : %sX
%s : tampon temporaire non libéréX
Décalage de drapeau hors de la ligne 1X
Décalage de drapeau hors de la fin du fichierX
@ avec plage, en cours d'exécution quand le fichier/l'écran a changéX
Commande Global/v en cours d'exécution quand le fichier/l'écran a changéX
La commande ex a échoué : commandes en attente abandonnéesX
La commande ex a échoué : les touches affectées sont abandonnéesX
La deuxième adresse est plus petite que la premièreX
Aucun nom de marque fourniX
\\ non suivi par / ou ?X
Référence à un numéro de ligne inférieure à 0X
La commande %s est inconnueX
Dépassement de la valeur adresseX
Dépassement négatif de la valeur adresseX
Combinaison d'adresse non valideX
Adresse non valide : il n'y a que %lu lignes dans ce fichierX
Adresse non valide : le fichier est videX
La commande %s ne permet pas une adresse de 0X
Pas d'abréviations à afficherX
Les abréviations doivent finir par un caractère"motX
Les abréviations ne peuvent pas contenir de tabulations ni d'espacesX
Les abréviations ne peuvent pas contenir un mélange de caractères mot/non-mot, sauf à la finX
"%s" n'est pas une abréviationX
La commande Vi a échoué : Les touches affectées ont été abandonnéesX
Plus de fichiers à éditerX
Pas de fichiers précédents à éditerX
Pas de fichiers précédents à rembobinerX
Pas de liste de fichiers à afficherX
Pas de commande précédente à remplacer"!"X
Pas de nom de fichier à substituer à %%X
Pas de nom de fichier à substituer à #X
Erreur : execl : %sX
Erreur E/S : %sX
Fichier modifié depuis la dernière écriture complète ; écrire ou utiliser ! pour outrepasserX
Impossible de trouver l'emplacement du répertoire d'origineX
Nouveau répertoire en cours : %sX
Pas de tampon de coupure à afficherX
La commande %s ne peut pas être utilisée à l'intérieur d'une commande globale ou commande vX
%s/%s : échec de source : ni vous ni le super-utilisateur n'êtes les propriétaires X
%s/%s : échec de source : vous n'êtes pas le propriétaireX
%s/%s : échec de source : peut être écrit par un utilisateur autre que le propriétaireX
%s : échec de source : ni vous ni le super-utilisateur n'êtes les propriétairesX
%s : échec de source : vous n'êtes pas le propriétaireX
%s : échec de source : peut être écrit par un utilisateur autre que le propriétaireX
Pas de lignes suivantes à joindreX
Pas d'entrées de mappage d'entréeX
Pas d'entrées de mappage de commandesX
Le caractère %s ne peut pas être remappéX
"%s" n'est pas actuellement mappéX
Les noms de marque ne doivent avoir qu'un caractèreX
%s existe, non enregistré; utiliser ! pour outrepasserX
Nouveau fichier exrc : %sX
La ligne de destination est à l'intérieur de la plage à déplacerX
La commande ouverte nécessite que l'option ouverte soit définieX
La commande ouverte n'est pas encore implémentéeX
La préservation de ce fichier est impossibleX
Fichier préservéX
%s: étendu dans trop de noms de fichiersX
Vous ne pouvez lire que les fichiers standards et les canaux de transmission nommésX
%s: Interdiction de lecture non disponibleX
Lecture en cours...X
%s: %lu lignes, %lu caractèresX
Pas d'écrans d'arrière-plan à afficherX
La commande script n'est disponible qu'en mode viX
Pas de commande à exécuterX
Option de largeur de décalage définie sur 0X
Compter dépassementX
Compter dépassement négatifX
Expression standard spécifiée; drapeau r superfluX
Vous ne pouvez pas en mode vi, combiner les drapeaux #, l et p avec le drapeau cX
Aucune correspondance trouvéeX
Aucune marque précédente entréeX
Moins de %s entrées dans la pile de marques ; utilisez t[ags]X
Pas de fichier %s vers lequel retourner dans la pile de marques ; utiliser : affichage t[ags]X
Appuyez sur Entrée pour continuer :X
%s : marque introuvableX
%s : marque corrompue en %sX
%s : le numéro de ligne de la marque dépasse la fin du fichierX
La pile de marques est videX
%s : motif de recherche introuvableX
%d fichiers supplémentaires à éditerX
Le tampon %s est vide
Confirmer les changements ? [n]X
InterrompuX
Pas de tampon précédent à exécuterX
Pas d'expression standard précédenteX
La commande %s nécessite qu'un fichier ait déjà été lu en mémoireX
Utilisation : %sX
La commande visual nécessite que l'option open soit définieX
Fichier videX
Pas de recherche précédente F, f, T ou tX
%s introuvableX
Pas de fichier précédent à éditerX
Le curseur n'est pas dans un nombreX
Le nombre obtenu est trop grandX
Le nombre obtenu est trop petitX
Pas de correspondance de caractère sur cette ligneX
Caractère correspondant introuvableX
Pas de caractères à remplacerX
Pas d'autre écran vers lequel basculerX
Caractères après la chaîne de recherche, décalage de ligne et/ou commande zX
Pas de motif de recherche précédentX
La recherche est revenue à son point de départX
L'abréviation a dépassé la limite de l'expansion : caractères abandonnésX
Caractère non valide ; guillemet pour saisirX
Déjà au début de l'insertionX
Plus de caractères à effacerX
Déplacement hors de fin de fichierX
Déplacement hors de fin de ligneX
Aucun mouvement de curseur n'a été effectuéX
Déjà au début du fichierX
Déplacement hors du début du fichierX
Déjà dans la première colonneX
Les tampons doivent être spécifiés avant la commandeX
Déjà à la fin du fichierX
Déjà à la fin de la ligneX
%s n'est pas une commande viX
Utilisation : %sX
Pas de caractères à supprimerX
La commande Q nécessite une interface terminal exX
Pas de commande à répéterX
Le fichier est videX
Vous ne pouvez pas utiliser %s comme commande de déplacementX
Déjà en mode commandeX
Le curseur n'est pas dans un motX
Valeur optionnelle de fenêtre trop grande, maximum est %uX
AjouterX
ChangerX
CommandeX
InsérerX
RemplacerX
Déplacement hors de la fin d'écranX
Déplacement hors du début d'écranX
L'écran doit être supérieur à %d lignes pour se fractionnerX
Il n'y a pas d'écran d'arrière-planX
Il n'y a pas d'écran d'arrière-plan qui édite un fichier nommé %sX
Vous ne pouvez pas mettre à l'arrière-plan votre seul écran affichéX
L'écran ne peut être réduit qu'à %d rangsX
L'écran n'est pas auto-réductibleX
L'écran n'est pas auto-extensibleX
Vous ne pouvez pas mettre cet écran en attenteX
Interrompu : les touches affectées ont été abandonnéesX
vi : le tampon temporaire n' a pas été libéréX
Ce terminal n'a pas de touche %sX
Vous ne pouvez spécifier qu'un seul tamponX
Nombre supérieur à %luX
InterrompuX
Impossible de créer un fichier temporaireX
Avertissement : %s n'est pas un fichier standardX
%s déjà verrouillé, session en lecture seuleX
%s: supprimerX
%s: fermerX
%s: supprimerX
%s: supprimerX
Fichier en lecture seule, non écrit, utiliser ! pour outrepasserX
Fichier en lecture seule, non écritX
%s existe, non écrit; utiliser ! pour outrepasserX
%s existe, non écritX
Fichier partiel, non écrit; utiliser ! pour outrepasserX
Fichier partiel, non écritX
%s: fichier modifié plus récemment que cet exemplaire; utiliser ! pour outrepasserX
%s: fichier modifié plus récemment que cet exemplaireX
%s: interdiction d'écriture non disponibleX
Ecriture en cours...X
%s: AVERTISSEMENT : FICHIER TRONQUÉX
Première marque de ce groupe déjà atteinteX
%s: nouveau fichier : %lu lignes, %lu caractèresX
%s: %lu lignes, %lu caractèresX
%s étendue à trop de noms de fichiersX
%s: pas un fichier standardX
%s: ne vous appartient pasX
%s: accessible par un utilisateur autre que son propriétaireX
Fichier modifé depuis la dernière écriture complète ; écrire ou utiliser ! pour outrepasser X
Fichier modifé depuis la dernière écriture complète ; écrire ou utiliser :edit! pour outrepasserX
Fichier modifé depuis la dernière écriture complète ; écrire ou utiliser ! pour outrepasserX
Fichier temporaire ; quitter annulera les modificationsX
Fichier en lecture seule ; les modifications ne sont pas écrites automatiquementX
Journal redémarréX
confirmer ? [ynq]X
Appuyez sur n'importe quelle touche pour continuer : X
Appuyez sur n'importe quelle touche pour continuer [: pour entrer plus de commandes ex] : X
Appuyez sur n'importe quelle touche pour continuer [q pour Quitter]: X
Cette forme de %s nécessite l'interface de terminal exX
Entrée de mode entrée ex.X
La commande a échoué, aucun fichier n'a encore été lu.X
cont?X
Evénement imprévu de caractèreX
Evénement imprévu de fin-de-fichierX
Pas de correspondances pour cette requêteX
Evénement imprévu d'interruptionX
Evénement quitter imprévuX
Evénement imprévu de rafraîchissementX
La dernière marque de ce groupe a déjà été atteinteX
La commande %s nécessite l'interface de terminal exX
Cette forme de %s n'est pas reconnue quand l'option d'édition protégée est activéeX
Evénement imprévu de chaîneX
Evénement imprévu de délai impartiX
Evénement d'écriture imprévuX
Les expansions du shell ne sont pas reconnues quand l'option d'édition protégée est activéeX
La commande %s n'est pas reconnue quand l'option d'édition protégée est activéeX
Définition : l'option %s ne peut pas être désactivéeX
Affichage trop petit.X
ajoutéX
changéX
suppriméX
jointX
déplacéX
décaléX
coupéX
ligneX
lignesX
Vi n'a pas été chargé avec un interprétateur TclX
Ficher modifié depuis le dernier enregistrement.X
L'expansion du shell a échouéX
Pas d'option d'édition %s spécifiéeX
Vi n'a pas été chargé avec un interprétateur PerlX
Pas de commande ex à exécuterX
Entrez <CR> pour exécuter une commande, :q pour quitterX
Utiliser "cscope help" pour obtenir de l'aideX
Aucune connexion cscope n'est lancéeX
%s : type de recherche inconnu : utiliser un des %sX
%d : Il n'existe pas de telle session cscopeX
Définition : l'option %s ne peut jamais être activéeX
Définition : l'option %s ne peut jamais être définie sur 0X
%s: joints : %lu lignes, %lu caractèresX
événement imprévu de redimensionnementX
%d fichiers à éditerX

View File

@ -43,8 +43,7 @@
044 "L'option lisp n'est pas implémentée"
045 "Les messages ne sont pas désactivés : %s"
046 "Les messages ne sont pas activés : %s"
048 "L'option de paragraphe doit être en groupe de deux caractères"
049 "L'option de section doit être en groupe de deux caractères"
047 "L'option de %s doit être en groupe de deux caractères"
053 "Le tampon par défaut est vide"
054 "Le tampon %s est vide"
055 "Les fichiers dont le nom contient des caractères de saut de ligne sont irrécupérables"
@ -97,16 +96,16 @@
103 "Adresse non valide : le fichier est vide"
104 "La commande %s ne permet pas une adresse de 0"
105 "Pas d'abréviations à afficher"
106 "Les abréviations doivent finir par un caractère"mot"
106 "Les abréviations doivent finir par un caractère \"mot\""
107 "Les abréviations ne peuvent pas contenir de tabulations ni d'espaces"
108 "Les abréviations ne peuvent pas contenir un mélange de caractères mot/non-mot, sauf à la fin"
109 ""%s" n'est pas une abréviation"
109 "\"%s\" n'est pas une abréviation"
110 "La commande Vi a échoué : Les touches affectées ont été abandonnées"
111 "Plus de fichiers à éditer"
112 "Pas de fichiers précédents à éditer"
113 "Pas de fichiers précédents à rembobiner"
114 "Pas de liste de fichiers à afficher"
115 "Pas de commande précédente à remplacer"!""
115 "Pas de commande précédente à remplacer \"!\""
116 "Pas de nom de fichier à substituer à %%"
117 "Pas de nom de fichier à substituer à #"
118 "Erreur : execl : %s"
@ -126,7 +125,7 @@
132 "Pas d'entrées de mappage d'entrée"
133 "Pas d'entrées de mappage de commandes"
134 "Le caractère %s ne peut pas être remappé"
135 ""%s" n'est pas actuellement mappé"
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"
@ -200,7 +199,6 @@
207 "La commande Q nécessite une interface terminal ex"
208 "Pas de commande à répéter"
209 "Le fichier est vide"
209 "Le fichier est vide"
210 "Vous ne pouvez pas utiliser %s comme commande de déplacement"
211 "Déjà en mode commande"
212 "Le curseur n'est pas dans un mot"
@ -293,12 +291,11 @@
302 "Vi n'a pas été chargé avec un interprétateur Tcl"
303 "Ficher modifié depuis le dernier enregistrement."
304 "L'expansion du shell a échoué"
304 "L'expansion du shell a échoué"
305 "Pas d'option d'édition %s spécifiée"
306 "Vi n'a pas été chargé avec un interprétateur Perl"
307 "Pas de commande ex à exécuter"
308 "Entrez <CR> pour exécuter une commande, :q pour quitter"
309 "Utiliser "cscope help" pour obtenir de l'aide"
309 "Utiliser \"cscope help\" pour obtenir de l'aide"
310 "Aucune connexion cscope n'est lancée"
311 "%s : type de recherche inconnu : utiliser un des %s"
312 "%d : Il n'existe pas de telle session cscope"

View File

@ -1,34 +0,0 @@
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
=========================

View File

@ -1,317 +0,0 @@
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

@ -1,67 +1,66 @@
002 "Zeilenlaengen Ueberlauf"
003 "kann Zeile %lu nicht loeschen"
004 "kann an Zeile %lu nicht anfuegen"
005 "kann in Zeile %lu nicht einfuegen"
002 "Zeilenlängen-Überlauf"
003 "kann Zeile %lu nicht löschen"
004 "kann an Zeile %lu nicht anfügen"
005 "kann in Zeile %lu nicht einfügen"
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"
010 "Keine Protokollierung aktiv, Rückgängigmachen nicht möglich"
011 "Keine Änderungen rückgängig zu machen"
012 "Keine Protokollierung aktiv, Rückgängigmachen nicht möglich"
013 "Keine Protokollierung aktiv, Wiederholung von Änderungen nicht möglich"
014 "Keine Änderungen zu wiederholen"
015 "%s/%d: Protokollschreibfehler"
016 "Vi's Standardein- und ausgabe muss ein Terminal sein"
016 "Vi's Standardein- und -ausgabe muß ein Terminal sein"
017 "Marke %s: nicht gesetzt"
018 "Marke %s: die Zeile wurde geloescht"
018 "Marke %s: die Zeile wurde gelöscht"
019 "Marke %s: Cursorposition existiert nicht mehr"
020 "Fehler: "
021 "neue Datei"
022 "Name geaendert"
023 "geaendert"
024 "nicht geaendert"
025 "NICHT GELOCKED"
022 "Name geändert"
023 "geändert"
024 "nicht geändert"
025 "NICHT GELOCKT"
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"
031 "Setzen der Voreinstellung für %s Option nicht möglich"
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"
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"
037 "set: %s Option: %s: Werte-Überlauf"
038 "set: %s Option: %s ist eine ungültige Zahl"
039 "set: %s ist keine Boolsche Option"
040 "Bildschirm hat zu wenig Spalten, weniger als %d"
041 "Bildschirm hat zu viele Spalten, mehr als %d"
042 "Bildschirm hat zu wenig Zeilen, weniger als %d"
043 "Bildschirm hat zu viele Zeilen, mehr als %d"
044 "Die lisp-Option ist nicht implementiert"
045 "Meldungen nicht abgeschaltet: %s"
046 "Meldungen nicht eingeschaltet: %s"
047 "Die %s-Option muß 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 ..."
056 "Änderungen nicht wiederherstellbar, falls die Editorsitzung schiefgeht"
057 "kopiere Datei für Wiederherstellung ..."
058 "Rettungsmechanismus funktioniert nicht: %s"
059 "Aenderungen nicht wiederherstellbar falls die Editorsitzung schief geht"
059 "Änderungen nicht wiederherstellbar, falls die Editorsitzung schiefgeht"
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"
061 "kopiere Datei für Wiederherstellung ..."
062 "Informationen über den Benutzer mit id %u nicht gefunden"
063 "Wiederherstellungsdatei kann nicht gelockt werden"
064 "Puffer der Wiederherstellungsdatei übergelaufen"
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"
069 "Es gibt ältere 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"
@ -69,110 +68,110 @@
074 "Kein altes Suchmuster"
075 "Suchmuster nicht gefunden"
076 "Dateianfang erreicht, ohne das Suchmuster zu finden"
077 "Suche umgeschlagen"
077 "Suche beginnt von vorn"
078 "suche ..."
079 "Keine nichtdruckbaren Zeichen gefunden"
080 "Unbekannter Kommandoname"
082 "%s: Kommando im ex Modus nicht verfuegbar"
083 "Count darf nicht Null sein"
082 "%s: Kommando im ex-Modus nicht verfügbar"
083 "Anzahl darf nicht Null sein"
084 "%s: falsche Zeilenangabe"
085 "Interner Syntaxtabellenfehler (%s: %s)"
086 "Benutzung: %s"
087 "%s: temporaerer Puffer nicht freigegeben"
087 "%s: temporärer 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"
090 "@ mit Bereich lief, als Datei/Anzeige geändert wurde"
091 "globales oder v-Kommando lief, als Datei/Anzeige geändert wurde"
092 "Ex-Kommando mißlungen: restliche Kommandoeingabe ignoriert"
093 "Ex-Kommando mißlungen: umdefinierte Tasten ungültig"
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"
099 "Adreßwert zu groß"
100 "Adreßwert zu klein"
101 "Ungültige Adreßkombination"
102 "Ungültige Adresse: nur %lu Zeilen in der Datei"
103 "Ungültige 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"
105 "Keine Abkürzungen zum Anzeigen"
106 "Abkürzungen müssen mit einem \"Wort\"-Zeichen enden"
107 "Abkürzungen dürfen keine Tabulator- oder Leerzeichen enthalten"
108 "In Abkürzungen dürfen außer am Ende Wort- und Nicht-Wort-Zeichen nicht gemischt werden"
109 "\"%s\" ist keine Abkürzung"
110 "Vi Kommando mißlungen: umdefinierte Tasten ungültig"
111 "Keine weiteren Dateien zu editieren"
112 "Keine vorhergehenden Dateien zu editieren"
113 "Keine vorhergehenden Dateien für rewind"
114 "Keine Dateiliste zum Anzeigen"
115 "Kein vorhergehendes Kommando um "!" zu ersetzen"
116 "Kein Dateiname fuer %%"
117 "Kein Dateiname fuer #"
115 "Kein vorhergehendes Kommando, um \"!\" zu ersetzen"
116 "Kein Dateiname für %%"
117 "Kein Dateiname für #"
118 "Fehler: execl: %s"
119 "I/O Fehler: %s"
120 "Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorieren"
119 "E/A-Fehler: %s"
120 "Datei wurde seit dem letzten vollständigen Schreiben geändert; 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"
125 "%s/%s: nicht gelesen: gehört weder Ihnen noch root"
126 "%s/%s: nicht gelesen: gehört nicht Ihnen"
127 "%s/%s: nicht gelesen: anderer Benutzer als Eigentümer hat Schreibrecht"
128 "%s: nicht gelesen: gehört weder Ihnen noch root"
129 "%s: nicht gelesen: gehört nicht Ihnen"
130 "%s: nicht gelesen: anderer Benutzer als Eigentümer hat Schreibrecht"
131 "Keine folgenden Zeilen zum Verbinden"
132 "Kein Eingabe-Map Eintrag"
133 "Kein Kommando-Map Eintrag"
132 "Kein input-Map Eintrag"
133 "Kein command-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"
135 "\"%s\" ist momentan nicht gemappt"
136 "Markennamen müssen einzelne Buchstaben sein"
137 "%s existiert, nicht geschrieben; verwende ! zum Überschreiben"
138 "Neue .exrc Datei: %s. "
139 "Zielzeile ist innerhalb des Verschiebebereichs"
140 "Das open Kommando verlangt, dass die open Option gesetzt ist"
140 "Das open Kommando verlangt, daß die open Option gesetzt ist"
141 "Das open Kommando ist nocht nicht implementiert"
142 "Rettung dieser Datei nicht moeglich"
142 "Rettung dieser Datei nicht möglich"
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"
145 "Nur reguläre Dateien und named pipes können gelesen werden"
146 "%s: Locken zum Lesen war nicht möglich"
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"
149 "Keine Hintergrundanzeigen vorhanden"
150 "Das script Kommando ist nur im vi Modus verfügbar"
151 "Kein Kommando auszuführen"
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"
153 "Anzahl-Überlauf"
154 "Anzahl-Unterlauf"
155 "Regulärer Ausdruck angegeben; r Flag bedeutungslos"
156 "Die #, l und p Flags können im vi Modus nicht mit dem c Flag kombiniert werden"
157 "Keine Übereinstimmung gefunden"
158 "Kein vorhergehender 'tag' angegeben"
159 "Weniger als %s Eintraege auf dem 'tag'-Stack; verwende :display t[ags]"
159 "Weniger als %s Einträge 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: "
161 "Drücke 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"
167 "%d weitere Dateien zu editieren"
168 "Puffer %s ist leer"
169 "Bestaetige Aenderung [n]"
169 "Bestätige Änderung [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"
171 "Kein vorhergehender Puffer zum Ausführen"
172 "Kein vorhergehender regulärer Ausdruck"
173 "Das Kommando %s verlangt, daß bereits eine Datei eingelesen wurde"
174 "Benutzung: %s"
175 "Das visual Kommando verlangt dass die open Option gesetzt ist"
175 "Das visual Kommando verlangt daß 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"
180 "Keine vorhergehende Datei zu editieren"
181 "Cursor nicht auf einer Zahl"
182 "Sich ergebende Zahl ist zu gross"
182 "Sich ergebende Zahl ist zu groß"
183 "Sich ergebende Zahl ist zu klein"
184 "Kein korrespondierendes Zeichen in dieser Zeile"
185 "Korrespondierendes Zeichen nicht gefunden"
@ -180,11 +179,11 @@
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"
190 "Suche zur ursprünglichen Position zurückgekehrt"
191 "Abkürzung überschreitet Expansionsgrenze: Zeichen weggelassen"
192 "Nicht erlaubtes Zeichen; maskiere zum Eingeben"
193 "Bereits am Anfang der Eingabe"
194 "Keine weiteren Zeichen zu loeschen"
194 "Keine weiteren Zeichen zu löschen"
195 "Bewegung hinter das Dateiende"
196 "Bewegung hinter das Zeilenende"
197 "Keine Cursorbewegung gemacht"
@ -196,73 +195,73 @@
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"
206 "Keine Zeichen zu löschen"
207 "Das Q Kommando benötigt 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"
214 "Wert der Window Option ist zu groß, max ist %u"
215 "Anhängen"
216 "Ändern"
217 "Kommando"
218 "Einfuegen"
218 "Einfügen"
219 "Ersetzen"
220 "Bewegung hinter das Anzeigenende"
221 "Bewegung vor den Anzeigenanfang"
222 "Anzeige muss zum Zerlegen groesser als %d sein"
222 "Anzeige muß für Bildschirmteilung größer als %d sein"
223 "Keine Hintergrundanzeigen vorhanden"
224 "Es gibt keine Hintergrundanzeige die eine Datei namens %s ediert"
224 "Es gibt keine Hintergrundanzeige, die eine Datei namens %s editiert"
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"
228 "Die Anzeige kann nicht vergrößert werden"
230 "Diese Anzeige kann nicht gestopt werden"
231 "Unterbrochen: umdefinierte Tasten ungültig"
232 "vi: temporärer Puffer nicht freigegeben"
233 "Dieses Terminal hat keine %s Taste"
234 "es kann nur ein Puffer angegeben werden"
235 "Zahl groesser als %lu"
235 "Zahl größer 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"
237 "Nicht möglich, temporäre Datei anzulegen"
238 "Warnung: %s ist keine reguläre Datei"
239 "%s ist bereits gelockt, Editorsitzung schreibgeschützt"
240 "%s: löschen"
241 "%s: schließen"
242 "%s: löschen"
243 "%s: löschen"
244 "Datei nicht schreibbar, nicht geschrieben; verwende ! zum Überschreiben"
245 "Datei nicht schreibbar, nicht geschrieben"
246 "%s existiert, nicht geschrieben; verwende ! zum Überschreiben"
247 "%s existiert, nicht geschrieben"
248 "Teil der Datei, nicht geschrieben; verwende ! zum Ueberschreiben"
248 "Teil der Datei, nicht geschrieben; verwende ! zum Überschreiben"
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"
250 "%s: Datei wurde später als diese Kopie verändert; verwende ! zum Überschreiben"
251 "%s: Datei wurde später als diese Kopie verändert"
252 "%s: Locken zum Schreiben war nicht möglich"
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"
259 "%s: keine reguläre Datei"
260 "%s: gehört nicht Ihnen"
261 "%s: anderer Benutzer als Eigentümer hat Zugriff"
262 "Datei wurde seit dem letzten vollständigen Schreiben geändert; schreibe oder verwende ! zum ignorieren"
263 "Datei wurde seit dem letzten vollständigen Schreiben geändert; schreibe oder verwende :edit! zum ignorieren"
264 "Datei wurde seit dem letzten vollständigen Schreiben geändert; schreibe oder verwende ! zum ignorieren"
265 "Datei ist temporär; beim Verlassen gehen die Änderungen verloren"
266 "Datei ist schreibgeschützt, Änderungen 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"
268 "bestätigen [ynq]"
269 "Drücke beliebige Taste um fortzufahren"
270 "Drücke beliebige Taste um fortzufahren [: um weitere Kommandos einzugeben]: "
271 "Drücke beliebige Taste um fortzufahren [q zum Verlassen]: "
272 "Diese Form von %s benötigt das ex Terminal-Interface"
273 "Gehe in ex Eingabe-Modus.\n"
274 "Kommando schief gelaufen, noch keine Datei eingelesen"
274 "Kommando schiefgelaufen, noch keine Datei eingelesen"
275 " weiter?"
276 "unerwartetes Zeichen - Ereignis"
277 "unerwartetes Dateiende - Ereignis"
@ -271,18 +270,18 @@
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"
283 "Das %s Kommando benötigt das ex Terminal-Interface"
284 "Diese Form von %s wird nicht unterstützt 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"
289 "Shell Expandierungen nicht unterstützt wenn die 'secure edit' - Option gesetzt ist"
290 "Das %s Kommando wird nicht unterstützt wenn die 'secure edit' - Option gesetzt ist"
291 "set: %s kann nicht ausgeschaltet werden"
292 "Anzeige zu klein."
293 "angefuegt"
294 "geaendert"
295 "geloescht"
293 "angefügt"
294 "geändert"
295 "gelöscht"
296 "verbunden"
297 "verschoben"
298 "geschoben"
@ -290,18 +289,18 @@
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"
303 "Datei wurde seit dem letzten Schreiben verändert."
304 "Shell Expansion hat nicht geklappt"
305 "Es ist keine %s Editieroption 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"
307 "Kein ex Kommando auszuführen"
308 "Drücke <CR> um ein Kommando auszuführen, :q zum verlassen"
309 "Verwende \"cscope help\" für 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"
315 "%s: angefügt: %lu Zeilen, %lu Zeichen"
316 "unerwartetes Größenveränderungs - Ereignis"
317 "%d Dateien zu edieren"

View File

@ -1,36 +0,0 @@
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

@ -1 +1,2 @@
Bernhard Daeubler <daeb@physik.uni-ulm.de>
Bernhard Daeubler <daeb@physik.uni-ulm.de>
Joerg Wunsch <joerg_wunsch@uriah.heep.sax.de>

View File

@ -1,317 +0,0 @@
VI_MESSAGE_CATALOG
Zbyt długa liniaX
nie można usunąć linii %luX
nie można dodać do linii %luX
nie można wstawić w linii %luX
nie można zachować linii %luX
nie można pobrać ostatniej liniiX
Błąd: nie można pobrać linii %luX
Plik loguX
Brak logowania, anulowanie (undo) niemożliweX
Brak zmian do anulowaniaX
Brak logowania, anulowanie (undo) niemożliweX
Brak logowania, nie można przeglądać do przoduX
Brak zmian do powtórzeniaX
%s/%d: błąd zapisu do loguX
Standardowe wejście i wyjście vi musi być terminalemX
Znacznik %s: nie ustawionyX
Znacznik %s: linia została usuniętaX
Znacznik %s: pozycja kursora już nie istniejeX
Błąd: X
nowy plikX
nazwa została zmienionaX
zmienionyX
nie zmienionyX
ODBLOKOWANYX
tylko do odczytuX
linia %lu z %lu [%ld%%]X
pusty plikX
linia %luX
Plik %s nie jest katalogiem komunikatówX
Nie można ustawić domyślnej opcji %sX
Sposób użycia: %sX
set: brak opcji %s: 'set all' wyświetla wartości opcjiX
set: opcja no]%s nie pobiera wartościX
set: opcja %s nie jest zmienną boolowskąX
set: opcja %s: %sX
set: opcja %s: %s: przepełnienieX
set: opcja %s: %s nie jest poprawną liczbąX
set: opcja %s nie jest zmienną boolowskąX
Zbyt mała liczba kolumn ekranu, mniejsza niż %dX
Zbyt duża liczba kolumn, większa niż %dX
Zbyt mała liczba wierszy ekranu, mniejsza niż %dX
Zbyt duża liczba wierszy ekranu, większa niż %dX
Opcja lisp nie jest zaimplementowanaX
komunikaty nie wyłączone: %sX
komunikaty nie włączone: %sX
Opcja paragraph musi składać się z dwóch grup symboliX
Opcja section musi składać się z dwóch grup symboliX
Domyślny bufor jest pustyX
Bufor %s jest pustyX
Pliki z symbolem nowego wiersza w nazwie nie mogą być odtworzoneX
Zmiany nie do odtworzenia, jeśli sesja zostanie przerwanaX
Tworzenie kopii zapasowej...X
Błąd podczas zachowywania: %sX
Zmiany nie do odtworzenia, jeśli sesja zostanie przerwanaX
Błąd podczas tworzenia kopii zapasowej: %sX
Tworzenie kopii zapasowej...X
Nie znaleziono informacji o użytkowniku numer %uX
Nie można zablokować kopii zapasowejX
Przepełnienie bufora kopii zapasowejX
Kopia zapasowaX
%s: błędna kopia zapasowaX
%s: błędna kopia zapasowaX
Brak plików o nazwie %s, które mógłbyś odczytać, do odzyskaniaX
Istnieją starsze wersje tego pliku, które można odzyskaćX
Istnieją inne pliki, które można odzyskaćX
nie wysyłam poczty: %sX
Pusty plik; nie ma czego szukaćX
Dotarto do końca pliku bez znalezienia szukanego wzorcaX
Brak poprzedniego wzorca poszukiwańX
Nie znaleziono wzorcaX
Dotarto do początku pliku bez znalezienia szukanego wzorcaX
Poszukiwanie od początkuX
Szukam...X
Nie znaleziono niedrukowalnych znakówX
Nieznana nazwa poleceniaX
%s: polecenie niedostępne w trybie edytora exX
Liczba nie może być zeremX
%s: błędny numer liniiX
Wewnętrzny błąd tablicy składni (%s: %s)X
Sposób użycia: %sX
%s: tymczasowy bufor nie został zwolnionyX
Przesunięcie przed linię 1X
Przesunięcie poza koniec plikuX
@ with range running when the file/screen changedX
Wykonywano polecenie globalne/wizualne podczas zmiany pliku/ekranuX
Błąd polecenie ex: pozostałe polecenia anulowaneX
Błąd polecenia ex: mapowanie klawiszy anulowaneX
Drugi adres jest mniejszy od pierwszegoX
Nie podano nazwy znacznikaX
\\ bez / lub ?X
Odniesienie do linii o numerze mniejszym od 0X
Nieznane polecenie %sX
Przepełnienie wartości adresuX
Niedomiar wartości adresuX
Niedozwolona kombinacja adresuX
Niedozwolony adres: jest tylko %lu linii w plikuX
Niedozwolony adres: plik jest pustyX
Polecenie %s nie zezwala na użycie adresu 0X
Brak skrótów do wyświetleniaX
Skróty muszą się kończyć symbolem "słowo"X
Skróty nie mogą zawierać spacji lub tabulacjiX
Skróty nie mogą przeplatać symboli słowo/nie-słowo, z wyjątkiem na końcu liniiX
"%s" nie jest skrótemX
Błąd polecenia vi: mapowanie klawiszy odrzuconeX
Nie ma więcej plików do edycjiX
Nie ma poprzednich plików do edycjiX
Nie ma poprzednich plików do przewinięcia wsteczX
Nie ma listy plików do wyświetleniaX
Nie ma poprzedniego polecenia do zastąpienia "!"X
Nie ma nazwy pliku do zastąpienia %%X
Nie ma nazwy pliku do zastąpienia #X
Błąd: execl: %sX
Błąd I/O: %sX
Plik zmodyfikowany od ostatniego zapisu; zapisz lub użyj ! żeby wymusićX
Nie mozna znaleźć katalogu domowego (home)X
Nowy katalog bieżący: %sX
Nie ma buforów edycji do wyświetleniaX
Polecenie %s nie może być użyte jako część polecenia globalnego lub wizualnegoX
%s/%s: nie wczytany: nie należy do ciebie ani do rootaX
%s/%s: nie wczytany: nie należy do ciebieX
%s/%s: nie wczytany: inny użytkownik niż właściciel ma prawo do zapisuX
%s: nie wczytany: nie należy do ciebie ani do rootaX
%s: nie wczytany: nie należy do ciebieX
%s: nie wczytany: inny uzytkownik niż właściciel ma prawo do zapisuX
Brak kolejnych linii do połączeniaX
Brak pozycji map wejściowychX
Brak pozycji map poleceńX
Znak %s nie może być przemapowanyX
"%s" obecnie nie jest mapowanyX
Nazwa znacznika musi być pojedyńczą literąX
%s istnieje, nie zapisany; użyj ! żeby wymusićX
Nowy plik exrc: %sX
Linia docelowa jest wewnątrz przenoszonego obszaruX
Polecenie open wymaga ustawienia opcji openX
Polecenie open jest niezaimplementowaneX
Niemożliwe jest zachowanie tego plikuX
Plik zachowanyX
%s: rozwija się na zbyt wiele nazw plikówX
Tylko zwykłe pliki i nazwane łącza (named pipes) można czytaćX
%s: nie można założyć blokady do odczytuX
Czytanie...X
%s: %lu linii, %lu znakówX
Brak ekranów w tle do wyświetleniaX
Polecenie script dostępne jest tylko w trybie viX
Brak polecenia do wykonaniaX
Opcja shiftwidth ustawiona na 0X
Przepełnienie licznikaX
Niedomiar licznikaX
Podano wyrażenie regularne; flaga r nie ma znaczeniaX
Flagi #, l oraz p nie mogą być łączone z flagą c w trybie viX
Nie znaleziono wzorcaX
Brak poprzedniego znacznikaX
Mniej niż %s na stosie znaczników; użyj :display t[ags]X
Brak pliku %s na stosie znaczników do powrotu; użyj :display t[ags]X
Naciśnij Enter: X
%s: znacznik nie znalezionyX
%s: błędny znacznik w %sX
%s: numer linii znacznika wykracza poza koniec plikuX
Stos znaczników jest pustyX
%s: nie znaleziono szukanego wzorcaX
%d plików jeszcze do edycjiX
Bufor %s jest pustyX
Potwierdzasz zmianę? [n]X
PrzerwanyX
Brak poprzedniego bufora do wykonaniaX
Brak poprzedniego wyrażenia regularnegoX
Polecenie %s wymaga uprzedniego wczytania plikuX
Sposób użycia: %sX
Polecenie wizualne wymaga ustawienia opcji openX
Pusty plikX
Brak poprzedniego szukania F, f, T lub tX
%s nie znalezionoX
Brak poprzedniego pliku do edycjiX
Kursor nie na liczbieX
Liczba wynikowa zbyt dużaX
Liczba wynikowa zbyt małaX
Brak pasujących znaków w tej liniiX
Nie znaleziono pasujących znakówX
Brak znaków do zamianyX
Brak innego ekranu do przełączeniaX
Znaki poza napisem do szukania, przesunięciem linii i/lub poleceniem zX
Brak poprzedniego wzorca szukaniaX
Szukanie wróciło do pierwotnej pozycjiX
Skrót przekroczył limit rozwinięcia: część znaków odrzuconoX
Niedozwolony znak; zacytuj, żeby wprowadzićX
Już na początku wstawianiaX
Brak kolejnych znaków do usunięciaX
Przesunięcie poza koniec plikuX
Przesunięcie poza koniec liniiX
Nie wykonano przesunięcia kursoraX
Już na początku plikuX
Przesunięcie przed początek plikuX
Już w pierwszej kolumnieX
Należy podać bufory przed poleceniemX
Już na końcu plikuX
Już na końcu liniiX
%s nie jest poleceniem viX
Sposób użycia: %sX
Brak znaków do usunięciaX
Polecenie Q wymaga interfejsu terminala exX
Brak polecenia do powtórzeniaX
Plik jest pustyX
%s nie może być użyte jako polecenie przesunięciaX
Już w trybie poleceńX
Kursor nie na słowieX
Wartości opcji okna zbyt duże, max to %uX
DołączX
ZmieńX
PolecenieX
WstawX
ZamieńX
Przesunięcie poza koniec ekranuX
Przesunięcie przed początek ekranuX
Ekran musi mieć więcej niż %d linii, żeby go podzielićX
Brak ekranów w tleX
Nie ma ekranu w tle z edycją pliku o nazwie %sX
Nie można schować w tle jedynego ekranu edycyjnegoX
Można zmniejszyć ekran tylko do %d wierszyX
Ekran nie może być zmniejszonyX
Ekran nie może być zwiększonyX
Ekran nie może być zawieszonyX
Przerwano: odrzucono mapowane klawiszeX
vi: nie zwolniono bufora tymczasowegoX
Ten terminal nie posiada klawisza %sX
Można podać tylko jeden buforX
Liczba większa niż %luX
PrzerwanoX
Nie można utworzyć pliku tymczasowegoX
Uwaga: %s nie jest zwykłym plikiemX
%s już zablokowany, sesja tylko do odczytuX
%s: usuńX
%s: zamknijX
%s: usuńX
%s: usuńX
Plik tylko do odczytu, nie zapisany; użyj ! żeby wymusićX
Plik tylko do odczytu, nie zapisanyX
%s istnieje, nie zapisany; użyj ! żeby wymusićX
%s istnieje, nie zapisanyX
Plik częściowy, nie zapisany; użyj ! żeby wymusićX
Plik częściowy, nie zapisanyX
%s: plik zmodyfikowany później, niż ta kopia; użyj ! żeby wymusićX
%s: plik zmodyfikowany później, niż ta kopiaX
%s: nie można zablokować do pisaniaX
Zapisywanie...X
%s: OSTRZEŻENIE: PLIK ZOSTAŁ OBCIĘTYX
Już przy pierwszym znaczniku z tej grupyX
%s: nowy plik: %lu linii, %lu znakówX
%s: %lu linii, %lu znakówX
%s rozwija się na zbyt wiele nazw plikówX
%s: nie jest zwykłym plikiemX
%s: nie jesteś właścicielemX
%s: dostępny dla użytkownika innego niż właścicielX
Plik zmodyfikowany od ostatniego zapisu; zapisz lub użyj ! żeby wymusićX
Plik zmodyfikowany od ostatniego zapisu; zapisz lub użyj :edit! żeby wymusićX
Plik zmodyfikowany od ostatniego zapisu; zapisz lub użyj ! żeby wymusićX
To jest plik tymczasowy; wyjście anuluje zmianyX
Plik tylko do odczytu, nie ma autozapisu zmianX
Ponownie rozpoczęto logowanieX
potwierdzasz? [ynq]X
Naciśnij dowolny klawisz: X
Naciśnij dowolny klawisz [: żeby podać następne polecenia ex]: X
Naciśnij dowolny klawisz [q żeby zakończyć]: X
Ta forma %s wymaga interfejsu terminala exX
Wchodzę w tryb wprowadzania ex.X
Błąd polecenia, jeszcze nie wczytano pliku.X
dalej?X
Nieoczekiwany symbolX
Nieoczekiwany koniec plikuX
Brak wzorców pasujących do zapytaniaX
Nieoczekiwane przerwanieX
Nieoczekiwane polecenie koniecX
Nieoczekiwane polecenie odświeżeniaX
Już przy ostatnim znaczniku z tej grupyX
Polecenie %s wymaga interfejsu terminala exX
Ta forma %s jest niedostępna, kiedy ustawiona jest opcja bezpiecznej edycjiX
Nieoczekiwany ciąg znakówX
Nieoczekiwany timeoutX
Nieoczekiwane polecenie zapisuX
Rozwinięcia shella niedostępne w trybie bezpiecznej edycjiX
Polecenie %s jest niedostępne w trybie bezpiecznej edycjiX
set: opcji %s nie można wyłączyćX
Ekran zbyt mały.X
dodanoX
zmienionoX
usuniętoX
połączonoX
przeniesionoX
przesuniętoX
wczytanoX
liniaX
liniiX
Vi nie został uruchomiony z interpreterem TclX
Plik zmodyfikowany od ostatniego zapisuX
Błąd rozwinięcia shellaX
Brak opcji %s edycjiX
Vi nie został uruchomiony z interpreterem PerlX
Brak polecenia ex do wykonaniaX
Naciśnij <CR> żeby wykonac polecenie, :q żeby wyjśćX
Użyj "cscope help" w celu uzyskania pomocyX
Brak aktywnych połączeń cscopeX
%s: nieznany typ poszukiwań: użyj jednego z %sX
%d: brak takiej sesji cscopeX
set: nie można nigdy włączyć opcji %sX
set: opcja %s nie może nigdy mieć wartości 0X
%s: dodano: %lu linii, %lu znakówX
Nieoczekiwane polecenie zmiany rozmiaruX
%d plików do edycjiX

View File

@ -43,8 +43,7 @@
044 "Opcja lisp nie jest zaimplementowana"
045 "komunikaty nie wyłączone: %s"
046 "komunikaty nie włączone: %s"
048 "Opcja paragraph musi składać się z dwóch grup symboli"
049 "Opcja section musi składać się z dwóch grup symboli"
047 "Opcja %s musi składać się z dwóch grup symboli"
053 "Domyślny bufor jest pusty"
054 "Bufor %s jest pusty"
055 "Pliki z symbolem nowego wiersza w nazwie nie mogą być odtworzone"
@ -97,16 +96,16 @@
103 "Niedozwolony adres: plik jest pusty"
104 "Polecenie %s nie zezwala na użycie adresu 0"
105 "Brak skrótów do wyświetlenia"
106 "Skróty muszą się kończyć symbolem "słowo""
106 "Skróty muszą się kończyć symbolem \"słowo\""
107 "Skróty nie mogą zawierać spacji lub tabulacji"
108 "Skróty nie mogą przeplatać symboli słowo/nie-słowo, z wyjątkiem na końcu linii"
109 ""%s" nie jest skrótem"
109 "\"%s\" nie jest skrótem"
110 "Błąd polecenia vi: mapowanie klawiszy odrzucone"
111 "Nie ma więcej plików do edycji"
112 "Nie ma poprzednich plików do edycji"
113 "Nie ma poprzednich plików do przewinięcia wstecz"
114 "Nie ma listy plików do wyświetlenia"
115 "Nie ma poprzedniego polecenia do zastąpienia "!""
115 "Nie ma poprzedniego polecenia do zastąpienia \"!\""
116 "Nie ma nazwy pliku do zastąpienia %%"
117 "Nie ma nazwy pliku do zastąpienia #"
118 "Błąd: execl: %s"
@ -126,7 +125,7 @@
132 "Brak pozycji map wejściowych"
133 "Brak pozycji map poleceń"
134 "Znak %s nie może być przemapowany"
135 ""%s" obecnie nie jest mapowany"
135 "\"%s\" obecnie nie jest mapowany"
136 "Nazwa znacznika musi być pojedyńczą literą"
137 "%s istnieje, nie zapisany; użyj ! żeby wymusić"
138 "Nowy plik exrc: %s"
@ -296,7 +295,7 @@
306 "Vi nie został uruchomiony z interpreterem Perl"
307 "Brak polecenia ex do wykonania"
308 "Naciśnij <CR> żeby wykonac polecenie, :q żeby wyjść"
309 "Użyj "cscope help" w celu uzyskania pomocy"
309 "Użyj \"cscope help\" w celu uzyskania pomocy"
310 "Brak aktywnych połączeń cscope"
311 "%s: nieznany typ poszukiwań: użyj jednego z %s"
312 "%d: brak takiej sesji cscope"

View File

@ -1,35 +0,0 @@
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 istnieje, nie zapisany; użyj ! żeby wymusićX
2 %s: %lu linii, %lu znakówX
2 %s: błędna kopia zapasowaX
2 Brak logowania, anulowanie (undo) niemożliweX
2 Bufor %s jest pustyX
2 Nie znaleziono wzorcaX
2 Przesunięcie poza koniec plikuX
2 Tworzenie kopii zapasowej...X
2 Zmiany nie do odtworzenia, jeśli sesja zostanie przerwanaX
2 set: opcja %s nie jest zmienną boolowskąX
3 %s: usuńX
3 Plik zmodyfikowany od ostatniego zapisu; zapisz lub użyj ! żeby wymusićX
4 Sposób użycia: %sX
=========================

View File

@ -1,267 +0,0 @@
VI_MESSAGE_CATALOG
Переполнение значения длины строкиX
невозможно удалить строку %luX
невозможно добавить к строке %luX
невозможно вставить в строку %luX
невозможно сохранить строку %luX
невозможно достать последнюю строкуX
Файл записейX
Записи не велись, невозможно отменить последнюю командуX
Нет изменений для отменыX
Записи не велись, невозможно отменить последнюю командуX
Записи не велись, невозможно просмотреть впередX
Нет изменений для переделкиX
%s/%d: ошибка при записи протоколаX
Стандартный ввод/вывод для VI должен быть терминалX
Отметка %s: не установленаX
Отметка %s: строка была удаленаX
Отметка %s: позиции курсора больше не существуетX
Ошибка: X
Файл %s не является каталогом сообщенийX
Невозможно установить опцию %s по умолчаниюX
Использование: %sX
Опции %s нет: 'set all' показывает все возможные опцииX
set: [no]%s не принимает такого значенияX
set: %s опция не является логическойX
set: неправильное значение %sX
set: %s опция не является логическойX
Количество колонок экрана слишком мало, меньше чем %dX
Количество колонок экрана слишком велико, больше чем %dX
Количество строк экрана слишком мало, меньше чем %dX
Количество строк экрана слишком велико, больше чем %dX
Опция lisp отсутствуетX
Сообщения не выключены: %sX
Сообщения не включены: %sX
Опция paragraph должна состоять из групп с двумя символамиX
Опция section должна состоять из групп с двумя символамиX
Стартовый буфер пустX
Буфер %s пустX
Файлы с символами перевода строки в имени не могут быть восстановленыX
Изменения не сохранены при крахе сессииX
Сохранение не удалось: %sX
Изменения не сохраняются при обрыве сессииX
Сохранение копии файла не удалось: %sX
Информации на пользователя %u не найденоX
Невозможно защитить спасенный файлX
Буфер восстановленного файла переполненX
Восстановленный файлX
%s: не до конца восстановленный файлX
%s: не до конца восстановленный файлX
Файлов с именем %s, которые Вы можете читать, не существуетX
Есть старые версии файла, которые можно восстановитьX
Существуют другие файлы, которые можно восстановитьX
е-mail не послан: %sX
Файл пуст - искать нечегоX
Достигнут конец файла без нахождения образца поискаX
Не задан образец поискаX
Образец поиска не найденX
Доступно начало файла без нахождения образца поискаX
Поиск зацикленX
Непечатных символов не найденоX
Неизвестная командаX
%s: команда не доступна в режиме exX
Счетчик не может быть нулемX
%s: неправильное указание строкиX
Внутренняя ошибка в синтаксисе (%s: %s)X
Использование: %sX
%s: временный буфер не использованX
Метка поставлена перед строкой 1X
Метка поставлена после конца файлаX
Команда ex не удалась: последующие команды забытыX
Второй адрес меньше чем первыйX
Не указано название отметкиX
\\ не завершается / или ?X
Ссылка к строке с номером меньше 0X
Команда %s неизвестнаX
Переполнение значения адресаX
Недобор значения адресаX
Недопустимая комбинация в адресеX
Неправильный адрес: всего %lu строк в файлеX
Неправильный адрес: файл пустX
Команда %s не может использовать адрес 0X
Аббревиатуры отсутствуютX
Аббревиатуры должны заканчиваться символом "word"X
Аббревиатуры не могут содержать символы табуляции или пробелыX
Аббревиатуры не могут сочетаться с символами слов/не-слов, за исключением конца строкиX
"%s" не является аббревиатуройX
Файлов для редактирования больше нетX
Отсутствие предыдущего файла для редактированияX
Отсутствие предыдущего файла для просмотра назадX
Нет файловX
Отсутствие предыдущей команды для замены "!"X
Отсутствие замены для %%X
Отсутствие замены для #X
Ошибка: execl: %sX
Ошибка ввода/вывода: %sX
Файл изменен с момента последней полной записи: используйте ! для обходаX
Невозможно найти домашний каталогX
Новый каталог: %sX
Нет вырезанных буферовX
Команда %s не может быть использована внутри глобальной или v командыX
%s/%s: не открыт: не принадлежит Вам или root-уX
%s/%s: не открыт: не принадлежит ВамX
%s/%s: не открыт: возможность записи у пользователя, не являющегося владельцемX
%s: не считан: не принадлежит Вам или root-уX
%s: не считан: не принадлежит ВамX
%s: не считан: возможность записи у пользователя, не являющегося владельцемX
Последующие строки отсутствуютX
Отсутствие параметров вводаX
Отсутствие параметров командыX
Символ %s не может быть переназначенX
"%s" на данный момент не назначенX
Имя метки должно быть одним символомX
%s существует, не записан; используйте ! для обходаX
Новый файл exrc: %sX
Строка переноса находится внутри параметров переносаX
Команда open подразумевает установку опции openX
Команда open не реализованаX
Защита файла невозможнаX
Файл защищенX
%s расширился в слишком большое количество имен файловX
%s: защита на чтение была недоступнаX
%s: %lu строк, %lu символовX
Нет теневых оконX
Команда script используется только в режиме viX
Нет команды для исполненияX
Опция shiftwidth установлена на 0X
Переполнение счетчикаX
Цикл выполнен не до концаX
Указано регулярное выражение: флаг r не нуженX
Флаги #, l и p не могут быть объединены с флагом c в режиме viX
Совпадений нетX
Метка отсутствуетX
В стеке меток записей меньше, чем %s, используйте :display t[ags]X
Файла с именем %s в стеке меток нет; используйте :display t[ags]X
%s: метка не найденаX
%s: плохая метка в %sX
Стек меток пустX
%s: образец поиска не найденX
Буфер %s пустX
ПрерваноX
Отсутствие буфера для использованияX
Нет предыдущего регулярного выраженияX
Команда %s подразумевает наличие прочтенного файлаX
Использование: %sX
Команда visual подразумевает обязательную установку опции openX
Пустой файлX
Нет предыдущего поиска F, f, T, или tX
%s не найденоX
Нет предыдущего файла для редактированияX
Курсор стоит не на цифреX
Полученное число слишком великоX
Полученное число слишком малоX
Подходящего символа нет на этой строкеX
Подходящий символ не найденX
Нет символов для удаленияX
Другого экрана не существуетX
Символы после строки для поиска, смещения строки и/или команды zX
Прошлый образец поиска отсутствуетX
Поиск завершился на начальной позицииX
Символ неправилен; квотируйте для вводаX
Уже на начале вставкиX
Нет символов для удаленияX
Передвижение за конец файлаX
Передвижение за конец строкиX
Движение строки не сделаноX
Уже на начале файлаX
Движение курсора за начало файлаX
Уже в первой колонкеX
Буферы должны быть указаны до выполнения командыX
Уже на конце файлаX
Уже на конце строкиX
%s не является командой VIX
Использование: %sX
Нет символов для удаленияX
Нет команды для повтораX
Команда %s не может быть использована как команда перемещенияX
Уже в командном режимеX
Значение опции windows слишком велико, максимальное значение = %uX
Движение курсора за конец экранаX
Движение курсора за начало экранаX
Теневых окон нетX
Не существует теневого окна с редактированием файла %sX
Вы не можете сделать единственное окно теневымX
Экран может быть сжатX
Экран не может быть сжат только до %d строкX
Экран не может быть расширенX
Данный тип терминала не имеет клавиши %sX
Невозможно создать временный файлX
Внимание: %s специальный файлX
%s уже заблокирован, доступен только на чтениеX
%s: удаленX
%s: закрытX
%s: удаленX
%s: удаленX
Файл только для чтения, не записан: Используйте ! для обходаX
Файл только для чтения, не записанX
%s существует, не записан; используйте ! для обходаX
%s существует, не записанX
Используйте ! для частичной записи файлаX
Часть файла, файл не записанX
%s: Файл изменялся позднее, чем данная копия: используйте ! для обходаX
%s: Файл изменялся позднее, чем данная копияX
%s: защита на запись была недоступнаX
%s: ВНИМАНИЕ: ФАЙЛ УСЕЧЕНX
%s: новый файл: %lu строк, %lu символовX
%s: %lu строк, %lu символовX
%s расширился в слишком большое количество имен файловX
%s: специальный файлX
%s: не принадлежит ВамX
%s: доступен не только ВамX
Файл изменен со времени последней записи: сохраните или используйте ! для обходаX
Файл изменен со времени последней записи: сохраните или используйте :edit для обходаX
Файл изменен со времени последней записи: сохраните или используйте ! для обходаX
Файл временный: выход сотрет любые измененияX
Записи начаты зановоX

View File

@ -4,6 +4,7 @@
005 "невозможно вставить в строку %lu"
006 "невозможно сохранить строку %lu"
007 "невозможно достать последнюю строку"
008 "Ошибка: не удалось получить строку %lu"
009 "Файл записей"
010 "Записи не велись, невозможно отменить последнюю команду"
011 "Нет изменений для отмены"
@ -16,12 +17,23 @@
018 "Отметка %s: строка была удалена"
019 "Отметка %s: позиции курсора больше не существует"
020 "Ошибка: "
021 "новый файл"
022 "имя изменено"
023 "модифицировано"
024 "не модифицировано"
025 "РАЗБЛОКИРОВАНО"
026 "только чтение"
027 "строка %lu из %lu [%ld%%]"
028 "пустой файл"
029 "строка %lu"
030 "Файл %s не является каталогом сообщений"
031 "Невозможно установить опцию %s по умолчанию"
032 "Использование: %s"
033 "Опции %s нет: 'set all' показывает все возможные опции"
034 "set: [no]%s не принимает такого значения"
035 "set: %s опция не является логической"
036 "set: %s опция: %s"
037 "set: %s опция: %s: значение переполнения"
038 "set: неправильное значение %s"
039 "set: %s опция не является логической"
040 "Количество колонок экрана слишком мало, меньше чем %d"
@ -31,15 +43,16 @@
044 "Опция lisp отсутствует"
045 "Сообщения не выключены: %s"
046 "Сообщения не включены: %s"
048 "Опция paragraph должна состоять из групп с двумя символами"
049 "Опция section должна состоять из групп с двумя символами"
047 "Опция %s должна состоять из групп с двумя символами"
053 "Стартовый буфер пуст"
054 "Буфер %s пуст"
055 "Файлы с символами перевода строки в имени не могут быть восстановлены"
056 "Изменения не сохранены при крахе сессии"
057 "Копирование файла для восстановления..."
058 "Сохранение не удалось: %s"
059 "Изменения не сохраняются при обрыве сессии"
060 "Сохранение копии файла не удалось: %s"
061 "Копирование файла для восстановления..."
062 "Информации на пользователя %u не найдено"
063 "Невозможно защитить спасенный файл"
064 "Буфер восстановленного файла переполнен"
@ -56,6 +69,7 @@
075 "Образец поиска не найден"
076 "Доступно начало файла без нахождения образца поиска"
077 "Поиск зациклен"
078 "Поиск..."
079 "Непечатных символов не найдено"
080 "Неизвестная команда"
082 "%s: команда не доступна в режиме ex"
@ -66,7 +80,10 @@
087 "%s: временный буфер не использован"
088 "Метка поставлена перед строкой 1"
089 "Метка поставлена после конца файла"
090 "@ с диапазоном выполняется когда файл/экран изменены"
091 "Глобальная/v команда выполняется когда файл/экран изменены"
092 "Команда ex не удалась: последующие команды забыты"
093 "Команда ex не удалась: назначенные клавиши забыты"
094 "Второй адрес меньше чем первый"
095 "Не указано название отметки"
096 "\\ не завершается / или ?"
@ -79,15 +96,16 @@
103 "Неправильный адрес: файл пуст"
104 "Команда %s не может использовать адрес 0"
105 "Аббревиатуры отсутствуют"
106 "Аббревиатуры должны заканчиваться символом "word""
106 "Аббревиатуры должны заканчиваться символом \"слов\""
107 "Аббревиатуры не могут содержать символы табуляции или пробелы"
108 "Аббревиатуры не могут сочетаться с символами слов/не-слов, за исключением конца строки"
109 ""%s" не является аббревиатурой"
109 "\"%s\" не является аббревиатурой"
110 "Vi команда не удалась: назначенные клавиши забыты"
111 "Файлов для редактирования больше нет"
112 "Отсутствие предыдущего файла для редактирования"
113 "Отсутствие предыдущего файла для просмотра назад"
114 "Нет файлов"
115 "Отсутствие предыдущей команды для замены "!""
115 "Отсутствие предыдущей команды для замены \"!\""
116 "Отсутствие замены для %%"
117 "Отсутствие замены для #"
118 "Ошибка: execl: %s"
@ -107,7 +125,7 @@
132 "Отсутствие параметров ввода"
133 "Отсутствие параметров команды"
134 "Символ %s не может быть переназначен"
135 ""%s" на данный момент не назначен"
135 "\"%s\" на данный момент не назначен"
136 "Имя метки должно быть одним символом"
137 "%s существует, не записан; используйте ! для обхода"
138 "Новый файл exrc: %s"
@ -117,7 +135,9 @@
142 "Защита файла невозможна"
143 "Файл защищен"
144 "%s расширился в слишком большое количество имен файлов"
145 "Только обычные файлы или именованные каналы могут быть прочитаны"
146 "%s: защита на чтение была недоступна"
147 "Чтение..."
148 "%s: %lu строк, %lu символов"
149 "Нет теневых окон"
150 "Команда script используется только в режиме vi"
@ -131,11 +151,15 @@
158 "Метка отсутствует"
159 "В стеке меток записей меньше, чем %s, используйте :display t[ags]"
160 "Файла с именем %s в стеке меток нет; используйте :display t[ags]"
161 "Нажмите Enter чтобы продолжить: "
162 "%s: метка не найдена"
163 "%s: плохая метка в %s"
164 "%s: номер строки метки вышел за конец файла"
165 "Стек меток пуст"
166 "%s: образец поиска не найден"
167 "еще %d файлов для редактирования"
168 "Буфер %s пуст"
169 "Подтвердить изменения? [n]"
170 "Прервано"
171 "Отсутствие буфера для использования"
172 "Нет предыдущего регулярного выражения"
@ -156,6 +180,7 @@
188 "Символы после строки для поиска, смещения строки и/или команды z"
189 "Прошлый образец поиска отсутствует"
190 "Поиск завершился на начальной позиции"
191 "Аббревиатура превысила лимит расширения: символы забыты"
192 "Символ неправилен; квотируйте для ввода"
193 "Уже на начале вставки"
194 "Нет символов для удаления"
@ -171,19 +196,34 @@
204 "%s не является командой VI"
205 "Использование: %s"
206 "Нет символов для удаления"
207 "Команда Q требует ex интерфейс терминала"
208 "Нет команды для повтора"
209 "Файл пуст"
210 "Команда %s не может быть использована как команда перемещения"
211 "Уже в командном режиме"
212 "Курсор находится не на слове"
214 "Значение опции windows слишком велико, максимальное значение = %u"
215 "Добавить"
216 "Изменить"
217 "Команда"
218 "Вставить"
219 "Заменить"
220 "Движение курсора за конец экрана"
221 "Движение курсора за начало экрана"
222 "Для разделения экран должен быть больше чем строки %d"
223 "Теневых окон нет"
224 "Не существует теневого окна с редактированием файла %s"
225 "Вы не можете сделать единственное окно теневым"
226 "Экран может быть сжат"
227 "Экран не может быть сжат только до %d строк"
228 "Экран не может быть расширен"
230 "Этот экран не может быть приостановлен"
231 "Прервано: назначенные клавиши забыты"
232 "vi: временный буфер не освобожден"
233 "Данный тип терминала не имеет клавиши %s"
234 "Может быть указан только один буфер"
235 "Число больше чем %lu"
236 "Прервано"
237 "Невозможно создать временный файл"
238 "Внимание: %s специальный файл"
239 "%s уже заблокирован, доступен только на чтение"
@ -200,7 +240,9 @@
250 "%s: Файл изменялся позднее, чем данная копия: используйте ! для обхода"
251 "%s: Файл изменялся позднее, чем данная копия"
252 "%s: защита на запись была недоступна"
253 "Запись..."
254 "%s: ВНИМАНИЕ: ФАЙЛ УСЕЧЕН"
255 "Уже присутствует в первой метке данной группы"
256 "%s: новый файл: %lu строк, %lu символов"
257 "%s: %lu строк, %lu символов"
258 "%s расширился в слишком большое количество имен файлов"
@ -211,4 +253,59 @@
263 "Файл изменен со времени последней записи: сохраните или используйте :edit для обхода"
264 "Файл изменен со времени последней записи: сохраните или используйте ! для обхода"
265 "Файл временный: выход сотрет любые изменения"
266 "Файл только для чтения, автозапись не сработала"
267 "Записи начаты заново"
268 "подтвердить? [ynq]"
269 "Нажмите любую клавишу чтобы продолжить: "
270 "Нажмите любую клавишу чтобы продолжить [: чтобы ввести еще ex команды]: "
271 "Нажмите любую клавишу чтобы продолжить [q чтобы выйти]: "
272 "Эта форма %s требует ex интерфейс терминала"
273 "Вход в режим ввода ex."
274 "Команда не удалась, файл еще не прочтен."
275 " прод?"
276 "Неожиданное символьное событие"
277 "Неожиданное событие 'конец файла'"
278 "По запросу совпадений нет"
279 "Неожиданное событие прерывания"
280 "Неожиданное событие выхода"
281 "Неожиданное событие перерисовки"
282 "Уже присутствует в последней метке данной группы"
283 "Команда %s требует ex интерфейс терминала"
284 "Эта форма %s не поддерживается пока установлена опция безопасного редактирования"
285 "Неожиданное строковое событие"
286 "Неожиданное событие таймаута"
287 "Неожиданное событие записи"
288 "Для разделения экран должен быть больше чем столбцы %d"
289 "Shell расширения не поддерживаются пока установлена опция безопасного редактирования"
290 "Команда %s не поддерживается пока установлена опция безопасного редактирования"
291 "set: опция %s не может быть выключена"
292 "Экран слишком мал"
293 "добавлено"
294 "изменено"
295 "удалено"
296 "присоединено"
297 "перемещено"
298 "смещено"
299 "скопировано"
300 "строка"
301 "строки"
303 "Файл изменен с момента последней записи."
304 "Shell расширение не удалось"
305 "Нет указанной %s опции редактирования"
307 "Нет ex команды для выполнения"
308 "Введите <CR> для выполнения команды, :q чтобы выйти"
309 "Используйте \"cscope help\" для помощи"
310 "Нет запущенного cscope соединения"
311 "%s: неизвестный тип поиска: используйте один из %s"
312 "%d: нет такого cscope сеанса"
313 "set: %s опция никогда не может быть включена"
314 "set: %s опция никогда не может быть установлена в 0"
315 "%s: добавлено: %lu строк, %lu символов"
316 "Неожиданное событие изменения размера"
317 "%d файлов для редактирования"
319 "%d экранов в фоновом режиме; используйте :display чтобы перечислить их"
320 "Неизвестная позиция курсора"
321 "Преобразование кодировки файлов не поддерживается"
322 "Преобразование кодировки ввода не поддерживается"
323 "Неверный ввод. Усечено."
324 "Ошибка преобразования в строке %d"

View File

@ -1,169 +0,0 @@
Unused message id's (this is okay):
001
008
021
022
023
024
025
026
027
028
029
036
037
047
050
051
052
057
061
078
081
090
091
093
110
145
147
161
164
167
169
176
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):
=========================
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 расширился в слишком большое количество имен файловX
2 %s существует, не записан; используйте ! для обходаX
2 %s: %lu строк, %lu символовX
2 %s: не до конца восстановленный файлX
2 Буфер %s пустX
2 Записи не велись, невозможно отменить последнюю командуX
2 Файл изменен со времени последней записи: сохраните или используйте ! для обходаX
2 set: %s опция не является логическойX
3 %s: удаленX
3 Нет символов для удаленияX
4 Использование: %sX
=========================

View File

@ -1 +1,3 @@
Dima Ruban <dima@rdy.com>, "Andrey A. Chernov" <ache@nagual.pp.ru>
Andrey A. Chernov <ache@nagual.ru>
Dima Ruban <dima@rdy.com>
Pavel Timofeev <timp87@gmail.com>

View File

@ -1,317 +0,0 @@
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 tras de cadena de búsqueda, desplazamiento de línea y/o comando zX
No hay patrón anterior de búsquedaX
Búsqueda vuelve a la posición inicialX
Se superó el límite de expansión de abreviatura: se descartaron caracteresX
Carácter ilegal; mencionar para entrarX
Ya se encuentra al principio de la inserciónX
No hay más caracteres para borrarX
Movimiento más allá del final del archivoX
Movimiento más allá del final de la líneaX
No hay movimiento del cursorX
Ya se encuentra al principio del archivoX
Movimiento más allá del principio del archivoX
Ya se encuentra en la primera columnaX
Los buffers deben especificarse antes del comandoX
Ya se encuentra al final del archivoX
Ya se encuentra al final de la líneaX
%s no es un comando viX
Uso: %sX
No hay caracteres para borrarX
El comando Q requiere la interfase de terminal exX
No hay comando para repetirX
El archivo está vacíoX
%s no puede usarse como comando de movimientoX
Ya se encuentra en modalidad de comandoX
El cursor no se encuentra en una palabraX
El valor de opción de Windows es demasiado grande, el máx. es %uX
AñadirX
CambiarX
ComandoX
InsertarX
ReemplazarX
El movimiento va más allá del final de la pantallaX
El movimiento va más allá del principio de la pantallaX
La pantalla debe tener más de %d líneas para dividirseX
No hay pantallas de fondoX
No hay pantalla de fondo editando un archivo denominado %sX
No se puede poner fondo a la única pantalla que se visualizaX
La pantalla sólo puede reducirse a %d hilerasX
La pantalla no puede reducirseX
La pantalla no puede aumentarseX
Esta pantalla no puede suspenderseX
Interrumpido: teclas mapeadas descartadasX
vi: buffer temporario no liberadoX
Esta terminal no tiene tecla %sX
Sólo un buffer puede especificarseX
Número mayor que %luX
InterrumpidoX
No se puede crear archivo temporarioX
Advertencia: %s no es un archivo regularX
%s ya se encuentra trabado, la sesión es de lectura solamenteX
%s: eliminarX
%s: cerrarX
%s: eliminarX
%s: eliminarX
Archivo de lectura solamente, no escrito; usar ! para alterarX
Archivo de lectura solamente, no escritoX
%s existe, no escrito; usar ! para alterarX
%s existe, no escritoX
Archivo parcial, no escrito; usar ! para alterarX
Archivo parcial, no escritoX
%s: archivo modificado más recientemente que esta copia; usar ! para alterarX
%s: archivo modificado más recientemente que esta copiaX
%s: la traba de escritura no estaba disponibleX
Escribiendo...X
%s: ADVERTENCIA: ARCHIVO TRUNCADOX
Ya se encuentra en el primer identificador de este grupoX
%s: nuevo archivo: %lu líneas, %lu caracteresX
%s: %lu líneas, %lu caracteresX
%s expandido a demasiados nombres de archivosX
%s: no es un archivo regularX
%s: no le perteneceX
%s: accesible por un usuario que no sea el propietarioX
Archivo modificado desde la última escritura completa; escribir o usar ! para alterarX
Archivo modificado desde la última escritura completa; escribir o usar :editar! para alterarX
Archivo modificado desde la última escritura completa; escribir o usar ! para alterarX
El archivo es temporario; al salir se descartarán las modificacionesX
Archivo de lectura solamente, las modificaciones no se autoescribenX
Se reinició el logX
confirmar? [snq]X
Presionar cualquier tecla para continuar: X
Presionar cualquier tecla para continuar [: para ingresar más comandos ex]: X
Presionar cualquier tecla para continuar [q para salir]: X
Esta forma de %s requiere la interfase terminal exX
Ingresando en la modalidad de entrada ex.X
Comando fracasado, no hay archivo leído aun.X
cont?X
Evento inesperado de carácterX
Evento inesperado de final de archivoX
No hay coincidencias para consultaX
Evento inesperado de interrupciónX
Evento inesperado de salidaX
Evento inesperado de repinturaX
Ya se encuentra en el último identificador de este grupoX
El comando %s requiere la interfase terminal exX
Esta forma de %s no se encuentra soportada cuando se determina la opción de edición seguraX
Evento inesperado de cadenaX
Evento inesperado de tiempo excedidoX
Evento inesperado de escrituraX
Las expansiones de shell no se encuentran soportadas cuando se determina la opción de edición seguraX
El comando %s no se encuentra soportado cuando se determina la opción de edición seguraX
determinar: la opción %s puede no estar desconectadaX
El monitor es demasiado pequeño.X
agregadoX
cambiadoX
borradoX
unidoX
movidoX
desplazadoX
arrancadoX
líneaX
líneasX
Vi no se cargó con un intérprete TclX
Archivo modificado desde la última escritura.X
Expansión de shell fracasadaX
No hay opción de edición %s especificadaX
Vi no se cargó con un intérprete PerlX
No hay comando ex para ejecutarX
Ingresar <CR> para ejecutar un comando, :q para salirX
Usar \"cscope ayuda\" para obtener ayudaX
No hay conexiones cscope corriendoX
%s: tipo de búsqueda desconocido: usar uno de %sX
%d: no existe esta sesión cscopeX
determinar: la opción %s no puede conectarse nuncaX
determinar: la opción %s no puede determinarse nunca en 0X
%s: añadido: %lu líneas, %lu caracteresX
Evento inesperado de modificación de tamañoX
%d archivos para editarX

View File

@ -43,8 +43,7 @@
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"
047 "La opción de %s 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"
@ -200,7 +199,6 @@
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"
@ -293,7 +291,6 @@
302 "Vi no se cargó con un intérprete Tcl"
303 "Archivo modificado desde la última escritura."
304 "Expansión de shell fracasada"
304 "Expansión de shell fracasada"
305 "No hay opción de edición %s especificada"
306 "Vi no se cargó con un intérprete Perl"
307 "No hay comando ex para ejecutar"

View File

@ -1,35 +0,0 @@
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

@ -1,317 +0,0 @@
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

@ -29,7 +29,7 @@
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"
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"
@ -43,8 +43,7 @@
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å"
047 "%s 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"
@ -73,7 +72,7 @@
078 "Söker..."
079 "Inga icke skrivbara tecken funna"
080 "Okänt kommandonamn"
082 "%s: kommandot är inte tillgängligt i "ex" läge"
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)"
@ -97,16 +96,16 @@
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"
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"
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"
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"
@ -114,8 +113,8 @@
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"
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"
@ -126,7 +125,7 @@
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"
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"
@ -141,13 +140,13 @@
147 "Läser..."
148 "%s: %lu rader, %lu tecken"
149 "Inga bakgrundsfönster att visa"
150 "Script kommandot finns bara i "vi" läge"
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"
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]"
@ -182,7 +181,7 @@
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"
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"
@ -194,10 +193,10 @@
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"
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"
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"
@ -260,8 +259,8 @@
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."
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"
@ -271,7 +270,7 @@
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"
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"
@ -294,9 +293,9 @@
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"
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"
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"

View File

@ -1,34 +0,0 @@
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

@ -1,317 +0,0 @@
VI_MESSAGE_CATALOG
Переповнення значення довжини рядкуX
неможливо стерти рядок %luX
неможливо додати до рядку %luX
неможливо вставити в рядок %luX
неможливо розм╕стити рядок %luX
неможливо д╕стати останн╕й рядокX
Помилка: неможливо отримати рядок %luX
Файл запис╕вX
Записи не велися, неможливо в╕дм╕нити останню командуX
Нема чого в╕дм╕нятиX
Записи не велися, неможливо в╕дм╕нити останню командуX
Записи не велися, неможливо продивитися впередX
Нема чого повторюватиX
%s/%d: помилка запису протоколуX
Стандартним введенням/виведенням для vi ма╓ бути терм╕налX
М╕тка %s: не встановленоX
М╕тка %s: рядок стертоX
М╕тка %s: позиц╕╖ курсору б╕льше не ╕сну╓X
Помилка: X
Новий файлX
Iм'я зм╕нилосьX
зм╕ненийX
не зм╕ненийX
РO3БЛOКOВАНOX
т╕льки для читанняX
рядок %lu з %lu [%ld%%]X
пустий файлX
рядок %luX
Файл %s не ╓ файлом пов╕домленньX
Неможливо встановити опц╕ю %s за змовчаннямX
Використання: %sX
Опц╕╖ %s нема╓: 'set all' показу╓ вс╕ можлив╕ опц╕╖X
set: [no]%s не набува╓ такого значенняX
set: %s опц╕я не ╓ лог╕чноюX
set: опц╕я %s: %sX
set: опц╕я %s: %s: переповненняX
set: неправильне значення %sX
set: %s опц╕я не ╓ лог╕чноюX
К╕льк╕сть колонок на экран╕ надто мала, менше н╕ж %dX
К╕льк╕сть колонок на экран╕ надто велика, б╕льше н╕ж %dX
К╕льк╕сть рядк╕в на экран╕ надто мала, менше н╕ж %dX
К╕льк╕сть рядк╕в на экран╕ надто велика, б╕льше н╕ж %dX
Опц╕я lisp в╕дсутняX
Пов╕домлення не вимкнен╕: %sX
Пов╕домлення не вв╕мкнен╕: %sX
Опц╕я paragraph повинна м╕стити групи з двох символ╕вX
Опц╕я section повинна м╕стити групи з двох символ╕вX
Стартовий буфер порожн╕йX
Буфер %s порожн╕йX
Неможливо в╕дновити файл, що м╕стить в ╕мен╕ символи переведення кареткиX
Зм╕ни не можна буде в╕дновити п╕сля краху сес╕╖X
Коп╕ювання файлу для в╕дновлення...X
Збереження не вдалось: %sX
Зм╕ни не можна буде в╕дновити п╕сля краху сес╕╖X
Збереження коп╕╖ файлу не вдалось: %sX
Коп╕ювання файлу для в╕дновлення...X
Iнформац╕ю про користувача %u не знайденоX
Заблокувати в╕дновленний файл неможливоX
Буфер в╕дновленого файлу переповненоX
В╕дновленний файлX
%s: файл в╕дновленний не до к╕нцяX
%s: файл в╕дновленний не до к╕нцяX
Не ╕сную╓ файл╕в з ╕менем %s, як╕ Ви можете прочитатиX
Iснують стар╕ верс╕╖ файлу, як╕ можна в╕дновитиX
Iснують ╕нш╕ файли, як╕ можна в╕дновитиX
e-mail не в╕д╕слано: %sX
Файл пустий - нема чого шукатиX
Досянуто к╕нця файлу без знахождення зразку пошукуX
Не задано зразок пошукуX
Зразок пошуку не знайденоX
Досянуто початку файлу без знахождення зразку пошукуX
Пошук зацикленоX
Пошук...X
Непечатних символ╕в не знайденоX
Нев╕дома командаX
%s: команда не доступна в режим╕ exX
Л╕чильник не може бути нулемX
%s: неправильне визначення рядкуX
Внутр╕шня помилка в синтаксис╕ (%s: %s)X
Використання: %sX
%s: тимчасовий буфер не використаноX
М╕тку поставлено перед першим рядкомX
М╕тку поставлено п╕сля к╕нця файлуX
@ з д╕апазоном працю╓ коли зм╕нено файл/в╕кноX
Команда Global/v працю╓ коли зм╕нено файл/в╕кноX
Команда ex не вдалась: наступн╕ команди з'╕гнорованоX
Команда ex не вдалась: в╕дображен╕ клав╕ш╕ з'╕гнорованоX
Друга адреса менше н╕ж першаX
Не вказано ╕м'я м╕ткиX
\\ не зак╕нчу╓ться / чи ?X
Посилання на рядок з номером, меншим н╕ж 0X
Команда %s нев╕домаX
Переповнення л╕чильника адресX
Недоб╕р л╕чильника адресX
Недопустима комб╕нац╕я в адрес╕X
Неправильна адреса: всього %lu рядк╕в у файл╕X
Неправильна адреса: файл пустийX
Команда %s не може використовувати адресу 0X
Нема╓ абрев╕атурX
Абрев╕атури повинн╕ зак╕нчуватися символом "word"X
В абрев╕атур╕ не можна використовувати символи табуляц╕╖ та проб╕лиX
Абрев╕атури не можуть зм╕шувати символи сл╕в/не-сл╕в, х╕ба що в к╕нц╕ рядкуX
"%s" не абрев╕атураX
Команда Vi не вдалась: в╕дображен╕ клав╕ш╕ з'╕гнорованоX
Файл╕в для редагування б╕льше нема╓X
Попереднього файлу для редагування нема╓X
Попереднього файлу для перегляду нема╓X
Нема╓ файл╕вX
Нема╓ попередньо╖ команди для зам╕ни "!"X
В╕дсутн╓ ╕м'я файлу для п╕дм╕ни %%X
В╕дсутн╓ ╕м'я файлу для п╕дм╕ни #X
Помилка: execl: %sX
Помилка введення/виведення: %sX
Файл модиф╕ковано п╕сля останньо╖ команди повного запису: збереж╕ть чи використайте ! для обходуX
Неможливо знайти домашн╕й каталогX
Новий каталог: %sX
Нема╓ наповнених буфер╕вX
Команда %s не використову╓ться як частина команди global чи vX
%s/%s: не в╕дкрито: не належить Вам чи адм╕н╕страторуX
%s/%s: не в╕дкрито: не належить ВамX
%s/%s: не в╕дкрито: можлив╕сть запису користувачем, який не ╓ власникомX
%s: не в╕дкрито: не належить Вам чи адм╕н╕страторуX
%s: не в╕дкрито: не належить ВамX
%s: не в╕дкрито: можлив╕сть запису користувачем, який не ╓ власникомX
Нема╓ б╕льше рядк╕в для об'╓днанняX
Нема╓ параметр╕в введенняX
Нема╓ параметр╕в командиX
Символ %s не можна переназначитиX
"%s" зараз не переназначеноX
Iм'я м╕тки -- один символX
%s ╕сну╓, не записано; використайте ! для обходуX
Новий файл exrс: %sX
Рядок призначення зазначено всередин╕ д╕апазону перем╕щенняX
Команда open вимага╓ встановлення опц╕╖ openX
Команду open ще не реал╕зованоX
Захист файлу неможливийX
Файл захищеноX
%s розширився в надто велику к╕льк╕сть ╕мен файл╕вX
Прочитати можна т╕льки простий файл чи ╕менований канал(pipe)X
%s: блокування в╕д читання неможливеX
Зчитую...X
%s: %lu рядк╕в, %lu символ╕вX
Нема╓ т╕ньових в╕конX
Команда script доступна лише в режим╕ viX
Нема команди для виконанняX
Опц╕ю shiftwidth встановлено в 0X
Переповнення л╕чильникаX
Цикл виконано не до к╕нцяX
Вказано регулярний вираз; параметр 'r' не ма╓ сенсуX
Параметри #, l та p не можна комб╕нувати з параметром 'c' в режим╕ viX
Сп╕впадань нема╓X
Tег в╕дсутн╕йX
Менше н╕ж %s запис╕в у стеку тег╕в; використайте :display t[ags]X
Нема╓ файлу %s в стеку тег╕в для повернення; використайте :display t[ags]X
Натисн╕ть ENTER для продовження: X
%s: тег не знайденоX
%s: з╕псований тег в %sX
%s: номер рядку тега знаходиться за к╕нцем файлуX
Стек тег╕в порожн╕йX
%s: зразок пошуку не знайденоX
Залишилось %d файл╕в для редагуванняX
Буфер %s порожн╕йX
Зм╕нити? [n]X
ПерерваноX
Нема╓ буферу для використанняX
Нема╓ попереднього регулярного виразуX
Команда %s вимага╓ вже прочитаний файлX
Використання: %sX
Команда visual вимага╓ встановлення опц╕╖ openX
Пустий файлX
Нема╓ попереднього пошуку F, f, T, чи tX
%s не знайденоX
Нема╓ попереднього файлу для редагуванняX
Курсор сто╖ть не на цифр╕X
римане число надто великеX
римане число надто малеX
Нема╓ в╕дпов╕дного символу в цьому рядкуX
В╕дпов╕дний символ не знайденоX
Нема╓ символ╕в для зам╕ниX
Нема╓ ╕ншого в╕кнаX
Символи п╕сля рядку для пошуку, зм╕щення рядку та/чи команди zX
Нема╓ попереднього зразку пошукуX
Пошук зак╕нчився на початков╕й позиц╕╖X
Абрев╕атура перевищила л╕м╕т розширення: символи з'╕гнорованоX
Недозволений символ: задайте в дужкахX
Вже на початку вставкиX
Нема╓ символ╕в для видаленняX
Рух за к╕нець файлуX
Рух за к╕нець рядкуX
Курсор не перем╕щувавсяX
Вже на початку файлуX
Рух курсору за початок файлуX
Вже в перш╕й колонц╕X
Буфер треба вказувати перед командоюX
Вже на к╕нц╕ файлуX
Вже на к╕нц╕ рядкуX
%s не команда ViX
Використання: %sX
Нема╓ символ╕в для видаленняX
Команда Q вимага╓ ╕нтерфейсу exX
Нема╓ команди для повторенняX
Файл пустийX
Команду %s не можна використати для перем╕щенняX
Вже в командному режим╕X
Курсор сто╖ть не на слов╕X
Значнення опц╕╖ Windows надто велике, максимум = %uX
ДописатиX
Зм╕нитиX
КомандаX
ВставитиX
Зам╕нитиX
Рух курсору за к╕нець экрануX
Рух курсору за початок экрануX
Для розбиття в╕кно ма╓ м╕стити б╕льше н╕ж %d рядк╕вX
Т╕ньових в╕кон нема╓X
Нема╓ т╕ньового в╕кна з редагуванням файлу %sX
Не можна зробити т╕ньовим ╓дине в╕кноX
В╕кно можна стиснути лише до %d рядк╕вX
В╕кно не можна стиснутиX
В╕кно не можна розширитиX
Це в╕кно не можна призупинитиX
Перервано: в╕дображен╕ клав╕ш╕ з'╕гнорованоX
vi: тимчасовий буфур не вив╕льненоX
Цей тип терм╕налу нема╓ клав╕ш╕ %sX
Можна вказати лише один буферX
Число б╕льше, н╕ж %luX
ПерерваноX
Неможлу створити тимчасовий файлX
УВАГА: %s спец╕альний файлX
%s вже заблоковано, доступний т╕льки для читанняX
%s: стертоX
%s: закритоX
%s: стертоX
%s: стертоX
Файл т╕льки для читання, не записано: Використайте ! для обходуX
Файл т╕льки для читання, не записаноX
%s ╕сну╓, не записано; використайте ! для обходуX
%s ╕сну╓, не записаноX
Використайте ! для часткового запису файлуX
Частина файлу, файл не записаноX
%s: Файл зм╕нювався п╕зн╕ше, н╕ж ця коп╕я: використайте ! для обходуX
%s: Файл зм╕нювався п╕зн╕ше, н╕ж ця коп╕яX
%s: захист в╕д запису недоступнийX
Запис...X
%s: УВАГА: файл обр╕заноX
Вже на першому тегу в ц╕й груп╕X
%s: новий файл: %lu рядк╕в, %lu символ╕вX
%s: %lu рядк╕в, %lu символ╕вX
%s розширився в надто велику к╕льк╕сть ╕мен файл╕вX
%s: спец╕альний файлX
%s: не належить ВамX
%s: доступний не лише Вам
Файл модиф╕ковано п╕сля останньо╖ команди запису: збереж╕ть чи використайте ! для обходуX
Файл модиф╕ковано п╕сля останньо╖ команди запису: збереж╕ть чи використайте :edit для обходуX
Файл модиф╕ковано п╕сля останньо╖ команди запису: збереж╕ть чи використайте ! для обходуX
Тимчасовий файл: вих╕д з╕тре зм╕ниX
Файл т╕льки для читання, зм╕ни не запишуться автоматичноX
Записи почат╕ зановоX
П╕дтверджу╓те? [ynq]X
Натисн╕ть ENTER для продовження: X
Натисн╕ть ENTER для продовження [: для ╕нших команд] X
Натисн╕ть ENTER для продовження [q для виходу]: X
Tака форма %s вимага╓ ╕нтерфейсу exX
Входим в режим введення exX
Зб╕й команди, файл не прочитаноX
Продовжити?X
Неоч╕кувана символьна под╕яX
Неоч╕кувана под╕я к╕нця файлуX
Нема╓ сп╕впадань за запитомX
Неоч╕кувана под╕я перериванняX
Неоч╕кувана под╕я виходуX
Неоч╕кувана под╕я перерисовкиX
Вже на останньму Тегу в ц╕й груп╕X
Команда %s вимага╓ ╕нтерфейсу exX
Tака форма %s не дозволя╓ться при встановлен╕й опц╕╖ secure editX
Неоч╕кувана под╕я рядкуX
Неоч╕кувана под╕я тайм-аутуX
Неоч╕кувана под╕я записуX
Shell'╕вске доповнення не дозволя╓ться при встановлен╕й опц╕╖ secure editX
Команда %s не дозволя╓ться при встановлен╕й опц╕╖ secure editX
set: опц╕ю %s неможна виставити вимкненоюX
Екран надто малий.X
доданоX
зм╕неноX
стертоX
об'╓днаноX
перем╕щеноX
здвинутоX
вставленоX
рядокX
рядк╕вX
Vi завантажено без ╕нтерпретатора TclX
Файл модиф╕ковано п╕сля останньо╖ команди запису.X
Невдача shell'╕вського доповненняX
Oпц╕╖ редагування %s не вказаноX
Vi завантажено без ╕нтерпретатора PerlX
Нема╓ команди ex для виконанняX
Натисн╕ть ENTER щоб виконати команду, q щоб вийтиX
Введ╕ть 'cscope help' для ╕нформац╕╖X
Нема╓ cscope з'╓днанньX
%s: нев╕домий тип пошуку: використовуйте один з %sX
%d: нема╓ тако╖ сес╕╖ cscopeX
set: опц╕ю %s неможна виставити ув╕мкненоюX
set: опц╕ю %s неможна виставити в 0X
%s: додано: %lu рядк╕в, %lu символ╕вX
Неоч╕кувана под╕я зм╕ни розм╕руX
%d файл╕в для редагуванняX

View File

@ -43,8 +43,7 @@
044 "Опц╕я lisp в╕дсутня"
045 "Пов╕домлення не вимкнен╕: %s"
046 "Пов╕домлення не вв╕мкнен╕: %s"
048 "Опц╕я paragraph повинна м╕стити групи з двох символ╕в"
049 "Опц╕я section повинна м╕стити групи з двох символ╕в"
047 "Опц╕я %s повинна м╕стити групи з двох символ╕в"
053 "Стартовий буфер порожн╕й"
054 "Буфер %s порожн╕й"
055 "Неможливо в╕дновити файл, що м╕стить в ╕мен╕ символи переведення каретки"
@ -97,16 +96,16 @@
103 "Неправильна адреса: файл пустий"
104 "Команда %s не може використовувати адресу 0"
105 "Нема╓ абрев╕атур"
106 "Абрев╕атури повинн╕ зак╕нчуватися символом "word""
106 "Абрев╕атури повинн╕ зак╕нчуватися символом \"сл╕в\""
107 "В абрев╕атур╕ не можна використовувати символи табуляц╕╖ та проб╕ли"
108 "Абрев╕атури не можуть зм╕шувати символи сл╕в/не-сл╕в, х╕ба що в к╕нц╕ рядку"
109 ""%s" не абрев╕атура"
109 "\"%s\" не абрев╕атура"
110 "Команда Vi не вдалась: в╕дображен╕ клав╕ш╕ з'╕гноровано"
111 "Файл╕в для редагування б╕льше нема╓"
112 "Попереднього файлу для редагування нема╓"
113 "Попереднього файлу для перегляду нема╓"
114 "Нема╓ файл╕в"
115 "Нема╓ попередньо╖ команди для зам╕ни "!""
115 "Нема╓ попередньо╖ команди для зам╕ни \"!\""
116 "В╕дсутн╓ ╕м'я файлу для п╕дм╕ни %%"
117 "В╕дсутн╓ ╕м'я файлу для п╕дм╕ни #"
118 "Помилка: execl: %s"
@ -126,7 +125,7 @@
132 "Нема╓ параметр╕в введення"
133 "Нема╓ параметр╕в команди"
134 "Символ %s не можна переназначити"
135 ""%s" зараз не переназначено"
135 "\"%s\" зараз не переназначено"
136 "Iм'я м╕тки -- один символ"
137 "%s ╕сну╓, не записано; використайте ! для обходу"
138 "Новий файл exrс: %s"

View File

@ -0,0 +1,311 @@
002 "行长度溢出"
003 "无法删除第 %lu 行"
004 "无法向第 %lu 行追加"
005 "无法向第 %lu 行插入"
006 "无法存储第 %lu 行"
007 "无法获得最后一行"
008 "错误:无法获取第 %lu 行"
009 "日志文件"
010 "日志未记录,无法撤销"
011 "未做修改,无法撤销"
012 "日志未记录,无法撤销"
013 "日志未记录,无法回滚"
014 "未做修改,无法重做"
015 "%s/%d: 日志错误"
016 "Vi 的标准输入和输出必须是终端"
017 "标记 %s: 未设置"
018 "标记 %s: 该行被删除"
019 "标记 %s: 光标位置不存在"
020 "错误:"
021 "新文件"
022 "文件名变更"
023 "已修改"
024 "未修改"
025 "已解锁"
026 "只读"
027 "第 %lu 行/共 %lu 行 [%ld%%]"
028 "空文件"
029 "第 %lu 行"
030 "文件 %s 不是消息目录"
031 "无法设置选项 %s 的默认值"
032 "用法 %s"
033 "set: 不存在选项 %s用 'set all' 查看所有选项的值"
034 "set: 选项 [no]%s 不接受赋值"
035 "set: 选项 %s 不是开关"
036 "set: 选项 %s: %s"
037 "set: 选项 %s: %s: 值溢出"
038 "set: 选项 %s: %s 是一个非法数字"
039 "set: 选项 %s 不是开关"
040 "屏幕太窄,列宽小于 %d"
041 "屏幕太宽,列宽大于 %d"
042 "屏幕太矮,行高小于 %d"
043 "屏幕太高,行高大于 %d"
044 "lisp 选项未实现"
045 "消息未关闭:%s"
046 "消息未打开:%s"
047 "%s 选项必须每两个字符一组"
053 "默认缓冲区为空"
054 "缓冲区 %s 为空"
055 "文件名中有换行的文件是无法恢复的"
056 "一旦会话失败,修改无法恢复"
057 "正在备份文件……"
058 "保存失败:%s"
059 "一旦会话失败,修改无法恢复"
060 "文件备份失败:%s"
061 "正在备份文件……"
062 "ID 为 %u 的用户未找到"
063 "无法给恢复文件加锁"
064 "恢复文件缓冲区溢出"
065 "恢复文件"
066 "%s: 恢复文件格式异常"
067 "%s: 恢复文件格式异常"
068 "不存在名为 %s 的,可读并需要恢复的文件"
069 "存在此文件的旧版本需要您恢复"
070 "存在其它需要您恢复的文件"
071 "邮件未发出:%s"
072 "文件为空,无法搜索"
073 "到达文件尾,未找到模式"
074 "没有上一个搜索模式"
075 "模式未找到"
076 "到达文件头,未找到模式"
077 "搜索回转"
078 "正在搜索……"
079 "未找到不可打印字符"
080 "命令名不明"
082 "%s: 命令在 ex 模式下不可用"
083 "命令计数不可为 0"
084 "%s: 错误的行描述"
085 "内部语法表错误 (%s: %s)"
086 "用法:%s"
087 "%s: 临时缓冲区未释放"
088 "修饰符偏移量在第一行之前"
089 "修饰符偏移量超过最后一行"
090 "文件/屏幕改变时有带范围的 @ 命令正在运行"
091 "文件屏幕改变时有全局命令v 命令正在运行"
092 "Ex 命令失败:等待中的命令已丢弃"
093 "Ex 命令失败:键映射已丢弃"
094 "第二地址小于第一地址"
095 "未提供标记名"
096 "\\ 没有跟在 / 或 ? 后面"
097 "引用了小于 0 的行号"
098 "%s 命令不明"
099 "地址值溢出"
100 "地址值下溢"
101 "非法的地址组合"
102 "非法地址:文件只有 %lu 行"
103 "非法地址:文件为空"
104 "命令 %s 不允许地址为 0"
105 "没有可显示的缩写"
106 "缩写必须以「单词」字符结束"
107 "缩写不能包含制表符或空格"
108 "缩写不能在结尾之外的地方混用单词/非单词字符"
109 "\"%s\" 不是缩写"
110 "Vi 命令失败:键映射已丢弃"
111 "没有剩余的待编辑文件"
112 "没有上一个待编辑文件"
113 "没有上一个需重新编辑的文件"
114 "没有可显示的文件列表"
115 "缺少用于替换 \"!\" 的上一条命令"
116 "缺少用于替换 %% 的文件名"
117 "缺少用于替换 # 的文件名"
118 "错误execl: %s"
119 "输入/输出错误:%s"
120 "文件在上一次完整写入后被修改;写入文件,或使用 ! 强制切换目录"
121 "无法找到用户起始目录"
122 "新的当前目录:%s"
123 "没有可显示的剪切缓冲区"
124 "%s 命令不能被用作全局命令或 v 命令的一部分"
125 "%s/%s: 未引入:不属于您或根用户"
126 "%s/%s: 未引入:不属于您"
127 "%s/%s: 未引入:可以被文件属主以外的用户写入"
128 "%s: 未引入:不属于您或根用户"
129 "%s: 未引入:不属于您"
130 "%s: 未引入:可以被文件属主以外的用户写入"
131 "缺少可以合并的行"
132 "缺少输入映射"
133 "缺少命令映射"
134 "%s 字符不能被重新映射"
135 "\"%s\" 目前未被映射"
136 "标记名必须是单个字符"
137 "%s 已存在,未写入;用 ! 覆盖文件"
138 "新建 exrc 文件:%s"
139 "目标行在移动范围之内"
140 "open 要求开启 open 选项"
141 "open 命令未实现"
142 "无法保持此文件"
143 "文件已保持"
144 "%s: 展开的文件名过多"
145 "只能读取常规文件和具名管道"
146 "%s: 读锁不可用"
147 "正在读取……"
148 "%s: %lu 行,%lu 个字符"
149 "没有可显示的后台屏幕"
150 "script 命令仅在 vi 模式下可用"
151 "没有要执行的命令"
152 "shiftwidth 选项被设为 0"
153 "命令计数溢出"
154 "命令计数下溢"
155 "正则表达式已指定r 修饰符无效"
156 "#, l 和 p 修饰符在 vi 模式下不能与 c 修饰符组合"
157 "未找到匹配"
158 "没有上一次进入的 tag"
159 "tags 栈上的记录少于 %s 条;用 :display t[ags] 显示它们"
160 "tags 栈上不存在文件 %s无法返回用 :display t[ags] 查看"
161 "按回车键继续:"
162 "%s: tag 未找到"
163 "%s: 损坏的 tag 在 %s 中"
164 "%s: tag 的行号超过了文件尾"
165 "tags 栈为空"
166 "%s: 搜索模式未找到"
167 "还有 %d 个待编辑文件"
168 "缓冲区 %s 为空"
169 "确认修改?[n]"
170 "已中断"
171 "没有上一个可供执行的缓冲区"
172 "没有上一条正则表达式"
173 "%s 要求存在一个已读入的文件"
174 "用法:%s"
175 "visual 命令要求开启 open 选项"
177 "空文件"
178 "没有上一次 F, f, T 或 t 搜索"
179 "%s 未找到"
180 "没有上一个待编辑文件"
181 "光标不在数字上"
182 "结果数字过大"
183 "结果数字过小"
184 "这一行上没有匹配的字符"
185 "匹配字符未找到"
186 "没有可替换的字符"
187 "没有其它屏幕可以切换"
188 "在搜索字符串、行偏移量或 z 命令之后有多余字符"
189 "没有上一个搜索模式"
190 "搜索回转到了初始位置"
191 "缩写展开超过限制:字符已丢弃"
192 "非法字符;用引号括起来再输入"
193 "已到插入点的开始"
194 "没有可擦除的剩余字符"
195 "移动超过文件尾"
196 "移动超过行末"
197 "光标未移动"
198 "已到文件头"
199 "移动超过文件头"
200 "已位于第一列"
201 "缓冲区应在命令前指定"
202 "已到文件尾"
203 "已到行末"
204 "%s 不是 vi 命令"
205 "用法 %s"
206 "没有可删除的字符"
207 "Q 命令需要 ex 终端界面"
208 "没有可重复的命令"
209 "文件为空"
210 "%s 不能被用作移动命令"
211 "已处于命令模式"
212 "光标不在单词上"
214 "窗口选项的值过大,最大值 %u"
215 "追加"
216 "修改"
217 "命令"
218 "插入"
219 "替换"
220 "移动超过屏幕终点"
221 "移动超过屏幕起点"
222 "分屏需要多于 %d 行"
223 "没有后台屏幕"
224 "不存在正在编辑文件 %s 的后台屏幕"
225 "不能把您唯一的屏幕置于后台"
226 "屏幕只能收缩到 %d 行"
227 "屏幕不能收缩"
228 "屏幕不能增高"
230 "不能挂起此屏幕"
231 "已中断:键映射已丢弃"
232 "vi: 临时缓冲区未释放"
233 "此终端没有 %s 键"
234 "只能指定一个缓冲区"
235 "数字大于 %lu"
236 "已中断"
237 "无法创建临时文件"
238 "警告:%s 不是常规文件"
239 "%s 已加锁,会话为只读"
240 "%s: 移除"
241 "%s: 关闭"
242 "%s: 移除"
243 "%s: 移除"
244 "只读文件,未写入;用 ! 强制写入"
245 "只读文件,未写入"
246 "%s 已存在,未写入;用 ! 覆盖文件"
247 "%s 已存在,未写入"
248 "是已存在文件的一部分,未写入;用 ! 强制写入"
249 "是已存在文件的一部分,未写入"
250 "%s: 文件被修改,新于当前拷贝;用 ! 强制写入"
251 "%s: 文件被修改,新于当前拷贝"
252 "%s: 写锁不可用"
253 "正在写入……"
254 "%s: 警告:文件被截断"
255 "已位于这组 tags 中的第一个"
256 "%s: 新文件:%lu 行,%lu 个字符"
257 "%s: %lu 行,%lu 个字符"
258 "%s: 展开的文件名过多"
259 "%s: 不是常规文件"
260 "%s: 不属于您"
261 "%s: 可被文件属主以外的用户访问"
262 "文件在上一次完整写入后被修改;写入文件,或使用 ! 强制载入"
263 "文件在上一次完整写入后被修改;写入文件,或使用 :edit! 强制编辑"
264 "文件在上一次完整写入后被修改;写入文件,或使用 ! 强制执行"
265 "临时文件,退出将丢弃全部修改"
266 "文件只读,修改未被自动写入"
267 "日志重启"
268 "确认?[ynq]"
269 "按任意键继续:"
270 "按任意键继续[按 : 键输入 ex 命令]:"
271 "按任意键继续[按 q 键推出]:"
272 "该形式的 %s 命令需要 ex 终端界面"
273 "进入 ex 输入模式"
274 "命令失败,尚未读入文件"
275 " 继续?"
276 "意外的字符事件"
277 "以外的文件尾事件"
278 "查询未找到匹配"
279 "意外的中断事件"
280 "意外的退出事件"
281 "意外的重绘事件"
282 "已位于这组 tags 中的最后一个"
283 "%s 命令需要 ex 终端界面"
284 "secure 编辑选项开启时不支持该形式的 %s 命令"
285 "意外的字符串事件"
286 "意外的超时事件"
287 "意外的写入事件"
288 "分屏需要多于 %d 列"
289 "secure 编辑选项开启时不支持 shell 展开"
290 "secure 编辑选项开启时不支持 %s 命令"
291 "set: 选项 %s 不能关闭"
292 "显示空间太小"
293 "已添加"
294 "已修改"
295 "已删除"
296 "已合并"
297 "已移动"
298 "已偏移"
299 "已复制"
300 "行"
301 "行"
303 "文件在上一次写入后被修改"
304 "Shell 展开失败"
305 "未指定 %s 编辑选项"
307 "没有要执行的 ex 命令"
308 "键入回车执行一条命令,:q 退出"
309 "使用 \"cscope help\" 查看帮助"
310 "没有正在运行的 cscope 连接"
311 "%s: 搜索类型不明:使用 %s 中的一个"
312 "%d: 无此 cscope 会话"
313 "set: 选项 %s 绝对不能开启"
314 "set: 选项 %s 绝对不能被设为 0"
315 "%s: 已追加:%lu 行,%lu 个字符"
316 "意外的大小调整事件"
317 "%d 个待编辑的文件"
319 "%d 个后台屏幕;用 :display 列出它们"
320 "光标位置不明"
321 "不支持文件编码转换"
322 "不支持输入编码转换"
323 "无效输入,已截断"
324 "第 %d 行上有转换错误"

View File

@ -0,0 +1 @@
Zhihao Yuan <lichray@gmail.com>

View File

@ -1,4 +1,4 @@
# @(#)README.signal 10.1 (Berkeley) 6/23/95
# $Id: README.signal,v 10.1 1995/06/23 10:28:17 bostic Exp $
There are six (normally) asynchronous actions about which vi cares:
SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGTSTP and SIGWINCH.

View File

@ -6,11 +6,24 @@
*
* See the LICENSE file for redistribution information.
*
* @(#)cl.h 10.19 (Berkeley) 9/24/96
* $Id: cl.h,v 10.34 2011/08/15 20:07:32 zy Exp $
*/
#ifdef USE_WIDECHAR
#define _XOPEN_SOURCE_EXTENDED
#endif
#ifdef HAVE_NCURSES_H
#include <ncurses.h>
#else
#include <curses.h>
#endif
typedef struct _cl_private {
CHAR_T ibuf[256]; /* Input keys. */
char ibuf[256]; /* Input keys. */
size_t skip; /* Remaining keys. */
CONVWIN cw; /* Conversion buffer. */
int eof_count; /* EOF count. */
@ -24,6 +37,10 @@ typedef struct _cl_private {
char *rmso, *smso; /* Inverse video terminal strings. */
char *smcup, *rmcup; /* Terminal start/stop strings. */
char *oname; /* Original screen window name. */
SCR *focus; /* Screen that has the "focus". */
int killersig; /* Killer signal. */
#define INDX_HUP 0
#define INDX_INT 1
@ -39,29 +56,29 @@ typedef struct _cl_private {
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. */
#define CL_LAYOUT 0x0002 /* Screen layout changed. */
#define CL_RENAME 0x0004 /* X11 xterm icon/window renamed. */
#define CL_RENAME_OK 0x0008 /* User wants the windows renamed. */
#define CL_SCR_EX_INIT 0x0010 /* Ex screen initialized. */
#define CL_SCR_VI_INIT 0x0020 /* Vi screen initialized. */
#define CL_SIGHUP 0x0040 /* SIGHUP arrived. */
#define CL_SIGINT 0x0080 /* SIGINT arrived. */
#define CL_SIGTERM 0x0100 /* SIGTERM arrived. */
#define CL_SIGWINCH 0x0200 /* SIGWINCH arrived. */
#define CL_STDIN_TTY 0x0400 /* 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)
#define CLSP(sp) ((WINDOW *)((sp)->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"
/* The screen position relative to a specific window. */
#define RCNO(sp, cno) (cno)
#define RLNO(sp, lno) (lno)
/*
* XXX
@ -75,4 +92,4 @@ typedef enum { INP_OK=0, INP_EOF, INP_ERR, INP_INTR, INP_TIMEOUT } input_t;
#define FALSE 0
#endif
#include "cl_extern.h"
#include "extern.h"

View File

@ -1,346 +0,0 @@
/*-
* 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. */
"kend", "@7", /* Go 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 */

View File

@ -10,7 +10,7 @@
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)cl_funcs.c 10.50 (Berkeley) 9/24/96";
static const char sccsid[] = "$Id: cl_funcs.c,v 10.74 2012/10/11 10:30:16 zy Exp $";
#endif /* not lint */
#include <sys/types.h>
@ -19,11 +19,13 @@ static const char sccsid[] = "@(#)cl_funcs.c 10.50 (Berkeley) 9/24/96";
#include <bitstring.h>
#include <ctype.h>
#include <curses.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef HAVE_TERM_H
#include <term.h>
#endif
#include <termios.h>
#include <unistd.h>
@ -31,6 +33,57 @@ static const char sccsid[] = "@(#)cl_funcs.c 10.50 (Berkeley) 9/24/96";
#include "../vi/vi.h"
#include "cl.h"
static void cl_rdiv __P((SCR *));
static int
addstr4(SCR *sp, void *str, size_t len, int wide)
{
CL_PRIVATE *clp;
WINDOW *win;
size_t y, x;
int iv;
clp = CLP(sp);
win = CLSP(sp) ? CLSP(sp) : stdscr;
/*
* 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(win, y, x);
if (!F_ISSET(sp, SC_SCR_EXWROTE) &&
y == RLNO(sp, LASTLINE(sp)) && IS_SPLIT(sp)) {
iv = 1;
(void)wstandout(win);
}
#ifdef USE_WIDECHAR
if (wide) {
if (waddnwstr(win, str, len) == ERR)
return (1);
} else
#endif
if (waddnstr(win, str, len) == ERR)
return (1);
if (iv)
(void)wstandend(win);
return (0);
}
/*
* cl_waddstr --
* Add len bytes from the string at the cursor, advancing the cursor.
*
* PUBLIC: int cl_waddstr __P((SCR *, const CHAR_T *, size_t));
*/
int
cl_waddstr(SCR *sp, const CHAR_T *str, size_t len)
{
return addstr4(sp, (void *)str, len, 1);
}
/*
* cl_addstr --
* Add len bytes from the string at the cursor, advancing the cursor.
@ -38,35 +91,9 @@ static const char sccsid[] = "@(#)cl_funcs.c 10.50 (Berkeley) 9/24/96";
* 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_addstr(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);
return addstr4(sp, (void *)str, len, 0);
}
/*
@ -76,14 +103,13 @@ cl_addstr(sp, str, len)
* 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_attr(SCR *sp, scr_attr_t attribute, int on)
{
CL_PRIVATE *clp;
WINDOW *win;
clp = CLP(sp);
win = CLSP(sp) ? CLSP(sp) : stdscr;
switch (attribute) {
case SA_ALTERNATE:
@ -146,9 +172,9 @@ cl_attr(sp, attribute, on)
(void)fflush(stdout);
} else {
if (on)
(void)standout();
(void)wstandout(win);
else
(void)standend();
(void)wstandend(win);
}
break;
default:
@ -164,9 +190,7 @@ cl_attr(sp, attribute, on)
* PUBLIC: int cl_baud __P((SCR *, u_long *));
*/
int
cl_baud(sp, ratep)
SCR *sp;
u_long *ratep;
cl_baud(SCR *sp, u_long *ratep)
{
CL_PRIVATE *clp;
@ -207,10 +231,9 @@ cl_baud(sp, ratep)
* PUBLIC: int cl_bell __P((SCR *));
*/
int
cl_bell(sp)
SCR *sp;
cl_bell(SCR *sp)
{
if (F_ISSET(sp, SC_EX | SC_SCR_EXWROTE))
if (F_ISSET(sp, SC_EX | SC_SCR_EXWROTE | SC_SCR_EX))
(void)write(STDOUT_FILENO, "\07", 1); /* \a */
else {
/*
@ -232,10 +255,26 @@ cl_bell(sp)
* PUBLIC: int cl_clrtoeol __P((SCR *));
*/
int
cl_clrtoeol(sp)
SCR *sp;
cl_clrtoeol(SCR *sp)
{
return (clrtoeol() == ERR);
WINDOW *win;
#if 0
size_t spcnt, y, x;
#endif
win = CLSP(sp) ? CLSP(sp) : stdscr;
#if 0
if (IS_VSPLIT(sp)) {
/* The cursor must be returned to its original position. */
getyx(win, y, x);
for (spcnt = (sp->coff + sp->cols) - x; spcnt > 0; --spcnt)
(void)waddch(win, ' ');
(void)wmove(win, y, x);
return (0);
} else
#endif
return (wclrtoeol(win) == ERR);
}
/*
@ -245,10 +284,10 @@ cl_clrtoeol(sp)
* PUBLIC: int cl_cursor __P((SCR *, size_t *, size_t *));
*/
int
cl_cursor(sp, yp, xp)
SCR *sp;
size_t *yp, *xp;
cl_cursor(SCR *sp, size_t *yp, size_t *xp)
{
WINDOW *win;
win = CLSP(sp) ? CLSP(sp) : stdscr;
/*
* The curses screen support splits a single underlying curses screen
* into multiple screens to support split screen semantics. For this
@ -256,8 +295,11 @@ cl_cursor(sp, yp, xp)
* 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;
getyx(win, *yp, *xp);
/*
*yp -= sp->roff;
*xp -= sp->coff;
*/
return (0);
}
@ -268,14 +310,14 @@ cl_cursor(sp, yp, xp)
* PUBLIC: int cl_deleteln __P((SCR *));
*/
int
cl_deleteln(sp)
SCR *sp;
cl_deleteln(SCR *sp)
{
CHAR_T ch;
CL_PRIVATE *clp;
size_t col, lno, spcnt, oldy, oldx;
WINDOW *win;
size_t y, x;
clp = CLP(sp);
win = CLSP(sp) ? CLSP(sp) : stdscr;
/*
* This clause is required because the curses screen uses reverse
@ -284,45 +326,58 @@ cl_deleteln(sp)
*
* 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);
getyx(win, y, x);
mvwchgat(win, RLNO(sp, LASTLINE(sp)), 0, -1, A_NORMAL, 0, NULL);
(void)wmove(win, y, x);
}
/*
* The bottom line is expected to be blank after this operation,
* and other screens must support that semantic.
*/
return (deleteln() == ERR);
return (wdeleteln(win) == ERR);
}
/*
* cl_discard --
* Discard a screen.
*
* PUBLIC: int cl_discard __P((SCR *, SCR **));
*/
int
cl_discard(SCR *discardp, SCR **acquirep)
{
CL_PRIVATE *clp;
SCR* tsp;
if (discardp) {
clp = CLP(discardp);
F_SET(clp, CL_LAYOUT);
if (CLSP(discardp)) {
delwin(CLSP(discardp));
discardp->cl_private = NULL;
}
}
/* no screens got a piece; we're done */
if (!acquirep)
return 0;
for (; (tsp = *acquirep) != NULL; ++acquirep) {
clp = CLP(tsp);
F_SET(clp, CL_LAYOUT);
if (CLSP(tsp))
delwin(CLSP(tsp));
tsp->cl_private = subwin(stdscr, tsp->rows, tsp->cols,
tsp->roff, tsp->coff);
}
/* discardp is going away, acquirep is taking up its space. */
return (0);
}
/*
@ -333,9 +388,7 @@ cl_deleteln(sp)
* PUBLIC: int cl_ex_adjust __P((SCR *, exadj_t));
*/
int
cl_ex_adjust(sp, action)
SCR *sp;
exadj_t action;
cl_ex_adjust(SCR *sp, exadj_t action)
{
CL_PRIVATE *clp;
int cnt;
@ -390,14 +443,15 @@ cl_ex_adjust(sp, action)
* PUBLIC: int cl_insertln __P((SCR *));
*/
int
cl_insertln(sp)
SCR *sp;
cl_insertln(SCR *sp)
{
WINDOW *win;
win = CLSP(sp) ? CLSP(sp) : stdscr;
/*
* The current line is expected to be blank after this operation,
* and the screen must support that semantic.
*/
return (insertln() == ERR);
return (winsertln(win) == ERR);
}
/*
@ -407,11 +461,7 @@ cl_insertln(sp)
* 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_keyval(SCR *sp, scr_keyval_t val, CHAR_T *chp, int *dnep)
{
CL_PRIVATE *clp;
@ -449,14 +499,14 @@ cl_keyval(sp, val, chp, dnep)
* PUBLIC: int cl_move __P((SCR *, size_t, size_t));
*/
int
cl_move(sp, lno, cno)
SCR *sp;
size_t lno, cno;
cl_move(SCR *sp, size_t lno, size_t cno)
{
WINDOW *win;
win = CLSP(sp) ? CLSP(sp) : stdscr;
/* 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);
if (wmove(win, RLNO(sp, lno), RCNO(sp, cno)) == ERR) {
msgq(sp, M_ERR, "Error: move: l(%zu + %zu) c(%zu + %zu)",
lno, sp->roff, cno, sp->coff);
return (1);
}
return (0);
@ -469,13 +519,17 @@ cl_move(sp, lno, cno)
* PUBLIC: int cl_refresh __P((SCR *, int));
*/
int
cl_refresh(sp, repaint)
SCR *sp;
int repaint;
cl_refresh(SCR *sp, int repaint)
{
GS *gp;
CL_PRIVATE *clp;
WINDOW *win;
SCR *psp, *tsp;
size_t y, x;
gp = sp->gp;
clp = CLP(sp);
win = CLSP(sp) ? CLSP(sp) : stdscr;
/*
* If we received a killer signal, we're done, there's no point
@ -488,13 +542,57 @@ cl_refresh(sp, repaint)
* 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.
*
* If repaint set or the screen layout changed, we need to redraw
* any lines separating vertically split screens. If the horizontal
* offsets are the same, then the split was vertical, and need to
* draw a dividing line.
*/
if (repaint || F_ISSET(clp, CL_LAYOUT)) {
getyx(stdscr, y, x);
for (psp = sp; psp != NULL; psp = TAILQ_NEXT(psp, q))
for (tsp = TAILQ_NEXT(psp, q); tsp != NULL;
tsp = TAILQ_NEXT(tsp, q))
if (psp->roff == tsp->roff) {
if (psp->coff + psp->cols + 1 == tsp->coff)
cl_rdiv(psp);
else
if (tsp->coff + tsp->cols + 1 == psp->coff)
cl_rdiv(tsp);
}
(void)wmove(stdscr, y, x);
F_CLR(clp, CL_LAYOUT);
}
/*
* 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);
/*
* Only do an actual refresh, when this is the focus window,
* i.e. the one holding the cursor. This assumes that refresh
* is called for that window after refreshing the others.
* This prevents the cursor being drawn in the other windows.
*/
return (wnoutrefresh(stdscr) == ERR ||
wnoutrefresh(win) == ERR ||
(sp == clp->focus && doupdate() == ERR));
}
/*
* cl_rdiv --
* Draw a dividing line between two vertically split screens.
*/
static void
cl_rdiv(SCR *sp)
{
#ifdef __NetBSD__
mvvline(sp->roff, sp->cols + sp->coff, '|', sp->rows);
#else
mvvline(sp->roff, sp->cols + sp->coff, ACS_VLINE, sp->rows);
#endif
}
/*
@ -504,40 +602,97 @@ cl_refresh(sp, repaint)
* PUBLIC: int cl_rename __P((SCR *, char *, int));
*/
int
cl_rename(sp, name, on)
SCR *sp;
char *name;
int on;
cl_rename(SCR *sp, char *name, int on)
{
GS *gp;
CL_PRIVATE *clp;
char *ttype;
FILE *pfp;
char buf[256], *s, *e;
char * wid;
char cmd[64];
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);
clp->focus = sp;
if (!F_ISSET(clp, CL_RENAME_OK) ||
strncmp(OG_STR(gp, GO_TERM), "xterm", 5))
return (0);
if (clp->oname == NULL && (wid = getenv("WINDOWID"))) {
snprintf(cmd, sizeof(cmd), "xprop -id %s WM_NAME", wid);
if ((pfp = popen(cmd, "r")) == NULL)
goto rename;
if (fgets(buf, sizeof(buf), pfp) == NULL) {
pclose(pfp);
goto rename;
}
pclose(pfp);
if ((s = strchr(buf, '"')) != NULL &&
(e = strrchr(buf, '"')) != NULL)
clp->oname = strndup(s + 1, e - s - 1);
}
rename: cl_setname(gp, name);
F_SET(clp, CL_RENAME);
} else
if (F_ISSET(clp, CL_RENAME)) {
cl_setname(gp, clp->oname);
F_CLR(clp, CL_RENAME);
(void)printf(XTERM_RENAME, ttype);
(void)fflush(stdout);
}
return (0);
}
/*
* cl_setname --
* Set a X11 icon/window name.
*
* PUBLIC: void cl_setname __P((GS *, char *));
*/
void
cl_setname(GS *gp, char *name)
{
/* X11 xterm escape sequence to rename the icon/window. */
#define XTERM_RENAME "\033]0;%s\007"
(void)printf(XTERM_RENAME, name == NULL ? OG_STR(gp, GO_TERM) : name);
(void)fflush(stdout);
#undef XTERM_RENAME
}
/*
* cl_split --
* Split a screen.
*
* PUBLIC: int cl_split __P((SCR *, SCR *));
*/
int
cl_split(SCR *origp, SCR *newp)
{
CL_PRIVATE *clp;
clp = CLP(origp);
F_SET(clp, CL_LAYOUT);
if (CLSP(origp))
delwin(CLSP(origp));
origp->cl_private = subwin(stdscr, origp->rows, origp->cols,
origp->roff, origp->coff);
newp->cl_private = subwin(stdscr, newp->rows, newp->cols,
newp->roff, newp->coff);
/* origp is the original screen, giving up space to newp. */
return (0);
}
/*
* cl_suspend --
* Suspend a screen.
@ -545,18 +700,18 @@ cl_rename(sp, name, on)
* PUBLIC: int cl_suspend __P((SCR *, int *));
*/
int
cl_suspend(sp, allowedp)
SCR *sp;
int *allowedp;
cl_suspend(SCR *sp, int *allowedp)
{
struct termios t;
CL_PRIVATE *clp;
WINDOW *win;
GS *gp;
size_t oldy, oldx;
size_t y, x;
int changed;
gp = sp->gp;
clp = CLP(sp);
win = CLSP(sp) ? CLSP(sp) : stdscr;
*allowedp = 1;
/*
@ -596,9 +751,9 @@ cl_suspend(sp, allowedp)
* 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();
getyx(win, y, x);
(void)wmove(win, LINES - 1, 0);
(void)wrefresh(win);
/*
* Temporarily end the screen. System V introduced a semantic where
@ -607,10 +762,8 @@ cl_suspend(sp, allowedp)
* 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);
@ -618,11 +771,8 @@ cl_suspend(sp, allowedp)
/* 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
@ -647,14 +797,11 @@ cl_suspend(sp, allowedp)
return (0);
}
#ifdef HAVE_BSD_CURSES
/* Restore terminal settings. */
wrefresh(win); /* Needed on SunOs/Solaris ? */
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);
@ -662,7 +809,7 @@ cl_suspend(sp, allowedp)
(void)keypad(stdscr, TRUE);
/* Refresh and repaint the screen. */
(void)move(oldy, oldx);
(void)wmove(win, y, x);
(void)cl_refresh(sp, 1);
/* If the screen changed size, set the SIGWINCH bit. */
@ -681,7 +828,7 @@ cl_suspend(sp, allowedp)
* PUBLIC: void cl_usage __P((void));
*/
void
cl_usage()
cl_usage(void)
{
#define USAGE "\
usage: ex [-eFRrSsv] [-c command] [-t tag] [-w size] [file ...]\n\
@ -695,8 +842,9 @@ usage: vi [-eFlRrSv] [-c command] [-t tag] [-w size] [file ...]\n"
* gdbrefresh --
* Stub routine so can flush out curses screen changes using gdb.
*/
int
gdbrefresh()
static int
__attribute__((unused))
gdbrefresh(void)
{
refresh();
return (0); /* XXX Convince gdb to run it. */

View File

@ -10,27 +10,26 @@
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)cl_main.c 10.36 (Berkeley) 10/14/96";
static const char sccsid[] = "$Id: cl_main.c,v 10.55 2011/08/15 19:52:28 zy Exp $";
#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>
#ifdef HAVE_TERM_H
#include <term.h>
#endif
#include <termios.h>
#include <unistd.h>
#include "../common/common.h"
#ifdef RUNNING_IP
#include "../ip/ip.h"
#endif
#include "cl.h"
#include "pathnames.h"
@ -50,16 +49,14 @@ static void term_init __P((char *, char *));
* This is the main loop for the standalone curses editor.
*/
int
main(argc, argv)
int argc;
char *argv[];
main(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;
char **p_av, **t_av, *ttype;
/* If loaded at 0 and jumping through a NULL pointer, stop. */
if (reenter++)
@ -73,8 +70,6 @@ main(argc, argv)
* 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;
@ -84,33 +79,9 @@ main(argc, argv)
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);
@ -164,10 +135,8 @@ main(argc, argv)
* XXX
* Reset the X11 xterm icon/window name.
*/
if (F_ISSET(clp, CL_RENAME)) {
(void)printf(XTERM_RENAME, ttype);
(void)fflush(stdout);
}
if (F_ISSET(clp, CL_RENAME))
cl_setname(gp, clp->oname);
/* If a killer signal arrived, pretend we just got it. */
if (clp->killersig) {
@ -178,7 +147,10 @@ main(argc, argv)
/* Free the global and CL private areas. */
#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY)
if (clp->oname != NULL)
free(clp->oname);
free(clp);
free(OG_STR(gp, GO_TERM));
free(gp);
#endif
@ -190,10 +162,8 @@ main(argc, argv)
* Create and partially initialize the GS structure.
*/
static GS *
gs_init(name)
char *name;
gs_init(char *name)
{
CL_PRIVATE *clp;
GS *gp;
char *p;
@ -206,7 +176,6 @@ gs_init(name)
if (gp == NULL)
perr(name, NULL);
gp->progname = name;
return (gp);
}
@ -216,8 +185,7 @@ gs_init(name)
* Create and partially initialize the CL structure.
*/
static CL_PRIVATE *
cl_init(gp)
GS *gp;
cl_init(GS *gp)
{
CL_PRIVATE *clp;
int fd;
@ -265,8 +233,7 @@ tcfail: perr(gp->progname, "tcgetattr");
* Initialize terminal information.
*/
static void
term_init(name, ttype)
char *name, *ttype;
term_init(char *name, char *ttype)
{
int err;
@ -287,8 +254,7 @@ term_init(name, ttype)
#define GLOBAL_CLP \
CL_PRIVATE *clp = GCLP(__global_list);
static void
h_hup(signo)
int signo;
h_hup(int signo)
{
GLOBAL_CLP;
@ -297,8 +263,7 @@ h_hup(signo)
}
static void
h_int(signo)
int signo;
h_int(int signo)
{
GLOBAL_CLP;
@ -306,8 +271,7 @@ h_int(signo)
}
static void
h_term(signo)
int signo;
h_term(int signo)
{
GLOBAL_CLP;
@ -316,8 +280,7 @@ h_term(signo)
}
static void
h_winch(signo)
int signo;
h_winch(int signo)
{
GLOBAL_CLP;
@ -332,9 +295,7 @@ h_winch(signo)
* PUBLIC: int sig_init __P((GS *, SCR *));
*/
int
sig_init(gp, sp)
GS *gp;
SCR *sp;
sig_init(GS *gp, SCR *sp)
{
CL_PRIVATE *clp;
@ -376,10 +337,7 @@ sig_init(gp, sp)
* Set a signal handler.
*/
static int
setsig(signo, oactp, handler)
int signo;
struct sigaction *oactp;
void (*handler) __P((int));
setsig(int signo, struct sigaction *oactp, void (*handler) (int))
{
struct sigaction act;
@ -410,8 +368,7 @@ setsig(signo, oactp, handler)
* End signal setup.
*/
static void
sig_end(gp)
GS *gp;
sig_end(GS *gp)
{
CL_PRIVATE *clp;
@ -429,17 +386,20 @@ sig_end(gp)
* Initialize the standard curses functions.
*/
static void
cl_func_std(gp)
GS *gp;
cl_func_std(GS *gp)
{
gp->scr_addstr = cl_addstr;
gp->scr_waddstr = cl_waddstr;
gp->scr_attr = cl_attr;
gp->scr_baud = cl_baud;
gp->scr_bell = cl_bell;
gp->scr_busy = NULL;
gp->scr_child = NULL;
gp->scr_clrtoeol = cl_clrtoeol;
gp->scr_cursor = cl_cursor;
gp->scr_deleteln = cl_deleteln;
gp->scr_reply = NULL;
gp->scr_discard = cl_discard;
gp->scr_event = cl_event;
gp->scr_ex_adjust = cl_ex_adjust;
gp->scr_fmap = cl_fmap;
@ -451,6 +411,7 @@ cl_func_std(gp)
gp->scr_refresh = cl_refresh;
gp->scr_rename = cl_rename;
gp->scr_screen = cl_screen;
gp->scr_split = cl_split;
gp->scr_suspend = cl_suspend;
gp->scr_usage = cl_usage;
}
@ -460,8 +421,7 @@ cl_func_std(gp)
* Print system error.
*/
static void
perr(name, msg)
char *name, *msg;
perr(char *name, char *msg)
{
(void)fprintf(stderr, "%s:", name);
if (msg != NULL)

View File

@ -10,18 +10,14 @@
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)cl_read.c 10.15 (Berkeley) 9/24/96";
static const char sccsid[] = "$Id: cl_read.c,v 10.30 2012/07/12 18:28:58 zy Exp $";
#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>
@ -35,8 +31,12 @@ static const char sccsid[] = "@(#)cl_read.c 10.15 (Berkeley) 9/24/96";
#include "../ex/script.h"
#include "cl.h"
/* Pollution by Solaris curses. */
#undef columns
#undef lines
static input_t cl_read __P((SCR *,
u_int32_t, CHAR_T *, size_t, int *, struct timeval *));
u_int32_t, char *, size_t, int *, struct timeval *));
static int cl_resize __P((SCR *, size_t, size_t));
/*
@ -46,16 +46,15 @@ static int cl_resize __P((SCR *, size_t, size_t));
* 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;
cl_event(SCR *sp, EVENT *evp, u_int32_t flags, int ms)
{
struct timeval t, *tp;
CL_PRIVATE *clp;
size_t lines, columns;
int changed, nr;
int changed, nr = 0;
CHAR_T *wp;
size_t wlen;
int rc;
/*
* Queue signal based events. We never clear SIGHUP or SIGTERM events,
@ -102,12 +101,25 @@ retest: if (LF_ISSET(EC_INTERRUPT) || F_ISSET(clp, CL_SIGINT)) {
}
/* Read input characters. */
read:
switch (cl_read(sp, LF_ISSET(EC_QUOTED | EC_RAW),
clp->ibuf, sizeof(clp->ibuf), &nr, tp)) {
clp->ibuf + clp->skip, SIZE(clp->ibuf) - clp->skip, &nr, tp)) {
case INP_OK:
evp->e_csp = clp->ibuf;
evp->e_len = nr;
rc = INPUT2INT5(sp, clp->cw, clp->ibuf, nr + clp->skip,
wp, wlen);
evp->e_csp = wp;
evp->e_len = wlen;
evp->e_event = E_STRING;
if (rc < 0) {
int n = -rc;
memmove(clp->ibuf, clp->ibuf + nr + clp->skip - n, n);
clp->skip = n;
if (wlen == 0)
goto read;
} else if (rc == 0)
clp->skip = 0;
else
msgq(sp, M_ERR, "323|Invalid input. Truncated.");
break;
case INP_EOF:
evp->e_event = E_EOF;
@ -131,19 +143,11 @@ retest: if (LF_ISSET(EC_INTERRUPT) || F_ISSET(clp, CL_SIGINT)) {
* 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;
cl_read(SCR *sp, u_int32_t flags, char *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;
@ -175,13 +179,10 @@ cl_read(sp, flags, bp, blen, nrp, tp)
* 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_ZERO(&rdfd);
FD_SET(STDIN_FILENO, &rdfd);
switch (select(STDIN_FILENO + 1,
&rdfd, NULL, NULL, tp == NULL ? &poll : tp)) {
switch (select(STDIN_FILENO + 1, &rdfd, NULL, NULL, tp)) {
case 0:
return (INP_TIMEOUT);
case -1:
@ -225,13 +226,11 @@ cl_read(sp, flags, bp, blen, nrp, tp)
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;
}
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();
@ -309,12 +308,10 @@ err: if (errno == EINTR)
* Reset the options for a resize event.
*/
static int
cl_resize(sp, lines, columns)
SCR *sp;
size_t lines, columns;
cl_resize(SCR *sp, size_t lines, size_t columns)
{
ARGS *argv[2], a, b;
char b1[1024];
CHAR_T b1[1024];
a.bp = b1;
b.bp = NULL;
@ -322,12 +319,10 @@ cl_resize(sp, lines, columns)
argv[0] = &a;
argv[1] = &b;
(void)snprintf(b1, sizeof(b1), "lines=%lu", (u_long)lines);
a.len = strlen(b1);
a.len = SPRINTF(b1, sizeof(b1), L("lines=%lu"), (u_long)lines);
if (opts_set(sp, argv, NULL))
return (1);
(void)snprintf(b1, sizeof(b1), "columns=%lu", (u_long)columns);
a.len = strlen(b1);
a.len = SPRINTF(b1, sizeof(b1), L("columns=%lu"), (u_long)columns);
if (opts_set(sp, argv, NULL))
return (1);
return (0);

View File

@ -5,27 +5,27 @@
* Keith Bostic. All rights reserved.
*
* See the LICENSE file for redistribution information.
*
* $FreeBSD$
*/
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)cl_screen.c 10.49 (Berkeley) 9/24/96";
static const char sccsid[] = "$Id: cl_screen.c,v 10.56 2002/05/03 19:59:44 skimo Exp $";
#endif /* not lint */
#include <sys/types.h>
#include <sys/queue.h>
#include <sys/time.h>
#include <bitstring.h>
#include <curses.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef HAVE_TERM_H
#include <term.h>
#endif
#include <termios.h>
#include <unistd.h>
@ -46,26 +46,30 @@ static int cl_putenv __P((char *, char *, u_long));
* PUBLIC: int cl_screen __P((SCR *, u_int32_t));
*/
int
cl_screen(sp, flags)
SCR *sp;
u_int32_t flags;
cl_screen(SCR *sp, u_int32_t flags)
{
CL_PRIVATE *clp;
WINDOW *win;
GS *gp;
gp = sp->gp;
clp = CLP(sp);
win = CLSP(sp) ? CLSP(sp) : stdscr;
/* See if the current information is incorrect. */
if (F_ISSET(gp, G_SRESTART)) {
if (CLSP(sp)) {
delwin(CLSP(sp));
sp->cl_private = NULL;
}
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))
if ((LF_ISSET(SC_EX) && F_ISSET(sp, SC_SCR_EX)) ||
(LF_ISSET(SC_VI) && F_ISSET(sp, SC_SCR_VI)))
return (0);
/*
@ -93,12 +97,12 @@ cl_screen(sp, flags)
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();
if (TAILQ_NEXT(sp, q) != NULL) {
(void)wmove(win, RLNO(sp, sp->rows), 0);
wclrtobot(win);
}
(void)move(RLNO(sp, sp->rows) - 1, 0);
refresh();
(void)wmove(win, RLNO(sp, sp->rows) - 1, 0);
wrefresh(win);
}
/* Enter the requested mode. */
@ -130,8 +134,7 @@ cl_screen(sp, flags)
* PUBLIC: int cl_quit __P((GS *));
*/
int
cl_quit(gp)
GS *gp;
cl_quit(GS *gp)
{
CL_PRIVATE *clp;
int rval;
@ -181,8 +184,7 @@ cl_quit(gp)
* Initialize the curses vi screen.
*/
static int
cl_vi_init(sp)
SCR *sp;
cl_vi_init(SCR *sp)
{
CL_PRIVATE *clp;
GS *gp;
@ -245,6 +247,7 @@ cl_vi_init(sp)
* The HP/UX newterm doesn't support the NULL first argument, so we
* have to specify the terminal type.
*/
(void)del_curterm(cur_term);
errno = 0;
if (newterm(ttype, stdout, stdin) == NULL) {
if (errno)
@ -385,8 +388,7 @@ err: (void)cl_vi_end(sp->gp);
* Shutdown the vi screen.
*/
static int
cl_vi_end(gp)
GS *gp;
cl_vi_end(GS *gp)
{
CL_PRIVATE *clp;
@ -429,8 +431,7 @@ cl_vi_end(gp)
* Initialize the ex screen.
*/
static int
cl_ex_init(sp)
SCR *sp;
cl_ex_init(SCR *sp)
{
CL_PRIVATE *clp;
@ -504,8 +505,7 @@ fast: if (tcsetattr(STDIN_FILENO, TCSADRAIN | TCSASOFT, &clp->ex_enter)) {
* Shutdown the ex screen.
*/
static int
cl_ex_end(gp)
GS *gp;
cl_ex_end(GS *gp)
{
CL_PRIVATE *clp;
@ -523,9 +523,7 @@ cl_ex_end(gp)
* PUBLIC: int cl_getcap __P((SCR *, char *, char **));
*/
int
cl_getcap(sp, name, elementp)
SCR *sp;
char *name, **elementp;
cl_getcap(SCR *sp, char *name, char **elementp)
{
size_t len;
char *t;
@ -543,8 +541,7 @@ cl_getcap(sp, name, elementp)
* Free any allocated termcap/terminfo strings.
*/
static void
cl_freecap(clp)
CL_PRIVATE *clp;
cl_freecap(CL_PRIVATE *clp)
{
if (clp->el != NULL) {
free(clp->el);
@ -566,6 +563,12 @@ cl_freecap(clp)
free(clp->smso);
clp->smso = NULL;
}
/* Required by libcursesw :) */
if (clp->cw.bp1.c != NULL) {
free(clp->cw.bp1.c);
clp->cw.bp1.c = NULL;
clp->cw.blen1 = 0;
}
}
/*
@ -573,10 +576,7 @@ cl_freecap(clp)
* Put a value into the environment.
*/
static int
cl_putenv(name, str, value)
char *name, *str;
u_long value;
cl_putenv(char *name, char *str, u_long value)
{
char buf[40];

View File

@ -10,7 +10,7 @@
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)cl_term.c 10.22 (Berkeley) 9/15/96";
static const char sccsid[] = "$Id: cl_term.c,v 10.33 2012/04/21 23:51:46 zy Exp $";
#endif /* not lint */
#include <sys/types.h>
@ -19,13 +19,15 @@ static const char sccsid[] = "@(#)cl_term.c 10.22 (Berkeley) 9/15/96";
#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>
#ifdef HAVE_TERM_H
#include <term.h>
#endif
#include <termios.h>
#include <unistd.h>
@ -82,20 +84,30 @@ static TKLIST const m2_tklist[] = { /* Input mappings (set or delete). */
* PUBLIC: int cl_term_init __P((SCR *));
*/
int
cl_term_init(sp)
SCR *sp;
cl_term_init(SCR *sp)
{
KEYLIST *kp;
SEQ *qp;
TKLIST const *tkp;
char *t;
CHAR_T name[60];
CHAR_T output[5];
CHAR_T ts[20];
CHAR_T *wp;
size_t wlen;
/* 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,
CHAR2INT(sp, tkp->name, strlen(tkp->name), wp, wlen);
MEMCPY(name, wp, wlen);
CHAR2INT(sp, t, strlen(t), wp, wlen);
MEMCPY(ts, wp, wlen);
CHAR2INT(sp, tkp->output, strlen(tkp->output), wp, wlen);
MEMCPY(output, wp, wlen);
if (seq_set(sp, name, strlen(tkp->name), ts, strlen(t),
output, strlen(tkp->output), SEQ_COMMAND,
SEQ_NOOVERWRITE | SEQ_SCREEN))
return (1);
}
@ -109,8 +121,13 @@ cl_term_init(sp)
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))
CHAR2INT(sp, tkp->name, strlen(tkp->name), wp, wlen);
MEMCPY(name, wp, wlen);
CHAR2INT(sp, t, strlen(t), wp, wlen);
MEMCPY(ts, wp, wlen);
output[0] = (UCHAR_T)kp->ch;
if (seq_set(sp, name, strlen(tkp->name), ts, strlen(t),
output, 1, SEQ_INPUT, SEQ_NOOVERWRITE | SEQ_SCREEN))
return (1);
}
@ -128,22 +145,33 @@ cl_term_init(sp)
if (!strcmp(t, "\b"))
continue;
if (tkp->output == NULL) {
if (seq_set(sp, tkp->name, strlen(tkp->name),
t, strlen(t), NULL, 0,
CHAR2INT(sp, tkp->name, strlen(tkp->name), wp, wlen);
MEMCPY(name, wp, wlen);
CHAR2INT(sp, t, strlen(t), wp, wlen);
MEMCPY(ts, wp, wlen);
if (seq_set(sp, name, strlen(tkp->name),
ts, 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),
} else {
CHAR2INT(sp, tkp->name, strlen(tkp->name), wp, wlen);
MEMCPY(name, wp, wlen);
CHAR2INT(sp, t, strlen(t), wp, wlen);
MEMCPY(ts, wp, wlen);
CHAR2INT(sp, tkp->output, strlen(tkp->output), wp, wlen);
MEMCPY(output, wp, wlen);
if (seq_set(sp, name, strlen(tkp->name),
ts, strlen(t), 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)
SLIST_FOREACH(qp, sp->gp->seqq, q)
if (F_ISSET(qp, SEQ_FUNCMAP))
(void)cl_pfmap(sp, qp->stype,
qp->input, qp->ilen, qp->output, qp->olen);
@ -157,17 +185,16 @@ cl_term_init(sp)
* PUBLIC: int cl_term_end __P((GS *));
*/
int
cl_term_end(gp)
GS *gp;
cl_term_end(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);
}
SLIST_FOREACH_SAFE(qp, gp->seqq, q, nqp)
if (F_ISSET(qp, SEQ_SCREEN)) {
SLIST_REMOVE_HEAD(gp->seqq, q);
(void)seq_free(qp);
}
return (0);
}
@ -178,11 +205,7 @@ cl_term_end(gp)
* 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;
cl_fmap(SCR *sp, seq_t stype, CHAR_T *from, size_t flen, CHAR_T *to, size_t tlen)
{
/* Ignore until the screen is running, do the real work then. */
if (F_ISSET(sp, SC_VI) && !F_ISSET(sp, SC_SCR_VI))
@ -198,28 +221,33 @@ cl_fmap(sp, stype, from, flen, to, tlen)
* 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;
cl_pfmap(SCR *sp, seq_t stype, CHAR_T *from, size_t flen, CHAR_T *to, size_t tlen)
{
size_t nlen;
char *p, keyname[64];
char *p;
char name[64];
CHAR_T keyname[64];
CHAR_T ts[20];
CHAR_T *wp;
size_t wlen;
(void)snprintf(keyname, sizeof(keyname), "kf%d", atoi(from + 1));
if ((p = tigetstr(keyname)) == NULL ||
(void)snprintf(name, sizeof(name), "kf%d",
(int)STRTOL(from+1,NULL,10));
if ((p = tigetstr(name)) == 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");
msgq_wstr(sp, M_ERR, from, "233|This terminal has no %s key");
return (1);
}
nlen = snprintf(keyname,
sizeof(keyname), "function key %d", atoi(from + 1));
nlen = SPRINTF(keyname,
SIZE(keyname), L("function key %d"),
(int)STRTOL(from+1,NULL,10));
CHAR2INT(sp, p, strlen(p), wp, wlen);
MEMCPY(ts, wp, wlen);
return (seq_set(sp, keyname, nlen,
p, strlen(p), to, tlen, stype, SEQ_NOOVERWRITE | SEQ_SCREEN));
ts, strlen(p), to, tlen, stype, SEQ_NOOVERWRITE | SEQ_SCREEN));
}
/*
@ -229,11 +257,7 @@ cl_pfmap(sp, stype, from, flen, to, tlen)
* 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_optchange(SCR *sp, int opt, char *str, u_long *valp)
{
CL_PRIVATE *clp;
@ -251,14 +275,10 @@ cl_optchange(sp, opt, str, valp)
F_CLR(sp, SC_SCR_EX | SC_SCR_VI);
break;
case O_MESG:
(void)cl_omesg(sp, clp, !*valp);
(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);
/*
@ -267,6 +287,10 @@ cl_optchange(sp, opt, str, valp)
*/
if (sp->frp != NULL && sp->frp->name != NULL)
(void)cl_rename(sp, sp->frp->name, 1);
} else {
F_CLR(clp, CL_RENAME_OK);
(void)cl_rename(sp, NULL, 0);
}
break;
}
@ -280,10 +304,7 @@ cl_optchange(sp, opt, str, valp)
* PUBLIC: int cl_omesg __P((SCR *, CL_PRIVATE *, int));
*/
int
cl_omesg(sp, clp, on)
SCR *sp;
CL_PRIVATE *clp;
int on;
cl_omesg(SCR *sp, CL_PRIVATE *clp, int on)
{
struct stat sb;
char *tty;
@ -329,15 +350,9 @@ cl_omesg(sp, clp, on)
* 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;
cl_ssize(SCR *sp, int sigwinch, size_t *rowp, size_t *colp, int *changedp)
{
#ifdef TIOCGWINSZ
struct winsize win;
#endif
size_t col, row;
int rval;
char *p;
@ -358,12 +373,10 @@ cl_ssize(sp, sigwinch, rowp, colp, changedp)
* 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) {
/*
@ -453,8 +466,7 @@ noterm: if (row == 0)
* PUBLIC: int cl_putchar __P((int));
*/
int
cl_putchar(ch)
int ch;
cl_putchar(int ch)
{
return (putchar(ch));
}

View File

@ -1,32 +1,4 @@
#ifndef HAVE_CURSES_ADDNSTR
int addnstr __P((char *, int));
#endif
#ifndef HAVE_CURSES_BEEP
void beep __P((void));
#endif
#ifndef HAVE_CURSES_FLASH
void flash __P((void));
#endif
#ifndef HAVE_CURSES_IDLOK
void idlok __P((WINDOW *, int));
#endif
#ifndef HAVE_CURSES_KEYPAD
int keypad __P((void *, int));
#endif
#ifndef HAVE_CURSES_NEWTERM
void *newterm __P((const char *, FILE *, FILE *));
#endif
#ifndef HAVE_CURSES_SETUPTERM
void setupterm __P((char *, int, int *));
#endif
#ifdef HAVE_CURSES_TIGETSTR
char *tigetstr();
#else
char *tigetstr __P((char *));
#endif
#ifndef HAVE_CURSES_TIGETSTR
int tigetnum __P((char *));
#endif
int cl_waddstr __P((SCR *, const CHAR_T *, size_t));
int cl_addstr __P((SCR *, const char *, size_t));
int cl_attr __P((SCR *, scr_attr_t, int));
int cl_baud __P((SCR *, u_long *));
@ -34,12 +6,15 @@ int cl_bell __P((SCR *));
int cl_clrtoeol __P((SCR *));
int cl_cursor __P((SCR *, size_t *, size_t *));
int cl_deleteln __P((SCR *));
int cl_discard __P((SCR *, SCR **));
int cl_ex_adjust __P((SCR *, exadj_t));
int cl_insertln __P((SCR *));
int cl_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *));
int cl_move __P((SCR *, size_t, size_t));
int cl_refresh __P((SCR *, int));
int cl_rename __P((SCR *, char *, int));
void cl_setname __P((GS *, char *));
int cl_split __P((SCR *, SCR *));
int cl_suspend __P((SCR *, int *));
void cl_usage __P((void));
int sig_init __P((GS *, SCR *));

View File

@ -1,160 +0,0 @@
/*
* 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

@ -1,22 +0,0 @@
#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);
}

View File

@ -1,130 +0,0 @@
/*
* 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,147 +0,0 @@
/*-
* 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
}

View File

@ -1,137 +0,0 @@
/*-
* 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,133 +0,0 @@
/*
* 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[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <ctype.h>
static int _gettemp();
/*
* PUBLIC: #ifndef HAVE_MKSTEMP
* PUBLIC: int mkstemp __P((char *));
* PUBLIC: #endif
*/
mkstemp(path)
char *path;
{
int fd;
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;
}
/*
* check the target directory; if you have six X's and it
* doesn't exist this runs for a *very* long time.
*/
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;
}
}
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);
/* 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*/
}

View File

@ -1,50 +0,0 @@
#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

@ -1,45 +0,0 @@
#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,74 +0,0 @@
/*
* 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
* 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[] = "@(#)strerror.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include <string.h>
/*
* PUBLIC: #ifndef HAVE_STRERROR
* PUBLIC: char *strerror __P((int));
* PUBLIC: #endif
*/
char *
strerror(num)
int num;
{
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(ebuf);
}

View File

@ -1,85 +0,0 @@
/*-
* 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[] = "@(#)strsep.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include <string.h>
#include <stdio.h>
/*
* Get next token from string *stringp, where tokens are possibly-empty
* strings separated by characters from delim.
*
* 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
*/
char *
strsep(stringp, delim)
register char **stringp;
register const char *delim;
{
register char *s;
register const char *spanp;
register int c, sc;
char *tok;
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 */
}

View File

@ -1,134 +0,0 @@
/*-
* 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,113 +0,0 @@
/*
* 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[] = "@(#)strtoul.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 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
*/
unsigned long
strtoul(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;
/*
* 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;
}
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

@ -1,31 +0,0 @@
#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
}

View File

@ -1,525 +0,0 @@
/*-
* 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));
}

View File

@ -6,7 +6,7 @@
*
* See the LICENSE file for redistribution information.
*
* @(#)args.h 10.2 (Berkeley) 3/6/96
* $Id: args.h,v 10.2 1996/03/06 19:50:07 bostic Exp $
*/
/*

View File

@ -6,15 +6,9 @@
*
* See the LICENSE file for redistribution information.
*
* @(#)common.h 10.13 (Berkeley) 9/25/96
* $Id: common.h,v 10.22 2012/04/13 05:21:50 zy Exp $
*/
/*
* 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
@ -29,6 +23,8 @@
*/
typedef struct _cb CB;
typedef struct _csc CSC;
typedef struct _conv CONV;
typedef struct _conv_win CONVWIN;
typedef struct _event EVENT;
typedef struct _excmd EXCMD;
typedef struct _exf EXF;
@ -48,7 +44,7 @@ typedef struct _tagq TAGQ;
typedef struct _text TEXT;
/* Autoindent state. */
typedef enum { C_NOTSET, C_CARATSET, C_NOCHANGE, C_ZEROSET } carat_t;
typedef enum { C_NOTSET, C_CARATSET, C_ZEROSET } carat_t;
/* Busy message types. */
typedef enum { BUSY_ON = 1, BUSY_OFF, BUSY_UPDATE } busy_t;
@ -86,6 +82,7 @@ typedef enum { SEQ_ABBREV, SEQ_COMMAND, SEQ_INPUT } seq_t;
#include "seq.h" /* Required by screen.h. */
#include "util.h" /* Required by ex.h. */
#include "mark.h" /* Required by gs.h. */
#include "conv.h" /* Required by ex.h and screen.h */
#include "../ex/ex.h" /* Required by gs.h. */
#include "gs.h" /* Required by screen.h. */
#include "screen.h" /* Required by exf.h. */
@ -93,4 +90,4 @@ typedef enum { SEQ_ABBREV, SEQ_COMMAND, SEQ_INPUT } seq_t;
#include "log.h"
#include "mem.h"
#include "com_extern.h"
#include "extern.h"

446
contrib/nvi/common/conv.c Normal file
View File

@ -0,0 +1,446 @@
/*-
* 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.
* Copyright (c) 2011, 2012
* Zhihao Yuan. All rights reserved.
*
* See the LICENSE file for redistribution information.
*/
#include "config.h"
#ifndef lint
static const char sccsid[] = "$Id: conv.c,v 2.39 2013/07/01 23:28:13 zy Exp $";
#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 <langinfo.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include "common.h"
/*
* codeset --
* Get the locale encoding.
*
* PUBLIC: char * codeset __P((void));
*/
char *
codeset(void) {
static char *cs;
if (cs == NULL)
cs = nl_langinfo(CODESET);
return cs;
}
#ifdef USE_WIDECHAR
static int
raw2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw,
size_t *tolen, CHAR_T **dst)
{
int i;
CHAR_T **tostr = &cw->bp1.wc;
size_t *blen = &cw->blen1;
BINC_RETW(NULL, *tostr, *blen, len);
*tolen = len;
for (i = 0; i < len; ++i)
(*tostr)[i] = (u_char) str[i];
*dst = cw->bp1.wc;
return 0;
}
#define CONV_BUFFER_SIZE 512
/* fill the buffer with codeset encoding of string pointed to by str
* left has the number of bytes left in str and is adjusted
* len contains the number of bytes put in the buffer
*/
#ifdef USE_ICONV
#define CONVERT(str, left, src, len) \
do { \
size_t outleft; \
char *bp = buffer; \
outleft = CONV_BUFFER_SIZE; \
errno = 0; \
if (iconv(id, (iconv_src_t)&str, &left, &bp, &outleft) == -1 && \
errno != E2BIG) \
goto err; \
if ((len = CONV_BUFFER_SIZE - outleft) == 0) { \
error = -left; \
goto err; \
} \
src = buffer; \
} while (0)
#define IC_RESET() \
do { \
if (id != (iconv_t)-1) \
iconv(id, NULL, NULL, NULL, NULL); \
} while(0)
#else
#define CONVERT(str, left, src, len)
#define IC_RESET()
#endif
static int
default_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw,
size_t *tolen, CHAR_T **dst, iconv_t id)
{
size_t i = 0, j;
CHAR_T **tostr = &cw->bp1.wc;
size_t *blen = &cw->blen1;
mbstate_t mbs;
size_t n;
ssize_t nlen = len;
char *src = (char *)str;
#ifdef USE_ICONV
char buffer[CONV_BUFFER_SIZE];
#endif
size_t left = len;
int error = 1;
BZERO(&mbs, 1);
BINC_RETW(NULL, *tostr, *blen, nlen);
#ifdef USE_ICONV
if (id != (iconv_t)-1)
CONVERT(str, left, src, len);
#endif
for (i = 0, j = 0; j < len; ) {
n = mbrtowc((*tostr)+i, src+j, len-j, &mbs);
/* NULL character converted */
if (n == -2) error = -(len-j);
if (n == -1 || n == -2) goto err;
if (n == 0) n = 1;
j += n;
if (++i >= *blen) {
nlen += 256;
BINC_RETW(NULL, *tostr, *blen, nlen);
}
if (id != (iconv_t)-1 && j == len && left) {
CONVERT(str, left, src, len);
j = 0;
}
}
error = 0;
err:
*tolen = i;
*dst = cw->bp1.wc;
IC_RESET();
return error;
}
static int
fe_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw,
size_t *tolen, CHAR_T **dst)
{
return default_char2int(sp, str, len, cw, tolen, dst,
sp->conv.id[IC_FE_CHAR2INT]);
}
static int
ie_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw,
size_t *tolen, CHAR_T **dst)
{
return default_char2int(sp, str, len, cw, tolen, dst,
sp->conv.id[IC_IE_CHAR2INT]);
}
static int
cs_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw,
size_t *tolen, CHAR_T **dst)
{
return default_char2int(sp, str, len, cw, tolen, dst,
(iconv_t)-1);
}
static int
int2raw(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw,
size_t *tolen, char **dst)
{
int i;
char **tostr = &cw->bp1.c;
size_t *blen = &cw->blen1;
BINC_RETC(NULL, *tostr, *blen, len);
*tolen = len;
for (i = 0; i < len; ++i)
(*tostr)[i] = str[i];
*dst = cw->bp1.c;
return 0;
}
static int
default_int2char(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw,
size_t *tolen, char **pdst, iconv_t id)
{
size_t i, j, offset = 0;
char **tostr = &cw->bp1.c;
size_t *blen = &cw->blen1;
mbstate_t mbs;
size_t n;
ssize_t nlen = len + MB_CUR_MAX;
char *dst;
size_t buflen;
#ifdef USE_ICONV
char buffer[CONV_BUFFER_SIZE];
#endif
int error = 1;
/* convert first len bytes of buffer and append it to cw->bp
* len is adjusted => 0
* offset contains the offset in cw->bp and is adjusted
* cw->bp is grown as required
*/
#ifdef USE_ICONV
#define CONVERT2(_buffer, lenp, cw, offset) \
do { \
char *bp = _buffer; \
int ret; \
do { \
size_t outleft = cw->blen1 - offset; \
char *obp = cw->bp1.c + offset; \
if (cw->blen1 < offset + MB_CUR_MAX) { \
nlen += 256; \
BINC_RETC(NULL, cw->bp1.c, cw->blen1, nlen); \
} \
errno = 0; \
ret = iconv(id, (iconv_src_t)&bp, lenp, &obp, &outleft); \
if (ret == -1 && errno != E2BIG) \
goto err; \
offset = cw->blen1 - outleft; \
} while (ret != 0); \
} while (0)
#else
#define CONVERT2(_buffer, lenp, cw, offset)
#endif
BZERO(&mbs, 1);
BINC_RETC(NULL, *tostr, *blen, nlen);
dst = *tostr; buflen = *blen;
#ifdef USE_ICONV
if (id != (iconv_t)-1) {
dst = buffer; buflen = CONV_BUFFER_SIZE;
}
#endif
for (i = 0, j = 0; i < len; ++i) {
n = wcrtomb(dst+j, str[i], &mbs);
if (n == -1) goto err;
j += n;
if (buflen < j + MB_CUR_MAX) {
if (id != (iconv_t)-1) {
CONVERT2(buffer, &j, cw, offset);
} else {
nlen += 256;
BINC_RETC(NULL, *tostr, *blen, nlen);
dst = *tostr; buflen = *blen;
}
}
}
n = wcrtomb(dst+j, L'\0', &mbs);
j += n - 1; /* don't count NUL at the end */
*tolen = j;
if (id != (iconv_t)-1) {
CONVERT2(buffer, &j, cw, offset);
CONVERT2(NULL, NULL, cw, offset); /* back to the initial state */
*tolen = offset;
}
error = 0;
err:
if (error)
*tolen = j;
*pdst = cw->bp1.c;
IC_RESET();
return error;
}
static int
fe_int2char(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw,
size_t *tolen, char **dst)
{
return default_int2char(sp, str, len, cw, tolen, dst,
sp->conv.id[IC_FE_INT2CHAR]);
}
static int
cs_int2char(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw,
size_t *tolen, char **dst)
{
return default_int2char(sp, str, len, cw, tolen, dst,
(iconv_t)-1);
}
#endif
/*
* conv_init --
* Initialize the iconv environment.
*
* PUBLIC: void conv_init __P((SCR *, SCR *));
*/
void
conv_init(SCR *orig, SCR *sp)
{
int i;
if (orig == NULL)
setlocale(LC_ALL, "");
if (orig != NULL)
BCOPY(&orig->conv, &sp->conv, 1);
#ifdef USE_WIDECHAR
else {
char *ctype = setlocale(LC_CTYPE, NULL);
/*
* XXX
* This hack fixes the libncursesw issue on FreeBSD.
*/
if (!strcmp(ctype, "ko_KR.CP949"))
setlocale(LC_CTYPE, "ko_KR.eucKR");
else if (!strcmp(ctype, "zh_CN.GB2312"))
setlocale(LC_CTYPE, "zh_CN.eucCN");
else if (!strcmp(ctype, "zh_CN.GBK"))
setlocale(LC_CTYPE, "zh_CN.GB18030");
/*
* Switch to 8bit mode if locale is C;
* LC_CTYPE should be reseted to C if unmatched.
*/
if (!strcmp(ctype, "C") || !strcmp(ctype, "POSIX")) {
sp->conv.sys2int = sp->conv.file2int = raw2int;
sp->conv.int2sys = sp->conv.int2file = int2raw;
sp->conv.input2int = raw2int;
} else {
sp->conv.sys2int = cs_char2int;
sp->conv.int2sys = cs_int2char;
sp->conv.file2int = fe_char2int;
sp->conv.int2file = fe_int2char;
sp->conv.input2int = ie_char2int;
}
#ifdef USE_ICONV
o_set(sp, O_INPUTENCODING, OS_STRDUP, codeset(), 0);
#endif
}
#endif
/* iconv descriptors must be distinct to screens. */
for (i = 0; i <= IC_IE_TO_UTF16; ++i)
sp->conv.id[i] = (iconv_t)-1;
#ifdef USE_ICONV
conv_enc(sp, O_INPUTENCODING, 0);
#endif
}
/*
* conv_enc --
* Convert file/input encoding.
*
* PUBLIC: int conv_enc __P((SCR *, int, char *));
*/
int
conv_enc(SCR *sp, int option, char *enc)
{
#if defined(USE_WIDECHAR) && defined(USE_ICONV)
iconv_t *c2w, *w2c;
switch (option) {
case O_FILEENCODING:
c2w = sp->conv.id + IC_FE_CHAR2INT;
w2c = sp->conv.id + IC_FE_INT2CHAR;
if (!enc) enc = O_STR(sp, O_FILEENCODING);
if (*c2w != (iconv_t)-1)
iconv_close(*c2w);
if (*w2c != (iconv_t)-1)
iconv_close(*w2c);
if (strcasecmp(codeset(), enc)) {
if ((*c2w = iconv_open(codeset(), enc)) == (iconv_t)-1)
goto err;
if ((*w2c = iconv_open(enc, codeset())) == (iconv_t)-1)
goto err;
} else *c2w = *w2c = (iconv_t)-1;
break;
case O_INPUTENCODING:
c2w = sp->conv.id + IC_IE_CHAR2INT;
w2c = sp->conv.id + IC_IE_TO_UTF16;
if (!enc) enc = O_STR(sp, O_INPUTENCODING);
if (*c2w != (iconv_t)-1)
iconv_close(*c2w);
if (*w2c != (iconv_t)-1)
iconv_close(*w2c);
if (strcasecmp(codeset(), enc)) {
if ((*c2w = iconv_open(codeset(), enc)) == (iconv_t)-1)
goto err;
} else *c2w = (iconv_t)-1;
/* UTF-16 can not be locale and can not be inputed. */
if ((*w2c = iconv_open("utf-16be", enc)) == (iconv_t)-1)
goto err;
break;
}
F_CLR(sp, SC_CONV_ERROR);
F_SET(sp, SC_SCR_REFORMAT);
return 0;
err:
#endif
switch (option) {
case O_FILEENCODING:
msgq(sp, M_ERR,
"321|File encoding conversion not supported");
break;
case O_INPUTENCODING:
msgq(sp, M_ERR,
"322|Input encoding conversion not supported");
break;
}
return 1;
}
/*
* conv_end --
* Close the iconv descriptors, release the buffer.
*
* PUBLIC: void conv_end __P((SCR *));
*/
void
conv_end(SCR *sp)
{
#if defined(USE_WIDECHAR) && defined(USE_ICONV)
int i;
for (i = 0; i <= IC_IE_TO_UTF16; ++i)
if (sp->conv.id[i] != (iconv_t)-1)
iconv_close(sp->conv.id[i]);
if (sp->cw.bp1.c != NULL)
free(sp->cw.bp1.c);
#endif
}

57
contrib/nvi/common/conv.h Normal file
View File

@ -0,0 +1,57 @@
/*-
* 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) 2011, 2012
* Zhihao Yuan. All rights reserved.
*
* See the LICENSE file for redistribution information.
*
* $Id: conv.h,v 2.32 2013/03/11 01:20:53 zy Exp $
*/
#ifdef USE_ICONV
#include <iconv.h>
#ifdef ICONV_TRADITIONAL
typedef char ** iconv_src_t;
#else
typedef char const ** iconv_src_t;
#endif
#else
typedef int iconv_t;
#endif
/*
* XXX
* We can not use MB_CUR_MAX here, since UTF-8 may report it as 6, but
* a sequence longer than 4 is deprecated by RFC 3629.
*/
#define KEY_NEEDSWIDE(sp, ch) \
(INTISWIDE(ch) && KEY_LEN(sp, ch) <= 4)
#define KEY_COL(sp, ch) \
(KEY_NEEDSWIDE(sp, ch) ? CHAR_WIDTH(sp, ch) : KEY_LEN(sp, ch))
enum { IC_FE_CHAR2INT, IC_FE_INT2CHAR, IC_IE_CHAR2INT, IC_IE_TO_UTF16 };
struct _conv_win {
union {
char *c;
CHAR_T *wc;
} bp1;
size_t blen1;
};
typedef int (*char2wchar_t)
(SCR *, const char *, ssize_t, struct _conv_win *, size_t *, CHAR_T **);
typedef int (*wchar2char_t)
(SCR *, const CHAR_T *, ssize_t, struct _conv_win *, size_t *, char **);
struct _conv {
char2wchar_t sys2int;
wchar2char_t int2sys;
char2wchar_t file2int;
wchar2char_t int2file;
char2wchar_t input2int;
iconv_t id[IC_IE_TO_UTF16 + 1];
};

View File

@ -10,7 +10,7 @@
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)cut.c 10.10 (Berkeley) 9/15/96";
static const char sccsid[] = "$Id: cut.c,v 10.12 2012/02/11 15:52:33 zy Exp $";
#endif /* not lint */
#include <sys/types.h>
@ -64,14 +64,15 @@ static void cb_rotate __P((SCR *));
* PUBLIC: int cut __P((SCR *, CHAR_T *, MARK *, MARK *, int));
*/
int
cut(sp, namep, fm, tm, flags)
SCR *sp;
CHAR_T *namep;
MARK *fm, *tm;
int flags;
cut(
SCR *sp,
CHAR_T *namep,
MARK *fm,
MARK *tm,
int flags)
{
CB *cbp;
CHAR_T name;
CHAR_T name = '\0';
recno_t lno;
int append, copy_one, copy_def;
@ -100,19 +101,19 @@ cut(sp, namep, fm, tm, flags)
append = copy_one = copy_def = 0;
if (namep != NULL) {
name = *namep;
if (LF_ISSET(CUT_NUMREQ) || LF_ISSET(CUT_NUMOPT) &&
(LF_ISSET(CUT_LINEMODE) || fm->lno != tm->lno)) {
if (LF_ISSET(CUT_NUMREQ) || (LF_ISSET(CUT_NUMOPT) &&
(LF_ISSET(CUT_LINEMODE) || fm->lno != tm->lno))) {
copy_one = 1;
cb_rotate(sp);
}
if ((append = isupper(name)) == 1) {
if ((append = isupper(name))) {
if (!copy_one)
copy_def = 1;
name = tolower(name);
}
namecb: CBNAME(sp, cbp, name);
} else if (LF_ISSET(CUT_NUMREQ) || LF_ISSET(CUT_NUMOPT) &&
(LF_ISSET(CUT_LINEMODE) || fm->lno != tm->lno)) {
} else if (LF_ISSET(CUT_NUMREQ) || (LF_ISSET(CUT_NUMOPT) &&
(LF_ISSET(CUT_LINEMODE) || fm->lno != tm->lno))) {
name = '1';
cb_rotate(sp);
goto namecb;
@ -127,26 +128,25 @@ namecb: CBNAME(sp, cbp, name);
if (cbp == NULL) {
CALLOC_RET(sp, cbp, CB *, 1, sizeof(CB));
cbp->name = name;
CIRCLEQ_INIT(&cbp->textq);
LIST_INSERT_HEAD(&sp->gp->cutq, cbp, q);
TAILQ_INIT(cbp->textq);
SLIST_INSERT_HEAD(sp->gp->cutq, cbp, q);
} else if (!append) {
text_lfree(&cbp->textq);
text_lfree(cbp->textq);
cbp->len = 0;
cbp->flags = 0;
}
#define ENTIRE_LINE 0
/* In line mode, it's pretty easy, just cut the lines. */
if (LF_ISSET(CUT_LINEMODE)) {
cbp->flags |= CB_LMODE;
for (lno = fm->lno; lno <= tm->lno; ++lno)
if (cut_line(sp, lno, 0, 0, cbp))
if (cut_line(sp, lno, 0, ENTIRE_LINE, 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.
* Get the first line. A length of ENTIRE_LINE causes
* cut_line to cut from the MARK to the end of the line.
*/
if (cut_line(sp, fm->lno, fm->cno, fm->lno != tm->lno ?
ENTIRE_LINE : (tm->cno - fm->cno) + 1, cbp))
@ -180,7 +180,7 @@ namecb: CBNAME(sp, cbp, name);
return (0);
cut_line_err:
text_lfree(&cbp->textq);
text_lfree(cbp->textq);
cbp->len = 0;
cbp->flags = 0;
return (1);
@ -191,45 +191,29 @@ namecb: CBNAME(sp, cbp, name);
* Rotate the numbered buffers up one.
*/
static void
cb_rotate(sp)
SCR *sp;
cb_rotate(SCR *sp)
{
CB *cbp, *del_cbp;
CB *cbp, *del_cbp = NULL, *pre_cbp = NULL;
del_cbp = NULL;
for (cbp = sp->gp->cutq.lh_first; cbp != NULL; cbp = cbp->q.le_next)
SLIST_FOREACH(cbp, sp->gp->cutq, q) {
switch(cbp->name) {
case '1':
cbp->name = '2';
break;
case '2':
cbp->name = '3';
break;
case '3':
cbp->name = '4';
break;
case '4':
cbp->name = '5';
break;
case '5':
cbp->name = '6';
break;
case '6':
cbp->name = '7';
break;
case '7':
cbp->name = '8';
break;
case '8':
cbp->name = '9';
case '1': case '2': case '3':
case '4': case '5': case '6':
case '7': case '8':
cbp->name += 1;
break;
case '9':
if (cbp == SLIST_FIRST(sp->gp->cutq))
SLIST_REMOVE_HEAD(sp->gp->cutq, q);
else
SLIST_REMOVE_AFTER(pre_cbp, q);
del_cbp = cbp;
break;
}
pre_cbp = cbp;
}
if (del_cbp != NULL) {
LIST_REMOVE(del_cbp, q);
text_lfree(&del_cbp->textq);
text_lfree(del_cbp->textq);
free(del_cbp);
}
}
@ -241,15 +225,16 @@ cb_rotate(sp)
* PUBLIC: int cut_line __P((SCR *, recno_t, size_t, size_t, CB *));
*/
int
cut_line(sp, lno, fcno, clen, cbp)
SCR *sp;
recno_t lno;
size_t fcno, clen;
CB *cbp;
cut_line(
SCR *sp,
recno_t lno,
size_t fcno,
size_t clen,
CB *cbp)
{
TEXT *tp;
size_t len;
char *p;
CHAR_T *p;
/* Get the line. */
if (db_get(sp, lno, DBG_FATAL, &p, &len))
@ -264,14 +249,14 @@ cut_line(sp, lno, fcno, clen, cbp)
* copy the portion we want, and reset the TEXT length.
*/
if (len != 0) {
if (clen == 0)
if (clen == ENTIRE_LINE)
clen = len - fcno;
memcpy(tp->lb, p + fcno, clen);
MEMCPY(tp->lb, p + fcno, clen);
tp->len = clen;
}
/* Append to the end of the cut buffer. */
CIRCLEQ_INSERT_TAIL(&cbp->textq, tp, q);
TAILQ_INSERT_TAIL(cbp->textq, tp, q);
cbp->len += tp->len;
return (0);
@ -284,36 +269,36 @@ cut_line(sp, lno, fcno, clen, cbp)
* PUBLIC: void cut_close __P((GS *));
*/
void
cut_close(gp)
GS *gp;
cut_close(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);
while ((cbp = SLIST_FIRST(gp->cutq)) != NULL) {
if (!TAILQ_EMPTY(cbp->textq))
text_lfree(cbp->textq);
SLIST_REMOVE_HEAD(gp->cutq, q);
free(cbp);
}
/* Free default cut storage. */
cbp = &gp->dcb_store;
if (cbp->textq.cqh_first != (void *)&cbp->textq)
text_lfree(&cbp->textq);
if (!TAILQ_EMPTY(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));
* PUBLIC: TEXT *text_init __P((SCR *, const CHAR_T *, size_t, size_t));
*/
TEXT *
text_init(sp, p, len, total_len)
SCR *sp;
const char *p;
size_t len, total_len;
text_init(
SCR *sp,
const CHAR_T *p,
size_t len,
size_t total_len)
{
TEXT *tp;
@ -321,14 +306,14 @@ text_init(sp, p, len, total_len)
if (tp == NULL)
return (NULL);
/* ANSI C doesn't define a call to malloc(3) for 0 bytes. */
if ((tp->lb_len = total_len) != 0) {
if ((tp->lb_len = total_len * sizeof(CHAR_T)) != 0) {
MALLOC(sp, tp->lb, CHAR_T *, tp->lb_len);
if (tp->lb == NULL) {
free(tp);
return (NULL);
}
if (p != NULL && len != 0)
memcpy(tp->lb, p, len);
MEMCPY(tp->lb, p, len);
}
tp->len = len;
return (tp);
@ -341,13 +326,12 @@ text_init(sp, p, len, total_len)
* PUBLIC: void text_lfree __P((TEXTH *));
*/
void
text_lfree(headp)
TEXTH *headp;
text_lfree(TEXTH *headp)
{
TEXT *tp;
while ((tp = headp->cqh_first) != (void *)headp) {
CIRCLEQ_REMOVE(headp, tp, q);
while ((tp = TAILQ_FIRST(headp)) != NULL) {
TAILQ_REMOVE(headp, tp, q);
text_free(tp);
}
}
@ -359,8 +343,7 @@ text_lfree(headp)
* PUBLIC: void text_free __P((TEXT *));
*/
void
text_free(tp)
TEXT *tp;
text_free(TEXT *tp)
{
if (tp->lb != NULL)
free(tp->lb);

View File

@ -6,16 +6,17 @@
*
* See the LICENSE file for redistribution information.
*
* @(#)cut.h 10.5 (Berkeley) 4/3/96
* $Id: cut.h,v 10.10 2012/02/11 15:52:33 zy Exp $
*/
typedef struct _texth TEXTH; /* TEXT list head structure. */
CIRCLEQ_HEAD(_texth, _text);
TAILQ_HEAD(_texth, _text);
/* Cut buffers. */
struct _cb {
LIST_ENTRY(_cb) q; /* Linked list of cut buffers. */
TEXTH textq; /* Linked list of TEXT structures. */
SLIST_ENTRY(_cb) q; /* Linked list of cut buffers. */
TEXTH textq[1]; /* Linked list of TEXT structures. */
/* XXXX Needed ? Can non ascii-chars be cut buffer names ? */
CHAR_T name; /* Cut buffer name. */
size_t len; /* Total length of cut text. */
@ -25,13 +26,15 @@ struct _cb {
/* 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. */
TAILQ_ENTRY(_text) q; /* Linked list of text structures. */
CHAR_T *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. */
#define ENTIRE_LINE ((size_t)-1) /* cno: end of the 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). */
@ -65,8 +68,7 @@ struct _text { /* Text: a linked list of lines. */
#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) \
SLIST_FOREACH(cbp, sp->gp->cutq, q) \
if (cbp->name == L__name) \
break; \
}

View File

@ -10,11 +10,12 @@
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)delete.c 10.12 (Berkeley) 10/23/96";
static const char sccsid[] = "$Id: delete.c,v 10.18 2012/02/11 15:52:33 zy Exp $";
#endif /* not lint */
#include <sys/types.h>
#include <sys/queue.h>
#include <sys/time.h>
#include <bitstring.h>
#include <errno.h>
@ -32,14 +33,15 @@ static const char sccsid[] = "@(#)delete.c 10.12 (Berkeley) 10/23/96";
* PUBLIC: int del __P((SCR *, MARK *, MARK *, int));
*/
int
del(sp, fm, tm, lmode)
SCR *sp;
MARK *fm, *tm;
int lmode;
del(
SCR *sp,
MARK *fm,
MARK *tm,
int lmode)
{
recno_t lno;
size_t blen, len, nlen, tlen;
char *bp, *p;
CHAR_T *bp, *p;
int eof, rval;
bp = NULL;
@ -66,7 +68,7 @@ del(sp, fm, tm, lmode)
if (tm->lno == lno) {
if (db_get(sp, lno, DBG_FATAL, &p, &len))
return (1);
eof = tm->cno >= len ? 1 : 0;
eof = tm->cno != ENTIRE_LINE && tm->cno >= len ? 1 : 0;
} else
eof = 1;
if (eof) {
@ -80,8 +82,8 @@ del(sp, fm, tm, lmode)
}
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);
GET_SPACE_RETW(sp, bp, blen, fm->cno);
MEMCPY(bp, p, fm->cno);
if (db_set(sp, fm->lno, bp, fm->cno))
return (1);
goto done;
@ -92,10 +94,11 @@ del(sp, fm, tm, lmode)
if (tm->lno == fm->lno) {
if (db_get(sp, fm->lno, DBG_FATAL, &p, &len))
return (1);
GET_SPACE_RET(sp, bp, blen, len);
GET_SPACE_RETW(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));
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;
@ -110,8 +113,8 @@ del(sp, fm, tm, lmode)
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);
GET_SPACE_RETW(sp, bp, blen, tlen + 256);
MEMCPY(bp, p, tlen);
}
/* Copy the end partial line into place. */
@ -130,11 +133,11 @@ del(sp, fm, tm, lmode)
goto err;
}
if (tlen == 0) {
GET_SPACE_RET(sp, bp, blen, nlen);
GET_SPACE_RETW(sp, bp, blen, nlen);
} else
ADD_SPACE_RET(sp, bp, blen, nlen);
ADD_SPACE_RETW(sp, bp, blen, nlen);
memcpy(bp + tlen, p + (tm->cno + 1), len - (tm->cno + 1));
MEMCPY(bp + tlen, p + (tm->cno + 1), len - (tm->cno + 1));
tlen += len - (tm->cno + 1);
}
@ -155,6 +158,6 @@ done: rval = 0;
if (0)
err: rval = 1;
if (bp != NULL)
FREE_SPACE(sp, bp, blen);
FREE_SPACEW(sp, bp, blen);
return (rval);
}

View File

@ -0,0 +1,230 @@
/*-
* Copyright (c) 2011, 2012
* Zhihao Yuan. All rights reserved.
*
* See the LICENSE file for redistribution information.
*/
#ifndef lint
static const char sccsid[] = "$Id: encoding.c,v 1.4 2011/12/13 19:40:52 zy Exp $";
#endif /* not lint */
#include <sys/types.h>
int looks_utf8 __P((const char *, size_t));
int looks_utf16 __P((const char *, size_t));
int decode_utf8 __P((const char *));
int decode_utf16 __P((const char *, int));
#define F 0 /* character never appears in text */
#define T 1 /* character appears in plain ASCII text */
#define I 2 /* character appears in ISO-8859 text */
#define X 3 /* character appears in non-ISO extended ASCII (Mac, IBM PC) */
static char text_chars[256] = {
/* BEL BS HT LF FF CR */
F, F, F, F, F, F, F, T, T, T, T, F, T, T, F, F, /* 0x0X */
/* ESC */
F, F, F, F, F, F, F, F, F, F, F, T, F, F, F, F, /* 0x1X */
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x2X */
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x3X */
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x4X */
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x5X */
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x6X */
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, F, /* 0x7X */
/* NEL */
X, X, X, X, X, T, X, X, X, X, X, X, X, X, X, X, /* 0x8X */
X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, /* 0x9X */
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xaX */
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xbX */
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xcX */
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xdX */
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xeX */
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I /* 0xfX */
};
/*
* looks_utf8 --
* Decide whether some text looks like UTF-8. Returns:
*
* -1: invalid UTF-8
* 0: uses odd control characters, so doesn't look like text
* 1: 7-bit text
* 2: definitely UTF-8 text (valid high-bit set bytes)
*
* Based on RFC 3629. UTF-8 with BOM is not accepted.
*
* PUBLIC: int looks_utf8 __P((const char *, size_t));
*/
int
looks_utf8(const char *ibuf, size_t nbytes)
{
const u_char *buf = (u_char *)ibuf;
size_t i;
int n;
int gotone = 0, ctrl = 0;
for (i = 0; i < nbytes; i++) {
if ((buf[i] & 0x80) == 0) { /* 0xxxxxxx is plain ASCII */
/*
* Even if the whole file is valid UTF-8 sequences,
* still reject it if it uses weird control characters.
*/
if (text_chars[buf[i]] != T)
ctrl = 1;
} else if ((buf[i] & 0x40) == 0) { /* 10xxxxxx never 1st byte */
return -1;
} else { /* 11xxxxxx begins UTF-8 */
int following;
if ((buf[i] & 0x20) == 0) /* 110xxxxx */
if (buf[i] > 0xC1) /* C0, C1 */
following = 1;
else return -1;
else if ((buf[i] & 0x10) == 0) /* 1110xxxx */
following = 2;
else if ((buf[i] & 0x08) == 0) /* 11110xxx */
if (buf[i] < 0xF5)
following = 3;
else return -1; /* F5, F6, F7 */
else
return -1; /* F8~FF */
for (n = 0; n < following; n++) {
i++;
if (i >= nbytes)
goto done;
if (buf[i] & 0x40) /* 10xxxxxx */
return -1;
}
gotone = 1;
}
}
done:
return ctrl ? 0 : (gotone ? 2 : 1);
}
/*
* looks_utf16 --
* Decide whether some text looks like UTF-16. Returns:
*
* 0: invalid UTF-16
* 1: Little-endian UTF-16
* 2: Big-endian UTF-16
*
* PUBLIC: int looks_utf16 __P((const char *, size_t));
*/
int
looks_utf16(const char *ibuf, size_t nbytes)
{
const u_char *buf = (u_char *)ibuf;
int bigend;
size_t i;
unsigned int c;
int bom;
int following = 0;
if (nbytes < 2)
return 0;
bom = buf[0] << 8 ^ buf[1];
if (bom == 0xFFFE)
bigend = 0;
else if (bom == 0xFEFF)
bigend = 1;
else
return 0;
for (i = 2; i + 1 < nbytes; i += 2) {
if (bigend)
c = buf[i] << 8 ^ buf[i + 1];
else
c = buf[i] ^ buf[i + 1] << 8;
if (!following)
if (c < 0xD800 || c > 0xDFFF)
if (c < 128 && text_chars[c] != T)
return 0;
else
following = 0;
else if (c > 0xDBFF)
return 0;
else {
following = 1;
continue;
}
else if (c < 0xDC00 || c > 0xDFFF)
return 0;
}
return 1 + bigend;
}
#undef F
#undef T
#undef I
#undef X
/*
* decode_utf8 --
* Decode a UTF-8 character from byte string to Unicode.
* Returns -1 if the first byte is a not UTF-8 leader.
*
* Based on RFC 3629, but without error detection.
*
* PUBLIC: int decode_utf8 __P((const char *));
*/
int decode_utf8(const char *ibuf) {
const u_char *buf = (u_char *)ibuf;
int u = -1;
if ((buf[0] & 0x80) == 0)
u = buf[0];
else if ((buf[0] & 0x40) == 0);
else {
if ((buf[0] & 0x20) == 0)
u = (buf[0] ^ 0xC0) << 6 ^ (buf[1] ^ 0x80);
else if ((buf[0] & 0x10) == 0)
u = (buf[0] ^ 0xE0) << 12 ^ (buf[1] ^ 0x80) << 6
^ (buf[2] ^ 0x80);
else if (((buf[0] & 0x08) == 0))
u = (buf[0] ^ 0xF0) << 18 ^ (buf[1] ^ 0x80) << 12
^ (buf[2] ^ 0x80) << 6 ^ (buf[3] ^ 0x80);
}
return u;
}
/*
* decode_utf16 --
* Decode a UTF-16 character from byte string to Unicode.
* Returns -1 if the first unsigned integer is invalid.
*
* No error detection on supplementary bytes.
*
* PUBLIC: int decode_utf16 __P((const char *, int));
*/
int decode_utf16(const char* ibuf, int bigend) {
const u_char *buf = (u_char *)ibuf;
int u = -1;
unsigned int w1, w2;
if (bigend)
w1 = buf[0] << 8 ^ buf[1];
else
w1 = buf[0] ^ buf[1] << 8;
if (w1 < 0xD800 || w1 > 0xDFFF)
u = w1;
else if (w1 > 0xDBFF);
else {
if (bigend)
w2 = buf[2] << 8 ^ buf[3];
else
w2 = buf[2] ^ buf[3] << 8;
u = ((w1 ^ 0xD800) << 10 ^ (w2 ^ 0xDC00)) + 0x10000;
}
return u;
}

View File

@ -5,23 +5,18 @@
* Keith Bostic. All rights reserved.
*
* See the LICENSE file for redistribution information.
*
*/
#include "config.h"
#ifndef lint
#if 0
static const char sccsid[] = "@(#)exf.c 10.49 (Berkeley) 10/10/96";
#endif
static const char rcsid[] =
"$FreeBSD$";
static const char sccsid[] = "$Id: exf.c,v 10.62 2013/07/01 23:28:13 zy Exp $";
#endif /* not lint */
#include <sys/param.h>
#include <sys/types.h> /* XXX: param.h may not have included types.h */
#include <sys/types.h>
#include <sys/queue.h>
#include <sys/stat.h>
#include <sys/time.h>
/*
* We include <sys/file.h>, because the flock(2) and open(2) #defines
@ -44,6 +39,7 @@ static const char rcsid[] =
static int file_backup __P((SCR *, char *, char *));
static void file_cinit __P((SCR *));
static void file_encinit __P((SCR *));
static void file_comment __P((SCR *));
static int file_spath __P((SCR *, FREF *, struct stat *, int *));
@ -60,12 +56,12 @@ static int file_spath __P((SCR *, FREF *, struct stat *, int *));
* vi now remembers the last location in any file that it has ever edited,
* not just the previously edited file.
*
* PUBLIC: FREF *file_add __P((SCR *, CHAR_T *));
* PUBLIC: FREF *file_add __P((SCR *, char *));
*/
FREF *
file_add(sp, name)
SCR *sp;
CHAR_T *name;
file_add(
SCR *sp,
char *name)
{
GS *gp;
FREF *frp, *tfrp;
@ -81,15 +77,12 @@ file_add(sp, name)
*/
gp = sp->gp;
if (name != NULL)
for (frp = gp->frefq.cqh_first;
frp != (FREF *)&gp->frefq; frp = frp->q.cqe_next) {
TAILQ_FOREACH_SAFE(frp, gp->frefq, q, tfrp) {
if (frp->name == NULL) {
tfrp = frp->q.cqe_next;
CIRCLEQ_REMOVE(&gp->frefq, frp, q);
TAILQ_REMOVE(gp->frefq, frp, q);
if (frp->name != NULL)
free(frp->name);
free(frp);
frp = tfrp;
continue;
}
if (!strcmp(frp->name, name))
@ -114,7 +107,7 @@ file_add(sp, name)
}
/* Append into the chain of file names. */
CIRCLEQ_INSERT_TAIL(&gp->frefq, frp, q);
TAILQ_INSERT_TAIL(gp->frefq, frp, q);
return (frp);
}
@ -128,18 +121,18 @@ file_add(sp, name)
* PUBLIC: int file_init __P((SCR *, FREF *, char *, int));
*/
int
file_init(sp, frp, rcv_name, flags)
SCR *sp;
FREF *frp;
char *rcv_name;
int flags;
file_init(
SCR *sp,
FREF *frp,
char *rcv_name,
int flags)
{
EXF *ep;
RECNOINFO oinfo;
RECNOINFO oinfo = { 0 };
struct stat sb;
size_t psize;
int fd, exists, open_err, readonly;
char *oname, tname[MAXPATHLEN];
char *oname, *tname;
open_err = readonly = 0;
@ -169,7 +162,7 @@ file_init(sp, frp, rcv_name, flags)
*/
CALLOC_RET(sp, ep, EXF *, 1, sizeof(EXF));
ep->c_lno = ep->c_nlines = OOBLNO;
ep->rcv_fd = ep->fcntl_fd = -1;
ep->rcv_fd = -1;
F_SET(ep, F_FIRSTMODIFY);
/*
@ -187,52 +180,56 @@ file_init(sp, frp, rcv_name, flags)
*/
oname = frp->name;
if (LF_ISSET(FS_OPENERR) || oname == NULL || !exists) {
if (opts_empty(sp, O_TMP_DIRECTORY, 0))
struct stat sb;
if (opts_empty(sp, O_TMPDIR, 0))
goto err;
(void)snprintf(tname, sizeof(tname),
"%s/vi.XXXXXXXXXX", O_STR(sp, O_TMP_DIRECTORY));
if ((fd = mkstemp(tname)) == -1) {
if ((tname =
join(O_STR(sp, O_TMPDIR), "vi.XXXXXXXXXX")) == NULL) {
msgq(sp, M_SYSERR, NULL);
goto err;
}
if ((fd = mkstemp(tname)) == -1 || fstat(fd, &sb)) {
free(tname);
msgq(sp, M_SYSERR,
"237|Unable to create temporary file");
goto err;
}
(void)close(fd);
if (frp->name == NULL)
frp->tname = tname;
if (frp->name == NULL) {
F_SET(frp, FR_TMPFILE);
if ((frp->tname = strdup(tname)) == NULL ||
frp->name == NULL && (frp->name = strdup(tname)) == NULL) {
if (frp->tname != NULL)
free(frp->tname);
msgq(sp, M_SYSERR, NULL);
(void)unlink(tname);
goto err;
if ((frp->name = strdup(tname)) == NULL) {
msgq(sp, M_SYSERR, NULL);
goto err;
}
}
oname = frp->tname;
psize = 1024;
if (!LF_ISSET(FS_OPENERR))
F_SET(frp, FR_NEWFILE);
time(&ep->mtime);
ep->mtim = sb.st_mtimespec;
} else {
/*
* XXX
* A seat of the pants calculation: try to keep the file in
* 15 pages or less. Don't use a page size larger than 10K
* 15 pages or less. Don't use a page size larger than 16K
* (vi should have good locality) or smaller than 1K.
*/
psize = ((sb.st_size / 15) + 1023) / 1024;
if (psize > 10)
psize = 10;
if (psize > 16)
psize = 16;
if (psize == 0)
psize = 1;
psize *= 1024;
psize = p2roundup(psize) << 10;
F_SET(ep, F_DEVSET);
ep->mdev = sb.st_dev;
ep->minode = sb.st_ino;
ep->mtime = sb.st_mtime;
ep->mtim = sb.st_mtimespec;
if (!S_ISREG(sb.st_mode))
msgq_str(sp, M_ERR, oname,
@ -240,7 +237,6 @@ file_init(sp, frp, rcv_name, flags)
}
/* Set up recovery. */
memset(&oinfo, 0, sizeof(RECNOINFO));
oinfo.bval = '\n'; /* Always set. */
oinfo.psize = psize;
oinfo.flags = F_ISSET(sp->gp, G_SNAPSHOT) ? R_SNAPSHOT : 0;
@ -338,8 +334,7 @@ file_init(sp, frp, rcv_name, flags)
* an error.
*/
if (rcv_name == NULL)
switch (file_lock(sp, oname,
&ep->fcntl_fd, ep->db->fd(ep->db), 0)) {
switch (file_lock(sp, oname, ep->db->fd(ep->db), 0)) {
case LOCK_FAILED:
F_SET(frp, FR_UNLOCKED);
break;
@ -396,9 +391,9 @@ file_init(sp, frp, rcv_name, flags)
* probably isn't a problem for vi when it's running standalone.
*/
if (readonly || F_ISSET(sp, SC_READONLY) ||
!F_ISSET(frp, FR_NEWFILE) &&
(!F_ISSET(frp, FR_NEWFILE) &&
(!(sb.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)) ||
access(frp->name, W_OK)))
access(frp->name, W_OK))))
O_SET(sp, O_READONLY);
else
O_CLR(sp, O_READONLY);
@ -408,6 +403,9 @@ file_init(sp, frp, rcv_name, flags)
sp->ep = ep;
sp->frp = frp;
/* Detect and set the file encoding */
file_encinit(sp);
/* Set the initial cursor position, queue initial command. */
file_cinit(sp);
@ -446,16 +444,16 @@ oerr: if (F_ISSET(ep, F_RCV_ON))
* try and open.
*/
static int
file_spath(sp, frp, sbp, existsp)
SCR *sp;
FREF *frp;
struct stat *sbp;
int *existsp;
file_spath(
SCR *sp,
FREF *frp,
struct stat *sbp,
int *existsp)
{
CHAR_T savech;
int savech;
size_t len;
int found;
char *name, *p, *t, path[MAXPATHLEN];
char *name, *p, *t, *path;
/*
* If the name is NULL or an explicit reference (i.e., the first
@ -466,8 +464,8 @@ file_spath(sp, frp, sbp, existsp)
*existsp = 0;
return (0);
}
if (name[0] == '/' || name[0] == '.' &&
(name[1] == '/' || name[1] == '.' && name[2] == '/')) {
if (name[0] == '/' || (name[0] == '.' &&
(name[1] == '/' || (name[1] == '.' && name[2] == '/')))) {
*existsp = !stat(name, sbp);
return (0);
}
@ -481,16 +479,24 @@ file_spath(sp, frp, sbp, existsp)
/* Try the O_PATH option values. */
for (found = 0, p = t = O_STR(sp, O_PATH);; ++p)
if (*p == ':' || *p == '\0') {
if (t < p - 1) {
/*
* Ignore the empty strings and ".", since we've already
* tried the current directory.
*/
if (t < p && (p - t != 1 || *t != '.')) {
savech = *p;
*p = '\0';
len = snprintf(path,
sizeof(path), "%s/%s", t, name);
if ((path = join(t, name)) == NULL) {
msgq(sp, M_SYSERR, NULL);
break;
}
len = strlen(path);
*p = savech;
if (!stat(path, sbp)) {
found = 1;
break;
}
free(path);
}
t = p + 1;
if (*p == '\0')
@ -499,10 +505,8 @@ file_spath(sp, frp, sbp, existsp)
/* If we found it, build a new pathname and discard the old one. */
if (found) {
MALLOC_RET(sp, p, char *, len + 1);
memcpy(p, path, len + 1);
free(frp->name);
frp->name = p;
frp->name = path;
}
*existsp = found;
return (0);
@ -513,13 +517,14 @@ file_spath(sp, frp, sbp, existsp)
* Set up the initial cursor position.
*/
static void
file_cinit(sp)
SCR *sp;
file_cinit(SCR *sp)
{
GS *gp;
MARK m;
size_t len;
int nb;
CHAR_T *wp;
size_t wlen;
/* Set some basic defaults. */
sp->lno = 1;
@ -553,8 +558,9 @@ file_cinit(sp)
sp->lno = 1;
sp->cno = 0;
}
if (ex_run_str(sp,
"-c option", gp->c_option, strlen(gp->c_option), 1, 1))
CHAR2INT(sp, gp->c_option, strlen(gp->c_option) + 1,
wp, wlen);
if (ex_run_str(sp, "-c option", wp, wlen - 1, 1, 1))
return;
gp->c_option = NULL;
} else if (F_ISSET(sp, SC_EX)) {
@ -622,10 +628,10 @@ file_cinit(sp)
* PUBLIC: int file_end __P((SCR *, EXF *, int));
*/
int
file_end(sp, ep, force)
SCR *sp;
EXF *ep;
int force;
file_end(
SCR *sp,
EXF *ep,
int force)
{
FREF *frp;
@ -670,7 +676,7 @@ file_end(sp, ep, force)
free(frp->tname);
frp->tname = NULL;
if (F_ISSET(frp, FR_TMPFILE)) {
CIRCLEQ_REMOVE(&sp->gp->frefq, frp, q);
TAILQ_REMOVE(sp->gp->frefq, frp, q);
if (frp->name != NULL)
free(frp->name);
free(frp);
@ -712,14 +718,14 @@ file_end(sp, ep, force)
if (ep->rcv_mpath != NULL && unlink(ep->rcv_mpath))
msgq_str(sp, M_SYSERR, ep->rcv_mpath, "243|%s: remove");
}
if (ep->fcntl_fd != -1)
(void)close(ep->fcntl_fd);
if (ep->rcv_fd != -1)
(void)close(ep->rcv_fd);
if (ep->rcv_path != NULL)
free(ep->rcv_path);
if (ep->rcv_mpath != NULL)
free(ep->rcv_mpath);
if (ep->c_blen > 0)
free(ep->c_lp);
free(ep);
return (0);
@ -734,11 +740,12 @@ file_end(sp, ep, force)
* PUBLIC: int file_write __P((SCR *, MARK *, MARK *, char *, int));
*/
int
file_write(sp, fm, tm, name, flags)
SCR *sp;
MARK *fm, *tm;
char *name;
int flags;
file_write(
SCR *sp,
MARK *fm,
MARK *tm,
char *name,
int flags)
{
enum { NEWFILE, OLDFILE } mtype;
struct stat sb;
@ -749,7 +756,7 @@ file_write(sp, fm, tm, name, flags)
size_t len;
u_long nlno, nch;
int fd, nf, noname, oflags, rval;
char *p, *s, *t, buf[MAXPATHLEN + 64];
char *p, *s, *t, buf[1024];
const char *msgstr;
ep = sp->ep;
@ -812,9 +819,9 @@ file_write(sp, fm, tm, name, flags)
mtype = NEWFILE;
else {
if (noname && !LF_ISSET(FS_FORCE | FS_APPEND) &&
(F_ISSET(ep, F_DEVSET) &&
(sb.st_dev != ep->mdev || sb.st_ino != ep->minode) ||
sb.st_mtime != ep->mtime)) {
((F_ISSET(ep, F_DEVSET) &&
(sb.st_dev != ep->mdev || sb.st_ino != ep->minode)) ||
timespeccmp(&sb.st_mtimespec, &ep->mtim, !=))) {
msgq_str(sp, M_ERR, name, LF_ISSET(FS_POSSIBLE) ?
"250|%s: file modified more recently than this copy; use ! to override" :
"251|%s: file modified more recently than this copy");
@ -873,25 +880,10 @@ file_write(sp, fm, tm, name, flags)
SIGUNBLOCK;
/* Try and get a lock. */
if (!noname && file_lock(sp, NULL, NULL, fd, 0) == LOCK_UNAVAIL)
if (!noname && file_lock(sp, NULL, fd, 0) == LOCK_UNAVAIL)
msgq_str(sp, M_ERR, name,
"252|%s: write lock was unavailable");
#if __linux__
/*
* XXX
* In libc 4.5.x, fdopen(fd, "w") clears the O_APPEND flag (if set).
* 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.
*/
if (LF_ISSET(FS_APPEND) && lseek(fd, (off_t)0, SEEK_END) < 0) {
msgq(sp, M_SYSERR, name);
return (1);
}
#endif
/*
* Use stdio for buffering.
*
@ -925,13 +917,13 @@ file_write(sp, fm, tm, name, flags)
*/
if (noname)
if (stat(name, &sb))
time(&ep->mtime);
timepoint_system(&ep->mtim);
else {
F_SET(ep, F_DEVSET);
ep->mdev = sb.st_dev;
ep->minode = sb.st_ino;
ep->mtime = sb.st_mtime;
ep->mtim = sb.st_mtimespec;
}
/*
@ -1023,9 +1015,10 @@ file_write(sp, fm, tm, name, flags)
* recreate the file. So, let's not risk it.
*/
static int
file_backup(sp, name, bname)
SCR *sp;
char *name, *bname;
file_backup(
SCR *sp,
char *name,
char *bname)
{
struct dirent *dp;
struct stat sb;
@ -1035,6 +1028,10 @@ file_backup(sp, name, bname)
size_t blen;
int flags, maxnum, nr, num, nw, rfd, wfd, version;
char *bp, *estr, *p, *pct, *slash, *t, *wfname, buf[8192];
CHAR_T *wp;
size_t wlen;
size_t nlen;
char *d = NULL;
rfd = wfd = -1;
bp = estr = wfname = NULL;
@ -1064,15 +1061,20 @@ file_backup(sp, name, bname)
*
* Shell and file name expand the option's value.
*/
argv_init(sp, &cmd);
ex_cinit(&cmd, 0, 0, 0, 0, 0, NULL);
ex_cinit(sp, &cmd, 0, 0, 0, 0, 0);
if (bname[0] == 'N') {
version = 1;
++bname;
} else
version = 0;
if (argv_exp2(sp, &cmd, bname, strlen(bname)))
CHAR2INT(sp, bname, strlen(bname), wp, wlen);
if ((wp = v_wstrdup(sp, wp, wlen)) == NULL)
return (1);
if (argv_exp2(sp, &cmd, wp, wlen)) {
free(wp);
return (1);
}
free(wp);
/*
* 0 args: impossible.
@ -1095,9 +1097,13 @@ file_backup(sp, name, bname)
* by one.
*/
if (version) {
GET_SPACE_GOTO(sp, bp, blen, cmd.argv[0]->len * 2 + 50);
for (t = bp, slash = NULL,
p = cmd.argv[0]->bp; p[0] != '\0'; *t++ = *p++)
GET_SPACE_GOTOC(sp, bp, blen, cmd.argv[0]->len * 2 + 50);
INT2CHAR(sp, cmd.argv[0]->bp, cmd.argv[0]->len + 1,
p, nlen);
d = strdup(p);
p = d;
for (t = bp, slash = NULL;
p[0] != '\0'; *t++ = *p++)
if (p[0] == '%') {
if (p[1] != '%')
*t++ = '%';
@ -1118,7 +1124,8 @@ file_backup(sp, name, bname)
p = slash + 1;
}
if (dirp == NULL) {
estr = cmd.argv[0]->bp;
INT2CHAR(sp, cmd.argv[0]->bp, cmd.argv[0]->len + 1,
estr, nlen);
goto err;
}
@ -1132,7 +1139,8 @@ file_backup(sp, name, bname)
wfname = bp;
} else {
bp = NULL;
wfname = cmd.argv[0]->bp;
INT2CHAR(sp, cmd.argv[0]->bp, cmd.argv[0]->len + 1,
wfname, nlen);
}
/* Open the backup file, avoiding lurkers. */
@ -1192,22 +1200,69 @@ err: if (rfd != -1)
}
if (estr)
msgq_str(sp, M_SYSERR, estr, "%s");
if (d != NULL)
free(d);
if (bp != NULL)
FREE_SPACE(sp, bp, blen);
return (1);
}
/*
* file_encinit --
* Read the first line and set the O_FILEENCODING.
*/
static void
file_encinit(SCR *sp)
{
#if defined(USE_WIDECHAR) && defined(USE_ICONV)
size_t len;
char *p;
size_t blen = 0;
char buf[4096]; /* not need to be '\0'-terminated */
recno_t ln = 1;
EXF *ep;
ep = sp->ep;
while (!db_rget(sp, ln++, &p, &len)) {
if (blen + len > sizeof(buf))
len = sizeof(buf) - blen;
memcpy(buf + blen, p, len);
blen += len;
if (blen == sizeof(buf))
break;
else
buf[blen++] = '\n';
}
/*
* Detect UTF-8 and fallback to the locale/preset encoding.
*
* XXX
* A manually set O_FILEENCODING indicates the "fallback
* encoding", but UTF-8, which can be safely detected, is not
* inherited from the old screen.
*/
if (looks_utf8(buf, blen) > 1)
o_set(sp, O_FILEENCODING, OS_STRDUP, "utf-8", 0);
else if (!O_ISSET(sp, O_FILEENCODING) ||
!strncasecmp(O_STR(sp, O_FILEENCODING), "utf-8", 5))
o_set(sp, O_FILEENCODING, OS_STRDUP, codeset(), 0);
conv_enc(sp, O_FILEENCODING, 0);
#endif
}
/*
* file_comment --
* Skip the first comment.
*/
static void
file_comment(sp)
SCR *sp;
file_comment(SCR *sp)
{
recno_t lno;
size_t len;
char *p;
CHAR_T *p;
for (lno = 1; !db_get(sp, lno, 0, &p, &len) && len == 0; ++lno);
if (p == NULL)
@ -1250,9 +1305,10 @@ file_comment(sp)
* PUBLIC: int file_m1 __P((SCR *, int, int));
*/
int
file_m1(sp, force, flags)
SCR *sp;
int force, flags;
file_m1(
SCR *sp,
int force,
int flags)
{
EXF *ep;
@ -1290,9 +1346,9 @@ file_m1(sp, force, flags)
* PUBLIC: int file_m2 __P((SCR *, int));
*/
int
file_m2(sp, force)
SCR *sp;
int force;
file_m2(
SCR *sp,
int force)
{
EXF *ep;
@ -1322,9 +1378,9 @@ file_m2(sp, force)
* PUBLIC: int file_m3 __P((SCR *, int));
*/
int
file_m3(sp, force)
SCR *sp;
int force;
file_m3(
SCR *sp,
int force)
{
EXF *ep;
@ -1358,9 +1414,9 @@ file_m3(sp, force)
* PUBLIC: int file_aw __P((SCR *, int));
*/
int
file_aw(sp, flags)
SCR *sp;
int flags;
file_aw(
SCR *sp,
int flags)
{
if (!F_ISSET(sp->ep, F_MODIFIED))
return (0);
@ -1419,9 +1475,9 @@ file_aw(sp, flags)
* PUBLIC: void set_alt_name __P((SCR *, char *));
*/
void
set_alt_name(sp, name)
SCR *sp;
char *name;
set_alt_name(
SCR *sp,
char *name)
{
if (sp->alt_name != NULL)
free(sp->alt_name);
@ -1435,35 +1491,18 @@ set_alt_name(sp, name)
* file_lock --
* Get an exclusive lock on a file.
*
* XXX
* The default locking is flock(2) style, not fcntl(2). The latter is
* known to fail badly on some systems, and its only advantage is that
* it occasionally works over NFS.
*
* Furthermore, the semantics of fcntl(2) are wrong. The problems are
* two-fold: you can't close any file descriptor associated with the file
* without losing all of the locks, and you can't get an exclusive lock
* unless you have the file open for writing. Someone ought to be shot,
* but it's probably too late, they may already have reproduced. To get
* around these problems, nvi opens the files for writing when it can and
* acquires a second file descriptor when it can't. The recovery files
* are examples of the former, they're always opened for writing. The DB
* files can't be opened for writing because the semantics of DB are that
* files opened for writing are flushed back to disk when the DB session
* is ended. So, in that case we have to acquire an extra file descriptor.
*
* PUBLIC: lockr_t file_lock __P((SCR *, char *, int *, int, int));
* PUBLIC: lockr_t file_lock __P((SCR *, char *, int, int));
*/
lockr_t
file_lock(sp, name, fdp, fd, iswrite)
SCR *sp;
char *name;
int *fdp, fd, iswrite;
file_lock(
SCR *sp,
char *name,
int fd,
int iswrite)
{
if (!O_ISSET(sp, O_LOCKFILES))
return (LOCK_SUCCESS);
#ifdef HAVE_LOCK_FLOCK /* Hurrah! We've got flock(2). */
/*
* !!!
* We need to distinguish a lock not being available for the file
@ -1481,59 +1520,4 @@ file_lock(sp, name, fdp, fd, iswrite)
|| errno == EWOULDBLOCK
#endif
? LOCK_UNAVAIL : LOCK_FAILED);
#endif
#ifdef HAVE_LOCK_FCNTL /* Gag me. We've got fcntl(2). */
{
struct flock arg;
int didopen, sverrno;
arg.l_type = F_WRLCK;
arg.l_whence = 0; /* SEEK_SET */
arg.l_start = arg.l_len = 0;
arg.l_pid = 0;
/*
* If the file descriptor isn't opened for writing, it must fail.
* If we fail because we can't get a read/write file descriptor,
* we return LOCK_SUCCESS, believing that the file is readonly
* and that will be sufficient to warn the user.
*/
if (!iswrite) {
if (name == NULL || fdp == NULL)
return (LOCK_FAILED);
if ((fd = open(name, O_RDWR, 0)) == -1)
return (LOCK_SUCCESS);
*fdp = fd;
didopen = 1;
}
errno = 0;
if (!fcntl(fd, F_SETLK, &arg)) {
fcntl(fd, F_SETFD, 1);
return (LOCK_SUCCESS);
}
if (didopen) {
sverrno = errno;
(void)close(fd);
errno = sverrno;
}
/*
* !!!
* We need to distinguish a lock not being available for the file
* from the file system not supporting locking. Fcntl is documented
* as returning EACCESS and EAGAIN; add EWOULDBLOCK for good measure,
* and assume they are the former. There's no portable way to do this.
*/
return (errno == EACCES || errno == EAGAIN
#ifdef EWOULDBLOCK
|| errno == EWOULDBLOCK
#endif
? LOCK_UNAVAIL : LOCK_FAILED);
}
#endif
#if !defined(HAVE_LOCK_FLOCK) && !defined(HAVE_LOCK_FCNTL)
return (LOCK_SUCCESS);
#endif
}

View File

@ -6,7 +6,7 @@
*
* See the LICENSE file for redistribution information.
*
* @(#)exf.h 10.7 (Berkeley) 7/9/96
* $Id: exf.h,v 10.10 2012/07/06 16:03:37 zy Exp $
*/
/* Undo direction. */
/*
@ -18,8 +18,9 @@ struct _exf {
/* Underlying database state. */
DB *db; /* File db structure. */
char *c_lp; /* Cached line. */
CHAR_T *c_lp; /* Cached line. */
size_t c_len; /* Cached line length. */
size_t c_blen; /* Cached line buffer length. */
recno_t c_lno; /* Cached line number. */
recno_t c_nlines; /* Cached lines in the file. */
@ -31,17 +32,12 @@ struct _exf {
MARK l_cursor; /* Log cursor position. */
dir_t lundo; /* Last undo direction. */
LIST_HEAD(_markh, _lmark) marks;/* Linked list of file MARK's. */
/* Linked list of file MARK's. */
SLIST_HEAD(_markh, _lmark) marks[1];
/*
* 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. */
dev_t mdev; /* Device. */
ino_t minode; /* Inode. */
struct timespec mtim; /* Last modification time. */
/*
* Recovery in general, and these fields specifically, are described

View File

@ -1,94 +1,19 @@
#ifndef HAVE_BSEARCH
void *bsearch __P((const void *, const void *, size_t,
size_t, int (*)(const void *, const void *)));
#endif
#ifndef HAVE_SETENV
int setenv __P((const char *, const char *, int));
#endif
#ifndef HAVE_UNSETENV
void unsetenv __P((const char *));
#endif
#ifndef HAVE_GETHOSTNAME
int gethostname __P((char *, int));
#endif
#ifndef HAVE_GETOPT
int getopt __P((int, char * const *, const char *));
#endif
#ifndef HAVE_MEMCHR
void *memchr __P((const void *, int, size_t));
#endif
#ifndef HAVE_MEMCPY
void *memcpy __P((void *, const void *, size_t));
#endif
#ifndef HAVE_MEMMOVE
void *memmove __P((void *, const void *, size_t));
#endif
#ifndef HAVE_MEMSET
void *memset __P((void *, int, size_t));
#endif
#ifndef HAVE_MKSTEMP
int mkstemp __P((char *));
#endif
#ifndef HAVE_MMAP
char *mmap __P((char *, size_t, int, int, int, off_t));
#endif
#ifndef HAVE_MMAP
int munmap __P((char *, size_t));
#endif
#ifndef HAVE_SNPRINTF
int snprintf __P((char *, size_t, const char *, ...));
#endif
#ifndef HAVE_STRDUP
char *strdup __P((const char *));
#endif
#ifndef HAVE_STRERROR
char *strerror __P((int));
#endif
#ifndef HAVE_STRPBRK
char *strpbrk __P((const char *, const char *));
#endif
#ifndef HAVE_STRSEP
char *strsep __P((char **, const char *));
#endif
#ifndef HAVE_STRTOL
long strtol __P((const char *, char **, int));
#endif
#ifndef HAVE_STRTOUL
unsigned long strtoul __P((const char *, char **, int));
#endif
#ifndef HAVE_VSNPRINTF
int vsnprintf __P((char *, size_t, const char *, ...));
#endif
SCR *api_fscreen __P((int, char *));
int api_aline __P((SCR *, recno_t, char *, size_t));
int api_dline __P((SCR *, recno_t));
int api_gline __P((SCR *, recno_t, char **, size_t *));
int api_iline __P((SCR *, recno_t, char *, size_t));
int api_lline __P((SCR *, recno_t *));
int api_sline __P((SCR *, recno_t, char *, size_t));
int api_getmark __P((SCR *, int, MARK *));
int api_setmark __P((SCR *, int, MARK *));
int api_nextmark __P((SCR *, int, char *));
int api_getcursor __P((SCR *, MARK *));
int api_setcursor __P((SCR *, MARK *));
void api_emessage __P((SCR *, char *));
void api_imessage __P((SCR *, char *));
int api_edit __P((SCR *, char *, SCR **, int));
int api_escreen __P((SCR *));
int api_swscreen __P((SCR *, SCR *));
int api_map __P((SCR *, char *, char *, size_t));
int api_unmap __P((SCR *, char *));
int api_opts_get __P((SCR *, char *, char **, int *));
int api_opts_set __P((SCR *, char *, char *, u_long, int));
int api_run_str __P((SCR *, char *));
char * codeset __P((void));
void conv_init __P((SCR *, SCR *));
int conv_enc __P((SCR *, int, char *));
void conv_end __P((SCR *));
int cut __P((SCR *, CHAR_T *, MARK *, MARK *, int));
int cut_line __P((SCR *, recno_t, size_t, size_t, CB *));
void cut_close __P((GS *));
TEXT *text_init __P((SCR *, const char *, size_t, size_t));
TEXT *text_init __P((SCR *, const CHAR_T *, size_t, size_t));
void text_lfree __P((TEXTH *));
void text_free __P((TEXT *));
int del __P((SCR *, MARK *, MARK *, int));
FREF *file_add __P((SCR *, CHAR_T *));
int looks_utf8 __P((const char *, size_t));
int looks_utf16 __P((const char *, size_t));
int decode_utf8 __P((const char *));
int decode_utf16 __P((const char *, int));
FREF *file_add __P((SCR *, char *));
int file_init __P((SCR *, FREF *, char *, int));
int file_end __P((SCR *, EXF *, int));
int file_write __P((SCR *, MARK *, MARK *, char *, int));
@ -97,24 +22,26 @@ int file_m2 __P((SCR *, int));
int file_m3 __P((SCR *, int));
int file_aw __P((SCR *, int));
void set_alt_name __P((SCR *, char *));
lockr_t file_lock __P((SCR *, char *, int *, int, int));
lockr_t file_lock __P((SCR *, char *, int, int));
int v_key_init __P((SCR *));
void v_key_ilookup __P((SCR *));
size_t v_key_len __P((SCR *, ARG_CHAR_T));
CHAR_T *v_key_name __P((SCR *, ARG_CHAR_T));
int v_key_val __P((SCR *, ARG_CHAR_T));
char *v_key_name __P((SCR *, ARG_CHAR_T));
e_key_t v_key_val __P((SCR *, ARG_CHAR_T));
int v_event_push __P((SCR *, EVENT *, CHAR_T *, size_t, u_int));
int v_event_get __P((SCR *, EVENT *, int, u_int32_t));
void v_event_err __P((SCR *, EVENT *));
int v_event_flush __P((SCR *, u_int));
int db_eget __P((SCR *, recno_t, char **, size_t *, int *));
int db_get __P((SCR *, recno_t, u_int32_t, char **, size_t *));
int db_eget __P((SCR *, recno_t, CHAR_T **, size_t *, int *));
int db_get __P((SCR *, recno_t, u_int32_t, CHAR_T **, size_t *));
int db_delete __P((SCR *, recno_t));
int db_append __P((SCR *, int, recno_t, char *, size_t));
int db_insert __P((SCR *, recno_t, char *, size_t));
int db_set __P((SCR *, recno_t, char *, size_t));
int db_append __P((SCR *, int, recno_t, CHAR_T *, size_t));
int db_insert __P((SCR *, recno_t, CHAR_T *, size_t));
int db_set __P((SCR *, recno_t, CHAR_T *, size_t));
int db_exist __P((SCR *, recno_t));
int db_last __P((SCR *, recno_t *));
int db_rget __P((SCR *, recno_t, char **, size_t *));
int db_rset __P((SCR *, recno_t, char *, size_t));
void db_err __P((SCR *, recno_t));
int log_init __P((SCR *, EXF *));
int log_end __P((SCR *, EXF *));
@ -132,7 +59,8 @@ int mark_get __P((SCR *, ARG_CHAR_T, MARK *, mtype_t));
int mark_set __P((SCR *, ARG_CHAR_T, MARK *, int));
int mark_insdel __P((SCR *, lnop_t, recno_t));
void msgq __P((SCR *, mtype_t, const char *, ...));
void msgq_str __P((SCR *, mtype_t, char *, char *));
void msgq_wstr __P((SCR *, mtype_t, const CHAR_T *, const char *));
void msgq_str __P((SCR *, mtype_t, const char *, const char *));
void mod_rpt __P((SCR *));
void msgq_status __P((SCR *, recno_t, u_int));
int msg_open __P((SCR *, char *));
@ -146,8 +74,8 @@ int o_set __P((SCR *, int, u_int, char *, u_long));
int opts_empty __P((SCR *, int, int));
void opts_dump __P((SCR *, enum optdisp));
int opts_save __P((SCR *, FILE *));
OPTLIST const *opts_search __P((char *));
void opts_nomatch __P((SCR *, char *));
OPTLIST const *opts_search __P((CHAR_T *));
void opts_nomatch __P((SCR *, CHAR_T *));
int opts_copy __P((SCR *, SCR *));
void opts_free __P((SCR *));
int f_altwerase __P((SCR *, OPTION *, char *, u_long *));
@ -155,17 +83,16 @@ int f_columns __P((SCR *, OPTION *, char *, u_long *));
int f_lines __P((SCR *, OPTION *, char *, u_long *));
int f_lisp __P((SCR *, OPTION *, char *, u_long *));
int f_msgcat __P((SCR *, OPTION *, char *, u_long *));
int f_paragraph __P((SCR *, OPTION *, char *, u_long *));
int f_print __P((SCR *, OPTION *, char *, u_long *));
int f_readonly __P((SCR *, OPTION *, char *, u_long *));
int f_recompile __P((SCR *, OPTION *, char *, u_long *));
int f_reformat __P((SCR *, OPTION *, char *, u_long *));
int f_section __P((SCR *, OPTION *, char *, u_long *));
int f_ttywerase __P((SCR *, OPTION *, char *, u_long *));
int f_w300 __P((SCR *, OPTION *, char *, u_long *));
int f_w1200 __P((SCR *, OPTION *, char *, u_long *));
int f_w9600 __P((SCR *, OPTION *, char *, u_long *));
int f_window __P((SCR *, OPTION *, char *, u_long *));
int f_encoding __P((SCR *, OPTION *, char *, u_long *));
int put __P((SCR *, CB *, CHAR_T *, MARK *, MARK *, int));
int rcv_tmp __P((SCR *, EXF *, char *));
int rcv_init __P((SCR *));
@ -176,14 +103,14 @@ int screen_init __P((GS *, SCR *, SCR **));
int screen_end __P((SCR *));
SCR *screen_next __P((SCR *));
int f_search __P((SCR *,
MARK *, MARK *, char *, size_t, char **, u_int));
MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int));
int b_search __P((SCR *,
MARK *, MARK *, char *, size_t, char **, u_int));
MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int));
void search_busy __P((SCR *, busy_t));
int seq_set __P((SCR *, CHAR_T *,
size_t, CHAR_T *, size_t, CHAR_T *, size_t, seq_t, int));
int seq_delete __P((SCR *, CHAR_T *, size_t, seq_t));
int seq_mdel __P((SEQ *));
int seq_free __P((SEQ *));
SEQ *seq_find
__P((SCR *, SEQ **, EVENT *, CHAR_T *, size_t, seq_t, int *));
void seq_close __P((GS *));
@ -193,7 +120,13 @@ int e_memcmp __P((CHAR_T *, EVENT *, size_t));
void *binc __P((SCR *, void *, size_t *, size_t));
int nonblank __P((SCR *, recno_t, size_t *));
char *tail __P((char *));
CHAR_T *v_strdup __P((SCR *, const CHAR_T *, size_t));
enum nresult nget_uslong __P((u_long *, const char *, char **, int));
enum nresult nget_slong __P((long *, const char *, char **, int));
char *join __P((char *, char *));
char *expanduser __P((char *));
char *quote __P((char *));
char *v_strdup __P((SCR *, const char *, size_t));
CHAR_T *v_wstrdup __P((SCR *, const CHAR_T *, size_t));
enum nresult nget_uslong __P((u_long *, const CHAR_T *, CHAR_T **, int));
enum nresult nget_slong __P((long *, const CHAR_T *, CHAR_T **, int));
void timepoint_steady __P((struct timespec *));
void timepoint_system __P((struct timespec *));
void TRACE __P((SCR *, const char *, ...));

View File

@ -6,11 +6,13 @@
*
* See the LICENSE file for redistribution information.
*
* @(#)gs.h 10.34 (Berkeley) 9/24/96
* $Id: gs.h,v 11.0 2012/10/17 06:34:37 zy Exp $
*/
#define TEMPORARY_FILE_STRING "/tmp" /* Default temporary file name. */
#include <nl_types.h>
/*
* File reference structure (FREF). The structure contains the name of the
* file, along with the information that follows the name.
@ -19,7 +21,7 @@
* The read-only bit follows the file name, not the file itself.
*/
struct _fref {
CIRCLEQ_ENTRY(_fref) q; /* Linked list of file references. */
TAILQ_ENTRY(_fref) q; /* Linked list of file references. */
char *name; /* File name. */
char *tname; /* Backing temporary file name. */
@ -56,20 +58,15 @@ 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. */
TAILQ_HEAD(_dqh, _scr) dq[1]; /* Displayed screens. */
TAILQ_HEAD(_hqh, _scr) hq[1]; /* 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;
TAILQ_HEAD(_frefh, _fref) frefq[1];
#define GO_COLUMNS 0 /* Global options: columns. */
#define GO_LINES 1 /* Global options: lines. */
@ -77,10 +74,10 @@ struct _gs {
#define GO_TERM 3 /* Global options: terminal type. */
OPTION opts[GO_TERM + 1];
DB *msg; /* Message catalog DB. */
MSGH msgq; /* User message list. */
nl_catd catd; /* Message catalog descriptor. */
MSGH msgq[1]; /* User message list. */
#define DEFAULT_NOPRINT '\1' /* Emergency non-printable character. */
CHAR_T noprint; /* Cached, unprintable character. */
int noprint; /* Cached, unprintable character. */
char *tmp_bp; /* Temporary buffer. */
size_t tmp_blen; /* Temporary buffer size. */
@ -89,8 +86,9 @@ struct _gs {
* 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. */
#define EXCMD_RUNNING(gp) (SLIST_FIRST((gp)->ecq)->clen != 0)
/* Ex command linked list. */
SLIST_HEAD(_excmdh, _excmd) ecq[1];
EXCMD excmd; /* Default ex command structure. */
char *if_name; /* Current associated file. */
recno_t if_lno; /* Current associated line number. */
@ -108,30 +106,28 @@ struct _gs {
CB *dcbp; /* Default cut buffer pointer. */
CB dcb_store; /* Default cut buffer storage. */
LIST_HEAD(_cuth, _cb) cutq; /* Linked list of cut buffers. */
SLIST_HEAD(_cuth, _cb) cutq[1]; /* 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_BIT_SEQ 0x7f /* Max + 1 fast check character. */
SLIST_HEAD(_seqh, _seq) seqq[1];/* Linked list of maps, abbrevs. */
bitstr_t bit_decl(seqb, MAX_BIT_SEQ + 1);
#define MAX_FAST_KEY 254 /* Max fast check character.*/
#define MAX_FAST_KEY 0xff /* Max fast check character.*/
#define KEY_LEN(sp, ch) \
((unsigned char)(ch) <= MAX_FAST_KEY ? \
(((ch) & ~MAX_FAST_KEY) == 0 ? \
sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch))
#define KEY_NAME(sp, ch) \
((unsigned char)(ch) <= MAX_FAST_KEY ? \
(((ch) & ~MAX_FAST_KEY) == 0 ? \
sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch))
struct {
CHAR_T name[MAX_CHARACTER_COLUMNS + 1];
char 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. */
(((ch) & ~MAX_FAST_KEY) == 0 ? \
sp->gp->special_key[(unsigned char)ch] : v_key_val(sp,ch))
e_key_t /* Fast lookup table. */
special_key[MAX_FAST_KEY + 1];
/* Flags. */
@ -149,6 +145,8 @@ struct _gs {
/* Screen interface functions. */
/* Add a string to the screen. */
int (*scr_addstr) __P((SCR *, const char *, size_t));
/* Add a string to the screen. */
int (*scr_waddstr) __P((SCR *, const CHAR_T *, size_t));
/* Toggle a screen attribute. */
int (*scr_attr) __P((SCR *, scr_attr_t, int));
/* Terminal baud rate. */
@ -157,12 +155,16 @@ struct _gs {
int (*scr_bell) __P((SCR *));
/* Display a busy message. */
void (*scr_busy) __P((SCR *, const char *, busy_t));
/* Prepare child. */
int (*scr_child) __P((SCR *));
/* 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 *));
/* Discard a screen. */
int (*scr_discard) __P((SCR *, SCR **));
/* Get a keyboard event. */
int (*scr_event) __P((SCR *, EVENT *, u_int32_t, int));
/* Ex: screen adjustment routine. */
@ -183,8 +185,12 @@ struct _gs {
int (*scr_refresh) __P((SCR *, int));
/* Rename the file. */
int (*scr_rename) __P((SCR *, char *, int));
/* Reply to an event. */
int (*scr_reply) __P((SCR *, int, char *));
/* Set the screen type. */
int (*scr_screen) __P((SCR *, u_int32_t));
/* Split the screen. */
int (*scr_split) __P((SCR *, SCR *));
/* Suspend the editor. */
int (*scr_suspend) __P((SCR *, int *));
/* Print usage message. */

View File

@ -10,7 +10,7 @@
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)key.c 10.33 (Berkeley) 9/24/96";
static const char sccsid[] = "$Id: key.c,v 10.53 2013/03/11 01:20:53 yamt Exp $";
#endif /* not lint */
#include <sys/types.h>
@ -21,10 +21,10 @@ static const char sccsid[] = "@(#)key.c 10.33 (Berkeley) 9/24/96";
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include "common.h"
@ -100,32 +100,15 @@ static int nkeylist =
* PUBLIC: int v_key_init __P((SCR *));
*/
int
v_key_init(sp)
SCR *sp;
v_key_init(SCR *sp)
{
CHAR_T ch;
int 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);
@ -137,15 +120,11 @@ v_key_init(sp)
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;
}
for (kp = keylist, cnt = nkeylist; cnt--; ++kp)
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)
for (ch = 1; ch <= UCHAR_MAX; ++ch)
if (!isprint(ch)) {
gp->noprint = ch;
break;
@ -166,10 +145,10 @@ v_key_init(sp)
* in the table, so we check for that first.
*/
static void
v_keyval(sp, val, name)
SCR *sp;
int val;
scr_keyval_t name;
v_keyval(
SCR *sp,
int val,
scr_keyval_t name)
{
KEYLIST *kp;
CHAR_T ch;
@ -203,17 +182,20 @@ v_keyval(sp, val, name)
* PUBLIC: void v_key_ilookup __P((SCR *));
*/
void
v_key_ilookup(sp)
SCR *sp;
v_key_ilookup(SCR *sp)
{
CHAR_T ch, *p, *t;
UCHAR_T ch;
char *p, *t;
GS *gp;
size_t len;
for (gp = sp->gp, ch = 0; ch <= MAX_FAST_KEY; ++ch)
for (gp = sp->gp, ch = 0;; ++ch) {
for (p = gp->cname[ch].name, t = v_key_name(sp, ch),
len = gp->cname[ch].len = sp->clen; len--;)
*p++ = *t++;
if (ch == MAX_FAST_KEY)
break;
}
}
/*
@ -224,9 +206,9 @@ v_key_ilookup(sp)
* PUBLIC: size_t v_key_len __P((SCR *, ARG_CHAR_T));
*/
size_t
v_key_len(sp, ch)
SCR *sp;
ARG_CHAR_T ch;
v_key_len(
SCR *sp,
ARG_CHAR_T ch)
{
(void)v_key_name(sp, ch);
return (sp->clen);
@ -237,30 +219,43 @@ v_key_len(sp, ch)
* 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));
* PUBLIC: char *v_key_name __P((SCR *, ARG_CHAR_T));
*/
CHAR_T *
v_key_name(sp, ach)
SCR *sp;
ARG_CHAR_T ach;
char *
v_key_name(
SCR *sp,
ARG_CHAR_T ach)
{
static const CHAR_T hexdigit[] = "0123456789abcdef";
static const CHAR_T octdigit[] = "01234567";
CHAR_T ch, *chp, mask;
static const char hexdigit[] = "0123456789abcdef";
static const char octdigit[] = "01234567";
int ch;
size_t len;
int cnt, shift;
char *chp;
ch = ach;
/*
* Cache the last checked character. It won't be a problem
* since nvi will rescan the mapping when settings changed.
*/
if (ach && sp->lastc == ach)
return (sp->cname);
sp->lastc = ach;
#ifdef USE_WIDECHAR
len = wctomb(sp->cname, ach);
if (len > MB_CUR_MAX)
#endif
sp->cname[(len = 1)-1] = (u_char)ach;
ch = (u_char)sp->cname[0];
sp->cname[len] = '\0';
/* 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 (strstr(chp, sp->cname) != NULL)
goto done;
if ((chp = O_STR(sp, O_NOPRINT)) != NULL)
for (; *chp != '\0'; ++chp)
if (*chp == ch)
goto nopr;
if (strstr(chp, sp->cname) != NULL)
goto nopr;
/*
* Historical (ARPA standard) mappings. Printable characters are left
@ -274,41 +269,55 @@ v_key_name(sp, ach)
* 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.
* The code prints non-printable wide characters in 4 or 5 digits
* Unicode escape sequences, so only supports plane 0 to 15.
*/
if (isprint(ch)) {
pr: sp->cname[0] = ch;
len = 1;
if (ISPRINT(ach))
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)
goto done;
}
#ifdef USE_WIDECHAR
if (INTISWIDE(ach)) {
int uc = -1;
if (!strcmp(codeset(), "UTF-8"))
uc = decode_utf8(sp->cname);
#ifdef USE_ICONV
else {
char buf[sizeof(sp->cname)] = "";
size_t left = sizeof(sp->cname);
char *in = sp->cname;
char *out = buf;
iconv(sp->conv.id[IC_IE_TO_UTF16],
(iconv_src_t)&in, &len, &out, &left);
iconv(sp->conv.id[IC_IE_TO_UTF16],
NULL, NULL, NULL, NULL);
uc = decode_utf16(buf, 1);
}
#endif
if (uc >= 0) {
len = snprintf(sp->cname, sizeof(sp->cname),
uc < 0x10000 ? "\\u%04x" : "\\U%05X", uc);
goto done;
}
}
#endif
if (O_ISSET(sp, O_OCTAL)) {
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];
sp->cname[1] = octdigit[(ch & 0300) >> 6];
sp->cname[2] = octdigit[(ch & 070) >> 3];
sp->cname[3] = octdigit[ ch & 07 ];
} 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];
}
sp->cname[2] = hexdigit[(ch & 0xf0) >> 4];
sp->cname[3] = hexdigit[ ch & 0x0f ];
}
len = 4;
done: sp->cname[sp->clen = len] = '\0';
return (sp->cname);
}
@ -318,12 +327,12 @@ done: sp->cname[sp->clen = len] = '\0';
* 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));
* PUBLIC: e_key_t v_key_val __P((SCR *, ARG_CHAR_T));
*/
int
v_key_val(sp, ch)
SCR *sp;
ARG_CHAR_T ch;
e_key_t
v_key_val(
SCR *sp,
ARG_CHAR_T ch)
{
KEYLIST k, *kp;
@ -345,12 +354,12 @@ v_key_val(sp, ch)
* 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. */
v_event_push(
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;
@ -375,8 +384,8 @@ v_event_push(sp, p_evp, p_s, nitems, flags)
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);
BCOPY(gp->i_event + gp->i_next,
gp->i_event + TERM_PUSH_SHIFT + nitems, gp->i_cnt);
gp->i_next = TERM_PUSH_SHIFT;
/* Put the new items into the queue. */
@ -399,9 +408,9 @@ copy: gp->i_cnt += nitems;
* Append events onto the tail of the buffer.
*/
static int
v_event_append(sp, argp)
SCR *sp;
EVENT *argp;
v_event_append(
SCR *sp,
EVENT *argp)
{
CHAR_T *s; /* Characters. */
EVENT *evp;
@ -526,11 +535,11 @@ v_event_append(sp, argp)
* 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;
v_event_get(
SCR *sp,
EVENT *argp,
int timeout,
u_int32_t flags)
{
EVENT *evp, ev;
GS *gp;
@ -630,7 +639,8 @@ newmap: evp = &gp->i_event[gp->i_next];
*/
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))
((evp->e_c & ~MAX_BIT_SEQ) == 0 &&
!bit_test(gp->seqb, evp->e_c)))
goto nomap;
/* Search the map. */
@ -664,7 +674,7 @@ newmap: evp = &gp->i_event[gp->i_next];
/* If no map, return the character. */
if (qp == NULL) {
nomap: if (!isdigit(evp->e_c) && LF_ISSET(EC_MAPNODIGIT))
nomap: if (!ISDIGIT(evp->e_c) && LF_ISSET(EC_MAPNODIGIT))
goto not_digit;
*argp = *evp;
QREM(1);
@ -676,7 +686,7 @@ nomap: if (!isdigit(evp->e_c) && LF_ISSET(EC_MAPNODIGIT))
* of the map is it, pretend we haven't seen the character.
*/
if (LF_ISSET(EC_MAPNODIGIT) &&
qp->output != NULL && !isdigit(qp->output[0])) {
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;
@ -744,16 +754,16 @@ not_digit: argp->e_c = CH_NOT_DIGIT;
* Walk the screen lists, sync'ing files to their backup copies.
*/
static void
v_sync(sp, flags)
SCR *sp;
int flags;
v_sync(
SCR *sp,
int flags)
{
GS *gp;
gp = sp->gp;
for (sp = gp->dq.cqh_first; sp != (void *)&gp->dq; sp = sp->q.cqe_next)
TAILQ_FOREACH(sp, gp->dq, q)
rcv_sync(sp, flags);
for (sp = gp->hq.cqh_first; sp != (void *)&gp->hq; sp = sp->q.cqe_next)
TAILQ_FOREACH(sp, gp->hq, q)
rcv_sync(sp, flags);
}
@ -764,9 +774,9 @@ v_sync(sp, flags)
* PUBLIC: void v_event_err __P((SCR *, EVENT *));
*/
void
v_event_err(sp, evp)
SCR *sp;
EVENT *evp;
v_event_err(
SCR *sp,
EVENT *evp)
{
switch (evp->e_event) {
case E_CHARACTER:
@ -778,9 +788,6 @@ v_event_err(sp, evp)
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;
@ -793,9 +800,6 @@ v_event_err(sp, evp)
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
@ -820,9 +824,9 @@ v_event_err(sp, evp)
* PUBLIC: int v_event_flush __P((SCR *, u_int));
*/
int
v_event_flush(sp, flags)
SCR *sp;
u_int flags;
v_event_flush(
SCR *sp,
u_int flags)
{
GS *gp;
int rval;
@ -838,9 +842,9 @@ v_event_flush(sp, flags)
* Grow the terminal queue.
*/
static int
v_event_grow(sp, add)
SCR *sp;
int add;
v_event_grow(
SCR *sp,
int add)
{
GS *gp;
size_t new_nelem, olen;
@ -848,7 +852,7 @@ v_event_grow(sp, add)
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]));
BINC_RET(sp, EVENT, gp->i_event, olen, new_nelem * sizeof(gp->i_event[0]));
gp->i_nelem = olen / sizeof(gp->i_event[0]);
return (0);
}
@ -858,8 +862,9 @@ v_event_grow(sp, add)
* Compare two keys for sorting.
*/
static int
v_key_cmp(ap, bp)
const void *ap, *bp;
v_key_cmp(
const void *ap,
const void *bp)
{
return (((KEYLIST *)ap)->ch - ((KEYLIST *)bp)->ch);
}

View File

@ -6,27 +6,47 @@
*
* See the LICENSE file for redistribution information.
*
* @(#)key.h 10.18 (Berkeley) 6/30/96
* $Id: key.h,v 10.55 2012/10/07 01:31:17 zy Exp $
*/
/*
* 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
#include "multibyte.h"
#ifdef USE_WIDECHAR
#define FILE2INT5(sp,buf,n,nlen,w,wlen) \
sp->conv.file2int(sp, n, nlen, &buf, &wlen, &w)
#define INT2FILE(sp,w,wlen,n,nlen) \
sp->conv.int2file(sp, w, wlen, &sp->cw, &nlen, &n)
#define CHAR2INT5(sp,buf,n,nlen,w,wlen) \
sp->conv.sys2int(sp, n, nlen, &buf, &wlen, &w)
#define INT2CHAR(sp,w,wlen,n,nlen) \
sp->conv.int2sys(sp, w, wlen, &sp->cw, &nlen, &n)
#define INPUT2INT5(sp,cw,n,nlen,w,wlen) \
sp->conv.input2int(sp, n, nlen, &(cw), &wlen, &w)
#define CONST
#define CHAR_WIDTH(sp, ch) wcwidth(ch)
#define INTISWIDE(c) (wctob(c) == EOF)
#else
#define FILE2INT5(sp,buf,n,nlen,w,wlen) \
(w = n, wlen = nlen, 0)
#define INT2FILE(sp,w,wlen,n,nlen) \
(n = w, nlen = wlen, 0)
#define CHAR2INT5(sp,buf,n,nlen,w,wlen) \
(w = n, wlen = nlen, 0)
#define INT2CHAR(sp,w,wlen,n,nlen) \
(n = w, nlen = wlen, 0)
#define INPUT2INT5(sp,buf,n,nlen,w,wlen) \
(w = n, wlen = nlen, 0)
#define CONST const
#define INTISWIDE(c) 0
#define CHAR_WIDTH(sp, ch) 1
#endif
#define FILE2INT(sp,n,nlen,w,wlen) \
FILE2INT5(sp,sp->cw,n,nlen,w,wlen)
#define CHAR2INT(sp,n,nlen,w,wlen) \
CHAR2INT5(sp,sp->cw,n,nlen,w,wlen)
/* The maximum number of columns any character can take up on a screen. */
#define MAX_CHARACTER_COLUMNS 4
#define MAX_CHARACTER_COLUMNS 7
/*
* Event types.
@ -42,14 +62,12 @@ typedef enum {
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;
/*
@ -124,7 +142,7 @@ struct _event {
typedef struct _keylist {
e_key_t value; /* Special value. */
CHAR_T ch; /* Key. */
int ch; /* Key. */
} KEYLIST;
extern KEYLIST keylist[];
@ -137,15 +155,13 @@ extern KEYLIST keylist[];
/*
* 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.
* characters like ^K in the ASCII character set. The POSIX isblank(3)
* has the same problem for non-ASCII locale, so we need a standalone one.
*
* XXX
* Note side effect, ch is evaluated multiple times.
*/
#ifndef isblank
#define isblank(ch) ((ch) == ' ' || (ch) == '\t')
#endif
#define cmdskip(ch) ((ch) == ' ' || (ch) == '\t')
/* The "standard" tab width, for displaying things to users. */
#define STANDARD_TAB 6

View File

@ -10,7 +10,7 @@
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)line.c 10.21 (Berkeley) 9/15/96";
static const char sccsid[] = "$Id: line.c,v 10.26 2011/08/12 12:36:41 zy Exp $";
#endif /* not lint */
#include <sys/types.h>
@ -32,15 +32,15 @@ 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 *));
* PUBLIC: int db_eget __P((SCR *, recno_t, CHAR_T **, 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;
db_eget(
SCR *sp,
recno_t lno, /* Line number. */
CHAR_T **pp, /* Pointer store. */
size_t *lenp, /* Length store. */
int *isemptyp)
{
recno_t l1;
@ -60,7 +60,7 @@ db_eget(sp, lno, pp, lenp, isemptyp)
return (1);
/* If the file isn't empty, fail loudly. */
if (lno != 0 && lno != 1 || l1 != 0) {
if ((lno != 0 && lno != 1) || l1 != 0) {
db_err(sp, lno);
return (1);
}
@ -76,20 +76,23 @@ db_eget(sp, lno, pp, lenp, isemptyp)
* 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 *));
* PUBLIC: int db_get __P((SCR *, recno_t, u_int32_t, CHAR_T **, 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. */
db_get(
SCR *sp,
recno_t lno, /* Line number. */
u_int32_t flags,
CHAR_T **pp, /* Pointer store. */
size_t *lenp) /* Length store. */
{
DBT data, key;
EXF *ep;
TEXT *tp;
recno_t l1, l2;
CHAR_T *wp;
size_t wlen;
size_t nlen;
/*
* The underlying recno stuff handles zero by returning NULL, but
@ -113,14 +116,14 @@ db_get(sp, lno, flags, pp, lenp)
* is there.
*/
if (F_ISSET(sp, SC_TINPUT)) {
l1 = ((TEXT *)sp->tiq.cqh_first)->lno;
l2 = ((TEXT *)sp->tiq.cqh_last)->lno;
l1 = ((TEXT *)TAILQ_FIRST(sp->tiq))->lno;
l2 = ((TEXT *)TAILQ_LAST(sp->tiq, _texth))->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);
for (tp = TAILQ_FIRST(sp->tiq);
tp->lno != lno; tp = TAILQ_NEXT(tp, q));
if (lenp != NULL)
*lenp = tp->len;
if (pp != NULL)
@ -149,32 +152,52 @@ db_get(sp, lno, flags, pp, lenp)
ep->c_lno = OOBLNO;
nocache:
nlen = 1024;
retry:
/* 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:
case -1:
goto err2;
case 1:
err1: if (LF_ISSET(DBG_FATAL))
err2: db_err(sp, lno);
alloc_err:
err3: if (lenp != NULL)
*lenp = 0;
if (pp != NULL)
*pp = NULL;
return (1);
case 0:
if (data.size > nlen) {
nlen = data.size;
goto retry;
}
}
if (FILE2INT(sp, data.data, data.size, wp, wlen)) {
if (!F_ISSET(sp, SC_CONV_ERROR)) {
F_SET(sp, SC_CONV_ERROR);
msgq(sp, M_ERR, "324|Conversion error on line %d", lno);
}
goto err3;
}
/* Reset the cache. */
if (wp != data.data) {
BINC_GOTOW(sp, ep->c_lp, ep->c_blen, wlen);
MEMCPY(ep->c_lp, wp, wlen);
} else
ep->c_lp = data.data;
ep->c_lno = lno;
ep->c_len = data.size;
ep->c_lp = data.data;
ep->c_len = wlen;
#if defined(DEBUG) && 0
TRACE(sp, "retrieve DB line %lu\n", (u_long)lno);
#endif
if (lenp != NULL)
*lenp = data.size;
*lenp = wlen;
if (pp != NULL)
*pp = ep->c_lp;
return (0);
@ -187,9 +210,9 @@ err3: if (lenp != NULL)
* PUBLIC: int db_delete __P((SCR *, recno_t));
*/
int
db_delete(sp, lno)
SCR *sp;
recno_t lno;
db_delete(
SCR *sp,
recno_t lno)
{
DBT key;
EXF *ep;
@ -242,18 +265,20 @@ db_delete(sp, lno)
* db_append --
* Append a line into the file.
*
* PUBLIC: int db_append __P((SCR *, int, recno_t, char *, size_t));
* PUBLIC: int db_append __P((SCR *, int, recno_t, CHAR_T *, size_t));
*/
int
db_append(sp, update, lno, p, len)
SCR *sp;
int update;
recno_t lno;
char *p;
size_t len;
db_append(
SCR *sp,
int update,
recno_t lno,
CHAR_T *p,
size_t len)
{
DBT data, key;
EXF *ep;
char *fp;
size_t flen;
int rval;
#if defined(DEBUG) && 0
@ -265,11 +290,13 @@ db_append(sp, update, lno, p, len)
return (1);
}
INT2FILE(sp, p, len, fp, flen);
/* Update file. */
key.data = &lno;
key.size = sizeof(lno);
data.data = p;
data.size = len;
data.data = fp;
data.size = flen;
SIGBLOCK;
if (ep->db->put(ep->db, &key, &data, R_IAFTER) == -1) {
msgq(sp, M_SYSERR,
@ -316,17 +343,19 @@ db_append(sp, update, lno, p, len)
* db_insert --
* Insert a line into the file.
*
* PUBLIC: int db_insert __P((SCR *, recno_t, char *, size_t));
* PUBLIC: int db_insert __P((SCR *, recno_t, CHAR_T *, size_t));
*/
int
db_insert(sp, lno, p, len)
SCR *sp;
recno_t lno;
char *p;
size_t len;
db_insert(
SCR *sp,
recno_t lno,
CHAR_T *p,
size_t len)
{
DBT data, key;
EXF *ep;
char *fp;
size_t flen;
int rval;
#if defined(DEBUG) && 0
@ -339,11 +368,13 @@ db_insert(sp, lno, p, len)
return (1);
}
INT2FILE(sp, p, len, fp, flen);
/* Update file. */
key.data = &lno;
key.size = sizeof(lno);
data.data = p;
data.size = len;
data.data = fp;
data.size = flen;
SIGBLOCK;
if (ep->db->put(ep->db, &key, &data, R_IBEFORE) == -1) {
msgq(sp, M_SYSERR,
@ -381,23 +412,24 @@ db_insert(sp, lno, p, len)
* db_set --
* Store a line in the file.
*
* PUBLIC: int db_set __P((SCR *, recno_t, char *, size_t));
* PUBLIC: int db_set __P((SCR *, recno_t, CHAR_T *, size_t));
*/
int
db_set(sp, lno, p, len)
SCR *sp;
recno_t lno;
char *p;
size_t len;
db_set(
SCR *sp,
recno_t lno,
CHAR_T *p,
size_t len)
{
DBT data, key;
EXF *ep;
char *fp;
size_t flen;
#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);
@ -407,11 +439,13 @@ db_set(sp, lno, p, len)
/* Log before change. */
log_line(sp, lno, LOG_LINE_RESET_B);
INT2FILE(sp, p, len, fp, flen);
/* Update file. */
key.data = &lno;
key.size = sizeof(lno);
data.data = p;
data.size = len;
data.data = fp;
data.size = flen;
SIGBLOCK;
if (ep->db->put(ep->db, &key, &data, 0) == -1) {
msgq(sp, M_SYSERR,
@ -443,9 +477,9 @@ db_set(sp, lno, p, len)
* PUBLIC: int db_exist __P((SCR *, recno_t));
*/
int
db_exist(sp, lno)
SCR *sp;
recno_t lno;
db_exist(
SCR *sp,
recno_t lno)
{
EXF *ep;
@ -464,8 +498,8 @@ db_exist(sp, lno)
*/
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));
ep->c_nlines + (((TEXT *)TAILQ_LAST(sp->tiq, _texth))->lno -
((TEXT *)TAILQ_FIRST(sp->tiq))->lno) : ep->c_nlines));
/* Go get the line. */
return (!db_get(sp, lno, 0, NULL, NULL));
@ -478,13 +512,15 @@ db_exist(sp, lno)
* PUBLIC: int db_last __P((SCR *, recno_t *));
*/
int
db_last(sp, lnop)
SCR *sp;
recno_t *lnop;
db_last(
SCR *sp,
recno_t *lnop)
{
DBT data, key;
EXF *ep;
recno_t lno;
CHAR_T *wp;
size_t wlen;
/* Check for no underlying file. */
if ((ep = sp->ep) == NULL) {
@ -499,8 +535,8 @@ db_last(sp, lnop)
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;
*lnop += ((TEXT *)TAILQ_LAST(sp->tiq, _texth))->lno -
((TEXT *)TAILQ_FIRST(sp->tiq))->lno;
return (0);
}
@ -508,27 +544,104 @@ db_last(sp, lnop)
key.size = sizeof(lno);
switch (ep->db->seq(ep->db, &key, &data, R_LAST)) {
case -1:
case -1:
alloc_err:
msgq(sp, M_SYSERR, "007|unable to get last line");
*lnop = 0;
return (1);
case 1:
case 1:
*lnop = 0;
return (0);
default:
break;
case 0:
;
}
/* 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;
if (lno != ep->c_lno) {
FILE2INT(sp, data.data, data.size, wp, wlen);
/* Fill the cache. */
if (wp != data.data) {
BINC_GOTOW(sp, ep->c_lp, ep->c_blen, wlen);
MEMCPY(ep->c_lp, wp, wlen);
} else
ep->c_lp = data.data;
ep->c_lno = lno;
ep->c_len = wlen;
}
ep->c_nlines = lno;
/* Return the value. */
*lnop = (F_ISSET(sp, SC_TINPUT) &&
((TEXT *)sp->tiq.cqh_last)->lno > lno ?
((TEXT *)sp->tiq.cqh_last)->lno : lno);
((TEXT *)TAILQ_LAST(sp->tiq, _texth))->lno > lno ?
((TEXT *)TAILQ_LAST(sp->tiq, _texth))->lno : lno);
return (0);
}
/*
* db_rget --
* Retrieve a raw line from database. No cache, no conversion.
*
* PUBLIC: int db_rget __P((SCR *, recno_t, char **, size_t *));
*/
int
db_rget(
SCR *sp,
recno_t lno, /* Line number. */
char **pp, /* Pointer store. */
size_t *lenp) /* Length store. */
{
DBT data, key;
EXF *ep;
/* Check for no underlying file. */
if ((ep = sp->ep) == NULL)
return (1);
/* Get the line from the underlying database. */
key.data = &lno;
key.size = sizeof(lno);
if (ep->db->get(ep->db, &key, &data, 0))
/* We do not report error, and do not ensure the size! */
return (1);
if (lenp != NULL)
*lenp = data.size;
if (pp != NULL)
*pp = data.data;
return (0);
}
/*
* db_rset --
* Store a line in the file. No log, no conversion.
*
* PUBLIC: int db_rset __P((SCR *, recno_t, char *, size_t));
*/
int
db_rset(
SCR *sp,
recno_t lno,
char *p,
size_t len)
{
DBT data, key;
EXF *ep;
/* Check for no underlying file. */
if ((ep = sp->ep) == NULL)
return (1);
/* Update file. */
key.data = &lno;
key.size = sizeof(lno);
data.data = p;
data.size = len;
if (ep->db->put(ep->db, &key, &data, 0) == -1)
/* We do not report error, and do not ensure the size! */
return (1);
return (0);
}
@ -539,9 +652,9 @@ db_last(sp, lnop)
* PUBLIC: void db_err __P((SCR *, recno_t));
*/
void
db_err(sp, lno)
SCR *sp;
recno_t lno;
db_err(
SCR *sp,
recno_t lno)
{
msgq(sp, M_ERR,
"008|Error: unable to retrieve line %lu", (u_long)lno);
@ -553,11 +666,11 @@ db_err(sp, lno)
* just changed.
*/
static int
scr_update(sp, lno, op, current)
SCR *sp;
recno_t lno;
lnop_t op;
int current;
scr_update(
SCR *sp,
recno_t lno,
lnop_t op,
int current)
{
EXF *ep;
SCR *tsp;
@ -567,8 +680,7 @@ scr_update(sp, lno, op, current)
ep = sp->ep;
if (ep->refcnt != 1)
for (tsp = sp->gp->dq.cqh_first;
tsp != (void *)&sp->gp->dq; tsp = tsp->q.cqe_next)
TAILQ_FOREACH(tsp, sp->gp->dq, q)
if (sp != tsp && tsp->ep == ep)
if (vs_change(tsp, lno, op))
return (1);

View File

@ -10,7 +10,7 @@
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)log.c 10.8 (Berkeley) 3/6/96";
static const char sccsid[] = "$Id: log.c,v 10.27 2011/07/13 06:25:50 zy Exp $";
#endif /* not lint */
#include <sys/types.h>
@ -21,6 +21,7 @@ static const char sccsid[] = "@(#)log.c 10.8 (Berkeley) 3/6/96";
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -67,6 +68,8 @@ static void log_err __P((SCR *, char *, int));
#if defined(DEBUG) && 0
static void log_trace __P((SCR *, char *, recno_t, u_char *));
#endif
static int apply_with __P((int (*)(SCR *, recno_t, CHAR_T *, size_t),
SCR *, recno_t, u_char *, size_t));
/* Try and restart the log on failure, i.e. if we run out of memory. */
#define LOG_ERR { \
@ -74,6 +77,15 @@ static void log_trace __P((SCR *, char *, recno_t, u_char *));
return (1); \
}
/* offset of CHAR_T string in log needs to be aligned on some systems
* because it is passed to db_set as a string
*/
typedef struct {
char data[sizeof(u_char) /* type */ + sizeof(recno_t)];
CHAR_T str[1];
} log_t;
#define CHAR_T_OFFSET ((char *)(((log_t*)0)->str) - (char *)0)
/*
* log_init --
* Initialize the logging subsystem.
@ -81,9 +93,9 @@ static void log_trace __P((SCR *, char *, recno_t, u_char *));
* PUBLIC: int log_init __P((SCR *, EXF *));
*/
int
log_init(sp, ep)
SCR *sp;
EXF *ep;
log_init(
SCR *sp,
EXF *ep)
{
/*
* !!!
@ -117,9 +129,9 @@ log_init(sp, ep)
* PUBLIC: int log_end __P((SCR *, EXF *));
*/
int
log_end(sp, ep)
SCR *sp;
EXF *ep;
log_end(
SCR *sp,
EXF *ep)
{
/*
* !!!
@ -147,8 +159,7 @@ log_end(sp, ep)
* PUBLIC: int log_cursor __P((SCR *));
*/
int
log_cursor(sp)
SCR *sp;
log_cursor(SCR *sp)
{
EXF *ep;
@ -175,15 +186,16 @@ log_cursor(sp)
* Actually push a cursor record out.
*/
static int
log_cursor1(sp, type)
SCR *sp;
int type;
log_cursor1(
SCR *sp,
int type)
{
DBT data, key;
EXF *ep;
ep = sp->ep;
BINC_RET(sp, ep->l_lp, ep->l_len, sizeof(u_char) + sizeof(MARK));
BINC_RETC(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));
@ -212,15 +224,16 @@ log_cursor1(sp, type)
* PUBLIC: int log_line __P((SCR *, recno_t, u_int));
*/
int
log_line(sp, lno, action)
SCR *sp;
recno_t lno;
u_int action;
log_line(
SCR *sp,
recno_t lno,
u_int action)
{
DBT data, key;
EXF *ep;
size_t len;
char *lp;
CHAR_T *lp;
recno_t lcur;
ep = sp->ep;
if (F_ISSET(ep, F_NOLOG))
@ -254,28 +267,30 @@ log_line(sp, lno, action)
return (1);
}
len = 0;
lp = "";
lp = L("");
}
} else
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));
BINC_RETC(sp,
ep->l_lp, ep->l_len,
len * sizeof(CHAR_T) + CHAR_T_OFFSET);
ep->l_lp[0] = action;
memmove(ep->l_lp + sizeof(u_char), &lno, sizeof(recno_t));
memmove(ep->l_lp + sizeof(u_char) + sizeof(recno_t), lp, len);
memmove(ep->l_lp + CHAR_T_OFFSET, lp, len * sizeof(CHAR_T));
key.data = &ep->l_cur;
lcur = ep->l_cur;
key.data = &lcur;
key.size = sizeof(recno_t);
data.data = ep->l_lp;
data.size = len + sizeof(u_char) + sizeof(recno_t);
data.size = len * sizeof(CHAR_T) + CHAR_T_OFFSET;
if (ep->log->put(ep->log, &key, &data, 0) == -1)
LOG_ERR;
#if defined(DEBUG) && 0
switch (action) {
case LOG_LINE_APPEND:
TRACE(sp, "%u: log_line: append: %lu {%u}\n",
TRACE(sp, "%lu: log_line: append: %lu {%u}\n",
ep->l_cur, lno, len);
break;
case LOG_LINE_DELETE:
@ -312,9 +327,9 @@ log_line(sp, lno, action)
* PUBLIC: int log_mark __P((SCR *, LMARK *));
*/
int
log_mark(sp, lmp)
SCR *sp;
LMARK *lmp;
log_mark(
SCR *sp,
LMARK *lmp)
{
DBT data, key;
EXF *ep;
@ -330,7 +345,7 @@ log_mark(sp, lmp)
ep->l_cursor.lno = OOBLNO;
}
BINC_RET(sp, ep->l_lp,
BINC_RETC(sp, ep->l_lp,
ep->l_len, sizeof(u_char) + sizeof(LMARK));
ep->l_lp[0] = LOG_MARK;
memmove(ep->l_lp + sizeof(u_char), lmp, sizeof(LMARK));
@ -358,9 +373,9 @@ log_mark(sp, lmp)
* PUBLIC: int log_backward __P((SCR *, MARK *));
*/
int
log_backward(sp, rp)
SCR *sp;
MARK *rp;
log_backward(
SCR *sp,
MARK *rp)
{
DBT key, data;
EXF *ep;
@ -414,9 +429,8 @@ log_backward(sp, rp)
case LOG_LINE_DELETE:
didop = 1;
memmove(&lno, p + sizeof(u_char), sizeof(recno_t));
if (db_insert(sp, lno, p + sizeof(u_char) +
sizeof(recno_t), data.size - sizeof(u_char) -
sizeof(recno_t)))
if (apply_with(db_insert, sp, lno,
p + CHAR_T_OFFSET, data.size - CHAR_T_OFFSET))
goto err;
++sp->rptlines[L_ADDED];
break;
@ -425,9 +439,8 @@ log_backward(sp, rp)
case LOG_LINE_RESET_B:
didop = 1;
memmove(&lno, p + sizeof(u_char), sizeof(recno_t));
if (db_set(sp, lno, p + sizeof(u_char) +
sizeof(recno_t), data.size - sizeof(u_char) -
sizeof(recno_t)))
if (apply_with(db_set, sp, lno,
p + CHAR_T_OFFSET, data.size - CHAR_T_OFFSET))
goto err;
if (sp->rptlchange != lno) {
sp->rptlchange = lno;
@ -464,8 +477,7 @@ err: F_CLR(ep, F_NOLOG);
* PUBLIC: int log_setline __P((SCR *));
*/
int
log_setline(sp)
SCR *sp;
log_setline(SCR *sp)
{
DBT key, data;
EXF *ep;
@ -488,7 +500,6 @@ log_setline(sp)
key.data = &ep->l_cur; /* Initialize db request. */
key.size = sizeof(recno_t);
for (;;) {
--ep->l_cur;
if (ep->log->get(ep->log, &key, &data, 0))
@ -520,9 +531,8 @@ log_setline(sp)
case LOG_LINE_RESET_B:
memmove(&lno, p + sizeof(u_char), sizeof(recno_t));
if (lno == sp->lno &&
db_set(sp, lno, p + sizeof(u_char) +
sizeof(recno_t), data.size - sizeof(u_char) -
sizeof(recno_t)))
apply_with(db_set, sp, lno,
p + CHAR_T_OFFSET, data.size - CHAR_T_OFFSET))
goto err;
if (sp->rptlchange != lno) {
sp->rptlchange = lno;
@ -551,9 +561,9 @@ err: F_CLR(ep, F_NOLOG);
* PUBLIC: int log_forward __P((SCR *, MARK *));
*/
int
log_forward(sp, rp)
SCR *sp;
MARK *rp;
log_forward(
SCR *sp,
MARK *rp)
{
DBT key, data;
EXF *ep;
@ -601,9 +611,8 @@ log_forward(sp, rp)
case LOG_LINE_INSERT:
didop = 1;
memmove(&lno, p + sizeof(u_char), sizeof(recno_t));
if (db_insert(sp, lno, p + sizeof(u_char) +
sizeof(recno_t), data.size - sizeof(u_char) -
sizeof(recno_t)))
if (apply_with(db_insert, sp, lno,
p + CHAR_T_OFFSET, data.size - CHAR_T_OFFSET))
goto err;
++sp->rptlines[L_ADDED];
break;
@ -619,9 +628,8 @@ log_forward(sp, rp)
case LOG_LINE_RESET_F:
didop = 1;
memmove(&lno, p + sizeof(u_char), sizeof(recno_t));
if (db_set(sp, lno, p + sizeof(u_char) +
sizeof(recno_t), data.size - sizeof(u_char) -
sizeof(recno_t)))
if (apply_with(db_set, sp, lno,
p + CHAR_T_OFFSET, data.size - CHAR_T_OFFSET))
goto err;
if (sp->rptlchange != lno) {
sp->rptlchange = lno;
@ -650,10 +658,10 @@ err: F_CLR(ep, F_NOLOG);
* 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;
log_err(
SCR *sp,
char *file,
int line)
{
EXF *ep;
@ -666,11 +674,11 @@ log_err(sp, file, line)
#if defined(DEBUG) && 0
static void
log_trace(sp, msg, rno, p)
SCR *sp;
char *msg;
recno_t rno;
u_char *p;
log_trace(
SCR *sp,
char *msg,
recno_t rno,
u_char *p)
{
LMARK lm;
MARK m;
@ -715,3 +723,45 @@ log_trace(sp, msg, rno, p)
}
}
#endif
/*
* apply_with --
* Apply a realigned line from the log db to the file db.
*/
static int
apply_with(
int (*db_func)(SCR *, recno_t, CHAR_T *, size_t),
SCR *sp,
recno_t lno,
u_char *p,
size_t len)
{
#ifdef USE_WIDECHAR
typedef unsigned long nword;
static size_t blen;
static nword *bp;
nword *lp = (nword *)((uintptr_t)p / sizeof(nword) * sizeof(nword));
if (lp != (nword *)p) {
int offl = ((uintptr_t)p - (uintptr_t)lp) << 3;
int offr = (sizeof(nword) << 3) - offl;
size_t i, cnt = (len + sizeof(nword) / 2) / sizeof(nword);
if (len > blen) {
blen = p2roundup(MAX(len, 512));
REALLOC(sp, bp, nword *, blen);
if (bp == NULL)
return (1);
}
for (i = 0; i < cnt; ++i)
#if BYTE_ORDER == BIG_ENDIAN
bp[i] = (lp[i] << offl) ^ (lp[i+1] >> offr);
#else
bp[i] = (lp[i] >> offl) ^ (lp[i+1] << offr);
#endif
p = (u_char *)bp;
}
#endif
return db_func(sp, lno, (CHAR_T *)p, len / sizeof(CHAR_T));
}

View File

@ -11,20 +11,19 @@
#ifndef lint
static const char copyright[] =
"@(#) Copyright (c) 1992, 1993, 1994\n\
"%Z% 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\
%Z% 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";
static const char sccsid[] = "$Id: main.c,v 11.0 2012/10/17 06:34:37 zy Exp $";
#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>
@ -50,10 +49,10 @@ static int v_obsolete __P((char *, char *[]));
* PUBLIC: int editor __P((GS *, int, char *[]));
*/
int
editor(gp, argc, argv)
GS *gp;
int argc;
char *argv[];
editor(
GS *gp,
int argc,
char *argv[])
{
extern int optind;
extern char *optarg;
@ -64,10 +63,9 @@ editor(gp, argc, argv)
size_t len;
u_int flags;
int ch, flagchk, lflag, secure, startup, readonly, rval, silent;
#ifdef GTAGS
int gtags = 0;
#endif
char *tag_f, *wsizearg, path[256];
CHAR_T *w;
size_t wlen;
/* Initialize the busy routine, if not defined by the screen. */
if (gp->scr_busy == NULL)
@ -75,19 +73,20 @@ editor(gp, argc, argv)
/* Initialize the message routine, if not defined by the screen. */
if (gp->scr_msg == NULL)
gp->scr_msg = vs_msg;
gp->catd = (nl_catd)-1;
/* Common global structure initialization. */
CIRCLEQ_INIT(&gp->dq);
CIRCLEQ_INIT(&gp->hq);
LIST_INIT(&gp->ecq);
LIST_INSERT_HEAD(&gp->ecq, &gp->excmd, q);
TAILQ_INIT(gp->dq);
TAILQ_INIT(gp->hq);
SLIST_INIT(gp->ecq);
SLIST_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);
TAILQ_INIT(gp->frefq);
TAILQ_INIT(gp->dcb_store.textq);
SLIST_INIT(gp->cutq);
SLIST_INIT(gp->seqq);
/* Set initial screen type and mode based on the program name. */
readonly = 0;
@ -116,18 +115,10 @@ editor(gp, argc, argv)
/* Set the file snapshot flag. */
F_SET(gp, G_SNAPSHOT);
#ifdef GTAGS
#ifdef DEBUG
while ((ch = getopt(argc, argv, "c:D:eFGlRrSsT:t:vw:")) != EOF)
#else
while ((ch = getopt(argc, argv, "c:eFGlRrSst:vw:")) != EOF)
#endif
#else
#ifdef DEBUG
while ((ch = getopt(argc, argv, "c:D:eFlRrSsT:t:vw:")) != EOF)
#else
while ((ch = getopt(argc, argv, "c:eFlRrSst:vw:")) != EOF)
#endif
#endif
switch (ch) {
case 'c': /* Run the command. */
@ -165,11 +156,6 @@ editor(gp, argc, argv)
case 'F': /* No snapshot. */
F_CLR(gp, G_SNAPSHOT);
break;
#ifdef GTAGS
case 'G': /* gtags mode. */
gtags = 1;
break;
#endif
case 'l': /* Set lisp, showmatch options. */
lflag = 1;
break;
@ -252,11 +238,11 @@ editor(gp, argc, argv)
*/
if (screen_init(gp, NULL, &sp)) {
if (sp != NULL)
CIRCLEQ_INSERT_HEAD(&gp->dq, sp, q);
TAILQ_INSERT_HEAD(gp->dq, sp, q);
goto err;
}
F_SET(sp, SC_EX);
CIRCLEQ_INSERT_HEAD(&gp->dq, sp, q);
TAILQ_INSERT_HEAD(gp->dq, sp, q);
if (v_key_init(sp)) /* Special key initialization. */
goto err;
@ -268,10 +254,6 @@ editor(gp, argc, argv)
}
if (readonly)
*oargp++ = O_READONLY;
#ifdef GTAGS
if (gtags)
*oargp++ = O_GTAGSMODE;
#endif
if (secure)
*oargp++ = O_SECURE;
*oargp = -1; /* Options initialization. */
@ -351,8 +333,11 @@ editor(gp, argc, argv)
}
/* Open a tag file if specified. */
if (tag_f != NULL && ex_tag_first(sp, tag_f))
goto err;
if (tag_f != NULL) {
CHAR2INT(sp, tag_f, strlen(tag_f) + 1, w, wlen);
if (ex_tag_first(sp, w))
goto err;
}
/*
* Append any remaining arguments as file names. Files are recovery
@ -362,13 +347,11 @@ editor(gp, argc, argv)
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);
*--argv = strdup(sp->frp->name);
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);
@ -386,7 +369,7 @@ editor(gp, argc, argv)
if ((frp = file_add(sp, NULL)) == NULL)
goto err;
} else {
if ((frp = file_add(sp, (CHAR_T *)sp->argv[0])) == NULL)
if ((frp = file_add(sp, sp->argv[0])) == NULL)
goto err;
if (F_ISSET(sp, SC_ARGRECOVER))
F_SET(frp, FR_RECOVER);
@ -420,8 +403,8 @@ editor(gp, argc, argv)
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))
(ev.e_event == E_CHARACTER &&
(ev.e_value == K_CR || ev.e_value == K_NL)))
break;
(void)gp->scr_bell(sp);
}
@ -467,20 +450,16 @@ v_end(gp)
(void)file_end(gp->ccl_sp, NULL, 1);
(void)screen_end(gp->ccl_sp);
}
while ((sp = gp->dq.cqh_first) != (void *)&gp->dq)
while ((sp = TAILQ_FIRST(gp->dq)) != NULL)
(void)screen_end(sp);
while ((sp = gp->hq.cqh_first) != (void *)&gp->hq)
while ((sp = TAILQ_FIRST(gp->hq)) != NULL)
(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);
while ((frp = TAILQ_FIRST(gp->frefq)) != NULL) {
TAILQ_REMOVE(gp->frefq, frp, q);
if (frp->name != NULL)
free(frp->name);
if (frp->tname != NULL)
@ -500,7 +479,7 @@ v_end(gp)
seq_close(gp);
/* Free default buffer storage. */
(void)text_lfree(&gp->dcb_store.textq);
(void)text_lfree(gp->dcb_store.textq);
/* Close message catalogs. */
msg_close(gp);
@ -516,10 +495,10 @@ v_end(gp)
* it's possible that the user is sourcing a file that exits from the
* editor).
*/
while ((mp = gp->msgq.lh_first) != NULL) {
while ((mp = SLIST_FIRST(gp->msgq)) != NULL) {
(void)fprintf(stderr, "%s%.*s",
mp->mtype == M_ERR ? "ex/vi: " : "", (int)mp->len, mp->buf);
LIST_REMOVE(mp, q);
SLIST_REMOVE_HEAD(gp->msgq, q);
#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY)
free(mp->buf);
free(mp);
@ -544,8 +523,9 @@ v_end(gp)
* Convert historic arguments into something getopt(3) will like.
*/
static int
v_obsolete(name, argv)
char *name, *argv[];
v_obsolete(
char *name,
char *argv[])
{
size_t len;
char *p;
@ -566,28 +546,26 @@ v_obsolete(name, argv)
while (*++argv && strcmp(argv[0], "--"))
if (argv[0][0] == '+') {
if (argv[0][1] == '\0') {
MALLOC_NOMSG(NULL, argv[0], char *, 4);
argv[0] = strdup("-c$");
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);
argv[0] = malloc(len + 2);
if (argv[0] == NULL)
goto nomem;
argv[0][0] = '-';
argv[0][1] = 'c';
(void)strcpy(argv[0] + 2, p + 1);
(void)strlcpy(argv[0] + 2, p + 1, len);
}
} else if (argv[0][0] == '-')
if (argv[0][1] == '\0') {
MALLOC_NOMSG(NULL, argv[0], char *, 3);
argv[0] = strdup("-s");
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') &&
@ -598,8 +576,7 @@ nomem: v_estr(name, errno, NULL);
#ifdef DEBUG
static void
attach(gp)
GS *gp;
attach(GS *gp)
{
int fd;
char ch;
@ -624,9 +601,10 @@ attach(gp)
#endif
static void
v_estr(name, eno, msg)
char *name, *msg;
int eno;
v_estr(
char *name,
int eno,
char *msg)
{
(void)fprintf(stderr, "%s", name);
if (msg != NULL)

View File

@ -10,11 +10,12 @@
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)mark.c 10.13 (Berkeley) 7/19/96";
static const char sccsid[] = "$Id: mark.c,v 10.14 2011/07/04 14:42:58 zy Exp $";
#endif /* not lint */
#include <sys/types.h>
#include <sys/queue.h>
#include <sys/time.h>
#include <bitstring.h>
#include <errno.h>
@ -28,7 +29,7 @@ static const char sccsid[] = "@(#)mark.c 10.13 (Berkeley) 7/19/96";
static LMARK *mark_find __P((SCR *, ARG_CHAR_T));
/*
* Marks are maintained in a key sorted doubly linked list. We can't
* Marks are maintained in a key sorted singly linked list. We can't
* use arrays because we have no idea how big an index key could be.
* The underlying assumption is that users don't have more than, say,
* 10 marks at any one time, so this will be is fast enough.
@ -65,9 +66,9 @@ static LMARK *mark_find __P((SCR *, ARG_CHAR_T));
* PUBLIC: int mark_init __P((SCR *, EXF *));
*/
int
mark_init(sp, ep)
SCR *sp;
EXF *ep;
mark_init(
SCR *sp,
EXF *ep)
{
/*
* !!!
@ -75,7 +76,7 @@ mark_init(sp, ep)
*
* Set up the marks.
*/
LIST_INIT(&ep->marks);
SLIST_INIT(ep->marks);
return (0);
}
@ -86,9 +87,9 @@ mark_init(sp, ep)
* PUBLIC: int mark_end __P((SCR *, EXF *));
*/
int
mark_end(sp, ep)
SCR *sp;
EXF *ep;
mark_end(
SCR *sp,
EXF *ep)
{
LMARK *lmp;
@ -96,8 +97,8 @@ mark_end(sp, ep)
* !!!
* 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);
while ((lmp = SLIST_FIRST(ep->marks)) != NULL) {
SLIST_REMOVE_HEAD(ep->marks, q);
free(lmp);
}
return (0);
@ -110,11 +111,11 @@ mark_end(sp, ep)
* PUBLIC: int mark_get __P((SCR *, ARG_CHAR_T, MARK *, mtype_t));
*/
int
mark_get(sp, key, mp, mtype)
SCR *sp;
ARG_CHAR_T key;
MARK *mp;
mtype_t mtype;
mark_get(
SCR *sp,
ARG_CHAR_T key,
MARK *mp,
mtype_t mtype)
{
LMARK *lmp;
@ -155,11 +156,11 @@ mark_get(sp, key, mp, mtype)
* PUBLIC: int mark_set __P((SCR *, ARG_CHAR_T, MARK *, int));
*/
int
mark_set(sp, key, value, userset)
SCR *sp;
ARG_CHAR_T key;
MARK *value;
int userset;
mark_set(
SCR *sp,
ARG_CHAR_T key,
MARK *value,
int userset)
{
LMARK *lmp, *lmt;
@ -176,9 +177,9 @@ mark_set(sp, key, value, userset)
if (lmp == NULL || lmp->name != key) {
MALLOC_RET(sp, lmt, LMARK *, sizeof(LMARK));
if (lmp == NULL) {
LIST_INSERT_HEAD(&sp->ep->marks, lmt, q);
SLIST_INSERT_HEAD(sp->ep->marks, lmt, q);
} else
LIST_INSERT_AFTER(lmp, lmt, q);
SLIST_INSERT_AFTER(lmp, lmt, q);
lmp = lmt;
} else if (!userset &&
!F_ISSET(lmp, MARK_DELETED) && F_ISSET(lmp, MARK_USERSET))
@ -197,20 +198,21 @@ mark_set(sp, key, value, userset)
* where it would go.
*/
static LMARK *
mark_find(sp, key)
SCR *sp;
ARG_CHAR_T key;
mark_find(
SCR *sp,
ARG_CHAR_T key)
{
LMARK *lmp, *lastlmp;
LMARK *lmp, *lastlmp = NULL;
/*
* Return the requested mark or the slot immediately before
* where it should go.
*/
for (lastlmp = NULL, lmp = sp->ep->marks.lh_first;
lmp != NULL; lastlmp = lmp, lmp = lmp->q.le_next)
SLIST_FOREACH(lmp, sp->ep->marks, q) {
if (lmp->name >= key)
return (lmp->name == key ? lmp : lastlmp);
lastlmp = lmp;
}
return (lastlmp);
}
@ -221,10 +223,10 @@ mark_find(sp, key)
* PUBLIC: int mark_insdel __P((SCR *, lnop_t, recno_t));
*/
int
mark_insdel(sp, op, lno)
SCR *sp;
lnop_t op;
recno_t lno;
mark_insdel(
SCR *sp,
lnop_t op,
recno_t lno)
{
LMARK *lmp;
recno_t lline;
@ -234,8 +236,7 @@ mark_insdel(sp, op, lno)
/* All insert/append operations are done as inserts. */
abort();
case LINE_DELETE:
for (lmp = sp->ep->marks.lh_first;
lmp != NULL; lmp = lmp->q.le_next)
SLIST_FOREACH(lmp, sp->ep->marks, q)
if (lmp->lno >= lno)
if (lmp->lno == lno) {
F_SET(lmp, MARK_DELETED);
@ -265,8 +266,7 @@ mark_insdel(sp, op, lno)
return (0);
}
for (lmp = sp->ep->marks.lh_first;
lmp != NULL; lmp = lmp->q.le_next)
SLIST_FOREACH(lmp, sp->ep->marks, q)
if (lmp->lno >= lno)
++lmp->lno;
break;

View File

@ -6,7 +6,7 @@
*
* See the LICENSE file for redistribution information.
*
* @(#)mark.h 10.3 (Berkeley) 3/6/96
* $Id: mark.h,v 10.6 2011/07/04 14:41:51 zy Exp $
*/
/*
@ -28,9 +28,10 @@ struct _mark {
};
struct _lmark {
LIST_ENTRY(_lmark) q; /* Linked list of marks. */
SLIST_ENTRY(_lmark) q; /* Linked list of marks. */
recno_t lno; /* Line number. */
size_t cno; /* Column number. */
/* XXXX Needed ? Can non ascii-chars be mark names ? */
CHAR_T name; /* Mark name. */
#define MARK_DELETED 0x01 /* Mark was deleted. */

View File

@ -6,13 +6,21 @@
*
* See the LICENSE file for redistribution information.
*
* @(#)mem.h 10.7 (Berkeley) 3/30/96
* $Id: mem.h,v 10.17 2012/10/07 00:40:29 zy Exp $
*/
#ifdef DEBUG
#define CHECK_TYPE(type, var) \
type L__lp __attribute__((unused)) = var;
#else
#define CHECK_TYPE(type, var)
#endif
/* 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) { \
#define BINC_GOTO(sp, type, lp, llen, nlen) { \
CHECK_TYPE(type *, lp) \
void *L__bincp; \
if ((nlen) > llen) { \
if ((L__bincp = binc(sp, lp, &(llen), nlen)) == NULL) \
@ -24,7 +32,12 @@
lp = L__bincp; \
} \
}
#define BINC_RET(sp, lp, llen, nlen) { \
#define BINC_GOTOC(sp, lp, llen, nlen) \
BINC_GOTO(sp, char, lp, llen, nlen)
#define BINC_GOTOW(sp, lp, llen, nlen) \
BINC_GOTO(sp, CHAR_T, lp, llen, (nlen) * sizeof(CHAR_T))
#define BINC_RET(sp, type, lp, llen, nlen) { \
CHECK_TYPE(type *, lp) \
void *L__bincp; \
if ((nlen) > llen) { \
if ((L__bincp = binc(sp, lp, &(llen), nlen)) == NULL) \
@ -36,65 +49,89 @@
lp = L__bincp; \
} \
}
#define BINC_RETC(sp, lp, llen, nlen) \
BINC_RET(sp, char, lp, llen, nlen)
#define BINC_RETW(sp, lp, llen, nlen) \
BINC_RET(sp, CHAR_T, lp, llen, (nlen) * sizeof(CHAR_T))
/*
* 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) { \
#define GET_SPACE_GOTO(sp, type, bp, blen, nlen) { \
CHECK_TYPE(type *, bp) \
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); \
BINC_GOTO(sp, type, bp, blen, nlen); \
} else { \
BINC_GOTO(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \
bp = L__gp->tmp_bp; \
BINC_GOTOC(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \
bp = (type *) L__gp->tmp_bp; \
blen = L__gp->tmp_blen; \
F_SET(L__gp, G_TMP_INUSE); \
} \
}
#define GET_SPACE_RET(sp, bp, blen, nlen) { \
#define GET_SPACE_GOTOC(sp, bp, blen, nlen) \
GET_SPACE_GOTO(sp, char, bp, blen, nlen)
#define GET_SPACE_GOTOW(sp, bp, blen, nlen) \
GET_SPACE_GOTO(sp, CHAR_T, bp, blen, (nlen) * sizeof(CHAR_T))
#define GET_SPACE_RET(sp, type, bp, blen, nlen) { \
CHECK_TYPE(type *, bp) \
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); \
BINC_RET(sp, type, bp, blen, nlen); \
} else { \
BINC_RET(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \
bp = L__gp->tmp_bp; \
BINC_RETC(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \
bp = (type *) L__gp->tmp_bp; \
blen = L__gp->tmp_blen; \
F_SET(L__gp, G_TMP_INUSE); \
} \
}
#define GET_SPACE_RETC(sp, bp, blen, nlen) \
GET_SPACE_RET(sp, char, bp, blen, nlen)
#define GET_SPACE_RETW(sp, bp, blen, nlen) \
GET_SPACE_RET(sp, CHAR_T, bp, blen, (nlen) * sizeof(CHAR_T))
/*
* 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) { \
#define ADD_SPACE_GOTO(sp, type, bp, blen, nlen) { \
CHECK_TYPE(type *, bp) \
GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \
if (L__gp == NULL || bp == L__gp->tmp_bp) { \
if (L__gp == NULL || bp == (type *)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; \
BINC_GOTOC(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \
bp = (type *) L__gp->tmp_bp; \
blen = L__gp->tmp_blen; \
F_SET(L__gp, G_TMP_INUSE); \
} else \
BINC_GOTO(sp, bp, blen, nlen); \
BINC_GOTO(sp, type, bp, blen, nlen); \
}
#define ADD_SPACE_RET(sp, bp, blen, nlen) { \
#define ADD_SPACE_GOTOC(sp, bp, blen, nlen) \
ADD_SPACE_GOTO(sp, char, bp, blen, nlen)
#define ADD_SPACE_GOTOW(sp, bp, blen, nlen) \
ADD_SPACE_GOTO(sp, CHAR_T, bp, blen, (nlen) * sizeof(CHAR_T))
#define ADD_SPACE_RET(sp, type, bp, blen, nlen) { \
CHECK_TYPE(type *, bp) \
GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \
if (L__gp == NULL || bp == L__gp->tmp_bp) { \
if (L__gp == NULL || bp == (type *)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; \
BINC_RETC(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \
bp = (type *) L__gp->tmp_bp; \
blen = L__gp->tmp_blen; \
F_SET(L__gp, G_TMP_INUSE); \
} else \
BINC_RET(sp, bp, blen, nlen); \
BINC_RET(sp, type, bp, blen, nlen); \
}
#define ADD_SPACE_RETC(sp, bp, blen, nlen) \
ADD_SPACE_RET(sp, char, bp, blen, nlen)
#define ADD_SPACE_RETW(sp, bp, blen, nlen) \
ADD_SPACE_RET(sp, CHAR_T, bp, blen, (nlen) * sizeof(CHAR_T))
/* Free a GET_SPACE returned buffer. */
#define FREE_SPACE(sp, bp, blen) { \
@ -104,6 +141,10 @@
else \
free(bp); \
}
#define FREE_SPACEW(sp, bp, blen) { \
CHECK_TYPE(CHAR_T *, bp) \
FREE_SPACE(sp, (char *)bp, blen); \
}
/*
* Malloc a buffer, casting the return pointer. Various versions.
@ -150,19 +191,50 @@
return (1); \
} \
}
/*
* XXX
* Don't depend on realloc(NULL, size) working.
* Resize a buffer, free any already held memory if we can't get more.
* FreeBSD's reallocf(3) does the same thing, but it's not portable yet.
*/
#define REALLOC(sp, p, cast, size) { \
if ((p = (cast)(p == NULL ? \
malloc(size) : realloc(p, size))) == NULL) \
cast newp; \
if ((newp = (cast)realloc(p, size)) == NULL) { \
if (p != NULL) \
free(p); \
msgq(sp, M_SYSERR, NULL); \
} \
p = newp; \
}
/*
* Versions of memmove(3) and memset(3) that use the size of the
* Versions of bcopy(3) and bzero(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)))
#define BCOPY(p, t, len) bcopy(p, t, (len) * sizeof(*(p)))
#define BZERO(p, len) bzero(p, (len) * sizeof(*(p)))
/*
* p2roundup --
* Get next power of 2; convenient for realloc.
*
* Reference: FreeBSD /usr/src/lib/libc/stdio/getdelim.c
*/
static __inline size_t
p2roundup(size_t n)
{
n--;
n |= n >> 1;
n |= n >> 2;
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;
#if SIZE_T_MAX > 0xffffffffU
n |= n >> 32;
#endif
n++;
return (n);
}
/* Additional TAILQ helper. */
#define TAILQ_ENTRY_ISVALID(elm, field) \
((elm)->field.tqe_prev != NULL)

View File

@ -10,31 +10,25 @@
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)msg.c 10.48 (Berkeley) 9/15/96";
static const char sccsid[] = "$Id: msg.c,v 11.0 2012/10/17 06:34:37 zy Exp $";
#endif /* not lint */
#include <sys/param.h>
#include <sys/types.h> /* XXX: param.h may not have included types.h */
#include <sys/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 <locale.h>
#include <stdarg.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"
@ -45,15 +39,11 @@ static const char sccsid[] = "@(#)msg.c 10.48 (Berkeley) 9/15/96";
* 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
msgq(
SCR *sp,
mtype_t mt,
const char *fmt,
...)
{
#ifndef NL_ARGMAX
#define __NL_ARGMAX 20 /* Set to 9 by System V. */
@ -66,12 +56,17 @@ msgq(sp, mt, fmt, va_alist)
} 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;
size_t blen, len, mlen, nlen;
const char *p;
char *bp, *mp;
va_list ap;
#ifndef NL_ARGMAX
int ch;
char *rbp, *s_rbp;
const char *t, *u;
size_t cnt1, cnt2, soff;
#endif
/*
* !!!
@ -130,7 +125,7 @@ retry: FREE_SPACE(sp, bp, blen);
}
bp = NULL;
blen = 0;
GET_SPACE_GOTO(sp, bp, blen, nlen);
GET_SPACE_GOTOC(sp, bp, blen, nlen);
/*
* Error prefix.
@ -157,8 +152,12 @@ retry: FREE_SPACE(sp, bp, blen);
*/
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));
CHAR_T *wp;
size_t wlen;
CHAR2INT(sp, gp->if_name, strlen(gp->if_name) + 1, wp, wlen);
for (; *wp != '\0'; ++wp) {
len = snprintf(mp, REM, "%s", KEY_NAME(sp, *wp));
mp += len;
if ((mlen += len) > blen)
goto retry;
@ -272,12 +271,10 @@ retry: FREE_SPACE(sp, bp, blen);
fmt = rbp;
#endif
#ifndef NL_ARGMAX
format: /* Format the arguments into the string. */
#ifdef __STDC__
va_start(ap, fmt);
#else
va_start(ap);
#endif
va_start(ap, fmt);
len = vsnprintf(mp, REM, fmt, ap);
va_end(ap);
if (len >= nlen)
@ -347,28 +344,56 @@ nofmt: mp += len;
(void)fprintf(stderr, "%.*s", (int)mlen, bp);
/* Cleanup. */
ret: FREE_SPACE(sp, bp, blen);
#ifndef NL_ARGMAX
ret:
#endif
FREE_SPACE(sp, bp, blen);
alloc_err:
reenter = 0;
}
/*
* msgq_wstr --
* Display a message with an embedded string.
*
* PUBLIC: void msgq_wstr __P((SCR *, mtype_t, const CHAR_T *, const char *));
*/
void
msgq_wstr(
SCR *sp,
mtype_t mtype,
const CHAR_T *str,
const char *fmt)
{
size_t nlen;
CONST char *nstr;
if (str == NULL) {
msgq(sp, mtype, "%s", fmt);
return;
}
INT2CHAR(sp, str, STRLEN(str) + 1, nstr, nlen);
msgq_str(sp, mtype, nstr, fmt);
}
/*
* msgq_str --
* Display a message with an embedded string.
*
* PUBLIC: void msgq_str __P((SCR *, mtype_t, char *, char *));
* PUBLIC: void msgq_str __P((SCR *, mtype_t, const char *, const char *));
*/
void
msgq_str(sp, mtype, str, fmt)
SCR *sp;
mtype_t mtype;
char *str, *fmt;
msgq_str(
SCR *sp,
mtype_t mtype,
const char *str,
const char *fmt)
{
int nf, sv_errno;
char *p;
if (str == NULL) {
msgq(sp, mtype, fmt);
msgq(sp, mtype, "%s", fmt);
return;
}
@ -401,8 +426,7 @@ msgq_str(sp, mtype, str, fmt)
* PUBLIC: void mod_rpt __P((SCR *));
*/
void
mod_rpt(sp)
SCR *sp;
mod_rpt(SCR *sp)
{
static char * const action[] = {
"293|added",
@ -461,7 +485,7 @@ mod_rpt(sp)
}
/* Build and display the message. */
GET_SPACE_GOTO(sp, bp, blen, sizeof(action) * MAXNUM + 1);
GET_SPACE_GOTOC(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) {
@ -512,27 +536,32 @@ mod_rpt(sp)
* PUBLIC: void msgq_status __P((SCR *, recno_t, u_int));
*/
void
msgq_status(sp, lno, flags)
SCR *sp;
recno_t lno;
u_int flags;
msgq_status(
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;
char **ap, *bp, *np, *p, *s, *ep;
CHAR_T *wp;
size_t wlen;
/* Get sufficient memory. */
len = strlen(sp->frp->name);
GET_SPACE_GOTO(sp, bp, blen, len * MAX_CHARACTER_COLUMNS + 128);
GET_SPACE_GOTOC(sp, bp, blen, len * MAX_CHARACTER_COLUMNS + 128);
p = bp;
ep = bp + blen;
/* Convert the filename. */
CHAR2INT(sp, sp->frp->name, len + 1, wp, wlen);
/* 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);
for (; *wp != '\0'; ++wp) {
len = KEY_LEN(sp, *wp);
memcpy(p, KEY_NAME(sp, *wp), len);
p += len;
}
np = p;
@ -543,7 +572,7 @@ msgq_status(sp, lno, flags)
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,
(void)snprintf(p, ep - p,
msg_cat(sp, "317|%d files to edit", NULL), cnt);
p += strlen(p);
*p++ = ':';
@ -617,18 +646,18 @@ msgq_status(sp, lno, flags)
memcpy(p, t, len);
p += len;
} else {
t = msg_cat(sp, "027|line %lu of %lu [%lu%%]", &len);
(void)sprintf(p, t, (u_long)lno, (u_long)last,
(u_long)(lno * 100) / last);
t = msg_cat(sp, "027|line %lu of %lu [%ld%%]", &len);
(void)snprintf(p, ep - p, t, lno, last,
((u_long)lno * 100) / last);
p += strlen(p);
}
} else {
t = msg_cat(sp, "029|line %lu", &len);
(void)sprintf(p, t, (u_long)lno);
(void)snprintf(p, ep - p, t, (u_long)lno);
p += strlen(p);
}
#ifdef DEBUG
(void)sprintf(p, " (pid %lu)", (u_long)getpid());
(void)snprintf(p, ep - p, " (pid %lu)", (u_long)getpid());
p += strlen(p);
#endif
*p++ = '\n';
@ -679,9 +708,9 @@ msgq_status(sp, lno, flags)
* PUBLIC: int msg_open __P((SCR *, char *));
*/
int
msg_open(sp, file)
SCR *sp;
char *file;
msg_open(
SCR *sp,
char *file)
{
/*
* !!!
@ -693,54 +722,50 @@ msg_open(sp, file)
* 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];
nl_catd catd;
char *p;
int rval = 0;
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;
if ((p = strrchr(file, '/')) != NULL && p[1] == '\0') {
/* Confirms to XPG4. */
if ((p = join(file, setlocale(LC_MESSAGES, NULL))) == NULL) {
msgq(sp, M_SYSERR, NULL);
return (1);
}
} else {
/* Make sure it's recognized as a path by catopen(3). */
if ((p = join(".", file)) == NULL) {
msgq(sp, M_SYSERR, NULL);
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);
errno = 0;
if ((catd = catopen(p, NL_CAT_LOCALE)) == (nl_catd)-1) {
if (first) {
first = 0;
return (1);
rval = 1;
goto ret;
}
msgq_str(sp, M_ERR, p,
"030|The file %s is not a message catalog");
return (1);
/*
* POSIX.1-2008 gives no instruction on how to report a
* corrupt catalog file. Errno == 0 is not rare; add
* EFTYPE, which is seen on FreeBSD, for a good measure.
*/
if (errno == 0 || errno == EFTYPE)
msgq_str(sp, M_ERR, p,
"030|The file %s is not a message catalog");
else
msgq_str(sp, M_SYSERR, p, "%s");
rval = 1;
goto ret;
}
first = 0;
if (sp->gp->msg != NULL)
(void)sp->gp->msg->close(sp->gp->msg);
sp->gp->msg = db;
return (0);
msg_close(sp->gp);
sp->gp->catd = catd;
ret: free(p);
return (rval);
}
/*
@ -750,11 +775,10 @@ msg_open(sp, file)
* PUBLIC: void msg_close __P((GS *));
*/
void
msg_close(gp)
GS *gp;
msg_close(GS *gp)
{
if (gp->msg != NULL)
(void)gp->msg->close(gp->msg);
if (gp->catd != (nl_catd)-1)
(void)catclose(gp->catd);
}
/*
@ -764,10 +788,10 @@ msg_close(gp)
* 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;
msg_cmsg(
SCR *sp,
cmsg_t which,
size_t *lenp)
{
switch (which) {
case CMSG_CONF:
@ -802,14 +826,14 @@ msg_cmsg(sp, which, lenp)
* 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;
msg_cat(
SCR *sp,
const char *str,
size_t *lenp)
{
GS *gp;
DBT data, key;
recno_t msgno;
char *p;
int msgno;
/*
* If it's not a catalog message, i.e. has doesn't have a leading
@ -817,28 +841,16 @@ msg_cat(sp, str, lenp)
*/
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];
gp = sp == NULL ? NULL : sp->gp;
if (gp != NULL && gp->catd != (nl_catd)-1 &&
(p = catgets(gp->catd, 1, msgno, str)) != NULL) {
if (lenp != NULL)
*lenp = strlen(p);
return (p);
}
}
if (lenp != NULL)
*lenp = strlen(str);
@ -852,19 +864,22 @@ msg_cat(sp, str, lenp)
* PUBLIC: char *msg_print __P((SCR *, const char *, int *));
*/
char *
msg_print(sp, s, needfree)
SCR *sp;
const char *s;
int *needfree;
msg_print(
SCR *sp,
const char *s,
int *needfree)
{
size_t blen, nlen;
const char *cp;
char *bp, *ep, *p, *t;
CHAR_T *wp, *cp;
size_t wlen;
*needfree = 0;
for (cp = s; *cp != '\0'; ++cp)
if (!isprint(*cp))
/* XXX Not good for debugging ex_read & ex_filter.*/
CHAR2INT5(sp, EXP(sp)->ibcw, (char *)s, strlen(s) + 1, wp, wlen);
for (cp = wp; *cp != '\0'; ++cp)
if (!ISPRINT(*cp))
break;
if (*cp == '\0')
return ((char *)s); /* SAFE: needfree set to 0. */
@ -875,21 +890,21 @@ retry: if (sp == NULL)
free(bp);
else
FREE_SPACE(sp, bp, blen);
needfree = 0;
*needfree = 0;
}
nlen += 256;
if (sp == NULL) {
if ((bp = malloc(nlen)) == NULL)
goto alloc_err;
} else
GET_SPACE_GOTO(sp, bp, blen, nlen);
GET_SPACE_GOTOC(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++);
for (p = bp, ep = (bp + blen) - 1; *wp != '\0' && p < ep; ++wp)
for (t = KEY_NAME(sp, *wp); *t != '\0' && p < ep; *p++ = *t++);
if (p == ep)
goto retry;
*p = '\0';

View File

@ -52,9 +52,9 @@ typedef enum {
* messages.
*/
typedef struct _msgh MSGH; /* MSGS list head structure. */
LIST_HEAD(_msgh, _msg);
SLIST_HEAD(_msgh, _msg);
struct _msg {
LIST_ENTRY(_msg) q; /* Linked list of messages. */
SLIST_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. */

Some files were not shown because too many files have changed in this diff Show More