home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d1xx
/
d166
/
stevie.lha
/
Stevie
/
source
/
updateNextscreen.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-11-22
|
4KB
|
139 lines
/*
* STEVIE - Simply Try this Editor for VI Enthusiasts
*
* Code Contributions By : Tim Thompson twitch!tjt
* Tony Andrews onecom!wldrdg!tony
* G. R. (Fred) Walter watmath!watcgl!grwalter
*/
#include "stevie.h"
/*
* updateNextscreen()
*
* Based on the current value of Topchar, transfer a screenfull of stuff from
* Filemem to Nextscreen, and update Botchar.
*/
void
updateNextscreen()
{
int row, col;
register char *screenp = Nextscreen;
LPTR memp;
LPTR save; /* save pos. in case line won't fit */
register char *endscreen;
char *nextrow;
char extra[16];
int nextra = 0;
char c;
int n;
int done;
int srow; /* starting row of the current line */
MustRedrawLine = FALSE;
MustRedrawScreen = TRUE;
save = memp = *Topchar;
/* The number of rows shown is Rows-1. */
/* The last line is the status/command line. */
endscreen = &screenp[(Rows - 1) * Columns];
srow = done = row = col = 0;
while (screenp < endscreen && !done) {
/* Get the next character to put on the screen. */
/*
* The 'extra' array contains the extra stuff that is inserted to
* represent special characters (tabs, and other non-printable stuff.
* The order in the 'extra' array is reversed.
*/
if (nextra > 0)
c = extra[--nextra];
else {
c = gchar(&memp);
if (inc(&memp) == -1)
done = 1;
/*
* when getting a character from the file, we may have to turn it
* into something else on the way to putting it into
* 'Nextscreen'.
*/
if (c == TAB && !P(P_LS)) {
strcpy(extra, " ");
/* tab amount depends on current column */
nextra = ((P(P_TS) - 1) - col % P(P_TS));
c = ' ';
} else if (c == NUL && P(P_LS)) {
extra[0] = NUL;
nextra = 1;
c = '$';
} else if ((n = chars[c].ch_size) > 1) {
char *p;
nextra = 0;
p = chars[c].ch_str;
/* copy 'ch-str'ing into 'extra' in reverse */
while (n > 1)
extra[nextra++] = p[--n];
c = p[0];
}
}
if (c == NUL) {
srow = ++row;
/*
* Save this position in case the next line won't fit on the
* screen completely.
*/
save = memp;
/* get pointer to start of next row */
nextrow = &Nextscreen[row * Columns];
/* blank out the rest of this row */
while (screenp != nextrow)
*screenp++ = ' ';
col = 0;
continue;
}
if (col >= Columns) {
row++;
col = 0;
}
/* store the character in Nextscreen */
*screenp++ = c;
col++;
}
/*
* If we didn't hit the end of the file, and we didn't finish the last
* line we were working on, then the line didn't fit.
*/
if (!done && c != NUL) {
/*
* Clear the rest of the screen and mark the unused lines.
*/
screenp = &Nextscreen[srow * Columns];
while (screenp < endscreen)
*screenp++ = ' ';
for (; srow < (Rows - 1); srow++)
Nextscreen[srow * Columns] = '@';
*Botchar = save;
return;
}
/* make sure the rest of the screen is blank */
while (screenp < endscreen)
*screenp++ = ' ';
/* put '~'s on rows that aren't part of the file. */
if (col != 0)
row++;
while (row < Rows) {
Nextscreen[row * Columns] = '~';
row++;
}
if (done) /* we hit the end of the file */
*Botchar = *Fileend;
else
*Botchar = memp;
}