File indexing completed on 2024-04-14 14:18:30

0001 /*
0002     SPDX-FileCopyrightText: 2021 Friedrich W. H. Kossebau <kossebau@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "kusasciitextcodec.h"
0008 
0009 QByteArray KUsAsciiTextCodec::name() const
0010 {
0011     return QByteArrayLiteral("US-ASCII");
0012 }
0013 
0014 QList<QByteArray> KUsAsciiTextCodec::aliases() const
0015 {
0016     return {
0017         // aliases by https://www.iana.org/assignments/character-sets/character-sets.xml, update 2021-01-04
0018         QByteArrayLiteral("iso-ir-6"),
0019         QByteArrayLiteral("ANSI_X3.4-1968"),
0020         QByteArrayLiteral("ANSI_X3.4-1986"),
0021         QByteArrayLiteral("ISO_646.irv:1991"),
0022         QByteArrayLiteral("ISO646-US"),
0023         QByteArrayLiteral("us"),
0024         QByteArrayLiteral("IBM367"),
0025         QByteArrayLiteral("cp367"),
0026         QByteArrayLiteral("csASCII"),
0027         // further aliases as used by ICU 69.1
0028         QByteArrayLiteral("ibm-367"),
0029         QByteArrayLiteral("ASCII"),
0030         QByteArrayLiteral("ISO_646.irv:1991"),
0031         QByteArrayLiteral("iso_646.irv:1983"),
0032         QByteArrayLiteral("ascii7"),
0033         QByteArrayLiteral("646"),
0034         QByteArrayLiteral("windows-20127"),
0035     };
0036 }
0037 int KUsAsciiTextCodec::mibEnum() const
0038 {
0039     return 3;
0040 }
0041 
0042 QByteArray KUsAsciiTextCodec::convertFromUnicode(const QChar *input, int number, QTextCodec::ConverterState *state) const
0043 {
0044     const char invalidSubstituteChar = (state && state->flags & ConvertInvalidToNull) ? 0 : '?';
0045 
0046     QByteArray encoded(number, Qt::Uninitialized);
0047 
0048     char *d = encoded.data();
0049     int invalidChars = 0;
0050 
0051     for (int i = 0; i < number; ++i) {
0052         const ushort unicodeCodePoint = input[i].unicode();
0053         if (unicodeCodePoint > 0x7f) {
0054             d[i] = invalidSubstituteChar;
0055             ++invalidChars;
0056         } else {
0057             d[i] = static_cast<char>(unicodeCodePoint & 0xff);
0058         }
0059     }
0060 
0061     if (state) {
0062         state->invalidChars += invalidChars;
0063     }
0064 
0065     return encoded;
0066 }
0067 
0068 QString KUsAsciiTextCodec::convertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state) const
0069 {
0070     const QChar invalidSubstituteChar = (state && state->flags & ConvertInvalidToNull) ? QChar(0) : QLatin1Char('?');
0071 
0072     QString decoded(len, invalidSubstituteChar);
0073 
0074     QChar *d = decoded.data();
0075     int invalidChars = 0;
0076 
0077     for (int i = 0; i < len; ++i) {
0078         const char c = chars[i];
0079         // signedness of char depends on the compiler and the target platform,
0080         // so for comparison use explicit variant
0081         if (static_cast<unsigned char>(c) > 0x7f) {
0082             ++invalidChars;
0083         } else {
0084             d[i] = QLatin1Char(c);
0085         }
0086     }
0087 
0088     if (state) {
0089         state->invalidChars += invalidChars;
0090     }
0091 
0092     return decoded;
0093 }