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

265 lines
6.2 KiB
C++

#if 0
#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),
mLogFile("scan.log",FileHandle::Write,FileHandle::ShareRead,FileHandle::Overwrite)
{
}
Scan::~Scan(void)
{
}
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 if(mChar==':')scanColon();
else if(mChar=='(')scanRightParen();
else if(mChar==')')scanLeftParen();
else if(mChar==' ')scanSpace();
else scanUnknown();
}
emit(endtext1);
}
void Scan::scanNewLine(void)
{
mLogFile.writeLine("Scan::scanNewLine");
readch();
if(mChar=='\n')
{
emit(newline1);
readch();
}
else emit(unknown1);
}
void Scan::skipSeparators(void)
{
while(mChar==TabChar||mChar==LineFeed)readch(); // mChar==SpaceChar||
}
void Scan::scanWord(void)
{
String wordString;
int tableIndex(0);
if(mChar=='"')readch();
while(0xFFFF!=mChar&&0x0D!=mChar&&mChar!='"'&&mChar!='>'&&mChar!='<'&&mChar!='='&&mChar!='"'&&mChar!='&'&&mChar!=';'&&mChar!=')'&&mChar!='#'&&!isspace(mChar)) // &&mChar!='/'
{
wordString+=String((char)mChar);
readch();
}
if(mChar=='"')readch();
if(wordString.isNull())return;
mLogFile.writeLine(String("Scan::scanWord")+String(" '")+wordString+String("'"));
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(literal1);
emit(wordString.length());
emit((char*)wordString);
}
}
void Scan::scanLiteral(void)
{
String wordString;
int tableIndex(0);
readch();
while(0xFFFF!=mChar&&'"'!=mChar)
{
wordString+=String((char)mChar);
readch();
}
if(mChar=='"')readch();
if(wordString.isNull())return;
mLogFile.writeLine(String("Scan::scanLiteral")+String(" '")+wordString+String("'"));
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(literal1);
emit(wordString.length());
emit((char*)wordString);
}
}
void Scan::scanNumeral(void)
{
int multiplier=10;
double value=0;
double digits;
while(0xFFFF!=mChar&&isdigit(mChar))
{
digits=atof((char *)&mChar);
value=multiplier*value+digits;
readch();
}
String numberString;
::sprintf(numberString,"%lf",value);
mLogFile.writeLine(String("Scan::scanNumeral")+String(" '")+numberString+String("'"));
if(mChar=='.')
{
readch();
while(isdigit(mChar))
{
digits=atof((char *)&mChar);
value=(digits/multiplier)+value;
multiplier*=10;
readch();
}
}
emit(numeral1,value);
}
// *****************************************************************************
void Scan::scanLeftAngle(void)
{
mLogFile.writeLine("Scan::scanLeftAngle");
emit(leftangle1);
readch();
}
void Scan::scanRightAngle(void)
{
mLogFile.writeLine("Scan::scanRightAngle");
emit(rightangle1);
readch();
}
void Scan::scanForwardSlash(void)
{
mLogFile.writeLine("Scan::scanForwardSlash");
emit(forwardslash1);
readch();
}
void Scan::scanAmpersand(void)
{
mLogFile.writeLine("Scan::scanAmpersand");
emit(ampersand1);
readch();
}
void Scan::scanSemicolon(void)
{
mLogFile.writeLine("Scan::scanSemicolon");
emit(semicolon1);
readch();
}
void Scan::scanPound(void)
{
mLogFile.writeLine("Scan::scanPound");
emit(pound1);
readch();
}
void Scan::scanExclamation(void)
{
mLogFile.writeLine("Scan::scanExclamation");
emit(exclamation1);
readch();
}
void Scan::scanMinus(void)
{
mLogFile.writeLine("Scan::scanMinus");
emit(minus1);
readch();
}
void Scan::scanEqual(void)
{
mLogFile.writeLine("Scan::scanEqual");
emit(equal1);
readch();
}
void Scan::scanColon(void)
{
mLogFile.writeLine("Scan::scanColon");
emit(colon1);
readch();
}
void Scan::scanRightParen(void)
{
mLogFile.writeLine("Scan::scanRightParen");
emit(rightparen1);
readch();
}
void Scan::scanLeftParen(void)
{
mLogFile.writeLine("Scan::scanLeftParen");
emit(leftparen1);
readch();
}
void Scan::scanSpace(void)
{
mLogFile.writeLine("Scan::scanSpace");
emit(space1);
readch();
}
void Scan::scanUnknown(void)
{
String logString;
::sprintf(logString,"Scan::unknown '0x%x' %d",(int)mChar,(int)mChar);
mLogFile.writeLine(logString);
emit(unknown1);
readch();
}
#endif