home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.update.uu.se
/
ftp.update.uu.se.2014.03.zip
/
ftp.update.uu.se
/
pub
/
rainbow
/
cpm
/
emacs
/
emacssrc.lzh
/
medisp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-11
|
2KB
|
81 lines
#include "medisp.h"
/*
* Update a single line. This
* does not know how to use insert
* or delete character sequences; we are
* using VT52 functionality. Update the physical
* row and column variables. It does try an
* exploit erase to end of line. The RAINBOW version
* of this routine uses fast video.
*/
updateline(row, vline, pline)
char *vline;
char *pline;
{
register char *cp1;
register char *cp2;
#define cp3 (*(char **)0x110)
#define cp4 (*(char **)0x112)
#define cp5 (*(char **)0x114)
#define nbflag (*(int *)0x116)
cp1 = vline; /* Compute left match. */
cp2 = pline;
cp5 = &vline[80];
while ( *cp1 == *cp2 )
{ if (cp1 == cp5) return;/* All equal. */
++cp1;
++cp2;
}
/* This can still happen, even though we only call this routine */
/* on changed lines. A hard update is always done when a line */
/* splits, a massive change is done, or a buffer is displayed */
/* twice. This optimizes out most of the excess updating. A lot */
/* of computes are used, but these tend to be hard operations */
/* that do a lot of update, so I don't really care. */
nbflag = FALSE;
cp3 = cp5; /* Compute right match. */
cp4 = &pline[80];
while ( *(--cp3) == *(--cp4) )
{ if ( *cp3 != ' ') /* Note if any nonblank */
nbflag = TRUE; /* in right match. */
}
cp5 = ++cp3; ++cp4;
if (nbflag == FALSE) /* Erase to EOL ? */
{ while ( cp5 != cp1 && cp5[ -1 ] == ' ' )
--cp5;
#ifdef NEVER
if ( cp3 - cp5 <= 3 ) /* Use only if erase is */
cp5 = cp3; /* fewer characters. */
#endif
}
movecursor(row, cp1 - &vline[0]); /* Go to start of line. */
while (cp1 != cp5) /* Ordinary. */
{ conout( *cp2++ = *cp1++ );
++ttcol;
/* *cp2++ = *cp1++; */
}
if (cp5 != cp3) /* Erase. */
{ ansieeol();
while (cp1 != cp3)
*cp2++ = *cp1++;
}
}
/*
* Send a command to the terminal
* to move the hardware cursor to row "row"
* and column "col". The row and column arguments
* are origin 0. Optimize out random calls.
* Update "ttrow" and "ttcol".
*/
movecursor(row, col)
int row, col;
{
if ( row != ttrow || col != ttcol )
{ ttrow = row;
ttcol = col;
ansimove( row, col );
}
}