Skip to content

Commit 831ae2d

Browse files
committed
MeasureRead: More accurate measure length validation
1 parent dd63997 commit 831ae2d

File tree

3 files changed

+30
-28
lines changed

3 files changed

+30
-28
lines changed

src/engraving/rw/read400/measurerw.cpp

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -86,24 +86,18 @@ void MeasureRead::readMeasure(Measure* measure, XmlReader& e, ReadContext& ctx,
8686
measure->m_mstaves.push_back(s);
8787
}
8888

89-
bool irregular;
89+
bool irregular = false;
9090
if (e.hasAttribute("len")) {
91-
StringList sl = e.attribute("len").split(u'/');
92-
if (sl.size() == 2) {
93-
measure->m_len = Fraction(sl.at(0).toInt(), sl.at(1).toInt());
94-
} else {
95-
LOGD("illegal measure size <%s>", muPrintable(e.attribute("len")));
96-
}
97-
irregular = true;
98-
if (measure->m_len.numerator() <= 0 || measure->m_len.denominator() <= 0 || measure->m_len.denominator() > 128) {
99-
e.raiseError(muse::mtrc("engraving",
100-
"MSCX error at line %1: invalid measure length: %2").arg(e.lineNumber()).arg(measure->m_len.toString()));
91+
bool ok = true;
92+
measure->m_len = Fraction::fromString(e.attribute("len"), &ok);
93+
if (!ok || measure->m_len < Fraction(1, 128)) {
94+
e.raiseError(muse::mtrc("engraving", "MSCX error at line %1: invalid measure length: %2")
95+
.arg(e.lineNumber()).arg(e.attribute("len")));
10196
return;
10297
}
98+
irregular = true;
10399
ctx.compatTimeSigMap()->add(measure->tick().ticks(), SigEvent(measure->m_len, measure->m_timesig));
104100
ctx.compatTimeSigMap()->add((measure->tick() + measure->ticks()).ticks(), SigEvent(measure->m_timesig));
105-
} else {
106-
irregular = false;
107101
}
108102

109103
while (e.readNextStartElement()) {

src/engraving/rw/read410/measureread.cpp

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -84,24 +84,18 @@ void MeasureRead::readMeasure(Measure* measure, XmlReader& e, ReadContext& ctx,
8484
measure->m_mstaves.push_back(s);
8585
}
8686

87-
bool irregular;
87+
bool irregular = false;
8888
if (e.hasAttribute("len")) {
89-
StringList sl = e.attribute("len").split(u'/');
90-
if (sl.size() == 2) {
91-
measure->m_len = Fraction(sl.at(0).toInt(), sl.at(1).toInt());
92-
} else {
93-
LOGD("illegal measure size <%s>", muPrintable(e.attribute("len")));
94-
}
95-
irregular = true;
96-
if (measure->m_len.numerator() <= 0 || measure->m_len.denominator() <= 0 || measure->m_len.denominator() > 128) {
97-
e.raiseError(muse::mtrc("engraving",
98-
"MSCX error at line %1: invalid measure length: %2").arg(e.lineNumber()).arg(measure->m_len.toString()));
89+
bool ok = true;
90+
measure->m_len = Fraction::fromString(e.attribute("len"), &ok);
91+
if (!ok || measure->m_len < Fraction(1, 128)) {
92+
e.raiseError(muse::mtrc("engraving", "MSCX error at line %1: invalid measure length: %2")
93+
.arg(e.lineNumber()).arg(e.attribute("len")));
9994
return;
10095
}
96+
irregular = true;
10197
ctx.compatTimeSigMap()->add(measure->tick().ticks(), SigEvent(measure->m_len, measure->m_timesig));
10298
ctx.compatTimeSigMap()->add((measure->tick() + measure->ticks()).ticks(), SigEvent(measure->m_timesig));
103-
} else {
104-
irregular = false;
10599
}
106100

107101
while (e.readNextStartElement()) {

src/engraving/types/fraction.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,10 +258,24 @@ class Fraction
258258
static constexpr Fraction eps() { return Fraction(1, Constants::DIVISION * 4); }
259259

260260
muse::String toString() const { return muse::String(u"%1/%2").arg(m_numerator, m_denominator); }
261-
static Fraction fromString(const muse::String& str)
261+
static Fraction fromString(const muse::String& str, bool* ok = nullptr)
262262
{
263263
const size_t i = str.indexOf(u'/');
264-
return (i == muse::nidx) ? Fraction(str.toInt(), 1) : Fraction(str.left(i).toInt(), str.mid(i + 1).toInt());
264+
if (i == muse::nidx) {
265+
return Fraction(str.toInt(ok), 1);
266+
}
267+
268+
int numerator = str.left(i).toInt(ok);
269+
if (ok && !*ok) {
270+
return Fraction();
271+
}
272+
273+
int denominator = str.mid(i + 1).toInt(ok);
274+
if (ok && !*ok) {
275+
return Fraction();
276+
}
277+
278+
return Fraction(numerator, denominator);
265279
}
266280

267281
constexpr double toDouble() const { return static_cast<double>(m_numerator) / static_cast<double>(m_denominator); }

0 commit comments

Comments
 (0)