// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only // Qt-Security score:critical reason:data-parser #include "qlatincodec_p.h" #include "qlist.h" QT_BEGIN_NAMESPACE QLatin1Codec::~QLatin1Codec() { } QString QLatin1Codec::convertToUnicode(const char *chars, int len, ConverterState *) const { return QString::fromLatin1(chars, len); } QByteArray QLatin1Codec::convertFromUnicode(const QChar *ch, int len, ConverterState *state) const { const char replacement = (state && state->flags & ConvertInvalidToNull) ? 0 : '?'; QByteArray r(len, QT_PREPEND_NAMESPACE(Qt::Uninitialized)); char *d = r.data(); int invalid = 0; for (int i = 0; i < len; ++i) { if (ch[i] > QChar(0xff)) { d[i] = replacement; ++invalid; } else { d[i] = (char)ch[i].cell(); } } if (state) { state->invalidChars += invalid; } return r; } QByteArray QLatin1Codec::name() const { return "ISO-8859-1"; } QList QLatin1Codec::aliases() const { QList list; list << "latin1" << "CP819" << "IBM819" << "iso-ir-100" << "csISOLatin1"; return list; } int QLatin1Codec::mibEnum() const { return 4; } QLatin15Codec::~QLatin15Codec() { } QString QLatin15Codec::convertToUnicode(const char* chars, int len, ConverterState *) const { QString str = QString::fromLatin1(chars, len); QChar *uc = str.data(); while(len--) { switch(uc->unicode()) { case 0xa4: *uc = QChar(0x20ac); break; case 0xa6: *uc = QChar(0x0160); break; case 0xa8: *uc = QChar(0x0161); break; case 0xb4: *uc = QChar(0x017d); break; case 0xb8: *uc = QChar(0x017e); break; case 0xbc: *uc = QChar(0x0152); break; case 0xbd: *uc = QChar(0x0153); break; case 0xbe: *uc = QChar(0x0178); break; default: break; } uc++; } return str; } QByteArray QLatin15Codec::convertFromUnicode(const QChar *in, int length, ConverterState *state) const { const char replacement = (state && state->flags & ConvertInvalidToNull) ? 0 : '?'; QByteArray r(length, QT_PREPEND_NAMESPACE(Qt::Uninitialized)); char *d = r.data(); int invalid = 0; for (int i = 0; i < length; ++i) { uchar c; ushort uc = in[i].unicode(); if (uc < 0x0100) { if (uc > 0xa3) { switch(uc) { case 0xa4: case 0xa6: case 0xa8: case 0xb4: case 0xb8: case 0xbc: case 0xbd: case 0xbe: c = replacement; ++invalid; break; default: c = (unsigned char) uc; break; } } else { c = (unsigned char) uc; } } else { if (uc == 0x20ac) c = 0xa4; else if ((uc & 0xff00) == 0x0100) { switch(uc) { case 0x0160: c = 0xa6; break; case 0x0161: c = 0xa8; break; case 0x017d: c = 0xb4; break; case 0x017e: c = 0xb8; break; case 0x0152: c = 0xbc; break; case 0x0153: c = 0xbd; break; case 0x0178: c = 0xbe; break; default: c = replacement; ++invalid; } } else { c = replacement; ++invalid; } } d[i] = (char)c; } if (state) { state->remainingChars = 0; state->invalidChars += invalid; } return r; } QByteArray QLatin15Codec::name() const { return "ISO-8859-15"; } QList QLatin15Codec::aliases() const { QList list; list << "latin9"; return list; } int QLatin15Codec::mibEnum() const { return 111; } QT_END_NAMESPACE