mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
6.4 KiB
229 lines
6.4 KiB
/**
|
|
$Header: T:/LOGFILES/STDMATH.H_V 1.9 05 Mar 1993 17:23:38 GREGG $
|
|
Copyright(c) Maynard Electronics, Inc. 1984-92
|
|
|
|
Name: stdmath.h
|
|
|
|
Date Updated: $./FDT$ $./FTM$
|
|
|
|
Description: To provide a common header for extended number numbers.
|
|
Currently only 64 bit manipulation functions are supported.
|
|
$Log: T:/LOGFILES/STDMATH.H_V $
|
|
|
|
Rev 1.9 05 Mar 1993 17:23:38 GREGG
|
|
Removed prototypes for functions which are now macros.
|
|
|
|
Rev 1.8 27 Oct 1992 17:51:06 GREGG
|
|
Added macros for many of the trivial functions.
|
|
|
|
Rev 1.7 12 Aug 1992 17:57:14 BARRY
|
|
Added max and min functions. Fixed U64_Btop prototype.
|
|
|
|
Rev 1.6 23 Jul 1992 12:20:30 STEVEN
|
|
fix warnings
|
|
|
|
Rev 1.5 29 May 1992 13:03:30 BURT
|
|
Fixed Octal conversion from UINT64 to ASCII string for greater than 32 bit
|
|
numbers. Added U64_Commas() function to allow commas to be placed in the
|
|
converted ASCII string for decimal conversions.
|
|
|
|
|
|
Rev 1.4 28 May 1992 11:58:42 BURT
|
|
Additions for true 64 bit division and multiplication.
|
|
|
|
|
|
Rev 1.3 18 Mar 1992 10:28:34 BURT
|
|
Changed INT and INT_PTR to INT16 and INT16_PTR to ease porting to NT
|
|
|
|
|
|
Rev 1.2 25 Feb 1992 09:40:00 BURT
|
|
Oops, just noticed that there's no Header and Log in this file.
|
|
|
|
Rev 1.0 02 Feb 1992 16:52:00 BURT
|
|
Initial revision.
|
|
**/
|
|
|
|
#ifndef STDMATH
|
|
#define STDMATH
|
|
|
|
|
|
/* Stuff for the true 64 bit division and multiplication operations */
|
|
#include <stddef.h>
|
|
|
|
|
|
#ifndef SItype
|
|
#define SItype long int
|
|
#endif
|
|
|
|
#ifdef BIG_ENDIAN
|
|
|
|
struct long64 {
|
|
long high ;
|
|
long low ;
|
|
} ;
|
|
#else
|
|
struct long64 {
|
|
long low ;
|
|
long high ;
|
|
} ;
|
|
#endif
|
|
|
|
/* This union is used to unpack/pack 64 bit numbers.
|
|
* Incoming 64 bit parameters are stored into the big_long field,
|
|
* and the unpacked result is read from the structure long64.
|
|
*/
|
|
|
|
typedef union
|
|
{
|
|
struct long64 s ;
|
|
UINT64 big_long ;
|
|
SItype i[2] ;
|
|
unsigned SItype ui[2] ;
|
|
} long_64 ;
|
|
|
|
/*
|
|
* Internally, 64 bit ints are structures of unsigned shorts in the
|
|
* order determined by BIG_ENDIAN.
|
|
*/
|
|
|
|
/*
|
|
* Some constants for masking.
|
|
*/
|
|
#define B 0x10000
|
|
#define mask_low16 (B - 1)
|
|
|
|
#ifdef BIG_ENDIAN
|
|
|
|
/* Note that HIGH and LOW do not describe the order
|
|
of words in a 64 bit number. They describe the order of words
|
|
in vectors ordered according to the byte order. */
|
|
|
|
#define HIGH 0
|
|
#define LOW 1
|
|
|
|
#define big_end(n) 0
|
|
#define little_end(n) ((n) - 1)
|
|
#define next_msd(i) ((i) - 1)
|
|
#define next_lsd(i) ((i) + 1)
|
|
#define not_msd(i,n) ((i) >= 0)
|
|
#define not_lsd(i,n) ((i) < (n))
|
|
|
|
#else
|
|
|
|
/* Intel ordering */
|
|
#define LOW 0
|
|
#define HIGH 1
|
|
|
|
#define big_end(n) ((n) - 1)
|
|
#define little_end(n) 0
|
|
#define next_msd(i) ((i) + 1)
|
|
#define next_lsd(i) ((i) - 1)
|
|
#define not_msd(i,n) ((i) < (n))
|
|
#define not_lsd(i,n) ((i) >= 0)
|
|
|
|
#endif
|
|
|
|
|
|
/* Function prototypes for stdmath.c */
|
|
|
|
UINT64 U64_Atoli( CHAR_PTR arg, BOOLEAN_PTR status );
|
|
CHAR_PTR U64_Litoa( UINT64 arg, CHAR_PTR string, INT16 base, BOOLEAN_PTR status );
|
|
UINT64 U64_Add( UINT64 arg1, UINT64 arg2, BOOLEAN_PTR status );
|
|
UINT64 U64_Sub(UINT64 arg1, UINT64 arg2, BOOLEAN_PTR status );
|
|
UINT64 U64_Init( UINT32 lsw, UINT32 msw );
|
|
BOOLEAN U64_To_32Bit( UINT64 arg1, UINT32_PTR lsw, UINT32_PTR msw );
|
|
UINT64 U32_To_U64( UINT32 arg );
|
|
UINT32 U64_Test( UINT64 arg, UINT32 lsw_mask, UINT32 msw_mask );
|
|
UINT32 U64_Stest( UINT64 arg, CHAR_PTR mask );
|
|
UINT64 U64_Div(UINT64 arg1, UINT64 arg2, UINT64_PTR remainder, INT16_PTR status );
|
|
UINT64 U64_Mod(UINT64 arg1, UINT64 arg2, INT16_PTR status );
|
|
UINT64 U64_Mult(UINT64 arg1, UINT64 arg2 ) ;
|
|
VOID U64_Commas( BOOLEAN action ) ;
|
|
|
|
/* Macros for external use */
|
|
#define U64_Lsw( arg ) ( (arg).lsw )
|
|
|
|
#define U64_Msw( arg ) ( (arg).msw )
|
|
|
|
#define U64_EQ( arg1, arg2 ) ( (arg1).msw == (arg2).msw && \
|
|
(arg1).lsw == (arg2).lsw )
|
|
|
|
#define U64_NE( arg1, arg2 ) ( ! U64_EQ( (arg1), (arg2) ) )
|
|
|
|
#define U64_GT( arg1, arg2 ) ( ( (arg1).msw > (arg2).msw ) || \
|
|
( (arg1).msw == (arg2).msw && \
|
|
(arg1).lsw > (arg2).lsw ) )
|
|
|
|
#define U64_LT( arg1, arg2 ) U64_GT( (arg2), (arg1) )
|
|
|
|
#define U64_GE( arg1, arg2 ) ( U64_GT( (arg1), (arg2) ) || \
|
|
U64_EQ( (arg1), (arg2) ) )
|
|
|
|
#define U64_LE( arg1, arg2 ) ( U64_LT( (arg1), (arg2) ) || \
|
|
U64_EQ( (arg1), (arg2) ) )
|
|
|
|
#define U64_Min( arg1, arg2 ) ( U64_GT( (arg1), (arg2) ) ? (arg2) : (arg1) )
|
|
|
|
#define U64_Max( arg1, arg2 ) ( U64_GT( (arg1), (arg2) ) ? (arg1) : (arg2) )
|
|
|
|
|
|
|
|
/* Defines for bitwise operations used by U64_Btop() but are hidden
|
|
from the user by the various macros.
|
|
*/
|
|
#define CLR_64BIT 0
|
|
#define SET_64BIT 1
|
|
#define XOR_64BIT 2
|
|
#define OR_64BIT 3
|
|
#define AND_64BIT 4
|
|
#define NOT_64BIT 5
|
|
/* Shift operations */
|
|
#define SHL_64BIT 6
|
|
#define SHR_64BIT 7
|
|
|
|
UINT64 U64_Btop( UINT64 arg, UINT32 lsw_mask, UINT32 msw_mask,
|
|
INT operation, INT shift_count );
|
|
|
|
/* Some macros to make life easier for the different bit wise functions.
|
|
All of these macros use U64_btop() to do the real work.
|
|
*/
|
|
#define U64_CLR( arg, mask ) \
|
|
U64_Btop( (arg), ( U64_Lsw( mask ) ), ( U64_Msw( mask ) ), CLR_64BIT, 0 )
|
|
|
|
#define U64_SET( arg, mask ) \
|
|
U64_Btop( (arg), ( U64_Lsw( mask ) ), ( U64_Msw( mask ) ), SET_64BIT, 0 )
|
|
|
|
#define U64_XOR( arg, mask ) \
|
|
U64_Btop( (arg), ( U64_Lsw( mask ) ), ( U64_Msw( mask ) ), XOR_64BIT, 0 )
|
|
|
|
#define U64_OR( arg, mask ) \
|
|
U64_Btop( (arg), ( U64_Lsw( mask ) ), ( U64_Msw( mask ) ), OR_64BIT, 0 )
|
|
|
|
#define U64_AND( arg, mask ) \
|
|
U64_Btop( (arg), ( U64_Lsw( mask ) ), ( U64_Msw( mask ) ), AND_64BIT, 0 )
|
|
|
|
#define U64_NOT( arg, mask ) \
|
|
U64_Btop( (arg), ( U64_Lsw( mask ) ), ( U64_Msw( mask ) ), NOT_64BIT, 0 )
|
|
|
|
|
|
/* Shift operations */
|
|
/* Shift left the specified number of bits */
|
|
#define U64_SHL( arg, shift_count ) \
|
|
U64_Btop( (arg), 0L, 0L, SHL_64BIT, (shift_count) )
|
|
|
|
/* Shift right the specified number of bits */
|
|
#define U64_SHR( arg, shift_count ) \
|
|
U64_Btop( (arg), 0L, 0L, SHR_64BIT, (shift_count) )
|
|
|
|
|
|
/* Defines for math errors (specifically division) */
|
|
#define U64_OK 0 /* No errors, everything's fine */
|
|
#define U64_BAD_DIV 1 /* Attempted to divide by other than power of 2,
|
|
or one of the other supported cases.
|
|
*/
|
|
#define U64_OVRFL 2 /* Overflow error */
|
|
#define U64_UNDFL 3 /* Underflow error */
|
|
#define U64_DIVZ 4 /* Tried to divide by 0 */
|
|
|
|
|
|
#endif
|