From a5d9ba586cd74deb0af7581a849aa900312304ca Mon Sep 17 00:00:00 2001 From: Gwenhael Goavec-Merou Date: Sun, 22 Dec 2019 08:16:37 +0100 Subject: [PATCH] latticeBitParser: better header implementation and check return --- latticeBitParser.cpp | 69 ++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/latticeBitParser.cpp b/latticeBitParser.cpp index 875bc37..c1c9b9a 100644 --- a/latticeBitParser.cpp +++ b/latticeBitParser.cpp @@ -14,6 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#include #include #include #include @@ -47,46 +48,39 @@ void LatticeBitParser::displayHeader() int LatticeBitParser::parseHeader() { - /* end is wrong detected - * 3B is a command AFTER header - */ - - int ret = 1; int currPos = _fd.tellg(); - uint32_t dummy32 = 0, dummyPrev = 0; - do { - dummyPrev = dummy32; - _fd.read(reinterpret_cast(&dummy32), sizeof(uint32_t)); - if (_fd.eof()) { - printf("End of file without header end\n"); - return EXIT_FAILURE; + char tmp[_file_size-currPos]; + char field[256]; + bool foundEndHeader = false; + uint32_t *d; + + _fd.read(tmp, (_file_size-currPos)*sizeof(char)); + + for (int i = 0; i < _file_size-currPos;) { + if (tmp[i] == 0xff) { + d = (uint32_t*)(tmp+i); + if (d[0] != 0xBDffffff && (0xffffff00 & d[1]) != 0x3BFFFF00){ + foundEndHeader = true; + _endHeader = i + currPos -1; + break; + } + i++; + } else { + strcpy(field, tmp+i); + string buff(field); + int pos = buff.find_first_of(':', 0); + if (pos != -1) { + string key(buff.substr(0, pos)); + string val(buff.substr(pos+1, buff.size())); + int startPos = val.find_first_not_of(" "); + int endPos = val.find_last_not_of(" ")+1; + _attribs[key] = val.substr(startPos, endPos).c_str(); + } + i+=strlen(field)+1; } - } while (dummyPrev != 0xBDffffff && dummy32 != 0x3BFFFFB3); - _endHeader = _fd.tellg(); - /* -8 => 2 * 4 byte for pattern - */ - int headerLength = _endHeader - currPos -8; - _endHeader-=8; // pattern is included to data to send - _fd.seekg(currPos, _fd.beg); - - char buffer[headerLength]; - _fd.read(buffer, sizeof(char) * headerLength); - - int i = 0; - while (i < headerLength) { - string buff(buffer+i); - i+= buff.size() + 1; - int pos = buff.find_first_of(':', 0); - if (pos == -1) // useless - continue; - string key(buff.substr(0, pos)); - string val(buff.substr(pos+1, buff.size())); - int startPos = val.find_first_not_of(" "); - int endPos = val.find_last_not_of(" ")+1; - _attribs[key] = val.substr(startPos, endPos).c_str(); } - return ret; + return (foundEndHeader) ? EXIT_SUCCESS : EXIT_FAILURE; } int LatticeBitParser::parse() @@ -101,7 +95,8 @@ int LatticeBitParser::parse() } /* until 0xFFFFBDB3 0xFFFF */ - parseHeader(); + if (parseHeader() == EXIT_FAILURE) + return EXIT_FAILURE; /* read All data */ _fd.seekg(_endHeader, _fd.beg);