This commit is contained in:
Brian Callahan
2014-07-10 18:11:43 -04:00
parent 1c4e562363
commit 294ccae3be
11 changed files with 61 additions and 433 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -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},

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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