|
|
@ -32,6 +32,8 @@ |
|
|
|
#include <memory> |
|
|
|
#include <memory> |
|
|
|
#include <sstream> |
|
|
|
#include <sstream> |
|
|
|
#include <cassert> |
|
|
|
#include <cassert> |
|
|
|
|
|
|
|
#include <istream> |
|
|
|
|
|
|
|
#include <ostream> |
|
|
|
#include <xml-cxx/xml.hxx> |
|
|
|
#include <xml-cxx/xml.hxx> |
|
|
|
#include <mrw/stdext.hxx> |
|
|
|
#include <mrw/stdext.hxx> |
|
|
|
|
|
|
|
|
|
|
@ -210,24 +212,27 @@ class Command: public QObject { |
|
|
|
} |
|
|
|
} |
|
|
|
QStringList quotedStrings(QString value, |
|
|
|
QStringList quotedStrings(QString value, |
|
|
|
QString delimiter = " ", |
|
|
|
QString delimiter = " ", |
|
|
|
bool keepDelimiters = false) const { |
|
|
|
bool keepDelimiters = false, |
|
|
|
|
|
|
|
unsigned int max = 0) const { |
|
|
|
QStringList res; |
|
|
|
QStringList res; |
|
|
|
QString quot("'\""); |
|
|
|
QString quot("'\""); |
|
|
|
|
|
|
|
unsigned int found(0); |
|
|
|
while (value=value.trimmed(), value.size()) { |
|
|
|
while (value=value.trimmed(), value.size()) { |
|
|
|
QRegularExpression re; |
|
|
|
QRegularExpression re; |
|
|
|
int start(0); |
|
|
|
int start(0); |
|
|
|
if (quot.contains(value[0])) { |
|
|
|
if (quot.contains(value[0])) { |
|
|
|
re = QRegularExpression(value[0]+" *(("+delimiter+" *)|$)"); |
|
|
|
re = QRegularExpression(value[0]+" *((("+delimiter+") *)|$)"); |
|
|
|
start = 1; |
|
|
|
start = 1; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
re = QRegularExpression("( *"+delimiter+" *)|$"); |
|
|
|
re = QRegularExpression(" *((("+delimiter+") *)|$)"); |
|
|
|
} |
|
|
|
} |
|
|
|
int pos(value.indexOf(re, start)); |
|
|
|
int pos(value.indexOf(re, start)); |
|
|
|
if (pos<start) throw BadArgument("quote missmatch in "+value); |
|
|
|
if (pos<start) throw BadArgument("quote missmatch in "+value); |
|
|
|
QRegularExpressionMatch m(re.match(value, start)); |
|
|
|
QRegularExpressionMatch m(re.match(value, start)); |
|
|
|
res += value.mid(start, m.capturedStart()-start); |
|
|
|
res += value.mid(start, m.capturedStart()-start); |
|
|
|
value.remove(0, m.capturedEnd()); |
|
|
|
value.remove(0, m.capturedEnd()); |
|
|
|
if (keepDelimiters && m.capturedLength()) res+=m.captured().mid(start).trimmed(); |
|
|
|
if (keepDelimiters && !m.captured(3).isEmpty()) res+=m.captured(3).trimmed(); |
|
|
|
|
|
|
|
if (++found==max) return res += value; |
|
|
|
} |
|
|
|
} |
|
|
|
return res; |
|
|
|
return res; |
|
|
|
} |
|
|
|
} |
|
|
@ -2609,12 +2614,12 @@ class Check: public Command { |
|
|
|
std::shared_ptr<Check> cmd(new Check()); |
|
|
|
std::shared_ptr<Check> cmd(new Check()); |
|
|
|
cmd->_next = 0; |
|
|
|
cmd->_next = 0; |
|
|
|
QString comp("[=!.^~<>]"); |
|
|
|
QString comp("[=!.^~<>]"); |
|
|
|
QStringList allargs = quotedStrings(args, comp, true); |
|
|
|
QStringList allargs = quotedStrings(args, comp, true, 1); |
|
|
|
if (allargs.size()<2 || allargs[1].size()!=1 || |
|
|
|
if (allargs.size()<2 || allargs[1].size()!=1 || |
|
|
|
!QRegularExpression("^"+comp+"$").match(allargs[1]).hasMatch()) |
|
|
|
!QRegularExpression("^"+comp+"$").match(allargs[1]).hasMatch()) |
|
|
|
throw BadArgument(tag()+" needs a comparision, not: "+args); |
|
|
|
throw BadArgument(tag()+" needs a comparision, not: "+args, allargs); |
|
|
|
if (allargs.size()>3) |
|
|
|
if (allargs.size()>3) |
|
|
|
throw BadArgument(tag()+" has at most three arguments"); |
|
|
|
throw BadArgument(tag()+" has at most three arguments", allargs); |
|
|
|
cmd->_value1 = allargs[0]; |
|
|
|
cmd->_value1 = allargs[0]; |
|
|
|
cmd->_cmp = allargs[1][0].toLatin1(); |
|
|
|
cmd->_cmp = allargs[1][0].toLatin1(); |
|
|
|
if (allargs.size()==3) { |
|
|
|
if (allargs.size()==3) { |
|
|
@ -2623,7 +2628,7 @@ class Check: public Command { |
|
|
|
if (in.size() && in.first().contains(QRegularExpression("^ "))) { |
|
|
|
if (in.size() && in.first().contains(QRegularExpression("^ "))) { |
|
|
|
cmd->_next = script->parseLine(in, file, line+1, indent+1); |
|
|
|
cmd->_next = script->parseLine(in, file, line+1, indent+1); |
|
|
|
cmd->_next->log(false); // suppress logging of subcommand
|
|
|
|
cmd->_next->log(false); // suppress logging of subcommand
|
|
|
|
} else throw BadArgument(tag()+" needs a third argument or a following command"); |
|
|
|
} else throw BadArgument(tag()+" needs a third argument or a following command", allargs); |
|
|
|
} |
|
|
|
} |
|
|
|
return cmd; |
|
|
|
return cmd; |
|
|
|
} |
|
|
|
} |
|
|
|