Import nvi2 version 2.1.3 to vendor branch gitea/vendor/NVI2 origin/vendor/NVI2
authorJohn Marino <draco@marino.st>
Sat, 8 Aug 2015 16:58:23 +0000 (18:58 +0200)
committerJohn Marino <draco@marino.st>
Sat, 8 Aug 2015 16:58:23 +0000 (18:58 +0200)
172 files changed:
contrib/nvi2/LICENSE [new file with mode: 0644]
contrib/nvi2/README [new file with mode: 0644]
contrib/nvi2/catalog/Makefile [new file with mode: 0644]
contrib/nvi2/catalog/README [new file with mode: 0644]
contrib/nvi2/catalog/dump.c [new file with mode: 0644]
contrib/nvi2/catalog/dutch.base [new file with mode: 0644]
contrib/nvi2/catalog/dutch.owner [new file with mode: 0644]
contrib/nvi2/catalog/english.owner [new file with mode: 0644]
contrib/nvi2/catalog/french.base [new file with mode: 0644]
contrib/nvi2/catalog/german.base [new file with mode: 0644]
contrib/nvi2/catalog/german.owner [new file with mode: 0644]
contrib/nvi2/catalog/polish.base [new file with mode: 0644]
contrib/nvi2/catalog/polish.owner [new file with mode: 0644]
contrib/nvi2/catalog/ru_RU.KOI8-R.base [new file with mode: 0644]
contrib/nvi2/catalog/ru_RU.KOI8-R.owner [new file with mode: 0644]
contrib/nvi2/catalog/spanish.base [new file with mode: 0644]
contrib/nvi2/catalog/swedish.base [new file with mode: 0644]
contrib/nvi2/catalog/swedish.owner [new file with mode: 0644]
contrib/nvi2/catalog/uk_UA.KOI8-U.base [new file with mode: 0644]
contrib/nvi2/catalog/uk_UA.KOI8-U.owner [new file with mode: 0644]
contrib/nvi2/catalog/zh_CN.GB2312.base [new file with mode: 0644]
contrib/nvi2/catalog/zh_CN.GB2312.owner [new file with mode: 0644]
contrib/nvi2/cl/README.signal [new file with mode: 0644]
contrib/nvi2/cl/cl.h [new file with mode: 0644]
contrib/nvi2/cl/cl_funcs.c [new file with mode: 0644]
contrib/nvi2/cl/cl_main.c [new file with mode: 0644]
contrib/nvi2/cl/cl_read.c [new file with mode: 0644]
contrib/nvi2/cl/cl_screen.c [new file with mode: 0644]
contrib/nvi2/cl/cl_term.c [new file with mode: 0644]
contrib/nvi2/common/args.h [new file with mode: 0644]
contrib/nvi2/common/common.h [new file with mode: 0644]
contrib/nvi2/common/conv.c [new file with mode: 0644]
contrib/nvi2/common/conv.h [new file with mode: 0644]
contrib/nvi2/common/cut.c [new file with mode: 0644]
contrib/nvi2/common/cut.h [new file with mode: 0644]
contrib/nvi2/common/delete.c [new file with mode: 0644]
contrib/nvi2/common/encoding.c [new file with mode: 0644]
contrib/nvi2/common/exf.c [new file with mode: 0644]
contrib/nvi2/common/exf.h [new file with mode: 0644]
contrib/nvi2/common/gs.h [new file with mode: 0644]
contrib/nvi2/common/key.c [new file with mode: 0644]
contrib/nvi2/common/key.h [new file with mode: 0644]
contrib/nvi2/common/line.c [new file with mode: 0644]
contrib/nvi2/common/log.c [new file with mode: 0644]
contrib/nvi2/common/log.h [new file with mode: 0644]
contrib/nvi2/common/main.c [new file with mode: 0644]
contrib/nvi2/common/mark.c [new file with mode: 0644]
contrib/nvi2/common/mark.h [new file with mode: 0644]
contrib/nvi2/common/mem.h [new file with mode: 0644]
contrib/nvi2/common/msg.c [new file with mode: 0644]
contrib/nvi2/common/msg.h [new file with mode: 0644]
contrib/nvi2/common/multibyte.h [new file with mode: 0644]
contrib/nvi2/common/options.awk [new file with mode: 0644]
contrib/nvi2/common/options.c [new file with mode: 0644]
contrib/nvi2/common/options.h [new file with mode: 0644]
contrib/nvi2/common/options_f.c [new file with mode: 0644]
contrib/nvi2/common/put.c [new file with mode: 0644]
contrib/nvi2/common/recover.c [new file with mode: 0644]
contrib/nvi2/common/screen.c [new file with mode: 0644]
contrib/nvi2/common/screen.h [new file with mode: 0644]
contrib/nvi2/common/search.c [new file with mode: 0644]
contrib/nvi2/common/seq.c [new file with mode: 0644]
contrib/nvi2/common/seq.h [new file with mode: 0644]
contrib/nvi2/common/util.c [new file with mode: 0644]
contrib/nvi2/common/util.h [new file with mode: 0644]
contrib/nvi2/docs/man/Makefile [new file with mode: 0644]
contrib/nvi2/docs/man/vi.1 [new file with mode: 0644]
contrib/nvi2/ex/ex.awk [new file with mode: 0644]
contrib/nvi2/ex/ex.c [new file with mode: 0644]
contrib/nvi2/ex/ex.h [new file with mode: 0644]
contrib/nvi2/ex/ex_abbrev.c [new file with mode: 0644]
contrib/nvi2/ex/ex_append.c [new file with mode: 0644]
contrib/nvi2/ex/ex_args.c [new file with mode: 0644]
contrib/nvi2/ex/ex_argv.c [new file with mode: 0644]
contrib/nvi2/ex/ex_at.c [new file with mode: 0644]
contrib/nvi2/ex/ex_bang.c [new file with mode: 0644]
contrib/nvi2/ex/ex_cd.c [new file with mode: 0644]
contrib/nvi2/ex/ex_cmd.c [new file with mode: 0644]
contrib/nvi2/ex/ex_cscope.c [new file with mode: 0644]
contrib/nvi2/ex/ex_delete.c [new file with mode: 0644]
contrib/nvi2/ex/ex_display.c [new file with mode: 0644]
contrib/nvi2/ex/ex_edit.c [new file with mode: 0644]
contrib/nvi2/ex/ex_equal.c [new file with mode: 0644]
contrib/nvi2/ex/ex_file.c [new file with mode: 0644]
contrib/nvi2/ex/ex_filter.c [new file with mode: 0644]
contrib/nvi2/ex/ex_global.c [new file with mode: 0644]
contrib/nvi2/ex/ex_init.c [new file with mode: 0644]
contrib/nvi2/ex/ex_join.c [new file with mode: 0644]
contrib/nvi2/ex/ex_map.c [new file with mode: 0644]
contrib/nvi2/ex/ex_mark.c [new file with mode: 0644]
contrib/nvi2/ex/ex_mkexrc.c [new file with mode: 0644]
contrib/nvi2/ex/ex_move.c [new file with mode: 0644]
contrib/nvi2/ex/ex_open.c [new file with mode: 0644]
contrib/nvi2/ex/ex_preserve.c [new file with mode: 0644]
contrib/nvi2/ex/ex_print.c [new file with mode: 0644]
contrib/nvi2/ex/ex_put.c [new file with mode: 0644]
contrib/nvi2/ex/ex_quit.c [new file with mode: 0644]
contrib/nvi2/ex/ex_read.c [new file with mode: 0644]
contrib/nvi2/ex/ex_screen.c [new file with mode: 0644]
contrib/nvi2/ex/ex_script.c [new file with mode: 0644]
contrib/nvi2/ex/ex_set.c [new file with mode: 0644]
contrib/nvi2/ex/ex_shell.c [new file with mode: 0644]
contrib/nvi2/ex/ex_shift.c [new file with mode: 0644]
contrib/nvi2/ex/ex_source.c [new file with mode: 0644]
contrib/nvi2/ex/ex_stop.c [new file with mode: 0644]
contrib/nvi2/ex/ex_subst.c [new file with mode: 0644]
contrib/nvi2/ex/ex_tag.c [new file with mode: 0644]
contrib/nvi2/ex/ex_txt.c [new file with mode: 0644]
contrib/nvi2/ex/ex_undo.c [new file with mode: 0644]
contrib/nvi2/ex/ex_usage.c [new file with mode: 0644]
contrib/nvi2/ex/ex_util.c [new file with mode: 0644]
contrib/nvi2/ex/ex_version.c [new file with mode: 0644]
contrib/nvi2/ex/ex_visual.c [new file with mode: 0644]
contrib/nvi2/ex/ex_write.c [new file with mode: 0644]
contrib/nvi2/ex/ex_yank.c [new file with mode: 0644]
contrib/nvi2/ex/ex_z.c [new file with mode: 0644]
contrib/nvi2/ex/script.h [new file with mode: 0644]
contrib/nvi2/ex/tag.h [new file with mode: 0644]
contrib/nvi2/regex/COPYRIGHT [new file with mode: 0644]
contrib/nvi2/regex/WHATSNEW [new file with mode: 0644]
contrib/nvi2/regex/cclass.h [new file with mode: 0644]
contrib/nvi2/regex/cname.h [new file with mode: 0644]
contrib/nvi2/regex/engine.c [new file with mode: 0644]
contrib/nvi2/regex/re_format.7 [new file with mode: 0644]
contrib/nvi2/regex/regcomp.c [new file with mode: 0644]
contrib/nvi2/regex/regerror.c [new file with mode: 0644]
contrib/nvi2/regex/regex.3 [new file with mode: 0644]
contrib/nvi2/regex/regex.h [new file with mode: 0644]
contrib/nvi2/regex/regex2.h [new file with mode: 0644]
contrib/nvi2/regex/regexec.c [new file with mode: 0644]
contrib/nvi2/regex/regfree.c [new file with mode: 0644]
contrib/nvi2/regex/utils.h [new file with mode: 0644]
contrib/nvi2/vi/getc.c [new file with mode: 0644]
contrib/nvi2/vi/v_at.c [new file with mode: 0644]
contrib/nvi2/vi/v_ch.c [new file with mode: 0644]
contrib/nvi2/vi/v_cmd.c [new file with mode: 0644]
contrib/nvi2/vi/v_delete.c [new file with mode: 0644]
contrib/nvi2/vi/v_ex.c [new file with mode: 0644]
contrib/nvi2/vi/v_increment.c [new file with mode: 0644]
contrib/nvi2/vi/v_init.c [new file with mode: 0644]
contrib/nvi2/vi/v_itxt.c [new file with mode: 0644]
contrib/nvi2/vi/v_left.c [new file with mode: 0644]
contrib/nvi2/vi/v_mark.c [new file with mode: 0644]
contrib/nvi2/vi/v_match.c [new file with mode: 0644]
contrib/nvi2/vi/v_paragraph.c [new file with mode: 0644]
contrib/nvi2/vi/v_put.c [new file with mode: 0644]
contrib/nvi2/vi/v_redraw.c [new file with mode: 0644]
contrib/nvi2/vi/v_replace.c [new file with mode: 0644]
contrib/nvi2/vi/v_right.c [new file with mode: 0644]
contrib/nvi2/vi/v_screen.c [new file with mode: 0644]
contrib/nvi2/vi/v_scroll.c [new file with mode: 0644]
contrib/nvi2/vi/v_search.c [new file with mode: 0644]
contrib/nvi2/vi/v_section.c [new file with mode: 0644]
contrib/nvi2/vi/v_sentence.c [new file with mode: 0644]
contrib/nvi2/vi/v_status.c [new file with mode: 0644]
contrib/nvi2/vi/v_txt.c [new file with mode: 0644]
contrib/nvi2/vi/v_ulcase.c [new file with mode: 0644]
contrib/nvi2/vi/v_undo.c [new file with mode: 0644]
contrib/nvi2/vi/v_util.c [new file with mode: 0644]
contrib/nvi2/vi/v_word.c [new file with mode: 0644]
contrib/nvi2/vi/v_xchar.c [new file with mode: 0644]
contrib/nvi2/vi/v_yank.c [new file with mode: 0644]
contrib/nvi2/vi/v_z.c [new file with mode: 0644]
contrib/nvi2/vi/v_zexit.c [new file with mode: 0644]
contrib/nvi2/vi/vi.c [new file with mode: 0644]
contrib/nvi2/vi/vi.h [new file with mode: 0644]
contrib/nvi2/vi/vs_line.c [new file with mode: 0644]
contrib/nvi2/vi/vs_msg.c [new file with mode: 0644]
contrib/nvi2/vi/vs_refresh.c [new file with mode: 0644]
contrib/nvi2/vi/vs_relative.c [new file with mode: 0644]
contrib/nvi2/vi/vs_smap.c [new file with mode: 0644]
contrib/nvi2/vi/vs_split.c [new file with mode: 0644]

