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