File indexing completed on 2025-01-12 12:24:38
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 }