diff --git a/contrib/nvi2/LICENSE b/contrib/nvi2/LICENSE
new file mode 100644 (file)
index 0000000..c791511
--- /dev/null
@@ -0,0 +1,41 @@
+/*-
+ * $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, 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
+ * 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. 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.
+ */
diff --git a/contrib/nvi2/README b/contrib/nvi2/README
new file mode 100644 (file)
index 0000000..26fcc16
--- /dev/null
@@ -0,0 +1,66 @@
+#      $Id: README,v 9.2 2015/04/08 17:18:56 zy Exp $
+
+This is version 2.1.3 (2015-04-08) 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 directory layout is as follows:
+
+    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.
+
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+o Nvi was written by Keith Bostic, and the last version is 1.79.  After that,
+
+       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.  
+
+       This software was originally derived from software contributed to
+       the University of California, Berkeley by Steve Kirkendall, the
+       author of the vi clone elvis.  Without his work, this work would
+       have been far more difficult.
+
+       IEEE POSIX 1003.2 style regular expression support is courtesy of
+       Henry Spencer, for which I am *very* grateful.
+
+       Elan Amir did the original 4BSD curses work that made it possible
+       to support a full-screen editor using curses.
+
+       George Neville-Neil added the Tcl interpreter, and the initial
+       interpreter design was his.
+
+       Sven Verdoolaege added the Perl interpreter.
+
+       Rob Mayoff provided the original Cscope support.
+
+o Many, many people suggested enhancements, and provided bug reports and
+  testing, far too many to individually thank.
+
+o From the original vi acknowledgements, by William Joy and Mark Horton:
+
+       Bruce Englar encouraged the early development of this display
+       editor.  Peter Kessler helped bring sanity to version 2's
+       command layout.  Bill Joy wrote versions 1 and 2.0 through 2.7,
+       and created the framework that users see in the present editor.
+       Mark Horton added macros and other features and made the editor
+       work on a large number of terminals and Unix systems.
+
+o And...
+       The financial support of UUNET Communications Services is gratefully
+       acknowledged.
diff --git a/contrib/nvi2/catalog/Makefile b/contrib/nvi2/catalog/Makefile
new file mode 100644 (file)
index 0000000..11e71cc
--- /dev/null
@@ -0,0 +1,78 @@
+#      $Id: Makefile,v 9.0 2012/10/19 15:13:11 zy Exp $
+
+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}
+
+${CAT}: english.base
+       @echo "... $@";                                                 \
+       rm -f $@;                                                       \
+       sort -u $@.base |                                               \
+       awk '{                                                          \
+               if ($$1 == 1) {                                         \
+                       print "\nMESSAGE NUMBER 1 IS NOT LEGAL";        \
+                       exit 1;                                         \
+               }                                                       \
+               if (++nline > $$1) {                                    \
+                       print "DUPLICATE MESSAGE NUMBER " $$1;          \
+                       exit 1;                                         \
+               }                                                       \
+               print $0;                                               \
+       }' |                                                            \
+       sed -e '1s/^/$$set 1~$$quote "~/; 1y/~/\n/' |                   \
+       gencat $@ /dev/stdin;                                           \
+       chmod 444 $@;                                                   \
+       if grep DUPLICATE $@ > /dev/null; then                          \
+               grep DUPLICATE $@;                                      \
+       fi;                                                             \
+       if grep 'NOT LEGAL' $@ > /dev/null; then                        \
+               grep 'NOT LEGAL' $@;                                    \
+       fi
+
+CHK=   dutch.check english.check french.check german.check \
+       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 "... $@";                                                 \
+       f=`basename $@ .check`;                                         \
+       (echo "Unused message id's (this is okay):";                    \
+       awk '{                                                          \
+               while (++nline < $$1)                                   \
+                       printf "%03d\n", nline;                         \
+       }' < $$f.base;                                                  \
+       echo =========================;                                 \
+       echo "MISSING ERROR MESSAGES (Please add!):";                   \
+       awk '{print $$1}' < $$f.base | sort -u > __ck1;                 \
+       awk '{print $$1}' < english.base | sort -u > __ck2;             \
+       comm -13 __ck1 __ck2;                                           \
+       echo =========================;                                 \
+       echo "Extra error messages (just delete them):";                \
+       comm -23 __ck1 __ck2;                                           \
+       echo =========================;                                 \
+       echo "MESSAGES WITH THE SAME MESSAGE ID's (FIX!):";             \
+       for j in                                                        \
+           `sed '/^$$/d' < $$f.base | sort -u |                        \
+           awk '{print $$1}' | uniq -d`; do                            \
+               egrep $$j $$f.base;                                     \
+       done;                                                           \
+       echo =========================;                                 \
+       echo "Duplicate messages, both id and message (this is okay):"; \
+       sed '/^$$/d' < $$f.base | sort | uniq -c |                      \
+       awk '$$1 != 1 { print $$0 }' | sort -n;                         \
+       echo =========================) > $@
+
+english.base: dump ${FILES} #Makefile
+       ./dump ${FILES} |\
+       sed -e '/|/!d' \
+           -e 's/|/ "/' \
+           -e 's/^"//' |\
+       sort -nu > $@
+
+dump: dump.c
+       ${CC} -O -o dump dump.c
+
+clean:
+       rm -f dump dump.o ${CAT} english.base *.check __ck1 __ck2
diff --git a/contrib/nvi2/catalog/README b/contrib/nvi2/catalog/README
new file mode 100644 (file)
index 0000000..42a728a
--- /dev/null
@@ -0,0 +1,127 @@
+#      $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.
+
+Message catalogs in nvi are fairly simple.  Every catalog message
+consists of two parts -- an initial number followed by a pipe (`|')
+character, followed by the English text for the message.  For example:
+
+       msgq(sp, M_ERR, "001|This is an error message");
+
+would be a typical message.
+
+When the msgq() routine is called, if the user has specified a message
+catalog and the format string (the third argument) has a leading number,
+then it is converted to a record number, and that record is retrieved
+from the message catalog and used as a replacement format string.  If
+the record can't be retrieved for any reason, the English text is displayed
+instead.
+
+Each message format string MUST map into the English format string, i.e.
+it can't display more or different arguments than the English one.
+
+For example:
+
+       msgq(sp, M_ERR, "002|Error: %d %x", arg1, arg2);
+
+is a format string that displays two arguments.
+
+Arguments to the msgq function are required to contain ONLY printable
+characters.  No further translation is done by the msgq routine before
+displaying the message on the screen.  For example, in the msgq call:
+
+       msgq(sp, M_ERR, "003|File: %s", file_name);
+
+"file_name" must contain only printable characters.  The routine
+msg_print() returns a printable version of a string; the third argument
+indicates whether the string needs to be freed.  For example:
+
+       char *p;
+       int nf;
+
+       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.
+
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+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
+"<language>.base", e.g. the English one is "english.base".  For
+example:
+
+       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 english.base file.
+
+Before this file being converted to the second file, the POSIX formatted
+message catalog file, by gencat(1), two lines:
+
+       $set 1
+       $quote "
+
+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. "english".  However, a
+locale(1) name is also recommended.
+
+To create a new catalog for nvi:
+
+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.
+
+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
+will create the second (and corresponding) file for each file named
+<language>.base.
+
+Don't worry about missing line numbers, i.e. base files that look like:
+
+       005     Message number 5.
+       007     Message number 7.
+
+This simply means that a message was deleted during the course of nvi's
+development.  It will be taken care of automatically when you create
+the second form of the file.
+
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+If you add new messages to the nvi sources, you can check your work by
+doing "make english; make check".  The "make check" target lists unused
+message numbers, duplicate message numbers, and duplicate messages.
+Unused message numbers are only useful if you are condensing messages.
+Duplicate message numbers are a serious problem and have to be fixed.
+Duplicate messages are only interesting if a message appears often enough
+that it's worth creating a routine so that the string is only need in
+a single place.
+
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+To select a catalog when running nvi, set the "msgcat" option.  If the
+value of this option ends with a '/', it is treated as the name of a
+directory that contains a message catalog "$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.
diff --git a/contrib/nvi2/catalog/dump.c b/contrib/nvi2/catalog/dump.c
new file mode 100644 (file)
index 0000000..585a6d9
--- /dev/null
@@ -0,0 +1,101 @@
+/*-
+ * Copyright (c) 1992, 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. 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.
+ */
+
+#ifndef lint
+static char sccsid[] = "$Id: dump.c,v 8.2 2011/07/14 00:05:25 zy Exp $";
+#endif /* not lint */
+
+#include <ctype.h>
+#include <stdio.h>
+
+static void
+parse(FILE *fp)
+{
+       int ch, s1, s2, s3;
+
+#define        TESTD(s) {                                                      \
+       if ((s = getc(fp)) == EOF)                                      \
+               return;                                                 \
+       if (!isdigit(s))                                                \
+               continue;                                               \
+}
+#define        TESTP {                                                         \
+       if ((ch = getc(fp)) == EOF)                                     \
+               return;                                                 \
+       if (ch != '|')                                                  \
+               continue;                                               \
+}
+#define        MOVEC(t) {                                                      \
+       do {                                                            \
+               if ((ch = getc(fp)) == EOF)                             \
+                       return;                                         \
+       } while (ch != (t));                                            \
+}
+       for (;;) {
+               MOVEC('"');
+               TESTD(s1);
+               TESTD(s2);
+               TESTD(s3);
+               TESTP;
+               putchar('"');
+               putchar(s1);
+               putchar(s2);
+               putchar(s3);
+               putchar('|');
+               for (;;) {              /* dump to end quote. */
+                       if ((ch = getc(fp)) == EOF)
+                               return;
+                       putchar(ch);
+                       if (ch == '"')
+                               break;
+                       if (ch == '\\') {
+                               if ((ch = getc(fp)) == EOF)
+                                       return;
+                               putchar(ch);
+                       }
+               }
+               putchar('\n');
+       }
+}
+
+int
+main(int argc, char *argv[])
+{
+       FILE *fp;
+
+       for (; *argv != NULL; ++argv) {
+               if ((fp = fopen(*argv, "r")) == NULL) {
+                       perror(*argv);
+                       return (1);
+               }
+               parse(fp);
+               (void)fclose(fp);
+       }
+       return (0);
+}
diff --git a/contrib/nvi2/catalog/dutch.base b/contrib/nvi2/catalog/dutch.base
new file mode 100644 (file)
index 0000000..eca193c
--- /dev/null
@@ -0,0 +1,306 @@
+002 "regel te lang"
+003 "kan regel %lu niet verwijderen"
+004 "kan niet toevoegen aan regel %lu"
+005 "kan niet invoegen vooraan regel %lu"
+006 "kan regel %lu niet opslaan"
+007 "kan laatste regel niet lezen"
+008 "Fout: kan regel %lu niet vinden"
+009 "log bestand"
+010 "Er vindt geen logging plaats, kan wijzigingen niet ongedaan maken"
+011 "geen wijzigingen om ongedaan te maken"
+012 "Er vindt geen logging plaats, kan wijzigingen niet ongedaan maken"
+013 "Er vindt geen logging plaats, herhaling niet mogelijk"
+014 "geen wijzigingen om te herhalen"
+015 "%s/%d: schrijven naar log mislukt"
+016 "Vi's standaard invoer en uitvoer moeten aan een terminal gekoppeld zijn"
+017 "Merk %s: niet gezet"
+018 "Merk %s: de regel is verwijderd"
+019 "Merk %s: de cursor positie bestaat niet meer"
+020 "Fout: "
+021 "nieuw bestand"
+022 "naam veranderd"
+023 "gewijzigd"
+024 "ongewijzigd"
+025 "NIET BEVEILIGD"
+026 "niet schrijfbaar"
+027 "regel %lu uit %lu [%ld%%]"
+028 "leeg bestand"
+029 "regel %lu"
+030 "Het bestand %s is geen message catalog"
+031 "Niet in staat om de standaard %s optie in te stellen"
+032 "Gebruik: %s"
+033 "set: optie %s onbekend: 'set all' laat alle opties zien"
+034 "set: [no]%s optie kan geen waarde hebben"
+035 "set: %s optie moet een waarde hebben"
+036 "set: %s optie: %s"
+037 "set: %s optie: %s: getal is te groot"
+038 "set: %s optie: %s is een ongeldige waarde"
+039 "set: %s optie moet een waarde hebben"
+040 "Te weinig kolommen op het scherm, minder dan %d"
+041 "Aantal kolommen te groot, meer dan %d"
+042 "Te weinig regels op het scherm, minder dan %d"
+043 "Aantal regels te groot, meer dan %d"
+044 "De lisp optie is niet ondersteund"
+045 "messages niet uitgeschakeld: %s"
+046 "messages niet geactiveerd: %s"
+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"
+056 "Wijzigingen kunnen niet ongedaan gemaakt worden als deze sessie mislukt"
+057 "Bestand wordt gecopieerd voor herstel..."
+058 "Herstel mechanisme werkt niet: %s"
+059 "Wijzigingen kunnen niet ongedaan gemaakt worden als deze sessie mislukt"
+060 "Kon bestand niet veilig stellen: %s"
+061 "Bestand wordt gecopieerd voor herstel..."
+062 "Informatie met betrekking tot gebruiker nummer %u niet gevonden"
+063 "Kan herstel bestand niet beveiligen"
+064 "herstel buffer overgelopen"
+065 "herstel bestand"
+066 "%s: verminkt herstel bestand"
+067 "%s: verminkt herstel bestand"
+068 "U heeft geen bestand genaamd %s te herstellen"
+069 "U kan eerdere versies van dit bestand herstellen"
+070 "U kan nog meer bestanden herstellen"
+071 "kan geen email versturen: %s"
+072 "Bestand leeg; niets om te doorzoeken"
+073 "Einde van het bestand bereikt zonder dat het patroon gevonden is"
+074 "Geen vorig zoek patroon"
+075 "Patroon niet gevonden"
+076 "Begin van het bestand bereikt zonder dat het patroon gevonden is"
+077 "Zoek-operatie omgeslagen"
+078 "Bezig met zoeken..."
+079 "Geen niet-printbaar karakter gevonden"
+080 "Onbekend commando"
+082 "Commando niet beschikbaar in ex mode"
+083 "Aantal mag niet nul zijn"
+084 "%s: ongeldige regel aanduiding"
+085 "Interne fout in syntax tabel (%s: %s)"
+086 "Gebruik: %s"
+087 "%s: tijdelijke buffer niet vrijgegeven"
+088 "Vlag offset voor regel 1"
+089 "Vlag offset voorbij bestands einde"
+090 "bestand/scherm veranderd tijdens uitvoeren van @ in een blok"
+091 "bestand/scherm veranderd tijdens uitvoeren van globaal/v commando"
+092 "Ex commando mislukt: rest van commando(s) genegeerd"
+093 "Ex commando mislukt: gemappede toetsen genegeerd"
+094 "Het tweede adres is kleiner dan het eerste"
+095 "Geen merk naam opgegeven"
+096 "\\ niet gevolgd door / of ?"
+097 "Referentie aan een regel nummer kleiner dan 0"
+098 "Het %s commando is onbekend"
+099 "Adres waarde te groot"
+100 "Adres waarde te klein"
+101 "Ongeldige adres combinatie"
+102 "Ongeldig adres: slechts %lu regels in het bestand aanwezig"
+103 "Ongeldig adres: het bestand is leeg"
+104 "Het %s commando staat het adres 0 niet toe"
+105 "Geen afkortingen om weer te geven"
+106 "Afkortingen moeten eindigen met een \"woord\" letter"
+107 "Afkortingen mogen geen tabulaties of spaties bevatten"
+108 "Afkortingen mogen geen woord/niet-woord karakters mengen, behalve aan het einde"
+109 "\"%s\" is geen afkorting"
+110 "Vi commando mislukt: gemappede toetsen genegeerd"
+111 "Dit is het laatste bestand"
+112 "Dit is het eerste bestand"
+113 "Dit is het eerste bestand"
+114 "lijst met bestanden is leeg"
+115 "Geen voorgaand commando om \"!\" te vervangen"
+116 "Geen bestandsnaam voor %%"
+117 "Geen bestandsnaam voor #"
+118 "Fout: execl: %s"
+119 "I/O fout: %s"
+120 "Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forceren"
+121 "Kan uw home directory niet vinden"
+122 "Nieuwe huidige directory: %s"
+123 "Geen cut buffers aanwezig"
+124 "Het %s commando kan niet gebruikt worden in een globaal of v commando"
+125 "%s/%s: niet gelezen: noch U noch root is de eigenaar"
+126 "%s/%s: niet gelezen: U bent niet de eigenaar"
+127 "%s/%s: niet gelezen: kan gewijzigd worden door andere gebruikers"
+128 "%s: niet gelezen: noch U noch root is de eigenaar"
+129 "%s: niet gelezen: U bent niet de eigenaar"
+130 "%s: niet gelezen: kan gewijzigd worden door andere gebruikers"
+131 "Geen volgende regel om samen te voegen"
+132 "Geen input map entries"
+133 "Geen command map entries"
+134 "Het %s karakter kan niet ge-remapped worden"
+135 "\"%s\" is niet gemapped"
+136 "Merk naam moet een enkel karakter zijn"
+137 "%s bestaat al, niet weggeschreven; gebruik ! om het te forceren"
+138 "Nieuw .exrc bestand: %s. "
+139 "doel regel ligt in het blok"
+140 "Het open commando vereist dat de open optie actief is"
+141 "Het open commando is nog niet ondersteund"
+142 "Kan dit bestand niet veilig stellen"
+143 "Bestand veilig gesteld"
+144 "%s resulteert in te veel bestandsnamen"
+145 "Alleen echte bestanden en named pipes kunnen gelezen worden"
+146 "%s: lees beveiliging niet beschikbaar"
+147 "Bezig met lezen..."
+148 "%s: %lu regels, %lu karakters"
+149 "Geen achtergrond schermen aanwezig"
+150 "Het script commando is alleen beschikbaar in vi mode"
+151 "Geen comando om uit te voeren"
+152 "shiftwidth optie op 0 gezet"
+153 "Count te groot"
+154 "Count te klein"
+155 "Reguliere expressie opgegeven; r vlag heeft geen betekenis"
+156 "De #, l en p vlaggen kunnen niet gecombineerd worden met de c vlag in vi mode"
+157 "Geen match gevonden"
+158 "Geen voorafgaande tag aanwezig"
+159 "Minder dan %s elementen op de tags stapel; gebruik :display t[ags]"
+160 "Geen bestand genaamd %s op de tags stapel; gebruik :display t[ags]"
+161 "Kies Enter om door te gaan: "
+162 "%s: tag niet gevonden"
+163 "%s: verminkte tag in %s"
+164 "%s: Het regel nummer van deze tag is voorbij het einde van het bestand"
+165 "De tags stapel is leeg"
+166 "%s: zoek patroon niet gevonden"
+167 "%d andere bestanden te wijzigen"
+168 "Buffer %s is leeg"
+169 "Bevestig wijziging? [n]"
+170 "Onderbroken"
+171 "Geen voorafgaande buffer om uit te voeren"
+172 "Geen vorige reguliere expressie"
+173 "Het %s commando vereist dat er een bestand geladen is"
+174 "Gebruik: %s"
+175 "Het visual commando vereist dat de open optie actief is"
+177 "Leeg bestand"
+178 "Geen voorafgaand F, f, T of t zoek commando"
+179 "%s niet gevonden"
+180 "Geen voorafgaand bestand te bewerken"
+181 "Cursor niet op een getal"
+182 "Getal wordt te groot"
+183 "Getal wordt te klein"
+184 "Geen overeenkomstig karakter op deze regel"
+185 "Overeenkomstig karakter niet gevonden"
+186 "Geen karakters te vervangen"
+187 "Geen ander scherm aanwezig"
+188 "Karakters achter het zoek patroon, de regel offset, en/of het z commando"
+189 "Geen voorafgaand zoek patroon"
+190 "Zoekopdracht na omslag teruggekeerd op originele positie"
+191 "Afkorting overschrijdt expansie limiet: karakters genegeerd"
+192 "Ongeldig karakter; quote to enter"
+193 "Reeds aan het begin van de invoer"
+194 "Niet meer karakters te verwijderen"
+195 "Verplaatsing voorbij het einde van het bestand"
+196 "Verplaatsing voorbij het einde van de regel"
+197 "Cursor niet verplaatst"
+198 "Reeds aan het begin van het bestand"
+199 "Verplaatsing voorbij het begin van het bestand"
+200 "Reeds in de eerste kolom"
+201 "Buffers moeten voor het commando opgegeven worden"
+202 "Reeds bij het einde van het bestand"
+203 "Reeds bij het einde van de regel"
+204 "%s is geen vi commando"
+205 "Gebruik: %s"
+206 "Geen karakters te verwijderen"
+207 "Het Q commando vereist de ex terminal interface"
+208 "Geen commando om te herhalen"
+209 "Het bestand is leeg"
+210 "%s mag niet gebruikt worden als een verplaatsings commando"
+211 "Al in commando mode"
+212 "Cursor niet in een woord"
+214 "Windows optie waarde is te groot, maximum is %u"
+215 "Toevoegen"
+216 "Veranderen"
+217 "Commando"
+218 "Invoegen"
+219 "Vervangen"
+220 "Verplaatsing voorbij het eind van het scherm"
+221 "Verplaatsing voorbij het begin van het scherm"
+222 "Scherm moet meer dan %d regels hebben om het te kunnen splitsen"
+223 "Er zijn geen achtergrond schermen"
+224 "Er is geen achtergrond scherm waarin U bestand %s aan het bewerken bent"
+225 "U kan uw enige scherm niet in de achtergrond zetten"
+226 "Het scherm kan slechts verkleind worden tot %d regels"
+227 "Het scherm kan niet kleiner"
+228 "Het scherm kan niet groter"
+230 "Dit scherm kan niet gesuspend worden"
+231 "Onderbroken: gemappede toetsen genegeerd"
+232 "vi: tijdelijke buffer niet vrijgegeven"
+233 "Deze terminal heeft geen %s toets"
+234 "Er kan slechts een buffer opgegeven worden"
+235 "Getal groter dan %lu"
+236 "Onderbroken"
+237 "Aanmaken van tijdelijk bestand is mislukt"
+238 "Waarschuwing: %s is geen regulier bestand"
+239 "%s is al geopend, bestand is in deze sessie niet schrijfbaar"
+240 "%s: verwijdering mislukt"
+241 "%s: sluiting mislukt"
+242 "%s: verwijdering mislukt"
+243 "%s: verwijdering mislukt"
+244 "Bestand niet schrijfbaar, niet weggeschreven; gebruik ! om het te forceren"
+245 "Bestand niet schrijfbaar, niet weggeschreven"
+246 "%s bestaat al, niet weggeschreven; gebruik ! om het te forceren"
+247 "%s bestaat al, niet weggeschreven"
+248 "Gebruik ! om een incompleet bestand weg te schrijven"
+249 "Bestand incompleet, niet weggeschreven"
+250 "%s: bestand op disk nieuwer dan deze versie; gebruik ! om het te forceren"
+251 "%s: bestand op disk nieuwer dan deze versie"
+252 "%s: schrijf beveiliging niet beschikbaar"
+253 "Bezig met schrijven..."
+254 "%s: WAARSCHUWING: BESTAND INCOMPLEET"
+255 "Reeds op de eerste tag van deze groep"
+256 "%s: nieuw bestand: %lu regels, %lu karakters"
+257 "%s: %lu regels, %lu karakters"
+258 "%s resulteert in te veel bestandsnamen"
+259 "%s: geen normaal bestand"
+260 "%s: U bent niet de eigenaar"
+261 "%s: kan gewijzigd worden door andere gebruikers"
+262 "Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forceren"
+263 "Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik :edit! om het te forceren"
+264 "Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forceren"
+265 "Tijdelijk bestand; exit negeert wijzigingen"
+266 "Bestand niet schrijfbaar, wijzigingen niet automatisch weggeschreven"
+267 "log opnieuw gestart"
+268 "Bevestig? [ynq]"
+269 "Druk op een toets om door te gaan: "
+270 "Druk op een toets om door te gaan [: voor meer ex commandos]: "
+271 "Druk op een toets om door te gaan [q om te stoppen]: "
+272 "Deze vorm van %s vereist de ex terminal interface"
+273 "Entering ex input mode."
+274 "Commando mislukt, nog geen bestand geladen."
+275 " doorgaan?"
+276 "Onverwacht character event"
+277 "Onverwacht end-of-file event"
+278 "Geen match gevonden voor dit patroon"
+279 "Onverwacht interrupt event"
+280 "Onverwacht quit event"
+281 "Onverwacht repaint event"
+282 "Reeds op de laatste tag van deze groep"
+283 "Het %s command vereist de ex terminal interface"
+284 "Deze vorm van %s is niet ondersteund als de secure edit optie actief is"
+285 "Onverwacht string event"
+286 "Onverwacht timeout event"
+287 "Onverwacht write event"
+289 "Shell expansies zijn niet ondersteund als de secure edit optie actief is"
+290 "Het %s commando is niet ondersteund als de secure edit optie actief is"
+291 "set: %s mag niet uitgezet worden"
+292 "Scherm te klein."
+293 "toegevoegd"
+294 "gewijzigd"
+295 "verwijderd"
+296 "samengevoegd"
+297 "verplaatst"
+298 "verschoven"
+299 "gebufferd"
+300 "regel"
+301 "regels"
+302 "Vi was niet geladen met een Tcl interpreter"
+303 "Bestand gewijzigd sinds het de laatste keer weg is geschreven."
+304 "Shell expansie mislukt"
+305 "Geen %s edit optie opgegeven"
+306 "Vi was niet geladen met een Perl interpreter"
+307 "Geen ex commando om uit te voeren"
+308 "Kies <CR> om commando uit te voeren, :q om te stoppen"
+309 "Gebruik \"cscope help\" voor uitleg"
+310 "Nog geen cscope connectie aanwezig"
+311 "%s: onbekend zoek type: gebruik een van %s"
+312 "%d: onbekende cscope sessie"
+313 "set: de %s optie mag nooit aangezet worden"
+314 "set: de %s optie mag nooit op 0 gezet worden"
+315 "%s: toegevoegd: %lu regels, %lu karakters"
+316 "Onverwacht resize event"
+317 "%d bestanden te wijzigen"
diff --git a/contrib/nvi2/catalog/dutch.owner b/contrib/nvi2/catalog/dutch.owner
new file mode 100644 (file)
index 0000000..27f47d3
--- /dev/null
@@ -0,0 +1 @@
+J.G. Vons <Gert-Jan.Vons@ocegr.fr>
diff --git a/contrib/nvi2/catalog/english.owner b/contrib/nvi2/catalog/english.owner
new file mode 100644 (file)
index 0000000..034567d
--- /dev/null
@@ -0,0 +1 @@
+Keith Bostic <bostic@cs.berkeley.edu>
diff --git a/contrib/nvi2/catalog/french.base b/contrib/nvi2/catalog/french.base
new file mode 100644 (file)
index 0000000..234b8c6
--- /dev/null
@@ -0,0 +1,306 @@
+002 "Dépassement de longueur de ligne"
+003 "impossible de supprimer la ligne %lu"
+004 "impossible d'ajouter à la ligne %lu"
+005 "impossible d'insérer devant la ligne %lu"
+006 "impossible de stocker la ligne %lu"
+007 "impossible d'obtenir la dernière ligne"
+008 "Erreur : impossible de récupérer la ligne %lu"
+009 "Fichier journal"
+010 "Aucune journalisation n'étant effectuée, impossible d'annuler"
+011 "Aucune action à annuler"
+012 "Aucune journalisation n'étant effectuée, impossible d'annuler"
+013 "Aucune journalisation n'étant effectuée, reprise actualisée impossible"
+014 "Aucune action à refaire"
+015 "%s/%d : Erreur d'écriture de journal"
+016 "L'entrée et la sortie Vi standards doivent être un terminal"
+017 "Marque %s : non définie"
+018 "Marque %s : la ligne a été supprimée"
+019 "Marque %s : la position du curseur n'existe plus"
+020 "Erreur : "
+021 "nouveau fichier"
+022 "le nom a changé"
+023 "modifié"
+024 "non modifié"
+025 "DÉVERROUILLÉ"
+026 "lecture seule"
+027 "ligne %lu de %lu [%ld%%]"
+028 "fichier vide"
+029 "ligne %lu"
+030 "Ce fichier %s n'est pas un catalogue de messages"
+031 "Impossible de configurer option %s par défaut"
+032 "Utilisation : %s"
+033 "Définition : pas d'option %s : 'set all' donne toutes les valeurs optionnelles"
+034 "Définition : option [no]%s ne prend pas de valeur"
+035 "Définition : l'option %s n'est pas booléenne"
+036 "Définition : option %s : %s"
+037 "Définition : option %s : %s : Dépassement de valeur"
+038 "Définition : option %s : %s n'est pas un nombre valide"
+039 "Définition : l'option %s n'est pas booléenne"
+040 "Les colonnes de l'écran sont trop petites, inférieures à %d"
+041 "Les colonnes de l'écran sont trop grandes, supérieures à %d"
+042 "Les lignes de l'écran sont trop courtes, inférieures à %d"
+043 "Les lignes de l'écran sont trop longues, supérieures à %d"
+044 "L'option lisp n'est pas implémentée"
+045 "Les messages ne sont pas désactivés : %s"
+046 "Les messages ne sont pas activés : %s"
+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"
+056 "Impossible de récupérer les modifications si la session échoue"
+057 "Copie en cours du fichier pour récupération..."
+058 "La préservation a échoué : %s"
+059 "Impossible de récupérer les modifications si la session échoue"
+060 "La sauvegarde du fichier a échoué : %s"
+061 "Copie en cours du fichier pour récupération..."
+062 "Les renseignements sur l'identité %u de l'utilisateur sont introuvables"
+063 "Impossible de verrouiller le fichier de récupération"
+064 "Débordement de tampon du fichier de récupération"
+065 "Fichier de récupération"
+066 "%s : Fichier de récupération malformé"
+067 "%s : Fichier de récupération malformé"
+068 "Aucun fichier nommé %s à récupérer, que vous puissiez lire"
+069 "Il existe des versions récupérables antérieures à ce fichier"
+070 "Vous avez d'autres fichiers à récupérer"
+071 "pas d'envoi d'email : %s"
+072 "Fichier vide, rien à rechercher"
+073 "Fin de fichier atteinte sans trouver le motif"
+074 "Pas de motif de recherche précédent"
+075 "Motif introuvable"
+076 "Début du fichier atteint sans trouver le motif"
+077 "La recherche est revenue à son point de départ"
+078 "Recherche en cours..."
+079 "Caractère non-imprimable introuvable"
+080 "Nom de commande inconnu"
+082 "%s : Commande non disponible en ex mode"
+083 "Le compteur ne peut être zéro"
+084 "%s : mauvaise spécification de ligne"
+085 "Erreur de tableau de syntaxe interne (%s: %s)"
+086 "Utilisation : %s"
+087 "%s : tampon temporaire non libéré"
+088 "Décalage de drapeau hors de la ligne 1"
+089 "Décalage de drapeau hors de la fin du fichier"
+090 "@ avec plage, en cours d'exécution quand le fichier/l'écran a changé"
+091 "Commande Global/v en cours d'exécution quand le fichier/l'écran a changé"
+092 "La commande ex a échoué : commandes en attente abandonnées"
+093 "La commande ex a échoué : les touches affectées sont abandonnées"
+094 "La deuxième adresse est plus petite que la première"
+095 "Aucun nom de marque fourni"
+096 "\\ non suivi par / ou ?"
+097 "Référence à un numéro de ligne inférieure à 0"
+098 "La commande %s est inconnue"
+099 "Dépassement de la valeur adresse"
+100 "Dépassement négatif de la valeur adresse"
+101 "Combinaison d'adresse non valide"
+102 "Adresse non valide : il n'y a que %lu lignes dans ce fichier"
+103 "Adresse non valide : le fichier est vide"
+104 "La commande %s ne permet pas une adresse de 0"
+105 "Pas d'abréviations à afficher"
+106 "Les abréviations doivent finir par un caractère \"mot\""
+107 "Les abréviations ne peuvent pas contenir de tabulations ni d'espaces"
+108 "Les abréviations ne peuvent pas contenir un mélange de caractères mot/non-mot, sauf à la fin"
+109 "\"%s\" n'est pas une abréviation"
+110 "La commande Vi a échoué : Les touches affectées ont été abandonnées"
+111 "Plus de fichiers à éditer"
+112 "Pas de fichiers précédents à éditer"
+113 "Pas de fichiers précédents à rembobiner"
+114 "Pas de liste de fichiers à afficher"
+115 "Pas de commande précédente à remplacer \"!\""
+116 "Pas de nom de fichier à substituer à %%"
+117 "Pas de nom de fichier à substituer à #"
+118 "Erreur : execl : %s"
+119 "Erreur E/S : %s"
+120 "Fichier modifié depuis la dernière écriture complète ; écrire ou utiliser ! pour outrepasser"
+121 "Impossible de trouver l'emplacement du répertoire d'origine"
+122 "Nouveau répertoire en cours : %s"
+123 "Pas de tampon de coupure à afficher"
+124 "La commande %s ne peut pas être utilisée à l'intérieur d'une commande globale ou commande v"
+125 "%s/%s : échec de source : ni vous ni le super-utilisateur n'êtes les propriétaires "
+126 "%s/%s : échec de source : vous n'êtes pas le propriétaire"
+127 "%s/%s : échec de source : peut être écrit par un utilisateur autre que le propriétaire"
+128 "%s : échec de source : ni vous ni le super-utilisateur n'êtes les propriétaires"
+129 "%s : échec de source : vous n'êtes pas le propriétaire"
+130 "%s : échec de source : peut être écrit par un utilisateur autre que le propriétaire"
+131 "Pas de lignes suivantes à joindre"
+132 "Pas d'entrées de mappage d'entrée"
+133 "Pas d'entrées de mappage de commandes"
+134 "Le caractère %s ne peut pas être remappé"
+135 "\"%s\" n'est pas actuellement mappé"
+136 "Les noms de marque ne doivent avoir qu'un caractère"
+137 "%s existe, non enregistré; utiliser ! pour outrepasser"
+138 "Nouveau fichier exrc : %s"
+139 "La ligne de destination est à l'intérieur de la plage à déplacer"
+140 "La commande ouverte nécessite que l'option ouverte soit définie"
+141 "La commande ouverte n'est pas encore implémentée"
+142 "La préservation de ce fichier est impossible"
+143 "Fichier préservé"
+144 "%s: étendu dans trop de noms de fichiers"
+145 "Vous ne pouvez lire que les fichiers standards et les canaux de transmission nommés"
+146 "%s: Interdiction de lecture non disponible"
+147 "Lecture en cours..."
+148 "%s: %lu lignes, %lu caractères"
+149 "Pas d'écrans d'arrière-plan à afficher"
+150 "La commande script n'est disponible qu'en mode vi"
+151 "Pas de commande à exécuter"
+152 "Option de largeur de décalage définie sur 0"
+153 "Compter dépassement"
+154 "Compter dépassement négatif"
+155 "Expression standard spécifiée; drapeau r superflu"
+156 "Vous ne pouvez pas en mode vi, combiner les drapeaux #, l et p avec le drapeau c"
+157 "Aucune correspondance trouvée"
+158 "Aucune marque précédente entrée"
+159 "Moins de %s entrées dans la pile de marques ; utilisez t[ags]"
+160 "Pas de fichier %s vers lequel retourner dans la pile de marques ; utiliser : affichage t[ags]"
+161 "Appuyez sur Entrée pour continuer :"
+162 "%s : marque introuvable"
+163 "%s : marque corrompue en %s"
+164 "%s : le numéro de ligne de la marque dépasse la fin du fichier"
+165 "La pile de marques est vide"
+166 "%s : motif de recherche introuvable"
+167 "%d fichiers supplémentaires à éditer"
+168 "Le tampon %s est vide
+169 "Confirmer les changements ? [n]"
+170 "Interrompu"
+171 "Pas de tampon précédent à exécuter"
+172 "Pas d'expression standard précédente"
+173 "La commande %s nécessite qu'un fichier ait déjà été lu en mémoire"
+174 "Utilisation : %s"
+175 "La commande visual nécessite que l'option open soit définie"
+177 "Fichier vide"
+178 "Pas de recherche précédente F, f, T ou t"
+179 "%s introuvable"
+180 "Pas de fichier précédent à éditer"
+181 "Le curseur n'est pas dans un nombre"
+182 "Le nombre obtenu est trop grand"
+183 "Le nombre obtenu est trop petit"
+184 "Pas de correspondance de caractère sur cette ligne"
+185 "Caractère correspondant introuvable"
+186 "Pas de caractères à remplacer"
+187 "Pas d'autre écran vers lequel basculer"
+188 "Caractères après la chaîne de recherche, décalage de ligne et/ou commande z"
+189 "Pas de motif de recherche précédent"
+190 "La recherche est revenue à son point de départ"
+191 "L'abréviation a dépassé la limite de l'expansion : caractères abandonnés"
+192 "Caractère non valide ; guillemet pour saisir"
+193 "Déjà au début de l'insertion"
+194 "Plus de caractères à effacer"
+195 "Déplacement hors de fin de fichier"
+196 "Déplacement hors de fin de ligne"
+197 "Aucun mouvement de curseur n'a été effectué"
+198 "Déjà au début du fichier"
+199 "Déplacement hors du début du fichier"
+200 "Déjà dans la première colonne"
+201 "Les tampons doivent être spécifiés avant la commande"
+202 "Déjà à la fin du fichier"
+203 "Déjà à la fin de la ligne"
+204 "%s n'est pas une commande vi"
+205 "Utilisation : %s"
+206 "Pas de caractères à supprimer"
+207 "La commande Q nécessite une interface terminal ex"
+208 "Pas de commande à répéter"
+209 "Le fichier est vide"
+210 "Vous ne pouvez pas utiliser %s comme commande de déplacement"
+211 "Déjà en mode commande"
+212 "Le curseur n'est pas dans un mot"
+214 "Valeur optionnelle de fenêtre trop grande, maximum est %u"
+215 "Ajouter"
+216 "Changer"
+217 "Commande"
+218 "Insérer"
+219 "Remplacer"
+220 "Déplacement hors de la fin d'écran"
+221 "Déplacement hors du début d'écran"
+222 "L'écran doit être supérieur à %d lignes pour se fractionner"
+223 "Il n'y a pas d'écran d'arrière-plan"
+224 "Il n'y a pas d'écran d'arrière-plan qui édite un fichier nommé %s"
+225 "Vous ne pouvez pas mettre à l'arrière-plan votre seul écran affiché"
+226 "L'écran ne peut être réduit qu'à %d rangs"
+227 "L'écran n'est pas auto-réductible"
+228 "L'écran n'est pas auto-extensible"
+230 "Vous ne pouvez pas mettre cet écran en attente"
+231 "Interrompu : les touches affectées ont été abandonnées"
+232 "vi : le tampon temporaire n' a pas été libéré"
+233 "Ce terminal n'a pas de touche %s"
+234 "Vous ne pouvez spécifier qu'un seul tampon"
+235 "Nombre supérieur à %lu"
+236 "Interrompu"
+237 "Impossible de créer un fichier temporaire"
+238 "Avertissement : %s n'est pas un fichier standard"
+239 "%s déjà verrouillé, session en lecture seule"
+240 "%s: supprimer"
+241 "%s: fermer"
+242 "%s: supprimer"
+243 "%s: supprimer"
+244 "Fichier en lecture seule, non écrit, utiliser ! pour outrepasser"
+245 "Fichier en lecture seule, non écrit"
+246 "%s existe, non écrit; utiliser ! pour outrepasser"
+247 "%s existe, non écrit"
+248 "Fichier partiel, non écrit; utiliser ! pour outrepasser"
+249 "Fichier partiel, non écrit"
+250 "%s: fichier modifié plus récemment que cet exemplaire; utiliser ! pour outrepasser"
+251 "%s: fichier modifié plus récemment que cet exemplaire"
+252 "%s: interdiction d'écriture non disponible"
+253 "Ecriture en cours..."
+254 "%s: AVERTISSEMENT : FICHIER TRONQUÉ"
+255 "Première marque de ce groupe déjà atteinte"
+256 "%s: nouveau fichier : %lu lignes, %lu caractères"
+257 "%s: %lu lignes, %lu caractères"
+258 "%s étendue à trop de noms de fichiers"
+259 "%s: pas un fichier standard"
+260 "%s: ne vous appartient pas"
+261 "%s: accessible par un utilisateur autre que son propriétaire"
+262 "Fichier modifé depuis la dernière écriture complète ; écrire ou utiliser ! pour outrepasser "
+263 "Fichier modifé depuis la dernière écriture complète ; écrire ou utiliser :edit! pour outrepasser"
+264 "Fichier modifé depuis la dernière écriture complète ; écrire ou utiliser ! pour outrepasser"
+265 "Fichier temporaire ; quitter annulera les modifications"
+266 "Fichier en lecture seule ; les modifications ne sont pas écrites automatiquement"
+267 "Journal redémarré"
+268 "confirmer ? [ynq]"
+269 "Appuyez sur n'importe quelle touche pour continuer : "
+270 "Appuyez sur n'importe quelle touche pour continuer [: pour entrer plus de commandes ex] : "
+271 "Appuyez sur n'importe quelle touche pour continuer [q pour Quitter]: "
+272 "Cette forme de %s nécessite l'interface de terminal ex"
+273 "Entrée de mode entrée ex."
+274 "La commande a échoué, aucun fichier n'a encore été lu."
+275 "cont?"
+276 "Evénement imprévu de caractère"
+277 "Evénement imprévu de fin-de-fichier"
+278 "Pas de correspondances pour cette requête"
+279 "Evénement imprévu d'interruption"
+280 "Evénement quitter imprévu"
+281 "Evénement imprévu de rafraîchissement"
+282 "La dernière marque de ce groupe a déjà été atteinte"
+283 "La commande %s nécessite l'interface de terminal ex"
+284 "Cette forme de %s n'est pas reconnue quand l'option d'édition protégée est activée"
+285 "Evénement imprévu de chaîne"
+286 "Evénement imprévu de délai imparti"
+287 "Evénement d'écriture imprévu"
+289 "Les expansions du shell ne sont pas reconnues quand l'option d'édition protégée est activée"
+290 "La commande %s n'est pas reconnue quand l'option d'édition protégée est activée"
+291 "Définition : l'option %s ne peut pas être désactivée"
+292 "Affichage trop petit."
+293 "ajouté"
+294 "changé"
+295 "supprimé"
+296 "joint"
+297 "déplacé"
+298 "décalé"
+299 "coupé"
+300 "ligne"
+301 "lignes"
+302 "Vi n'a pas été chargé avec un interprétateur Tcl"
+303 "Ficher modifié depuis le dernier enregistrement."
+304 "L'expansion du shell a échoué"
+305 "Pas d'option d'édition %s spécifiée"
+306 "Vi n'a pas été chargé avec un interprétateur Perl"
+307 "Pas de commande ex à exécuter"
+308 "Entrez <CR> pour exécuter une commande, :q pour quitter"
+309 "Utiliser \"cscope help\" pour obtenir de l'aide"
+310 "Aucune connexion cscope n'est lancée"
+311 "%s : type de recherche inconnu : utiliser un des %s"
+312 "%d : Il n'existe pas de telle session cscope"
+313 "Définition : l'option %s ne peut jamais être activée"
+314 "Définition : l'option %s ne peut jamais être définie sur 0"
+315 "%s: joints : %lu lignes, %lu caractères"
+316 "événement imprévu de redimensionnement"
+317 "%d fichiers à éditer"
diff --git a/contrib/nvi2/catalog/german.base b/contrib/nvi2/catalog/german.base
new file mode 100644 (file)
index 0000000..f636df2
--- /dev/null
@@ -0,0 +1,306 @@
+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, 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 muß ein Terminal sein"
+017 "Marke %s: nicht gesetzt"
+018 "Marke %s: die Zeile wurde gelöscht"
+019 "Marke %s: Cursorposition existiert nicht mehr"
+020 "Fehler: "
+021 "neue Datei"
+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 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"
+036 "set: %s Option: %s"
+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 "Änderungen nicht wiederherstellbar, falls die Editorsitzung schiefgeht"
+057 "kopiere Datei für Wiederherstellung ..."
+058 "Rettungsmechanismus funktioniert nicht: %s"
+059 "Änderungen nicht wiederherstellbar, falls die Editorsitzung schiefgeht"
+060 "Sicherung der Datei gescheitert: %s"
+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 ä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"
+073 "Dateiende erreicht, ohne das Suchmuster zu finden"
+074 "Kein altes Suchmuster"
+075 "Suchmuster nicht gefunden"
+076 "Dateianfang erreicht, ohne das Suchmuster zu finden"
+077 "Suche beginnt von vorn"
+078 "suche ..."
+079 "Keine nichtdruckbaren Zeichen gefunden"
+080 "Unbekannter Kommandoname"
+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: temporärer Puffer nicht freigegeben"
+088 "Flagoffset vor Zeile 1"
+089 "Flagoffset hinter dem Dateiende"
+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 "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 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 für %%"
+117 "Kein Dateiname für #"
+118 "Fehler: execl: %s"
+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: 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 input-Map Eintrag"
+133 "Kein command-Map Eintrag"
+134 "Das %s Zeichen kann nicht umgemappt werden"
+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, daß die open Option gesetzt ist"
+141 "Das open Kommando ist nocht nicht implementiert"
+142 "Rettung dieser Datei nicht möglich"
+143 "Datei gerettet"
+144 "%s wurde in zu viele Dateinamen expandiert"
+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 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 "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 Einträge auf dem 'tag'-Stack; verwende :display t[ags]"
+160 "Keine Datei namens %s auf dem 'tag'-Stack; verwende :display t[ags]"
+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 editieren"
+168 "Puffer %s ist leer"
+169 "Bestätige Änderung [n]"
+170 "Unterbrochen."
+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 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 editieren"
+181 "Cursor nicht auf einer Zahl"
+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"
+186 "Keine Zeichen zu ersetzen"
+187 "Keine andere Anzeige zum Hinschalten"
+188 "Zeichen nach Suchmuster, Zeilenoffset und/oder z Kommando"
+189 "Kein altes Suchmuster"
+190 "Suche zur 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 löschen"
+195 "Bewegung hinter das Dateiende"
+196 "Bewegung hinter das Zeilenende"
+197 "Keine Cursorbewegung gemacht"
+198 "Bereits am Dateianfang"
+199 "Bewegung vor den Dateianfang"
+200 "Bereits in der ersten Spalte"
+201 "Puffer sollen vor dem Kommando angegeben werden"
+202 "Bereits am Dateiende"
+203 "Bereits am Zeilenende"
+204 "%s ist kein vi Kommando"
+205 "Benutzung: %s"
+206 "Keine Zeichen zu 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 groß, max ist %u"
+215 "Anhängen"
+216 "Ändern"
+217 "Kommando"
+218 "Einfügen"
+219 "Ersetzen"
+220 "Bewegung hinter das Anzeigenende"
+221 "Bewegung vor den Anzeigenanfang"
+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 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 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 größer als %lu"
+236 "Unterbrochen"
+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 Überschreiben"
+249 "Teil der Datei, nicht geschrieben"
+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 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 "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 schiefgelaufen, noch keine Datei eingelesen"
+275 " weiter?"
+276 "unerwartetes Zeichen - Ereignis"
+277 "unerwartetes Dateiende - Ereignis"
+278 "Keine Position zum Anspringen gefunden"
+279 "unerwartetes Unterbrechungs - Ereignis"
+280 "unerwartetes Verlassen - Ereignis"
+281 "unerwartetes Wiederherstellungs - Ereignis"
+282 "Bereits am letzten 'tag' dieser Gruppe"
+283 "Das %s Kommando 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 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 "angefügt"
+294 "geändert"
+295 "gelöscht"
+296 "verbunden"
+297 "verschoben"
+298 "geschoben"
+299 "in Puffer geschrieben"
+300 "Zeile"
+301 "Zeilen"
+302 "Vi wurde nicht mit dem Tcl Interpreter gelinkt"
+303 "Datei wurde seit dem letzten Schreiben 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 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: angefügt: %lu Zeilen, %lu Zeichen"
+316 "unerwartetes Größenveränderungs - Ereignis"
+317 "%d Dateien zu edieren"
diff --git a/contrib/nvi2/catalog/german.owner b/contrib/nvi2/catalog/german.owner
new file mode 100644 (file)
index 0000000..efed56a
--- /dev/null
@@ -0,0 +1,2 @@
+Bernhard Daeubler      <daeb@physik.uni-ulm.de>
+Joerg Wunsch           <joerg_wunsch@uriah.heep.sax.de>
diff --git a/contrib/nvi2/catalog/polish.base b/contrib/nvi2/catalog/polish.base
new file mode 100644 (file)
index 0000000..74b2756
--- /dev/null
@@ -0,0 +1,306 @@
+002 "Zbyt d³uga linia"
+003 "nie mo¿na usun±æ linii %lu"
+004 "nie mo¿na dodaæ do linii %lu"
+005 "nie mo¿na wstawiæ w linii %lu"
+006 "nie mo¿na zachowaæ linii %lu"
+007 "nie mo¿na pobraæ ostatniej linii"
+008 "B³±d: nie mo¿na pobraæ linii %lu"
+009 "Plik logu"
+010 "Brak logowania, anulowanie (undo) niemo¿liwe"
+011 "Brak zmian do anulowania"
+012 "Brak logowania, anulowanie (undo) niemo¿liwe"
+013 "Brak logowania, nie mo¿na przegl±daæ do przodu"
+014 "Brak zmian do powtórzenia"
+015 "%s/%d: b³±d zapisu do logu"
+016 "Standardowe wej¶cie i wyj¶cie vi musi byæ terminalem"
+017 "Znacznik %s: nie ustawiony"
+018 "Znacznik %s: linia zosta³a usuniêta"
+019 "Znacznik %s: pozycja kursora ju¿ nie istnieje"
+020 "B³±d: "
+021 "nowy plik"
+022 "nazwa zosta³a zmieniona"
+023 "zmieniony"
+024 "nie zmieniony"
+025 "ODBLOKOWANY"
+026 "tylko do odczytu"
+027 "linia %lu z %lu [%ld%%]"
+028 "pusty plik"
+029 "linia %lu"
+030 "Plik %s nie jest katalogiem komunikatów"
+031 "Nie mo¿na ustawiæ domy¶lnej opcji %s"
+032 "Sposób u¿ycia: %s"
+033 "set: brak opcji %s: 'set all' wy¶wietla warto¶ci opcji"
+034 "set: opcja no]%s nie pobiera warto¶ci"
+035 "set: opcja %s nie jest zmienn± boolowsk±"
+036 "set: opcja %s: %s"
+037 "set: opcja %s: %s: przepe³nienie"
+038 "set: opcja %s: %s nie jest poprawn± liczb±"
+039 "set: opcja %s nie jest zmienn± boolowsk±"
+040 "Zbyt ma³a liczba kolumn ekranu, mniejsza ni¿ %d"
+041 "Zbyt du¿a liczba kolumn, wiêksza ni¿ %d"
+042 "Zbyt ma³a liczba wierszy ekranu, mniejsza ni¿ %d"
+043 "Zbyt du¿a liczba wierszy ekranu, wiêksza ni¿ %d"
+044 "Opcja lisp nie jest zaimplementowana"
+045 "komunikaty nie wy³±czone: %s"
+046 "komunikaty nie w³±czone: %s"
+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"
+056 "Zmiany nie do odtworzenia, je¶li sesja zostanie przerwana"
+057 "Tworzenie kopii zapasowej..."
+058 "B³±d podczas zachowywania: %s"
+059 "Zmiany nie do odtworzenia, je¶li sesja zostanie przerwana"
+060 "B³±d podczas tworzenia kopii zapasowej: %s"
+061 "Tworzenie kopii zapasowej..."
+062 "Nie znaleziono informacji o u¿ytkowniku numer %u"
+063 "Nie mo¿na zablokowaæ kopii zapasowej"
+064 "Przepe³nienie bufora kopii zapasowej"
+065 "Kopia zapasowa"
+066 "%s: b³êdna kopia zapasowa"
+067 "%s: b³êdna kopia zapasowa"
+068 "Brak plików o nazwie %s, które móg³by¶ odczytaæ, do odzyskania"
+069 "Istniej± starsze wersje tego pliku, które mo¿na odzyskaæ"
+070 "Istniej± inne pliki, które mo¿na odzyskaæ"
+071 "nie wysy³am poczty: %s"
+072 "Pusty plik; nie ma czego szukaæ"
+073 "Dotarto do koñca pliku bez znalezienia szukanego wzorca"
+074 "Brak poprzedniego wzorca poszukiwañ"
+075 "Nie znaleziono wzorca"
+076 "Dotarto do pocz±tku pliku bez znalezienia szukanego wzorca"
+077 "Poszukiwanie od pocz±tku"
+078 "Szukam..."
+079 "Nie znaleziono niedrukowalnych znaków"
+080 "Nieznana nazwa polecenia"
+082 "%s: polecenie niedostêpne w trybie edytora ex"
+083 "Liczba nie mo¿e byæ zerem"
+084 "%s: b³êdny numer linii"
+085 "Wewnêtrzny b³±d tablicy sk³adni (%s: %s)"
+086 "Sposób u¿ycia: %s"
+087 "%s: tymczasowy bufor nie zosta³ zwolniony"
+088 "Przesuniêcie przed liniê 1"
+089 "Przesuniêcie poza koniec pliku"
+090 "@ with range running when the file/screen changed"
+091 "Wykonywano polecenie globalne/wizualne podczas zmiany pliku/ekranu"
+092 "B³±d polecenie ex: pozosta³e polecenia anulowane"
+093 "B³±d polecenia ex: mapowanie klawiszy anulowane"
+094 "Drugi adres jest mniejszy od pierwszego"
+095 "Nie podano nazwy znacznika"
+096 "\\ bez / lub ?"
+097 "Odniesienie do linii o numerze mniejszym od 0"
+098 "Nieznane polecenie %s"
+099 "Przepe³nienie warto¶ci adresu"
+100 "Niedomiar warto¶ci adresu"
+101 "Niedozwolona kombinacja adresu"
+102 "Niedozwolony adres: jest tylko %lu linii w pliku"
+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\""
+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"
+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 \"!\""
+116 "Nie ma nazwy pliku do zast±pienia %%"
+117 "Nie ma nazwy pliku do zast±pienia #"
+118 "B³±d: execl: %s"
+119 "B³±d I/O: %s"
+120 "Plik zmodyfikowany od ostatniego zapisu; zapisz lub u¿yj ! ¿eby wymusiæ"
+121 "Nie mozna znale¼æ katalogu domowego (home)"
+122 "Nowy katalog bie¿±cy: %s"
+123 "Nie ma buforów edycji do wy¶wietlenia"
+124 "Polecenie %s nie mo¿e byæ u¿yte jako czê¶æ polecenia globalnego lub wizualnego"
+125 "%s/%s: nie wczytany: nie nale¿y do ciebie ani do roota"
+126 "%s/%s: nie wczytany: nie nale¿y do ciebie"
+127 "%s/%s: nie wczytany: inny u¿ytkownik ni¿ w³a¶ciciel ma prawo do zapisu"
+128 "%s: nie wczytany: nie nale¿y do ciebie ani do roota"
+129 "%s: nie wczytany: nie nale¿y do ciebie"
+130 "%s: nie wczytany: inny uzytkownik ni¿ w³a¶ciciel ma prawo do zapisu"
+131 "Brak kolejnych linii do po³±czenia"
+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"
+136 "Nazwa znacznika musi byæ pojedyñcz± liter±"
+137 "%s istnieje, nie zapisany; u¿yj ! ¿eby wymusiæ"
+138 "Nowy plik exrc: %s"
+139 "Linia docelowa jest wewn±trz przenoszonego obszaru"
+140 "Polecenie open wymaga ustawienia opcji open"
+141 "Polecenie open jest niezaimplementowane"
+142 "Niemo¿liwe jest zachowanie tego pliku"
+143 "Plik zachowany"
+144 "%s: rozwija siê na zbyt wiele nazw plików"
+145 "Tylko zwyk³e pliki i nazwane ³±cza (named pipes) mo¿na czytaæ"
+146 "%s: nie mo¿na za³o¿yæ blokady do odczytu"
+147 "Czytanie..."
+148 "%s: %lu linii, %lu znaków"
+149 "Brak ekranów w tle do wy¶wietlenia"
+150 "Polecenie script dostêpne jest tylko w trybie vi"
+151 "Brak polecenia do wykonania"
+152 "Opcja shiftwidth ustawiona na 0"
+153 "Przepe³nienie licznika"
+154 "Niedomiar licznika"
+155 "Podano wyra¿enie regularne; flaga r nie ma znaczenia"
+156 "Flagi #, l oraz p nie mog± byæ ³±czone z flag± c w trybie vi"
+157 "Nie znaleziono wzorca"
+158 "Brak poprzedniego znacznika"
+159 "Mniej ni¿ %s na stosie znaczników; u¿yj :display t[ags]"
+160 "Brak pliku %s na stosie znaczników do powrotu; u¿yj :display t[ags]"
+161 "Naci¶nij Enter: "
+162 "%s: znacznik nie znaleziony"
+163 "%s: b³êdny znacznik w %s"
+164 "%s: numer linii znacznika wykracza poza koniec pliku"
+165 "Stos znaczników jest pusty"
+166 "%s: nie znaleziono szukanego wzorca"
+167 "%d plików jeszcze do edycji"
+168 "Bufor %s jest pusty"
+169 "Potwierdzasz zmianê? [n]"
+170 "Przerwany"
+171 "Brak poprzedniego bufora do wykonania"
+172 "Brak poprzedniego wyra¿enia regularnego"
+173 "Polecenie %s wymaga uprzedniego wczytania pliku"
+174 "Sposób u¿ycia: %s"
+175 "Polecenie wizualne wymaga ustawienia opcji open"
+177 "Pusty plik"
+178 "Brak poprzedniego szukania F, f, T lub t"
+179 "%s nie znaleziono"
+180 "Brak poprzedniego pliku do edycji"
+181 "Kursor nie na liczbie"
+182 "Liczba wynikowa zbyt du¿a"
+183 "Liczba wynikowa zbyt ma³a"
+184 "Brak pasuj±cych znaków w tej linii"
+185 "Nie znaleziono pasuj±cych znaków"
+186 "Brak znaków do zamiany"
+187 "Brak innego ekranu do prze³±czenia"
+188 "Znaki poza napisem do szukania, przesuniêciem linii i/lub poleceniem z"
+189 "Brak poprzedniego wzorca szukania"
+190 "Szukanie wróci³o do pierwotnej pozycji"
+191 "Skrót przekroczy³ limit rozwiniêcia: czê¶æ znaków odrzucono"
+192 "Niedozwolony znak; zacytuj, ¿eby wprowadziæ"
+193 "Ju¿ na pocz±tku wstawiania"
+194 "Brak kolejnych znaków do usuniêcia"
+195 "Przesuniêcie poza koniec pliku"
+196 "Przesuniêcie poza koniec linii"
+197 "Nie wykonano przesuniêcia kursora"
+198 "Ju¿ na pocz±tku pliku"
+199 "Przesuniêcie przed pocz±tek pliku"
+200 "Ju¿ w pierwszej kolumnie"
+201 "Nale¿y podaæ bufory przed poleceniem"
+202 "Ju¿ na koñcu pliku"
+203 "Ju¿ na koñcu linii"
+204 "%s nie jest poleceniem vi"
+205 "Sposób u¿ycia: %s"
+206 "Brak znaków do usuniêcia"
+207 "Polecenie Q wymaga interfejsu terminala ex"
+208 "Brak polecenia do powtórzenia"
+209 "Plik jest pusty"
+210 "%s nie mo¿e byæ u¿yte jako polecenie przesuniêcia"
+211 "Ju¿ w trybie poleceñ"
+212 "Kursor nie na s³owie"
+214 "Warto¶ci opcji okna zbyt du¿e, max to %u"
+215 "Do³±cz"
+216 "Zmieñ"
+217 "Polecenie"
+218 "Wstaw"
+219 "Zamieñ"
+220 "Przesuniêcie poza koniec ekranu"
+221 "Przesuniêcie przed pocz±tek ekranu"
+222 "Ekran musi mieæ wiêcej ni¿ %d linii, ¿eby go podzieliæ"
+223 "Brak ekranów w tle"
+224 "Nie ma ekranu w tle z edycj± pliku o nazwie %s"
+225 "Nie mo¿na schowaæ w tle jedynego ekranu edycyjnego"
+226 "Mo¿na zmniejszyæ ekran tylko do %d wierszy"
+227 "Ekran nie mo¿e byæ zmniejszony"
+228 "Ekran nie mo¿e byæ zwiêkszony"
+230 "Ekran nie mo¿e byæ zawieszony"
+231 "Przerwano: odrzucono mapowane klawisze"
+232 "vi: nie zwolniono bufora tymczasowego"
+233 "Ten terminal nie posiada klawisza %s"
+234 "Mo¿na podaæ tylko jeden bufor"
+235 "Liczba wiêksza ni¿ %lu"
+236 "Przerwano"
+237 "Nie mo¿na utworzyæ pliku tymczasowego"
+238 "Uwaga: %s nie jest zwyk³ym plikiem"
+239 "%s ju¿ zablokowany, sesja tylko do odczytu"
+240 "%s: usuñ"
+241 "%s: zamknij"
+242 "%s: usuñ"
+243 "%s: usuñ"
+244 "Plik tylko do odczytu, nie zapisany; u¿yj ! ¿eby wymusiæ"
+245 "Plik tylko do odczytu, nie zapisany"
+246 "%s istnieje, nie zapisany; u¿yj ! ¿eby wymusiæ"
+247 "%s istnieje, nie zapisany"
+248 "Plik czê¶ciowy, nie zapisany; u¿yj ! ¿eby wymusiæ"
+249 "Plik czê¶ciowy, nie zapisany"
+250 "%s: plik zmodyfikowany pó¼niej, ni¿ ta kopia; u¿yj ! ¿eby wymusiæ"
+251 "%s: plik zmodyfikowany pó¼niej, ni¿ ta kopia"
+252 "%s: nie mo¿na zablokowaæ do pisania"
+253 "Zapisywanie..."
+254 "%s: OSTRZE¯ENIE: PLIK ZOSTA£ OBCIÊTY"
+255 "Ju¿ przy pierwszym znaczniku z tej grupy"
+256 "%s: nowy plik: %lu linii, %lu znaków"
+257 "%s: %lu linii, %lu znaków"
+258 "%s rozwija siê na zbyt wiele nazw plików"
+259 "%s: nie jest zwyk³ym plikiem"
+260 "%s: nie jeste¶ w³a¶cicielem"
+261 "%s: dostêpny dla u¿ytkownika innego ni¿ w³a¶ciciel"
+262 "Plik zmodyfikowany od ostatniego zapisu; zapisz lub u¿yj ! ¿eby wymusiæ"
+263 "Plik zmodyfikowany od ostatniego zapisu; zapisz lub u¿yj :edit! ¿eby wymusiæ"
+264 "Plik zmodyfikowany od ostatniego zapisu; zapisz lub u¿yj ! ¿eby wymusiæ"
+265 "To jest plik tymczasowy; wyj¶cie anuluje zmiany"
+266 "Plik tylko do odczytu, nie ma autozapisu zmian"
+267 "Ponownie rozpoczêto logowanie"
+268 "potwierdzasz? [ynq]"
+269 "Naci¶nij dowolny klawisz: "
+270 "Naci¶nij dowolny klawisz [: ¿eby podaæ nastêpne polecenia ex]: "
+271 "Naci¶nij dowolny klawisz [q ¿eby zakoñczyæ]: "
+272 "Ta forma %s wymaga interfejsu terminala ex"
+273 "Wchodzê w tryb wprowadzania ex."
+274 "B³±d polecenia, jeszcze nie wczytano pliku."
+275 " dalej?"
+276 "Nieoczekiwany symbol"
+277 "Nieoczekiwany koniec pliku"
+278 "Brak wzorców pasuj±cych do zapytania"
+279 "Nieoczekiwane przerwanie"
+280 "Nieoczekiwane polecenie koniec"
+281 "Nieoczekiwane polecenie od¶wie¿enia"
+282 "Ju¿ przy ostatnim znaczniku z tej grupy"
+283 "Polecenie %s wymaga interfejsu terminala ex"
+284 "Ta forma %s jest niedostêpna, kiedy ustawiona jest opcja bezpiecznej edycji"
+285 "Nieoczekiwany ci±g znaków"
+286 "Nieoczekiwany timeout"
+287 "Nieoczekiwane polecenie zapisu"
+289 "Rozwiniêcia shella niedostêpne w trybie bezpiecznej edycji"
+290 "Polecenie %s jest niedostêpne w trybie bezpiecznej edycji"
+291 "set: opcji %s nie mo¿na wy³±czyæ"
+292 "Ekran zbyt ma³y."
+293 "dodano"
+294 "zmieniono"
+295 "usuniêto"
+296 "po³±czono"
+297 "przeniesiono"
+298 "przesuniêto"
+299 "wczytano"
+300 "linia"
+301 "linii"
+302 "Vi nie zosta³ uruchomiony z interpreterem Tcl"
+303 "Plik zmodyfikowany od ostatniego zapisu"
+304 "B³±d rozwiniêcia shella"
+305 "Brak opcji %s edycji"
+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"
+310 "Brak aktywnych po³±czeñ cscope"
+311 "%s: nieznany typ poszukiwañ: u¿yj jednego z %s"
+312 "%d: brak takiej sesji cscope"
+313 "set: nie mo¿na nigdy w³±czyæ opcji %s"
+314 "set: opcja %s nie mo¿e nigdy mieæ warto¶ci 0"
+315 "%s: dodano: %lu linii, %lu znaków"
+316 "Nieoczekiwane polecenie zmiany rozmiaru"
+317 "%d plików do edycji"
diff --git a/contrib/nvi2/catalog/polish.owner b/contrib/nvi2/catalog/polish.owner
new file mode 100644 (file)
index 0000000..1fcf5c5
--- /dev/null
@@ -0,0 +1 @@
+Andrzej Bia³ecki <abial@warman.org.pl>
diff --git a/contrib/nvi2/catalog/ru_RU.KOI8-R.base b/contrib/nvi2/catalog/ru_RU.KOI8-R.base
new file mode 100644 (file)
index 0000000..6d1c1b5
--- /dev/null
@@ -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 "ïÐÃÉÉ %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"
+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 "éÎÆÏÒÍÁÃÉÉ ÎÁ ÐÏÌØÚÏ×ÁÔÅÌÑ %u ÎÅ ÎÁÊÄÅÎÏ"
+063 "îÅ×ÏÚÍÏÖÎÏ ÚÁÝÉÔÉÔØ ÓÐÁÓÅÎÎÙÊ ÆÁÊÌ"
+064 "âÕÆÅÒ ×ÏÓÓÔÁÎÏ×ÌÅÎÎÏÇÏ ÆÁÊÌÁ ÐÅÒÅÐÏÌÎÅÎ"
+065 "÷ÏÓÓÔÁÎÏ×ÌÅÎÎÙÊ ÆÁÊÌ"
+066 "%s: ÎÅ ÄÏ ËÏÎÃÁ ×ÏÓÓÔÁÎÏ×ÌÅÎÎÙÊ ÆÁÊÌ"
+067 "%s: ÎÅ ÄÏ ËÏÎÃÁ ×ÏÓÓÔÁÎÏ×ÌÅÎÎÙÊ ÆÁÊÌ"
+068 "æÁÊÌÏ× Ó ÉÍÅÎÅÍ %s, ËÏÔÏÒÙÅ ÷Ù ÍÏÖÅÔÅ ÞÉÔÁÔØ, ÎÅ ÓÕÝÅÓÔ×ÕÅÔ"
+069 "åÓÔØ ÓÔÁÒÙÅ ×ÅÒÓÉÉ ÆÁÊÌÁ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ×ÏÓÓÔÁÎÏ×ÉÔØ"
+070 "óÕÝÅÓÔ×ÕÀÔ ÄÒÕÇÉÅ ÆÁÊÌÙ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ×ÏÓÓÔÁÎÏ×ÉÔØ"
+071 "Å-mail ÎÅ ÐÏÓÌÁÎ: %s"
+072 "æÁÊÌ ÐÕÓÔ - ÉÓËÁÔØ ÎÅÞÅÇÏ"
+073 "äÏÓÔÉÇÎÕÔ ËÏÎÅàÆÁÊÌÁ ÂÅÚ ÎÁÈÏÖÄÅÎÉÑ ÏÂÒÁÚÃÁ ÐÏÉÓËÁ"
+074 "îÅ ÚÁÄÁΠÏÂÒÁÚÅàÐÏÉÓËÁ"
+075 "ïÂÒÁÚÅàÐÏÉÓËÁ ÎÅ ÎÁÊÄÅÎ"
+076 "äÏÓÔÕÐÎÏ ÎÁÞÁÌÏ ÆÁÊÌÁ ÂÅÚ ÎÁÈÏÖÄÅÎÉÑ ÏÂÒÁÚÃÁ ÐÏÉÓËÁ"
+077 "ðÏÉÓË ÚÁÃÉËÌÅÎ"
+078 "ðÏÉÓË..."
+079 "îÅÐÅÞÁÔÎÙÈ ÓÉÍ×ÏÌÏ× ÎÅ ÎÁÊÄÅÎÏ"
+080 "îÅÉÚ×ÅÓÔÎÁÑ ËÏÍÁÎÄÁ"
+082 "%s: ËÏÍÁÎÄÁ ÎÅ ÄÏÓÔÕÐÎÁ × ÒÅÖÉÍÅ ex"
+083 "óÞÅÔÞÉË ÎÅ ÍÏÖÅÔ ÂÙÔØ ÎÕÌÅÍ"
+084 "%s: ÎÅÐÒÁ×ÉÌØÎÏÅ ÕËÁÚÁÎÉÅ ÓÔÒÏËÉ"
+085 "÷ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ × ÓÉÎÔÁËÓÉÓÅ (%s: %s)"
+086 "éÓÐÏÌØÚÏ×ÁÎÉÅ: %s"
+087 "%s: ×ÒÅÍÅÎÎÙÊ ÂÕÆÅÒ ÎÅ ÉÓÐÏÌØÚÏ×ÁÎ"
+088 "íÅÔËÁ ÐÏÓÔÁ×ÌÅÎÁ ÐÅÒÅÄ ÓÔÒÏËÏÊ 1"
+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: ÎÅ ÏÔËÒÙÔ: ÎÅ ÐÒÉÎÁÄÌÅÖÉÔ ÷ÁÍ ÉÌÉ root-Õ"
+126 "%s/%s: ÎÅ ÏÔËÒÙÔ: ÎÅ ÐÒÉÎÁÄÌÅÖÉÔ ÷ÁÍ"
+127 "%s/%s: ÎÅ ÏÔËÒÙÔ: ×ÏÚÍÏÖÎÏÓÔØ ÚÁÐÉÓÉ Õ ÐÏÌØÚÏ×ÁÔÅÌÑ, ÎÅ Ñ×ÌÑÀÝÅÇÏÓÑ ×ÌÁÄÅÌØÃÅÍ"
+128 "%s: ÎÅ ÓÞÉÔÁÎ: ÎÅ ÐÒÉÎÁÄÌÅÖÉÔ ÷ÁÍ ÉÌÉ root-Õ"
+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 ÎÅ ÍÏÇÕÔ ÂÙÔØ ÏÂßÅÄÉÎÅÎÙ Ó ÆÌÁÇÏÍ c × ÒÅÖÉÍÅ vi"
+157 "óÏ×ÐÁÄÅÎÉÊ ÎÅÔ"
+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 "îÅÔ ÐÒÅÄÙÄÕÝÅÇÏ ÒÅÇÕÌÑÒÎÏÇÏ ×ÙÒÁÖÅÎÉÑ"
+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 "úÎÁÞÅÎÉÅ ÏÐÃÉÉ 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 ÕÖÅ ÚÁÂÌÏËÉÒÏ×ÁÎ, ÄÏÓÔÕÐÅΠÔÏÌØËÏ ÎÁ ÞÔÅÎÉÅ"
+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 "õÖÅ ÐÒÉÓÕÔÓÔ×ÕÅÔ × ÐÅÒ×ÏÊ ÍÅÔËÅ ÄÁÎÎÏÊ ÇÒÕÐÐÙ"
+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 "õÖÅ ÐÒÉÓÕÔÓÔ×ÕÅÔ × ÐÏÓÌÅÄÎÅÊ ÍÅÔËÅ ÄÁÎÎÏÊ ÇÒÕÐÐÙ"
+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"
diff --git a/contrib/nvi2/catalog/ru_RU.KOI8-R.owner b/contrib/nvi2/catalog/ru_RU.KOI8-R.owner
new file mode 100644 (file)
index 0000000..20ab08c
--- /dev/null
@@ -0,0 +1,3 @@
+Andrey A. Chernov <ache@nagual.ru>
+Dima Ruban <dima@rdy.com>
+Pavel Timofeev <timp87@gmail.com>
diff --git a/contrib/nvi2/catalog/spanish.base b/contrib/nvi2/catalog/spanish.base
new file mode 100644 (file)
index 0000000..ee37a6d
--- /dev/null
@@ -0,0 +1,306 @@
+002 "Desbordamiento de longitud de línea"
+003 "no se puede borrar la línea %lu"
+004 "no se puede añadir la línea %lu"
+005 "no se puede insertar en la línea %lu"
+006 "no se puede guardar la línea %lu"
+007 "no se puede obtener la última línea"
+008 "Error: no se puede recuperar la línea %lu"
+009 "Archivo de log"
+010 "No se realiza log, no se puede deshacer"
+011 "No hay cambios para deshacer"
+012 "No se realiza log, no se puede deshacer"
+013 "No se realiza log, no se puede remontar hacia adelante"
+014 "No hay cambios para rehacer"
+015 "%s/%d: error de log"
+016 "La entrada y salida estándar de Vi debe ser una terminal"
+017 "Marcar %s: no determinado"
+018 "Marcar %s: se borró la línea"
+019 "Marcar %s: la posición del cursor ya no existe"
+020 "Error: "
+021 "nuevo archivo"
+022 "nombre cambiado"
+023 "modificado"
+024 "no modificado"
+025 "DESTRABADO"
+026 "lectura solamente"
+027 "línea %lu de %lu [%ld%%]"
+028 "archivo vacío"
+029 "línea %lu"
+030 "El archivo %s no es un catálogo de mensajes"
+031 "No se puede determinar la opción por omisión %s"
+032 "Uso: %s"
+033 "determinar: no hay opción %s: 'determinar todo' establece todos los valores de opción"
+034 "determinar: [no] hay opción %s no tiene valor"
+035 "determinar: opción %s no es booleano"
+036 "determinar: opción %s: %s"
+037 "determinar: opción %s: %s: desbordamiento de valores"
+038 "determinar: opción %s: %s es un número ilegal"
+039 "determinar: opción %s no es booleano"
+040 "Las columnas en pantalla son demasiado pequeñas, menos de %d"
+041 "Las columnas en pantalla son demasiado grandes, más de %d"
+042 "Las líneas en pantalla son demasiado pequeñas, menos de %d"
+043 "Las líneas en pantalla son demasiado grandes, más de %d"
+044 "La opción lisp no está implementada"
+045 "mensajes no desconectados: %s"
+046 "mensajes no conectados: %s"
+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"
+056 "Las modificaciones no pueden recuperarse si la sesión falla"
+057 "Copiando archivo para recuperación..."
+058 "Preservación fracasada: %s"
+059 "Las modificaciones no pueden recuperarse si la sesión falla"
+060 "Archivo de respaldo fracasado: %s"
+061 "Copiando archivo para recuperación..."
+062 "Información sobre identificación del usuario %u no encontrada"
+063 "No se puede trabar archivo de recuperación"
+064 "Desbordamiento de buffer de archivo de recuperación"
+065 "Archivo de recuperación"
+066 "%s: archivo de recuperación defectuoso"
+067 "%s: archivo de recuperación defectuoso"
+068 "No hay archivos denominados %s, que usted pueda leer, para recuperar"
+069 "Existen versiones más antiguas de este archivo que usted puede recuperar"
+070 "Existen otros archivos que usted puede recuperar"
+071 "no envía email: %s"
+072 "Archivo vacío; no hay nada para buscar"
+073 "Se alcanzó el final del archivo sin encontrar el patrón"
+074 "No hay patrón anterior de búsqueda"
+075 "No se encontró el patrón"
+076 " Se alcanzó el principio del archivo sin encontrar el patrón"
+077 "Búsqueda reiniciada"
+078 "Buscando..."
+079 "No se encontró ningún carácter no imprimible"
+080 "Nombre de comando desconocido"
+082 "%s: comando no disponible en modalidad ex"
+083 "La cuenta no puede ser cero"
+084 "%s: mala especificación de línea"
+085 "Error interno de tabla de sintaxis (%s: %s)"
+086 "Uso: %s"
+087 "%s: buffer temporario no liberado"
+088 "Desplazamiento de marcador a antes de la línea 1"
+089 "Desplazamiento de marcador más allá del final del archivo"
+090 "@ con rango que corre cuando se cambia el archivo/la pantalla"
+091 "Comando global/v que corre cuando se cambia el archivo/la pantalla"
+092 "Comando Ex fracasado: comandos pendientes descartados"
+093 "Comando Ex fracasado: teclas mapeadas descartadas"
+094 "La segunda dirección es más pequeña que la primera"
+095 "No se suministra nombre de marca"
+096 "\\ no es seguido por / o ?"
+097 "Referencia a un número de línea menor que 0"
+098 "El comando %s es desconocido"
+099 "Desbordamiento de valor de dirección"
+100 "Subdesbordamiento de valor de dirección"
+101 "Combinación de dirección ilegal"
+102 "Dirección ilegal: sólo %lu líneas en el archivo"
+103 "Dirección ilegal: el archivo está vacío"
+104 "El comando %s no permite una dirección de 0"
+105 "No hay abreviaturas para visualizar"
+106 "Las abreviaturas deben terminar con un carácter de \"palabra\" "
+107 "Las abreviaturas no pueden contener tabs o espacios"
+108 "Las abreviaturas no pueden mezclar caracteres palabra/no-palabra, salvo al final"
+109 "\"%s\" no es una abreviatura"
+110 "Comando Vi fracasado: teclas mapeadas descartadas"
+111 "No hay más archivos para editar"
+112 "No hay archivos anteriores para editar"
+113 "No hay archivos anteriores para rebobinar"
+114 "No hay lista de archivos para visualizar"
+115 "No hay un comando anterior para reemplazar a \"!\""
+116 "No hay nombre de archivo para sustituir por %%"
+117 "No hay nombre de archivo para sustituir por #"
+118 "Error: execl: %s"
+119 "Error de E/S: %s"
+120 "Archivo modificado desde la última escritura completa; escribir o usar ! para alterar"
+121 "No se puede encontrar la ubicación del directorio inicial"
+122 "Nuevo directorio actual: %s"
+123 "No hay buffers sueltos para visualizar"
+124 "El comando %s no puede usarse como parte de un comando global o v"
+125 "%s/%s: sin fuente: no le pertenece a usted o a raíz"
+126 "%s/%s: sin fuente: no le pertenece a usted"
+127 "%s/%s: sin fuente: puede ser escrito por un usuario que no sea el propietario"
+128 "%s: sin fuente: no le pertenece a usted o a raíz"
+129 "%s: sin fuente: no le pertenece a usted"
+130 "%s: sin fuente: puede ser escrito por un usuario que no sea el propietario"
+131 "No hay líneas siguientes para unir"
+132 "No hay anotaciones de mapa de entrada"
+133 "No hay anotaciones de mapa de comando"
+134 "El carácter %s no puede remapearse"
+135 "\"%s\" no está mapeado actualmente"
+136 "Marca de nombres debe ser un sólo carácter"
+137 "%s existe, no está escrito; usar ! para alterar"
+138 "Nuevo archivo exrc: %s"
+139 "La línea de destino se encuentra dentro del rango de movimiento"
+140 "El comando abierto requiere que se determine la opción abierta"
+141 "El comando abierto no se ha implementado aún"
+142 "No es posible preservar este archivo"
+143 "Archivo preservado"
+144 "%s: expandido a demasiados nombres de archivo"
+145 "Sólo pueden leerse los archivos regulares y los conductos nombrados"
+146 "%s: traba de lectura no disponible"
+147 "Leyendo..."
+148 "%s: %lu líneas, %lu caracteres"
+149 "No hay pantallas de fondo para mostrar"
+150 "El comando de script sólo está disponible en modalidad vi"
+151 "No hay comando para ejecutar"
+152 "opción de ancho de desplazamiento en 0"
+153 "Desbordamiento de cuenta"
+154 "Subdesbordamiento de cuenta"
+155 "Expresión regular especificada; marcador r no tiene significado"
+156 "Los marcadores #, l y p no pueden combinarse con el marcador c en la modalidad vi"
+157 "No se encontró coincidencia"
+158 "No se ingresó un identificador anterior"
+159 "Se encontraron menos de %s anotaciones en la pila de identificadores; usar :visualizar i[dentificadores]"
+160 "No hay archivo %s en la pila de identificadores al que se pueda volver; usar :visualizar i[dentificadores]" 
+161 "Presionar Intro para continuar: "
+162 "%s: no se encontró el identificador"
+163 "%s: identificador corrompido en %s"
+164 "%s: el número de línea del identificador es posterior al final del archivo"
+165 "La pila de identificadores está vacía"
+166 "%s: patrón de búsqueda no encontrado"
+167 "%d archivos más para editar"
+168 "El buffer %s está vacío"
+169 "¿Confirmar cambio? [n]"
+170 "Interrumpido"
+171 "No hay buffer anterior para ejecutar"
+172 "No hay expresión regular anterior"
+173 "El comando %s requiere que se haya leído un archivo"
+174 "Uso: %s"
+175 "El comando visual requiere que se determine la opción abierta"
+177 "Archivo vacío"
+178 "No hay búsqueda F, f, T o t anterior"
+179 "%s no se encontró"
+180 "No hay archivo anterior para editar"
+181 "El cursor no está en un número"
+182 "El número resultante es demasiado grande"
+183 " El número resultante es demasiado pequeño"
+184 "No hay carácter coincidente en esta línea"
+185 "No se encontró un carácter coincidente"
+186 "No hay caracteres para reemplazar"
+187 "No hay otra pantalla a la que se pueda pasar"
+188 "Caracteres tras de cadena de búsqueda, desplazamiento de línea y/o comando z"
+189 "No hay patrón anterior de búsqueda"
+190 "Búsqueda vuelve a la posición inicial"
+191 "Se superó el límite de expansión de abreviatura: se descartaron caracteres"
+192 "Carácter ilegal; mencionar para entrar"
+193 "Ya se encuentra al principio de la inserción"
+194 "No hay más caracteres para borrar"
+195 "Movimiento más allá del final del archivo"
+196 "Movimiento más allá del final de la línea"
+197 "No hay movimiento del cursor"
+198 "Ya se encuentra al principio del archivo"
+199 "Movimiento más allá del principio del archivo"
+200 "Ya se encuentra en la primera columna"
+201 "Los buffers deben especificarse antes del comando"
+202 "Ya se encuentra al final del archivo"
+203 "Ya se encuentra al final de la línea"
+204 "%s no es un comando vi"
+205 "Uso: %s"
+206 "No hay caracteres para borrar"
+207 "El comando Q requiere la interfase de terminal ex"
+208 "No hay comando para repetir"
+209 "El archivo está vacío"
+210 "%s no puede usarse como comando de movimiento"
+211 "Ya se encuentra en modalidad de comando"
+212 "El cursor no se encuentra en una palabra"
+214 "El valor de opción de Windows es demasiado grande, el máx. es %u"
+215 "Añadir"
+216 "Cambiar"
+217 "Comando"
+218 "Insertar"
+219 "Reemplazar"
+220 "El movimiento va más allá del final de la pantalla"
+221 "El movimiento va más allá del principio de la pantalla"
+222 "La pantalla debe tener más de %d líneas para dividirse"
+223 "No hay pantallas de fondo"
+224 "No hay pantalla de fondo editando un archivo denominado %s"
+225 "No se puede poner fondo a la única pantalla que se visualiza"
+226 "La pantalla sólo puede reducirse a %d hileras"
+227 "La pantalla no puede reducirse"
+228 "La pantalla no puede aumentarse"
+230 "Esta pantalla no puede suspenderse"
+231 "Interrumpido: teclas mapeadas descartadas"
+232 "vi: buffer temporario no liberado"
+233 "Esta terminal no tiene tecla %s"
+234 "Sólo un buffer puede especificarse"
+235 "Número mayor que %lu"
+236 "Interrumpido"
+237 "No se puede crear archivo temporario"
+238 "Advertencia: %s no es un archivo regular"
+239 "%s ya se encuentra trabado, la sesión es de lectura solamente"
+240 "%s: eliminar"
+241 "%s: cerrar"
+242 "%s: eliminar"
+243 "%s: eliminar"
+244 "Archivo de lectura solamente, no escrito; usar ! para alterar"
+245 " Archivo de lectura solamente, no escrito"
+246 "%s existe, no escrito; usar ! para alterar"
+247 "%s existe, no escrito"
+248 "Archivo parcial, no escrito; usar ! para alterar"
+249 "Archivo parcial, no escrito"
+250 "%s: archivo modificado más recientemente que esta copia; usar ! para alterar"
+251 "%s: archivo modificado más recientemente que esta copia"
+252 "%s: la traba de escritura no estaba disponible"
+253 "Escribiendo..."
+254 "%s: ADVERTENCIA: ARCHIVO TRUNCADO"
+255 "Ya se encuentra en el primer identificador de este grupo"
+256 "%s: nuevo archivo: %lu líneas, %lu caracteres"
+257 "%s: %lu líneas, %lu caracteres"
+258 "%s expandido a demasiados nombres de archivos"
+259 "%s: no es un archivo regular"
+260 "%s: no le pertenece"
+261 "%s: accesible por un usuario que no sea el propietario"
+262 "Archivo modificado desde la última escritura completa; escribir o usar ! para alterar"
+263 "Archivo modificado desde la última escritura completa; escribir o usar :editar! para alterar"
+264 "Archivo modificado desde la última escritura completa; escribir o usar ! para alterar"
+265 "El archivo es temporario; al salir se descartarán las modificaciones"
+266 "Archivo de lectura solamente, las modificaciones no se autoescriben"
+267 "Se reinició el log"
+268 "confirmar? [snq]"
+269 "Presionar cualquier tecla para continuar: "
+270 "Presionar cualquier tecla para continuar [: para ingresar más comandos ex]: "
+271 "Presionar cualquier tecla para continuar [q para salir]: "
+272 "Esta forma de %s requiere la interfase terminal ex"
+273 "Ingresando en la modalidad de entrada ex."
+274 "Comando fracasado, no hay archivo leído aun."
+275 " cont?"
+276 "Evento inesperado de carácter"
+277 "Evento inesperado de final de archivo"
+278 "No hay coincidencias para consulta"
+279 "Evento inesperado de interrupción"
+280 "Evento inesperado de salida"
+281 "Evento inesperado de repintura"
+282 "Ya se encuentra en el último identificador de este grupo"
+283 "El comando %s requiere la interfase terminal ex"
+284 "Esta forma de %s no se encuentra soportada cuando se determina la opción de edición segura"
+285 "Evento inesperado de cadena"
+286 "Evento inesperado de tiempo excedido"
+287 "Evento inesperado de escritura"
+289 "Las expansiones de shell no se encuentran soportadas cuando se determina la opción de edición segura"
+290 "El comando %s no se encuentra soportado cuando se determina la opción de edición segura"
+291 "determinar: la opción %s puede no estar desconectada"
+292 "El monitor es demasiado pequeño."
+293 "agregado"
+294 "cambiado"
+295 "borrado"
+296 "unido"
+297 "movido"
+298 "desplazado"
+299 "arrancado"
+300 "línea"
+301 "líneas"
+302 "Vi no se cargó con un intérprete Tcl"
+303 "Archivo modificado desde la última escritura."
+304 "Expansión de shell fracasada"
+305 "No hay opción de edición %s especificada"
+306 "Vi no se cargó con un intérprete Perl"
+307 "No hay comando ex para ejecutar"
+308 "Ingresar <CR> para ejecutar un comando, :q para salir"
+309 "Usar \"cscope ayuda\" para obtener ayuda"
+310 "No hay conexiones cscope corriendo"
+311 "%s: tipo de búsqueda desconocido: usar uno de %s"
+312 "%d: no existe esta sesión cscope"
+313 "determinar: la opción %s no puede conectarse nunca"
+314 "determinar: la opción %s no puede determinarse nunca en 0"
+315 "%s: añadido: %lu líneas, %lu caracteres"
+316 "Evento inesperado de modificación de tamaño"
+317 "%d archivos para editar"
diff --git a/contrib/nvi2/catalog/swedish.base b/contrib/nvi2/catalog/swedish.base
new file mode 100644 (file)
index 0000000..7143c5a
--- /dev/null
@@ -0,0 +1,306 @@
+002 "För långa rader"
+003 "kan inte ta bort rad %lu"
+004 "kan inte lägga till på rad %lu"
+005 "kan inte sätta in på rad %lu"
+006 "kan inte lagra rad %lu"
+007 "kan inte hämta sista raden"
+008 "Fel: kan inte hämta rad %lu"
+009 "Loggningsfil"
+010 "Loggning utförs inte, ångra är inte möjligt"
+011 "Inga ändringar att ångra"
+012 "Loggning utförs inte, ångra är inte möjligt"
+013 "Loggning utförs inte, ångra ångra är inte möjligt"
+014 "Inga ändringar att återgöra"
+015 "%s/%d: fel vid loggning"
+016 "Vi:s standard in och ut måste gå till en terminal"
+017 "Markering %s: inte satt"
+018 "Markering %s: raden har tagits bort"
+019 "Markering %s: markörpositionen finns inte längre"
+020 "Fel: "
+021 "ny fil"
+022 "namnet ändrades"
+023 "ändrad"
+024 "oförändrad"
+025 "OLÅST"
+026 "inte skrivbar"
+027 "rad %lu av %lu [%ld%%]"
+028 "tom fil"
+029 "rad %lu"
+030 "Filen %s är ingen meddelandekatalog"
+031 "Kan inte sätta standardvärde för %s flaggan"
+032 "Användning: %s"
+033 "set: %s är en okänd flagga: \"set all\" visar alla flaggor"
+034 "set: [no]%s flaggan kan inte ges ett värde"
+035 "set: %s flaggan är inte boleansk"
+036 "set: %s flaggan: %s"
+037 "set: %s flaggan: %s: för stort värde"
+038 "set: %s flaggan: %s är ett otillåtet tal"
+039 "set: %s flaggan är inte boleansk"
+040 "Fönsterkolumnerna är för få, mindre än %d"
+041 "Fönsterkolumnerna är för många, fler än %d"
+042 "Fönsterraderna är för få, mindre än %d"
+043 "Fönsterraderna är för många, fler än %d"
+044 "Lisp flaggan är inte implementerad"
+045 "meddelanden är inte avslagna: %s"
+046 "meddelanden är inte påslagna: %s"
+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"
+056 "Ändringar kan inte återskapas om programmet kraschar"
+057 "Kopierar filen för återskapning..."
+058 "Säkerhetskopiering misslyckades: %s"
+059 "Ändringar kan inte återskapas om programmet kraschar"
+060 "Misslyckades att säkerhetskopiera filen: %s"
+061 "Kopierar filen för återskapning..."
+062 "Kan inte hitta information om användaridentitet %u"
+063 "Kan inte låsa återskapningsfilen"
+064 "Återskapningsfilens buffer överskriven"
+065 "Återskapningsfil"
+066 "%s: Återskapningsfilen är korrupt"
+067 "%s: Återskapningsfilen är korrupt"
+068 "Det finns ingen fil %s, läsbar av dig, att återskapa"
+069 "Det finns äldre versioner av denna fil som du kan återskapa"
+070 "Det finns andra filer du kan återskapa"
+071 "skickar inte email: %s"
+072 "Filen är tom; inget att söka i"
+073 "Kom till slutet på filen utan att hitta söksträngen"
+074 "Ingen tidigare söksträng"
+075 "Hittar inte söksträngen"
+076 "Kom till början av filen utan att hitta söksträngen"
+077 "Sökningen slog runt"
+078 "Söker..."
+079 "Inga icke skrivbara tecken funna"
+080 "Okänt kommandonamn"
+082 "%s: kommandot är inte tillgängligt i \"ex\" läge"
+083 "Talet får inte vara noll"
+084 "%s: Ogiltig radspecifikation"
+085 "Fel i intern syntaxtabell (%s: %s)"
+086 "Användning: %s"
+087 "%s: temporärbuffert inte frisläppt"
+088 "Offset är före rad 1"
+089 "Offset är efter slutet på filen"
+090 "@ med intervall exekverades när filen/fönstret ändrades"
+091 "Global/v kommando exekverades när filen/fönstret ändrades"
+092 "Ex kommando misslyckades: efterföljande kommandon ignorerade"
+093 "Ex kommando misslyckades: omdefinierade tangenter ignorerade"
+094 "Den andra adressen är mindre än den första"
+095 "Inget namn på markering givet"
+096 "\\ följs inte av / eller ?"
+097 "Referens till ett radnummer mindre än 0"
+098 "%s kommandot är inte känt"
+099 "Värdet på adressen är för stort"
+100 "Värdet på adressen är för litet"
+101 "Otillåten adresskombination"
+102 "Otillåten adress: bara %lu rader finns i filen"
+103 "Otillåten adress: filen är tom"
+104 "%s kommandot tillåter inte en adress som är 0"
+105 "Inga förkortningar att visa"
+106 "Förkortningar måste sluta med ett \"ord\" tecken"
+107 "Förkortningar kan inte innehålla mellanslag eller tab"
+108 "Förkortningar kan inte blanda \"ord\"/\"icke ord\" tecken, utom i slutet"
+109 "\"%s\" är ingen förkortning"
+110 "Vi kommando misslyckades: omdefinierade tangenter ignorerade"
+111 "Inga fler filer att editera"
+112 "Inga tidigare filer att editera"
+113 "Inga tidigare filer att spela tillbaka"
+114 "Ingen fillista att visa"
+115 "Inget tidigare kommando att ersätta \"!\" med"
+116 "Inget filnamn att ersätta %% med"
+117 "Inget filnamn att ersätta # med"
+118 "Fel: execl: %s"
+119 "I/O fel: %s"
+120 "Filen ändrad efter sista skrivning; spara eller använd !"
+121 "Kan inte hitta hemkatalog"
+122 "Ny nuvarande katalog: %s"
+123 "Inga \"cut buffers\" att visa"
+124 "%s kommandot kan inte används som del i ett \"global\" eller v kommando"
+125 "%s/%s: inte läst: varken du eller root är ägare"
+126 "%s/%s: inte läst: du är inte ägare"
+127 "%s/%s: inte läst: skrivbar av annan än ägaren"
+128 "%s: inte läst: varken du eller root är ägare"
+129 "%s: inte läst: du är inte ägare"
+130 "%s: inte läst: skrivbar av annan än ägaren"
+131 "Ingen nästa rad att sätta ihop med"
+132 "Det finns inget i inmatningsmappningen"
+133 "Det finns inget i kommandomappningen"
+134 "%s tecknet kan inte mappas om"
+135 "\"%s\" är inte ommappat just nu"
+136 "Namn på markeringar måste vara ett tecken långa"
+137 "%s finns, inget sparat; använd ! för att spara"
+138 "Ny exrc fil: %s"
+139 "Målraden ligger inne i området som ska flyttas"
+140 "Open kommandot kräver att open flaggan är satt"
+141 "Open kommandot är inte implementerat ännu"
+142 "Säkerhetskopiering av filen är inte möjligt"
+143 "Filen säkerhetskopierad"
+144 "%s expanderade till för många filnamn"
+145 "Endast vanliga filer och namngivna rör kan läsas"
+146 "%s: läslåset är otillgängligt"
+147 "Läser..."
+148 "%s: %lu rader, %lu tecken"
+149 "Inga bakgrundsfönster att visa"
+150 "Script kommandot finns bara i \"vi\" läge"
+151 "Inget kommando att exekvera"
+152 "shiftwidth flaggan satt till 0"
+153 "Talet har för stort värde"
+154 "Talet har för litet värde"
+155 "Reguljärt uttryck är givet; r flaggan är meningslös"
+156 "#, l och p flaggorna kan inte kombineras med c flaggan i \"vi\" läge"
+157 "Ingen matchande text funnen"
+158 "Inget tidigare märke har givits"
+159 "Det är färre än %s märken i stacken; använd :display t[ags]"
+160 "Det finns ingen fil %s i märkesstacken; använd :display t[ags]"
+161 "Tryck Enter för att fortsätta: "
+162 "%s: märke inte funnet"
+163 "%s: korrupt märke i %s"
+164 "%s: märkets radnummer är bortom filslutet"
+165 "Märkesstacken är tom"
+166 "%s: söksträngen inte funnen"
+167 "%d filer till att editera"
+168 "Buffert %s är tom"
+169 "Bekräfta ändring? [n]"
+170 "Avbruten"
+171 "Ingen tidigare buffert att exekvera"
+172 "Inget tidigare reguljärt uttryck"
+173 "%s kommandot kräver att en fil redan lästs in"
+174 "Användning: %s"
+175 "Visual kommandot kräver att open flaggan är satt"
+177 "Tom fil"
+178 "Ingen tidigare F, f, T eller t sökning"
+179 "%s inte funnen"
+180 "Ingen tidigare fil att editera"
+181 "Markören är inte i ett tal"
+182 "Det resulterande talet är för stort"
+183 "Det resulterande talet är för litet"
+184 "Inget matchande tecken på denna rad"
+185 "Matchande tecken inte funnet"
+186 "Det finns inga tecken att ersätta"
+187 "Det finns inget fönster att byta till"
+188 "Tecken efter söksträng, radoffset och/eller z kommandot"
+189 "Ingen tidigare söksträng"
+190 "Sökningen slog runt till ursprungliga positionen"
+191 "Förkortning överskred expanderingsgränsen: tecken har tagits bort"
+192 "Ogiltigt tecken; använd \"quote\" för att sätta in"
+193 "Redan i början på insättningen"
+194 "Inga fler tecken att ta bort"
+195 "Försök att gå bortom slutet på filen"
+196 "Försök att gå bortom slutet på raden"
+197 "Ingen förflyttning gjord"
+198 "Redan i början på filen"
+199 "Försök att gå före början på filen"
+200 "Redan i första kolumnen"
+201 "Buffertar måste anges före kommandot"
+202 "Redan i slutet av filen"
+203 "Redan på slutet av raden"
+204 "%s är inte ett \"vi\" kommando"
+205 "Användning: %s"
+206 "Inga tecken att ta bort"
+207 "Q kommandot kräver \"ex\" i terminalläge"
+208 "Inget kommando att repetera"
+209 "Filen är tom"
+210 "%s kan inte användas som ett förflyttningskommando"
+211 "Redan i kommando läge"
+212 "Markören är inte i ett ord"
+214 "Windows flaggans värde är för stor, största värde är %u"
+215 "Lägg till"
+216 "Ändra"
+217 "Kommando"
+218 "Sätt in"
+219 "Ersätt"
+220 "Förflyttning bortom fönsterslut"
+221 "Förflyttning till före fönstrets början"
+222 "Fönstret måste vara större än %d rader för delning"
+223 "Det finns inga fönster i bakgrunden"
+224 "Det finns inget fönster i bakgrunden som editerar filen %s"
+225 "Du får inte sätta ditt enda synliga fönster i bakgrunden"
+226 "Fönstret kan bara krympa till %d rader"
+227 "Fönstret kan inte krympa"
+228 "Fönstret kan inte växa"
+230 "Detta fönster kan inte pausas"
+231 "Avbrutet: omdefinierade tangenter ignorerade"
+232 "vi: temporärbuffertar inte frisläppta"
+233 "Denna terminal har ingen %s tangent"
+234 "Endast en buffert kan anges"
+235 "Talet är större än %lu"
+236 "Avbrutet"
+237 "Kan inte skapa temporär fil"
+238 "Warning: %s är inte en normal fil"
+239 "%s är redan låst, detta blir en icke skrivbar session"
+240 "%s: ta bort"
+241 "%s: stäng"
+242 "%s: ta bort"
+243 "%s: ta bort"
+244 "Ej skrivbar fil, filen inte sparad; använd ! för att skriva över"
+245 "Ej skrivbar fil, filen inte sparad"
+246 "%s finns, ej sparad; använd ! för att utföra operationen"
+247 "%s finns, filen inte sparad"
+248 "Ofullständig fil, filen inte sparad, använd ! för att skriva över"
+249 "Ofullständig fil, filen inte sparad"
+250 "%s: filen ändrad efter denna kopia togs; använd ! för att utföra operationen"
+251 "%s: filen ändrad efter denna kopia togs"
+252 "%s: skrivlåset är otillgängligt"
+253 "Skriver..."
+254 "%s: VARNING: FILEN TRUNKERAD"
+255 "Redan vid första märket i denna grupp"
+256 "%s: ny fil: %lu rader, %lu tecken"
+257 "%s: %lu rader, %lu tecken"
+258 "%s expanderade till för många filnamn"
+259 "%s är inte en normal fil"
+260 "%s ägs inte av dig"
+261 "%s är åtkomstbar av andra än ägaren"
+262 "Filen har ändrats efter den sparats; spara eller använd !"
+263 "Filen har ändrats efter den sparats; spara eller använd :edit!"
+264 "Filen har ändrats efter den sparats; spara eller använd !"
+265 "Filen är temporär; exit kastar bort ändringarna"
+266 "Ej skrivbar fil, ändringar har inte automatsparats"
+267 "Loggningen startar om"
+268 "bekräfta? [ynq]"
+269 "Tryck på en tangent för att fortsätta: "
+270 "Tryck på en tangent för att fortsätta [: för att ge fler kommandon]: "
+271 "Tryck på en tangent för att fortsätta [q för att avsluta]: "
+272 "Den formen av %s kräver \"ex\" i terminalläge"
+273 "Går till \"ex\" inmatningsläge."
+274 "Kommandot misslyckades, ingen fil inläst ännu."
+275 " forts?"
+276 "Oväntad teckenhändelse"
+277 "Oväntad filslutshändelse"
+278 "Sökningen hittade ingenting"
+279 "Oväntad avbrottshändelse"
+280 "Oväntad avslutningshändelse"
+281 "Oväntad omritningshändelse"
+282 "Redan vid sista märket i denna grupp"
+283 "%s kommandot kräver \"ex\" i terminalläge"
+284 "Den formen av %s är inte tillgänglig när secure edit flaggan är satt"
+285 "Oväntad stränghändelse"
+286 "Oväntad tidshändelse"
+287 "Oväntad skrivhändelse"
+289 "Skalexpansion är inte tillgänglig när secure edit flaggan är satt"
+290 "%s kommandot är inte tillgänglig när secure edit flaggan är satt"
+291 "set: %s kan inte slås av"
+292 "Fönstret för litet."
+293 "tillagda"
+294 "ändrade"
+295 "borttagna"
+296 "ihopsatta"
+297 "flyttade"
+298 "flyttade"
+299 "inklistrade"
+300 "rad"
+301 "rader"
+302 "Vi har inte länkats med en Tcl tolk"
+303 "Filen har ändrats efter den sparats."
+304 "Skalexpansion misslyckades"
+305 "Ingen %s edit flagga given"
+306 "Vi har inte länkats med en Perl tolk"
+307 "Inga \"ex\" kommandon att exekvera"
+308 "Tryck <CR> för att exekvera kommando, :q för att avsluta"
+309 "Gör \"cscope help\" för hjälp"
+310 "Inga cscope kopplingar körs"
+311 "%s: okänd söktyp: använd en av %s"
+312 "%d: ingen sådan cscope session"
+313 "set: %s flaggan får aldrig slås på"
+314 "set: %s flaggan får aldrig sättas till 0"
+315 "%s: tillagt: %lu rader, %lu tecken"
+316 "Oväntad storleksändring"
+317 "%d filer att editera"
diff --git a/contrib/nvi2/catalog/swedish.owner b/contrib/nvi2/catalog/swedish.owner
new file mode 100644 (file)
index 0000000..2b36f2d
--- /dev/null
@@ -0,0 +1 @@
+Jan Djarv <jan.djarv@mbox200.swipnet.se>
diff --git a/contrib/nvi2/catalog/uk_UA.KOI8-U.base b/contrib/nvi2/catalog/uk_UA.KOI8-U.base
new file mode 100644 (file)
index 0000000..b2dfc7f
--- /dev/null
@@ -0,0 +1,306 @@
+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 "IÍ'Ñ ÚͦÎÉÌÏÓØ"
+023 "ÚͦÎÅÎÉÊ"
+024 "ÎÅ ÚͦÎÅÎÉÊ"
+025 "òO3âìOëO÷áîO"
+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"
+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 "IÎÆÏÒÍÁæÀ ÐÒÏ ËÏÒÉÓÔÕ×ÁÞÁ %u ÎÅ ÚÎÁÊÄÅÎÏ"
+063 "úÁÂÌÏËÕ×ÁÔɠצÄÎÏ×ÌÅÎÎÉÊ ÆÁÊÌ ÎÅÍÏÖÌÉ×Ï"
+064 "âÕÆÅҠצÄÎÏ×ÌÅÎÏÇÏ ÆÁÊÌÕ ÐÅÒÅÐÏ×ÎÅÎÏ"
+065 "÷¦ÄÎÏ×ÌÅÎÎÉÊ ÆÁÊÌ"
+066 "%s: ÆÁÊ̠צÄÎÏ×ÌÅÎÎÉÊ ÎÅ ÄϠ˦ÎÃÑ"
+067 "%s: ÆÁÊ̠צÄÎÏ×ÌÅÎÎÉÊ ÎÅ ÄϠ˦ÎÃÑ"
+068 "îÅ ¦ÓÎÕÀ¤ ÆÁÊ̦נڠ¦ÍÅÎÅÍ %s, Ñ˦ ÷É ÍÏÖÅÔÅ ÐÒÏÞÉÔÁÔÉ"
+069 "IÓÎÕÀÔØ ÓÔÁÒ¦ ×ÅÒÓ¦§ ÆÁÊÌÕ, Ñ˦ ÍÏÖÎÁ ×¦ÄÎÏ×ÉÔÉ"
+070 "IÓÎÕÀÔØ ¦ÎÛ¦ ÆÁÊÌÉ, Ñ˦ ÍÏÖÎÁ ×¦ÄÎÏ×ÉÔÉ"
+071 "e-mail ÎŠצĦÓÌÁÎÏ: %s"
+072 "æÁÊÌ ÐÕÓÔÉÊ - ÎÅÍÁ ÞÏÇÏ ÛÕËÁÔÉ"
+073 "äÏÓÑÎÕÔϠ˦ÎÃÑ ÆÁÊÌÕ ÂÅÚ ÚÎÁÈÏÖÄÅÎÎÑ ÚÒÁÚËÕ ÐÏÛÕËÕ"
+074 "îÅ ÚÁÄÁÎÏ ÚÒÁÚÏË ÐÏÛÕËÕ"
+075 "úÒÁÚÏË ÐÏÛÕËÕ ÎÅ ÚÎÁÊÄÅÎÏ"
+076 "äÏÓÑÎÕÔÏ ÐÏÞÁÔËÕ ÆÁÊÌÕ ÂÅÚ ÚÎÁÈÏÖÄÅÎÎÑ ÚÒÁÚËÕ ÐÏÛÕËÕ"
+077 "ðÏÛÕË ÚÁÃÉËÌÅÎÏ"
+078 "ðÏÛÕË..."
+079 "îÅÐÅÞÁÔÎÉÈ ÓÉÍ×Ï̦נÎÅ ÚÎÁÊÄÅÎÏ"
+080 "îÅצÄÏÍÁ ËÏÍÁÎÄÁ"
+082 "%s: ËÏÍÁÎÄÁ ÎÅ ÄÏÓÔÕÐÎÁ × ÒÅÖÉͦ ex"
+083 "ì¦ÞÉÌØÎÉË ÎÅ ÍÏÖÅ ÂÕÔÉ ÎÕÌÅÍ"
+084 "%s: ÎÅÐÒÁ×ÉÌØÎÅ ×ÉÚÎÁÞÅÎÎÑ ÒÑÄËÕ"
+085 "÷ÎÕÔÒ¦ÛÎÑ ÐÏÍÉÌËÁ × ÓÉÎÔÁËÓÉÓ¦ (%s: %s)"
+086 "÷ÉËÏÒÉÓÔÁÎÎÑ: %s"
+087 "%s: ÔÉÍÞÁÓÏ×ÉÊ ÂÕÆÅÒ ÎÅ ×ÉËÏÒÉÓÔÁÎÏ"
+088 "í¦ÔËÕ ÐÏÓÔÁ×ÌÅÎÏ ÐÅÒÅÄ ÐÅÒÛÉÍ ÒÑÄËÏÍ"
+089 "í¦ÔËÕ ÐÏÓÔÁ×ÌÅÎϠЦÓÌѠ˦ÎÃÑ ÆÁÊÌÕ"
+090 "@ Ú Ä¦ÁÐÁÚÏÎÏÍ ÐÒÁÃÀ¤ ËÏÌÉ ÚͦÎÅÎÏ ÆÁÊÌ/צËÎÏ"
+091 "ëÏÍÁÎÄÁ Global/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 ÎÅ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ ÑË ÞÁÓÔÉÎÁ ËÏÍÁÎÄÉ global ÞÉ v"
+125 "%s/%s: ÎŠצÄËÒÉÔÏ: ÎÅ ÎÁÌÅÖÉÔØ ÷ÁÍ ÞÉ ÁÄͦΦÓÔÒÁÔÏÒÕ"
+126 "%s/%s: ÎŠצÄËÒÉÔÏ: ÎÅ ÎÁÌÅÖÉÔØ ÷ÁÍ"
+127 "%s/%s: ÎŠצÄËÒÉÔÏ: ÍÏÖÌÉצÓÔØ ÚÁÐÉÓÕ ËÏÒÉÓÔÕ×ÁÞÅÍ, ÑËÉÊ ÎÅ ¤ ×ÌÁÓÎÉËÏÍ"
+128 "%s: ÎŠצÄËÒÉÔÏ: ÎÅ ÎÁÌÅÖÉÔØ ÷ÁÍ ÞÉ ÁÄͦΦÓÔÒÁÔÏÒÕ"
+129 "%s: ÎŠצÄËÒÉÔÏ: ÎÅ ÎÁÌÅÖÉÔØ ÷ÁÍ"
+130 "%s: ÎŠצÄËÒÉÔÏ: ÍÏÖÌÉצÓÔØ ÚÁÐÉÓÕ ËÏÒÉÓÔÕ×ÁÞÅÍ, ÑËÉÊ ÎÅ ¤ ×ÌÁÓÎÉËÏÍ"
+131 "îÅÍÁ¤ Â¦ÌØÛÅ ÒÑÄ˦נÄÌÑ ÏÂ'¤ÄÎÁÎÎÑ"
+132 "îÅÍÁ¤ ÐÁÒÁÍÅÔҦנ××ÅÄÅÎÎÑ"
+133 "îÅÍÁ¤ ÐÁÒÁÍÅÔҦנËÏÍÁÎÄÉ"
+134 "óÉÍ×ÏÌ %s ÎÅ ÍÏÖÎÁ ÐÅÒÅÎÁÚÎÁÞÉÔÉ"
+135 "\"%s\" ÚÁÒÁÚ ÎÅ ÐÅÒÅÎÁÚÎÁÞÅÎÏ"
+136 "IÍ'ѠͦÔËÉ -- ÏÄÉΠÓÉÍ×ÏÌ"
+137 "%s ¦ÓÎÕ¤, ÎÅ ÚÁÐÉÓÁÎÏ; ×ÉËÏÒÉÓÔÁÊÔÅ ! ÄÌÑ ÏÂÈÏÄÕ"
+138 "îÏ×ÉÊ ÆÁÊÌ exrÓ: %s"
+139 "òÑÄÏË ÐÒÉÚÎÁÞÅÎÎÑ ÚÁÚÎÁÞÅÎÏ ×ÓÅÒÅÄÉΦ Ä¦ÁÐÁÚÏÎÕ ÐÅÒÅͦÝÅÎÎÑ"
+140 "ëÏÍÁÎÄÁ open ×ÉÍÁÇÁ¤ ×ÓÔÁÎÏ×ÌÅÎÎÑ ÏÐ槠open"
+141 "ëÏÍÁÎÄÕ open ÝÅ ÎÅ ÒÅÁ̦ÚÏ×ÁÎÏ"
+142 "úÁÈÉÓÔ ÆÁÊÌÕ ÎÅÍÏÖÌÉ×ÉÊ"
+143 "æÁÊÌ ÚÁÈÉÝÅÎÏ"
+144 "%s ÒÏÚÛÉÒÉ×ÓÑ × ÎÁÄÔÏ ×ÅÌÉËՠ˦ÌØ˦ÓÔØ ¦ÍÅΠÆÁÊ̦×"
+145 "ðÒÏÞÉÔÁÔÉ ÍÏÖÎÁ Ô¦ÌØËÉ ÐÒÏÓÔÉÊ ÆÁÊÌ ÞÉ ¦ÍÅÎÏ×ÁÎÉÊ ËÁÎÁÌ(pipe)"
+146 "%s: ÂÌÏËÕ×ÁÎÎѠצĠÞÉÔÁÎÎÑ ÎÅÍÏÖÌÉ×Å"
+147 "úÞÉÔÕÀ..."
+148 "%s: %lu ÒÑÄ˦×, %lu ÓÉÍ×Ï̦×"
+149 "îÅÍÁ¤ Ô¦ÎØÏ×ÉȠצËÏÎ"
+150 "ëÏÍÁÎÄÁ script ÄÏÓÔÕÐÎÁ ÌÉÛÅ × ÒÅÖÉͦ vi"
+151 "îÅÍÁ ËÏÍÁÎÄÉ ÄÌÑ ×ÉËÏÎÁÎÎÑ"
+152 "ïÐæÀ shiftwidth ×ÓÔÁÎÏ×ÌÅÎÏ × 0"
+153 "ðÅÒÅÐÏ×ÎÅÎÎѠ̦ÞÉÌØÎÉËÁ"
+154 "ãÉËÌ ×ÉËÏÎÁÎÏ ÎÅ ÄϠ˦ÎÃÑ"
+155 "÷ËÁÚÁÎÏ ÒÅÇÕÌÑÒÎÉÊ ×ÉÒÁÚ; ÐÁÒÁÍÅÔÒ 'r' ÎÅ ÍÁ¤ ÓÅÎÓÕ"
+156 "ðÁÒÁÍÅÔÒÉ #, l ÔÁ p ÎÅ ÍÏÖÎÁ ËÏͦÎÕ×ÁÔÉ Ú ÐÁÒÁÍÅÔÒÏÍ 'c' × ÒÅÖÉͦ vi"
+157 "óЦ×ÐÁÄÁÎØ ÎÅÍÁ¤"
+158 "TÅǠצÄÓÕÔΦÊ"
+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 "îÅÍÁ¤ ÐÏÐÅÒÅÄÎØÏÇÏ ÒÅÇÕÌÑÒÎÏÇÏ ×ÉÒÁÚÕ"
+173 "ëÏÍÁÎÄÁ %s ×ÉÍÁÇÁ¤ ×ÖÅ ÐÒÏÞÉÔÁÎÉÊ ÆÁÊÌ"
+174 "÷ÉËÏÒÉÓÔÁÎÎÑ: %s"
+175 "ëÏÍÁÎÄÁ visual ×ÉÍÁÇÁ¤ ×ÓÔÁÎÏ×ÌÅÎÎÑ ÏÐ槠open"
+177 "ðÕÓÔÉÊ ÆÁÊÌ"
+178 "îÅÍÁ¤ ÐÏÐÅÒÅÄÎØÏÇÏ ÐÏÛÕËÕ F, f, T, ÞÉ t"
+179 "%s ÎÅ ÚÎÁÊÄÅÎÏ"
+180 "îÅÍÁ¤ ÐÏÐÅÒÅÄÎØÏÇÏ ÆÁÊÌÕ ÄÌÑ ÒÅÄÁÇÕ×ÁÎÎÑ"
+181 "ëÕÒÓÏÒ ÓÔϧÔØ ÎÅ ÎÁ ÃÉÆÒ¦"
+182 "OÔÒÉÍÁÎÅ ÞÉÓÌÏ ÎÁÄÔÏ ×ÅÌÉËÅ"
+183 "OÔÒÉÍÁÎÅ ÞÉÓÌÏ ÎÁÄÔÏ ÍÁÌÅ"
+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 "úÎÁÞÎÅÎÎÑ ÏÐ槠Windows ÎÁÄÔÏ ×ÅÌÉËÅ, ÍÁËÓÉÍÕÍ = %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 "÷ÖÅ ÎÁ ÐÅÒÛÏÍÕ ÔÅÇՠנæʠÇÒÕЦ"
+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 "îÁÔÉÓΦÔØ ENTER ÄÌÑ ÐÒÏÄÏ×ÖÅÎÎÑ: "
+270 "îÁÔÉÓΦÔØ ENTER ÄÌÑ ÐÒÏÄÏ×ÖÅÎÎÑ [: ÄÌÑ ¦ÎÛÉÈ ËÏÍÁÎÄ] "
+271 "îÁÔÉÓΦÔØ ENTER ÄÌÑ ÐÒÏÄÏ×ÖÅÎÎÑ [q ÄÌÑ ×ÉÈÏÄÕ]: "
+272 "TÁËÁ ÆÏÒÍÁ %s ×ÉÍÁÇÁ¤ ¦ÎÔÅÒÆÅÊÓÕ ex"
+273 "÷ÈÏÄÉÍ × ÒÅÖÉÍ ××ÅÄÅÎÎÑ ex"
+274 "ú¦ʠËÏÍÁÎÄÉ, ÆÁÊÌ ÎÅ ÐÒÏÞÉÔÁÎÏ"
+275 "ðÒÏÄÏ×ÖÉÔÉ?"
+276 "îÅÏÞ¦ËÕ×ÁÎÁ ÓÉÍ×ÏÌØÎÁ ÐÏĦÑ"
+277 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏĦѠ˦ÎÃÑ ÆÁÊÌÕ"
+278 "îÅÍÁ¤ ÓЦ×ÐÁÄÁÎØ ÚÁ ÚÁÐÉÔÏÍ"
+279 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏĦѠÐÅÒÅÒÉ×ÁÎÎÑ"
+280 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏĦѠ×ÉÈÏÄÕ"
+281 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏĦѠÐÅÒÅÒÉÓÏ×ËÉ"
+282 "÷ÖÅ ÎÁ ÏÓÔÁÎÎØÍÕ ôÅÇՠנæʠÇÒÕЦ"
+283 "ëÏÍÁÎÄÁ %s ×ÉÍÁÇÁ¤ ¦ÎÔÅÒÆÅÊÓÕ ex"
+284 "TÁËÁ ÆÏÒÍÁ %s ÎÅ ÄÏÚ×ÏÌѤÔØÓÑ ÐÒÉ ×ÓÔÁÎÏ×ÌÅΦʠÏÐ槠secure edit"
+285 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏĦѠÒÑÄËÕ"
+286 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏĦѠÔÁÊÍ-ÁÕÔÕ"
+287 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏĦѠÚÁÐÉÓÕ"
+289 "Shell'¦×ÓËÅ ÄÏÐÏ×ÎÅÎÎÑ ÎÅ ÄÏÚ×ÏÌѤÔØÓÑ ÐÒÉ ×ÓÔÁÎÏ×ÌÅΦʠÏÐ槠secure edit"
+290 "ëÏÍÁÎÄÁ %s ÎÅ ÄÏÚ×ÏÌѤÔØÓÑ ÐÒÉ ×ÓÔÁÎÏ×ÌÅΦʠÏÐ槠secure edit"
+291 "set: ÏÐæÀ %s ÎÅÍÏÖÎÁ ×ÉÓÔÁ×ÉÔÉ ×ÉÍËÎÅÎÏÀ"
+292 "åËÒÁΠÎÁÄÔÏ ÍÁÌÉÊ."
+293 "ÄÏÄÁÎÏ"
+294 "ÚͦÎÅÎÏ"
+295 "ÓÔÅÒÔÏ"
+296 "ÏÂ'¤ÄÎÁÎÏ"
+297 "ÐÅÒÅͦÝÅÎÏ"
+298 "ÚÄ×ÉÎÕÔÏ"
+299 "×ÓÔÁ×ÌÅÎÏ"
+300 "ÒÑÄÏË"
+301 "ÒÑÄ˦×"
+302 "Vi ÚÁ×ÁÎÔÁÖÅÎÏ ÂÅÚ ¦ÎÔÅÒÐÒÅÔÁÔÏÒÁ Tcl"
+303 "æÁÊÌ ÍÏÄÉƦËÏ×ÁÎϠЦÓÌÑ ÏÓÔÁÎÎØϧ ËÏÍÁÎÄÉ ÚÁÐÉÓÕ."
+304 "îÅ×ÄÁÞÁ shell'¦×ÓØËÏÇÏ ÄÏÐÏ×ÎÅÎÎÑ"
+305 "OÐ槠ÒÅÄÁÇÕ×ÁÎÎÑ %s ÎÅ ×ËÁÚÁÎÏ"
+306 "Vi ÚÁ×ÁÎÔÁÖÅÎÏ ÂÅÚ ¦ÎÔÅÒÐÒÅÔÁÔÏÒÁ Perl"
+307 "îÅÍÁ¤ ËÏÍÁÎÄÉ ex ÄÌÑ ×ÉËÏÎÁÎÎÑ"
+308 "îÁÔÉÓΦÔØ ENTER ÝÏ ×ÉËÏÎÁÔÉ ËÏÍÁÎÄÕ, 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 ÆÁÊ̦נÄÌÑ ÒÅÄÁÇÕ×ÁÎÎÑ"
diff --git a/contrib/nvi2/catalog/uk_UA.KOI8-U.owner b/contrib/nvi2/catalog/uk_UA.KOI8-U.owner
new file mode 100644 (file)
index 0000000..11719ba
--- /dev/null
@@ -0,0 +1 @@
+Olexander Kunytsa aka Cawko Xakep <xakep@snark.ukma.kiev.ua>
diff --git a/contrib/nvi2/catalog/zh_CN.GB2312.base b/contrib/nvi2/catalog/zh_CN.GB2312.base
new file mode 100644 (file)
index 0000000..5cd8dba
--- /dev/null
@@ -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 ²»Êdz£¹æÎļþ"
+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: ²»Êdz£¹æÎļþ"
+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 ÐÐÉÏÓÐת»»´íÎó"
diff --git a/contrib/nvi2/catalog/zh_CN.GB2312.owner b/contrib/nvi2/catalog/zh_CN.GB2312.owner
new file mode 100644 (file)
index 0000000..8052cac
--- /dev/null
@@ -0,0 +1 @@
+Zhihao Yuan <lichray@gmail.com>
diff --git a/contrib/nvi2/cl/README.signal b/contrib/nvi2/cl/README.signal
new file mode 100644 (file)
index 0000000..18b3d14
--- /dev/null
@@ -0,0 +1,174 @@
+#      $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.
+
+The assumptions:
+       1: The DB routines are not reentrant.
+       2: The curses routines may not be reentrant.
+       3: Neither DB nor curses will restart system calls.
+
+XXX
+Note, most C library functions don't restart system calls.  So, we should
+*probably* start blocking around any imported function that we don't know
+doesn't make a system call.  This is going to be a genuine annoyance...
+
+SIGHUP, SIGTERM
+       Used for file recovery.  The DB routines can't be reentered, nor
+       can they handle interrupted system calls, so the vi routines that
+       call DB block signals.  This means that DB routines could be
+       called at interrupt time, if necessary.
+
+SIGQUIT
+       Disabled by the signal initialization routines.  Historically, ^\
+       switched vi into ex mode, and we continue that practice.
+
+SIGWINCH:
+       The interrupt routine sets a global bit which is checked by the
+       key-read routine, so there are no reentrancy issues.  This means
+       that the screen will not resize until vi runs out of keys, but
+       that doesn't seem like a problem.
+
+SIGINT and SIGTSTP are a much more difficult issue to resolve.  Vi has
+to permit the user to interrupt long-running operations.  Generally, a
+search, substitution or read/write is done on a large file, or, the user
+creates a key mapping with an infinite loop.  This problem will become
+worse as more complex semantics are added to vi, especially things like
+making it a pure text widget.  There are four major solutions on the table,
+each of which have minor permutations.
+
+1:     Run in raw mode.
+
+       The up side is that there's no asynchronous behavior to worry about,
+       and obviously no reentrancy problems.  The down side is that it's easy
+       to misinterpret characters (e.g. :w big_file^Mi^V^C is going to look
+       like an interrupt) and it's easy to get into places where we won't see
+       interrupt characters (e.g. ":map a ixx^[hxxaXXX" infinitely loops in
+       historic implementations of vi).  Periodically reading the terminal
+       input buffer might solve the latter problem, but it's not going to be
+       pretty.
+
+       Also, we're going to be checking for ^C's and ^Z's both, all over
+       the place -- I hate to litter the source code with that.  For example,
+       the historic version of vi didn't permit you to suspend the screen if
+       you were on the colon command line.  This isn't right.  ^Z isn't a vi
+       command, it's a terminal event.  (Dammit.)
+
+2:     Run in cbreak mode.  There are two problems in this area.  First, the
+       current curses implementations (both System V and Berkeley) don't give
+       you clean cbreak modes. For example, the IEXTEN bit is left on, turning
+       on DISCARD and LNEXT.  To clarify, what vi WANTS is 8-bit clean, with
+       the exception that flow control and signals are turned on, and curses
+       cbreak mode doesn't give you this.
+
+       We can either set raw mode and twiddle the tty, or cbreak mode and
+       twiddle the tty.  I chose to use raw mode, on the grounds that raw
+       mode is better defined and I'm less likely to be surprised by a curses
+       implementation down the road.  The twiddling consists of setting ISIG,
+       IXON/IXOFF, and disabling some of the interrupt characters (see the
+       comments in cl_init.c).  This is all found in historic System V (SVID
+       3) and POSIX 1003.1-1992, so it should be fairly portable.
+
+       The second problem is that vi permits you to enter literal signal
+       characters, e.g. ^V^C.  There are two possible solutions.  First, you
+       can turn off signals when you get a ^V, but that means that a network
+       packet containing ^V and ^C will lose, since the ^C may take effect
+       before vi reads the ^V.  (This is particularly problematic if you're
+       talking over a protocol that recognizes signals locally and sends OOB
+       packets when it sees them.)  Second, you can turn the ^C into a literal
+       character in vi, but that means that there's a race between entering
+       ^V<character>^C, i.e. the sequence may end up being ^V^C<character>.
+       Also, the second solution doesn't work for flow control characters, as
+       they aren't delivered to the program as signals.
+
+       Generally, this is what historic vi did.  (It didn't have the curses
+       problems because it didn't use curses.)  It entered signals following
+       ^V characters into the input stream, (which is why there's no way to
+       enter a literal flow control character).
+
+3:     Run in mostly raw mode; turn signals on when doing an operation the
+       user might want to interrupt, but leave them off most of the time.
+
+       This works well for things like file reads and writes.  This doesn't
+       work well for trying to detect infinite maps.  The problem is that
+       you can write the code so that you don't have to turn on interrupts
+       per keystroke, but the code isn't pretty and it's hard to make sure
+       that an optimization doesn't cover up an infinite loop.  This also
+       requires interaction or state between the vi parser and the key
+       reading routines, as an infinite loop may still be returning keys
+       to the parser.
+
+       Also, if the user inserts an interrupt into the tty queue while the
+       interrupts are turned off, the key won't be treated as an interrupt,
+       and requiring the user to pound the keyboard to catch an interrupt
+       window is nasty.
+
+4:     Run in mostly raw mode, leaving signals on all of the time.  Done
+       by setting raw mode, and twiddling the tty's termios ISIG bit.
+
+       This works well for the interrupt cases, because the code only has
+       to check to see if the interrupt flag has been set, and can otherwise
+       ignore signals.  It's also less likely that we'll miss a case, and we
+       don't have to worry about synchronizing between the vi parser and the
+       key read routines.
+
+       The down side is that we have to turn signals off if the user wants
+       to enter a literal character (e.g. ^V^C).  If the user enters the
+       combination fast enough, or as part of a single network packet,
+       the text input routines will treat it as a signal instead of as a
+       literal character.  To some extent, we have this problem already,
+       since we turn off flow control so that the user can enter literal
+       XON/XOFF characters.
+
+       This is probably the easiest to code, and provides the smoothest
+       programming interface.
+
+There are a couple of other problems to consider.
+
+First, System V's curses doesn't handle SIGTSTP correctly.  If you use the
+newterm() interface, the TSTP signal will leave you in raw mode, and the
+final endwin() will leave you in the correct shell mode.  If you use the
+initscr() interface, the TSTP signal will return you to the correct shell
+mode, but the final endwin() will leave you in raw mode.  There you have
+it: proof that drug testing is not making any significant headway in the
+computer industry.  The 4BSD curses is deficient in that it does not have
+an interface to the terminal keypad.  So, regardless, we have to do our
+own SIGTSTP handling.
+
+The problem with this is that if we do our own SIGTSTP handling, in either
+models #3 or #4, we're going to have to call curses routines at interrupt
+time, which means that we might be reentering curses, which is something we
+don't want to do.
+
+Second, SIGTSTP has its own little problems.  It's broadcast to the entire
+process group, not sent to a single process.  The scenario goes something
+like this: the shell execs the mail program, which execs vi.  The user hits
+^Z, and all three programs get the signal, in some random order.  The mail
+program goes to sleep immediately (since it probably didn't have a SIGTSTP
+handler in place).  The shell gets a SIGCHLD, does a wait, and finds out
+that the only child in its foreground process group (of which it's aware)
+is asleep.  It then optionally resets the terminal (because the modes aren't
+how it left them), and starts prompting the user for input.  The problem is
+that somewhere in the middle of all of this, vi is resetting the terminal,
+and getting ready to send a SIGTSTP to the process group in order to put
+itself to sleep.  There's a solution to all of this: when vi starts, it puts
+itself into its own process group, and then only it (and possible child
+processes) receive the SIGTSTP.  This permits it to clean up the terminal
+and switch back to the original process group, where it sends that process
+group a SIGTSTP, putting everyone to sleep and waking the shell.
+
+Third, handing SIGTSTP asynchronously is further complicated by the child
+processes vi may fork off.  If vi calls ex, ex resets the terminal and
+starts running some filter, and SIGTSTP stops them both, vi has to know
+when it restarts that it can't repaint the screen until ex's child has
+finished running.  This is solveable, but it's annoying.
+
+Well, somebody had to make a decision, and this is the way it's going to be
+(unless I get talked out of it).  SIGINT is handled asynchronously, so
+that we can pretty much guarantee that the user can interrupt any operation
+at any time.  SIGTSTP is handled synchronously, so that we don't have to
+reenter curses and so that we don't have to play the process group games.
+^Z is recognized in the standard text input and command modes.  (^Z should
+also be recognized during operations that may potentially take a long time.
+The simplest solution is probably to twiddle the tty, install a handler for
+SIGTSTP, and then restore normal tty modes when the operation is complete.)
diff --git a/contrib/nvi2/cl/cl.h b/contrib/nvi2/cl/cl.h
new file mode 100644 (file)
index 0000000..cca0acb
--- /dev/null
@@ -0,0 +1,83 @@
+/*-
+ * Copyright (c) 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 1993, 1994, 1995, 1996
+ *     Keith Bostic.  All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ *
+ *     $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     ibuf[256];     /* Input keys. */
+
+       size_t   skip;          /* Remaining keys. */
+
+       CONVWIN  cw;            /* Conversion buffer. */
+
+       int      eof_count;     /* EOF count. */
+
+       struct termios orig;    /* Original terminal values. */
+       struct termios ex_enter;/* Terminal values to enter ex. */
+       struct termios vi_enter;/* Terminal values to enter vi. */
+
+       char    *el;            /* Clear to EOL terminal string. */
+       char    *cup;           /* Cursor movement terminal string. */
+       char    *cuu1;          /* Cursor up terminal string. */
+       char    *rmso, *smso;   /* Inverse video terminal strings. */
+       char    *smcup, *rmcup; /* Terminal start/stop strings. */
+
+       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
+#define        INDX_TERM       2
+#define        INDX_WINCH      3
+#define        INDX_MAX        4       /* Original signal information. */
+       struct sigaction oact[INDX_MAX];
+
+       enum {                  /* Tty group write mode. */
+           TGW_UNKNOWN=0, TGW_SET, TGW_UNSET } tgw;
+
+       enum {                  /* Terminal initialization strings. */
+           TE_SENT=0, TI_SENT } ti_te;
+
+#define        CL_IN_EX        0x0001  /* Currently running ex. */
+#define        CL_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 position relative to a specific window. */
+#define        RCNO(sp, cno)   (cno)
+#define        RLNO(sp, lno)   (lno)
+
+#include "extern.h"
diff --git a/contrib/nvi2/cl/cl_funcs.c b/contrib/nvi2/cl/cl_funcs.c
new file mode 100644 (file)
index 0000000..4c15458
--- /dev/null
@@ -0,0 +1,852 @@
+/*-
+ * Copyright (c) 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 1993, 1994, 1995, 1996
+ *     Keith Bostic.  All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ */
+
+#include "config.h"
+
+#ifndef lint
+static const char sccsid[] = "$Id: cl_funcs.c,v 10.74 2012/10/11 10:30:16 zy Exp $";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/queue.h>
+#include <sys/time.h>
+
+#include <bitstring.h>
+#include <ctype.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"
+#include "../vi/vi.h"
+#include "cl.h"
+
+static void cl_rdiv(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(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.
+ *
+ * PUBLIC: int cl_addstr(SCR *, const char *, size_t);
+ */
+int
+cl_addstr(SCR *sp, const char *str, size_t len)
+{
+       return addstr4(sp, (void *)str, len, 0);
+}
+
+/*
+ * cl_attr --
+ *     Toggle a screen attribute on/off.
+ *
+ * PUBLIC: int cl_attr(SCR *, scr_attr_t, int);
+ */
+int
+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:
+       /*
+        * !!!
+        * There's a major layering violation here.  The problem is that the
+        * X11 xterm screen has what's known as an "alternate" screen.  Some
+        * xterm termcap/terminfo entries include sequences to switch to/from
+        * that alternate screen as part of the ti/te (smcup/rmcup) strings.
+        * Vi runs in the alternate screen, so that you are returned to the
+        * same screen contents on exit from vi that you had when you entered
+        * vi.  Further, when you run :shell, or :!date or similar ex commands,
+        * you also see the original screen contents.  This wasn't deliberate
+        * on vi's part, it's just that it historically sent terminal init/end
+        * sequences at those times, and the addition of the alternate screen
+        * sequences to the strings changed the behavior of vi.  The problem
+        * caused by this is that we don't want to switch back to the alternate
+        * screen while getting a new command from the user, when the user is
+        * continuing to enter ex commands, e.g.:
+        *
+        *      :!date                          <<< switch to original screen
+        *      [Hit return to continue]        <<< prompt user to continue
+        *      :command                        <<< get command from user
+        *
+        * Note that the :command input is a true vi input mode, e.g., input
+        * maps and abbreviations are being done.  So, we need to be able to
+        * switch back into the vi screen mode, without flashing the screen. 
+        *
+        * To make matters worse, the curses initscr() and endwin() calls will
+        * do this automatically -- so, this attribute isn't as controlled by
+        * the higher level screen as closely as one might like.
+        */
+       if (on) {
+               if (clp->ti_te != TI_SENT) {
+                       clp->ti_te = TI_SENT;
+                       if (clp->smcup == NULL)
+                               (void)cl_getcap(sp, "smcup", &clp->smcup);
+                       if (clp->smcup != NULL)
+                               (void)tputs(clp->smcup, 1, cl_putchar);
+               }
+       } else
+               if (clp->ti_te != TE_SENT) {
+                       clp->ti_te = TE_SENT;
+                       if (clp->rmcup == NULL)
+                               (void)cl_getcap(sp, "rmcup", &clp->rmcup);
+                       if (clp->rmcup != NULL)
+                               (void)tputs(clp->rmcup, 1, cl_putchar);
+                       (void)fflush(stdout);
+               }
+               (void)fflush(stdout);
+               break;
+       case SA_INVERSE:
+               if (F_ISSET(sp, SC_EX | SC_SCR_EXWROTE)) {
+                       if (clp->smso == NULL)
+                               return (1);
+                       if (on)
+                               (void)tputs(clp->smso, 1, cl_putchar);
+                       else
+                               (void)tputs(clp->rmso, 1, cl_putchar);
+                       (void)fflush(stdout);
+               } else {
+                       if (on)
+                               (void)wstandout(win);
+                       else
+                               (void)wstandend(win);
+               }
+               break;
+       default:
+               abort();
+       }
+       return (0);
+}
+
+/*
+ * cl_baud --
+ *     Return the baud rate.
+ *
+ * PUBLIC: int cl_baud(SCR *, u_long *);
+ */
+int
+cl_baud(SCR *sp, u_long *ratep)
+{
+       CL_PRIVATE *clp;
+
+       /*
+        * XXX
+        * There's no portable way to get a "baud rate" -- cfgetospeed(3)
+        * returns the value associated with some #define, which we may
+        * never have heard of, or which may be a purely local speed.  Vi
+        * only cares if it's SLOW (w300), slow (w1200) or fast (w9600).
+        * Try and detect the slow ones, and default to fast.
+        */
+       clp = CLP(sp);
+       switch (cfgetospeed(&clp->orig)) {
+       case B50:
+       case B75:
+       case B110:
+       case B134:
+       case B150:
+       case B200:
+       case B300:
+       case B600:
+               *ratep = 600;
+               break;
+       case B1200:
+               *ratep = 1200;
+               break;
+       default:
+               *ratep = 9600;
+               break;
+       }
+       return (0);
+}
+
+/*
+ * cl_bell --
+ *     Ring the bell/flash the screen.
+ *
+ * PUBLIC: int cl_bell(SCR *);
+ */
+int
+cl_bell(SCR *sp)
+{
+       if (F_ISSET(sp, SC_EX | SC_SCR_EXWROTE | SC_SCR_EX))
+               (void)write(STDOUT_FILENO, "\07", 1);           /* \a */
+       else {
+               /*
+                * Vi has an edit option which determines if the terminal
+                * should be beeped or the screen flashed.
+                */
+               if (O_ISSET(sp, O_FLASH))
+                       (void)flash();
+               else
+                       (void)beep();
+       }
+       return (0);
+}
+
+/*
+ * cl_clrtoeol --
+ *     Clear from the current cursor to the end of the line.
+ *
+ * PUBLIC: int cl_clrtoeol(SCR *);
+ */
+int
+cl_clrtoeol(SCR *sp)
+{
+       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);
+}
+
+/*
+ * cl_cursor --
+ *     Return the current cursor position.
+ *
+ * PUBLIC: int cl_cursor(SCR *, size_t *, size_t *);
+ */
+int
+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
+        * reason the returned value must be adjusted to be relative to the
+        * current screen, and not absolute.  Screens that implement the split
+        * using physically distinct screens won't need this hack.
+        */
+       getyx(win, *yp, *xp);
+       /*
+       *yp -= sp->roff;
+       *xp -= sp->coff;
+       */
+       return (0);
+}
+
+/*
+ * cl_deleteln --
+ *     Delete the current line, scrolling all lines below it.
+ *
+ * PUBLIC: int cl_deleteln(SCR *);
+ */
+int
+cl_deleteln(SCR *sp)
+{
+       CL_PRIVATE *clp;
+       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
+        * video to delimit split screens.  If the screen does not do this,
+        * this code won't be necessary.
+        *
+        * If the bottom line was in reverse video, rewrite it in normal
+        * video before it's scrolled.
+        */
+       if (!F_ISSET(sp, SC_SCR_EXWROTE) && IS_SPLIT(sp)) {
+               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 (wdeleteln(win) == ERR);
+}
+
+/* 
+ * cl_discard --
+ *     Discard a screen.
+ *
+ * PUBLIC: int cl_discard(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);
+}
+
+/* 
+ * cl_ex_adjust --
+ *     Adjust the screen for ex.  This routine is purely for standalone
+ *     ex programs.  All special purpose, all special case.
+ *
+ * PUBLIC: int cl_ex_adjust(SCR *, exadj_t);
+ */
+int
+cl_ex_adjust(SCR *sp, exadj_t action)
+{
+       CL_PRIVATE *clp;
+       int cnt;
+
+       clp = CLP(sp);
+       switch (action) {
+       case EX_TERM_SCROLL:
+               /* Move the cursor up one line if that's possible. */
+               if (clp->cuu1 != NULL)
+                       (void)tputs(clp->cuu1, 1, cl_putchar);
+               else if (clp->cup != NULL)
+                       (void)tputs(tgoto(clp->cup,
+                           0, LINES - 2), 1, cl_putchar);
+               else
+                       return (0);
+               /* FALLTHROUGH */
+       case EX_TERM_CE:
+               /* Clear the line. */
+               if (clp->el != NULL) {
+                       (void)putchar('\r');
+                       (void)tputs(clp->el, 1, cl_putchar);
+               } else {
+                       /*
+                        * Historically, ex didn't erase the line, so, if the
+                        * displayed line was only a single glyph, and <eof>
+                        * was more than one glyph, the output would not fully
+                        * overwrite the user's input.  To fix this, output
+                        * the maxiumum character number of spaces.  Note,
+                        * this won't help if the user entered extra prompt
+                        * or <blank> characters before the command character.
+                        * We'd have to do a lot of work to make that work, and
+                        * it's almost certainly not worth the effort.
+                        */
+                       for (cnt = 0; cnt < MAX_CHARACTER_COLUMNS; ++cnt)
+                               (void)putchar('\b');
+                       for (cnt = 0; cnt < MAX_CHARACTER_COLUMNS; ++cnt)
+                               (void)putchar(' ');
+                       (void)putchar('\r');
+                       (void)fflush(stdout);
+               }
+               break;
+       default:
+               abort();
+       }
+       return (0);
+}
+
+/*
+ * cl_insertln --
+ *     Push down the current line, discarding the bottom line.
+ *
+ * PUBLIC: int cl_insertln(SCR *);
+ */
+int
+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 (winsertln(win) == ERR);
+}
+
+/*
+ * cl_keyval --
+ *     Return the value for a special key.
+ *
+ * PUBLIC: int cl_keyval(SCR *, scr_keyval_t, CHAR_T *, int *);
+ */
+int
+cl_keyval(SCR *sp, scr_keyval_t val, CHAR_T *chp, int *dnep)
+{
+       CL_PRIVATE *clp;
+
+       /*
+        * VEOF, VERASE and VKILL are required by POSIX 1003.1-1990,
+        * VWERASE is a 4BSD extension.
+        */
+       clp = CLP(sp);
+       switch (val) {
+       case KEY_VEOF:
+               *dnep = (*chp = clp->orig.c_cc[VEOF]) == _POSIX_VDISABLE;
+               break;
+       case KEY_VERASE:
+               *dnep = (*chp = clp->orig.c_cc[VERASE]) == _POSIX_VDISABLE;
+               break;
+       case KEY_VKILL:
+               *dnep = (*chp = clp->orig.c_cc[VKILL]) == _POSIX_VDISABLE;
+               break;
+#ifdef VWERASE
+       case KEY_VWERASE:
+               *dnep = (*chp = clp->orig.c_cc[VWERASE]) == _POSIX_VDISABLE;
+               break;
+#endif
+       default:
+               *dnep = 1;
+               break;
+       }
+       return (0);
+}
+
+/*
+ * cl_move --
+ *     Move the cursor.
+ *
+ * PUBLIC: int cl_move(SCR *, size_t, size_t);
+ */
+int
+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 (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);
+}
+
+/*
+ * cl_refresh --
+ *     Refresh the screen.
+ *
+ * PUBLIC: int cl_refresh(SCR *, int);
+ */
+int
+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
+        * in refreshing the screen.
+        */
+       if (clp->killersig)
+               return (0);
+
+       /*
+        * If repaint is set, the editor is telling us that we don't know
+        * what's on the screen, so we have to repaint from scratch.
+        *
+        * 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);
+       /*
+        * 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
+}
+
+/*
+ * cl_rename --
+ *     Rename the file.
+ *
+ * PUBLIC: int cl_rename(SCR *, char *, int);
+ */
+int
+cl_rename(SCR *sp, char *name, int on)
+{
+       GS *gp;
+       CL_PRIVATE *clp;
+       FILE *pfp;
+       char buf[256], *s, *e;
+       char * wid;
+       char cmd[64];
+
+       gp = sp->gp;
+       clp = CLP(sp);
+
+       /*
+        * XXX
+        * We can only rename windows for xterm.
+        */
+       if (on) {
+               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);
+               }
+       return (0);
+}
+
+/*
+ * cl_setname --
+ *     Set a X11 icon/window name.
+ *
+ * PUBLIC: void cl_setname(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(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.
+ *
+ * PUBLIC: int cl_suspend(SCR *, int *);
+ */
+int
+cl_suspend(SCR *sp, int *allowedp)
+{
+       struct termios t;
+       CL_PRIVATE *clp;
+       WINDOW *win;
+       GS *gp;
+       size_t y, x;
+       int changed;
+
+       gp = sp->gp;
+       clp = CLP(sp);
+       win = CLSP(sp) ? CLSP(sp) : stdscr;
+       *allowedp = 1;
+
+       /*
+        * The ex implementation of this function isn't needed by screens not
+        * supporting ex commands that require full terminal canonical mode
+        * (e.g. :suspend).
+        *
+        * The vi implementation of this function isn't needed by screens not
+        * supporting vi process suspension, i.e. any screen that isn't backed
+        * by a UNIX shell.
+        *
+        * Setting allowedp to 0 will cause the editor to reject the command.
+        */
+       if (F_ISSET(sp, SC_EX)) { 
+               /* Save the terminal settings, and restore the original ones. */
+               if (F_ISSET(clp, CL_STDIN_TTY)) {
+                       (void)tcgetattr(STDIN_FILENO, &t);
+                       (void)tcsetattr(STDIN_FILENO,
+                           TCSASOFT | TCSADRAIN, &clp->orig);
+               }
+
+               /* Stop the process group. */
+               (void)kill(0, SIGTSTP);
+
+               /* Time passes ... */
+
+               /* Restore terminal settings. */
+               if (F_ISSET(clp, CL_STDIN_TTY))
+                       (void)tcsetattr(STDIN_FILENO, TCSASOFT | TCSADRAIN, &t);
+               return (0);
+       }
+
+       /*
+        * Move to the lower left-hand corner of the screen.
+        *
+        * XXX
+        * Not sure this is necessary in System V implementations, but it
+        * shouldn't hurt.
+        */
+       getyx(win, y, x);
+       (void)wmove(win, LINES - 1, 0);
+       (void)wrefresh(win);
+
+       /*
+        * Temporarily end the screen.  System V introduced a semantic where
+        * endwin() could be restarted.  We use it because restarting curses
+        * from scratch often fails in System V.  4BSD curses didn't support
+        * restarting after endwin(), so we have to do what clean up we can
+        * without calling it.
+        */
+       /* Save the terminal settings. */
+       (void)tcgetattr(STDIN_FILENO, &t);
+
+       /* Restore the cursor keys to normal mode. */
+       (void)keypad(stdscr, FALSE);
+
+       /* Restore the window name. */
+       (void)cl_rename(sp, NULL, 0);
+
+       (void)endwin();
+
+       /*
+        * XXX
+        * Restore the original terminal settings.  This is bad -- the
+        * reset can cause character loss from the tty queue.  However,
+        * we can't call endwin() in BSD curses implementations, and too
+        * many System V curses implementations don't get it right.
+        */
+       (void)tcsetattr(STDIN_FILENO, TCSADRAIN | TCSASOFT, &clp->orig);
+
+       /* Stop the process group. */
+       (void)kill(0, SIGTSTP);
+
+       /* Time passes ... */
+
+       /*
+        * If we received a killer signal, we're done.  Leave everything
+        * unchanged.  In addition, the terminal has already been reset
+        * correctly, so leave it alone.
+        */
+       if (clp->killersig) {
+               F_CLR(clp, CL_SCR_EX_INIT | CL_SCR_VI_INIT);
+               return (0);
+       }
+
+       /* Restore terminal settings. */
+       wrefresh(win);                      /* Needed on SunOs/Solaris ? */
+       if (F_ISSET(clp, CL_STDIN_TTY))
+               (void)tcsetattr(STDIN_FILENO, TCSASOFT | TCSADRAIN, &t);
+
+       /* Set the window name. */
+       (void)cl_rename(sp, sp->frp->name, 1);
+
+       /* Put the cursor keys into application mode. */
+       (void)keypad(stdscr, TRUE);
+
+       /* Refresh and repaint the screen. */
+       (void)wmove(win, y, x);
+       (void)cl_refresh(sp, 1);
+
+       /* If the screen changed size, set the SIGWINCH bit. */
+       if (cl_ssize(sp, 1, NULL, NULL, &changed))
+               return (1);
+       if (changed)
+               F_SET(CLP(sp), CL_SIGWINCH);
+
+       return (0);
+}
+
+/*
+ * cl_usage --
+ *     Print out the curses usage messages.
+ * 
+ * PUBLIC: void cl_usage(void);
+ */
+void
+cl_usage(void)
+{
+#define        USAGE "\
+usage: ex [-eFRrSsv] [-c command] [-t tag] [-w size] [file ...]\n\
+usage: vi [-eFlRrSv] [-c command] [-t tag] [-w size] [file ...]\n"
+       (void)fprintf(stderr, "%s", USAGE);
+#undef USAGE
+}
+
+#ifdef DEBUG
+/*
+ * gdbrefresh --
+ *     Stub routine so can flush out curses screen changes using gdb.
+ */
+static int
+       __attribute__((unused))
+gdbrefresh(void)
+{
+       refresh();
+       return (0);             /* XXX Convince gdb to run it. */
+}
+#endif
diff --git a/contrib/nvi2/cl/cl_main.c b/contrib/nvi2/cl/cl_main.c
new file mode 100644 (file)
index 0000000..42c3c82
--- /dev/null
@@ -0,0 +1,422 @@
+/*-
+ * Copyright (c) 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 1993, 1994, 1995, 1996
+ *     Keith Bostic.  All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ */
+
+#include "config.h"
+
+#ifndef lint
+static const char sccsid[] = "$Id: cl_main.c,v 10.56 2015/04/05 06:20:53 zy Exp $";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/queue.h>
+
+#include <bitstring.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"
+#include "cl.h"
+#include "pathnames.h"
+
+GS *__global_list;                             /* GLOBAL: List of screens. */
+sigset_t __sigblockset;                                /* GLOBAL: Blocked signals. */
+
+static void       cl_func_std(GS *);
+static CL_PRIVATE *cl_init(GS *);
+static GS        *gs_init(char *);
+static void       perr(char *, char *);
+static int        setsig(int, struct sigaction *, void (*)(int));
+static void       sig_end(GS *);
+static void       term_init(char *, char *);
+
+/*
+ * main --
+ *     This is the main loop for the standalone curses editor.
+ */
+int
+main(int argc, char *argv[])
+{
+       static int reenter;
+       CL_PRIVATE *clp;
+       GS *gp;
+       size_t rows, cols;
+       int rval;
+       char **p_av, **t_av, *ttype;
+
+       /* If loaded at 0 and jumping through a NULL pointer, stop. */
+       if (reenter++)
+               abort();
+
+       /* Create and initialize the global structure. */
+       __global_list = gp = gs_init(argv[0]);
+
+       /*
+        * Strip out any arguments that vi isn't going to understand.  There's
+        * no way to portably call getopt twice, so arguments parsed here must
+        * be removed from the argument list.
+        */
+       for (p_av = t_av = argv;;) {
+               if (*t_av == NULL) {
+                       *p_av = NULL;
+                       break;
+               }
+               if (!strcmp(*t_av, "--")) {
+                       while ((*p_av++ = *t_av++) != NULL);
+                       break;
+               }
+               *p_av++ = *t_av++;
+       }
+
+       /* Create and initialize the CL_PRIVATE structure. */
+       clp = cl_init(gp);
+
+       /*
+        * Initialize the terminal information.
+        *
+        * We have to know what terminal it is from the start, since we may
+        * have to use termcap/terminfo to find out how big the screen is.
+        */
+       if ((ttype = getenv("TERM")) == NULL)
+               ttype = "ansi";
+       term_init(gp->progname, ttype);
+
+       /* Add the terminal type to the global structure. */
+       if ((OG_D_STR(gp, GO_TERM) =
+           OG_STR(gp, GO_TERM) = strdup(ttype)) == NULL)
+               perr(gp->progname, NULL);
+
+       /* Figure out how big the screen is. */
+       if (cl_ssize(NULL, 0, &rows, &cols, NULL))
+               exit (1);
+
+       /* Add the rows and columns to the global structure. */
+       OG_VAL(gp, GO_LINES) = OG_D_VAL(gp, GO_LINES) = rows;
+       OG_VAL(gp, GO_COLUMNS) = OG_D_VAL(gp, GO_COLUMNS) = cols;
+
+       /* Ex wants stdout to be buffered. */
+       (void)setvbuf(stdout, NULL, _IOFBF, 0);
+
+       /* Start catching signals. */
+       if (sig_init(gp, NULL))
+               exit (1);
+
+       /* Run ex/vi. */
+       rval = editor(gp, argc, argv);
+
+       /* Clean up signals. */
+       sig_end(gp);
+
+       /* Clean up the terminal. */
+       (void)cl_quit(gp);
+
+       /*
+        * XXX
+        * Reset the O_MESG option.
+        */
+       if (clp->tgw != TGW_UNKNOWN)
+               (void)cl_omesg(NULL, clp, clp->tgw == TGW_SET);
+
+       /*
+        * XXX
+        * Reset the X11 xterm icon/window name.
+        */
+       if (F_ISSET(clp, CL_RENAME))
+               cl_setname(gp, clp->oname);
+
+       /* If a killer signal arrived, pretend we just got it. */
+       if (clp->killersig) {
+               (void)signal(clp->killersig, SIG_DFL);
+               (void)kill(getpid(), clp->killersig);
+               /* NOTREACHED */
+       }
+
+       /* Free the global and CL private areas. */
+#if defined(DEBUG) || defined(PURIFY)
+       if (clp->oname != NULL)
+               free(clp->oname);
+       free(clp);
+       free(OG_STR(gp, GO_TERM));
+       free(gp);
+#endif
+
+       exit (rval);
+}
+
+/*
+ * gs_init --
+ *     Create and partially initialize the GS structure.
+ */
+static GS *
+gs_init(char *name)
+{
+       GS *gp;
+       char *p;
+
+       /* Figure out what our name is. */
+       if ((p = strrchr(name, '/')) != NULL)
+               name = p + 1;
+
+       /* Allocate the global structure. */
+       CALLOC_NOMSG(NULL, gp, GS *, 1, sizeof(GS));
+       if (gp == NULL)
+               perr(name, NULL);
+
+       gp->progname = name;
+       return (gp);
+}
+
+/*
+ * cl_init --
+ *     Create and partially initialize the CL structure.
+ */
+static CL_PRIVATE *
+cl_init(GS *gp)
+{
+       CL_PRIVATE *clp;
+       int fd;
+
+       /* Allocate the CL private structure. */
+       CALLOC_NOMSG(NULL, clp, CL_PRIVATE *, 1, sizeof(CL_PRIVATE));
+       if (clp == NULL)
+               perr(gp->progname, NULL);
+       gp->cl_private = clp;
+
+       /*
+        * Set the CL_STDIN_TTY flag.  It's purpose is to avoid setting
+        * and resetting the tty if the input isn't from there.  We also
+        * use the same test to determine if we're running a script or
+        * not.
+        */
+       if (isatty(STDIN_FILENO))
+               F_SET(clp, CL_STDIN_TTY);
+       else
+               F_SET(gp, G_SCRIPTED);
+
+       /*
+        * We expect that if we've lost our controlling terminal that the
+        * open() (but not the tcgetattr()) will fail.
+        */
+       if (F_ISSET(clp, CL_STDIN_TTY)) {
+               if (tcgetattr(STDIN_FILENO, &clp->orig) == -1)
+                       goto tcfail;
+       } else if ((fd = open(_PATH_TTY, O_RDONLY, 0)) != -1) {
+               if (tcgetattr(fd, &clp->orig) == -1) {
+tcfail:                        perr(gp->progname, "tcgetattr");
+                       exit (1);
+               }
+               (void)close(fd);
+       }
+
+       /* Initialize the list of curses functions. */
+       cl_func_std(gp);
+
+       return (clp);
+}
+
+/*
+ * term_init --
+ *     Initialize terminal information.
+ */
+static void
+term_init(char *name, char *ttype)
+{
+       int err;
+
+       /* Set up the terminal database information. */
+       setupterm(ttype, STDOUT_FILENO, &err);
+       switch (err) {
+       case -1:
+               (void)fprintf(stderr,
+                   "%s: No terminal database found\n", name);
+               exit (1);
+       case 0:
+               (void)fprintf(stderr,
+                   "%s: %s: unknown terminal type\n", name, ttype);
+               exit (1);
+       }
+}
+
+#define        GLOBAL_CLP \
+       CL_PRIVATE *clp = GCLP(__global_list);
+static void
+h_hup(int signo)
+{
+       GLOBAL_CLP;
+
+       F_SET(clp, CL_SIGHUP);
+       clp->killersig = SIGHUP;
+}
+
+static void
+h_int(int signo)
+{
+       GLOBAL_CLP;
+
+       F_SET(clp, CL_SIGINT);
+}
+
+static void
+h_term(int signo)
+{
+       GLOBAL_CLP;
+
+       F_SET(clp, CL_SIGTERM);
+       clp->killersig = SIGTERM;
+}
+
+static void
+h_winch(int signo)
+{
+       GLOBAL_CLP;
+
+       F_SET(clp, CL_SIGWINCH);
+}
+#undef GLOBAL_CLP
+
+/*
+ * sig_init --
+ *     Initialize signals.
+ *
+ * PUBLIC: int sig_init(GS *, SCR *);
+ */
+int
+sig_init(GS *gp, SCR *sp)
+{
+       CL_PRIVATE *clp;
+
+       clp = GCLP(gp);
+
+       if (sp == NULL) {
+               (void)sigemptyset(&__sigblockset);
+               if (sigaddset(&__sigblockset, SIGHUP) ||
+                   setsig(SIGHUP, &clp->oact[INDX_HUP], h_hup) ||
+                   sigaddset(&__sigblockset, SIGINT) ||
+                   setsig(SIGINT, &clp->oact[INDX_INT], h_int) ||
+                   sigaddset(&__sigblockset, SIGTERM) ||
+                   setsig(SIGTERM, &clp->oact[INDX_TERM], h_term)
+#ifdef SIGWINCH
+                   ||
+                   sigaddset(&__sigblockset, SIGWINCH) ||
+                   setsig(SIGWINCH, &clp->oact[INDX_WINCH], h_winch)
+#endif
+                   ) {
+                       perr(gp->progname, NULL);
+                       return (1);
+               }
+       } else
+               if (setsig(SIGHUP, NULL, h_hup) ||
+                   setsig(SIGINT, NULL, h_int) ||
+                   setsig(SIGTERM, NULL, h_term)
+#ifdef SIGWINCH
+                   ||
+                   setsig(SIGWINCH, NULL, h_winch)
+#endif
+                   ) {
+                       msgq(sp, M_SYSERR, "signal-reset");
+               }
+       return (0);
+}
+
+/*
+ * setsig --
+ *     Set a signal handler.
+ */
+static int
+setsig(int signo, struct sigaction *oactp, void (*handler)(int))
+{
+       struct sigaction act;
+
+       /*
+        * Use sigaction(2), not signal(3), since we don't always want to
+        * restart system calls.  The example is when waiting for a command
+        * mode keystroke and SIGWINCH arrives.  Besides, you can't portably
+        * restart system calls (thanks, POSIX!).
+        */
+       act.sa_handler = handler;
+       sigemptyset(&act.sa_mask);
+
+       act.sa_flags = 0;
+       return (sigaction(signo, &act, oactp));
+}
+
+/*
+ * sig_end --
+ *     End signal setup.
+ */
+static void
+sig_end(GS *gp)
+{
+       CL_PRIVATE *clp;
+
+       clp = GCLP(gp);
+       (void)sigaction(SIGHUP, NULL, &clp->oact[INDX_HUP]);
+       (void)sigaction(SIGINT, NULL, &clp->oact[INDX_INT]);
+       (void)sigaction(SIGTERM, NULL, &clp->oact[INDX_TERM]);
+#ifdef SIGWINCH
+       (void)sigaction(SIGWINCH, NULL, &clp->oact[INDX_WINCH]);
+#endif
+}
+
+/*
+ * cl_func_std --
+ *     Initialize the standard curses functions.
+ */
+static void
+cl_func_std(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;
+       gp->scr_insertln = cl_insertln;
+       gp->scr_keyval = cl_keyval;
+       gp->scr_move = cl_move;
+       gp->scr_msg = NULL;
+       gp->scr_optchange = cl_optchange;
+       gp->scr_refresh = cl_refresh;
+       gp->scr_rename = cl_rename;
+       gp->scr_screen = cl_screen;
+       gp->scr_split = cl_split;
+       gp->scr_suspend = cl_suspend;
+       gp->scr_usage = cl_usage;
+}
+
+/*
+ * perr --
+ *     Print system error.
+ */
+static void
+perr(char *name, char *msg)
+{
+       (void)fprintf(stderr, "%s:", name);
+       if (msg != NULL)
+               (void)fprintf(stderr, "%s:", msg);
+       (void)fprintf(stderr, "%s\n", strerror(errno));
+       exit(1);
+}
diff --git a/contrib/nvi2/cl/cl_read.c b/contrib/nvi2/cl/cl_read.c
new file mode 100644 (file)
index 0000000..3d9064c
--- /dev/null
@@ -0,0 +1,330 @@
+/*-
+ * Copyright (c) 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 1993, 1994, 1995, 1996
+ *     Keith Bostic.  All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ */
+
+#include "config.h"
+
+#ifndef lint
+static const char sccsid[] = "$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>
+#include <sys/select.h>
+
+#include <bitstring.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+
+#include "../common/common.h"
+#include "../ex/script.h"
+#include "cl.h"
+
+/* Pollution by Solaris curses. */
+#undef columns
+#undef lines  
+
+static input_t cl_read(SCR *,
+    u_int32_t, char *, size_t, int *, struct timeval *);
+static int     cl_resize(SCR *, size_t, size_t);
+
+/*
+ * cl_event --
+ *     Return a single event.
+ *
+ * PUBLIC: int cl_event(SCR *, EVENT *, u_int32_t, int);
+ */
+int
+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 = 0;
+       CHAR_T *wp;
+       size_t wlen;
+       int rc;
+
+       /*
+        * Queue signal based events.  We never clear SIGHUP or SIGTERM events,
+        * so that we just keep returning them until the editor dies.
+        */
+       clp = CLP(sp);
+retest:        if (LF_ISSET(EC_INTERRUPT) || F_ISSET(clp, CL_SIGINT)) {
+               if (F_ISSET(clp, CL_SIGINT)) {
+                       F_CLR(clp, CL_SIGINT);
+                       evp->e_event = E_INTERRUPT;
+               } else
+                       evp->e_event = E_TIMEOUT;
+               return (0);
+       }
+       if (F_ISSET(clp, CL_SIGHUP | CL_SIGTERM | CL_SIGWINCH)) {
+               if (F_ISSET(clp, CL_SIGHUP)) {
+                       evp->e_event = E_SIGHUP;
+                       return (0);
+               }
+               if (F_ISSET(clp, CL_SIGTERM)) {
+                       evp->e_event = E_SIGTERM;
+                       return (0);
+               }
+               if (F_ISSET(clp, CL_SIGWINCH)) {
+                       F_CLR(clp, CL_SIGWINCH);
+                       if (cl_ssize(sp, 1, &lines, &columns, &changed))
+                               return (1);
+                       if (changed) {
+                               (void)cl_resize(sp, lines, columns);
+                               evp->e_event = E_WRESIZE;
+                               return (0);
+                       }
+                       /* No real change, ignore the signal. */
+               }
+       }
+
+       /* Set timer. */
+       if (ms == 0)
+               tp = NULL;
+       else {
+               t.tv_sec = ms / 1000;
+               t.tv_usec = (ms % 1000) * 1000;
+               tp = &t;
+       }
+
+       /* Read input characters. */
+read:
+       switch (cl_read(sp, LF_ISSET(EC_QUOTED | EC_RAW),
+           clp->ibuf + clp->skip, SIZE(clp->ibuf) - clp->skip, &nr, tp)) {
+       case INP_OK:
+               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;
+               break;
+       case INP_ERR:
+               evp->e_event = E_ERR;
+               break;
+       case INP_INTR:
+               goto retest;
+       case INP_TIMEOUT:
+               evp->e_event = E_TIMEOUT;
+               break;
+       default:
+               abort();
+       }
+       return (0);
+}
+
+/*
+ * cl_read --
+ *     Read characters from the input.
+ */
+static input_t
+cl_read(SCR *sp, u_int32_t flags, char *bp, size_t blen, int *nrp,
+    struct timeval *tp)
+{
+       struct termios term1, term2;
+       CL_PRIVATE *clp;
+       GS *gp;
+       fd_set rdfd;
+       input_t rval;
+       int maxfd, nr, term_reset;
+
+       gp = sp->gp;
+       clp = CLP(sp);
+       term_reset = 0;
+
+       /*
+        * 1: A read from a file or a pipe.  In this case, the reads
+        *    never timeout regardless.  This means that we can hang
+        *    when trying to complete a map, but we're going to hang
+        *    on the next read anyway.
+        */
+       if (!F_ISSET(clp, CL_STDIN_TTY)) {
+               switch (nr = read(STDIN_FILENO, bp, blen)) {
+               case 0:
+                       return (INP_EOF);
+               case -1:
+                       goto err;
+               default:
+                       *nrp = nr;
+                       return (INP_OK);
+               }
+               /* NOTREACHED */
+       }
+
+       /*
+        * 2: A read with an associated timeout, e.g., trying to complete
+        *    a map sequence.  If input exists, we fall into #3.
+        */
+       if (tp != NULL) {
+               FD_ZERO(&rdfd);
+               FD_SET(STDIN_FILENO, &rdfd);
+               switch (select(STDIN_FILENO + 1, &rdfd, NULL, NULL, tp)) {
+               case 0:
+                       return (INP_TIMEOUT);
+               case -1:
+                       goto err;
+               default:
+                       break;
+               }
+       }
+       
+       /*
+        * The user can enter a key in the editor to quote a character.  If we
+        * get here and the next key is supposed to be quoted, do what we can.
+        * Reset the tty so that the user can enter a ^C, ^Q, ^S.  There's an
+        * obvious race here, when the key has already been entered, but there's
+        * nothing that we can do to fix that problem.
+        *
+        * The editor can ask for the next literal character even thought it's
+        * generally running in line-at-a-time mode.  Do what we can.
+        */
+       if (LF_ISSET(EC_QUOTED | EC_RAW) && !tcgetattr(STDIN_FILENO, &term1)) {
+               term_reset = 1;
+               if (LF_ISSET(EC_QUOTED)) {
+                       term2 = term1;
+                       term2.c_lflag &= ~ISIG;
+                       term2.c_iflag &= ~(IXON | IXOFF);
+                       (void)tcsetattr(STDIN_FILENO,
+                           TCSASOFT | TCSADRAIN, &term2);
+               } else
+                       (void)tcsetattr(STDIN_FILENO,
+                           TCSASOFT | TCSADRAIN, &clp->vi_enter);
+       }
+
+       /*
+        * 3: Wait for input.
+        *
+        * Select on the command input and scripting window file descriptors.
+        * It's ugly that we wait on scripting file descriptors here, but it's
+        * the only way to keep from locking out scripting windows.
+        */
+       if (F_ISSET(gp, G_SCRWIN)) {
+loop:          FD_ZERO(&rdfd);
+               FD_SET(STDIN_FILENO, &rdfd);
+               maxfd = STDIN_FILENO;
+               if (F_ISSET(sp, SC_SCRIPT)) {
+                       FD_SET(sp->script->sh_master, &rdfd);
+                       if (sp->script->sh_master > maxfd)
+                               maxfd = sp->script->sh_master;
+               }
+               switch (select(maxfd + 1, &rdfd, NULL, NULL, NULL)) {
+               case 0:
+                       abort();
+               case -1:
+                       goto err;
+               default:
+                       break;
+               }
+               if (!FD_ISSET(STDIN_FILENO, &rdfd)) {
+                       if (sscr_input(sp))
+                               return (INP_ERR);
+                       goto loop;
+               }
+       }
+
+       /*
+        * 4: Read the input.
+        *
+        * !!!
+        * What's going on here is some scary stuff.  Ex runs the terminal in
+        * canonical mode.  So, the <newline> character terminating a line of
+        * input is returned in the buffer, but a trailing <EOF> character is
+        * not similarly included.  As ex uses 0<EOF> and ^<EOF> as autoindent
+        * commands, it has to see the trailing <EOF> characters to determine
+        * the difference between the user entering "0ab" and "0<EOF>ab".  We
+        * leave an extra slot in the buffer, so that we can add a trailing
+        * <EOF> character if the buffer isn't terminated by a <newline>.  We
+        * lose if the buffer is too small for the line and exactly N characters
+        * are entered followed by an <EOF> character.
+        */
+#define        ONE_FOR_EOF     1
+       switch (nr = read(STDIN_FILENO, bp, blen - ONE_FOR_EOF)) {
+       case  0:                                /* EOF. */
+               /*
+                * ^D in canonical mode returns a read of 0, i.e. EOF.  EOF is
+                * a valid command, but we don't want to loop forever because
+                * the terminal driver is returning EOF because the user has
+                * disconnected. The editor will almost certainly try to write
+                * something before this fires, which should kill us, but You
+                * Never Know.
+                */
+               if (++clp->eof_count < 50) {
+                       bp[0] = clp->orig.c_cc[VEOF];
+                       *nrp = 1;
+                       rval = INP_OK;
+
+               } else
+                       rval = INP_EOF;
+               break;
+       case -1:                                /* Error or interrupt. */
+err:           if (errno == EINTR)
+                       rval = INP_INTR;
+               else {
+                       rval = INP_ERR;
+                       msgq(sp, M_SYSERR, "input");
+               }
+               break;
+       default:                                /* Input characters. */
+               if (F_ISSET(sp, SC_EX) && bp[nr - 1] != '\n')
+                       bp[nr++] = clp->orig.c_cc[VEOF];
+               *nrp = nr;
+               clp->eof_count = 0;
+               rval = INP_OK;
+               break;
+       }
+
+       /* Restore the terminal state if it was modified. */
+       if (term_reset)
+               (void)tcsetattr(STDIN_FILENO, TCSASOFT | TCSADRAIN, &term1);
+       return (rval);
+}
+
+/* 
+ * cl_resize --
+ *     Reset the options for a resize event.
+ */
+static int
+cl_resize(SCR *sp, size_t lines, size_t columns)
+{
+       ARGS *argv[2], a, b;
+       CHAR_T b1[1024];
+
+       a.bp = b1;
+       b.bp = NULL;
+       a.len = b.len = 0;
+       argv[0] = &a;
+       argv[1] = &b;
+
+       a.len = SPRINTF(b1, sizeof(b1), L("lines=%lu"), (u_long)lines);
+       if (opts_set(sp, argv, NULL))
+               return (1);
+       a.len = SPRINTF(b1, sizeof(b1), L("columns=%lu"), (u_long)columns);
+       if (opts_set(sp, argv, NULL))
+               return (1);
+       return (0);
+}
diff --git a/contrib/nvi2/cl/cl_screen.c b/contrib/nvi2/cl/cl_screen.c
new file mode 100644 (file)
index 0000000..16c8772
--- /dev/null
@@ -0,0 +1,584 @@
+/*-
+ * Copyright (c) 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 1993, 1994, 1995, 1996
+ *     Keith Bostic.  All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ */
+
+#include "config.h"
+
+#ifndef lint
+static const char sccsid[] = "$Id: cl_screen.c,v 10.58 2015/04/08 02:12:11 zy Exp $";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/queue.h>
+#include <sys/time.h>
+
+#include <bitstring.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>
+
+#include "../common/common.h"
+#include "cl.h"
+
+static int     cl_ex_end(GS *);
+static int     cl_ex_init(SCR *);
+static void    cl_freecap(CL_PRIVATE *);
+static int     cl_vi_end(GS *);
+static int     cl_vi_init(SCR *);
+static int     cl_putenv(char *, char *, u_long);
+
+/*
+ * cl_screen --
+ *     Switch screen types.
+ *
+ * PUBLIC: int cl_screen(SCR *, u_int32_t);
+ */
+int
+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 ((!F_ISSET(sp, SC_SCR_EX | SC_SCR_VI) ||
+                    resizeterm(O_VAL(sp, O_LINES), O_VAL(sp, O_COLUMNS))) &&
+                   cl_quit(gp))
+                       return (1);
+               F_CLR(gp, G_SRESTART);
+       }
+       
+       /* See if we're already in the right mode. */
+       if ((LF_ISSET(SC_EX) && F_ISSET(sp, SC_SCR_EX)) ||
+           (LF_ISSET(SC_VI) && F_ISSET(sp, SC_SCR_VI)))
+               return (0);
+
+       /*
+        * Fake leaving ex mode.
+        *
+        * We don't actually exit ex or vi mode unless forced (e.g. by a window
+        * size change).  This is because many curses implementations can't be
+        * called twice in a single program.  Plus, it's faster.  If the editor
+        * "leaves" vi to enter ex, when it exits ex we'll just fall back into
+        * vi.
+        */
+       if (F_ISSET(sp, SC_SCR_EX))
+               F_CLR(sp, SC_SCR_EX);
+
+       /*
+        * Fake leaving vi mode.
+        *
+        * Clear out the rest of the screen if we're in the middle of a split
+        * screen.  Move to the last line in the current screen -- this makes
+        * terminal scrolling happen naturally.  Note: *don't* move past the
+        * end of the screen, as there are ex commands (e.g., :read ! cat file)
+        * that don't want to.  Don't clear the info line, its contents may be
+        * valid, e.g. :file|append.
+        */
+       if (F_ISSET(sp, SC_SCR_VI)) {
+               F_CLR(sp, SC_SCR_VI);
+
+               if (TAILQ_NEXT(sp, q) != NULL) {
+                       (void)wmove(win, RLNO(sp, sp->rows), 0);
+                       wclrtobot(win);
+               }
+               (void)wmove(win, RLNO(sp, sp->rows) - 1, 0);
+               wrefresh(win);
+       }
+
+       /* Enter the requested mode. */
+       if (LF_ISSET(SC_EX)) {
+               if (cl_ex_init(sp))
+                       return (1);
+               F_SET(clp, CL_IN_EX | CL_SCR_EX_INIT);
+
+               /*
+                * If doing an ex screen for ex mode, move to the last line
+                * on the screen.
+                */
+               if (F_ISSET(sp, SC_EX) && clp->cup != NULL)
+                       tputs(tgoto(clp->cup,
+                           0, O_VAL(sp, O_LINES) - 1), 1, cl_putchar);
+       } else {
+               if (cl_vi_init(sp))
+                       return (1);
+               F_CLR(clp, CL_IN_EX);
+               F_SET(clp, CL_SCR_VI_INIT);
+       }
+       return (0);
+}
+
+/*
+ * cl_quit --
+ *     Shutdown the screens.
+ *
+ * PUBLIC: int cl_quit(GS *);
+ */
+int
+cl_quit(GS *gp)
+{
+       CL_PRIVATE *clp;
+       int rval;
+
+       rval = 0;
+       clp = GCLP(gp);
+
+       /*
+        * If we weren't really running, ignore it.  This happens if the
+        * screen changes size before we've called curses.
+        */
+       if (!F_ISSET(clp, CL_SCR_EX_INIT | CL_SCR_VI_INIT))
+               return (0);
+
+       /* Clean up the terminal mappings. */
+       if (cl_term_end(gp))
+               rval = 1;
+
+       /* Really leave vi mode. */
+       if (F_ISSET(clp, CL_STDIN_TTY) &&
+           F_ISSET(clp, CL_SCR_VI_INIT) && cl_vi_end(gp))
+               rval = 1;
+
+       /* Really leave ex mode. */
+       if (F_ISSET(clp, CL_STDIN_TTY) &&
+           F_ISSET(clp, CL_SCR_EX_INIT) && cl_ex_end(gp))
+               rval = 1;
+
+       /*
+        * If we were running ex when we quit, or we're using an implementation
+        * of curses where endwin() doesn't get this right, restore the original
+        * terminal modes.
+        *
+        * XXX
+        * We always do this because it's too hard to figure out what curses
+        * implementations get it wrong.  It may discard type-ahead characters
+        * from the tty queue.
+        */
+       (void)tcsetattr(STDIN_FILENO, TCSADRAIN | TCSASOFT, &clp->orig);
+
+       F_CLR(clp, CL_SCR_EX_INIT | CL_SCR_VI_INIT);
+       return (rval);
+}
+
+/*
+ * cl_vi_init --
+ *     Initialize the curses vi screen.
+ */
+static int
+cl_vi_init(SCR *sp)
+{
+       CL_PRIVATE *clp;
+       GS *gp;
+       char *o_cols, *o_lines, *o_term, *ttype;
+
+       gp = sp->gp;
+       clp = CLP(sp);
+
+       /* If already initialized, just set the terminal modes. */
+       if (F_ISSET(clp, CL_SCR_VI_INIT))
+               goto fast;
+
+       /* Curses vi always reads from (and writes to) a terminal. */
+       if (!F_ISSET(clp, CL_STDIN_TTY) || !isatty(STDOUT_FILENO)) {
+               msgq(sp, M_ERR,
+                   "016|Vi's standard input and output must be a terminal");
+               return (1);
+       }
+
+       /* We'll need a terminal type. */
+       if (opts_empty(sp, O_TERM, 0))
+               return (1);
+       ttype = O_STR(sp, O_TERM);
+
+       /*
+        * XXX
+        * Changing the row/column and terminal values is done by putting them
+        * into the environment, which is then read by curses.  What this loses
+        * in ugliness, it makes up for in stupidity.  We can't simply put the
+        * values into the environment ourselves, because in the presence of a
+        * kernel mechanism for returning the window size, entering values into
+        * the environment will screw up future screen resizing events, e.g. if
+        * the user enters a :shell command and then resizes their window.  So,
+        * if they weren't already in the environment, we make sure to delete
+        * them immediately after setting them.
+        *
+        * XXX
+        * Putting the TERM variable into the environment is necessary, even
+        * though we're using newterm() here.  We may be using initscr() as
+        * the underlying function.
+        */
+       o_term = getenv("TERM");
+       cl_putenv("TERM", ttype, 0);
+       o_lines = getenv("LINES");
+       cl_putenv("LINES", NULL, (u_long)O_VAL(sp, O_LINES));
+       o_cols = getenv("COLUMNS");
+       cl_putenv("COLUMNS", NULL, (u_long)O_VAL(sp, O_COLUMNS));
+
+       /*
+        * The terminal is aways initialized, either in `main`, or by a
+        * previous call to newterm(3X).
+        */
+       (void)del_curterm(cur_term);
+
+       /*
+        * We never have more than one SCREEN at a time, so set_term(NULL) will
+        * give us the last SCREEN.
+        */
+       errno = 0;
+       if (newterm(ttype, stdout, stdin) == NULL) {
+               if (errno)
+                       msgq(sp, M_SYSERR, "%s", ttype);
+               else
+                       msgq(sp, M_ERR, "%s: unknown terminal type", ttype);
+               return (1);
+       }
+
+       if (o_term == NULL)
+               unsetenv("TERM");
+       if (o_lines == NULL)
+               unsetenv("LINES");
+       if (o_cols == NULL)
+               unsetenv("COLUMNS");
+
+       /*
+        * XXX
+        * Someone got let out alone without adult supervision -- the SunOS
+        * newterm resets the signal handlers.  There's a race, but it's not
+        * worth closing.
+        */
+       (void)sig_init(sp->gp, sp);
+
+       /*
+        * We use raw mode.  What we want is 8-bit clean, however, signals
+        * and flow control should continue to work.  Admittedly, it sounds
+        * like cbreak, but it isn't.  Using cbreak() can get you additional
+        * things like IEXTEN, which turns on flags like DISCARD and LNEXT.
+        *
+        * !!!
+        * If raw isn't turning off echo and newlines, something's wrong.
+        * However, it shouldn't hurt.
+        */
+       noecho();                       /* No character echo. */
+       nonl();                         /* No CR/NL translation. */
+       raw();                          /* 8-bit clean. */
+       idlok(stdscr, 1);               /* Use hardware insert/delete line. */
+
+       /* Put the cursor keys into application mode. */
+       (void)keypad(stdscr, TRUE);
+
+       /*
+        * XXX
+        * The screen TI sequence just got sent.  See the comment in
+        * cl_funcs.c:cl_attr().
+        */
+       clp->ti_te = TI_SENT;
+
+       /*
+        * XXX
+        * Historic implementations of curses handled SIGTSTP signals
+        * in one of three ways.  They either:
+        *
+        *      1: Set their own handler, regardless.
+        *      2: Did not set a handler if a handler was already installed.
+        *      3: Set their own handler, but then called any previously set
+        *         handler after completing their own cleanup.
+        *
+        * We don't try and figure out which behavior is in place, we force
+        * it to SIG_DFL after initializing the curses interface, which means
+        * that curses isn't going to take the signal.  Since curses isn't
+        * reentrant (i.e., the whole curses SIGTSTP interface is a fantasy),
+        * we're doing The Right Thing.
+        */
+       (void)signal(SIGTSTP, SIG_DFL);
+
+       /*
+        * If flow control was on, turn it back on.  Turn signals on.  ISIG
+        * turns on VINTR, VQUIT, VDSUSP and VSUSP.   The main curses code
+        * already installed a handler for VINTR.  We're going to disable the
+        * other three.
+        *
+        * XXX
+        * We want to use ^Y as a vi scrolling command.  If the user has the
+        * DSUSP character set to ^Y (common practice) clean it up.  As it's
+        * equally possible that the user has VDSUSP set to 'a', we disable
+        * it regardless.  It doesn't make much sense to suspend vi at read,
+        * so I don't think anyone will care.  Alternatively, we could look
+        * it up in the table of legal command characters and turn it off if
+        * it matches one.  VDSUSP wasn't in POSIX 1003.1-1990, so we test for
+        * it.
+        *
+        * XXX
+        * We don't check to see if the user had signals enabled originally.
+        * If they didn't, it's unclear what we're supposed to do here, but
+        * it's also pretty unlikely.
+        */
+       if (tcgetattr(STDIN_FILENO, &clp->vi_enter)) {
+               msgq(sp, M_SYSERR, "tcgetattr");
+               goto err;
+       }
+       if (clp->orig.c_iflag & IXON)
+               clp->vi_enter.c_iflag |= IXON;
+       if (clp->orig.c_iflag & IXOFF)
+               clp->vi_enter.c_iflag |= IXOFF;
+
+       clp->vi_enter.c_lflag |= ISIG;
+#ifdef VDSUSP
+       clp->vi_enter.c_cc[VDSUSP] = _POSIX_VDISABLE;
+#endif
+       clp->vi_enter.c_cc[VQUIT] = _POSIX_VDISABLE;
+       clp->vi_enter.c_cc[VSUSP] = _POSIX_VDISABLE;
+
+       /*
+        * XXX
+        * OSF/1 doesn't turn off the <discard>, <literal-next> or <status>
+        * characters when curses switches into raw mode.  It should be OK
+        * to do it explicitly for everyone.
+        */
+#ifdef VDISCARD
+       clp->vi_enter.c_cc[VDISCARD] = _POSIX_VDISABLE;
+#endif
+#ifdef VLNEXT
+       clp->vi_enter.c_cc[VLNEXT] = _POSIX_VDISABLE;
+#endif
+#ifdef VSTATUS
+       clp->vi_enter.c_cc[VSTATUS] = _POSIX_VDISABLE;
+#endif
+
+       /* Initialize terminal based information. */
+       if (cl_term_init(sp))
+               goto err;
+
+fast:  /* Set the terminal modes. */
+       if (tcsetattr(STDIN_FILENO, TCSASOFT | TCSADRAIN, &clp->vi_enter)) {
+               if (errno == EINTR)
+                       goto fast;
+               msgq(sp, M_SYSERR, "tcsetattr");
+err:           (void)cl_vi_end(sp->gp);
+               return (1);
+       }
+       return (0);
+}
+
+/*
+ * cl_vi_end --
+ *     Shutdown the vi screen.
+ */
+static int
+cl_vi_end(GS *gp)
+{
+       CL_PRIVATE *clp;
+
+       clp = GCLP(gp);
+
+       /* Restore the cursor keys to normal mode. */
+       (void)keypad(stdscr, FALSE);
+
+       /*
+        * If we were running vi when we quit, scroll the screen up a single
+        * line so we don't lose any information.
+        *
+        * Move to the bottom of the window (some endwin implementations don't
+        * do this for you).
+        */
+       if (!F_ISSET(clp, CL_IN_EX)) {
+               (void)move(0, 0);
+               (void)deleteln();
+               (void)move(LINES - 1, 0);
+               (void)refresh();
+       }
+
+       cl_freecap(clp);
+
+       /* End curses window. */
+       (void)endwin();
+
+       /* Free the SCREEN created by newterm(3X). */
+       delscreen(set_term(NULL));
+
+       /*
+        * XXX
+        * The screen TE sequence just got sent.  See the comment in
+        * cl_funcs.c:cl_attr().
+        */
+       clp->ti_te = TE_SENT;
+
+       return (0);
+}
+
+/*
+ * cl_ex_init --
+ *     Initialize the ex screen.
+ */
+static int
+cl_ex_init(SCR *sp)
+{
+       CL_PRIVATE *clp;
+
+       clp = CLP(sp);
+
+       /* If already initialized, just set the terminal modes. */
+       if (F_ISSET(clp, CL_SCR_EX_INIT))
+               goto fast;
+
+       /* If not reading from a file, we're done. */
+       if (!F_ISSET(clp, CL_STDIN_TTY))
+               return (0);
+
+       /* Get the ex termcap/terminfo strings. */
+       (void)cl_getcap(sp, "cup", &clp->cup);
+       (void)cl_getcap(sp, "smso", &clp->smso);
+       (void)cl_getcap(sp, "rmso", &clp->rmso);
+       (void)cl_getcap(sp, "el", &clp->el);
+       (void)cl_getcap(sp, "cuu1", &clp->cuu1);
+
+       /* Enter_standout_mode and exit_standout_mode are paired. */
+       if (clp->smso == NULL || clp->rmso == NULL) {
+               if (clp->smso != NULL) {
+                       free(clp->smso);
+                       clp->smso = NULL;
+               }
+               if (clp->rmso != NULL) {
+                       free(clp->rmso);
+                       clp->rmso = NULL;
+               }
+       }
+
+       /*
+        * Turn on canonical mode, with normal input and output processing.
+        * Start with the original terminal settings as the user probably
+        * had them (including any local extensions) set correctly for the
+        * current terminal.
+        *
+        * !!!
+        * We can't get everything that we need portably; for example, ONLCR,
+        * mapping <newline> to <carriage-return> on output isn't required
+        * by POSIX 1003.1b-1993.  If this turns out to be a problem, then
+        * we'll either have to play some games on the mapping, or we'll have
+        * to make all ex printf's output \r\n instead of \n.
+        */
+       clp->ex_enter = clp->orig;
+       clp->ex_enter.c_lflag  |= ECHO | ECHOE | ECHOK | ICANON | IEXTEN | ISIG;
+#ifdef ECHOCTL
+       clp->ex_enter.c_lflag |= ECHOCTL;
+#endif
+#ifdef ECHOKE
+       clp->ex_enter.c_lflag |= ECHOKE;
+#endif
+       clp->ex_enter.c_iflag |= ICRNL;
+       clp->ex_enter.c_oflag |= OPOST;
+#ifdef ONLCR
+       clp->ex_enter.c_oflag |= ONLCR;
+#endif
+
+fast:  if (tcsetattr(STDIN_FILENO, TCSADRAIN | TCSASOFT, &clp->ex_enter)) {
+               if (errno == EINTR)
+                       goto fast;
+               msgq(sp, M_SYSERR, "tcsetattr");
+               return (1);
+       }
+       return (0);
+}
+
+/*
+ * cl_ex_end --
+ *     Shutdown the ex screen.
+ */
+static int
+cl_ex_end(GS *gp)
+{
+       CL_PRIVATE *clp;
+
+       clp = GCLP(gp);
+
+       cl_freecap(clp);
+
+       return (0);
+}
+
+/*
+ * cl_getcap --
+ *     Retrieve termcap/terminfo strings.
+ *
+ * PUBLIC: int cl_getcap(SCR *, char *, char **);
+ */
+int
+cl_getcap(SCR *sp, char *name, char **elementp)
+{
+       size_t len;
+       char *t;
+
+       if ((t = tigetstr(name)) != NULL &&
+           t != (char *)-1 && (len = strlen(t)) != 0) {
+               MALLOC_RET(sp, *elementp, char *, len + 1);
+               memmove(*elementp, t, len + 1);
+       }
+       return (0);
+}
+
+/*
+ * cl_freecap --
+ *     Free any allocated termcap/terminfo strings.
+ */
+static void
+cl_freecap(CL_PRIVATE *clp)
+{
+       if (clp->el != NULL) {
+               free(clp->el);
+               clp->el = NULL;
+       }
+       if (clp->cup != NULL) {
+               free(clp->cup);
+               clp->cup = NULL;
+       }
+       if (clp->cuu1 != NULL) {
+               free(clp->cuu1);
+               clp->cuu1 = NULL;
+       }
+       if (clp->rmso != NULL) {
+               free(clp->rmso);
+               clp->rmso = NULL;
+       }
+       if (clp->smso != NULL) {
+               free(clp->smso);
+               clp->smso = NULL;
+       }
+       /* Required by libcursesw :) */
+       if (clp->cw.bp1.c != NULL) {
+               free(clp->cw.bp1.c);
+               clp->cw.bp1.c = NULL;
+               clp->cw.blen1 = 0;
+       }
+}
+
+/*
+ * cl_putenv --
+ *     Put a value into the environment.
+ */
+static int
+cl_putenv(char *name, char *str, u_long value)
+{
+       char buf[40];
+
+       if (str == NULL) {
+               (void)snprintf(buf, sizeof(buf), "%lu", value);
+               return (setenv(name, buf, 1));
+       } else
+               return (setenv(name, str, 1));
+}
diff --git a/contrib/nvi2/cl/cl_term.c b/contrib/nvi2/cl/cl_term.c
new file mode 100644 (file)
index 0000000..d4b1efc
--- /dev/null
@@ -0,0 +1,477 @@
+/*-
+ * Copyright (c) 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 1993, 1994, 1995, 1996
+ *     Keith Bostic.  All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ */
+
+#include "config.h"
+
+#ifndef lint
+static const char sccsid[] = "$Id: cl_term.c,v 10.35 2015/04/08 02:12:11 zy Exp $";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/queue.h>
+#include <sys/stat.h>
+
+#include <bitstring.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>
+
+#include "../common/common.h"
+#include "cl.h"
+
+static int cl_pfmap(SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t);
+
+/*
+ * XXX
+ * THIS REQUIRES THAT ALL SCREENS SHARE A TERMINAL TYPE.
+ */
+typedef struct _tklist {
+       char    *ts;                    /* Key's termcap string. */
+       char    *output;                /* Corresponding vi command. */
+       char    *name;                  /* Name. */
+       u_char   value;                 /* Special value (for lookup). */
+} TKLIST;
+static TKLIST const c_tklist[] = {     /* Command mappings. */
+       {"kil1",        "O",    "insert line"},
+       {"kdch1",       "x",    "delete character"},
+       {"kcud1",       "j",    "cursor down"},
+       {"kel",         "D",    "delete to eol"},
+       {"kind",     "\004",    "scroll down"},                 /* ^D */
+       {"kll",         "$",    "go to eol"},
+       {"kend",        "$",    "go to eol"},
+       {"khome",       "^",    "go to sol"},
+       {"kich1",       "i",    "insert at cursor"},
+       {"kdl1",       "dd",    "delete line"},
+       {"kcub1",       "h",    "cursor left"},
+       {"knp",      "\006",    "page down"},                   /* ^F */
+       {"kpp",      "\002",    "page up"},                     /* ^B */
+       {"kri",      "\025",    "scroll up"},                   /* ^U */
+       {"ked",        "dG",    "delete to end of screen"},
+       {"kcuf1",       "l",    "cursor right"},
+       {"kcuu1",       "k",    "cursor up"},
+       {NULL},
+};
+static TKLIST const m1_tklist[] = {    /* Input mappings (lookup). */
+       {NULL},
+};
+static TKLIST const m2_tklist[] = {    /* Input mappings (set or delete). */
+       {"kcud1",  "\033ja",    "cursor down"},                 /* ^[ja */
+       {"kcub1",  "\033ha",    "cursor left"},                 /* ^[ha */
+       {"kcuu1",  "\033ka",    "cursor up"},                   /* ^[ka */
+       {"kcuf1",  "\033la",    "cursor right"},                /* ^[la */
+       {NULL},
+};
+
+/*
+ * cl_term_init --
+ *     Initialize the special keys defined by the termcap/terminfo entry.
+ *
+ * PUBLIC: int cl_term_init(SCR *);
+ */
+int
+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;
+               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);
+       }
+
+       /* Input mappings needing to be looked up. */
+       for (tkp = m1_tklist; tkp->name != NULL; ++tkp) {
+               if ((t = tigetstr(tkp->ts)) == NULL || t == (char *)-1)
+                       continue;
+               for (kp = keylist;; ++kp)
+                       if (kp->value == tkp->value)
+                               break;
+               if (kp == NULL)
+                       continue;
+               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);
+       }
+
+       /* Input mappings that are already set or are text deletions. */
+       for (tkp = m2_tklist; tkp->name != NULL; ++tkp) {
+               if ((t = tigetstr(tkp->ts)) == NULL || t == (char *)-1)
+                       continue;
+               /*
+                * !!!
+                * Some terminals' <cursor_left> keys send single <backspace>
+                * characters.  This is okay in command mapping, but not okay
+                * in input mapping.  That combination is the only one we'll
+                * ever see, hopefully, so kluge it here for now.
+                */
+               if (!strcmp(t, "\b"))
+                       continue;
+               if (tkp->output == NULL) {
+                       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 {
+                       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.
+        */
+       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);
+       return (0);
+}
+
+/*
+ * cl_term_end --
+ *     End the special keys defined by the termcap/terminfo entry.
+ *
+ * PUBLIC: int cl_term_end(GS *);
+ */
+int
+cl_term_end(GS *gp)
+{
+       SEQ *qp, *nqp, *pre_qp = NULL;
+
+       /* Delete screen specific mappings. */
+       SLIST_FOREACH_SAFE(qp, gp->seqq, q, nqp)
+               if (F_ISSET(qp, SEQ_SCREEN)) {
+                       if (qp == SLIST_FIRST(gp->seqq))
+                               SLIST_REMOVE_HEAD(gp->seqq, q);
+                       else
+                               SLIST_REMOVE_AFTER(pre_qp, q);
+                       (void)seq_free(qp);
+               } else
+                       pre_qp = qp;
+       return (0);
+}
+
+/*
+ * cl_fmap --
+ *     Map a function key.
+ *
+ * PUBLIC: int cl_fmap(SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t);
+ */
+int
+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))
+               return (0);
+       if (F_ISSET(sp, SC_EX) && !F_ISSET(sp, SC_SCR_EX))
+               return (0);
+
+       return (cl_pfmap(sp, stype, from, flen, to, tlen));
+}
+
+/*
+ * cl_pfmap --
+ *     Map a function key (private version).
+ */
+static int
+cl_pfmap(SCR *sp, seq_t stype, CHAR_T *from, size_t flen, CHAR_T *to, size_t tlen)
+{
+       size_t nlen;
+       char *p;
+       char name[64];
+       CHAR_T keyname[64];
+       CHAR_T ts[20];
+       CHAR_T *wp;
+       size_t wlen;
+
+       (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_wstr(sp, M_ERR, from, "233|This terminal has no %s key");
+               return (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,
+           ts, strlen(p), to, tlen, stype, SEQ_NOOVERWRITE | SEQ_SCREEN));
+}
+
+/*
+ * cl_optchange --
+ *     Curses screen specific "option changed" routine.
+ *
+ * PUBLIC: int cl_optchange(SCR *, int, char *, u_long *);
+ */
+int
+cl_optchange(SCR *sp, int opt, char *str, u_long *valp)
+{
+       CL_PRIVATE *clp;
+
+       clp = CLP(sp);
+
+       switch (opt) {
+       case O_TERM:
+               F_CLR(sp, SC_SCR_EX | SC_SCR_VI);
+               /* FALLTHROUGH */
+       case O_COLUMNS:
+       case O_LINES:
+               /*
+                * Changing the terminal type requires that we reinitialize
+                * curses, while resizing does not.
+                */
+               F_SET(sp->gp, G_SRESTART);
+               break;
+       case O_MESG:
+               (void)cl_omesg(sp, clp, *valp);
+               break;
+       case O_WINDOWNAME:
+               if (*valp) {
+                       F_SET(clp, CL_RENAME_OK);
+
+                       /*
+                        * If the screen is live, i.e. we're not reading the
+                        * .exrc file, update the window.
+                        */
+                       if (sp->frp != NULL && sp->frp->name != NULL)
+                               (void)cl_rename(sp, sp->frp->name, 1);
+               } else {
+                       F_CLR(clp, CL_RENAME_OK);
+
+                       (void)cl_rename(sp, NULL, 0);
+               }
+               break;
+       }
+       return (0);
+}
+
+/*
+ * cl_omesg --
+ *     Turn the tty write permission on or off.
+ *
+ * PUBLIC: int cl_omesg(SCR *, CL_PRIVATE *, int);
+ */
+int
+cl_omesg(SCR *sp, CL_PRIVATE *clp, int on)
+{
+       struct stat sb;
+       char *tty;
+
+       /* Find the tty, get the current permissions. */
+       if ((tty = ttyname(STDERR_FILENO)) == NULL) {
+               if (sp != NULL)
+                       msgq(sp, M_SYSERR, "stderr");
+               return (1);
+       }
+       if (stat(tty, &sb) < 0) {
+               if (sp != NULL)
+                       msgq(sp, M_SYSERR, "%s", tty);
+               return (1);
+       }
+
+       /* Save the original status if it's unknown. */
+       if (clp->tgw == TGW_UNKNOWN)
+               clp->tgw = sb.st_mode & S_IWGRP ? TGW_SET : TGW_UNSET;
+
+       /* Toggle the permissions. */
+       if (on) {
+               if (chmod(tty, sb.st_mode | S_IWGRP) < 0) {
+                       if (sp != NULL)
+                               msgq(sp, M_SYSERR,
+                                   "046|messages not turned on: %s", tty);
+                       return (1);
+               }
+       } else
+               if (chmod(tty, sb.st_mode & ~S_IWGRP) < 0) {
+                       if (sp != NULL)
+                               msgq(sp, M_SYSERR,
+                                   "045|messages not turned off: %s", tty);
+                       return (1);
+               }
+       return (0);
+}
+
+/*
+ * cl_ssize --
+ *     Return the terminal size.
+ *
+ * PUBLIC: int cl_ssize(SCR *, int, size_t *, size_t *, int *);
+ */
+int
+cl_ssize(SCR *sp, int sigwinch, size_t *rowp, size_t *colp, int *changedp)
+{
+       struct winsize win;
+       size_t col, row;
+       int rval;
+       char *p;
+
+       /* Assume it's changed. */
+       if (changedp != NULL)
+               *changedp = 1;
+
+       /*
+        * !!!
+        * sp may be NULL.
+        *
+        * Get the screen rows and columns.  If the values are wrong, it's
+        * not a big deal -- as soon as the user sets them explicitly the
+        * environment will be set and the screen package will use the new
+        * values.
+        *
+        * Try TIOCGWINSZ.
+        */
+       row = col = 0;
+       if (ioctl(STDERR_FILENO, TIOCGWINSZ, &win) != -1) {
+               row = win.ws_row;
+               col = win.ws_col;
+       }
+       /* If here because of suspend or a signal, only trust TIOCGWINSZ. */
+       if (sigwinch) {
+               /*
+                * Somebody didn't get TIOCGWINSZ right, or has suspend
+                * without window resizing support.  The user just lost,
+                * but there's nothing we can do.
+                */
+               if (row == 0 || col == 0) {
+                       if (changedp != NULL)
+                               *changedp = 0;
+                       return (0);
+               }
+
+               /*
+                * SunOS systems deliver SIGWINCH when windows are uncovered
+                * as well as when they change size.  In addition, we call
+                * here when continuing after being suspended since the window
+                * may have changed size.  Since we don't want to background
+                * all of the screens just because the window was uncovered,
+                * ignore the signal if there's no change.
+                */
+               if (sp != NULL &&
+                   row == O_VAL(sp, O_LINES) && col == O_VAL(sp, O_COLUMNS)) {
+                       if (changedp != NULL)
+                               *changedp = 0;
+                       return (0);
+               }
+
+               if (rowp != NULL)
+                       *rowp = row;
+               if (colp != NULL)
+                       *colp = col;
+               return (0);
+       }
+
+       /*
+        * !!!
+        * If TIOCGWINSZ failed, or had entries of 0, try termcap.  This
+        * routine is called before any termcap or terminal information
+        * has been set up.  If there's no TERM environmental variable set,
+        * let it go, at least ex can run.
+        */
+       if (row == 0 || col == 0) {
+               if ((p = getenv("TERM")) == NULL)
+                       goto noterm;
+               if (row == 0)
+                       if ((rval = tigetnum("lines")) < 0)
+                               msgq(sp, M_SYSERR, "tigetnum: lines");
+                       else
+                               row = rval;
+               if (col == 0)
+                       if ((rval = tigetnum("cols")) < 0)
+                               msgq(sp, M_SYSERR, "tigetnum: cols");
+                       else
+                               col = rval;
+       }
+
+       /* If nothing else, well, it's probably a VT100. */
+noterm:        if (row == 0)
+               row = 24;
+       if (col == 0)
+               col = 80;
+
+       /*
+        * !!!
+        * POSIX 1003.2 requires the environment to override everything.
+        * Often, people can get nvi to stop messing up their screen by
+        * deleting the LINES and COLUMNS environment variables from their
+        * dot-files.
+        */
+       if ((p = getenv("LINES")) != NULL)
+               row = strtol(p, NULL, 10);
+       if ((p = getenv("COLUMNS")) != NULL)
+               col = strtol(p, NULL, 10);
+
+       if (rowp != NULL)
+               *rowp = row;
+       if (colp != NULL)
+               *colp = col;
+       return (0);
+}
+
+/*
+ * cl_putchar --
+ *     Function version of putchar, for tputs.
+ *
+ * PUBLIC: int cl_putchar(int);
+ */
+int
+cl_putchar(int ch)
+{
+       return (putchar(ch));
+}
diff --git a/contrib/nvi2/common/args.h b/contrib/nvi2/common/args.h
new file mode 100644 (file)
index 0000000..b23699c
--- /dev/null
@@ -0,0 +1,29 @@
+/*-
+ * Copyright (c) 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 1993, 1994, 1995, 1996
+ *     Keith Bostic.  All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ *
+ *     $Id: args.h,v 10.2 1996/03/06 19:50:07 bostic Exp $
+ */
+
+/*
+ * Structure for building "argc/argv" vector of arguments.
+ *
+ * !!!
+ * All arguments are nul terminated as well as having an associated length.
+ * The argument vector is NOT necessarily NULL terminated.  The proper way
+ * to check the number of arguments is to use the argc value in the EXCMDARG
+ * structure or to walk the array until an ARGS structure with a length of 0
+ * is found.
+ */
+typedef struct _args {
+       CHAR_T  *bp;            /* Argument. */
+       size_t   blen;          /* Buffer length. */
+       size_t   len;           /* Argument length. */
+
+#define        A_ALLOCATED     0x01    /* If allocated space. */
+       u_int8_t flags;
+} ARGS;
diff --git a/contrib/nvi2/common/common.h b/contrib/nvi2/common/common.h
new file mode 100644 (file)
index 0000000..c64adb5
--- /dev/null
@@ -0,0 +1,93 @@
+/*-
+ * Copyright (c) 1991, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 1991, 1993, 1994, 1995, 1996
+ *     Keith Bostic.  All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ *
+ *     $Id: common.h,v 10.22 2012/04/13 05:21:50 zy Exp $
+ */
+
+/*
+ * Pseudo-local includes.  These are files that are unlikely to exist
+ * on most machines to which we're porting vi, and we want to include
+ * them in a very specific order, regardless.
+ */
+#include <db.h>
+#include <regex.h>
+
+/*
+ * Forward structure declarations.  Not pretty, but the include files
+ * are far too interrelated for a clean solution.
+ */
+typedef struct _cb             CB;
+typedef struct _csc            CSC;
+typedef struct _conv           CONV;
+typedef struct _conv_win       CONVWIN;
+typedef struct _event          EVENT;
+typedef struct _excmd          EXCMD;
+typedef struct _exf            EXF;
+typedef struct _fref           FREF;
+typedef struct _gs             GS;
+typedef struct _lmark          LMARK;
+typedef struct _mark           MARK;
+typedef struct _msg            MSGS;
+typedef struct _option         OPTION;
+typedef struct _optlist                OPTLIST;
+typedef struct _scr            SCR;
+typedef struct _script         SCRIPT;
+typedef struct _seq            SEQ;
+typedef struct _tag            TAG;
+typedef struct _tagf           TAGF;
+typedef struct _tagq           TAGQ;
+typedef struct _text           TEXT;
+
+/* Autoindent state. */
+typedef enum { C_NOTSET, C_CARATSET, C_ZEROSET } carat_t;
+
+/* Busy message types. */
+typedef enum { BUSY_ON = 1, BUSY_OFF, BUSY_UPDATE } busy_t;
+
+/*
+ * Routines that return a confirmation return:
+ *
+ *     CONF_NO         User answered no.
+ *     CONF_QUIT       User answered quit, eof or an error.
+ *     CONF_YES        User answered yes.
+ */
+typedef enum { CONF_NO, CONF_QUIT, CONF_YES } conf_t;
+
+/* Directions. */
+typedef enum { NOTSET, FORWARD, BACKWARD } dir_t;
+
+/* Line operations. */
+typedef enum { LINE_APPEND, LINE_DELETE, LINE_INSERT, LINE_RESET } lnop_t;
+
+/* Lock return values. */
+typedef enum { LOCK_FAILED, LOCK_SUCCESS, LOCK_UNAVAIL } lockr_t;
+
+/* Sequence types. */
+typedef enum { SEQ_ABBREV, SEQ_COMMAND, SEQ_INPUT } seq_t;
+
+/*
+ * Local includes.
+ */
+#include "key.h"               /* Required by args.h. */
+#include "args.h"              /* Required by options.h. */
+#include "options.h"           /* Required by screen.h. */
+
+#include "msg.h"               /* Required by gs.h. */
+#include "cut.h"               /* Required by gs.h. */
+#include "seq.h"               /* Required by screen.h. */
+#include "util.h"              /* Required by ex.h. */
+#include "mark.h"              /* Required by gs.h. */
+#include "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. */
+#include "exf.h"
+#include "log.h"
+#include "mem.h"
+
+#include "extern.h"
diff --git a/contrib/nvi2/common/conv.c b/contrib/nvi2/common/conv.c
new file mode 100644 (file)
index 0000000..aaa7af3
--- /dev/null
@@ -0,0 +1,470 @@
+/*-
+ * 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.40 2014/02/27 16:25:29 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(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);
+               /* back to the initial state */
+               CONVERT2(NULL, NULL, cw, offset);
+               *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(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(SCR *, int, char *);
+ */
+int
+conv_enc(SCR *sp, int option, char *enc)
+{
+#if defined(USE_WIDECHAR) && defined(USE_ICONV)
+       iconv_t *c2w, *w2c;
+       iconv_t id_c2w, id_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 (strcasecmp(codeset(), enc)) {
+                       if ((id_c2w = iconv_open(codeset(), enc)) ==
+                           (iconv_t)-1)
+                               goto err;
+                       if ((id_w2c = iconv_open(enc, codeset())) ==
+                           (iconv_t)-1)
+                               goto err;
+               } else {
+                       id_c2w = (iconv_t)-1;
+                       id_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 (strcasecmp(codeset(), enc)) {
+                       if ((id_c2w = iconv_open(codeset(), enc)) ==
+                           (iconv_t)-1)
+                               goto err;
+               } else
+                       id_c2w = (iconv_t)-1;
+
+               /* UTF-16 can not be locale and can not be inputed. */
+               if ((id_w2c = iconv_open("utf-16be", enc)) == (iconv_t)-1)
+                       goto err;
+
+               break;
+
+       default:
+               abort();
+       }
+
+       if (*c2w != (iconv_t)-1)
+               iconv_close(*c2w);
+       if (*w2c != (iconv_t)-1)
+               iconv_close(*w2c);
+
+       *c2w = id_c2w;
+       *w2c = id_w2c;
+
+       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(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
+}
diff --git a/contrib/nvi2/common/conv.h b/contrib/nvi2/common/conv.h
new file mode 100644 (file)
index 0000000..b17c3bb
--- /dev/null
@@ -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];
+};
diff --git a/contrib/nvi2/common/cut.c b/contrib/nvi2/common/cut.c
new file mode 100644 (file)
index 0000000..810aef6
--- /dev/null
@@ -0,0 +1,351 @@
+/*-
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996
+ *     Keith Bostic.  All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ */
+
+#include "config.h"
+
+#ifndef lint
+static const char sccsid[] = "$Id: cut.c,v 10.12 2012/02/11 15:52:33 zy Exp $";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/queue.h>
+
+#include <bitstring.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "common.h"
+
+static void    cb_rotate(SCR *);
+
+/*
+ * cut --
+ *     Put a range of lines/columns into a TEXT buffer.
+ *
+ * There are two buffer areas, both found in the global structure.  The first
+ * is the linked list of all the buffers the user has named, the second is the
+ * unnamed buffer storage.  There is a pointer, too, which is the current
+ * default buffer, i.e. it may point to the unnamed buffer or a named buffer
+ * depending on into what buffer the last text was cut.  Logically, in both
+ * delete and yank operations, if the user names a buffer, the text is cut
+ * into it.  If it's a delete of information on more than a single line, the
+ * contents of the numbered buffers are rotated up one, the contents of the
+ * buffer named '9' are discarded, and the text is cut into the buffer named
+ * '1'.  The text is always cut into the unnamed buffer.
+ *
+ * In all cases, upper-case buffer names are the same as lower-case names,
+ * with the exception that they cause the buffer to be appended to instead
+ * of replaced.  Note, however, that if text is appended to a buffer, the
+ * default buffer only contains the appended text, not the entire contents
+ * of the buffer.
+ *
+ * !!!
+ * The contents of the default buffer would disappear after most operations
+ * in historic vi.  It's unclear that this is useful, so we don't bother.
+ *
+ * When users explicitly cut text into the numeric buffers, historic vi became
+ * genuinely strange.  I've never been able to figure out what was supposed to
+ * happen.  It behaved differently if you deleted text than if you yanked text,
+ * and, in the latter case, the text was appended to the buffer instead of
+ * replacing the contents.  Hopefully it's not worth getting right, and here
+ * we just treat the numeric buffers like any other named buffer.
+ *
+ * PUBLIC: int cut(SCR *, CHAR_T *, MARK *, MARK *, int);
+ */
+int
+cut(
+       SCR *sp,
+       CHAR_T *namep,
+       MARK *fm,
+       MARK *tm,
+       int flags)
+{
+       CB *cbp;
+       CHAR_T name = '\0';
+       recno_t lno;
+       int append, copy_one, copy_def;
+
+       /*
+        * If the user specified a buffer, put it there.  (This may require
+        * a copy into the numeric buffers.  We do the copy so that we don't
+        * have to reference count and so we don't have to deal with things
+        * like appends to buffers that are used multiple times.)
+        *
+        * Otherwise, if it's supposed to be put in a numeric buffer (usually
+        * a delete) put it there.  The rules for putting things in numeric
+        * buffers were historically a little strange.  There were three cases.
+        *
+        *      1: Some motions are always line mode motions, which means
+        *         that the cut always goes into the numeric buffers.
+        *      2: Some motions aren't line mode motions, e.g. d10w, but
+        *         can cross line boundaries.  For these commands, if the
+        *         cut crosses a line boundary, it goes into the numeric
+        *         buffers.  This includes most of the commands.
+        *      3: Some motions aren't line mode motions, e.g. d`<char>,
+        *         but always go into the numeric buffers, regardless.  This
+        *         was the commands: % ` / ? ( ) N n { } -- and nvi adds ^A.
+        *
+        * Otherwise, put it in the unnamed buffer.
+        */
+       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))) {
+                       copy_one = 1;
+                       cb_rotate(sp);
+               }
+               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))) {
+               name = '1';
+               cb_rotate(sp);
+               goto namecb;
+       } else
+               cbp = &sp->gp->dcb_store;
+
+copyloop:
+       /*
+        * If this is a new buffer, create it and add it into the list.
+        * Otherwise, if it's not an append, free its current contents.
+        */
+       if (cbp == NULL) {
+               CALLOC_RET(sp, cbp, CB *, 1, sizeof(CB));
+               cbp->name = name;
+               TAILQ_INIT(cbp->textq);
+               SLIST_INSERT_HEAD(sp->gp->cutq, cbp, q);
+       } else if (!append) {
+               text_lfree(cbp->textq);
+               cbp->len = 0;
+               cbp->flags = 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, ENTIRE_LINE, cbp))
+                               goto cut_line_err;
+       } else {
+               /*
+                * 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))
+                       goto cut_line_err;
+
+               /* Get the intermediate lines. */
+               for (lno = fm->lno; ++lno < tm->lno;)
+                       if (cut_line(sp, lno, 0, ENTIRE_LINE, cbp))
+                               goto cut_line_err;
+
+               /* Get the last line. */
+               if (tm->lno != fm->lno &&
+                   cut_line(sp, lno, 0, tm->cno + 1, cbp))
+                       goto cut_line_err;
+       }
+
+       append = 0;             /* Only append to the named buffer. */
+       sp->gp->dcbp = cbp;     /* Repoint the default buffer on each pass. */
+
+       if (copy_one) {         /* Copy into numeric buffer 1. */
+               name = '1';
+               CBNAME(sp, cbp, name);
+               copy_one = 0;
+               goto copyloop;
+       }
+       if (copy_def) {         /* Copy into the default buffer. */
+               cbp = &sp->gp->dcb_store;
+               copy_def = 0;
+               goto copyloop;
+       }
+       return (0);
+
+cut_line_err:  
+       text_lfree(cbp->textq);
+       cbp->len = 0;
+       cbp->flags = 0;
+       return (1);
+}
+
+/*
+ * cb_rotate --
+ *     Rotate the numbered buffers up one.
+ */
+static void
+cb_rotate(SCR *sp)
+{
+       CB *cbp, *del_cbp = NULL, *pre_cbp = NULL;
+
+       SLIST_FOREACH(cbp, sp->gp->cutq, q) {
+               switch(cbp->name) {
+               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) {
+               text_lfree(del_cbp->textq);
+               free(del_cbp);
+       }
+}
+
+/*
+ * cut_line --
+ *     Cut a portion of a single line.
+ *
+ * PUBLIC: int cut_line(SCR *, recno_t, size_t, size_t, CB *);
+ */
+int
+cut_line(
+       SCR *sp,
+       recno_t lno,
+       size_t fcno,
+       size_t clen,
+       CB *cbp)
+{
+       TEXT *tp;
+       size_t len;
+       CHAR_T *p;
+
+       /* Get the line. */
+       if (db_get(sp, lno, DBG_FATAL, &p, &len))
+               return (1);
+
+       /* Create a TEXT structure that can hold the entire line. */
+       if ((tp = text_init(sp, NULL, 0, len)) == NULL)
+               return (1);
+
+       /*
+        * If the line isn't empty and it's not the entire line,
+        * copy the portion we want, and reset the TEXT length.
+        */
+       if (len != 0) {
+               if (clen == ENTIRE_LINE)
+                       clen = len - fcno;
+               MEMCPY(tp->lb, p + fcno, clen);
+               tp->len = clen;
+       }
+
+       /* Append to the end of the cut buffer. */
+       TAILQ_INSERT_TAIL(cbp->textq, tp, q);
+       cbp->len += tp->len;
+
+       return (0);
+}
+
+/*
+ * cut_close --
+ *     Discard all cut buffers.
+ *
+ * PUBLIC: void cut_close(GS *);
+ */
+void
+cut_close(GS *gp)
+{
+       CB *cbp;
+
+       /* Free cut buffer list. */
+       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 (!TAILQ_EMPTY(cbp->textq))
+               text_lfree(cbp->textq);
+}
+
+/*
+ * text_init --
+ *     Allocate a new TEXT structure.
+ *
+ * PUBLIC: TEXT *text_init(SCR *, const CHAR_T *, size_t, size_t);
+ */
+TEXT *
+text_init(
+       SCR *sp,
+       const CHAR_T *p,
+       size_t len,
+       size_t total_len)
+{
+       TEXT *tp;
+
+       CALLOC(sp, tp, TEXT *, 1, sizeof(TEXT));
+       if (tp == NULL)
+               return (NULL);
+       /* ANSI C doesn't define a call to malloc(3) for 0 bytes. */
+       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);
+       }
+       tp->len = len;
+       return (tp);
+}
+
+/*
+ * text_lfree --
+ *     Free a chain of text structures.
+ *
+ * PUBLIC: void text_lfree(TEXTH *);
+ */
+void
+text_lfree(TEXTH *headp)
+{
+       TEXT *tp;
+
+       while ((tp = TAILQ_FIRST(headp)) != NULL) {
+               TAILQ_REMOVE(headp, tp, q);
+               text_free(tp);
+       }
+}
+
+/*
+ * text_free --
+ *     Free a text structure.
+ *
+ * PUBLIC: void text_free(TEXT *);
+ */
+void
+text_free(TEXT *tp)
+{
+       if (tp->lb != NULL)
+               free(tp->lb);
+       free(tp);
+}
diff --git a/contrib/nvi2/common/cut.h b/contrib/nvi2/common/cut.h
new file mode 100644 (file)
index 0000000..30e9350
--- /dev/null
@@ -0,0 +1,79 @@
+/*-
+ * Copyright (c) 1991, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 1991, 1993, 1994, 1995, 1996
+ *     Keith Bostic.  All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ *
+ *     $Id: cut.h,v 10.10 2012/02/11 15:52:33 zy Exp $
+ */
+
+typedef struct _texth TEXTH;           /* TEXT list head structure. */
+TAILQ_HEAD(_texth, _text);
+
+/* Cut buffers. */
+struct _cb {
+       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. */
+
+#define        CB_LMODE        0x01            /* Cut was in line mode. */
+       u_int8_t flags;
+};
+
+/* Lines/blocks of text. */
+struct _text {                         /* Text: a linked list of lines. */
+       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). */
+       size_t   offset;                /* 0-N: initial, unerasable chars. */
+       size_t   owrite;                /* 0-N: chars to overwrite. */
+       size_t   R_erase;               /* 0-N: 'R' erase count. */
+       size_t   sv_cno;                /* 0-N: Saved line cursor. */
+       size_t   sv_len;                /* 0-N: Saved line length. */
+
+       /*
+        * These fields returns information from the vi text input routine.
+        *
+        * The termination condition.  Note, this field is only valid if the
+        * text input routine returns success.
+        *      TERM_BS:        User backspaced over the prompt.
+        *      TERM_CEDIT:     User entered <edit-char>.
+        *      TERM_CR:        User entered <carriage-return>; no data.
+        *      TERM_ESC:       User entered <escape>; no data.
+        *      TERM_OK:        Data available.
+        *      TERM_SEARCH:    Incremental search.
+        */
+       enum {
+           TERM_BS, TERM_CEDIT, TERM_CR, TERM_ESC, TERM_OK, TERM_SEARCH
+       } term;
+};
+
+/*
+ * Get named buffer 'name'.
+ * Translate upper-case buffer names to lower-case buffer names.
+ */
+#define        CBNAME(sp, cbp, nch) {                                          \
+       CHAR_T L__name;                                                 \
+       L__name = isupper(nch) ? tolower(nch) : (nch);                  \
+       SLIST_FOREACH(cbp, sp->gp->cutq, q)                             \
+               if (cbp->name == L__name)                               \
+                       break;                                          \
+}
+
+/* Flags to the cut() routine. */
+#define        CUT_LINEMODE    0x01            /* Cut in line mode. */
+#define        CUT_NUMOPT      0x02            /* Numeric buffer: optional. */
+#define        CUT_NUMREQ      0x04            /* Numeric buffer: required. */
diff --git a/contrib/nvi2/common/delete.c b/contrib/nvi2/common/delete.c
new file mode 100644 (file)
index 0000000..b9bd038
--- /dev/null
@@ -0,0 +1,163 @@
+/*-
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996
+ *     Keith Bostic.  All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ */
+
+#include "config.h"
+
+#ifndef lint
+static const char sccsid[] = "$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>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "common.h"
+
+/*
+ * del --
+ *     Delete a range of text.
+ *
+ * PUBLIC: int del(SCR *, MARK *, MARK *, int);
+ */
+int
+del(
+       SCR *sp,
+       MARK *fm,
+       MARK *tm,
+       int lmode)
+{
+       recno_t lno;
+       size_t blen, len, nlen, tlen;
+       CHAR_T *bp, *p;
+       int eof, rval;
+
+       bp = NULL;
+
+       /* Case 1 -- delete in line mode. */
+       if (lmode) {
+               for (lno = tm->lno; lno >= fm->lno; --lno) {
+                       if (db_delete(sp, lno))
+                               return (1);
+                       ++sp->rptlines[L_DELETED];
+                       if (lno % INTERRUPT_CHECK == 0 && INTERRUPTED(sp))
+                               break;
+               }
+               goto done;
+       }
+
+       /*
+        * Case 2 -- delete to EOF.  This is a special case because it's
+        * easier to pick it off than try and find it in the other cases.
+        */
+       if (db_last(sp, &lno))
+               return (1);
+       if (tm->lno >= lno) {
+               if (tm->lno == lno) {
+                       if (db_get(sp, lno, DBG_FATAL, &p, &len))
+                               return (1);
+                       eof = tm->cno != ENTIRE_LINE && tm->cno >= len ? 1 : 0;
+               } else
+                       eof = 1;
+               if (eof) {
+                       for (lno = tm->lno; lno > fm->lno; --lno) {
+                               if (db_delete(sp, lno))
+                                       return (1);
+                               ++sp->rptlines[L_DELETED];
+                               if (lno %
+                                   INTERRUPT_CHECK == 0 && INTERRUPTED(sp))
+                                       break;
+                       }
+                       if (db_get(sp, fm->lno, DBG_FATAL, &p, &len))
+                               return (1);
+                       GET_SPACE_RETW(sp, bp, blen, fm->cno);
+                       MEMCPY(bp, p, fm->cno);
+                       if (db_set(sp, fm->lno, bp, fm->cno))
+                               return (1);
+                       goto done;
+               }
+       }
+
+       /* Case 3 -- delete within a single line. */
+       if (tm->lno == fm->lno) {
+               if (db_get(sp, fm->lno, DBG_FATAL, &p, &len))
+                       return (1);
+               GET_SPACE_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));
+               if (db_set(sp, fm->lno,
+                   bp, len - ((tm->cno - fm->cno) + 1)))
+                       goto err;
+               goto done;
+       }
+
+       /*
+        * Case 4 -- delete over multiple lines.
+        *
+        * Copy the start partial line into place.
+        */
+       if ((tlen = fm->cno) != 0) {
+               if (db_get(sp, fm->lno, DBG_FATAL, &p, NULL))
+                       return (1);
+               GET_SPACE_RETW(sp, bp, blen, tlen + 256);
+               MEMCPY(bp, p, tlen);
+       }
+
+       /* Copy the end partial line into place. */
+       if (db_get(sp, tm->lno, DBG_FATAL, &p, &len))
+               goto err;
+       if (len != 0 && tm->cno != len - 1) {
+               /*
+                * XXX
+                * We can overflow memory here, if the total length is greater
+                * than SIZE_T_MAX.  The only portable way I've found to test
+                * is depending on the overflow being less than the value.
+                */
+               nlen = (len - (tm->cno + 1)) + tlen;
+               if (tlen > nlen) {
+                       msgq(sp, M_ERR, "002|Line length overflow");
+                       goto err;
+               }
+               if (tlen == 0) {
+                       GET_SPACE_RETW(sp, bp, blen, nlen);
+               } else
+                       ADD_SPACE_RETW(sp, bp, blen, nlen);
+
+               MEMCPY(bp + tlen, p + (tm->cno + 1), len - (tm->cno + 1));
+               tlen += len - (tm->cno + 1);
+       }
+
+       /* Set the current line. */
+       if (db_set(sp, fm->lno, bp, tlen))
+               goto err;
+
+       /* Delete the last and intermediate lines. */
+       for (lno = tm->lno; lno > fm->lno; --lno) {
+               if (db_delete(sp, lno))
+                       goto err;
+               ++sp->rptlines[L_DELETED];
+               if (lno % INTERRUPT_CHECK == 0 && INTERRUPTED(sp))
+                       break;
+       }
+
+done:  rval = 0;
+       if (0)
+err:           rval = 1;
+       if (bp != NULL)
+               FREE_SPACEW(sp, bp, blen);
+       return (rval);
+}
diff --git a/contrib/nvi2/common/encoding.c b/contrib/nvi2/common/encoding.c
new file mode 100644 (file)
index 0000000..7bdcf70
--- /dev/null
@@ -0,0 +1,236 @@
+/*-
+ * 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(const char *, size_t);
+int looks_utf16(const char *, size_t);
+int decode_utf8(const char *);
+int decode_utf16(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(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(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(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(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;
+}
diff --git a/contrib/nvi2/common/exf.c b/contrib/nvi2/common/exf.c
new file mode 100644 (file)
index 0000000..1fcf7f6
--- /dev/null
@@ -0,0 +1,1524 @@
+/*-
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 1992, 1993, 1994, 1995, 1996
+ *     Keith Bostic.  All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ */
+
+#include "config.h"
+
+#ifndef lint
+static const char sccsid[] = "$Id: exf.c,v 10.64 2015/04/05 15:21:55 zy Exp $";
+#endif /* not lint */
+
+#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
+ * were found there on historical systems.  We also include <fcntl.h>
+ * because the open(2) #defines are found there on newer systems.
+ */
+#include <sys/file.h>
+
+#include <bitstring.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "common.h"
+
+static int     file_backup(SCR *, char *, char *);
+static void    file_cinit(SCR *);
+static void    file_encinit(SCR *);
+static void    file_comment(SCR *);
+static int     file_spath(SCR *, FREF *, struct stat *, int *);
+
+/*
+ * file_add --
+ *     Insert a file name into the FREF list, if it doesn't already
+ *     appear in it.
+ *
+ * !!!
+ * The "if it doesn't already appear" changes vi's semantics slightly.  If
+ * you do a "vi foo bar", and then execute "next bar baz", the edit of bar
+ * will reflect the line/column of the previous edit session.  Historic nvi
+ * did not do this.  The change is a logical extension of the change where
+ * vi now remembers the last location in any file that it has ever edited,
+ * not just the previously edited file.
+ *
+ * PUBLIC: FREF *file_add(SCR *, char *);
+ */
+FREF *
+file_add(
+       SCR *sp,
+       char *name)
+{
+       GS *gp;
+       FREF *frp, *tfrp;
+
+       /*
+        * Return it if it already exists.  Note that we test against the
+        * user's name, whatever that happens to be, including if it's a
+        * temporary file.
+        *
+        * If the user added a file but was unable to initialize it, there
+        * can be file list entries where the name field is NULL.  Discard
+        * them the next time we see them.
+        */
+       gp = sp->gp;
+       if (name != NULL)
+               TAILQ_FOREACH_SAFE(frp, gp->frefq, q, tfrp) {
+                       if (frp->name == NULL) {
+                               TAILQ_REMOVE(gp->frefq, frp, q);
+                               if (frp->name != NULL)
+                                       free(frp->name);
+                               free(frp);
+                               continue;
+                       }
+                       if (!strcmp(frp->name, name))
+                               return (frp);
+               }
+
+       /* Allocate and initialize the FREF structure. */
+       CALLOC(sp, frp, FREF *, 1, sizeof(FREF));
+       if (frp == NULL)
+               return (NULL);
+
+       /*
+        * If no file name specified, or if the file name is a request
+        * for something temporary, file_init() will allocate the file
+        * name.  Temporary files are always ignored.
+        */
+       if (name != NULL && strcmp(name, TEMPORARY_FILE_STRING) &&
+           (frp->name = strdup(name)) == NULL) {
+               free(frp);
+               msgq(sp, M_SYSERR, NULL);
+               return (NULL);
+       }
+
+       /* Append into the chain of file names. */
+       TAILQ_INSERT_TAIL(gp->frefq, frp, q);
+
+       return (frp);
+}
+
+/*
+ * file_init --
+ *     Start editing a file, based on the FREF structure.  If successsful,
+ *     let go of any previous file.  Don't release the previous file until
+ *     absolutely sure we have the new one.
+ *
+ * PUBLIC: int file_init(SCR *, FREF *, char *, int);
+ */
+int
+file_init(
+       SCR *sp,
+       FREF *frp,
+       char *rcv_name,
+       int flags)
+{
+       EXF *ep;
+       RECNOINFO oinfo = { 0 };
+       struct stat sb;
+       size_t psize;
+       int fd, exists, open_err, readonly;
+       char *oname, *tname;
+
+       open_err = readonly = 0;
+
+       /*
+        * If the file is a recovery file, let the recovery code handle it.
+        * Clear the FR_RECOVER flag first -- the recovery code does set up,
+        * and then calls us!  If the recovery call fails, it's probably
+        * because the named file doesn't exist.  So, move boldly forward,
+        * presuming that there's an error message the user will get to see.
+        */
+       if (F_ISSET(frp, FR_RECOVER)) {
+               F_CLR(frp, FR_RECOVER);
+               return (rcv_read(sp, frp));
+       }
+
+       /*
+        * Required FRP initialization; the only flag we keep is the
+        * cursor information.
+        */
+       F_CLR(frp, ~FR_CURSORSET);
+
+       /*
+        * Required EXF initialization:
+        *      Flush the line caches.
+        *      Default recover mail file fd to -1.
+        *      Set initial EXF flag bits.
+        */
+       CALLOC_RET(sp, ep, EXF *, 1, sizeof(EXF));
+       ep->c_lno = ep->c_nlines = OOBLNO;
+       ep->rcv_fd = -1;
+       F_SET(ep, F_FIRSTMODIFY);
+
+       /*
+        * Scan the user's path to find the file that we're going to
+&