| 1 | // Copyright (C) 2016 The Qt Company Ltd. | 
| 2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only | 
| 3 |  | 
| 4 | #include "qlatincodec_p.h" | 
| 5 | #include "qlist.h" | 
| 6 |  | 
| 7 | QT_BEGIN_NAMESPACE | 
| 8 |  | 
| 9 | QLatin1Codec::~QLatin1Codec() | 
| 10 | { | 
| 11 | } | 
| 12 |  | 
| 13 | QString QLatin1Codec::convertToUnicode(const char *chars, int len, ConverterState *) const | 
| 14 | { | 
| 15 |     return QString::fromLatin1(str: chars, size: len); | 
| 16 | } | 
| 17 |  | 
| 18 |  | 
| 19 | QByteArray QLatin1Codec::convertFromUnicode(const QChar *ch, int len, ConverterState *state) const | 
| 20 | { | 
| 21 |     const char replacement = (state && state->flags & ConvertInvalidToNull) ? 0 : '?'; | 
| 22 |     QByteArray r(len, QT_PREPEND_NAMESPACE(Qt::Uninitialized)); | 
| 23 |     char *d = r.data(); | 
| 24 |     int invalid = 0; | 
| 25 |     for (int i = 0; i < len; ++i) { | 
| 26 |         if (ch[i] > QChar(0xff)) { | 
| 27 |             d[i] = replacement; | 
| 28 |             ++invalid; | 
| 29 |         } else { | 
| 30 |             d[i] = (char)ch[i].cell(); | 
| 31 |         } | 
| 32 |     } | 
| 33 |     if (state) { | 
| 34 |         state->invalidChars += invalid; | 
| 35 |     } | 
| 36 |     return r; | 
| 37 | } | 
| 38 |  | 
| 39 | QByteArray QLatin1Codec::name() const | 
| 40 | { | 
| 41 |     return "ISO-8859-1" ; | 
| 42 | } | 
| 43 |  | 
| 44 | QList<QByteArray> QLatin1Codec::aliases() const | 
| 45 | { | 
| 46 |     QList<QByteArray> list; | 
| 47 |     list << "latin1"  | 
| 48 |          << "CP819"  | 
| 49 |          << "IBM819"  | 
| 50 |          << "iso-ir-100"  | 
| 51 |          << "csISOLatin1" ; | 
| 52 |     return list; | 
| 53 | } | 
| 54 |  | 
| 55 |  | 
| 56 | int QLatin1Codec::mibEnum() const | 
| 57 | { | 
| 58 |     return 4; | 
| 59 | } | 
| 60 |  | 
| 61 |  | 
| 62 | QLatin15Codec::~QLatin15Codec() | 
| 63 | { | 
| 64 | } | 
| 65 |  | 
| 66 | QString QLatin15Codec::convertToUnicode(const char* chars, int len, ConverterState *) const | 
| 67 | { | 
| 68 |     QString str = QString::fromLatin1(str: chars, size: len); | 
| 69 |     QChar *uc = str.data(); | 
| 70 |     while(len--) { | 
| 71 |         switch(uc->unicode()) { | 
| 72 |             case 0xa4: | 
| 73 |                 *uc = QChar(0x20ac); | 
| 74 |                 break; | 
| 75 |             case 0xa6: | 
| 76 |                 *uc = QChar(0x0160); | 
| 77 |                 break; | 
| 78 |             case 0xa8: | 
| 79 |                 *uc = QChar(0x0161); | 
| 80 |                 break; | 
| 81 |             case 0xb4: | 
| 82 |                 *uc = QChar(0x017d); | 
| 83 |                 break; | 
| 84 |             case 0xb8: | 
| 85 |                 *uc = QChar(0x017e); | 
| 86 |                 break; | 
| 87 |             case 0xbc: | 
| 88 |                 *uc = QChar(0x0152); | 
| 89 |                 break; | 
| 90 |             case 0xbd: | 
| 91 |                 *uc = QChar(0x0153); | 
| 92 |                 break; | 
| 93 |             case 0xbe: | 
| 94 |                 *uc = QChar(0x0178); | 
| 95 |                 break; | 
| 96 |             default: | 
| 97 |                 break; | 
| 98 |         } | 
| 99 |         uc++; | 
| 100 |     } | 
| 101 |     return str; | 
| 102 | } | 
| 103 |  | 
| 104 | QByteArray QLatin15Codec::convertFromUnicode(const QChar *in, int length, ConverterState *state) const | 
| 105 | { | 
| 106 |     const char replacement = (state && state->flags & ConvertInvalidToNull) ? 0 : '?'; | 
| 107 |     QByteArray r(length, QT_PREPEND_NAMESPACE(Qt::Uninitialized)); | 
| 108 |     char *d = r.data(); | 
| 109 |     int invalid = 0; | 
| 110 |     for (int i = 0; i < length; ++i) { | 
| 111 |         uchar c; | 
| 112 |         ushort uc = in[i].unicode(); | 
| 113 |         if (uc < 0x0100) { | 
| 114 |             if (uc > 0xa3) { | 
| 115 |                 switch(uc) { | 
| 116 |                 case 0xa4: | 
| 117 |                 case 0xa6: | 
| 118 |                 case 0xa8: | 
| 119 |                 case 0xb4: | 
| 120 |                 case 0xb8: | 
| 121 |                 case 0xbc: | 
| 122 |                 case 0xbd: | 
| 123 |                 case 0xbe: | 
| 124 |                     c = replacement; | 
| 125 |                     ++invalid; | 
| 126 |                     break; | 
| 127 |                 default: | 
| 128 |                     c = (unsigned char) uc; | 
| 129 |                     break; | 
| 130 |                 } | 
| 131 |             } else { | 
| 132 |                 c = (unsigned char) uc; | 
| 133 |             } | 
| 134 |         } else { | 
| 135 |             if (uc == 0x20ac) | 
| 136 |                 c = 0xa4; | 
| 137 |             else if ((uc & 0xff00) == 0x0100) { | 
| 138 |                 switch(uc) { | 
| 139 |                 case 0x0160: | 
| 140 |                     c = 0xa6; | 
| 141 |                     break; | 
| 142 |                 case 0x0161: | 
| 143 |                     c = 0xa8; | 
| 144 |                     break; | 
| 145 |                 case 0x017d: | 
| 146 |                     c = 0xb4; | 
| 147 |                     break; | 
| 148 |                 case 0x017e: | 
| 149 |                     c = 0xb8; | 
| 150 |                     break; | 
| 151 |                 case 0x0152: | 
| 152 |                     c = 0xbc; | 
| 153 |                     break; | 
| 154 |                 case 0x0153: | 
| 155 |                     c = 0xbd; | 
| 156 |                     break; | 
| 157 |                 case 0x0178: | 
| 158 |                     c = 0xbe; | 
| 159 |                     break; | 
| 160 |                 default: | 
| 161 |                     c = replacement; | 
| 162 |                     ++invalid; | 
| 163 |                 } | 
| 164 |             } else { | 
| 165 |                 c = replacement; | 
| 166 |                 ++invalid; | 
| 167 |             } | 
| 168 |         } | 
| 169 |         d[i] = (char)c; | 
| 170 |     } | 
| 171 |     if (state) { | 
| 172 |         state->remainingChars = 0; | 
| 173 |         state->invalidChars += invalid; | 
| 174 |     } | 
| 175 |     return r; | 
| 176 | } | 
| 177 |  | 
| 178 |  | 
| 179 | QByteArray QLatin15Codec::name() const | 
| 180 | { | 
| 181 |     return "ISO-8859-15" ; | 
| 182 | } | 
| 183 |  | 
| 184 | QList<QByteArray> QLatin15Codec::aliases() const | 
| 185 | { | 
| 186 |     QList<QByteArray> list; | 
| 187 |     list << "latin9" ; | 
| 188 |     return list; | 
| 189 | } | 
| 190 |  | 
| 191 | int QLatin15Codec::mibEnum() const | 
| 192 | { | 
| 193 |     return 111; | 
| 194 | } | 
| 195 |  | 
| 196 | QT_END_NAMESPACE | 
| 197 |  |