|
|
/*===========================================================================*/ /* 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) ¬ScrollRect); /* 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)();
}
|