home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume44
/
vim
/
part22
< prev
next >
Wrap
Internet Message Format
|
1994-08-18
|
71KB
From: mool@oce.nl (Bram Moolenaar)
Newsgroups: comp.sources.misc
Subject: v44i041: vim - Vi IMproved editor, v3.0, Part22/26
Date: 18 Aug 1994 14:03:38 -0500
Organization: Sterling Software
Sender: kent@sparky.sterling.com
Approved: kent@sparky.sterling.com
Message-ID: <330baa$e8a@sparky.sterling.com>
X-Md4-Signature: 254dc41cb343615556e26666c40f9dd6
Submitted-by: mool@oce.nl (Bram Moolenaar)
Posting-number: Volume 44, Issue 41
Archive-name: vim/part22
Environment: UNIX, AMIGA, MS-DOS, Windows NT
Supersedes: vim: Volume 41, Issue 50-75
#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".
# Contents: vim/.exrc vim/doc/index vim/src/cmdcmds.c vim/src/cmdtab.h
# vim/src/digraph.c.UU vim/src/makefile.nt vim/src/tag.c
# Wrapped by kent@sparky on Mon Aug 15 21:44:13 1994
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:
echo ' "shar: End of archive 22 (of 26)."'
if test -f 'vim/.exrc' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'vim/.exrc'\"
else
echo shar: Extracting \"'vim/.exrc'\" \(30 characters\)
sed "s/^X//" >'vim/.exrc' <<'END_OF_FILE'
Xset ai bs=2 shell=csh nojs ru
END_OF_FILE
if test 30 -ne `wc -c <'vim/.exrc'`; then
echo shar: \"'vim/.exrc'\" unpacked with wrong size!
fi
# end of 'vim/.exrc'
fi
if test -f 'vim/doc/index' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'vim/doc/index'\"
else
echo shar: Extracting \"'vim/doc/index'\" \(12449 characters\)
sed "s/^X//" >'vim/doc/index' <<'END_OF_FILE'
Xindex of vim commands for
X 1. insert mode
X 2. VI commands (normal mode)
X 3. command line editing
X 4. EX commands
X
X(for an overview of options see the end of reference.doc)
X
X1. INSERT MODE
X==============
X
Xchar action
X-----------------------------------------------------------------------
X^@ insert previously inserted text and stop insert {vi: up to 128
X chars}
X^A insert previously inserted text {not in Vi}
X^B toggle 'revins' option.
X^C quit insert mode, without checking for abbreviation.
X^D delete one shiftwidth of indent in the current line {vi:
X only after auto-indent}
X when preceded with <0> or <^>, delete all indent, with <^>
X restore it in the next line
X^E insert the character which is below the cursor
X^H <BS> delete character before the cursor {vi: does not cross lines,
X does not delete autoindents}
X^J <LF> begin new line
X^K {char1} {char2} enter digraph (only when compiled with it) {vi: no digraphs}
X^M <CR> begin new line
X^N find next match for keyword in front of the cursor
X^O execute a single command and return to insert mode
X^P find previous match for keyword in front of the cursor
X^R <0-9a-z"%:> insert contents of register <0-9a-z"%:> {not in vi}
X^T insert one shiftwidth of indent in current line {vi: only in
X autoindent}
X^U delete all entered characters in the current line
X^V insert next non-digit literally, insert three digit decimal
X number as a single byte.
X^W delete word before the cursor
X^Y insert the character which is above the cursor
X^[ <ESC> end insert mode
X<DEL> same as ^H <BS>
X<C_UP> cursor one line up
X<C_DOWN> cursor one line down
X<C_LEFT> cursor one character left
X<C_RIGHT> cursor one character right
X<SC_UP> one screenfull backward
X<SC_DOWN> one screenfull forward
X<SC_LEFT> cursor one word left
X<SC_RIGHT> cursor one word right
X{char1}<BS>{char2} enter digraph (only when compiled with it and 'digraph'
X option set) {vi: no digraphs}
X
X
X2. VI COMMANDS
X==============
X
XCHAR means non-blank char
XWORD means sequences of non-blank chars
XN is number entered before the command
X<move> is a cursor movement command
XNmove is the text that is moved over with a cursor movement command
XSECTION is a section that possibly starts with '}' instead of '{'
X
Xnote: 1 = cursor movement command; 2 = can be undone/redone
X
Xchar note vim normal mode (vi: what the unix vi does)
X------------------------------------------------------------------------------
X^@ error
X^A 2 add N to number at/after cursor {vi: no ^A}
X^B 1 scroll N screens Backwards
X^C interrupt current (search) command
X^D scroll Down N lines (default: half a screen)
X^E scroll N lines upwards (N lines Extra)
X^F 1 scroll N screens Forward
X^G display current file name and position
X^H <BS> 1 cursor N chars to the left
X^I <TAB> 1 go to N newer entry in jump list
X^J <LF> 1 cursor N lines downward
X^K error
X^L redraw screen
X^M <CR> 1 cursor to the first CHAR N lines lower
X^N 1 cursor N lines downward
X^O 1 go to N older entry in jump list
X^P 1 cursor N lines upward
X^Q error (used for xon/xoff)
X^R 2 redo changes which were undone with 'u' (vi: retype
X the screen)
X^S error (used for xon/xoff)
X^T jump to N older Tag in tag list
X^U scroll N lines Upwards (default: half a screen)
X^V start blockwise Visual (vi: no Visual)
X^W window commands, followed by another character (vi: not)
X^X 2 subtract N from number at/after cursor {vi: no ^X}
X^Y scroll N lines downwards
X^Z suspend program (or start new shell)
X^[ <ESC> error
X^\ error
X^] :ta to ident under cursor
X^^ edit Nth alternate file (equivalent to :e #N)
X^_ error
X
X<SPACE> 1 cursor N chars to the right
X!<move><filter> filter Nmove text through the "filter" command
X!!<filter> filter N lines through the "filter" command
X"<a-zA-Z0-9.> use buffer <a-zA-Z0-9.> for next delete, yank or put
X (upper case to append)(<.> only works for put)
X# 1 search backward for the Nth occurrence of the ident under
X the cursor {not in vi}
X$ 1 cursor to the end of line N from the cursor
X% 1 find the next (curly/square) bracket on this line and go
X to its match. With count: go to N percentage in the file.
X& 2 repeat last :s
X'<a-zA-Z> 1 cursor to the first CHAR on the line with mark <a-zA-Z>
X'[ 1 cursor to the first CHAR on the line of the start of
X last operated text or start of putted text
X'] 1 cursor to the first CHAR on the line of the end of
X last operated text or end of putted text
X'' 1 cursor to the first CHAR of the line where the cursor was
X before the latest jump.
X( 1 cursor N sentences backward
X) 1 cursor N sentences forward
X* 1 search forward for the Nth occurrence of the ident under
X the cursor {not in vi}
X+ 1 cursor to the first CHAR N lines lower
X, 1 repeat latest f, t, F or T in opposite direction N times
X- 1 cursor to the first CHAR N lines higher
X. 2 repeat last change with count replaced by N
X/<pattern> 1 search forward for the Nth occurrence of <pattern>
X0 1 cursor to the first char of the line
X1 prepend to command to give a count
X2 "
X3 "
X4 "
X5 "
X6 "
X7 "
X8 "
X9 "
X: Ex command (see below)
X; 1 repeat latest f, t, F or T N times
X<<move> 2 shift the Nmove lines one shiftwidth leftwards
X<< 2 shift N lines one shiftwidth leftwards
X=<move> 2 filter Nmove lines through "indent" (vi: when option
X 'lisp' is set autoindent Nmove lines)
X== 2 filter N lines through "indent"
X><move> 2 shift Nmove lines one shiftwidth rightwards
X>> 2 shift N lines one shiftwidth rightwards
X?<pattern> 1 search backward for the Nth previous occurrence of
X <pattern>
X@<a-z> 2 execute the contents of named buffer <a-z> N times
X@@ 2 repeat the previous @<a-z> N times
XA 2 append text at the end of the line N times
XB 1 cursor N WORDS backward
X<"x>C 2 change from the cursor position to the end of the line,
X and N-1 more lines [into buffer x]; synonym for c$
X<"x>D 2 delete the characters under the cursor until the end of
X the line and N-1 more lines [into buffer x]; synonym for d$
XE 1 cursor forward to the end of WORD N
XF<char> cursor to the Nth occurrence of <char> to the left
XG 1 cursor to line N, default last line
XH 1 cursor to line N from top of screen
XI 2 insert text before the first CHAR on the line N times
XJ 2 Join N lines; default is 2
XK lookup Keyword under the cursor with 'keywordprg'
XL 1 cursor to line N from bottom of screen
XM 1 cursor to middle line of screen
XN 1 repeat the latest '/' or '?' N times in opposite
X direction
XO 2 begin a new line above the cursor and insert text, repeat
X N times (vi: blank N screen lines)
X<"x>P 2 put the text [from buffer x] before the cursor N times
XV start Visual mode on lines (vi: go to Ex mode)
XR 2 enter replace mode: overtype existing characters, repeat the
X entered text N-1 times
X<"x>S 2 delete N lines [into buffer x] and start insert; synonym
X for ^cc or 0cc, depending on autoindent
XT<char> 1 cursor till after Nth occurrence of <char> to the left
XU 2 undo all latest changes on one line (vi: while not moved
X off of it)
X While in Visual mode: make uppercase
XQ<move> 2 Join N lines and re-format them
XW 1 cursor N WORDS forward
X<"x>X 2 delete N characters before the cursor [into buffer x]
X<"x>Y yank N lines [into buffer x]; synonym for yy
XZZ store current file, if modified, and exit
X[[ 1 cursor N sections backward
X[] 1 cursor N SECTIONS backward
X[{ 1 cursor N times back to unmatched '{' (vi: not)
X[( 1 cursor N times back to unmatched '(' (vi: not)
X[f edit file name under the cursor
X[p 2 like "p", but adjust indent to current line
X\ error
X]] 1 cursor N sections forward
X][ 1 cursor N SECTIONS forward
X]} 1 cursor N times forward to unmatched '}' (vi: not)
X]) 1 cursor N times forward to unmatched ')' (vi: not)
X]f edit file name under the cursor
X]p 2 like "P", but adjust indent to current line
X^ 1 cursor to the first CHAR of the line
X_ 1 cursor to the first CHAR N - 1 lines lower
X`<a-zA-Z> 1 cursor to the mark <a-zA-Z>
X`[ 1 cursor to the start of last operated text or start of
X putted text
X`] 1 cursor to the end of last operated text or end of
X putted text
X`` 1 cursor to the position before latest jump
Xa 2 append text after the cursor N times
Xb 1 cursor N words backward
X<"x>c<move> 2 delete Nmove text [into buffer x] and start insert
X<"x>cc 2 delete N lines [into buffer x] and start insert
X<"x>d<move> 2 delete Nmove text [into buffer x]
X<"x>dd 2 delete N lines [into buffer x]
Xe 1 cursor forward to the end of word N
Xf<char> 1 cursor to Nth occurrence of <char> to the right
Xgs goto sleep for N seconds (default 1) (vi: not)
Xgf edit file name under the cursor
Xh 1 cursor N chars to the left
Xi 2 insert text before the cursor N times
Xj 1 cursor N lines downward
Xk 1 cursor N lines upward
Xl 1 cursor N chars to the right
Xm<a-z> set mark <a-z> at cursor position
Xn 1 repeat the latest '/' or '?' N times
Xo 2 begin a new line below the cursor and insert text, repeat
X N times (vi: blank N screen lines)
X While Visual: cursor moves other end
X<"x>p 2 put the text [from buffer x] after the cursor N times
Xv start Visual mode with characters (vi: no Visual)
Xr<char> 2 replace N chars by <char>
X<"x>s 2 (substitute) delete N characters [into buffer x] and
X start insert
Xt<char> 1 cursor till before Nth occurrence of <char> to the right
Xu 2 undo changes (vi: only one level)
X With Visual: make lowercase (vi: no Visual)
Xq<a-zA-Z> record typed characters into named buffer <a-zA-Z>
X (upper case to append)
Xq stops recording (vi: no recording)
Xw 1 cursor N words forward
X<"x>x 2 delete N characters under and after the cursor [into
X buffer x]
X<"x>y<move> yank Nmove text [into buffer x]
X<"x>yy yank N lines [into buffer x]
Xz<CR> redraw, cursor line to top of window, first non-blank
Xz. redraw, cursor line to center of window, first non-blank
Xz- redraw, cursor line at bottom of window, first non-blank
Xzb redraw, cursor line at bottom of window
Xzt redraw, cursor line at top of window
Xzz redraw, cursor line at center of window
X{ 1 cursor N paragraphs backward
X| 1 cursor to column N
X} 1 cursor N paragraphs forward
X~ 2 option notildeop: switch case of N characters under
X cursor and move the cursor N characters to the right
X (vi: no count)
X~<move> option tildeop: switch case of Nmove text (vi: no tildeop
X option)
X<DEL> when entering a number: remove the last digit
X<HELP> show the file vim:vim.hlp page by page (vi: no help)
X<C_UP> 1 move cursor N lines upwards
X<C_DOWN> 1 move cursor N lines downwards
X<C_LEFT> 1 move cursor N chars to the left
X<C_RIGHT> 1 move cursor N chars to the right
X<SC_UP> 1 scroll N screens Backwards (same as ^B)
X<SC_DOWN> 1 scroll N screens Forwards (same as ^F)
X<SC_LEFT> 1 cursor N words backward (same as b)
X<SC_RIGHT> 1 cursor N words forward (same as w)
X
X
X3. command line editing
X=======================
X
XGet to the command line with the ':', '!', '/' or '?' commands.
XNormal characters are inserted at the current cursor position.
X(vi: can only alter last character in the line)
X
X^A do filename completion on the pattern in front of the cursor
X and insert all matches
X^B cursor to begin of command line
X^D list filenames that match the pattern in front of the cursor
X^E cursor to end of command line
X^H delete the character in front of the cursor
X^L do filename completion on the pattern in front of the cursor
X and insert the longest common part
X^N after an <ESC> with multiple matches: go to next match
X otherwise: same as <C_DOWN>
X^P after an <ESC> with multiple matches: go to previous match
X otherwise: same as <C_UP>
X^U remove all characters
X^V insert next non-digit literally, insert three digit decimal
X number as a single byte. {Vi: type the CTRL-V twice to get one}
X^W delete the word in front of the cursor
X'wildchar' option (default <TAB>)
X do filename completion on the pattern in front of the cursor
X<DEL> delete the character under the cursor
X<C_UP> recall previous command line from history
X<C_DOWN> recall next command line from history
X<C_LEFT> cursor left
X<C_RIGHT> cursor right
X<SC_LEFT> cursor one word left
X<SC_RIGHT> cursor one word right
X<SC_UP> recall previous command line that matches pattern in front of
X the cursor
X<SC_DOWN> recall next command line that matches pattern in front of the
X cursor
X
X
X4. EX commands
X==============
X
XFor an index of EX commands, type CTRL-D at the ex command prompt.
XOr look in "src/cmdtab.tab".
X
END_OF_FILE
if test 12449 -ne `wc -c <'vim/doc/index'`; then
echo shar: \"'vim/doc/index'\" unpacked with wrong size!
fi
# end of 'vim/doc/index'
fi
if test -f 'vim/src/cmdcmds.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'vim/src/cmdcmds.c'\"
else
echo shar: Extracting \"'vim/src/cmdcmds.c'\" \(11550 characters\)
sed "s/^X//" >'vim/src/cmdcmds.c' <<'END_OF_FILE'
X/* vi:ts=4:sw=4
X *
X * VIM - Vi IMproved by Bram Moolenaar
X *
X * Read the file "credits.txt" for a list of people who contributed.
X * Read the file "uganda.txt" for copying and usage conditions.
X */
X
X/*
X * cmdcmds.c: functions for command line commands
X */
X
X#include "vim.h"
X#include "globals.h"
X#include "proto.h"
X#include "param.h"
X
X#if defined(LATTICE) || defined(NT)
X# define mktemp(a) tmpnam(a)
X#endif
X
Xextern char *mktemp __ARGS((char *));
X
X/*
X * align text:
X * type = -1 left aligned
X * type = 0 centered
X * type = 1 right aligned
X */
X void
Xdo_align(start, end, width, type)
X linenr_t start;
X linenr_t end;
X int width;
X int type;
X{
X FPOS pos;
X int len;
X int indent = 0;
X
X pos = curwin->w_cursor;
X if (type == -1) /* left align: width is used for new indent */
X {
X if (width >= 0)
X indent = width;
X }
X else
X {
X /*
X * if 'textwidth' set, use it
X * else if 'wrapmargin' set, use it
X * if invalid value, use 80
X */
X if (width <= 0)
X width = curbuf->b_p_tw;
X if (width == 0 && curbuf->b_p_wm > 0)
X width = Columns - curbuf->b_p_wm;
X if (width <= 0)
X width = 80;
X }
X
X if (!u_save((linenr_t)(start - 1), (linenr_t)(end + 1)))
X return;
X for (curwin->w_cursor.lnum = start; curwin->w_cursor.lnum <= end; ++curwin->w_cursor.lnum)
X {
X set_indent(indent, TRUE); /* remove existing indent */
X if (type == -1) /* left align */
X continue;
X len = strsize(ml_get(curwin->w_cursor.lnum)); /* get line lenght */
X if (len < width)
X switch (type)
X {
X case 0: set_indent((width - len) / 2, FALSE); /* center */
X break;
X case 1: set_indent(width - len, FALSE); /* right */
X break;
X }
X }
X curwin->w_cursor = pos;
X beginline(TRUE);
X updateScreen(NOT_VALID);
X}
X
X/*
X * :move command - move lines line1-line2 to line n
X *
X * return FAIL for failure, OK otherwise
X */
X int
Xdo_move(line1, line2, n)
X linenr_t line1;
X linenr_t line2;
X linenr_t n;
X{
X char_u *q;
X int has_mark;
X
X if (n >= line1 && n < line2 && line2 > line1)
X {
X EMSG("Move lines into themselves");
X return FAIL;
X }
X
X /*
X * adjust line marks (global marks done below)
X * if the lines are moved down, the marks in the moved lines
X * move down and the marks in the lines between the old and
X * new position move up.
X * If the lines are moved up it is just the other way round
X */
X if (n >= line2) /* move down */
X {
X mark_adjust(line1, line2, n - line2);
X mark_adjust(line2 + 1, n, -(line2 - line1 + 1));
X }
X else /* move up */
X {
X mark_adjust(line1, line2, -(line1 - n - 1));
X mark_adjust(n + 1, line1 - 1, line2 - line1 + 1);
X }
X
X if (n >= line1)
X {
X --n;
X curwin->w_cursor.lnum = n - (line2 - line1) + 1;
X }
X else
X curwin->w_cursor.lnum = n + 1;
X while (line1 <= line2)
X {
X /* this undo is not efficient, but it works */
X u_save(line1 - 1, line1 + 1);
X q = strsave(ml_get(line1));
X if (q != NULL)
X {
X /*
X * marks from global command go with the line
X */
X has_mark = ml_has_mark(line1);
X ml_delete(line1);
X u_save(n, n + 1);
X ml_append(n, q, (colnr_t)0, FALSE);
X free(q);
X if (has_mark)
X ml_setmarked(n + 1);
X }
X if (n < line1)
X {
X ++n;
X ++line1;
X }
X else
X --line2;
X }
X CHANGED;
X return OK;
X}
X
X/*
X * :copy command - copy lines line1-line2 to line n
X */
X void
Xdo_copy(line1, line2, n)
X linenr_t line1;
X linenr_t line2;
X linenr_t n;
X{
X linenr_t lnum;
X char_u *p;
X
X mark_adjust(n + 1, MAXLNUM, line2 - line1 + 1);
X
X /*
X * there are three situations:
X * 1. destination is above line1
X * 2. destination is between line1 and line2
X * 3. destination is below line2
X *
X * n = destination (when starting)
X * curwin->w_cursor.lnum = destination (while copying)
X * line1 = start of source (while copying)
X * line2 = end of source (while copying)
X */
X u_save(n, n + 1);
X curwin->w_cursor.lnum = n;
X lnum = line2 - line1 + 1;
X while (line1 <= line2)
X {
X /* need to use strsave() because the line will be unlocked
X within ml_append */
X p = strsave(ml_get(line1));
X if (p != NULL)
X {
X ml_append(curwin->w_cursor.lnum, p, (colnr_t)0, FALSE);
X free(p);
X }
X /* situation 2: skip already copied lines */
X if (line1 == n)
X line1 = curwin->w_cursor.lnum;
X ++line1;
X if (curwin->w_cursor.lnum < line1)
X ++line1;
X if (curwin->w_cursor.lnum < line2)
X ++line2;
X ++curwin->w_cursor.lnum;
X }
X CHANGED;
X msgmore((long)lnum);
X}
X
X/*
X * handle the :! command.
X * We replace the extra bangs by the previously entered command and remember
X * the command.
X */
X void
Xdobang(addr_count, line1, line2, forceit, arg)
X int addr_count;
X linenr_t line1, line2;
X int forceit;
X char_u *arg;
X{
X static char_u *prevcmd = NULL; /* the previous command */
X char_u *t;
X char_u *trailarg;
X int len;
X
X /*
X * Disallow shell commands from .exrc and .vimrc in current directory for
X * security reasons.
X */
X if (secure)
X {
X secure = 2;
X emsg(e_curdir);
X return;
X }
X len = STRLEN(arg) + 1;
X
X autowrite_all();
X /*
X * try to find an embedded bang, like in :!<cmd> ! [args]
X * (:!! is indicated by the 'forceit' variable)
X */
X trailarg = arg;
X skiptospace(&trailarg);
X skipspace(&trailarg);
X if (*trailarg == '!')
X *trailarg++ = NUL;
X else
X trailarg = NULL;
X
X if (forceit || trailarg != NULL) /* use the previous command */
X {
X if (prevcmd == NULL)
X {
X emsg(e_noprev);
X return;
X }
X len += STRLEN(prevcmd) * (trailarg != NULL && forceit ? 2 : 1);
X }
X
X if (len > CMDBUFFSIZE)
X {
X emsg(e_toolong);
X return;
X }
X if ((t = alloc(len)) == NULL)
X return;
X *t = NUL;
X if (forceit)
X STRCPY(t, prevcmd);
X STRCAT(t, arg);
X if (trailarg != NULL)
X {
X STRCAT(t, prevcmd);
X STRCAT(t, trailarg);
X }
X free(prevcmd);
X prevcmd = t;
X
X if (bangredo) /* put cmd in redo buffer for ! command */
X {
X AppendToRedobuff(prevcmd);
X AppendToRedobuff((char_u *)"\n");
X bangredo = FALSE;
X }
X /* echo the command */
X msg_start();
X msg_outchar(':');
X if (addr_count) /* :range! */
X {
X msg_outnum((long)line1);
X msg_outchar(',');
X msg_outnum((long)line2);
X }
X msg_outchar('!');
X msg_outtrans(prevcmd, -1);
X msg_ceol();
X
X if (addr_count == 0) /* :! */
X doshell(prevcmd);
X else /* :range! */
X dofilter(line1, line2, prevcmd, TRUE, TRUE);
X}
X
X/*
X * call a shell to execute a command
X */
X void
Xdoshell(cmd)
X char_u *cmd;
X{
X BUF *buf;
X
X /*
X * Disallow shell commands from .exrc and .vimrc in current directory for
X * security reasons.
X */
X if (secure)
X {
X secure = 2;
X emsg(e_curdir);
X msg_end();
X return;
X }
X stoptermcap();
X msg_outchar('\n'); /* may shift screen one line up */
X
X /* warning message before calling the shell */
X if (p_warn)
X for (buf = firstbuf; buf; buf = buf->b_next)
X if (buf->b_changed)
X {
X msg_outstr((char_u *)"[No write since last change]\n");
X break;
X }
X
X windgoto((int)Rows - 1, 0);
X cursor_on();
X (void)call_shell(cmd, 0, TRUE);
X
X#ifdef AMIGA
X wait_return(term_console ? -1 : TRUE); /* see below */
X#else
X wait_return(TRUE); /* includes starttermcap() */
X#endif
X
X /*
X * In an Amiga window redrawing is caused by asking the window size.
X * If we got an interrupt this will not work. The chance that the window
X * size is wrong is very small, but we need to redraw the screen.
X * Don't do this if ':' hit in wait_return().
X * THIS IS UGLY but it save an extra redraw.
X */
X#ifdef AMIGA
X if (skip_redraw) /* ':' hit in wait_return() */
X must_redraw = CLEAR;
X else if (term_console)
X {
X OUTSTR("\033[0 q"); /* get window size */
X if (got_int)
X must_redraw = CLEAR; /* if got_int is TRUE we have to redraw */
X else
X must_redraw = 0; /* no extra redraw needed */
X }
X#endif /* AMIGA */
X}
X
X/*
X * dofilter: filter lines through a command given by the user
X *
X * We use temp files and the call_shell() routine here. This would normally
X * be done using pipes on a UNIX machine, but this is more portable to
X * the machines we usually run on. The call_shell() routine needs to be able
X * to deal with redirection somehow, and should handle things like looking
X * at the PATH env. variable, and adding reasonable extensions to the
X * command name given by the user. All reasonable versions of call_shell()
X * do this.
X * We use input redirection if do_in is TRUE.
X * We use output redirection if do_out is TRUE.
X */
X void
Xdofilter(line1, line2, buff, do_in, do_out)
X linenr_t line1, line2;
X char_u *buff;
X int do_in, do_out;
X{
X#ifdef LATTICE
X char_u itmp[L_tmpnam]; /* use tmpnam() */
X char_u otmp[L_tmpnam];
X#else
X char_u itmp[TMPNAMELEN];
X char_u otmp[TMPNAMELEN];
X#endif
X linenr_t linecount;
X
X /*
X * Disallow shell commands from .exrc and .vimrc in current directory for
X * security reasons.
X */
X if (secure)
X {
X secure = 2;
X emsg(e_curdir);
X return;
X }
X if (*buff == NUL) /* no filter command */
X return;
X linecount = line2 - line1 + 1;
X curwin->w_cursor.lnum = line1;
X curwin->w_cursor.col = 0;
X /* cursupdate(); */
X
X /*
X * 1. Form temp file names
X * 2. Write the lines to a temp file
X * 3. Run the filter command on the temp file
X * 4. Read the output of the command into the buffer
X * 5. Delete the original lines to be filtered
X * 6. Remove the temp files
X */
X
X#ifndef LATTICE
X /* for lattice we use tmpnam(), which will make its own name */
X STRCPY(itmp, TMPNAME1);
X STRCPY(otmp, TMPNAME2);
X#endif
X
X if ((do_in && *mktemp((char *)itmp) == NUL) || (do_out && *mktemp((char *)otmp) == NUL))
X {
X emsg(e_notmp);
X return;
X }
X
X/*
X * ! command will be overwritten by next mesages
X * This is a trade off between showing the command and not scrolling the
X * text one line up (problem on slow terminals).
X */
X must_redraw = CLEAR; /* screen has been shifted up one line */
X ++no_wait_return; /* don't call wait_return() while busy */
X if (do_in && buf_write(curbuf, itmp, NULL, line1, line2, FALSE, 0, FALSE) == FAIL)
X {
X msg_outchar('\n'); /* keep message from writeit() */
X --no_wait_return;
X (void)emsg2(e_notcreate, itmp); /* will call wait_return */
X return;
X }
X if (!do_out)
X outchar('\n');
X
X#if defined(UNIX) && !defined(ARCHIE)
X/*
X * put braces around the command (for concatenated commands)
X */
X sprintf((char *)IObuff, "(%s)", (char *)buff);
X if (do_in)
X {
X STRCAT(IObuff, " < ");
X STRCAT(IObuff, itmp);
X }
X if (do_out)
X {
X STRCAT(IObuff, " > ");
X STRCAT(IObuff, otmp);
X }
X#else
X/*
X * for shells that don't understand braces around commands, at least allow
X * the use of commands in a pipe.
X */
X STRCPY(IObuff, buff);
X if (do_in)
X {
X char_u *p;
X /*
X * If there is a pipe, we have to put the '<' in front of it
X */
X p = STRCHR(IObuff, '|');
X if (p)
X *p = NUL;
X STRCAT(IObuff, " < ");
X STRCAT(IObuff, itmp);
X p = STRCHR(buff, '|');
X if (p)
X STRCAT(IObuff, p);
X }
X if (do_out)
X {
X STRCAT(IObuff, " > ");
X STRCAT(IObuff, otmp);
X }
X#endif
X
X windgoto((int)Rows - 1, 0);
X cursor_on();
X /* errors are ignored, so you can see the error
X messages from the command; use 'u' to fix the text */
X (void)call_shell(IObuff, 1, FALSE);
X
X if (do_out)
X {
X if (!u_save((linenr_t)(line2), (linenr_t)(line2 + 1)))
X {
X linecount = 0;
X goto error;
X }
X if (readfile(otmp, NULL, line2, FALSE, (linenr_t)0, MAXLNUM) == FAIL)
X {
X outchar('\n');
X emsg2(e_notread, otmp);
X linecount = 0;
X goto error;
X }
X
X if (do_in)
X {
X curwin->w_cursor.lnum = line1;
X dellines(linecount, TRUE, TRUE);
X }
X --no_wait_return;
X }
X else
X {
Xerror:
X --no_wait_return;
X wait_return(FALSE);
X }
X updateScreen(CLEAR); /* do this before messages below */
X
X if (linecount > p_report)
X {
X if (!do_in && do_out)
X msgmore(linecount);
X else
X smsg((char_u *)"%ld lines filtered", (long)linecount);
X }
X remove((char *)itmp);
X remove((char *)otmp);
X}
END_OF_FILE
if test 11550 -ne `wc -c <'vim/src/cmdcmds.c'`; then
echo shar: \"'vim/src/cmdcmds.c'\" unpacked with wrong size!
fi
# end of 'vim/src/cmdcmds.c'
fi
if test -f 'vim/src/cmdtab.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'vim/src/cmdtab.h'\"
else
echo shar: Extracting \"'vim/src/cmdtab.h'\" \(11638 characters\)
sed "s/^X//" >'vim/src/cmdtab.h' <<'END_OF_FILE'
X/* vi:ts=4
X *
X * VIM - Vi IMproved
X *
X * Code Contributions By: Bram Moolenaar mool@oce.nl
X * Tim Thompson twitch!tjt
X * Tony Andrews onecom!wldrdg!tony
X * G. R. (Fred) Walter watmath!watcgl!grwalter
X */
X
X/*
X * THIS FILE IS AUTOMATICALLY PRODUCED - DO NOT EDIT
X */
X
X#define RANGE 0x01 /* allow a linespecs */
X#define BANG 0x02 /* allow a ! after the command name */
X#define EXTRA 0x04 /* allow extra args after command name */
X#define XFILE 0x08 /* expand wildcards in extra part */
X#define NOSPC 0x10 /* no spaces allowed in the extra part */
X#define DFLALL 0x20 /* default file range is 1,$ */
X#define NODFL 0x40 /* do not default to the current file name */
X#define NEEDARG 0x80 /* argument required */
X#define TRLBAR 0x100 /* check for trailing vertical bar */
X#define REGSTR 0x200 /* allow "x for register designation */
X#define COUNT 0x400 /* allow count in argument, after command */
X#define NOTRLCOM 0x800 /* no trailing comment allowed */
X#define ZEROR 0x1000 /* zero line number allowed */
X#define USECTRLV 0x2000 /* do not remove CTRL-V from argument */
X#define NOTADR 0x4000 /* number before command is not an address */
X#define FILES (XFILE + EXTRA) /* multiple extra files allowed */
X#define WORD1 (EXTRA + NOSPC) /* one extra word allowed */
X#define FILE1 (FILES + NOSPC) /* 1 file allowed, defaults to current file */
X#define NAMEDF (FILE1 + NODFL) /* 1 file allowed, defaults to "" */
X#define NAMEDFS (FILES + NODFL) /* multiple files allowed, default is "" */
X
X/*
X * This array maps ex command names to command codes. The order in which
X * command names are listed below is significant -- ambiguous abbreviations
X * are always resolved to be the first possible match (e.g. "r" is taken
X * to mean "read", not "rewind", because "read" comes before "rewind").
X * Not supported commands are included to avoid ambiguities.
X */
Xstatic struct
X{
X char_u *cmd_name; /* name of the command */
X short cmd_argt; /* command line arguments permitted/needed/used */
X} cmdnames[] =
X{
X {(char_u *)"append", BANG+RANGE+TRLBAR}, /* not supported */
X#define CMD_append 0
X {(char_u *)"all", TRLBAR},
X#define CMD_all 1
X {(char_u *)"abbreviate", EXTRA+TRLBAR+NOTRLCOM+USECTRLV},
X#define CMD_abbreviate 2
X {(char_u *)"args", RANGE+NOTADR+BANG+NAMEDFS},
X#define CMD_args 3
X {(char_u *)"argument", BANG+RANGE+NOTADR+COUNT+EXTRA},
X#define CMD_argument 4
X {(char_u *)"buffer", RANGE+NOTADR+COUNT+TRLBAR},
X#define CMD_buffer 5
X {(char_u *)"ball", TRLBAR},
X#define CMD_ball 6
X {(char_u *)"buffers", TRLBAR},
X#define CMD_buffers 7
X {(char_u *)"bdelete", BANG+RANGE+NOTADR+COUNT+EXTRA+TRLBAR},
X#define CMD_bdelete 8
X {(char_u *)"bunload", BANG+RANGE+NOTADR+COUNT+EXTRA+TRLBAR},
X#define CMD_bunload 9
X {(char_u *)"bmodified", RANGE+NOTADR+COUNT+TRLBAR},
X#define CMD_bmodified 10
X {(char_u *)"bnext", RANGE+NOTADR+COUNT+TRLBAR},
X#define CMD_bnext 11
X {(char_u *)"bNext", RANGE+NOTADR+COUNT+TRLBAR},
X#define CMD_bNext 12
X {(char_u *)"bprevious", RANGE+NOTADR+COUNT+TRLBAR},
X#define CMD_bprevious 13
X {(char_u *)"brewind", RANGE+TRLBAR},
X#define CMD_brewind 14
X {(char_u *)"blast", RANGE+TRLBAR},
X#define CMD_blast 15
X {(char_u *)"change", BANG+RANGE+COUNT+TRLBAR}, /* not supported */
X#define CMD_change 16
X {(char_u *)"cabbrev", EXTRA+TRLBAR+NOTRLCOM+USECTRLV},
X#define CMD_cabbrev 17
X {(char_u *)"cc", TRLBAR+WORD1+BANG},
X#define CMD_cc 18
X {(char_u *)"cd", NAMEDF+TRLBAR},
X#define CMD_cd 19
X {(char_u *)"center", TRLBAR+RANGE+EXTRA},
X#define CMD_center 20
X {(char_u *)"cf", TRLBAR+FILE1+BANG},
X#define CMD_cf 21
X {(char_u *)"chdir", NAMEDF+TRLBAR},
X#define CMD_chdir 22
X {(char_u *)"cl", TRLBAR},
X#define CMD_cl 23
X {(char_u *)"close", BANG+TRLBAR},
X#define CMD_close 24
X {(char_u *)"cmap", BANG+EXTRA+TRLBAR+NOTRLCOM+USECTRLV},
X#define CMD_cmap 25
X {(char_u *)"cn", TRLBAR+WORD1+BANG},
X#define CMD_cn 26
X {(char_u *)"cnoremap", BANG+EXTRA+TRLBAR+NOTRLCOM+USECTRLV},
X#define CMD_cnoremap 27
X {(char_u *)"cnoreabbrev", EXTRA+TRLBAR+NOTRLCOM+USECTRLV},
X#define CMD_cnoreabbrev 28
X {(char_u *)"copy", RANGE+EXTRA+TRLBAR},
X#define CMD_copy 29
X {(char_u *)"cp", TRLBAR+WORD1+BANG},
X#define CMD_cp 30
X {(char_u *)"cq", TRLBAR+BANG},
X#define CMD_cq 31
X {(char_u *)"cunmap", BANG+EXTRA+TRLBAR+USECTRLV},
X#define CMD_cunmap 32
X {(char_u *)"cunabbrev", EXTRA+TRLBAR+USECTRLV},
X#define CMD_cunabbrev 33
X {(char_u *)"delete", RANGE+REGSTR+COUNT+TRLBAR},
X#define CMD_delete 34
X {(char_u *)"display", TRLBAR},
X#define CMD_display 35
X {(char_u *)"digraphs", EXTRA+TRLBAR},
X#define CMD_digraphs 36
X {(char_u *)"edit", BANG+FILE1},
X#define CMD_edit 37
X {(char_u *)"ex", BANG+FILE1},
X#define CMD_ex 38
X {(char_u *)"exit", BANG+FILE1+DFLALL+TRLBAR},
X#define CMD_exit 39
X {(char_u *)"file", FILE1+TRLBAR},
X#define CMD_file 40
X {(char_u *)"files", TRLBAR},
X#define CMD_files 41
X {(char_u *)"global", RANGE+BANG+EXTRA+DFLALL},
X#define CMD_global 42
X {(char_u *)"help", TRLBAR},
X#define CMD_help 43
X {(char_u *)"insert", BANG+RANGE+TRLBAR}, /* not supported */
X#define CMD_insert 44
X {(char_u *)"iabbrev", EXTRA+TRLBAR+NOTRLCOM+USECTRLV},
X#define CMD_iabbrev 45
X {(char_u *)"imap", BANG+EXTRA+TRLBAR+NOTRLCOM+USECTRLV},
X#define CMD_imap 46
X {(char_u *)"inoremap", BANG+EXTRA+TRLBAR+NOTRLCOM+USECTRLV},
X#define CMD_inoremap 47
X {(char_u *)"inoreabbrev", EXTRA+TRLBAR+NOTRLCOM+USECTRLV},
X#define CMD_inoreabbrev 48
X {(char_u *)"iunmap", BANG+EXTRA+TRLBAR+USECTRLV},
X#define CMD_iunmap 49
X {(char_u *)"iunabbrev", EXTRA+TRLBAR+USECTRLV},
X#define CMD_iunabbrev 50
X {(char_u *)"join", RANGE+COUNT+TRLBAR},
X#define CMD_join 51
X {(char_u *)"jumps", TRLBAR},
X#define CMD_jumps 52
X {(char_u *)"k", RANGE+WORD1+TRLBAR},
X#define CMD_k 53
X {(char_u *)"list", RANGE+COUNT+TRLBAR},
X#define CMD_list 54
X {(char_u *)"last", EXTRA+BANG},
X#define CMD_last 55
X {(char_u *)"left", TRLBAR+RANGE+EXTRA},
X#define CMD_left 56
X {(char_u *)"move", RANGE+EXTRA+TRLBAR},
X#define CMD_move 57
X {(char_u *)"mark", RANGE+WORD1+TRLBAR},
X#define CMD_mark 58
X {(char_u *)"marks", TRLBAR},
X#define CMD_marks 59
X {(char_u *)"map", BANG+EXTRA+TRLBAR+NOTRLCOM+USECTRLV},
X#define CMD_map 60
X {(char_u *)"make", NEEDARG+EXTRA+TRLBAR+XFILE},
X#define CMD_make 61
X {(char_u *)"mkexrc", BANG+FILE1+TRLBAR},
X#define CMD_mkexrc 62
X {(char_u *)"mkvimrc", BANG+FILE1+TRLBAR},
X#define CMD_mkvimrc 63
X {(char_u *)"mfstat", TRLBAR}, /* for debugging */
X#define CMD_mfstat 64
X {(char_u *)"mode", WORD1+TRLBAR},
X#define CMD_mode 65
X {(char_u *)"next", RANGE+NOTADR+BANG+NAMEDFS},
X#define CMD_next 66
X {(char_u *)"new", BANG+FILE1+RANGE+NOTADR},
X#define CMD_new 67
X {(char_u *)"number", RANGE+COUNT+TRLBAR},
X#define CMD_number 68
X {(char_u *)"#", RANGE+COUNT+TRLBAR},
X#define CMD_pound 69
X {(char_u *)"noremap", BANG+EXTRA+TRLBAR+NOTRLCOM+USECTRLV},
X#define CMD_noremap 70
X {(char_u *)"noreabbrev", EXTRA+TRLBAR+NOTRLCOM+USECTRLV},
X#define CMD_noreabbrev 71
X {(char_u *)"Next", EXTRA+RANGE+NOTADR+COUNT+BANG},
X#define CMD_Next 72
X {(char_u *)"only", BANG+TRLBAR},
X#define CMD_only 73
X {(char_u *)"print", RANGE+COUNT+TRLBAR},
X#define CMD_print 74
X {(char_u *)"pop", RANGE+NOTADR+COUNT+TRLBAR+ZEROR},
X#define CMD_pop 75
X {(char_u *)"put", RANGE+BANG+REGSTR+TRLBAR},
X#define CMD_put 76
X {(char_u *)"preserve", TRLBAR},
X#define CMD_preserve 77
X {(char_u *)"previous", EXTRA+RANGE+NOTADR+COUNT+BANG},
X#define CMD_previous 78
X {(char_u *)"pwd", TRLBAR},
X#define CMD_pwd 79
X {(char_u *)"quit", BANG+TRLBAR},
X#define CMD_quit 80
X {(char_u *)"qall", BANG+TRLBAR},
X#define CMD_qall 81
X {(char_u *)"read", RANGE+NAMEDF+TRLBAR+ZEROR},
X#define CMD_read 82
X {(char_u *)"rewind", EXTRA+BANG},
X#define CMD_rewind 83
X {(char_u *)"recover", FILE1+TRLBAR}, /* not supported */
X#define CMD_recover 84
X {(char_u *)"redo", TRLBAR},
X#define CMD_redo 85
X {(char_u *)"right", TRLBAR+RANGE+EXTRA},
X#define CMD_right 86
X {(char_u *)"resize", TRLBAR+WORD1},
X#define CMD_resize 87
X {(char_u *)"substitute", RANGE+EXTRA},
X#define CMD_substitute 88
X {(char_u *)"sargument", BANG+RANGE+NOTADR+COUNT+EXTRA},
X#define CMD_sargument 89
X {(char_u *)"sall", TRLBAR},
X#define CMD_sall 90
X {(char_u *)"sbuffer", RANGE+NOTADR+COUNT+TRLBAR},
X#define CMD_sbuffer 91
X {(char_u *)"sball", TRLBAR},
X#define CMD_sball 92
X {(char_u *)"sbmodified", RANGE+NOTADR+COUNT+TRLBAR},
X#define CMD_sbmodified 93
X {(char_u *)"sbnext", RANGE+NOTADR+COUNT+TRLBAR},
X#define CMD_sbnext 94
X {(char_u *)"sbNext", RANGE+NOTADR+COUNT+TRLBAR},
X#define CMD_sbNext 95
X {(char_u *)"sbprevious", RANGE+NOTADR+COUNT+TRLBAR},
X#define CMD_sbprevious 96
X {(char_u *)"sbrewind", TRLBAR},
X#define CMD_sbrewind 97
X {(char_u *)"sblast", TRLBAR},
X#define CMD_sblast 98
X {(char_u *)"suspend", TRLBAR+BANG},
X#define CMD_suspend 99
X {(char_u *)"set", EXTRA+TRLBAR},
X#define CMD_set 100
X {(char_u *)"setkeymap", NAMEDF+TRLBAR},
X#define CMD_setkeymap 101
X {(char_u *)"shell", TRLBAR},
X#define CMD_shell 102
X {(char_u *)"sleep", RANGE+COUNT+NOTADR+TRLBAR},
X#define CMD_sleep 103
X {(char_u *)"source", NAMEDF+NEEDARG+TRLBAR},
X#define CMD_source 104
X {(char_u *)"split", BANG+FILE1+RANGE+NOTADR},
X#define CMD_split 105
X {(char_u *)"snext", RANGE+NOTADR+BANG+NAMEDFS},
X#define CMD_snext 106
X {(char_u *)"sNext", EXTRA+RANGE+NOTADR+COUNT+BANG},
X#define CMD_sNext 107
X {(char_u *)"sprevious", EXTRA+RANGE+NOTADR+COUNT+BANG},
X#define CMD_sprevious 108
X {(char_u *)"srewind", EXTRA+BANG},
X#define CMD_srewind 109
X {(char_u *)"slast", EXTRA+BANG},
X#define CMD_slast 110
X {(char_u *)"stop", TRLBAR+BANG},
X#define CMD_stop 111
X {(char_u *)"sunhide", TRLBAR},
X#define CMD_sunhide 112
X {(char_u *)"swapname", TRLBAR},
X#define CMD_swapname 113
X {(char_u *)"t", RANGE+EXTRA+TRLBAR},
X#define CMD_t 114
X {(char_u *)"tag", RANGE+NOTADR+COUNT+BANG+WORD1+TRLBAR+ZEROR},
X#define CMD_tag 115
X {(char_u *)"tags", TRLBAR},
X#define CMD_tags 116
X {(char_u *)"unabbreviate", EXTRA+TRLBAR+USECTRLV},
X#define CMD_unabbreviate 117
X {(char_u *)"undo", TRLBAR},
X#define CMD_undo 118
X {(char_u *)"unhide", TRLBAR},
X#define CMD_unhide 119
X {(char_u *)"unmap", BANG+EXTRA+TRLBAR+USECTRLV},
X#define CMD_unmap 120
X {(char_u *)"vglobal", RANGE+EXTRA+DFLALL},
X#define CMD_vglobal 121
X {(char_u *)"version", TRLBAR},
X#define CMD_version 122
X {(char_u *)"visual", RANGE+BANG+FILE1},
X#define CMD_visual 123
X {(char_u *)"write", RANGE+BANG+FILE1+DFLALL+TRLBAR},
X#define CMD_write 124
X {(char_u *)"wnext", RANGE+NOTADR+BANG+FILE1+TRLBAR},
X#define CMD_wnext 125
X {(char_u *)"wNext", RANGE+NOTADR+BANG+FILE1+TRLBAR},
X#define CMD_wNext 126
X {(char_u *)"wprevious", RANGE+NOTADR+BANG+FILE1+TRLBAR},
X#define CMD_wprevious 127
X {(char_u *)"winsize", EXTRA+NEEDARG+TRLBAR},
X#define CMD_winsize 128
X {(char_u *)"wq", BANG+FILE1+DFLALL+TRLBAR},
X#define CMD_wq 129
X {(char_u *)"wall", BANG+TRLBAR},
X#define CMD_wall 130
X {(char_u *)"wqall", BANG+FILE1+DFLALL+TRLBAR},
X#define CMD_wqall 131
X {(char_u *)"xit", BANG+FILE1+DFLALL+TRLBAR},
X#define CMD_xit 132
X {(char_u *)"xall", BANG+TRLBAR},
X#define CMD_xall 133
X {(char_u *)"yank", RANGE+REGSTR+COUNT+TRLBAR},
X#define CMD_yank 134
X {(char_u *)"z", RANGE+COUNT+TRLBAR}, /* not supported */
X#define CMD_z 135
X {(char_u *)"@", RANGE+EXTRA+TRLBAR},
X#define CMD_at 136
X {(char_u *)"!", RANGE+NAMEDFS},
X#define CMD_bang 137
X {(char_u *)"<", RANGE+COUNT+TRLBAR},
X#define CMD_lshift 138
X {(char_u *)">", RANGE+COUNT+TRLBAR},
X#define CMD_rshift 139
X {(char_u *)"=", RANGE+TRLBAR},
X#define CMD_equal 140
X {(char_u *)"&", RANGE+EXTRA},
X#define CMD_and 141
X {(char_u *)"~", RANGE+EXTRA}
X#define CMD_tilde 142
X#define CMD_SIZE 143
X
X};
END_OF_FILE
if test 11638 -ne `wc -c <'vim/src/cmdtab.h'`; then
echo shar: \"'vim/src/cmdtab.h'\" unpacked with wrong size!
fi
# end of 'vim/src/cmdtab.h'
fi
if test -f 'vim/src/digraph.c.UU' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'vim/src/digraph.c.UU'\"
else
echo shar: Extracting \"'vim/src/digraph.c.UU'\" \(11504 characters\)
sed "s/^X//" >'vim/src/digraph.c.UU' <<'END_OF_FILE'
Xbegin 644 vim/src/digraph.c
XM+RH@=FDZ=',]-#IS=STT"B J"B J(%9)32 M(%9I($E-<')O=F5D"0EB>2!"
XM<F%M($UO;VQE;F%A<@H@*@H@*B!296%D('1H92!F:6QE(")C<F5D:71S+G1X
XM="(@9F]R(&$@;&ES="!O9B!P96]P;&4@=VAO(&-O;G1R:6)U=&5D+@H@*B!2
XM96%D('1H92!F:6QE(")U9V%N9&$N='AT(B!F;W(@8V]P>6EN9R!A;F0@=7-A
XM9V4@8V]N9&ET:6]N<RX*("HO"@HC:69D968@1$E'4D%02%,*+RH*("H@9&EG
XM<F%P:"YC.B!C;V1E(&9O<B!D:6=R87!H<PH@*B\*"B-I;F-L=61E(")V:6TN
XM:"(*(VEN8VQU9&4@(F=L;V)A;',N:"(*(VEN8VQU9&4@(G!R;W1O+F@B"B-I
XM;F-L=61E(")P87)A;2YH(@H*<W1A=&EC('9O:60@<')I;G1D:6=R87!H(%]?
XM05)'4R@H8VAA<E]U("HI*3L*"F-H87)?=0DH*F1I9W)A<&AN97<I6S-=.PD)
XM"2\J('!O:6YT97(@=&\@861D960@9&EG<F%P:',@*B\*:6YT"0ED:6=R87!H
XM8V]U;G0@/2 P.PD)"2\J(&YU;6)E<B!O9B!A9&1E9"!D:6=R87!H<R J+PH*
XM(VEF9&5F($U31$]3"F-H87)?=0ED:6=R87!H9&5F875L=%M=6S-=(#T@"0DO
XM*B!S=&%N9&%R9"!-4T1/4R!D:6=R87!H<R J+PH)(" @>WLG0R<L("<L)RP@
XM,3(X?2P)+RH@@" J+PH)"7LG=2<L("<B)RP@,3(Y?2P)+RH@@2 J+PH)"7LG
XM92<L("=<)R<L(#$S,'TL"2\J(((@*B\*"0E[)V$G+" G7B<L(#$S,7TL"2\J
XM((,@*B\*"0E[)V$G+" G(B<L(#$S,GTL"2\J((0@*B\*"0E[)V$G+" G8"<L
XM(#$S,WTL"2\J((4@*B\*"0E[)V$G+" G0"<L(#$S-'TL"2\J((8@*B\*"0E[
XM)V,G+" G+"<L(#$S-7TL"2\J('Y'("A305,@0R!C86XG="!H86YD;&4@=&AE
XM(')E86P@8VAA<BD@*B\*"0E[)V4G+" G7B<L(#$S-GTL"2\J('Y(("A305,@
XM0R!C86XG="!H86YD;&4@=&AE(')E86P@8VAA<BD@*B\*"0E[)V4G+" G(B<L
XM(#$S-WTL"2\J((D@*B\*"0E[)V4G+" G8"<L(#$S.'TL"2\J((H@*B\*"0E[
XM)VDG+" G(B<L(#$S.7TL"2\J((L@*B\*"0E[)VDG+" G7B<L(#$T,'TL"2\J
XM((P@*B\*"0E[)VDG+" G8"<L(#$T,7TL"2\J((T@*B\*"0E[)T$G+" G(B<L
XM(#$T,GTL"2\J((X@*B\*"0E[)T$G+" G0"<L(#$T,WTL"2\J((\@*B\*"0E[
XM)T4G+" G7"<G+" Q-#1]+ DO*B"0("HO"@D)>R=A)RP@)V4G+" Q-#5]+ DO
XM*B"1("HO"@D)>R=!)RP@)T4G+" Q-#9]+ DO*B"2("HO"@D)>R=O)RP@)UXG
XM+" Q-#=]+ DO*B"3("HO"@D)>R=O)RP@)R(G+" Q-#A]+ DO*B"4("HO"@D)
XM>R=O)RP@)V G+" Q-#E]+ DO*B"5("HO"@D)>R=U)RP@)UXG+" Q-3!]+ DO
XM*B"6("HO"@D)>R=U)RP@)V G+" Q-3%]+ DO*B"7("HO"@D)>R=Y)RP@)R(G
XM+" Q-3)]+ DO*B"8("HO"@D)>R=/)RP@)R(G+" Q-3-]+ DO*B"9("HO"@D)
XM>R=5)RP@)R(G+" Q-31]+ DO*B":("HO"@D@(" @>R=C)RP@)WPG+" Q-35]
XM+ DO*B";("HO"@D@(" @>R<D)RP@)R0G+" Q-39]+ DO*B"<("HO"@D@(" @
XM>R=9)RP@)RTG+" Q-3=]+ DO*B!^72 H4T%3($,@8V%N)W0@:&%N9&QE('1H
XM92!R96%L(&-H87(I("HO"@D@(" @>R=0)RP@)W0G+" Q-3A]+ DO*B">("HO
XM"@D@(" @>R=F)RP@)V8G+" Q-3E]+ DO*B"?("HO"@D)>R=A)RP@)UPG)RP@
XM,38P?2P)+RH@H" J+PH)"7LG:2<L("=<)R<L(#$V,7TL"2\J(*$@*B\*"0E[
XM)V\G+" G7"<G+" Q-C)]+ DO*B"B("HO"@D)>R=U)RP@)UPG)RP@,38S?2P)
XM+RH@>'@@*%-!4R!#(&-A;B=T(&AA;F1L92!T:&4@<F5A;"!C:&%R*2 J+PH)
XM"7LG;B<L("=^)RP@,38T?2P)+RH@I" J+PH)"7LG3B<L("=^)RP@,38U?2P)
XM+RH@I2 J+PH)"7LG82<L("=A)RP@,38V?2P)+RH@IB J+PH)"7LG;R<L("=O
XM)RP@,38W?2P)+RH@IR J+PH)"7LG?B<L("<_)RP@,38X?2P)+RH@J" J+PH)
XM"7LG+2<L("=A)RP@,38Y?2P)+RH@J2 J+PH)"7LG82<L("<M)RP@,3<P?2P)
XM+RH@JB J+PH)"7LG,2<L("<R)RP@,3<Q?2P)+RH@JR J+PH)"7LG,2<L("<T
XM)RP@,3<R?2P)+RH@K" J+PH)"7LG?B<L("<A)RP@,3<S?2P)+RH@K2 J+PH)
XM"7LG/"<L("<\)RP@,3<T?2P)+RH@KB J+PH)"7LG/B<L("<^)RP@,3<U?2P)
XM+RH@KR J+PH*"0E[)W,G+" G<R<L(#(R-7TL"2\J(.$@*B\*"0E[)VHG+" G
XM=2<L(#(S,'TL"2\J(.8@*B\*"0E[)V\G+" G+R<L(#(S-WTL"2\J(.T@*B\*
XM"0E[)RLG+" G+2<L(#(T,7TL"2\J(/$@*B\*"0E[)SXG+" G/2<L(#(T,GTL
XM"2\J(/(@*B\*"0E[)SPG+" G/2<L(#(T,WTL"2\J(/,@*B\*"0E[)SHG+" G
XM+2<L(#(T-GTL"2\J(/8@*B\*"0E[)WXG+" G?B<L(#(T-WTL"2\J(/<@*B\*
XM"0E[)WXG+" G;R<L(#(T.'TL"2\J(/@@*B\*"0E[)S(G+" G,B<L(#(U,WTL
XM"2\J(/T@*B\*"0E[3E5,+"!.54PL($Y53'T*"0E].PH*(V5L<V4)+RH@35-$
XM3U,@*B\*"F-H87)?=0ED:6=R87!H9&5F875L=%M=6S-=(#T@"0DO*B!S=&%N
XM9&%R9"!)4T\@9&EG<F%P:',@*B\*"2 @('M[)WXG+" G(2<L(#$V,7TL"2\J
XM(*$@*B\*"2 @("![)V,G+" G?"<L(#$V,GTL"2\J(*(@*B\*"2 @("![)R0G
XM+" G)"<L(#$V,WTL"2\J(*,@*B\*"2 @("![)V\G+" G>"<L(#$V-'TL"2\J
XM(*0@*B\*"2 @("![)UDG+" G+2<L(#$V-7TL"2\J(*4@*B\*"2 @("![)WPG
XM+" G?"<L(#$V-GTL"2\J(*8@*B\*"2 @("![)W G+" G82<L(#$V-WTL"2\J
XM(*<@*B\*"2 @("![)R(G+" G(B<L(#$V.'TL"2\J(*@@*B\*"2 @("![)V,G
XM+" G3R<L(#$V.7TL"2\J(*D@*B\*"0E[)V$G+" G+2<L(#$W,'TL"2\J(*H@
XM*B\*"0E[)SPG+" G/"<L(#$W,7TL"2\J(*L@*B\*"0E[)RTG+" G+"<L(#$W
XM,GTL"2\J(*P@*B\*"0E[)RTG+" G+2<L(#$W,WTL"2\J(*T@*B\*"0E[)W(G
XM+" G3R<L(#$W-'TL"2\J(*X@*B\*"0E[)RTG+" G/2<L(#$W-7TL"2\J(*\@
XM*B\*"0E[)WXG+" G;R<L(#$W-GTL"2\J(+ @*B\*"0E[)RLG+" G+2<L(#$W
XM-WTL"2\J(+$@*B\*"0E[)S(G+" G,B<L(#$W.'TL"2\J(+(@*B\*"0E[)S,G
XM+" G,R<L(#$W.7TL"2\J(+,@*B\*"0E[)UPG)RP@)UPG)RP@,3@P?2P)+RH@
XMM" J+PH)"7LG:B<L("=U)RP@,3@Q?2P)+RH@M2 J+PH)"7LG<"<L("=P)RP@
XM,3@R?2P)+RH@MB J+PH)"7LG?B<L("<N)RP@,3@S?2P)+RH@MR J+PH)"7LG
XM+"<L("<L)RP@,3@T?2P)+RH@N" J+PH)"7LG,2<L("<Q)RP@,3@U?2P)+RH@
XMN2 J+PH)"7LG;R<L("<M)RP@,3@V?2P)+RH@NB J+PH)"7LG/B<L("<^)RP@
XM,3@W?2P)+RH@NR J+PH)"7LG,2<L("<T)RP@,3@X?2P)+RH@O" J+PH)"7LG
XM,2<L("<R)RP@,3@Y?2P)+RH@O2 J+PH)"7LG,R<L("<T)RP@,3DP?2P)+RH@
XMOB J+PH)"7LG?B<L("<_)RP@,3DQ?2P)+RH@OR J+PH)"7LG02<L("=@)RP@
XM,3DR?2P)+RH@P" J+PH)"7LG02<L("=<)R<L(#$Y,WTL"2\J(,$@*B\*"0E[
XM)T$G+" G7B<L(#$Y-'TL"2\J(,(@*B\*"0E[)T$G+" G?B<L(#$Y-7TL"2\J
XM(,,@*B\*"0E[)T$G+" G(B<L(#$Y-GTL"2\J(,0@*B\*"0E[)T$G+" G0"<L
XM(#$Y-WTL"2\J(,4@*B\*"0E[)T$G+" G12<L(#$Y.'TL"2\J(,8@*B\*"0E[
XM)T,G+" G+"<L(#$Y.7TL"2\J(,<@*B\*"0E[)T4G+" G8"<L(#(P,'TL"2\J
XM(,@@*B\*"0E[)T4G+" G7"<G+" R,#%]+ DO*B#)("HO"@D)>R=%)RP@)UXG
XM+" R,#)]+ DO*B#*("HO"@D)>R=%)RP@)R(G+" R,#-]+ DO*B#+("HO"@D)
XM>R=))RP@)V G+" R,#1]+ DO*B#,("HO"@D)>R=))RP@)UPG)RP@,C U?2P)
XM+RH@S2 J+PH)"7LG22<L("=>)RP@,C V?2P)+RH@SB J+PH)"7LG22<L("<B
XM)RP@,C W?2P)+RH@SR J+PH)"7LG1"<L("<M)RP@,C X?2P)+RH@T" J+PH)
XM"7LG3B<L("=^)RP@,C Y?2P)+RH@T2 J+PH)"7LG3R<L("=@)RP@,C$P?2P)
XM+RH@TB J+PH)"7LG3R<L("=<)R<L(#(Q,7TL"2\J(-,@*B\*"0E[)T\G+" G
XM7B<L(#(Q,GTL"2\J(-0@*B\*"0E[)T\G+" G?B<L(#(Q,WTL"2\J(-4@*B\*
XM"0E[)T\G+" G(B<L(#(Q-'TL"2\J(-8@*B\*"0E[)R\G+" G7%PG+" R,35]
XM+ DO*B#7("HO"@D)>R=/)RP@)R\G+" R,39]+ DO*B#8("HO"@D)>R=5)RP@
XM)V G+" R,3=]+ DO*B#9("HO"@D)>R=5)RP@)UPG)RP@,C$X?2P)+RH@VB J
XM+PH)"7LG52<L("=>)RP@,C$Y?2P)+RH@VR J+PH)"7LG52<L("<B)RP@,C(P
XM?2P)+RH@W" J+PH)"7LG62<L("=<)R<L(#(R,7TL"2\J(-T@*B\*"0E[)TDG
XM+" G<"<L(#(R,GTL"2\J(-X@*B\*"0E[)W,G+" G<R<L(#(R,WTL"2\J(-\@
XM*B\*"0E[)V$G+" G8"<L(#(R-'TL"2\J(. @*B\*"0E[)V$G+" G7"<G+" R
XM,C5]+ DO*B#A("HO"@D)>R=A)RP@)UXG+" R,C9]+ DO*B#B("HO"@D)>R=A
XM)RP@)WXG+" R,C=]+ DO*B#C("HO"@D)>R=A)RP@)R(G+" R,CA]+ DO*B#D
XM("HO"@D)>R=A)RP@)T G+" R,CE]+ DO*B#E("HO"@D)>R=A)RP@)V4G+" R
XM,S!]+ DO*B#F("HO"@D)>R=C)RP@)RPG+" R,S%]+ DO*B#G("HO"@D)>R=E
XM)RP@)V G+" R,S)]+ DO*B#H("HO"@D)>R=E)RP@)UPG)RP@,C,S?2P)+RH@
XMZ2 J+PH)"7LG92<L("=>)RP@,C,T?2P)+RH@ZB J+PH)"7LG92<L("<B)RP@
XM,C,U?2P)+RH@ZR J+PH)"7LG:2<L("=@)RP@,C,V?2P)+RH@[" J+PH)"7LG
XM:2<L("=<)R<L(#(S-WTL"2\J(.T@*B\*"0E[)VDG+" G7B<L(#(S.'TL"2\J
XM(.X@*B\*"0E[)VDG+" G(B<L(#(S.7TL"2\J(.\@*B\*"0E[)V0G+" G+2<L
XM(#(T,'TL"2\J(/ @*B\*"0E[)VXG+" G?B<L(#(T,7TL"2\J(/$@*B\*"0E[
XM)V\G+" G8"<L(#(T,GTL"2\J(/(@*B\*"0E[)V\G+" G7"<G+" R-#-]+ DO
XM*B#S("HO"@D)>R=O)RP@)UXG+" R-#1]+ DO*B#T("HO"@D)>R=O)RP@)WXG
XM+" R-#5]+ DO*B#U("HO"@D)>R=O)RP@)R(G+" R-#9]+ DO*B#V("HO"@D)
XM>R<Z)RP@)RTG+" R-#=]+ DO*B#W("HO"@D)>R=O)RP@)R\G+" R-#A]+ DO
XM*B#X("HO"@D)>R=U)RP@)V G+" R-#E]+ DO*B#Y("HO"@D)>R=U)RP@)UPG
XM)RP@,C4P?2P)+RH@^B J+PH)"7LG=2<L("=>)RP@,C4Q?2P)+RH@^R J+PH)
XM"7LG=2<L("<B)RP@,C4R?2P)+RH@_" J+PH)"7LG>2<L("=<)R<L(#(U,WTL
XM"2\J(/T@*B\*"0E[)VDG+" G<"<L(#(U-'TL"2\J(/X@*B\*"0E[)WDG+" G
XM(B<L(#(U-7TL"2\J(/\@*B\*"0E[3E5,+"!.54PL($Y53'T*"0E].PHC96YD
XM:68)+RH@35-$3U,@*B\*( HO*@H@*B!H86YD;&4@9&EG<F%P:',@869T97(@
XM='EP:6YG(&$@8VAA<F%C=&5R"B J+PH):6YT"F1O9&EG<F%P:"AC*0H):6YT
XM"0EC.PI["@ES=&%T:6,@:6YT"6)A8VMS<&%C960["0DO*B!C:&%R86-T97(@
XM8F5F;W)E($)3("HO"@ES=&%T:6,@:6YT"6QA<W1C:&%R.PD)+RH@;&%S="!T
XM>7!E9"!C:&%R86-T97(@*B\*"@EI9B H8R ]/2 M,2D)"0D)+RH@:6YI="!V
XM86QU97,@*B\*"7L*"0EB86-K<W!A8V5D(#T@+3$["@E]"@EE;'-E(&EF("AP
XM7V1G*0H)>PH)"6EF("AB86-K<W!A8V5D(#X](# I"@D)"6,@/2!G971D:6=R
XM87!H*&)A8VMS<&%C960L(&,L($9!3%-%*3L*"0EB86-K<W!A8V5D(#T@+3$[
XM"@D):68@*&,@/3T@0E,@)B8@;&%S=&-H87(@/CT@,"D*"0D)8F%C:W-P86-E
XM9" ](&QA<W1C:&%R.PH)?0H);&%S=&-H87(@/2!C.PH)<F5T=7)N(&,["GT*
XM"B\J"B J(&QO;VMU<"!T:&4@<&%I<B!C:&%R,2P@8VAA<C(@:6X@=&AE(&1I
XM9W)A<&@@=&%B;&5S"B J(&EF(&YO(&UA=&-H+"!R971U<FX@8VAA<C(*("HO
XM"@EI;G0*9V5T9&EG<F%P:"AC:&%R,2P@8VAA<C(L(&UE=&$I"@EI;G0)8VAA
XM<C$["@EI;G0)8VAA<C(["@EI;G0);65T83L*>PH):6YT"0EI.PH):6YT"0ER
XM971V86P["@H)<F5T=F%L(#T@,#L*"69O<B H:2 ](# [(#L@*RMI*0D)"2\J
XM('-E87)C:"!A9&1E9"!D:6=R87!H<R!F:7)S=" J+PH)>PH)"6EF("AI(#T]
XM(&1I9W)A<&AC;W5N="D)+RH@96YD(&]F(&%D9&5D('1A8FQE+"!S96%R8V@@
XM9&5F875L=',@*B\*"0E["@D)"69O<B H:2 ](# [(&1I9W)A<&AD969A=6QT
XM6VE=6S!=("$](# [("LK:2D*"0D)"6EF("AD:6=R87!H9&5F875L=%MI75LP
XM72 ]/2!C:&%R,2 F)B!D:6=R87!H9&5F875L=%MI75LQ72 ]/2!C:&%R,BD*
XM"0D)"7L*"0D)"0ER971V86P@/2!D:6=R87!H9&5F875L=%MI75LR73L*"0D)
XM"0EB<F5A:SL*"0D)"7T*"0D)8G)E86L["@D)?0H)"6EF("AD:6=R87!H;F5W
XM6VE=6S!=(#T](&-H87(Q("8F(&1I9W)A<&AN97=;:5U;,5T@/3T@8VAA<C(I
XM"@D)>PH)"0ER971V86P@/2!D:6=R87!H;F5W6VE=6S)=.PH)"0EB<F5A:SL*
XM"0E]"@E]"@H):68@*')E='9A;" ]/2 P*0D)"2\J(&1I9W)A<&@@9&5L971E
XM9"!O<B!N;W0@9F]U;F0@*B\*"7L*"0EI9B H8VAA<C$@/3T@)R G("8F(&UE
XM=&$I"0DO*B \<W!A8V4^(#QC:&%R/B M+3X@;65T82UC:&%R("HO"@D)"7)E
XM='5R;B H8VAA<C(@?" P>#@P*3L*"0ER971U<FX@8VAA<C(["@E]"@ER971U
XM<FX@<F5T=F%L.PI]"@HO*@H@*B!P=70@=&AE(&1I9W)A<&AS(&EN('1H92!A
XM<F=U;65N="!S=')I;F<@:6X@=&AE(&1I9W)A<&@@=&%B;&4*("H@9F]R;6%T
XM.B![8S%]>V,R?2!C:&%R('MC,7U[8S)](&-H87(@+BXN"B J+PH)=F]I9 IP
XM=71D:6=R87!H*'-T<BD*"6-H87)?=2 J<W1R.PI["@EI;G0)"6-H87(Q+"!C
XM:&%R,BP@;CL*"6-H87)?=0DH*FYE=W1A8BE;,UT["@EI;G0)"6D["@H)=VAI
XM;&4@*"IS='(I"@E["@D)<VMI<'-P86-E*"9S='(I.PH)"6EF("@H8VAA<C$@
XM/2 J<W1R*RLI(#T](# @?'P@*&-H87(R(#T@*G-T<BLK*2 ]/2 P*0H)"0ER
XM971U<FX["@D):68@*&-H87(Q(#T]($530R!\?"!C:&%R,B ]/2!%4T,I"@D)
XM>PH)"0E%35-'*")%<V-A<&4@;F]T(&%L;&]W960@:6X@9&EG<F%P:"(I.PH)
XM"0ER971U<FX["@D)?0H)"7-K:7!S<&%C92@F<W1R*3L*"0EI9B H(6ES9&EG
XM:70H*G-T<BDI"@D)>PH)"0EE;7-G*&5?;G5M8F5R*3L*"0D)<F5T=7)N.PH)
XM"7T*"0EN(#T@9V5T9&EG:71S*"9S='(I.PH)"6EF("AD:6=R87!H;F5W*0D)
XM+RH@<V5A<F-H('1H92!T86)L92!F;W(@97AI<W1I;F<@96YT<GD@*B\*"0E[
XM"@D)"69O<B H:2 ](# [(&D@/"!D:6=R87!H8V]U;G0[("LK:2D*"0D)"6EF
XM("AD:6=R87!H;F5W6VE=6S!=(#T](&-H87(Q("8F(&1I9W)A<&AN97=;:5U;
XM,5T@/3T@8VAA<C(I"@D)"0E["@D)"0D)9&EG<F%P:&YE=UMI75LR72 ](&X[
XM"@D)"0D)8G)E86L["@D)"0E]"@D)"6EF("AI(#P@9&EG<F%P:&-O=6YT*0H)
XM"0D)8V]N=&EN=64["@D)?0H)"6YE=W1A8B ]("AC:&%R7W4@*"HI6S-=*6%L
XM;&]C*&1I9W)A<&AC;W5N=" J(#,@*R S*3L*"0EI9B H;F5W=&%B*0H)"7L*
XM"0D);65M;6]V92@H8VAA<B J*6YE=W1A8BP@*&-H87(@*BED:6=R87!H;F5W
XM+" H<VEZ95]T*2AD:6=R87!H8V]U;G0@*B S*2D["@D)"69R964H9&EG<F%P
XM:&YE=RD["@D)"61I9W)A<&AN97<@/2!N97=T86(["@D)"61I9W)A<&AN97=;
XM9&EG<F%P:&-O=6YT75LP72 ](&-H87(Q.PH)"0ED:6=R87!H;F5W6V1I9W)A
XM<&AC;W5N=%U;,5T@/2!C:&%R,CL*"0D)9&EG<F%P:&YE=UMD:6=R87!H8V]U
XM;G1=6S)=(#T@;CL*"0D)*RMD:6=R87!H8V]U;G0["@D)?0H)?0I]"@H)=F]I
XM9 IL:7-T9&EG<F%P:',H*0I["@EI;G0)"6D["@H)<')I;G1D:6=R87!H*$Y5
XM3$PI.PH);7-G7W-T87)T*"D["@EM<V=?;W5T8VAA<B@G7&XG*3L*"69O<B H
XM:2 ](# [(&1I9W)A<&AD969A=6QT6VE=6S!=("8F("%G;W1?:6YT.R K*VDI
XM"@E["@D):68@*&=E=&1I9W)A<&@H9&EG<F%P:&1E9F%U;'1;:5U;,%TL(&1I
XM9W)A<&AD969A=6QT6VE=6S%=+"!&04Q312D@/3T@9&EG<F%P:&1E9F%U;'1;
XM:5U;,ETI"@D)"7!R:6YT9&EG<F%P:"AD:6=R87!H9&5F875L=%MI72D["@D)
XM8G)E86MC:&5C:R@I.PH)?0H)9F]R("AI(#T@,#L@:2 \(&1I9W)A<&AC;W5N
XM=" F)B A9V]T7VEN=#L@*RMI*0H)>PH)"7!R:6YT9&EG<F%P:"AD:6=R87!H
XM;F5W6VE=*3L*"0EB<F5A:V-H96-K*"D["@E]"@EM<V=?;W5T8VAA<B@G7&XG
XM*3L*"7=A:71?<F5T=7)N*%12544I.PD)+RH@8VQE87(@<V-R965N+"!B96-A
XM=7-E('-O;64@9&EG<F%P:',@;6%Y(&)E('=R;VYG+ H)"0D)"0D)("H@:6X@
XM=VAI8V@@8V%S92!W92!M97-S960@=7 @3F5X=%-C<F5E;B J+PI]"@H)<W1A
XM=&EC('9O:60*<')I;G1D:6=R87!H*' I"@EC:&%R7W4@*G ["GL*"6-H87)?
XM=0D)8G5F6SE=.PH)<W1A=&EC(&EN= EL96X["@H):68@*' @/3T@3E5,3"D*
XM"0EL96X@/2 P.PH)96QS92!I9B H<%LR72 A/2 P*0H)>PH)"6EF("AL96X@
XM/B!#;VQU;6YS("T@,3$I"@D)>PH)"0EM<V=?;W5T8VAA<B@G7&XG*3L*"0D)
XM;&5N(#T@,#L*"0E]"@D):68@*&QE;BD*"0D);7-G7V]U='-T<B@H8VAA<E]U
XM("HI(B @("(I.PH)"7-P<FEN=&8H*&-H87(@*BEB=68L("(E8R5C("5C("4S
XM9"(L('!;,%TL('!;,5TL('!;,ETL('!;,ETI.PH)"6US9U]O=71S='(H8G5F
XL*3L*"0EL96X@*ST@,3$["@E]"GT*"B-E;F1I9B O*B!$24=205!(4R J+PIF
X
Xend
END_OF_FILE
if test 11504 -ne `wc -c <'vim/src/digraph.c.UU'`; then
echo shar: \"'vim/src/digraph.c.UU'\" unpacked with wrong size!
else
echo shar: Uudecoding \"'vim/src/digraph.c'\" \(8324 characters\)
cat vim/src/digraph.c.UU | uudecode
if test 8324 -ne `wc -c <'vim/src/digraph.c'`; then
echo shar: \"'vim/src/digraph.c'\" uudecoded with wrong size!
else
rm vim/src/digraph.c.UU
fi
fi
# end of 'vim/src/digraph.c.UU'
fi
if test -f 'vim/src/makefile.nt' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'vim/src/makefile.nt'\"
else
echo shar: Extracting \"'vim/src/makefile.nt'\" \(5138 characters\)
sed "s/^X//" >'vim/src/makefile.nt' <<'END_OF_FILE'
X!include <ntwin32.mak>
X#
X# Makefile for VIM on WINNT, using MS SDK
X#
X
X#>>>>> choose options:
X### -DDIGRAPHS digraph support (at the cost of 1.6 Kbyte code)
X### -DCOMPATIBLE start in vi-compatible mode
X### -DNOBACKUP default is no backup file
X### -DDEBUG output a lot of debugging garbage
X### -DTERMCAP include termcap file support
X### -DNO_BUILTIN_TCAPS do not include builtin termcap entries
X### (use only with -DTERMCAP)
X### -DSOME_BUILTIN_TCAPS include most useful builtin termcap entries
X### (use only without -DNO_BUILTIN_TCAPS)
X### -DALL_BUILTIN_TCAPS include all builtin termcap entries
X### (use only without -DNO_BUILTIN_TCAPS)
X### -DVIMRC_FILE name of the .vimrc file in current dir
X### -DEXRC_FILE name of the .exrc file in current dir
X### -DSYSVIMRC_FILE name of the global .vimrc file
X### -DSYSEXRC_FILE name of the global .exrc file
X### -DDEFVIMRC_FILE name of the system-wide .vimrc file
X### -DVIM_HLP name of the help file
X### -DWEBB_COMPLETE include Webb's code for command line completion
X### -DWEBB_KEYWORD_COMPL include Webb's code for keyword completion
X### -DNOTITLE 'title' option off by default
XDEFINES = -DDIGRAPHS -DWEBB_COMPLETE -DWEBB_KEYWORD_COMPL
X
X#>>>>> name of the compiler and linker, name of lib directory
XCC = cl
XLINK = cl /ML /Fe$@ /Zi
XLIB = c:\mstools\lib
X
X#CFLAGS = -c -DMSDOS -DNT $(DEFINES) /Zi
XCFLAGS = -c -DMSDOS -DNT $(DEFINES) /Ox
X
X
X#>>>>> end of choices
X###########################################################################
X
XINCL = vim.h globals.h param.h keymap.h macros.h ascii.h term.h msdos.h structs.h
X
XOBJ = obj/alloc.obj obj/winnt.obj obj/buffer.obj obj/charset.obj obj/cmdcmds.obj obj/cmdline.obj \
X obj/csearch.obj obj/digraph.obj obj/edit.obj obj/fileio.obj obj/getchar.obj obj/help.obj \
X obj/linefunc.obj obj/main.obj obj/mark.obj obj/memfile.obj obj/memline.obj obj/message.obj obj/misccmds.obj \
X obj/normal.obj obj/ops.obj obj/param.obj obj/quickfix.obj obj/regexp.obj \
X obj/regsub.obj obj/screen.obj obj/search.obj \
X obj/tag.obj obj/term.obj obj/undo.obj obj/window.obj $(TERMLIB)
X
X..\vim: $(OBJ) version.obj
X $(link) $(linkdebug) $(conflags) -out:$*.exe $** $(conlibs) \
X user32.lib
X del version.obj
X
Xctags:
X command /c ctags *.c *.h
X
Xclean:
X del $(OBJ) version.obj mkcmdtab.obj ..\vim mkcmdtab cmdtab.h
X
Xaddcr: addcr.c
X $(CC) addcr.c
X command /c addcr.bat
X
X###########################################################################
X
Xobj/alloc.obj: alloc.c $(INCL)
X $(CC) $(CFLAGS) alloc.c /Foobj/alloc.obj
X
Xobj/winnt.obj: msdos.c $(INCL) msdos.h
X $(CC) $(CFLAGS) winnt.c /Foobj/winnt.obj
X
Xobj/buffer.obj: buffer.c $(INCL)
X $(CC) $(CFLAGS) buffer.c /Foobj/buffer.obj
X
Xobj/charset.obj: charset.c $(INCL)
X $(CC) $(CFLAGS) charset.c /Foobj/charset.obj
X
Xobj/cmdcmds.obj: cmdcmds.c $(INCL)
X $(CC) $(CFLAGS) cmdcmds.c /Foobj/cmdcmds.obj
X
Xobj/cmdline.obj: cmdline.c $(INCL) cmdtab.h
X $(CC) $(CFLAGS) cmdline.c /Foobj/cmdline.obj
X
Xobj/csearch.obj: csearch.c $(INCL)
X $(CC) $(CFLAGS) csearch.c /Foobj/csearch.obj
X
Xobj/digraph.obj: digraph.c $(INCL)
X $(CC) $(CFLAGS) digraph.c /Foobj/digraph.obj
X
Xobj/edit.obj: edit.c $(INCL)
X $(CC) $(CFLAGS) edit.c /Foobj/edit.obj
X
Xobj/fileio.obj: fileio.c $(INCL)
X $(CC) $(CFLAGS) fileio.c /Foobj/fileio.obj
X
Xobj/getchar.obj: getchar.c $(INCL)
X $(CC) $(CFLAGS) getchar.c /Foobj/getchar.obj
X
Xobj/help.obj: help.c $(INCL)
X $(CC) $(CFLAGS) help.c /Foobj/help.obj
X
Xobj/linefunc.obj: linefunc.c $(INCL)
X $(CC) $(CFLAGS) linefunc.c /Foobj/linefunc.obj
X
Xobj/main.obj: main.c $(INCL)
X $(CC) $(CFLAGS) main.c /Foobj/main.obj
X
Xobj/mark.obj: mark.c $(INCL)
X $(CC) $(CFLAGS) mark.c /Foobj/mark.obj
X
Xobj/memfile.obj: memfile.c $(INCL)
X $(CC) $(CFLAGS) memfile.c /Foobj/memfile.obj
X
Xobj/memline.obj: memline.c $(INCL)
X $(CC) $(CFLAGS) memline.c /Foobj/memline.obj
X
Xobj/message.obj: message.c $(INCL)
X $(CC) $(CFLAGS) message.c /Foobj/message.obj
X
Xobj/misccmds.obj: misccmds.c $(INCL)
X $(CC) $(CFLAGS) misccmds.c /Foobj/misccmds.obj
X
Xobj/normal.obj: normal.c $(INCL) ops.h
X $(CC) $(CFLAGS) normal.c /Foobj/normal.obj
X
Xobj/ops.obj: ops.c $(INCL) ops.h
X $(CC) $(CFLAGS) ops.c /Foobj/ops.obj
X
Xobj/param.obj: param.c $(INCL)
X $(CC) $(CFLAGS) param.c /Foobj/param.obj
X
Xobj/quickfix.obj: quickfix.c $(INCL)
X $(CC) $(CFLAGS) quickfix.c /Foobj/quickfix.obj
X
Xobj/regexp.obj: regexp.c $(INCL)
X $(CC) $(CFLAGS) regexp.c /Foobj/regexp.obj
X
Xobj/regsub.obj: regsub.c $(INCL)
X $(CC) $(CFLAGS) regsub.c /Foobj/regsub.obj
X
Xobj/screen.obj: screen.c $(INCL)
X $(CC) $(CFLAGS) screen.c /Foobj/screen.obj
X
Xobj/search.obj: search.c $(INCL)
X $(CC) $(CFLAGS) search.c /Foobj/search.obj
X
Xobj/tag.obj: tag.c $(INCL)
X $(CC) $(CFLAGS) tag.c /Foobj/tag.obj
X
Xobj/term.obj: term.c $(INCL)
X $(CC) $(CFLAGS) term.c /Foobj/term.obj
X
Xobj/undo.obj: undo.c $(INCL)
X $(CC) $(CFLAGS) undo.c /Foobj/undo.obj
X
Xobj/window.obj: window.c $(INCL)
X $(CC) $(CFLAGS) window.c /Foobj/window.obj
X
Xcmdtab.h: cmdtab.tab mkcmdtab.exe
X mkcmdtab cmdtab.tab cmdtab.h
X
Xmkcmdtab.exe: obj/mkcmdtab.obj
X $(link) $(linkdebug) $(conflags) -out:$*.exe $** $(conlibs) \
X user32.lib
X
Xobj/mkcmdtab.obj: mkcmdtab.c
X $(CC) $(CFLAGS) mkcmdtab.c /Foobj/mkcmdtab.obj
END_OF_FILE
if test 5138 -ne `wc -c <'vim/src/makefile.nt'`; then
echo shar: \"'vim/src/makefile.nt'\" unpacked with wrong size!
fi
# end of 'vim/src/makefile.nt'
fi
if test -f 'vim/src/tag.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'vim/src/tag.c'\"
else
echo shar: Extracting \"'vim/src/tag.c'\" \(11552 characters\)
sed "s/^X//" >'vim/src/tag.c' <<'END_OF_FILE'
X/* vi:ts=4:sw=4
X *
X * VIM - Vi IMproved by Bram Moolenaar
X *
X * Read the file "credits.txt" for a list of people who contributed.
X * Read the file "uganda.txt" for copying and usage conditions.
X */
X
X/*
X * Code to handle tags and the tag stack
X */
X
X#include "vim.h"
X#include "globals.h"
X#include "proto.h"
X#include "param.h"
X
Xstatic int findtag __ARGS((char_u *));
Xstatic char_u *bottommsg = (char_u *)"at bottom of tag stack";
Xstatic char_u *topmsg = (char_u *)"at top of tag stack";
X
X/*
X * Jump to tag; handling of tag stack
X *
X * *tag != NUL (:tag): jump to new tag, add to tag stack
X * type == 1 (:pop) || type == 2 (CTRL-T): jump to old position
X * type == 0 (:tag): jump to old tag
X */
X void
Xdotag(tag, type, count)
X char_u *tag;
X int type;
X int count;
X{
X int i;
X struct taggy *tagstack = curwin->w_tagstack;
X int tagstackidx = curwin->w_tagstackidx;
X int tagstacklen = curwin->w_tagstacklen;
X
X if (*tag != NUL) /* new pattern, add to the stack */
X {
X /*
X * if last used entry is not at the top, delete all tag stack entries
X * above it.
X */
X while (tagstackidx < tagstacklen)
X free(tagstack[--tagstacklen].tagname);
X
X /* if tagstack is full: remove oldest entry */
X if (++tagstacklen > TAGSTACKSIZE)
X {
X tagstacklen = TAGSTACKSIZE;
X free(tagstack[0].tagname);
X for (i = 1; i < tagstacklen; ++i)
X tagstack[i - 1] = tagstack[i];
X --tagstackidx;
X }
X /*
X * put the tag name in the tag stack
X * the position is added below
X */
X tagstack[tagstackidx].tagname = strsave(tag);
X }
X else if (tagstacklen == 0) /* empty stack */
X {
X EMSG("tag stack empty");
X goto end_dotag;
X }
X else if (type) /* go to older position */
X {
X if ((tagstackidx -= count) < 0)
X {
X emsg(bottommsg);
X if (tagstackidx + count == 0)
X {
X /* We did ^T (or <num>^T) from the bottom of the stack */
X tagstackidx = 0;
X goto end_dotag;
X }
X /* We weren't at the bottom of the stack, so jump all the way to
X * the bottom.
X */
X tagstackidx = 0;
X }
X else if (tagstackidx >= tagstacklen) /* must have been count == 0 */
X {
X emsg(topmsg);
X goto end_dotag;
X }
X if (tagstack[tagstackidx].fmark.fnum != curbuf->b_fnum) /* jump to other file */
X {
X if (buflist_getfile(tagstack[tagstackidx].fmark.fnum, tagstack[tagstackidx].fmark.mark.lnum, TRUE) == FAIL)
X {
X /* emsg(e_notopen); */
X goto end_dotag;
X }
X }
X else
X curwin->w_cursor.lnum = tagstack[tagstackidx].fmark.mark.lnum;
X curwin->w_cursor.col = tagstack[tagstackidx].fmark.mark.col;
X curwin->w_set_curswant = TRUE;
X goto end_dotag;
X }
X else /* go to newer pattern */
X {
X if ((tagstackidx += count - 1) >= tagstacklen)
X {
X tagstackidx = tagstacklen - 1;
X emsg(topmsg);
X }
X else if (tagstackidx < 0) /* must have been count == 0 */
X {
X emsg(bottommsg);
X tagstackidx = 0;
X goto end_dotag;
X }
X }
X /*
X * For :tag [arg], remember position before the jump
X */
X if (type == 0)
X {
X tagstack[tagstackidx].fmark.mark = curwin->w_cursor;
X tagstack[tagstackidx].fmark.fnum = curbuf->b_fnum;
X }
X if (findtag(tagstack[tagstackidx].tagname) > 0)
X ++tagstackidx;
X
Xend_dotag:
X curwin->w_tagstackidx = tagstackidx;
X curwin->w_tagstacklen = tagstacklen;
X}
X
X/*
X * Print the tag stack
X */
X void
Xdotags()
X{
X int i;
X char_u *name;
X struct taggy *tagstack = curwin->w_tagstack;
X int tagstackidx = curwin->w_tagstackidx;
X int tagstacklen = curwin->w_tagstacklen;
X
X gotocmdline(TRUE, NUL);
X msg_outstr((char_u *)"\n # TO tag FROM line in file\n");
X for (i = 0; i < tagstacklen; ++i)
X {
X if (tagstack[i].tagname != NULL)
X {
X name = fm_getname(&(tagstack[i].fmark));
X if (name == NULL) /* file name not available */
X continue;
X
X sprintf((char *)IObuff, "%c%2d %-15s %4ld %s\n",
X i == tagstackidx ? '>' : ' ',
X i + 1,
X tagstack[i].tagname,
X tagstack[i].fmark.mark.lnum,
X name);
X msg_outstr(IObuff);
X }
X flushbuf(); /* show one line at a time */
X }
X if (tagstackidx == tagstacklen) /* idx at top of stack */
X msg_outstr((char_u *)">\n");
X wait_return(FALSE);
X}
X
X/*
X * findtag(tag) - goto tag
X * return 0 for failure, 1 for success
X */
X static int
Xfindtag(tag)
X char_u *tag;
X{
X FILE *tp;
X char_u lbuf[LSIZE];
X char_u pbuf[LSIZE]; /* search pattern buffer */
X char_u *fname, *str;
X int cmplen;
X char_u *m = (char_u *)"No tags file";
X char_u *marg = NULL;
X register char_u *p;
X char_u *p2;
X char_u *np; /* pointer into file name string */
X char_u sbuf[CMDBUFFSIZE + 1]; /* tag file name */
X int i;
X int save_secure;
X int save_p_ws;
X
X if (tag == NULL) /* out of memory condition */
X return 0;
X
X if ((cmplen = p_tl) == 0)
X cmplen = 999;
X
X /* get stack of tag file names from tags option */
X for (np = p_tags; *np; )
X {
X for (i = 0; i < CMDBUFFSIZE && *np; ++i) /* copy next file name into lbuf */
X {
X if (*np == ' ')
X {
X ++np;
X break;
X }
X sbuf[i] = *np++;
X }
X sbuf[i] = 0;
X if ((tp = fopen((char *)sbuf, "r")) == NULL)
X continue;
X reg_ic = p_ic; /* for cstrncmp() */
X while (fgets((char *)lbuf, LSIZE, tp) != NULL)
X {
X m = (char_u *)"Format error in tags file %s"; /* default error message */
X marg = sbuf;
X
X /* find start of file name, after first white space */
X fname = lbuf;
X skiptospace(&fname); /* skip tag */
X if (*fname == NUL)
X goto erret;
X *fname++ = '\0';
X
X if (cstrncmp(lbuf, tag, cmplen) == 0) /* Tag found */
X {
X fclose(tp);
X skipspace(&fname);
X
X /* find start of search command, after second white space */
X str = fname;
X skiptospace(&str);
X if (*str == NUL)
X goto erret;
X *str++ = '\0';
X skipspace(&str);
X
X /*
X * If the command is a string like "/^function fname"
X * scan through the search string. If we see a magic
X * char, we have to quote it. This lets us use "real"
X * implementations of ctags.
X */
X if (*str == '/' || *str == '?')
X {
X p = pbuf;
X *p++ = *str++; /* copy the '/' or '?' */
X if (*str == '^')
X *p++ = *str++; /* copy the '^' */
X
X while (*str)
X {
X switch (*str)
X {
X case '\\': if (str[1] == '(') /* remove '\' before '(' */
X ++str;
X else
X *p++ = *str++;
X break;
X
X case '\r':
X case '\n': *str = pbuf[0]; /* copy '/' or '?' */
X str[1] = NUL; /* delete NL after CR */
X break;
X
X /*
X * if string ends in search character: skip it
X * else escape it with '\'
X */
X case '/':
X case '?': if (*str != pbuf[0]) /* not the search char */
X break;
X /* last char */
X if (str[1] == '\n' || str[1] == '\r')
X {
X ++str;
X continue;
X }
X case '[':
X if (!p_magic)
X break;
X case '^':
X case '*':
X case '.': *p++ = '\\';
X break;
X }
X *p++ = *str++;
X }
X }
X else /* not a search command, just copy it */
X for (p = pbuf; *str && *str != '\n'; )
X *p++ = *str++;
X *p = NUL;
X
X /*
X * expand filename (for environment variables)
X */
X if ((p = ExpandOne((char_u *)fname, 1, -1)) != NULL)
X fname = p;
X /*
X * if 'tagrelative' option set, may change file name
X */
X if (p_tr && !isFullName(fname) && (p2 = gettail(sbuf)) != sbuf)
X {
X STRNCPY(p2, fname, CMDBUFFSIZE - (p2 - sbuf));
X fname = sbuf;
X }
X /*
X * check if file for tag exists before abandoning current file
X */
X if (getperm(fname) < 0)
X {
X m = (char_u *)"File \"%s\" does not exist";
X marg = fname;
X goto erret;
X }
X
X RedrawingDisabled = TRUE;
X /*
X * if it was a CTRL-W CTRL-] command split window now
X */
X if (postponed_split)
X win_split(0L, FALSE);
X i = getfile(fname, NULL, TRUE, (linenr_t)0);
X if (p)
X free(p);
X if (i <= 0)
X {
X curwin->w_set_curswant = TRUE;
X postponed_split = FALSE;
X
X RedrawingDisabled = FALSE;
X save_secure = secure;
X secure = 1;
X tag_busy = TRUE; /* don't set marks for this search */
X keep_old_search_pattern = TRUE;
X
X /*
X * if the command is a search, try here
X *
X * Rather than starting at line one, just turn wrap-scan
X * on temporarily, this ensures that tags on line 1 will
X * be found, and makes sure our guess searches search the
X * whole file when repeated -- webb.
X */
X if (pbuf[0] == '/' || pbuf[0] == '?')
X {
X save_p_ws = p_ws;
X p_ws = TRUE; /* Switch wrap-scan on temporarily */
X if (!dosearch(pbuf[0], pbuf + 1, FALSE, (long)1, FALSE, FALSE))
X {
X register int notfound = FALSE;
X
X /*
X * Failed to find pattern, take a guess:
X */
X sprintf((char *)pbuf, "^%s(", lbuf);
X if (!dosearch('/', pbuf, FALSE, (long)1, FALSE, FALSE))
X {
X /* Guess again: */
X sprintf((char *)pbuf, "^[#a-zA-Z_].*%s(", lbuf);
X if (!dosearch('/', pbuf, FALSE, (long)1, FALSE, FALSE))
X notfound = TRUE;
X }
X if (notfound)
X EMSG("Can't find tag pattern");
X else
X {
X MSG("Couldn't find tag, just guessing!");
X sleep(1);
X }
X }
X p_ws = save_p_ws;
X }
X else
X {
X curwin->w_cursor.lnum = 1; /* start command in line 1 */
X docmdline(pbuf);
X }
X
X tag_busy = FALSE;
X keep_old_search_pattern = FALSE;
X if (secure == 2) /* done something that is not allowed */
X wait_return(TRUE);
X secure = save_secure;
X
X /* print the file message after redraw */
X if (p_im && i == -1)
X stuffReadbuff((char_u *)"\033\007i"); /* ESC CTRL-G i */
X else
X stuffcharReadbuff('\007'); /* CTRL-G */
X return 1;
X }
X RedrawingDisabled = FALSE;
X if (postponed_split) /* close the window */
X {
X close_window(FALSE);
X postponed_split = FALSE;
X }
X return 0;
X }
X }
X m = NULL;
X
Xerret:
X fclose(tp);
X if (m)
X emsg2(m, marg);
X }
X if (m == NULL)
X EMSG("tag not found");
X else if (marg == NULL)
X emsg(m);
X return 0;
X}
X
X#ifdef WEBB_COMPLETE
X int
XExpandTags(prog, num_file, file)
X regexp *prog;
X int *num_file;
X char_u ***file;
X{
X char_u **matches, **new_matches;
X char_u tag_file[CMDBUFFSIZE + 1];
X char_u line[LSIZE];
X char_u *np;
X char_u *p;
X int limit = 100;
X int index;
X int i;
X int lnum;
X FILE *fp;
X
X matches = (char_u **) alloc((unsigned)(limit * sizeof(char_u *)));
X if (matches == NULL)
X return FAIL;
X index = 0;
X for (np = p_tags; *np; )
X {
X for (i = 0; i < CMDBUFFSIZE && *np && *np != ' '; i++)
X tag_file[i] = *np++;
X tag_file[i] = NUL;
X skipspace(&np);
X if ((fp = fopen((char *)tag_file, "r")) == NULL)
X continue;
X lnum = 0;
X while (!vim_fgets(line, LSIZE, fp, &lnum))
X {
X if (regexec(prog, line, TRUE))
X {
X p = line;
X skiptospace(&p);
X *p = NUL;
X if (index == limit)
X {
X limit *= 2;
X new_matches = (char_u **) alloc((unsigned)(limit * sizeof(char_u *)));
X if (new_matches == NULL)
X {
X /* We'll miss some matches, oh well */
X *file = matches;
X *num_file = index;
X return OK;
X }
X for (i = 0; i < index; i++)
X new_matches[i] = matches[i];
X free(matches);
X matches = new_matches;
X }
X matches[index++] = strsave(line);
X }
X }
X }
X if (index > 0)
X {
X new_matches = *file = (char_u **) alloc((unsigned)(index * sizeof(char_u *)));
X if (new_matches == NULL)
X {
X *file = matches;
X *num_file = index;
X return OK;
X }
X for (i = 0; i < index; i++)
X new_matches[i] = matches[i];
X }
X free(matches);
X *num_file = index;
X return OK;
X}
X#endif /* WEBB_COMPLETE */
END_OF_FILE
if test 11552 -ne `wc -c <'vim/src/tag.c'`; then
echo shar: \"'vim/src/tag.c'\" unpacked with wrong size!
fi
# end of 'vim/src/tag.c'
fi
echo shar: End of archive 22 \(of 26\).
cp /dev/null ark22isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 26 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still must unpack the following archives:
echo " " ${MISSING}
fi
exit 0
exit 0 # Just in case...