text: /* $PostgreSQL$ */
  
  #ifndef PGTYPES_NUMERIC
  #define PGTYPES_NUMERIC
  
  #define NUMERIC_POS						0x0000
  #define NUMERIC_NEG						0x4000
  #define NUMERIC_NAN						0xC000
  #define NUMERIC_MAX_PRECISION			1000
  #define NUMERIC_MAX_DISPLAY_SCALE		NUMERIC_MAX_PRECISION
  #define NUMERIC_MIN_DISPLAY_SCALE		0
  #define NUMERIC_MIN_SIG_DIGITS			16
  
  #define DECSIZE 30
  
  typedef unsigned char NumericDigit;
  typedef struct
  {
  	int			ndigits;		/* number of digits in digits[] - can be 0! */
  	int			weight;			/* weight of first digit */
  	int			rscale;			/* result scale */
  	int			dscale;			/* display scale */
  	int			sign;			/* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */
  	NumericDigit *buf;			/* start of alloc'd space for digits[] */
  	NumericDigit *digits;		/* decimal digits */
  } numeric;
  
  typedef struct
  {
  	int			ndigits;		/* number of digits in digits[] - can be 0! */
  	int			weight;			/* weight of first digit */
  	int			rscale;			/* result scale */
  	int			dscale;			/* display scale */
  	int			sign;			/* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */
  	NumericDigit digits[DECSIZE];		/* decimal digits */
  } decimal;
  
  #ifdef __cplusplus
  extern		"C"
  {
  #endif
  
  numeric    *PGTYPESnumeric_new(void);
  decimal    *PGTYPESdecimal_new(void);
  void		PGTYPESnumeric_free(numeric *);
  void		PGTYPESdecimal_free(decimal *);
  numeric    *PGTYPESnumeric_from_asc(char *, char **);
  char	   *PGTYPESnumeric_to_asc(numeric *, int);
  int			PGTYPESnumeric_add(numeric *, numeric *, numeric *);
  int			PGTYPESnumeric_sub(numeric *, numeric *, numeric *);
  int			PGTYPESnumeric_mul(numeric *, numeric *, numeric *);
  int			PGTYPESnumeric_div(numeric *, numeric *, numeric *);
  int			PGTYPESnumeric_cmp(numeric *, numeric *);
  int			PGTYPESnumeric_from_int(signed int, numeric *);
  int			PGTYPESnumeric_from_long(signed long int, numeric *);
  int			PGTYPESnumeric_copy(numeric *, numeric *);
  int			PGTYPESnumeric_from_double(double, numeric *);
  int			PGTYPESnumeric_to_double(numeric *, double *);
  int			PGTYPESnumeric_to_int(numeric *, int *);
  int			PGTYPESnumeric_to_long(numeric *, long *);
  int			PGTYPESnumeric_to_decimal(numeric *, decimal *);
  int			PGTYPESnumeric_from_decimal(decimal *, numeric *);
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif   /* PGTYPES_NUMERIC */
  