1 | #ifndef PGTYPES_NUMERIC |
2 | #define PGTYPES_NUMERIC |
3 | |
4 | #include <pgtypes.h> |
5 | |
6 | #define NUMERIC_POS 0x0000 |
7 | #define NUMERIC_NEG 0x4000 |
8 | #define NUMERIC_NAN 0xC000 |
9 | #define NUMERIC_NULL 0xF000 |
10 | #define NUMERIC_MAX_PRECISION 1000 |
11 | #define NUMERIC_MAX_DISPLAY_SCALE NUMERIC_MAX_PRECISION |
12 | #define NUMERIC_MIN_DISPLAY_SCALE 0 |
13 | #define NUMERIC_MIN_SIG_DIGITS 16 |
14 | |
15 | #define DECSIZE 30 |
16 | |
17 | typedef unsigned char NumericDigit; |
18 | typedef struct |
19 | { |
20 | int ndigits; /* number of digits in digits[] - can be 0! */ |
21 | int weight; /* weight of first digit */ |
22 | int rscale; /* result scale */ |
23 | int dscale; /* display scale */ |
24 | int sign; /* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */ |
25 | NumericDigit *buf; /* start of alloc'd space for digits[] */ |
26 | NumericDigit *digits; /* decimal digits */ |
27 | } numeric; |
28 | |
29 | typedef struct |
30 | { |
31 | int ndigits; /* number of digits in digits[] - can be 0! */ |
32 | int weight; /* weight of first digit */ |
33 | int rscale; /* result scale */ |
34 | int dscale; /* display scale */ |
35 | int sign; /* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */ |
36 | NumericDigit digits[DECSIZE]; /* decimal digits */ |
37 | } decimal; |
38 | |
39 | #ifdef __cplusplus |
40 | extern "C" |
41 | { |
42 | #endif |
43 | |
44 | numeric *PGTYPESnumeric_new(void); |
45 | decimal *PGTYPESdecimal_new(void); |
46 | void PGTYPESnumeric_free(numeric *); |
47 | void PGTYPESdecimal_free(decimal *); |
48 | numeric *PGTYPESnumeric_from_asc(char *, char **); |
49 | char *PGTYPESnumeric_to_asc(numeric *, int); |
50 | int PGTYPESnumeric_add(numeric *, numeric *, numeric *); |
51 | int PGTYPESnumeric_sub(numeric *, numeric *, numeric *); |
52 | int PGTYPESnumeric_mul(numeric *, numeric *, numeric *); |
53 | int PGTYPESnumeric_div(numeric *, numeric *, numeric *); |
54 | int PGTYPESnumeric_cmp(numeric *, numeric *); |
55 | int PGTYPESnumeric_from_int(signed int, numeric *); |
56 | int PGTYPESnumeric_from_long(signed long int, numeric *); |
57 | int PGTYPESnumeric_copy(numeric *, numeric *); |
58 | int PGTYPESnumeric_from_double(double, numeric *); |
59 | int PGTYPESnumeric_to_double(numeric *, double *); |
60 | int PGTYPESnumeric_to_int(numeric *, int *); |
61 | int PGTYPESnumeric_to_long(numeric *, long *); |
62 | int PGTYPESnumeric_to_decimal(numeric *, decimal *); |
63 | int PGTYPESnumeric_from_decimal(decimal *, numeric *); |
64 | |
65 | #ifdef __cplusplus |
66 | } |
67 | #endif |
68 | |
69 | #endif /* PGTYPES_NUMERIC */ |
70 | |