blob: ad189dde3de51b19ed077b84fa1d623189a2572c [file] [log] [blame]
package org.eclipse.jdt.core.internal.tools.unicode;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class FileEncoder {
private static final String RESOURCE_FILE_EXTENSION = ".rsc"; //$NON-NLS-1$
private final static int Bit1 = 0x1;
private final static int Bit2 = 0x2;
private final static int Bit3 = 0x4;
private final static int Bit4 = 0x8;
private final static int Bit5 = 0x10;
private final static int Bit6 = 0x20;
private final static int Bit7 = 0x40;
private final static int Bit8 = 0x80;
private final static int Bit9 = 0x100;
private final static int Bit10 = 0x200;
private final static int Bit11 = 0x400;
private final static int Bit12 = 0x800;
private final static int Bit13 = 0x1000;
private final static int Bit14 = 0x2000;
private final static int Bit15 = 0x4000;
private final static int Bit16 = 0x8000;
private final static int Bit17 = 0x10000;
private final static int Bit18 = 0x20000;
private final static int Bit19 = 0x40000;
private final static int Bit20 = 0x80000;
private final static int Bit21 = 0x100000;
private final static int Bit22 = 0x200000;
private final static int Bit23 = 0x400000;
private final static int Bit24 = 0x800000;
private final static int Bit25 = 0x1000000;
private final static int Bit26 = 0x2000000;
private final static int Bit27 = 0x4000000;
private final static int Bit28 = 0x8000000;
private final static int Bit29 = 0x10000000;
private final static int Bit30 = 0x20000000;
private final static int Bit31 = 0x40000000;
private final static long Bit32 = 0x80000000L;
private final static long Bit33 = 0x100000000L;
private final static long Bit34 = 0x200000000L;
private final static long Bit35 = 0x400000000L;
private final static long Bit36 = 0x800000000L;
private final static long Bit37 = 0x1000000000L;
private final static long Bit38 = 0x2000000000L;
private final static long Bit39 = 0x4000000000L;
private final static long Bit40 = 0x8000000000L;
private final static long Bit41 = 0x10000000000L;
private final static long Bit42 = 0x20000000000L;
private final static long Bit43 = 0x40000000000L;
private final static long Bit44 = 0x80000000000L;
private final static long Bit45 = 0x100000000000L;
private final static long Bit46 = 0x200000000000L;
private final static long Bit47 = 0x400000000000L;
private final static long Bit48 = 0x800000000000L;
private final static long Bit49 = 0x1000000000000L;
private final static long Bit50 = 0x2000000000000L;
private final static long Bit51 = 0x4000000000000L;
private final static long Bit52 = 0x8000000000000L;
private final static long Bit53 = 0x10000000000000L;
private final static long Bit54 = 0x20000000000000L;
private final static long Bit55 = 0x40000000000000L;
private final static long Bit56 = 0x80000000000000L;
private final static long Bit57 = 0x100000000000000L;
private final static long Bit58 = 0x200000000000000L;
private final static long Bit59 = 0x400000000000000L;
private final static long Bit60 = 0x800000000000000L;
private final static long Bit61 = 0x1000000000000000L;
private final static long Bit62 = 0x2000000000000000L;
private final static long Bit63 = 0x4000000000000000L;
private final static long Bit64 = 0x8000000000000000L;
private final static long[] Bits = { Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7, Bit8, Bit9, Bit10, Bit11, Bit12,
Bit13, Bit14, Bit15, Bit16, Bit17, Bit18, Bit19, Bit20, Bit21, Bit22, Bit23, Bit24, Bit25, Bit26, Bit27,
Bit28, Bit29, Bit30, Bit31, Bit32, Bit33, Bit34, Bit35, Bit36, Bit37, Bit38, Bit39, Bit40, Bit41, Bit42,
Bit43, Bit44, Bit45, Bit46, Bit47, Bit48, Bit49, Bit50, Bit51, Bit52, Bit53, Bit54, Bit55, Bit56, Bit57,
Bit58, Bit59, Bit60, Bit61, Bit62, Bit63, Bit64, };
private static final int BOUND = 64;
private static final int BLOCK_SIZE = 65536;
private static final int BLOCK_LENGTH = 1024;
private static int getBitIndex(int i) {
return i % 64;
}
public static void encodeResourceFiles(Integer[] codePoints, Environment environment, String exportDirectory) {
File parentFile = new File(exportDirectory);
if (!parentFile.exists()) {
if (!parentFile.mkdirs()) {
System.err.println("Could not create the export directory: " + exportDirectory); //$NON-NLS-1$
return;
}
}
long encoding = 0;
int length = codePoints.length;
int counter = 0;
long[] computedValues = new long[BLOCK_LENGTH];
int limit = BOUND;
int blockLimit = BLOCK_SIZE;
int blockNumber = 0;
boolean hasMeaningfulValue = false;
for (int i = 0; i < length; i++) {
if (codePoints[i] < blockLimit) {
int valueToEncode = codePoints[i] & 0xFFFF;
if (valueToEncode < limit) {
encoding |= Bits[getBitIndex(valueToEncode)];
} else {
i--;
computedValues[counter++] = encoding;
hasMeaningfulValue |= encoding != 0 ? true : false;
encoding = 0;
limit += BOUND;
}
} else {
computedValues[counter++] = encoding;
try {
File f = new File(exportDirectory,
environment.getResourceFileName() + blockNumber + RESOURCE_FILE_EXTENSION);
if (hasMeaningfulValue) {
try (DataOutputStream outputStream = new DataOutputStream(new FileOutputStream(f))) {
for (int j = 0, max = computedValues.length; j < max; j++) {
long value = computedValues[j];
outputStream.writeLong(value);
}
outputStream.flush();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
counter = 0;
hasMeaningfulValue = false;
Arrays.fill(computedValues, 0);
i--;
limit = BOUND;
blockLimit += BLOCK_SIZE;
blockNumber++;
}
}
computedValues[counter++] = encoding;
try {
File f = new File(exportDirectory,
environment.getResourceFileName() + blockNumber + RESOURCE_FILE_EXTENSION);
try (DataOutputStream outputStream = new DataOutputStream(new FileOutputStream(f))) {
for (int j = 0, max = computedValues.length; j < max; j++) {
long value = computedValues[j];
outputStream.writeLong(value);
}
outputStream.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}