From 23cb8ec83edc184ae9a90063c4c758fd6bb2f7d2 Mon Sep 17 00:00:00 2001 From: adrido Date: Sun, 5 Jul 2015 11:43:40 +0200 Subject: [PATCH] Use RegularExpression to detect and parse format and QString() with arg() for output. + OS independent + No memory leak (currently) - Maybe not as fast as sscanf --- geometrywidget.cpp | 101 ++++++++++++++++++++++++++------------------- geometrywidget.h | 12 ++++-- 2 files changed, 66 insertions(+), 47 deletions(-) diff --git a/geometrywidget.cpp b/geometrywidget.cpp index f794b3c..7704fb7 100644 --- a/geometrywidget.cpp +++ b/geometrywidget.cpp @@ -36,18 +36,32 @@ Geometry::Format Geometry::formatId(const QString &name) return geometryNameIdMap[name]; } -Geometry::Format Geometry::set(const char *s) +Geometry::Format Geometry::set(QString str) { - char sign[2]; - Geometry::Format result; - if (4 == sscanf(s," %d , %d : %d , %d", corner[0]+0, corner[0]+1, corner[1]+0, corner[1]+1)) { + qDebug()<<"Trying to detect format of "< 0 && n < BUFSIZE) - return QString(buffer); - else - return QString(); - #undef BUFSIZE + } void Geometry::computeCorner0(void) @@ -268,14 +284,13 @@ GeometryWidget::~GeometryWidget() { delete ui; } - // Return true when parsing succeeded // false when not (string was still accepted, mode was set to custom) -bool GeometryWidget::set(const char *geomStr, Geometry::Format requestedFormat) +bool GeometryWidget::set(const QString geomStr, Geometry::Format requestedFormat) { Geometry geometry; Geometry::Format parsedFormat; - if (!geomStr || !*geomStr) { + if (geomStr.isEmpty()) { geometry.setMax(); setQWidgetCurrentIndex(ui->geometryFormat, Geometry::FormatNone); ui->geometryStackedWidget->setCurrentIndex(Geometry::FormatNone); diff --git a/geometrywidget.h b/geometrywidget.h index a676591..909acb4 100644 --- a/geometrywidget.h +++ b/geometrywidget.h @@ -3,6 +3,8 @@ #include #include +#include + class Geometry; class GeometryWidget; namespace Ui { @@ -40,14 +42,17 @@ public: Geometry(const QString &s) { set(s); } Geometry(const Geometry &g); - Geometry::Format set(const char *s); - Geometry::Format set(const QString &s) { return set(s.toStdString().c_str()); } + Geometry::Format set(QString str); void setMax(void); void setCenterDimensions(int cx, int cy, int dx, int dy); void setCornerDimensions(int cx, int cy, int dx, int dy); void setCorners(int c0x, int c0y, int c1x, int c1y); QString getString(Geometry::Format format = Geometry::FormatNone); private: + QRegularExpression corners = QRegularExpression("^(-?\\d*),(-?\\d*):(-?\\d*),(-?\\d*)$"); + QRegularExpression centerDimension = QRegularExpression("^(-?\\d*),(-?\\d*):-?(\\d*)x-?(\\d*)$"); + QRegularExpression cornerDimension = QRegularExpression("^(-?\\d*)[,x](-?\\d*)[+-](-?\\d*)[+-](-?\\d*)$"); + QRegularExpression centerDimensionSimple = QRegularExpression("^(\\d*)x(\\d*)$"); bool adjustCorners(void); void computeCorner0(void); void computeCorner1(void); @@ -63,8 +68,7 @@ public: explicit GeometryWidget(QWidget *parent = 0); ~GeometryWidget(); - bool set(const char *geomStr, Geometry::Format format = Geometry::FormatUnknown); - bool set(const QString geomStr, Geometry::Format format = Geometry::FormatUnknown) { return set(geomStr.toStdString().c_str(), format); } + bool set(const QString geomStr, Geometry::Format format = Geometry::FormatUnknown); //{ return set(geomStr.toStdString().c_str(), format); } bool setDefault(void) { return set(""); } bool setFormat(int i) { return setFormat(static_cast(i)); } bool setFormat(Geometry::Format format);