/* * 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. * * cbigint.c has been adapted for xmlvm */ #ifndef __XMLVM_NUMBER_H__ #define __XMLVM_NUMBER_H__ #include #include #include "xmlvm-hy.h" #include "hycomp.h" #define LONG_LO_OFFSET 0 #define LONG_HI_OFFSET 1 #define LOW_U32_FROM_LONG64_PTR(long64ptr) (((U64U32DBL *)(long64ptr))->u32val[LONG_LO_OFFSET]) #define HIGH_U32_FROM_LONG64_PTR(long64ptr) (((U64U32DBL *)(long64ptr))->u32val[LONG_HI_OFFSET]) #define LOW_U32_FROM_VAR(u64) LOW_U32_FROM_LONG64_PTR(&(u64)) #define LOW_U32_FROM_PTR(u64ptr) LOW_U32_FROM_LONG64_PTR(u64ptr) #define HIGH_U32_FROM_VAR(u64) HIGH_U32_FROM_LONG64_PTR(&(u64)) #define HIGH_U32_FROM_PTR(u64ptr) HIGH_U32_FROM_LONG64_PTR(u64ptr) #define HIGH_IN_U64(u64) ((u64) >> 32) #if defined(USE_LL) #define LOW_IN_U64(u64) ((u64) & 0x00000000FFFFFFFFLL) #else #if defined(USE_L) #define LOW_IN_U64(u64) ((u64) & 0x00000000FFFFFFFFL) #else #define LOW_IN_U64(u64) ((u64) & 0x00000000FFFFFFFF) #endif /* USE_L */ #endif /* USE_LL */ typedef union u64u32dbl_tag { U_64 u64val; U_32 u32val[2]; I_32 i32val[2]; double dval; } U64U32DBL; #if defined(USE_LL) #define TEN_E1 (0xALL) #define TEN_E2 (0x64LL) #define TEN_E3 (0x3E8LL) #define TEN_E4 (0x2710LL) #define TEN_E5 (0x186A0LL) #define TEN_E6 (0xF4240LL) #define TEN_E7 (0x989680LL) #define TEN_E8 (0x5F5E100LL) #define TEN_E9 (0x3B9ACA00LL) #define TEN_E19 (0x8AC7230489E80000LL) #else #if defined(USE_L) #define TEN_E1 (0xAL) #define TEN_E2 (0x64L) #define TEN_E3 (0x3E8L) #define TEN_E4 (0x2710L) #define TEN_E5 (0x186A0L) #define TEN_E6 (0xF4240L) #define TEN_E7 (0x989680L) #define TEN_E8 (0x5F5E100L) #define TEN_E9 (0x3B9ACA00L) #define TEN_E19 (0x8AC7230489E80000L) #else #define TEN_E1 (0xA) #define TEN_E2 (0x64) #define TEN_E3 (0x3E8) #define TEN_E4 (0x2710) #define TEN_E5 (0x186A0) #define TEN_E6 (0xF4240) #define TEN_E7 (0x989680) #define TEN_E8 (0x5F5E100) #define TEN_E9 (0x3B9ACA00) #define TEN_E19 (0x8AC7230489E80000) #endif /* USE_L */ #endif /* USE_LL */ #define TIMES_TEN(x) (((x) << 3) + ((x) << 1)) U_32 simpleMultiplyHighPrecision (U_64 * arg1, IDATA length, U_64 arg2); void simpleShiftLeftHighPrecision (U_64 * arg1, IDATA length, IDATA arg2); U_64 simpleMultiplyHighPrecision64 (U_64 * arg1, IDATA length, U_64 arg2); U_32 simpleAppendDecimalDigitHighPrecision (U_64 * arg1, IDATA length, U_64 digit); IDATA timesTenToTheEHighPrecision (U_64 * result, IDATA length, JAVA_INT e); IDATA addHighPrecision (U_64 * arg1, IDATA length1, U_64 * arg2, IDATA length2); IDATA compareHighPrecision (U_64 * arg1, IDATA length1, U_64 * arg2, IDATA length2); IDATA simpleAddHighPrecision (U_64 * arg1, IDATA length, U_64 arg2); void subtractHighPrecision (U_64 * arg1, IDATA length1, U_64 * arg2, IDATA length2); #endif