From 59fd61099955aa44a3e1c5451e9b028f1d0ba2d6 Mon Sep 17 00:00:00 2001 From: Scott Wheeler Date: Sat, 23 Jul 2005 23:11:20 +0000 Subject: [PATCH] Finally took Tommi's suggestion here and introduced a version of the ByteVectorList::split() that takes a maximum number of values. This should probably be used more widely in places where the max is known ahead of time for this to be a more useful fix than nailing just this special case. Anyway, fixes the bug. BUG:103622 git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@438030 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- mpeg/id3v2/frames/commentsframe.cpp | 2 +- toolkit/tbytevectorlist.cpp | 8 +++++++- toolkit/tbytevectorlist.h | 11 ++++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/mpeg/id3v2/frames/commentsframe.cpp b/mpeg/id3v2/frames/commentsframe.cpp index fcabbbc6..6abcb54e 100644 --- a/mpeg/id3v2/frames/commentsframe.cpp +++ b/mpeg/id3v2/frames/commentsframe.cpp @@ -120,7 +120,7 @@ void CommentsFrame::parseFields(const ByteVector &data) int byteAlign = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2; - ByteVectorList l = ByteVectorList::split(data.mid(4), textDelimiter(d->textEncoding), byteAlign); + ByteVectorList l = ByteVectorList::split(data.mid(4), textDelimiter(d->textEncoding), byteAlign, 2); if(l.size() == 2) { d->description = String(l.front(), d->textEncoding); diff --git a/toolkit/tbytevectorlist.cpp b/toolkit/tbytevectorlist.cpp index 3799f5e7..f2b2c128 100644 --- a/toolkit/tbytevectorlist.cpp +++ b/toolkit/tbytevectorlist.cpp @@ -34,12 +34,18 @@ class ByteVectorListPrivate ByteVectorList ByteVectorList::split(const ByteVector &v, const ByteVector &pattern, int byteAlign) +{ + return split(v, pattern, byteAlign, 0); +} + +ByteVectorList ByteVectorList::split(const ByteVector &v, const ByteVector &pattern, + int byteAlign, int max) { ByteVectorList l; uint previousOffset = 0; for(int offset = v.find(pattern, 0, byteAlign); - offset != -1; + offset != -1 && (max == 0 || max > int(l.size()) + 1); offset = v.find(pattern, offset + pattern.size(), byteAlign)) { l.append(v.mid(previousOffset, offset - previousOffset)); diff --git a/toolkit/tbytevectorlist.h b/toolkit/tbytevectorlist.h index ab5e2d62..13880a89 100644 --- a/toolkit/tbytevectorlist.h +++ b/toolkit/tbytevectorlist.h @@ -66,7 +66,16 @@ namespace TagLib { */ static ByteVectorList split(const ByteVector &v, const ByteVector &pattern, int byteAlign = 1); - + /*! + * Splits the ByteVector \a v into several strings at \a pattern. This will + * not include the pattern in the returned ByteVectors. \a max is the + * maximum number of entries that will be separated. If \a max for instance + * is 2 then a maximum of 1 match will be found and the vector will be split + * on that match. + */ + // BIC: merge with the function above + static ByteVectorList split(const ByteVector &v, const ByteVector &pattern, + int byteAlign, int max); private: class ByteVectorListPrivate; ByteVectorListPrivate *d;