summaryrefslogtreecommitdiffstats
path: root/khexedit/lib/codecs
diff options
context:
space:
mode:
Diffstat (limited to 'khexedit/lib/codecs')
-rw-r--r--khexedit/lib/codecs/Makefile.am15
-rw-r--r--khexedit/lib/codecs/README1
-rw-r--r--khexedit/lib/codecs/kbinarybytecodec.cpp80
-rw-r--r--khexedit/lib/codecs/kbinarybytecodec.h59
-rw-r--r--khexedit/lib/codecs/kbytecodec.cpp63
-rw-r--r--khexedit/lib/codecs/kcharcodec.cpp74
-rw-r--r--khexedit/lib/codecs/kdecimalbytecodec.cpp92
-rw-r--r--khexedit/lib/codecs/kdecimalbytecodec.h59
-rw-r--r--khexedit/lib/codecs/kebcdic1047charcodec.cpp124
-rw-r--r--khexedit/lib/codecs/kebcdic1047charcodec.h50
-rw-r--r--khexedit/lib/codecs/khexadecimalbytecodec.cpp113
-rw-r--r--khexedit/lib/codecs/khexadecimalbytecodec.h69
-rw-r--r--khexedit/lib/codecs/koctalbytecodec.cpp80
-rw-r--r--khexedit/lib/codecs/koctalbytecodec.h59
-rw-r--r--khexedit/lib/codecs/ktextcharcodec.cpp236
-rw-r--r--khexedit/lib/codecs/ktextcharcodec.h66
16 files changed, 1240 insertions, 0 deletions
diff --git a/khexedit/lib/codecs/Makefile.am b/khexedit/lib/codecs/Makefile.am
new file mode 100644
index 0000000..0c208b7
--- /dev/null
+++ b/khexedit/lib/codecs/Makefile.am
@@ -0,0 +1,15 @@
+INCLUDES = -I$(srcdir)/.. $(all_includes)
+
+METASOURCES = AUTO
+
+#
+noinst_LTLIBRARIES = libkhecodecs.la
+libkhecodecs_la_SOURCES = kcharcodec.cpp kbytecodec.cpp \
+ ktextcharcodec.cpp kebcdic1047charcodec.cpp \
+ kbinarybytecodec.cpp koctalbytecodec.cpp \
+ kdecimalbytecodec.cpp khexadecimalbytecodec.cpp
+
+# no public API
+noinst_HEADERS = ktextcharcodec.h kebcdic1047charcodec.h \
+ kbinarybytecodec.h koctalbytecodec.h \
+ kdecimalbytecodec.h khexadecimalbytecodec.h \ No newline at end of file
diff --git a/khexedit/lib/codecs/README b/khexedit/lib/codecs/README
new file mode 100644
index 0000000..b4a0e52
--- /dev/null
+++ b/khexedit/lib/codecs/README
@@ -0,0 +1 @@
+This directory holds all the char codecs. All it exports is the call "createCodec()", the rest in hidden.
diff --git a/khexedit/lib/codecs/kbinarybytecodec.cpp b/khexedit/lib/codecs/kbinarybytecodec.cpp
new file mode 100644
index 0000000..d665a05
--- /dev/null
+++ b/khexedit/lib/codecs/kbinarybytecodec.cpp
@@ -0,0 +1,80 @@
+/***************************************************************************
+ kbinarybytecodec.cpp - description
+ -------------------
+ begin : Mo Nov 29 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+// lib specific
+#include "kbinarybytecodec.h"
+
+using namespace KHE;
+
+
+void KBinaryByteCodec::encode( QString &Digits, unsigned int Pos, const unsigned char Char ) const
+{
+ for( unsigned char M=1<<7; M>0; M>>=1 )
+ Digits.at(Pos++) = (Char & M) ? '1' : '0';
+}
+
+void KBinaryByteCodec::encodeShort( QString &Digits, unsigned int Pos, unsigned char Char ) const
+{
+ unsigned char M = 1<<7;
+ // find first set bit
+ for( ; M>0; M>>=1 )
+ if( Char & M )
+ break;
+ // now set the
+ for( ; M>0; M>>=1 )
+ Digits.at(Pos++) = (Char & M) ? '1' : '0';
+}
+
+
+bool KBinaryByteCodec::isValidDigit( unsigned char Digit ) const
+{
+ return Digit == '0' || Digit == '1';
+}
+
+
+bool KBinaryByteCodec::turnToValue( unsigned char *Digit ) const
+{
+ if( isValidDigit(*Digit) )
+ {
+ *Digit -= '0';
+ return true;
+ }
+ return false;
+}
+
+
+bool KBinaryByteCodec::appendDigit( unsigned char *Byte, unsigned char Digit ) const
+{
+ if( turnToValue(&Digit) )
+ {
+ unsigned char B = *Byte;
+ if( B < 128 )
+ {
+ B <<= 1;
+ B += Digit;
+ *Byte = B;
+ return true;
+ }
+ }
+ return false;
+}
+
+
+void KBinaryByteCodec::removeLastDigit( unsigned char *Byte ) const
+{
+ *Byte >>= 1;
+}
diff --git a/khexedit/lib/codecs/kbinarybytecodec.h b/khexedit/lib/codecs/kbinarybytecodec.h
new file mode 100644
index 0000000..d0354fa
--- /dev/null
+++ b/khexedit/lib/codecs/kbinarybytecodec.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ kbinarybytecodec.h - description
+ -------------------
+ begin : Mo Nov 29 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef KHE_KBINARYBYTECODEC_H
+#define KHE_KBINARYBYTECODEC_H
+
+// lib specific
+#include "kbytecodec.h"
+
+namespace KHE
+{
+
+/** class that is able to convert codings to and from binary
+ *
+ * the buffer will be always filled up to CodingWidth, if not using shortCodingFunction
+ * a closing '\0' will be always added
+ *
+ *@author Friedrich W. H. Kossebau
+ */
+
+class KBinaryByteCodec : public KByteCodec
+{
+ public: // API to be implemented
+ /** */
+ virtual unsigned int encodingWidth() const { return 8; }
+ /** */
+ virtual unsigned char digitsFilledLimit() const { return 128; }
+
+ /** encodes the Char and writes the result to */
+ virtual void encode( QString &Digits, unsigned int Pos, const unsigned char Char ) const;
+ /** */
+ virtual void encodeShort( QString &Digits, unsigned int Pos, const unsigned char Char ) const;
+ /** */
+ virtual bool appendDigit( unsigned char *Byte, const unsigned char Digit ) const;
+ /** */
+ virtual void removeLastDigit( unsigned char *Byte ) const;
+ /** */
+ virtual bool isValidDigit( const unsigned char Digit ) const;
+ /** */
+ virtual bool turnToValue( unsigned char *Digit ) const;
+};
+
+}
+
+#endif
diff --git a/khexedit/lib/codecs/kbytecodec.cpp b/khexedit/lib/codecs/kbytecodec.cpp
new file mode 100644
index 0000000..dc5137f
--- /dev/null
+++ b/khexedit/lib/codecs/kbytecodec.cpp
@@ -0,0 +1,63 @@
+/***************************************************************************
+ kbytecodec.cpp - description
+ -------------------
+ begin : Mo Nov 29 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+// lib specific
+#include "kbinarybytecodec.h"
+#include "koctalbytecodec.h"
+#include "kdecimalbytecodec.h"
+#include "khexadecimalbytecodec.h"
+
+using namespace KHE;
+
+
+KByteCodec *KByteCodec::createCodec( KCoding C )
+{
+ KByteCodec *Codec;
+ switch( C )
+ {
+ case DecimalCoding: Codec = new KDecimalByteCodec(); break;
+ case OctalCoding: Codec = new KOctalByteCodec(); break;
+ case BinaryCoding: Codec = new KBinaryByteCodec(); break;
+ case HexadecimalCoding:
+ default: Codec = new KHexadecimalByteCodec();
+ }
+ return Codec;
+}
+
+unsigned int KByteCodec::decode( unsigned char *Char, const QString &Digits, uint Pos ) const
+{
+ //kdDebug() << QString("KByteCodec::decode(%1,%2)").arg(Digits).arg(Pos) << endl;
+ const uint P = Pos;
+
+ // remove leading 0s
+ while( Digits.at(Pos) == '0' ) { ++Pos; }
+
+ unsigned char C = 0;
+ unsigned int d = encodingWidth();
+ do
+ {
+ if( !appendDigit(&C,Digits.at(Pos)) )
+ break;
+
+ ++Pos;
+ --d;
+ }
+ while( d > 0 );
+
+ *Char = C;
+ return Pos - P;
+}
diff --git a/khexedit/lib/codecs/kcharcodec.cpp b/khexedit/lib/codecs/kcharcodec.cpp
new file mode 100644
index 0000000..5a58320
--- /dev/null
+++ b/khexedit/lib/codecs/kcharcodec.cpp
@@ -0,0 +1,74 @@
+/***************************************************************************
+ kcharcodec.cpp - description
+ -------------------
+ begin : Do Nov 25 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+// lib specific
+#include "kcharcodec.h"
+#include "ktextcharcodec.h"
+#include "kebcdic1047charcodec.h"
+
+using namespace KHE;
+
+
+QStringList KCharCodec::CodecNames;
+
+const QStringList &KCharCodec::codecNames()
+{
+ // first call?
+ if( CodecNames.isEmpty() )
+ {
+ CodecNames = KTextCharCodec::codecNames();
+ CodecNames.append( KEBCDIC1047CharCodec::codecName() );
+ }
+
+ return CodecNames;
+}
+
+
+KCharCodec *KCharCodec::createCodec( const QString &Name )
+{
+ KCharCodec *Codec = 0;
+
+ if( KTextCharCodec::codecNames().findIndex(Name) != -1 )
+ Codec = KTextCharCodec::createCodec( Name );
+ else if( KEBCDIC1047CharCodec::codecName() == Name )
+ Codec = KEBCDIC1047CharCodec::create();
+
+ // ensure at least a codec
+ if( Codec == 0 )
+ Codec = KTextCharCodec::createLocalCodec();
+
+ return Codec;
+}
+
+
+KCharCodec *KCharCodec::createCodec( KEncoding C )
+{
+ KCharCodec *Codec;
+ if( C == EBCDIC1047Encoding )
+ Codec = KEBCDIC1047CharCodec::create();
+ else if( C == ISO8859_1Encoding )
+ Codec = KTextCharCodec::createCodec( "ISO 8859-1" );
+ // LocalEncoding
+ else
+ Codec = 0;
+
+ // ensure at least a codec
+ if( Codec == 0 )
+ Codec = KTextCharCodec::createLocalCodec();
+
+ return Codec;
+}
diff --git a/khexedit/lib/codecs/kdecimalbytecodec.cpp b/khexedit/lib/codecs/kdecimalbytecodec.cpp
new file mode 100644
index 0000000..9470382
--- /dev/null
+++ b/khexedit/lib/codecs/kdecimalbytecodec.cpp
@@ -0,0 +1,92 @@
+/***************************************************************************
+ kdecimalbytecodec.cpp - description
+ -------------------
+ begin : Mo Nov 29 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+// lib specific
+#include "kdecimalbytecodec.h"
+
+using namespace KHE;
+
+
+void KDecimalByteCodec::encode( QString &Digits, unsigned int Pos, unsigned char Char ) const
+{
+ unsigned char C = Char / 100;
+ Digits.at(Pos++) = '0'+C;
+ Char -= C * 100;
+ C = Char / 10;
+ Digits.at(Pos++) = '0'+C;
+ Char -= C * 10;
+ Digits.at(Pos) = '0'+Char;
+}
+
+
+void KDecimalByteCodec::encodeShort( QString &Digits, unsigned int Pos, unsigned char Char ) const
+{
+ unsigned char C;
+ if( (C = Char / 100) )
+ {
+ Digits.at(Pos++) = '0'+C;
+ Char -= C * 100;
+ }
+ if( (C = Char / 10) )
+ {
+ Digits.at(Pos++) = '0'+C;
+ Char -= C * 10;
+ }
+ Digits.at(Pos) = '0'+Char;
+}
+
+
+
+bool KDecimalByteCodec::isValidDigit( unsigned char Digit ) const
+{
+ return Digit >= '0' && Digit <= '9';
+}
+
+bool KDecimalByteCodec::turnToValue( unsigned char *Digit ) const
+{
+ if( isValidDigit(*Digit) )
+ {
+ *Digit -= '0';
+ return true;
+ }
+ return false;
+}
+
+
+bool KDecimalByteCodec::appendDigit( unsigned char *Byte, unsigned char Digit ) const
+{
+ if( turnToValue(&Digit) )
+ {
+ unsigned char B = *Byte;
+ if( B < 26 )
+ {
+ B *= 10;
+ if( Digit <= 255-B )
+ {
+ B += Digit;
+ *Byte = B;
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+void KDecimalByteCodec::removeLastDigit( unsigned char *Byte ) const
+{
+ *Byte /= 10;
+}
diff --git a/khexedit/lib/codecs/kdecimalbytecodec.h b/khexedit/lib/codecs/kdecimalbytecodec.h
new file mode 100644
index 0000000..31f61d0
--- /dev/null
+++ b/khexedit/lib/codecs/kdecimalbytecodec.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ kdecimalbytecodec.h - description
+ -------------------
+ begin : Mo Nov 29 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef KHE_KDECIMALBYTECODEC_H
+#define KHE_KDECIMALBYTECODEC_H
+
+// lib specific
+#include "kbytecodec.h"
+
+namespace KHE
+{
+
+/** class that is able to convert codings to and from binary
+ *
+ * the buffer will be always filled up to CodingWidth, if not using shortCodingFunction
+ * a closing '\0' will be always added
+ *
+ *@author Friedrich W. H. Kossebau
+ */
+
+class KDecimalByteCodec : public KByteCodec
+{
+ public: // API to be implemented
+ /** */
+ virtual unsigned int encodingWidth() const { return 3; }
+ /** */
+ virtual unsigned char digitsFilledLimit() const { return 26; }
+
+ /** encodes the Char and writes the result to */
+ virtual void encode( QString &Digits, unsigned int Pos, const unsigned char Char ) const;
+ /** */
+ virtual void encodeShort( QString &Digits, unsigned int Pos, const unsigned char Char ) const;
+ /** */
+ virtual bool appendDigit( unsigned char *Byte, const unsigned char Digit ) const;
+ /** */
+ virtual void removeLastDigit( unsigned char *Byte ) const;
+ /** */
+ virtual bool isValidDigit( const unsigned char Digit ) const;
+ /** */
+ virtual bool turnToValue( unsigned char *Digit ) const;
+};
+
+}
+
+#endif
diff --git a/khexedit/lib/codecs/kebcdic1047charcodec.cpp b/khexedit/lib/codecs/kebcdic1047charcodec.cpp
new file mode 100644
index 0000000..f26da37
--- /dev/null
+++ b/khexedit/lib/codecs/kebcdic1047charcodec.cpp
@@ -0,0 +1,124 @@
+/***************************************************************************
+ kebcdic1047charcodec.cpp - description
+ -------------------
+ begin : Sa Nov 27 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+// lib specific
+#include "kebcdic1047charcodec.h"
+
+
+using namespace KHE;
+
+static Q_UINT16 UnicodeChars[256] =
+{
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F,
+ 0x0097, 0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087,
+ 0x0018, 0x0019, 0x0092, 0x008F, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000A, 0x0017, 0x001B,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0005, 0x0006, 0x0007,
+ 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, 0x001A,
+ 0x0020, 0x00A0, 0x00E2, 0x00E4, 0x00E0, 0x00E1, 0x00E3, 0x00E5,
+ 0x00E7, 0x00F1, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C,
+ 0x0026, 0x00E9, 0x00EA, 0x00EB, 0x00E8, 0x00ED, 0x00EE, 0x00EF,
+ 0x00EC, 0x00DF, 0x0021, 0x0024, 0x002A, 0x0029, 0x003B, 0x005E,
+ 0x002D, 0x002F, 0x00C2, 0x00C4, 0x00C0, 0x00C1, 0x00C3, 0x00C5,
+ 0x00C7, 0x00D1, 0x00A6, 0x002C, 0x0025, 0x005F, 0x003E, 0x003F,
+ 0x00F8, 0x00C9, 0x00CA, 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF,
+ 0x00CC, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022,
+ 0x00D8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x00AB, 0x00BB, 0x00F0, 0x00FD, 0x00FE, 0x00B1,
+ 0x00B0, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
+ 0x0071, 0x0072, 0x00AA, 0x00BA, 0x00E6, 0x00B8, 0x00C6, 0x00A4,
+ 0x00B5, 0x007E, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
+ 0x0079, 0x007A, 0x00A1, 0x00BF, 0x00D0, 0x005B, 0x00DE, 0x00AE,
+ 0x00AC, 0x00A3, 0x00A5, 0x00B7, 0x00A9, 0x00A7, 0x00B6, 0x00BC,
+ 0x00BD, 0x00BE, 0x00DD, 0x00A8, 0x00AF, 0x005D, 0x00B4, 0x00D7,
+ 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x00AD, 0x00F4, 0x00F6, 0x00F2, 0x00F3, 0x00F5,
+ 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
+ 0x0051, 0x0052, 0x00B9, 0x00FB, 0x00FC, 0x00F9, 0x00FA, 0x00FF,
+ 0x005C, 0x00F7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
+ 0x0059, 0x005A, 0x00B2, 0x00D4, 0x00D6, 0x00D2, 0x00D3, 0x00D5,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x00B3, 0x00DB, 0x00DC, 0x00D9, 0x00DA, 0x009F
+};
+
+static unsigned char EBCDICChars[256] =
+{
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F,
+ 0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26,
+ 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D,
+ 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+ 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+ 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
+ 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
+ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
+ 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17,
+ 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08,
+ 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF,
+ 0x41, 0xAA, 0x4A, 0xB1, 0x9F, 0xB2, 0x6A, 0xB5,
+ 0xBB, 0xB4, 0x9A, 0x8A, 0xB0, 0xCA, 0xAF, 0xBC,
+ 0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3,
+ 0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB,
+ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9E, 0x68,
+ 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77,
+ 0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF,
+ 0x80, 0xFD, 0xFE, 0xFB, 0xFC, 0xBA, 0xAE, 0x59,
+ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9C, 0x48,
+ 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57,
+ 0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1,
+ 0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF
+};
+
+static const char KEBCDIC1047CharCodecName[] = "EBCDIC 1047";
+
+
+bool KEBCDIC1047CharCodec::encode( char *D, const QChar &C ) const
+{
+ int I = C.unicode();
+ // not in range?
+ if( 0x00FF < I )
+ return false;
+
+ *D = EBCDICChars[I];
+ return true;
+}
+
+KHEChar KEBCDIC1047CharCodec::decode( char Byte ) const
+{
+ return QChar(UnicodeChars[(unsigned char)Byte]);
+}
+
+const QString& KEBCDIC1047CharCodec::name() const
+{
+ return codecName();
+}
+
+const QString& KEBCDIC1047CharCodec::codecName()
+{
+ static const QString Name( QString::fromLatin1(KEBCDIC1047CharCodecName) );
+ return Name;
+}
diff --git a/khexedit/lib/codecs/kebcdic1047charcodec.h b/khexedit/lib/codecs/kebcdic1047charcodec.h
new file mode 100644
index 0000000..7c30956
--- /dev/null
+++ b/khexedit/lib/codecs/kebcdic1047charcodec.h
@@ -0,0 +1,50 @@
+/***************************************************************************
+ kebcdic1047charcodec.h - description
+ -------------------
+ begin : Sa Nov 27 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef KHE_KEBCDIC1047CHARCODEC_H
+#define KHE_KEBCDIC1047CHARCODEC_H
+
+
+#include "kcharcodec.h"
+
+namespace KHE
+{
+
+//
+class KEBCDIC1047CharCodec : public KCharCodec
+{
+ protected:
+ KEBCDIC1047CharCodec();
+
+ public: // KCharCodec API
+ virtual KHEChar decode( char Byte ) const;
+ virtual bool encode( char *D, const QChar &C ) const;
+ virtual const QString& name() const;
+
+ public:
+ static KEBCDIC1047CharCodec *create();
+ static const QString& codecName();
+};
+
+
+inline KEBCDIC1047CharCodec::KEBCDIC1047CharCodec() {}
+
+inline KEBCDIC1047CharCodec *KEBCDIC1047CharCodec::create() { return new KEBCDIC1047CharCodec(); }
+
+}
+
+#endif
diff --git a/khexedit/lib/codecs/khexadecimalbytecodec.cpp b/khexedit/lib/codecs/khexadecimalbytecodec.cpp
new file mode 100644
index 0000000..7072464
--- /dev/null
+++ b/khexedit/lib/codecs/khexadecimalbytecodec.cpp
@@ -0,0 +1,113 @@
+/***************************************************************************
+ khexadecimalbytecodec.cpp - description
+ -------------------
+ begin : Mo Nov 29 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+// lib specific
+#include "khexadecimalbytecodec.h"
+
+using namespace KHE;
+
+
+static const QChar BigDigit[16] =
+{ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
+static const QChar SmallDigit[16] =
+{ '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' };
+
+
+KHexadecimalByteCodec::KHexadecimalByteCodec( bool S ) : Digit( S?SmallDigit:BigDigit ) {}
+
+bool KHexadecimalByteCodec::setSmallDigits( bool S )
+{
+ bool Change = ( S && Digit == BigDigit );
+ Digit = S?SmallDigit:BigDigit;
+ return Change;
+}
+
+bool KHexadecimalByteCodec::smallDigits() const { return Digit != BigDigit; }
+
+
+void KHexadecimalByteCodec::encode( QString &Digits, unsigned int Pos, unsigned char Char ) const
+{
+ Digits.at(Pos++) = Digit[Char>>4];
+ Digits.at(Pos) = Digit[Char&0x0F];
+}
+
+void KHexadecimalByteCodec::encodeShort( QString &Digits, unsigned int Pos, unsigned char Char ) const
+{
+ unsigned char C;
+ if( (C = (Char>>4)) )
+ Digits.at(Pos++) = Digit[C];
+ Digits.at(Pos) = Digit[Char&0x0F];
+}
+
+
+static inline bool isValidBigDigit( unsigned char Digit )
+{
+ return (Digit >= 'A' && Digit <= 'F');
+}
+
+static inline bool isValidSmallDigit( unsigned char Digit )
+{
+ return (Digit >= 'a' && Digit <= 'f');
+}
+
+static inline bool isValidDecimalDigit( unsigned char Digit )
+{
+ return Digit >= '0' && Digit <= '9';
+}
+
+
+bool KHexadecimalByteCodec::isValidDigit( unsigned char Digit ) const
+{
+ return isValidDecimalDigit(Digit) || isValidBigDigit(Digit) || isValidSmallDigit(Digit);
+}
+
+bool KHexadecimalByteCodec::turnToValue( unsigned char *Digit ) const
+{
+ if( isValidDecimalDigit(*Digit) )
+ *Digit -= '0';
+ else if( isValidBigDigit(*Digit) )
+ *Digit -= 'A' - 10;
+ else if( isValidSmallDigit(*Digit) )
+ *Digit -= 'a' - 10;
+ else
+ return false;
+
+ return true;
+}
+
+bool KHexadecimalByteCodec::appendDigit( unsigned char *Byte, unsigned char Digit ) const
+{
+ if( turnToValue(&Digit) )
+ {
+ unsigned char B = *Byte;
+ if( B < 16 )
+ {
+ B <<= 4;
+ B += Digit;
+ *Byte = B;
+ return true;
+ }
+ }
+ return false;
+}
+
+
+
+void KHexadecimalByteCodec::removeLastDigit( unsigned char *Byte ) const
+{
+ *Byte >>= 4;
+}
diff --git a/khexedit/lib/codecs/khexadecimalbytecodec.h b/khexedit/lib/codecs/khexadecimalbytecodec.h
new file mode 100644
index 0000000..9bb1969
--- /dev/null
+++ b/khexedit/lib/codecs/khexadecimalbytecodec.h
@@ -0,0 +1,69 @@
+/***************************************************************************
+ khexadecimalbytecodec.h - description
+ -------------------
+ begin : Mo Nov 29 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef KHE_KHEXADECIMALBYTECODEC_H
+#define KHE_KHEXADECIMALBYTECODEC_H
+
+// lib specific
+#include "kbytecodec.h"
+
+namespace KHE
+{
+
+/** class that is able to convert codings to and from hexadecimal
+ *
+ * the buffer will be always filled up to CodingWidth, if not using shortCodingFunction
+ * a closing '\0' will be always added
+ *
+ *@author Friedrich W. H. Kossebau
+ */
+
+class KHexadecimalByteCodec : public KByteCodec
+{
+ public:
+ KHexadecimalByteCodec( bool S = false );
+
+ public:
+ bool setSmallDigits( bool S );
+ bool smallDigits() const;
+
+ public: // API to be implemented
+ /** */
+ virtual unsigned int encodingWidth() const { return 2; }
+ /** */
+ virtual unsigned char digitsFilledLimit() const { return 16; }
+
+ /** encodes the Char and writes the result to */
+ virtual void encode( QString &Digits, unsigned int Pos, const unsigned char Char ) const;
+ /** */
+ virtual void encodeShort( QString &Digits, unsigned int Pos, const unsigned char Char ) const;
+ /** */
+ virtual bool appendDigit( unsigned char *Byte, const unsigned char Digit ) const;
+ /** */
+ virtual void removeLastDigit( unsigned char *Byte ) const;
+ /** */
+ virtual bool isValidDigit( const unsigned char Digit ) const;
+ /** */
+ virtual bool turnToValue( unsigned char *Digit ) const;
+
+ protected:
+ const QChar* Digit;
+};
+
+}
+
+#endif
diff --git a/khexedit/lib/codecs/koctalbytecodec.cpp b/khexedit/lib/codecs/koctalbytecodec.cpp
new file mode 100644
index 0000000..1167941
--- /dev/null
+++ b/khexedit/lib/codecs/koctalbytecodec.cpp
@@ -0,0 +1,80 @@
+/***************************************************************************
+ koctalbytecodec.cpp - description
+ -------------------
+ begin : Mo Nov 29 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+// lib specific
+#include "koctalbytecodec.h"
+
+using namespace KHE;
+
+
+void KOctalByteCodec::encode( QString &Digits, unsigned int Pos, unsigned char Char ) const
+{
+ Digits.at(Pos++) = '0'+(Char>>6);
+ Digits.at(Pos++) = '0'+((Char>>3)&0x07);
+ Digits.at(Pos) = '0'+((Char) &0x07);
+}
+
+
+void KOctalByteCodec::encodeShort( QString &Digits, unsigned int Pos, unsigned char Char ) const
+{
+ unsigned char C;
+ if( (C = (Char>>6)&0x07) )
+ Digits.at(Pos++) = '0'+C;
+ if( (C = (Char>>3)&0x07) )
+ Digits.at(Pos++) = '0'+C;
+ Digits.at(Pos) = '0'+((Char)&0x07);
+}
+
+
+bool KOctalByteCodec::isValidDigit( unsigned char Digit ) const
+{
+ return Digit >= '0' && Digit <= '7';
+}
+
+
+bool KOctalByteCodec::turnToValue( unsigned char *Digit ) const
+{
+ if( isValidDigit(*Digit) )
+ {
+ *Digit -= '0';
+ return true;
+ }
+ return false;
+}
+
+
+bool KOctalByteCodec::appendDigit( unsigned char *Byte, unsigned char Digit ) const
+{
+ if( turnToValue(&Digit) )
+ {
+ unsigned char B = *Byte;
+ if( B < 64 )
+ {
+ B <<= 3;
+ B += Digit;
+ *Byte = B;
+ return true;
+ }
+ }
+ return false;
+}
+
+
+void KOctalByteCodec::removeLastDigit( unsigned char *Byte ) const
+{
+ *Byte >>= 3;
+}
diff --git a/khexedit/lib/codecs/koctalbytecodec.h b/khexedit/lib/codecs/koctalbytecodec.h
new file mode 100644
index 0000000..e05ca66
--- /dev/null
+++ b/khexedit/lib/codecs/koctalbytecodec.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ koctalbytecodec.h - description
+ -------------------
+ begin : Mo Nov 29 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef KHE_KOCTALBYTECODEC_H
+#define KHE_KOCTALBYTECODEC_H
+
+// lib specific
+#include "kbytecodec.h"
+
+namespace KHE
+{
+
+/** class that is able to convert codings to and from binary
+ *
+ * the buffer will be always filled up to CodingWidth, if not using shortCodingFunction
+ * a closing '\0' will be always added
+ *
+ *@author Friedrich W. H. Kossebau
+ */
+
+class KOctalByteCodec : public KByteCodec
+{
+ public: // API to be implemented
+ /** */
+ virtual unsigned int encodingWidth() const { return 3; }
+ /** */
+ virtual unsigned char digitsFilledLimit() const { return 64; }
+
+ /** encodes the Char and writes the result to */
+ virtual void encode( QString &Digits, unsigned int Pos, const unsigned char Char ) const;
+ /** */
+ virtual void encodeShort( QString &Digits, unsigned int Pos, const unsigned char Char ) const;
+ /** */
+ virtual bool appendDigit( unsigned char *Byte, const unsigned char Digit ) const;
+ /** */
+ virtual void removeLastDigit( unsigned char *Byte ) const;
+ /** */
+ virtual bool isValidDigit( const unsigned char Digit ) const;
+ /** */
+ virtual bool turnToValue( unsigned char *Digit ) const;
+};
+
+}
+
+#endif
diff --git a/khexedit/lib/codecs/ktextcharcodec.cpp b/khexedit/lib/codecs/ktextcharcodec.cpp
new file mode 100644
index 0000000..613dedd
--- /dev/null
+++ b/khexedit/lib/codecs/ktextcharcodec.cpp
@@ -0,0 +1,236 @@
+/***************************************************************************
+ ktextcharcodec.cpp - description
+ -------------------
+ begin : Sa Nov 27 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+// qt specific
+#include "qtextcodec.h"
+// kde specific
+#include <kglobal.h>
+#include <klocale.h>
+#include <kcharsets.h>
+// lib specific
+#include "ktextcharcodec.h"
+
+
+using namespace KHE;
+
+static const char QTextCodecWhiteSpace = 63;
+
+static struct KEncodingNames {
+ KEncoding Encoding;
+ const char *Name;
+}
+const EncodingNames[] = {
+{ ISO8859_1Encoding, "ISO 8859-1" },
+{ ISO8859_2Encoding, "ISO 8859-2" },
+{ ISO8859_3Encoding, "ISO 8859-3" },
+{ ISO8859_4Encoding, "ISO 8859-4" },
+{ ISO8859_5Encoding, "ISO 8859-5" },
+{ ISO8859_6Encoding, "ISO 8859-6" },
+{ ISO8859_7Encoding, "ISO 8859-7" },
+{ ISO8859_8Encoding, "ISO 8859-8" },
+{ ISO8859_8_IEncoding, "ISO 8859-8-I" },
+{ ISO8859_9Encoding, "ISO 8859-9" },
+{ ISO8859_11Encoding, "ISO 8859-11" },
+{ ISO8859_13Encoding, "ISO 8859-13" },
+{ ISO8859_15Encoding, "ISO 8859-15" },
+{ CP1250Encoding, "CP 1250" },
+{ CP1251Encoding, "CP 1251" },
+{ CP1252Encoding, "CP 1252" },
+{ CP1253Encoding, "CP 1253" },
+{ CP1254Encoding, "CP 1254" },
+{ CP1255Encoding, "CP 1255" },
+{ CP1256Encoding, "CP 1256" },
+{ CP1257Encoding, "CP 1257" },
+{ CP1258Encoding, "CP 1258" },
+{ IBM850Encoding, "IBM 850" },
+{ IBM866Encoding, "IBM 866" },
+{ KOI8_REncoding, "KOI8-R" },
+{ KOI8_UEncoding, "KOI8-U" } };
+//TODO: WS2
+static const unsigned int NoOfEncodings = 26;
+
+static bool is8Bit( QTextCodec *Codec )
+{
+ bool Found = false;
+ for( unsigned int i=0; i<NoOfEncodings; ++i )
+ {
+ if( qstrcmp(Codec->name(),EncodingNames[i].Name) == 0 )
+ {
+ Found = true;
+ break;
+ }
+ }
+ return Found;
+}
+
+static QTextCodec *createLatin1()
+{
+ return KGlobal::charsets()->codecForName( EncodingNames[0].Name );
+}
+
+/** heuristic seems to be doomed :(
+static bool is8Bit( QTextCodec *Codec )
+{
+ bool Result = true;
+
+ // first test different for 0
+ unsigned char c[4];
+ c[0] = 0;
+ c[1] = c[2] = c[3] = 230;
+ QString S = Codec->toUnicode( (const char*)&c,4 );
+ int Length = 1;
+ QCString CS = Codec->fromUnicode( S, Length );
+ //kdDebug() << Codec->name() << " "<<Length << endl;
+ if( Length > 0 )
+ Result = false;
+ // test if all chars survive the recoding
+ else
+ do
+ {
+ ++c[0];
+ S = Codec->toUnicode( (const char*)&c,4 );
+ Length = 1;
+ CS = Codec->fromUnicode( S, Length );
+ //kdDebug() << Codec->name() << " "<<c[0]<<"->"<<CS[0]<<":"<<Length << endl;
+ if( Length != 1 || (CS[0] != (char)c[0] && CS[0] != QTextCodecWhiteSpace) )
+ {
+ Result = false;
+ break;
+ }
+ }
+ while( c[0] < 255 );
+ return Result;
+}
+const QStringList &KTextCharCodec::codecNames()
+{
+ // first call?
+ if( CodecNames.isEmpty() )
+{
+ const QStringList &CharSets = KGlobal::charsets()->availableEncodingNames();
+
+ for( QStringList::ConstIterator it = CharSets.begin(); it != CharSets.end(); ++it )
+{
+ bool Found = true;
+ QTextCodec* Codec = KGlobal::charsets()->codecForName( *it, Found );
+ if( Found && is8Bit(Codec) )
+ CodecNames.append( QString::fromLatin1(Codec->name()) );
+}
+}
+
+ return CodecNames;
+}
+
+QString KTextCharCodec::nameOfEncoding( KEncoding C )
+{
+ KTextCharCodec *Codec = 0;
+
+ const char* N = 0;
+ for( unsigned int i=0; i<NoOfEncodings; ++i )
+ {
+ if( EncodingNames[i].Encoding == C )
+ {
+ N = EncodingNames[i].Name;
+ break;
+ }
+ }
+
+ if( N != 0 )
+ {
+ QString CodeName = QString::fromLatin1( N );
+ }
+ return Codec;
+}
+ */
+
+
+QStringList KTextCharCodec::CodecNames;
+
+KTextCharCodec *KTextCharCodec::createLocalCodec()
+{
+ QTextCodec *Codec = KGlobal::locale()->codecForEncoding();
+ if( !is8Bit(Codec) )
+ Codec = createLatin1();
+ return new KTextCharCodec( Codec );
+}
+
+
+KTextCharCodec *KTextCharCodec::createCodec( const QString &CodeName )
+{
+ bool Ok;
+ QTextCodec *Codec = KGlobal::charsets()->codecForName( CodeName, Ok );
+ if( Ok )
+ Ok = is8Bit( Codec );
+ return Ok ? new KTextCharCodec( Codec ) : 0;
+}
+
+
+const QStringList &KTextCharCodec::codecNames()
+{
+ // first call?
+ if( CodecNames.isEmpty() )
+ {
+ for( unsigned int i=0; i<NoOfEncodings; ++i )
+ {
+ bool Found = true;
+ QString Name = QString::fromLatin1( EncodingNames[i].Name );
+ QTextCodec* Codec = KGlobal::charsets()->codecForName( Name, Found );
+ if( Found )
+ CodecNames.append( QString::fromLatin1(Codec->name()) );
+ }
+ }
+
+ return CodecNames;
+}
+
+
+KTextCharCodec::KTextCharCodec( QTextCodec *C )
+ : Codec( C ),
+ Decoder( C->makeDecoder() ),
+ Encoder( C->makeEncoder() )
+{}
+
+KTextCharCodec::~KTextCharCodec()
+{
+ delete Decoder;
+ delete Encoder;
+}
+
+bool KTextCharCodec::encode( char *D, const QChar &C ) const
+{
+ if( !Codec->canEncode(C) ) // TODO: do we really need the codec?
+ return false;
+ int dummy;
+ char T = Encoder->fromUnicode( C, dummy )[0];
+
+ *D = T;
+ return true;
+}
+
+
+KHEChar KTextCharCodec::decode( char Byte ) const
+{
+ QString S( Decoder->toUnicode(&Byte,1) );
+ return KHEChar(S.at(0));
+}
+
+
+const QString& KTextCharCodec::name() const
+{
+ if( Name.isNull() )
+ Name = QString::fromLatin1( Codec->name() );
+ return Name;
+}
diff --git a/khexedit/lib/codecs/ktextcharcodec.h b/khexedit/lib/codecs/ktextcharcodec.h
new file mode 100644
index 0000000..683919c
--- /dev/null
+++ b/khexedit/lib/codecs/ktextcharcodec.h
@@ -0,0 +1,66 @@
+/***************************************************************************
+ ktextcharcodec.h - description
+ -------------------
+ begin : Sa Nov 27 2004
+ copyright : (C) 2004 by Friedrich W. H. Kossebau
+ email : Friedrich.W.H@Kossebau.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License version 2 as published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef KHE_KTEXTCHARCODEC_H
+#define KHE_KTEXTCHARCODEC_H
+
+
+#include "kcharcodec.h"
+
+class QTextCodec;
+class QTextDecoder;
+class QTextEncoder;
+
+namespace KHE
+{
+
+// used by all codecs with full char coping, i.e. there are no undefined chars
+class KTextCharCodec : public KCharCodec
+{
+ public:
+ static KTextCharCodec *createCodec( const QString &CodeName );
+ static KTextCharCodec *createCodec( KEncoding C );
+ static KTextCharCodec *createLocalCodec();
+
+ static const QStringList &codecNames();
+
+ protected:
+ KTextCharCodec( QTextCodec *C );
+ public:
+ virtual ~KTextCharCodec();
+
+ public: // KCharCodec API
+ virtual bool encode( char *D, const QChar &C ) const;
+ virtual KHEChar decode( char Byte ) const;
+ virtual const QString& name() const;
+
+
+ protected:
+ QTextCodec *Codec;
+ /** decodes the chars to unicode */
+ QTextDecoder *Decoder;
+ /** encodes the chars from unicode */
+ QTextEncoder *Encoder;
+ /** */
+ mutable QString Name;
+
+ static QStringList CodecNames;
+};
+
+}
+
+#endif