// // // #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; } else if(buffer[bufferIndex-1] == 'H') { _plotter->setHighPrecision(true); cmdMode = SKIP_M; bufferIndex = -1; } else if(buffer[bufferIndex-1] == 'L') { _plotter->setHighPrecision(false); 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; } case 'E': { if(buffer[bufferIndex-1] == 'D') { _plotter->demo(); cmdMode = SKIP_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; }