QT_BEGIN_NAMESPACE
+static bool isCharEqual(const char* const byteptr, const int bytelen, const char* const charptr, const int charlen)
+{
+ if (bytelen != charlen) {
+ return false;
+ }
+ return (::memcmp(byteptr, charptr, charlen) == 0);
+}
+
class QTranslatorPrivate
{
public:
QString QTranslator::translate(const char *context, const char *sourceText) const
{
Q_D(const QTranslator);
+ const int contextlen = qstrlen(context);
+ const int sourcelen = qstrlen(sourceText);
QDataStream trdatastream(&d->data, QIODevice::ReadOnly);
QIODevice* trdatadevice = trdatastream.device();
trdatadevice->seek(d->offset);
trdatastream >> trmsgstr_plural;
// this search method assumes plurals and regular messages are unique strings
- if ((!context || trmsgctxt == context) && trmsgid_plural == sourceText) {
+ if (isCharEqual(trmsgctxt.constData(), trmsgctxt.size(), context, contextlen)
+ && isCharEqual(trmsgid_plural.constData(), trmsgid_plural.size(), sourceText, sourcelen)) {
d->converter.reset();
return d->converter.toUnicode(trmsgstr_plural.constData(), trmsgstr_plural.size());
}
- if ((!context || trmsgctxt == context) && trmsgid == sourceText) {
+ if (isCharEqual(trmsgctxt.constData(), trmsgctxt.size(), context, contextlen)
+ && isCharEqual(trmsgid.constData(), trmsgid.size(), sourceText, sourcelen)) {
d->converter.reset();
return d->converter.toUnicode(trmsgstr.constData(), trmsgstr.size());
}
QString QTranslator::translateStrict(const char *context, const char *sourceText) const
{
Q_D(const QTranslator);
+ const int contextlen = qstrlen(context);
+ const int sourcelen = qstrlen(sourceText);
QDataStream trdatastream(&d->data, QIODevice::ReadOnly);
QIODevice* trdatadevice = trdatastream.device();
trdatadevice->seek(d->offset);
trdatastream >> trmsgid_plural;
trdatastream >> trmsgstr_plural;
- if ((!context || trmsgctxt == context) && trmsgid_plural == sourceText) {
+ if (isCharEqual(trmsgctxt.constData(), trmsgctxt.size(), context, contextlen)
+ && isCharEqual(trmsgid_plural.constData(), trmsgid_plural.size(), sourceText, sourcelen)) {
d->converter.reset();
return d->converter.toUnicode(trmsgstr_plural.constData(), trmsgstr_plural.size());
}
- if ((!context || trmsgctxt == context) && trmsgid == sourceText) {
+ if (isCharEqual(trmsgctxt.constData(), trmsgctxt.size(), context, contextlen)
+ && isCharEqual(trmsgid.constData(), trmsgid.size(), sourceText, sourcelen)) {
d->converter.reset();
return d->converter.toUnicode(trmsgstr.constData(), trmsgstr.size());
}