[Libreoffice-commits] libcdr.git: 2 commits - src/lib
David Tardon
dtardon at redhat.com
Thu Nov 20 12:50:11 PST 2014
src/lib/CDRParser.cpp | 37 +++++++++++--------------------------
1 file changed, 11 insertions(+), 26 deletions(-)
New commits:
commit 2a5b92b43336c3e0b82ffad6b06b8623d7007761
Author: David Tardon <dtardon at redhat.com>
Date: Thu Nov 20 21:41:16 2014 +0100
optimize repeated seeks
This speeds up parsing of a pathological case of a broken file from
0m29.644s to 0m0.028s.
Change-Id: I438d8d3bfd84d3d52e8de18b2680a43948cda3ed
diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index 9a69913..2b70a2c 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -2596,22 +2596,13 @@ void libcdr::CDRParser::readStlt(librevenge::RVNGInputStream *input, unsigned le
}
unsigned numIntervals = readU32(input);
CDR_DEBUG_MSG(("CDRParser::readStlt numIntervals 0x%x\n", numIntervals));
- for (i=0; i<numIntervals; ++i)
- {
- input->seek(52, librevenge::RVNG_SEEK_CUR);
- }
+ input->seek(52 * static_cast<long>(numIntervals), librevenge::RVNG_SEEK_CUR);
unsigned numSet5s = readU32(input);
CDR_DEBUG_MSG(("CDRParser::readStlt numSet5s 0x%x\n", numSet5s));
- for (i=0; i<numSet5s; ++i)
- {
- input->seek(152, librevenge::RVNG_SEEK_CUR);
- }
+ input->seek(152 * static_cast<long>(numSet5s), librevenge::RVNG_SEEK_CUR);
unsigned numTabs = readU32(input);
CDR_DEBUG_MSG(("CDRParser::readStlt numTabs 0x%x\n", numTabs));
- for (i=0; i<numTabs; ++i)
- {
- input->seek(784, librevenge::RVNG_SEEK_CUR);
- }
+ input->seek(784 * static_cast<long>(numTabs), librevenge::RVNG_SEEK_CUR);
unsigned numBullets = readU32(input);
CDR_DEBUG_MSG(("CDRParser::readStlt numBullets 0x%x\n", numBullets));
for (i=0; i<numBullets; ++i)
@@ -2649,18 +2640,13 @@ void libcdr::CDRParser::readStlt(librevenge::RVNGInputStream *input, unsigned le
}
unsigned numHypens = readU32(input);
CDR_DEBUG_MSG(("CDRParser::readStlt numHypens 0x%x\n", numHypens));
- for (i=0; i<numHypens; ++i)
- {
- input->seek(32, librevenge::RVNG_SEEK_CUR);
- if (m_version >= 1300)
- input->seek(4, librevenge::RVNG_SEEK_CUR);
- }
+ long hypensLen = 32;
+ if (m_version >= 1300)
+ hypensLen += 4;
+ input->seek(hypensLen * static_cast<long>(numHypens), librevenge::RVNG_SEEK_CUR);
unsigned numDropcaps = readU32(input);
CDR_DEBUG_MSG(("CDRParser::readStlt numDropcaps 0x%x\n", numDropcaps));
- for (i=0; i<numDropcaps; ++i)
- {
- input->seek(28, librevenge::RVNG_SEEK_CUR);
- }
+ input->seek(28 * static_cast<long>(numDropcaps), librevenge::RVNG_SEEK_CUR);
try
{
bool set11Flag(false);
@@ -2669,10 +2655,7 @@ void libcdr::CDRParser::readStlt(librevenge::RVNGInputStream *input, unsigned le
set11Flag = true;
unsigned numSet11s = readU32(input);
CDR_DEBUG_MSG(("CDRParser::readStlt numSet11s 0x%x\n", numSet11s));
- for (i=0; i<numSet11s; ++i)
- {
- input->seek(12, librevenge::RVNG_SEEK_CUR);
- }
+ input->seek(12 * static_cast<long>(numSet11s), librevenge::RVNG_SEEK_CUR);
}
std::map<unsigned, CDRStltRecord> styles;
for (i=0; i<numRecords; ++i)
commit d08b5c8a09190852e21f8a2ae4b1720f13dbfbc4
Author: David Tardon <dtardon at redhat.com>
Date: Thu Nov 20 20:17:08 2014 +0100
avoid extra big allocation
Change-Id: Ibb22de59d17a85e8b0a8df8be277643fc9ba7f52
diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index d9d66c9..9a69913 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -2044,6 +2044,8 @@ void libcdr::CDRParser::readLoda(librevenge::RVNGInputStream *input, unsigned le
long startPosition = input->tell();
unsigned chunkLength = readUnsigned(input);
unsigned numOfArgs = readUnsigned(input);
+ if (numOfArgs > length / 4) // avoid extra big allocation in case of a broken file
+ numOfArgs = length / 4;
unsigned startOfArgs = readUnsigned(input);
unsigned startOfArgTypes = readUnsigned(input);
unsigned chunkType = readUnsigned(input);
More information about the Libreoffice-commits
mailing list