public void popFrame() { int temp = peek(); int pop = framePointers.pop(); while (size() - 1 >= pop) { if (!runStack.isEmpty()) { pop(); } } push(temp); }
/** * Return the root hash of a binary tree with leaves at the given depths and with the given hash * val in each leaf. */ byte[] hashed(byte[] val, Integer... depths) { ArrayDeque<Integer> dstack = new ArrayDeque<Integer>(); ArrayDeque<byte[]> hstack = new ArrayDeque<byte[]>(); Iterator<Integer> depthiter = Arrays.asList(depths).iterator(); if (depthiter.hasNext()) { dstack.push(depthiter.next()); hstack.push(val); } while (depthiter.hasNext()) { Integer depth = depthiter.next(); byte[] hash = val; while (depth.equals(dstack.peek())) { // consume the stack hash = Hashable.binaryHash(hstack.pop(), hash); depth = dstack.pop() - 1; } dstack.push(depth); hstack.push(hash); } assert hstack.size() == 1; return hstack.pop(); }
private static Record readRecord(ArrayDeque<String> stack) { Record rec = new Record(); for (; ; ) { if (stack.isEmpty()) { return rec; } String line = stack.pop(); assert !line.isEmpty(); if ("%%".equals(line)) { return rec; } if (line.charAt(0) == ' ') { // continuation continue; } int sep = line.indexOf(':'); String name = line.substring(0, sep).trim(); String value = line.substring(sep + 1).trim(); Field field = Field.forName(name); assert field != null; switch (field) { case Deprecated: case PreferredValue: case Prefix: case Subtag: case Tag: case Type: rec.entries.put(field, value); break; case Added: case Comments: case Description: case Macrolanguage: case Scope: case SupressScript: default: // ignore these break; } } }
/** * {@link LanguageSubtagRegistryData} * * @param langSubtagReg the language subtag registry file * @throws IOException if an I/O error occurs */ static void languageSubtagRegistry(Path langSubtagReg) throws IOException { List<String> lines = Files.readAllLines(langSubtagReg, StandardCharsets.UTF_8); ArrayDeque<String> stack = new ArrayDeque<>(lines); ArrayList<Record> language = new ArrayList<>(); ArrayList<Record> region = new ArrayList<>(); ArrayList<Record> grandfathered = new ArrayList<>(); ArrayList<Record> redundant = new ArrayList<>(); ArrayList<Record> extlang = new ArrayList<>(); ArrayList<Record> script = new ArrayList<>(); ArrayList<Record> variant = new ArrayList<>(); // skip first two lines (file date + %% separator) stack.pop(); stack.pop(); while (!stack.isEmpty()) { Record rec = readRecord(stack); String type = rec.get(Field.Type); assert type != null; if ("language".equals(type)) { if (rec.has(Field.PreferredValue)) { language.add(rec); } } if ("region".equals(type)) { if (rec.has(Field.PreferredValue)) { region.add(rec); } } if ("grandfathered".equals(type)) { grandfathered.add(rec); } if ("redundant".equals(type)) { if (rec.has(Field.PreferredValue)) { redundant.add(rec); } } if ("extlang".equals(type)) { if (rec.has(Field.PreferredValue)) { extlang.add(rec); } } if ("script".equals(type)) { if (rec.has(Field.PreferredValue)) { script.add(rec); } } if ("variant".equals(type)) { if (rec.has(Field.PreferredValue)) { variant.add(rec); } } } /* Generate LanguageSubtagRegistryData#scriptData entries */ System.out.println("--- [LanguageSubtagRegistryData#scriptData] ---"); for (Record record : script) { assert record.has(Field.Prefix); System.out.printf( "%s -> %s [%s]%n", record.get(Field.Subtag), record.get(Field.PreferredValue), record.get(Field.Prefix)); } System.out.println(); assert script.isEmpty() : "no preferred values for 'script' expected"; /* Generate LanguageSubtagRegistryData#extlangData entries */ System.out.println("--- [LanguageSubtagRegistryData#extlangData] ---"); for (Record record : extlang) { assert record.has(Field.Prefix); assert record.get(Field.Subtag).equals(record.get(Field.PreferredValue)) : record.get(Field.Subtag); System.out.printf( "map.put(\"%s\", \"%s\");%n", record.get(Field.Subtag), record.get(Field.Prefix)); } System.out.println(); /* Generate LanguageSubtagRegistryData#variantData entries */ System.out.println("--- [LanguageSubtagRegistryData#variantData] ---"); for (Record record : variant) { assert record.has(Field.Prefix); System.out.printf( "%s -> %s [%s]%n", record.get(Field.Subtag), record.get(Field.PreferredValue), record.get(Field.Prefix)); System.out.printf( "map.put(\"%s\", \"%s\");%n", record.get(Field.Subtag), record.get(Field.PreferredValue)); } System.out.println(); assert variant.size() == 1 : "Only one variant entry expected"; assert variant.get(0).get(Field.Subtag).equals("heploc"); assert variant.get(0).get(Field.PreferredValue).equals("alalc97"); /* Generate LanguageSubtagRegistryData#regionData entries */ System.out.println("--- [LanguageSubtagRegistryData#regionData] ---"); for (Record record : region) { assert !record.has(Field.Prefix); System.out.printf( "map.put(\"%s\", \"%s\");%n", record.get(Field.Subtag).toLowerCase(Locale.ROOT), record.get(Field.PreferredValue)); } System.out.println(); /* Generate LanguageSubtagRegistryData#languageData entries */ System.out.println("--- [LanguageSubtagRegistryData#languageData] ---"); for (Record record : language) { assert !record.has(Field.Prefix); System.out.printf( "map.put(\"%s\", \"%s\");%n", record.get(Field.Subtag), record.get(Field.PreferredValue)); } System.out.println(); /* Generate LanguageSubtagRegistryData#grandfatheredData entries */ System.out.println("--- [LanguageSubtagRegistryData#grandfatheredData] ---"); for (Record record : grandfathered) { assert !record.has(Field.Prefix); if (record.has(Field.PreferredValue)) { System.out.printf( "map.put(\"%s\", \"%s\");%n", record.get(Field.Tag).toLowerCase(Locale.ROOT), record.get(Field.PreferredValue)); } else { System.out.printf( "map.put(\"%s\", \"%s\");%n", record.get(Field.Tag).toLowerCase(Locale.ROOT), record.get(Field.Tag)); } } System.out.println(); /* Generate LanguageSubtagRegistryData#redundantData entries */ System.out.println("--- [LanguageSubtagRegistryData#redundantData] ---"); for (Record record : redundant) { assert !record.has(Field.Prefix); System.out.printf( "map.put(\"%s\", \"%s\");%n", record.get(Field.Tag).toLowerCase(Locale.ROOT), record.get(Field.PreferredValue)); } System.out.println(); }