1 |
//$Header$
|
2 |
//-------------------------------------------------------------------------------------------------
|
3 |
//This file is part of "David T. Ashley's Shared Source Code", a set of shared components
|
4 |
//integrated into many of David T. Ashley's projects.
|
5 |
//-------------------------------------------------------------------------------------------------
|
6 |
//This source code and any program in which it is compiled/used is provided under the MIT License,
|
7 |
//reproduced below.
|
8 |
//-------------------------------------------------------------------------------------------------
|
9 |
//Permission is hereby granted, free of charge, to any person obtaining a copy of
|
10 |
//this software and associated documentation files(the "Software"), to deal in the
|
11 |
//Software without restriction, including without limitation the rights to use,
|
12 |
//copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the
|
13 |
//Software, and to permit persons to whom the Software is furnished to do so,
|
14 |
//subject to the following conditions :
|
15 |
//
|
16 |
//The above copyright notice and this permission notice shall be included in all
|
17 |
//copies or substantial portions of the Software.
|
18 |
//
|
19 |
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
20 |
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
21 |
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
22 |
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
23 |
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
24 |
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
25 |
//SOFTWARE.
|
26 |
//-------------------------------------------------------------------------------------------------
|
27 |
/* This module defines the default integer used by the Tcl/Tk interpreters
|
28 |
** and by other software which does not explicitly deal with arbitrary length
|
29 |
** integers. The hope is that, over time, the Tcl core can be migrated to use
|
30 |
** this functionality. What should happen is that, with the flip of a preprocessor
|
31 |
** switch, the default integer size can be changed.
|
32 |
**
|
33 |
** The only real guideline for the size is that it must be at least as large
|
34 |
** as the maximum size of a file.
|
35 |
**
|
36 |
** It is felt at the present time that 128-bit integers should be adequate for
|
37 |
** just about everything.
|
38 |
*/
|
39 |
//--------------------------------------------------------------------------------
|
40 |
#ifndef ESRG_INT_DEF_H_INCLUDED
|
41 |
#define ESRG_INT_DEF_H_INCLUDED
|
42 |
|
43 |
#ifdef MODULE_ESRG_INT_DEF
|
44 |
#define DECMOD_ESRG_INT_DEF
|
45 |
#else
|
46 |
#define DECMOD_ESRG_INT_DEF extern
|
47 |
#endif
|
48 |
|
49 |
//Configuration constants.
|
50 |
#define ESRG_INT_DEF_BITSIZE (128)
|
51 |
//The size, in bits, of each integer. This must be a multiple of the machines
|
52 |
//native integer size.
|
53 |
#define ESRG_INT_DEF_NATIVE_BITSIZE (32)
|
54 |
//The size, in bits, of the native int of the machine. This may be
|
55 |
//any positive integer.
|
56 |
#define ESRG_INT_DEF_NLIMBS (ESRG_INT_DEF_BITSIZE/ESRG_INT_DEF_NATIVE_BITSIZE)
|
57 |
//The number of native integers required for each of the default
|
58 |
//integers.
|
59 |
|
60 |
struct ESRG_INT_DEF_struct
|
61 |
{
|
62 |
unsigned int flags;
|
63 |
//The flags, as defined below.
|
64 |
#define ESRG_INT_DEF_FLAG_IS_SIGNED (0x00000001)
|
65 |
//Integer is signed. Defined at creation time and not changed.
|
66 |
#define ESRG_INT_DEF_FLAG_NEG_ROLL (0x00000002)
|
67 |
#define ESRG_INT_DEF_FLAG_POS_ROLL (0x00000004)
|
68 |
//TRUE if has rolled over in a negative way or positive way.
|
69 |
//Depending on what is being done, this may mean result is invalid.
|
70 |
#define ESRG_INT_DEF_FLAG_NAN (0x00000008)
|
71 |
//TRUE if the result is not a number. This may be from division by zero,
|
72 |
//square root of a negative number, etc.
|
73 |
unsigned int limbs[ESRG_INT_DEF_NLIMBS];
|
74 |
//The limbs of the integer. These are arranged with the least significant
|
75 |
//limb as [0], i.e. things are arranged least-significant component first.
|
76 |
//If the integer is signed, it is a concatenated two's complement representation--
|
77 |
//same as the ideal, but spread over multiple native ints.
|
78 |
};
|
79 |
|
80 |
typedef struct ESRG_INT_DEF_struct ESRG_INT_DEF_INT;
|
81 |
|
82 |
//Required initialization before doing anything.
|
83 |
//Destruction is not required--only initialization before
|
84 |
//the first assignment or use.
|
85 |
DECMOD_ESRG_INT_DEF void ESRG_INT_DEF_Create
|
86 |
( ESRG_INT_DEF_INT *arg ,
|
87 |
int is_signed);
|
88 |
|
89 |
//Assigns a machine native unsigned integer to the value.
|
90 |
DECMOD_ESRG_INT_DEF void ESRG_INT_DEF_AssignU
|
91 |
( ESRG_INT_DEF_INT *arg ,
|
92 |
unsigned int aval);
|
93 |
|
94 |
//Assigns a machine native signed integer to the value.
|
95 |
DECMOD_ESRG_INT_DEF void ESRG_INT_DEF_AssignS
|
96 |
( ESRG_INT_DEF_INT *arg,
|
97 |
int aval);
|
98 |
|
99 |
//Compares two values to see their relative relationship.
|
100 |
//Returned values are -1 if a<b, 0 if a==b, and 1 if a>b.
|
101 |
//All cases of signed/unsigned mixes are handled. Only the
|
102 |
//bit patterns of the operands are considered--whether they
|
103 |
//are the result of rollovers, etc., is not considered.
|
104 |
DECMOD_ESRG_INT_DEF int ESRG_INT_DEF_Cmp
|
105 |
( ESRG_INT_DEF_INT *a,
|
106 |
ESRG_INT_DEF_INT *b );
|
107 |
|
108 |
#endif
|
109 |
|
110 |
//End of esrg_int_def.h.
|