windows-nt/Source/XPSP1/NT/shell/osshell/accesory/terminal/modeminp.c
2020-09-26 16:20:57 +08:00

2598 lines
66 KiB
C

/*===========================================================================*/
/* Copyright (c) 1987 - 1988, Future Soft Engineering, Inc. */
/* Houston, Texas */
/*===========================================================================*/
#define NOLSTRING TRUE /* jtf win3 mod */
#include <windows.h>
#include "port1632.h"
#include "dcrc.h"
#include "dynacomm.h"
#include "task.h"
#include "video.h"
#include "printfil.h"
static BOOL decPrivate; /* True if ? in set mode string */
static BOOL heathPrivate; /* True if > in set mode string */
#define MAXANSIARGS 10
static INT argNdx;
static INT argCount;
static INT ansiArg;
static INT argList[MAXANSIARGS+1];
static INT vidFG;
static INT p1;
static INT p2;
static INT saveCol = 0;
static INT saveLin = 0;
/*---------------------------------------------------------------------------*/
/* valIndex() - Return index into buffer given current line & column. [scf] */
/*---------------------------------------------------------------------------*/
INT valIndex ()
{
return ((curLin + savTopLine) * (maxChars + 2) + curCol);
}
/*---------------------------------------------------------------------------*/
/* cleanRect() - Erase nLines starting at line */
/*---------------------------------------------------------------------------*/
VOID cleanRect(INT line, INT nLines)
{
RECT eraseRect;
INT eraseLine;
eraseRect = hTE.viewRect;
eraseRect.top = (line + (savTopLine - curTopLine)) * chrHeight;
if((eraseLine = eraseRect.top + (nLines * chrHeight)) < eraseRect.bottom)
eraseRect.bottom = eraseLine;
if(eraseRect.top < eraseRect.bottom)
{
eraseColorRect((HDC) getPort(), (LPRECT) &eraseRect, ANORMAL);
releasePort();
}
}
/*---------------------------------------------------------------------------*/
/* scrollBuffer() - [scf] */
/*---------------------------------------------------------------------------*/
proc scrollBuffer ()
{
register INT line; // sdj: was unref- count;
INT buffLines;
RECT scrollRect, notScrollRect;
buffLines = savTopLine - curTopLine;
buffLines = min (buffLines, visScreenLine + 1);
if (buffLines > 0)
{
scrollRect = notScrollRect = hTE.viewRect;
if (lineFeeds < buffLines)
{
scrollRect.bottom = buffLines * chrHeight;
ScrollWindow (hTermWnd, 0, -(lineFeeds * chrHeight),
(LPRECT) &scrollRect, (LPRECT) &scrollRect);
}
lineFeeds = min (buffLines, lineFeeds);
line = -lineFeeds;
if(curTopLine == 0)
line += (visScreenLine+1) - savTopLine;
reDrawTermScreen(0, lineFeeds, line);
notScrollRect.top = scrollRect.bottom; /* Only validate our */
ValidateRect (hTermWnd, (LPRECT) &notScrollRect); /* stuff that we */
} /* repaint */
lineFeeds = 0;
}
/*---------------------------------------------------------------------------*/
/* doScroll() - */
/*---------------------------------------------------------------------------*/
proc doScroll ()
{
INT top, bottom, line, nLines; //sdj: was unref- buffLines;
RECT scrollRect, uncoveredRect;
top = savTopLine - curTopLine + scrollBegin;
bottom = top + (scrollEnd + 1 - scrollBegin);
top = max (top, 0);
bottom = min (bottom, visScreenLine + 1);
scrollRect.top = top * chrHeight;
scrollRect.bottom = bottom * chrHeight;
scrollRect.right = hTE.viewRect.right;
scrollRect.left = hTE.viewRect.left;
getPort ();
clipRect (&hTE.viewRect);
if (scrollRect.bottom > scrollRect.top)
{
hideTermCursor ();
if (abs(nScroll) < bottom - top)
{
ScrollWindow (hTermWnd, 0, -(nScroll * chrHeight),
(LPRECT) &scrollRect, (LPRECT) &scrollRect);
uncoveredRect.right = hTE.viewRect.right;
uncoveredRect.left = hTE.viewRect.left;
if (nScroll < 0) /* Inserting lines */
{
uncoveredRect.top = scrollRect.top;
uncoveredRect.bottom = scrollRect.top + ((-nScroll) * chrHeight);
} else /* Line feeds or deleting lines */
{
uncoveredRect.top = scrollRect.bottom - nScroll * chrHeight;
uncoveredRect.bottom = scrollRect.bottom;
}
ValidateRect (hTermWnd, (LPRECT) &uncoveredRect);
}
nLines = min (abs(nScroll), bottom - top);
if (nScroll > 0)
top = bottom - nLines + curTopLine - savTopLine;
else
top = top + curTopLine - savTopLine;
for (line = top; line < top + nLines; line++)
attrib[line][LFLAGS] = (LDIRTY | LCLEAR);
showTermCursor ();
}
releasePort ();
nScroll = 0;
}
/*---------------------------------------------------------------------------*/
/* termCleanUp() - */
/*---------------------------------------------------------------------------*/
VOID termCleanUp ()
{
register INT line, lin2;
BYTE lattr;
// sdj: was unref local - BYTE *attr;
checkSelect();
if(nScroll != 0)
doScroll();
if(lineFeeds != 0)
scrollBuffer();
for(line = 0; line <= maxScreenLine+1; )
{
lattr = attrib[line][LFLAGS];
if(lattr & LDIRTY)
{
updateLine(line);
line++;
}
else if(lattr & LCLEAR)
{
attrib[line][LFLAGS] = 0;
for(lin2 = line+1; lin2 <= maxScreenLine; lin2++)
{
if (lattr != attrib[lin2][LFLAGS])
break;
attrib[lin2][LFLAGS] = 0;
}
cleanRect (line, lin2 - line);
line = lin2;
}
else
line++;
}
termDirty = FALSE; /* mbbx: termLine -> termDirty */
}
/*---------------------------------------------------------------------------*/
/* putChar() - Put received characters into buffer [scf] */
/*---------------------------------------------------------------------------*/
proc putChar(BYTE ch)
{
INT ndx;
LPBYTE txtPtr;
LPBYTE txtSrc;
LPBYTE txtDst;
INT theLine;
INT len;
BYTE *attr;
txtPtr = GlobalLock(hTE.hText);
if(!statusLine)
{
ndx = (curLin + savTopLine) * (maxChars + 2) + curCol;
theLine = curLin;
}
else
{
ndx = curCol;
txtPtr = (LPBYTE) line25;
theLine = maxScreenLine + 1;
}
attr = attrib[theLine];
// if (attr[curCol] & ADIRTY)
// termCleanUp();
if (chInsMode)
{
len = maxChars - curCol - 2;
if (len > 0)
{
txtSrc = txtPtr + ndx;
txtDst = txtSrc + 1;
blockMove (txtSrc, txtDst, len);
txtSrc = (LPBYTE) attrib + theLine * ATTRROWLEN + curCol;
txtDst = txtSrc + 1;
blockMove (txtSrc, txtDst, len);
attr[LFLAGS] = LCLEAR;
}
}
if(!(termData.flags & TF_DIM))
txtPtr[ndx] = ch;
GlobalUnlock (hTE.hText);
attr[curCol] = curAttrib | ADIRTY;
attr[LFLAGS] |= LDIRTY;
termDirty = TRUE;
termCleanUp();
}
/*---------------------------------------------------------------------------*/
/* checkSelect() - [scf] */
/*---------------------------------------------------------------------------*/
VOID checkSelect()
{
LONG savTopNdx;
if (activSelect)
{
noSelect = FALSE;
savTopNdx = savTopLine*(maxChars + 2);
if (hTE.selEnd > savTopNdx)
if (savTopNdx <= hTE.selStart)
{
termSetSelect (MAXINTL, MAXINTL);
activSelect = FALSE;
}
else
termSetSelect (hTE.selStart, savTopNdx);
}
else
if(!noSelect)
{
termSetSelect (MAXINTL, MAXINTL);
noSelect = TRUE;
}
}
/*---------------------------------------------------------------------------*/
/* clrAttrib() - [scf] */
/*---------------------------------------------------------------------------*/
VOID clrAttrib (INT startLin, INT endLin, INT startCol, INT endCol)
{
INT lin, col;
for (lin = startLin; lin <= endLin; lin++)
for (col = startCol; col <= endCol; col++)
attrib[lin][col] = 0;
}
/*---------------------------------------------------------------------------*/
/* clrLines() - */
/*---------------------------------------------------------------------------*/
proc clrLines (INT lin1, INT lin2)
{
LPBYTE txt, attr;
register INT line;
txt = (LPBYTE)GlobalLock (hTE.hText) + (savTopLine + lin1) * (maxChars + 2);
if(lin1 == 24)
txt = (LPBYTE) line25;
for(line = lin1; line <= lin2; line++)
{
if(!protectMode) /* mbbx: protected fields */
{
attr = attrib[line];
if(attr[LFLAGS])
termCleanUp();
lsetmem(txt, CHFILL, maxChars);
lsetmem(attr, 0, maxChars);
attr[LFLAGS] = LCLEAR;
attr[LATTRIB] = LNORMAL; /* mbbx: mac version */
txt += maxChars + 2;
attr += ATTRROWLEN;
}
else
clrChars(line, 0, maxChars-1);
}
GlobalUnlock (hTE.hText);
termDirty = TRUE; /* mbbx: set dirty flag */
}
/*---------------------------------------------------------------------------*/
/* clrChars() - */
/*---------------------------------------------------------------------------*/
proc clrChars (INT line, INT col1, INT col2)
{
LPBYTE txt, attr;
register INT col;
txt = (LPBYTE)GlobalLock(hTE.hText) + (savTopLine + line) * (maxChars + 2) + col1;
if(line == 24)
txt = (LPBYTE) line25 + col1;
attr = attrib[line] + col1;
for(col = col1; col <= col2; col++)
{
if(*attr & ADIRTY)
termCleanUp();
if(!protectMode || !(*attr & APROTECT)) /* mbbx: protected fields */
{
*txt = CHFILL;
*attr |= ADIRTY;
}
txt += 1;
attr += 1;
}
attrib[line][LFLAGS] = LDIRTY;
GlobalUnlock (hTE.hText);
termDirty = TRUE; /* mbbx: set dirty flag */
}
/*---------------------------------------------------------------------------*/
/* getUnprot() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID getUnprot(INT begLin, INT begCol, INT *lin, INT *col)
{
INT iLin;
INT iCol;
*lin = 0;
*col = 0;
for(iLin = begLin; iLin < maxScreenLine; iLin++) /* MBBX: TEST LIMITS!!! */
for(iCol = begCol; iCol < maxChars; iCol++)
if(!(attrib[iLin][iCol] & APROTECT))
{
*lin = iLin;
*col = iCol;
break;
}
}
/*---------------------------------------------------------------------------*/
/* getProtCol() - [mbb] */
/*---------------------------------------------------------------------------*/
INT getProtCol()
{
INT col;
for(col = curCol; col+1 < maxChars; col++)
if(attrib[curLin][col+1] & APROTECT)
break;
return(col);
}
/*---------------------------------------------------------------------------*/
/* pCursToggle() - [scf] */
/*---------------------------------------------------------------------------*/
proc pCursToggle ()
{
if (cursorOn == 1)
offCursor ();
else if (cursorOn == 0)
onCursor ();
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pCursOn() - [scf] */
/*---------------------------------------------------------------------------*/
proc pCursOn ()
{
onCursor ();
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pCursOff() - [scf] */
/*---------------------------------------------------------------------------*/
proc pCursOff ()
{
offCursor ();
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pCursRC() - [scf] */
/*---------------------------------------------------------------------------*/
proc pCursRC ()
{
INT maxWide;
if (escLin == -1)
{
escLin = ch - ' ';
if ((escLin < 0) || (escLin > maxScreenLine))
termState = NULL;
}
else
{
escCol = ch - ' ';
if ((escCol >= 0) && (escCol < maxChars))
{
curLin = escLin;
curCol = escCol;
maxWide = maxChars / 2 - 1;
if (attrib[curLin][LATTRIB] != LNORMAL)
if (curCol > maxWide)
curCol = maxWide;
}
termState = NULL;
}
if (termState == NULL)
escLin = -1;
}
/*---------------------------------------------------------------------------*/
/* pSetStatusLine() - */
/*---------------------------------------------------------------------------*/
proc pSetStatusLine() /* mbbx 1.03: TV925 ... */
{
curLin = 24;
curCol = 0;
statusLine = TRUE;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pCursHome() - Home the terminal emulation cursor [scf] */
/*---------------------------------------------------------------------------*/
proc pCursHome ()
{
curLin = 0;
curCol = 0;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pVideo() - [scf] */
/*---------------------------------------------------------------------------*/
proc pVideo(BYTE attr)
{
if(attr == 0)
curAttrib = 0;
else
curAttrib |= attr;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pCursRelative() - Move cursor relative to current position [scf] */
/*---------------------------------------------------------------------------*/
proc pCursRelative (INT dh, INT dv)
{
INT maxWide;
curLin += dv;
curCol += dh;
if (curLin < 0)
curLin = 0;
else if (curLin > maxScreenLine)
curLin = maxScreenLine;
if (curCol < 0)
curCol = 0;
else if (curCol > (maxChars - 1))
curCol = maxChars - 1;
if (attrib[curLin][LATTRIB] != LNORMAL)
{
maxWide = maxChars / 2 - 1;
if (curCol > maxWide)
curCol = maxWide;
}
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pCursUp() - Move terminal emulation cursor up one relative to curr [scf] */
/*---------------------------------------------------------------------------*/
proc pCursUp ()
{
pCursRelative (0, -1);
}
/*---------------------------------------------------------------------------*/
/* pCursDn() - Move terminal emulation cursor down one relative to curr [scf]*/
/*---------------------------------------------------------------------------*/
proc pCursDn ()
{
pCursRelative (0, 1);
}
/*---------------------------------------------------------------------------*/
/* pCursRt() - Move terminal emulation cursor right one relative to curr[scf]*/
/*---------------------------------------------------------------------------*/
proc pCursRt ()
{
pCursRelative (1, 0);
}
/*---------------------------------------------------------------------------*/
/* pCursLt() - Move terminal emulation cursor left one relative to curr [scf]*/
/*---------------------------------------------------------------------------*/
proc pCursLt ()
{
pCursRelative (-1, 0);
}
/*---------------------------------------------------------------------------*/
/* pVPosAbsolute() - [scf] */
/*---------------------------------------------------------------------------*/
proc pVPosAbsolute ()
{
INT vPos;
vPos = chAscii & 0x1f;
curLin = vPos % (maxScreenLine + 1);
escSeq = FALSE;
escExtend = EXNONE;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pHPosAbsolute() -- [scf] */
/*---------------------------------------------------------------------------*/
proc pHPosAbsolute ()
{
INT hPos;
hPos = ((chAscii & 0x70) / 16) * 10; /* to BCD! */
hPos += chAscii & 0x0f;
curCol = hPos % 80;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pClrScr() - Clear the screen including attributes. */
/*---------------------------------------------------------------------------*/
VOID NEAR pClrScr()
{
pCursHome();
clrLines(0, maxScreenLine);
termState = NULL;
}
VOID FAR fpClrScr() /* mbbx: called from aFAR ... */
{
pClrScr();
}
/*---------------------------------------------------------------------------*/
/* pClrBol() - Clear terminal emulation video from current to beg. of line. */
/*---------------------------------------------------------------------------*/
proc pClrBol ()
{
if (curCol == maxChars-1)
clrLines (curLin, curLin);
else
clrChars (curLin, 0, curCol);
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pClrBop() - Clear terminal emulation video from curr to beg. of page. */
/*---------------------------------------------------------------------------*/
proc pClrBop ()
{
pClrBol ();
if (curLin > 0)
clrLines (0, curLin-1);
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pClrEol() - Clear logical IT video from present to end of line. [scf] */
/*---------------------------------------------------------------------------*/
proc pClrEol ()
{
if (curCol == 0)
clrLines (curLin, curLin);
else
clrChars (curLin, curCol, maxChars-1);
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pClrEop() - Clear the logical IT video from present to end of page. [scf] */
/*---------------------------------------------------------------------------*/
proc pClrEop ()
{
pClrEol ();
if (curLin < maxScreenLine)
clrLines (curLin + 1, maxScreenLine);
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pClrLine () Clear logical IT video from beginning to end of line. [scf] */
/*---------------------------------------------------------------------------*/
proc pClrLine ()
{
clrLines (curLin, curLin);
}
/*---------------------------------------------------------------------------*/
/* scrollAttrib () - [scf] */
/*---------------------------------------------------------------------------*/
proc scrollAttrib (INT startLin, INT endLin, INT nLines, BOOL up)
{
LPBYTE txtSrc;
LPBYTE txtDst;
INT len;
// sdj: was unref local - INT lin;
// sdj: was unref local - INT col;
if ((endLin - startLin) >= nLines)
{
txtSrc = (LPBYTE) attrib[0] + startLin*ATTRROWLEN;
txtDst = txtSrc + nLines*ATTRROWLEN;
len = (endLin - startLin + 1 - nLines)*ATTRROWLEN;
if (up)
blockMove(txtDst, txtSrc, len);
else
blockMove(txtSrc, txtDst, len);
}
}
/*---------------------------------------------------------------------------*/
/* pLF() - */
/*---------------------------------------------------------------------------*/
proc pLF()
{
LPBYTE txtDst, txtSrc;
// sdj: was unref local - LONG newStart, newEnd;
INT len; // sdj: was unref local - maxLin, savLin, bottomLine;
// sdj: was unref local - INT width, height;
checkSelect ();
UpdateWindow(hTermWnd); /* jtf 3.30 */
if(curLin == scrRgnEnd)
{
if(savTopLine == (maxLines - (maxScreenLine + 2))) /* no buffer left */
{
if(savTopLine > 0) /* mbbx 1.01: (maxLines == 25) */
{
txtDst = GlobalLock (hTE.hText);
txtSrc = txtDst + maxChars + 2;
len = (savTopLine - 1) * (maxChars + 2);
blockMove(txtSrc, txtDst, len);
txtSrc = txtDst + (savTopLine + scrRgnBeg) * (maxChars + 2);
txtDst = txtDst + len;
blockMove(txtSrc, txtDst, (DWORD) maxChars);
GlobalUnlock(hTE.hText);
if(curTopLine + visScreenLine < savTopLine)
{
if (curTopLine > 0)
curTopLine--;
else
lineFeeds++;
}
else
lineFeeds++;
}
pDelLin(scrRgnBeg, scrRgnEnd, 1);
}
else /* plenty of buffer */
{
if (scrRgnBeg != 0 || scrRgnEnd != maxScreenLine)
{
txtSrc = (LPBYTE)GlobalLock (hTE.hText) + savTopLine * (maxChars + 2);
txtDst = txtSrc + maxChars + 2;
blockMove (txtSrc, txtDst,
(DWORD) (maxScreenLine + 1) * (maxChars + 2));
txtDst = txtSrc;
txtSrc += (scrRgnBeg + 1) * (maxChars + 2);
blockMove (txtSrc, txtDst, (DWORD) maxChars);
GlobalUnlock (hTE.hText);
if (curTopLine + visScreenLine >= savTopLine)
{
curTopLine++;
lineFeeds++;
}
savTopLine++;
pDelLin (scrRgnBeg, scrRgnEnd, 1);
}
else
{
if(nScroll > 0)
{
if(((scrollBegin == scrRgnBeg) && (scrollEnd == scrRgnEnd)) &&
((nScroll + 1) < ((scrRgnEnd + 1 - scrRgnBeg) >> 2)))
{
nScroll++;
}
else
termCleanUp();
}
else if(nScroll < 0)
termCleanUp ();
if(nScroll == 0)
{
scrollBegin = scrRgnBeg;
scrollEnd = scrRgnEnd;
nScroll = 1;
}
if (curTopLine + visScreenLine >= savTopLine)
{
curTopLine++;
lineFeeds++;
}
savTopLine++;
scrollAttrib (scrRgnBeg, scrRgnEnd, 1, TRUE);
attrib[scrRgnEnd][LFLAGS] = 0;
clrLines (scrRgnEnd, scrRgnEnd);
}
}
nScrollPos.y = curTopLine;
updateTermScrollBars(FALSE);
termDirty = TRUE;
}
else
{
pCursRelative(0, 1);
if((curLin - savTopLine) - nScrollPos.y == visScreenLine+1) /* mbbx: TEST */
scrollDown(SB_VERT, SB_LINEDOWN, 1);
}
}
/*---------------------------------------------------------------------------*/
/* pInsLin() - Insert a line into the logical video screen. [scf] */
/*---------------------------------------------------------------------------*/
proc pInsLin (INT maxLin, INT nLines)
{
INT line, lin1;
INT len;
LPBYTE txtSrc;
LPBYTE txtDst;
if (statusLine)
clrLines (24,24);
else
{
if(nScroll < 0)
{
if(((scrollBegin == curLin) && (scrollEnd == maxLin)) &&
((abs(nScroll) + nLines) <= ((maxLin + 1 - curLin) >> 1)))
{
nScroll -= nLines;
}
else
termCleanUp();
}
else if(nScroll > 0)
termCleanUp();
if(nScroll == 0)
{
scrollBegin = curLin;
scrollEnd = maxLin;
nScroll = -nLines;
}
for(line = maxLin - nLines + 1; line <= maxLin; line++)
if(attrib[line][LFLAGS])
{
termCleanUp();
break;
}
scrollAttrib (curLin, maxLin, nLines, FALSE);
txtSrc = (LPBYTE)GlobalLock (hTE.hText) +
(curLin + savTopLine) * (maxChars + 2);
txtDst = txtSrc + nLines * (maxChars + 2);
len = (maxLin + 1 - curLin - nLines) * (maxChars + 2);
if (len > 0)
blockMove (txtSrc, txtDst, (DWORD) len);
line = curLin + nLines - 1;
for (lin1 = curLin; lin1 <= line; lin1++)
attrib[lin1][LFLAGS] = 0;
clrLines (curLin, line);
GlobalUnlock (hTE.hText);
}
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pDelLin() - Delete a line */
/*---------------------------------------------------------------------------*/
proc pDelLin (INT curLin, INT maxLin, INT nLines)
{
INT line, lin1;
INT len;
LPBYTE txtSrc;
LPBYTE txtDst;
if(statusLine)
clrLines(24, 24);
else
{
if(nScroll > 0)
{
if(((scrollBegin == curLin) && (scrollEnd == maxLin)) &&
((nScroll + nLines) <= ((maxLin + 1 - curLin) >> 2)))
{
nScroll += nLines;
}
else
termCleanUp();
}
else if(nScroll < 0)
termCleanUp();
if(nScroll == 0)
{
scrollBegin = curLin;
scrollEnd = maxLin;
nScroll = nLines;
}
for(line = curLin; line < curLin + nLines; line++)
if(attrib[line][LFLAGS])
{
termCleanUp();
break;
}
scrollAttrib (curLin, maxLin, nLines, TRUE);
txtDst = (LPBYTE)GlobalLock (hTE.hText) +
(curLin + savTopLine) * (maxChars + 2);
txtSrc = txtDst + nLines * (maxChars + 2);
len = (maxLin + 1 - curLin - nLines) * (maxChars + 2);
if (len > 0)
blockMove (txtSrc, txtDst, (DWORD) len);
line = maxLin - nLines + 1;
for (lin1 = line; lin1 <= maxLin; lin1++)
attrib[lin1][LFLAGS] = 0;
clrLines (line, maxLin);
GlobalUnlock (hTE.hText);
}
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pDelChar() - Delete a char from the terminal emulation video. [scf] */
/*---------------------------------------------------------------------------*/
proc pDelChar(INT nChars)
{
INT ndx;
// sdj: was unref local - INT savCol;
INT theLine;
DWORD len;
LPBYTE txtSrc;
LPBYTE txtDst;
// sdj: was unref local - LPBYTE txtPtr;
LPBYTE globalHeap;
globalHeap = GlobalLock(hTE.hText);
if(!protectMode) /* mbbx: protected fields */
len = maxChars - nChars - curCol;
else
len = getProtCol() - nChars - (curCol+1);
if(statusLine)
{
theLine = maxScreenLine + 1;
txtDst = (LPBYTE) line25 + curCol;
}
else
{
theLine = curLin;
txtDst = globalHeap + valIndex ();
}
if (len > 0)
{
txtSrc = txtDst + nChars;
blockMove (txtSrc, txtDst, len);
}
else
{
nChars = maxChars - curCol;
len = 0;
}
txtSrc = txtDst + len;
for (ndx = 0; ndx <= (nChars - 1); ndx++)
txtSrc[ndx] = CHFILL;
GlobalUnlock (hTE.hText);
attrib[theLine][LFLAGS] = LCLEAR | LDIRTY;
}
/*---------------------------------------------------------------------------*/
/* begGraphics() - [scf] */
/*---------------------------------------------------------------------------*/
VOID begGraphics () /* macx */
{
termCleanUp ();
offCursor ();
}
/*---------------------------------------------------------------------------*/
/* endGraphics() - [scf] */
/*---------------------------------------------------------------------------*/
VOID endGraphics () /* macx */
{
onCursor ();
}
/*---------------------------------------------------------------------------*/
/* pGrChar () - */
/*---------------------------------------------------------------------------*/
static HDC graphicsPort;
#define GRCOLBEG 48
#define GRLINBEG 0
#define MAXGRCOL 512
proc pGrSemi ()
{
/* jtfterm */
}
/*---------------------------------------------------------------------------*/
/* pGrDoIt() - */
/*---------------------------------------------------------------------------*/
proc pGrDoIt (INT len, HBRUSH p)
{
/* jtfterm */
}
/*---------------------------------------------------------------------------*/
/* pGrFill() - [scf] */
/*---------------------------------------------------------------------------*/
proc pGrFill ()
{
ch = theChar;
if (ch == 7)
{
sysBeep ();
vidGraphics = GRNONE;
termState = NULL;
chrWidth = stdChrWidth;
chrHeight = stdChrHeight;
endGraphics ();
}
else if (ch != CR && ch != LF)
{
if (vidBG == -1)
vidBG = (ch - ' ')*chrWidth;
else
{
vidFG = (ch - ' ')*chrWidth;
if (vidBG > 0)
pGrDoIt(vidBG, blackBrush);
if (vidFG > 0)
pGrDoIt(vidFG, theBrush);
vidBG = -1;
}
}
else
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pGrChar() */
/*---------------------------------------------------------------------------*/
proc pGrChar ()
{
HRGN hClipRgn;
RECT clpRect;
getPort ();
graphicsPort = thePort;
GetClientRect (hTermWnd, (LPRECT) &clpRect);
hClipRgn = CreateRectRgnIndirect ((LPRECT) &clpRect);
SelectClipRgn(thePort, hClipRgn);
DeleteObject (hClipRgn);
ch = the8Char;
if (vidGraphics == GRSEMI)
if ((the8Char & 0x80) != 0)
pGrSemi ();
else
termState = NULL;
else
pGrFill ();
releasePort ();
}
/*---------------------------------------------------------------------------*/
/* pSetGrMode() - [scf] */
/*---------------------------------------------------------------------------*/
proc pSetGrMode()
{
/* jtfterm */
}
/*---------------------------------------------------------------------------*/
/* pSetMode() - [scf] */
/*---------------------------------------------------------------------------*/
proc pSetMode ()
{
BYTE chSet;
termState = NULL;
if((trmParams.emulate >= ITMVT52) && (trmParams.emulate <= ITMVT220)) /* mbbx: why VT52??? */
switch (ch)
{
case 0x0e:
case 0x0f:
if (ch == 0x0e)
shiftCharSet = 1;
else
shiftCharSet = 0;
chSet = charSet[shiftCharSet];
if ((chSet == '0') || (chSet == '2'))
curAttrib |= AGRAPHICS;
else
curAttrib &= ANOTGRAPHICS;
break;
case 'x': /* VT52/Heath*/
escExtend = EXSETMODE;
termState = pSetMode;
break;
case 'y': /* VT52/Heath */
escExtend = EXRESETMODE;
termState = pSetMode;
break;
case '=':
keyPadAppMode = TRUE;
break;
case '>':
keyPadAppMode = FALSE;
break;
case '<':
trmParams.emulate = ITMVT100;
resetEmul ();
break;
case '5': /* VT52/Heath */
if (escExtend == EXSETMODE)
pCursOff ();
else
pCursOn ();
break;
case '7': /* VT52/Heath */
keyPadAppMode = (escExtend == EXSETMODE);
break;
case '@':
chInsMode = TRUE;
break;
case 'O':
chInsMode = FALSE;
break;
}
}
/*---------------------------------------------------------------------------*/
/* pDecScs() - VT-100 character set selection. [scf] */
/*---------------------------------------------------------------------------*/
proc pDecScs ()
{
BYTE chSet;
termState = NULL;
switch (ch)
{
case '(':
decScs = 0;
termState = pDecScs;
break;
case ')':
decScs = 1;
termState = pDecScs;
break;
case 'A':
case 'B':
case '0':
case '1':
case '2':
charSet[decScs] = ch;
chSet = charSet[shiftCharSet];
if ((chSet == '0') || (chSet == '2'))
curAttrib |= AGRAPHICS;
else
curAttrib &= ANOTGRAPHICS;
break;
}
}
/*---------------------------------------------------------------------------*/
/* getArg() - */
/*---------------------------------------------------------------------------*/
#define getArg ((argNdx < argCount) ? argList[argNdx++] : 0)
/*---------------------------------------------------------------------------*/
/* getParms () */
/*---------------------------------------------------------------------------*/
proc getParms ()
{
p1 = getArg;
p2 = getArg;
}
/*---------------------------------------------------------------------------*/
/* pInquire() - [scf] */
/*---------------------------------------------------------------------------*/
proc pInquire() /* mbbx 1.04: VT220... */
{
STRING respStr[32];
*respStr = 0;
switch(trmParams.emulate)
{
case ITMVT100:
getParms();
if(p1 == 0)
memcpy(respStr, "\7\033[?1;2c", 9);
break;
case ITMVT52:
memcpy(respStr, "\3\033/Z", 5);
break;
}
if(*respStr)
termStr(respStr, 0, FALSE);
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pTab() - [scf] */
/*---------------------------------------------------------------------------*/
proc pTab()
{
INT ndx;
INT savCol;
INT lin, col;
if(!protectMode)
{
savCol = curCol;
ndx = curCol + 1;
while (ndx <= 131)
if(tabs[ndx] == 1)
{
curCol = ndx;
ndx = 133;
}
else
ndx++;
}
else /* mbbx: tab for protected mode */
{
lin = 0;
col = 0;
repeat
getUnprot(lin, col, &lin, &col);
until((lin >= curLin) && (col >= curCol));
ndx = 0;
curLin = lin;
curCol = col;
}
if((ndx == 132) || (curCol >= maxChars))
curCol = maxChars - 1;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pClearAllTabs() - [scf] */
/*---------------------------------------------------------------------------*/
proc pClearAllTabs ()
{
INT ndx;
for (ndx = 0; ndx <= 131; ndx++)
tabs[ndx] = 0;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pSetTab() - [scf] */
/*---------------------------------------------------------------------------*/
proc pSetTab ()
{
tabs[curCol] = 1;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pClearTab() - [scf] */
/*---------------------------------------------------------------------------*/
proc pClearTab ()
{
tabs[curCol] = 0;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pCmpSrvResponse() - [scf] */
/*---------------------------------------------------------------------------*/
proc pCmpSrvResponse ()
{
/* jtfterm */
}
/*---------------------------------------------------------------------------*/
/* pSndCursor() - [scf] */
/*---------------------------------------------------------------------------*/
proc pSndCursor()
{
LONG finalTicks;
termState = NULL;
switch(trmParams.emulate)
{
case ITMVT52:
modemWr (0x1b); delay (5, &finalTicks);
modemWr ('Y'); delay (5, &finalTicks);
modemWr ((BYTE) curLin + ' '); delay (5, &finalTicks);
modemWr ((BYTE) curCol + ' '); delay (5, &finalTicks);
break;
}
}
/*---------------------------------------------------------------------------*/
/* pIndex() - */
/*---------------------------------------------------------------------------*/
proc pIndex ()
{
if (curLin == scrRgnEnd)
pDelLin (scrRgnBeg, scrRgnEnd, 1);
else
pCursRelative (0, 1);
}
/*---------------------------------------------------------------------------*/
/* pRevIndex() - [scf] */
/*---------------------------------------------------------------------------*/
proc pRevIndex ()
{
if (curLin == scrRgnBeg)
pInsLin (scrRgnEnd, 1);
else
pCursRelative (0, -1);
}
/*---------------------------------------------------------------------------*/
/* pSetLineAttrib() - [scf] */
/*---------------------------------------------------------------------------*/
proc pSetLineAttrib ()
{
BYTE lAttr;
INT theLin;
INT savCol;
INT ndx;
INT half;
LPBYTE txtPtr;
LPBYTE globalHeap;
lAttr = -1;
switch (ch)
{
case '3':
lAttr = LHIGHTOP;
break;
case '4':
lAttr = LHIGHBOTTOM;
break;
case '5':
lAttr = LNORMAL;
break;
case '6':
lAttr = LWIDE;
break;
}
if (statusLine)
theLin = 24;
else
theLin = curLin;
if (lAttr != -1)
if (lAttr != attrib[theLin][LATTRIB])
{
savCol = curCol;
curCol = 0;
half = maxChars;
if (lAttr != LNORMAL)
{
half = maxChars / 2;
globalHeap = GlobalLock (hTE.hText);
txtPtr = globalHeap + valIndex ();
for (ndx = half; ndx <= (maxChars - 1); ndx++)
{
txtPtr[ndx] = ' ';
attrib[theLin][ndx] = 0;
}
GlobalUnlock (hTE.hText);
}
attrib[theLin][LATTRIB] = lAttr;
attrib[theLin][LFLAGS] = LCLEAR | LDIRTY; /* mbbx: mac version */
reDrawTermLine (theLin, 0, half);
curCol = savCol;
}
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pInsChar() - [scf] */
/*---------------------------------------------------------------------------*/
proc pInsChar ()
{
BOOL savMode;
if(!protectMode)
{
savMode = chInsMode;
chInsMode = TRUE;
putChar (' ');
chInsMode = savMode;
termState = NULL;
}
else
pDelChar(1);
}
/*---------------------------------------------------------------------------*/
/* pSaveCursorPos() - */
/*---------------------------------------------------------------------------*/
proc pSaveCursorPos ()
{
saveCol = curCol;
saveLin = curLin;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pRestoreCursorPos() - */
/*---------------------------------------------------------------------------*/
proc pRestoreCursorPos ()
{
curCol = saveCol;
curLin = saveLin;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pEscSkip */
/*---------------------------------------------------------------------------*/
proc pEscSkip ()
{
escSkip--;
if (escSkip <= 0)
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* Some change of state procedures */
/*---------------------------------------------------------------------------*/
proc pNullState ()
{
termState = NULL;
}
proc pCursorState ()
{
termState = pCursRC;
}
proc pVPosState ()
{
termState = pVPosAbsolute;
}
proc pHPosState ()
{
termState = pHPosAbsolute;
}
proc pLAttrState ()
{
termState = pSetLineAttrib;
}
/*---------------------------------------------------------------------------*/
/* pAnsi() - [scf] */
/*---------------------------------------------------------------------------*/
proc pAnsi()
{
if((chAscii >= '0') && (chAscii <= '?'))
(*ansiParseTable[chAscii-'0'])();
else
{
if(ansiArg)
argList[argCount++] = ansiArg;
(*aEscTable[chAscii &= 0x7F])(); /* mbbx 1.06: modemInp() not masking 8th bit */
if(termState != aEscTable[chAscii]) /* mbbx 1.10: VT220 8BIT patch !!! */
termState = NULL;
}
}
proc pAnsiState ()
{
termState = pAnsi;
argNdx = 0;
argCount = 0;
ansiArg = 0;
decPrivate = FALSE;
heathPrivate = FALSE;
}
proc pGrState ()
{
termState = pSetGrMode;
}
proc pSkipState ()
{
escSkip = emulInfo[chAscii] - 128;
termState = pEscSkip;
}
proc pReverseOff() /* mbbx: pProtOff -> pReverseOff */
{
pVideo(0);
}
proc pReverseOn() /* mbbx: pProtOn -> pReverseOn */
{
pVideo(ABOLD); /* mbbx per jtfx */
}
proc pProtOff() /* mbbx */
{
protectMode = FALSE;
termState = NULL;
}
proc pProtOn() /* mbbx */
{
protectMode = TRUE;
termState = NULL;
}
proc pBegProtect() /* mbbx 1.03: TV925... */
{
pVideo(APROTECT);
pVideo(ABOLD);
}
proc pEndProtect() /* mbbx 1.03: TV925... */
{
pVideo(ANORMAL);
}
proc pBegGraphics() /* mbbx 1.03: TV925... */
{
curAttrib |= AGRAPHICS;
termState = NULL;
}
proc pEndGraphics() /* mbbx 1.03: TV925... */
{
curAttrib &= ANOTGRAPHICS;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* Some patches */
/*---------------------------------------------------------------------------*/
proc pLinDel ()
{
pDelLin(curLin, maxScreenLine, 1); /* mbbx per slcx */
}
proc pCharDel ()
{
pDelChar(1);
}
proc pLinIns ()
{
pInsLin(maxScreenLine, 1);
}
proc pNextLine ()
{
pLF ();
curCol = 0;
}
proc pClrAll()
{
protectMode = FALSE;
pClrScr();
}
proc pPrintOn()
{
PrintFileComm(TRUE); /* mbbx 1.03: prAction(!prtFlag); */
termState = NULL;
}
proc pPrintOff()
{
// sdj: was unref local - BYTE work[STR255];
PrintFileComm(FALSE); /* mbbx 1.03: prAction(!prtFlag); */
termState = NULL;
}
/*---------------------------------------------------------------------------*/
#define TRANS_PRINT_BUFFER 4
STRING transPrtBuf[TRANS_PRINT_BUFFER+1];
proc pTransPrint() /* mbbx 2.01.32 ... */
{
if(trmParams.emulate == ITMVT100)
{
getParms();
switch(p1)
{
case 5:
transPrintFlag = TRUE;
*transPrtBuf = 0; /* slc gold 017 */
break;
case 4:
PrintFileComm(FALSE);
transPrintFlag = FALSE;
break;
case 1:
/* print cursor line */
break;
case 0:
/* print screen */
break;
}
}
else
transPrintFlag = TRUE;
if(transPrintFlag)
PrintFileComm(TRUE);
termState = NULL;
}
/*---------------------------------------------------------------------------*/
proc pVideoAttrib() /* mbbx 1.03: added breaks !!! */
{
switch(trmParams.emulate)
{
/* jtfterm */
}
termState = NULL;
}
proc pVideoAttribState()
{
termState = pVideoAttrib;
}
proc pCursorOnOff()
{
if(chAscii != '0')
pCursOn();
else
pCursOff();
}
proc pCursorOnOffState()
{
termState = pCursorOnOff;
}
/*---------------------------------------------------------------------------*/
/* pAnswerBack() - [mbb] */
/*---------------------------------------------------------------------------*/
proc pAnswerBack()
{
#ifdef ORGCODE
INT i;
#else
DWORD i;
#endif
BYTE saveEcho;
LONG finalTicks;
STRING temp[DCS_ANSWERBACKSZ+1]; /* rkhx 2.00 */
saveEcho = trmParams.localEcho;
trmParams.localEcho = FALSE; /* mbbx 1.10: CUA */
strcpy(temp+1, trmParams.answerBack); /* rkhx 2.00 */
*temp = strlen(temp+1);
stripControl(temp);
for(i = 1; i <= *temp; i++)
{
modemWr(temp[i]);
delay(2, &finalTicks);
}
trmParams.localEcho = saveEcho;
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pEchoOff() - [mbb] */
/*---------------------------------------------------------------------------*/
proc pEchoOff()
{
trmParams.localEcho = FALSE; /* mbbx 1.10: CUA */
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pEchoOn() - [mbb] */
/*---------------------------------------------------------------------------*/
proc pEchoOn()
{
trmParams.localEcho = TRUE; /* mbbx 1.10: CUA */
termState = NULL;
}
/* mbbx: added to make the TABLE handling consistent 1/6/88 */
proc pCR()
{
if((trmParams.emulate == ITMDELTA) && (curCol > 0))
{
while(curCol < maxChars)
{
putChar(SP);
curCol++;
}
}
curCol = 0;
if(statusLine) /* mbbx 1.03: TV925 per slcx... */
{
curLin = 0;
statusLine = FALSE;
}
}
proc pBackSpace()
{
if(curCol > 0) /* jtf 3.14 */
curCol--;
/* jtf 3.33 putChar(SP); */ /* desctructive backspace 3.17 */
}
proc pBeep()
{
if(trmParams.sound) /* mbbx 1.04: synch */
sysBeep();
}
/*---------------------------------------------------------------------------*/
/* pEscSequence */
/*---------------------------------------------------------------------------*/
proc pEscSequence()
{
(*pEscTable[chAscii & 0x7F])(); /* mbbx 2.00: modemInp() not masking 8th bit */
}
/*------------------ >>> pAnsi() Global Declarations <<< ------------------*/
/* Procedure pAnsi () */
/*---------------------------------------------------------------------------*/
/* aSetCompLevel() - set VT220 Compatibility Level [mbb/rkh] */
/*---------------------------------------------------------------------------*/
VOID NEAR aSetCompLevel() /* mbbx 1.10: VT220 8BIT... */
{
BYTE newEmul;
termState = NULL;
switch(ch)
{
case '"':
termState = aSetCompLevel;
break;
case 'p':
switch(getArg)
{
case 61:
newEmul = ITMVT100;
break;
case 62:
newEmul = ITMVT220;
trmParams.fCtrlBits = !(getArg == 1);
break;
default:
return;
}
if(newEmul != trmParams.emulate)
{
trmParams.emulate = newEmul;
resetEmul();
}
break;
}
}
VOID NEAR pSetCtrlBits() /* mbbx 2.00: VT220 8BIT... */
{
termState = NULL;
switch(ch)
{
case ' ':
termState = pSetCtrlBits;
break;
case 'F':
trmParams.fCtrlBits = FALSE;
break;
case 'G':
trmParams.fCtrlBits = TRUE;
break;
}
}
/*---------------------------------------------------------------------------*/
/* aCursor() [scf] */
/*---------------------------------------------------------------------------*/
proc aCursor()
{
register INT lin, col;
getParms ();
if (p1 == 0)
p1 = 1;
if (p2 == 0)
p2 = 1;
lin = p1 - 1;
col = p2 - 1;
if (originMode)
{
lin += scrRgnBeg;
if (lin < scrRgnEnd)
curLin = lin;
else
curLin = scrRgnEnd;
}
else
if (lin <= maxScreenLine)
{
if (statusLine)
{
statusLine = FALSE;
}
curLin = lin;
}
else
{
if (!statusLine)
{
statusLine = TRUE;
}
curLin = maxScreenLine;
}
if (col < maxChars)
curCol = col;
}
/*---------------------------------------------------------------------------*/
/* aClrEol() - [scf] */
/*---------------------------------------------------------------------------*/
proc aClrEol ()
{
getParms ();
if (p1 == 0)
pClrEol ();
else if (p1 == 1)
pClrBol ();
else if (p1 == 2)
{
pClrBol ();
pClrEol ();
}
}
/*---------------------------------------------------------------------------*/
/* aClrEop() - [scf] */
/*---------------------------------------------------------------------------*/
proc aClrEop ()
{
getParms ();
if (p1 == 0)
pClrEop ();
else if (p1 == 2)
pClrScr ();
else if (p1 == 1)
pClrBop ();
}
/*---------------------------------------------------------------------------*/
/* aCursUp() - [scf] */
/*---------------------------------------------------------------------------*/
proc aCursUp ()
{
getParms ();
if (p1 == 0)
p1 = 1;
pCursRelative (0, (INT) -p1);
}
/*---------------------------------------------------------------------------*/
/* aCursDn() - [scf] */
/*---------------------------------------------------------------------------*/
proc aCursDn ()
{
getParms ();
if (p1 == 0)
p1 = 1;
pCursRelative (0, (INT) p1);
}
/*---------------------------------------------------------------------------*/
/* aCursRt() - [scf] */
/*---------------------------------------------------------------------------*/
proc aCursRt ()
{
getParms ();
if (p1 == 0)
p1 = 1;
pCursRelative ((INT) p1, 0);
}
/*---------------------------------------------------------------------------*/
/* aCursLt() - [scf] */
/*---------------------------------------------------------------------------*/
proc aCursLt ()
{
getParms ();
if (p1 == 0)
p1 = 1;
pCursRelative ((INT) -p1, 0);
}
/*---------------------------------------------------------------------------*/
/* aClearTabs() - [scf] */
/*---------------------------------------------------------------------------*/
proc aClearTabs ()
{
getParms ();
if (p1 == 3)
pClearAllTabs ();
else if (p1 == 0)
pClearTab ();
}
/*---------------------------------------------------------------------------*/
/* aVideo() - [scf] */
/*---------------------------------------------------------------------------*/
proc aVideo ()
{
repeat
{
switch ((WORD) getArg)
{
case 0:
curAttrib &= AGRAPHICS;
break;
case 1:
curAttrib |= ABOLD;
break;
case 4:
curAttrib |= AUNDERLINE;
break;
case 5:
curAttrib |= ABLINK;
break;
case 7:
curAttrib |= AREVERSE;
break;
}
}
until (argNdx == argCount);
}
/*---------------------------------------------------------------------------*/
/* aSetMode() - [mbb] */
/*---------------------------------------------------------------------------*/
proc aSetMode() /* mbbx 2.00: cleanup... */
{
while(argNdx < argCount)
{
switch(ch)
{
case 'h':
if(decPrivate) /* SET DEC private modes */
{
switch(getArg)
{
case 1:
cursorKeyMode = TRUE;
break;
case 6:
originMode = TRUE;
curLin = scrRgnBeg;
curCol = 0;
break;
case 7:
trmParams.lineWrap = TRUE; /* mbbx 1.10: CUA... */
break;
}
}
else if(heathPrivate) /* RESET heath private modes */
{
switch(getArg)
{
case 5:
pCursOn();
break;
case 7:
keyPadAppMode = FALSE;
break;
}
}
else
{
switch(getArg)
{
case 4:
chInsMode = TRUE;
break;
}
}
break;
case 'l':
if(decPrivate) /* RESET DEC private modes */
{
switch(getArg)
{
case 1:
cursorKeyMode = FALSE;
break;
case 2:
trmParams.emulate = ITMVT52;
resetEmul ();
break;
case 6:
originMode = FALSE;
pCursHome();
break;
case 7:
trmParams.lineWrap = FALSE; /* mbbx 1.10: CUA... */
break;
}
}
else if(heathPrivate)
{
switch(getArg) /* SET HEATH private modes */
{
case 5:
pCursOff();
break;
case 7:
keyPadAppMode = TRUE;
break;
}
}
else
{
switch(getArg)
{
case 4:
chInsMode = FALSE;
break;
}
}
break;
}
}
}
/*---------------------------------------------------------------------------*/
/* aReport() - [scf] */
/*---------------------------------------------------------------------------*/
proc aReport() /* mbbx 1.04: cleanup... */
{
STRING respStr[16];
getParms();
switch(p1)
{
case 6:
sprintf(respStr+1, "\033[%d;%dR", curLin+1, curCol+1);
*respStr = strlen(respStr+1);
break;
case 5:
memcpy(respStr, "\4\033[0n", 5);
break;
}
if(*respStr != 0)
termStr(respStr, 0, FALSE);
}
/*---------------------------------------------------------------------------*/
/* aSetScrRgn() - [scf] */
/*---------------------------------------------------------------------------*/
proc aSetScrRgn ()
{
getParms ();
if (p1 == 0)
p1 = 1;
if (p2 == 0)
p2 = 1;
if ((p2 > p1) && (p2 <= (maxScreenLine + 1)))
{
scrRgnBeg = p1 - 1;
scrRgnEnd = p2 - 1;
}
else if (p2 == 1)
{
scrRgnBeg = 0;
scrRgnEnd = maxScreenLine;
}
if (originMode)
curLin = scrRgnBeg;
else
curLin = 0;
curCol = 0;
}
/*---------------------------------------------------------------------------*/
/* aDelLin() - [scf] */
/*---------------------------------------------------------------------------*/
proc aDelLin ()
{
INT len;
getParms ();
if (p1 == 0)
p1 = 1;
if ((curLin >= scrRgnBeg) && (curLin <= scrRgnEnd))
{
len = scrRgnEnd - curLin + 1;
if (p1 > len)
p1 = len;
pDelLin(curLin, scrRgnEnd, (INT) p1); /* mbbx per slcx */
curCol = 0;
}
}
/*---------------------------------------------------------------------------*/
/* aInsLin() - [scf] */
/*---------------------------------------------------------------------------*/
proc aInsLin ()
{
INT len;
getParms ();
if (p1 == 0)
p1 = 1;
if ((curLin >= scrRgnBeg) && (curLin <= scrRgnEnd))
{
len = scrRgnEnd - curLin + 1;
if (p1 > len)
p1 = len;
pInsLin (scrRgnEnd, (INT) p1);
curCol = 0;
}
}
/*---------------------------------------------------------------------------*/
/* aDelChar() - [scf] */
/*---------------------------------------------------------------------------*/
proc aDelChar ()
{
getParms ();
if (p1 == 0)
p1 = 1;
pDelChar ((INT) p1);
}
/*---------------------------------------------------------------------------*/
/* VT-100 exceptions (same terminator for ANSI and non-Ansi sequence) */
/*---------------------------------------------------------------------------*/
proc pVT100H ()
{
if (termState == pAnsi)
aCursor ();
else
pSetTab ();
termState = NULL;
}
proc pVT100D ()
{
if (termState == pAnsi)
aCursLt ();
else
pLF ();
termState = NULL;
}
proc pVT100M ()
{
if (termState == pAnsi)
aDelLin ();
else
pRevIndex ();
termState = NULL;
}
proc pVT100c()
{
if(termState == pAnsi)
pInquire(); /* mbbx 1.10: aReport() was wrong! */
else
{
resetEmul();
pClrScr();
}
termState = NULL;
}
proc pVT100P() /* mbbx: new routine */
{
if(termState == pAnsi)
aDelChar();
else
termState = pDCS; /* mbbx: yterm */
}
/*---------------------------------------------------------------------------*/
/* pDCS() - */
/*---------------------------------------------------------------------------*/
proc pDCS()
{
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* pDCSTerminate() - */
/*---------------------------------------------------------------------------*/
proc pDCSTerminate()
{
termState = NULL;
}
/*---------------------------------------------------------------------------*/
/* Ansi Parser Routines */
/*---------------------------------------------------------------------------*/
proc ansiArgument () /* chAscii IN ['0' .. '9'] */
{
ansiArg = (ansiArg*10) + chAscii - '0';
}
proc ansiDelimiter () /* chAscii == ';' */
{
if (argCount < MAXANSIARGS)
argList[argCount++] = ansiArg;
ansiArg = 0;
}
proc ansiHeathPrivate () /* chAscii == '>' */
{
heathPrivate = TRUE;
}
proc ansiDecPrivate () /* chAscii == '?' */
{
decPrivate = TRUE;
}
/*---------------------------------------------------------------------------*/
/* putRcvChar() - [mbb] */
/*---------------------------------------------------------------------------*/
BOOL NEAR writeRcvChar(BYTE theChar)
{
LPSTR lpBuffer; /* rjs bugs 016 */
lpBuffer = GlobalLock(xferBufferHandle); /* rjs bugs 016 */
if((!xferSaveCtlChr) && ((theChar == BS) || (theChar == DEL))) /* rjs bugs 016 */
{
// sdj: if the very first character in the 1k pkt happens to
// sdj: be BS or DEL, then --xferBufferCount is going to be
// sdj: 64K! causing the access violation.
// sdj: lets not write the BS,DEL into the text file in these
// sdj: cases because what needs to be changed is the last byte
// sdj: of the last pkt which was written to the file! forget
// sdj: that for the time being and avoid the access violation.
if (xferBufferCount)
lpBuffer[--xferBufferCount] = 0x00; /* rjs bugs 016 */
}
else /* rjs bugs 016 */
lpBuffer[xferBufferCount++] = theChar; /* rjs bugs 016 */
if (xferBufferCount == 1024) /* rjs bugs 016 */
if (_lwrite((INT)xferRefNo, (LPSTR)lpBuffer,(INT) 1024) != 1024) /* rjs bugs 016 */
{
GlobalUnlock(xferBufferHandle); /* rjs bugs 016 */
xferEnd();
TF_ErrProc(STREWRERR, MB_OK | MB_ICONHAND, 999);
return(FALSE);
}
GlobalUnlock(xferBufferHandle); /* rjs bugs 016 */
if (xferBufferCount==1024) xferBufferCount = 0; /* rjs bugs 016 */
if(( (xferLength += 1) % 0x0400 ) == 0L ) /* rjs bugs 016 */
showBBytes(xferLength, FALSE);
return(TRUE);
}
VOID NEAR putRcvChar(BYTE theChar)
{
BYTE the7Char = theChar & 0x7F;
if(xferTableSave)
{
switch(the7Char)
{
case CR:
tblPos = TBLBEGINLINE;
break;
case TAB:
tblPos = TBLSPACES;
return;
case SP:
if(tblPos < TBLSPACES)
tblPos += 1;
return;
default:
if(xferSaveCtlChr || (the7Char == FF) || (the7Char == LF) ||
((the7Char >= 0x20) && (the7Char <= 0x7E)))
{
switch(tblPos)
{
case TBLONESPACE:
if(!writeRcvChar(SP))
return;
break;
case TBLSPACES:
if(!writeRcvChar(TAB))
return;
break;
}
tblPos = TBLNONSPACE;
}
break;
}
}
if(xferSaveCtlChr || (the7Char == TAB) || (the7Char == FF) || (the7Char == LF) ||
(the7Char == CR) || (the7Char == BS) || (the7Char == DEL) || /* rjs bugs 016 -> add BS and DEL */
((the7Char >= 0x20) && (the7Char <= 0x7E)))
{
writeRcvChar(theChar);
}
}
/*---------------------------------------------------------------------------*/
/* checkTransPrint() - [mbb] */
/*---------------------------------------------------------------------------*/
#define TRANS_PRINT_BUFFER 4
STRING transPrtBuf[TRANS_PRINT_BUFFER+1];
VOID NEAR checkTransPrint(BYTE theChar)
{
switch(theChar)
{
case 0x14:
if((trmParams.emulate == ITMADDS) || (trmParams.emulate == ITMTVI925))
transPrintFlag |= 0x8000;
break;
case '4':
if((trmParams.emulate == ITMADDS) && (*transPrtBuf == 1))
transPrintFlag = FALSE;
break;
case 'a':
if((trmParams.emulate == ITMTVI925) && (*transPrtBuf == 1))
transPrintFlag = FALSE;
break;
case 'i':
if(((trmParams.emulate == ITMVT220) || (trmParams.emulate == ITMVT100)) &&
(*transPrtBuf == 3) && (transPrtBuf[2] == '[') && (transPrtBuf[3] == '4'))
{
if(transPrintFlag)
{
transPrintFlag = FALSE;
PrintFileComm(FALSE);
}
}
break;
}
if(transPrintFlag || (prtFlag && !prtPause))
{
if(((theChar & 0x7F) != ESC) && !(transPrintFlag & 0x8000))
transPrtBuf[++(*transPrtBuf)] = theChar;
if(((theChar & 0x7F) == ESC) || (transPrintFlag & 0x8000) || (*transPrtBuf == 1) || (*transPrtBuf >= TRANS_PRINT_BUFFER))
{
if(*transPrtBuf > 0)
{
PrintFileString((LPSTR) transPrtBuf+1, (LONG) *transPrtBuf, FALSE);
*transPrtBuf = 0;
}
if((theChar & 0x7F) == ESC)
{
transPrtBuf[++(*transPrtBuf)] = ESC;
if((theChar == 0x9B) && (trmParams.emulate == ITMVT220))
transPrtBuf[++(*transPrtBuf)] = '[';
}
if(transPrintFlag & 0x8000)
transPrintFlag = FALSE;
}
}
if(transPrintFlag && !prtFlag)
PrintFileComm(TRUE);
}
/*---------------------------------------------------------------------------*/
/* modemInp () - [mbb] */
/*---------------------------------------------------------------------------*/
VOID modemInp(INT theChar, BOOL bRcvComm)
{
cursorValid = FALSE;
the8Char = (BYTE) theChar;
if(bRcvComm) /* mbbx 2.00: not restricted... */
{
if((xferFlag == XFRRCV) && !xferPaused)
putRcvChar(the8Char);
}
if(transPrintFlag || (prtFlag && !prtPause))
checkTransPrint(the8Char);
chAscii = the8Char; /* ... mbbx 2.00: mask done in getMdmChar() */
ch = chAscii; /* mbbx: patch */
if((chAscii & 0x7F) == ESC) /* mbbx 2.00: not masking 8th bit... */
{
if((the8Char & 0x80) && (trmParams.emulate == ITMVT220)) /* mbbx 1.10: CSI = ESC + '[' */
pAnsiState();
else
termState = escHandler;
}
else if(termState) /* mbbx 2.00: do this AFTER checking for ESC... */
(*termState)();
else if((chAscii >= 0x20) && (chAscii != 0x7F)) /* mbbx 1.04: ics... */
{
putChar(chAscii);
if(curCol < maxChars-1)
curCol += 1;
else if(trmParams.lineWrap) /* mbbx 1.10: CUA... */
{
curCol = 0;
pLF();
}
}
else
(*escHandler)();
}