From d7955ce24d294fb2014c59d11fca184471056f44 Mon Sep 17 00:00:00 2001 From: Shuyi Chen Date: Wed, 22 May 2013 14:51:55 -0700 Subject: Add android smack source. Change-Id: I49ce97136c17173c4ae3965c694af6e7bc49897d --- src/org/xbill/DNS/Compression.java | 72 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/org/xbill/DNS/Compression.java (limited to 'src/org/xbill/DNS/Compression.java') diff --git a/src/org/xbill/DNS/Compression.java b/src/org/xbill/DNS/Compression.java new file mode 100644 index 0000000..e3e81c0 --- /dev/null +++ b/src/org/xbill/DNS/Compression.java @@ -0,0 +1,72 @@ +// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) + +package org.xbill.DNS; + +/** + * DNS Name Compression object. + * @see Message + * @see Name + * + * @author Brian Wellington + */ + +public class Compression { + +private static class Entry { + Name name; + int pos; + Entry next; +} + +private static final int TABLE_SIZE = 17; +private static final int MAX_POINTER = 0x3FFF; +private Entry [] table; +private boolean verbose = Options.check("verbosecompression"); + +/** + * Creates a new Compression object. + */ +public +Compression() { + table = new Entry[TABLE_SIZE]; +} + +/** + * Adds a compression entry mapping a name to a position in a message. + * @param pos The position at which the name is added. + * @param name The name being added to the message. + */ +public void +add(int pos, Name name) { + if (pos > MAX_POINTER) + return; + int row = (name.hashCode() & 0x7FFFFFFF) % TABLE_SIZE; + Entry entry = new Entry(); + entry.name = name; + entry.pos = pos; + entry.next = table[row]; + table[row] = entry; + if (verbose) + System.err.println("Adding " + name + " at " + pos); +} + +/** + * Retrieves the position of the given name, if it has been previously + * included in the message. + * @param name The name to find in the compression table. + * @return The position of the name, or -1 if not found. + */ +public int +get(Name name) { + int row = (name.hashCode() & 0x7FFFFFFF) % TABLE_SIZE; + int pos = -1; + for (Entry entry = table[row]; entry != null; entry = entry.next) { + if (entry.name.equals(name)) + pos = entry.pos; + } + if (verbose) + System.err.println("Looking for " + name + ", found " + pos); + return pos; +} + +} -- cgit v1.2.3