149 lines
3.2 KiB
C++
149 lines
3.2 KiB
C++
//
|
|
//
|
|
//
|
|
|
|
#include "hpglparser.h"
|
|
|
|
HpglParser::HpglParser(Plotter* plotter): _plotter(plotter)
|
|
{
|
|
}
|
|
|
|
bool HpglParser::isWhitespace(const char ch)
|
|
{
|
|
return ch == ' ' || ch == '\n';
|
|
}
|
|
|
|
bool HpglParser::isSeparator(char ch)
|
|
{
|
|
return isWhitespace(ch) || ch==',';
|
|
}
|
|
|
|
void HpglParser::findCoordinats()
|
|
{
|
|
bool wasPAM = (cmdMode == PA_M);
|
|
if(buffer[bufferIndex] == ';') cmdMode = 0;
|
|
|
|
buffer[bufferIndex] = '\0';
|
|
if(!xSet)
|
|
{
|
|
_nextPoint.x=atoi(buffer);
|
|
if(cmdMode != 0) xSet = true;
|
|
bufferIndex = -1;
|
|
}
|
|
else
|
|
{
|
|
_nextPoint.y=atoi(buffer);
|
|
if(wasPAM) _plotter->moveto(&_nextPoint);
|
|
else
|
|
{
|
|
Point currentPos = _plotter->getCurrentPos();
|
|
_plotter->moveto(currentPos.x + _nextPoint.x, currentPos.y + _nextPoint.y);
|
|
}
|
|
xSet = false;
|
|
bufferIndex = -1;
|
|
}
|
|
}
|
|
|
|
void HpglParser::findCommand()
|
|
{
|
|
switch (buffer[bufferIndex])
|
|
{
|
|
case 'I': break;
|
|
case 'N':
|
|
{
|
|
cmdMode = SKIP_M;
|
|
bufferIndex = -1;
|
|
break;
|
|
}
|
|
case 'P':
|
|
{
|
|
if(buffer[bufferIndex-1] == 'S')
|
|
{
|
|
cmdMode = SKIP_M;
|
|
bufferIndex = -1;
|
|
}
|
|
else if(buffer[bufferIndex-1] == 'B')
|
|
{
|
|
_plotter->moveto(0,0);
|
|
cmdMode = SKIP_M;
|
|
bufferIndex = -1;
|
|
}
|
|
break;
|
|
}
|
|
case 'U':
|
|
{
|
|
if(buffer[bufferIndex-1] == 'P')
|
|
{
|
|
cmdMode = PA_M;
|
|
_plotter->pu();
|
|
bufferIndex = -1;
|
|
}
|
|
break;
|
|
}
|
|
case 'D':
|
|
{
|
|
if(buffer[bufferIndex-1] == 'P')
|
|
{
|
|
cmdMode = PA_M;
|
|
_plotter->pd();
|
|
bufferIndex = -1;
|
|
}
|
|
break;
|
|
}
|
|
case 'A':
|
|
{
|
|
if(buffer[bufferIndex-1] == 'P')
|
|
{
|
|
cmdMode = PA_M;
|
|
bufferIndex = -1;
|
|
}
|
|
else cmdMode = ERROR_M;
|
|
break;
|
|
}
|
|
case 'R':
|
|
{
|
|
if(buffer[bufferIndex-1] == 'P')
|
|
{
|
|
cmdMode = PR_M;
|
|
bufferIndex = -1;
|
|
}
|
|
else cmdMode = ERROR_M;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
int HpglParser::add(const char ch)
|
|
{
|
|
buffer[bufferIndex]=ch;
|
|
|
|
//sense
|
|
|
|
if(cmdMode == 0 && bufferIndex > 0 && !isWhitespace(ch) )
|
|
{
|
|
findCommand();
|
|
}
|
|
else if((cmdMode == PA_M || cmdMode == PR_M) && (isSeparator(ch) || ch==';') )
|
|
{
|
|
findCoordinats();
|
|
}
|
|
else if(((cmdMode == SKIP_M || cmdMode == ERROR_M) && ch==';') || (cmdMode == 0 && ch==';') )
|
|
{
|
|
xSet=false;
|
|
bufferIndex = -1;
|
|
cmdMode=0;
|
|
}
|
|
|
|
bufferIndex++;
|
|
|
|
if(bufferIndex > 64)
|
|
{
|
|
xSet=false;
|
|
bufferIndex = 0;
|
|
cmdMode = 0;
|
|
return 2;
|
|
}
|
|
return (bufferIndex == 0 && cmdMode == 0) ? 1 : 0;
|
|
}
|
|
|