2013-07-16 12:50:32 +08:00
|
|
|
#include "parser.h"
|
|
|
|
|
|
|
|
|
|
Parser::Parser(Lexer * lexer, QObject * parent)
|
|
|
|
|
: QObject(parent)
|
|
|
|
|
{
|
|
|
|
|
connect(lexer, SIGNAL(character(char)), SLOT(readCharacter(char)));
|
|
|
|
|
connect(lexer, SIGNAL(unsafeString(QString)), SLOT(readUnsafeString(QString)));
|
|
|
|
|
connect(lexer, SIGNAL(safeString(QByteArray)), SLOT(readSafeString(QByteArray)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Parser::~Parser()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Parser::readCharacter(char c)
|
|
|
|
|
{
|
|
|
|
|
switch(c)
|
|
|
|
|
{
|
|
|
|
|
case '+': stack.append(Task(Task::ReadStatus)); break;
|
|
|
|
|
case '-': stack.append(Task(Task::ReadError)); break;
|
|
|
|
|
case ':': stack.append(Task(Task::ReadInteger)); break;
|
|
|
|
|
case '$': stack.append(Task(Task::ReadBulk)); break;
|
|
|
|
|
case '*': stack.append(Task(Task::ReadMultiBulk)); break;
|
|
|
|
|
default:
|
2013-08-02 03:38:58 +08:00
|
|
|
qWarning("Skipping unexpected character '%x'", static_cast<int>(c));
|
2013-07-16 12:50:32 +08:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Parser::readUnsafeString(const QString & value)
|
|
|
|
|
{
|
|
|
|
|
if(tos().action == Task::ReadMultiBulk)
|
|
|
|
|
tos().count = value.toInt();
|
|
|
|
|
else
|
|
|
|
|
{
|
2013-07-16 13:49:42 +08:00
|
|
|
Task::Action action = tos().action;
|
2013-07-16 12:50:32 +08:00
|
|
|
stack.removeLast();
|
|
|
|
|
|
2013-07-16 13:49:42 +08:00
|
|
|
if(action == Task::ReadStatus)
|
2013-08-02 06:43:58 +08:00
|
|
|
;//emit status(value);
|
2013-07-16 13:49:42 +08:00
|
|
|
else if(action == Task::ReadError)
|
2013-07-16 12:50:32 +08:00
|
|
|
{
|
|
|
|
|
int pos = value.indexOf(' ');
|
2013-08-02 06:43:58 +08:00
|
|
|
;//emit error(value.left(pos), value.right(pos + 1));
|
2013-07-16 12:50:32 +08:00
|
|
|
}
|
|
|
|
|
else if(!stack.count())
|
2013-08-02 06:43:58 +08:00
|
|
|
;//emit integer(value.toLongLong());
|
2013-07-16 12:50:32 +08:00
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
tos().value.toList().append(value);
|
|
|
|
|
descend();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Parser::readSafeString(const QByteArray & value)
|
|
|
|
|
{
|
|
|
|
|
stack.removeLast();
|
|
|
|
|
|
|
|
|
|
if(!stack.count())
|
2013-08-02 06:43:58 +08:00
|
|
|
;//emit bulk(value);
|
2013-07-16 12:50:32 +08:00
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
tos().value.toList().append(value);
|
|
|
|
|
descend();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Parser::descend()
|
|
|
|
|
{
|
|
|
|
|
while(true)
|
|
|
|
|
{
|
|
|
|
|
if(tos().value.toList().count() < tos().count)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
if(stack.count() == 1)
|
|
|
|
|
{
|
2013-08-02 06:43:58 +08:00
|
|
|
;//emit multiBulk(tos().value.toList());
|
2013-07-16 12:50:32 +08:00
|
|
|
stack.removeLast();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Task task = stack.takeLast();
|
|
|
|
|
tos().value.toList().append(task.value);
|
|
|
|
|
}
|
|
|
|
|
}
|