package ru.codeinside.gws.xml.normalizer.normalize.implementations;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;
public class UtfHelper {
static final void writeByte(
final String str,
final OutputStream out,
Map<String, byte[]> cache
) throws IOException {
byte[] result = cache.get(str);
if (result == null) {
result = getStringInUtf8(str);
cache.put(str, result);
}
out.write(result);
}
static final void writeCharToUtf8(final char c, final OutputStream out) throws IOException {
if (c < 0x80) {
out.write(c);
return;
}
if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF)) {
//No Surrogates in sun java
out.write(0x3f);
return;
}
int bias;
int write;
char ch;
if (c > 0x07FF) {
ch = (char) (c >>> 12);
write = 0xE0;
if (ch > 0) {
write |= (ch & 0x0F);
}
out.write(write);
write = 0x80;
bias = 0x3F;
} else {
write = 0xC0;
bias = 0x1F;
}
ch = (char) (c >>> 6);
if (ch > 0) {
write |= (ch & bias);
}
out.write(write);
out.write(0x80 | ((c) & 0x3F));
}
static final void writeStringToUtf8(
final String str,
final OutputStream out
) throws IOException {
final int length = str.length();
int i = 0;
char c;
while (i < length) {
c = str.charAt(i++);
if (c < 0x80) {
out.write(c);
continue;
}
if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF)) {
//No Surrogates in sun java
out.write(0x3f);
continue;
}
char ch;
int bias;
int write;
if (c > 0x07FF) {
ch = (char) (c >>> 12);
write = 0xE0;
if (ch > 0) {
write |= (ch & 0x0F);
}
out.write(write);
write = 0x80;
bias = 0x3F;
} else {
write = 0xC0;
bias = 0x1F;
}
ch = (char) (c >>> 6);
if (ch > 0) {
write |= (ch & bias);
}
out.write(write);
out.write(0x80 | ((c) & 0x3F));
}
}
public static final byte[] getStringInUtf8(final String str) {
final int length = str.length();
boolean expanded = false;
byte[] result = new byte[length];
int i = 0;
int out = 0;
char c;
while (i < length) {
c = str.charAt(i++);
if (c < 0x80) {
result[out++] = (byte) c;
continue;
}
if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF)) {
//No Surrogates in sun java
result[out++] = 0x3f;
continue;
}
if (!expanded) {
byte newResult[] = new byte[3 * length];
System.arraycopy(result, 0, newResult, 0, out);
result = newResult;
expanded = true;
}
char ch;
int bias;
byte write;
if (c > 0x07FF) {
ch = (char) (c >>> 12);
write = (byte) 0xE0;
if (ch > 0) {
write |= (ch & 0x0F);
}
result[out++] = write;
write = (byte) 0x80;
bias = 0x3F;
} else {
write = (byte) 0xC0;
bias = 0x1F;
}
ch = (char) (c >>> 6);
if (ch > 0) {
write |= (ch & bias);
}
result[out++] = write;
result[out++] = (byte) (0x80 | ((c) & 0x3F));
}
if (expanded) {
byte newResult[] = new byte[out];
System.arraycopy(result, 0, newResult, 0, out);
result = newResult;
}
return result;
}
}