# # # rename "guitone/src/util/StanzaParser.cpp" # to "guitone/src/util/BasicIOParser.cpp" # # rename "guitone/src/util/StanzaParser.h" # to "guitone/src/util/BasicIOParser.h" # # add_file "guitone/src/util/AbstractParser.cpp" # content [07d457cc3931cd2f4f384b8313f50555f2048692] # # add_file "guitone/src/util/AbstractParser.h" # content [af473981a098c6223e3d11183e1470ce86d8befe] # # patch "TODO" # from [e00048ef5842a19b7d22a328df0616147b2fe2be] # to [d7c7f68e489f33924f9d1570b5f51064e0772142] # # patch "guitone/guitone.pro" # from [57c91460e016113cf9058400882604d54b12b55d] # to [721e47c6c19d92f69f0d7313c87bbb9ec854ea64] # # patch "guitone/src/model/Attributes.cpp" # from [0c2d183d2e70a6b146b66477ec80e90fdfbd8674] # to [99a5f6a0ae7ff03705241fece2714d36708e9678] # # patch "guitone/src/model/Certs.cpp" # from [834e23dbe80ac792f2f50550e770cf922f88c208] # to [e0b1c11a280650a9e8170c0d5b7ff1988168b796] # # patch "guitone/src/model/Keys.cpp" # from [9b85862fecee28770b89e2d878c3d8905b10ae9a] # to [78d8c221d257ed0885969cbf6537bfcf6882410b] # # patch "guitone/src/model/Manifest.cpp" # from [7ebb819d474efd7958d008aa479bbcf940b6d1b3] # to [68394c64e088df3b3451142c34f6c1851253d0ce] # # patch "guitone/src/model/Tags.cpp" # from [64b8da12caf7648865d97ba4d401acf882f6bc10] # to [8ddf2a8f16672cf70c49dbefdbdd33cd23ae38e6] # # patch "guitone/src/util/BasicIOParser.cpp" # from [117ebd6d30d6daf217f4977fe9f68086e839f316] # to [b0c5cce7021156332b90b152bca8a07e4ae1a0d5] # # patch "guitone/src/util/BasicIOParser.h" # from [2d75aaeb378815e90d66596b07883667bef4575d] # to [2abdc40c948b2678ceeebf976e5424076036a83d] # # patch "guitone/src/util/StdioParser.cpp" # from [a77daccba65e5b455cab2c69e23789d7aae81a2e] # to [11abb9ad35cfb907becb27762f3119d2775fb4a8] # # patch "guitone/src/util/StdioParser.h" # from [76c4b1f59fe175f5448b10afb6093051dd0fd0a7] # to [8488d8ccabd54eef76d773c0ccaf91ac47d95d3d] # ============================================================ --- guitone/src/util/AbstractParser.cpp 07d457cc3931cd2f4f384b8313f50555f2048692 +++ guitone/src/util/AbstractParser.cpp 07d457cc3931cd2f4f384b8313f50555f2048692 @@ -0,0 +1,53 @@ +/*************************************************************************** +* Copyright (C) 2007 by Thomas Keller * +* address@hidden * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the * +* Free Software Foundation, Inc., * +* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * +***************************************************************************/ + +#include "AbstractParser.h" + +AbstractParser::AbstractParser(const QString & in) : input(in.toUtf8()) {} + +AbstractParser::AbstractParser(const QByteArray & in) : input(in) {} + +AbstractParser::~AbstractParser() {} + +void AbstractParser::eatSpaces() +{ + while (whatsNext() == ' ') { advance(); } +} + +char AbstractParser::whatsNext(int count /* = 0 */) +{ + if (count > (input.size() - 1)) return '\0'; + return input.at(count); +} + +bool AbstractParser::advance(int count /* = 1 */) +{ + if (count > input.size()) return false; + input.remove(0, count); + return true; +} + +char AbstractParser::getNext() +{ + char ch = input.at(0); + advance(); + return ch; +} + ============================================================ --- guitone/src/util/AbstractParser.h af473981a098c6223e3d11183e1470ce86d8befe +++ guitone/src/util/AbstractParser.h af473981a098c6223e3d11183e1470ce86d8befe @@ -0,0 +1,48 @@ +/*************************************************************************** +* Copyright (C) 2007 by Thomas Keller * +* address@hidden * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the * +* Free Software Foundation, Inc., * +* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * +***************************************************************************/ + +#ifndef ABSTRACT_PARSER_H +#define ABSTRACT_PARSER_H + +#include +#include + +class AbstractParser : public QObject +{ + Q_OBJECT +public: + AbstractParser(const QByteArray &); + AbstractParser(const QString &); + ~AbstractParser(); + + virtual bool parse() = 0; + inline QByteArray getLeftBytes() const { return input; } + +protected: + char whatsNext(int count = 0); + char getNext(); + void eatSpaces(); + bool advance(int count = 1); + + QByteArray input; +}; + +#endif + ============================================================ --- TODO e00048ef5842a19b7d22a328df0616147b2fe2be +++ TODO d7c7f68e489f33924f9d1570b5f51064e0772142 @@ -1,7 +1,5 @@ Current TODO, for "long-term" stuff see Current TODO, for "long-term" stuff see IDEAS: -* create two new dialogs CheckoutRevision and UpdateWorkspaceRevision - which make use of SelectRevision * implement single and multiple file saving for the RevisionManifest dialog including some nice progress dialog with abort and rollback * implement smart multiple file/folder selections (stubs) ============================================================ --- guitone/guitone.pro 57c91460e016113cf9058400882604d54b12b55d +++ guitone/guitone.pro 721e47c6c19d92f69f0d7313c87bbb9ec854ea64 @@ -52,7 +52,8 @@ HEADERS += src/view/MainWindow.h \ src/model/Ancestors.h \ src/model/GetBranchLog.h \ src/util/IconProvider.h \ - src/util/StanzaParser.h \ + src/util/AbstractParser.h \ + src/util/BasicIOParser.h \ src/util/Settings.h \ src/util/DiffParser.h \ src/util/SignalWaiter.h \ @@ -100,7 +101,8 @@ SOURCES += src/view/MainWindow.cpp \ src/model/Ancestors.cpp \ src/model/GetBranchLog.cpp \ src/util/IconProvider.cpp \ - src/util/StanzaParser.cpp \ + src/util/AbstractParser.cpp \ + src/util/BasicIOParser.cpp \ src/util/Settings.cpp \ src/util/DiffParser.cpp \ src/util/SignalWaiter.cpp \ ============================================================ --- guitone/src/model/Attributes.cpp 0c2d183d2e70a6b146b66477ec80e90fdfbd8674 +++ guitone/src/model/Attributes.cpp 99a5f6a0ae7ff03705241fece2714d36708e9678 @@ -21,7 +21,7 @@ #include "Attributes.h" #include "InventoryItem.h" #include "Monotone.h" -#include "StanzaParser.h" +#include "BasicIOParser.h" #include @@ -72,7 +72,8 @@ void Attributes::parseOutput() void Attributes::parseOutput() { - StanzaParser parser(AutomateCommand::data); + BasicIOParser parser(AutomateCommand::data); + Q_ASSERT(parser.parse()); StanzaList list = parser.getStanzas(); for (int i=0, size = list.size(); i < size; ++i) ============================================================ --- guitone/src/model/Certs.cpp 834e23dbe80ac792f2f50550e770cf922f88c208 +++ guitone/src/model/Certs.cpp e0b1c11a280650a9e8170c0d5b7ff1988168b796 @@ -20,7 +20,7 @@ #include "Certs.h" #include "Monotone.h" -#include "StanzaParser.h" +#include "BasicIOParser.h" Certs::Certs(QObject *parent) : QAbstractItemModel(parent) { @@ -53,7 +53,8 @@ void Certs::parseOutput() void Certs::parseOutput() { - StanzaParser parser(AutomateCommand::data); + BasicIOParser parser(AutomateCommand::data); + Q_ASSERT(parser.parse()); StanzaList list = parser.getStanzas(); for (int i=0, size = list.size(); i < size; ++i) ============================================================ --- guitone/src/model/Keys.cpp 9b85862fecee28770b89e2d878c3d8905b10ae9a +++ guitone/src/model/Keys.cpp 78d8c221d257ed0885969cbf6537bfcf6882410b @@ -20,7 +20,7 @@ #include "Keys.h" #include "Monotone.h" -#include "StanzaParser.h" +#include "BasicIOParser.h" const int Key::Database = 1; const int Key::Keystore = 2; @@ -48,7 +48,8 @@ void Keys::parseOutput() void Keys::parseOutput() { - StanzaParser parser(AutomateCommand::data); + BasicIOParser parser(AutomateCommand::data); + Q_ASSERT(parser.parse()); StanzaList list = parser.getStanzas(); Key * key; ============================================================ --- guitone/src/model/Manifest.cpp 7ebb819d474efd7958d008aa479bbcf940b6d1b3 +++ guitone/src/model/Manifest.cpp 68394c64e088df3b3451142c34f6c1851253d0ce @@ -19,7 +19,7 @@ ***************************************************************************/ #include "Manifest.h" -#include "StanzaParser.h" +#include "BasicIOParser.h" Manifest::Manifest(QObject *parent) : QAbstractItemModel(parent) { @@ -46,7 +46,8 @@ void Manifest::parseOutput() void Manifest::parseOutput() { - StanzaParser parser(AutomateCommand::data); + BasicIOParser parser(AutomateCommand::data); + Q_ASSERT(parser.parse()); StanzaList list = parser.getStanzas(); QMap directoryMap; ============================================================ --- guitone/src/model/Tags.cpp 64b8da12caf7648865d97ba4d401acf882f6bc10 +++ guitone/src/model/Tags.cpp 8ddf2a8f16672cf70c49dbefdbdd33cd23ae38e6 @@ -20,7 +20,7 @@ #include "Tags.h" #include "Monotone.h" -#include "StanzaParser.h" +#include "BasicIOParser.h" Tags::Tags(QObject *parent) : QAbstractItemModel(parent) { @@ -51,7 +51,8 @@ void Tags::parseOutput() { tags->clear(); - StanzaParser parser(AutomateCommand::data); + BasicIOParser parser(AutomateCommand::data); + Q_ASSERT(parser.parse()); StanzaList list = parser.getStanzas(); for (int i=0, size = list.size(); i < size; ++i) ============================================================ --- guitone/src/util/StanzaParser.cpp 117ebd6d30d6daf217f4977fe9f68086e839f316 +++ guitone/src/util/BasicIOParser.cpp b0c5cce7021156332b90b152bca8a07e4ae1a0d5 @@ -18,44 +18,36 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include "StanzaParser.h" +#include "BasicIOParser.h" -StanzaParser::StanzaParser(const QString & input) -{ - in = input; - size = in.length(); - charPos = 0; -} +BasicIOParser::BasicIOParser(const QString & input) : AbstractParser(input) {} -StanzaParser::~StanzaParser() {} - -StanzaList StanzaParser::getStanzas() +bool BasicIOParser::parse() { - StanzaList list; while (true) { Stanza stanza = getStanza(); if (stanza.empty()) break; - list.append(stanza); + stanzas.append(stanza); advance(); } - return list; + return true; } -Stanza StanzaParser::getStanza() +Stanza BasicIOParser::getStanza() { Stanza stanza; while (true) { - QChar next = whatsNext(); - if (next == QChar('\n') || next == QChar('\0')) break; + char next = whatsNext(); + if (next == '\n' || next == '\0') break; StanzaEntry entry; entry.sym = getSymbol(); if (entry.sym.size() == 0) { - qWarning("StanzaParser::getStanza(): %d: Couldn't get symbol.", charPos); + qWarning("BasicIOParser::getStanza(): Couldn't get symbol."); } QString hash(getHash()); // was this a hash? @@ -80,55 +72,61 @@ Stanza StanzaParser::getStanza() stanza.append(entry); eatSpaces(); - QChar cur = getNext(); - if (cur != QChar('\n')) - qWarning("StanzaParser::getStanza(): %d: expected '\\n', got '%c'", charPos, cur.toLatin1()); + char cur = getNext(); + if (cur != '\n') + { + qWarning("BasicIOParser::getStanza(): expected '\\n', got '%c'", cur); + } } return stanza; } -QChar StanzaParser::whatsNext(int count /* = 0 */) +QString BasicIOParser::getSymbol() { - if (charPos + count >= size) return QChar('\0'); - return in.at(charPos + count); -} - -void StanzaParser::eatSpaces() -{ - while (whatsNext() == QChar(' ')) { charPos++; } -} - -QString StanzaParser::getSymbol() -{ eatSpaces(); - int pos = in.indexOf(QRegExp("[^\\w]"), charPos); - if (pos == -1) return QString(); - QString sym = in.mid(charPos, pos - charPos); - charPos = pos; - return sym; + QByteArray payload; + while (true) + { + char cur = whatsNext(); + if ((cur >= 'a' && cur <= 'z') || cur == '_') + { + payload.append(cur); + advance(); + continue; + } + break; + } + + // ascii conv is enough here + return QString(payload); } -QString StanzaParser::getValue() +QString BasicIOParser::getValue() { eatSpaces(); - if (whatsNext() != QChar('"')) return QString(); + if (whatsNext() != '"') return QString(); advance(); - QString ret(""); - QChar last('\0'); + QByteArray payload; + char last = '\0'; while (true) { - QChar cur = getNext(); + char cur = getNext(); + Q_ASSERT(cur != '\0'); // string end? - if (cur == '\0' || (cur == '"' && last != '\\')) break; + if (cur == '"' && last != '\\') break; last = cur; - ret.append(cur); + payload.append(cur); } + + QString ret = QString::fromUtf8(payload); + ret.replace("\\\\", "\\"); + ret.replace("\\\"", "\""); return ret; } -QString StanzaParser::getHash() +QString BasicIOParser::getHash() { eatSpaces(); if (whatsNext() != QChar('[')) return QString(); @@ -142,28 +140,18 @@ QString StanzaParser::getHash() } int hashLen = 40; - QString ret = in.mid(charPos, hashLen); + QString ret = QString::fromUtf8(input.mid(0, hashLen).data()); advance(hashLen); - QChar ch = whatsNext(); + char ch = whatsNext(); if (ch == QChar(']')) + { advance(); + } else - qWarning("StanzaParser::getHash(): %d: expected ], got %c", charPos, ch.toLatin1()); - + { + qWarning("BasicIOParser::getHash(): expected ], got %c", ch); + } return ret; } -void StanzaParser::advance(int count /* = 1 */) -{ - if (charPos + count >= size) return; - charPos += count; -} - -QChar StanzaParser::getNext() -{ - QChar ch = in.at(charPos); - advance(); - return ch; -} - ============================================================ --- guitone/src/util/StanzaParser.h 2d75aaeb378815e90d66596b07883667bef4575d +++ guitone/src/util/BasicIOParser.h 2abdc40c948b2678ceeebf976e5424076036a83d @@ -18,9 +18,11 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef STANZA_PARSER_H -#define STANZA_PARSER_H +#ifndef BASICIO_PARSER_H +#define BASICIO_PARSER_H +#include "AbstractParser.h" + #include typedef struct { @@ -31,26 +33,23 @@ typedef QList StanzaList; typedef QList Stanza; typedef QList StanzaList; -class StanzaParser : public QObject +class BasicIOParser : public AbstractParser { Q_OBJECT public: - StanzaParser(const QString &); - ~StanzaParser(); - StanzaList getStanzas(); + BasicIOParser(const QString &); + + bool parse(); + inline StanzaList getStanzas() const { return stanzas; } + private: - QChar whatsNext(int count = 0); - QChar getNext(); - Stanza getStanza(); - void eatSpaces(); - QString getSymbol(); - QString getValue(); - QString getHash(); - void advance(int count = 1); - - QString in; - int charPos; - int size; + Stanza getStanza(); + QString getSymbol(); + QString getValue(); + QString getHash(); + + StanzaList stanzas; }; #endif + ============================================================ --- guitone/src/util/StdioParser.cpp a77daccba65e5b455cab2c69e23789d7aae81a2e +++ guitone/src/util/StdioParser.cpp 11abb9ad35cfb907becb27762f3119d2775fb4a8 @@ -20,10 +20,8 @@ #include "StdioParser.h" -StdioParser::StdioParser(const QByteArray & in) : input(in) {} +StdioParser::StdioParser(const QByteArray & input) : AbstractParser(input) {} -StdioParser::~StdioParser() {} - bool StdioParser::parse() { if (input.size() == 0) return false; @@ -46,7 +44,8 @@ bool StdioParser::parse() } payload = input.mid(0, chunkSize); - input.remove(0, chunkSize); + advance(chunkSize); + return true; } @@ -72,23 +71,3 @@ int StdioParser::getNumber() return number; } -char StdioParser::whatsNext(int count /* = 0 */) -{ - if (count > (input.size() - 1)) return '\0'; - return input.at(count); -} - -bool StdioParser::advance(int count /* = 1 */) -{ - if (count > input.size()) return false; - input.remove(0, count); - return true; -} - -char StdioParser::getNext() -{ - char ch = input.at(0); - advance(); - return ch; -} - ============================================================ --- guitone/src/util/StdioParser.h 76c4b1f59fe175f5448b10afb6093051dd0fd0a7 +++ guitone/src/util/StdioParser.h 8488d8ccabd54eef76d773c0ccaf91ac47d95d3d @@ -21,35 +21,30 @@ #ifndef STDIO_PARSER_H #define STDIO_PARSER_H -#include -#include +#include "AbstractParser.h" -class StdioParser : public QObject +class StdioParser : public AbstractParser { Q_OBJECT public: - StdioParser(const QByteArray &); - ~StdioParser(); - bool parse(); - inline int getCommandNumber() { return commandNumber; } - inline int getErrorCode() { return errorCode; } - inline char getChunkType() { return chunkType; } - inline int getChunkSize() { return chunkSize; } - inline QByteArray getPayload() { return payload; } - inline QByteArray getLeftBytes() { return input; } - + StdioParser(const QByteArray &); + + bool parse(); + inline int getCommandNumber() const { return commandNumber; } + inline int getErrorCode() const { return errorCode; } + inline char getChunkType() const { return chunkType; } + inline int getChunkSize() const { return chunkSize; } + inline QByteArray getPayload() const { return payload; } + private: - char whatsNext(int count = 0); - char getNext(); - bool advance(int count = 1); - int getNumber(); - - int commandNumber; - int errorCode; - char chunkType; - int chunkSize; - QByteArray payload; - QByteArray input; + int getNumber(); + + int commandNumber; + int errorCode; + char chunkType; + int chunkSize; + QByteArray payload; }; #endif +