home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 March (DVD) / PCWorld_2008-03_DVD.iso / komunikace / mysql / mysql-essential-5.0.45-win32.msi / product.cab / fili150 < prev    next >
Encoding:
Text File  |  2007-07-06  |  4.0 KB  |  108 lines

  1. /* Copyright (C) 2000 MySQL AB
  2.  
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; version 2 of the License.
  6.  
  7.    This program is distributed in the hope that it will be useful,
  8.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.    GNU General Public License for more details.
  11.  
  12.    You should have received a copy of the GNU General Public License
  13.    along with this program; if not, write to the Free Software
  14.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  15.  
  16. #ifndef _decimal_h
  17. #define _decimal_h
  18.  
  19. typedef enum
  20. {TRUNCATE=0, HALF_EVEN, HALF_UP, CEILING, FLOOR}
  21.   decimal_round_mode;
  22. typedef int32 decimal_digit_t;
  23.  
  24. typedef struct st_decimal_t {
  25.   int    intg, frac, len;
  26.   my_bool sign;
  27.   decimal_digit_t *buf;
  28. } decimal_t;
  29.  
  30. int internal_str2dec(const char *from, decimal_t *to, char **end,
  31.                      my_bool fixed);
  32. int decimal2string(decimal_t *from, char *to, int *to_len,
  33.                    int fixed_precision, int fixed_decimals,
  34.                    char filler);
  35. int decimal2ulonglong(decimal_t *from, ulonglong *to);
  36. int ulonglong2decimal(ulonglong from, decimal_t *to);
  37. int decimal2longlong(decimal_t *from, longlong *to);
  38. int longlong2decimal(longlong from, decimal_t *to);
  39. int decimal2double(decimal_t *from, double *to);
  40. int double2decimal(double from, decimal_t *to);
  41. int decimal_actual_fraction(decimal_t *from);
  42. int decimal2bin(decimal_t *from, char *to, int precision, int scale);
  43. int bin2decimal(char *from, decimal_t *to, int precision, int scale);
  44.  
  45. int decimal_size(int precision, int scale);
  46. int decimal_bin_size(int precision, int scale);
  47. int decimal_result_size(decimal_t *from1, decimal_t *from2, char op,
  48.                         int param);
  49.  
  50. int decimal_intg(decimal_t *from);
  51. int decimal_add(decimal_t *from1, decimal_t *from2, decimal_t *to);
  52. int decimal_sub(decimal_t *from1, decimal_t *from2, decimal_t *to);
  53. int decimal_cmp(decimal_t *from1, decimal_t *from2);
  54. int decimal_mul(decimal_t *from1, decimal_t *from2, decimal_t *to);
  55. int decimal_div(decimal_t *from1, decimal_t *from2, decimal_t *to,
  56.                 int scale_incr);
  57. int decimal_mod(decimal_t *from1, decimal_t *from2, decimal_t *to);
  58. int decimal_round(decimal_t *from, decimal_t *to, int new_scale,
  59.                   decimal_round_mode mode);
  60. int decimal_is_zero(decimal_t *from);
  61. void max_decimal(int precision, int frac, decimal_t *to);
  62.  
  63. #define string2decimal(A,B,C) internal_str2dec((A), (B), (C), 0)
  64. #define string2decimal_fixed(A,B,C) internal_str2dec((A), (B), (C), 1)
  65.  
  66. /* set a decimal_t to zero */
  67.  
  68. #define decimal_make_zero(dec)        do {                \
  69.                                         (dec)->buf[0]=0;    \
  70.                                         (dec)->intg=1;      \
  71.                                         (dec)->frac=0;      \
  72.                                         (dec)->sign=0;      \
  73.                                       } while(0)
  74.  
  75. /*
  76.   returns the length of the buffer to hold string representation
  77.   of the decimal (including decimal dot, possible sign and \0)
  78. */
  79.  
  80. #define decimal_string_size(dec) (((dec)->intg ? (dec)->intg : 1) + \
  81.                   (dec)->frac + ((dec)->frac > 0) + 2)
  82.  
  83. /* negate a decimal */
  84. #define decimal_neg(dec) do { (dec)->sign^=1; } while(0)
  85.  
  86. /*
  87.   conventions:
  88.  
  89.     decimal_smth() == 0     -- everything's ok
  90.     decimal_smth() <= 1     -- result is usable, but precision loss is possible
  91.     decimal_smth() <= 2     -- result can be unusable, most significant digits
  92.                                could've been lost
  93.     decimal_smth() >  2     -- no result was generated
  94. */
  95.  
  96. #define E_DEC_OK                0
  97. #define E_DEC_TRUNCATED         1
  98. #define E_DEC_OVERFLOW          2
  99. #define E_DEC_DIV_ZERO          4
  100. #define E_DEC_BAD_NUM           8
  101. #define E_DEC_OOM              16
  102.  
  103. #define E_DEC_ERROR            31
  104. #define E_DEC_FATAL_ERROR      30
  105.  
  106. #endif
  107.  
  108.