Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

Core::UTF8StreamEncoder Class Reference

#include <UTF8StreamEncoder.h>

Inheritance diagram for Core::UTF8StreamEncoder:

Inheritance graph
[legend]
Collaboration diagram for Core::UTF8StreamEncoder:

Collaboration graph
[legend]
List of all members.

Public Member Functions

virtual StringclassName (void) const
 Answer receiver class name.
virtual CharacterdecodeFrom (Stream *stream)
virtual void encodeTo (Stream *stream, Character *character)

Member Function Documentation

String * Core::UTF8StreamEncoder::className void   )  const [virtual]
 

Answer receiver class name.

Because there isn't any standard way to obtain class name this method comes to place.

Every class should rewrite this method but many didn't (yet).

Reimplemented from Core::StreamEncoder.

Definition at line 33 of file UTF8StreamEncoder.cc.

00034 {
00035     return new String("UTF8StreamEncoder");
00036 }

Character * Core::UTF8StreamEncoder::decodeFrom Stream stream  )  [virtual]
 

Reimplemented from Core::StreamEncoder.

Definition at line 39 of file UTF8StreamEncoder.cc.

References Core::Object::error(), Core::Stream::next(), nil, and Core::Character::value().

00040 {
00041     unsigned long charValue = 0;
00042     unsigned char byteCount;
00043     int byteValue;
00044 
00045     Object *item = stream->next();
00046     if (item == nil) {
00047         /* End of stream reached */
00048         return nil;
00049     }
00050 
00051     byteValue = dynamic_cast<Integer *>(item)->asLong();
00052     if (byteValue < 128) {
00053         byteCount = 0;
00054     } else if (byteValue < 224) {
00055         byteCount = 1;
00056         byteValue = byteValue & 31;
00057     } else if (byteValue < 240) {
00058         byteCount = 2;
00059         byteValue = byteValue & 15;
00060     } else if (byteValue < 248) {
00061         byteCount = 3;
00062         byteValue = byteValue & 7;
00063     } else if (byteValue < 252) {
00064         byteCount = 4;
00065         byteValue = byteValue & 3;
00066     } else if (byteValue < 254) {
00067         byteCount = 5;
00068         byteValue = byteValue & 1;
00069     } else {
00070         error(new String("Illegal UTF-8 code."), new String(__PRETTY_FUNCTION__));
00071     }
00072     charValue = byteValue;
00073     for (int i = 0; i < byteCount; i++) {
00074         byteValue = dynamic_cast<Integer *>(stream->next())->asLong();
00075         charValue = (charValue << 6) + (byteValue & 63);
00076     }
00077     return Character::value(charValue);
00078 }

void Core::UTF8StreamEncoder::encodeTo Stream stream,
Character character
[virtual]
 

Reimplemented from Core::StreamEncoder.

Definition at line 80 of file UTF8StreamEncoder.cc.

References Core::Character::asInteger(), Core::Stream::nextPut(), and Core::Integer::value().

00081 {
00082     unsigned long value = character->asInteger();
00083     unsigned char bitfill = 0, byteCounter = 0;
00084     unsigned char buffer[6];
00085 
00086     if (value < 128) {
00087         stream->nextPut(Integer::value(value));
00088         return;
00089     }
00090     /* value is greater than 127 => need more bytes to encode */
00091     do {
00092         int byteValue;
00093         bitfill = (bitfill << 1) + 1;
00094         byteCounter++;
00095         byteValue = value & 63;
00096         value = value >> 6;
00097         if (value > 0)
00098             buffer[byteCounter-1] = 0x80 | byteValue;
00099         else
00100             buffer[byteCounter-1] = (bitfill << (8 - byteCounter)) | byteValue;
00101     } while (value > 0);
00102 
00103     for (int i = byteCounter - 1; i >= 0; i--) {
00104         stream->nextPut(Integer::value(buffer[i]));
00105     }
00106 }


The documentation for this class was generated from the following files:
Generated on Mon Nov 27 09:52:05 2006 for Smalltalk like C++ Class Library by  doxygen 1.4.2