package net.scapeemulator.cache.def; import java.nio.ByteBuffer; import net.scapeemulator.cache.util.ByteBufferUtils; public class ScriptConstantsTable { public int anInt3658; public int anInt3662; public NodeTable nodeTable; private NodeTable nodeTable2; public String stringValue; public int intValue; public final void readDefinition(ByteBuffer buffer) { while (true) { int opcode = buffer.get(); if (opcode == 0) { return; } decodeOpcode(opcode, buffer); } } private final void decodeOpcode(int opcode, ByteBuffer stream) { if (1 == opcode) { anInt3662 = stream.get(); } else if (2 == opcode) { anInt3658 = stream.get(); } else if (3 == opcode) { stringValue = ByteBufferUtils.getJagexString(stream); } else if (4 == opcode) { intValue = stream.getInt(); } else if (5 == opcode || 6 == opcode) { int count = stream.getShort(); nodeTable = new NodeTable(estimateNeededBuckets(count)); for (int i = 0; i < count; ++i) { int key = stream.getInt(); Node node; if (opcode == 5) { node = new StringNode(ByteBufferUtils.getJagexString(stream)); } else { node = new IntegerNode(stream.getInt()); } nodeTable.put(node, (long) key); } } } static final int estimateNeededBuckets(int count) { --count; count |= count >>> 1; count |= count >>> 2; count |= count >>> 4; count |= count >>> 8; count |= count >>> 16; return 1 + count; } final String getStringValue(int key) { if (null == nodeTable) { return stringValue; } StringNode node = (StringNode) nodeTable.get((long) key); return null == node ? stringValue : node.value; } final boolean method617(String str) { if (nodeTable == null) { return false; } if (nodeTable2 == null) { createSecondStringNodeTable(); } for (StringNode sNode = (StringNode) nodeTable2.get(stringToLongKey(str)); sNode != null; sNode = (StringNode) nodeTable2.method1784()) { if (sNode.value.equals(str)) { return true; } } return false; } private static final long stringToLongKey(String s) { long var2 = 0L; for (int var4 = 0; var4 < s.length(); ++var4) { var2 = (long) (s.toCharArray()[var4] & 255) + (var2 << 5) - var2; } return var2; } private final void createSecondStringNodeTable() { nodeTable2 = new NodeTable(nodeTable.getSize()); StringNode node = (StringNode) nodeTable.getFirst(); while (node != null) { StringNode var3 = new StringNode(node.value); nodeTable2.put(var3, stringToLongKey(node.value)); node = (StringNode) nodeTable.getNext(); } } final int getIntValue(int key) { if (nodeTable == null) { return intValue; } IntegerNode iNode = (IntegerNode) nodeTable.get((long) key); return iNode != null ? iNode.value : intValue; } final boolean method621(int var2) { if (null != nodeTable) { if (nodeTable2 == null) { method622(109); } IntegerNode var3 = (IntegerNode) nodeTable2.get((long) var2); return var3 != null; } else { return false; } } private final void method622(int var1) { nodeTable2 = new NodeTable(nodeTable.getSize()); for (IntegerNode var2 = (IntegerNode) nodeTable.getFirst(); null != var2; var2 = (IntegerNode) nodeTable.getNext()) { IntegerNode var4 = new IntegerNode((int) var2.uid); this.nodeTable2.put(var4, (long) var2.value); } } public ScriptConstantsTable() { stringValue = "null"; } public final class NodeTable { Node[] headNodes; int capacity; private Node lastIterated; private Node lastRetrieved; private long lastKey; private int currentIndex = 0; public final Node getFirst() { currentIndex = 0; return getNext(); } public final Node getNext() { Node var2; if (-1 > ~currentIndex && lastIterated != headNodes[currentIndex - 1]) { var2 = lastIterated; lastIterated = var2.next; return var2; } else { do { if (~currentIndex <= ~capacity) { return null; } var2 = headNodes[currentIndex++].next; } while (headNodes[currentIndex + -1] == var2); lastIterated = var2.next; return var2; } } final void put(Node node, long key) { if (null != node.prev) { node.unlink(); } Node head = headNodes[(int) (key & (long) (capacity - 1))]; node.next = head; node.uid = key; node.prev = head.prev; node.prev.next = node; node.next.prev = node; } NodeTable(int size) { headNodes = new Node[size]; this.capacity = size; for (int i = 0; i < size; i++) { Node var3 = headNodes[i] = new Node(); var3.prev = var3; var3.next = var3; } } final Node get(long key) { lastKey = key; Node head = headNodes[(int) (key & (long) (capacity - 1))]; for (lastRetrieved = head.next; head != lastRetrieved; lastRetrieved = lastRetrieved.next) { if (key == lastRetrieved.uid) { Node var5 = lastRetrieved; lastRetrieved = lastRetrieved.next; return var5; } } lastRetrieved = null; return null; } final Node method1784() { if (null == lastRetrieved) { return null; } Node head = headNodes[(int) (lastKey & (long) (capacity - 1))]; while (head != lastRetrieved) { if (lastRetrieved.uid == lastKey) { Node var3 = lastRetrieved; lastRetrieved = lastRetrieved.next; return var3; } lastRetrieved = lastRetrieved.next; } lastRetrieved = null; return null; } final int getSize() { return capacity; } } public class Node { public long uid; Node next; Node prev; final boolean isLinked() { return null != prev; } final void unlink() { if (null != prev) { prev.next = next; next.prev = prev; prev = null; next = null; } } } public final class IntegerNode extends Node { public int value; IntegerNode(int value) { this.value = value; } } public final class StringNode extends Node { public String value; StringNode(String str) { this.value = str; } } }