home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
550b.lha
/
Term_v1.8a
/
Source.LZH
/
ParseCode.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-07-06
|
7KB
|
316 lines
/* $Revision Header * Header built automatically - do not edit! *************
*
* (C) Copyright 1990 by Olaf 'Olsen' Barthel & MXM
*
* Name .....: ParseCode.c
* Created ..: Monday 21-Jan-91 20:12
* Revision .: 0
*
* Date Author Comment
* ========= ======== ====================
* 21-Jan-91 Olsen Created this file!
*
* $Revision Header ********************************************************/
#include "TermGlobal.h"
/* A couple of internally referenced variables. */
STATIC BYTE CharsInBuffer = 0;
STATIC UBYTE SaveBuffer[30];
STATIC BYTE ScanStep = 0;
/* External comparison routines. */
extern BYTE Num1(WORD Char);
extern BYTE Num2(WORD Char);
extern BYTE Num3(WORD Char);
extern BYTE Num4(WORD Char);
/* This structure describes an ANSI control sequence. */
struct ControlCode
{
UBYTE FirstChar;
BYTE (*Match)(WORD Char);
UBYTE LastChar;
BYTE ExactSize;
UBYTE * (*Func)(UBYTE *Buffer);
};
/* At present 55 different control sequences are supported/trapped. */
#define NUM_CODES 55
/* This follows the control code information. */
struct ControlCode ANSICode[NUM_CODES] =
{
/* Single Character Sequences. */
'D', NULL, 0 , 1, (APTR)CursorScrollDown,
'M', NULL, 0 , 1, (APTR)CursorScrollUp,
'E', NULL, 0 , 1, (APTR)NextLine,
'7', NULL, 0 , 1, (APTR)SaveCursor,
'8', NULL, 0 , 1, (APTR)LoadCursor,
'=', NULL, 0 , 1, (APTR)NumericAppMode,
'>', NULL, 0 , 1, (APTR)NumericAppMode,
'N', NULL, 0 , 1, (APTR)Ignore,
'O', NULL, 0 , 1, (APTR)Ignore,
'H', NULL, 0 , 1, (APTR)SetTab,
'Z', NULL, 0 , 1, (APTR)RequestTerminal,
'c', NULL, 0 , 1, (APTR)Reset,
'<', NULL, 0 , 1, (APTR)Ignore,
'~', NULL, 0 , 1, (APTR)Ignore,
'n', NULL, 0 , 1, (APTR)Ignore,
'}', NULL, 0 , 1, (APTR)Ignore,
'o', NULL, 0 , 1, (APTR)Ignore,
'|', NULL, 0 , 1, (APTR)Ignore,
/* Double Character Sequences. */
'[', NULL, 's', 2, (APTR)SaveCursor,
'[', NULL, 'u', 2, (APTR)LoadCursor,
'(', NULL, 'A', 2, (APTR)FontStuff,
'(', NULL, 'B', 2, (APTR)FontStuff,
'(', NULL, '0', 2, (APTR)FontStuff,
')', NULL, 'A', 2, (APTR)FontStuff,
')', NULL, 'B', 2, (APTR)FontStuff,
')', NULL, '0', 2, (APTR)FontStuff,
'#', NULL, '3', 2, (APTR)ScaleFont,
'#', NULL, '4', 2, (APTR)ScaleFont,
'#', NULL, '5', 2, (APTR)ScaleFont,
'#', NULL, '6', 2, (APTR)ScaleFont,
'#', NULL, '8', 2, (APTR)Ignore,
' ', NULL, 'F', 2, (APTR)Ignore,
' ', NULL, 'G', 2, (APTR)Ignore,
/* Multiple Character Sequence. */
'[', Num3, 'i', 0, (APTR)Ignore,
'[', Num3, 'n', 0, (APTR)RequestInformation,
'[', Num3, 'c', 0, (APTR)RequestTerminal,
'[', Num3, 'h', 0, (APTR)SetSomething,
'[', Num3, 'l', 0, (APTR)SetSomething,
'[', Num4, 'h', 0, (APTR)Ignore,
'[', Num1, 'A', 0, (APTR)MoveCursor,
'[', Num1, 'B', 0, (APTR)MoveCursor,
'[', Num1, 'C', 0, (APTR)MoveCursor,
'[', Num1, 'D', 0, (APTR)MoveCursor,
'[', Num1, 'K', 0, (APTR)EraseLine,
'[', Num1, 'J', 0, (APTR)EraseScreen,
'[', Num1, 'P', 0, (APTR)EraseCharacters,
'[', Num1, 'L', 0, (APTR)InsertLine,
'[', Num1, 'M', 0, (APTR)ClearLine,
'[', Num1, 'g', 0, (APTR)SetTabs,
'[', Num1, 'q', 0, (APTR)Ignore,
'[', Num2, 'H', 0, (APTR)SetPosition,
'[', Num2, 'f', 0, (APTR)SetPosition,
'[', Num2, 'm', 0, (APTR)SetAttributes,
'[', Num2, 'y', 0, (APTR)Ignore,
'[', Num2, 'r', 0, (APTR)SetRegion,
};
/* DoCancel():
*
* Cancel any currently scanned sequence.
*/
VOID
DoCancel()
{
InSequence = FALSE;
CharsInBuffer = ScanStep = 0;
}
/* CSIFake():
*
* This routine was added to support 8-bit control
* sequences introduced by a CSI character.
*/
VOID
CSIFake()
{
/* Reset scanner */
DoCancel();
/* Perform as if ESC [ had been transmitted. */
InSequence = ParseCode('[');
}
/* ParseCode(UBYTE c):
*
* Input: A character to be passed through the ANSI code
* parser.
*
* Output: FALSE if input characters did form a valid ANSI
* control sequence or if input characters did not
* form an ANSI control sequence at all.
*
* TRUE if input characters did possibly introduce
* a valid ANSI control sequence.
*/
BYTE
ParseCode(UBYTE c)
{
SHORT i;
/* ScanStep = 0: This is the first character
* to introduce a control sequence.
*/
if(!ScanStep)
{
/* Scan all available codes and try to find
* a match.
*/
for(i = 0 ; i < NUM_CODES ; i++)
{
/* This character may introduce a
* control sequence.
*/
if(ANSICode[i] . FirstChar == c)
{
/* If this is a single
* character control sequence
* call the approriate function
* and exit immediately.
*/
if(ANSICode[i] . ExactSize == 1)
{
SaveBuffer[CharsInBuffer++] = c;
SaveBuffer[CharsInBuffer] = 0;
if(Config . Emulation != EMULATION_ATOMIC || Escape)
{
UBYTE *SomeString = ANSICode[i] . Func(&SaveBuffer[0]);
if(SomeString)
SerWrite(SomeString,strlen(SomeString));
}
CharsInBuffer = ScanStep = 0;
return(FALSE);
}
/* The length of this control
* sequence is greater than
* a single character. Save
* the input character and
* return.
*/
ScanStep = i;
SaveBuffer[CharsInBuffer++] = c;
return(TRUE);
}
}
/* No control sequence introducing character
* was found.
*/
/* No Match */
CharsInBuffer = ScanStep = 0;
return(FALSE);
}
else
{
/* Length of the control sequence
* overrides the boundary, exit
* immediately!
*/
if(CharsInBuffer == 21)
{
/* No Match */
CharsInBuffer = ScanStep = 0;
return(FALSE);
}
/* Scan the remaining codes for a match. */
for(i = ScanStep ; i < NUM_CODES ; i++)
{
/* This sequence begins with the
* same character the parser was
* initialized with, so let's take
* a look at it.
*/
if(ANSICode[i] . FirstChar == SaveBuffer[0])
{
/* This character is supposed to
* terminate the sequence. So let's
* exit.
*/
if(ANSICode[i] . LastChar == c)
{
SaveBuffer[CharsInBuffer++] = c;
SaveBuffer[CharsInBuffer] = 0;
if(Config . Emulation != EMULATION_ATOMIC || Escape)
{
UBYTE *SomeString = ANSICode[i] . Func(&SaveBuffer[0]);
if(SomeString)
SerWrite(SomeString,strlen(SomeString));
}
CharsInBuffer = ScanStep = 0;
return(FALSE);
}
else
{
if(ANSICode[i] . Match)
{
/* This character is part of
* a legal sequence. Store it
* and return.
*/
if(ANSICode[i] . Match(c))
{
ScanStep = i;
SaveBuffer[CharsInBuffer++] = c;
return(TRUE);
}
}
}
}
}
/* This character is not part of a valid
* ANSI control sequence, so exit.
*/
/* No Match */
CharsInBuffer = ScanStep = 0;
return(FALSE);
}
}