emg 1.7
This commit is contained in:
@@ -1,6 +1,13 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
July 10, 2014 : emg 1.7
|
||||||
|
-----------------------
|
||||||
|
Searching now correctly updates line number display.
|
||||||
|
Remove lots of rarely-used word functions.
|
||||||
|
Remove search+replace: sed(1) is quicker.
|
||||||
|
Reduce size of some static buffers.
|
||||||
|
|
||||||
May 29, 2014 : emg 1.6
|
May 29, 2014 : emg 1.6
|
||||||
----------------------
|
----------------------
|
||||||
emg is now part of the RetroBSD tree.
|
emg is now part of the RetroBSD tree.
|
||||||
|
|||||||
@@ -10,15 +10,15 @@ CFLAGS = -Os -Wall -Werror
|
|||||||
# With the extra LDFLAGS, save some bytes.
|
# With the extra LDFLAGS, save some bytes.
|
||||||
CFLAGS += -ffunction-sections -fdata-sections
|
CFLAGS += -ffunction-sections -fdata-sections
|
||||||
|
|
||||||
# This reduces code size to 46K.
|
# This reduces code size significantly.
|
||||||
CFLAGS += -mips16
|
CFLAGS += -mips16
|
||||||
|
|
||||||
# Set the screen size.
|
# Set the screen size.
|
||||||
# Will default to FORCE_COLS=80 and FORCE_ROWS=24
|
# Will default to FORCE_COLS=80 and FORCE_ROWS=24
|
||||||
# if not set here.
|
# if not set here.
|
||||||
CFLAGS += -DFORCE_COLS=80 -DFORCE_ROWS=24
|
#CFLAGS += -DFORCE_COLS=80 -DFORCE_ROWS=24
|
||||||
|
|
||||||
# with CFLAGS+= -ffunction-sections -fdatasections
|
# with CFLAGS+= -ffunction-sections -fdata-sections
|
||||||
LDFLAGS += -Wl,--gc-sections
|
LDFLAGS += -Wl,--gc-sections
|
||||||
|
|
||||||
LIBS = -ltermcap -lc
|
LIBS = -ltermcap -lc
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
#include "edef.h"
|
#include "edef.h"
|
||||||
|
|
||||||
extern int getccol(int bflg);
|
extern int getccol(int bflg);
|
||||||
extern int inword();
|
|
||||||
extern void mlwrite();
|
extern void mlwrite();
|
||||||
extern int mlreplyt();
|
extern int mlreplyt();
|
||||||
|
|
||||||
|
|||||||
@@ -647,7 +647,7 @@ void modeline(WINDOW *wp)
|
|||||||
n = 2;
|
n = 2;
|
||||||
/* This is the version string. Do not forget to
|
/* This is the version string. Do not forget to
|
||||||
* increment when releasing a new version. */
|
* increment when releasing a new version. */
|
||||||
n += vtputs(" emg 1.6 ");
|
n += vtputs(" emg 1.7 ");
|
||||||
|
|
||||||
vtputc(lchar);
|
vtputc(lchar);
|
||||||
vtputc(lchar);
|
vtputc(lchar);
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
KEYTAB keytab[] = {
|
KEYTAB keytab[] = {
|
||||||
{CTRL | '@', setmark},
|
|
||||||
{CTRL | 'A', gotobol},
|
{CTRL | 'A', gotobol},
|
||||||
{CTRL | 'B', backchar},
|
{CTRL | 'B', backchar},
|
||||||
{CTRL | 'D', forwdel},
|
{CTRL | 'D', forwdel},
|
||||||
@@ -50,25 +49,16 @@ KEYTAB keytab[] = {
|
|||||||
{CTLX | CTRL | 'R', fileread},
|
{CTLX | CTRL | 'R', fileread},
|
||||||
{CTLX | CTRL | 'S', filesave},
|
{CTLX | CTRL | 'S', filesave},
|
||||||
{CTLX | CTRL | 'W', filewrite},
|
{CTLX | CTRL | 'W', filewrite},
|
||||||
{META | ' ', setmark},
|
|
||||||
{META | '%', qreplace},
|
|
||||||
{META | '.', setmark},
|
{META | '.', setmark},
|
||||||
{META | '<', gotobob},
|
{META | '<', gotobob},
|
||||||
{META | '>', gotoeob},
|
{META | '>', gotoeob},
|
||||||
{META | 'B', backword},
|
{META | 'B', backword},
|
||||||
{META | 'C', capword},
|
|
||||||
{META | 'D', delfword},
|
|
||||||
{META | 'F', forwword},
|
{META | 'F', forwword},
|
||||||
{META | 'G', setline}, /* non-standard */
|
{META | 'G', setline}, /* non-standard */
|
||||||
{META | 'L', lowerword},
|
|
||||||
{META | 'R', sreplace},
|
|
||||||
{META | 'S', forwsearch}, /* non-standard */
|
{META | 'S', forwsearch}, /* non-standard */
|
||||||
{META | 'U', upperword},
|
|
||||||
{META | 'V', pageup},
|
{META | 'V', pageup},
|
||||||
{META | 'W', copyregion},
|
{META | 'W', copyregion},
|
||||||
{META | 'Z', quickexit},
|
{META | 'Z', quickexit},
|
||||||
{META | 0x7F, delbword},
|
|
||||||
{META | CTRL | 'H', delbword},
|
|
||||||
{META | CTRL | 'N', namebuffer},
|
{META | CTRL | 'N', namebuffer},
|
||||||
{0x7F, backdel},
|
{0x7F, backdel},
|
||||||
{META | '[', extendedcmd},
|
{META | '[', extendedcmd},
|
||||||
|
|||||||
@@ -31,8 +31,6 @@ extern int setfillcol(); /* Set fill column */
|
|||||||
extern int setmark(); /* Set mark */
|
extern int setmark(); /* Set mark */
|
||||||
extern int forwsearch(); /* Search forward */
|
extern int forwsearch(); /* Search forward */
|
||||||
extern int backsearch(); /* Search backwards */
|
extern int backsearch(); /* Search backwards */
|
||||||
extern int sreplace(); /* search and replace */
|
|
||||||
extern int qreplace(); /* search and replace w/query */
|
|
||||||
extern int nextwind(); /* Move to the next window */
|
extern int nextwind(); /* Move to the next window */
|
||||||
extern int prevwind(); /* Move to the previous window */
|
extern int prevwind(); /* Move to the previous window */
|
||||||
extern int onlywind(); /* Make current window only one */
|
extern int onlywind(); /* Make current window only one */
|
||||||
@@ -54,11 +52,6 @@ extern int forwdel(); /* Forward delete */
|
|||||||
extern int backdel(); /* Backward delete */
|
extern int backdel(); /* Backward delete */
|
||||||
extern int killtext(); /* Kill forward */
|
extern int killtext(); /* Kill forward */
|
||||||
extern int yank(); /* Yank back from killbuffer */
|
extern int yank(); /* Yank back from killbuffer */
|
||||||
extern int upperword(); /* Upper case word */
|
|
||||||
extern int lowerword(); /* Lower case word */
|
|
||||||
extern int capword(); /* Initial capitalize word */
|
|
||||||
extern int delfword(); /* Delete forward word */
|
|
||||||
extern int delbword(); /* Delete backward word */
|
|
||||||
extern int killregion(); /* Kill region */
|
extern int killregion(); /* Kill region */
|
||||||
extern int copyregion(); /* Copy region to kill buffer */
|
extern int copyregion(); /* Copy region to kill buffer */
|
||||||
extern int quickexit(); /* low keystroke style exit */
|
extern int quickexit(); /* low keystroke style exit */
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
emg keybindings (May 29, 2014)
|
emg keybindings (July 7, 2014)
|
||||||
Based on Ersatz Emacs (2000/09/14)
|
Based on Ersatz Emacs (2000/09/14)
|
||||||
|
|
||||||
M- means to use the <ESC> key prior to using another key
|
M- means to use the <ESC> key prior to using another key
|
||||||
@@ -26,12 +26,7 @@ M-G Go to line Arrow keys are active
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
FORMATTING & TRANSPOSING
|
FORMATTING & TRANSPOSING
|
||||||
|
|
||||||
M-U UPPERCASE word M-C Capitalize word
|
|
||||||
M-L lowercase word ^T Transpose characters
|
|
||||||
^Q Quote next key, so that control codes may be entered into text. (or ^X Q)
|
^Q Quote next key, so that control codes may be entered into text. (or ^X Q)
|
||||||
M-Q Format paragraph so that text is left-justified between margins.
|
|
||||||
^X F Set the right margin for paragraph formatting to the current position of
|
|
||||||
the cursor.
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
SEARCHING
|
SEARCHING
|
||||||
@@ -40,21 +35,10 @@ M-Q Format paragraph so that text is left-justified between margins.
|
|||||||
ENTER. Either case matches. (or M-S)
|
ENTER. Either case matches. (or M-S)
|
||||||
^R As above, but reverse search from cursor position.
|
^R As above, but reverse search from cursor position.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
REPLACING
|
|
||||||
|
|
||||||
M-R Replace all instances of first typed-in string with second typed-in
|
|
||||||
string.
|
|
||||||
M-% Replace with query. Answer with:
|
|
||||||
Y replace & continue N no replacement & continue
|
|
||||||
! replace the rest ? Get a list of options
|
|
||||||
. exit and return to entry point
|
|
||||||
^G,'q' or <return> exit and remain at current location
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
COPYING AND MOVING
|
COPYING AND MOVING
|
||||||
|
|
||||||
^@ or M-<spacebar> Set mark at current position.
|
M-. Set mark at current position.
|
||||||
^W Delete region.
|
^W Delete region.
|
||||||
M-W Copy region to kill buffer.
|
M-W Copy region to kill buffer.
|
||||||
^Y Yank back kill buffer at cursor.
|
^Y Yank back kill buffer at cursor.
|
||||||
@@ -64,7 +48,7 @@ position. The kill buffer is the text which has been most recently deleted or
|
|||||||
copied.
|
copied.
|
||||||
|
|
||||||
Generally, the procedure for copying or moving text is:
|
Generally, the procedure for copying or moving text is:
|
||||||
1) Mark out region using M-<spacebar> at the beginning and move the cursor to
|
1) Mark out region using M-. at the beginning and move the cursor to
|
||||||
the end.
|
the end.
|
||||||
2) Delete it (with ^W) or copy it (with M-W) into the kill buffer.
|
2) Delete it (with ^W) or copy it (with M-W) into the kill buffer.
|
||||||
3) Move the cursor to the desired location and yank it back (with ^Y).
|
3) Move the cursor to the desired location and yank it back (with ^Y).
|
||||||
@@ -113,7 +97,6 @@ M-^V Scroll other window down M-^Z Scroll other window up
|
|||||||
EXITING
|
EXITING
|
||||||
|
|
||||||
^X^C Exit. Any unsaved files will require confirmation.
|
^X^C Exit. Any unsaved files will require confirmation.
|
||||||
M-Z Write out all changed buffers automatically and exit.
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
MACROS
|
MACROS
|
||||||
|
|||||||
@@ -3,10 +3,10 @@
|
|||||||
/* ESTRUCT: Structure and preprocessor */
|
/* ESTRUCT: Structure and preprocessor */
|
||||||
|
|
||||||
/* internal constants */
|
/* internal constants */
|
||||||
#define NFILEN 80 /* maximum # of bytes, file name */
|
#define NFILEN 32 /* maximum # of bytes, file name */
|
||||||
#define NBUFN 16 /* maximum # of bytes, buffer name */
|
#define NBUFN 16 /* maximum # of bytes, buffer name */
|
||||||
#define NLINE 512 /* maximum # of bytes, line */
|
#define NLINE 512 /* maximum # of bytes, line */
|
||||||
#define NKBDM 256 /* maximum # of strokes, keyboard macro */
|
#define NKBDM 128 /* maximum # of strokes, keyboard macro */
|
||||||
#define NPAT 80 /* maximum # of bytes, pattern */
|
#define NPAT 80 /* maximum # of bytes, pattern */
|
||||||
#define HUGE 32700 /* Huge number for "impossible" row&col */
|
#define HUGE 32700 /* Huge number for "impossible" row&col */
|
||||||
|
|
||||||
@@ -31,6 +31,35 @@
|
|||||||
#define CFCPCN 0x0001 /* Last command was C-P, C-N */
|
#define CFCPCN 0x0001 /* Last command was C-P, C-N */
|
||||||
#define CFKILL 0x0002 /* Last command was a kill */
|
#define CFKILL 0x0002 /* Last command was a kill */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* screen constants
|
||||||
|
* override with
|
||||||
|
* CFLAGS += -DFORCE_COLS=XXX -DFORCE_ROWS=XXX
|
||||||
|
*/
|
||||||
|
#ifndef FORCE_COLS
|
||||||
|
#define FORCE_COLS 80
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FORCE_ROWS
|
||||||
|
#define FORCE_ROWS 24
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XXX:
|
||||||
|
* Default/sane(?) maximum column and row sizes.
|
||||||
|
* Taken from mg1a.
|
||||||
|
*
|
||||||
|
* Let the user override these with
|
||||||
|
* CFLAGS += -DMAXCOL=XXX -DMAXROW=XXX
|
||||||
|
*/
|
||||||
|
#ifndef MAXCOL
|
||||||
|
#define MAXCOL 132
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAXROW
|
||||||
|
#define MAXROW 66
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There is a window structure allocated for every active display window. The
|
* There is a window structure allocated for every active display window. The
|
||||||
* windows are kept in a big list, in top to bottom screen order, with the
|
* windows are kept in a big list, in top to bottom screen order, with the
|
||||||
|
|||||||
@@ -25,9 +25,6 @@ int backhunt(int f, int n);
|
|||||||
int bsearch(int f, int n);
|
int bsearch(int f, int n);
|
||||||
int eq(int bc, int pc);
|
int eq(int bc, int pc);
|
||||||
int readpattern(char *prompt);
|
int readpattern(char *prompt);
|
||||||
int sreplace(int f, int n);
|
|
||||||
int qreplace(int f, int n);
|
|
||||||
int replaces(int kind, int f, int n);
|
|
||||||
int forscan(char *patrn, int leavep);
|
int forscan(char *patrn, int leavep);
|
||||||
void expandp(char *srcstr, char *deststr, int maxlength);
|
void expandp(char *srcstr, char *deststr, int maxlength);
|
||||||
|
|
||||||
@@ -42,6 +39,7 @@ void expandp(char *srcstr, char *deststr, int maxlength);
|
|||||||
int forwsearch(int f, int n)
|
int forwsearch(int f, int n)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
int curline = curwp->w_dotline;
|
||||||
|
|
||||||
if (n == 0) /* resolve the repeat count */
|
if (n == 0) /* resolve the repeat count */
|
||||||
n = 1;
|
n = 1;
|
||||||
@@ -60,14 +58,17 @@ int forwsearch(int f, int n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* and complain if not there */
|
/* and complain if not there */
|
||||||
if (status == FALSE)
|
if (status == FALSE) {
|
||||||
mlwrite("Not found");
|
mlwrite("Not found");
|
||||||
|
curwp->w_dotline = curline;
|
||||||
|
}
|
||||||
return (status);
|
return (status);
|
||||||
}
|
}
|
||||||
|
|
||||||
int forwhunt(int f, int n)
|
int forwhunt(int f, int n)
|
||||||
{
|
{
|
||||||
int status = 0;
|
int status = 0;
|
||||||
|
int curline = curwp->w_dotline;
|
||||||
|
|
||||||
/* resolve the repeat count */
|
/* resolve the repeat count */
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
@@ -89,8 +90,10 @@ int forwhunt(int f, int n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* and complain if not there */
|
/* and complain if not there */
|
||||||
if (status == FALSE)
|
if (status == FALSE) {
|
||||||
mlwrite("Not found");
|
mlwrite("Not found");
|
||||||
|
curwp->w_dotline = curline;
|
||||||
|
}
|
||||||
return (status);
|
return (status);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,6 +140,7 @@ int bsearch(int f, int n)
|
|||||||
LINE *clp, *tlp;
|
LINE *clp, *tlp;
|
||||||
char *epp, *pp;
|
char *epp, *pp;
|
||||||
int cbo, tbo, c;
|
int cbo, tbo, c;
|
||||||
|
int curline = curwp->w_dotline;
|
||||||
|
|
||||||
/* find a pointer to the end of the pattern */
|
/* find a pointer to the end of the pattern */
|
||||||
for (epp = &pat[0]; epp[1] != 0; ++epp)
|
for (epp = &pat[0]; epp[1] != 0; ++epp)
|
||||||
@@ -154,10 +158,12 @@ int bsearch(int f, int n)
|
|||||||
if (cbo == 0)
|
if (cbo == 0)
|
||||||
{
|
{
|
||||||
clp = lback(clp);
|
clp = lback(clp);
|
||||||
|
curwp->w_dotline--;
|
||||||
|
|
||||||
if (clp == curbp->b_linep)
|
if (clp == curbp->b_linep)
|
||||||
{
|
{
|
||||||
mlwrite("Not found");
|
mlwrite("Not found");
|
||||||
|
curwp->w_dotline = curline;
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
cbo = llength(clp) + 1;
|
cbo = llength(clp) + 1;
|
||||||
@@ -182,6 +188,7 @@ int bsearch(int f, int n)
|
|||||||
if (tbo == 0)
|
if (tbo == 0)
|
||||||
{
|
{
|
||||||
tlp = lback(tlp);
|
tlp = lback(tlp);
|
||||||
|
curwp->w_dotline--;
|
||||||
if (tlp == curbp->b_linep)
|
if (tlp == curbp->b_linep)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
@@ -252,167 +259,6 @@ int readpattern(char *prompt)
|
|||||||
return (s);
|
return (s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Search and replace (ESC-R)
|
|
||||||
*/
|
|
||||||
int sreplace(int f, int n)
|
|
||||||
{
|
|
||||||
return (replaces(FALSE, f, n));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* search and replace with query (ESC-CTRL-R)
|
|
||||||
*/
|
|
||||||
int qreplace(int f, int n)
|
|
||||||
{
|
|
||||||
return (replaces(TRUE, f, n));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* replaces: search for a string and replace it with another string. query
|
|
||||||
* might be enabled (according to kind)
|
|
||||||
*/
|
|
||||||
int replaces(int kind, int f, int n)
|
|
||||||
{
|
|
||||||
LINE *origline; /* original "." position */
|
|
||||||
char tmpc; /* temporary character */
|
|
||||||
char c; /* input char for query */
|
|
||||||
char tpat[NPAT]; /* temporary to hold search pattern */
|
|
||||||
int i; /* loop index */
|
|
||||||
int s; /* success flag on pattern inputs */
|
|
||||||
int slength, rlength; /* length of search and replace strings */
|
|
||||||
int numsub; /* number of substitutions */
|
|
||||||
int nummatch; /* number of found matches */
|
|
||||||
int nlflag; /* last char of search string a <NL>? */
|
|
||||||
int nlrepl; /* was a replace done on the last line? */
|
|
||||||
int origoff; /* and offset (for . query option) */
|
|
||||||
|
|
||||||
/* check for negative repititions */
|
|
||||||
if (f && n < 0)
|
|
||||||
return (FALSE);
|
|
||||||
|
|
||||||
/* ask the user for the text of a pattern */
|
|
||||||
if ((s = readpattern((kind == FALSE ? "Replace" : "Query replace"))) != TRUE)
|
|
||||||
return (s);
|
|
||||||
strncpy(&tpat[0], &pat[0], NPAT); /* salt it away */
|
|
||||||
|
|
||||||
/* ask for the replacement string */
|
|
||||||
strncpy(&pat[0], &rpat[0], NPAT); /* set up default string */
|
|
||||||
if ((s = readpattern("with")) == ABORT)
|
|
||||||
return (s);
|
|
||||||
|
|
||||||
/* move everything to the right place and length them */
|
|
||||||
strncpy(&rpat[0], &pat[0], NPAT);
|
|
||||||
strncpy(&pat[0], &tpat[0], NPAT);
|
|
||||||
slength = strlen(&pat[0]);
|
|
||||||
rlength = strlen(&rpat[0]);
|
|
||||||
|
|
||||||
/* set up flags so we can make sure not to do a recursive replace on the
|
|
||||||
* last line */
|
|
||||||
nlflag = (pat[slength - 1] == '\n');
|
|
||||||
nlrepl = FALSE;
|
|
||||||
|
|
||||||
/* build query replace question string */
|
|
||||||
strncpy(tpat, "Replace '", 10);
|
|
||||||
expandp(&pat[0], &tpat[strlen (tpat)], NPAT / 3);
|
|
||||||
strncat(tpat, "' with '", 9);
|
|
||||||
|
|
||||||
expandp(&rpat[0], &tpat[strlen (tpat)], NPAT / 3);
|
|
||||||
strncat(tpat, "'? ", 4);
|
|
||||||
|
|
||||||
/* save original . position */
|
|
||||||
origline = curwp->w_dotp;
|
|
||||||
origoff = curwp->w_doto;
|
|
||||||
|
|
||||||
/* scan through the file */
|
|
||||||
numsub = 0;
|
|
||||||
nummatch = 0;
|
|
||||||
while ((f == FALSE || n > nummatch) &&
|
|
||||||
(nlflag == FALSE || nlrepl == FALSE))
|
|
||||||
{
|
|
||||||
/* search for the pattern */
|
|
||||||
if (forscan(&pat[0], PTBEG) != TRUE)
|
|
||||||
break; /* all done */
|
|
||||||
++nummatch; /* increment # of matches */
|
|
||||||
|
|
||||||
/* check if we are on the last line */
|
|
||||||
nlrepl = (lforw (curwp->w_dotp) == curwp->w_bufp->b_linep);
|
|
||||||
|
|
||||||
/* check for query */
|
|
||||||
if (kind)
|
|
||||||
{
|
|
||||||
/* get the query */
|
|
||||||
mlwrite(&tpat[0], &pat[0], &rpat[0]);
|
|
||||||
qprompt:
|
|
||||||
update(); /* show the proposed place to change */
|
|
||||||
c = (*term.t_getchar) (); /* and input */
|
|
||||||
mlwrite(""); /* and clear it */
|
|
||||||
|
|
||||||
/* and respond appropriately */
|
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
case 'y': /* yes, substitute */
|
|
||||||
case ' ':
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'n': /* no, onword */
|
|
||||||
forwchar(FALSE, 1);
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case '!': /* yes/stop asking */
|
|
||||||
kind = FALSE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '.': /* abort! and return */
|
|
||||||
/* restore old position */
|
|
||||||
curwp->w_dotp = origline;
|
|
||||||
curwp->w_doto = origoff;
|
|
||||||
curwp->w_flag |= WFMOVE;
|
|
||||||
|
|
||||||
case BELL: /* abort! and stay */
|
|
||||||
mlwrite("Aborted!");
|
|
||||||
return (FALSE);
|
|
||||||
|
|
||||||
case 0x0d: /* controlled exit */
|
|
||||||
case 'q':
|
|
||||||
return (TRUE);
|
|
||||||
|
|
||||||
default: /* bitch and beep */
|
|
||||||
(*term.t_beep) ();
|
|
||||||
|
|
||||||
case '?': /* help me */
|
|
||||||
mlwrite("(Y)es, (N)o, (!)Do the rest, (^G,RET,q)Abort, (.)Abort back, (?)Help: ");
|
|
||||||
goto qprompt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* delete the sucker */
|
|
||||||
if (ldelete(slength, FALSE) != TRUE)
|
|
||||||
{
|
|
||||||
/* error while deleting */
|
|
||||||
mlwrite("ERROR while deleting");
|
|
||||||
return (FALSE);
|
|
||||||
}
|
|
||||||
/* and insert its replacement */
|
|
||||||
for (i = 0; i < rlength; i++)
|
|
||||||
{
|
|
||||||
tmpc = rpat[i];
|
|
||||||
s = (tmpc == '\n' ? lnewline() : linsert(1, tmpc));
|
|
||||||
if (s != TRUE)
|
|
||||||
{
|
|
||||||
/* error while inserting */
|
|
||||||
mlwrite("Out of memory while inserting");
|
|
||||||
return (FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
numsub++; /* increment # of substitutions */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* and report the results */
|
|
||||||
mlwrite("%d substitutions", numsub);
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* search forward for a <patrn>
|
/* search forward for a <patrn>
|
||||||
*/
|
*/
|
||||||
int forscan(char *patrn, int leavep)
|
int forscan(char *patrn, int leavep)
|
||||||
@@ -441,6 +287,7 @@ int forscan(char *patrn, int leavep)
|
|||||||
if (curoff == llength(curline))
|
if (curoff == llength(curline))
|
||||||
{ /* if at EOL */
|
{ /* if at EOL */
|
||||||
curline = lforw(curline); /* skip to next line */
|
curline = lforw(curline); /* skip to next line */
|
||||||
|
curwp->w_dotline++;
|
||||||
curoff = 0;
|
curoff = 0;
|
||||||
c = '\n'; /* and return a <NL> */
|
c = '\n'; /* and return a <NL> */
|
||||||
}
|
}
|
||||||
@@ -463,6 +310,7 @@ int forscan(char *patrn, int leavep)
|
|||||||
{
|
{
|
||||||
/* advance past EOL */
|
/* advance past EOL */
|
||||||
matchline = lforw(matchline);
|
matchline = lforw(matchline);
|
||||||
|
curwp->w_dotline++;
|
||||||
matchoff = 0;
|
matchoff = 0;
|
||||||
c = '\n';
|
c = '\n';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,33 +4,6 @@
|
|||||||
|
|
||||||
#define termdef 1 /* don't define "term" externally */
|
#define termdef 1 /* don't define "term" externally */
|
||||||
|
|
||||||
/* Did you remember to set FORCE_COLS? */
|
|
||||||
#ifndef FORCE_COLS
|
|
||||||
#define FORCE_COLS 80
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Did you remember to set FORCE_ROWS? */
|
|
||||||
#ifndef FORCE_ROWS
|
|
||||||
#define FORCE_ROWS 24
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* XXX:
|
|
||||||
* Default/sane(?) maximum column and row sizes.
|
|
||||||
* Taken from mg1a.
|
|
||||||
*
|
|
||||||
* Let the user override this with a
|
|
||||||
* CFLAGS += -DMAXCOL=XXX -DMAXROW=XXX
|
|
||||||
* line in the Makefile.
|
|
||||||
*/
|
|
||||||
#ifndef MAXCOL
|
|
||||||
#define MAXCOL 132
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MAXROW
|
|
||||||
#define MAXROW 66
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h> /* puts(3), snprintf(3) */
|
#include <stdio.h> /* puts(3), snprintf(3) */
|
||||||
#include "estruct.h"
|
#include "estruct.h"
|
||||||
#include "edef.h"
|
#include "edef.h"
|
||||||
|
|||||||
@@ -11,20 +11,10 @@
|
|||||||
|
|
||||||
extern int backchar(int f, int n);
|
extern int backchar(int f, int n);
|
||||||
extern int forwchar(int f, int n);
|
extern int forwchar(int f, int n);
|
||||||
extern void lchange(int flag);
|
|
||||||
extern int ldelete(int n, int kflag);
|
|
||||||
extern void mlwrite();
|
|
||||||
extern int linsert(int n, int c);
|
|
||||||
extern int lnewline();
|
|
||||||
|
|
||||||
int backword(int f, int n);
|
int backword(int f, int n);
|
||||||
int forwword(int f, int n);
|
int forwword(int f, int n);
|
||||||
int upperword(int f, int n);
|
int inword(void);
|
||||||
int lowerword(int f, int n);
|
|
||||||
int capword(int f, int n);
|
|
||||||
int delfword(int f, int n);
|
|
||||||
int delbword(int f, int n);
|
|
||||||
int inword();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Move the cursor backward by "n" words. All of the details of motion are
|
* Move the cursor backward by "n" words. All of the details of motion are
|
||||||
@@ -77,195 +67,11 @@ int forwword(int f, int n)
|
|||||||
return (TRUE);
|
return (TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Move the cursor forward by the specified number of words. As you move,
|
|
||||||
* convert any characters to upper case. Error if you try and move beyond the
|
|
||||||
* end of the buffer. Bound to "M-U"
|
|
||||||
*/
|
|
||||||
int upperword(int f, int n)
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
|
|
||||||
if (n < 0)
|
|
||||||
return (FALSE);
|
|
||||||
while (n--)
|
|
||||||
{
|
|
||||||
while (inword() == FALSE)
|
|
||||||
{
|
|
||||||
if (forwchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
}
|
|
||||||
while (inword() != FALSE)
|
|
||||||
{
|
|
||||||
c = lgetc(curwp->w_dotp, curwp->w_doto);
|
|
||||||
if (c >= 'a' && c <= 'z')
|
|
||||||
{
|
|
||||||
c -= 'a' - 'A';
|
|
||||||
lputc(curwp->w_dotp, curwp->w_doto, c);
|
|
||||||
lchange(WFHARD);
|
|
||||||
}
|
|
||||||
if (forwchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Move the cursor forward by the specified number of words. As you move
|
|
||||||
* convert characters to lower case. Error if you try and move over the end of
|
|
||||||
* the buffer. Bound to "M-L"
|
|
||||||
*/
|
|
||||||
int lowerword(int f, int n)
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
|
|
||||||
if (n < 0)
|
|
||||||
return (FALSE);
|
|
||||||
while (n--)
|
|
||||||
{
|
|
||||||
while (inword() == FALSE)
|
|
||||||
{
|
|
||||||
if (forwchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
}
|
|
||||||
while (inword() != FALSE)
|
|
||||||
{
|
|
||||||
c = lgetc(curwp->w_dotp, curwp->w_doto);
|
|
||||||
if (c >= 'A' && c <= 'Z')
|
|
||||||
{
|
|
||||||
c += 'a' - 'A';
|
|
||||||
lputc(curwp->w_dotp, curwp->w_doto, c);
|
|
||||||
lchange(WFHARD);
|
|
||||||
}
|
|
||||||
if (forwchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Move the cursor forward by the specified number of words. As you move
|
|
||||||
* convert the first character of the word to upper case, and subsequent
|
|
||||||
* characters to lower case. Error if you try and move past the end of the
|
|
||||||
* buffer. Bound to "M-C"
|
|
||||||
*/
|
|
||||||
int capword(int f, int n)
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
|
|
||||||
if (n < 0)
|
|
||||||
return(FALSE);
|
|
||||||
while (n--)
|
|
||||||
{
|
|
||||||
while (inword() == FALSE)
|
|
||||||
{
|
|
||||||
if (forwchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
}
|
|
||||||
if (inword() != FALSE)
|
|
||||||
{
|
|
||||||
c = lgetc(curwp->w_dotp, curwp->w_doto);
|
|
||||||
if (c >= 'a' && c <= 'z')
|
|
||||||
{
|
|
||||||
c -= 'a' - 'A';
|
|
||||||
lputc(curwp->w_dotp, curwp->w_doto, c);
|
|
||||||
lchange(WFHARD);
|
|
||||||
}
|
|
||||||
if (forwchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
while (inword() != FALSE)
|
|
||||||
{
|
|
||||||
c = lgetc(curwp->w_dotp, curwp->w_doto);
|
|
||||||
if (c >= 'A' && c <= 'Z')
|
|
||||||
{
|
|
||||||
c += 'a' - 'A';
|
|
||||||
lputc(curwp->w_dotp, curwp->w_doto, c);
|
|
||||||
lchange(WFHARD);
|
|
||||||
}
|
|
||||||
if (forwchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Kill forward by "n" words. Remember the location of dot. Move forward by
|
|
||||||
* the right number of words. Put dot back where it was and issue the kill
|
|
||||||
* command for the right number of characters. Bound to "M-D"
|
|
||||||
*/
|
|
||||||
int delfword(int f, int n)
|
|
||||||
{
|
|
||||||
LINE *dotp;
|
|
||||||
int size, doto;
|
|
||||||
|
|
||||||
if (n < 0)
|
|
||||||
return (FALSE);
|
|
||||||
dotp = curwp->w_dotp;
|
|
||||||
doto = curwp->w_doto;
|
|
||||||
size = 0;
|
|
||||||
while (n--)
|
|
||||||
{
|
|
||||||
while (inword() != FALSE)
|
|
||||||
{
|
|
||||||
if (forwchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
++size;
|
|
||||||
}
|
|
||||||
while (inword() == FALSE)
|
|
||||||
{
|
|
||||||
if (forwchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
++size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
curwp->w_dotp = dotp;
|
|
||||||
curwp->w_doto = doto;
|
|
||||||
return (ldelete(size, TRUE));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Kill backwards by "n" words. Move backwards by the desired number of words,
|
|
||||||
* counting the characters. When dot is finally moved to its resting place,
|
|
||||||
* fire off the kill command. Bound to "M-Rubout" and to "M-Backspace"
|
|
||||||
*/
|
|
||||||
int delbword(int f, int n)
|
|
||||||
{
|
|
||||||
int size;
|
|
||||||
|
|
||||||
if (n < 0)
|
|
||||||
return (FALSE);
|
|
||||||
if (backchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
size = 0;
|
|
||||||
while (n--)
|
|
||||||
{
|
|
||||||
while (inword() == FALSE)
|
|
||||||
{
|
|
||||||
if (backchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
++size;
|
|
||||||
}
|
|
||||||
while (inword() != FALSE)
|
|
||||||
{
|
|
||||||
if (backchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
++size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (forwchar(FALSE, 1) == FALSE)
|
|
||||||
return (FALSE);
|
|
||||||
return (ldelete(size, TRUE));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return TRUE if the character at dot is a character that is considered to be
|
* Return TRUE if the character at dot is a character that is considered to be
|
||||||
* part of a word. The word character list is hard coded. Should be setable
|
* part of a word. The word character list is hard coded. Should be setable
|
||||||
*/
|
*/
|
||||||
int inword()
|
int inword(void)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user