From: Glen Stampoultzis Date: Mon, 22 Apr 2002 07:13:09 +0000 (+0000) Subject: RK record fix. Thanks to Rolf-Jürgen Moll. X-Git-Tag: REL_1_5_0~9 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=f964275c40f44b1c08fb445c04c67e93c7f35ba2;p=poi.git RK record fix. Thanks to Rolf-Jürgen Moll. git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352460 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/poi/hssf/record/MulRKRecord.java b/src/java/org/apache/poi/hssf/record/MulRKRecord.java index 88a6096c6f..b64c0cd047 100644 --- a/src/java/org/apache/poi/hssf/record/MulRKRecord.java +++ b/src/java/org/apache/poi/hssf/record/MulRKRecord.java @@ -63,6 +63,7 @@ package org.apache.poi.hssf.record; import java.util.ArrayList; import org.apache.poi.util.LittleEndian; +import org.apache.poi.hssf.util.RKUtil; /** * Used to store multiple RK numbers on a row. 1 MulRk = Multiple Cell values. @@ -166,47 +167,7 @@ public class MulRKRecord public double getRKNumberAt(int coffset) { - return decodeNumber((( RkRec ) field_3_rks.get(coffset)).rk); - } - - /** - * Do the dirty work of decoding; made a private static method to - * facilitate testing the algorithm - */ - - private static double decodeNumber(int number) - { - long raw_number = number; - - // mask off the two low-order bits, 'cause they're not part of - // the number - raw_number &= -3; - double rvalue = 0; - - if ((number & 0x02) == 0x02) - { - - // ok, it's just a plain ol' int; we can handle this - // trivially by right-shifting and casting - rvalue = ( double ) (raw_number >> 2); - } - else - { - - // also trivial, but not as obvious ... left shift the - // bits high and use that clever static method in Double - // to convert the resulting bit image to a double - rvalue = Double.longBitsToDouble(raw_number << 32); - } - if ((number & 0x01) == 0x01) - { - - // low-order bit says divide by 100, and so we do. Why? - // 'cause that's what the algorithm says. Can't fight city - // hall, especially if it's the city of Redmond - rvalue /= 100; - } - return rvalue; + return RKUtil.decodeNumber((( RkRec ) field_3_rks.get(coffset)).rk); } /** diff --git a/src/java/org/apache/poi/hssf/record/NumberRecord.java b/src/java/org/apache/poi/hssf/record/NumberRecord.java index e0af38fae9..d183d5aaa1 100644 --- a/src/java/org/apache/poi/hssf/record/NumberRecord.java +++ b/src/java/org/apache/poi/hssf/record/NumberRecord.java @@ -81,7 +81,6 @@ public class NumberRecord private double field_4_value; /** Creates new NumberRecord */ - public NumberRecord() { } diff --git a/src/java/org/apache/poi/hssf/record/RKRecord.java b/src/java/org/apache/poi/hssf/record/RKRecord.java index cf6f5fb786..0fef8e1d6d 100644 --- a/src/java/org/apache/poi/hssf/record/RKRecord.java +++ b/src/java/org/apache/poi/hssf/record/RKRecord.java @@ -56,6 +56,7 @@ package org.apache.poi.hssf.record; import org.apache.poi.util.LittleEndian; +import org.apache.poi.hssf.util.RKUtil; /** * Title: RK Record @@ -192,48 +193,9 @@ public class RKRecord public double getRKNumber() { - return decodeNumber(field_4_rk_number); + return RKUtil.decodeNumber(field_4_rk_number); } - /** - * Do the dirty work of decoding; made a private static method to - * facilitate testing the algorithm - */ - - private static double decodeNumber(int number) - { - long raw_number = number; - - // mask off the two low-order bits, 'cause they're not part of - // the number - raw_number &= -3; - double rvalue = 0; - - if ((number & 0x02) == 0x02) - { - - // ok, it's just a plain ol' int; we can handle this - // trivially by right-shifting and casting - rvalue = ( double ) (raw_number >> 2); - } - else - { - - // also trivial, but not as obvious ... left shift the - // bits high and use that clever static method in Double - // to convert the resulting bit image to a double - rvalue = Double.longBitsToDouble(raw_number << 32); - } - if ((number & 0x01) == 0x01) - { - - // low-order bit says divide by 100, and so we do. Why? - // 'cause that's what the algorithm says. Can't fight city - // hall, especially if it's the city of Redmond - rvalue /= 100; - } - return rvalue; - } public String toString() { @@ -295,7 +257,7 @@ public class RKRecord { System.out.println("input = " + Integer.toHexString(values[ j ]) + " -> " + rvalues[ j ] + ": " - + RKRecord.decodeNumber(values[ j ])); + + RKUtil.decodeNumber(values[ j ])); } } diff --git a/src/java/org/apache/poi/hssf/util/RKUtil.java b/src/java/org/apache/poi/hssf/util/RKUtil.java new file mode 100644 index 0000000000..f47b73ce6a --- /dev/null +++ b/src/java/org/apache/poi/hssf/util/RKUtil.java @@ -0,0 +1,112 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache POI" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache POI", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.poi.hssf.util; + +/** + * Utility class for helping convert RK numbers. + * + * @author Andrew C. Oliver (acoliver at apache dot org) + * @author Glen Stampoultzis (glens at apache.org) + * @author Rolf-Jürgen Moll + * + * @see org.apache.poi.hssf.record.MulRKRecord + * @see org.apache.poi.hssf.record.RKRecord + */ +public class RKUtil +{ + private RKUtil() + { + } + + /** + * Do the dirty work of decoding; made a private static method to + * facilitate testing the algorithm + */ + + public static double decodeNumber(int number) + { + long raw_number = number; + + // mask off the two low-order bits, 'cause they're not part of + // the number + raw_number = raw_number >> 2; + double rvalue = 0; + + if ((number & 0x02) == 0x02) + { + // ok, it's just a plain ol' int; we can handle this + // trivially by right-shifting and casting + rvalue = ( double ) (raw_number); + } + else + { + + // also trivial, but not as obvious ... left shift the + // bits high and use that clever static method in Double + // to convert the resulting bit image to a double + rvalue = Double.longBitsToDouble(raw_number << 34); + } + if ((number & 0x01) == 0x01) + { + + // low-order bit says divide by 100, and so we do. Why? + // 'cause that's what the algorithm says. Can't fight city + // hall, especially if it's the city of Redmond + rvalue /= 100; + } + return rvalue; + } + +}