package CacheWolf.utils;
import ewe.io.IOException;
import ewe.io.TextCodec;
import ewe.util.ByteArray;
import ewe.util.CharArray;
import ewe.util.Hashtable;
//##################################################################
public class W1252Codec implements TextCodec {
//##################################################################
/**
* This is a creation option. It specifies that CR characters should be removed when
* encoding text into ASCII.
**/
public static final int STRIP_CR_ON_DECODE = 0x1;
/**
* This is a creation option. It specifies that CR characters should be removed when
* decoding text from ASCII.
**/
public static final int STRIP_CR_ON_ENCODE = 0x2;
/**
* This is a creation option. It specifies that CR characters should be removed when
* decoding text from ASCII AND encoding text to ASCII.
**/
public static final int STRIP_CR = STRIP_CR_ON_DECODE | STRIP_CR_ON_ENCODE;
private int flags = 0;
//===================================================================
public W1252Codec(int options)
//===================================================================
{
flags = options;
}
//===================================================================
public W1252Codec()
//===================================================================
{
this(0);
}
private static Hashtable Uni2W1252Table = new Hashtable(64);
static {
Uni2W1252Table.put(new Integer(0x20ac), new Integer(128));
Uni2W1252Table.put(new Integer(0x201a), new Integer(130));
Uni2W1252Table.put(new Integer(0x0192), new Integer(131));
Uni2W1252Table.put(new Integer(0x201e), new Integer(132));
Uni2W1252Table.put(new Integer(0x2026), new Integer(133));
Uni2W1252Table.put(new Integer(0x2020), new Integer(134));
Uni2W1252Table.put(new Integer(0x2021), new Integer(135));
Uni2W1252Table.put(new Integer(0x02c6), new Integer(136));
Uni2W1252Table.put(new Integer(0x2030), new Integer(137));
Uni2W1252Table.put(new Integer(0x160), new Integer(138));
Uni2W1252Table.put(new Integer(0x2039), new Integer(139));
Uni2W1252Table.put(new Integer(0x152), new Integer(140));
Uni2W1252Table.put(new Integer(0x017d), new Integer(142));
Uni2W1252Table.put(new Integer(0x2018), new Integer(145));
Uni2W1252Table.put(new Integer(0x2019), new Integer(146));
Uni2W1252Table.put(new Integer(0x201c), new Integer(147));
Uni2W1252Table.put(new Integer(0x201d), new Integer(148));
Uni2W1252Table.put(new Integer(0x2022), new Integer(149));
Uni2W1252Table.put(new Integer(0x2013), new Integer(150));
Uni2W1252Table.put(new Integer(0x2014), new Integer(151));
Uni2W1252Table.put(new Integer(0x02dc), new Integer(152));
Uni2W1252Table.put(new Integer(0x2122), new Integer(153));
Uni2W1252Table.put(new Integer(0x0161), new Integer(154));
Uni2W1252Table.put(new Integer(0x203a), new Integer(155));
Uni2W1252Table.put(new Integer(0x0153), new Integer(156));
Uni2W1252Table.put(new Integer(0x017e), new Integer(158));
Uni2W1252Table.put(new Integer(0x0178), new Integer(159));
Uni2W1252Table.put(new Integer(0x2003), new Integer(32)); //
Uni2W1252Table.put(new Integer(0x2028), new Integer(32)); //
Uni2W1252Table.put(new Integer(0x2032), new Integer(39)); //
Uni2W1252Table.put(new Integer(0x2640), new Integer(119)); // w weiblich
Uni2W1252Table.put(new Integer(0x2642), new Integer(109)); // m m�nnlich
}
//===================================================================
public ByteArray encodeText(char[] text, int start, int length, boolean endOfData, ByteArray dest) throws IOException
//===================================================================
{
if (dest == null)
dest = new ByteArray();
if (dest.data == null || dest.data.length < length)
dest.data = new byte[length];
int t = 0;
for (int i = 0; i < length; i++) {
if (text[i + start] == 13 && ((flags & STRIP_CR_ON_ENCODE) != 0))
t--;
else {
int ix = text[i + start];
if (ix > 255) {
Integer s = (Integer) Uni2W1252Table.get(new Integer(ix));
if (s == null) {
// String six = String.valueOf(text[i + start]);
dest.data[i + t] = '?';
} else {
dest.data[i + t] = s.byteValue();
}
} else {
dest.data[i + t] = (byte) ix;
}
}
}
dest.length = length + t;
return dest;
}
//===================================================================
public CharArray decodeText(byte[] encoded, int start, int length, boolean endOfData, CharArray dest) throws IOException
//===================================================================
{
int toPut = -1;
if (dest == null)
dest = new CharArray();
if (dest.data == null || dest.data.length < length)
dest.data = new char[length];
int t = 0;
for (int i = 0; i < length; i++) {
if (encoded[i + start] == 13 && ((flags & STRIP_CR_ON_DECODE) != 0))
t--;
else {
dest.data[i + t] = (char) ((int) encoded[i + start] & 0xff);
}
}
dest.length = length + t;
return dest;
}
//===================================================================
public void closeCodec() throws IOException
//===================================================================
{
}
//===================================================================
public Object getCopy()
//===================================================================
{
return new W1252Codec(flags);
}
//##################################################################
}
//##################################################################