Plotter/hpglparser.cpp
2017-09-19 16:16:54 +02:00

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;
}