You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ma...@apache.org on 2011/06/07 17:44:42 UTC

svn commit: r1133047 [3/3] - in /tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/chm: accessor/ assertion/ core/ exception/ lzx/

Added: tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/chm/lzx/ChmSection.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/chm/lzx/ChmSection.java?rev=1133047&view=auto
==============================================================================
--- tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/chm/lzx/ChmSection.java (added)
+++ tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/chm/lzx/ChmSection.java Tue Jun  7 15:44:41 2011
@@ -0,0 +1,208 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tika.parser.chm.lzx;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+
+import org.apache.tika.parser.chm.core.ChmCommons;
+
+public class ChmSection {
+	private byte[] data;
+	private int swath;// kiks
+	private int total;// remains
+	private int buffer;// val
+
+	public ChmSection(byte[] data) {
+		ChmCommons.assertByteArrayNotNull(data);
+		setData(data);
+	}
+
+	/* Utilities */
+	public byte[] reverseByteOrder(byte[] toBeReversed) {
+		ChmCommons.assertByteArrayNotNull(toBeReversed);
+		ChmCommons.reverse(toBeReversed);
+		return toBeReversed;
+	}
+
+	public int checkBit(int i) {
+		return ((getBuffer() & (1 << (getTotal() - i))) == 0) ? 0 : 1;
+	}
+
+	public int getSyncBits(int bit) {
+		return getDesyncBits(bit, bit);
+	}
+
+	public int getDesyncBits(int bit, int removeBit) {
+		while (getTotal() < 16) {
+			setBuffer((getBuffer() << 16) + unmarshalUByte()
+					+ (unmarshalUByte() << 8));
+			setTotal(getTotal() + 16);
+		}
+		int tmp = (getBuffer() >>> (getTotal() - bit));
+		setTotal(getTotal() - removeBit);
+		setBuffer(getBuffer() - ((getBuffer() >>> getTotal()) << getTotal()));
+		return tmp;
+	}
+
+	public int unmarshalUByte() {
+		return (int) (getByte() & 255);
+	}
+
+	public byte getByte() {
+		if (getSwath() < getData().length) {
+			setSwath(getSwath() + 1);
+			return getData()[getSwath() - 1];
+		} else
+			return 0;
+	}
+
+	public int getLeft() {
+		return (getData().length - getSwath());
+	}
+
+	public byte[] getData() {
+		return data;
+	}
+
+	public BigInteger getBigInteger(int i) {
+		if (getData() == null)
+			return BigInteger.ZERO;
+		if (getData().length - getSwath() < i)
+			i = getData().length - getSwath();
+		byte[] tmp = new byte[i];
+		for (int j = i - 1; j >= 0; j--) {
+			tmp[i - j - 1] = getData()[getSwath() + j];
+		}
+		setSwath(getSwath() + i);
+		return new BigInteger(tmp);
+	}
+
+	public byte[] stringToAsciiBytes(String s) {
+		char[] c = s.toCharArray();
+		byte[] byteval = new byte[c.length];
+		for (int i = 0; i < c.length; i++)
+			byteval[i] = (byte) c[i];
+		return byteval;
+	}
+
+	public BigInteger unmarshalUlong() {
+		return getBigInteger(8);
+	}
+
+	public long unmarshalUInt() {
+		return getBigInteger(4).longValue();
+	}
+
+	public int unmarshalInt() {
+		return getBigInteger(4).intValue();
+	}
+
+	public byte[] unmarshalBytes(int i) {
+		if (i == 0)
+			return new byte[1];
+		byte[] t = new byte[i];
+		for (int j = 0; j < i; j++)
+			t[j] = getData()[j + getSwath()];
+		setSwath(getSwath() + i);
+		return t;
+	}
+
+	public BigInteger getEncint() {
+		byte ob;
+		BigInteger bi = BigInteger.ZERO;
+		byte[] nb = new byte[1];
+		while ((ob = this.getByte()) < 0) {
+			nb[0] = (byte) ((ob & 0x7f));
+			bi = bi.shiftLeft(7).add(new BigInteger(nb));
+		}
+		nb[0] = (byte) ((ob & 0x7f));
+		bi = bi.shiftLeft(7).add(new BigInteger(nb));
+		return bi;
+	}
+
+	public char unmarshalUtfChar() {
+		byte ob;
+		int i = 1;
+		byte[] ba;
+		ob = this.getByte();
+		if (ob < 0) {
+			i = 2;
+			while ((ob << (24 + i)) < 0)
+				i++;
+		}
+		ba = new byte[i];
+		ba[0] = ob;
+		int j = 1;
+		while (j < i) {
+			ba[j] = this.getByte();
+			j++;
+		}
+		i = ba.length;
+		if (i == 1)
+			return (char) ba[0];
+		else {
+			int n;
+			n = ba[0] & 15; // 00001111b, gets last 4 bits
+			j = 1;
+			while (j < i)
+				n = (n << 6) + (ba[j++] & 63);// 00111111b,gets last 6 bits
+			return (char) n;
+		}
+	}
+
+	private void setData(byte[] data) {
+		this.data = data;
+	}
+
+	public int getSwath() {
+		return swath;
+	}
+
+	public void setSwath(int swath) {
+		this.swath = swath;
+	}
+
+	public int getTotal() {
+		return total;
+	}
+
+	public void setTotal(int total) {
+		this.total = total;
+	}
+
+	private int getBuffer() {
+		return buffer;
+	}
+
+	private void setBuffer(int buffer) {
+		this.buffer = buffer;
+	}
+
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		int result = 8 & 255;
+		System.out.println("result " + result);
+		byte[] array = { 4, 78, -67, 90, 1, -33 };
+		ChmSection chmSection = new ChmSection(array);
+		System.out.println("before " + Arrays.toString(array));
+		System.out.println("after "
+				+ Arrays.toString(chmSection.reverseByteOrder(array)));
+	}
+}