Files
Work/http/SCAN.CPP
2024-08-07 09:16:27 -04:00

227 lines
5.4 KiB
C++

#include <http/table.hpp>
#include <http/scan.hpp>
Scan::Scan(PureViewOfFile &srcView,PureViewOfFile &dstView,Table &symbolTable,WORD allowUserSymbols)
: Emit(srcView,dstView), mSymbolTable(symbolTable), mUserSymbols(allowUserSymbols)
{
}
Scan::~Scan(void)
{
mWinConsole.writeLine("press enter to continue");
mWinConsole.read();
}
void Scan::analyze(void)
{
readch();
while((int)mChar!=-1&&mChar!=0x001A)
{
skipSeparators();
if(0xFFFF==mChar||0x001A==mChar)break;
if(isdigit(mChar))scanNumeral();
else if(isalpha(mChar))scanWord();
else if(mChar=='\r')scanNewLine();
else if(mChar=='"')scanLiteral();
else if(mChar=='<')scanLeftAngle();
else if(mChar=='>')scanRightAngle();
else if(mChar=='/')scanForwardSlash();
else if(mChar=='&')scanAmpersand();
else if(mChar==';')scanSemicolon();
else if(mChar=='#')scanPound();
else if(mChar=='!')scanExclamation();
else if(mChar=='-')scanMinus();
else if(mChar=='=')scanEqual();
else scanUnknown();
}
emit(endtext1);
}
void Scan::scanNewLine(void)
{
mWinConsole.writeLine("Scan::scanNewLine");
readch();
if(mChar=='\n')
{
emit(newline1);
readch();
}
else emit(unknown1);
}
void Scan::skipSeparators(void)
{
while(mChar==SpaceChar||mChar==TabChar)readch();
}
void Scan::scanWord(void)
{
String wordString;
int tableIndex(0);
mWinConsole.writeLine("Scan::scanWord");
if(mChar=='"')readch();
while(0xFFFF!=mChar&&0x0D!=mChar&&mChar!='"'&&mChar!='>'&&mChar!='/'&&mChar!='='&&mChar!='"'&&!isspace(mChar))
{
wordString+=String((char)mChar);
readch();
}
if(mChar=='"')readch();
if(wordString.isNull())return;
if(mSymbolTable.locateSymbolString(wordString,tableIndex))
{
if(Symbol::UserSymbol==mSymbolTable[tableIndex].symbolType())
emit(name1,mSymbolTable[tableIndex].symbolType(),tableIndex);
else if(Symbol::AssignedSymbol==mSymbolTable[tableIndex].symbolType())
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
else if(Symbol::ConstantSymbol==mSymbolTable[tableIndex].symbolType())
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
else if(Symbol::SystemSymbol==mSymbolTable[tableIndex].symbolType())
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
else if(Symbol::CommandSymbol==mSymbolTable[tableIndex].symbolType())
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
else emit(unknown1);
}
else
{
emit(startliteral1);
emit(wordString.length());
emit((char*)wordString);
}
}
void Scan::scanLiteral(void)
{
String wordString;
int tableIndex(0);
mWinConsole.writeLine("Scan::scanLiteral");
readch();
while(0xFFFF!=mChar&&'"'!=mChar)
{
wordString+=String((char)mChar);
readch();
}
if(mChar=='"')readch();
if(wordString.isNull())return;
if(mSymbolTable.locateSymbolString(wordString,tableIndex))
{
if(Symbol::UserSymbol==mSymbolTable[tableIndex].symbolType())
emit(name1,mSymbolTable[tableIndex].symbolType(),tableIndex);
else if(Symbol::AssignedSymbol==mSymbolTable[tableIndex].symbolType())
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
else if(Symbol::ConstantSymbol==mSymbolTable[tableIndex].symbolType())
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
else if(Symbol::SystemSymbol==mSymbolTable[tableIndex].symbolType())
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
else if(Symbol::CommandSymbol==mSymbolTable[tableIndex].symbolType())
emit(name1,mSymbolTable[tableIndex].symbolType(),mSymbolTable[tableIndex].identifier());
else emit(unknown1);
}
else
{
emit(startliteral1);
emit(wordString.length());
emit((char*)wordString);
}
}
void Scan::scanNumeral(void)
{
int multiplier=10;
double value=0;
double digits;
mWinConsole.writeLine("Scan::scanNumeral");
while(0xFFFF!=mChar&&isdigit(mChar))
{
digits=atof((char *)&mChar);
value=multiplier*value+digits;
readch();
}
if(mChar=='.')
{
readch();
while(isdigit(mChar))
{
digits=atof((char *)&mChar);
value=(digits/multiplier)+value;
multiplier*=10;
readch();
}
}
emit(numeral1,value);
}
// *****************************************************************************
void Scan::scanLeftAngle(void)
{
mWinConsole.writeLine("Scan::scanLeftAngle");
emit(leftangle1);
readch();
}
void Scan::scanRightAngle(void)
{
mWinConsole.writeLine("Scan::scanRightAngle");
emit(rightangle1);
readch();
}
void Scan::scanForwardSlash(void)
{
mWinConsole.writeLine("Scan::scanForwardSlash");
emit(forwardslash1);
readch();
}
void Scan::scanAmpersand(void)
{
mWinConsole.writeLine("Scan::scanAmpersand");
emit(ampersand1);
readch();
}
void Scan::scanSemicolon(void)
{
mWinConsole.writeLine("Scan::scanSemicolon");
emit(semicolon1);
readch();
}
void Scan::scanPound(void)
{
mWinConsole.writeLine("Scan::scanPound");
emit(pound1);
readch();
}
void Scan::scanExclamation(void)
{
mWinConsole.writeLine("Scan::scanExclamation");
emit(exclamation1);
readch();
}
void Scan::scanMinus(void)
{
mWinConsole.writeLine("Scan::scanMinus");
emit(minus1);
readch();
}
void Scan::scanEqual(void)
{
mWinConsole.writeLine("Scan::scanEqual");
emit(equal1);
readch();
}
void Scan::scanUnknown(void)
{
mWinConsole.writeLine("Scan::scanUnknown");
emit(unknown1);
readch();
}