summaryrefslogtreecommitdiffstats
path: root/private/os2/os2ses/violvb.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/os2/os2ses/violvb.c')
-rw-r--r--private/os2/os2ses/violvb.c770
1 files changed, 770 insertions, 0 deletions
diff --git a/private/os2/os2ses/violvb.c b/private/os2/os2ses/violvb.c
new file mode 100644
index 000000000..baab23403
--- /dev/null
+++ b/private/os2/os2ses/violvb.c
@@ -0,0 +1,770 @@
+/*++
+
+Copyright (c) 1989 Microsoft Corporation
+
+Module Name:
+
+ violvb.c
+
+Abstract:
+
+ This module contains the Vio LVB routines
+
+Author:
+
+ Michael Jarus (mjarus) 28-Apr-1992
+
+Environment:
+
+ User Mode Only
+
+Revision History:
+
+--*/
+
+#define WIN32_ONLY
+#include "os2ses.h"
+#include "trans.h"
+#include "vio.h"
+#include "os2win.h"
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+
+
+#define GET_LVB_PTR( row, col ) &LVBBuffer[((row) * SesGrp->ScreenColNum + (col)) << SesGrp->VioLength2CellShift]
+#define GET_LVB_ATT_PTR( row, col ) &LVBBuffer[(((row) * SesGrp->ScreenColNum + (col)) << SesGrp->VioLength2CellShift) + 1]
+
+typedef struct _attr_3_bytes
+{
+ UCHAR Attr[3];
+} ATTR_3_BYTES, *PATTR_3_BYTES;
+
+#if DBG
+//#define TEST_VIO_LVB 1
+BOOL Ow2VioLvbIgnoreTest = FALSE;
+#endif
+
+PUCHAR Ow2VioLvbTestBuff = NULL;
+
+DWORD
+VioLVBInit()
+{
+#if DBG
+#if TEST_VIO_LVB
+
+ if((Ow2VioLvbTestBuff = HeapAlloc(HandleHeap, 0, SesGrp->MaxLVBsize)) == NULL)
+ {
+ ASSERT1( "VioLVBInit: unable to allocate from heap to test VIO-LVB", FALSE );
+ return(1L);
+ }
+#endif
+#endif
+ return(0L);
+}
+
+
+VOID
+VioLVBInitForSession()
+{
+#if DBG
+#if TEST_VIO_LVB
+ ULONG Length = (ULONG)SesGrp->LVBsize;
+
+ Ow2VioGetLVBBuf(&Length);
+
+#endif
+#endif
+}
+
+
+DWORD
+Ow2VioGetLVBBuf(
+ IN PULONG Length
+ )
+{
+#if DBG
+ if ((*Length >> SesGrp->VioLength2CellShift) != SesGrp->ScreenSize)
+ KdPrint(("OS2SES(VioLVB-VioGetBuf): partial length %lu form %lu\n",
+ *Length >> SesGrp->VioLength2CellShift, SesGrp->ScreenSize));
+#endif
+
+ SesGrp->LVBOn = TRUE; // start echo to LVB buffer
+ return(Ow2VioReadCellStr(
+ Length,
+ 0,
+ 0,
+ LVBBuffer
+ ));
+}
+
+
+DWORD
+Ow2LvbUpdateLVBBuffer()
+{
+ if (SesGrp->LVBOn)
+ {
+ IN ULONG Length = SesGrp->LVBsize;
+
+ return(Ow2VioGetLVBBuf(&Length));
+ }
+
+ return(NO_ERROR);
+}
+
+
+DWORD
+Ow2VioShowLVBBuf(
+ IN ULONG Length,
+ IN ULONG Offset
+ )
+{
+ DWORD Rc;
+ ULONG VioMask = ~(ULONG)SesGrp->VioLengthMask;
+
+ if ( Offset & VioMask )
+ {
+ Length += Offset & VioMask;
+ Offset = Offset & (ULONG)SesGrp->VioLengthMask;
+ }
+
+ if ( Length & VioMask )
+ {
+ Length = (Length + SesGrp->BytesPerCell) & SesGrp->VioLengthMask;
+ }
+
+ if (( Length + Offset) > (ULONG)SesGrp->LVBsize)
+ {
+ Length = SesGrp->LVBsize - Offset;
+ }
+
+ Rc = Ow2VioWriteCellStr(
+ Length,
+ ((Offset >> SesGrp->VioLength2CellShift) / SesGrp->ScreenColNum),
+ ((Offset >> SesGrp->VioLength2CellShift) % SesGrp->ScreenColNum),
+ ((PBYTE)LVBBuffer) + Offset
+ );
+ return(Rc);
+}
+
+
+#if DBG
+VOID
+VioLVBTestBuff(IN PVOID DestBuffer)
+{
+#if TEST_VIO_LVB
+ if(!Ow2VioLvbIgnoreTest &&
+ memcmp( DestBuffer, LVBBuffer, SesGrp->LVBsize))
+ {
+ KdPrint(("Ow2VioReadCellStr: diff buffer\n"));
+ memmove( LVBBuffer, DestBuffer, SesGrp->LVBsize);
+ }
+#else
+ UNREFERENCED_PARAMETER(DestBuffer);
+#endif
+}
+
+
+VOID
+VioLVBTestScroll()
+{
+#if TEST_VIO_LVB
+ ULONG Length = SesGrp->ScreenSize << SesGrp->VioLength2CellShift;
+ ULONG LineLength = SesGrp->ScreenColNum << SesGrp->VioLength2CellShift;
+ UCHAR *Buffer = &Ow2VioLvbTestBuff[0], *Ptr, *Ptr1, *Offset;
+ ULONG i, j, k;
+
+ if (Ow2VioLvbTestBuff)
+ {
+ Ow2VioLvbIgnoreTest = TRUE;
+ Ow2VioReadCellStr(
+ &Length,
+ 0,
+ 0,
+ Ow2VioLvbTestBuff
+ );
+ Ow2VioLvbIgnoreTest = FALSE;
+
+ for ( i = 0, Offset = &LVBBuffer[0] ;
+ i < (ULONG)SesGrp->ScreenRowNum ;
+ i++, Buffer += LineLength, Offset += LineLength )
+ {
+ if(memcmp( Buffer, Offset, LineLength))
+ {
+ Ptr = Buffer;
+ Ptr1 = Offset;
+ for (j = 0 ; j < LineLength ; j++ )
+ {
+ if (Ptr[j] != Ptr1[j])
+ {
+ break;
+ }
+ }
+ KdPrint(("VioScroll: diff buffer line %d, Pos %d\n", i, j));
+ KdPrint((" LVB: %2.2x%2.2x%2.2x%2.2x, ... %2.2x; Screen: %2.2x%2.2x%2.2x%2.2x, ... %2.2x\n",
+ Ptr1[0], Ptr1[1], Ptr1[2], Ptr1[3], Ptr1[j],
+ Ptr[0], Ptr[1], Ptr[2], Ptr[3], Ptr[j]));
+
+ for ( j = 0, k = 0 ; j < 5 ; j++, k += 0x20 )
+ {
+ Ptr = Offset + k;
+ KdPrint((" LVB-%d: %2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x\n", j,
+ Ptr[0], Ptr[1], Ptr[2], Ptr[3], Ptr[4], Ptr[5], Ptr[6], Ptr[7], Ptr[8], Ptr[9],
+ Ptr[10], Ptr[11], Ptr[12], Ptr[13], Ptr[14], Ptr[15], Ptr[16], Ptr[17], Ptr[18], Ptr[19],
+ Ptr[20], Ptr[21], Ptr[22], Ptr[23], Ptr[24], Ptr[25], Ptr[26], Ptr[27], Ptr[28], Ptr[29],
+ Ptr[30], Ptr[31]));
+ Ptr = Buffer + k;
+ KdPrint((" Scr-%d: %2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x,%2.2x%2.2x%2.2x%2.2x\n", j,
+ Ptr[0], Ptr[1], Ptr[2], Ptr[3], Ptr[4], Ptr[5], Ptr[6], Ptr[7], Ptr[8], Ptr[9],
+ Ptr[10], Ptr[11], Ptr[12], Ptr[13], Ptr[14], Ptr[15], Ptr[16], Ptr[17], Ptr[18], Ptr[19],
+ Ptr[20], Ptr[21], Ptr[22], Ptr[23], Ptr[24], Ptr[25], Ptr[26], Ptr[27], Ptr[28], Ptr[29],
+ Ptr[30], Ptr[31]));
+ }
+
+ memmove( Offset, Buffer, LineLength);
+ }
+ }
+ }
+#endif
+}
+#endif
+
+
+VOID
+VioLVBCopyStr( IN PUCHAR Sour,
+ IN COORD Coord,
+ IN ULONG Length)
+{
+
+ if(SesGrp->LVBOn && Length)
+ {
+ register UCHAR *Ptr;
+ register ULONG Offset = (ULONG)SesGrp->BytesPerCell;
+ register ULONG Len = Length;
+ register PUCHAR Sou = Sour;
+
+ Ptr = GET_LVB_PTR( Coord.Y, Coord.X );
+
+#ifdef DBCS
+// MSKK Oct.13.1993 V-AkihiS
+ if (Offset == 2)
+ {
+ for (;Len-- ; )
+ {
+ *Ptr = *Sou++;
+ Ptr += Offset;
+ }
+ } else
+ {
+ for (;Len-- ; )
+ {
+ *Ptr = *Sou; // copy character to lvb
+ Ptr += Offset-1; // skip to 3rd byte attr
+ if (Ow2NlsIsDBCSLeadByte(*Sou++, SesGrp->VioCP))
+ {
+ *Ptr++ = OS2_COMMON_LVB_LEADING_BYTE;
+ if (Len)
+ {
+ //
+ // Copy trailing byte charater, and mark
+ // this char as trailing byte
+ //
+ *Ptr = *Sou++;
+ Ptr += Offset-1; // skip to 3rd byte attr
+ *Ptr++ = OS2_COMMON_LVB_TRAILING_BYTE;
+ Len--;
+ } else
+ {
+ //
+ // If last written character was a lead byte,
+ // erase it.
+ //
+ *(Ptr-Offset) = ' ';
+ *(Ptr-1) = OS2_COMMON_LVB_SBCS;
+ }
+ } else
+ {
+ //
+ // Copy SBCS charater, and mark this char
+ // as SBCS
+ //
+ *Ptr++ = OS2_COMMON_LVB_SBCS;
+ }
+ }
+ }
+#else
+ for (;Len-- ; )
+ {
+ *Ptr = *Sou++;
+ Ptr += Offset;
+ }
+#endif
+ }
+}
+
+
+VOID
+VioLVBCopyCellStr( IN PUCHAR Sour,
+ IN COORD Coord,
+ IN ULONG LengthInCell)
+{
+ if(SesGrp->LVBOn && LengthInCell)
+ {
+#ifdef DBCS
+// MSKK Oct.13.1993 V-AkihiS
+ if (SesGrp->BytesPerCell == 2)
+ {
+ memmove(
+ GET_LVB_PTR( Coord.Y, Coord.X ),
+ Sour,
+ LengthInCell << SesGrp->VioLength2CellShift);
+ } else
+ {
+ register UCHAR *Ptr;
+ register ULONG Len = LengthInCell;
+ register PUCHAR Sou = Sour;
+
+ Ptr = GET_LVB_PTR( Coord.Y, Coord.X );
+
+ for (;Len-- ; )
+ {
+ if (Ow2NlsIsDBCSLeadByte(*Sou, SesGrp->VioCP))
+ {
+ //
+ // Copy leading byte charater, 1st attr and 2nd attr
+ // and put leading byte attr to 3rd attr
+ //
+ *Ptr++ = *Sou++; *Ptr++ = *Sou++; *Ptr++ = *Sou++;
+ *Ptr++ = OS2_COMMON_LVB_LEADING_BYTE;
+ Sou++; // skip source 3rd attr.
+ if (Len)
+ {
+ //
+ // Copy trailing byte charater, and mark
+ // this char as trailing byte
+ //
+ *Ptr++ = *Sou++; *Ptr++ = *Sou++; *Ptr++ = *Sou++;
+ *Ptr++ = OS2_COMMON_LVB_TRAILING_BYTE;
+ Sou++; // skip source 3rd attr.
+ Len--;
+ } else
+ {
+ //
+ // If last written chell was a lead byte,
+ // erase it.
+ //
+ *(Ptr-4) = ' ';
+ *(Ptr-1) = OS2_COMMON_LVB_SBCS;
+ }
+ } else
+ {
+ //
+ // Copy SBCS charater, and mark this char
+ // as SBCS
+ //
+ *Ptr++ = *Sou++; *Ptr++ = *Sou++; *Ptr++ = *Sou++;
+ *Ptr++ = OS2_COMMON_LVB_SBCS;
+ Sou++; // skip source 3rd attr.
+ }
+ }
+ }
+#else
+ memmove(
+ GET_LVB_PTR( Coord.Y, Coord.X ),
+ Sour,
+ LengthInCell << SesGrp->VioLength2CellShift);
+#endif
+ }
+}
+
+
+#ifdef DBCS
+// MSKK Oct.13.1993 V-AkihiS
+VOID VioLVBFillChar(IN PBYTE pChar,
+ IN COORD Coord,
+ IN ULONG LengthInCell)
+{
+ if(SesGrp->LVBOn && LengthInCell)
+ {
+ register UCHAR *Ptr;
+ register ULONG Offset = (ULONG)SesGrp->BytesPerCell;
+ register ULONG Len = LengthInCell;
+ register PBYTE pCha = pChar;
+
+ Ptr = GET_LVB_PTR( Coord.Y, Coord.X );
+
+ if (Offset == 2)
+ {
+ if (Ow2NlsIsDBCSLeadByte(*pCha, SesGrp->VioCP))
+ {
+ Len /= 2;
+ for ( ;Len-- ; )
+ {
+ *Ptr = *pCha;
+ Ptr += Offset;
+ *Ptr = *(pCha+1);
+ Ptr += Offset;
+ }
+ } else
+ {
+ for ( ;Len-- ; )
+ {
+ *Ptr = *pCha;
+ Ptr += Offset;
+ }
+ }
+ } else
+ {
+ if (Ow2NlsIsDBCSLeadByte(*pCha, SesGrp->VioCP))
+ {
+ Len /= 2;
+ for ( ;Len--; )
+ {
+ *Ptr = *pCha;
+ Ptr += Offset-1;
+ *Ptr++ = OS2_COMMON_LVB_LEADING_BYTE;
+ *Ptr = *(pCha+1);
+ Ptr += Offset-1;
+ *Ptr++ = OS2_COMMON_LVB_TRAILING_BYTE;
+ }
+ } else
+ {
+ for ( ;Len-- ; )
+ {
+ *Ptr = *pCha;
+ Ptr += Offset -1;
+ *Ptr++ = OS2_COMMON_LVB_SBCS;
+ }
+ }
+ }
+ }
+}
+#else
+VOID VioLVBFillChar(IN BYTE Char,
+ IN COORD Coord,
+ IN ULONG LengthInCell)
+{
+ if(SesGrp->LVBOn && LengthInCell)
+ {
+ register UCHAR *Ptr;
+ register ULONG Offset = (ULONG)SesGrp->BytesPerCell;
+ register ULONG Len = LengthInCell;
+ register BYTE Cha = Char;
+
+ Ptr = GET_LVB_PTR( Coord.Y, Coord.X );
+
+ for ( ;Len-- ; )
+ {
+ *Ptr = Cha;
+ Ptr += Offset;
+ }
+ }
+}
+#endif
+
+
+VOID VioLVBFillAtt( IN PBYTE pAttr,
+ IN COORD Coord,
+ IN ULONG LengthInCell)
+{
+ if(SesGrp->LVBOn && LengthInCell)
+ {
+ if ( SesGrp->BytesPerCell == 2 )
+ {
+ register PUCHAR Ptr;
+ register ULONG Offset = (ULONG)SesGrp->BytesPerCell;
+ register ULONG Len = LengthInCell;
+ register BYTE Att = *pAttr;
+
+ Ptr = GET_LVB_ATT_PTR( Coord.Y, Coord.X );
+
+ for ( ;Len-- ; )
+ {
+ *Ptr = Att;
+ Ptr += Offset;
+ }
+ } else
+ {
+ register PATTR_3_BYTES Ptr;
+ register ULONG Offset = (ULONG)SesGrp->BytesPerCell;
+ register ULONG Len = LengthInCell;
+ register ATTR_3_BYTES Att = *(PATTR_3_BYTES)pAttr;
+
+ Ptr = (PATTR_3_BYTES)GET_LVB_ATT_PTR( Coord.Y, Coord.X );
+
+ for ( ;Len-- ; )
+ {
+#ifdef DBCS
+// MSKK Jun.28.1992 KazuM
+// MSKK Oct.13.1993 V-AkihiS
+ //
+ // retain char type attribute in 3rd byte attriute.
+ //
+ Att.Attr[2] = Ptr->Attr[2];
+ *Ptr = Att;
+ Ptr = (PATTR_3_BYTES)((PUCHAR)Ptr + Offset);
+#else
+ *Ptr = Att;
+ Ptr += Offset;
+#endif
+ }
+ }
+ }
+}
+
+
+VOID VioLVBFillCell(IN PBYTE pCell,
+ IN COORD Coord,
+ IN ULONG LengthInCell)
+{
+ UCHAR *Ptr;
+ ULONG Pattern;
+
+ if(SesGrp->LVBOn && LengthInCell)
+ {
+ Ptr = GET_LVB_PTR( Coord.Y, Coord.X );
+
+#ifdef DBCS
+// MSKK Oct.14.1993 V-AkihiS
+ if ( SesGrp->BytesPerCell == 4 )
+ {
+ if (Ow2NlsIsDBCSLeadByte(pCell[0], SesGrp->VioCP))
+ {
+ register ATTR_3_BYTES LeadAttr = *(PATTR_3_BYTES)(&pCell[1]);
+ register ATTR_3_BYTES TrailAttr = *(PATTR_3_BYTES)(&pCell[5]);
+ register ULONG Len = LengthInCell / 2;
+
+ LeadAttr.Attr[2] = OS2_COMMON_LVB_LEADING_BYTE;
+ TrailAttr.Attr[2] = OS2_COMMON_LVB_TRAILING_BYTE;
+ for ( ; Len-- ; ) {
+ //
+ // Put leading byte cell
+ //
+ *Ptr++ = pCell[0];
+ *(PATTR_3_BYTES)Ptr = LeadAttr;
+ Ptr += 3;
+
+ //
+ // Put trailing byte cell
+ //
+ *Ptr++ = pCell[4];
+ *(PATTR_3_BYTES)Ptr = TrailAttr;
+ Ptr += 3;
+ }
+ } else
+ {
+ Pattern = (ULONG)((pCell[3] << 24) |
+ (pCell[2] << 16) |
+ (pCell[1] << 8) |
+ (pCell[0]));
+
+ RtlFillMemoryUlong(
+ Ptr,
+ LengthInCell << SesGrp->VioLength2CellShift,
+ Pattern);
+
+ }
+ } else {
+ if (Ow2NlsIsDBCSLeadByte(pCell[0], SesGrp->VioCP))
+ {
+ Pattern = (ULONG)((pCell[3] << 24) |
+ (pCell[2] << 16) |
+ (pCell[1] << 8) |
+ (pCell[0]));
+ } else
+ {
+ Pattern = (ULONG)((pCell[1] << 24) |
+ (pCell[0] << 16) |
+ (pCell[1] << 8) |
+ (pCell[0]));
+
+ if (LengthInCell & 1)
+ {
+ *(Ptr++) = pCell[0];
+ *(Ptr++) = pCell[1];
+ LengthInCell-- ;
+ }
+ }
+
+ RtlFillMemoryUlong(
+ Ptr,
+ LengthInCell << SesGrp->VioLength2CellShift,
+ Pattern);
+
+ }
+#else
+// for (;Length-- ; )
+// {
+// *(Ptr++) = pCell[0];
+// *(Ptr++) = pCell[1];
+// }
+
+ if ( SesGrp->BytesPerCell == 4 )
+ {
+ Pattern = (ULONG)((pCell[3] << 24) |
+ (pCell[2] << 16) |
+ (pCell[1] << 8) |
+ (pCell[0]));
+ } else
+ {
+ Pattern = (ULONG)((pCell[1] << 24) |
+ (pCell[0] << 16) |
+ (pCell[1] << 8) |
+ (pCell[0]));
+
+ if ((ULONG)Ptr & 3) {
+ LengthInCell--;
+ *(Ptr++) = pCell[0];
+ *(Ptr++) = pCell[1];
+ }
+
+ if (LengthInCell & 1)
+ {
+ LengthInCell-- ;
+ *(Ptr + (LengthInCell << 1)) = pCell[0];
+ *(Ptr + (LengthInCell << 1) + 1) = pCell[1];
+ }
+ }
+
+ RtlFillMemoryUlong(
+ Ptr,
+ LengthInCell << SesGrp->VioLength2CellShift,
+ Pattern);
+#endif
+ }
+
+}
+
+
+VOID
+VioLVBScrollBuff(IN DWORD LineNum)
+{
+ DWORD Size;
+ ULONG Pattern;
+
+ if (SesGrp->LVBOn && LineNum)
+ {
+ if ( LineNum > (DWORD)SesGrp->ScreenRowNum )
+ {
+ LineNum = SesGrp->ScreenRowNum;
+ }
+
+#ifdef DBCS
+// MSKK Oct.20.1993 V-AkihiS
+ Size = SesGrp->BytesPerCell * SesGrp->ScreenColNum * LineNum;
+ if (SesGrp->BytesPerCell == 2)
+ {
+ Pattern = (ULONG)((SesGrp->AnsiCellAttr[0] << 24) |
+ (' ' << 16) |
+ (SesGrp->AnsiCellAttr[0] << 8) |
+ (' '));
+ } else
+ {
+ Pattern = (ULONG)((SesGrp->AnsiCellAttr[2] << 24) |
+ (SesGrp->AnsiCellAttr[1] << 16) |
+ (SesGrp->AnsiCellAttr[0] << 8) |
+ (' '));
+ }
+#else
+ Size = 2 * SesGrp->ScreenColNum * LineNum;
+ Pattern = (ULONG)((SesGrp->AnsiCellAttr[0] << 24) |
+ (' ' << 16) |
+ (SesGrp->AnsiCellAttr[0] << 8) |
+ (' '));
+#endif
+
+ RtlMoveMemory(LVBBuffer,
+ LVBBuffer + Size,
+ SesGrp->LVBsize - Size);
+
+
+#ifdef DBCS
+// MSKK Oct.20.1993 V-AkihiS
+ if (SesGrp->BytesPerCell == 4)
+ {
+ Size = SesGrp->ScreenColNum * LineNum;
+ }
+#endif
+ RtlFillMemoryUlong(LVBBuffer + SesGrp->LVBsize - Size,
+ Size,
+ Pattern);
+
+ }
+}
+
+
+PUCHAR
+Ow2LvbGetPtr(
+ IN COORD Coord
+ )
+{
+ return(GET_LVB_PTR( Coord.Y, Coord.X));
+}
+
+
+VOID
+LVBUpdateTTYCharWithAttrAndCurPos(
+ IN CHAR c,
+ IN PCHAR * LVBPtr
+ )
+{
+ PCHAR Ptr = *LVBPtr;
+ USHORT i;
+
+ if(SesGrp->LVBOn)
+ {
+ *Ptr++ = c;
+
+ for ( i = 1 ; i < SesGrp->BytesPerCell ; i++ )
+ {
+ *Ptr++ = SesGrp->AnsiCellAttr[i - 1];
+ }
+
+ *LVBPtr = Ptr;
+ }
+}
+
+#ifdef DBCS
+// MSKK Oct.13.1993 V-AkihiS
+/* states of the finite state machine */
+
+#define NOCMD 1 /* type of crt state - most chars will go onto screen */
+#define ESCED 2 /* we've seen an ESC, waiting for rest of CSI */
+#define EQCMD 3 /* if '=' goto MODPARAMS else PARAMS */
+#define PARAMS 4 /* we're building the parameter list for ansicmd */
+#define MODPARAMS 5 /* we're building the parameter list for MODCMD */
+#define MODCMD 6 /* we've seen "ESC[=Num" waiting for #h or #l (# in {0..7}) */
+#define MODDBCS 7 /* we've seen DBCS lead-in char */
+
+VOID
+LVBUpdateTTYCharWithAttrAndCurPosDBCS(
+ IN CHAR c,
+ IN PCHAR * LVBPtr,
+ IN USHORT State
+ )
+{
+ PUCHAR Ptr = *LVBPtr;
+
+ if(SesGrp->LVBOn)
+ {
+ *Ptr++ = c;
+
+ if (SesGrp->BytesPerCell == 2)
+ {
+ *Ptr++ = SesGrp->AnsiCellAttr[0];
+ } else {
+ *Ptr++ = SesGrp->AnsiCellAttr[0];
+ *Ptr++ = SesGrp->AnsiCellAttr[1];
+ if (State == MODDBCS)
+ {
+ *Ptr++ = OS2_COMMON_LVB_TRAILING_BYTE;
+ } else
+ {
+ *Ptr++ = OS2_COMMON_LVB_LEADING_BYTE;
+ }
+ }
+
+ *LVBPtr = Ptr;
+ }
+}
+#endif