/*===========================================================================*/ /* Copyright (c) 1987 - 1988, Future Soft Engineering, Inc. */ /* Houston, Texas */ /*===========================================================================*/ #define NOLSTRING TRUE /* jtf win3 mod */ #include #include "port1632.h" #include "dcrc.h" #include "dynacomm.h" #include "task.h" #include "video.h" /*---------------------------------------------------------------------------*/ /* clipRect () - Sets a rect to the current clip rect */ /* Note: assumes getPort () has been called */ /*---------------------------------------------------------------------------*/ VOID clipRect(RECT *clpRect) { HRGN hClipRgn; hClipRgn = CreateRectRgnIndirect ((LPRECT) clpRect); SelectClipRgn(thePort, hClipRgn); DeleteObject (hClipRgn); } /*---------------------------------------------------------------------------*/ /* pos() - [mbb] */ /*---------------------------------------------------------------------------*/ INT pos(STRING *word, STRING *str) { INT ndx, count; if((count = *str - *word + 1) > 0) { for(ndx = 1; ndx <= count; ndx += 1) if(memcmp(str+ndx, word+1, *word) == 0) return(ndx); } return(FALSE); } /*---------------------------------------------------------------------------*/ /* delay() - Spin wheels & be nice to other windows applications */ /*---------------------------------------------------------------------------*/ /* NOTE: 1000/60 msec/ticks => 50/3; max delay w/o overflow = 3932 ticks */ VOID delay(UINT units, DWORD *endingCount) { DWORD tmStart; DWORD dtmWait = (units * 50) / 3; tmStart = GetTickCount(); while(GetTickCount() - tmStart < dtmWait) { PeekMessage(&msg, hItWnd, 0, 0, PM_NOREMOVE); updateTimer(); } if(endingCount != NULL) *endingCount = tmStart + dtmWait; } /*---------------------------------------------------------------------------*/ /* concat() - Concatanate two Pascal-type strings. [scf]*/ /*---------------------------------------------------------------------------*/ BYTE *concat (STRING *out, STRING *s1, STRING *s2) { STRING scratch[STR255]; if ((WORD) (*s1 + *s2) < STR255) { if (out == s2) { memcpy (scratch, s2, (WORD) *s2 + 1); memcpy (&out[1], &s1[1], (WORD) *s1); memcpy (&out[*s1 + 1], &scratch[1], (WORD) *scratch); *out = *s1 + *scratch; } else { memcpy (&out[1], &s1[1], (WORD) *s1); memcpy (&out[*s1 + 1], &s2[1], (WORD) *s2); *out = *s1 + *s2; } } nullTerminate (out); return out; } /*---------------------------------------------------------------------------*/ /* stripControl() - [scf] */ /*---------------------------------------------------------------------------*/ VOID stripControl(STRING *str) { WORD ndxDst, ndxSrc; STRING newStr[STR255]; ndxSrc = 1; *newStr = 0; for (ndxDst = 1; ndxDst <= *str; ndxDst++) if (ndxSrc <= *str) { newStr[0] = (BYTE) ndxDst; if((str[ndxSrc] == '^') && (str[ndxSrc+1] != '$')) /* mbbx 1.04... */ if (str[ndxSrc+1] == '^' || ndxSrc == *str) { newStr[ndxDst] = '^'; ndxSrc += 2; } else { newStr[ndxDst] = str[ndxSrc+1] & 0x1f; ndxSrc += 2; } else { newStr[ndxDst] = str[ndxSrc]; ndxSrc++; } } strEquals(str, newStr); } /*---------------------------------------------------------------------------*/ /* clearBuffer() - Initialize terminal I/O capture buffer. [scf] */ /*---------------------------------------------------------------------------*/ VOID clearBuffer() { RECT clientRect; gIdleTimer = GetCurrentTime(); /* rjs bug2 001 */ timPointer = GetCurrentTime(); escAnsi = FALSE; escCol = -1; escCursor = FALSE; escGraphics = FALSE; grChrMode = FALSE; escLin = -1; escSeq = FALSE; escExtend = EXNONE; escSkip = 0; escVideo = 0; vidGraphics = GRNONE; vidInverse = FALSE; termDirty = FALSE; curLin = 0; curCol = 0; curTopLine = savTopLine = 0; savLeftCol = 0; cursorValid = FALSE; rectCursor(&cursorRect); clearTermBuffer(0, maxLines, maxChars + 2); /* mbbx 2.00.03: lines > 399 ... */ termSetSelect(0L, 0L); chrHeight = stdChrHeight; chrWidth = stdChrWidth; GetClientRect (hTermWnd, (LPRECT) &clientRect); visScreenLine = hTE.viewRect.bottom / chrHeight - 1; nScrollRange.x = maxChars - (clientRect.right / chrWidth); nScrollPos.y = 0; nScrollPos.x = 0; updateTermScrollBars(FALSE); activSelect = FALSE; noSelect = TRUE; /* rjs bugs 020 */ clearModes(); InvalidateRect(hTermWnd, NULL, TRUE); /* mbbx 2.00.03 ... */ UpdateWindow(hTermWnd); } /*---------------------------------------------------------------------------*/ /* clearModes() - An terminal emulation initialization worker routine. [scf] */ /*---------------------------------------------------------------------------*/ VOID clearModes() { INT ndx; INT lin; INT col; cursorKeyMode = FALSE; keyPadAppMode = FALSE; originMode = FALSE; chInsMode = FALSE; scrRgnBeg = 0; shiftCharSet = 0; charSet[0] = 'B'; charSet[1] = 'B'; scrRgnEnd = maxScreenLine; statusLine = FALSE; curAttrib = 0; protectMode = FALSE; for (ndx = 1; ndx <= 131; ndx++) if (ndx % 8 == 0) tabs[ndx] = 1; else tabs[ndx] = 0; for (lin = 0; lin <= 23; lin++) for (col = 0; col <= 132; col++) attrib[lin][col] = 0; for (ndx = 0; ndx <= maxChars -1; ndx++) line25[ndx] = ' '; } /*---------------------------------------------------------------------------*/ /* setCommDefaults() - [mbb] */ /*---------------------------------------------------------------------------*/ VOID setCommDefaults() /* mbbx 2.01.20 (2.01.17) ... */ { BYTE str[MINRESSTR], portData[32]; INT nPort, nSpeed, nData, nStop; trmParams.comDevRef = ITMNOCOM; trmParams.speed = 1200; trmParams.dataBits = ITMDATA8; trmParams.stopBits = ITMSTOP1; trmParams.parity = ITMNOPARITY; LoadString(hInst, STR_INI_PORT, (LPSTR) str, MINRESSTR); GetProfileString((LPSTR) szAppName_private, (LPSTR) str, (LPSTR) NULL_STR, (LPSTR) portData, sizeof(portData)); switch(sscanf(portData, "COM%d:%d,%c,%d,%d", &nPort, &nSpeed, str, &nData, &nStop)) { case 5: if(nStop == 2) trmParams.stopBits = ITMSTOP2; /* then fall thru... */ case 4: if((nData >= 4) && (nData < 8)) trmParams.dataBits = ITMDATA8 - (8 - nData); /* then fall thru... */ case 3: switch(str[0]) { case 'o': trmParams.parity = ITMODDPARITY; break; case 'e': trmParams.parity = ITMEVENPARITY; break; case 'm': trmParams.parity = ITMMARKPARITY; break; case 's': trmParams.parity = ITMSPACEPARITY; break; } /* then fall thru... */ case 2: if((nSpeed < 150) || (nSpeed == 192)) nSpeed *= 100; trmParams.speed = (WORD)nSpeed; /* then fall thru... */ case 1: if(nPort >= 1) { trmParams.newDevRef = ITMWINCOM; trmParams.comPortRef = ITMCOM1 + (nPort - 1); trmParams.fResetDevice = TRUE; } break; } DEBOUT("setCommDefaults: trmParams.comDevRef = %x\n",trmParams.comDevRef); DEBOUT("setCommDefaults: trmParams.speed = %d\n",trmParams.speed); DEBOUT("setCommDefaults: trmParams.dataBits = %d\n",trmParams.dataBits); DEBOUT("setCommDefaults: trmParams.stopBits = %d\n" ,trmParams.stopBits); DEBOUT("setCommDefaults: trmParams.parity = %d\n",trmParams.parity); DEBOUT("setCommDefaults: trmParams.newDevRef = %d\n",trmParams.newDevRef); DEBOUT("setCommDefaults: trmParams.comPortRef = %d\n",trmParams.comPortRef); DEBOUT("setCommDefaults: trmParams.fResetDevice = %d\n",trmParams.fResetDevice); } /*---------------------------------------------------------------------------*/ /* setDefaultFonts() - [mbb] */ /*---------------------------------------------------------------------------*/ VOID setDefaultFonts() /* rkhx 2.00 ... */ { BYTE szFont[MINRESSTR], szDefFontFace[LF_FACESIZE], szFontFace[LF_FACESIZE]; INT ndx; WORD fontHeight = 8; /* mbbx 2.00: was 0 */ LoadString(hInst, STR_INI_FONT, (LPSTR) szFont, MINRESSTR); LoadString(hInst, STR_INI_FONTFACE, (LPSTR) szDefFontFace, LF_FACESIZE); GetProfileString((LPSTR) szAppName_private, (LPSTR) szFont, (LPSTR) szDefFontFace, (LPSTR) szFontFace, LF_FACESIZE); for(ndx = 0; szFontFace[ndx] != 0; ndx += 1) { if(szFontFace[ndx] == ',') { sscanf(szFontFace+(ndx+1), "%d", &fontHeight); szFontFace[ndx] = 0; break; } } strcpy(trmParams.fontFace, szFontFace); /* mbbx 2.00: font selection... */ trmParams.fontSize = fontHeight; buildTermFont(); } /*---------------------------------------------------------------------------*/ /* getDefCountry() - [mbb] */ /*---------------------------------------------------------------------------*/ /* MS-DOS 3.0 COUNTRY command: */ #define CC_USA 1 #define CC_UK 44 #define CC_DENMARK 45 #define CC_NORWAY 47 #define CC_FINLAND 358 #define CC_FRANCE 33 /* NOTE: CANADA not defined */ #define CC_GERMANY 49 #define CC_ITALY 39 #define CC_SPAIN 34 #define CC_SWEDEN 46 #define CC_SWITZERLAND 41 WORD getDefCountry() /* mbbx 1.04: ics... */ { ICS_TYPE icsType; BYTE szIntl[MINRESSTR]; BYTE szCountry[MINRESSTR]; LoadString(hInst, STR_INI_INTL, (LPSTR) szIntl, MINRESSTR); LoadString(hInst, STR_INI_ICOUNTRY, (LPSTR) szCountry, MINRESSTR); switch(GetProfileInt((LPSTR) szIntl, (LPSTR) szCountry, 0)) { case CC_UK: icsType = ICS_BRITISH; break; case CC_DENMARK: case CC_NORWAY: icsType = ICS_DANISH; break; case CC_FINLAND: icsType = ICS_FINISH; break; case CC_FRANCE: icsType = ICS_FRENCH; break; case CC_GERMANY: icsType = ICS_GERMAN; break; case CC_ITALY: icsType = ICS_ITALIAN; break; case CC_SPAIN: icsType = ICS_SPANISH; break; case CC_SWEDEN: icsType = ICS_SWEDISH; break; case CC_SWITZERLAND: icsType = ICS_SWISS; break; default: icsType = ICS_NONE; break; } return((WORD) icsType); } /*---------------------------------------------------------------------------*/ /* icsResetTable() - [mbb] */ /*---------------------------------------------------------------------------*/ #define ICS_RESBYTES 12 VOID icsResetTable(WORD icsType) { BYTE ndx; BYTE work1[ICS_RESBYTES+1], work2[ICS_RESBYTES+1]; trmParams.language = (BYTE) ICS_NONE; for(ndx = 0; ndx < 256; ndx += 1) icsXlateTable[ndx] = ndx; if((icsType > ICS_NONE) && (icsType < ICS_MAXTYPE)) { if((LoadString(hInst, STR_ICS_DATA, (LPSTR) work1, ICS_RESBYTES+1) == ICS_RESBYTES) && (LoadString(hInst, STR_ICS_DATA + icsType, (LPSTR) work2, ICS_RESBYTES+1) == ICS_RESBYTES)) { for(ndx = 0; ndx < ICS_RESBYTES; ndx += 1) { icsXlateTable[work1[ndx]] = work2[ndx]; icsXlateTable[work2[ndx]] = work1[ndx]; } trmParams.language = icsType; } } } /*---------------------------------------------------------------------------*/ /* setDefaults() - [scf] */ /*---------------------------------------------------------------------------*/ #define DEFBUFFERLINES 100 VOID setDefaults() { BYTE str[80]; INT ndx; memset(&trmParams, 0, sizeof(recTrmParams)); /* mbbx 1.00: default to NULL */ trmParams.fileID = DCS_FILE_ID; /* mbbx 2.00 ... */ LoadString(hInst, STR_VERSION, (LPSTR) trmParams.version, DCS_VERSIONSZ); trmParams.controlZ = CNTRLZ; trmParams.fileSize = sizeof(recTrmParams); setCommDefaults(); /* mbbx 2.01.17 ... */ trmParams.fParity = FALSE; /* mbbx 1.10: CUA */ trmParams.flowControl = ITMXONFLOW; trmParams.fCarrier = FALSE; /* mbbx 1.10: CUA */ /* Terminal: */ trmParams.emulate = ITMVT100; /* mbbx 1.04: was ITMTTY; */ trmParams.fCtrlBits = FALSE; /* mbbx 1.10: VT220 8BIT = TRUE */ LoadString(hInst, STR_ANSWERBACK, (LPSTR) trmParams.answerBack, DCS_ANSWERBACKSZ); trmParams.lineWrap = TRUE; /* mbbx 1.10: CUA... */ trmParams.localEcho = FALSE; trmParams.sound = TRUE; /* mbbx 1.04: synch */ trmParams.inpCRLF = FALSE; trmParams.outCRLF = FALSE; trmParams.columns = ITM80COL; trmParams.termCursor = ITMBLKCURSOR; trmParams.cursorBlink = TRUE; LoadString(hInst, STR_INI_BUFFER, (LPSTR) str, MINRESSTR); trmParams.bufferLines = (WORD)GetProfileInt((LPSTR) szAppName_private, (LPSTR) str, DEFBUFFERLINES); maxChars = 0; /* mbbx 2.00.04 */ DEBOUT("Calling: %s\n","resetTermBuffer()"); resetTermBuffer(); DEBOUT("Outof: %s\n","resetTermBuffer()"); DEBOUT("Calling: %s\n","setDefaultFonts()"); setDefaultFonts(); DEBOUT("Outof: %s\n","setDefaultFonts()"); DEBOUT("Calling: %s\n","icsResetTable()"); icsResetTable(getDefCountry()); /* mbbx 1.04: ics */ DEBOUT("Outof: %s\n","icsResetTable()"); trmParams.fHideTermVSB = FALSE; trmParams.fHideTermHSB = FALSE; /* trmParams.useWinCtrl = TRUE; rjs msoft */ // -sdj 08 may 92: I am not sure why cntl-c is not xmited // and used instead for copy-paste. When terminal is used // as a debug machine, or to connect to mainframe, it is important // most of the times that the control-c should go out to the other end // user can turn this other way if he needs to.. // changing default from TRUE to FALSE trmParams.useWinCtrl = FALSE; /* Binary Transfers: */ trmParams.xBinType = ITMXMODEM; trmParams.rcvBlSz = 2000; trmParams.sendBlSz = 2000; trmParams.retryCt = 20; /* Text Transfers: */ trmParams.xTxtType = ITMSTD; trmParams.xChrType = ITMCHRDELAY; trmParams.xChrDelay = 1; trmParams.xLinType = ITMLINDELAY; trmParams.xLinDelay = 1; LoadString(hInst, STR_XFERLINESTR, (LPSTR) trmParams.xLinStr, DCS_XLINSTRSZ); trmParams.xWordWrap = FALSE; trmParams.xWrapCol = 79; /* mbbx 1.04: revert from 65 */ /* Phone: */ trmParams.dlyRetry = 30; /* mbbx 1.10: CUA */ trmParams.cntRetry = 0; trmParams.flgRetry = FALSE; trmParams.flgSignal = FALSE; /* Modem: */ trmParams.xMdmType = ITMHAYES; LoadString(hInst, STR_DIALPREFIX, (LPSTR) trmParams.dialPrefix, DCS_MODEMCMDSZ); LoadString(hInst, STR_DIALSUFFIX, (LPSTR) trmParams.dialSuffix, DCS_MODEMCMDSZ); LoadString(hInst, STR_HANGPREFIX, (LPSTR) trmParams.hangPrefix, DCS_MODEMCMDSZ); LoadString(hInst, STR_HANGSUFFIX, (LPSTR) trmParams.hangSuffix, DCS_MODEMCMDSZ); LoadString(hInst, STR_ANSWER, (LPSTR) trmParams.answer, DCS_MODEMCMDSZ); LoadString(hInst, STR_ORIGINATE, (LPSTR) trmParams.originate, DCS_MODEMCMDSZ); /* Environment: */ if(fKeysShown) /* mbbx 2.00: show fkeys... */ trmParams.environmentFlags |= DCS_EVF_FKEYSSHOW; else trmParams.environmentFlags &= ~DCS_EVF_FKEYSSHOW; trmParams.environmentFlags |= DCS_EVF_FKEYSARRANGE; /* Parent: */ for(ndx = 1; ndx <= 131; ndx++) if(ndx % 8 == 0) tabs[ndx] = 1; else tabs[ndx] = 0; answerMode = FALSE; keyPadAppMode = FALSE; cursorKeyMode = FALSE; } /*---------------------------------------------------------------------------*/ /* resetEmul() - Load the Emulation table from resource. [scf] */ /*---------------------------------------------------------------------------*/ VOID resetEmul() /* mbbx per slc */ { #ifdef ORGCODE HANDLE hResInfo, hFile; TEXTMETRIC fontMetrics; INT ndx, ndx2; if((hResInfo = FindResource(hInst, getResId(1000 + (trmParams.emulate - ITMTERMFIRST)), (LPSTR) DC_RES_CCTL)) != NULL) /* mbbx 1.04: REZ */ { if((hFile = AccessResource(hInst, hResInfo)) != -1) { if(_read(hFile, emulInfo, 128) == 128) { if(_read(hFile, GlobalLock(hemulKeyInfo), SIZEOFEMULKEYINFO) == SIZEOFEMULKEYINFO) { GlobalUnlock(hemulKeyInfo); if(_read(hFile, vidGraphChars, 128) != 128) /* mbbx 1.10 ... */ trmParams.emulate = -1; if((trmParams.emulate == ITMVT100) || (trmParams.emulate == ITMVT220)) ansi = TRUE; else ansi = FALSE; } else /* read for emulKeyInfo failed so unlock it */ { GlobalUnlock (hemulKeyInfo); trmParams.emulate = -1; } } else trmParams.emulate = -1; _close(hFile); } else trmParams.emulate = -1; } else trmParams.emulate = -1; #else HANDLE hFoundRes,hResInfo; LPSTR lpResData,lpEmulKey; TEXTMETRIC fontMetrics; INT ndx, ndx2; if((hFoundRes = FindResource(hInst, getResId(1000 + (trmParams.emulate - ITMTERMFIRST)), (LPSTR) DC_RES_CCTL)) != NULL) /* mbbx 1.04: REZ */ { DEBOUT("resetEmul: findresource returns %lx\n",hFoundRes); /*accessresource no longer in win32, so gotta LoadResource, then lock it, */ /*so I get a pointer to the resource data itself.(JAP)*/ if( (hResInfo = LoadResource(hInst,hFoundRes)) != NULL) { DEBOUT("resetEmul: LoadResource returns %lx\n",hResInfo); if((lpResData = LockResource(hResInfo)) ) { DEBOUT("resetEmul: LockResource returns %lx\n",lpResData); memcpy(emulInfo, lpResData, 128); if ( (lpEmulKey = GlobalLock(hemulKeyInfo)) != NULL ) { memcpy(lpEmulKey,lpResData+128,SIZEOFEMULKEYINFO); memcpy(vidGraphChars, lpResData + 128 + SIZEOFEMULKEYINFO, 128); if((trmParams.emulate == ITMVT100) || (trmParams.emulate == ITMVT220)) { DEBOUT("resetEmul:%s\n","emulate = VT100|VT52, ansi=true"); ansi = TRUE; } else { DEBOUT("resetEmul:%s\n","emulate not VT100|VT52, ansi=false"); ansi = FALSE; } GlobalUnlock(hemulKeyInfo); UnlockResource(hResInfo); } else /* Globallock failed, so put -1 in .emulate */ { DEBOUT("resetEmul: %s\n","GlobalLock FAILED"); trmParams.emulate = -1; UnlockResource(hResInfo); } } else /* LockResource failed, so put -1 in .emulate */ { DEBOUT("resetEmul: %s\n","LockResource FAILED"); trmParams.emulate = -1; } } else /* LoadResource failed, so put -1 in .emulate */ { DEBOUT("resetEmul: %s\n","LoadResource FAILED"); trmParams.emulate = -1; } } else /* FindResource failed, so put -1 in .emulate */ { DEBOUT("resetEmul: %s\n","FindResource FAILED"); trmParams.emulate = -1; } #endif /*********** now check if .emulate is -1 and do the defaults ***********/ if(trmParams.emulate == (BYTE) -1) { LoadString(hInst, STR_LOADEMUL, (LPSTR) taskState.string, 80); /* mbbx 1.04: REZ... */ testMsg(taskState.string,NULL,NULL); trmParams.emulate = ITMTTY; escHandler = pNullState; } else { escHandler = pEscSequence; getPort(); GetTextMetrics(thePort, (TEXTMETRIC FAR *) &fontMetrics); releasePort(); if(fontMetrics.tmCharSet == ANSI_CHARSET) { for(ndx = 0; ndx < 64; ndx += 1) { switch(vidGraphChars[ndx].buffer) { case 0x9C: vidGraphChars[ndx].buffer = 0xA3; break; case 0xF1: vidGraphChars[ndx].buffer = 0xB1; break; case 0xF8: vidGraphChars[ndx].buffer = 0xB0; break; case 0xFA: vidGraphChars[ndx].buffer = 0xB7; break; default: if(vidGraphChars[ndx].buffer > 0x80) vidGraphChars[ndx].buffer = 0x20; break; } } } } clearModes(); for(ndx2 = 0; ndx2 <= 127; ndx2 += 1) { ndx = emulInfo[ndx2]; if(ndx > 128) ndx = ESCSKIPNDX; pEscTable[ndx2] = pProcTable[ndx]; if(ansi) aEscTable[ndx2] = aProcTable[ndx]; } termState = NULL; } /*---------------------------------------------------------------------------*/ /* initTermBuffer() - [mbb] */ /*---------------------------------------------------------------------------*/ /* mbbx 2.00.03: buffer lines > 399 ... */ /* NOTE: the following routines contain code which assumes the term buffer */ /* will be limited to 64K... This seems like a reasonable limit */ /* since too large a buffer would slow down the emulation! */ /* #define MINBUFFERLINES 25 #define MAXBUFFERSIZE 0xFFFF jtf 3.12 */ #define MINBUFFERLINES (maxScreenLine+2) #define MAXBUFFERSIZE 0x7FFF /* jtf 3.12 */ #define TERMBUFFERFUDGE 1 BOOL clearTermBuffer(UINT prevLines, UINT bufLines, UINT lineWidth) { LPSTR lpBufData; UINT wPrevSize; if((lpBufData = GlobalLock(hTE.hText)) == NULL) return(FALSE); wPrevSize = prevLines * lineWidth; lsetmem(lpBufData += wPrevSize, 0x20, (bufLines * lineWidth) - wPrevSize); while(prevLines < bufLines) { lpBufData += lineWidth; // NOTE: Will AV on RISC if lineWidth is odd *(((WORD FAR *) lpBufData)-1) = 0x0A0D; prevLines += 1; } *lpBufData = 0; /* NULL terminated, of course */ #ifndef BUGBYPASS DEBOUT("initTermBuffer: %s\n","GlobalUnlock BUG??? CHECK THIS OUT"); return (TRUE); #else GlobalUnlock(hTE.hText); return (TRUE); #endif } BOOL initTermBuffer(WORD bufLines, WORD lineWidth, BOOL bReset) { LONG lBufSize; LPSTR lpBufData; HANDLE hNewBuf; if(bReset && (hTE.hText != NULL)) hTE.hText = GlobalFree(hTE.hText); if(bufLines < MINBUFFERLINES) bufLines = MINBUFFERLINES; if((lBufSize = ((LONG) bufLines * lineWidth) + TERMBUFFERFUDGE) > MAXBUFFERSIZE) { bufLines = (MAXBUFFERSIZE - TERMBUFFERFUDGE) / lineWidth; lBufSize = (bufLines * lineWidth) + TERMBUFFERFUDGE; } if(hTE.hText == NULL) { GlobalCompact(lBufSize); if((hTE.hText = GlobalAlloc(GMEM_MOVEABLE, (DWORD) (MINBUFFERLINES * lineWidth) + TERMBUFFERFUDGE)) == NULL) { testResMsg(STR_OUTOFMEMORY); SendMessage(hItWnd, WM_CLOSE, 0, 0L); return(FALSE); } maxLines = 0; } else if(bufLines < savTopLine + (maxScreenLine + 2)) { lpBufData = GlobalLock(hTE.hText); lmovmem(lpBufData + ((savTopLine + (maxScreenLine + 2) - bufLines) * lineWidth), lpBufData, lBufSize); GlobalUnlock(hTE.hText); if(curTopLine > (savTopLine = bufLines - (maxScreenLine + 2))) curTopLine = savTopLine; if(!IsIconic(hItWnd)) /* rjs bugs 015 */ sizeTerm(0L); /* reset scrollbars */ } while(bufLines > MINBUFFERLINES) { if((hNewBuf = GlobalReAlloc(hTE.hText, lBufSize, GMEM_MOVEABLE)) != NULL) { hTE.hText = hNewBuf; break; } bufLines -= 1; lBufSize -= lineWidth; } if(bufLines > maxLines) clearTermBuffer(maxLines, bufLines, lineWidth); maxLines = bufLines; return(TRUE); } /*---------------------------------------------------------------------------*/ /* resetTermBuffer() - [mbb] */ /*---------------------------------------------------------------------------*/ VOID resetTermBuffer() { WORD lineWidth; BOOL bNewWidth; lineWidth = (trmParams.columns == ITM80COL) ? 80 : 132; if((bNewWidth = (lineWidth != maxChars)) || (trmParams.bufferLines != maxLines)) { maxChars = lineWidth; initTermBuffer(trmParams.bufferLines, lineWidth + 2, bNewWidth); if(bNewWidth) clearBuffer(); } }