# # # patch "guitone/src/util/StdioParser.cpp" # from [7c011f391ec58518419ddc4b4c47450b2c592242] # to [a77daccba65e5b455cab2c69e23789d7aae81a2e] # # patch "guitone/src/util/StdioParser.h" # from [6c10b4ffac15272a1596abf687e7d46006f843ca] # to [76c4b1f59fe175f5448b10afb6093051dd0fd0a7] # ============================================================ --- guitone/src/util/StdioParser.cpp 7c011f391ec58518419ddc4b4c47450b2c592242 +++ guitone/src/util/StdioParser.cpp a77daccba65e5b455cab2c69e23789d7aae81a2e @@ -20,18 +20,13 @@ #include "StdioParser.h" -StdioParser::StdioParser(const QByteArray & input) -{ - in = input; - size = in.length(); - charPos = 0; -} +StdioParser::StdioParser(const QByteArray & in) : input(in) {} StdioParser::~StdioParser() {} bool StdioParser::parse() { - if (size == 0) return false; + if (input.size() == 0) return false; // chunk format: :::: commandNumber = getNumber(); @@ -39,42 +34,39 @@ bool StdioParser::parse() errorCode = getNumber(); Q_ASSERT(getNext() == ':'); chunkType = getNext(); - Q_ASSERT( - (chunkType >= 'A' && chunkType <= 'Z') || - (chunkType >= 'a' && chunkType <= 'z') - ); + Q_ASSERT(chunkType == 'm' || chunkType == 'l'); Q_ASSERT(getNext() == ':'); chunkSize = getNumber(); Q_ASSERT(getNext() == ':'); - int charsLeft = size - charPos; + int charsLeft = input.size(); if (chunkSize > charsLeft) { return false; } - payload = in.mid(charPos, chunkSize); - processedBytes = charPos + chunkSize; - + payload = input.mid(0, chunkSize); + input.remove(0, chunkSize); return true; } int StdioParser::getNumber() { int number = 0; - int origPos = charPos; + int processedChars = 0; while (char ch = whatsNext()) { if (ch < '0' || ch > '9') { // ensure that we've read at least one char - Q_ASSERT(origPos != charPos); + Q_ASSERT(processedChars > 0); break; } number *= 10; number += (ch - '0'); advance(); + processedChars++; } return number; @@ -82,19 +74,20 @@ char StdioParser::whatsNext(int count /* char StdioParser::whatsNext(int count /* = 0 */) { - if (charPos + count >= size) return '\0'; - return in.at(charPos + count); + if (count > (input.size() - 1)) return '\0'; + return input.at(count); } -void StdioParser::advance(int count /* = 1 */) +bool StdioParser::advance(int count /* = 1 */) { - if (charPos + count >= size) return; - charPos += count; + if (count > input.size()) return false; + input.remove(0, count); + return true; } char StdioParser::getNext() { - char ch = in.at(charPos); + char ch = input.at(0); advance(); return ch; } ============================================================ --- guitone/src/util/StdioParser.h 6c10b4ffac15272a1596abf687e7d46006f843ca +++ guitone/src/util/StdioParser.h 76c4b1f59fe175f5448b10afb6093051dd0fd0a7 @@ -36,24 +36,20 @@ public: inline char getChunkType() { return chunkType; } inline int getChunkSize() { return chunkSize; } inline QByteArray getPayload() { return payload; } - inline int getProcessedBytes() { return processedBytes; } + inline QByteArray getLeftBytes() { return input; } private: char whatsNext(int count = 0); char getNext(); - void advance(int count = 1); + bool advance(int count = 1); int getNumber(); int commandNumber; int errorCode; char chunkType; int chunkSize; - int processedBytes; QByteArray payload; - - QByteArray in; - int charPos; - int size; + QByteArray input; }; #endif