package org.eclipse.jdt.core.internal.tools.unicode; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Collections; public class CodePointsBuilder { public static Integer[] build(String[] codePointTable, Environment environment) { ArrayList<Integer> values = new ArrayList<>(); for (String codePointTableEntry : codePointTable) { if (codePointTableEntry.length() != 0) { int indexOfDots = codePointTableEntry.indexOf(".."); //$NON-NLS-1$ if (indexOfDots == -1) { // single value on the line try { values.add(Integer.parseInt(codePointTableEntry, 16)); } catch (NumberFormatException e) { System.err.println("NumberFormatException processing : " + codePointTableEntry); //$NON-NLS-1$ return null; } } else { // range of values try { int firstValue = Integer.parseInt(codePointTableEntry.substring(0, indexOfDots), 16); int secondValue = Integer.parseInt(codePointTableEntry.substring(indexOfDots + 2), 16); for (int i = firstValue; i <= secondValue; i++) { values.add(i); } } catch (NumberFormatException e) { System.err.println("NumberFormatException processing : " + codePointTableEntry); //$NON-NLS-1$ return null; } } } } Collections.sort(values); printDistribution(values, 0x10000); return values.toArray(new Integer[values.size()]); } private static void printDistribution(ArrayList<Integer> array, int increment) { int bound = increment; int counter = 0; int totalCounter = 0; int length = array.size(); int max = array.get(length - 1).intValue(); int numberOfFiguresForRange = (int) (Math.log(max) / Math.log(10)); if ((max % increment) == 0) { numberOfFiguresForRange = (int) (Math.log(max + 1) / Math.log(10)); } int numberOfFiguresForCounter = (int) (Math.log(length) / Math.log(10)); if ((length % increment) == 0) { numberOfFiguresForCounter = (int) (Math.log(length + 1) / Math.log(10)); } for (int i = 0; i < length; i++) { if (array.get(i).intValue() < bound) { counter++; } else { i--; totalCounter += counter; printRange(counter, bound, increment, totalCounter, length, numberOfFiguresForRange, numberOfFiguresForCounter); counter = 0; bound += increment; } } totalCounter += counter; printRange(counter, bound, increment, totalCounter, length, numberOfFiguresForRange, numberOfFiguresForCounter); } private static void printRange(int counter, int bound, int increment, int totalCounter, int length, int numberOfFiguresForRange, int numberOfFiguresForCounters) { if (counter != 0) { StringBuffer buffer = new StringBuffer(); int low = bound - increment; if (low != 0) { low++; } DecimalFormat format = new DecimalFormat("###.##"); //$NON-NLS-1$ buffer.append(display(low, numberOfFiguresForRange, 16)).append(" - ") //$NON-NLS-1$ .append(display(bound, numberOfFiguresForRange, 16)).append(" : ") //$NON-NLS-1$ .append(display(counter, numberOfFiguresForCounters, 10)).append("\t") //$NON-NLS-1$ .append((low & 0x1F0000) >> 16).append("\t\t") //$NON-NLS-1$ .append(format.format(100.0 * ((double) totalCounter / length))); System.out.println(String.valueOf(buffer)); } } private static String display(int value, int numberOfFiguresForRange, int radix) { int numberOfFigures = value == 0 ? 1 : (int) (Math.log(value) / Math.log(10)); if ((value % 10) == 0) { numberOfFigures = (int) (Math.log(value + 1) / Math.log(10)); } StringBuffer buffer = new StringBuffer(); switch (radix) { case 10: while (numberOfFigures < numberOfFiguresForRange) { buffer.append(" "); //$NON-NLS-1$ numberOfFigures++; } buffer.append(value); break; case 16: buffer.append("0x" + Integer.toHexString(value)); //$NON-NLS-1$ } return String.valueOf(buffer); } }