home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d3xx
/
d352
/
mg.lha
/
MG
/
src.LZH
/
mg
/
word.c
< prev
Wrap
C/C++ Source or Header
|
1990-05-23
|
6KB
|
257 lines
/*
* Word mode commands. The routines in this file implement commands that work
* word at a time. There are all sorts of word mode commands.
*/
#include "def.h"
#include "line.h"
#include "window.h"
/*
* Move the cursor backward by "n" words. All of the details of motion are
* performed by the "backchar" and "forwchar" routines.
*/
/* ARGSUSED */
backword(f, n)
{
if (n < 0)
return forwword(f | FFRAND, -n);
if (backchar(FFRAND, 1) == FALSE)
return FALSE;
while (n--) {
while (inword() == FALSE) {
if (backchar(FFRAND, 1) == FALSE)
return TRUE;
}
while (inword() != FALSE) {
if (backchar(FFRAND, 1) == FALSE)
return TRUE;
}
}
return forwchar(FFRAND, 1);
}
/*
* Move the cursor forward by the specified number of words. All of the
* motion is done by "forwchar".
*/
/* ARGSUSED */
forwword(f, n)
{
if (n < 0)
return backword(f | FFRAND, -n);
while (n--) {
while (inword() == FALSE) {
if (forwchar(FFRAND, 1) == FALSE)
return TRUE;
}
while (inword() != FALSE) {
if (forwchar(FFRAND, 1) == FALSE)
return TRUE;
}
}
return TRUE;
}
/*
* Move the cursor forward by the specified number of words. As you move,
* convert any characters to upper case.
*/
/* ARGSUSED */
upperword(f, n)
{
register int c;
if (n < 0)
backword(f | FFRAND, -n);
while (n--) {
while (inword() == FALSE) {
if (forwchar(FFRAND, 1) == FALSE)
return TRUE;
}
while (inword() != FALSE) {
c = lgetc(curwp->w_dotp, curwp->w_doto);
if (ISLOWER(c) != FALSE) {
c = TOUPPER(c);
lputc(curwp->w_dotp, curwp->w_doto, c);
lchange(WFHARD);
}
if (forwchar(FFRAND, 1) == FALSE)
return TRUE;
}
}
return TRUE;
}
/*
* Move the cursor forward by the specified number of words. As you move
* convert characters to lower case.
*/
/* ARGSUSED */
lowerword(f, n)
{
register int c;
if (n < 0) {
n = -n;
backword(f | FFRAND, n);
}
while (n--) {
while (inword() == FALSE) {
if (forwchar(FFRAND, 1) == FALSE)
return TRUE;
}
while (inword() != FALSE) {
c = lgetc(curwp->w_dotp, curwp->w_doto);
if (ISUPPER(c) != FALSE) {
c = TOLOWER(c);
lputc(curwp->w_dotp, curwp->w_doto, c);
lchange(WFHARD);
}
if (forwchar(FFRAND, 1) == FALSE)
return TRUE;
}
}
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.
*/
/* ARGSUSED */
capword(f, n)
{
register int c;
VOID lchange();
if (n < 0) {
n = -n;
backword(f | FFRAND, n);
}
while (n--) {
while (inword() == FALSE) {
if (forwchar(FFRAND, 1) == FALSE)
return TRUE;
}
if (inword() != FALSE) {
c = lgetc(curwp->w_dotp, curwp->w_doto);
if (ISLOWER(c) != FALSE) {
c = TOUPPER(c);
lputc(curwp->w_dotp, curwp->w_doto, c);
lchange(WFHARD);
}
if (forwchar(FFRAND, 1) == FALSE)
return TRUE;
while (inword() != FALSE) {
c = lgetc(curwp->w_dotp, curwp->w_doto);
if (ISUPPER(c) != FALSE) {
c = TOLOWER(c);
lputc(curwp->w_dotp, curwp->w_doto, c);
lchange(WFHARD);
}
if (forwchar(FFRAND, 1) == FALSE)
return TRUE;
}
}
}
return TRUE;
}
/*
* Kill forward by "n" words.
*/
/* ARGSUSED */
delfword(f, n)
{
register RSIZE size;
register struct line *dotp;
register int doto;
if (n < 0)
return delbword(f | FFRAND, -n);
if ((lastflag & CFKILL) == 0) /* Purge kill buffer. */
kdelete();
thisflag |= CFKILL;
dotp = curwp->w_dotp;
doto = curwp->w_doto;
size = 0;
while (n--) {
while (inword() == FALSE) {
if (forwchar(FFRAND, 1) == FALSE)
goto out; /* Hit end of buffer. */
++size;
}
while (inword() != FALSE) {
if (forwchar(FFRAND, 1) == FALSE)
goto out; /* Hit end of buffer. */
++size;
}
}
out:
curwp->w_dotp = dotp;
curwp->w_doto = doto;
return (fdelete(size, TRUE));
}
/*
* Kill backwards by "n" words. The rules for success and failure are now
* different, to prevent strange behavior at the start of the buffer. The
* command only fails if something goes wrong with the actual delete of the
* characters. It is successful even if no characters are deleted, or if you
* say delete 5 words, and there are only 4 words left. I considered making
* the first call to "backchar" special, but decided that that would just be
* wierd. Normally this is bound to "M-Rubout" and to "M-Backspace".
*/
/* ARGSUSED */
delbword(f, n)
{
register RSIZE size;
register struct line *dotp;
register int doto;
if (n < 0)
return delfword(f | FFRAND, -n);
if ((lastflag & CFKILL) == 0) /* Purge kill buffer. */
kdelete();
thisflag |= CFKILL;
dotp = curwp->w_dotp;
doto = curwp->w_doto;
size = 0;
if (backchar(FFRAND, 1) == FALSE)
return (TRUE); /* Hit buffer start. */
size = 1; /* One deleted. */
while (n--) {
while (inword() == FALSE) {
if (backchar(FFRAND, 1) == FALSE)
goto out; /* Hit buffer start. */
++size;
}
while (inword() != FALSE) {
if (backchar(FFRAND, 1) == FALSE)
goto out; /* Hit buffer start. */
++size;
}
}
if (forwchar(FFRAND, 1) == FALSE)
return FALSE;
--size; /* Undo assumed delete. */
out:
curwp->w_dotp = dotp;
curwp->w_doto = doto;
return bdelete(size, TRUE);
}
/*
* 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.
*/
inword()
{
/* can't use lgetc in ISWORD due to bug in OSK cpp */
return curwp->w_doto != llength(curwp->w_dotp) &&
ISWORD(ltext(curwp->w_dotp)[curwp->w_doto]);
}